From 2d7ed527f3c6321398dfdb430cda5d5b0ae17d7b Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Thu, 16 Jun 2022 16:15:25 +0200
Subject: [PATCH 1/4] =?UTF-8?q?r=C3=A9paration=20affichage=20erreur=20page?=
 =?UTF-8?q?=20repository=20(retr=C3=A9=20des=20erreur=20dupliqu=C3=A9)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ui/src/locales/fr.json                        |   2 +-
 ui/src/services/AlertService.js               | 116 +++++++++---------
 ui/src/services/ErrorsService.js              |  15 ++-
 .../datatype/DataTypesRepositoryView.vue      |  74 +++++++++--
 4 files changed, 136 insertions(+), 71 deletions(-)

diff --git a/ui/src/locales/fr.json b/ui/src/locales/fr.json
index 57ffd4f27..f0a356018 100644
--- a/ui/src/locales/fr.json
+++ b/ui/src/locales/fr.json
@@ -117,7 +117,7 @@
         "authorizationScopeVariableComponentWrongChecker": "Le composant <code>{component}</code> de la variable <code>{variable}</code> ne peut pas être utilisé comme portant l’information temporelle car ce n’est pas une donnée déclarée comme <code>{expectedChecker}</code>",
         "authorizationVariableComponentKeyMissingComponent": "Il faut indiquer le composant de la variable <code>{variable}</code> dans laquelle on recueille les informations spatiales à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code> pour l'autorisation <code>{authorizationName}</code>. Valeurs possibles <code>{knownComponents}</code>",
         "authorizationVariableComponentKeyUnknownComponent": "<code>{component}</code> ne fait pas partie des composants connus pour la variable <code>{variable}</code>. Composants connus : <code>{knownComponents}</code>",
-        "badauthorizationscopeforrepository": "L'autorisation <code>{authorization}</code>) doit être <code>{expectedValue}/code> et non <code>{givenValue}</code>",
+        "badauthorizationscopeforrepository": "L'autorisation (<code>{authorization}</code>) doit être <code>{expectedValue}</code> et non <code>{givenValue}</code>",
         "checkerExpressionReturnedFalse": "La contrainte suivante n'est pas respectée : <code>{expression}</code>",
         "csvBoundToUnknownVariable": "Dans le format CSV, l’entête <code>{header}</code> est lié à la variable <code>{variable}</code> qui n’est pas connue. Variables connues <code>{variables}</code>",
         "csvBoundToUnknownVariableComponent": "Dans le format CSV, l’entête <code>{header}</code> est lié à la variable <code>{variable}</code> mais elle n’a pas de composant <code>{component}</code>. Composants connus <code>{components}</code>",
diff --git a/ui/src/services/AlertService.js b/ui/src/services/AlertService.js
index 3b4aada75..e21c81b55 100644
--- a/ui/src/services/AlertService.js
+++ b/ui/src/services/AlertService.js
@@ -1,6 +1,6 @@
-import {i18n} from "@/main";
-import {BuefyTypes} from "@/utils/BuefyUtils";
-import {ToastProgrammatic, DialogProgrammatic} from "buefy";
+import { i18n } from "@/main";
+import { BuefyTypes } from "@/utils/BuefyUtils";
+import { ToastProgrammatic, DialogProgrammatic } from "buefy";
 
 const TOAST_INFO_DURATION = 3000;
 const TOAST_ERROR_DURATION = 8000;
@@ -10,66 +10,66 @@ const TOAST_POSITION = "is-top";
  * Un service pour gérer les différents messages d'alerte et popup d'info s'affichant sur l'application
  */
 export class AlertService {
-    static INSTANCE = new AlertService();
+  static INSTANCE = new AlertService();
 
-    toastSuccess(message) {
-        ToastProgrammatic.open({
-            message: message,
-            type: BuefyTypes.SUCCESS,
-            duration: TOAST_INFO_DURATION,
-            position: TOAST_POSITION,
-        });
-    }
+  toastSuccess(message) {
+    ToastProgrammatic.open({
+      message: message,
+      type: BuefyTypes.SUCCESS,
+      duration: TOAST_INFO_DURATION,
+      position: TOAST_POSITION,
+    });
+  }
+
+  toastWarn(message, error) {
+    console.warn("[WARNING] " + message, error);
+    ToastProgrammatic.open({
+      message: message,
+      type: BuefyTypes.WARNING,
+      duration: TOAST_ERROR_DURATION,
+      position: TOAST_POSITION,
+    });
+  }
 
-    toastWarn(message, error) {
-        console.warn("[WARNING] " + message, error);
+  toastError(message, error) {
+    if (error.content) {
+      error.content.then((t) => {
         ToastProgrammatic.open({
-            message: message,
-            type: BuefyTypes.WARNING,
-            duration: TOAST_ERROR_DURATION,
-            position: TOAST_POSITION,
+          message: i18n.t("exceptionMessage." + t.message, t.params),
+          type: BuefyTypes.DANGER,
+          duration: TOAST_ERROR_DURATION,
+          position: TOAST_POSITION,
         });
+      });
+    } else {
+      ToastProgrammatic.open({
+        message: message,
+        type: BuefyTypes.DANGER,
+        duration: TOAST_ERROR_DURATION,
+        position: TOAST_POSITION,
+      });
     }
+  }
 
-    toastError(message, error) {
-        if (error.content) {
-            error.content.then((t) => {
-                ToastProgrammatic.open({
-                    message: i18n.t('exceptionMessage.' + t.message, t.params),
-                    type: BuefyTypes.DANGER,
-                    duration: TOAST_ERROR_DURATION,
-                    position: TOAST_POSITION,
-                });
-            })
-        } else {
-            ToastProgrammatic.open({
-                message: message,
-                type: BuefyTypes.DANGER,
-                duration: TOAST_ERROR_DURATION,
-                position: TOAST_POSITION,
-            });
-        }
+  toastServerError(error) {
+    if (error.content != null) {
+      error.content.then((value) => this.toastError(value.message, error));
+    } else {
+      this.toastError(i18n.t("alert.server-error"), error);
     }
+  }
 
-    toastServerError(error) {
-        if (error.content != null) {
-            error.content.then((value) => this.toastError(value.message, error));
-        } else {
-            this.toastError(i18n.t("alert.server-error"), error);
-        }
-    }
-
-    dialog(title, message, confirmText, type, onConfirmCb) {
-        DialogProgrammatic.confirm({
-            title: title,
-            message: message,
-            confirmText: confirmText,
-            type: type,
-            hasIcon: true,
-            cancelText: this.cancelMsg,
-            onConfirm: () => {
-                onConfirmCb();
-            },
-        });
-    }
-}
\ No newline at end of file
+  dialog(title, message, confirmText, type, onConfirmCb) {
+    DialogProgrammatic.confirm({
+      title: title,
+      message: message,
+      confirmText: confirmText,
+      type: type,
+      hasIcon: true,
+      cancelText: this.cancelMsg,
+      onConfirm: () => {
+        onConfirmCb();
+      },
+    });
+  }
+}
diff --git a/ui/src/services/ErrorsService.js b/ui/src/services/ErrorsService.js
index 2497aefdd..5ce861953 100644
--- a/ui/src/services/ErrorsService.js
+++ b/ui/src/services/ErrorsService.js
@@ -139,7 +139,18 @@ export class ErrorsService {
       const func = ERRORS[csvError.validationCheckResult.message];
       if (csvError.validationCheckResult.messageParams.target != null) {
         if (csvError.validationCheckResult.messageParams.target.column != null) {
-          csvError.validationCheckResult.messageParams.target = csvError.validationCheckResult.messageParams.target.column;
+          csvError.validationCheckResult.messageParams.target =
+            csvError.validationCheckResult.messageParams.target.column;
+        }
+      }
+      if(csvError.validationCheckResult.messageParams.expectedValue != null || csvError.validationCheckResult.messageParams.givenValue != null) {
+        if (csvError.validationCheckResult.messageParams.expectedValue.sql != null) {
+          csvError.validationCheckResult.messageParams.expectedValue =
+            csvError.validationCheckResult.messageParams.expectedValue.sql;
+        }
+        if(csvError.validationCheckResult.messageParams.givenValue.sql != null) {
+          csvError.validationCheckResult.messageParams.givenValue =
+              csvError.validationCheckResult.messageParams.givenValue.sql;
         }
       }
       if (!func) {
@@ -153,4 +164,4 @@ export class ErrorsService {
       return func(params);
     });
   }
-}
\ No newline at end of file
+}
diff --git a/ui/src/views/datatype/DataTypesRepositoryView.vue b/ui/src/views/datatype/DataTypesRepositoryView.vue
index 1af62cef7..816e9c71b 100644
--- a/ui/src/views/datatype/DataTypesRepositoryView.vue
+++ b/ui/src/views/datatype/DataTypesRepositoryView.vue
@@ -191,7 +191,21 @@
                 {{
                   currentDataset[0].periode
                 }}
