This is an automated email from the git hooks/post-receive script. New commit to branch feature/6150 in repository tutti. See http://git.codelutin.com/tutti.git commit 7fdd8e731c5991b7f5b3e7385b0a71f226dd3274 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Nov 22 17:58:42 2014 +0100 - reorganisation du paquetage pupitri - prise en compte du nombre de caisse (pour le rapport pupitri) --- .../java/fr/ifremer/tutti/TuttiConfiguration.java | 6 +- .../fr/ifremer/tutti/service/pupitri/BoxType.java | 33 +++ .../pupitri/CarrouselImportRequestResult.java | 16 +- .../tutti/service/pupitri/PupitriCatch.java | 168 ------------ .../service/pupitri/PupitriExportService.java | 2 + .../tutti/service/pupitri/PupitriImportResult.java | 22 +- .../service/pupitri/PupitriImportService.java | 244 ++++-------------- .../tutti/service/pupitri/PupitriSignContext.java | 65 +++++ .../service/pupitri/PupitriSpeciesContext.java | 285 +++++++++++++++++++++ .../service/pupitri/{ => csv}/CarrouselRow.java | 14 +- .../pupitri/{ => csv}/CarrouselRowModel.java | 23 +- .../service/pupitri/{ => csv}/SpeciesRow.java | 2 +- .../service/pupitri/{ => csv}/SpeciesRowModel.java | 2 +- .../tutti/service/pupitri/{ => csv}/TrunkRow.java | 3 +- .../service/pupitri/{ => csv}/TrunkRowModel.java | 3 +- .../{ => report}/PupitriImportReportModel.java | 77 +----- .../pupitri/report/PupitriImportReportRow.java | 76 ++++++ .../src/main/resources/ftl/pupitriReport_fr.ftl | 77 ++++-- 18 files changed, 625 insertions(+), 493 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfiguration.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfiguration.java index adc1faf..d042a24 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfiguration.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfiguration.java @@ -230,7 +230,11 @@ public class TuttiConfiguration extends ApplicationConfiguration { } public File newTempFile(String basename) { - return new File(getTmpDirectory(), basename + "_" + System.nanoTime()); + return newTempFile(basename ,""); + } + + public File newTempFile(String basename, String extension) { + return new File(getTmpDirectory(), basename + "_" + System.nanoTime()+extension); } public boolean isDbExists() { diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/BoxType.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/BoxType.java new file mode 100644 index 0000000..c3dd556 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/BoxType.java @@ -0,0 +1,33 @@ +package fr.ifremer.tutti.service.pupitri; + +/** + * Created on 11/22/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.11 + */ +public enum BoxType { + + SMALL("001"), + BIG("002"); + + private final String importValue; + + BoxType(String importValue) { + this.importValue = importValue; + } + + public static BoxType getBoxType(String importValue) { + + BoxType result = null; + for (BoxType s : values()) { + if (s.importValue.equals(importValue)) { + result = s; + break; + } + } + return result; + + } + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselImportRequestResult.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselImportRequestResult.java index 456aec2..025f6f3 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselImportRequestResult.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselImportRequestResult.java @@ -42,7 +42,7 @@ public class CarrouselImportRequestResult { /** * Liste des lots lus depuis le fichier carrousel. Chaque lot est un tuple (espece,trie). */ - private final List<PupitriCatch> catches; + private final List<PupitriSpeciesContext> catches; public CarrouselImportRequestResult(ListMultimap<String, Species> speciesByCode) { @@ -83,19 +83,19 @@ public class CarrouselImportRequestResult { notImportedSpeciesIds.add(speciesId); } - public PupitriCatch getExistingCatchOrAdd(List<Species> speciesList, boolean sorted) { + public PupitriSpeciesContext getOrCreateCatch(List<Species> speciesList, boolean sorted) { // on utilise la première espèce trouvée dans la liste des candidates //FIXME Bien s'assurer que cela est ok Species species = speciesList.get(0); - PupitriCatch pupitriCatch = new PupitriCatch(species, sorted); - int catchIndex = catches.indexOf(pupitriCatch); + PupitriSpeciesContext pupitriSpeciesContext = new PupitriSpeciesContext(species, sorted); + int catchIndex = catches.indexOf(pupitriSpeciesContext); if (catchIndex >= 0) { - pupitriCatch = catches.get(catchIndex); + pupitriSpeciesContext = catches.get(catchIndex); } else { - catches.add(pupitriCatch); + catches.add(pupitriSpeciesContext); } - return pupitriCatch; + return pupitriSpeciesContext; } @@ -115,7 +115,7 @@ public class CarrouselImportRequestResult { return notImportedSpeciesIds; } - public List<PupitriCatch> getCatches() { + public List<PupitriSpeciesContext> getCatches() { return catches; } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriCatch.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriCatch.java deleted file mode 100644 index 91b3c01..0000000 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriCatch.java +++ /dev/null @@ -1,168 +0,0 @@ -package fr.ifremer.tutti.service.pupitri; - -/* - * #%L - * Tutti :: Service - * %% - * Copyright (C) 2012 - 2014 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Maps; -import fr.ifremer.tutti.persistence.entities.referential.Species; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.mutable.MutableFloat; - -import java.io.Serializable; -import java.util.Map; -import java.util.Set; - -/** - * @author kmorin <kmorin@codelutin.com> - * @since 1.2 - */ -public class PupitriCatch implements Serializable { - - private static final long serialVersionUID = 1L; - - private static final String MELAG_META_SPECIES = "MELA-NGE"; - - private static final String MELAG_2_META_SPECIES = "MELANGE"; - - /** - * All MELAG species. - * - * @since 3.7 - */ - static final Set<String> MELAG_SPECIES = ImmutableSet.copyOf( - new String[]{MELAG_META_SPECIES, MELAG_2_META_SPECIES}); - - /** - * Espece du lot. - */ - protected Species species; - - /** - * Is the species is a sorted (VRAC) or unsorted (HORS-VRAC)? - */ - protected boolean sorted; - - /** - * If the species was involved in the melag, fill this flag. - * - * If species has also a {@link Signs#BIG} weight, then the melga weight is imported as a {@link Signs#SMALL} batch. - * Otherwise using the {@link Signs#DEFAULT} sign. - * - * We will look after this sign while crzating species batch to import. - */ - protected Signs melagElevatedSign; - - protected Map<Signs, MutableFloat> weightBySign = Maps.newHashMap(); - - public PupitriCatch(Species species, boolean sorted) { - this.species = species; - this.sorted = sorted; - } - - public Species getSpecies() { - return species; - } - - public boolean isSorted() { - return sorted; - } - - public boolean isAddMelagComment(Signs sign) { - return melagElevatedSign != null && melagElevatedSign.equals(sign); - } - - public boolean isForMelag() { - return weightBySign.containsKey(Signs.MELAG); - } - - public boolean isMelagMetaSpecies() { - - boolean melagMetaSpecies = MELAG_SPECIES.contains(species.getSurveyCode()); - return melagMetaSpecies; - - } - - public Float getWeight(Signs signs) { - - MutableFloat mutableFloat = weightBySign.get(signs); - return mutableFloat == null ? null : mutableFloat.floatValue(); - - } - - public Map<Signs, MutableFloat> getWeightBySign() { - return weightBySign; - } - - public void addToSign(Signs sign, Float weight) { - MutableFloat f = weightBySign.get(sign); - if (f == null) { - f = new MutableFloat(); - weightBySign.put(sign, f); - } - f.add(weight); - } - - public void removeSign(Signs sign) { - weightBySign.remove(sign); - } - - public void setMelagElevatedWeight(Signs melagElevatedSign, Float weight) { - addToSign(melagElevatedSign, weight); - removeSign(Signs.MELAG); - this.melagElevatedSign = melagElevatedSign; - } - - @Override - public int hashCode() { - int speciesHashCode = species != null ? species.hashCode() : 0; - int sortedHashCode = sorted ? 0x55555555 : 0x2AAAAAAA; - return speciesHashCode ^ sortedHashCode; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final PupitriCatch other = (PupitriCatch) obj; - if (this.species != other.species && (this.species == null || !this.species.equals(other.species))) { - return false; - } - if (this.sorted != other.sorted) { - return false; - } - return true; - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("species", species.getSurveyCode()) - .append("sorted", sorted) - .append("weightBySign", weightBySign) - .toString(); - } -} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriExportService.java index 35fcdf1..1c3bc19 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriExportService.java @@ -5,6 +5,8 @@ import com.google.common.base.Function; import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.AbstractTuttiService; +import fr.ifremer.tutti.service.pupitri.csv.SpeciesRow; +import fr.ifremer.tutti.service.pupitri.csv.SpeciesRowModel; import org.apache.commons.collections4.CollectionUtils; import org.nuiton.csv.Export; import org.nuiton.jaxx.application.ApplicationTechnicalException; diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportResult.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportResult.java index 3045791..08d8440 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportResult.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportResult.java @@ -90,7 +90,7 @@ public class PupitriImportResult { /** * Liste des lots lus depuis le fichier carrousel. Chaque lot est un tuple (espece,trie). */ - private final List<PupitriCatch> catches; + private final List<PupitriSpeciesContext> catches; /** * Ensemble de identifiants d'espèces non importés depuis el fichier carrousel. @@ -101,7 +101,7 @@ public class PupitriImportResult { /** * Poids total des espèces du mélange cumulé depuis le fichier carrousel, i.e de toutes les lignes dont - * l'espèce appartient à l'ensemble {@link PupitriCatch#MELAG_SPECIES}. + * l'espèce appartient à l'ensemble {@link PupitriSpeciesContext#MELAG_SPECIES}. * * @since 3.4.2 */ @@ -177,7 +177,7 @@ public class PupitriImportResult { return carrouselUnsortedWeight; } - public List<PupitriCatch> getCatches() { + public List<PupitriSpeciesContext> getCatches() { return catches; } @@ -255,9 +255,9 @@ public class PupitriImportResult { this.nbCarrousselImported = carrouselImportRequestResult.getNbCarrousselImported(); this.notImportedSpeciesIds.addAll(carrouselImportRequestResult.getNotImportedSpeciesIds()); - List<PupitriCatch> incomingCatches = carrouselImportRequestResult.getCatches(); + List<PupitriSpeciesContext> incomingCatches = carrouselImportRequestResult.getCatches(); - for (PupitriCatch aCatch : incomingCatches) { + for (PupitriSpeciesContext aCatch : incomingCatches) { addCatch(aCatch); } @@ -282,9 +282,9 @@ public class PupitriImportResult { StringBuilder melagCommentBuilder = new StringBuilder(t("tutti.service.pupitri.import.createMelag.comment.part1") + "\n"); - Iterator<PupitriCatch> iterator = catches.iterator(); + Iterator<PupitriSpeciesContext> iterator = catches.iterator(); while (iterator.hasNext()) { - PupitriCatch aCatch = iterator.next(); + PupitriSpeciesContext aCatch = iterator.next(); if (useMelag && aCatch.isMelagMetaSpecies()) { @@ -303,7 +303,7 @@ public class PupitriImportResult { Float sampleWeight = aCatch.getWeight(Signs.MELAG); Float weight = Weights.roundKiloGram(sampleWeight / melagRatio); - if (aCatch.getWeight(Signs.BIG) == null) { + if (!aCatch.containsSign(Signs.BIG)) { // No BIG batch associated with this melag species // use default batch @@ -333,9 +333,7 @@ public class PupitriImportResult { // move the melag weight as a default weight - Float weight = aCatch.getWeight(Signs.MELAG); - aCatch.addToSign(Signs.DEFAULT, weight); - aCatch.removeSign(Signs.MELAG); + aCatch.moveMelagToDefaultSign(); } } @@ -355,7 +353,7 @@ public class PupitriImportResult { } - private void addCatch(PupitriCatch aCatch) { + private void addCatch(PupitriSpeciesContext aCatch) { catches.add(aCatch); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportService.java index b06b349..ddf1600 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportService.java @@ -25,7 +25,6 @@ package fr.ifremer.tutti.service.pupitri; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import fr.ifremer.adagio.core.dao.referential.ObjectTypeCode; import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId; import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; @@ -49,11 +48,16 @@ import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.TuttiCsvUtil; import fr.ifremer.tutti.service.TuttiDataContext; import fr.ifremer.tutti.service.TuttiServiceContext; +import fr.ifremer.tutti.service.pupitri.csv.CarrouselRow; +import fr.ifremer.tutti.service.pupitri.csv.CarrouselRowModel; +import fr.ifremer.tutti.service.pupitri.csv.TrunkRow; +import fr.ifremer.tutti.service.pupitri.csv.TrunkRowModel; +import fr.ifremer.tutti.service.pupitri.report.PupitriImportReportModel; +import fr.ifremer.tutti.service.pupitri.report.PupitriImportReportRow; import fr.ifremer.tutti.util.Weights; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.mutable.MutableFloat; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.csv.Import; @@ -72,7 +76,6 @@ import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Set; import static org.nuiton.i18n.I18n.n; import static org.nuiton.i18n.I18n.t; @@ -187,6 +190,7 @@ public class PupitriImportService extends AbstractTuttiService { return result; } + //FIXME Check how to deal with Melag meta species and species involed in melag protected File generatePupitriReport(FishingOperation operation, PupitriImportResult result) { boolean protocolFilled = context.getDataContext().isProtocolFilled(); @@ -201,7 +205,14 @@ public class PupitriImportService extends AbstractTuttiService { PupitriImportReportModel reportModel = new PupitriImportReportModel(operation, result); - for (PupitriCatch aCatch : result.getCatches()) { + for (PupitriSpeciesContext aCatch : result.getCatches()) { + + if (!aCatch.isSorted()) { + + //FIXME Check it ok ? + // Le rapport ne contient que les lots vrac + continue; + } Species species = aCatch.getSpecies(); @@ -228,24 +239,26 @@ public class PupitriImportService extends AbstractTuttiService { String name = species.getName(); if (StringUtils.isEmpty(code)) { - throw new ApplicationBusinessException(t("tutti.pdf.export.missing.species.code", species.getReferenceTaxonId(), name)); + } String vernacularCode = speciesWithVerncularCode.getVernacularCode(); - //FIXME Pour Voir si on doit ajouter une ligne par signe ? - PupitriImportReportModel.PupitriImportReportCatch reportCatch = PupitriImportReportModel.newCatch(code, - name, - vernacularCode, - aCatch); + for (Signs signs : aCatch.getSigns()) { + PupitriImportReportRow reportCatch = PupitriImportReportRow.newRow(code, + name, + vernacularCode, + aCatch.getSignContext(signs)); - reportModel.addPupitriImportReportCatch(reportCatch); + reportModel.addRow(reportCatch); + + } } - File reportFile = context.getConfig().newTempFile("puputri-report"); + File reportFile = context.getConfig().newTempFile("puputri-report", ".pdf"); Locale locale = context.getConfig().getI18nLocale(); pdfGeneratorService.generatePdf(reportFile, locale, "pupitriReport.ftl", reportModel); @@ -394,7 +407,7 @@ public class PupitriImportService extends AbstractTuttiService { Float beanWeight = bean.getWeight(); if (beanWeight < 0f) { - //FIXME Savoir pourquoi cela doit arriver ? + //FIXME Savoir pourquoi cela peut arriver ? beanWeight = 0f; } @@ -426,105 +439,15 @@ public class PupitriImportService extends AbstractTuttiService { // creation d'un nouveau lot (par rapport au tuple (espece, trie)) // ou bien recuperation d'un lot deja existant - PupitriCatch pupitriCatch = result.getExistingCatchOrAdd(speciesList, sorted); + PupitriSpeciesContext pupitriSpeciesContext = result.getOrCreateCatch(speciesList, sorted); - // ajout du poids au signe donne dans le lot - pupitriCatch.addToSign(bean.getSign(), beanWeight); + // ajout des données (type de box, poids) au signe donne dans le lot + pupitriSpeciesContext.addToSignContext(bean.getSign(), bean.getBoxType(), beanWeight); } } -// protected void importPupitriCarrousel(PupitriImportResult result, -// File carrouselFile, -// FishingOperation operation) { -// -// if (log.isInfoEnabled()) { -// log.info("Will import pupitri operation [" + operation.toString() + -// "] carrousel from file: " + carrouselFile); -// } -// -// // prepare import -// -// // get the map of species by survey code or reftax code -// ListMultimap<String, Species> speciesBySurveyCode = ArrayListMultimap.create(); -// speciesBySurveyCode.putAll(Speciess.splitBySurveyCode(dataContext.getReferentSpeciesWithSurveyCode())); -// speciesBySurveyCode.putAll(Speciess.splitByRefTaxCode(dataContext.getReferentSpecies())); -// -// // import the batches -// -// Float carrouselSortedWeight = 0f; -// -// List<PupitriCatch> catches = Lists.newArrayList(); -//// Set<String> notFoundSpecies = Sets.newHashSet(); -// -// Import<CarrouselRow> importer = null; -// -// CarrouselRowModel carrouselCsvModel = new CarrouselRowModel(','); -// -// File fileWithHeaders = createFileWithHeaders(carrouselCsvModel, -// carrouselFile); -// Reader reader = ApplicationIOUtil.newReader( -// fileWithHeaders, -// n("tutti.service.pupitri.carroussel.import.error")); -// try { -// -// importer = Import.newImport(carrouselCsvModel, reader); -// -// for (CarrouselRow bean : importer) { -// // is the bean from the current operation and rig ? -// if (bean.acceptOperation(operation)) { -// -// result.incrementNbCarrousselImported(); -// -// String speciesId = bean.getSpeciesId(); -// -// List<Species> speciesList = speciesBySurveyCode.get(speciesId); -// Float beanWeight = bean.getWeight(); -// if (beanWeight < 0f) { -// beanWeight = 0f; -// } -// boolean sorted = bean.isSorted(); -// if (sorted) { -// carrouselSortedWeight += beanWeight; -// } -// -// if (CollectionUtils.isNotEmpty(speciesList)) { -// -// Species species = speciesList.get(0); -// PupitriCatch pupitriCatch = new PupitriCatch(species, sorted); -// int catchIndex = catches.indexOf(pupitriCatch); -// if (catchIndex >= 0) { -// pupitriCatch = catches.get(catchIndex); -// } else { -// catches.add(pupitriCatch); -// } -// pupitriCatch.addToSign(bean.getSign(), beanWeight); -// } else { -// result.addNotImportedSpeciesId(speciesId); -// } -// } -// } -// -// importer.close(); -// reader.close(); -// -// } catch (Exception e) { -// DecoratorService service = getService(DecoratorService.class); -// throw new ApplicationTechnicalException( -// t("tutti.service.pupitri.import.carrousel.error", carrouselFile, service.getDecorator(operation).toString(operation)), e); -// -// } finally { -// IOUtils.closeQuietly(importer); -// IOUtils.closeQuietly(reader); -// FileUtils.deleteQuietly(fileWithHeaders); -// } -// -//// result.setNbCarrousselNotImported(notFoundSpecies.size()); -// result.setCarrouselSortedWeight(Weights.roundKiloGram(carrouselSortedWeight)); -// result.setCatches(catches); -// } - protected void savePupitriImportResult(PupitriImportResult result, FishingOperation operation, CatchBatch catchBatch) { @@ -546,21 +469,21 @@ public class PupitriImportService extends AbstractTuttiService { String melagComment = result.getMelagComment(); Decorator<Species> speciesDecorator = decoratorService.getDecoratorByType(Species.class); - for (PupitriCatch pupitriCatch : result.getCatches()) { + for (PupitriSpeciesContext pupitriSpeciesContext : result.getCatches()) { - Species species = pupitriCatch.getSpecies(); - CaracteristicQualitativeValue cqv = pupitriCatch.isSorted() ? + Species species = pupitriSpeciesContext.getSpecies(); + CaracteristicQualitativeValue cqv = pupitriSpeciesContext.isSorted() ? sortedCaracteristic : unsortedCaracteristic; - boolean splitSpecies = isSplitSpecies(pupitriCatch); + boolean splitSpecies = pupitriSpeciesContext.isSplitSpecies(); - Map<Signs, MutableFloat> weightBySign = pupitriCatch.getWeightBySign(); + String speciesStr = speciesDecorator.toString(species); if (splitSpecies) { // create a top batch + a son for each sign if (log.isDebugEnabled()) { - log.debug("Create a categorized batches for species " + speciesDecorator.toString(species)); + log.debug("Create a categorized batches for species " + speciesStr); } SpeciesBatch batch = createSpeciesBatch(operation, @@ -573,11 +496,11 @@ public class PupitriImportService extends AbstractTuttiService { String parentBatchId = batch.getId(); - for (Map.Entry<Signs, MutableFloat> entry : weightBySign.entrySet()) { + for (Signs signs : pupitriSpeciesContext.getSigns()) { + - Signs signs = entry.getKey(); - boolean addMelagComment = pupitriCatch.isAddMelagComment(signs); - float catchWeight = entry.getValue().floatValue(); + boolean addMelagComment = pupitriSpeciesContext.isAddMelagComment(signs); + float catchWeight = pupitriSpeciesContext.getWeight(signs); Integer categoryId = signs.getCategory(); CaracteristicQualitativeValue splitCqv = signsToCaracteristicValue.get(signs); @@ -591,7 +514,7 @@ public class PupitriImportService extends AbstractTuttiService { if (addMelagComment) { childBatch.setComment(melagComment); if (log.isInfoEnabled()) { - log.info("Add melag comment for sign " + signs + " on " + speciesDecorator.toString(species)); + log.info("Add melag comment for sign " + signs + " on " + speciesStr); } } @@ -601,24 +524,22 @@ public class PupitriImportService extends AbstractTuttiService { } else { // create a unique batch with sum all weights as simple weight - if (log.isDebugEnabled()) { - log.debug("Create a unique batch for species " + speciesDecorator.toString(species)); - } - float totalWeight = 0f; - for (MutableFloat weight : weightBySign.values()) { - totalWeight += weight.floatValue(); + float totalWeight = pupitriSpeciesContext.getTotalWeight(); + if (log.isInfoEnabled()) { + log.info("Create a unique batch for species " + speciesStr + " with total weight: " + totalWeight); } + SpeciesBatch batch = createSpeciesBatch(operation, species, totalWeight, PmfmId.SORTED_UNSORTED.getValue(), cqv); - boolean addMelagComment = pupitriCatch.isAddMelagComment(Signs.DEFAULT); + boolean addMelagComment = pupitriSpeciesContext.isAddMelagComment(Signs.DEFAULT); if (addMelagComment) { if (log.isInfoEnabled()) { - log.info("Add melag comment for simple batch " + speciesDecorator.toString(species)); + log.info("Add melag comment for simple batch " + speciesStr); } batch.setComment(melagComment); } @@ -630,79 +551,6 @@ public class PupitriImportService extends AbstractTuttiService { persistenceService.saveCatchBatch(catchBatch); } - public static final Set<Signs> DEFAULT_SIGNS = Sets.newHashSet( - Signs.DEFAULT - ); - - public static final Set<Signs> UNSORTED_SIGNS = Sets.newHashSet( - Signs.UNSORTED - ); - - public static final Set<Signs> SEX_SIGNS = Sets.newHashSet( - Signs.DEFAULT, - Signs.MALE, - Signs.FEMALE - ); - - public static final Set<Signs> SIZE_SIGNS = Sets.newHashSet( - Signs.SMALL, - Signs.MEDIUM, - Signs.BIG - ); - - - /** - * Check that the given species catch can be split. - * For the moment accept for a same catch : - * <ul> - * <li>Signs.DEFAULT, Signs.UNSORTED, Signs.MALE, Signs.FEMALE</li> - * <li>Signs.SMALL, Signs.MEDIUM, Signs.BIG</li> - * </ul> - * See http://forge.codelutin.com/issues/3898 - * - * @param speciesCatch catch to check - * @return {@code true} if species catch is safe, {@code false} otherwise. - * @since 3.0-rc-2 - */ - private boolean isSplitSpecies(PupitriCatch speciesCatch) { - boolean result; - Map<Signs, MutableFloat> weightBySign = speciesCatch.getWeightBySign(); - Set<Signs> signs = Sets.newHashSet(weightBySign.keySet()); - - if (DEFAULT_SIGNS.equals(signs)) { - - // only a default sign, no split - result = false; - } else if (UNSORTED_SIGNS.equals(signs)) { - - // only a unsorted sign, no split - result = false; - } else { - - // remove all sex signs - boolean contains = signs.removeAll(SEX_SIGNS); - if (contains) { - - // check there only sex signs - result = signs.isEmpty(); - } else { - - // remove all size signs - contains = signs.removeAll(SIZE_SIGNS); - if (contains) { - - // check there only size signs - result = signs.isEmpty(); - } else { - - // in all other cases, not a safe - result = false; - } - } - } - return result; - } - protected SpeciesBatch createSpeciesBatch(FishingOperation operation, Species species, Float catchWeight, diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriSignContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriSignContext.java new file mode 100644 index 0000000..6ea15a5 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriSignContext.java @@ -0,0 +1,65 @@ +package fr.ifremer.tutti.service.pupitri; + +import java.io.Serializable; + +/** + * Pour aggreger toutes les lignes lors d'un import pupitri ayant la même tuple (espece - sorted - sign). + * + * Created on 11/22/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.11 + */ +public class PupitriSignContext implements Serializable { + + private static final long serialVersionUID = 1L; + + private final Signs signs; + + private float weight; + + private int nbSmallBox; + + private int nbBigBox; + + public PupitriSignContext(Signs signs) { + this.signs = signs; + } + + public Signs getSigns() { + return signs; + } + + public float getWeight() { + return weight; + } + + public int getNbBigBox() { + return nbBigBox; + } + + public int getNbBox() { + return nbSmallBox + nbBigBox; + } + + public int getNbSmallBox() { + return nbSmallBox; + } + + void incrementNbSmallBox() { + nbSmallBox++; + } + + void incrementNbBigBox() { + nbBigBox++; + } + + void addWeight(float weight) { + this.weight += weight; + } + + public void addNbBoxs(PupitriSignContext otherSignContext) { + nbSmallBox += otherSignContext.getNbSmallBox(); + nbBigBox += otherSignContext.getNbBigBox(); + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriSpeciesContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriSpeciesContext.java new file mode 100644 index 0000000..30dbd99 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriSpeciesContext.java @@ -0,0 +1,285 @@ +package fr.ifremer.tutti.service.pupitri; + +/* + * #%L + * Tutti :: Service + * %% + * Copyright (C) 2012 - 2014 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Pour aggreger toutes les lignes lors d'un import pupitri ayant la même tuple (espece - sorted). + * + * @author kmorin <kmorin@codelutin.com> + * @since 1.2 + */ +public class PupitriSpeciesContext implements Serializable { + + private static final long serialVersionUID = 1L; + + private static final String MELAG_META_SPECIES = "MELA-NGE"; + + private static final String MELAG_2_META_SPECIES = "MELANGE"; + + /** + * All MELAG species. + * + * @since 3.7 + */ + static final Set<String> MELAG_SPECIES = ImmutableSet.copyOf(new String[]{MELAG_META_SPECIES, MELAG_2_META_SPECIES}); + + private static final Set<Signs> DEFAULT_SIGNS = ImmutableSet.copyOf(new Signs[]{Signs.DEFAULT}); + + private static final Set<Signs> UNSORTED_SIGNS = ImmutableSet.copyOf(new Signs[]{Signs.UNSORTED}); + + private static final Set<Signs> SEX_SIGNS = ImmutableSet.copyOf(new Signs[]{Signs.DEFAULT, Signs.MALE, Signs.FEMALE}); + + private static final Set<Signs> SIZE_SIGNS = ImmutableSet.copyOf(new Signs[]{Signs.SMALL, Signs.MEDIUM, Signs.BIG}); + + /** + * Espece du lot. + */ + protected Species species; + + /** + * Is the species is a sorted (VRAC) or unsorted (HORS-VRAC)? + */ + protected boolean sorted; + + /** + * If the species was involved in the melag, fill this flag. + * + * If species has also a {@link Signs#BIG} weight, then the melga weight is imported as a {@link Signs#SMALL} batch. + * Otherwise using the {@link Signs#DEFAULT} sign. + * + * We will look after this sign while crzating species batch to import. + */ + protected Signs melagElevatedSign; + + /** + * Tous les signes utilisés par cette espèce/sorted lors de l'import. + * + * @since 3.11 + */ + protected final Map<Signs, PupitriSignContext> signs; + + public PupitriSpeciesContext(Species species, boolean sorted) { + this.species = species; + this.sorted = sorted; + this.signs = Maps.newHashMap(); + } + + public Species getSpecies() { + return species; + } + + public boolean isSorted() { + return sorted; + } + + public boolean isAddMelagComment(Signs sign) { + return melagElevatedSign != null && melagElevatedSign.equals(sign); + } + + public boolean isForMelag() { + return signs.containsKey(Signs.MELAG); + } + + public boolean isMelagMetaSpecies() { + + boolean melagMetaSpecies = MELAG_SPECIES.contains(species.getSurveyCode()); + return melagMetaSpecies; + + } + + public boolean containsSign(Signs signs) { + return this.signs.containsKey(signs); + } + + public Set<Signs> getSigns() { + return ImmutableSet.copyOf(signs.keySet()); + } + + public float getWeight(Signs signs) { + PupitriSignContext signContext = getSignContext(signs); + return signContext.getWeight(); + + } + + public float getTotalWeight() { + + float totalWeight = 0f; + for (PupitriSignContext signContext : signs.values()) { + float weight = signContext.getWeight(); + totalWeight += weight; + } + + return totalWeight; + + } + + public void addToSignContext(Signs sign, BoxType boxType, Float weight) { + + PupitriSignContext signContext = getOrCreateSignContext(sign); + signContext.addWeight(weight); + switch (boxType) { + case SMALL: + signContext.incrementNbSmallBox(); + break; + case BIG: + signContext.incrementNbBigBox(); + break; + } + + } + + public void setMelagElevatedWeight(Signs melagElevatedSign, Float weight) { + + PupitriSignContext melagContext = getSignContext(Signs.MELAG); + PupitriSignContext pupitriSignContext = getOrCreateSignContext(melagElevatedSign); + pupitriSignContext.addWeight(weight); + //FIXME Check this??? + pupitriSignContext.addNbBoxs(melagContext); + + signs.remove(Signs.MELAG); + this.melagElevatedSign = melagElevatedSign; + + } + + public void moveMelagToDefaultSign() { + + PupitriSignContext melagContext = getSignContext(Signs.MELAG); + + PupitriSignContext defaultSignContext = getOrCreateSignContext(Signs.DEFAULT); + defaultSignContext.addWeight(melagContext.getWeight()); + //FIXME Check this??? + defaultSignContext.addNbBoxs(melagContext); + signs.remove(Signs.MELAG); + + } + + /** + * Check that the given species catch can be split. + * For the moment accept for a same catch : + * <ul> + * <li>Signs.DEFAULT, Signs.UNSORTED, Signs.MALE, Signs.FEMALE</li> + * <li>Signs.SMALL, Signs.MEDIUM, Signs.BIG</li> + * </ul> + * See http://forge.codelutin.com/issues/3898 + * + * @return {@code true} if species catch is safe, {@code false} otherwise. + * @since 3.0-rc-2 + */ + public boolean isSplitSpecies() { + + Set<Signs> allSigns = new HashSet<>(this.signs.keySet()); + + boolean result; + + if (DEFAULT_SIGNS.equals(allSigns)) { + + // only a default sign, no split + result = false; + } else if (UNSORTED_SIGNS.equals(allSigns)) { + + // only a unsorted sign, no split + result = false; + } else { + + // remove all sex signs + boolean contains = allSigns.removeAll(SEX_SIGNS); + if (contains) { + + // check there only sex signs + result = allSigns.isEmpty(); + } else { + + // remove all size signs + contains = allSigns.removeAll(SIZE_SIGNS); + if (contains) { + + // check there only size signs + result = allSigns.isEmpty(); + } else { + + // in all other cases, not a safe + result = false; + } + } + } + return result; + } + + @Override + public int hashCode() { + int speciesHashCode = species != null ? species.hashCode() : 0; + int sortedHashCode = sorted ? 0x55555555 : 0x2AAAAAAA; + return speciesHashCode ^ sortedHashCode; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final PupitriSpeciesContext other = (PupitriSpeciesContext) obj; + if (this.species != other.species && (this.species == null || !this.species.equals(other.species))) { + return false; + } + if (this.sorted != other.sorted) { + return false; + } + return true; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("species", species.getSurveyCode()) + .append("sorted", sorted) + .append("signs", signs) + .toString(); + } + + PupitriSignContext getSignContext(Signs sign) { + return signs.get(sign); + } + + private PupitriSignContext getOrCreateSignContext(Signs sign) { + PupitriSignContext signContext = getSignContext(sign); + if (signContext == null) { + signContext = new PupitriSignContext(sign); + signs.put(sign, signContext); + } + return signContext; + } + +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/CarrouselRow.java similarity index 90% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRow.java rename to tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/CarrouselRow.java index d0d0ced..e2de313 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRow.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/CarrouselRow.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.service.pupitri; +package fr.ifremer.tutti.service.pupitri.csv; /* * #%L @@ -23,6 +23,9 @@ package fr.ifremer.tutti.service.pupitri; */ import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.pupitri.BoxType; +import fr.ifremer.tutti.service.pupitri.Directions; +import fr.ifremer.tutti.service.pupitri.Signs; import org.apache.commons.lang3.time.DateUtils; import java.io.Serializable; @@ -72,6 +75,8 @@ public class CarrouselRow implements Serializable { protected Float weight; + protected BoxType boxType; + public boolean acceptOperation(FishingOperation operation) { return operationCode.equals(operation.getStationNumber()) && DateUtils.isSameDay(date, operation.getGearShootingStartDate()); @@ -137,4 +142,11 @@ public class CarrouselRow implements Serializable { } + public BoxType getBoxType() { + return boxType; + } + + public void setBoxType(BoxType boxType) { + this.boxType = boxType; + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRowModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/CarrouselRowModel.java similarity index 74% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRowModel.java rename to tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/CarrouselRowModel.java index 4816e9c..5a49850 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/CarrouselRowModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/CarrouselRowModel.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.service.pupitri; +package fr.ifremer.tutti.service.pupitri.csv; /* * #%L @@ -23,6 +23,9 @@ package fr.ifremer.tutti.service.pupitri; */ import fr.ifremer.tutti.service.TuttiCsvUtil; +import fr.ifremer.tutti.service.pupitri.BoxType; +import fr.ifremer.tutti.service.pupitri.Directions; +import fr.ifremer.tutti.service.pupitri.Signs; import org.nuiton.csv.Common; import org.nuiton.csv.ValueParser; @@ -52,17 +55,25 @@ public class CarrouselRowModel extends TuttiCsvUtil.ImportModelWithHeader<Carrou } } ); - newMandatoryColumn(CarrouselRow.PROPERTY_DIRECTION, - TuttiCsvUtil.newEnumByNameParserFormatter(Directions.class)); - newMandatoryColumn(CarrouselRow.PROPERTY_WEIGHT, - TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); + newMandatoryColumn(CarrouselRow.PROPERTY_BOX_TYPE, + new ValueParser<BoxType>() { + @Override + public BoxType parse(String value) throws ParseException { + BoxType result = BoxType.getBoxType(value.toUpperCase()); + if (result == null) { + throw new ParseException("Could not parse BoxType value: " + value, 0); + } + return result; + } + }); + newMandatoryColumn(CarrouselRow.PROPERTY_DIRECTION, TuttiCsvUtil.newEnumByNameParserFormatter(Directions.class)); + newMandatoryColumn(CarrouselRow.PROPERTY_WEIGHT, TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); newIgnoredColumn(CarrouselRow.PROPERTY_FILE_ORIGIN); newIgnoredColumn(CarrouselRow.PROPERTY_RIG_NUMBER); newIgnoredColumn(CarrouselRow.PROPERTY_TIME); newIgnoredColumn(CarrouselRow.PROPERTY_BALANCE_ID); newIgnoredColumn(CarrouselRow.PROPERTY_TO_CONFIRM); - newIgnoredColumn(CarrouselRow.PROPERTY_BOX_TYPE); } @Override diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/SpeciesRow.java similarity index 98% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRow.java rename to tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/SpeciesRow.java index 4874d53..fab20ff 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRow.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/SpeciesRow.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.service.pupitri; +package fr.ifremer.tutti.service.pupitri.csv; /* * #%L diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRowModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/SpeciesRowModel.java similarity index 96% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRowModel.java rename to tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/SpeciesRowModel.java index 128692c..d354398 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/SpeciesRowModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/SpeciesRowModel.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.service.pupitri; +package fr.ifremer.tutti.service.pupitri.csv; /* * #%L diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/TrunkRow.java similarity index 96% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRow.java rename to tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/TrunkRow.java index 85d1003..ecba598 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRow.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/TrunkRow.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.service.pupitri; +package fr.ifremer.tutti.service.pupitri.csv; /* * #%L @@ -23,6 +23,7 @@ package fr.ifremer.tutti.service.pupitri; */ import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.pupitri.Directions; import org.apache.commons.lang3.time.DateUtils; import java.io.Serializable; diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRowModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/TrunkRowModel.java similarity index 95% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRowModel.java rename to tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/TrunkRowModel.java index 5d1835a..cc72b2d 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/TrunkRowModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/csv/TrunkRowModel.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.service.pupitri; +package fr.ifremer.tutti.service.pupitri.csv; /* * #%L @@ -23,6 +23,7 @@ package fr.ifremer.tutti.service.pupitri; */ import fr.ifremer.tutti.service.TuttiCsvUtil; +import fr.ifremer.tutti.service.pupitri.Directions; import org.nuiton.csv.Common; /** diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportReportModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/report/PupitriImportReportModel.java similarity index 61% rename from tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportReportModel.java rename to tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/report/PupitriImportReportModel.java index 80f633b..7c49388 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriImportReportModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/report/PupitriImportReportModel.java @@ -1,6 +1,7 @@ -package fr.ifremer.tutti.service.pupitri; +package fr.ifremer.tutti.service.pupitri.report; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.pupitri.PupitriImportResult; import fr.ifremer.tutti.util.Numbers; import fr.ifremer.tutti.util.Weights; @@ -18,78 +19,16 @@ import java.util.List; */ public class PupitriImportReportModel { - public static class PupitriImportReportCatch { - - String speciesCode; - - String speciesName; - - String speciesVernucalCode; - - String sortedWeight; - - String sign; - - String nbBox; - - String nbSmall; - - String nbBig; - - public String getSpeciesCode() { - return speciesCode; - } - - public String getSpeciesName() { - return speciesName; - } - - public String getSpeciesVernucalCode() { - return speciesVernucalCode; - } - - public String getSortedWeight() { - return sortedWeight; - } - - public String getSign() { - return sign; - } - - public String getNbBox() { - return nbBox; - } - - public String getNbSmall() { - return nbSmall; - } - - public String getNbBig() { - return nbBig; - } - } - - public static PupitriImportReportCatch newCatch(String code, - String name, - String vernacularCode, - PupitriCatch pupitriCatch) { - PupitriImportReportCatch result = new PupitriImportReportCatch(); - result.speciesCode = code; - result.speciesName = name; - result.speciesVernucalCode = vernacularCode; - return result; - } - private final FishingOperation operation; private final PupitriImportResult importResult; - private final List<PupitriImportReportCatch> catches; + private final List<PupitriImportReportRow> rows; public PupitriImportReportModel(FishingOperation operation, PupitriImportResult importResult) { this.operation = operation; this.importResult = importResult; - this.catches = new ArrayList<>(); + this.rows = new ArrayList<>(); } public String getStationNumber() { @@ -148,11 +87,11 @@ public class PupitriImportReportModel { return totalWeight; } - public List<PupitriImportReportCatch> getCatches() { - return catches; + public List<PupitriImportReportRow> getRows() { + return rows; } - void addPupitriImportReportCatch(PupitriImportReportCatch aCatch) { - catches.add(aCatch); + public void addRow(PupitriImportReportRow aCatch) { + rows.add(aCatch); } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/report/PupitriImportReportRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/report/PupitriImportReportRow.java new file mode 100644 index 0000000..5aef60e --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/report/PupitriImportReportRow.java @@ -0,0 +1,76 @@ +package fr.ifremer.tutti.service.pupitri.report; + +import fr.ifremer.tutti.service.pupitri.PupitriSignContext; + +/** + * Created on 11/22/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.11 + */ +public class PupitriImportReportRow { + + private String speciesCode; + + private String speciesName; + + private String speciesVernucalCode; + + private String sign; + + private float sortedWeight; + + private int nbBox; + + private int nbSmallBox; + + private int nbBigBox; + + public static PupitriImportReportRow newRow(String code, + String name, + String vernacularCode, + PupitriSignContext signContext) { + PupitriImportReportRow result = new PupitriImportReportRow(); + result.speciesCode = code; + result.speciesName = name; + result.speciesVernucalCode = vernacularCode; + result.sign= signContext.getSigns().getSign(); + result.sortedWeight= signContext.getWeight(); + result.nbBox = signContext.getNbBox(); + result.nbSmallBox = signContext.getNbSmallBox(); + result.nbBigBox = signContext.getNbBigBox(); + return result; + } + + public String getSpeciesCode() { + return speciesCode; + } + + public String getSpeciesName() { + return speciesName; + } + + public String getSpeciesVernucalCode() { + return speciesVernucalCode; + } + + public float getSortedWeight() { + return sortedWeight; + } + + public String getSign() { + return sign; + } + + public int getNbBox() { + return nbBox; + } + + public int getNbSmallBox() { + return nbSmallBox; + } + + public int getNbBigBox() { + return nbBigBox; + } +} diff --git a/tutti-service/src/main/resources/ftl/pupitriReport_fr.ftl b/tutti-service/src/main/resources/ftl/pupitriReport_fr.ftl index 9480cc6..3ea43d8 100644 --- a/tutti-service/src/main/resources/ftl/pupitriReport_fr.ftl +++ b/tutti-service/src/main/resources/ftl/pupitriReport_fr.ftl @@ -44,6 +44,10 @@ text-align: right; } + th.text { + text-align: center; + } + .operationInfo { font-weight: bold; } @@ -61,27 +65,49 @@ <body> <h1>Rapport détaillé du tri des chalutages</h1> +<hr/> <p class='operationInfo'> <span class="label">Station :</span> <span class="value">${stationNumber} - ${fishingOperationNumber}</span> <span class="label">Poche :</span> <span class="value">${multirigAggregation}</span> <span class="label"> du ${gearShootingStartDate?date?string.full} ${gearShootingStartDate?time?string.short} - <#if gearShootingEndDate??>au ${gearShootingEndDate?date?string.full} ${gearShootingEndDate?time?string.short}</#if> + <#if gearShootingEndDate??> + au ${gearShootingEndDate?date?string.full} ${gearShootingEndDate?time?string.short}</#if> </span> </p> +<hr/> -<p class='operationInfo'> - Balance Trunk - <span class="label">Trié :</span> <span class="value"><#if trunkSortedWeight??>${trunkSortedWeight?string("0.00")}</#if></span> - <span class="label">Rejet :</span> <#if trunkRejectedWeight??>${trunkRejectedWeight?string("")}</#if> - <span class="label">Total :</span> <#if trunkTotalWeight??>${trunkTotalWeight?string("0.00")}</#if> -</p> -<p class='operationInfo'> - Balance Caroussel - <span class="label">Vrac :</span> <span class="value"><#if carrouselSortedWeight??>${carrouselSortedWeight?string("0.00")}</#if></span> - <span class="label">Hors Vrac :</span> <#if carrouselUnsortedWeight??>${carrouselUnsortedWeight?string("")}</#if> - <span class="label">Total :</span> <#if carrouselTotalWeight??>${carrouselTotalWeight?string("0.00")}</#if> +<table> + <thead> + <tr> + <th colspan="3" class="text">Balance Trunk</th> + <th colspan="3" class="text">Balance Caroussel</th> + </tr> + <tr> + <th class="text">Trié</th> + <th class="text">Rejet</th> + <th class="text">Total</th> + <th class="text">Vrac</th> + <th class="text">Hors vrac</th> + <th class="text">Total</th> + </tr> + </thead> + <tr> + <td class="number"><#if trunkSortedWeight??>${trunkSortedWeight?string("0.00")}</#if></td> + <td class="number"><#if trunkRejectedWeight??>${trunkRejectedWeight?string("")}</#if></td> + <td class="number"><#if trunkTotalWeight??>${trunkTotalWeight?string("0.00")}</#if></td> + <td class="number"><#if carrouselSortedWeight??>${carrouselSortedWeight?string("0.00")}</#if></td> + <td class="number"><#if carrouselUnsortedWeight??>${carrouselUnsortedWeight?string("")}</#if></td> + <td class="number"><#if carrouselTotalWeight??>${carrouselTotalWeight?string("0.00")}</#if></td> + </tr> +</table> + +<br/> + +<p> + NOTE: Si le rejet est nul, seules les pesées de la balance CAROUSSEL sont prises en compte pour le calcul du poids + total de la capture </p> <h4>Liste du tri "Vrac à trier"</h4> @@ -98,20 +124,19 @@ <th>Grande</th> </tr> - <#--<#list catches?sort_by("sortedWeight")?reverse as catch>--> - <#list catches as catch> - <tr> - <td></td> - <td>${catch.speciesCode}</td> - <td><em>${catch.speciesName}</em></td> - <td><#if catch.speciesVernucalCode??>${catch.speciesVernucalCode}</#if></td> - <td class="number"><#if catch.sortedWeight??>${catch.sortedWeight?string("0.00")}</#if></td> - <td class="number"><#if catch.sortedWeight??>${catch.sign?string("0")}</#if></td> - <td class="number"><#if catch.sortedWeight??>${catch.nbBoxs?string("0")}</#if></td> - <td class="number"><#if catch.sortedWeight??>${catch.nbSmall?string("0")}</#if></td> - <td class="number"><#if catch.sortedWeight??>${catch.nbBig?string("0")}</#if></td> - </tr> - </#list> +<#list rows as row> + <tr> + <td></td> + <td>${row.speciesCode}</td> + <td><em>${row.speciesName}</em></td> + <td><#if row.speciesVernucalCode??>${row.speciesVernucalCode}</#if></td> + <td class="number">${row.sortedWeight}</td> + <td class="number">${row.sign}</td> + <td class="number">${row.nbBox}</td> + <td class="number">${row.nbSmallBox}</td> + <td class="number">${row.nbBigBox}</td> + </tr> +</#list> </table> </body> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.