Author: bleny Date: 2011-04-21 12:44:08 +0000 (Thu, 21 Apr 2011) New Revision: 1226 Log: add observation type ; filters ; import/export ; contact form ; contacts grid ; migration Added: trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ObservationType.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/entity/ContactImpl.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/ContactImportExportModel.java trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.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/service/ObsDebTest.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Boats.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ContactModelFactory.java trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/components/ContactFilterComponent.tml trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/pages/Contacts_fr.properties 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/ContactForm.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-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/PostgresMigrationCallback.java 2011-04-21 12:44:08 UTC (rev 1226) @@ -862,6 +862,7 @@ @Override protected void addObsDebToContacts_3_0(List<String> queries) { queries.add("ALTER TABLE Contact ADD landingDate TIMESTAMP WITHOUT TIME ZONE;"); + queries.add("ALTER TABLE Contact 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-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/WaoQueryBuilder.java 2011-04-21 12:44:08 UTC (rev 1226) @@ -663,6 +663,10 @@ query.addEquals(contactProperty.contactStateMotif(), filter.getContactStateMotif()); } + if (filter.getObservationType() != null) { + query.addEquals(contactProperty.observationTypeOrdinal(), filter.getObservationType().ordinal()); + } + if (logger.isDebugEnabled()) { logger.debug("query with filters on Contacts is " + query); } Added: trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ObservationType.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ObservationType.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/bean/ObservationType.java 2011-04-21 12:44:08 UTC (rev 1226) @@ -0,0 +1,40 @@ +package fr.ifremer.wao.bean; + +import fr.ifremer.wao.WaoUtils; + +import static org.nuiton.i18n.I18n.n_; + +/** + * In ObsDeb, an observation done may be of different type, when + * the observer create a contact, he must provide the type of observation. + * + * @author bleny + */ +public enum ObservationType { + + /** 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")),; + + protected String i18nKey; + + ObservationType(String i18nKey) { + this.i18nKey = i18nKey; + } + + @Override + public String toString() { + return WaoUtils.translate(i18nKey); + } + + public static ObservationType valueOf(Integer observationTypeOrdinal) { + for (ObservationType observationType : values()) { + if (observationType.ordinal() == observationTypeOrdinal) { + return observationType; + } + } + throw new IllegalArgumentException("ordinal " + observationTypeOrdinal); + } +} Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/entity/ContactImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/entity/ContactImpl.java 2011-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/entity/ContactImpl.java 2011-04-21 12:44:08 UTC (rev 1226) @@ -27,6 +27,7 @@ import fr.ifremer.wao.bean.ContactState; import fr.ifremer.wao.bean.DataReliability; import fr.ifremer.wao.bean.ObsProgram; +import fr.ifremer.wao.bean.ObservationType; import fr.ifremer.wao.bean.SamplingStrategy; import org.nuiton.util.DateUtil; import org.slf4j.Logger; @@ -184,5 +185,21 @@ updateNbObservers(); } + @Override + public ObservationType getObservationType() { + ObservationType observationType = null; + if (getObservationTypeOrdinal() != null) { + observationType = ObservationType.valueOf(getObservationTypeOrdinal()); + } + return observationType; + } + @Override + public void setObservationType(ObservationType observationType) { + if (observationType == null) { + setObservationTypeOrdinal(null); + } else { + setObservationTypeOrdinal(observationType.ordinal()); + } + } } 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-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/csv2/models/ContactImportExportModel.java 2011-04-21 12:44:08 UTC (rev 1226) @@ -28,6 +28,7 @@ import fr.ifremer.wao.bean.DataReliability; import fr.ifremer.wao.bean.LocationType; import fr.ifremer.wao.bean.ObsProgram; +import fr.ifremer.wao.bean.ObservationType; import fr.ifremer.wao.entity.Boat; import fr.ifremer.wao.entity.Contact; import fr.ifremer.wao.entity.ContactImpl; @@ -262,6 +263,7 @@ if (obsProgram == ObsProgram.OBSDEB) { modelBuilder.newColumnForImportExport("CONTACT_DATE_DEBARQUEMENT", Contact.PROPERTY_LANDING_DATE, Common.DAY_TIME); + modelBuilder.newColumnForImportExport("CONTACT_TYPE_OBSERVATION", "observationType", new Common.ToStringParserFormatter(ObservationType.values())); } return modelBuilder; Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java 2011-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java 2011-04-21 12:44:08 UTC (rev 1226) @@ -45,6 +45,7 @@ import fr.ifremer.wao.bean.ContactStatus.NullSampleMonthException; import fr.ifremer.wao.bean.DataReliability; import fr.ifremer.wao.bean.ObsProgram; +import fr.ifremer.wao.bean.ObservationType; import fr.ifremer.wao.bean.SamplingStrategy; import fr.ifremer.wao.bean.ValidationResult; import fr.ifremer.wao.bean.ValidationResultImpl; @@ -456,6 +457,7 @@ newContact.setContactState(ContactState.OBSERVATION_EXPECTED); } else { newContact.setContactState(ContactState.OBSERVATION_DONE); + newContact.setObservationType(ObservationType.FIELD_WORK_OBSERVATION); } ContactDAO dao = WaoDAOHelper.getContactDAO(transaction); 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-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java 2011-04-21 12:44:08 UTC (rev 1226) @@ -1624,4 +1624,17 @@ return new ByteArrayInputStream(outputStream.toByteArray()); } + + @Override + protected List<SampleRow> executeGetSampleRowsForEligibility(TopiaContext transaction, ConnectedUser connectedUser) throws TopiaException { + SamplingFilter samplingFilter = newSamplingFilter(connectedUser); + Date fromDate = samplingFilter.getPeriod().getFromDate(); + Date thruDate = samplingFilter.getPeriod().getThruDate(); + fromDate = DateUtils.addMonths(fromDate, -6); + thruDate = DateUtils.addMonths(thruDate, 6); + samplingFilter.getPeriod().setFromDate(fromDate); + samplingFilter.getPeriod().setThruDate(thruDate); + List<SampleRow> sampleRows = executeGetSampleRowsByFilter(transaction, samplingFilter); + return sampleRows; + } } 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-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-business/src/main/resources/i18n/wao-business_en_GB.properties 2011-04-21 12:44:08 UTC (rev 1226) @@ -23,6 +23,8 @@ ObsProgram.OBSDEB=ObsDeb ObsProgram.OBSMER=ObsMer ObsProgram.OBSVENTE=ObsVente +ObservationType.FIELD_WORK_OBSERVATION=Field work observation +ObservationType.FIELD_WORK_SURVEY=Field work survey SamplingStrategy.SIMULTANEOUS_ALL_SPECIES=Simultaneous \: All commercial species SamplingStrategy.SIMULTANEOUS_G1_G2_SPECIES=Simultaneous \: G1+G2 species SamplingStrategy.SIMULTANEOUS_G1_SPECIES=Simultaneous \: G1 species @@ -211,6 +213,7 @@ wao.error.serviceSampling.getSampleRow= wao.error.serviceSampling.getSampleRowByCode= wao.error.serviceSampling.getSampleRowsByFilter= +wao.error.serviceSampling.getSampleRowsForEligibility= wao.error.serviceSampling.getSampleRowsOrderedByFishingZone= wao.error.serviceSampling.importSamplingPlanCsv= wao.error.serviceSampling.newSamplingFilter= 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-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-business/src/main/resources/i18n/wao-business_fr_FR.properties 2011-04-21 12:44:08 UTC (rev 1226) @@ -23,6 +23,8 @@ 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 @@ -211,6 +213,7 @@ 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.importSamplingPlanCsv=Erreur lors de l'import du plan wao.error.serviceSampling.newSamplingFilter= Modified: trunk/wao-business/src/main/xmi/wao.zargo =================================================================== (Binary files differ) 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-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebTest.java 2011-04-21 12:44:08 UTC (rev 1226) @@ -26,6 +26,7 @@ import fr.ifremer.wao.AbstractServiceTest; import fr.ifremer.wao.WaoBusinessException; import fr.ifremer.wao.bean.ConnectedUser; +import fr.ifremer.wao.bean.ObservationType; import fr.ifremer.wao.bean.SamplingFilter; import fr.ifremer.wao.bean.SamplingFilterValues; import fr.ifremer.wao.bean.ValidationResult; @@ -347,6 +348,9 @@ // let's create the contact Contact contact = serviceContact.getNewContact(fixtures.joshAsObserver(), row, boat); + // by default, a contact must be of type observation + Assert.assertEquals(ObservationType.FIELD_WORK_OBSERVATION, contact.getObservationType()); + // in the observation report, i must tell where i was and when List<TerrestrialLocation> ports = serviceReferential.getAllPorts(contact.getSampleRow().getObservationUnit()); Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Boats.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Boats.java 2011-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Boats.java 2011-04-21 12:44:08 UTC (rev 1226) @@ -562,7 +562,7 @@ /** /////////////////////// FOR EACH ELLIGIBLEBOAT ROW ///////////////// **/ public List<SampleRow> getSampleRows() { - return serviceSampling.getSampleRowsByFilter(serviceSampling.newSamplingFilter(user)); + return serviceSampling.getSampleRowsForEligibility(user); } public List<ElligibleBoat> getElligibleBoatsValues() { Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ContactModelFactory.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ContactModelFactory.java 2011-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/services/ContactModelFactory.java 2011-04-21 12:44:08 UTC (rev 1226) @@ -35,7 +35,6 @@ import org.apache.tapestry5.PropertyConduit; import org.apache.tapestry5.beaneditor.BeanModel; import org.apache.tapestry5.services.BeanModelSource; -import org.nuiton.util.DateUtil; import java.lang.annotation.Annotation; @@ -56,6 +55,7 @@ /** the model the factory will build */ protected BeanModel<Contact> model; + private PropertyConduit observationTypePropertyConduit; public ContactModelFactory(ObsProgram obsProgram, UserRole userRole, boolean fullView) { this.userRole = userRole; @@ -93,6 +93,7 @@ addNonSortableProperty(Contact.PROPERTY_BOAT, getBoatPropertyConduit()); addNonSortableProperty("boatImmatriculation", getBoatImmatriculationPropertyConduit()); addNonSortableProperty("boatDistrictCode", getBoatDistrictCodePropertyConduit()); + addNonSortableProperty("observationType", getObservationTypePropertyConduit()); addNonSortableProperty(Contact.PROPERTY_STATE, null); addNonSortableProperty(Contact.PROPERTY_LANDING_DATE, getLandingDatePropertyConduit()); addNonSortableProperty(Contact.PROPERTY_OBSERVATION_BEGIN_DATE, null); @@ -142,7 +143,7 @@ "fishingZoneSector", "fishingZoneDivision", "professionCode", "program"); } else { - model.exclude(Contact.PROPERTY_LANDING_DATE); + model.exclude(Contact.PROPERTY_LANDING_DATE, "observationType"); } } @@ -386,4 +387,17 @@ }; } + protected PropertyConduit getObservationTypePropertyConduit() { + return new ContactReaderPropertyConduit() { + @Override + public String getValue(Contact contact) { + String value = ""; + if (contact.getObservationType() != null) { + value = contact.getObservationType().toString(); + } + return value; + } + }; + } + } Modified: trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/components/ContactFilterComponent.tml =================================================================== --- trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/components/ContactFilterComponent.tml 2011-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/components/ContactFilterComponent.tml 2011-04-21 12:44:08 UTC (rev 1226) @@ -42,7 +42,7 @@ size="6"/> </div> - <label for="fromDate">${message:wao.ui.misc.since} :</label> + <label for="fromDate">${message:wao.ui.misc.since} :</label> <input t:type="datefield" class="width70" t:id="fromDate" value="filter.fromDate" /> <!-- TODO sletellier 20110407 : not yet implemented --> @@ -53,7 +53,7 @@ t:values="possibleValuesForFilter.stateAsList" t:selectedValues="filter.state"/> --> <t:if t:test="user.admin"> - <label for="company">${message:wao.ui.entity.Company} :</label> + <label for="company">${message:wao.ui.entity.Company} :</label> <t:topiaEntitySelector t:id="company" t:clazzName="Company" t:labelPropertyName="name" @@ -63,26 +63,26 @@ <input t:type="submit" class="ico22px refresh" t:id="refreshByCompany" value="Refresh" title="Rafraîchir les filtres en fonction de la société sélectionnée"/--> </t:if> - <label for="observer">${message:wao.ui.misc.observer} :</label> + <label for="observer">${message:wao.ui.misc.observer} :</label> <t:topiaEntitySelector t:id="observer" t:clazzName="WaoUser" t:labelPropertyName="fullName" t:values="possibleValuesForFilter.observersAsList" t:selectedValue="filter.observer"/> - <label for="state">${message:wao.ui.field.Contact.contactState} :</label> + <label for="state">${message:wao.ui.field.Contact.contactState} :</label> <select t:type="select" t:id="state" value="filter.state" t:model="contactStateSelectModel"/> <!-- fields for ObsMer and ObsVente --> <label>${message:wao.ui.entity.Boat} </label> - <label t:for="boatImmatriculation">${message:wao.ui.field.Boat.immatriculation} :</label> + <label t:for="boatImmatriculation">${message:wao.ui.field.Boat.immatriculation} :</label> <input t:type="textfield" t:id="boatImmatriculation" class="width50" t:value="filter.boatImmatriculation" /> - <label t:for="boatDistrictCode">${message:wao.ui.field.Boat.districtCode} :</label> + <label t:for="boatDistrictCode">${message:wao.ui.field.Boat.districtCode} :</label> <input t:type="textfield" t:id="boatDistrictCode" class="width50" @@ -90,6 +90,10 @@ </div> <t:if test="user.obsDeb"> + <label for="observationType">${message:wao.ui.field.Contact.observationType} :</label> + <input t:type="select" + t:id="observationType" + t:value="filter.observationType" /> <t:delegate to="block:terrestrialLocationBlock" /> <t:block id="terrestrialLocationBlock"> <t:unless test="user.obsMer"> Modified: trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/pages/Contacts_fr.properties =================================================================== --- trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/pages/Contacts_fr.properties 2011-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-ui/src/main/resources/fr/ifremer/wao/ui/pages/Contacts_fr.properties 2011-04-21 12:44:08 UTC (rev 1226) @@ -27,6 +27,7 @@ company-label: Soci\u00e9t\u00e9 sampleRow-label: M\u00e9tier boat-label: Navire +observationType-label: Type state-label: Etat creationDate-label: Cr\u00e9ation landingDate-label: D\u00e9barquement 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-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-ui/src/main/resources/i18n/wao-ui_en_GB.properties 2011-04-21 12:44:08 UTC (rev 1226) @@ -96,6 +96,7 @@ wao.ui.field.Contact.mammalsInfo=Scientific names and number of captured species wao.ui.field.Contact.mammalsObservation=Exceptional observation wao.ui.field.Contact.nbObservants=Observers number +wao.ui.field.Contact.observationType=Observation type wao.ui.field.Contact.samplingStrategy=Sampling strategy followed wao.ui.field.Contact.secondaryObservers=Observers wao.ui.field.Contact.terrestrialLocation=Observation's place 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-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-ui/src/main/resources/i18n/wao-ui_fr_FR.properties 2011-04-21 12:44:08 UTC (rev 1226) @@ -95,6 +95,7 @@ wao.ui.field.Contact.mammalsInfo=Noms scientifiques et nombres d'individus des esp\u00E8ces captur\u00E9es wao.ui.field.Contact.mammalsObservation=Observation exceptionnelle wao.ui.field.Contact.nbObservants=Nombre d'observateurs +wao.ui.field.Contact.observationType=Type d'observation wao.ui.field.Contact.samplingStrategy=Strat\u00E9gie d'\u00E9chantillonnage suivie wao.ui.field.Contact.secondaryObservers=Observateurs wao.ui.field.Contact.terrestrialLocation=Lieu d'observation Modified: trunk/wao-ui/src/main/webapp/ContactForm.tml =================================================================== --- trunk/wao-ui/src/main/webapp/ContactForm.tml 2011-04-21 08:36:40 UTC (rev 1225) +++ trunk/wao-ui/src/main/webapp/ContactForm.tml 2011-04-21 12:44:08 UTC (rev 1226) @@ -217,6 +217,15 @@ </t:block> <t:block id="editObservationReport"> + <t:if test="connectedUser.obsdeb"> + <div> + <label for="observationType">${message:wao.ui.field.Contact.observationType}</label> + <input t:type="select" + t:id="observationType" + t:value="contact.observationType" + t:validate="required" /> + </div> + </t:if> <div> <label for="contactState">${message:wao.ui.field.Contact.contactState}</label> <input t:type="select"