r927 - in trunk: tutti-service/src/main/java/fr/ifremer/tutti/service/catches tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost tutti-service/src/main/resources/i18n tutti-ui-swing/src/main/filtered-resources tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/co
Author: kmorin Date: 2013-05-07 16:13:08 +0200 (Tue, 07 May 2013) New Revision: 927 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/927 Log: refs #1873 [IMP/EXP] - Import/Export multi-postes Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRow.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRow.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRowModel.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/TuttiMultiPostImportExportService.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ExportMultiPostAction.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportMultiPostAction.java Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/accidental/AccidentalBatchUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/accidental/AccidentalBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/marinelitter/MarineLitterBatchUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/marinelitter/MarineLitterBatchUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRow.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRow.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRow.java 2013-05-07 14:13:08 UTC (rev 927) @@ -0,0 +1,72 @@ +package fr.ifremer.tutti.service.catches.multipost; + +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; + +import java.io.Serializable; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.2 + */ +public class CatchFrequencyRow implements Serializable { + + public static final String BATCH_ID = "batchId"; + + public static final String FREQUENCY_LENGTH_STEP_CARACTERISTIC = "lengthStepCaracteristic"; + + public static final String FREQUENCY_LENGTH_STEP = "lengthStep"; + + public static final String FREQUENCY_WEIGHT = "weight"; + + public static final String FREQUENCY_NUMBER = "number"; + + protected String batchId; + + protected Caracteristic lengthStepCaracteristic; + + protected Float lengthStep; + + protected Float weight; + + protected Integer number; + + public String getBatchId() { + return batchId; + } + + public void setBatchId(String batchId) { + this.batchId = batchId; + } + + public Caracteristic getLengthStepCaracteristic() { + return lengthStepCaracteristic; + } + + public void setLengthStepCaracteristic(Caracteristic lengthStepCaracteristic) { + this.lengthStepCaracteristic = lengthStepCaracteristic; + } + + public Float getLengthStep() { + return lengthStep; + } + + public void setLengthStep(Float lengthStep) { + this.lengthStep = lengthStep; + } + + public Float getWeight() { + return weight; + } + + public void setWeight(Float weight) { + this.weight = weight; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } +} Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRowModel.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRowModel.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchFrequencyRowModel.java 2013-05-07 14:13:08 UTC (rev 927) @@ -0,0 +1,47 @@ +package fr.ifremer.tutti.service.catches.multipost; + +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.service.TuttiCsvUtil; +import org.nuiton.util.csv.ValueFormatter; + +import java.io.Serializable; + +/** + * Model of a catch export. + * + * @author kmorin <morin@codelutin.com> + * @since 2.2 + */ +public class CatchFrequencyRowModel extends TuttiCsvUtil.AbstractTuttiExportModel<CatchFrequencyRow> { + + public CatchFrequencyRowModel(char separator) { + super(separator); + + newColumnForExport(CatchFrequencyRow.BATCH_ID, + CatchFrequencyRow.BATCH_ID); + + newColumnForExport(CatchFrequencyRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC, + CatchFrequencyRow.FREQUENCY_LENGTH_STEP_CARACTERISTIC, + new ValueFormatter<Caracteristic>() { + @Override + public String format(Caracteristic value) { + return value != null ? value.getId() : ""; + } + }); + + newColumnForExport(CatchFrequencyRow.FREQUENCY_LENGTH_STEP, + CatchFrequencyRow.FREQUENCY_LENGTH_STEP, + TuttiCsvUtil.FLOAT); + + newColumnForExport(CatchFrequencyRow.FREQUENCY_NUMBER, + CatchFrequencyRow.FREQUENCY_NUMBER, + TuttiCsvUtil.INTEGER); + + newColumnForExport(CatchFrequencyRow.FREQUENCY_WEIGHT, + CatchFrequencyRow.FREQUENCY_WEIGHT, + TuttiCsvUtil.FLOAT); + + } +} \ No newline at end of file Copied: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRow.java (from rev 919, trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/CatchExportRow.java) =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRow.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRow.java 2013-05-07 14:13:08 UTC (rev 927) @@ -0,0 +1,168 @@ +package fr.ifremer.tutti.service.catches.multipost; + +import com.google.common.collect.Maps; +import fr.ifremer.tutti.persistence.entities.data.*; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Gear; +import fr.ifremer.tutti.persistence.entities.referential.Species; +import fr.ifremer.tutti.persistence.entities.referential.Vessel; +import fr.ifremer.tutti.service.export.ExportSampleCategory; + +import java.io.Serializable; +import java.util.Date; +import java.util.Map; + +/** + * A row in a catch export. + * + * @author kmorin <morin@codelutin.com> + * @since 2.2 + */ +public class CatchRow implements Serializable { + + private static final long serialVersionUID = 1L; + + public static final String ID = "id"; + + public static final String SPECIES = "species"; + + public static final String SORTED_UNSORTED_SAMPLE_CATEGORY = "sortedUnsortedSampleCategory"; + + public static final String SIZE_SAMPLE_CATEGORY = "sizeSampleCategory"; + + public static final String SEX_SAMPLE_CATEGORY = "sexSampleCategory"; + + public static final String MATURITY_SAMPLE_CATEGORY = "maturitySampleCategory"; + + public static final String AGE_SAMPLE_CATEGORY = "ageSampleCategory"; + + public static final String CATEGORY_WEIGHT = "categoryWeight"; + + public static final String WEIGHT = "weight"; + + public static final String NUMBER = "number"; + + public static final String COMMENT = "comment"; + + public static final String TO_CONFIRM = "toConfirm"; + + protected String id; + + protected Species species; + + protected Serializable sortedUnsortedSampleCategory; + + protected Serializable sizeSampleCategory; + + protected Serializable sexSampleCategory; + + protected Serializable maturitySampleCategory; + + protected Serializable ageSampleCategory; + + protected Float categoryWeight; + + protected Float weight; + + protected Integer number; + + protected String comment; + + protected boolean toConfirm; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Species getSpecies() { + return species; + } + + public void setSpecies(Species species) { + this.species = species; + } + + public Serializable getSortedUnsortedSampleCategory() { + return sortedUnsortedSampleCategory; + } + + public void setSortedUnsortedSampleCategory(Serializable sortedUnsortedSampleCategory) { + this.sortedUnsortedSampleCategory = sortedUnsortedSampleCategory; + } + + public Serializable getSizeSampleCategory() { + return sizeSampleCategory; + } + + public void setSizeSampleCategory(Serializable sizeSampleCategory) { + this.sizeSampleCategory = sizeSampleCategory; + } + + public Serializable getSexSampleCategory() { + return sexSampleCategory; + } + + public void setSexSampleCategory(Serializable sexSampleCategory) { + this.sexSampleCategory = sexSampleCategory; + } + + public Serializable getMaturitySampleCategory() { + return maturitySampleCategory; + } + + public void setMaturitySampleCategory(Serializable maturitySampleCategory) { + this.maturitySampleCategory = maturitySampleCategory; + } + + public Serializable getAgeSampleCategory() { + return ageSampleCategory; + } + + public void setAgeSampleCategory(Serializable ageSampleCategory) { + this.ageSampleCategory = ageSampleCategory; + } + + public Float getCategoryWeight() { + return categoryWeight; + } + + public void setCategoryWeight(Float categoryWeight) { + this.categoryWeight = categoryWeight; + } + + public Float getWeight() { + return weight; + } + + public void setWeight(Float weight) { + this.weight = weight; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public boolean isToConfirm() { + return toConfirm; + } + + public void setToConfirm(boolean toConfirm) { + this.toConfirm = toConfirm; + } +} \ No newline at end of file Property changes on: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRow.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Copied: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRowModel.java (from rev 919, trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/export/CatchExportModel.java) =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRowModel.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRowModel.java 2013-05-07 14:13:08 UTC (rev 927) @@ -0,0 +1,94 @@ +package fr.ifremer.tutti.service.catches.multipost; + +import fr.ifremer.tutti.persistence.entities.data.*; +import fr.ifremer.tutti.persistence.entities.referential.*; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.TuttiCsvUtil; +import fr.ifremer.tutti.service.export.ExportSampleCategory; +import org.apache.commons.collections.CollectionUtils; +import org.nuiton.util.csv.ValueFormatter; + +import java.io.Serializable; +import java.util.List; + +/** + * Model of a catch export. + * + * @author kmorin <morin@codelutin.com> + * @since 2.2 + */ +public class CatchRowModel extends TuttiCsvUtil.AbstractTuttiExportModel<CatchRow> { + + public CatchRowModel(char separator) { + super(separator); + + ValueFormatter<Serializable> caracteristicValueFormatter = new ValueFormatter<Serializable>() { + @Override + public String format(Serializable value) { + String result = ""; + if (value != null) { + if (CaracteristicQualitativeValue.class.isAssignableFrom(value.getClass())) { + CaracteristicQualitativeValue cqv = (CaracteristicQualitativeValue) value; + result = cqv.getId(); + + } else { + result = String.valueOf(value); + } + } + return result; + } + }; + + newColumnForExport(CatchRow.ID, + CatchRow.ID); + + newColumnForExport(CatchRow.SPECIES, + CatchRow.SPECIES, + new ValueFormatter<Species>() { + @Override + public String format(Species value) { + return value != null ? String.valueOf(value.getReferenceTaxonId()) : null; + } + }); + + newColumnForExport(CatchRow.SORTED_UNSORTED_SAMPLE_CATEGORY, + CatchRow.SORTED_UNSORTED_SAMPLE_CATEGORY, + caracteristicValueFormatter); + + newColumnForExport(CatchRow.SIZE_SAMPLE_CATEGORY, + CatchRow.SIZE_SAMPLE_CATEGORY, + caracteristicValueFormatter); + + newColumnForExport(CatchRow.SEX_SAMPLE_CATEGORY, + CatchRow.SEX_SAMPLE_CATEGORY, + caracteristicValueFormatter); + + newColumnForExport(CatchRow.MATURITY_SAMPLE_CATEGORY, + CatchRow.MATURITY_SAMPLE_CATEGORY, + caracteristicValueFormatter); + + newColumnForExport(CatchRow.AGE_SAMPLE_CATEGORY, + CatchRow.AGE_SAMPLE_CATEGORY, + caracteristicValueFormatter); + + newColumnForExport(CatchRow.CATEGORY_WEIGHT, + CatchRow.CATEGORY_WEIGHT, + TuttiCsvUtil.FLOAT); + + newColumnForExport(CatchRow.WEIGHT, + CatchRow.WEIGHT, + TuttiCsvUtil.FLOAT); + + newColumnForExport(CatchRow.NUMBER, + CatchRow.NUMBER, + TuttiCsvUtil.INTEGER); + + newColumnForExport(CatchRow.COMMENT, + CatchRow.COMMENT); + + newColumnForExport(CatchRow.TO_CONFIRM, + CatchRow.TO_CONFIRM, + TuttiCsvUtil.PRIMITIVE_BOOLEAN); + + } +} \ No newline at end of file Property changes on: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/CatchRowModel.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/TuttiMultiPostImportExportService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/TuttiMultiPostImportExportService.java (rev 0) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/multipost/TuttiMultiPostImportExportService.java 2013-05-07 14:13:08 UTC (rev 927) @@ -0,0 +1,267 @@ +package fr.ifremer.tutti.service.catches.multipost; + +import com.google.common.base.Charsets; +import com.google.common.collect.Lists; +import com.google.common.io.Files; +import fr.ifremer.tutti.TuttiTechnicalException; +import fr.ifremer.tutti.persistence.entities.TuttiEntities; +import fr.ifremer.tutti.persistence.entities.data.*; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; +import fr.ifremer.tutti.service.AbstractTuttiService; +import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.TuttiServiceContext; +import fr.ifremer.tutti.service.catches.TuttiWeightComputingService; +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.FileUtil; +import org.nuiton.util.ZipUtil; +import org.nuiton.util.csv.Export; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static org.nuiton.i18n.I18n._; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.2 + */ +public class TuttiMultiPostImportExportService extends AbstractTuttiService { + + private static final Log log = + LogFactory.getLog(TuttiMultiPostImportExportService.class); + + protected PersistenceService persistenceService; + + protected DecoratorService decoratorService; + + protected char csvSeparator; + + protected List<SampleCategoryEnum> samplingOrder; + + @Override + public void setServiceContext(TuttiServiceContext context) { + super.setServiceContext(context); + persistenceService = getService(PersistenceService.class); + decoratorService = getService(DecoratorService.class); + + csvSeparator = context.getConfig().getCsvSeparator(); + + Map<Integer, SampleCategoryEnum> idMapping = SampleCategoryEnum.toIdMapping(); + + samplingOrder = Lists.newArrayList(); + + // always first sampling category + samplingOrder.add(SampleCategoryEnum.sortedUnsorted); + + for (Integer categoryId : context.getConfig().getSamplingOrderIds()) { + SampleCategoryEnum categoryEnum = idMapping.get(categoryId); + if (SampleCategoryEnum.sortedUnsorted != categoryEnum) { + samplingOrder.add(categoryEnum); + } + } + } + + public void exportSpecies(File file, FishingOperation operation) { + CatchRowModel csvModel = new CatchRowModel(csvSeparator); + CatchFrequencyRowModel csvFrequencyModel = new CatchFrequencyRowModel(csvSeparator); + + BatchContainer<SpeciesBatch> speciesBatchContainer = + persistenceService.getRootSpeciesBatch(operation.getId()); + + List<CatchRow> rows = Lists.newArrayList(); + List<CatchFrequencyRow> frequencyRows = Lists.newArrayList(); + + for (SpeciesBatch batch : speciesBatchContainer.getChildren()) { + createSpeciesRow(batch, rows, frequencyRows); + } + + BufferedWriter writer = null; + File directory = Files.createTempDir(); + + File speciesFile = new File(directory, "species.csv"); + try { + writer = Files.newWriter(speciesFile, Charsets.UTF_8); + Export export = Export.newExport(csvModel, rows); + export.write(writer); + writer.close(); + } catch (Exception e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.export.error", file), e); + } finally { + IOUtils.closeQuietly(writer); + } + + File frequencyFile = new File(directory, "frequencies.csv"); + try { + writer = Files.newWriter(frequencyFile, Charsets.UTF_8); + Export export = Export.newExport(csvFrequencyModel, frequencyRows); + export.write(writer); + writer.close(); + + } catch (Exception e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.export.frequencies.error", frequencyFile), e); + } finally { + IOUtils.closeQuietly(writer); + } + + try { + ZipUtil.compressFiles(file, directory, Lists.newArrayList(speciesFile, frequencyFile)); + + } catch (IOException e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.export.error", file), e); + } + } + + protected void createSpeciesRow(SpeciesBatch batch, List<CatchRow> rows, List<CatchFrequencyRow> frequencyRows) { + CatchRow row = new CatchRow(); + + String id = UUID.randomUUID().toString(); + row.setId(id); + + row.setSpecies(batch.getSpecies()); + + switch (batch.getSampleCategoryType()) { + case sortedUnsorted: + row.setSortedUnsortedSampleCategory(batch.getSampleCategoryValue()); + break; + case sex: + row.setSexSampleCategory(batch.getSampleCategoryValue()); + break; + case size: + row.setSizeSampleCategory(batch.getSampleCategoryValue()); + break; + case maturity: + row.setMaturitySampleCategory(batch.getSampleCategoryValue()); + break; + case age: + row.setAgeSampleCategory(batch.getSampleCategoryValue()); + break; + } + row.setCategoryWeight(batch.getSampleCategoryWeight()); + row.setWeight(batch.getWeight()); + row.setNumber(batch.getNumber()); + row.setComment(batch.getComment()); + row.setToConfirm(batch.isSpeciesToConfirm()); + + rows.add(row); + + List<SpeciesBatchFrequency> frequencies = + persistenceService.getAllSpeciesBatchFrequency(batch.getId()); + for (SpeciesBatchFrequency frequency : frequencies) { + CatchFrequencyRow frequencyRow = new CatchFrequencyRow(); + frequencyRow.setBatchId(id); + frequencyRow.setLengthStepCaracteristic(frequency.getLengthStepCaracteristic()); + frequencyRow.setLengthStep(frequency.getLengthStep()); + frequencyRow.setNumber(frequency.getNumber()); + frequencyRow.setWeight(frequency.getWeight()); + frequencyRows.add(frequencyRow); + } + + for (SpeciesBatch child : batch.getChildBatchs()) { + createSpeciesRow(child, rows, frequencyRows); + } + } + + public void exportBenthos(File file, FishingOperation operation) { + CatchRowModel csvModel = new CatchRowModel(csvSeparator); + CatchFrequencyRowModel csvFrequencyModel = new CatchFrequencyRowModel(csvSeparator); + + BatchContainer<BenthosBatch> benthosBatchContainer = + persistenceService.getRootBenthosBatch(operation.getId()); + + List<CatchRow> rows = Lists.newArrayList(); + List<CatchFrequencyRow> frequencyRows = Lists.newArrayList(); + + for (BenthosBatch batch : benthosBatchContainer.getChildren()) { + createBenthosRow(batch, rows, frequencyRows); + } + + BufferedWriter writer = null; + File directory = Files.createTempDir(); + + File benthosFile = new File(directory, "benthos.csv"); + try { + writer = Files.newWriter(benthosFile, Charsets.UTF_8); + Export export = Export.newExport(csvModel, rows); + export.write(writer); + writer.close(); + } catch (Exception e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.export.error", file), e); + } finally { + IOUtils.closeQuietly(writer); + } + + File frequencyFile = new File(directory, "frequencies.csv"); + try { + writer = Files.newWriter(frequencyFile, Charsets.UTF_8); + Export export = Export.newExport(csvFrequencyModel, frequencyRows); + export.write(writer); + writer.close(); + + } catch (Exception e) { + throw new TuttiTechnicalException(_("tutti.service.multipost.export.frequencies.error", frequencyFile), e); + } finally { + IOUtils.closeQuietly(writer); + } + + compressZipFile(file, directory); + + } + + protected void createBenthosRow(BenthosBatch batch, List<CatchRow> rows, List<CatchFrequencyRow> frequencyRows) { + CatchRow row = new CatchRow(); + + String id = UUID.randomUUID().toString(); + row.setId(id); + + row.setSpecies(batch.getSpecies()); + + switch (batch.getSampleCategoryType()) { + case sortedUnsorted: + row.setSortedUnsortedSampleCategory(batch.getSampleCategoryValue()); + break; + case sex: + row.setSexSampleCategory(batch.getSampleCategoryValue()); + break; + case size: + row.setSizeSampleCategory(batch.getSampleCategoryValue()); + break; + case maturity: + row.setMaturitySampleCategory(batch.getSampleCategoryValue()); + break; + case age: + row.setAgeSampleCategory(batch.getSampleCategoryValue()); + break; + } + row.setCategoryWeight(batch.getSampleCategoryWeight()); + row.setWeight(batch.getWeight()); + row.setNumber(batch.getNumber()); + row.setComment(batch.getComment()); + row.setToConfirm(batch.isSpeciesToConfirm()); + + rows.add(row); + + List<SpeciesBatchFrequency> frequencies = + persistenceService.getAllSpeciesBatchFrequency(batch.getId()); + for (SpeciesBatchFrequency frequency : frequencies) { + CatchFrequencyRow frequencyRow = new CatchFrequencyRow(); + frequencyRow.setBatchId(id); + frequencyRow.setLengthStepCaracteristic(frequency.getLengthStepCaracteristic()); + frequencyRow.setLengthStep(frequency.getLengthStep()); + frequencyRow.setNumber(frequency.getNumber()); + frequencyRow.setWeight(frequency.getWeight()); + frequencyRows.add(frequencyRow); + } + + for (BenthosBatch child : batch.getChildBatchs()) { + createBenthosRow(child, rows, frequencyRows); + } + } +} Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties 2013-05-07 14:13:08 UTC (rev 927) @@ -82,6 +82,7 @@ tutti.service.exportSumatra.header.station= tutti.service.exportSumatra.header.weight= tutti.service.mkDir.error= +tutti.service.multipost.export.error= tutti.service.operations.accidental.error.species.required= tutti.service.operations.computeWeights.benthos.error.incoherentCategoryWeight= tutti.service.operations.computeWeights.benthos.error.incoherentParentCategoryWeight= Modified: trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties =================================================================== --- trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties 2013-05-07 14:13:08 UTC (rev 927) @@ -80,6 +80,7 @@ tutti.service.exportSumatra.header.station=Station tutti.service.exportSumatra.header.weight=Total tutti.service.mkDir.error=Erreur à la création du dossier %s +tutti.service.multipost.export.error= tutti.service.operations.computeWeights.error.benthos.incoherentCategoryWeight=Le poids total des mensurations d'un lot du benthos est supérieur au poids de la catégorie tutti.service.operations.computeWeights.error.benthos.incoherentParentCategoryWeight=Le poids de la catégorie d'un lot du benthos est différent de la somme des poids de ses sous-catégories tutti.service.operations.computeWeights.error.benthos.incoherentRowWeightCategory=Le poids de sous-échantillon est renseigné alors que le lot n'a pas de poids. Modified: trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties =================================================================== --- trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-en.properties 2013-05-07 14:13:08 UTC (rev 927) @@ -1,5 +1,5 @@ #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Mon May 06 16:32:40 CEST 2013 +#Tue May 07 16:11:30 CEST 2013 tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=createAccidentalBatch.html\#actions tutti.createAccidentalBatch.action.save.help=createAccidentalBatch.html\#actions @@ -47,10 +47,14 @@ tutti.dbManager.action.upgradeDb.help=dbManager.html\#actions tutti.dbManager.help=dbManager.html tutti.editAccidentalBatch.action.createBatch.help=editAccidentalBatch.html\#actions +tutti.editAccidentalBatch.action.exportMultiPost.help= +tutti.editAccidentalBatch.action.importMultiPost.help= tutti.editAccidentalBatch.action.removeBatch.help=editAccidentalBatch.html\#actions tutti.editAccidentalBatch.help=editAccidentalBatch.html tutti.editBenthosBatch.action.createBatch.help=editBenthosBatch.html\#actions tutti.editBenthosBatch.action.createMelag.help=editBenthosBatch.html\#actions +tutti.editBenthosBatch.action.exportMultiPost.help= +tutti.editBenthosBatch.action.importMultiPost.help= tutti.editBenthosBatch.action.removeBatch.help=editBenthosBatch.html\#actions tutti.editBenthosBatch.action.removeSubBatch.help=editBenthosBatch.html\#actions tutti.editBenthosBatch.action.renameBatch.help=editBenthosBatch.html\#actions @@ -157,9 +161,13 @@ tutti.editFishingOperation.field.vessel.help=editFishingOperation.html\#fields tutti.editFishingOperation.help=editFishingOperation.html tutti.editIndividualObservationBatch.action.createBatch.help=editIndividualObservationBatch.html\#actions +tutti.editIndividualObservationBatch.action.exportMultiPost.help= +tutti.editIndividualObservationBatch.action.importMultiPost.help= tutti.editIndividualObservationBatch.action.removeBatch.help=editIndividualObservationBatch.html\#actions tutti.editIndividualObservationBatch.help=editIndividualObservationBatch.html tutti.editMarineLitterBatch.action.createBatch.help=editIndividualObservationBatch.html\#actions +tutti.editMarineLitterBatch.action.exportMultiPost.help= +tutti.editMarineLitterBatch.action.importMultiPost.help= tutti.editMarineLitterBatch.action.removeBatch.help=editIndividualObservationBatch.html\#actions tutti.editMarineLitterBatch.field.marineLitterTotalWeight.help=editIndividualObservationBatch.html\#fields tutti.editMarineLitterBatch.help=editMarineLitterBatch.html @@ -197,6 +205,8 @@ tutti.editProtocol.pane.caracteristic.help=editProtocol.html\#fieldsCaracteristics tutti.editSpeciesBatch.action.createBatch.help=editSpeciesBatch.html\#actions tutti.editSpeciesBatch.action.createMelag.help=editSpeciesBatch.html\#actions +tutti.editSpeciesBatch.action.exportMultiPost.help= +tutti.editSpeciesBatch.action.importMultiPost.help= tutti.editSpeciesBatch.action.removeBatch.help=editSpeciesBatch.html\#actions tutti.editSpeciesBatch.action.removeSubBatch.help=editSpeciesBatch.html\#actions tutti.editSpeciesBatch.action.renameBatch.help=editSpeciesBatch.html\#actions Modified: trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties =================================================================== --- trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties 2013-05-07 14:13:08 UTC (rev 927) @@ -1,5 +1,5 @@ #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Mon May 06 16:32:40 CEST 2013 +#Tue May 07 16:11:30 CEST 2013 tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=createAccidentalBatch.html\#actions tutti.createAccidentalBatch.action.save.help=createAccidentalBatch.html\#actions @@ -47,10 +47,14 @@ tutti.dbManager.action.upgradeDb.help=dbManager.html\#actions tutti.dbManager.help=dbManager.html tutti.editAccidentalBatch.action.createBatch.help=editAccidentalBatch.html\#actions +tutti.editAccidentalBatch.action.exportMultiPost.help= +tutti.editAccidentalBatch.action.importMultiPost.help= tutti.editAccidentalBatch.action.removeBatch.help=editAccidentalBatch.html\#actions tutti.editAccidentalBatch.help=editAccidentalBatch.html tutti.editBenthosBatch.action.createBatch.help=editBenthosBatch.html\#actions tutti.editBenthosBatch.action.createMelag.help=editBenthosBatch.html\#actions +tutti.editBenthosBatch.action.exportMultiPost.help= +tutti.editBenthosBatch.action.importMultiPost.help= tutti.editBenthosBatch.action.removeBatch.help=editBenthosBatch.html\#actions tutti.editBenthosBatch.action.removeSubBatch.help=editBenthosBatch.html\#actions tutti.editBenthosBatch.action.renameBatch.help=editBenthosBatch.html\#actions @@ -157,9 +161,13 @@ tutti.editFishingOperation.field.vessel.help=editFishingOperation.html\#fields tutti.editFishingOperation.help=editFishingOperation.html tutti.editIndividualObservationBatch.action.createBatch.help=editIndividualObservationBatch.html\#actions +tutti.editIndividualObservationBatch.action.exportMultiPost.help= +tutti.editIndividualObservationBatch.action.importMultiPost.help= tutti.editIndividualObservationBatch.action.removeBatch.help=editIndividualObservationBatch.html\#actions tutti.editIndividualObservationBatch.help=editIndividualObservationBatch.html tutti.editMarineLitterBatch.action.createBatch.help=editIndividualObservationBatch.html\#actions +tutti.editMarineLitterBatch.action.exportMultiPost.help= +tutti.editMarineLitterBatch.action.importMultiPost.help= tutti.editMarineLitterBatch.action.removeBatch.help=editIndividualObservationBatch.html\#actions tutti.editMarineLitterBatch.field.marineLitterTotalWeight.help=editIndividualObservationBatch.html\#fields tutti.editMarineLitterBatch.help=editMarineLitterBatch.html @@ -197,6 +205,8 @@ tutti.editProtocol.pane.caracteristic.help=editProtocol.html\#fieldsCaracteristics tutti.editSpeciesBatch.action.createBatch.help=editSpeciesBatch.html\#actions tutti.editSpeciesBatch.action.createMelag.help=editSpeciesBatch.html\#actions +tutti.editSpeciesBatch.action.exportMultiPost.help= +tutti.editSpeciesBatch.action.importMultiPost.help= tutti.editSpeciesBatch.action.removeBatch.help=editSpeciesBatch.html\#actions tutti.editSpeciesBatch.action.removeSubBatch.help=editSpeciesBatch.html\#actions tutti.editSpeciesBatch.action.renameBatch.help=editSpeciesBatch.html\#actions Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java 2013-05-07 14:13:08 UTC (rev 927) @@ -39,6 +39,7 @@ import fr.ifremer.tutti.service.catches.ExportCatchesReportService; import fr.ifremer.tutti.service.catches.TuttiWeightComputingService; import fr.ifremer.tutti.service.catches.ValidateCruiseOperationsService; +import fr.ifremer.tutti.service.catches.multipost.TuttiMultiPostImportExportService; import fr.ifremer.tutti.service.export.TuttiExportService; import fr.ifremer.tutti.service.protocol.TuttiProtocolImportExportService; import fr.ifremer.tutti.service.pupitri.TuttiPupitriImportExportService; @@ -545,6 +546,10 @@ return serviceContext.getService(TuttiCatchesSumatraExportService.class); } + public TuttiMultiPostImportExportService getMultiPostImportExportService() { + return serviceContext.getService(TuttiMultiPostImportExportService.class); + } + public boolean useRealPersistenceService() { return isDbExist() && isDbLoaded(); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css 2013-05-07 14:13:08 UTC (rev 927) @@ -580,13 +580,3 @@ _tuttiAction: {CancelEditFishingOperationAction.class}; _help: {"tutti.editFishingOperation.action.cancelEditFishingOperation.help"}; } - -#importCasinoButton { - actionIcon: casino-import; - text: "tutti.editFishingOperation.action.importCasino"; - toolTipText: "tutti.editFishingOperation.action.importCasino.tip"; - i18nMnemonic: "tutti.editFishingOperation.action.importCasino.mnemonic"; - _tuttiAction: {ImportCasinoAction.class}; - enabled: {model.getId() != null}; - _help: {"tutti.editFishingOperation.action.importCasino.help"}; -} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx 2013-05-07 14:13:08 UTC (rev 927) @@ -147,7 +147,6 @@ constructorParams='"tuttihelp.editeditFishingOperation.help"'/> <JToolBar id='traitGeneralTabPaneToolBar'> - <JButton id='importCasinoButton'/> <ButtonAttachment id='fishingOperationAttachmentsButton' constructorParams='getHandler().getContext(), getModel()'/> </JToolBar> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.css 2013-05-07 14:13:08 UTC (rev 927) @@ -60,6 +60,26 @@ rightDecoration: {catchesCaracteristicsTabToolBar}; } +#speciesTabFishingOperationReminderLabel { + rightDecoration: {speciesTabContent.getSpeciesBatchTabToolBar()}; +} + +#benthosTabFishingOperationReminderLabel { + rightDecoration: {benthosTabContent.getBenthosBatchTabToolBar()}; +} + +#marineLitterTabFishingOperationReminderLabel { + rightDecoration: {marineLitterTabContent.getMarineLitterBatchTabToolBar()}; +} + +#individualObservationTabFishingOperationReminderLabel { + rightDecoration: {individualObservationTabContent.getIndividualObservationBatchTabToolBar()}; +} + +#accidentalTabFishingOperationReminderLabel { + rightDecoration: {accidentalTabContent.getAccidentalBatchTabToolBar()}; +} + #catchTable { border: {BorderFactory.createTitledBorder(_("tutti.editCatchBatch.legend.total"))}; } @@ -301,7 +321,6 @@ text: "tutti.editCatchBatch.action.importPupitri"; toolTipText: "tutti.editCatchBatch.action.importPupitri.tip"; i18nMnemonic: "tutti.editCatchBatch.action.importPupitri.mnemonic"; - /*enabled: {model.getCatchTotalSortedTremisWeight() == null};*/ _tuttiAction: {ImportPupitriAction.class}; _help: {"tutti.editCatchBatch.action.importPupitri.help"}; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/accidental/AccidentalBatchUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/accidental/AccidentalBatchUI.css 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/accidental/AccidentalBatchUI.css 2013-05-07 14:13:08 UTC (rev 927) @@ -33,6 +33,30 @@ _help: {"tutti.editAccidentalBatch.help"}; } +#accidentalBatchTabToolBar { + floatable: false; + opaque: false; + borderPainted: false; +} + +#importMultiPostButton { + actionIcon: import; + text: "tutti.editAccidentalBatch.action.importMultiPost"; + toolTipText: "tutti.editAccidentalBatch.action.importMultiPost.tip"; + i18nMnemonic: "tutti.editAccidentalBatch.action.importMultiPost.mnemonic"; + /*_tuttiAction: {ImportMultiPostAction.class};*/ + _help: {"tutti.editAccidentalBatch.action.importMultiPost.help"}; +} + +#exportMultiPostButton { + actionIcon: export; + text: "tutti.editAccidentalBatch.action.exportMultiPost"; + toolTipText: "tutti.editAccidentalBatch.action.exportMultiPost.tip"; + i18nMnemonic: "tutti.editAccidentalBatch.action.exportMultiPost.mnemonic"; + /*_tuttiAction: {ExportMultiPostAction.class};*/ + _help: {"tutti.editAccidentalBatch.action.exportMultiPost.help"}; +} + #tablePopup { label: "tutti.editAccidentalBatch.title.batchActions"; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/accidental/AccidentalBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/accidental/AccidentalBatchUI.jaxx 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/accidental/AccidentalBatchUI.jaxx 2013-05-07 14:13:08 UTC (rev 927) @@ -67,6 +67,11 @@ <TuttiHelpBroker id='broker' constructorParams='"tutti.editAccidentalBatch.help"'/> + <JToolBar id='accidentalBatchTabToolBar'> + <JButton id='importMultiPostButton'/> + <JButton id='exportMultiPostButton'/> + </JToolBar> + <JPopupMenu id='tablePopup'> <JMenuItem id='removeAccidentalBatchMenu'/> </JPopupMenu> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUI.css 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUI.css 2013-05-07 14:13:08 UTC (rev 927) @@ -46,6 +46,30 @@ _help: {"tutti.editBenthosBatch.help"}; } +#benthosBatchTabToolBar { + floatable: false; + opaque: false; + borderPainted: false; +} + +#importMultiPostButton { + actionIcon: import; + text: "tutti.editBenthosBatch.action.importMultiPost"; + toolTipText: "tutti.editBenthosBatch.action.importMultiPost.tip"; + i18nMnemonic: "tutti.editBenthosBatch.action.importMultiPost.mnemonic"; + /*_tuttiAction: {ImportMultiPostAction.class};*/ + _help: {"tutti.editBenthosBatch.action.importMultiPost.help"}; +} + +#exportMultiPostButton { + actionIcon: export; + text: "tutti.editBenthosBatch.action.exportMultiPost"; + toolTipText: "tutti.editBenthosBatch.action.exportMultiPost.tip"; + i18nMnemonic: "tutti.editBenthosBatch.action.exportMultiPost.mnemonic"; + /*_tuttiAction: {ExportMultiPostAction.class};*/ + _help: {"tutti.editBenthosBatch.action.exportMultiPost.help"}; +} + #benthosTotalWeightLabel { text: "tutti.editBenthosBatch.field.benthosTotalWeight"; toolTipText: "tutti.editBenthosBatch.field.benthosTotalWeight.tip"; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUI.jaxx 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/benthos/BenthosBatchUI.jaxx 2013-05-07 14:13:08 UTC (rev 927) @@ -69,6 +69,11 @@ <TuttiHelpBroker id='broker' constructorParams='"tutti.editBenthosBatch.help"'/> + <JToolBar id='benthosBatchTabToolBar'> + <JButton id='importMultiPostButton'/> + <JButton id='exportMultiPostButton'/> + </JToolBar> + <JPopupMenu id='tablePopup'> <JMenuItem id='splitBenthosBatchMenu' onActionPerformed='handler.splitBatch()'/> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.css 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.css 2013-05-07 14:13:08 UTC (rev 927) @@ -26,6 +26,30 @@ _help: {"tutti.editIndividualObservationBatch.help"}; } +#individualObservationBatchTabToolBar { + floatable: false; + opaque: false; + borderPainted: false; +} + +#importMultiPostButton { + actionIcon: import; + text: "tutti.editIndividualObservationBatch.action.importMultiPost"; + toolTipText: "tutti.editIndividualObservationBatch.action.importMultiPost.tip"; + i18nMnemonic: "tutti.editIndividualObservationBatch.action.importMultiPost.mnemonic"; + /*_tuttiAction: {ImportMultiPostAction.class};*/ + _help: {"tutti.editIndividualObservationBatch.action.importMultiPost.help"}; +} + +#exportMultiPostButton { + actionIcon: export; + text: "tutti.editIndividualObservationBatch.action.exportMultiPost"; + toolTipText: "tutti.editIndividualObservationBatch.action.exportMultiPost.tip"; + i18nMnemonic: "tutti.editIndividualObservationBatch.action.exportMultiPost.mnemonic"; + /*_tuttiAction: {ExportMultiPostAction.class};*/ + _help: {"tutti.editIndividualObservationBatch.action.exportMultiPost.help"}; +} + #tablePopup { label: "tutti.editIndividualObservationBatch.title.batchActions"; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.jaxx 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/individualobservation/IndividualObservationBatchUI.jaxx 2013-05-07 14:13:08 UTC (rev 927) @@ -66,6 +66,11 @@ <TuttiHelpBroker id='broker' constructorParams='"tutti.editIndividualObservationBatch.help"'/> + <JToolBar id='individualObservationBatchTabToolBar'> + <JButton id='importMultiPostButton'/> + <JButton id='exportMultiPostButton'/> + </JToolBar> + <JPopupMenu id='tablePopup'> <JMenuItem id='removeIndividualObservationBatchMenu'/> </JPopupMenu> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/marinelitter/MarineLitterBatchUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/marinelitter/MarineLitterBatchUI.css 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/marinelitter/MarineLitterBatchUI.css 2013-05-07 14:13:08 UTC (rev 927) @@ -36,6 +36,30 @@ _help: {"tutti.editMarineLitterBatch.help"}; } +#marineLitterBatchTabToolBar { + floatable: false; + opaque: false; + borderPainted: false; +} + +#importMultiPostButton { + actionIcon: import; + text: "tutti.editMarineLitterBatch.action.importMultiPost"; + toolTipText: "tutti.editMarineLitterBatch.action.importMultiPost.tip"; + i18nMnemonic: "tutti.editMarineLitterBatch.action.importMultiPost.mnemonic"; + /*_tuttiAction: {ImportMultiPostAction.class};*/ + _help: {"tutti.editMarineLitterBatch.action.importMultiPost.help"}; +} + +#exportMultiPostButton { + actionIcon: export; + text: "tutti.editMarineLitterBatch.action.exportMultiPost"; + toolTipText: "tutti.editMarineLitterBatch.action.exportMultiPost.tip"; + i18nMnemonic: "tutti.editMarineLitterBatch.action.exportMultiPost.mnemonic"; + /*_tuttiAction: {ExportMultiPostAction.class};*/ + _help: {"tutti.editMarineLitterBatch.action.exportMultiPost.help"}; +} + #marineLitterTotalWeightLabel { text: "tutti.editMarineLitterBatch.field.marineLitterTotalWeight"; toolTipText: "tutti.editMarineLitterBatch.field.marineLitterTotalWeight.tip"; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/marinelitter/MarineLitterBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/marinelitter/MarineLitterBatchUI.jaxx 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/marinelitter/MarineLitterBatchUI.jaxx 2013-05-07 14:13:08 UTC (rev 927) @@ -67,6 +67,11 @@ <TuttiHelpBroker id='broker' constructorParams='"tutti.editMarineLitterBatch.help"'/> + <JToolBar id='marineLitterBatchTabToolBar'> + <JButton id='importMultiPostButton'/> + <JButton id='exportMultiPostButton'/> + </JToolBar> + <JPopupMenu id='tablePopup'> <JMenuItem id='removeMarineLitterBatchMenu'/> </JPopupMenu> Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ExportMultiPostAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ExportMultiPostAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ExportMultiPostAction.java 2013-05-07 14:13:08 UTC (rev 927) @@ -0,0 +1,79 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.service.catches.multipost.TuttiMultiPostImportExportService; +import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI; +import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; + +import java.io.File; + +import static org.nuiton.i18n.I18n._; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.2 + */ +public class ExportMultiPostAction extends AbstractTuttiAction<SpeciesBatchUIModel, SpeciesBatchUI, SpeciesBatchUIHandler> { + + protected File file; + + protected FishingOperation currentOperation; + + protected TuttiMultiPostImportExportService multiPostImportExportService; + + public ExportMultiPostAction(SpeciesBatchUIHandler handler) { + super(handler, false); + multiPostImportExportService = getContext().getMultiPostImportExportService(); + } + + @Override + protected boolean prepareAction() throws Exception { + + boolean doAction = super.prepareAction(); + + if (doAction) { + + EditCatchesUI catchesUI = getUI().getParentContainer(EditCatchesUI.class); + currentOperation = catchesUI.getModel().getFishingOperation(); + + // choose file to export + file = TuttiUIUtil.saveFile( + decorate(currentOperation, DecoratorService.FILE_NAME_COMPATIBLE) + ".zip", + getContext().getMainUI(), + _("tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.title"), + _("tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.button"), + "^.*\\.zip", _("tutti.common.file.zip") + ); + if (file == null) { + + // user cancel + doAction = false; + } else { + + // ask user to confirm overwrite. + doAction = getHandler().askOverwriteFile(file); + } + } + return doAction; + } + + @Override + protected void releaseAction() { + file = null; + currentOperation = null; + super.releaseAction(); + } + + @Override + protected void doAction() throws Exception { + multiPostImportExportService.exportSpecies(file, currentOperation); + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + sendMessage(_("tutti.editSpeciesBatch.action.exportMultiPost.success", file)); + } +} Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportMultiPostAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportMultiPostAction.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/ImportMultiPostAction.java 2013-05-07 14:13:08 UTC (rev 927) @@ -0,0 +1,86 @@ +package fr.ifremer.tutti.ui.swing.content.operation.catches.species; + +import fr.ifremer.tutti.persistence.entities.data.CatchBatch; +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationAction; +import fr.ifremer.tutti.ui.swing.content.operation.FishingOperationsUI; +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 fr.ifremer.tutti.ui.swing.content.operation.catches.ImportPupitriPopupUI; +import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; +import fr.ifremer.tutti.ui.swing.util.action.AbstractTuttiAction; +import fr.ifremer.tutti.ui.swing.util.action.TuttiActionHelper; + +import java.io.File; + +import static org.nuiton.i18n.I18n._; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 2.2 + */ +public class ImportMultiPostAction extends AbstractTuttiAction<SpeciesBatchUIModel, SpeciesBatchUI, SpeciesBatchUIHandler> { + + protected File file; + + protected EditFishingOperationAction editAction; + + public ImportMultiPostAction(SpeciesBatchUIHandler handler) { + super(handler, false); + } + + public EditFishingOperationAction getEditAction() { + FishingOperationsUI parentUI = getUI().getParentContainer(FishingOperationsUI.class); + if (editAction == null) { + editAction = TuttiActionHelper.createLogicAction(parentUI.getHandler(), + EditFishingOperationAction.class); + } + return editAction; + } + + @Override + protected boolean prepareAction() throws Exception { + + boolean doAction = super.prepareAction(); + + if (doAction) { + + // choose file to import + file = TuttiUIUtil.chooseFile( + getContext().getMainUI(), + _("tutti.editSpeciesBatch.action.importMultiPost.sourceFile.title"), + _("tutti.editSpeciesBatch.action.importMultiPost.sourceFile.button") + ); + + doAction = file != null; + } + return doAction; + } + + @Override + protected void releaseAction() { + file = null; + super.releaseAction(); + } + + @Override + protected void doAction() throws Exception { + EditCatchesUI editCatchesUI = getUI().getParentContainer(EditCatchesUI.class); + EditCatchesUIModel editCatchesUIModel = editCatchesUI.getModel(); + + FishingOperation operation = editCatchesUIModel.getFishingOperation(); + CatchBatch catchBatch = editCatchesUIModel.getCatchBatch(); + + String fishingOperationText = getEditAction().getFishingOperationTitle(operation); + + getEditAction().loadCatchBatch(operation, fishingOperationText, true); + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + + sendMessage(_("tutti.editSpeciesBatch.action.importMultiPost.success", file)); + } +} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css 2013-05-07 14:13:08 UTC (rev 927) @@ -46,6 +46,30 @@ _help: {"tutti.editSpeciesBatch.help"}; } +#speciesBatchTabToolBar { + floatable: false; + opaque: false; + borderPainted: false; +} + +#importMultiPostButton { + actionIcon: import; + text: "tutti.editSpeciesBatch.action.importMultiPost"; + toolTipText: "tutti.editSpeciesBatch.action.importMultiPost.tip"; + i18nMnemonic: "tutti.editSpeciesBatch.action.importMultiPost.mnemonic"; + _tuttiAction: {ImportMultiPostAction.class}; + _help: {"tutti.editSpeciesBatch.action.importMultiPost.help"}; +} + +#exportMultiPostButton { + actionIcon: export; + text: "tutti.editSpeciesBatch.action.exportMultiPost"; + toolTipText: "tutti.editSpeciesBatch.action.exportMultiPost.tip"; + i18nMnemonic: "tutti.editSpeciesBatch.action.exportMultiPost.mnemonic"; + _tuttiAction: {ExportMultiPostAction.class}; + _help: {"tutti.editSpeciesBatch.action.exportMultiPost.help"}; +} + #speciesTotalWeightLabel { text: "tutti.editSpeciesBatch.field.speciesTotalWeight"; toolTipText: "tutti.editSpeciesBatch.field.speciesTotalWeight.tip"; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx 2013-05-07 14:13:08 UTC (rev 927) @@ -68,6 +68,11 @@ <TuttiHelpBroker id='broker' constructorParams='"tutti.editSpeciesBatch.help"'/> + <JToolBar id='speciesBatchTabToolBar'> + <JButton id='importMultiPostButton'/> + <JButton id='exportMultiPostButton'/> + </JToolBar> + <JPopupMenu id='tablePopup'> <JMenuItem id='splitSpeciesBatchMenu' onActionPerformed='handler.splitBatch()'/> Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties 2013-05-07 14:13:08 UTC (rev 927) @@ -258,6 +258,12 @@ tutti.editAccidentalBatch.action.createBatch= tutti.editAccidentalBatch.action.createBatch.mnemonic= tutti.editAccidentalBatch.action.createBatch.tip= +tutti.editAccidentalBatch.action.exportMultiPost= +tutti.editAccidentalBatch.action.exportMultiPost.mnemonic= +tutti.editAccidentalBatch.action.exportMultiPost.tip= +tutti.editAccidentalBatch.action.importMultiPost= +tutti.editAccidentalBatch.action.importMultiPost.mnemonic= +tutti.editAccidentalBatch.action.importMultiPost.tip= tutti.editAccidentalBatch.action.removeBatch= tutti.editAccidentalBatch.action.removeBatch.mnemonic= tutti.editAccidentalBatch.action.removeBatch.tip= @@ -285,6 +291,12 @@ tutti.editBenthosBatch.action.createMelag= tutti.editBenthosBatch.action.createMelag.mnemonic= tutti.editBenthosBatch.action.createMelag.tip= +tutti.editBenthosBatch.action.exportMultiPost= +tutti.editBenthosBatch.action.exportMultiPost.mnemonic= +tutti.editBenthosBatch.action.exportMultiPost.tip= +tutti.editBenthosBatch.action.importMultiPost= +tutti.editBenthosBatch.action.importMultiPost.mnemonic= +tutti.editBenthosBatch.action.importMultiPost.tip= tutti.editBenthosBatch.action.removeBatch= tutti.editBenthosBatch.action.removeBatch.mnemonic= tutti.editBenthosBatch.action.removeBatch.tip= @@ -593,6 +605,12 @@ tutti.editIndividualObservationBatch.action.createBatch= tutti.editIndividualObservationBatch.action.createBatch.mnemonic= tutti.editIndividualObservationBatch.action.createBatch.tip= +tutti.editIndividualObservationBatch.action.exportMultiPost= +tutti.editIndividualObservationBatch.action.exportMultiPost.mnemonic= +tutti.editIndividualObservationBatch.action.exportMultiPost.tip= +tutti.editIndividualObservationBatch.action.importMultiPost= +tutti.editIndividualObservationBatch.action.importMultiPost.mnemonic= +tutti.editIndividualObservationBatch.action.importMultiPost.tip= tutti.editIndividualObservationBatch.action.removeBatch= tutti.editIndividualObservationBatch.action.removeBatch.mnemonic= tutti.editIndividualObservationBatch.action.removeBatch.tip= @@ -626,6 +644,12 @@ tutti.editMarineLitterBatch.action.createBatch= tutti.editMarineLitterBatch.action.createBatch.mnemonic= tutti.editMarineLitterBatch.action.createBatch.tip= +tutti.editMarineLitterBatch.action.exportMultiPost= +tutti.editMarineLitterBatch.action.exportMultiPost.mnemonic= +tutti.editMarineLitterBatch.action.exportMultiPost.tip= +tutti.editMarineLitterBatch.action.importMultiPost= +tutti.editMarineLitterBatch.action.importMultiPost.mnemonic= +tutti.editMarineLitterBatch.action.importMultiPost.tip= tutti.editMarineLitterBatch.action.removeBatch= tutti.editMarineLitterBatch.action.removeBatch.mnemonic= tutti.editMarineLitterBatch.action.removeBatch.tip= @@ -773,6 +797,18 @@ tutti.editSpeciesBatch.action.createMelag= tutti.editSpeciesBatch.action.createMelag.mnemonic= tutti.editSpeciesBatch.action.createMelag.tip= +tutti.editSpeciesBatch.action.exportMultiPost= +tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.button= +tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.title= +tutti.editSpeciesBatch.action.exportMultiPost.mnemonic= +tutti.editSpeciesBatch.action.exportMultiPost.success= +tutti.editSpeciesBatch.action.exportMultiPost.tip= +tutti.editSpeciesBatch.action.importMultiPost= +tutti.editSpeciesBatch.action.importMultiPost.destinationFile.title= +tutti.editSpeciesBatch.action.importMultiPost.mnemonic= +tutti.editSpeciesBatch.action.importMultiPost.sourceFile.button= +tutti.editSpeciesBatch.action.importMultiPost.sourceFile.title= +tutti.editSpeciesBatch.action.importMultiPost.tip= tutti.editSpeciesBatch.action.removeBatch= tutti.editSpeciesBatch.action.removeBatch.mnemonic= tutti.editSpeciesBatch.action.removeBatch.tip= @@ -1183,6 +1219,7 @@ tutti.updateApplication.message.success= tutti.updateApplication.noUpdate= tutti.updateApplication.title.success= +tutti.v.action.importMultiPost.mnemonic= tutti.validateCruise.action.export.all.chooseFile.defaultFile= tutti.validateCruise.action.export.all.chooseFile.label= tutti.validateCruise.action.export.all.chooseFile.title= Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-05-07 13:08:02 UTC (rev 926) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-05-07 14:13:08 UTC (rev 927) @@ -253,6 +253,12 @@ tutti.editAccidentalBatch.action.createBatch=Créer une capture accidentelle tutti.editAccidentalBatch.action.createBatch.mnemonic=C tutti.editAccidentalBatch.action.createBatch.tip=Créer une capture accidentelle +tutti.editAccidentalBatch.action.exportMultiPost=Exporter les captures accidentelles +tutti.editAccidentalBatch.action.exportMultiPost.mnemonic=E +tutti.editAccidentalBatch.action.exportMultiPost.tip=Exporter les captures accidentelles pour les importer sur le poste maître +tutti.editAccidentalBatch.action.importMultiPost=Importer des captures accidentelles +tutti.editAccidentalBatch.action.importMultiPost.mnemonic=I +tutti.editAccidentalBatch.action.importMultiPost.tip=Importer des captures accidentelles créées sur un poste satellite tutti.editAccidentalBatch.action.removeBatch=Supprimer la capture courante tutti.editAccidentalBatch.action.removeBatch.mnemonic=S tutti.editAccidentalBatch.action.removeBatch.tip=Supprimer la capture courante (celle de la ligne sélectionnée) @@ -280,6 +286,12 @@ tutti.editBenthosBatch.action.createMelag=Espèces d'un MELAG tutti.editBenthosBatch.action.createMelag.mnemonic=C tutti.editBenthosBatch.action.createMelag.tip=Calcul des poids des lots appartenant à un MELAG +tutti.editBenthosBatch.action.exportMultiPost=Exporter les lots de benthos +tutti.editBenthosBatch.action.exportMultiPost.mnemonic=E +tutti.editBenthosBatch.action.exportMultiPost.tip=Exporter les lots de benthos pour les importer sur le poste maître +tutti.editBenthosBatch.action.importMultiPost=Importer des lots de benthos +tutti.editBenthosBatch.action.importMultiPost.mnemonic=I +tutti.editBenthosBatch.action.importMultiPost.tip=Importer des lots de benthos créés sur un poste satellite tutti.editBenthosBatch.action.removeBatch=Supprimer le lot tutti.editBenthosBatch.action.removeBatch.mnemonic=S tutti.editBenthosBatch.action.removeBatch.tip=Supprimer le lot courant (celui de la ligne sélectionnée) et tous ces fils @@ -577,6 +589,12 @@ tutti.editIndividualObservationBatch.action.createBatch=Créer une observation tutti.editIndividualObservationBatch.action.createBatch.mnemonic=C tutti.editIndividualObservationBatch.action.createBatch.tip=Créer une nouvelle observation +tutti.editIndividualObservationBatch.action.exportMultiPost=Exporter les observations +tutti.editIndividualObservationBatch.action.exportMultiPost.mnemonic=E +tutti.editIndividualObservationBatch.action.exportMultiPost.tip=Exporter les observations pour les importer sur le poste maître +tutti.editIndividualObservationBatch.action.importMultiPost=Importer des observations +tutti.editIndividualObservationBatch.action.importMultiPost.mnemonic=I +tutti.editIndividualObservationBatch.action.importMultiPost.tip=Importer des observations créées sur un poste satellite tutti.editIndividualObservationBatch.action.removeBatch=Supprimer la ligne sélectionnée tutti.editIndividualObservationBatch.action.removeBatch.mnemonic=S tutti.editIndividualObservationBatch.action.removeBatch.tip=Supprimer la ligne sélectionnée @@ -610,6 +628,12 @@ tutti.editMarineLitterBatch.action.createBatch=Créer un lot de déchet tutti.editMarineLitterBatch.action.createBatch.mnemonic=C tutti.editMarineLitterBatch.action.createBatch.tip=Créer un nouveau lot de déchet +tutti.editMarineLitterBatch.action.exportMultiPost=Exporter les lots de déchets +tutti.editMarineLitterBatch.action.exportMultiPost.mnemonic=E +tutti.editMarineLitterBatch.action.exportMultiPost.tip=Exporter les lots de déchets pour les importer sur le poste maître +tutti.editMarineLitterBatch.action.importMultiPost=Importer des lots de déchets +tutti.editMarineLitterBatch.action.importMultiPost.mnemonic=I +tutti.editMarineLitterBatch.action.importMultiPost.tip=Importer des lots de déchets créés sur un poste satellite tutti.editMarineLitterBatch.action.removeBatch=Supprimer la ligne sélectionnée tutti.editMarineLitterBatch.action.removeBatch.mnemonic=S tutti.editMarineLitterBatch.action.removeBatch.tip=Supprimer la ligne sélectionnée @@ -743,6 +767,17 @@ tutti.editSpeciesBatch.action.createMelag=Espèces d'un MELAG tutti.editSpeciesBatch.action.createMelag.mnemonic=C tutti.editSpeciesBatch.action.createMelag.tip=Calcul des poids des lots appartenant à un MELAG +tutti.editSpeciesBatch.action.exportMultiPost=Exporter les lots d'espèces +tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.button=Choisir le fichier pour l'export +tutti.editSpeciesBatch.action.exportMultiPost.destinationFile.title=Exporter les lots d'espèces +tutti.editSpeciesBatch.action.exportMultiPost.mnemonic=E +tutti.editSpeciesBatch.action.exportMultiPost.success= +tutti.editSpeciesBatch.action.exportMultiPost.tip=Exporter les lots d'espèces pour les importer sur le poste maître +tutti.editSpeciesBatch.action.importMultiPost=Importer des lots d'espèces +tutti.editSpeciesBatch.action.importMultiPost.mnemonic=I +tutti.editSpeciesBatch.action.importMultiPost.sourceFile.button=Choisir le fichier à importer +tutti.editSpeciesBatch.action.importMultiPost.sourceFile.title=Importer des lots d'espèces +tutti.editSpeciesBatch.action.importMultiPost.tip=Importer des lots d'espèces créés sur un poste satellite tutti.editSpeciesBatch.action.removeBatch=Supprimer le lot tutti.editSpeciesBatch.action.removeBatch.mnemonic=S tutti.editSpeciesBatch.action.removeBatch.tip=Supprimer le lot courant (celui de la ligne sélectionnée) et tous ces fils
participants (1)
-
kmorin@users.forge.codelutin.com