+                <div v-if="errorsMessages.length" style="margin: 10px">
+                  <div v-for="msg in errorsMessages" v-bind:key="msg">
+                    <b-message
+                        :title="$t('message.data-type-config-error')"
+                        type="is-danger"
+                        has-icon
+                        :aria-close-label="$t('message.close')"
+                        class="mt-4 DataTypesManagementView-message"
+                    >
+                      <span v-html="msg" />
+                    </b-message>
+                  </div>
+                </div>
               </caption>
+
               <tr>
                 <th align>{{ $t("dataTypesRepository.table-file-data-id") }}</th>
                 <th align>{{ $t("dataTypesRepository.table-file-data-size") }}</th>
@@ -272,6 +286,7 @@ import { Dataset } from "@/model/file/Dataset";
 import { InternationalisationService } from "@/services/InternationalisationService";
 import { LOCAL_STORAGE_LANG } from "@/services/Fetcher";
 import DropDownMenu from "@/components/common/DropDownMenu";
+import {HttpStatusCodes} from "@/utils/HttpUtils";
 
 @Component({
   components: { DropDownMenu, CollapsibleTree, PageView, SubMenu },
@@ -305,6 +320,7 @@ export default class DataTypesRepositoryView extends Vue {
   endDate = null;
   comment = "";
   currentDataset = null;
+  errorsMessages = [];
 
   mounted() {
     this.$on("authorizationChanged", this.updateDatasets);
@@ -471,29 +487,67 @@ export default class DataTypesRepositoryView extends Vue {
         this.file,
         fileOrId
       );
-      console.log(fileOrId);
       this.$emit("uploaded", uuid);
     }
   }
 
   async publish(dataset, pusblished) {
+    this.errorsMessages = [];
     dataset.params.published = pusblished;
     let requiredauthorizations = dataset.params.binaryFiledataset.requiredauthorizations;
     requiredauthorizations = Object.keys(requiredauthorizations).reduce(function (acc, key) {
       acc[key] = acc[key] ? acc[key].sql : "";
       return acc;
     }, requiredauthorizations);
-    console.log("requiredauthorizations", requiredauthorizations);
     dataset.params.binaryFiledataset.requiredauthorizations = requiredauthorizations;
-    console.log("binaryFiledataset", dataset.params.binaryFiledataset);
     var fileOrId = new FileOrUUID(dataset.id, dataset.params.binaryFiledataset, pusblished);
-    var uuid = await this.dataService.addData(
-      this.applicationName,
-      this.dataTypeId,
-      null,
-      fileOrId
-    );
-    this.$emit("published", uuid.fileId);
+    try {
+      var uuid = await this.dataService.addData(
+          this.applicationName,
+          this.dataTypeId,
+          null,
+          fileOrId
+      );
+      this.$emit("published", uuid.fileId);
+      this.alertService.toastSuccess(this.$t("alert.data-updated"));
+    } catch (error) {
+      this.checkMessageErrors(error);
+    }
+  }
+
+  checkMessageErrors(error) {
+    let message = [];
+    if (error.httpResponseCode === HttpStatusCodes.BAD_REQUEST) {
+      if (error.content != null) {
+        this.errorsList = [];
+        error.content.then((value) => {
+          for (let i = 0; i < value.length; i++) {
+            if (message.length > 0) {
+              if (JSON.stringify(value[i]) !== JSON.stringify(value[i-message.length])) {
+                console.log(message)
+                this.errorsList.push(value[i]);
+              }
+              for(let j = 0; j < message.length; j++) {
+                if (!message.includes(value[i].validationCheckResult.message)) {
+                  message.push(value[i].validationCheckResult.message);
+                }
+              }
+            } else {
+              message.push(value[i].validationCheckResult.message);
+              this.errorsList.push(value[i]);
+            }
+          }
+          console.log(this.errorsList)
+          if (this.errorsList.length !== 0) {
+            this.errorsMessages = this.errorsService.getCsvErrorsMessages(this.errorsList);
+          } else {
+            this.errorsMessages = this.errorsService.getErrorsMessages(error);
+          }
+        });
+      }
+    } else {
+      this.alertService.toastServerError(error);
+    }
   }
 
   selectAuthorization(key, event) {
-- 
GitLab


From cffe6c6f8589666ca57884c0e35d91b7e3526405 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Wed, 22 Jun 2022 15:24:58 +0200
Subject: [PATCH 2/4] =?UTF-8?q?r=C3=A9alisation=20test=20back=20manquant?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ApplicationConfigurationServiceTest.java  |  90 ++++++++-
 .../java/fr/inra/oresing/rest/Fixtures.java   |  50 ++++-
 .../oresing/rest/TestReferencesErrors.java    |  45 ++++-
 .../data/recursivite/recusivite.yaml          | 187 +++++++++++++-----
 src/test/resources/data/recursivite/sites.csv |  44 +++++
 ...ons_prelevements_01-01-2020_31-12-2020.csv |  17 ++
 .../applications/errors/ref_ola_errors.json   |   2 +-
 7 files changed, 383 insertions(+), 52 deletions(-)
 create mode 100644 src/test/resources/data/recursivite/sites.csv
 create mode 100644 src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv

diff --git a/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java b/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java
index f3043cedf..a9ecaad23 100644
--- a/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java
+++ b/src/test/java/fr/inra/oresing/rest/ApplicationConfigurationServiceTest.java
@@ -1111,6 +1111,72 @@ public class ApplicationConfigurationServiceTest {
         Assert.assertEquals("timeScopeVariableComponentPatternUnknown", onlyError.getMessage());
     }
 
+    // ne renvois pas d'erreur
+    @Test
+    @Ignore
+    public void testMissingBoundToForConstantDescription() {
+        ConfigurationParsingResult configurationParsingResult = parseYaml("testMissingBoundToForConstantDescription", "format:", "format:\n" +
+                "      constants:\n" +
+                "        - rowNumber: 1\n" +
+                "          columnNumber: 2\n" +
+                "          exportHeader: nom du projet");
+        Assert.assertFalse(configurationParsingResult.isValid());
+        ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults());
+        log.debug(onlyError.getMessage());
+        Assert.assertEquals("missingBoundToForConstantDescription", onlyError.getMessage());
+    }
+
+    // ne renvois pas d'erreur
+    @Test
+    @Ignore
+    public void testMissingColumnNumberOrHeaderNameForConstantDescription() {
+        ConfigurationParsingResult configurationParsingResult = parseYaml("testMissingColumnNumberOrHeaderNameForConstantDescription", "format:", "format:\n" +
+                "      constants:\n" +
+                "        - rowNumber: 1\n" +
+                "          boundTo:\n" +
+                "            variable: localization\n" +
+                "            component: site\n" +
+                "          exportHeader: \"Site\"");
+        Assert.assertFalse(configurationParsingResult.isValid());
+        ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults());
+        log.debug(onlyError.getMessage());
+        Assert.assertEquals("missingColumnNumberOrHeaderNameForConstantDescription", onlyError.getMessage());
+    }
+
+    // ne renvois pas d'erreur
+    @Test
+    @Ignore
+    public void testMissingExportHeaderNameForConstantDescription() {
+        ConfigurationParsingResult configurationParsingResult = parseYaml("testMissingExportHeaderNameForConstantDescription", "format:", "format:\n" +
+                "      constants:\n" +
+                "        - rowNumber: 1\n" +
+                "          columnNumber: 2\n" +
+                "          boundTo:\n" +
+                "            variable: localization\n" +
+                "            component: site\n");
+        Assert.assertFalse(configurationParsingResult.isValid());
+        ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults());
+        log.debug(onlyError.getMessage());
+        Assert.assertEquals("missingExportHeaderNameForConstantDescription", onlyError.getMessage());
+    }
+
+    // ne renvois pas d'erreur
+    @Test
+    @Ignore
+    public void testMissingRowLineForConstantDescription() {
+        ConfigurationParsingResult configurationParsingResult = parseYaml("testMissingRowLineForConstantDescription", "format:", "format:\n" +
+                "      constants:\n" +
+                "        - columnNumber: 2\n" +
+                "          boundTo:\n" +
+                "            variable: localization\n" +
+                "            component: site\n" +
+                "          exportHeader: \"Site\"");
+        Assert.assertFalse(configurationParsingResult.isValid());
+        ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults());
+        log.debug(onlyError.getMessage());
+        Assert.assertEquals("missingRowLineForConstantDescription", onlyError.getMessage());
+    }
+
     @Test
     public void testUnknownReferenceForCheckerInReferenceColumn() {
         ConfigurationParsingResult configurationParsingResult = parseYaml("testUnknownReferenceForCheckerInReferenceColumn", "nom du type de plateforme:\n" +
@@ -1129,6 +1195,28 @@ public class ApplicationConfigurationServiceTest {
         Assert.assertEquals("unrecognizedProperty", onlyError.getMessage());
     }
 
+    // je n'arrive pas à fiare remonter cette erreur mais je ne suis pas sûr d'être sur pour cette erreur
+    @Test
+    @Ignore
+    public void testTimerangeoutofinterval() {
+        ConfigurationParsingResult configurationParsingResult = parseYaml("testTimerangeoutofinterval", "variables:\n" +
+                "        components:\n" +
+                "          biovolume_algal:", "variables:\n" +
+                "        components:\n" +
+                "          biovolume_algal:\n" +
+                "        chartDescription:\n" +
+                "          value: value\n" +
+                "          aggregation:\n" +
+                "            variable: variables\n" +
+                "            component: biovolume_algal\n" +
+                "          unit: \"unit\"\n" +
+                "          gap: '1 MONTH'");
+        Assert.assertFalse(configurationParsingResult.isValid());
+        ValidationCheckResult onlyError = Iterables.getOnlyElement(configurationParsingResult.getValidationCheckResults());
+        log.debug(onlyError.getMessage());
+        Assert.assertEquals("timerangeoutofinterval", onlyError.getMessage());
+    }
+
     @Test
     public void testNoCapturingGroupForDatatypeRepository() {
         ConfigurationParsingResult configurationParsingResult = parseYaml("testNoCapturingGroupForDatatypeRepository",
@@ -1205,4 +1293,4 @@ public class ApplicationConfigurationServiceTest {
         log.debug(onlyError.getMessage());
         Assert.assertEquals("invalidCapturingGroupForEndDateDatatypeRepositoryDate", onlyError.getMessage());
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/fr/inra/oresing/rest/Fixtures.java b/src/test/java/fr/inra/oresing/rest/Fixtures.java
index b552d269a..6628fe11e 100644
--- a/src/test/java/fr/inra/oresing/rest/Fixtures.java
+++ b/src/test/java/fr/inra/oresing/rest/Fixtures.java
@@ -153,6 +153,23 @@ public class Fixtures {
                 "   }", plateforme, projet, site);
     }
 
+
+    public String getConditionsPrelevementRepositoryId(String site) {
+        return String.format("{\n" +
+                "      \"requiredAuthorizations\":{\n" +
+                "         \"localization_site\":\"leman\"\n" +
+                "      },\n" +
+                "      \"from\":\"2020-01-01 00:00:00\",\n" +
+                "      \"to\":\"2020-31-12 00:00:00\"\n" +
+                "   }", site);
+    }
+    public String getConditionsPrelevementDataResourceName() {
+        return "/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv";
+    }
+    public String getConditionsPrelevementRepositoryResourceName(String site) {
+        return String.format("/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv", site);
+    }
+
     public Map<String, String> getProgressiveYaml() {
         Map<String, String> yamls = new LinkedHashMap<>();
         yamls.put("testAuthorizationScopeWithoutReference", "/data/progressiveyaml/testAuthorizationScopeWithoutReference.yaml");
@@ -186,6 +203,7 @@ public class Fixtures {
         Map<String, String> referentielFiles = new LinkedHashMap<>();
         referentielFiles.put("proprietes_taxon", "/data/recursivite/proprietes_des_taxons.csv");
         referentielFiles.put("taxon", "/data/recursivite/taxons_du_phytoplancton-reduit.csv");
+        referentielFiles.put("site", "/data/recursivite/sites.csv");
         return referentielFiles;
     }
 
@@ -254,9 +272,35 @@ public class Fixtures {
     public Map<String, List<String>> getRecursiviteDataErrorsStringReplace() {
         Map<String, List<String>> DataTypeErrors = new LinkedHashMap<>();
         DataTypeErrors.put("duplicatedLineInDatatype", List.of(
-                "suivi_des_lacs;grand_lac.leman;leman.shl2__station_de_prelevement_lac;17/03/2010;Bouteille Pelletier;microscope inverse zeiss axiovert 135;878170.9",
-                "suivi_des_lacs;grand_lac.leman;leman.shl2__station_de_prelevement_lac;24/02/2010;Bouteille Pelletier;microscope inverse zeiss axiovert 135;223408.73",
-                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"phytoplancton_aggregated\",\"duplicatedRows\":[3,4],\"uniquenessKey\":{\"outils_prélèvement\":\"Bouteille Pelletier\",\"outils_mesure\":\"microscope inverse zeiss axiovert 135\",\"dates_day\":\"24/02/2010\",\"projets_nom du projet\":\"suivi_des_lacs\",\"plateformes_nom de la plateforme\":\"leman.shl2__station_de_prelevement_lac\",\"site_nom du site\":\"grand_lac.leman\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]"
+                "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
+                "suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris",
+                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"condition_prelevements\",\"duplicatedRows\":[3,8],\"uniquenessKey\":{\"valeurs qualitatives_nebulosite\":\"1\",\"valeurs qualitatives_etat de surface\":\"amas d'algues\",\"valeurs qualitatives_aspect de l'eau\":\"friselis\",\"valeurs qualitatives_vitesse du vent\":\"2\",\"date_day\":\"20/07/2020\",\"projet_value\":\"suivi des lacs\",\"commentaire_value\":\"\",\"valeurs qualitatives_couleur de l'eau\":\"vert-gris\",\"valeurs quantitatives_temperature de l'air\":\"21\",\"date_time\":\"08:45:00\",\"valeurs quantitatives_pression atmospherique\":\"973\",\"valeurs quantitatives_transparence par secchi\":\"7.8\",\"valeurs qualitatives_ensoleillement\":\"ensoleille\",\"valeurs quantitatives_transparence par disque inra\":\"\",\"valeurs qualitatives_direction du vent\":\"\",\"site_nom de la plateforme\":\"SHL2\",\"valeurs qualitatives_temps\":\"clair\",\"site_nom du site\":\"leman\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]"
+        ));
+        // problème liste de site non fixe donc le test ne passe pas mais le message d'erreur est bon
+        /*DataTypeErrors.put("invalidReference", List.of(
+                "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
+                "suivi des lacs;Lemann;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
+                "[{\"validationCheckResult\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"level\":\"ERROR\",\"rawValue\":\"lemann\",\"matchedReferenceHierarchicalKey\":null,\"matchedReferenceId\":null,\"message\":\"invalidReference\",\"messageParams\":{\"target\":\"site/nom du site\",\"referenceValues\":[\"izourt\",\"cos\",\"anterne\",\"bresses_superieur\",\"jovet\",\"lauzanier\",\"blanc_du_carro\",\"pormenaz\",\"barroude\",\"pave\",\"petarel\",\"dranse\",\"port___bielh\",\"bresses_inferieur\",\"estany_gros\",\"merlet_superieur\",\"rabuons\",\"corne\",\"blanc_du_bramant\",\"mercube\",\"pisses\",\"oncet\",\"annecy\",\"bourget\",\"gentau\",\"bramant\",\"aiguebelette\",\"leman\",\"mont_coua\",\"espingo\",\"port_bielh\",\"muzelle\",\"aumar\",\"arbu\",\"cornu\",\"aratilles\",\"gourg_gaudet\",\"isaby\",\"arpont\",\"plan_vianney\",\"brevent\",\"malrif\",\"noir_du_carro\"],\"refType\":\"site\",\"value\":\"lemann\"},\"error\":true,\"success\":false},\"lineNumber\":3}]"
+        ));*/
+        DataTypeErrors.put("invalidDate", List.of(
+                "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
+                "suivi des lacs;leman;SHL2;20/07/20;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris",
+                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDate\",\"messageParams\":{\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"20/07/20\"},\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":3}]"
+        ));
+        DataTypeErrors.put("invalidInt", List.of(
+                "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
+                "suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;0.2;973;friselis;amas d'algues;;7.8;vert-gris",
+                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidInteger\",\"messageParams\":{\"target\":{\"variable\":\"valeurs qualitatives\",\"component\":\"vitesse du vent\",\"id\":\"valeurs qualitatives_vitesse du vent\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"0.2\"},\"error\":true,\"success\":false},\"lineNumber\":3}]"
+        ));
+        DataTypeErrors.put("invalidFloat", List.of(
+                "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
+                "suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8x;vert-gris",
+                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloat\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"transparence par secchi\",\"id\":\"valeurs quantitatives_transparence par secchi\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"7.8x\"},\"error\":true,\"success\":false},\"lineNumber\":3}]"
+        ));
+        DataTypeErrors.put("requiredValue", List.of(
+                "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
+                "suivi des lacs;;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris",
+                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"requiredValue\",\"messageParams\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]"
         ));
         return DataTypeErrors;
     }
diff --git a/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java b/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java
index 1de60e895..12c0b127c 100644
--- a/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java
+++ b/src/test/java/fr/inra/oresing/rest/TestReferencesErrors.java
@@ -166,9 +166,23 @@ public class TestReferencesErrors {
                 responses.put(e.getKey(), response);
             }
         }
+        for (Map.Entry<String, String> e : fixtures.getRecursiviteReferentielOrderFiles().entrySet()) {
+            try (InputStream refStream = getClass().getResourceAsStream(e.getValue())) {
+                MockMultipartFile refFile = new MockMultipartFile("file", e.getValue(), "text/plain", refStream);
+
+                response = mockMvc.perform(MockMvcRequestBuilders.multipart("/api/v1/applications/recursivite/references/{refType}", e.getKey())
+                                .file(refFile)
+                                .cookie(authCookie))
+                        .andExpect(status().isCreated())
+                        .andExpect(jsonPath("$.id", IsNull.notNullValue()))
+                        .andReturn().getResponse().getContentAsString();
+
+                JsonPath.parse(response).read("$.id");
+            }
+        }
 
         // ajout de data
-        String phytoAggregatedData_path = fixtures.getPhytoAggregatedDataResourceName();
+        /*String phytoAggregatedData_path = fixtures.getConditionsPrelevementDataResourceName();
         StringBuilder textBuilders = new StringBuilder();
         try (InputStream refStream = fixtures.getClass().getResourceAsStream(phytoAggregatedData_path)) {
             try (Reader reader = new BufferedReader(new InputStreamReader
@@ -191,6 +205,35 @@ public class TestReferencesErrors {
                         .andExpect(MockMvcResultMatchers.status().is4xxClientError())
                         .andReturn().getResponse().getContentAsString();
 
+                Assert.assertEquals(e.getValue().get(2), response);
+                responses.put(e.getKey(), response);
+            }
+        }*/
+        // test repository
+        String site = "leman";
+        URL resources = getClass().getResource(fixtures.getConditionsPrelevementRepositoryResourceName(site));
+        StringBuilder textBuild = new StringBuilder();
+        try (InputStream refStream = Objects.requireNonNull(resources).openStream()) {
+            try (Reader reader = new BufferedReader(new InputStreamReader
+                    (refStream, Charset.forName(StandardCharsets.UTF_8.name())))) {
+                int c = 0;
+                while ((c = reader.read()) != -1) {
+                    textBuild.append((char) c);
+                }
+            }
+        }
+        String monRepositoryCSV = textBuild.toString();
+        for (Map.Entry<String, List<String>> e : fixtures.getRecursiviteDataErrorsStringReplace().entrySet()) {
+            String textCsvModify = monRepositoryCSV.replace(e.getValue().get(0), e.getValue().get(1));
+            try (InputStream refStream = new ByteArrayInputStream(textCsvModify.getBytes(StandardCharsets.UTF_8))) {
+                MockMultipartFile refFile = new MockMultipartFile("file", "suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv", "text/plain", refStream);
+                log.info(e.getKey());
+                response = mockMvc.perform(MockMvcRequestBuilders.multipart("/api/v1/applications/recursivite/data/condition_prelevements")
+                                .file(refFile)
+                                .cookie(authCookie))
+                        .andExpect(MockMvcResultMatchers.status().is4xxClientError())
+                        .andReturn().getResponse().getContentAsString();
+
                 Assert.assertEquals(e.getValue().get(2), response);
                 responses.put(e.getKey(), response);
             }
diff --git a/src/test/resources/data/recursivite/recusivite.yaml b/src/test/resources/data/recursivite/recusivite.yaml
index d8be72bfe..ee9101cfe 100644
--- a/src/test/resources/data/recursivite/recusivite.yaml
+++ b/src/test/resources/data/recursivite/recusivite.yaml
@@ -147,45 +147,75 @@ references:
         reference: proprietes_taxon
         referenceColumnToLookForHeader: nom de la propriété_key
 dataTypes:
-  phytoplancton_aggregated:
+  # début de la description du fichier des données de condition de prélèvement
+  condition_prelevements:
     uniqueness:
       - variable: dates
         component: day
-      - variable: projets
-        component: nom du projet
-      - variable: site
-        component: nom du site
-      - variable: plateformes
-        component: nom de la plateforme
-      - variable: outils
-        component: prélèvement
-      - variable: outils
-        component: mesure
+    # ajout d'un nom internationnalisé
+    internationalizationName:
+      fr: Condition de prélèvement
+      en: Collection condition
+    repository:
+      filePattern:
+    # mise en place des liens entre les references et les colonnes du fichier
     data:
-      dates:
+      date:
         components:
           day:
             checker:
               name: Date
               params:
                 pattern: dd/MM/yyyy
-      projets:
+          time:
+            checker:
+              name: Date
+              params:
+                pattern: HH:mm:ss
+      projet:
         components:
-          nom du projet:
+          value:
       site:
         components:
           nom du site:
-      plateformes:
-        components:
+            checker:
+              name: Reference
+              params:
+                transformation:
+                  codify: true
+                required: true
+                refType: site
           nom de la plateforme:
-      outils:
+      valeurs qualitatives:
         components:
-          prélèvement:
-          mesure:
-      variables:
+          couleur de l'eau:
+          direction du vent:
+          ensoleillement:
+          temps:
+          aspect de l'eau:
+          etat de surface:
+          nebulosite:
+          vitesse du vent:
+            checker:
+              name: Integer
+      valeurs quantitatives:
+        components:
+          pression atmospherique:
+          temperature de l'air:
+          transparence par disque inra:
+          transparence par secchi:
+            checker:
+              name: Float
+              params:
+                required: false
+      #            defaultValue:
+      #              expression : return "cm"
+      commentaire:
         components:
-          biovolume_algal:
+          value:
+    # création des authorisations
     authorization:
+      # par groupe de données
       dataGroups:
         referentiel:
           internationalizationName:
@@ -193,47 +223,112 @@ dataTypes:
             en: Referential
           label: "Référentiel"
           data:
-            - dates
-            - projets
+            - date
+            - projet
             - site
-            - plateformes
-        condition:
+            - commentaire
+        qualitatif:
+          internationalizationName:
+            fr: Données qualitatives
+            en: Qualitative data
+          label: "Données qualitatives"
+          data:
+            - valeurs qualitatives
+        quantitatif:
           internationalizationName:
-            fr: Contexte
-            en: Context
-          label: "Contexte"
+            fr: Données quantitatives
+            en: Quantitative data
+          label: "Données quantitatives"
           data:
-            - outils
-            - variables
+            - valeurs quantitatives
+      # par types de données (ex: ici on fait par localisation)
+      authorizationScopes:
+        localization_site:
+          variable: site
+          component: nom du site
+      # par date
+      timeScope:
+        variable: date
+        component: day
+    # description de la mise en page du fichier de données colonne par colonne
     format:
+      # on localise la ligne où il y a les noms des colonnes (dans ce fichier c'est la ligne 1)
       headerLine: 1
+      # on localise la première ligne avec des données (ici on commence à la ligne 2)
       firstRowLine: 2
+      # puis on liste les colonnes
       columns:
-        - header: "nom du projet"
+        # dans header on met le nom de la colonne (attention il faut que le nom de la colonne soit IDENTIQUE à celui du fichier. /!\ Espace compris)
+        - header: "Nom du projet"
           boundTo:
-            variable: projets
-            component: nom du projet
+            variable: projet
+            component: value
         - header: "nom du site"
           boundTo:
             variable: site
             component: nom du site
-        - header: "nom de la plateforme"
+        - header: "Nom de la plateforme"
           boundTo:
-            variable: plateformes
+            variable: site
             component: nom de la plateforme
-        - header: "date de prélèvement"
+        - header: "date de prelevement"
           boundTo:
-            variable: dates
+            variable: date
             component: day
-        - header: "outil de prélèvement"
+        - header: "heure de prelevement"
+          boundTo:
+            variable: date
+            component: time
+        - header: "commentaire"
+          boundTo:
+            variable: commentaire
+            component: value
+        - header: "Température de l'air"
+          boundTo:
+            variable: valeurs quantitatives
+            component: temperature de l'air
+        - header: "nebulosite"
+          boundTo:
+            variable: valeurs qualitatives
+            component: nebulosite
+
+        - header: "ensoleillement"
+          boundTo:
+            variable: valeurs qualitatives
+            component: ensoleillement
+        - header: "temps"
+          boundTo:
+            variable: valeurs qualitatives
+            component: temps
+        - header: "direction du vent"
+          boundTo:
+            variable: valeurs qualitatives
+            component: direction du vent
+        - header: "vitesse du vent"
+          boundTo:
+            variable: valeurs qualitatives
+            component: vitesse du vent
+        - header: "pression atmosphérique"
+          boundTo:
+            variable: valeurs quantitatives
+            component: pression atmospherique
+        - header: "aspect de l'eau"
+          boundTo:
+            variable: valeurs qualitatives
+            component: aspect de l'eau
+        - header: "etat de surface"
+          boundTo:
+            variable: valeurs qualitatives
+            component: etat de surface
+        - header: "transparence par disque inra"
           boundTo:
-            variable: outils
-            component: prélèvement
-        - header: "outil de mesure"
+            variable: valeurs quantitatives
+            component: transparence par disque inra
+        - header: "transparence par secchi 20 cm"
           boundTo:
-            variable: outils
-            component: mesure
-        - header: "biovolume algal total de l'échantillon"
+            variable: valeurs quantitatives
+            component: transparence par secchi
+        - header: "couleur de l'eau"
           boundTo:
-            variable: variables
-            component: biovolume_algal
\ No newline at end of file
+            variable: valeurs qualitatives
+            component: couleur de l'eau
\ No newline at end of file
diff --git a/src/test/resources/data/recursivite/sites.csv b/src/test/resources/data/recursivite/sites.csv
new file mode 100644
index 000000000..0cb29aecf
--- /dev/null
+++ b/src/test/resources/data/recursivite/sites.csv
@@ -0,0 +1,44 @@
+nom du type de site;nom du site_key;nom du site_fr;nom du site_en;description du site_fr;description du site_en;code sandre du Plan d'eau;code sandre de la Masse d'eau plan d'eau
+grand_lac;aiguebelette;Aiguebelette;Aiguebelette;;;DL61;V1535003
+grand_lac;annecy;Annecy;Annecy;lac d' Annecy;lake of Annecy;DL66;V1235003
+grand_lac;bourget;Bourget;Bourget;lac du Bourget;lake of  Bourget;DL60;V1335003
+grand_lac;leman;Léman;Leman(Geneva Lake);lac Léman;Geneva lake (Leman);DL65;V03-4003
+lac_d_altitude;anterne;Anterne;Anterne;Lac d'Anterne;Anterne lake;DL62;V0115023
+lac_d_altitude;aratilles;Aratilles;Aratilles;lac des pyrénées française;french pyrenes lake;;
+lac_d_altitude;arbu;Arbu;Arbu;lac des pyrénées française;french pyrenes lake;;O1135003
+lac_d_altitude;arpont;Arpont;Arpont;Lac de l'Arpont;Arpont Lake;;W1015003
+lac_d_altitude;aumar;Aumar;Aumar;Ce lac est situé pyrénées française à une altitude de 2192 m au cœur de la réserve naturelle de Néouvielle. Il fait partie de l'aménagement hydroélectrique de Pragnères (EDF) où ses eaux sont turbinées;This lake is located in the French pyrénées at 2192 m in the Néouvielle Reserve. This lake belongs to the EDF hydropower scheme of Pragnères;;O0115123
+lac_d_altitude;barroude;Barroude;Barroude;lac des pyrénées française;french pyrenes lake;;O0105023 (grand) et O0105013 (petit)
+lac_d_altitude;blanc_du_bramant;Blanc du Bramant;Blanc du Bramant;lac Blanc du Bramant;Blanc du Bramant Lake;;
+lac_d_altitude;blanc_du_carro;Blanc du Carro;Blanc du Carro;Lac Blanc du Caro;Carro Blanc lake;;W1005043
+lac_d_altitude;bramant;Bramant;Bramant;Lac Bramant;Bramant Lake;;
+lac_d_altitude;bresses_inferieur;Bresses inférieur;Bresses inférieur;lac de Bresses inférieur;Lower Bresse lake;;Y6225043 bis
+lac_d_altitude;bresses_superieur;Bresses supérieur;Bresses supérieur;lac de Bresses supérieur;Upper Bresse lake;;Y6225043
+lac_d_altitude;brevent;Brévent;Brevent;Lac du Brévent;Brevent lake;;V0015023
+lac_d_altitude;corne;Corne;Corne;Lac de Corne;Corne lake;;W2755063
+lac_d_altitude;cornu;Cornu;Cornu;Lac Cornu;Cornu lake;;V0015043
+lac_d_altitude;cos;Cos;Cos;lac de Cos;Cos lake;;W1205063
+lac_d_altitude;espingo;Espingo;Espingo;lac des pyrénées française;french pyrenes lake;;
+lac_d_altitude;estany_gros;Estany Gros;Estany Gros;lac des pyrénées française;french pyrenes lake;;
+lac_d_altitude;gentau;Gentau;Gentau;lac des pyrénées française;french pyrenes lake;;
+lac_d_altitude;gourg_gaudet;Gourg Gaudet;Gourg Gaudet;lac des pyrénées française;french pyrenes lake;;
+lac_d_altitude;isaby;Isaby;Isaby;lac d'Isaby;Isaby lake;;Q4425003
+lac_d_altitude;izourt;Izourt;Izourt;lac d'Izourt;Lake Izourt;;O1125103
+lac_d_altitude;jovet;Jovet;Jovet;Lac Jovet;Jovet lake;;V0025023 et V0025003 (lacs)
+lac_d_altitude;lauzanier;Lauzanier;Lauzanier;lac du Lauzanier;Lauzanier lake;;X0415043
+lac_d_altitude;malrif;Malrif;Malrif;lac de Malrif;Malrif lake;;X0215003 (petit laus), X0215023 (grand laus), Mezan ?
+lac_d_altitude;merlet_superieur;Merlet supérieur;Merlet supérieur;Lac du Merlet supérieur;Upper Merlet lake;;W0225003
+lac_d_altitude;mont_coua;Mont Coua;Mont Coua;lac du Mont Coua;Coua mont lake;;W0235063
+lac_d_altitude;muzelle;Muzelle;Muzelle;lac de la Muzelle;Muzelle lake;;W2735043
+lac_d_altitude;noir_du_carro;Noir du Carro;Noir du Carro;lac Noir du Caro;Carro Noir lake;;W1005023
+lac_d_altitude;oncet;Oncet;Oncet;lac d'Oncet;Oncet lake;;Q4305003
+lac_d_altitude;pave;Pavé;Pavé;lac du Pavé;Pave lake;;W2705003
+lac_d_altitude;petarel;Pétarel;Pétarel;Lac Pétarel;Petarel lake;;W2115023
+lac_d_altitude;pisses;Pisses;Pisses;Lac des Pisses;Pisses lake;;W2005023
+lac_d_altitude;plan_vianney;Plan Vianney;Plan Vianney;Lac de Plan Vianney;Plan Vianney Lake;;W2735003
+lac_d_altitude;pormenaz;Pormenaz;Pormenaz;Lac de Pormenaz;Pormenaz lake;;V0015003
+lac_d_altitude;port_bielh;Port-Bielh;Port-Bielh;lac des pyrénées française;french pyrenes lake;;O0115003
+lac_d_altitude;rabuons;Rabuons;Rabuons;lac du Rabuons;Rabuons lake;;Y6205283
+riviere;dranse;Dranse;Dranse;rivière Dranse;Dranse river;;V03-0400 ou V0321430
+riviere;mercube;Mercube;Mercube;rivière Mercube;Mercube river;;V0351440
+lac_d_altitude;port___bielh;Port Bielh;Port Bielh;lac des pyrénées française;french pyrenes lake;;O0115002
diff --git a/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv b/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv
new file mode 100644
index 000000000..a4e917ce4
--- /dev/null
+++ b/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv
@@ -0,0 +1,17 @@
+Nom du projet;nom du site;Nom de la plateforme;date de prelevement;heure de prelevement;commentaire;Température de l'air;nebulosite;ensoleillement; temps ;direction du vent;vitesse du vent;pression atmosphérique;aspect de l'eau;etat de surface;transparence par disque inra;transparence par secchi 20 cm;couleur de l'eau
+suivi des lacs;leman;SHL2;22/01/2020;08:45:00;probleme de treuil a 150 m batteries. sans consequences;3;1;ensoleille;clair;;2;978;vaguelettes;propre;;15;vert-vert
+suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert
+suivi des lacs;leman;SHL2;05/05/2020;10:30:00;pas d�iWS en panne . echantillon moyen avec les 7 surfaces. pas de production prim. commenc� par Multiparametre cause mauvais temps. puis echantillons avec amelioration;12;8;ombre;clair;;3;970;petites vagues;pollen;;6.1;vert-vert
+suivi des lacs;leman;SHL2;02/06/2020;08:15:00;test de la 214. utilisation du Daphnie en secours ;24;1;ensoleille;clair;;1;970;plat;propre;;5.9;vert-gris
+suivi des lacs;leman;SHL2;15/06/2020;08:30:00;PAM pour Serena. Cyto en panne.Pb treuil sur retour Sonde;18;6;ombre;clair;NW;1;974;plat;propre;;7.5;vert-vert
+suivi des lacs;leman;SHL2;30/06/2020;08:45:00;PAM . +Louise;20;1;ensoleille;clair;;2;970;friselis;amas d'algues;;10.7;bleu-gris
+suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris
+suivi des lacs;leman;SHL2;03/08/2020;08:45:00;orage apres 2 palanquees. attente puis fin prelevements chimie. A/R Evian . impossible l'apres-midi. Pas de ProdPrim;16;10;ombre;clair;;12;969;vagues deferlantes;propre;;;
+suivi des lacs;leman;SHL2;04/08/2020;09:00:00;;13;6;ombre;clair;E;3;971;houle longue;propre;;5.2;vert-vert
+suivi des lacs;leman;SHL2;20/08/2020;08:30:00;la production a deriv�. retrouv�e en face de Torrent;21;1;ensoleille;clair;W;2;968;friselis;branches;;7.0;vert-gris
+suivi des lacs;leman;SHL2;09/09/2020;09:30:00;La prod a d�riv� Pr�sence Yvan Mattadia (2 filets de ZOO);24;1;ensoleille;clair;;1;978;friselis;propre;;6;vert-vert
+suivi des lacs;leman;SHL2;23/09/2020;10:30:00;Commencement tardif cause hourle � l'arriv�e;22;4;ensoleille;clair;;3;966;houle courte;propre;;5.8;vert-gris
+suivi des lacs;leman;SHL2;13/10/2020;11:45:00;"Commencement tardif cause hourle jusqu'à 11H00, pr�l�vement pour Yvan M Leslie et Alexis.  Branche sur parcours";11;5;ensoleille;clair;;3;966;houle courte;propre;;6.4;vert-vert
+suivi des lacs;leman;SHL2;03/11/2020;09:20:00;Octeau tract� par Daphnie. Vent temp�tueux  l'AM et pluie. Profil sonde jusqu�� 240 m.Profil sonde refait  le 6/11;;;ombre;clair;;5;;;branches;;6.5;vert-vert
+suivi des lacs;leman;SHL2;18/11/2020;09:15:00;Octeau tract� par Daphnie;12;5;ensoleille;clair;W;2;983;petites vagues;branches;;5.2;vert-jaune
+suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;4;974;petites vagues;feuilles;;7.8;vert-vert
diff --git a/ui/cypress/fixtures/applications/errors/ref_ola_errors.json b/ui/cypress/fixtures/applications/errors/ref_ola_errors.json
index e14bf38da..192d2a1f7 100644
--- a/ui/cypress/fixtures/applications/errors/ref_ola_errors.json
+++ b/ui/cypress/fixtures/applications/errors/ref_ola_errors.json
@@ -1 +1 @@
-{"duplicatedHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedHeaders\",\"messageParams\":{\"duplicatedHeaders\":[\"définition_fr\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","patternNotMatchedWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"12:00:00\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","duplicatedLineInDatatype":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"phytoplancton_aggregated\",\"duplicatedRows\":[3,4],\"uniquenessKey\":{\"outils_prélèvement\":\"Bouteille Pelletier\",\"outils_mesure\":\"microscope inverse zeiss axiovert 135\",\"dates_day\":\"24/02/2010\",\"projets_nom du projet\":\"suivi_des_lacs\",\"plateformes_nom de la plateforme\":\"leman.shl2__station_de_prelevement_lac\",\"site_nom du site\":\"grand_lac.leman\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]","duplicatedLineInReference":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInReference\",\"messageParams\":{\"file\":\"proprietes_taxon\",\"lineNumber\":40,\"otherLines\":[39,40],\"duplicateKey\":\"notes_libres\"},\"error\":true,\"success\":false},\"lineNumber\":40}]","invalidFloatWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloatWithColumn\",\"messageParams\":{\"target\":{\"column\":\"isFloatValue\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","invalidDateWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"01/01/16\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","invalidHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"Date\",\"nom de la propriété_key\",\"nom de la propriété_fr\",\"nom de la propriété_en\",\"définition_fr\",\"définition_es\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"ordre d'affichage\",\"site\"],\"missingColumns\":[\"définition_en\"],\"unknownColumns\":[\"définition_es\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","emptyHeader":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"emptyHeader\",\"messageParams\":{\"headerLine\":1},\"error\":true,\"success\":false},\"lineNumber\":1}]","invalidReferenceWithColumn":"[{\"validationCheckResult\":{\"target\":{\"column\":\"site\",\"type\":\"PARAM_COLUMN\"},\"level\":\"ERROR\",\"rawValue\":\"martin\",\"matchedReferenceHierarchicalKey\":null,\"matchedReferenceId\":null,\"message\":\"invalidReferenceWithColumn\",\"messageParams\":{\"target\":\"site\",\"referenceValues\":[],\"refType\":\"site\",\"value\":\"martin\"},\"error\":true,\"success\":false},\"lineNumber\":39}]","invalidIntegerWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidIntegerWithColumn\",\"messageParams\":{\"target\":{\"column\":\"ordre d'affichage\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","unexpectedHeaderColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"martin\",\"site\"],\"missingColumns\":[\"Date\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"unknownColumns\":[\"martin\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]"}
\ No newline at end of file
+{"duplicatedHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedHeaders\",\"messageParams\":{\"duplicatedHeaders\":[\"définition_fr\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","patternNotMatchedWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"12:00:00\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","duplicatedLineInReference":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInReference\",\"messageParams\":{\"file\":\"proprietes_taxon\",\"lineNumber\":40,\"otherLines\":[39,40],\"duplicateKey\":\"notes_libres\"},\"error\":true,\"success\":false},\"lineNumber\":40}]","invalidDateWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"01/01/16\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","invalidDate":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDate\",\"messageParams\":{\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"20/07/20\"},\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":3}]","invalidFloat":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloat\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"transparence par secchi\",\"id\":\"valeurs quantitatives_transparence par secchi\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"7.8x\"},\"error\":true,\"success\":false},\"lineNumber\":3}]","duplicatedLineInDatatype":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"condition_prelevements\",\"duplicatedRows\":[3,8],\"uniquenessKey\":{\"valeurs qualitatives_nebulosite\":\"1\",\"valeurs qualitatives_etat de surface\":\"amas d'algues\",\"valeurs qualitatives_aspect de l'eau\":\"friselis\",\"valeurs qualitatives_vitesse du vent\":\"2\",\"date_day\":\"20/07/2020\",\"projet_value\":\"suivi des lacs\",\"commentaire_value\":\"\",\"valeurs qualitatives_couleur de l'eau\":\"vert-gris\",\"valeurs quantitatives_temperature de l'air\":\"21\",\"date_time\":\"08:45:00\",\"valeurs quantitatives_pression atmospherique\":\"973\",\"valeurs quantitatives_transparence par secchi\":\"7.8\",\"valeurs qualitatives_ensoleillement\":\"ensoleille\",\"valeurs quantitatives_transparence par disque inra\":\"\",\"valeurs qualitatives_direction du vent\":\"\",\"site_nom de la plateforme\":\"SHL2\",\"valeurs qualitatives_temps\":\"clair\",\"site_nom du site\":\"leman\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]","invalidInt":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidInteger\",\"messageParams\":{\"target\":{\"variable\":\"valeurs qualitatives\",\"component\":\"vitesse du vent\",\"id\":\"valeurs qualitatives_vitesse du vent\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"0.2\"},\"error\":true,\"success\":false},\"lineNumber\":3}]","invalidFloatWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloatWithColumn\",\"messageParams\":{\"target\":{\"column\":\"isFloatValue\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","invalidHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"Date\",\"nom de la propriété_key\",\"nom de la propriété_fr\",\"nom de la propriété_en\",\"définition_fr\",\"définition_es\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"ordre d'affichage\",\"site\"],\"missingColumns\":[\"définition_en\"],\"unknownColumns\":[\"définition_es\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","emptyHeader":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"emptyHeader\",\"messageParams\":{\"headerLine\":1},\"error\":true,\"success\":false},\"lineNumber\":1}]","invalidReferenceWithColumn":"[{\"validationCheckResult\":{\"target\":{\"column\":\"site\",\"type\":\"PARAM_COLUMN\"},\"level\":\"ERROR\",\"rawValue\":\"martin\",\"matchedReferenceHierarchicalKey\":null,\"matchedReferenceId\":null,\"message\":\"invalidReferenceWithColumn\",\"messageParams\":{\"target\":\"site\",\"referenceValues\":[],\"refType\":\"site\",\"value\":\"martin\"},\"error\":true,\"success\":false},\"lineNumber\":39}]","invalidIntegerWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidIntegerWithColumn\",\"messageParams\":{\"target\":{\"column\":\"ordre d'affichage\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","unexpectedHeaderColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"martin\",\"site\"],\"missingColumns\":[\"Date\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"unknownColumns\":[\"martin\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","requiredValue":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"requiredValue\",\"messageParams\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]"}
\ No newline at end of file
-- 
GitLab


From 34ad406a6a7ed3a36e2a52219c17f3586c7b7600 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Wed, 22 Jun 2022 15:44:45 +0200
Subject: [PATCH 3/4] =?UTF-8?q?r=C3=A9glage=20affichage=20erreur?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/test/resources/data/recursivite/recusivite.yaml          | 2 +-
 ...s_leman_conditions_prelevements_01-01-2020_31-12-2020.csv | 2 +-
 ui/src/services/ErrorsService.js                             | 5 +++++
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/test/resources/data/recursivite/recusivite.yaml b/src/test/resources/data/recursivite/recusivite.yaml
index ee9101cfe..ce1cf86d9 100644
--- a/src/test/resources/data/recursivite/recusivite.yaml
+++ b/src/test/resources/data/recursivite/recusivite.yaml
@@ -150,7 +150,7 @@ dataTypes:
   # début de la description du fichier des données de condition de prélèvement
   condition_prelevements:
     uniqueness:
-      - variable: dates
+      - variable: date
         component: day
     # ajout d'un nom internationnalisé
     internationalizationName:
diff --git a/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv b/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv
index a4e917ce4..2b66eb861 100644
--- a/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv
+++ b/src/test/resources/data/recursivite/suivi_des_lacs_leman_conditions_prelevements_01-01-2020_31-12-2020.csv
@@ -14,4 +14,4 @@ suivi des lacs;leman;SHL2;23/09/2020;10:30:00;Commencement tardif cause hourle 
 suivi des lacs;leman;SHL2;13/10/2020;11:45:00;"Commencement tardif cause hourle jusqu'à 11H00, pr�l�vement pour Yvan M Leslie et Alexis.  Branche sur parcours";11;5;ensoleille;clair;;3;966;houle courte;propre;;6.4;vert-vert
 suivi des lacs;leman;SHL2;03/11/2020;09:20:00;Octeau tract� par Daphnie. Vent temp�tueux  l'AM et pluie. Profil sonde jusqu�� 240 m.Profil sonde refait  le 6/11;;;ombre;clair;;5;;;branches;;6.5;vert-vert
 suivi des lacs;leman;SHL2;18/11/2020;09:15:00;Octeau tract� par Daphnie;12;5;ensoleille;clair;W;2;983;petites vagues;branches;;5.2;vert-jaune
-suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;4;974;petites vagues;feuilles;;7.8;vert-vert
+suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert
diff --git a/ui/src/services/ErrorsService.js b/ui/src/services/ErrorsService.js
index 16076bdd4..8821e8f60 100644
--- a/ui/src/services/ErrorsService.js
+++ b/ui/src/services/ErrorsService.js
@@ -143,11 +143,16 @@ export class ErrorsService {
   getCsvErrorsMessages(csvErrors) {
     return csvErrors.map((csvError) => {
       const func = ERRORS[csvError.validationCheckResult.message];
+      // console.log(csvError.validationCheckResult.messageParams.target);
       if (csvError.validationCheckResult.messageParams.target != null) {
         if (csvError.validationCheckResult.messageParams.target.column != null) {
           csvError.validationCheckResult.messageParams.target =
             csvError.validationCheckResult.messageParams.target.column;
         }
+        if (csvError.validationCheckResult.messageParams.target.id != null) {
+          csvError.validationCheckResult.messageParams.target =
+            csvError.validationCheckResult.messageParams.target.id;
+        }
       }
       if(csvError.validationCheckResult.messageParams.expectedValue != null || csvError.validationCheckResult.messageParams.givenValue != null) {
         if (csvError.validationCheckResult.messageParams.expectedValue.sql != null) {
-- 
GitLab


From 9bda33f4ab7ccc417ab34f0287210568f3baacb4 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Wed, 22 Jun 2022 16:39:26 +0200
Subject: [PATCH 4/4] =?UTF-8?q?passage=20test=20(je=20ne=20sais=20pas=20tr?=
 =?UTF-8?q?op=20pourquoi=20il=20ne=20pass=C3=A9=20plus)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/fr/inra/oresing/rest/Fixtures.java   | 34 +++++++++----------
 .../data/recursivite/recusivite.yaml          | 10 ++++--
 .../applications/errors/ref_ola_errors.json   |  2 +-
 3 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/src/test/java/fr/inra/oresing/rest/Fixtures.java b/src/test/java/fr/inra/oresing/rest/Fixtures.java
index 6628fe11e..bbd523b05 100644
--- a/src/test/java/fr/inra/oresing/rest/Fixtures.java
+++ b/src/test/java/fr/inra/oresing/rest/Fixtures.java
@@ -271,11 +271,6 @@ public class Fixtures {
 
     public Map<String, List<String>> getRecursiviteDataErrorsStringReplace() {
         Map<String, List<String>> DataTypeErrors = new LinkedHashMap<>();
-        DataTypeErrors.put("duplicatedLineInDatatype", List.of(
-                "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
-                "suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris",
-                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"condition_prelevements\",\"duplicatedRows\":[3,8],\"uniquenessKey\":{\"valeurs qualitatives_nebulosite\":\"1\",\"valeurs qualitatives_etat de surface\":\"amas d'algues\",\"valeurs qualitatives_aspect de l'eau\":\"friselis\",\"valeurs qualitatives_vitesse du vent\":\"2\",\"date_day\":\"20/07/2020\",\"projet_value\":\"suivi des lacs\",\"commentaire_value\":\"\",\"valeurs qualitatives_couleur de l'eau\":\"vert-gris\",\"valeurs quantitatives_temperature de l'air\":\"21\",\"date_time\":\"08:45:00\",\"valeurs quantitatives_pression atmospherique\":\"973\",\"valeurs quantitatives_transparence par secchi\":\"7.8\",\"valeurs qualitatives_ensoleillement\":\"ensoleille\",\"valeurs quantitatives_transparence par disque inra\":\"\",\"valeurs qualitatives_direction du vent\":\"\",\"site_nom de la plateforme\":\"SHL2\",\"valeurs qualitatives_temps\":\"clair\",\"site_nom du site\":\"leman\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]"
-        ));
         // problème liste de site non fixe donc le test ne passe pas mais le message d'erreur est bon
         /*DataTypeErrors.put("invalidReference", List.of(
                 "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
@@ -283,24 +278,29 @@ public class Fixtures {
                 "[{\"validationCheckResult\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"level\":\"ERROR\",\"rawValue\":\"lemann\",\"matchedReferenceHierarchicalKey\":null,\"matchedReferenceId\":null,\"message\":\"invalidReference\",\"messageParams\":{\"target\":\"site/nom du site\",\"referenceValues\":[\"izourt\",\"cos\",\"anterne\",\"bresses_superieur\",\"jovet\",\"lauzanier\",\"blanc_du_carro\",\"pormenaz\",\"barroude\",\"pave\",\"petarel\",\"dranse\",\"port___bielh\",\"bresses_inferieur\",\"estany_gros\",\"merlet_superieur\",\"rabuons\",\"corne\",\"blanc_du_bramant\",\"mercube\",\"pisses\",\"oncet\",\"annecy\",\"bourget\",\"gentau\",\"bramant\",\"aiguebelette\",\"leman\",\"mont_coua\",\"espingo\",\"port_bielh\",\"muzelle\",\"aumar\",\"arbu\",\"cornu\",\"aratilles\",\"gourg_gaudet\",\"isaby\",\"arpont\",\"plan_vianney\",\"brevent\",\"malrif\",\"noir_du_carro\"],\"refType\":\"site\",\"value\":\"lemann\"},\"error\":true,\"success\":false},\"lineNumber\":3}]"
         ));*/
         DataTypeErrors.put("invalidDate", List.of(
-                "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
-                "suivi des lacs;leman;SHL2;20/07/20;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris",
-                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDate\",\"messageParams\":{\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"20/07/20\"},\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":3}]"
+                "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert",
+                "suivi des lacs;leman;SHL2;x16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert",
+                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDate\",\"messageParams\":{\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"x16/12/2020\"},\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":17}]"
         ));
         DataTypeErrors.put("invalidInt", List.of(
-                "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
-                "suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;0.2;973;friselis;amas d'algues;;7.8;vert-gris",
-                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidInteger\",\"messageParams\":{\"target\":{\"variable\":\"valeurs qualitatives\",\"component\":\"vitesse du vent\",\"id\":\"valeurs qualitatives_vitesse du vent\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"0.2\"},\"error\":true,\"success\":false},\"lineNumber\":3}]"
+                "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert",
+                "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6.0;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert",
+                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidInteger\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"temperature de l'air\",\"id\":\"valeurs quantitatives_temperature de l'air\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"6.0\"},\"error\":true,\"success\":false},\"lineNumber\":17}]"
         ));
         DataTypeErrors.put("invalidFloat", List.of(
-                "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
-                "suivi des lacs;leman;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8x;vert-gris",
-                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloat\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"transparence par secchi\",\"id\":\"valeurs quantitatives_transparence par secchi\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"7.8x\"},\"error\":true,\"success\":false},\"lineNumber\":3}]"
+                "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert",
+                "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8x;vert-vert",
+                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloat\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"transparence par secchi\",\"id\":\"valeurs quantitatives_transparence par secchi\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"7.8x\"},\"error\":true,\"success\":false},\"lineNumber\":17}]"
         ));
         DataTypeErrors.put("requiredValue", List.of(
-                "suivi des lacs;leman;SHL2;24/02/2020;00:00:00;Tract� par la Daphnie;8;1;ensoleille;clair;;1;979;plat;propre;;10;vert-vert",
-                "suivi des lacs;;SHL2;20/07/2020;08:45:00;;21;1;ensoleille;clair;;2;973;friselis;amas d'algues;;7.8;vert-gris",
-                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"requiredValue\",\"messageParams\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]"
+                "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert",
+                "suivi des lacs;;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert",
+                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"requiredValue\",\"messageParams\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"}},\"error\":true,\"success\":false},\"lineNumber\":17}]"
+        ));
+        DataTypeErrors.put("duplicatedLineInDatatype", List.of(
+                "suivi des lacs;leman;SHL2;18/11/2020;09:15:00;Octeau tract� par Daphnie;12;5;ensoleille;clair;W;2;983;petites vagues;branches;;5.2;vert-jaune",
+                "suivi des lacs;leman;SHL2;16/12/2020;09:15:00;Octeau tract� par Daphnie;6;7;ombre;brume;E;0.4;974;petites vagues;feuilles;;7.8;vert-vert",
+                "[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"condition_prelevements\",\"duplicatedRows\":[16,17],\"uniquenessKey\":{\"date_time\":\"09:15:00\",\"date_day\":\"16/12/2020\",\"site_nom du site\":\"leman\"}},\"error\":true,\"success\":false},\"lineNumber\":16}]"
         ));
         return DataTypeErrors;
     }
diff --git a/src/test/resources/data/recursivite/recusivite.yaml b/src/test/resources/data/recursivite/recusivite.yaml
index ce1cf86d9..9b3fb3ee6 100644
--- a/src/test/resources/data/recursivite/recusivite.yaml
+++ b/src/test/resources/data/recursivite/recusivite.yaml
@@ -152,6 +152,10 @@ dataTypes:
     uniqueness:
       - variable: date
         component: day
+      - variable: date
+        component: time
+      - variable: site
+        component: nom du site
     # ajout d'un nom internationnalisé
     internationalizationName:
       fr: Condition de prélèvement
@@ -196,12 +200,14 @@ dataTypes:
           etat de surface:
           nebulosite:
           vitesse du vent:
-            checker:
-              name: Integer
       valeurs quantitatives:
         components:
           pression atmospherique:
           temperature de l'air:
+            checker:
+              name: Integer
+              params:
+                required: false
           transparence par disque inra:
           transparence par secchi:
             checker:
diff --git a/ui/cypress/fixtures/applications/errors/ref_ola_errors.json b/ui/cypress/fixtures/applications/errors/ref_ola_errors.json
index 192d2a1f7..d2ad8a7fd 100644
--- a/ui/cypress/fixtures/applications/errors/ref_ola_errors.json
+++ b/ui/cypress/fixtures/applications/errors/ref_ola_errors.json
@@ -1 +1 @@
-{"duplicatedHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedHeaders\",\"messageParams\":{\"duplicatedHeaders\":[\"définition_fr\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","patternNotMatchedWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"12:00:00\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","duplicatedLineInReference":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInReference\",\"messageParams\":{\"file\":\"proprietes_taxon\",\"lineNumber\":40,\"otherLines\":[39,40],\"duplicateKey\":\"notes_libres\"},\"error\":true,\"success\":false},\"lineNumber\":40}]","invalidDateWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"01/01/16\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","invalidDate":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDate\",\"messageParams\":{\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"20/07/20\"},\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":3}]","invalidFloat":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloat\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"transparence par secchi\",\"id\":\"valeurs quantitatives_transparence par secchi\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"7.8x\"},\"error\":true,\"success\":false},\"lineNumber\":3}]","duplicatedLineInDatatype":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"condition_prelevements\",\"duplicatedRows\":[3,8],\"uniquenessKey\":{\"valeurs qualitatives_nebulosite\":\"1\",\"valeurs qualitatives_etat de surface\":\"amas d'algues\",\"valeurs qualitatives_aspect de l'eau\":\"friselis\",\"valeurs qualitatives_vitesse du vent\":\"2\",\"date_day\":\"20/07/2020\",\"projet_value\":\"suivi des lacs\",\"commentaire_value\":\"\",\"valeurs qualitatives_couleur de l'eau\":\"vert-gris\",\"valeurs quantitatives_temperature de l'air\":\"21\",\"date_time\":\"08:45:00\",\"valeurs quantitatives_pression atmospherique\":\"973\",\"valeurs quantitatives_transparence par secchi\":\"7.8\",\"valeurs qualitatives_ensoleillement\":\"ensoleille\",\"valeurs quantitatives_transparence par disque inra\":\"\",\"valeurs qualitatives_direction du vent\":\"\",\"site_nom de la plateforme\":\"SHL2\",\"valeurs qualitatives_temps\":\"clair\",\"site_nom du site\":\"leman\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]","invalidInt":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidInteger\",\"messageParams\":{\"target\":{\"variable\":\"valeurs qualitatives\",\"component\":\"vitesse du vent\",\"id\":\"valeurs qualitatives_vitesse du vent\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"0.2\"},\"error\":true,\"success\":false},\"lineNumber\":3}]","invalidFloatWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloatWithColumn\",\"messageParams\":{\"target\":{\"column\":\"isFloatValue\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","invalidHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"Date\",\"nom de la propriété_key\",\"nom de la propriété_fr\",\"nom de la propriété_en\",\"définition_fr\",\"définition_es\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"ordre d'affichage\",\"site\"],\"missingColumns\":[\"définition_en\"],\"unknownColumns\":[\"définition_es\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","emptyHeader":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"emptyHeader\",\"messageParams\":{\"headerLine\":1},\"error\":true,\"success\":false},\"lineNumber\":1}]","invalidReferenceWithColumn":"[{\"validationCheckResult\":{\"target\":{\"column\":\"site\",\"type\":\"PARAM_COLUMN\"},\"level\":\"ERROR\",\"rawValue\":\"martin\",\"matchedReferenceHierarchicalKey\":null,\"matchedReferenceId\":null,\"message\":\"invalidReferenceWithColumn\",\"messageParams\":{\"target\":\"site\",\"referenceValues\":[],\"refType\":\"site\",\"value\":\"martin\"},\"error\":true,\"success\":false},\"lineNumber\":39}]","invalidIntegerWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidIntegerWithColumn\",\"messageParams\":{\"target\":{\"column\":\"ordre d'affichage\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","unexpectedHeaderColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"martin\",\"site\"],\"missingColumns\":[\"Date\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"unknownColumns\":[\"martin\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","requiredValue":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"requiredValue\",\"messageParams\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"}},\"error\":true,\"success\":false},\"lineNumber\":3}]"}
\ No newline at end of file
+{"duplicatedHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedHeaders\",\"messageParams\":{\"duplicatedHeaders\":[\"définition_fr\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","patternNotMatchedWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"12:00:00\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","duplicatedLineInReference":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInReference\",\"messageParams\":{\"file\":\"proprietes_taxon\",\"lineNumber\":40,\"otherLines\":[39,40],\"duplicateKey\":\"notes_libres\"},\"error\":true,\"success\":false},\"lineNumber\":40}]","invalidDateWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDateWithColumn\",\"messageParams\":{\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"01/01/16\"},\"target\":{\"column\":\"Date\",\"type\":\"PARAM_COLUMN\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":2}]","invalidDate":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidDate\",\"messageParams\":{\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"pattern\":\"dd/MM/yyyy\",\"value\":\"x16/12/2020\"},\"target\":{\"variable\":\"date\",\"component\":\"day\",\"id\":\"date_day\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"date\":null,\"localDateTime\":null,\"error\":true,\"success\":false},\"lineNumber\":17}]","invalidFloat":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloat\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"transparence par secchi\",\"id\":\"valeurs quantitatives_transparence par secchi\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"7.8x\"},\"error\":true,\"success\":false},\"lineNumber\":17}]","duplicatedLineInDatatype":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"duplicatedLineInDatatype\",\"messageParams\":{\"file\":\"condition_prelevements\",\"duplicatedRows\":[16,17],\"uniquenessKey\":{\"date_time\":\"09:15:00\",\"date_day\":\"16/12/2020\",\"site_nom du site\":\"leman\"}},\"error\":true,\"success\":false},\"lineNumber\":16}]","invalidInt":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidInteger\",\"messageParams\":{\"target\":{\"variable\":\"valeurs quantitatives\",\"component\":\"temperature de l'air\",\"id\":\"valeurs quantitatives_temperature de l'air\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"},\"value\":\"6.0\"},\"error\":true,\"success\":false},\"lineNumber\":17}]","invalidFloatWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidFloatWithColumn\",\"messageParams\":{\"target\":{\"column\":\"isFloatValue\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","invalidHeaders":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"Date\",\"nom de la propriété_key\",\"nom de la propriété_fr\",\"nom de la propriété_en\",\"définition_fr\",\"définition_es\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"ordre d'affichage\",\"site\"],\"missingColumns\":[\"définition_en\"],\"unknownColumns\":[\"définition_es\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","emptyHeader":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"emptyHeader\",\"messageParams\":{\"headerLine\":1},\"error\":true,\"success\":false},\"lineNumber\":1}]","invalidReferenceWithColumn":"[{\"validationCheckResult\":{\"target\":{\"column\":\"site\",\"type\":\"PARAM_COLUMN\"},\"level\":\"ERROR\",\"rawValue\":\"martin\",\"matchedReferenceHierarchicalKey\":null,\"matchedReferenceId\":null,\"message\":\"invalidReferenceWithColumn\",\"messageParams\":{\"target\":\"site\",\"referenceValues\":[],\"refType\":\"site\",\"value\":\"martin\"},\"error\":true,\"success\":false},\"lineNumber\":39}]","invalidIntegerWithColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidIntegerWithColumn\",\"messageParams\":{\"target\":{\"column\":\"ordre d'affichage\",\"type\":\"PARAM_COLUMN\"},\"value\":\"x\"},\"error\":true,\"success\":false},\"lineNumber\":5}]","unexpectedHeaderColumn":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"invalidHeaders\",\"messageParams\":{\"expectedColumns\":[\"Date\",\"site\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"actualColumns\":[\"martin\",\"site\"],\"missingColumns\":[\"Date\",\"isFloatValue\",\"isQualitative\",\"type associé\",\"définition_en\",\"définition_fr\",\"ordre d'affichage\",\"nom de la propriété_en\",\"nom de la propriété_fr\",\"nom de la propriété_key\"],\"unknownColumns\":[\"martin\"]},\"error\":true,\"success\":false},\"lineNumber\":1}]","requiredValue":"[{\"validationCheckResult\":{\"level\":\"ERROR\",\"message\":\"requiredValue\",\"messageParams\":{\"target\":{\"variable\":\"site\",\"component\":\"nom du site\",\"id\":\"site_nom du site\",\"type\":\"PARAM_VARIABLE_COMPONENT_KEY\"}},\"error\":true,\"success\":false},\"lineNumber\":17}]"}
\ No newline at end of file
-- 
GitLab