diff --git a/data/schemas/imports/achats.json b/data/schemas/imports/achats.json index c282838c3..036f290cf 100644 --- a/data/schemas/imports/achats.json +++ b/data/schemas/imports/achats.json @@ -3,85 +3,126 @@ "fields": [ { "constraints": { + "pattern": "^[0-9]{14}$", "required": true }, - "description": "Le SIRET de la cantine ayant réalisé l'achat", + "description": "La cantine avec ce SIRET doit être déjà enregistrée sur notre plateforme.", + "example": "000 000 000 00000", + "format": "default", "name": "siret", - "pattern": "^[0-9]{14}$", + "title": "Le SIRET de la cantine ayant réalisé l'achat", "type": "string" }, { "constraints": { "required": true }, - "description": "Une description de l'achat", + "description": "", + "example": "Pommes de terre", + "format": "default", "name": "description", + "title": "Une description de l'achat", "type": "string" }, { "constraints": { "required": true }, - "description": "Le nom du fournisseur", + "description": "", + "example": "Le traiteur du village", + "format": "default", "name": "fournisseur", + "title": "Le nom du fournisseur", "type": "string" }, { "constraints": { "required": true }, - "description": "La date de l'achat", + "description": "", + "example": "2022-01-30", "format": "%Y-%m-%d", "name": "date", + "title": "La date de l'achat", "type": "date" }, { "constraints": { "required": true }, - "description": "Le prix HT de l'achat", + "description": "", + "example": "3290.23", + "format": "default", "name": "prix_ht", + "title": "Le prix HT de l'achat", "type": "number" }, { "constraints": { - "required": true + "enum": [ + "VIANDES_VOLAILLES", + "CHARCUTERIE", + "PRODUITS_DE_LA_MER", + "FRUITS_ET_LEGUMES", + "PRODUITS_LAITIERS", + "BOULANGERIE", + "BOISSONS", + "AUTRES" + ], + "required": false }, - "description": "La famille de produits de l'achat", - "enum": [ - "VIANDES_VOLAILLES", - "CHARCUTERIE", - "PRODUITS_DE_LA_MER", - "FRUITS_ET_LEGUMES", - "PRODUITS_LAITIERS", - "BOULANGERIE", - "BOISSONS", - "AUTRES" - ], + "description": "", + "example": "VIANDES_VOLAILLES", + "format": "default", "name": "famille_produits", + "title": "La famille de produits de l'achat", "type": "string" }, { "constraints": { + "enum": [ + "BIO", + "LABEL_ROUGE", + "AOCAOP", + "IGP", + "STG", + "HVE", + "PECHE_DURABLE", + "RUP", + "COMMERCE_EQUITABLE", + "FERMIER", + "EXTERNALITES", + "PERFORMANCE", + "FRANCE", + "SHORT_DISTRIBUTION", + "LOCAL" + ], + "enum_multiple": true, "pattern": "(?:(?:^|;)(BIO|LABEL_ROUGE|AOCAOP|IGP|STG|HVE|PECHE_DURABLE|RUP|COMMERCE_EQUITABLE|FERMIER|EXTERNALITES|PERFORMANCE|FRANCE|SHORT_DISTRIBUTION|LOCAL))+$", "required": false }, - "description": "Les caractéristiques de l'achat", + "description": "", + "example": "BIO,IGP", + "format": "default", "name": "caracteristiques", + "title": "Les caractéristiques de l'achat", "type": "string" }, { "constraints": { - "required": true + "enum": [ + "AUTOUR_SERVICE", + "DEPARTMENT", + "REGION", + "AUTRE" + ], + "required": false }, - "description": "La définition de local si l'achat a la caractéristique de LOCAL", - "enum": [ - "AUTOUR_SERVICE", - "DEPARTMENT", - "REGION", - "AUTRE" - ], + "description": "Obligatoire si l'achat a la caractéristique de LOCAL.", + "example": "AUTOUR_SERVICE", + "format": "default", "name": "definition_local", + "title": "La définition de local", "type": "string" } ], diff --git a/frontend/src/constants.js b/frontend/src/constants.js index 2266866ea..43584c2ff 100644 --- a/frontend/src/constants.js +++ b/frontend/src/constants.js @@ -5,6 +5,14 @@ export default Object.freeze({ ERROR: 3, IDLE: 4, }, + SchemaTypes: { + siret: "14 chiffres, avec ou sans espaces", + string: "Texte", + string_enum: "Texte (choix unique)", + string_enum_multiple: "Texte (choix multiples)", + number: "Chiffre", + date: "Date (au format AAAA-MM-JJ)", + }, DefaultDiagnostics: { id: null, year: null, diff --git a/frontend/src/views/PurchasesImporter.vue b/frontend/src/views/PurchasesImporter.vue index ad9f53c6a..90ba99c68 100644 --- a/frontend/src/views/PurchasesImporter.vue +++ b/frontend/src/views/PurchasesImporter.vue @@ -110,12 +110,26 @@
{{ field.description }}
+
+ Options acceptées :
+
+ {{ item }}
+ ,
+
+
+ Spécifiez plusieurs options en séparant avec un
+ ,
+ .
+
1234
/1234.5
/1234.56
."
return {
file: undefined,
canteens: undefined,
@@ -169,73 +182,37 @@ export default {
seconds: undefined,
importInProgress: false,
duplicatePurchases: null,
- documentation: [
- {
- title: "siret",
- name: "SIRET de la cantine ayant réalisé l'achat",
- description: "La cantine avec ce SIRET doit être déjà enregistrée sur notre plateforme.",
- type: "14 chiffres, avec ou sans espaces",
- example: "000 000 000 00000",
- },
- {
- title: "description",
- name: "Description de l'achat",
- example: "Pommes de terre",
- type: "Texte libre",
- },
- {
- title: "fournisseur",
- name: "Fournisseur",
- example: "Le traiteur du village",
- type: "Texte libre",
- },
- {
- title: "date",
- name: "Date d'achat",
- type: "Date en format AAAA-MM-JJ",
- example: "2022-01-30",
- },
- {
- title: "prix_ht",
- name: "Prix HT",
- description: numberFormatExample,
- type: "Chiffre",
- example: "3290.23",
- },
- {
- title: "famille_produits",
- name: "Famille de produits",
- description: `Options acceptées : ${Object.keys(Constants.ProductFamilies).map(
- (x) => " " + x + "
"
- )}`,
- type: "Texte (choix unique)",
- example: `${Object.keys(Constants.ProductFamilies)[0]}`,
- },
- {
- title: "caracteristiques",
- name: "Caractéristiques",
- description: `Options acceptées : ${Object.keys(Constants.Characteristics).map(
- (x) => " " + x + "
"
- )}. Spécifiez plusieurs en séparant avec un ,
.`,
- type: "Texte",
- example: `${Object.keys(Constants.Characteristics)[0]},${Object.keys(Constants.Characteristics)[3]}`,
- },
- {
- title: "definition_local",
- name: "Définition de local",
- description: `Obligatoire si l'achat a la caractéristique de LOCAL. Options acceptées : ${Object.keys(
- Constants.LocalDefinitions
- ).map((x) => " " + x + "
")}.`,
- type: "Texte (choix unique)",
- example: `${Object.keys(Constants.LocalDefinitions)[0]}`,
- },
- ],
+ documentation: [], // see mounted
validators,
isStaff: user.isStaff,
duplicateFile: false,
}
},
+ mounted() {
+ this.fetchSchema()
+ },
methods: {
+ fetchSchema() {
+ fetch(
+ "https://raw.githubusercontent.com/betagouv/ma-cantine/raphodn/import-de-masse-rendre-le-header-obligatoire-achats-json/data/schemas/imports/achats.json"
+ )
+ .then((response) => response.json())
+ .then((json) => {
+ this.documentation = json.fields
+ })
+ },
+ getSchemaFieldType(field) {
+ if (field.name in Constants.SchemaTypes) {
+ return Constants.SchemaTypes[field.name]
+ }
+ if (field.constraints && field.constraints.enum) {
+ if (field.constraints.enum_multiple) {
+ return Constants.SchemaTypes[`${field.type}_enum_multiple`]
+ }
+ return Constants.SchemaTypes[`${field.type}_enum`]
+ }
+ return Constants.SchemaTypes[field.type]
+ },
upload() {
this.importInProgress = true
this.duplicateFile = false
diff --git a/macantine/settings.py b/macantine/settings.py
index e638f62e0..339d3d610 100644
--- a/macantine/settings.py
+++ b/macantine/settings.py
@@ -494,6 +494,7 @@
"wss://client.relay.crisp.chat",
"entreprise.data.gouv.fr",
"plateforme.adresse.data.gouv.fr",
+ "raw.githubusercontent.com/betagouv/ma-cantine/", # data/schemas/imports/
)
if DEBUG:
CSP_CONNECT_SRC += CSP_DEBUG_DOMAINS