This is an automated email from the git hooks/post-receive script. New commit to branch feature/2264 in repository wao. See http://git.codelutin.com/wao.git commit a6674c177f99316a6ee72ab3d5ff2fc791cf749b Author: Brendan Le Ny <bleny@codelutin.com> Date: Wed Dec 24 15:48:50 2014 +0100 Activivation de la création d'un contact sous scléro --- .../fr/ifremer/wao/entity/ContactTopiaDao.java | 4 +- .../ifremer/wao/services/service/BoatsService.java | 5 +- .../wao/services/service/ContactsService.java | 72 ++++++++++++++-------- .../services/service/SampleRowsFilterValues.java | 18 ++++-- .../services/service/UpdateSampleRowCommand.java | 2 +- .../wao/services/service/ContactsServiceTest.java | 26 ++++++++ .../services/service/SclerochronologyFixtures.java | 15 +++++ .../wao/web/action/CreateContactAction.java | 6 +- .../ifremer/wao/web/action/EditContactAction.java | 2 +- .../content/sclerochronology/sampling-plan.jsp | 16 +---- 10 files changed, 114 insertions(+), 52 deletions(-) diff --git a/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java b/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java index fd5ba51..fa642d2 100644 --- a/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java +++ b/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java @@ -199,9 +199,9 @@ public class ContactTopiaDao extends AbstractContactTopiaDao<Contact> { } - public Contact findMostRecentContactOrNull(ObsProgram obsProgram, String boatId, String companyId) { + public Contact findMostRecentContactOrNull(ObsProgram obsProgram, Boat boat, String companyId) { TopiaQueryBuilderAddCriteriaOrRunQueryStep<Contact> query = newQueryBuilder(); - query.addTopiaIdEquals(Contact.PROPERTY_BOAT, boatId); + query.addEquals(Contact.PROPERTY_BOAT, boat); query.addTopiaIdEquals(Contact.PROPERTY_SAMPLE_ROW + "." + SampleRow.PROPERTY_ORGANISATION, companyId); query.addEquals(Contact.PROPERTY_SAMPLE_ROW + "." + SampleRow.PROPERTY_OBS_PROGRAM, obsProgram); query.setOrderByArguments(Contact.PROPERTY_CREATION_DATE + " desc"); diff --git a/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsService.java b/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsService.java index 1deab18..71458de 100644 --- a/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsService.java +++ b/wao-services/src/main/java/fr/ifremer/wao/services/service/BoatsService.java @@ -202,7 +202,7 @@ public class BoatsService extends WaoServiceSupport { BoatInfos boatInfos = getBoatInfos(boatId, companyId); - Contact mostRecentContact = getContactDao().findMostRecentContactOrNull(obsProgram, boatId, companyId); + Contact mostRecentContact = getContactDao().findMostRecentContactOrNull(obsProgram, boatInfos.getBoat(), companyId); ContactsFilter filter = new ContactsFilter(); filter.getSampleRowFilter().setObsProgram(obsProgram); @@ -336,7 +336,8 @@ public class BoatsService extends WaoServiceSupport { dao.create(Boat.PROPERTY_REGISTRATION_CODE, dedicatedBoatRegistrationCode, Boat.PROPERTY_SHIP_OWNER, getFictiveShipownerForSclerochronology(), - Boat.PROPERTY_NAME, "" + Boat.PROPERTY_NAME, "", + Boat.PROPERTY_ACTIVE, true ); } diff --git a/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsService.java b/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsService.java index fc7c3fc..c7aafc3 100644 --- a/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsService.java +++ b/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsService.java @@ -104,10 +104,17 @@ public class ContactsService extends WaoServiceSupport { ContactsFilter newContactsFilter = newEmptyContactsFilter(obsProgram); - // DO NOT REMOVE THIS + // ATTENTION, il s'agit de sécu if (authenticatedWaoUser.isCoordinatorOrObserver()) { - String authenticatedWaoUserCompanyTopiaId = authenticatedWaoUser.getWaoUser().getCompany().getTopiaId(); - newContactsFilter.getSampleRowFilter().setOrganisationIds(ImmutableSet.of(authenticatedWaoUserCompanyTopiaId)); + // quand on appartient à une organisation (société ou labo), par défaut on ne peut voir + // que les lignes de cette même organisation + Organisation organisationToFilterOn = authenticatedWaoUser.getOrganisation(); + if (obsProgram.isObsMer() || obsProgram.isObsVente()) { + // dans ce cas, on est plus souple : si on appartient à des labos différents mais à + // la même société, on peut voir tout ce qui concerne la société tous labos confondus + organisationToFilterOn = authenticatedWaoUser.getOrganisation().getCompany(); + } + newContactsFilter.getSampleRowFilter().setOrganisationIds(ImmutableSet.of(organisationToFilterOn.getTopiaId())); } if (authenticatedWaoUser.isProfessional()) { @@ -929,10 +936,10 @@ public class ContactsService extends WaoServiceSupport { boolean addBoatToObserversAllegroWallet = false; - if (obsProgram == ObsProgram.OBSMER) { + if (obsProgram.isObsMer()) { addBoatToObserversAllegroWallet = contactState == ContactState.OBSERVATION_DONE || contactState == ContactState.OBSERVATION_EXPECTED; - } else if (obsProgram == ObsProgram.OBSVENTE) { + } else if (obsProgram.isObsVente()) { addBoatToObserversAllegroWallet = ContactState.OBSERVATION_DONE == contactState; } @@ -1034,46 +1041,61 @@ public class ContactsService extends WaoServiceSupport { } } - public Contact createContact(AuthenticatedWaoUser authenticatedWaoUser, String sampleRowId, String boatId) { - + public Contact createContact(AuthenticatedWaoUser authenticatedWaoUser, String sampleRowId, Optional<String> optionalBoatId) { + if (log.isInfoEnabled()) { - log.info(authenticatedWaoUser.getWaoUser() + " is creating a contact for " + sampleRowId + " and " + boatId); + log.info(authenticatedWaoUser.getWaoUser() + " is creating a contact for " + sampleRowId + " and " + optionalBoatId); } - UpdateContactCommand updateContactCommand = newUpdateContactCommandForCreation(authenticatedWaoUser); + SampleRow sampleRow = getSampleRowDao().forTopiaIdEquals(sampleRowId).findUnique(); + ObsProgram obsProgram = sampleRow.getObsProgram(); - Boat boat = getBoatDao().findByTopiaId(boatId); - Preconditions.checkState(boat.isActive(), "boat must be active"); + Boat boat; + if (obsProgram.isSclerochronology()) { + boat = getBoatsService().getBoatToUseForSclerochronologySampleRow(sampleRow); + } else { + Preconditions.checkArgument(optionalBoatId.isPresent(), "boatId must be provided for contact creation"); + String boatId = optionalBoatId.get(); + boat = getBoatDao().forTopiaIdEquals(boatId).findUnique(); + } - SampleRow sampleRow = getSampleRowDao().findByTopiaId(sampleRowId); - ObsProgram obsProgram = sampleRow.getObsProgram(); + Preconditions.checkState(boat.isActive(), "boat must be active"); - WaoUser observer = authenticatedWaoUser.getWaoUser(); - Contact mostRecentContactOrNull = getContactDao().findMostRecentContactOrNull(obsProgram, boatId, observer.getCompany().getTopiaId()); + WaoUser mainObserver = authenticatedWaoUser.getWaoUser(); Preconditions.checkState( - mostRecentContactOrNull == null || mostRecentContactOrNull.getContactState().isFinalState(), - "contact already exists"); + getPossibleObservers(sampleRow).contains(mainObserver), + authenticatedWaoUser + " is not allowed to create a contact for row " + sampleRow); + + if (obsProgram.isObsMer() || obsProgram.isObsVente()) { + Contact mostRecentContactOrNull = getContactDao().findMostRecentContactOrNull(obsProgram, boat, mainObserver.getCompany().getTopiaId()); + Preconditions.checkState( + mostRecentContactOrNull == null || mostRecentContactOrNull.getContactState().isFinalState(), + "contact already exists"); + } Date now = serviceContext.getNow(); + UpdateContactCommand updateContactCommand = newUpdateContactCommandForCreation(authenticatedWaoUser); Contact newContact = updateContactCommand.getContact(); newContact.setDataReliability(DataReliability.UNKNOWN); newContact.setBoat(boat); - newContact.setMainObserver(observer); newContact.setSampleRow(sampleRow); newContact.setCreationDate(now); + newContact.setMainObserver(mainObserver); // initial contact state depends on the program - if (obsProgram == ObsProgram.OBSMER) { + if (obsProgram.isObsMer()) { newContact.setContactState(ContactState.CONTACT_START); - } else if (obsProgram == ObsProgram.OBSVENTE) { + } else if (obsProgram.isObsVente() || obsProgram.isSclerochronology()) { newContact.setContactState(ContactState.OBSERVATION_EXPECTED); + } else { + throw new UnsupportedOperationException("program " + obsProgram); } // we can suppose a new contact default values are the one // expected in the sampling plan - if (newContact.getObsProgram() == ObsProgram.OBSVENTE) { + if (newContact.getObsProgram().isObsVente()) { // we hope in this contact, user used expected sampling strategy newContact.setSamplingStrategy(sampleRow.getSamplingStrategy()); } @@ -1083,14 +1105,14 @@ public class ContactsService extends WaoServiceSupport { // of data by trying to pre-fill some field using data given // in a previous entered contact - if (newContact.getObsProgram() == ObsProgram.OBSVENTE) { + if (newContact.getObsProgram().isObsVente()) { // 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_SAMPLE_ROW + "." + SampleRow.PROPERTY_OBS_PROGRAM, newContact.getObsProgram()); properties.put(Contact.PROPERTY_SAMPLE_ROW, sampleRow); - properties.put(Contact.PROPERTY_MAIN_OBSERVER, observer); + properties.put(Contact.PROPERTY_MAIN_OBSERVER, mainObserver); List<Contact> candidates = getContactDao().forProperties(properties).findAll(); @@ -1134,9 +1156,9 @@ public class ContactsService extends WaoServiceSupport { * Pour un contact donné, tous les utilisateurs qui peuvent être sélectionnés en tant qu' * observateurs (principale ou secondaire). */ - public SortedSet<WaoUser> getPossibleObservers(Contact contact) { + public SortedSet<WaoUser> getPossibleObservers(SampleRow sampleRow) { - Organisation organisation = contact.getSampleRow().getOrganisation(); + Organisation organisation = sampleRow.getOrganisation(); Set<Organisation> organisationsUserMustBeInToBeAnObserver = getOrganisationsService().getOrganisationsBelongingsTo(organisation); diff --git a/wao-services/src/main/java/fr/ifremer/wao/services/service/SampleRowsFilterValues.java b/wao-services/src/main/java/fr/ifremer/wao/services/service/SampleRowsFilterValues.java index 4184fc4..824701d 100644 --- a/wao-services/src/main/java/fr/ifremer/wao/services/service/SampleRowsFilterValues.java +++ b/wao-services/src/main/java/fr/ifremer/wao/services/service/SampleRowsFilterValues.java @@ -84,16 +84,22 @@ public class SampleRowsFilterValues extends AbstractFilterValues { protected void addSampleRow(SampleRow sampleRow, boolean fromBoatFilter) { boolean sampleRowMatchesObsProgram = obsProgram.equals(sampleRow.getObsProgram()); - boolean sampleRowMatchesCompany = true; + boolean sampleRowMatchesOrganisation = true; if (optionalCompanyId.isPresent()) { - String sampleRowCompanyId = null; - if (sampleRow.getCompany() != null) { - sampleRowCompanyId = sampleRow.getCompany().getTopiaId(); + String sampleRowOrganisationId = null; + if (sampleRow.getOrganisation() != null) { + sampleRowOrganisationId = sampleRow.getOrganisation().getTopiaId(); } - sampleRowMatchesCompany = optionalCompanyId.get().equals(sampleRowCompanyId); + sampleRowMatchesOrganisation = optionalCompanyId.get().equals(sampleRowOrganisationId); } - if (sampleRowMatchesObsProgram && sampleRowMatchesCompany) { + // par exemple, dans le cas du filtre navire, la présente méthode est appelée pour toutes les + // lignes pour lesquelles la navire est éligible, or on ne veut les données que pour les lignes + // du programme sous lequel l'utilisateur est connecté et on ne veux que les lignes du plan + // affecté à sa société (alors que l'admin voit tout) + boolean addSampleRow = sampleRowMatchesObsProgram + && sampleRowMatchesOrganisation; + if (addSampleRow) { for (FishingZone fishingZone : sampleRow.getFishingZone()) { fishingZoneFacadeNames.add(FilterOption.forString(fishingZone.getFacadeName())); diff --git a/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateSampleRowCommand.java b/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateSampleRowCommand.java index 3641d36..b3f58e7 100644 --- a/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateSampleRowCommand.java +++ b/wao-services/src/main/java/fr/ifremer/wao/services/service/UpdateSampleRowCommand.java @@ -114,7 +114,7 @@ public class UpdateSampleRowCommand implements Serializable{ public String getOrganisationId() { String organisationId = null; - if (sampleRow.getCompany() != null) { + if (sampleRow.getOrganisation() != null) { organisationId = sampleRow.getOrganisation().getTopiaId(); } return organisationId; diff --git a/wao-services/src/test/java/fr/ifremer/wao/services/service/ContactsServiceTest.java b/wao-services/src/test/java/fr/ifremer/wao/services/service/ContactsServiceTest.java index 946d207..003b07b 100644 --- a/wao-services/src/test/java/fr/ifremer/wao/services/service/ContactsServiceTest.java +++ b/wao-services/src/test/java/fr/ifremer/wao/services/service/ContactsServiceTest.java @@ -21,8 +21,11 @@ package fr.ifremer.wao.services.service; * #L% */ +import com.google.common.base.Optional; +import com.google.common.collect.Iterables; import fr.ifremer.wao.ContactsFilter; import fr.ifremer.wao.entity.Contact; +import fr.ifremer.wao.entity.SampleRow; import fr.ifremer.wao.services.AbstractWaoServiceTest; import fr.ifremer.wao.services.AuthenticatedWaoUser; import org.apache.commons.io.IOUtils; @@ -129,4 +132,27 @@ public class ContactsServiceTest extends AbstractWaoServiceTest { } } + @Test + public void testCreateSclerochronologyContact() { + AuthenticatedWaoUser alex = sclerochronologyFixtures.alex(); + applicationContext.setDate(DateUtil.createDate(0, 0, 12, 15, 1, 2015)); + + SampleRow sampleRow = sclerochronologyFixtures.sampleRow3(); + String sampleRowId = sampleRow.getTopiaId(); + applicationContext.setDate(DateUtil.createDate(0, 0, 12, 15, 2, 2015)); + + Contact contact = service.createContact(alex, sampleRowId, Optional.<String>absent()); + + Assert.assertTrue(contact.isPersisted()); + Assert.assertEquals( + "Le contact aurait dû être rattaché au navire dédié selon le contexte de la ligne du plan", + sampleRow.getSclerochronologySamplingContext().getDedicatedBoatRegistrationCode(), + contact.getBoat().getRegistrationCode()); + + ContactsFilter filter = service.newContactFilter(alex); + ContactsList contactsList = service.getContactsList(alex, filter, PaginationParameter.of(0, 5)); + Assert.assertEquals(1, contactsList.getContacts().getCount()); + Assert.assertEquals(contact, Iterables.getOnlyElement(contactsList.getContacts().getElements())); + + } } diff --git a/wao-services/src/test/java/fr/ifremer/wao/services/service/SclerochronologyFixtures.java b/wao-services/src/test/java/fr/ifremer/wao/services/service/SclerochronologyFixtures.java index b3a2c70..57b818c 100644 --- a/wao-services/src/test/java/fr/ifremer/wao/services/service/SclerochronologyFixtures.java +++ b/wao-services/src/test/java/fr/ifremer/wao/services/service/SclerochronologyFixtures.java @@ -3,6 +3,7 @@ package fr.ifremer.wao.services.service; import fr.ifremer.wao.WaoTechnicalException; import fr.ifremer.wao.entity.Laboratory; import fr.ifremer.wao.entity.ObsProgram; +import fr.ifremer.wao.entity.SampleRow; import fr.ifremer.wao.entity.UserRole; import fr.ifremer.wao.services.AuthenticatedWaoUser; import fr.ifremer.wao.services.WaoServiceContext; @@ -71,10 +72,24 @@ public class SclerochronologyFixtures extends WaoFixtures { } } + public SampleRow sampleRow1() { + samplingPlan(); + return serviceContext.getPersistenceContext().getSampleRowDao().forCodeEquals("2015_S0001").findUnique(); + } + + public SampleRow sampleRow3() { + samplingPlan(); + return serviceContext.getPersistenceContext().getSampleRowDao().forCodeEquals("2015_S0003").findUnique(); + } + public AuthenticatedWaoUser bob() { return newAuthenticatedWaoUser("bob", ObsProgram.SCLEROCHRONOLOGY, UserRole.OBSERVER, oceanet()); } + public AuthenticatedWaoUser alex() { + return newAuthenticatedWaoUser("alex", ObsProgram.SCLEROCHRONOLOGY, UserRole.OBSERVER, emh()); + } + public void contacts() { bob(); samplingPlan(); diff --git a/wao-web/src/main/java/fr/ifremer/wao/web/action/CreateContactAction.java b/wao-web/src/main/java/fr/ifremer/wao/web/action/CreateContactAction.java index 3403117..4698660 100644 --- a/wao-web/src/main/java/fr/ifremer/wao/web/action/CreateContactAction.java +++ b/wao-web/src/main/java/fr/ifremer/wao/web/action/CreateContactAction.java @@ -21,6 +21,8 @@ package fr.ifremer.wao.web.action; * #L% */ +import com.google.common.base.Optional; +import com.google.common.base.Strings; import fr.ifremer.wao.entity.Contact; import fr.ifremer.wao.services.service.ContactsService; import fr.ifremer.wao.web.WaoJspActionSupport; @@ -34,7 +36,7 @@ public class CreateContactAction extends WaoJspActionSupport { protected ContactsService service; - protected String boatId; + protected Optional<String> boatId = Optional.absent(); protected String sampleRowId; @@ -43,7 +45,7 @@ public class CreateContactAction extends WaoJspActionSupport { } public void setBoatId(String boatId) { - this.boatId = boatId; + this.boatId = Optional.fromNullable(Strings.emptyToNull(boatId)); } public void setSampleRowId(String sampleRowId) { diff --git a/wao-web/src/main/java/fr/ifremer/wao/web/action/EditContactAction.java b/wao-web/src/main/java/fr/ifremer/wao/web/action/EditContactAction.java index 4a5ca9a..e408c20 100644 --- a/wao-web/src/main/java/fr/ifremer/wao/web/action/EditContactAction.java +++ b/wao-web/src/main/java/fr/ifremer/wao/web/action/EditContactAction.java @@ -200,7 +200,7 @@ public class EditContactAction extends WaoJspActionSupport implements Preparable addActionError(t("wao.ui.error.unknownContactId")); } - SortedSet<WaoUser> sortedWaoUsers = service.getPossibleObservers(updateContactCommand.getContact()); + SortedSet<WaoUser> sortedWaoUsers = service.getPossibleObservers(updateContactCommand.getContact().getSampleRow()); observers = new LinkedHashMap<>(); for (WaoUser waoUser : sortedWaoUsers) { observers.put(waoUser.getTopiaId(), waoUser.getFullName()); diff --git a/wao-web/src/main/webapp/WEB-INF/content/sclerochronology/sampling-plan.jsp b/wao-web/src/main/webapp/WEB-INF/content/sclerochronology/sampling-plan.jsp index 3511394..0082bc8 100644 --- a/wao-web/src/main/webapp/WEB-INF/content/sclerochronology/sampling-plan.jsp +++ b/wao-web/src/main/webapp/WEB-INF/content/sclerochronology/sampling-plan.jsp @@ -382,16 +382,6 @@ <i class="icon-filter"></i> <s:text name="wao.ui.action.zoomOnSampleRowPeriod" /> </s:a> </li> - <s:if test="authenticatedWaoUser.authorizedToViewBoats && elligibleBoatsProvided"> - <li> - <s:url action="boats!applyFilter" id="viewElligibleBoatsUrl"> - <s:param name="filter.elligibleForSampleRowsFilter.sampleRowCodes" value="code" /> - </s:url> - <s:a href="%{viewElligibleBoatsUrl}"> - <i class="fa fa-anchor"></i> <s:text name="wao.ui.action.viewElligibleBoats" /> - </s:a> - </li> - </s:if> <s:if test="authenticatedWaoUser.authorizedToViewContacts && sampleRowContactCounts > 0"> <li> <s:url action="contacts!applyFilter" id="viewAssociatedContactsUrl"> @@ -406,10 +396,10 @@ </s:if> <s:if test="authenticatedWaoUser.authorizedToCreateContact && newContactCreatable"> <li> - <s:url action="boats!applyFilter" id="createAssociatedContactUrl"> - <s:param name="startBoatSelectionForSampleRowId" value="sampleRowId" /> + <s:url action="create-contact" id="createContactUrl"> + <s:param name="sampleRowId" value="sampleRowId" /> </s:url> - <s:a href="%{createAssociatedContactUrl}"> + <s:a href="%{createContactUrl}"> <i class="icon-plus"></i> <s:text name="wao.ui.action.createAssociatedContact" /> </s:a> </li> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.