This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 8c45c5804d7f95ce9ce4c054706fbf7db2ce2d76 Author: Benjamin POUSSIN <poussin@codelutin.com> Date: Mon Dec 26 19:12:33 2016 +0100 fixes #8661: [ALGORITHME DE PRELEVEMENTS] mauvais fonctionnement des compteurs quand on décoche l'option "maturité" et/ou "sexe" si dans le protocole on ne coche pas sexe, alors le compte est fait pour l'ensemble des sexes (si on change le protocole en cours de saisie cela peut poser des problemes pour maturite, car on a alors dans la base des valeurs alors qu'il est impossible par exemple dans saisir avec la modification de protocole, et donc les comptes ne sont pas bon). --- .../service/sampling/CruiseSamplingCache.java | 28 ++++------- .../IndividualObservationSamplingCacheRequest.java | 11 ++++- .../IndividualObservationSamplingStatus.java | 29 +++++++++--- .../frequency/IndividualObservationUICache.java | 55 +++++++++++++++++++++- 4 files changed, 95 insertions(+), 28 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java index 51bde24..3cefb8c 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java @@ -403,29 +403,13 @@ public class CruiseSamplingCache implements CruiseCacheAble { gender); String cruiseSamplingKey = context.getCruiseSamplingKey(); - CruiseSamplingInternalCache.SamplingData cruiseSamplingData = cruiseCache.getSamplingData(cruiseSamplingKey); + CruiseSamplingInternalCache.SamplingData cruiseSamplingData = cruiseCache.getOrCreateSamplingData(cruiseSamplingKey); String zoneSamplingKey = context.getZoneSamplingKey(); - CruiseSamplingInternalCache.SamplingData zoneSamplingData = zoneCache.getSamplingData(zoneSamplingKey); - if (zoneSamplingData == null) { - // poussin 20160608 fallback code to prevent UI error - // fixes with https://forge.codelutin.com/issues/8337 - log.error(String.format("Can't find zoneSamplingData, create one" - + " (zoneSamplingKey: '%s'; request: '%s'; zone: '%s')", - zoneSamplingKey, request, optionalZone.get())); - zoneSamplingData = zoneCache.getOrCreateSamplingData(zoneSamplingKey); - } + CruiseSamplingInternalCache.SamplingData zoneSamplingData = zoneCache.getOrCreateSamplingData(zoneSamplingKey); String fishingOperationSamplingKey = context.getFishingOperationSamplingKey(); - CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.getSamplingData(fishingOperationSamplingKey); - if (fishingOperationSamplingData == null) { - // poussin 20160608 fallback code to prevent UI error - // fixes with https://forge.codelutin.com/issues/8337 - log.error(String.format("Can't find fishingOperationSamplingData, create one" - + " (fishingOperationSamplingData: '%s'; request: '%s'; zone: '%s)", - zoneSamplingKey, request, optionalZone.get())); - fishingOperationSamplingData = fishingOperationCache.getOrCreateSamplingData(fishingOperationSamplingKey); - } + CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData = fishingOperationCache.getOrCreateSamplingData(fishingOperationSamplingKey); // on demande à calculer needSampling uniquement s'il n'y a pas de code de prélèvement sur l'observation boolean computeSampling = !request.withSamplingCode(); @@ -545,6 +529,12 @@ public class CruiseSamplingCache implements CruiseCacheAble { return maturity; } + /** + * Retourne si la classe utilisé est une classe mature (true) ou non (false) + * + * @param individualObservationBatch + * @return + */ private Boolean getMaturity(IndividualObservationBatch individualObservationBatch) { Boolean maturity = null; Caracteristic maturityCaracteristic = maturityCaracteristicBySpecies.get(individualObservationBatch.getSpecies().getReferenceTaxonId()); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingCacheRequest.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingCacheRequest.java index ee79a37..dc83ba5 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingCacheRequest.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingCacheRequest.java @@ -45,7 +45,7 @@ public class IndividualObservationSamplingCacheRequest { private final Species species; private final Integer lengthClass; private final CaracteristicQualitativeValue maturity; - private final CaracteristicQualitativeValue gender; + private CaracteristicQualitativeValue gender; private final String samplingCode; public IndividualObservationSamplingCacheRequest(FishingOperation fishingOperation, @@ -71,6 +71,15 @@ public class IndividualObservationSamplingCacheRequest { return species; } + /** + * Pouvoir modifier le sexe est utile pour pouvoir sommer toutes les observations + * quelque soit le sexe + * @param gender + */ + public void setGender(CaracteristicQualitativeValue gender) { + this.gender = gender; + } + public Integer getLengthClass() { return lengthClass; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatus.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatus.java index e452a14..e285b57 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatus.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/IndividualObservationSamplingStatus.java @@ -48,37 +48,37 @@ public class IndividualObservationSamplingStatus { /** * Le nombre d'observations individuelles similaires effectués sur la campagne. */ - private final int individualObservationCountInCruise; + private int individualObservationCountInCruise; /** * Le nombre de prélèvements similaires effectués sur la campagne. */ - private final int samplingCountInCruise; + private int samplingCountInCruise; /** * Le nombre d'observations individuelles similaires effectués sur l'opération de pêche. */ - private final int individualObservationCountInFishingOperation; + private int individualObservationCountInFishingOperation; /** * Le nombre de prélèvements similaires effectués sur l'opération de pêche. */ - private final int samplingCountInFishingOperation; + private int samplingCountInFishingOperation; /** * Le nombre d'observations individuelles similaires effectués sur la zone. */ - private final int individualObservationCountInZone; + private int individualObservationCountInZone; /** * Le nombre de prélèvements similaires effectués sur la zone. */ - private final int samplingCountInZone; + private int samplingCountInZone; /** * Pour savoir si on demande un prélèvement. */ - private final boolean needSampling; + private boolean needSampling; public IndividualObservationSamplingStatus(IndividualObservationSamplingContext individualObservationSamplingContext, boolean computeSampling, @@ -114,6 +114,21 @@ public class IndividualObservationSamplingStatus { } + /** + * Ajoute aux donnees de l'objets courante les donnes de l'objet en parametre + * cela sert a faire des sommes sur les observations en fusionnant les sexes + * @param i + */ + public void add(IndividualObservationSamplingStatus i) { + individualObservationCountInCruise += i.individualObservationCountInCruise; + samplingCountInCruise += i.samplingCountInCruise; + individualObservationCountInFishingOperation += i.individualObservationCountInFishingOperation; + samplingCountInFishingOperation += i.samplingCountInFishingOperation; + individualObservationCountInZone += i.individualObservationCountInZone; + samplingCountInZone += i.samplingCountInZone; + needSampling = needSampling || i.needSampling; + } + public IndividualObservationSamplingContext getIndividualObservationSamplingContext() { return individualObservationSamplingContext; } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java index 32531a0..a6f5de1 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/IndividualObservationUICache.java @@ -25,7 +25,10 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; */ import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.protocol.CalcifiedPiecesSamplingDefinition; +import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; import fr.ifremer.tutti.persistence.entities.protocol.Zone; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.cruise.CruiseCache; import fr.ifremer.tutti.service.sampling.CalcifiedPiecesSamplingAlgorithmEntryNotFoundException; @@ -42,6 +45,7 @@ import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.Optional; +import org.apache.commons.collections4.CollectionUtils; /** * Cache des observations individuelles. @@ -129,9 +133,58 @@ public class IndividualObservationUICache implements Closeable { Objects.requireNonNull(row); + // on commence par prendre le status exact (tout est discreminé: sexe, maturité) + // comme ca on collecte des informations utiles pour la suite (maturity) IndividualObservationSamplingCacheRequest samplingCacheRequest = uiModel.toSamplingCacheRequest(row); - return cruiseSamplingCache.getIndividualObservationSamplingStatus(samplingCacheRequest); + IndividualObservationSamplingStatus result = cruiseSamplingCache.getIndividualObservationSamplingStatus(samplingCacheRequest); + + // fixes bug #8661: solution 2) + // il faut bouclé sur tous les sexes possibles pour pouvoir faire + // la somme et retourne un nouvel object status contenant cette + // somme sur les sexes. + SpeciesProtocol speciesProtocol = uiModel.isProtocolFilled() ? uiModel.getSpeciesOrBenthosBatchUISupport().getSpeciesProtocol(row.getSpecies()) : null; + + // s'il y a un protocole, on regarde s'il faut sommer sur le genre ou non + // (la somme sur le genre peut dependre de la maturite + if (speciesProtocol != null) { + // par defaut on merge, sauf si le boolean sex est a vrai + boolean mergeGender = true; + // on recupere la definition du protocole + Collection<CalcifiedPiecesSamplingDefinition> defs = speciesProtocol.getCalcifiedPiecesSamplingDefinition(); + if (CollectionUtils.isNotEmpty(defs)) { + if (defs.size() == 1) { + // un seul element, c'est qu'il n'y a pas de maturity + mergeGender = !speciesProtocol.getCalcifiedPiecesSamplingDefinition(0).isSex(); + } else { + // plusieurs definition, il faut retrouver celui qui correspond a la maturité de la ligne + boolean maturiry = result.getIndividualObservationSamplingContext().getMaturity(); + for (CalcifiedPiecesSamplingDefinition def : defs) { + if (Objects.equals(def.getMaturity(), maturiry)) { + mergeGender = !def.isSex(); + break; // on a trouve l'element souhaite, on sort + } + } + } + } + + // il faut merger, on recalcule status en mergeant les sexes + if (mergeGender) { + // ne pas oublier le null comme valeur possible, qui n'est pas dans les getQualitativeValue + // elle devient la valeur par defaut pour qu'il n'y ait pas de sexe dans le resultat + samplingCacheRequest.setGender(null); + result = cruiseSamplingCache.getIndividualObservationSamplingStatus( + samplingCacheRequest); + + for (CaracteristicQualitativeValue sex : uiModel.getIndividualObservationModel().getSexCaracteristic().getQualitativeValue()) { + samplingCacheRequest.setGender(sex); + result.add( + cruiseSamplingCache.getIndividualObservationSamplingStatus(samplingCacheRequest) + ); + } + } + } + return result; } public void addIndividualObservations(Collection<IndividualObservationBatchRowModel> individualObservationRows) { -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.