branch feature/6150 updated (3e89c69 -> 7fdd8e7)
This is an automated email from the git hooks/post-receive script. New change to branch feature/6150 in repository tutti. See http://git.codelutin.com/tutti.git from 3e89c69 refs #6096 renommage variable + methodes new 7fdd8e7 - reorganisation du paquetage pupitri - prise en compte du nombre de caisse (pour le rapport pupitri) The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: 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) Summary of changes: .../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(-) create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/BoxType.java delete mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriCatch.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriSignContext.java create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/PupitriSpeciesContext.java rename tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/{ => csv}/CarrouselRow.java (90%) rename tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/{ => csv}/CarrouselRowModel.java (74%) rename tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/{ => csv}/SpeciesRow.java (98%) rename tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/{ => csv}/SpeciesRowModel.java (96%) rename tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/{ => csv}/TrunkRow.java (96%) rename tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/{ => csv}/TrunkRowModel.java (95%) rename tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/{ => report}/PupitriImportReportModel.java (61%) create mode 100644 tutti-service/src/main/java/fr/ifremer/tutti/service/pupitri/report/PupitriImportReportRow.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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>.
participants (1)
-
codelutin.com scm