This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit 32fbe4dc334d2c3e32b4b3ea6ad79e4fd0b9ffa2 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Nov 16 01:17:59 2014 +0100 fixes #6105 (ajout import/export multipost pour l'écran capture) --- .../service/catches/multipost/CatchBatchRow.java | 70 ++++++++ .../catches/multipost/CatchBatchRowModel.java | 28 +++ .../catches/multipost/MultiPostConstants.java | 34 ++++ .../catches/multipost/MultiPostExportService.java | 81 ++++++--- .../catches/multipost/MultiPostImportService.java | 194 ++++++++++++++++++--- .../filtered-resources/tutti-help-fr.properties | 27 +-- .../action/AbstractExportMultiPostAction.java | 9 +- .../action/AbstractImportMultiPostAction.java | 9 +- .../swing/action/ExportCatchMultiPostAction.java | 63 +++++++ .../swing/action/ImportBenthosMultiPostAction.java | 6 +- .../swing/action/ImportCatchMultiPostAction.java | 99 +++++++++++ .../action/ImportMarineLitterMultiPostAction.java | 6 +- .../swing/action/ImportSpeciesMultiPostAction.java | 6 +- .../content/operation/catches/EditCatchesUI.css | 18 ++ .../content/operation/catches/EditCatchesUI.jaxx | 2 + .../resources/i18n/tutti-ui-swing_en_GB.properties | 23 +++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 18 ++ 17 files changed, 604 insertions(+), 89 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchBatchRow.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchBatchRow.java new file mode 100644 index 0000000..b0b9740 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchBatchRow.java @@ -0,0 +1,70 @@ +package fr.ifremer.tutti.service.catches.multipost; + +/** + * Created on 11/15/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.9 + */ +public class CatchBatchRow extends AbstractFishingOperationRow { + + public static final String CATCH_TOTAL_WEIGHT = "catchTotalWeight"; + + public static final String CATCH_TOTAL_REJECTED_WEIGHT = "catchTotalRejectedWeight"; + + public static final String BENTHOS_TOTAL_SORTED_WEIGHT = "benthosTotalSortedWeight"; + + public static final String SPECIES_TOTAL_SORTED_WEIGHT = "speciesTotalSortedWeight"; + + public static final String MARINE_LITTER_TOTAL_WEIGHT = "marineLitterTotalWeight"; + + protected Float benthosTotalSortedWeight; + + protected Float speciesTotalSortedWeight; + + protected Float catchTotalWeight; + + protected Float catchTotalRejectedWeight; + + protected Float marineLitterTotalWeight; + + public Float getBenthosTotalSortedWeight() { + return benthosTotalSortedWeight; + } + + public void setBenthosTotalSortedWeight(Float benthosTotalSortedWeight) { + this.benthosTotalSortedWeight = benthosTotalSortedWeight; + } + + public Float getSpeciesTotalSortedWeight() { + return speciesTotalSortedWeight; + } + + public void setSpeciesTotalSortedWeight(Float speciesTotalSortedWeight) { + this.speciesTotalSortedWeight = speciesTotalSortedWeight; + } + + public Float getCatchTotalWeight() { + return catchTotalWeight; + } + + public void setCatchTotalWeight(Float catchTotalWeight) { + this.catchTotalWeight = catchTotalWeight; + } + + public Float getCatchTotalRejectedWeight() { + return catchTotalRejectedWeight; + } + + public void setCatchTotalRejectedWeight(Float catchTotalRejectedWeight) { + this.catchTotalRejectedWeight = catchTotalRejectedWeight; + } + + public Float getMarineLitterTotalWeight() { + return marineLitterTotalWeight; + } + + public void setMarineLitterTotalWeight(Float marineLitterTotalWeight) { + this.marineLitterTotalWeight = marineLitterTotalWeight; + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchBatchRowModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchBatchRowModel.java new file mode 100644 index 0000000..786e090 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchBatchRowModel.java @@ -0,0 +1,28 @@ +package fr.ifremer.tutti.service.catches.multipost; + +import fr.ifremer.tutti.service.TuttiCsvUtil; + +/** + * Created on 11/15/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.9 + */ +public class CatchBatchRowModel extends AbstractFishingOperationRowModel<CatchBatchRow> { + + public CatchBatchRowModel(char separator) { + super(separator); + + newColumnForImportExport(CatchBatchRow.CATCH_TOTAL_WEIGHT, TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); + newColumnForImportExport(CatchBatchRow.CATCH_TOTAL_REJECTED_WEIGHT, TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); + newColumnForImportExport(CatchBatchRow.SPECIES_TOTAL_SORTED_WEIGHT, TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); + newColumnForImportExport(CatchBatchRow.BENTHOS_TOTAL_SORTED_WEIGHT, TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); + newColumnForImportExport(CatchBatchRow.MARINE_LITTER_TOTAL_WEIGHT, TuttiCsvUtil.WEIGHT_PARSER_FORMATTER); + + } + + @Override + public CatchBatchRow newEmptyInstance() { + return new CatchBatchRow(); + } +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostConstants.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostConstants.java new file mode 100644 index 0000000..60b41e3 --- /dev/null +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostConstants.java @@ -0,0 +1,34 @@ +package fr.ifremer.tutti.service.catches.multipost; + +/** + * Created on 11/16/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.9 + */ +public interface MultiPostConstants { + + String BATCHES_KEY = "batchesKey"; + + String ATTACHMENTS_DIRECTORY = "attachments"; + + String ATTACHMENTS_FILE = "attachments.csv"; + + String CATCH_BATCH_FILE = "catchBatch.csv"; + + String SPECIES_FILE = "species.csv"; + + String BENTHOS_FILE = "benthos.csv"; + + String MARINE_LITTER_FILE = "marineLitter.csv"; + + String INDIVIDUAL_OBSERVATION_FILE = "individualObservation.csv"; + + String ACCIDENTAL_CATCHES_FILE = "accidentalCatches.csv"; + + String FREQUENCIES_FILE = "frequencies.csv"; + + String CARACTERISTIC_FILE = "caracteristics.csv"; + + String WEIGHTS_FILE = "weights.csv"; +} diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostExportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostExportService.java index feab245..5321623 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostExportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostExportService.java @@ -67,29 +67,7 @@ import static org.nuiton.i18n.I18n.t; * @author tchemit <chemit@codelutin.com> * @since 2.2 */ -public class MultiPostExportService extends AbstractTuttiService { - - public static final String BATCHES_KEY = "batchesKey"; - - protected static final String ATTACHMENTS_DIRECTORY = "attachments"; - - protected static final String ATTACHMENTS_FILE = "attachments.csv"; - - protected static final String SPECIES_FILE = "species.csv"; - - protected static final String BENTHOS_FILE = "benthos.csv"; - - protected static final String MARINE_LITTER_FILE = "marineLitter.csv"; - - protected static final String INDIVIDUAL_OBSERVATION_FILE = "individualObservation.csv"; - - protected static final String ACCIDENTAL_CATCHES_FILE = "accidentalCatches.csv"; - - protected static final String FREQUENCIES_FILE = "frequencies.csv"; - - protected static final String CARACTERISTIC_FILE = "caracteristics.csv"; - - protected static final String WEIGHTS_FILE = "weights.csv"; +public class MultiPostExportService extends AbstractTuttiService implements MultiPostConstants { protected PersistenceService persistenceService; @@ -121,6 +99,39 @@ public class MultiPostExportService extends AbstractTuttiService { } /** + * Export catch batch. + * + * @param file the file to export the batches into + * @param operation the operation to export + */ + public void exportCatchBatch(File file, FishingOperation operation) { + + String operationId = operation.getId(); + if (persistenceService.isFishingOperationWithCatchBatch(operationId)) { + + // export catch batch weights + + CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(operationId); + + CatchBatchRow weights = new CatchBatchRow(); + weights.setCatchTotalWeight(catchBatch.getCatchTotalWeight()); + weights.setCatchTotalRejectedWeight(catchBatch.getCatchTotalRejectedWeight()); + weights.setSpeciesTotalSortedWeight(catchBatch.getSpeciesTotalSortedWeight()); + weights.setBenthosTotalSortedWeight(catchBatch.getBenthosTotalSortedWeight()); + weights.setMarineLitterTotalWeight(catchBatch.getMarineLitterTotalWeight()); + + List<AttachmentRow> attachmentRows = Lists.newArrayList(); + addAttachments(catchBatch.getId(), catchBatch.getIdAsInt(), ObjectTypeCode.CATCH_BATCH, attachmentRows); + + exportOperation(weights, operation); + + exportCatchBatch(file, + weights, + attachmentRows); + } + } + + /** * Export species batches. * * @param file the file to export the batches into @@ -466,6 +477,30 @@ public class MultiPostExportService extends AbstractTuttiService { //-- Internal methods --// //------------------------------------------------------------------------// + protected void exportCatchBatch(File file, + CatchBatchRow weights, + List<AttachmentRow> attachmentRows) { + + CatchBatchRowModel csvModel = new CatchBatchRowModel(CSV_SEPARATOR); + + File directory = Files.createTempDir(); + List<File> file2zip = Lists.newArrayList(); + + File weightsFile = new File(directory, CATCH_BATCH_FILE); + file2zip.add(weightsFile); + export(weightsFile, + csvModel, + Lists.newArrayList(weights), + n("tutti.service.multipost.export.weights.error")); + + // export attachments + create final zip + + exportAttachmentsAndCreateZip(file, + directory, + file2zip, + attachmentRows); + } + protected void exportCatches(File file, String batchFile, CatchWeightsRow weights, diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostImportService.java index 19a54b7..856ec9d 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/MultiPostImportService.java @@ -89,29 +89,7 @@ import static org.nuiton.i18n.I18n.t; * @author kmorin <kmorin@codelutin.com> * @since 2.2 */ -public class MultiPostImportService extends AbstractTuttiService { - - public static final String BATCHES_KEY = "batchesKey"; - - protected static final String ATTACHMENTS_DIRECTORY = "attachments"; - - protected static final String ATTACHMENTS_FILE = "attachments.csv"; - - protected static final String SPECIES_FILE = "species.csv"; - - protected static final String BENTHOS_FILE = "benthos.csv"; - - protected static final String MARINE_LITTER_FILE = "marineLitter.csv"; - - protected static final String INDIVIDUAL_OBSERVATION_FILE = "individualObservation.csv"; - - protected static final String ACCIDENTAL_CATCHES_FILE = "accidentalCatches.csv"; - - protected static final String FREQUENCIES_FILE = "frequencies.csv"; - - protected static final String CARACTERISTIC_FILE = "caracteristics.csv"; - - protected static final String WEIGHTS_FILE = "weights.csv"; +public class MultiPostImportService extends AbstractTuttiService implements MultiPostConstants { protected PersistenceService persistenceService; @@ -143,6 +121,163 @@ public class MultiPostImportService extends AbstractTuttiService { } //------------------------------------------------------------------------// + //-- Import Catch --// + //------------------------------------------------------------------------// + + /** + * Import catch batch from a satellite post + * + * @param file the file to import the batches from + * @param operation the operation in which to add the batches + * @return the list of the catch weight which have not been imported, because there were concurrent batches + */ + public Map<String, Object> importCatchBatch(final File file, + final FishingOperation operation) { + + Callable<Map<String, Object>> call = new Callable<Map<String, Object>>() { + + @Override + public Map<String, Object> call() throws Exception { + + File tempDir = ApplicationIOUtil.explodeZip( + context.getConfig().getTmpDirectory(), + file, + n("tutti.service.multipost.uncompress.error")); + + //check operation + CatchBatchRowModel weightsModel = new CatchBatchRowModel(MultiPostExportService.CSV_SEPARATOR); + checkSameOperation(tempDir, CATCH_BATCH_FILE, weightsModel, operation); + + final Map<String, Object> notImportedData = Maps.newHashMap(); + + // Import weights + CatchBatch catchBatch = importCatchWeights(tempDir, + operation, + weightsModel, + notImportedData); + + // Import attachments + importAttachments(tempDir, + catchBatch.getIdAsInt(), + ObjectTypeCode.CATCH_BATCH); + + + return notImportedData; + } + }; + + Map<String, Object> result = persistenceService.invoke(call); + return result; + } + + protected CatchBatch importCatchWeights(File file, + FishingOperation operation, + CatchBatchRowModel weightsModel, + Map<String, Object> notImportedData) { + Reader reader = ApplicationIOUtil.newReader( + new File(file, CATCH_BATCH_FILE), + n("tutti.service.multipost.import.weights.error")); + + try { + Import<CatchBatchRow> importer = Import.newImport(weightsModel, reader); + + try { + Iterator<CatchBatchRow> iterator = importer.iterator(); + if (iterator.hasNext()) { + CatchBatchRow row = iterator.next(); + CatchBatch catchBatch = persistenceService.getCatchBatchFromFishingOperation(operation.getId()); + catchBatch.setFishingOperation(operation); + + if (catchBatch.getCatchTotalWeight() == null) { + catchBatch.setCatchTotalWeight(row.getCatchTotalWeight()); + + } else if (row.getCatchTotalWeight() != null) { + notImportedData.put(CatchBatch.PROPERTY_CATCH_TOTAL_WEIGHT, row.getCatchTotalWeight()); + } + + if (catchBatch.getCatchTotalRejectedWeight() == null) { + catchBatch.setCatchTotalRejectedWeight(row.getCatchTotalRejectedWeight()); + + } else if (row.getCatchTotalRejectedWeight() != null) { + notImportedData.put(CatchBatch.PROPERTY_CATCH_TOTAL_REJECTED_WEIGHT, row.getCatchTotalRejectedWeight()); + } + + if (catchBatch.getSpeciesTotalSortedWeight() == null) { + catchBatch.setSpeciesTotalSortedWeight(row.getSpeciesTotalSortedWeight()); + + } else if (row.getSpeciesTotalSortedWeight() != null) { + notImportedData.put(CatchBatch.PROPERTY_SPECIES_TOTAL_SORTED_WEIGHT, row.getSpeciesTotalSortedWeight()); + } + + if (catchBatch.getBenthosTotalSortedWeight() == null) { + catchBatch.setBenthosTotalSortedWeight(row.getBenthosTotalSortedWeight()); + + } else if (row.getBenthosTotalSortedWeight() != null) { + notImportedData.put(CatchBatch.PROPERTY_BENTHOS_TOTAL_SORTED_WEIGHT, row.getBenthosTotalSortedWeight()); + } + + if (catchBatch.getMarineLitterTotalWeight() == null) { + catchBatch.setMarineLitterTotalWeight(row.getMarineLitterTotalWeight()); + + } else if (row.getMarineLitterTotalWeight() != null) { + notImportedData.put(CatchBatch.PROPERTY_MARINE_LITTER_TOTAL_WEIGHT, row.getMarineLitterTotalWeight()); + } + + persistenceService.saveCatchBatch(catchBatch); + + return catchBatch; + } + ApplicationIOUtil.close(importer, "Could not close importer"); + } finally { + IOUtils.closeQuietly(importer); + } + ApplicationIOUtil.close(reader, "Could not close reader"); + } finally { + IOUtils.closeQuietly(reader); + } + + return null; + } + + protected void importAttachments(File directory, + Integer catchBatchId, + ObjectTypeCode objectType) { + + Reader reader = ApplicationIOUtil.newReader( + new File(directory, ATTACHMENTS_FILE), + n("tutti.service.multipost.import.attachments.error")); + + try { + AttachmentRowModel attachmentModel = + new AttachmentRowModel(MultiPostExportService.CSV_SEPARATOR, new File(directory, ATTACHMENTS_DIRECTORY)); + Import<AttachmentRow> importer = Import.newImport(attachmentModel, reader); + + try { + for (AttachmentRow row : importer) { + + Attachment attachment = Attachments.newAttachment(); + attachment.setName(row.getName()); + attachment.setComment(row.getComment()); + attachment.setObjectType(objectType); + + attachment.setObjectId(catchBatchId); + + persistenceService.createAttachment(attachment, row.getFile()); + + } + + ApplicationIOUtil.close(importer, "Could not close importer"); + } finally { + IOUtils.closeQuietly(importer); + } + + ApplicationIOUtil.close(reader, "Could not close reader"); + } finally { + IOUtils.closeQuietly(reader); + } + } + + //------------------------------------------------------------------------// //-- Import Species --// //------------------------------------------------------------------------// @@ -168,7 +303,7 @@ public class MultiPostImportService extends AbstractTuttiService { //check operation CatchWeightsRowModel weightsModel = new CatchWeightsRowModel(MultiPostExportService.CSV_SEPARATOR); - checkSameOperation(tempDir, weightsModel, operation); + checkSameOperation(tempDir, WEIGHTS_FILE, weightsModel, operation); final Map<String, Object> notImportedData = Maps.newHashMap(); @@ -438,7 +573,7 @@ public class MultiPostImportService extends AbstractTuttiService { //check operation CatchWeightsRowModel weightsModel = new CatchWeightsRowModel(MultiPostExportService.CSV_SEPARATOR); - checkSameOperation(tempDir, weightsModel, operation); + checkSameOperation(tempDir, WEIGHTS_FILE, weightsModel, operation); Map<String, Object> notImportedData = Maps.newHashMap(); final Map<String, BenthosBatch> notImportedBatches = Maps.newLinkedHashMap(); @@ -701,7 +836,7 @@ public class MultiPostImportService extends AbstractTuttiService { //check operation MarineLitterWeightRowModel weightModel = new MarineLitterWeightRowModel(MultiPostExportService.CSV_SEPARATOR); - checkSameOperation(tempDir, weightModel, operation); + checkSameOperation(tempDir, WEIGHTS_FILE, weightModel, operation); String operationId = operation.getId(); @@ -870,7 +1005,7 @@ public class MultiPostImportService extends AbstractTuttiService { //check operation FishingOperationRowModel operationModel = new FishingOperationRowModel(MultiPostExportService.CSV_SEPARATOR); - checkSameOperation(tempDir, operationModel, operation); + checkSameOperation(tempDir, WEIGHTS_FILE, operationModel, operation); TuttiDataContext dataContext = context.getDataContext(); List<Species> speciesList = dataContext.getReferentSpecies(); @@ -1022,7 +1157,7 @@ public class MultiPostImportService extends AbstractTuttiService { //check operation FishingOperationRowModel operationModel = new FishingOperationRowModel(MultiPostExportService.CSV_SEPARATOR); - checkSameOperation(tempDir, operationModel, operation); + checkSameOperation(tempDir, WEIGHTS_FILE, operationModel, operation); TuttiDataContext dataContext = context.getDataContext(); List<Species> speciesList = dataContext.getReferentSpecies(); @@ -1186,10 +1321,11 @@ public class MultiPostImportService extends AbstractTuttiService { } protected <FO extends AbstractFishingOperationRow> void checkSameOperation(File directory, + String fileName, AbstractFishingOperationRowModel<FO> fishingOperationRowModel, FishingOperation operation) { Reader reader = ApplicationIOUtil.newReader( - new File(directory, WEIGHTS_FILE), + new File(directory, fileName), n("tutti.service.multipost.import.operation.error")); try { diff --git a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties index 1a853d5..ec3237d 100644 --- a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties +++ b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties @@ -1,28 +1,5 @@ -### -# #%L -# Tutti :: UI -# $Id:$ -# $HeadURL:$ -# %% -# 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% -### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Thu Oct 23 12:12:24 CEST 2014 +#Sat Nov 15 23:48:54 CET 2014 tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=editFishingOperation.html\#captureCapturesAccidentellesActions tutti.createAccidentalBatch.action.saveAndClose.help=editFishingOperation.html\#captureCapturesAccidentellesActions @@ -146,6 +123,8 @@ tutti.editCatchBatch.action.exportFishingOperationReport.help=editFishingOperati tutti.editCatchBatch.action.exportFishingOperationReportForSumatra.help=editFishingOperation.html\#captureResumeActions tutti.editCatchBatch.action.exportFishingOperationReportForSumatra2.help=editFishingOperation.html\#captureResumeActions tutti.editCatchBatch.action.exportFishingOperationReportForSumatraV2.help= +tutti.editCatchBatch.action.exportMultiPost.help= +tutti.editCatchBatch.action.importMultiPost.help= tutti.editCatchBatch.action.saveCatchBatch.help=editFishingOperation.html\#captureResumeActions tutti.editCatchBatch.field.benthosTotalSampleSortedWeight.help=editFishingOperation.html\#captureResumeFields tutti.editCatchBatch.field.benthosTotalSortedWeight.help=editFishingOperation.html\#captureResumeFields diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AbstractExportMultiPostAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AbstractExportMultiPostAction.java index f526abc..58b48b8 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AbstractExportMultiPostAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AbstractExportMultiPostAction.java @@ -76,6 +76,11 @@ public abstract class AbstractExportMultiPostAction<M extends AbstractBean, UI e super(handler, false); } + protected EditCatchesUI getEditCatchUI() { + EditCatchesUI catchesUI = getUI().getParentContainer(EditCatchesUI.class); + return catchesUI; + } + @Override public final boolean prepareAction() throws Exception { @@ -83,7 +88,7 @@ public abstract class AbstractExportMultiPostAction<M extends AbstractBean, UI e if (doAction) { - EditCatchesUI catchesUI = getUI().getParentContainer(EditCatchesUI.class); + EditCatchesUI catchesUI = getEditCatchUI(); EditCatchesUIModel model = catchesUI.getModel(); fishingOperation = model.getFishingOperation(); @@ -124,7 +129,7 @@ public abstract class AbstractExportMultiPostAction<M extends AbstractBean, UI e // save catches before export - EditCatchesUI catchesUI = getUI().getParentContainer(EditCatchesUI.class); + EditCatchesUI catchesUI = getEditCatchUI(); getActionEngine().runInternalAction(catchesUI.getHandler(), SaveCatchBatchAction.class); progressionModel.increments("Lancement de l'export"); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AbstractImportMultiPostAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AbstractImportMultiPostAction.java index da4f5c2..f13f877 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AbstractImportMultiPostAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/AbstractImportMultiPostAction.java @@ -93,7 +93,7 @@ public abstract class AbstractImportMultiPostAction<M extends AbstractBean, UI e if (doAction) { - EditCatchesUI catchesUI = getUI().getParentContainer(EditCatchesUI.class); + EditCatchesUI catchesUI = getEditCatchUI(); EditCatchesUIModel model = catchesUI.getModel(); boolean canSave = model.isModify() && model.isValid(); @@ -141,7 +141,7 @@ public abstract class AbstractImportMultiPostAction<M extends AbstractBean, UI e @Override public final void doAction() throws Exception { - EditCatchesUI editCatchesUI = getUI().getParentContainer(EditCatchesUI.class); + EditCatchesUI editCatchesUI = getEditCatchUI(); EditCatchesUIModel editCatchesUIModel = editCatchesUI.getModel(); FishingOperation operation = editCatchesUIModel.getFishingOperation(); @@ -239,4 +239,9 @@ public abstract class AbstractImportMultiPostAction<M extends AbstractBean, UI e } + + protected EditCatchesUI getEditCatchUI() { + EditCatchesUI catchesUI = getUI().getParentContainer(EditCatchesUI.class); + return catchesUI; + } } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ExportCatchMultiPostAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ExportCatchMultiPostAction.java new file mode 100644 index 0000000..6a8f34c --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ExportCatchMultiPostAction.java @@ -0,0 +1,63 @@ +package fr.ifremer.tutti.ui.swing.action; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.catches.multipost.MultiPostExportService; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; + +import java.io.File; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 11/15/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.9 + */ +public class ExportCatchMultiPostAction extends AbstractExportMultiPostAction<EditCatchesUIModel, EditCatchesUI, EditCatchesUIHandler> { + + public ExportCatchMultiPostAction(EditCatchesUIHandler handler) { + super(handler); + } + + @Override + protected EditCatchesUI getEditCatchUI() { + EditCatchesUI catchesUI = getUI(); + return catchesUI; + } + + @Override + protected String getFileExtension() { + return "tuttiCatch"; + } + + @Override + protected String getFileExtensionDescription() { + return t("tutti.common.file.tuttiCatch"); + } + + @Override + protected String getFileChooserTitle() { + return t("tutti.editCatchBatch.action.exportMultiPost.destinationFile.title"); + } + + @Override + protected String getFileChooserButton() { + return t("tutti.editCatchBatch.action.exportMultiPost.destinationFile.button"); + } + + @Override + protected String getSuccessMessage(File file) { + return t("tutti.editCatchBatch.action.exportMultiPost.success", file); + } + + @Override + protected void doExport(MultiPostExportService multiPostImportExportService, File file, FishingOperation fishingOperation) { + + multiPostImportExportService.exportCatchBatch(file, fishingOperation); + + } + +} \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportBenthosMultiPostAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportBenthosMultiPostAction.java index c37a2a1..fbddad2 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportBenthosMultiPostAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportBenthosMultiPostAction.java @@ -82,9 +82,6 @@ public class ImportBenthosMultiPostAction extends AbstractImportMultiPostAction< @Override protected String buildNotImportedDataText(Map<String, Object> notImportedData) { - Collection<BenthosBatch> notImportedBenthosBatches = - (Collection<BenthosBatch>) notImportedData.get(MultiPostImportService.BATCHES_KEY); - StringBuilder builder = new StringBuilder(); Float totalSortedWeight = (Float) notImportedData.get(CatchBatch.PROPERTY_BENTHOS_TOTAL_SORTED_WEIGHT); if (totalSortedWeight != null) { @@ -102,6 +99,9 @@ public class ImportBenthosMultiPostAction extends AbstractImportMultiPostAction< builder.append("- ").append(t("tutti.multiPostImportLog.livingNotItemizedWeight", livingNotItemizedWeight)).append("\n"); } + Collection<BenthosBatch> notImportedBenthosBatches = + (Collection<BenthosBatch>) notImportedData.get(MultiPostImportService.BATCHES_KEY); + for (BenthosBatch sb : notImportedBenthosBatches) { builder.append("- ").append(decorate(sb.getSpecies())).append(" / ").append(decorate(sb.getSampleCategoryValue())).append("\n"); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportCatchMultiPostAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportCatchMultiPostAction.java new file mode 100644 index 0000000..bcbda02 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportCatchMultiPostAction.java @@ -0,0 +1,99 @@ +package fr.ifremer.tutti.ui.swing.action; + +import fr.ifremer.tutti.persistence.entities.data.CatchBatch; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.catches.multipost.MultiPostImportService; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; + +import java.io.File; +import java.util.Map; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 11/15/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.9 + */ +public class ImportCatchMultiPostAction extends AbstractImportMultiPostAction<EditCatchesUIModel, EditCatchesUI, EditCatchesUIHandler> { + + public ImportCatchMultiPostAction(EditCatchesUIHandler handler) { + super(handler); + } + + @Override + protected String getFileExtension() { + return "tuttiCatch"; + } + + @Override + protected String getFileExtensionDescription() { + return t("tutti.common.file.tuttiCatch"); + } + + @Override + protected String getFileChooserTitle() { + return t("tutti.editCatchBatch.action.importMultiPost.sourceFile.title"); + } + + @Override + protected String getFileChooserButton() { + return t("tutti.editCatchBatch.action.importMultiPost.sourceFile.button"); + } + + @Override + protected String getSuccessMessage(File file) { + return t("tutti.editCatchBatch.action.importMultiPost.success", file); + } + + @Override + protected Map<String, Object> importBatches(MultiPostImportService multiPostImportExportService, File file, FishingOperation operation) { + + Map<String, Object> notImportedData = multiPostImportExportService.importCatchBatch(file, operation); + return notImportedData; + + } + + @Override + protected String buildNotImportedDataText(Map<String, Object> notImportedData) { + + StringBuilder builder = new StringBuilder(); + + Float catchTotalWeight = (Float) notImportedData.get(CatchBatch.PROPERTY_CATCH_TOTAL_WEIGHT); + if (catchTotalWeight != null) { + builder.append("- ").append(t("tutti.multiPostImportLog.catchTotalWeight", catchTotalWeight)).append("\n"); + } + + Float catchTotalRejectedWeight = (Float) notImportedData.get(CatchBatch.PROPERTY_CATCH_TOTAL_REJECTED_WEIGHT); + if (catchTotalRejectedWeight != null) { + builder.append("- ").append(t("tutti.multiPostImportLog.catchTotalRejectedWeight", catchTotalRejectedWeight)).append("\n"); + } + + Float speciesTotalSortedWeight = (Float) notImportedData.get(CatchBatch.PROPERTY_SPECIES_TOTAL_SORTED_WEIGHT); + if (speciesTotalSortedWeight != null) { + builder.append("- ").append(t("tutti.multiPostImportLog.speciesTotalSortedWeight", speciesTotalSortedWeight)).append("\n"); + } + + Float benthosTotalSortedWeight = (Float) notImportedData.get(CatchBatch.PROPERTY_BENTHOS_TOTAL_SORTED_WEIGHT); + if (benthosTotalSortedWeight != null) { + builder.append("- ").append(t("tutti.multiPostImportLog.benthosTotalSortedWeight", benthosTotalSortedWeight)).append("\n"); + } + + Float marineLitterTotalWeight = (Float) notImportedData.get(CatchBatch.PROPERTY_MARINE_LITTER_TOTAL_WEIGHT); + if (marineLitterTotalWeight != null) { + builder.append("- ").append(t("tutti.multiPostImportLog.marineLitterTotalWeight", marineLitterTotalWeight)).append("\n"); + } + + return builder.toString(); + + } + + @Override + protected EditCatchesUI getEditCatchUI() { + EditCatchesUI catchesUI = getUI(); + return catchesUI; + } +} \ No newline at end of file diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportMarineLitterMultiPostAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportMarineLitterMultiPostAction.java index 47d73a6..2f9fef6 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportMarineLitterMultiPostAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportMarineLitterMultiPostAction.java @@ -82,15 +82,15 @@ public class ImportMarineLitterMultiPostAction extends AbstractImportMultiPostAc @Override protected String buildNotImportedDataText(Map<String, Object> notImportedData) { - Collection<MarineLitterBatch> notImportedMarineLitterBatches = - (Collection<MarineLitterBatch>) notImportedData.get(MultiPostImportService.BATCHES_KEY); - StringBuilder builder = new StringBuilder(); Float totalWeight = (Float) notImportedData.get(CatchBatch.PROPERTY_MARINE_LITTER_TOTAL_WEIGHT); if (totalWeight != null) { builder.append("- ").append(t("tutti.multiPostImportLog.totalWeight", totalWeight)).append("\n"); } + Collection<MarineLitterBatch> notImportedMarineLitterBatches = + (Collection<MarineLitterBatch>) notImportedData.get(MultiPostImportService.BATCHES_KEY); + for (MarineLitterBatch mlb : notImportedMarineLitterBatches) { builder.append("- ").append(decorate(mlb.getMarineLitterCategory())).append(" / ").append(decorate(mlb.getMarineLitterSizeCategory())).append("\n"); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportSpeciesMultiPostAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportSpeciesMultiPostAction.java index 1d151f4..762a117 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportSpeciesMultiPostAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportSpeciesMultiPostAction.java @@ -84,9 +84,6 @@ public class ImportSpeciesMultiPostAction extends AbstractImportMultiPostAction< StringBuilder builder = new StringBuilder(); - Collection<SpeciesBatch> notImportedSpeciesBatches = - (Collection<SpeciesBatch>) notImportedData.get(MultiPostImportService.BATCHES_KEY); - Float totalSortedWeight = (Float) notImportedData.get(CatchBatch.PROPERTY_SPECIES_TOTAL_SORTED_WEIGHT); if (totalSortedWeight != null) { builder.append("- ").append(t("tutti.multiPostImportLog.totalSortedWeight", totalSortedWeight)).append("\n"); @@ -103,6 +100,9 @@ public class ImportSpeciesMultiPostAction extends AbstractImportMultiPostAction< builder.append("- ").append(t("tutti.multiPostImportLog.livingNotItemizedWeight", livingNotItemizedWeight)).append("\n"); } + Collection<SpeciesBatch> notImportedSpeciesBatches = + (Collection<SpeciesBatch>) notImportedData.get(MultiPostImportService.BATCHES_KEY); + for (SpeciesBatch sb : notImportedSpeciesBatches) { builder.append("- ").append(decorate(sb.getSpecies())).append(" / ").append(decorate(sb.getSampleCategoryValue())).append("\n"); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css index 5b9de8e..fe28775 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css @@ -361,6 +361,24 @@ ComputableDataEditor { _help: {"tutti.editCatchBatch.action.exportFishingOperationReportForSumatra.help"}; } +#importMultiPostButton { + actionIcon: import; + text: "tutti.editCatchBatch.action.importMultiPost"; + toolTipText: "tutti.editCatchBatch.action.importMultiPost.tip"; + i18nMnemonic: "tutti.editCatchBatch.action.importMultiPost.mnemonic"; + _applicationAction: {fr.ifremer.tutti.ui.swing.action.ImportCatchMultiPostAction.class}; + _help: {"tutti.editCatchBatch.action.importMultiPost.help"}; +} + +#exportMultiPostButton { + actionIcon: export; + text: "tutti.editCatchBatch.action.exportMultiPost"; + toolTipText: "tutti.editCatchBatch.action.exportMultiPost.tip"; + i18nMnemonic: "tutti.editCatchBatch.action.exportMultiPost.mnemonic"; + _applicationAction: {fr.ifremer.tutti.ui.swing.action.ExportCatchMultiPostAction.class}; + _help: {"tutti.editCatchBatch.action.exportMultiPost.help"}; +} + #saveButton { actionIcon: save; text: "tutti.editCatchBatch.action.saveCatchBatch"; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.jaxx index 303b136..f1449ce 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.jaxx @@ -102,6 +102,8 @@ public EditCatchesUI(FishingOperationsUI parentUI) { <JToolBar id='catchesCaracteristicsTabToolBar'> <JButton id='exportFishingOperationReportButton'/> <JButton id='exportFishingOperationReportForSumatraButton'/> + <JButton id='importMultiPostButton'/> + <JButton id='exportMultiPostButton'/> <ButtonAttachment id='catchesCaracteristicsAttachmentsButton' constructorParams='getHandler().getContext(), getModel()'/> </JToolBar> diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 6469321..1be41be 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -94,6 +94,7 @@ tutti.common.file.pdf= tutti.common.file.protocol= tutti.common.file.tuttiAccidental= tutti.common.file.tuttiBenthos= +tutti.common.file.tuttiCatch= tutti.common.file.tuttiIndividualObservation= tutti.common.file.tuttiMarineLitter= tutti.common.file.tuttiSpecies= @@ -569,6 +570,18 @@ tutti.editCatchBatch.action.exportFishingOperationReportForSumatra.tip= tutti.editCatchBatch.action.exportFishingOperationReportForSumatraV2= tutti.editCatchBatch.action.exportFishingOperationReportForSumatraV2.mnemonic= tutti.editCatchBatch.action.exportFishingOperationReportForSumatraV2.tip= +tutti.editCatchBatch.action.exportMultiPost= +tutti.editCatchBatch.action.exportMultiPost.destinationFile.button= +tutti.editCatchBatch.action.exportMultiPost.destinationFile.title= +tutti.editCatchBatch.action.exportMultiPost.mnemonic= +tutti.editCatchBatch.action.exportMultiPost.success= +tutti.editCatchBatch.action.exportMultiPost.tip= +tutti.editCatchBatch.action.importMultiPost= +tutti.editCatchBatch.action.importMultiPost.mnemonic= +tutti.editCatchBatch.action.importMultiPost.sourceFile.button= +tutti.editCatchBatch.action.importMultiPost.sourceFile.title= +tutti.editCatchBatch.action.importMultiPost.success= +tutti.editCatchBatch.action.importMultiPost.tip= tutti.editCatchBatch.action.saveCatchBatch= tutti.editCatchBatch.action.saveCatchBatch.mnemonic= tutti.editCatchBatch.action.saveCatchBatch.tip= @@ -1518,12 +1531,22 @@ tutti.message.openReplaceTemporaryUI.noSource= tutti.message.openReplaceTemporaryUI.noTarget= tutti.message.openReplaceTemporaryVesselUI.noSource= tutti.message.openReplaceTemporaryVesselUI.noTarget= +tutti.multiPostImportLog.benthosInertWeight= +tutti.multiPostImportLog.benthosLivingNotItemizedWeight= +tutti.multiPostImportLog.benthosTotalComputedWeight= +tutti.multiPostImportLog.benthosTotalSortedWeight= +tutti.multiPostImportLog.catchTotalRejectedWeight= +tutti.multiPostImportLog.catchTotalWeight= tutti.multiPostImportLog.close= tutti.multiPostImportLog.close.mnemonic= tutti.multiPostImportLog.close.tip= tutti.multiPostImportLog.inertWeight= tutti.multiPostImportLog.livingNotItemizedWeight= +tutti.multiPostImportLog.marineLitterTotalWeight= tutti.multiPostImportLog.message= +tutti.multiPostImportLog.speciesInertWeight= +tutti.multiPostImportLog.speciesLivingNotItemizedWeight= +tutti.multiPostImportLog.speciesTotalSortedWeight= tutti.multiPostImportLog.title= tutti.multiPostImportLog.totalSortedWeight= tutti.multiPostImportLog.totalWeight= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index 8260850..e8d0475 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -83,6 +83,7 @@ tutti.common.file.pdf=Extension d'un fichier pdf tutti.common.file.protocol=Extension d'un fichier de protocole Tutti tutti.common.file.tuttiAccidental=Fichier d'import/export des lots de captures accidentelles tutti.common.file.tuttiBenthos=Fichier d'import/export des lots de benthos +tutti.common.file.tuttiCatch=Fichier d'import/export des poids de capture tutti.common.file.tuttiIndividualObservation=Fichier d'import/export des lots d'observations individuelles tutti.common.file.tuttiMarineLitter=Fichier d'import/export des lots de déchets tutti.common.file.tuttiSpecies=Fichier d'import/export des lots d'espèces @@ -553,6 +554,18 @@ tutti.editCatchBatch.action.exportFishingOperationReport.tip=Envoyer le résumé tutti.editCatchBatch.action.exportFishingOperationReportForSumatra=Résumé Csv tutti.editCatchBatch.action.exportFishingOperationReportForSumatra.mnemonic=u tutti.editCatchBatch.action.exportFishingOperationReportForSumatra.tip=Exporter le résumé au format csv du trait sélectionnée +tutti.editCatchBatch.action.exportMultiPost=Exporter les poids de la capture +tutti.editCatchBatch.action.exportMultiPost.destinationFile.button=Choisir le fichier pour l'export +tutti.editCatchBatch.action.exportMultiPost.destinationFile.title=Exporter les poids de la capture +tutti.editCatchBatch.action.exportMultiPost.mnemonic=E +tutti.editCatchBatch.action.exportMultiPost.success=Les poids de la capture ont été exportés dans le fichier %s +tutti.editCatchBatch.action.exportMultiPost.tip=Exporter les poids de la capture pour les importer sur le poste maître +tutti.editCatchBatch.action.importMultiPost=Importer les poids de la capture +tutti.editCatchBatch.action.importMultiPost.mnemonic=I +tutti.editCatchBatch.action.importMultiPost.sourceFile.button=Choisir le fichier à importer +tutti.editCatchBatch.action.importMultiPost.sourceFile.title=Importer les poids de la capture +tutti.editCatchBatch.action.importMultiPost.success=Des poids de la captures ont été importés depuis le fichier %s +tutti.editCatchBatch.action.importMultiPost.tip=Importer des poids de la capture créés sur un poste satellite tutti.editCatchBatch.action.saveCatchBatch=Enregistrer tutti.editCatchBatch.action.saveCatchBatch.mnemonic=S tutti.editCatchBatch.action.saveCatchBatch.tip=Enregistrer la capture @@ -1461,12 +1474,17 @@ tutti.manageTemporaryReferential.title.choose.importTemporarySpeciesFile=Importe tutti.manageTemporaryReferential.title.choose.importTemporaryVesselFile=Importer un référentiel Navire tutti.message.openReplaceTemporaryUI.noSource=Aucun référentiel de type %s temporaire détecté dans la base. tutti.message.openReplaceTemporaryUI.noTarget=Aucun référentiel de type %s officiel détecté dans la base. +tutti.multiPostImportLog.benthosTotalSortedWeight=Poids total VRAC (Benthos) \: %s kg +tutti.multiPostImportLog.catchTotalRejectedWeight=Poids total NON TRIÉ(Capture) \: %s kg +tutti.multiPostImportLog.catchTotalWeight=Poids TOTAL (Capture) \: %s kg tutti.multiPostImportLog.close=Fermer tutti.multiPostImportLog.close.mnemonic=F tutti.multiPostImportLog.close.tip=Fermer la popup tutti.multiPostImportLog.inertWeight=Poids inerte trié \: %s kg tutti.multiPostImportLog.livingNotItemizedWeight=Poids vivant non détaillé \: %s kg +tutti.multiPostImportLog.marineLitterTotalWeight=Poids total (Macro-déchet) \: %s kg tutti.multiPostImportLog.message=Des données n'ont pas été importées car ces données avaient déjà été saisies \: +tutti.multiPostImportLog.speciesTotalSortedWeight=Poids total VRAC (Espèce) \: %s kg tutti.multiPostImportLog.title=Lots non importés tutti.multiPostImportLog.totalSortedWeight=Poids total trié \: %s kg tutti.multiPostImportLog.totalWeight=Poids total \: %s kg -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.