Author: chatellier
Date: 2011-02-16 09:53:22 +0000 (Wed, 16 Feb 2011)
New Revision: 746
Log:
* Add new controls about missing species in catch and length files
* Add new controls about missing haul in haul, catch and length files
Modified:
trunk/changelog.txt
trunk/coser-business/src/main/java/fr/ifremer/coser/services/ControlService.java
trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties
trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties
Modified: trunk/changelog.txt
===================================================================
--- trunk/changelog.txt 2011-02-14 17:12:28 UTC (rev 745)
+++ trunk/changelog.txt 2011-02-16 09:53:22 UTC (rev 746)
@@ -4,6 +4,8 @@
1.0.2
-----
+ * Add new controls about missing species in catch and length files
+ * Add new controls about missing haul in haul, catch and length files
* Add new controls about missing strata in strata and haul files
* Sort configuration window options
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ControlService.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ControlService.java 2011-02-14 17:12:28 UTC (rev 745)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ControlService.java 2011-02-16 09:53:22 UTC (rev 746)
@@ -851,6 +851,9 @@
*
* Les erreurs relevé ici porte sur plusieurs fichiers.
*
+ * L'ordre de verification de cohérence est :
+ * Strates > Traits > Captures > Taille
+ *
* @param control control
* @param progress progress
* @return error list
@@ -874,20 +877,26 @@
Iterator<String[]> itLength = control.getLength().iterator(true);
Iterator<String[]> itStrata = control.getStrata().iterator(true);
Iterator<String[]> itHaul = control.getHaul().iterator(true);
-
+
// declare all necessary data
+ // collections filled during exploration and checked at end of method
Map<String, Integer> refTaxSpecies = new HashMap<String, Integer>();
- Set<String> catchYear = new HashSet<String>();
- Set<String> lengthYear = new HashSet<String>();
- Set<String> haulYear = new HashSet<String>();
- Set<String> campagneNames = new HashSet<String>();
- Set<String> strataStrataNames = new HashSet<String>();
- Set<String> haulStrataNames = new HashSet<String>();
- Set<String> lengthYearHaulSpecies = new HashSet<String>();
- Set<String> catchYearHaulSpecies = new HashSet<String>();
- Set<String> haulYearHaul = new HashSet<String>();
- Set<String> lengthYearHaul = new HashSet<String>();
- Set<String> catchYearHaul = new HashSet<String>();
+ Set<String> catchYear = new HashSet<String>(); // annee du fichier catch
+ Set<String> lengthYear = new HashSet<String>(); // annee du fichier taille
+ Set<String> haulYear = new HashSet<String>(); // annee du fichier trait
+ Set<String> surveyNames = new HashSet<String>(); // nom des campagnes (tous fichier)
+ Set<String> strataStrataNames = new HashSet<String>(); // strates du fichier strates
+ Set<String> haulStrataNames = new HashSet<String>(); // strates du fichier traits
+ Set<String> haulHaulNames = new HashSet<String>(); // traits du fichier traits
+ Set<String> catchHaulNames = new HashSet<String>(); // traits du fichier capture
+ Set<String> lengthHaulNames = new HashSet<String>(); // traits du fichier taille
+ Set<String> catchSpeciesNames = new HashSet<String>(); // especes du fichier catpures
+ Set<String> lengthSpeciesNames = new HashSet<String>(); // especes du fichier tailles
+ Set<String> lengthYearHaulSpecies = new HashSet<String>(); // couple annee/trait/espece du fichier taille
+ Set<String> catchYearHaulSpecies = new HashSet<String>(); // couple annee/trait/espece du fichier capture
+ Set<String> haulYearHaul = new HashSet<String>(); // couple annee/trait du fichier trait
+ Set<String> lengthYearHaul = new HashSet<String>(); // couple annee/trait du fichier taille
+ Set<String> catchYearHaul = new HashSet<String>(); // couple annee/trait du fichier capture
Map<String, Integer[]> specyTypes = new HashMap<String, Integer[]>();
// parcourt de toutes les données
@@ -912,6 +921,41 @@
}
int lineIndex = 1; // skip header
+
+ // strata
+ while (itStrata.hasNext()) {
+ // update progress
+ if (progress != null) {
+ int progressPercent = (int)((double)lineIndex / (double)total * 100.0);
+ progress.setText(_("coser.business.control.step.crossFileChech", progressPercent));
+ progress.setCurrent(lineIndex);
+ ++lineIndex;
+ }
+
+ String[] strataData = itStrata.next();
+ surveyNames.add(strataData[Strata.INDEX_SURVEY]);
+ strataStrataNames.add(strataData[Strata.INDEX_STRATUM]);
+ }
+
+ // haul
+ while (itHaul.hasNext()) {
+ // update progress
+ if (progress != null) {
+ int progressPercent = (int)((double)lineIndex / (double)total * 100.0);
+ progress.setText(_("coser.business.control.step.crossFileChech", progressPercent));
+ progress.setCurrent(lineIndex);
+ ++lineIndex;
+ }
+
+ String[] haulData = itHaul.next();
+ surveyNames.add(haulData[Haul.INDEX_SURVEY]);
+ haulYear.add(haulData[Haul.INDEX_YEAR]);
+ haulYearHaul.add(haulData[Haul.INDEX_YEAR] + "|" + haulData[Haul.INDEX_HAUL]);
+ haulStrataNames.add(haulData[Haul.INDEX_STRATUM]);
+ haulHaulNames.add(haulData[Haul.INDEX_HAUL]);
+ }
+
+ // catch
while (itCatch.hasNext()) {
// update progress
@@ -923,11 +967,13 @@
}
String[] catchData = itCatch.next();
- campagneNames.add(catchData[Catch.INDEX_SURVEY]);
+ surveyNames.add(catchData[Catch.INDEX_SURVEY]);
catchYear.add(catchData[Catch.INDEX_YEAR]);
catchYearHaulSpecies.add(catchData[Catch.INDEX_YEAR] + "|" + catchData[Catch.INDEX_HAUL] + "|" + catchData[Catch.INDEX_SPECIES]);
catchYearHaul.add(catchData[Catch.INDEX_YEAR] + "|" + catchData[Catch.INDEX_HAUL]);
-
+ catchHaulNames.add(catchData[Catch.INDEX_HAUL]);
+ catchSpeciesNames.add(catchData[Catch.INDEX_SPECIES]);
+
// Contrôle des noms d'espèces dans fichiers CAPTURES et TAILLES qui
// doivent être dans le référentiel "reftax": CAPTURES$Espece et
// TAILLES$Espece doivent exister dans REFTAX$ C_VALIDE
@@ -942,6 +988,7 @@
}
}
+ // length
while (itLength.hasNext()) {
// update progress
if (progress != null) {
@@ -953,11 +1000,12 @@
String[] lengthData = itLength.next();
String species = lengthData[Length.INDEX_SPECIES];
- campagneNames.add(lengthData[Length.INDEX_SURVEY]);
+ surveyNames.add(lengthData[Length.INDEX_SURVEY]);
lengthYear.add(lengthData[Length.INDEX_YEAR]);
- lengthYearHaulSpecies.add(lengthData[Length.INDEX_YEAR] + "|" +
- lengthData[Length.INDEX_HAUL] + "|" + species);
+ lengthYearHaulSpecies.add(lengthData[Length.INDEX_YEAR] + "|" + lengthData[Length.INDEX_HAUL] + "|" + species);
lengthYearHaul.add(lengthData[Length.INDEX_YEAR] + "|" + lengthData[Length.INDEX_HAUL]);
+ lengthHaulNames.add(lengthData[Length.INDEX_HAUL]);
+ lengthSpeciesNames.add(species);
// Contrôle des noms d'espèces dans fichiers CAPTURES et TAILLES qui
// doivent être dans le référentiel "reftax": CAPTURES$Espece et
@@ -1007,36 +1055,6 @@
}
}
- while (itStrata.hasNext()) {
- // update progress
- if (progress != null) {
- int progressPercent = (int)((double)lineIndex / (double)total * 100.0);
- progress.setText(_("coser.business.control.step.crossFileChech", progressPercent));
- progress.setCurrent(lineIndex);
- ++lineIndex;
- }
-
- String[] strataData = itStrata.next();
- campagneNames.add(strataData[Strata.INDEX_SURVEY]);
- strataStrataNames.add(strataData[Strata.INDEX_STRATUM]);
- }
-
- while (itHaul.hasNext()) {
- // update progress
- if (progress != null) {
- int progressPercent = (int)((double)lineIndex / (double)total * 100.0);
- progress.setText(_("coser.business.control.step.crossFileChech", progressPercent));
- progress.setCurrent(lineIndex);
- ++lineIndex;
- }
-
- String[] haulData = itHaul.next();
- campagneNames.add(haulData[Haul.INDEX_SURVEY]);
- haulYear.add(haulData[Haul.INDEX_YEAR]);
- haulYearHaul.add(haulData[Haul.INDEX_YEAR] + "|" + haulData[Haul.INDEX_HAUL]);
- haulStrataNames.add(haulData[Haul.INDEX_STRATUM]);
- }
-
// Vérifier que les mêmes années sont présentes dans fichiers captures
// traits et tailles: CAPTURES$Annee, TRAITS$Annee, TAILLES$Annee.
if (!catchYear.equals(lengthYear) || !haulYear.equals(lengthYear)) {
@@ -1048,7 +1066,7 @@
}
// Vérifier que le nom de la campagne est le même dans tous les fichiers *$Campagne.
- if (campagneNames.size() != 1) {
+ if (surveyNames.size() != 1) {
ControlError error = new ControlError();
error.setLevel(ValidationLevel.FATAL);
error.setMessage(_("coser.business.control.error.surveyNotEquals"));
@@ -1096,27 +1114,108 @@
}
// Donc tout ce qui est présent dans TAILLES doit être décrit dans CAPTURES
- // qui doit être décrit dans TRAITS qui doit être décrit dans STRATES. Le non
- // respect de cette règle déclenche une erreur bloquante.
+ // qui doit être décrit dans TRAITS qui doit être décrit dans STRATES.
+ // strates des traits doivent etre dans strates de strates (fatal)
Collection<String> missingStrataStrataNames = CollectionUtils.subtract(haulStrataNames, strataStrataNames);
for (String missingStrataStrataName : missingStrataStrataNames) {
ControlError error = new ControlError();
error.setLevel(ValidationLevel.FATAL);
- error.setMessage(_("coser.business.control.error.missingStrataStrataName"));
- error.setDetailMessage(_("coser.business.control.error.missingStrataStrataNameDetail", missingStrataStrataName));
- error.setTipMessage(_("coser.business.control.error.missingStrataStrataNameTip"));
+ error.setMessage(_("coser.business.control.error.missingStrataStrataFromHaul"));
+ error.setDetailMessage(_("coser.business.control.error.missingStrataStrataFromHaulDetail", missingStrataStrataName));
+ error.setTipMessage(_("coser.business.control.error.missingStrataStrataFromHaulTip"));
crossFilesErrors.add(error);
}
+
+ // Donc tout ce qui est présent dans TAILLES doit être décrit dans CAPTURES
+ // qui doit être décrit dans TRAITS qui doit être décrit dans STRATES.
+ // strates des strates doivent etre dans strates de traits (warning)
+ Collection<String> missingHaulStrataStrataNames = CollectionUtils.subtract(strataStrataNames, haulStrataNames);
+ for (String missingHaulStrataStrataName : missingHaulStrataStrataNames) {
+ ControlError error = new ControlError();
+ error.setLevel(ValidationLevel.WARNING);
+ error.setMessage(_("coser.business.control.error.missingHaulStrataFromStrata"));
+ error.setDetailMessage(_("coser.business.control.error.missingHaulStrataFromStrataDetail", missingHaulStrataStrataName));
+ error.setTipMessage(_("coser.business.control.error.missingHaulStrataFromStrataTip"));
+ crossFilesErrors.add(error);
+ }
- Collection<String> haulStrataStrataNames = CollectionUtils.subtract(strataStrataNames, haulStrataNames);
- for (String haulStrataStrataName : haulStrataStrataNames) {
+ // Donc tout ce qui est présent dans TAILLES doit être décrit dans CAPTURES
+ // qui doit être décrit dans TRAITS qui doit être décrit dans STRATES.
+ // traits des traits doivent etre dans traits de captures (fatal)
+ Collection<String> missingHaulHaulNames = CollectionUtils.subtract(catchHaulNames, haulHaulNames);
+ for (String missingHaulHaulName : missingHaulHaulNames) {
ControlError error = new ControlError();
+ error.setLevel(ValidationLevel.FATAL);
+ error.setMessage(_("coser.business.control.error.missingHaulHaulFromCatch"));
+ error.setDetailMessage(_("coser.business.control.error.missingHaulHaulFromCatchDetail", missingHaulHaulName));
+ error.setTipMessage(_("coser.business.control.error.missingHaulHaulFromCatchTip"));
+ crossFilesErrors.add(error);
+ }
+
+ // Donc tout ce qui est présent dans TAILLES doit être décrit dans CAPTURES
+ // qui doit être décrit dans TRAITS qui doit être décrit dans STRATES.
+ // traits des captures doivent etre dans traits de traits (warning)
+ Collection<String> missingCatchHaulNames = CollectionUtils.subtract(haulHaulNames, catchHaulNames);
+ for (String missingCatchHaulName : missingCatchHaulNames) {
+ ControlError error = new ControlError();
error.setLevel(ValidationLevel.WARNING);
- error.setMessage(_("coser.business.control.error.missingHaulStrataName"));
- error.setDetailMessage(_("coser.business.control.error.missingHaulStrataNameDetail", haulStrataStrataName));
- error.setTipMessage(_("coser.business.control.error.missingHaulStrataNameTip"));
+ error.setMessage(_("coser.business.control.error.missingCatchHaulFromHaul"));
+ error.setDetailMessage(_("coser.business.control.error.missingCatchHaulFromHaulDetail", missingCatchHaulName));
+ error.setTipMessage(_("coser.business.control.error.missingCatchHaulFromHaulTip"));
crossFilesErrors.add(error);
}
+
+ // Donc tout ce qui est présent dans TAILLES doit être décrit dans CAPTURES
+ // qui doit être décrit dans TRAITS qui doit être décrit dans STRATES.
+ // traits des traits doivent etre dans traits de captures (fatal)
+ Collection<String> missingCatchHaulForLengthNames = CollectionUtils.subtract(lengthHaulNames, catchHaulNames);
+ for (String missingCatchHaulForLengthName : missingCatchHaulForLengthNames) {
+ ControlError error = new ControlError();
+ error.setLevel(ValidationLevel.FATAL);
+ error.setMessage(_("coser.business.control.error.missingCatchHaulFromLength"));
+ error.setDetailMessage(_("coser.business.control.error.missingCatchHaulFromLengthDetail", missingCatchHaulForLengthName));
+ error.setTipMessage(_("coser.business.control.error.missingCatchHaulFromLengthTip"));
+ crossFilesErrors.add(error);
+ }
+
+ // Donc tout ce qui est présent dans TAILLES doit être décrit dans CAPTURES
+ // qui doit être décrit dans TRAITS qui doit être décrit dans STRATES.
+ // traits des captures doivent etre dans traits de traits (warning)
+ Collection<String> missingLengthHaulNames = CollectionUtils.subtract(catchHaulNames, lengthHaulNames);
+ for (String missingLengthHaulName : missingLengthHaulNames) {
+ ControlError error = new ControlError();
+ error.setLevel(ValidationLevel.WARNING);
+ error.setMessage(_("coser.business.control.error.missingLengthHaulFromCatch"));
+ error.setDetailMessage(_("coser.business.control.error.missingLengthHaulFromCatchDetail", missingLengthHaulName));
+ error.setTipMessage(_("coser.business.control.error.missingLengthHaulFromCatchTip"));
+ crossFilesErrors.add(error);
+ }
+
+ // Donc tout ce qui est présent dans TAILLES doit être décrit dans CAPTURES
+ // qui doit être décrit dans TRAITS qui doit être décrit dans STRATES.
+ // especes des tailles doivent etre dans especes de captures (fatal)
+ Collection<String> missingCatchSpeciesNames = CollectionUtils.subtract(lengthSpeciesNames, catchSpeciesNames);
+ for (String missingCatchSpeciesName : missingCatchSpeciesNames) {
+ ControlError error = new ControlError();
+ error.setLevel(ValidationLevel.FATAL);
+ error.setMessage(_("coser.business.control.error.missingCatchSpeciesFromLength"));
+ error.setDetailMessage(_("coser.business.control.error.missingCatchSpeciesFromLengthDetail", missingCatchSpeciesName));
+ error.setTipMessage(_("coser.business.control.error.missingCatchSpeciesFromLengthTip"));
+ crossFilesErrors.add(error);
+ }
+
+ // Donc tout ce qui est présent dans TAILLES doit être décrit dans CAPTURES
+ // qui doit être décrit dans TRAITS qui doit être décrit dans STRATES.
+ // especes des captures doivent etre dans especes de tailles (warning)
+ Collection<String> missingLengthSpeciesNames = CollectionUtils.subtract(catchSpeciesNames, lengthSpeciesNames);
+ for (String missingLengthSpeciesName : missingLengthSpeciesNames) {
+ ControlError error = new ControlError();
+ error.setLevel(ValidationLevel.WARNING);
+ error.setMessage(_("coser.business.control.error.missingLengthSpeciesFromCatch"));
+ error.setDetailMessage(_("coser.business.control.error.missingLengthSpeciesFromCatchDetail", missingLengthSpeciesName));
+ error.setTipMessage(_("coser.business.control.error.missingLengthSpeciesFromCatchTip"));
+ crossFilesErrors.add(error);
+ }
return crossFilesErrors;
}
Modified: trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties
===================================================================
--- trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties 2011-02-14 17:12:28 UTC (rev 745)
+++ trunk/coser-business/src/main/resources/i18n/coser-business_en_GB.properties 2011-02-16 09:53:22 UTC (rev 746)
@@ -47,12 +47,30 @@
coser.business.control.error.invalidLengthLengthStepTip=Length field must be in centimeters.
coser.business.control.error.minObservationCount=Minimum number of observation not reached
coser.business.control.error.minObservationCountDetail=Minimum number of observation not reached (%s) \: %.2f
-coser.business.control.error.missingHaulStrataName=Missing strata in haul file
-coser.business.control.error.missingHaulStrataNameDetail=Missing strata %s in haul file
-coser.business.control.error.missingHaulStrataNameTip=Check that all strata defined in strata file appear in haul file
-coser.business.control.error.missingStrataStrataName=Missing strata in strata file
-coser.business.control.error.missingStrataStrataNameDetail=Missing strata %s in strata file
-coser.business.control.error.missingStrataStrataNameTip=Check that all strata defined in haul fail appear in strata file
+coser.business.control.error.missingCatchHaulFromHaul=Missing haul file hauls in catch file
+coser.business.control.error.missingCatchHaulFromHaulDetail=Missing haul %s in catch file
+coser.business.control.error.missingCatchHaulFromHaulTip=Check that all haul defined in haul file appear in catch file
+coser.business.control.error.missingCatchHaulFromLength=Missing length file hauls in catch file
+coser.business.control.error.missingCatchHaulFromLengthDetail=Missing haul %s in catch file
+coser.business.control.error.missingCatchHaulFromLengthTip=Check that all haul defined in length file appear in catch file
+coser.business.control.error.missingCatchSpeciesFromLength=Missing length file species in catch file
+coser.business.control.error.missingCatchSpeciesFromLengthDetail=Missing species %s in catch file
+coser.business.control.error.missingCatchSpeciesFromLengthTip=Check that all species defined in length file appear in catch file
+coser.business.control.error.missingHaulHaulFromCatch=Missing catch file hauls in haul file
+coser.business.control.error.missingHaulHaulFromCatchDetail=Missing haul %s in haul file
+coser.business.control.error.missingHaulHaulFromCatchTip=Check that all haul defined in catch file appear in haul file
+coser.business.control.error.missingHaulStrataFromStrata=Missing strata file strata in haul file
+coser.business.control.error.missingHaulStrataFromStrataDetail=Missing strata %s in haul file
+coser.business.control.error.missingHaulStrataFromStrataTip=Check that all strata defined in strata file appear in haul file
+coser.business.control.error.missingLengthHaulFromCatch=Missing catch file hauls in length file
+coser.business.control.error.missingLengthHaulFromCatchDetail=Missing haul %s in length file
+coser.business.control.error.missingLengthHaulFromCatchTip=Check that all haul defined in catch file appear in length file
+coser.business.control.error.missingLengthSpeciesFromCatch=Missing catch file species in length file
+coser.business.control.error.missingLengthSpeciesFromCatchDetail=Missing species %s in length file
+coser.business.control.error.missingLengthSpeciesFromCatchTip=Check that all species defined in catch file appear in length file
+coser.business.control.error.missingStrataStrataFromHaul=Missing haul file stratas in strata file
+coser.business.control.error.missingStrataStrataFromHaulDetail=Missing strata %s in strata file
+coser.business.control.error.missingStrataStrataFromHaulTip=Check that all strata defined in haul fail appear in strata file
coser.business.control.error.missingYearHaulForCatchData=Missing hauls in haul data for some catch
coser.business.control.error.missingYearHaulForCatchDataDetail=Missing %s tuple in hauls
coser.business.control.error.missingYearHaulForCatchDataTip=Check that for each haul present one year (denoted Year|Line) in the capture file there is a data in the haul file
Modified: trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties
===================================================================
--- trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties 2011-02-14 17:12:28 UTC (rev 745)
+++ trunk/coser-business/src/main/resources/i18n/coser-business_fr_FR.properties 2011-02-16 09:53:22 UTC (rev 746)
@@ -47,12 +47,30 @@
coser.business.control.error.invalidLengthLengthStepTip=Le champs de longueur doit \u00EAtre en centim\u00E8tre (ou demi centim\u00E8tre)
coser.business.control.error.minObservationCount=Nombre minimal d'observation non atteint
coser.business.control.error.minObservationCountDetail=Nombre minimal d'observation non atteint (%s) \: %.2f
-coser.business.control.error.missingHaulStrataName=Strates manquantes dans le fichier traits
-coser.business.control.error.missingHaulStrataNameDetail=Strate %s manquante dans le fichier traits
-coser.business.control.error.missingHaulStrataNameTip=V\u00E9rifier que toutes les strates d\u00E9finies dans le fichier strates apparaissent dans le fichier traits
-coser.business.control.error.missingStrataStrataName=Strates manquantes dans le fichier strates
-coser.business.control.error.missingStrataStrataNameDetail=Strate %s manquante dans le fichier strates
-coser.business.control.error.missingStrataStrataNameTip=V\u00E9rifier que toutes les strates d\u00E9finies dans le fichier traits apparaissent dans le fichier strates
+coser.business.control.error.missingCatchHaulFromHaul=Traits du fichier traits manquants dans le fichier captures
+coser.business.control.error.missingCatchHaulFromHaulDetail=Trait %s manquant dans le fichier captures
+coser.business.control.error.missingCatchHaulFromHaulTip=V\u00E9rifier que tous les traits d\u00E9finis dans le fichier traits apparaissent dans le fichier captures
+coser.business.control.error.missingCatchHaulFromLength=Traits du fichier tailles manquants dans le fichier captures
+coser.business.control.error.missingCatchHaulFromLengthDetail=Trait %s manquant dans le fichier captures
+coser.business.control.error.missingCatchHaulFromLengthTip=V\u00E9rifier que tous les traits d\u00E9finis dans le fichier tailles apparaissent dans le fichier captures
+coser.business.control.error.missingCatchSpeciesFromLength=Esp\u00E8ces du fichier tailles manquantes dans le fichier captures
+coser.business.control.error.missingCatchSpeciesFromLengthDetail=Esp\u00E8ce %s manquante dans le fichier captures
+coser.business.control.error.missingCatchSpeciesFromLengthTip=V\u00E9rifier que toutes les esp\u00E8ces d\u00E9finies dans le fichier tailles apparaissent dans le fichier captures
+coser.business.control.error.missingHaulHaulFromCatch=Traits du fichier captures manquants dans le fichier traits
+coser.business.control.error.missingHaulHaulFromCatchDetail=Trait %s manquant dans le fichier traits
+coser.business.control.error.missingHaulHaulFromCatchTip=V\u00E9rifier que tous les traits d\u00E9finis dans le fichier traits apparaissent dans le fichier captures
+coser.business.control.error.missingHaulStrataFromStrata=Strates du fichier strates manquantes dans le fichier traits
+coser.business.control.error.missingHaulStrataFromStrataDetail=Strate %s manquante dans le fichier traits
+coser.business.control.error.missingHaulStrataFromStrataTip=V\u00E9rifier que toutes les strates d\u00E9finies dans le fichier strates apparaissent dans le fichier traits
+coser.business.control.error.missingLengthHaulFromCatch=Traits du fichier captures manquants dans le fichier tailles
+coser.business.control.error.missingLengthHaulFromCatchDetail=Trait %s manquant dans le fichier tailles
+coser.business.control.error.missingLengthHaulFromCatchTip=V\u00E9rifier que tous les traits d\u00E9finis dans le fichier captures apparaissent dans le fichier tailles
+coser.business.control.error.missingLengthSpeciesFromCatch=Esp\u00E8ces du fichier captures manquantes dans le fichier tailles
+coser.business.control.error.missingLengthSpeciesFromCatchDetail=Esp\u00E8ce %s manquante dans le fichier tailles
+coser.business.control.error.missingLengthSpeciesFromCatchTip=V\u00E9rifier que toutes les esp\u00E8ces d\u00E9finies dans le fichier captures apparaissent dans le fichier tailles
+coser.business.control.error.missingStrataStrataFromHaul=Strates du fichier traits manquantes dans le fichier strates
+coser.business.control.error.missingStrataStrataFromHaulDetail=Strate %s manquante dans le fichier strates
+coser.business.control.error.missingStrataStrataFromHaulTip=V\u00E9rifier que toutes les strates d\u00E9finies dans le fichier traits apparaissent dans le fichier strates
coser.business.control.error.missingYearHaulForCatchData=Traits manquants dans les traits pour certaines captures
coser.business.control.error.missingYearHaulForCatchDataDetail=Couple %s manquant dans les traits
coser.business.control.error.missingYearHaulForCatchDataTip=V\u00E9rifier que pour chaque trait pr\u00E9sent une ann\u00E9e (not\u00E9 Annee|Trait) dans le fichier capture, il y a une donn\u00E9e dans le fichier traits