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