Author: bleny Date: 2014-04-08 12:54:25 +0200 (Tue, 08 Apr 2014) New Revision: 1863 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1863 Log: refs #4487 contact creation from elligible boat Added: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/CreateContactAction.java Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/BoatTopiaDao.java trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatDetails.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValues.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerContactsService.java trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerBoatsServiceTest.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoSession.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatsAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatsFilterValuesJsonAction.java trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/ContactsAction.java trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boat-details.jsp trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/contacts.jsp Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/BoatTopiaDao.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/BoatTopiaDao.java 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/BoatTopiaDao.java 2014-04-08 10:54:25 UTC (rev 1863) @@ -87,7 +87,7 @@ sampleRowTopiaDao.toSampleRowHqlAndParametersBuilder( filter.getElligibleForSampleRowsFilter() ); - query.addWhereClause("b.topiaId IN (SELECT eb.boat.topiaId FROM fr.ifremer.wao.entity.ElligibleBoatImpl eb WHERE eb.sampleRow.topiaId IN ( select sr.topiaId " + sampleRowsQuery.getHql() + " ))", + query.addWhereClause("b.topiaId IN (select eb.boat.topiaId from fr.ifremer.wao.entity.ElligibleBoatImpl eb where (eb.globalActive is true and eb.companyActive is null or eb.companyActive is true) and eb.sampleRow.topiaId IN ( select sr.topiaId " + sampleRowsQuery.getHql() + " ))", sampleRowsQuery.getHqlParameters()); } Modified: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java 2014-04-08 10:54:25 UTC (rev 1863) @@ -30,9 +30,9 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.HqlAndParametersBuilder; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; import org.nuiton.topia.persistence.pager.TopiaPagerBean; import org.nuiton.util.PagerBeanUtil; -import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; import java.util.Collection; import java.util.List; Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatDetails.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatDetails.java 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatDetails.java 2014-04-08 10:54:25 UTC (rev 1863) @@ -23,18 +23,27 @@ import fr.ifremer.wao.entity.BoatInfos; import fr.ifremer.wao.entity.Contact; +import fr.ifremer.wao.entity.ElligibleBoat; +import fr.ifremer.wao.entity.ObsProgram; +import fr.ifremer.wao.entity.SampleRow; +import org.apache.commons.lang3.BooleanUtils; import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; public class BoatDetails implements Serializable { private static final long serialVersionUID = 1L; + protected ObsProgram obsProgram; + protected BoatInfos boatInfos; protected Contact mostRecentContact; - public BoatDetails(BoatInfos boatInfos, Contact mostRecentContact) { + public BoatDetails(ObsProgram obsProgram, BoatInfos boatInfos, Contact mostRecentContact) { + this.obsProgram = obsProgram; this.boatInfos = boatInfos; this.mostRecentContact = mostRecentContact; } @@ -48,8 +57,21 @@ } public boolean isNewContactCreatable() { - boolean newContactCreatable = mostRecentContact != null - && mostRecentContact.getContactState().isFinalState(); + boolean newContactCreatable = boatInfos.getBoat().isActive() + && (mostRecentContact == null || mostRecentContact.getContactState().isFinalState()); return newContactCreatable; } + + public List<SampleRow> getElligibleForSampleRows() { + List<SampleRow> elligibleForSampleRows = new LinkedList<>(); + for (ElligibleBoat elligibleBoat : boatInfos.getBoat().getElligibleBoat()) { + SampleRow sampleRow = elligibleBoat.getSampleRow(); + if (sampleRow.getCompany().equals(boatInfos.getCompany()) && sampleRow.getObsProgram().equals(obsProgram)) { + if (elligibleBoat.isGlobalActive() || BooleanUtils.isNotFalse(elligibleBoat.getCompanyActive())) { + elligibleForSampleRows.add(sampleRow); + } + } + } + return elligibleForSampleRows; + } } Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValues.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValues.java 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsFilterValues.java 2014-04-08 10:54:25 UTC (rev 1863) @@ -29,6 +29,7 @@ import fr.ifremer.wao.entity.SampleRow; import fr.ifremer.wao.entity.ShipOwner; import fr.ifremer.wao.entity.TerrestrialLocation; +import org.apache.commons.lang3.BooleanUtils; import java.util.Locale; import java.util.SortedSet; @@ -91,7 +92,8 @@ for (ElligibleBoat elligibleBoat : boat.getElligibleBoat()) { SampleRow sampleRow = elligibleBoat.getSampleRow(); - if (obsProgram.equals(sampleRow.getObsProgram())) { + // TODO brendan 08/04/14 vérifier que la sample row est bien associée à la société du coordinateur + if (obsProgram.equals(sampleRow.getObsProgram()) && (elligibleBoat.isGlobalActive() || BooleanUtils.isNotFalse(elligibleBoat.getCompanyActive()))) { elligibleForSampleRowsFilterValues.addSampleRow(sampleRow); } } Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerBoatsService.java 2014-04-08 10:54:25 UTC (rev 1863) @@ -23,6 +23,7 @@ import com.google.common.base.Charsets; import com.google.common.base.Optional; +import com.google.common.collect.ImmutableSet; import fr.ifremer.wao.BoatsFilter; import fr.ifremer.wao.WaoTechnicalException; import fr.ifremer.wao.entity.Boat; @@ -47,6 +48,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Set; /** * Created on 4/1/14. @@ -59,22 +61,32 @@ /** Logger. */ private static final Log log = LogFactory.getLog(ObsMerBoatsService.class); - public BoatsFilterValues getBoatsFilterValues(BoatsFilter filter) { + public BoatsFilterValues getBoatsFilterValues(AuthenticatedWaoUser authenticatedWaoUser, BoatsFilter filter) { BoatTopiaDao dao = getBoatDao(); + + // XXX brendan 07/04/14 ne pas inclure les lignes qui ne sont pas associées à un autre société que celle du coordinateur + Set<String> companyIds = null; + if (authenticatedWaoUser.isCoordinatorOrObserver()) { + companyIds = filter.getElligibleForSampleRowsFilter().getCompanyIds(); + filter.getElligibleForSampleRowsFilter().setCompanyIds(ImmutableSet.of(authenticatedWaoUser.getCompany().getTopiaId())); + } List<Boat> boats = dao.findAll(filter); + if (authenticatedWaoUser.isCoordinatorOrObserver()) { + filter.getElligibleForSampleRowsFilter().setCompanyIds(companyIds); + } BoatsFilterValues boatsFilterValues = new BoatsFilterValues(serviceContext.getLocale(), filter.getObsProgram()); for (Boat boat : boats) { - // TODO brendan 07/04/14 ne pas inclure les lignes qui ne sont pas associées à un autre société que celle du coordinateur boatsFilterValues.addBoat(boat); } return boatsFilterValues; } - public ObsMerBoatsList getBoatsList(BoatsFilter filter, + public ObsMerBoatsList getBoatsList(AuthenticatedWaoUser authenticatedWaoUser, + BoatsFilter filter, TopiaPagerBean queryPager) { BoatTopiaDao dao = getBoatDao(); @@ -89,7 +101,7 @@ PaginationBean paginationBean = new PaginationBean(pager, 10); - BoatsFilterValues boatsFilterValues = getBoatsFilterValues(filter); + BoatsFilterValues boatsFilterValues = getBoatsFilterValues(authenticatedWaoUser, filter); ObsMerBoatsList obsMerBoatsList = new ObsMerBoatsList(); obsMerBoatsList.setBoats(boats); @@ -159,7 +171,7 @@ long count = getContactDao().newQueryBuilder().addTopiaIdEquals(Contact.PROPERTY_BOAT, boatId).count(); - BoatDetails boatDetails = new BoatDetails(boatInfos, mostRecentContact); + BoatDetails boatDetails = new BoatDetails(obsProgram, boatInfos, mostRecentContact); return boatDetails; Modified: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerContactsService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerContactsService.java 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerContactsService.java 2014-04-08 10:54:25 UTC (rev 1863) @@ -67,6 +67,7 @@ import java.util.Calendar; import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; @@ -691,4 +692,108 @@ dao.update(contact); } } + + public Contact createContact(AuthenticatedWaoUser authenticatedWaoUser, String sampleRowId, String boatId) { + + if (log.isInfoEnabled()) { + log.info(authenticatedWaoUser.getWaoUser() + " is creating a contact for " + sampleRowId + " and " + boatId); + } + + UpdateContactCommand updateContactCommand = newUpdateContactCommand(authenticatedWaoUser, Optional.<String>absent()); + + Boat boat = getBoatDao().findByTopiaId(boatId); + Preconditions.checkState(boat.isActive(), "boat must be active"); + + SampleRow sampleRow = getSampleRowDao().findByTopiaId(sampleRowId); + ObsProgram obsProgram = sampleRow.getObsProgram(); + + WaoUser observer = authenticatedWaoUser.getWaoUser(); + Contact mostRecentContactOrNull = getContactDao().findMostRecentContactOrNull(obsProgram, boatId, observer.getCompany().getTopiaId()); + Preconditions.checkState( + mostRecentContactOrNull == null || mostRecentContactOrNull.getContactState().isFinalState(), + "contact already exists"); + + Date now = serviceContext.getNow(); + + Contact newContact = updateContactCommand.getContact(); + newContact.setDataReliability(DataReliability.UNKNOWN); + newContact.setBoat(boat); + newContact.setMainObserver(observer); + newContact.setSampleRow(sampleRow); + newContact.setCreationDate(now); + + // initial contact state depends on the program + if (obsProgram == ObsProgram.OBSMER) { + newContact.setContactState(ContactState.CONTACT_START); + } else if (obsProgram == ObsProgram.OBSVENTE) { + newContact.setContactState(ContactState.OBSERVATION_EXPECTED); + } + + // we can suppose a new contact default values are the one + // expected in the sampling plan + + if (newContact.getObsProgram() == ObsProgram.OBSVENTE) { + // we hope in this contact, user used expected sampling strategy + newContact.setSamplingStrategy(sampleRow.getSamplingStrategy()); + } + + // In the case of ObsVente, we may have a user who wants to create + // multiple contact for a same day. Here we try, to ease the input + // of data by trying to pre-fill some field using data given + // in a previous entered contact + + if (newContact.getObsProgram() == ObsProgram.OBSVENTE) { + // try to pre-fill some field for user-experience + + // let's try to find a recent similar contact + Map<String, Object> properties = new HashMap<>(); + properties.put(Contact.PROPERTY_OBS_PROGRAM_ORDINAL, newContact.getObsProgram().ordinal()); + properties.put(Contact.PROPERTY_SAMPLE_ROW, sampleRow); + properties.put(Contact.PROPERTY_MAIN_OBSERVER, observer); + + List<Contact> candidates = getContactDao().forProperties(properties).findAll(); + + Contact similarContact = null; // to be found among candidates + for (Contact candidate : candidates) { + if (DateUtil.getDifferenceInDays(candidate.getCreationDate(), now) <= 1) { + similarContact = candidate; + } + } + + if (log.isDebugEnabled()) { + String logMessage; + if (similarContact == null) { + logMessage = "no similar contact found"; + } else { + logMessage = "similar contact found to pre-fill values of contact : " + + similarContact.getTopiaId() + " boat = " + similarContact.getBoat().getName(); + } + log.debug(logMessage); + } + + if (similarContact != null) { + newContact.setObservationBeginDate(similarContact.getObservationBeginDate()); + newContact.setObservationEndDate(similarContact.getObservationEndDate()); + newContact.setTerrestrialLocation(similarContact.getTerrestrialLocation()); + newContact.clearSecondaryObservers(); + newContact.addAllSecondaryObservers(similarContact.getSecondaryObservers()); + newContact.setDataInputDate(similarContact.getDataInputDate()); + } + } + + try { + save0(updateContactCommand); + } catch (NullSampleMonthException e) { + if (log.isErrorEnabled()) { + log.error("should never occur", e); + } + throw new WaoTechnicalException(e); + } + + commit(); + + return newContact; + + } + } Modified: trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerBoatsServiceTest.java =================================================================== --- trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerBoatsServiceTest.java 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerBoatsServiceTest.java 2014-04-08 10:54:25 UTC (rev 1863) @@ -55,7 +55,7 @@ BoatsFilter filter = service.newBoatsFilter(fixtures.admin()); - BoatsFilterValues boatsFilterValues = service.getBoatsFilterValues(filter); + BoatsFilterValues boatsFilterValues = service.getBoatsFilterValues(fixtures.admin(), filter); } @@ -66,7 +66,7 @@ TopiaPagerBean pager = service.newBoatsPager(50); - ObsMerBoatsList boatsList = service.getBoatsList(filter, pager); + ObsMerBoatsList boatsList = service.getBoatsList(fixtures.admin(), filter, pager); } Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoSession.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoSession.java 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/WaoSession.java 2014-04-08 10:54:25 UTC (rev 1863) @@ -41,6 +41,8 @@ protected String sampleRowToHighlightId; + protected String contactToHighlightId; + public Collection<String> getMessages() { if (messages == null) { messages = Lists.newLinkedList(); @@ -83,4 +85,12 @@ public void setSampleRowToHighlightId(String sampleRowToHighlightId) { this.sampleRowToHighlightId = sampleRowToHighlightId; } + + public void setContactToHighlightId(String contactToHighlightId) { + this.contactToHighlightId = contactToHighlightId; + } + + public String getContactToHighlightId() { + return contactToHighlightId; + } } Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatsAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatsAction.java 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatsAction.java 2014-04-08 10:54:25 UTC (rev 1863) @@ -99,7 +99,7 @@ @Override public String execute() { - boatList = service.getBoatsList(filter, getPager()); + boatList = service.getBoatsList(getAuthenticatedWaoUser(), filter, getPager()); return SUCCESS; } Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatsFilterValuesJsonAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatsFilterValuesJsonAction.java 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/BoatsFilterValuesJsonAction.java 2014-04-08 10:54:25 UTC (rev 1863) @@ -67,7 +67,7 @@ @Override public String execute() { - filterValues = service.getBoatsFilterValues(filter); + filterValues = service.getBoatsFilterValues(session.getAuthenticatedWaoUser(), filter); return SUCCESS; } Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/ContactsAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/ContactsAction.java 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/ContactsAction.java 2014-04-08 10:54:25 UTC (rev 1863) @@ -222,4 +222,8 @@ result = result.replaceAll("%", "%"); return result; } + + public String getContactToHighlightId() { + return session.getContactToHighlightId(); + } } \ No newline at end of file Added: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/CreateContactAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/CreateContactAction.java (rev 0) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/CreateContactAction.java 2014-04-08 10:54:25 UTC (rev 1863) @@ -0,0 +1,43 @@ +package fr.ifremer.wao.web.action.obsmer; + +import fr.ifremer.wao.entity.Contact; +import fr.ifremer.wao.services.service.ObsMerContactsService; +import fr.ifremer.wao.web.WaoJspActionSupport; +import org.apache.struts2.convention.annotation.Result; +import org.apache.struts2.convention.annotation.Results; + +@Results({ + @Result(name="success", type="redirectAction", params = { "actionName", "contacts" }) +}) +public class CreateContactAction extends WaoJspActionSupport { + + protected ObsMerContactsService service; + + protected String boatId; + + protected String sampleRowId; + + public void setService(ObsMerContactsService service) { + this.service = service; + } + + public void setBoatId(String boatId) { + this.boatId = boatId; + } + + public void setSampleRowId(String sampleRowId) { + this.sampleRowId = sampleRowId; + } + + @Override + public String execute() { + + Contact contact = service.createContact(getAuthenticatedWaoUser(), sampleRowId, boatId); + + session.setContactToHighlightId(contact.getTopiaId()); + + return SUCCESS; + + } + +} Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boat-details.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boat-details.jsp 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/boat-details.jsp 2014-04-08 10:54:25 UTC (rev 1863) @@ -140,11 +140,17 @@ <s:text name="wao.ui.boats.associatedLine"/> </h3> <ul> - <s:iterator value="boatDetails.boatInfos.boat.elligibleBoat"> + <s:iterator value="boatDetails.elligibleForSampleRows"> <li> - <s:property value="sampleRow.code"/> + <s:property value="code"/> <s:if test="boatDetails.newContactCreatable && authenticatedWaoUser.authorizedToCreateContact"> - <s:text name="wao.ui.contacts.createFromBoat"/> + <s:url action="create-contact" id="createContactUrl"> + <s:param name="boatId" value="boatDetails.boatInfos.boat.topiaId"/> + <s:param name="sampleRowId" value="topiaId"/> + </s:url> + <s:a href="%{createContactUrl}"> + <s:text name="wao.ui.contacts.createFromBoat"/> + </s:a> </s:if> </li> </s:iterator> Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/contacts.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/contacts.jsp 2014-04-08 08:52:34 UTC (rev 1862) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/contacts.jsp 2014-04-08 10:54:25 UTC (rev 1863) @@ -371,7 +371,7 @@ <tbody> <s:iterator value="contacts" var="contact"> -<tr class="contact-row"> +<tr class="contact-row <s:if test="topiaId.equals(contactToHighlightId)"> highlight</s:if>"> <td> <s:property value="%{formatDate(creationDate)}"/> </td>