[Suiviobsmer-commits] r1275 - in trunk: wao-business/src/main/java/fr/ifremer/wao wao-business/src/main/java/fr/ifremer/wao/bean wao-business/src/main/java/fr/ifremer/wao/entity wao-business/src/main/java/fr/ifremer/wao/io/csv2 wao-business/src/main/java/fr/ifremer/wao/io/csv2/models wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/operations wao-business/src/main/java/fr/ifremer/wao/service wao-business/src/main/resources/i18n wao-business/src/main/xmi wao-business/src/test/java/fr/ifremer/wao wao-
Author: bleny Date: 2011-05-16 09:45:06 +0000 (Mon, 16 May 2011) New Revision: 1275 Log: add phone call sampling plan for ObsDeb, import/export test and show in UI Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/operations/BoatParserFormatter.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/operations/CompanyParserFormatter.java Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java trunk/wao-business/src/main/java/fr/ifremer/wao/WaoQueryBuilder.java trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ObservationType.java trunk/wao-business/src/main/java/fr/ifremer/wao/entity/SampleRowImpl.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Common.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Import.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/ContactImportExportModel.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportExportModel.java trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties trunk/wao-business/src/main/xmi/wao.zargo trunk/wao-business/src/test/java/fr/ifremer/wao/TestManager.java trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebFixtures.java trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebTest.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/ObsDebSamplingPlan.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/SampleRowModelFactory.java trunk/wao-ui/src/main/resources/i18n/wao-ui_en_GB.properties trunk/wao-ui/src/main/resources/i18n/wao-ui_fr_FR.properties trunk/wao-ui/src/main/webapp/ObsDebSamplingPlan.tml trunk/wao-ui/src/main/webapp/SampleRowForm.tml Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -872,9 +872,11 @@ @Override protected void addObsDebToSampleRows_3_0(List<String> queries) { - queries.add("ALTER TABLE SampleRow ADD blankRow BOOLEAN"); - queries.add("UPDATE TABLE SampleRow SET blankRow=FALSE"); + queries.add("ALTER TABLE SampleRow ADD blankRow BOOLEAN DEFAULT FALSE"); queries.add("ALTER TABLE SampleRow RENAME day TO expectedDate"); + queries.add("ALTER TABLE SampleRow ADD boat CHARACTER VARYING(255)"); + queries.add("ALTER TABLE SampleRow ADD CONSTRAINT boat_fkey FOREIGN KEY (boat) REFERENCES Boat(topiaId)"); + queries.add("ALTER TABLE SampleRow ADD observationTypeOrdinal SMALLINT"); } @Override Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/WaoQueryBuilder.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/WaoQueryBuilder.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/WaoQueryBuilder.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -404,6 +404,10 @@ query.addParam("sampleRowObserver", filter.getSampleRowObserver()); } + if (filter.getExpectedObservationType() != null) { + query.addEquals(sampleRowProperty.observationTypeOrdinal(), filter.getExpectedObservationType().ordinal()); + } + if (filter.getOrderBy() != null) { query.addOrder(filter.getOrderBy()); } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ObservationType.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ObservationType.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ObservationType.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -15,9 +15,12 @@ /** Information obtained by observation on the field work */ FIELD_WORK_OBSERVATION(n_("ObservationType.FIELD_WORK_OBSERVATION")), - /** Information obstained by asking someone on the field work */ - FIELD_WORK_SURVEY(n_("ObservationType.FIELD_WORK_SURVEY")),; + /** Information obtained by asking someone on the field work */ + FIELD_WORK_SURVEY(n_("ObservationType.FIELD_WORK_SURVEY")), + /** Information obtained by calling someone by phone */ + PHONE_CALL(n_("ObservationType.PHONE_CALL")); + protected String i18nKey; ObservationType(String i18nKey) { Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/entity/SampleRowImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/entity/SampleRowImpl.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/entity/SampleRowImpl.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -26,6 +26,7 @@ import fr.ifremer.wao.WaoUtils; import fr.ifremer.wao.bean.ObsProgram; +import fr.ifremer.wao.bean.ObservationType; import fr.ifremer.wao.bean.SamplingStrategy; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; @@ -463,4 +464,18 @@ public void setSamplingStrategy(SamplingStrategy samplingStrategy) { setSamplingStrategyOrdinal(samplingStrategy.ordinal()); } + + @Override + public void setObservationType(ObservationType observationType) { + if (observationType == null) { + setObservationTypeOrdinal(null); + } else { + setObservationTypeOrdinal(observationType.ordinal()); + } + } + + @Override + public ObservationType getObservationType() { + return ObservationType.valueOf(getObservationTypeOrdinal()); + } } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Common.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Common.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Common.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -196,6 +196,9 @@ public static final ValueParserFormatter<Date> DAY_TIME = new DateValue("dd/MM/yyyy HH:mm"); + /** A week in a given year, ie "1/2011" until "52/2011" */ + public static final ValueParserFormatter<Date> WEEK = new DateValue("w/yyyy"); + public static class ValueSaver<E, T> implements ValueGetterSetter<E, T> { protected T value; Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Import.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Import.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/Import.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -41,8 +41,6 @@ import java.util.List; import java.util.Set; -import static org.nuiton.i18n.I18n.n_; - public class Import<E> { private static final Logger log = LoggerFactory.getLogger(Import.class); @@ -81,14 +79,8 @@ throw new NullPointerException("inputStream is null"); } this.model = model; - validateModel(); this.reader = new CsvReader(inputStream, model.getSeparator(), Charset.forName("UTF-8")); reader.setTrimWhitespace(true); - if (log.isTraceEnabled()) { - log.trace("all headers are " + model.getColumnsForImport()); - log.trace("all non-ignored headers are " + getNonIgnoredHeaders()); - log.trace("all mandatory headers are " + getAllMandatoryHeaders()); - } } protected boolean validateModel() { @@ -118,6 +110,8 @@ model.pushCsvHeaderNames(Arrays.asList(reader.getHeaders())); + validateModel(); + csvValidationResult = new ValidationResultImpl(); csvValidationResult.setSuccess(true); Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/ContactImportExportModel.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/ContactImportExportModel.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/ContactImportExportModel.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -44,6 +44,7 @@ import fr.ifremer.wao.io.csv2.ValueGetter; import fr.ifremer.wao.io.csv2.ValueGetterSetter; import fr.ifremer.wao.io.csv2.ValueParserFormatter; +import fr.ifremer.wao.io.csv2.models.operations.BoatParserFormatter; import fr.ifremer.wao.io.csv2.models.operations.UserParserFormatter; import fr.ifremer.wao.io.csv2.models.operations.UsersParserFormatter; import org.apache.commons.lang.StringUtils; @@ -54,8 +55,6 @@ import java.util.List; import java.util.Map; -import static org.nuiton.i18n.I18n.n_; - public class ContactImportExportModel implements ImportModel<Contact>, ExportModel<Contact> { static class TerrestrialLocationParserFormatter implements ValueParserFormatter<TerrestrialLocation> { @@ -139,34 +138,6 @@ } } - static class BoatParserFormatter implements ValueParserFormatter<Boat> { - - protected Map<Integer, Boat> indexedBoats; - - BoatParserFormatter(List<Boat> boats) { - indexedBoats = WaoUtils.projectPropertyUnique(boats, Boat.PROPERTY_IMMATRICULATION); - } - - @Override - public String format(Boat boat) { - return String.valueOf(boat.getImmatriculation()); - } - - @Override - public Boat parse(String value) throws ParseException { - String trimmedValue = value.trim(); - if (trimmedValue.isEmpty()) { - throw new IllegalArgumentException(WaoUtils._("wao.import.contact.failure.boatMissing")); - } - Integer key = Integer.valueOf(trimmedValue); - Boat boat = indexedBoats.get(key); - if (boat == null) { - throw new IllegalArgumentException(WaoUtils._("wao.import.contact.failure.wrongBoat", value)); - } - return boat; - } - } - protected ObsProgram obsProgram; protected List<WaoUser> waoUsers; Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportExportModel.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportExportModel.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/SamplingPlanImportExportModel.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -20,24 +20,25 @@ */ package fr.ifremer.wao.io.csv2.models; -import fr.ifremer.wao.WaoUtils; import fr.ifremer.wao.bean.ConnectedUser; import fr.ifremer.wao.bean.ObsProgram; +import fr.ifremer.wao.bean.ObservationType; +import fr.ifremer.wao.entity.Boat; import fr.ifremer.wao.entity.Company; import fr.ifremer.wao.entity.SampleRow; import fr.ifremer.wao.entity.SampleRowImpl; import fr.ifremer.wao.entity.TerrestrialDivision; import fr.ifremer.wao.entity.WaoUser; import fr.ifremer.wao.io.csv2.Common; -import fr.ifremer.wao.io.csv2.ExportModel; import fr.ifremer.wao.io.csv2.ExportableColumn; -import fr.ifremer.wao.io.csv2.ImportModel; +import fr.ifremer.wao.io.csv2.ImportExportModel; import fr.ifremer.wao.io.csv2.ImportableColumn; import fr.ifremer.wao.io.csv2.ModelBuilder; import fr.ifremer.wao.io.csv2.ValueGetterSetter; import fr.ifremer.wao.io.csv2.ValueParserFormatter; +import fr.ifremer.wao.io.csv2.models.operations.BoatParserFormatter; +import fr.ifremer.wao.io.csv2.models.operations.CompanyParserFormatter; import fr.ifremer.wao.io.csv2.models.operations.UsersParserFormatter; -import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,9 +49,10 @@ import java.util.Map; /** - * + * For now, this model support only import/export of ObsDeb sampling plans. Both + * field work sampling plan and phoning sampling plan are supported. */ -public class SamplingPlanImportExportModel implements ImportModel<SampleRow>, ExportModel<SampleRow> { +public class SamplingPlanImportExportModel implements ImportExportModel<SampleRow> { private static final Logger log = LoggerFactory.getLogger(SamplingPlanImportExportModel.class); @@ -117,42 +119,6 @@ } } - static class CompanyParserFormatter implements ValueParserFormatter<Company> { - - protected List<Company> companies; - - protected Map<String, Company> indexedCompanies; - - public CompanyParserFormatter(List<Company> companies) { - this.companies = companies; - } - - @Override - public String format(Company company) { - String companyName = ""; - if (company != null) { - companyName = company.getName(); - } - return companyName; - } - - @Override - public Company parse(String companyName) throws ParseException { - if (indexedCompanies == null) { - indexedCompanies = WaoUtils.projectPropertyUnique(companies, Company.PROPERTY_NAME); - } - Company company = null; - if (StringUtils.isNotBlank(companyName)) { - company = indexedCompanies.get(companyName.trim()); - if (company == null) { - throw new IllegalArgumentException("Il n'y a pas de société ayant pour nom '" - + companyName + "'"); - } - } - return company; - } - } - static class RegionCodeSetter implements ValueGetterSetter<SampleRow, String> { protected ObservationUnitParserFormatter observationUnitSetter; @@ -184,29 +150,45 @@ protected List<Company> allCompanies; + protected List<Boat> allActiveBoats; + protected ConnectedUser connectedUser; protected ModelBuilder<SampleRow> modelBuilder; + protected static final String BOAT_HEADER_NAME = "NAVIRE_COD"; + protected static final String OBSERVATION_UNIT_HEADER_NAME = "UNITE_OBSERVATION_COD"; + + /** Type of observation, may be phone or work field depending of what the user is importing */ + protected ObservationType observationType; + /** Constructor used for import */ public SamplingPlanImportExportModel(ConnectedUser connectedUser, - List<TerrestrialDivision> observationUnits, List<WaoUser> allWaoUsers, List<Company> allCompanies) { + List<TerrestrialDivision> observationUnits, List<WaoUser> allWaoUsers, List<Company> allCompanies, List<Boat> allActiveBoats) { this.connectedUser = connectedUser; this.allWaoUsers = allWaoUsers; this.observationUnits = observationUnits; this.allCompanies = allCompanies; - buildModel(); + this.allActiveBoats = allActiveBoats; } /** Constructor used for export */ - public SamplingPlanImportExportModel(ConnectedUser connectedUser) { + public SamplingPlanImportExportModel(ConnectedUser connectedUser, ObservationType observationType) { this.connectedUser = connectedUser; - buildModel(); + this.observationType = observationType; } @Override public void pushCsvHeaderNames(List<String> headerNames) { - // nothing to do + // by reading the header, we must determine what kind of sampling plan is it + if (headerNames.contains(OBSERVATION_UNIT_HEADER_NAME)) { + observationType = ObservationType.FIELD_WORK_OBSERVATION; + } else if (headerNames.contains(BOAT_HEADER_NAME)) { + observationType = ObservationType.PHONE_CALL; + } + if (log.isDebugEnabled()) { + log.debug("detected type of sampling plan: " + observationType); + } } @Override @@ -218,6 +200,7 @@ public SampleRow newEmptyInstance() { SampleRow newSampleRow = new SampleRowImpl(); newSampleRow.setObsProgram(ObsProgram.OBSDEB); + newSampleRow.setObservationType(observationType); return newSampleRow; } @@ -228,23 +211,37 @@ modelBuilder.newColumnForImportExport("SOCIETE", SampleRow.PROPERTY_COMPANY, new CompanyParserFormatter(allCompanies)); } modelBuilder.newColumnForImportExport("OBSERVATEUR_COD", SampleRow.PROPERTY_GROUP_NAME); - modelBuilder.newColumnForImportExport("OBSERVATION_DATE", SampleRow.PROPERTY_EXPECTED_DATE, Common.DAY); - ObservationUnitParserFormatter observationUnitParser = new ObservationUnitParserFormatter(observationUnits); - ValueGetterSetter<SampleRow, String> regionCodeGetterSetter = new RegionCodeSetter(observationUnitParser); - modelBuilder.newColumnForImportExport("REGION_IFREMER_COD", regionCodeGetterSetter); - modelBuilder.newColumnForImportExport("UNITE_OBSERVATION_COD", SampleRow.PROPERTY_OBSERVATION_UNIT, observationUnitParser); modelBuilder.newColumnForImportExport("OBSERVATEURS", SampleRow.PROPERTY_OBSERVERS, new UsersParserFormatter(allWaoUsers)); - modelBuilder.newColumnForImportExport("LIGNE_SANS_CONTACTS", SampleRow.PROPERTY_BLANK_ROW, Common.BOOLEAN); + if (observationType == ObservationType.FIELD_WORK_OBSERVATION) { + modelBuilder.newColumnForImportExport("OBSERVATION_DATE", SampleRow.PROPERTY_EXPECTED_DATE, Common.DAY); + ObservationUnitParserFormatter observationUnitParser = new ObservationUnitParserFormatter(observationUnits); + ValueGetterSetter<SampleRow, String> regionCodeGetterSetter = new RegionCodeSetter(observationUnitParser); + modelBuilder.newColumnForImportExport("REGION_IFREMER_COD", regionCodeGetterSetter); + modelBuilder.newColumnForImportExport(OBSERVATION_UNIT_HEADER_NAME, SampleRow.PROPERTY_OBSERVATION_UNIT, observationUnitParser); + modelBuilder.newColumnForImportExport("LIGNE_SANS_CONTACTS", SampleRow.PROPERTY_BLANK_ROW, Common.BOOLEAN); + } else if (observationType == ObservationType.PHONE_CALL) { + modelBuilder.newColumnForImportExport("OBSERVATION_DATE", SampleRow.PROPERTY_EXPECTED_DATE, Common.WEEK); + modelBuilder.newColumnForImportExport(BOAT_HEADER_NAME, SampleRow.PROPERTY_BOAT, new BoatParserFormatter(allActiveBoats)); + } + if (log.isDebugEnabled()) { + log.debug("model built : " + modelBuilder.getColumnsForImport()); + } } @Override public Collection<ImportableColumn> getColumnsForImport() { + if (modelBuilder == null) { + buildModel(); + } Collection<ImportableColumn> columns = modelBuilder.getColumnsForImport(); return columns; } @Override public Collection<ExportableColumn> getColumnsForExport() { + if (modelBuilder == null) { + buildModel(); + } Collection<ExportableColumn> columns = modelBuilder.getColumnsForExport(); return columns; } Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/operations/BoatParserFormatter.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/operations/BoatParserFormatter.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/operations/BoatParserFormatter.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -0,0 +1,44 @@ +package fr.ifremer.wao.io.csv2.models.operations; + +import fr.ifremer.wao.WaoUtils; +import fr.ifremer.wao.entity.Boat; +import fr.ifremer.wao.io.csv2.ValueParserFormatter; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** +* Created by IntelliJ IDEA. +* User: brendan +* Date: 13/05/11 +* Time: 11:10 +* To change this template use File | Settings | File Templates. +*/ +public class BoatParserFormatter implements ValueParserFormatter<Boat> { + + protected Map<Integer, Boat> indexedBoats; + + public BoatParserFormatter(List<Boat> boats) { + indexedBoats = WaoUtils.projectPropertyUnique(boats, Boat.PROPERTY_IMMATRICULATION); + } + + @Override + public String format(Boat boat) { + return String.valueOf(boat.getImmatriculation()); + } + + @Override + public Boat parse(String value) throws ParseException { + String trimmedValue = value.trim(); + if (trimmedValue.isEmpty()) { + throw new IllegalArgumentException(WaoUtils._("wao.import.contact.failure.boatMissing")); + } + Integer key = Integer.valueOf(trimmedValue); + Boat boat = indexedBoats.get(key); + if (boat == null) { + throw new IllegalArgumentException(WaoUtils._("wao.import.contact.failure.wrongBoat", value)); + } + return boat; + } +} Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/operations/CompanyParserFormatter.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/operations/CompanyParserFormatter.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/operations/CompanyParserFormatter.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -0,0 +1,53 @@ +package fr.ifremer.wao.io.csv2.models.operations; + +import fr.ifremer.wao.WaoUtils; +import fr.ifremer.wao.entity.Company; +import fr.ifremer.wao.io.csv2.ValueParserFormatter; +import org.apache.commons.lang.StringUtils; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** +* Created by IntelliJ IDEA. +* User: brendan +* Date: 13/05/11 +* Time: 10:53 +* To change this template use File | Settings | File Templates. +*/ +public class CompanyParserFormatter implements ValueParserFormatter<Company> { + + protected List<Company> companies; + + protected Map<String, Company> indexedCompanies; + + public CompanyParserFormatter(List<Company> companies) { + this.companies = companies; + } + + @Override + public String format(Company company) { + String companyName = ""; + if (company != null) { + companyName = company.getName(); + } + return companyName; + } + + @Override + public Company parse(String companyName) throws ParseException { + if (indexedCompanies == null) { + indexedCompanies = WaoUtils.projectPropertyUnique(companies, Company.PROPERTY_NAME); + } + Company company = null; + if (StringUtils.isNotBlank(companyName)) { + company = indexedCompanies.get(companyName.trim()); + if (company == null) { + throw new IllegalArgumentException("Il n'y a pas de société ayant pour nom '" + + companyName + "'"); + } + } + return company; + } +} Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -49,6 +49,7 @@ import fr.ifremer.wao.bean.ValidationResult; import fr.ifremer.wao.bean.ValidationResultImpl; import fr.ifremer.wao.entity.Boat; +import fr.ifremer.wao.entity.BoatDAO; import fr.ifremer.wao.entity.Company; import fr.ifremer.wao.entity.CompanyDAO; import fr.ifremer.wao.entity.Contact; @@ -615,6 +616,8 @@ row.getObservationUnit(); row.sizeElligibleBoat(); row.sizeObservers(); + + row.getBoat(); } } @@ -911,7 +914,7 @@ if (ObsProgram.OBSDEB.equals(filter.getObsProgram())) { - ExportModel<SampleRow> exportModel = new SamplingPlanImportExportModel(user); + ExportModel<SampleRow> exportModel = new SamplingPlanImportExportModel(user, filter.getExpectedObservationType()); Export<SampleRow> export = new Export(exportModel, rows); csv = export.startExport(); @@ -1035,12 +1038,11 @@ CompanyDAO companyDAO = WaoDAOHelper.getCompanyDAO(transaction); List<Company> allCompanies = companyDAO.findAll(); - if (observationUnits.isEmpty()) { - throw new IllegalStateException("Le référentiel de stratification n'a pas été importé"); - } + BoatDAO boatDAO = WaoDAOHelper.getBoatDAO(transaction); + List<Boat> allActiveBoats = boatDAO.findAllByActive(true); ImportModel<SampleRow> samplingPlanImportModel = - new SamplingPlanImportExportModel(connectedUser, observationUnits, waoUsers, allCompanies); + new SamplingPlanImportExportModel(connectedUser, observationUnits, waoUsers, allCompanies, allActiveBoats); try { Import<SampleRow> samplingPlanImport = new Import<SampleRow>(samplingPlanImportModel, input); @@ -1492,10 +1494,14 @@ } if (connectedUser.isObsDeb() && connectedUser.isObserver()) { + // observer can only see the row he has been associated samplingFilter.setSampleRowObserver(connectedUser.getUser()); } - samplingFilter.setOrderBy(SampleRow.PROPERTY_EXPECTED_DATE); + if (connectedUser.isObsDeb()) { + // in ObsDeb, ordering is done by date of action + samplingFilter.setOrderBy(SampleRow.PROPERTY_EXPECTED_DATE); + } return samplingFilter; } Modified: trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties =================================================================== --- trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties 2011-05-16 09:45:06 UTC (rev 1275) @@ -26,6 +26,7 @@ ObsProgram.OBSVENTE=ObsVente ObservationType.FIELD_WORK_OBSERVATION=Field work observation ObservationType.FIELD_WORK_SURVEY=Field work survey +ObservationType.PHONE_CALL=Survey by phone SamplingStrategy.SIMULTANEOUS_ALL_SPECIES=Simultaneous \: All commercial species SamplingStrategy.SIMULTANEOUS_G1_G2_SPECIES=Simultaneous \: G1+G2 species SamplingStrategy.SIMULTANEOUS_G1_SPECIES=Simultaneous \: G1 species Modified: trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties =================================================================== --- trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties 2011-05-16 09:45:06 UTC (rev 1275) @@ -1,175 +1,176 @@ ContactPieChartConstant.OTHER=Autres -ContactPieChartConstant.REALIZED=R\u00E9alis\u00E9s -ContactPieChartConstant.REFUSED=Refus\u00E9s -ContactState.CONTACT_DEFINITELY_REFUSED=Refus d\u00E9finitif +ContactPieChartConstant.REALIZED=R\u00e9alis\u00e9s +ContactPieChartConstant.REFUSED=Refus\u00e9s +ContactState.CONTACT_DEFINITELY_REFUSED=Refus d\u00e9finitif ContactState.CONTACT_REFUSED=Refus ContactState.CONTACT_START=Contact pris -ContactState.OBSERVATION_CANCELLED=Annul\u00E9e -ContactState.OBSERVATION_DONE=Observation r\u00E9alis\u00E9e -ContactState.OBSERVATION_EXPECTED=Observation programm\u00E9e -ContactState.OBSERVATION_NOT_DONE=Non observ\u00E9 -DataReliability.CORRECTION_ASKED=Correction demand\u00E9e +ContactState.OBSERVATION_CANCELLED=Annul\u00e9e +ContactState.OBSERVATION_DONE=Observation r\u00e9alis\u00e9e +ContactState.OBSERVATION_EXPECTED=Observation programm\u00e9e +ContactState.OBSERVATION_NOT_DONE=Non observ\u00e9 +DataReliability.CORRECTION_ASKED=Correction demand\u00e9e DataReliability.DOUBTFUL=Douteuse -DataReliability.NOT_PROVIDED=Non contr\u00F4l\u00E9e +DataReliability.NOT_PROVIDED=Non contr\u00f4l\u00e9e DataReliability.NOT_RELIABLE=Non exploitable DataReliability.RELIABLE=Exploitable DataReliability.UNKNOWN=Inconnue -GlobalIndicatorValue.BAD=P\u00E9nalit\u00E9 de niveau 1 +GlobalIndicatorValue.BAD=P\u00e9nalit\u00e9 de niveau 1 GlobalIndicatorValue.GOOD=Bonus de niveau 1 GlobalIndicatorValue.NEUTRAL=Conforme au cahier des charges -GlobalIndicatorValue.VERY_BAD=P\u00E9nalit\u00E9 de niveau 2 +GlobalIndicatorValue.VERY_BAD=P\u00e9nalit\u00e9 de niveau 2 GlobalIndicatorValue.VERY_GOOD=Bonus de niveau 2 -LocationType.AUCTION=Cri\u00E9e +LocationType.AUCTION=Cri\u00e9e LocationType.PORT=Port ObsProgram.OBSDEB=ObsDeb ObsProgram.OBSMER=ObsMer ObsProgram.OBSVENTE=ObsVente ObservationType.FIELD_WORK_OBSERVATION=Observation de terrain -ObservationType.FIELD_WORK_SURVEY=Enqu\u00EAte de terrain -SamplingStrategy.SIMULTANEOUS_ALL_SPECIES=Simultan\u00E9 \: Toutes esp\u00E8ces commerciales -SamplingStrategy.SIMULTANEOUS_G1_G2_SPECIES=Simultan\u00E9 \: esp\u00E8ces G1+G2 -SamplingStrategy.SIMULTANEOUS_G1_SPECIES=Simultan\u00E9 \: esp\u00E8ces G1 -SamplingStrategy.SPECIFIC_STOCK=Stock sp\u00E9cifique -SynthesisId.DISTINCT_BOATS_COUNTS=Nombres de navires distincts observ\u00E9s -SynthesisId.GRAPH_BOARDING=Taux d'embarquement sur un m\u00EAme navire conforme aux exigences -SynthesisId.GRAPH_SAMPLING=Taux de r\u00E9alisation du plan d'\u00E9chantillonage -SynthesisId.IND_ALLEGRO_REACTIVITY=D\u00E9lais de transmission des donn\u00E9es -SynthesisId.IND_COMPLIANCE_BOARDING=Respect du nombre d'observateurs embarqu\u00E9s -SynthesisId.IND_CONTACT_STATE=\u00C9tats des contacts -SynthesisId.IND_DATA_RELIABILITY=Qualit\u00E9 de la donn\u00E9e -SynthesisId.OBSERVATION_HOUR=Heures d'observation dans la journ\u00E9e +ObservationType.FIELD_WORK_SURVEY=Enqu\u00eate de terrain +ObservationType.PHONE_CALL=Enqu\u00eate t\u00e9l\u00e9phonique +SamplingStrategy.SIMULTANEOUS_ALL_SPECIES=Simultan\u00e9 \: Toutes esp\u00e8ces commerciales +SamplingStrategy.SIMULTANEOUS_G1_G2_SPECIES=Simultan\u00e9 \: esp\u00e8ces G1+G2 +SamplingStrategy.SIMULTANEOUS_G1_SPECIES=Simultan\u00e9 \: esp\u00e8ces G1 +SamplingStrategy.SPECIFIC_STOCK=Stock sp\u00e9cifique +SynthesisId.DISTINCT_BOATS_COUNTS=Nombres de navires distincts observ\u00e9s +SynthesisId.GRAPH_BOARDING=Taux d'embarquement sur un m\u00eame navire conforme aux exigences +SynthesisId.GRAPH_SAMPLING=Taux de r\u00e9alisation du plan d'\u00e9chantillonage +SynthesisId.IND_ALLEGRO_REACTIVITY=D\u00e9lais de transmission des donn\u00e9es +SynthesisId.IND_COMPLIANCE_BOARDING=Respect du nombre d'observateurs embarqu\u00e9s +SynthesisId.IND_CONTACT_STATE=\u00c9tats des contacts +SynthesisId.IND_DATA_RELIABILITY=Qualit\u00e9 de la donn\u00e9e +SynthesisId.OBSERVATION_HOUR=Heures d'observation dans la journ\u00e9e UserRole.ADMIN=Administrateur UserRole.COORDINATOR=Coordinateur -UserRole.GUEST=Invit\u00E9 +UserRole.GUEST=Invit\u00e9 UserRole.OBSERVER=Observateur UserRole.PROFESSIONAL=Professionnel csv.import.error.missingMandatoryHeaders=Les champs obligatoires %s sont manquants -csv.import.error.unableToParseValue=Erreur lors de l'interpr\u00E9tation de la valeur '%s' (colonne '%s', ligne %s) -csv.import.error.unableToReadField=Impossible de lire la colonne '%s' \u00E0 la ligne %s +csv.import.error.unableToParseValue=Erreur lors de l'interpr\u00e9tation de la valeur '%s' (colonne '%s', ligne %s) +csv.import.error.unableToReadField=Impossible de lire la colonne '%s' \u00e0 la ligne %s csv.import.error.unableToReadLine=Impossible de lire la ligne %s -csv.import.error.unableToSetValue=Impossible d'enregistrer la valeur '%s' (entit\u00E9 '%s', ligne %s) +csv.import.error.unableToSetValue=Impossible d'enregistrer la valeur '%s' (entit\u00e9 '%s', ligne %s) csv.import.error.unrecognizedHeaders=Les champs %s ne sont pas reconnus. Les champs possibles sont %s. csv.import.logComment=Modification depuis import -fr.ifremer.wao.entity.FishingGearDCF.=Non sp\u00E9cifi\u00E9 -fr.ifremer.wao.entity.FishingGearDCF.DRB=Dragues remorqu\u00E9es par bateau -fr.ifremer.wao.entity.FishingGearDCF.DRH=Dragues \u00E0 main -fr.ifremer.wao.entity.FishingGearDCF.FAR=Pi\u00E8ges a\u00E9riens -fr.ifremer.wao.entity.FishingGearDCF.FCN=\u00C9perviers -fr.ifremer.wao.entity.FishingGearDCF.FG=Autres engins retombants (non-sp\u00E9cifi\u00E9s) -fr.ifremer.wao.entity.FishingGearDCF.FIX=Pi\u00E8ges (non-sp\u00E9cifi\u00E9s) -fr.ifremer.wao.entity.FishingGearDCF.FPN=Filets-pi\u00E8ges fixes non couverts +fr.ifremer.wao.entity.FishingGearDCF.=Non sp\u00e9cifi\u00e9 +fr.ifremer.wao.entity.FishingGearDCF.DRB=Dragues remorqu\u00e9es par bateau +fr.ifremer.wao.entity.FishingGearDCF.DRH=Dragues \u00e0 main +fr.ifremer.wao.entity.FishingGearDCF.FAR=Pi\u00e8ges a\u00e9riens +fr.ifremer.wao.entity.FishingGearDCF.FCN=\u00c9perviers +fr.ifremer.wao.entity.FishingGearDCF.FG=Autres engins retombants (non-sp\u00e9cifi\u00e9s) +fr.ifremer.wao.entity.FishingGearDCF.FIX=Pi\u00e8ges (non-sp\u00e9cifi\u00e9s) +fr.ifremer.wao.entity.FishingGearDCF.FPN=Filets-pi\u00e8ges fixes non couverts fr.ifremer.wao.entity.FishingGearDCF.FPO=Nasses (casiers) -fr.ifremer.wao.entity.FishingGearDCF.FSN=Filets \u00E0 l'\u00E9talage (diables) +fr.ifremer.wao.entity.FishingGearDCF.FSN=Filets \u00e0 l'\u00e9talage (diables) fr.ifremer.wao.entity.FishingGearDCF.FWR=Barrages, parcs, bordigues, etc. fr.ifremer.wao.entity.FishingGearDCF.FYK=Verveux -fr.ifremer.wao.entity.FishingGearDCF.GEN=Filets maillants et filets emm\u00E9lants (non sp\u00E9cifi\u00E9s) -fr.ifremer.wao.entity.FishingGearDCF.GES=Tamis \u00E0 civelles -fr.ifremer.wao.entity.FishingGearDCF.GN=Filets maillants (non sp\u00E9cifi\u00E9s) +fr.ifremer.wao.entity.FishingGearDCF.GEN=Filets maillants et filets emm\u00e9lants (non sp\u00e9cifi\u00e9s) +fr.ifremer.wao.entity.FishingGearDCF.GES=Tamis \u00e0 civelles +fr.ifremer.wao.entity.FishingGearDCF.GN=Filets maillants (non sp\u00e9cifi\u00e9s) fr.ifremer.wao.entity.FishingGearDCF.GNC=Filets maillants encerclants -fr.ifremer.wao.entity.FishingGearDCF.GND=Filets maillants d\u00E9rivants (filets d\u00E9rivants) +fr.ifremer.wao.entity.FishingGearDCF.GND=Filets maillants d\u00e9rivants (filets d\u00e9rivants) fr.ifremer.wao.entity.FishingGearDCF.GNF=Filets maillants fixes (sur perches) -fr.ifremer.wao.entity.FishingGearDCF.GNS=Filets maillants cal\u00E9s (ancr\u00E9s) -fr.ifremer.wao.entity.FishingGearDCF.GT=Tr\u00E9mailleurs -fr.ifremer.wao.entity.FishingGearDCF.GTN=Tr\u00E9mails et filets maillants combin\u00E9s -fr.ifremer.wao.entity.FishingGearDCF.GTR=Tr\u00E9mails +fr.ifremer.wao.entity.FishingGearDCF.GNS=Filets maillants cal\u00e9s (ancr\u00e9s) +fr.ifremer.wao.entity.FishingGearDCF.GT=Tr\u00e9mailleurs +fr.ifremer.wao.entity.FishingGearDCF.GTN=Tr\u00e9mails et filets maillants combin\u00e9s +fr.ifremer.wao.entity.FishingGearDCF.GTR=Tr\u00e9mails fr.ifremer.wao.entity.FishingGearDCF.HAR=Harpons -fr.ifremer.wao.entity.FishingGearDCF.HMD=Dragues m\u00E9canis\u00E9es +fr.ifremer.wao.entity.FishingGearDCF.HMD=Dragues m\u00e9canis\u00e9es fr.ifremer.wao.entity.FishingGearDCF.HMP=Pompes -fr.ifremer.wao.entity.FishingGearDCF.HMX=Engins de r\u00E9colte (non sp\u00E9cifi\u00E9s) +fr.ifremer.wao.entity.FishingGearDCF.HMX=Engins de r\u00e9colte (non sp\u00e9cifi\u00e9s) fr.ifremer.wao.entity.FishingGearDCF.LA=Filets tournants sans coulisse (filet lamparo) -fr.ifremer.wao.entity.FishingGearDCF.LHM=Lignes \u00E0 main et lignes avec cannes -fr.ifremer.wao.entity.FishingGearDCF.LHP=Lignes \u00E0 main et lignes \u00E0 cannes -fr.ifremer.wao.entity.FishingGearDCF.LL=Palangres (non sp\u00E9cifi\u00E9es) -fr.ifremer.wao.entity.FishingGearDCF.LLD=Palangres d\u00E9rivantes -fr.ifremer.wao.entity.FishingGearDCF.LLS=Palangres cal\u00E9es ou semi-flottantes -fr.ifremer.wao.entity.FishingGearDCF.LN=Filets soulev\u00E9s (non sp\u00E9cifi\u00E9s) -fr.ifremer.wao.entity.FishingGearDCF.LNB=Filets soulev\u00E9s man\u0153uvr\u00E9es du bateau -fr.ifremer.wao.entity.FishingGearDCF.LNP=Filets soulev\u00E9s portatifs -fr.ifremer.wao.entity.FishingGearDCF.LNS=Filets soulev\u00E9s fixes man\u0153uvr\u00E9es du rivage -fr.ifremer.wao.entity.FishingGearDCF.LTL=lignes de tra\u00EEne -fr.ifremer.wao.entity.FishingGearDCF.LX=Hame\u00E7ons et lignes (non sp\u00E9cifi\u00E9s) +fr.ifremer.wao.entity.FishingGearDCF.LHM=Lignes \u00e0 main et lignes avec cannes +fr.ifremer.wao.entity.FishingGearDCF.LHP=Lignes \u00e0 main et lignes \u00e0 cannes +fr.ifremer.wao.entity.FishingGearDCF.LL=Palangres (non sp\u00e9cifi\u00e9es) +fr.ifremer.wao.entity.FishingGearDCF.LLD=Palangres d\u00e9rivantes +fr.ifremer.wao.entity.FishingGearDCF.LLS=Palangres cal\u00e9es ou semi-flottantes +fr.ifremer.wao.entity.FishingGearDCF.LN=Filets soulev\u00e9s (non sp\u00e9cifi\u00e9s) +fr.ifremer.wao.entity.FishingGearDCF.LNB=Filets soulev\u00e9s man\u0153uvr\u00e9es du bateau +fr.ifremer.wao.entity.FishingGearDCF.LNP=Filets soulev\u00e9s portatifs +fr.ifremer.wao.entity.FishingGearDCF.LNS=Filets soulev\u00e9s fixes man\u0153uvr\u00e9es du rivage +fr.ifremer.wao.entity.FishingGearDCF.LTL=lignes de tra\u00eene +fr.ifremer.wao.entity.FishingGearDCF.LX=Hame\u00e7ons et lignes (non sp\u00e9cifi\u00e9s) fr.ifremer.wao.entity.FishingGearDCF.MIS=Divers -fr.ifremer.wao.entity.FishingGearDCF.NK=Engins inconnus ou non sp\u00E9cifi\u00E9s -fr.ifremer.wao.entity.FishingGearDCF.OT=Chaluts \u00E0 panneaux (non sp\u00E9cifi\u00E9) -fr.ifremer.wao.entity.FishingGearDCF.OTB=Chalut de fond \u00E0 panneaux -fr.ifremer.wao.entity.FishingGearDCF.OTM=Chaluts p\u00E9lagiques \u00E0 panneaux -fr.ifremer.wao.entity.FishingGearDCF.OTT=Chaluts jumeaux \u00E0 panneaux +fr.ifremer.wao.entity.FishingGearDCF.NK=Engins inconnus ou non sp\u00e9cifi\u00e9s +fr.ifremer.wao.entity.FishingGearDCF.OT=Chaluts \u00e0 panneaux (non sp\u00e9cifi\u00e9) +fr.ifremer.wao.entity.FishingGearDCF.OTB=Chalut de fond \u00e0 panneaux +fr.ifremer.wao.entity.FishingGearDCF.OTM=Chaluts p\u00e9lagiques \u00e0 panneaux +fr.ifremer.wao.entity.FishingGearDCF.OTT=Chaluts jumeaux \u00e0 panneaux fr.ifremer.wao.entity.FishingGearDCF.PS=Filets tournants avec coulisse (sennes coulissantes) -fr.ifremer.wao.entity.FishingGearDCF.PS1=Filets tournants, sennes coulissantes man\u0153uvr\u00E9es par un bateau -fr.ifremer.wao.entity.FishingGearDCF.PS2=Filets tournants, sennes coulissantes man\u0153uvr\u00E9es par deux bateaux -fr.ifremer.wao.entity.FishingGearDCF.PT=Chalut-b\u0153ufs (non sp\u00E9cifi\u00E9) +fr.ifremer.wao.entity.FishingGearDCF.PS1=Filets tournants, sennes coulissantes man\u0153uvr\u00e9es par un bateau +fr.ifremer.wao.entity.FishingGearDCF.PS2=Filets tournants, sennes coulissantes man\u0153uvr\u00e9es par deux bateaux +fr.ifremer.wao.entity.FishingGearDCF.PT=Chalut-b\u0153ufs (non sp\u00e9cifi\u00e9) fr.ifremer.wao.entity.FishingGearDCF.PTB=Chalut-b\u0153ufs de fond -fr.ifremer.wao.entity.FishingGearDCF.PTM=Chalut-b\u0153ufs p\u00E9lagiques -fr.ifremer.wao.entity.FishingGearDCF.RG=Engins de p\u00EAche r\u00E9vr\u00E9ative +fr.ifremer.wao.entity.FishingGearDCF.PTM=Chalut-b\u0153ufs p\u00e9lagiques +fr.ifremer.wao.entity.FishingGearDCF.RG=Engins de p\u00eache r\u00e9vr\u00e9ative fr.ifremer.wao.entity.FishingGearDCF.SB=Sennes de plages fr.ifremer.wao.entity.FishingGearDCF.SDN=Sennes danoises -fr.ifremer.wao.entity.FishingGearDCF.SPR=Sennes man\u0153uvr\u00E9es par deux bateaux -fr.ifremer.wao.entity.FishingGearDCF.SSC=Sennes \u00E9cossaises -fr.ifremer.wao.entity.FishingGearDCF.SV=Sennes hal\u00E9es \u00E0 bord -fr.ifremer.wao.entity.FishingGearDCF.SW=Sennes (non sp\u00E9cifi\u00E9es) -fr.ifremer.wao.entity.FishingGearDCF.TB=Chalut de fond (non sp\u00E9cifi\u00E9) -fr.ifremer.wao.entity.FishingGearDCF.TBB=Chaluts \u00E0 perche -fr.ifremer.wao.entity.FishingGearDCF.TBN=Chalut \u00E0 langoustines -fr.ifremer.wao.entity.FishingGearDCF.TBS=Chalut \u00E0 crevettes -fr.ifremer.wao.entity.FishingGearDCF.TM=Chalut p\u00E9lagique (non sp\u00E9cifi\u00E9) -fr.ifremer.wao.entity.FishingGearDCF.TMS=Chalut \u00E0 crevettes -fr.ifremer.wao.entity.FishingGearDCF.TX=Autre chalut (non sp\u00E9cifi\u00E9) -fr.ifremer.wao.entity.TargetSpeciesDCF.=Non sp\u00E9cifi\u00E9 +fr.ifremer.wao.entity.FishingGearDCF.SPR=Sennes man\u0153uvr\u00e9es par deux bateaux +fr.ifremer.wao.entity.FishingGearDCF.SSC=Sennes \u00e9cossaises +fr.ifremer.wao.entity.FishingGearDCF.SV=Sennes hal\u00e9es \u00e0 bord +fr.ifremer.wao.entity.FishingGearDCF.SW=Sennes (non sp\u00e9cifi\u00e9es) +fr.ifremer.wao.entity.FishingGearDCF.TB=Chalut de fond (non sp\u00e9cifi\u00e9) +fr.ifremer.wao.entity.FishingGearDCF.TBB=Chaluts \u00e0 perche +fr.ifremer.wao.entity.FishingGearDCF.TBN=Chalut \u00e0 langoustines +fr.ifremer.wao.entity.FishingGearDCF.TBS=Chalut \u00e0 crevettes +fr.ifremer.wao.entity.FishingGearDCF.TM=Chalut p\u00e9lagique (non sp\u00e9cifi\u00e9) +fr.ifremer.wao.entity.FishingGearDCF.TMS=Chalut \u00e0 crevettes +fr.ifremer.wao.entity.FishingGearDCF.TX=Autre chalut (non sp\u00e9cifi\u00e9) +fr.ifremer.wao.entity.TargetSpeciesDCF.=Non sp\u00e9cifi\u00e9 fr.ifremer.wao.entity.TargetSpeciesDCF.ALG=Algues -fr.ifremer.wao.entity.TargetSpeciesDCF.CAT=Esp\u00E8ces catadromes -fr.ifremer.wao.entity.TargetSpeciesDCF.CRU=Crustac\u00E9s +fr.ifremer.wao.entity.TargetSpeciesDCF.CAT=Esp\u00e8ces catadromes +fr.ifremer.wao.entity.TargetSpeciesDCF.CRU=Crustac\u00e9s fr.ifremer.wao.entity.TargetSpeciesDCF.CSJ=Coquilles Saint-Jacques -fr.ifremer.wao.entity.TargetSpeciesDCF.DEF=Esp\u00E8ces d\u00E9mersales -fr.ifremer.wao.entity.TargetSpeciesDCF.DWS=Esp\u00E8ces d'eaux profondes +fr.ifremer.wao.entity.TargetSpeciesDCF.DEF=Esp\u00e8ces d\u00e9mersales +fr.ifremer.wao.entity.TargetSpeciesDCF.DWS=Esp\u00e8ces d'eaux profondes fr.ifremer.wao.entity.TargetSpeciesDCF.FIN=Poisson plats -fr.ifremer.wao.entity.TargetSpeciesDCF.LPF=Grands p\u00E9lagiques +fr.ifremer.wao.entity.TargetSpeciesDCF.LPF=Grands p\u00e9lagiques fr.ifremer.wao.entity.TargetSpeciesDCF.MOL=Mollusques -fr.ifremer.wao.entity.TargetSpeciesDCF.SPF=Petits p\u00E9lagiques -wao.business.boat.validation.immatriculation.wrongFormat=L'immatriculation du navire doit \u00EAtre form\u00E9e de 6 chiffres -wao.business.contact.validation.commentAdminNecessaryForDataReliability=Il faut pr\u00E9ciser dans le commentaire administrateur pourquoi la donn\u00E9e est '%s' -wao.business.contact.validation.dataReliabilityMissingForValidation=Il faut pr\u00E9ciser la qualit\u00E9 de la donn\u00E9e avant de valider +fr.ifremer.wao.entity.TargetSpeciesDCF.SPF=Petits p\u00e9lagiques +wao.business.boat.validation.immatriculation.wrongFormat=L'immatriculation du navire doit \u00eatre form\u00e9e de 6 chiffres +wao.business.contact.validation.commentAdminNecessaryForDataReliability=Il faut pr\u00e9ciser dans le commentaire administrateur pourquoi la donn\u00e9e est '%s' +wao.business.contact.validation.dataReliabilityMissingForValidation=Il faut pr\u00e9ciser la qualit\u00e9 de la donn\u00e9e avant de valider wao.business.entity.UserProfile.description=%s sur %s%s -wao.business.mammalsCapture.mail.message=Bonjour,\n\nUn observateur du programme Obsmer a renseign\u00E9 dans WAO l'information suivante \:\n\nMar\u00E9e \: %s\nM\u00E9tier \: %s\n\nCapture accidentelle \:\n%s\n\nCordialement,\n\nLe programme Obsmer\nhttp\://www.ifremer.fr/wao +wao.business.mammalsCapture.mail.message=Bonjour,\n\nUn observateur du programme Obsmer a renseign\u00e9 dans WAO l'information suivante \:\n\nMar\u00e9e \: %s\nM\u00e9tier \: %s\n\nCapture accidentelle \:\n%s\n\nCordialement,\n\nLe programme Obsmer\nhttp\://www.ifremer.fr/wao wao.business.mammalsCapture.mail.subject=Obsmer WAO\: Information sur capture accidentelle wao.business.other=Autre wao.business.readOnly=(lecture seule) -wao.error.boat.canCreateContact=Impossible de cr\u00E9er un nouveau contact pour la soci\u00E9t\u00E9 %1$s et le navire %2$s (%3$d) -wao.error.boat.getNbBoarding=Impossible de r\u00E9cup\u00E9rer le nombre d'embarquements r\u00E9els depuis le %1$s -wao.error.boatInfos.getNbBoardingForCompany=Impossible de r\u00E9cup\u00E9rer le nombre d'embarquements r\u00E9els depuis le %1$s pour la soci\u00E9t\u00E9 %2$s +wao.error.boat.canCreateContact=Impossible de cr\u00e9er un nouveau contact pour la soci\u00e9t\u00e9 %1$s et le navire %2$s (%3$d) +wao.error.boat.getNbBoarding=Impossible de r\u00e9cup\u00e9rer le nombre d'embarquements r\u00e9els depuis le %1$s +wao.error.boatInfos.getNbBoardingForCompany=Impossible de r\u00e9cup\u00e9rer le nombre d'embarquements r\u00e9els depuis le %1$s pour la soci\u00e9t\u00e9 %2$s wao.error.context.close=Une erreur est survenue pendant la fermeture du contexte principale de ToPIA wao.error.context.encodeString= -wao.error.context.getRootContext=Une erreur est survenue pour la r\u00E9cup\u00E9ration du contexte principale de ToPIA +wao.error.context.getRootContext=Une erreur est survenue pour la r\u00e9cup\u00e9ration du contexte principale de ToPIA wao.error.context.parse=Une erreur est survenue pendant le chargement de la configuration du fichier %1$s wao.error.context.rollback=Une erreur est survenue pendant l'annulation de la transaction courante -wao.error.context.start=Une erreur est survenue pendant le d\u00E9marrage de l'application +wao.error.context.start=Une erreur est survenue pendant le d\u00e9marrage de l'application wao.error.context.stop=Une erreur est survenue pendant la fermeture de l'application -wao.error.sampleMonth.addRealTideTime=Impossible d'enregistrer le nombre de mar\u00E9es r\u00E9els pour le mois de %1$s [ligne \: %2$s] -wao.error.sampleRow.saveSampleRowLog=Impossible d'enregistrer le commentaire \u00E9crit par %1$s -wao.error.serviceBoat.createUpdateCompanyBoatInfos=Impossible de cr\u00E9er ou modifier les informations li\u00E9s au navire %1$d pour la soci\u00E9t\u00E9 %2$s -wao.error.serviceBoat.exportBoatCsv=Impossible d'exporter les navires s\u00E9lectionn\u00E9s +wao.error.sampleMonth.addRealTideTime=Impossible d'enregistrer le nombre de mar\u00e9es r\u00e9els pour le mois de %1$s [ligne \: %2$s] +wao.error.sampleRow.saveSampleRowLog=Impossible d'enregistrer le commentaire \u00e9crit par %1$s +wao.error.serviceBoat.createUpdateCompanyBoatInfos=Impossible de cr\u00e9er ou modifier les informations li\u00e9s au navire %1$d pour la soci\u00e9t\u00e9 %2$s +wao.error.serviceBoat.exportBoatCsv=Impossible d'exporter les navires s\u00e9lectionn\u00e9s wao.error.serviceBoat.getActivityCalendarLogAccessFile= wao.error.serviceBoat.getActivityCalendarLogFile= wao.error.serviceBoat.getBoat=Impossible de charger le navire -wao.error.serviceBoat.getBoatNamesStartWith=Impossible de r\u00E9cup\u00E9rer les navires avec un nom commencant par '%1$s' +wao.error.serviceBoat.getBoatNamesStartWith=Impossible de r\u00e9cup\u00e9rer les navires avec un nom commencant par '%1$s' wao.error.serviceBoat.getBoatsByFilter=Impossible de filtrer la liste des navires -wao.error.serviceBoat.getBoatsByImmatriculations=La cha\u00EEne d'immatriculations est incorrect \! Chaque immatriculation doit poss\u00E9der 6 chiffres -wao.error.serviceBoat.getCompanyBoatInfos=Impossible de r\u00E9cup\u00E9rer les informations du navire immatricul\u00E9 %1$d pour la soci\u00E9t\u00E9 %2$s -wao.error.serviceBoat.getLastActivityCalendar=Impossible de charger le dernier calendrier d'activit\u00E9 du navire %1$s (%2$d) +wao.error.serviceBoat.getBoatsByImmatriculations=La cha\u00eene d'immatriculations est incorrect \! Chaque immatriculation doit poss\u00e9der 6 chiffres +wao.error.serviceBoat.getCompanyBoatInfos=Impossible de r\u00e9cup\u00e9rer les informations du navire immatricul\u00e9 %1$d pour la soci\u00e9t\u00e9 %2$s +wao.error.serviceBoat.getLastActivityCalendar=Impossible de charger le dernier calendrier d'activit\u00e9 du navire %1$s (%2$d) wao.error.serviceBoat.getNbBoatsByFilter=Impossible de filtrer la liste des navires wao.error.serviceBoat.getPossibleValuesForFilter= wao.error.serviceBoat.getShipOwnerNamesContains= -wao.error.serviceBoat.importActivityCalendarCsv=Probl\u00E8me d'import du fichier CSV des calendriers d'activit\u00E9 -wao.error.serviceBoat.importBoatCsv=Probl\u00E8me d'import du fichier CSV. V\u00E9rifiez l'en-t\u00EAte du fichier. +wao.error.serviceBoat.importActivityCalendarCsv=Probl\u00e8me d'import du fichier CSV des calendriers d'activit\u00e9 +wao.error.serviceBoat.importBoatCsv=Probl\u00e8me d'import du fichier CSV. V\u00e9rifiez l'en-t\u00eate du fichier. wao.error.serviceBoat.newBoatFilter= wao.error.serviceCartography.exportContactMotifsStatisticsKml= wao.error.serviceCartography.exportContactStatisticsKml= -wao.error.serviceCartography.importBoatDistrictKml=Impossible d'importer les coordonn\u00E9es des quartiers des navires. V\u00E9rifiez la documentation pour le bon format du fichier Kml. +wao.error.serviceCartography.importBoatDistrictKml=Impossible d'importer les coordonn\u00e9es des quartiers des navires. V\u00e9rifiez la documentation pour le bon format du fichier Kml. wao.error.serviceChart.getContactPieChartData= wao.error.serviceChart.getContactPieChartUrl= wao.error.serviceContact.exportContactCsv=Impossible d'exporter les contacts wao.error.serviceContact.getContact=Impossible de trouver le contact wao.error.serviceContact.getContacts=Impossible de filtrer la liste des contacts -wao.error.serviceContact.getNbContacts=Impossible de compter le nombre de contacts filtr\u00E9s +wao.error.serviceContact.getNbContacts=Impossible de compter le nombre de contacts filtr\u00e9s wao.error.serviceContact.getNewContact=Impossible d'instancier un nouveau contact wao.error.serviceContact.getPossibleValuesForFilter= wao.error.serviceContact.importContactCsv=Impossible d'importer les contacts @@ -180,7 +181,7 @@ wao.error.serviceContact.updateSampleMonthTidesValue= wao.error.serviceContact.validateContact= wao.error.serviceNews.getNewNews= -wao.error.serviceNews.getNews=Impossible de r\u00E9cup\u00E9rer l'ensemble des news +wao.error.serviceNews.getNews=Impossible de r\u00e9cup\u00e9rer l'ensemble des news wao.error.serviceNews.saveNews=Impossible d'enregistrer la news ayant pour titre '%1$s' wao.error.serviceReferential.getAllContactStateMotifs= wao.error.serviceReferential.getAllObservationUnits= @@ -189,83 +190,83 @@ wao.error.serviceReferential.getAllTerrestrialLocations= wao.error.serviceReferential.getCodesDCF5Contains= wao.error.serviceReferential.getFacades=Impossible de charger la liste des facades -wao.error.serviceReferential.getFishingZones=Impossible de charger la liste des secteurs de p\u00EAche -wao.error.serviceReferential.getProfessions=Impossible de charger la liste des m\u00E9tiers -wao.error.serviceReferential.getSectors=Impossible de charger la liste des zones de p\u00EAche +wao.error.serviceReferential.getFishingZones=Impossible de charger la liste des secteurs de p\u00eache +wao.error.serviceReferential.getProfessions=Impossible de charger la liste des m\u00e9tiers +wao.error.serviceReferential.getSectors=Impossible de charger la liste des zones de p\u00eache wao.error.serviceReferential.getTerrestrialDistrict= wao.error.serviceReferential.importContactStateMotifs= -wao.error.serviceReferential.importDCFcodes=Impossible de cr\u00E9er le r\u00E9f\u00E9rentiel des codes DCF -wao.error.serviceReferential.importFishingZoneCsv=Probl\u00E8me d'import du fichier CSV. V\u00E9rifiez l'en-t\u00EAte du fichier \: [ PECHE_DIVISION,PECHE_ZONE,PECHE_FACADE ]. Voir documentation pour plus de d\u00E9tails. +wao.error.serviceReferential.importDCFcodes=Impossible de cr\u00e9er le r\u00e9f\u00e9rentiel des codes DCF +wao.error.serviceReferential.importFishingZoneCsv=Probl\u00e8me d'import du fichier CSV. V\u00e9rifiez l'en-t\u00eate du fichier \: [ PECHE_DIVISION,PECHE_ZONE,PECHE_FACADE ]. Voir documentation pour plus de d\u00e9tails. wao.error.serviceReferential.importInitialContactStateMotifs= wao.error.serviceReferential.importTerrestrialDivisions= wao.error.serviceReferential.importTerrestrialLocations= wao.error.serviceReferential.updateAllContactStatesMotifs= wao.error.serviceSampling.countSampleRows= wao.error.serviceSampling.createSampleRowLog= -wao.error.serviceSampling.createUpdateSampleRow=Impossible de sauvegarder la ligne d'\u00E9chantillon -wao.error.serviceSampling.deleteSampleRow=Impossible de supprimer la ligne d'\u00E9chantillon \: %1$s -wao.error.serviceSampling.exportSamplingPlanCsv=Impossible d'exporter le plan d'\u00E9chantillonnage sur la p\u00E9riode du %1$s au %2$s +wao.error.serviceSampling.createUpdateSampleRow=Impossible de sauvegarder la ligne d'\u00e9chantillon +wao.error.serviceSampling.deleteSampleRow=Impossible de supprimer la ligne d'\u00e9chantillon \: %1$s +wao.error.serviceSampling.exportSamplingPlanCsv=Impossible d'exporter le plan d'\u00e9chantillonnage sur la p\u00e9riode du %1$s au %2$s wao.error.serviceSampling.exportSamplingPlanICalendar= wao.error.serviceSampling.getDCFGears= wao.error.serviceSampling.getDCFSpecies= wao.error.serviceSampling.getNewProfession= wao.error.serviceSampling.getNewSampleMonth= wao.error.serviceSampling.getNewSampleRow= -wao.error.serviceSampling.getNewSampleRowCode=Impossible de r\u00E9cup\u00E9rer un nouveau code pour une ligne d'\u00E9chantillonnage +wao.error.serviceSampling.getNewSampleRowCode=Impossible de r\u00e9cup\u00e9rer un nouveau code pour une ligne d'\u00e9chantillonnage wao.error.serviceSampling.getNewSampleRowLog= wao.error.serviceSampling.getPossibleValuesForFilter= wao.error.serviceSampling.getPrograms=Impossible de charger la liste des programmes -wao.error.serviceSampling.getSampleRow=Impossible de charger la ligne d'\u00E9chantillon ayant pour identifiant \: %1$s -wao.error.serviceSampling.getSampleRowByCode=Impossible de charger la ligne d'\u00E9chantillon ayant pour code %1$s -wao.error.serviceSampling.getSampleRowsByFilter=Impossible de r\u00E9cup\u00E9rer la liste des lignes du plan d'\u00E9chantillonnage +wao.error.serviceSampling.getSampleRow=Impossible de charger la ligne d'\u00e9chantillon ayant pour identifiant \: %1$s +wao.error.serviceSampling.getSampleRowByCode=Impossible de charger la ligne d'\u00e9chantillon ayant pour code %1$s +wao.error.serviceSampling.getSampleRowsByFilter=Impossible de r\u00e9cup\u00e9rer la liste des lignes du plan d'\u00e9chantillonnage wao.error.serviceSampling.getSampleRowsForEligibility= -wao.error.serviceSampling.getSampleRowsOrderedByFishingZone=Impossible de r\u00E9cup\u00E9rer la liste des lignes du plan d'\u00E9chantillonnage +wao.error.serviceSampling.getSampleRowsOrderedByFishingZone=Impossible de r\u00e9cup\u00e9rer la liste des lignes du plan d'\u00e9chantillonnage wao.error.serviceSampling.importSamplingPlanCsv=Erreur lors de l'import du plan wao.error.serviceSampling.newSampleRow= wao.error.serviceSampling.newSamplingFilter= wao.error.serviceSampling.validateSampleRow= wao.error.serviceSynthesis.getAllIndicatorLogs= -wao.error.serviceSynthesis.getBoardingBoats=Impossible de r\u00E9cup\u00E9rer les donn\u00E9es du graphique concernant les embarquements sur les navires +wao.error.serviceSynthesis.getBoardingBoats=Impossible de r\u00e9cup\u00e9rer les donn\u00e9es du graphique concernant les embarquements sur les navires wao.error.serviceSynthesis.getBoatsCount= wao.error.serviceSynthesis.getComplianceBoardingIndicator= -wao.error.serviceSynthesis.getContactDataInputDateReactivity=Impossible de r\u00E9cup\u00E9rer l'indicateur de r\u00E9activit\u00E9 sur les dates de saisies dans Allegro +wao.error.serviceSynthesis.getContactDataInputDateReactivity=Impossible de r\u00e9cup\u00e9rer l'indicateur de r\u00e9activit\u00e9 sur les dates de saisies dans Allegro wao.error.serviceSynthesis.getContactPieChartData= wao.error.serviceSynthesis.getContactPieChartDataByBoatDistrict= wao.error.serviceSynthesis.getContactStateMotifsPieChartDataByBoatDistrict= -wao.error.serviceSynthesis.getContactStateStatistics=Impossible de r\u00E9cup\u00E9rer les statistiques sur les \u00E9tats des contacts +wao.error.serviceSynthesis.getContactStateStatistics=Impossible de r\u00e9cup\u00e9rer les statistiques sur les \u00e9tats des contacts wao.error.serviceSynthesis.getDataReliability= -wao.error.serviceSynthesis.getDataSampling=Impossible de r\u00E9cup\u00E9rer les donn\u00E9es pour le graphique dynamique des efforts de mar\u00E9es +wao.error.serviceSynthesis.getDataSampling=Impossible de r\u00e9cup\u00e9rer les donn\u00e9es pour le graphique dynamique des efforts de mar\u00e9es wao.error.serviceSynthesis.getDistinctBoatsCounts= -wao.error.serviceSynthesis.getGlobalSynthesisParameters=Impossible de r\u00E9cup\u00E9rer les donn\u00E9es concernant les indicateurs pour la synth\u00E8se globale +wao.error.serviceSynthesis.getGlobalSynthesisParameters=Impossible de r\u00e9cup\u00e9rer les donn\u00e9es concernant les indicateurs pour la synth\u00e8se globale wao.error.serviceSynthesis.getGlobalSynthesisResult= -wao.error.serviceSynthesis.getNonComplianceBoardingIndicator=Impossible de r\u00E9cup\u00E9rer l'indicateur de non respect du nombre d'observateurs embarqu\u00E9s +wao.error.serviceSynthesis.getNonComplianceBoardingIndicator=Impossible de r\u00e9cup\u00e9rer l'indicateur de non respect du nombre d'observateurs embarqu\u00e9s wao.error.serviceSynthesis.getObservationHours= -wao.error.serviceSynthesis.updateGlobalSynthesisParameters=Impossible de mettre \u00E0 jour les param\u00E8tres de la synth\u00E8se globale +wao.error.serviceSynthesis.updateGlobalSynthesisParameters=Impossible de mettre \u00e0 jour les param\u00e8tres de la synth\u00e8se globale wao.error.serviceUser.addTokensToAllProfiles= wao.error.serviceUser.connect=Une erreur est survenue lors de la demande de connexion -wao.error.serviceUser.createDefaultAdmin=Impossible de cr\u00E9er l'administrateur par d\u00E9faut -wao.error.serviceUser.createUpdateCompany=Impossible de cr\u00E9er ou de mettre \u00E0 jour la soci\u00E9t\u00E9 -wao.error.serviceUser.createUpdateUser=Impossible de cr\u00E9er ou de mettre \u00E0 jour l'utilisateur -wao.error.serviceUser.deleteCompany=Impossible de supprimer la soci\u00E9t\u00E9 ou de v\u00E9rifier les contraintes de suppression +wao.error.serviceUser.createDefaultAdmin=Impossible de cr\u00e9er l'administrateur par d\u00e9faut +wao.error.serviceUser.createUpdateCompany=Impossible de cr\u00e9er ou de mettre \u00e0 jour la soci\u00e9t\u00e9 +wao.error.serviceUser.createUpdateUser=Impossible de cr\u00e9er ou de mettre \u00e0 jour l'utilisateur +wao.error.serviceUser.deleteCompany=Impossible de supprimer la soci\u00e9t\u00e9 ou de v\u00e9rifier les contraintes de suppression wao.error.serviceUser.deleteUser=Impossible de supprimer l'utilisateur wao.error.serviceUser.existLogin= wao.error.serviceUser.forgetPassword=Impossible d'envoyer le mail d'oubli de mot de passe -wao.error.serviceUser.getCompanies=Impossible de r\u00E9cup\u00E9rer la liste des soci\u00E9t\u00E9s +wao.error.serviceUser.getCompanies=Impossible de r\u00e9cup\u00e9rer la liste des soci\u00e9t\u00e9s wao.error.serviceUser.getCompany= wao.error.serviceUser.getConnectedUserByToken= wao.error.serviceUser.getNewUser=Impossible d'instancier un nouvel utilisateur -wao.error.serviceUser.getObservers=Impossible de r\u00E9cup\u00E9rer la liste des observateurs +wao.error.serviceUser.getObservers=Impossible de r\u00e9cup\u00e9rer la liste des observateurs wao.error.serviceUser.getUserByToken= wao.error.serviceUser.getUserRolesByLogin= -wao.error.serviceUser.getUsersByCompany=Impossible de r\u00E9cup\u00E9rer la liste des utilisateurs de la soci\u00E9t\u00E9 %1$s +wao.error.serviceUser.getUsersByCompany=Impossible de r\u00e9cup\u00e9rer la liste des utilisateurs de la soci\u00e9t\u00e9 %1$s wao.export.ical.desc=avec %s wao.export.ical.title=Observation ObsDeb -wao.import.contact.failure.boatMissing=Il faut pr\u00E9ciser l'immatriculation du navire associ\u00E9 au contact -wao.import.contact.failure.locationTypeMissing=Le type du lieu doit \u00EAtre renseign\u00E9 -wao.import.contact.failure.sampleRowCodeMissing=Il manque le code de la ligne de plan associ\u00E9e +wao.import.contact.failure.boatMissing=Il faut pr\u00e9ciser l'immatriculation du navire associ\u00e9 au contact +wao.import.contact.failure.locationTypeMissing=Le type du lieu doit \u00eatre renseign\u00e9 +wao.import.contact.failure.sampleRowCodeMissing=Il manque le code de la ligne de plan associ\u00e9e wao.import.contact.failure.terrestrialLocationMissing=Il manque le code du lieu wao.import.contact.failure.wrongBoat=Il n'y a pas de navire avec l'immatriculation '%s' wao.import.contact.failure.wrongSampleRowCode=Il n'y a pas de ligne du plan avec le code '%s' wao.import.contact.failure.wrongTerrestrialLocation=Il n'y a pas de lieu de type '%s' ayant pour code '%s' wao.import.failure.wrongUser=Il n'y a pas d'utilisateur ayant pour identifiant '%s' -wao.validation.sampleRow.conflictOnObserver=L'observateur %s ne peut \u00EAtre associ\u00E9 \u00E0 la ligne %s car il doit observer, le m\u00EAme jour, pour la ligne %s +wao.validation.sampleRow.conflictOnObserver=L'observateur %s ne peut \u00eatre associ\u00e9 \u00e0 la ligne %s car il doit observer, le m\u00eame jour, pour la ligne %s Modified: trunk/wao-business/src/main/xmi/wao.zargo =================================================================== (Binary files differ) Modified: trunk/wao-business/src/test/java/fr/ifremer/wao/TestManager.java =================================================================== --- trunk/wao-business/src/test/java/fr/ifremer/wao/TestManager.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/test/java/fr/ifremer/wao/TestManager.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -36,6 +36,7 @@ import org.junit.Ignore; import org.nuiton.topia.TopiaException; import org.nuiton.util.ApplicationConfig; +import org.nuiton.util.DateUtil; import org.nuiton.util.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -150,4 +151,9 @@ public void setCurrentDate(Date date) { context.setCurrentDate(date); } + + public void setCurrentDate(int day, int month, int year) { + Date date = DateUtil.createDate(day, month, year); + setCurrentDate(date); + } } Modified: trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebFixtures.java =================================================================== --- trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebFixtures.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebFixtures.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -27,16 +27,6 @@ protected boolean boatsImported; - protected static final String CSV_CONTENT = - "PLAN_CODE;SOCIETE;REGION_IFREMER_COD;OBSERVATEUR_COD;OBSERVATION_DATE;UNITE_OBSERVATION_COD;OBSERVATEURS;LIGNE_SANS_CONTACTS\n" - + "2011_888;Ifremer;GA;OBS1;05/01/2010;UO007;;N\n" - + "2011_889;Code Lutin;MA;OBS2;25/02/2010;UO087;;N\n" - + "2011_890;Code Lutin;GA;OBS1;13/02/2010;UO007;;N\n" - + "2011_891;Code Lutin;MA;OBS2;13/02/2010;UO087;;N"; - protected static final String CSV_WITH_OBSERVERS_CONTENT = - "PLAN_CODE;REGION_IFREMER_COD;OBSERVATEUR_COD;OBSERVATION_DATE;UNITE_OBSERVATION_COD;OBSERVATEURS;LIGNE_SANS_CONTACTS\n" - + "2011_890;GA;OBS1;13/02/2010;UO007;josh;N"; - public ObsDebFixtures(TestManager manager) { this.manager = manager; } @@ -99,7 +89,7 @@ return moise; } - public WaoUser josh() throws WaoBusinessException { + public WaoUser josh() { if (josh == null) { josh = new WaoUserImpl(); josh.setLogin("josh"); @@ -114,15 +104,24 @@ josh.addUserProfile(adminProfile); josh.addUserProfile(coordinatorProfile); josh.addUserProfile(observerProfile); - manager.getServiceUser().createUpdateUser(josh, false); + try { + manager.getServiceUser().createUpdateUser(josh, false); + } catch (WaoBusinessException e) { + throw new RuntimeException(e); + } josh.setPassword("mdp"); } return josh; } - protected ConnectedUser joshAs(UserRole userRole) throws WaoBusinessException { + protected ConnectedUser joshAs(UserRole userRole) { // first, log in as josh - ConnectedUser connectedUser = manager.getServiceUser().connect(josh().getLogin(), josh().getPassword()); + ConnectedUser connectedUser = null; + try { + connectedUser = manager.getServiceUser().connect(josh().getLogin(), josh().getPassword()); + } catch (WaoBusinessException e) { + throw new RuntimeException(e); + } // then choose profile for (UserProfile userProfile : josh().getUserProfile()) { if (userProfile.getUserRole() == userRole) { @@ -132,23 +131,15 @@ return connectedUser; } - public ConnectedUser joshAsAdministrator() throws WaoBusinessException { + public ConnectedUser joshAsAdministrator() { return joshAs(UserRole.ADMIN); } - public ConnectedUser joshAsCoordinator() throws WaoBusinessException { + public ConnectedUser joshAsCoordinator() { return joshAs(UserRole.COORDINATOR); } - public ConnectedUser joshAsObserver() throws WaoBusinessException { + public ConnectedUser joshAsObserver() { return joshAs(UserRole.OBSERVER); } - - public String initialSamplingPlanCSV() { - return CSV_CONTENT; - } - - public String samplingPlanCSVWithObservers() { - return CSV_WITH_OBSERVERS_CONTENT; - } } \ No newline at end of file Modified: trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebTest.java =================================================================== --- trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebTest.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebTest.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -71,6 +71,19 @@ protected ServiceContact serviceContact; protected ObsDebFixtures fixtures; + protected static final String SAMPLING_PLAN_CSV = + "PLAN_CODE;SOCIETE;REGION_IFREMER_COD;OBSERVATEUR_COD;OBSERVATION_DATE;UNITE_OBSERVATION_COD;OBSERVATEURS;LIGNE_SANS_CONTACTS\n" + + "2011_888;Ifremer;GA;OBS1;05/01/2010;UO007;;N\n" + + "2011_889;Code Lutin;MA;OBS2;25/02/2010;UO087;;N\n" + + "2011_890;Code Lutin;GA;OBS1;13/02/2010;UO007;;N\n" + + "2011_891;Code Lutin;MA;OBS2;13/02/2010;UO087;;N"; + protected static final String SAMPLING_PLAN_WITH_OBSERVERS_CSV = + "PLAN_CODE;REGION_IFREMER_COD;OBSERVATEUR_COD;OBSERVATION_DATE;UNITE_OBSERVATION_COD;OBSERVATEURS;LIGNE_SANS_CONTACTS\n" + + "2011_890;GA;OBS1;13/02/2010;UO007;josh;N"; + protected static final String PHONE_SAMPLING_PLAN_CSV = + "PLAN_CODE;SOCIETE;OBSERVATEUR_COD;OBSERVATION_DATE;NAVIRE_COD;OBSERVATEURS\n" + + "2011_901;Code Lutin;OBS1;6/2010;174258;"; + @Before public void initServices() { serviceUser = manager.getServiceUser(); @@ -110,20 +123,36 @@ adminCanImportTerrestrialDivisions(); // First create add two companies in Wao - manager.setCurrentDate(DateUtil.createDate(2, 1, 2010)); + manager.setCurrentDate(2, 1, 2010); fixtures.ifremer(); fixtures.codeLutin(); // Then, import the sampling plan - manager.setCurrentDate(DateUtil.createDate(3, 1, 2010)); + manager.setCurrentDate(3, 1, 2010); - InputStream input = IOUtils.toInputStream(fixtures.initialSamplingPlanCSV()); + InputStream input = IOUtils.toInputStream(SAMPLING_PLAN_CSV); ImportResults importResults = manager.getServiceSampling().importSamplingPlanCsv(input, fixtures.joshAsAdministrator()); Assert.assertEquals(4, importResults.getNbRowsImported()); Assert.assertEquals(0, importResults.getNbRowsRefused()); } + @Test + public void adminCanImportPhoneSamplingPlan() throws WaoBusinessException { + manager.setCurrentDate(2, 1, 2010); + + fixtures.ifremer(); + fixtures.codeLutin(); + fixtures.boats(); + + manager.setCurrentDate(3, 1, 2010); + + InputStream input = IOUtils.toInputStream(PHONE_SAMPLING_PLAN_CSV); + ImportResults importResults = manager.getServiceSampling().importSamplingPlanCsv(input, fixtures.joshAsAdministrator()); + Assert.assertEquals(1, importResults.getNbRowsImported()); + Assert.assertEquals(0, importResults.getNbRowsRefused()); + } + /** * As an admin, i should be able to read sampling plan * @throws WaoBusinessException if a call to service fail @@ -245,11 +274,11 @@ if (log.isDebugEnabled()) { log.debug("CSV file as it was exported:\n" + csv); - log.debug("CSV file as it will be imported (with observers):\n" + fixtures.samplingPlanCSVWithObservers()); + log.debug("CSV file as it will be imported (with observers):\n" + SAMPLING_PLAN_WITH_OBSERVERS_CSV); } // i can add a column to add observers to each line - serviceSampling.importSamplingPlanCsv(IOUtils.toInputStream(fixtures.samplingPlanCSVWithObservers()), fixtures.joshAsCoordinator()); + serviceSampling.importSamplingPlanCsv(IOUtils.toInputStream(SAMPLING_PLAN_WITH_OBSERVERS_CSV), fixtures.joshAsCoordinator()); // now getting the sampling plan and checking that observers are linked to sample rows SampleRow row2011_890 = serviceSampling.getSampleRowByCode(fixtures.joshAsCoordinator(), "2011_890"); Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/ObsDebSamplingPlan.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/ObsDebSamplingPlan.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/ObsDebSamplingPlan.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -27,6 +27,7 @@ import fr.ifremer.wao.WaoException; import fr.ifremer.wao.bean.ConnectedUser; import fr.ifremer.wao.bean.ObsProgram; +import fr.ifremer.wao.bean.ObservationType; import fr.ifremer.wao.entity.SampleRow; import fr.ifremer.wao.io.ImportResults; import fr.ifremer.wao.service.ServiceContact; @@ -39,6 +40,7 @@ import fr.ifremer.wao.ui.data.RequiresAuthentication; import fr.ifremer.wao.ui.data.SampleRowDataSource; import fr.ifremer.wao.ui.services.SampleRowModelFactory; +import fr.ifremer.wao.ui.services.WaoManager; import org.apache.tapestry5.Block; import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.StreamResponse; @@ -49,7 +51,6 @@ import org.apache.tapestry5.annotations.SessionState; import org.apache.tapestry5.beaneditor.BeanModel; import org.apache.tapestry5.corelib.components.Zone; -import org.apache.tapestry5.grid.GridDataSource; import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.BeanModelSource; @@ -63,7 +64,7 @@ @RequiresAuthentication(allowedPrograms = {ObsProgram.OBSDEB}) public class ObsDebSamplingPlan { - /********* Tapestry stuffs **********/ + //// Tapestry stuffs @Inject private Logger log; @@ -86,6 +87,9 @@ @Inject private Messages messages; + @Inject + private WaoManager manager; + private DateFormat dateFormat; public DateFormat getDateFormat() { @@ -95,13 +99,13 @@ return dateFormat; } - /********* Session ************/ + //// session @SessionState @Property private ConnectedUser connectedUser; - /********* Page layout ***********/ + //// actions of the sub-menu @Persist private Boolean showImport; @@ -130,6 +134,46 @@ return samplingFilter; } + public Block onSuccessFromImportForm() { + showImport = false; + return importZone.getBody(); + } + + public ImportEngine getSamplingPlanImportEngine() { + return new ImportEngine() { + @Override + public ImportResults execute(InputStream input) throws WaoBusinessException { + ImportResults results = serviceSampling.importSamplingPlanCsv(input, connectedUser); + return results; + } + }; + } + + StreamResponse onActionFromExportSamplingPlan() { + return new ExportStreamResponse("wao-echantillonnage-obsdeb") { + @Override + public InputStream getStream() throws IOException { + InputStream csv; + try { + csv = serviceSampling.exportSamplingPlanCsv(connectedUser, samplingFilter.getFilter()); + } catch (WaoException eee) { + throw new IOException(eee); + } + return csv; + } + }; + } + + @Log + void onImported(ErrorReport report) { + for (String info : report.getInfos()) { + layout.addInfo(info); + } + for (String error : report.getErrors()) { + layout.addError(error); + } + } + // FIXME 20110502 bleny clicking on 'export' make the 'import' link still active but content is not showed/hidden @Log @@ -138,8 +182,35 @@ return importZone.getBody(); } - /********* GRID ********/ + protected void setObservationType(ObservationType observationType) { + samplingFilter.getFilter().setExpectedObservationType(observationType); + } + protected ObservationType getObservationType() { + ObservationType observationType = samplingFilter.getFilter().getExpectedObservationType(); + if (observationType == null) { + observationType = ObservationType.FIELD_WORK_OBSERVATION; + setObservationType(observationType); + } + return observationType; + } + + public boolean showFieldWorkSamplingPlan() { + return getObservationType() == ObservationType.FIELD_WORK_OBSERVATION; + } + + public void onActionFromSwitchObservationType() { + ObservationType observationType = getObservationType(); + if (observationType == ObservationType.FIELD_WORK_OBSERVATION) { + observationType = ObservationType.PHONE_CALL; + } else { + observationType = ObservationType.FIELD_WORK_OBSERVATION; + } + setObservationType(observationType); + } + + //// grid data + private SampleRowDataSource sampleRows; @Property @@ -147,6 +218,7 @@ public SampleRowDataSource getSampleRows() { if (sampleRows == null) { + getObservationType(); sampleRows = new SampleRowDataSource(samplingFilter.getFilter(), serviceSampling); } return sampleRows; @@ -159,13 +231,17 @@ SampleRowModelFactory sampleRowModelFactory = new SampleRowModelFactory(beanModelSource, resources, connectedUser, messages, serviceContact); - obsdebSamplingPlanModel = sampleRowModelFactory.newModel(); + obsdebSamplingPlanModel = sampleRowModelFactory.newModel(getObservationType()); } return obsdebSamplingPlanModel; } - /************ ACTIONS ***************/ + public String getBoatDescription() { + return manager.getTooltipBoat(sampleRow.getBoat()); + } + //// grid actions + public boolean canEditSampleRow() { boolean canEditSampleRow = connectedUser.isAdmin() || connectedUser.isCoordinator(); return canEditSampleRow; @@ -177,45 +253,4 @@ serviceSampling.deleteSampleRow(sampleRow); } - /********** IMPORT / EXPORT *********/ - - public Block onSuccessFromImportForm() { - showImport = false; - return importZone.getBody(); - } - - public ImportEngine getSamplingPlanImportEngine() { - return new ImportEngine() { - @Override - public ImportResults execute(InputStream input) throws WaoBusinessException { - ImportResults results = serviceSampling.importSamplingPlanCsv(input, connectedUser); - return results; - } - }; - } - - StreamResponse onActionFromExportSamplingPlan() { - return new ExportStreamResponse("wao-echantillonnage-obsdeb") { - @Override - public InputStream getStream() throws IOException { - InputStream csv; - try { - csv = serviceSampling.exportSamplingPlanCsv(connectedUser, samplingFilter.getFilter()); - } catch (WaoException eee) { - throw new IOException(eee); - } - return csv; - } - }; - } - - @Log - void onImported(ErrorReport report) { - for (String info : report.getInfos()) { - layout.addInfo(info); - } - for (String error : report.getErrors()) { - layout.addError(error); - } - } } Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/SampleRowModelFactory.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/SampleRowModelFactory.java 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/SampleRowModelFactory.java 2011-05-16 09:45:06 UTC (rev 1275) @@ -27,6 +27,7 @@ import fr.ifremer.wao.bean.ConnectedUser; import fr.ifremer.wao.bean.ContactFilter; import fr.ifremer.wao.bean.ContactFilterImpl; +import fr.ifremer.wao.bean.ObservationType; import fr.ifremer.wao.entity.SampleRow; import fr.ifremer.wao.entity.WaoUser; import fr.ifremer.wao.service.ServiceContact; @@ -93,70 +94,62 @@ protected void initModel() { add(SampleRow.PROPERTY_CODE); - if (connectedUser.isAdmin()) { - add("company", new SampleRowReaderPropertyConduit() { + add(SampleRow.PROPERTY_COMPANY, new SampleRowReaderPropertyConduit() { - @Override - public String getValue(SampleRow sampleRow) { - String companyName = ""; - if (sampleRow.getCompany() != null) { - companyName = sampleRow.getCompany().getName(); - } - return companyName; + @Override + public String getValue(SampleRow sampleRow) { + String companyName = ""; + if (sampleRow.getCompany() != null) { + companyName = sampleRow.getCompany().getName(); } - }); - } + return companyName; + } + }); + add("year", new SampleRowReaderPropertyConduit() { - if (connectedUser.isObserver()) { - add("year", new SampleRowReaderPropertyConduit() { + protected DateFormat weekFormat = new SimpleDateFormat("yyyy"); - protected DateFormat weekFormat = new SimpleDateFormat("yyyy"); + @Override + public String getValue(SampleRow sampleRow) { + return weekFormat.format(sampleRow.getExpectedDate()); + } + }); + add("week", new SampleRowReaderPropertyConduit() { - @Override - public String getValue(SampleRow sampleRow) { - return weekFormat.format(sampleRow.getExpectedDate()); - } - }); - add("week", new SampleRowReaderPropertyConduit() { + protected DateFormat weekFormat = new SimpleDateFormat("w"); - protected DateFormat weekFormat = new SimpleDateFormat("w"); + @Override + public String getValue(SampleRow sampleRow) { + return weekFormat.format(sampleRow.getExpectedDate()); + } + }); + add("dayOfWeek", new SampleRowReaderPropertyConduit() { - @Override - public String getValue(SampleRow sampleRow) { - return weekFormat.format(sampleRow.getExpectedDate()); - } - }); - add("dayOfWeek", new SampleRowReaderPropertyConduit() { + protected DateFormat weekFormat = new SimpleDateFormat("EEEE", WaoUtils.getCurrentLocale()); - protected DateFormat weekFormat = new SimpleDateFormat("EEEE", WaoUtils.getCurrentLocale()); + @Override + public String getValue(SampleRow sampleRow) { + return weekFormat.format(sampleRow.getExpectedDate()); + } + }); + add("day", new SampleRowReaderPropertyConduit() { - @Override - public String getValue(SampleRow sampleRow) { - return weekFormat.format(sampleRow.getExpectedDate()); - } - }); - - } - - add(SampleRow.PROPERTY_EXPECTED_DATE, new SampleRowReaderPropertyConduit() { - @Override public String getValue(SampleRow sampleRow) { return WaoUtils.formatDate(sampleRow.getExpectedDate()); } }); - if (connectedUser.isObserver()) { - add("subPopulation", new SampleRowReaderPropertyConduit() { - @Override - public String getValue(SampleRow sampleRow) { - String subPopulation = sampleRow.getObservationUnit().getSubPopulationCode() - + " - " - + sampleRow.getObservationUnit().getSubPopulationName(); - return subPopulation; - } - }); - } + add("subPopulation", new SampleRowReaderPropertyConduit() { + @Override + public String getValue(SampleRow sampleRow) { + String subPopulation = sampleRow.getObservationUnit().getSubPopulationCode() + + " - " + + sampleRow.getObservationUnit().getSubPopulationName(); + return subPopulation; + } + }); add(SampleRow.PROPERTY_OBSERVATION_UNIT); + add(SampleRow.PROPERTY_BOAT); add("actual", new SampleRowReaderPropertyConduit() { protected String yes = messages.get("wao.ui.misc.yes"); @@ -200,7 +193,22 @@ add("actions", null); } + protected void filterModel(ObservationType observationType) { + if ( ! connectedUser.isAdmin()) { + model.exclude(SampleRow.PROPERTY_COMPANY); + } + if ( ! connectedUser.isObserver()) { + model.exclude("subPopulation", "dayOfWeek"); + } + + if (observationType == ObservationType.PHONE_CALL) { + model.exclude("dayOfWeek", "day", "subPopulation", SampleRow.PROPERTY_OBSERVATION_UNIT); + } else { + model.exclude(SampleRow.PROPERTY_BOAT); + } + } + /** put in common some implementation of PropertyConduit interface. */ protected static abstract class SampleRowReaderPropertyConduit implements PropertyConduit { @@ -232,10 +240,11 @@ } } - public BeanModel<SampleRow> newModel() { + public BeanModel<SampleRow> newModel(ObservationType observationType) { model = beanModelSource.createDisplayModel(SampleRow.class, resources.getMessages()); model.include(); // empty the model to include only what we want initModel(); + filterModel(observationType); return model; } } Modified: trunk/wao-ui/src/main/resources/i18n/wao-ui_en_GB.properties =================================================================== --- trunk/wao-ui/src/main/resources/i18n/wao-ui_en_GB.properties 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-ui/src/main/resources/i18n/wao-ui_en_GB.properties 2011-05-16 09:45:06 UTC (rev 1275) @@ -113,12 +113,14 @@ wao.ui.field.Contact.validationProgram=Program validation wao.ui.field.FishingZone.facadeName=Facade wao.ui.field.FishingZone.sectorName=Sector +wao.ui.field.SampleRow.boat=Boat wao.ui.field.SampleRow.code=Line code wao.ui.field.SampleRow.comment=Comment wao.ui.field.SampleRow.company=Company wao.ui.field.SampleRow.dCF5Code=DCF5 Codes wao.ui.field.SampleRow.day=Day wao.ui.field.SampleRow.dcf5Code=DCF5 code +wao.ui.field.SampleRow.expectedDate=Date wao.ui.field.SampleRow.fishingZones=Fishing zone(s) wao.ui.field.SampleRow.libelle=Labels wao.ui.field.SampleRow.meshSize=Mesh size Modified: trunk/wao-ui/src/main/resources/i18n/wao-ui_fr_FR.properties =================================================================== --- trunk/wao-ui/src/main/resources/i18n/wao-ui_fr_FR.properties 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-ui/src/main/resources/i18n/wao-ui_fr_FR.properties 2011-05-16 09:45:06 UTC (rev 1275) @@ -112,12 +112,14 @@ wao.ui.field.Contact.validationProgram=Validation programme wao.ui.field.FishingZone.facadeName=Fa\u00E7ade wao.ui.field.FishingZone.sectorName=Zone +wao.ui.field.SampleRow.boat=Navire wao.ui.field.SampleRow.code=Code ligne wao.ui.field.SampleRow.comment=Commentaire wao.ui.field.SampleRow.company=Soci\u00E9t\u00E9 wao.ui.field.SampleRow.dCF5Code=Codes wao.ui.field.SampleRow.day=Jour wao.ui.field.SampleRow.dcf5Code=Code DCF Niv. 5 +wao.ui.field.SampleRow.expectedDate=Date wao.ui.field.SampleRow.fishingZones=Zone(s) de p\u00EAche wao.ui.field.SampleRow.libelle=Libell\u00E9 wao.ui.field.SampleRow.meshSize=Maillage Modified: trunk/wao-ui/src/main/webapp/ObsDebSamplingPlan.tml =================================================================== --- trunk/wao-ui/src/main/webapp/ObsDebSamplingPlan.tml 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-ui/src/main/webapp/ObsDebSamplingPlan.tml 2011-05-16 09:45:06 UTC (rev 1275) @@ -28,6 +28,16 @@ <ul id="so-submenu" style="clear: left;"> <li> + <t:actionlink t:id="switchObservationType"> + <t:if t:test="showFieldWorkSamplingPlan()"> + Voir le plan d'échantillonnage téléphonique + <p:else> + Voir le plan d'échantillonnage de terrain + </p:else> + </t:if> + </t:actionlink> + </li> + <li> <t:actionlink t:id="showFilters" t:zone="so-sampling-filters"> ${message:wao.ui.misc.advancedSearch} </t:actionlink> @@ -109,7 +119,7 @@ ${message:wao.ui.field.SampleRow.day} </p:dayHeader> - <!-- observation unit --> + <!-- sub population --> <p:subPopulationHeader> ${message:wao.ui.field.TerrestrialDivision.subPopulation} </p:subPopulationHeader> @@ -119,12 +129,22 @@ ${message:wao.ui.field.SampleRow.observationUnit} </p:observationUnitHeader> + <!-- boat --> + <p:boatHeader> + ${message:wao.ui.field.SampleRow.boat} + </p:boatHeader> + <p:boatCell> + <span t:type="ck/Tooltip" title="Infos" t:value="prop:boatDescription" t:effect="appear"> + ${sampleRow.boat.name} + </span> + </p:boatCell> + <!-- observers --> <p:observersHeader> ${message:wao.ui.field.SampleRow.observers} </p:observersHeader> - <!-- observers --> + <!-- actual --> <p:actualHeader> ${message:wao.ui.samplingPlan.actual} </p:actualHeader> Modified: trunk/wao-ui/src/main/webapp/SampleRowForm.tml =================================================================== --- trunk/wao-ui/src/main/webapp/SampleRowForm.tml 2011-05-16 08:01:58 UTC (rev 1274) +++ trunk/wao-ui/src/main/webapp/SampleRowForm.tml 2011-05-16 09:45:06 UTC (rev 1275) @@ -57,8 +57,8 @@ </div> </t:if> <div class="t-beaneditor-row"> - <label for="day">${message:wao.ui.field.SampleRow.day}</label> - <input t:type="datefield" t:id="day" class="date" value="sampleRow.day" /> + <label for="expectedDate">${message:wao.ui.field.SampleRow.expectedDate}</label> + <input t:type="datefield" t:id="expectedDate" class="date" value="sampleRow.expectedDate" /> </div> <div class="acenter"> <label for="observationUnit">${message:wao.ui.field.SampleRow.observationUnit}</label>
participants (1)
-
bleny@users.labs.libre-entreprise.org