Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: e601d96b by Tony Chemit at 2023-12-11T09:15:48+01:00 Add migration script to remove redundant TransmittingBuoy.country - - - - - 80cb18dd by Tony Chemit at 2023-12-11T09:31:38+01:00 Add validation rule on TransmittingBuoyDto.country - - - - - 2bfd7c65 by Tony Chemit at 2023-12-11T10:13:20+01:00 Merge branch 'feature/issue-2821' into develop En prévision du peaufinage des forms Balise, effacer le Pays si le Navire est connu - See #2821 - - - - - ec0be044 by Tony Chemit at 2023-12-11T10:14:26+01:00 Improve Report tests - - - - - 23 changed files: - core/api/validation/src/main/filtered-resources/META-INF/validators/validation.json - core/api/validation/src/main/i18n/getters/validation-messages.getter - core/api/validation/src/main/resources/fr/ird/observe/dto/data/ps/logbook/TransmittingBuoyDto-create-error-validation.xml - core/api/validation/src/main/resources/fr/ird/observe/dto/data/ps/logbook/TransmittingBuoyDto-update-error-validation.xml - core/api/validation/src/main/resources/fr/ird/observe/dto/data/ps/observation/TransmittingBuoyDto-create-error-validation.xml - core/api/validation/src/main/resources/fr/ird/observe/dto/data/ps/observation/TransmittingBuoyDto-update-error-validation.xml - core/api/validation/src/main/validation/fr/ird/observe/dto/data/ps/logbook/TransmittingBuoyDto-create-error-validation.xml - core/api/validation/src/main/validation/fr/ird/observe/dto/data/ps/logbook/TransmittingBuoyDto-update-error-validation.xml - core/api/validation/src/main/validation/fr/ird/observe/dto/data/ps/observation/TransmittingBuoyDto-create-error-validation.xml - core/api/validation/src/main/validation/fr/ird/observe/dto/data/ps/observation/TransmittingBuoyDto-update-error-validation.xml - core/persistence/migration/src/main/java/fr/ird/observe/spi/migration/v9/DataSourceMigrationForVersion_9_3.java - + core/persistence/migration/src/main/resources/db/migration/v9/9.3/02_issue-2821-common.sql - core/persistence/resources/src/main/resources/fr/ird/observe/entities/data/ps/logbook/TransmittingBuoy/validation-create.json - core/persistence/resources/src/main/resources/fr/ird/observe/entities/data/ps/logbook/TransmittingBuoy/validation-update.json - core/persistence/resources/src/main/resources/fr/ird/observe/entities/data/ps/observation/TransmittingBuoy/validation-create.json - core/persistence/resources/src/main/resources/fr/ird/observe/entities/data/ps/observation/TransmittingBuoy/validation-update.json - + core/services/client/src/test/java/fr/ird/observe/services/client/service/ReportsTest.java - core/services/i18n/src/main/i18n/translations/services_en_GB.properties - core/services/i18n/src/main/i18n/translations/services_es_ES.properties - core/services/i18n/src/main/i18n/translations/services_fr_FR.properties - core/services/local/src/test/java/fr/ird/observe/services/local/service/ReportServiceLocalReadTest.java - + core/services/local/src/test/java/fr/ird/observe/services/local/service/ReportsTest.java - core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ValidateService-dataResult-ps.json Changes: ===================================== core/api/validation/src/main/filtered-resources/META-INF/validators/validation.json ===================================== @@ -11820,7 +11820,8 @@ { "name": "country", "comments": [ - "check if referential country is disabled (only if validation is strong)" + "check if referential country is disabled (only if validation is strong)", + "country must be null if vessel is filled" ] }, { @@ -11944,7 +11945,8 @@ { "name": "country", "comments": [ - "check if referential country is disabled (only if validation is strong)" + "check if referential country is disabled (only if validation is strong)", + "country must be null if vessel is filled" ] }, { @@ -14990,7 +14992,8 @@ { "name": "country", "comments": [ - "check if referential country is disabled (only if validation is strong)" + "check if referential country is disabled (only if validation is strong)", + "country must be null if vessel is filled" ] }, { @@ -15114,7 +15117,8 @@ { "name": "country", "comments": [ - "check if referential country is disabled (only if validation is strong)" + "check if referential country is disabled (only if validation is strong)", + "country must be null if vessel is filled" ] }, { ===================================== core/api/validation/src/main/i18n/getters/validation-messages.getter ===================================== @@ -58,6 +58,7 @@ observe.data.ps.Route.validation.duplicated.date observe.data.ps.SampleSpecies.validation.mismatch.measuredCount observe.data.ps.SampleSpecies.validation.mismatch.subSampleNumber observe.data.ps.TransmittingBuoy.validation.code +observe.data.ps.TransmittingBuoy.validation.country.not.required observe.data.ps.common.Trip.departureWellContentStatus.validation.notFilled observe.data.ps.common.Trip.departureWellContentStatus.validation.required observe.data.ps.common.Trip.landingWellContentStatus.validation.notFilled ===================================== core/api/validation/src/main/resources/fr/ird/observe/dto/data/ps/logbook/TransmittingBuoyDto-create-error-validation.xml ===================================== @@ -62,6 +62,12 @@ <field-validator type="checkDisabledReferentialOnErrorScope"> <message/> </field-validator> + + <!-- country must be null if vessel is filled --> + <field-validator type="fieldexpression"> + <param name="expression"><![CDATA[ country == null || vessel == null ]]></param> + <message>observe.data.ps.TransmittingBuoy.validation.country.not.required</message> + </field-validator> </field> <field name="homeId"> ===================================== core/api/validation/src/main/resources/fr/ird/observe/dto/data/ps/logbook/TransmittingBuoyDto-update-error-validation.xml ===================================== @@ -62,6 +62,12 @@ <field-validator type="checkDisabledReferentialOnErrorScope"> <message/> </field-validator> + + <!-- country must be null if vessel is filled --> + <field-validator type="fieldexpression"> + <param name="expression"><![CDATA[ country == null || vessel == null ]]></param> + <message>observe.data.ps.TransmittingBuoy.validation.country.not.required</message> + </field-validator> </field> <field name="homeId"> ===================================== core/api/validation/src/main/resources/fr/ird/observe/dto/data/ps/observation/TransmittingBuoyDto-create-error-validation.xml ===================================== @@ -62,6 +62,12 @@ <field-validator type="checkDisabledReferentialOnErrorScope"> <message/> </field-validator> + + <!-- country must be null if vessel is filled --> + <field-validator type="fieldexpression"> + <param name="expression"><![CDATA[ country == null || vessel == null ]]></param> + <message>observe.data.ps.TransmittingBuoy.validation.country.not.required</message> + </field-validator> </field> <field name="homeId"> ===================================== core/api/validation/src/main/resources/fr/ird/observe/dto/data/ps/observation/TransmittingBuoyDto-update-error-validation.xml ===================================== @@ -62,6 +62,12 @@ <field-validator type="checkDisabledReferentialOnErrorScope"> <message/> </field-validator> + + <!-- country must be null if vessel is filled --> + <field-validator type="fieldexpression"> + <param name="expression"><![CDATA[ country == null || vessel == null ]]></param> + <message>observe.data.ps.TransmittingBuoy.validation.country.not.required</message> + </field-validator> </field> <field name="homeId"> ===================================== core/api/validation/src/main/validation/fr/ird/observe/dto/data/ps/logbook/TransmittingBuoyDto-create-error-validation.xml ===================================== @@ -31,4 +31,11 @@ <message>observe.data.ps.TransmittingBuoy.validation.code##${code}##${transmittingBuoyType.regex}</message> </field-validator> </field> + <field name="country"> + <!-- country must be null if vessel is filled --> + <field-validator type="fieldexpression"> + <param name="expression"><![CDATA[ country == null || vessel == null ]]></param> + <message>observe.data.ps.TransmittingBuoy.validation.country.not.required</message> + </field-validator> + </field> </validators> ===================================== core/api/validation/src/main/validation/fr/ird/observe/dto/data/ps/logbook/TransmittingBuoyDto-update-error-validation.xml ===================================== @@ -31,4 +31,11 @@ <message>observe.data.ps.TransmittingBuoy.validation.code##${code}##${transmittingBuoyType.regex}</message> </field-validator> </field> + <field name="country"> + <!-- country must be null if vessel is filled --> + <field-validator type="fieldexpression"> + <param name="expression"><![CDATA[ country == null || vessel == null ]]></param> + <message>observe.data.ps.TransmittingBuoy.validation.country.not.required</message> + </field-validator> + </field> </validators> ===================================== core/api/validation/src/main/validation/fr/ird/observe/dto/data/ps/observation/TransmittingBuoyDto-create-error-validation.xml ===================================== @@ -31,4 +31,11 @@ <message>observe.data.ps.TransmittingBuoy.validation.code##${code}##${transmittingBuoyType.regex}</message> </field-validator> </field> + <field name="country"> + <!-- country must be null if vessel is filled --> + <field-validator type="fieldexpression"> + <param name="expression"><![CDATA[ country == null || vessel == null ]]></param> + <message>observe.data.ps.TransmittingBuoy.validation.country.not.required</message> + </field-validator> + </field> </validators> ===================================== core/api/validation/src/main/validation/fr/ird/observe/dto/data/ps/observation/TransmittingBuoyDto-update-error-validation.xml ===================================== @@ -31,4 +31,11 @@ <message>observe.data.ps.TransmittingBuoy.validation.code##${code}##${transmittingBuoyType.regex}</message> </field-validator> </field> + <field name="country"> + <!-- country must be null if vessel is filled --> + <field-validator type="fieldexpression"> + <param name="expression"><![CDATA[ country == null || vessel == null ]]></param> + <message>observe.data.ps.TransmittingBuoy.validation.country.not.required</message> + </field-validator> + </field> </validators> ===================================== core/persistence/migration/src/main/java/fr/ird/observe/spi/migration/v9/DataSourceMigrationForVersion_9_3.java ===================================== @@ -49,6 +49,8 @@ public class DataSourceMigrationForVersion_9_3 extends ByMajorMigrationVersionRe if (withIds) { // See https://gitlab.com/ultreiaio/ird-observe/-/issues/2044 executor.addScript("01", "issue-2044"); + // See https://gitlab.com/ultreiaio/ird-observe/-/issues/2821 + executor.addScript("02", "issue-2821"); } } ===================================== core/persistence/migration/src/main/resources/db/migration/v9/9.3/02_issue-2821-common.sql ===================================== @@ -0,0 +1,23 @@ +--- +-- #%L +-- ObServe Core :: Persistence :: Migration +-- %% +-- Copyright (C) 2008 - 2023 IRD, Ultreia.io +-- %% +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as +-- published by the Free Software Foundation, either version 3 of the +-- License, or (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public +-- License along with this program. If not, see +-- <http://www.gnu.org/licenses/gpl-3.0.html>. +-- #L% +--- +UPDATE ps_observation.TransmittingBuoy SET country = NULL WHERE vessel IS NOT NULL; +UPDATE ps_logbook.TransmittingBuoy SET country = NULL WHERE vessel IS NOT NULL; \ No newline at end of file ===================================== core/persistence/resources/src/main/resources/fr/ird/observe/entities/data/ps/logbook/TransmittingBuoy/validation-create.json ===================================== @@ -17,7 +17,8 @@ }, "country": { "errors": [ - "check if referential country is disabled (only if validation is strong)" + "check if referential country is disabled (only if validation is strong)", + "country must be null if vessel is filled" ], "warnings": [ "check if referential country is disabled (only if validation is not strong)" ===================================== core/persistence/resources/src/main/resources/fr/ird/observe/entities/data/ps/logbook/TransmittingBuoy/validation-update.json ===================================== @@ -17,7 +17,8 @@ }, "country": { "errors": [ - "check if referential country is disabled (only if validation is strong)" + "check if referential country is disabled (only if validation is strong)", + "country must be null if vessel is filled" ], "warnings": [ "check if referential country is disabled (only if validation is not strong)" ===================================== core/persistence/resources/src/main/resources/fr/ird/observe/entities/data/ps/observation/TransmittingBuoy/validation-create.json ===================================== @@ -17,7 +17,8 @@ }, "country": { "errors": [ - "check if referential country is disabled (only if validation is strong)" + "check if referential country is disabled (only if validation is strong)", + "country must be null if vessel is filled" ], "warnings": [ "check if referential country is disabled (only if validation is not strong)" ===================================== core/persistence/resources/src/main/resources/fr/ird/observe/entities/data/ps/observation/TransmittingBuoy/validation-update.json ===================================== @@ -17,7 +17,8 @@ }, "country": { "errors": [ - "check if referential country is disabled (only if validation is strong)" + "check if referential country is disabled (only if validation is strong)", + "country must be null if vessel is filled" ], "warnings": [ "check if referential country is disabled (only if validation is not strong)" ===================================== core/services/client/src/test/java/fr/ird/observe/services/client/service/ReportsTest.java ===================================== @@ -0,0 +1,59 @@ +package fr.ird.observe.services.client.service; + +/*- + * #%L + * ObServe Core :: Services :: Client + * %% + * Copyright (C) 2008 - 2023 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.services.service.ReportService; +import fr.ird.observe.services.service.ReportServiceFixtures; +import org.junit.Test; +import org.junit.runners.Parameterized; + +import java.util.Set; + +/** + * Created at 11/12/2023. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.3.0 + */ +public class ReportsTest extends ServiceClientTestSupportRead<ReportService> { + + protected static final ReportServiceFixtures fixtures = new ReportServiceFixtures(); + + @Parameterized.Parameter + public String reportId; + + public ReportsTest() { + super(ReportService.class); + } + + @Parameterized.Parameters(name = "{0}") + public static Set<String> data() { + return ReportServiceFixtures.getReports().keySet(); + } + + @Test + public void tesReport() { + ReportService service = getService(); + fixtures.executeReport(service, reportId); + } +} ===================================== core/services/i18n/src/main/i18n/translations/services_en_GB.properties ===================================== @@ -932,6 +932,7 @@ observe.data.ps.Route.validation.invalid.time=Observation time can't be after th observe.data.ps.SampleSpecies.validation.mismatch.measuredCount=Measure count (%s) must be the sum of frequencies count (%s) observe.data.ps.SampleSpecies.validation.mismatch.subSampleNumber=The sub sample number must be strictly positive if the sample is a « super sample ». observe.data.ps.TransmittingBuoy.validation.code=The buoy identifier (%s) does not respect the following regular expression «%s». +observe.data.ps.TransmittingBuoy.validation.country.not.required=Country not required if vessel is filled. observe.data.ps.common.Trip.action.move.all=Move all observe.data.ps.common.Trip.action.move.all.choose.parent.message=Select target trip observe.data.ps.common.Trip.action.move.all.choose.parent.title=Move data to another trip ===================================== core/services/i18n/src/main/i18n/translations/services_es_ES.properties ===================================== @@ -932,6 +932,7 @@ observe.data.ps.Route.validation.invalid.time=La hora de la observación de la a observe.data.ps.SampleSpecies.validation.mismatch.measuredCount=Measure count (%s) must be the sum of frequencies count (%s) observe.data.ps.SampleSpecies.validation.mismatch.subSampleNumber=The sub sample number must be strictly positive if the sample is a « super sample ». \#TODO observe.data.ps.TransmittingBuoy.validation.code=El identificador de boya ingresado (%s) no respeta la sintaxis definida por la expresión regular “%s”. +observe.data.ps.TransmittingBuoy.validation.country.not.required=Country not required if vessel is filled. \#TODO observe.data.ps.common.Trip.action.move.all=Move all observe.data.ps.common.Trip.action.move.all.choose.parent.message=Select target trip observe.data.ps.common.Trip.action.move.all.choose.parent.title=Move data to another trip ===================================== core/services/i18n/src/main/i18n/translations/services_fr_FR.properties ===================================== @@ -932,6 +932,7 @@ observe.data.ps.Route.validation.invalid.time=L'heure d'observation d'une activi observe.data.ps.SampleSpecies.validation.mismatch.measuredCount=Le nombre mesuré (%s) doit valoir la somme des effectifs de fréquences (%s) observe.data.ps.SampleSpecies.validation.mismatch.subSampleNumber=Le numéro de sous-échantillon doit être strictement positif si l'échantillon est un « super échantillon ». observe.data.ps.TransmittingBuoy.validation.code=L'identifiant de balise (%s) ne respecte pas la syntaxe définie via l'expression régulière «%s». +observe.data.ps.TransmittingBuoy.validation.country.not.required=Le pavillon ne doit pas être renseigné si le navire est renseigné. observe.data.ps.common.Trip.action.move.all=Déplacer des données observe.data.ps.common.Trip.action.move.all.choose.parent.message=À quelle marée voulez-vous associer les données sélectionnées ? observe.data.ps.common.Trip.action.move.all.choose.parent.title=Changer la marée des données sélectionnées ===================================== core/services/local/src/test/java/fr/ird/observe/services/local/service/ReportServiceLocalReadTest.java ===================================== @@ -23,103 +23,17 @@ package fr.ird.observe.services.local.service; */ import fr.ird.observe.report.Report; -import fr.ird.observe.services.service.ReportService; -import org.junit.Ignore; +import fr.ird.observe.services.service.ReportServiceFixtures; import org.junit.Test; -import javax.annotation.Generated; import java.util.Map; -@Generated(value = "io.ultreia.java4all.http.maven.plugin.test.GenerateApiImplMojo", date = "Mon Nov 14 16:20:02 CET 2022") public class ReportServiceLocalReadTest extends GeneratedReportServiceLocalReadTest { @Test public void loadDefault() { - ReportService service = getService(); - Map<String, Report> reports = fixtures.getReports(); + Map<String, Report> reports = ReportServiceFixtures.getReports(); fixtures.assertReports(reports); } - //FIXME Generate a method for each report - @Ignore - @Test - public void executeReportLlLanding() { - ReportService service = getService(); - fixtures.executeReport(service, "llLanding"); - } - @Ignore - @Test - public void executeReportLlLogbookActivities() { - ReportService service = getService(); - fixtures.executeReport(service, "llLogbookActivities"); - } - - @Ignore - @Test - public void executeReportLlLogbookCatches() { - ReportService service = getService(); - fixtures.executeReport(service, "llLogbookCatches"); - } - @Ignore - @Test - public void executeReportLlLogbookSamplesOnActivity() { - ReportService service = getService(); - fixtures.executeReport(service, "llLogbookSamplesOnActivity"); - } - - @Test - @Ignore - public void executeReportPsObservationLengthsDistribution() { - ReportService service = getService(); - fixtures.executeReport(service, "psObservationLengthsDistribution"); - } - - @Test - @Ignore - public void executeReportPsObservationCatchTotalCountByGroupPerSpeciesFate() { - ReportService service = getService(); - fixtures.executeReport(service, "psObservationCatchTotalCountByGroupPerSpeciesFate"); - } - - @Test - @Ignore - public void executeReportPsObservationCatchWeightByGroupPerSpeciesFate() { - ReportService service = getService(); - fixtures.executeReport(service, "psObservationCatchWeightByGroupPerSpeciesFate"); - } - - @Test - @Ignore - public void executeReportPsObservationCatchWeightByGroupPerReasonForDiscard() { - ReportService service = getService(); - fixtures.executeReport(service, "psObservationCatchWeightByGroupPerReasonForDiscard"); - } - - @Test - @Ignore - public void executeReportPsObservationCatchTotalCountByGroupPerReasonForDiscard() { - ReportService service = getService(); - fixtures.executeReport(service, "psObservationCatchTotalCountByGroupPerReasonForDiscard"); - } - - @Test - @Ignore - public void executeReportPsObservationCatchWeightByGroupAndSpeciesFateDiscardPerAssociation() { - ReportService service = getService(); - fixtures.executeReport(service, "psObservationCatchWeightByGroupAndSpeciesFateDiscardPerAssociation"); - } - - @Test - @Ignore - public void executeReportPsObservationCatchTotalCountByGroupAndSpeciesFateDiscardPerAssociation() { - ReportService service = getService(); - fixtures.executeReport(service, "psObservationCatchTotalCountByGroupAndSpeciesFateDiscardPerAssociation"); - } - - @Test - @Ignore - public void executeReportPsLogbookWellPlanCheck() { - ReportService service = getService(); - fixtures.executeReport(service, "psLogbookWellPlanCheck"); - } } ===================================== core/services/local/src/test/java/fr/ird/observe/services/local/service/ReportsTest.java ===================================== @@ -0,0 +1,61 @@ +package fr.ird.observe.services.local.service; + +/*- + * #%L + * ObServe Core :: Services :: Local + * %% + * Copyright (C) 2008 - 2023 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.services.service.ReportService; +import fr.ird.observe.services.service.ReportServiceFixtures; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.util.Set; + +/** + * Created at 11/12/2023. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.3.0 + */ +@RunWith(Parameterized.class) +public class ReportsTest extends ServiceLocalTestSupportRead<ReportService> { + + protected static final ReportServiceFixtures fixtures = new ReportServiceFixtures(); + + @Parameterized.Parameter + public String reportId; + + public ReportsTest() { + super(ReportService.class); + } + + @Parameterized.Parameters(name = "{0}") + public static Set<String> data() { + return ReportServiceFixtures.getReports().keySet(); + } + + @Test + public void tesReport() { + ReportService service = getService(); + fixtures.executeReport(service, reportId); + } +} ===================================== core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ValidateService-dataResult-ps.json ===================================== @@ -954,6 +954,11 @@ "lastUpdateDate": "2021-02-09T09:41:09.117Z" }, "messages": [ + { + "fieldName": "country", + "scope": "ERROR", + "message": "Le pavillon ne doit pas être renseigné si le navire est renseigné." + }, { "fieldName": "transmittingBuoyType", "scope": "WARNING", @@ -4531,6 +4536,35 @@ "topiaVersion": 8, "lastUpdateDate": "2021-03-28T20:24:25.360Z" }, + "children": [ + { + "datum": { + "text": " DCP Abandonné (sans balise, non détruit, non coulé)", + "type": "fr.ird.observe.dto.data.ps.logbook.FloatingObjectDto", + "id": "fr.ird.data.ps.logbook.FloatingObject#1616955224271#0.8748844202241", + "topiaVersion": 3, + "lastUpdateDate": "2021-03-28T20:15:12.010Z" + }, + "children": [ + { + "datum": { + "text": "Marine Instrument (ou Nautical) modèle indéterminé##Mise à l'eau##12##sd", + "type": "fr.ird.observe.dto.data.ps.logbook.TransmittingBuoyDto", + "id": "fr.ird.data.ps.logbook.TransmittingBuoy#1616955224272#0.1758599871793043", + "topiaVersion": 1, + "lastUpdateDate": "2021-03-28T20:13:44.266Z" + }, + "messages": [ + { + "fieldName": "country", + "scope": "ERROR", + "message": "Le pavillon ne doit pas être renseigné si le navire est renseigné." + } + ] + } + ] + } + ], "messages": [ { "fieldName": "schoolType", View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/012de8f4bdd12e2ba9a6244e4... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/012de8f4bdd12e2ba9a6244e4... You're receiving this email because of your account on gitlab.com.