This is an automated email from the git hooks/post-receive script. New commit to branch feature/2246 in repository echobase. See https://gitlab.nuiton.org/codelutin/echobase.git commit 8cf674f1b633a46ba7f6006fedfbd14a3c173fe2 Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri May 13 08:43:10 2016 +0200 Ne pas autoriser de réimporter les résultats sur les voyages déjà existants (See #2246) --- .../services/service/UserDbPersistenceService.java | 15 +++++++++++++++ .../DuplicatedElementaryCellException.java | 4 ++-- .../importdata/DuplicatedEsduCellException.java | 4 ++-- ...ception.java => DuplicatedMapCellException.java} | 6 +++--- ...tion.java => DuplicatedRegionCellException.java} | 6 +++--- .../actions/VoyageAcousticsImportAction.java | 4 ++-- .../VoyageResultsMapFishCellImportAction.java | 15 ++++++++++++++- .../VoyageResultsMapOtherCellImportAction.java | 15 ++++++++++++++- .../actions/VoyageResultsRegionImportAction.java | 21 +++++++++++++++++++-- .../VoyageResultsVoyageEchotypeImportAction.java | 3 +-- ...VoyageResultsVoyageLengthAgeKeyImportAction.java | 3 +-- ...ageResultsVoyageLengthWeightKeyImportAction.java | 3 +-- .../i18n/echobase-services_en_GB.properties | 6 ++++-- .../i18n/echobase-services_fr_FR.properties | 6 ++++-- 14 files changed, 85 insertions(+), 26 deletions(-) diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java index cd6300d..2f78786 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java @@ -221,6 +221,21 @@ public class UserDbPersistenceService extends EchoBaseServiceSupport { return persistenceContext.getCellDao().forNameEquals(cellName).exists(); } + public boolean containsPostVoyageCellByName(Voyage voyage, String cellName) { + return persistenceContext.getCellDao() + .forNameEquals(cellName) + .addEquals(Cell.PROPERTY_VOYAGE, voyage) + .exists(); + } + + public boolean containsPostVoyageCellByNameAndType(Voyage voyage, String cellName, CellType cellType) { + return persistenceContext.getCellDao() + .forNameEquals(cellName) + .addEquals(Cell.PROPERTY_VOYAGE, voyage) + .addEquals(Cell.PROPERTY_CELL_TYPE, cellType) + .exists(); + } + public Cell getCell(String id) { return persistenceContext.getCellDao().forTopiaIdEquals(id).findUnique(); } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedElementaryCellException.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedElementaryCellException.java index 84037f2..8f2a1ac 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedElementaryCellException.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedElementaryCellException.java @@ -37,7 +37,7 @@ public class DuplicatedElementaryCellException extends ImportRuntimeException { private static final long serialVersionUID = 1L; - public DuplicatedElementaryCellException(Locale locale, int rowNumber, String esduCellId) { - super(l(locale, "echobase.importError.duplicate.elementaryCell", rowNumber, esduCellId)); + public DuplicatedElementaryCellException(Locale locale, int rowNumber, String cellName,String voyageName) { + super(l(locale, "echobase.importError.duplicate.elementaryCell", rowNumber, cellName, voyageName)); } } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedEsduCellException.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedEsduCellException.java index a37d5aa..391fb8d 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedEsduCellException.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedEsduCellException.java @@ -37,7 +37,7 @@ public class DuplicatedEsduCellException extends ImportRuntimeException { private static final long serialVersionUID = 1L; - public DuplicatedEsduCellException(Locale locale, int rowNumber, String esduCellId) { - super(l(locale, "echobase.importError.duplicate.esduCell", rowNumber, esduCellId)); + public DuplicatedEsduCellException(Locale locale, int rowNumber, String cellName,String voyageName) { + super(l(locale, "echobase.importError.duplicate.esduCell", rowNumber, cellName, voyageName)); } } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedElementaryCellException.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedMapCellException.java similarity index 79% copy from echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedElementaryCellException.java copy to echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedMapCellException.java index 84037f2..40146a2 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedElementaryCellException.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedMapCellException.java @@ -33,11 +33,11 @@ import static org.nuiton.i18n.I18n.l; * @author Tony Chemit - chemit@codelutin.com * @since 4.0 */ -public class DuplicatedElementaryCellException extends ImportRuntimeException { +public class DuplicatedMapCellException extends ImportRuntimeException { private static final long serialVersionUID = 1L; - public DuplicatedElementaryCellException(Locale locale, int rowNumber, String esduCellId) { - super(l(locale, "echobase.importError.duplicate.elementaryCell", rowNumber, esduCellId)); + public DuplicatedMapCellException(Locale locale, int rowNumber, String cellName, String voyageName) { + super(l(locale, "echobase.importError.duplicate.mapCell", rowNumber, cellName, voyageName)); } } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedElementaryCellException.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedRegionCellException.java similarity index 77% copy from echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedElementaryCellException.java copy to echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedRegionCellException.java index 84037f2..f778fab 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedElementaryCellException.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/DuplicatedRegionCellException.java @@ -33,11 +33,11 @@ import static org.nuiton.i18n.I18n.l; * @author Tony Chemit - chemit@codelutin.com * @since 4.0 */ -public class DuplicatedElementaryCellException extends ImportRuntimeException { +public class DuplicatedRegionCellException extends ImportRuntimeException { private static final long serialVersionUID = 1L; - public DuplicatedElementaryCellException(Locale locale, int rowNumber, String esduCellId) { - super(l(locale, "echobase.importError.duplicate.elementaryCell", rowNumber, esduCellId)); + public DuplicatedRegionCellException(Locale locale, int rowNumber, String cellName, String cellTypeName, String voyageName) { + super(l(locale, "echobase.importError.duplicate.regionCell", rowNumber, cellName, cellTypeName, voyageName)); } } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageAcousticsImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageAcousticsImportAction.java index 8b9d3ac..0618803 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageAcousticsImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageAcousticsImportAction.java @@ -263,7 +263,7 @@ public class VoyageAcousticsImportAction extends VoyageAcousticsImportDataAction // check name does not exist boolean exists = persistenceService.containsCellByName(esduCellId); if (exists) { - throw new DuplicatedEsduCellException(getLocale(), rowNumber, esduCellId); + throw new DuplicatedEsduCellException(getLocale(), rowNumber, esduCellId, voyage.getName()); } // this is a esdu cell row @@ -308,7 +308,7 @@ public class VoyageAcousticsImportAction extends VoyageAcousticsImportDataAction if (log.isErrorEnabled()) { log.error("Duplicated ElementaryCellException: " + rowNumber + " → " + elementaryCellId); } -// throw new DuplicatedElementaryCellException(getLocale(), rowNumber, elementaryCellId); +// throw new DuplicatedElementaryCellException(getLocale(), rowNumber, elementaryCellId, voyage.getName()); } if (log.isTraceEnabled()) { log.trace("[row " + rowNumber + "] elementary cell (" + elementaryCellId + ")"); diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsMapFishCellImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsMapFishCellImportAction.java index ad10496..927a384 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsMapFishCellImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsMapFishCellImportAction.java @@ -11,7 +11,9 @@ import fr.ifremer.echobase.entities.data.Voyage; import fr.ifremer.echobase.entities.references.DataMetadata; import fr.ifremer.echobase.entities.references.DataQuality; import fr.ifremer.echobase.io.InputFile; +import fr.ifremer.echobase.services.service.importdata.DuplicatedMapCellException; import fr.ifremer.echobase.services.service.importdata.ImportDataFileResult; +import fr.ifremer.echobase.services.service.importdata.MismatchVoyageException; import fr.ifremer.echobase.services.service.importdata.ResultCategoryCache; import fr.ifremer.echobase.services.service.importdata.contexts.VoyageResultsImportDataContext; import fr.ifremer.echobase.services.service.importdata.csv.VoyageResultsMapFishCellImportExportModel; @@ -72,7 +74,7 @@ public class VoyageResultsMapFishCellImportAction extends VoyageResultsImportDat log.info("Starts import of Map cells from file " + inputFile.getFileName()); } - Voyage voyage = importDataContext.getVoyage(); + Voyage expectedVoyage = importDataContext.getVoyage(); ResultCategoryCache resultCategoryCache = importDataContext.getResultCategoryCache(); String resultLabel = getConfiguration().getResultLabel(); @@ -86,6 +88,17 @@ public class VoyageResultsMapFishCellImportAction extends VoyageResultsImportDat doFlushTransaction(++rowNumber); + Voyage voyage = row.getVoyage(); + if (!expectedVoyage.equals(voyage)) { + throw new MismatchVoyageException(getLocale(), rowNumber, voyage.getName()); + } + + String cellName = row.getCell().getName(); + boolean exists = persistenceService.containsPostVoyageCellByName(expectedVoyage, cellName); + if (exists) { + throw new DuplicatedMapCellException(getLocale(), rowNumber, cellName, voyage.getName()); + } + Cell cell = persistenceService.createCell(row.getCell()); voyage.addPostCell(cell); diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsMapOtherCellImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsMapOtherCellImportAction.java index d8ec2f0..3439745 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsMapOtherCellImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsMapOtherCellImportAction.java @@ -9,7 +9,9 @@ import fr.ifremer.echobase.entities.data.Voyage; import fr.ifremer.echobase.entities.references.DataMetadata; import fr.ifremer.echobase.entities.references.DataQuality; import fr.ifremer.echobase.io.InputFile; +import fr.ifremer.echobase.services.service.importdata.DuplicatedMapCellException; import fr.ifremer.echobase.services.service.importdata.ImportDataFileResult; +import fr.ifremer.echobase.services.service.importdata.MismatchVoyageException; import fr.ifremer.echobase.services.service.importdata.contexts.VoyageResultsImportDataContext; import fr.ifremer.echobase.services.service.importdata.csv.VoyageResultsMapOtherCellImportExportModel; import fr.ifremer.echobase.services.service.importdata.csv.VoyageResultsMapOtherCellImportRow; @@ -66,7 +68,7 @@ public class VoyageResultsMapOtherCellImportAction extends VoyageResultsImportDa log.info("Starts import of Map Other cells from file " + inputFile.getFileName()); } - Voyage voyage = importDataContext.getVoyage(); + Voyage expectedVoyage = importDataContext.getVoyage(); String resultLabel = getConfiguration().getResultLabel(); @@ -79,6 +81,17 @@ public class VoyageResultsMapOtherCellImportAction extends VoyageResultsImportDa doFlushTransaction(++rowNumber); + Voyage voyage = row.getVoyage(); + if (!expectedVoyage.equals(voyage)) { + throw new MismatchVoyageException(getLocale(), rowNumber, voyage.getName()); + } + + String cellName = row.getCell().getName(); + boolean exists = persistenceService.containsPostVoyageCellByName(expectedVoyage, cellName); + if (exists) { + throw new DuplicatedMapCellException(getLocale(), rowNumber, cellName, voyage.getName()); + } + Cell cell = persistenceService.createCell(row.getCell()); voyage.addPostCell(cell); diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsRegionImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsRegionImportAction.java index 57ea597..40021dd 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsRegionImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsRegionImportAction.java @@ -9,10 +9,13 @@ import fr.ifremer.echobase.entities.data.Cell; import fr.ifremer.echobase.entities.data.Data; import fr.ifremer.echobase.entities.data.Datas; import fr.ifremer.echobase.entities.data.Voyage; +import fr.ifremer.echobase.entities.references.CellType; import fr.ifremer.echobase.entities.references.DataMetadata; import fr.ifremer.echobase.entities.references.DataQuality; import fr.ifremer.echobase.io.InputFile; +import fr.ifremer.echobase.services.service.importdata.DuplicatedRegionCellException; import fr.ifremer.echobase.services.service.importdata.ImportDataFileResult; +import fr.ifremer.echobase.services.service.importdata.MismatchVoyageException; import fr.ifremer.echobase.services.service.importdata.contexts.VoyageResultsImportDataContext; import fr.ifremer.echobase.services.service.importdata.csv.VoyageResultsRegionCellImportExportModel; import fr.ifremer.echobase.services.service.importdata.csv.VoyageResultsRegionCellImportRow; @@ -55,7 +58,7 @@ public class VoyageResultsRegionImportAction extends VoyageResultsImportDataActi log.info("Starts import of Region cells from file " + inputFile.getFileName()); } - Voyage voyage = importDataContext.getVoyage(); + Voyage expectedVoyage = importDataContext.getVoyage(); try (Import<VoyageResultsRegionCellImportRow> importer = open()) { Cell cell = null; @@ -66,11 +69,25 @@ public class VoyageResultsRegionImportAction extends VoyageResultsImportDataActi doFlushTransaction(++rowNumber); + Voyage voyage = row.getVoyage(); + + if (!expectedVoyage.equals(voyage)) { + throw new MismatchVoyageException(getLocale(), rowNumber, voyage.getName()); + } + DataQuality dataQuality = row.getDataQuality(); if (cell == null || !row.getName().equals(cell.getName())) { - cell = persistenceService.createCell(row.getCellType(), row.getName(), dataQuality); + String cellName = row.getName(); + CellType cellType = row.getCellType(); + + boolean exists = persistenceService.containsPostVoyageCellByNameAndType(expectedVoyage, cellName, cellType); + if (exists) { + throw new DuplicatedRegionCellException(getLocale(), rowNumber, cellName, cellType.getName(), voyage.getName()); + } + + cell = persistenceService.createCell(cellType, cellName, dataQuality); voyage.addPostCell(cell); if (log.isInfoEnabled()) { diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageEchotypeImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageEchotypeImportAction.java index 9c8dfab..05f9ea4 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageEchotypeImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageEchotypeImportAction.java @@ -56,8 +56,7 @@ public class VoyageResultsVoyageEchotypeImportAction extends VoyageResultsImport log.info("Starts import of echotype from file " + inputFile.getFileName()); } - String voyageId = importDataContext.getConfiguration().getVoyageId(); - Voyage expectedVoyage = persistenceService.getVoyage(voyageId); + Voyage expectedVoyage = importDataContext.getVoyage(); try (Import<VoyageResultsVoyageEchotypeImportRow> importer = open()) { diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthAgeKeyImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthAgeKeyImportAction.java index ae3101c..27c3497 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthAgeKeyImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthAgeKeyImportAction.java @@ -49,8 +49,7 @@ public class VoyageResultsVoyageLengthAgeKeyImportAction extends VoyageResultsIm log.info("Starts import of lenthAgeKey from file " + inputFile.getFileName()); } - String voyageId = importDataContext.getConfiguration().getVoyageId(); - Voyage expectedVoyage = persistenceService.getVoyage(voyageId); + Voyage expectedVoyage = importDataContext.getVoyage(); Set<String> cacheKeys = new TreeSet<>(); diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthWeightKeyImportAction.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthWeightKeyImportAction.java index bb07100..0b5ee6f 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthWeightKeyImportAction.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/actions/VoyageResultsVoyageLengthWeightKeyImportAction.java @@ -53,8 +53,7 @@ public class VoyageResultsVoyageLengthWeightKeyImportAction extends VoyageResult SpeciesCategoryCache speciesCategoryCache = importDataContext.getSpeciesCategoryCache(); - String voyageId = importDataContext.getConfiguration().getVoyageId(); - Voyage expectedVoyage = persistenceService.getVoyage(voyageId); + Voyage expectedVoyage = importDataContext.getVoyage(); Set<String> cacheKeys = new TreeSet<>(); diff --git a/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties b/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties index 80a1504..5a90c8a 100644 --- a/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties +++ b/echobase-services/src/main/resources/i18n/echobase-services_en_GB.properties @@ -32,8 +32,10 @@ echobase.common.voyageFile=Voyage data file echobase.exportError.toFile=An error occured while exporting file %s \:%s echobase.importError.can.only.import.one.voyage.atime=Impossible to import more that one voyage at a time echobase.importError.dataMetadata.notFound=Metadata column %s missing (existing values \:%s) -echobase.importError.duplicate.elementaryCell=Line %s - Elementary cell named «%s» already exists in database. -echobase.importError.duplicate.esduCell=Line %s - ESDU cell named «%s» already exists in database. +echobase.importError.duplicate.elementaryCell=Line %s - Elementary cell named «%s» on voyage «%s» already exists in database. +echobase.importError.duplicate.esduCell=Line %s - ESDU cell named «%s» on voyage «%s» already exists in database. +echobase.importError.duplicate.mapCell=Line %s - Map cell named «%s» on voyage «%s» already exists in database. +echobase.importError.duplicate.regionCell=Line %s - Region cell named «%s» (of type «%s») on voyage «%s» already exists in database. echobase.importError.duplicate.gearMetataValue=Line %s - A gear meta data (type «%s») value on engin «%s» for operation with id «%s», on startum «%s» - vessel «%s» on voyage «%s» already exists in database. echobase.importError.duplicate.operation=Line %s - An operation with id «%s», on startum «%s» - vessel «%s» on voyage «%s» already exists in database. echobase.importError.duplicate.operationMetataValue=Line %s - An operation meta data (type «%s») value for operation with id «%s», on startum «%s» - vessel «%s» on voyage «%s» already exists in database. diff --git a/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties b/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties index af28dff..8d7ae7e 100644 --- a/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties +++ b/echobase-services/src/main/resources/i18n/echobase-services_fr_FR.properties @@ -32,8 +32,10 @@ echobase.common.voyageFile=Fichier des données de voyages echobase.exportError.toFile=Erreur lors de l'extraction du fichier %s \: %s echobase.importError.can.only.import.one.voyage.atime=Vous ne pouvez pas importer plus d'un voyage à la fois echobase.importError.dataMetadata.notFound=Colonne de métadonnées nommée %s non trouvée (valeurs existantes \: %s) -echobase.importError.duplicate.elementaryCell=Ligne %s - La cellule élémentaire (ligne %s) d'identifiant «%s» existe déjà en base. -echobase.importError.duplicate.esduCell=Ligne %s - La cellule ESDU (ligne %s) d'identifiant «%s» existe déjà en base. +echobase.importError.duplicate.elementaryCell=Ligne %s - La cellule élémentaire d'identifiant «%s» sur la marée nommée «%s» existe déjà en base. +echobase.importError.duplicate.mapCell=Ligne %s - La cellule de type Carte d'identifiant «%s» sur la marée nommée «%s» existe déjà en base. +echobase.importError.duplicate.regionCell=Ligne %s - La cellule de type Région d'identifiant «%s» et de type «%s» sur la marée nommée «%s» existe déjà en base. +echobase.importError.duplicate.esduCell=Ligne %s - La cellule ESDU d'identifiant «%s» sur la marée nommée «%s» existe déjà en base. echobase.importError.duplicate.gearMetataValue=Ligne %s - La mise en œuvre (type %s) de l'engin «%s» (opération d'identifiant «%s» sur la strate «%s» - navire «%s» et sur la marée nommée «%s») existe déjà dans la base. echobase.importError.duplicate.operation=Ligne %s - L'opération d'identifiant «%s» sur la strate «%s» - navire «%s» et sur la marée nommée «%s» existe déjà dans la base. echobase.importError.duplicate.operationMetataValue=Ligne %s - La donnée (type %s) (opération d'identifiant «%s» sur la strate «%s» - navire «%s» et sur la marée nommée «%s») existe déjà dans la base. -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.