View Javadoc
1   package fr.ifremer.tutti.service.sampling;
2   
3   /*
4    * #%L
5    * Tutti :: Service
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2012 - 2016 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU General Public License as
13   * published by the Free Software Foundation, either version 3 of the
14   * License, or (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU General Public
22   * License along with this program.  If not, see
23   * <http://www.gnu.org/licenses/gpl-3.0.html>.
24   * #L%
25   */
26  
27  import com.google.common.base.MoreObjects;
28  import fr.ifremer.tutti.persistence.entities.protocol.CalcifiedPiecesSamplingDefinition;
29  
30  import java.util.Objects;
31  
32  /**
33   * Définit l'état en terme de prélèvement (de pièces calcifiées) d'une observation individuelle.
34   *
35   * L'utilisation de cet objet sous-entend que l'observation individuelle liée rentre bien dans l'algorithme.
36   *
37   * Created on 18/04/16.
38   *
39   * @author Tony Chemit - chemit@codelutin.com
40   */
41  public class IndividualObservationSamplingStatus {
42  
43      /**
44       * Le context d'une observation individuelle (i.e ses caractéristiques).
45       */
46      private final IndividualObservationSamplingContext individualObservationSamplingContext;
47  
48      /**
49       * Le nombre d'observations individuelles similaires effectués sur la campagne.
50       */
51      private int individualObservationCountInCruise;
52  
53      /**
54       * Le nombre de prélèvements similaires effectués sur la campagne.
55       */
56      private int samplingCountInCruise;
57  
58      /**
59       * Le nombre d'observations individuelles similaires effectués sur l'opération de pêche.
60       */
61      private int individualObservationCountInFishingOperation;
62  
63      /**
64       * Le nombre de prélèvements similaires effectués sur l'opération de pêche.
65       */
66      private int samplingCountInFishingOperation;
67  
68      /**
69       * Le nombre d'observations individuelles similaires effectués sur la zone.
70       */
71      private int individualObservationCountInZone;
72  
73      /**
74       * Le nombre de prélèvements similaires effectués sur la zone.
75       */
76      private int samplingCountInZone;
77  
78      private final boolean computeSampling;
79  
80      public IndividualObservationSamplingStatus(IndividualObservationSamplingContext individualObservationSamplingContext,
81                                                 boolean computeSampling,
82                                                 CruiseSamplingInternalCache.SamplingData cruiseSamplingData,
83                                                 CruiseSamplingInternalCache.SamplingData zoneSamplingData,
84                                                 CruiseSamplingInternalCache.SamplingData fishingOperationSamplingData) {
85          Objects.requireNonNull(individualObservationSamplingContext);
86          Objects.requireNonNull(cruiseSamplingData);
87          Objects.requireNonNull(zoneSamplingData);
88          Objects.requireNonNull(fishingOperationSamplingData);
89          this.individualObservationSamplingContext = individualObservationSamplingContext;
90          this.samplingCountInCruise = cruiseSamplingData.getSamplingCount();
91          this.individualObservationCountInCruise = cruiseSamplingData.getIndividualObservationCount();
92          this.samplingCountInZone = zoneSamplingData.getSamplingCount();
93          this.individualObservationCountInZone = zoneSamplingData.getIndividualObservationCount();
94          this.samplingCountInFishingOperation = fishingOperationSamplingData.getSamplingCount();
95          this.individualObservationCountInFishingOperation = fishingOperationSamplingData.getIndividualObservationCount();
96  
97          this.computeSampling = computeSampling;
98      }
99  
100     /**
101      * Ajoute aux donnees de l'objets courante les donnes de l'objet en parametre
102      * cela sert a faire des sommes sur les observations en fusionnant les sexes
103      * et/ou maturite
104      * @param i
105      */
106     public void add(IndividualObservationSamplingStatus i) {
107         individualObservationCountInCruise += i.individualObservationCountInCruise;
108         samplingCountInCruise += i.samplingCountInCruise;
109         individualObservationCountInFishingOperation += i.individualObservationCountInFishingOperation;
110         samplingCountInFishingOperation += i.samplingCountInFishingOperation;
111         individualObservationCountInZone += i.individualObservationCountInZone;
112         samplingCountInZone += i.samplingCountInZone;
113     }
114 
115     public IndividualObservationSamplingContext getIndividualObservationSamplingContext() {
116         return individualObservationSamplingContext;
117     }
118 
119     public boolean isNeedSampling() {
120         // le calcul est fait ici et non plus dans le constructeur car
121         // les données peuvent changé si on appelle la methode add
122         boolean result;
123 
124         // on calcule needSampling si on nous le demande, que la définnition nous autorise (au moins un max n'est pas à 0) et qu'aucun max n'a été atteint
125         if (computeSampling && !isNotUsingSampling() && !isOneTotalCountIsAttained()) {
126 
127             int samplingInterval = individualObservationSamplingContext
128                     .getCalcifiedPiecesSamplingDefinition().getSamplingInterval();
129             result = individualObservationCountInCruise == 1
130                     || samplingInterval == 1
131                     || individualObservationCountInCruise % samplingInterval == 1;
132 
133         } else {
134 
135             result = false;
136 
137         }
138 
139         return result;
140     }
141 
142     public CalcifiedPiecesSamplingDefinition getCalcifiedPiecesSamplingDefinition() {
143         return individualObservationSamplingContext.getCalcifiedPiecesSamplingDefinition();
144     }
145 
146     public int getSamplingCountInCruise() {
147         return samplingCountInCruise;
148     }
149 
150     public int getSamplingCountInFishingOperation() {
151         return samplingCountInFishingOperation;
152     }
153 
154     public int getSamplingCountInZone() {
155         return samplingCountInZone;
156     }
157 
158     public int getIndividualObservationCountInCruise() {
159         return individualObservationCountInCruise;
160     }
161 
162     public int getIndividualObservationCountInFishingOperation() {
163         return individualObservationCountInFishingOperation;
164     }
165 
166     public int getIndividualObservationCountInZone() {
167         return individualObservationCountInZone;
168     }
169 
170     public Integer getTotalSamplingRequiredInCruise() {
171         return getCalcifiedPiecesSamplingDefinition().getMaxByLenghtStep();
172     }
173 
174     public Integer getTotalSamplingRequiredInFishingOperation() {
175         return getCalcifiedPiecesSamplingDefinition().getOperationLimitation();
176     }
177 
178     public Integer getTotalSamplingRequiredInZone() {
179         return getCalcifiedPiecesSamplingDefinition().getZoneLimitation();
180     }
181 
182     public boolean isTotalInCruiseAttained() {
183         Integer totalSamplingRequiredInCruise = getTotalSamplingRequiredInCruise();
184         return totalSamplingRequiredInCruise != null && totalSamplingRequiredInCruise > 0 && getSamplingCountInCruise() >= totalSamplingRequiredInCruise;
185     }
186 
187     public boolean isTotalInFishingOperationAttained() {
188         Integer totalSamplingRequiredInFishingOperation = getTotalSamplingRequiredInFishingOperation();
189         return totalSamplingRequiredInFishingOperation != null && (totalSamplingRequiredInFishingOperation > 0 && getSamplingCountInFishingOperation() >= totalSamplingRequiredInFishingOperation);
190     }
191 
192     public boolean isTotalInZoneAttained() {
193         Integer totalSamplingRequiredInZone = getTotalSamplingRequiredInZone();
194         return totalSamplingRequiredInZone != null && (totalSamplingRequiredInZone > 0 && getSamplingCountInZone() >= totalSamplingRequiredInZone);
195     }
196 
197     public boolean isOneTotalCountIsAttained() {
198         return isTotalInCruiseAttained() || isTotalInZoneAttained() || isTotalInFishingOperationAttained();
199     }
200 
201     public boolean isTotalInCruiseNotUsed() {
202         Integer totalSamplingRequiredInCruise = getTotalSamplingRequiredInCruise();
203         return totalSamplingRequiredInCruise != null && totalSamplingRequiredInCruise == 0;
204     }
205 
206     public boolean isTotalInFishingOperationNotUsed() {
207         Integer totalSamplingRequiredInFishingOperation = getTotalSamplingRequiredInFishingOperation();
208         return totalSamplingRequiredInFishingOperation != null && totalSamplingRequiredInFishingOperation == 0;
209     }
210 
211     public boolean isTotalInZoneNotUsed() {
212         Integer totalSamplingRequiredInZone = getTotalSamplingRequiredInZone();
213         return totalSamplingRequiredInZone != null && totalSamplingRequiredInZone == 0;
214     }
215 
216     public boolean isNotUsingSampling() {
217         return isTotalInCruiseNotUsed() && isTotalInFishingOperationNotUsed() && isTotalInZoneNotUsed();
218     }
219 
220     @Override
221     public String toString() {
222         return MoreObjects.toStringHelper(this)
223                           .add("individualObservationSamplingContext", individualObservationSamplingContext)
224                           .add("individualObservationCountInCruise", getIndividualObservationCountInCruise())
225                           .add("samplingCountInCruise", samplingCountInCruise)
226                           .add("individualObservationCountInFishingOperation", getIndividualObservationCountInFishingOperation())
227                           .add("samplingCountInFishingOperation", samplingCountInFishingOperation)
228                           .add("individualObservationCountInZone", getIndividualObservationCountInZone())
229                           .add("samplingCountInZone", samplingCountInZone)
230                           .add("needSampling", isNeedSampling())
231                           .toString();
232     }
233 }