Author: fdesbois Date: 2009-12-15 19:28:04 +0000 (Tue, 15 Dec 2009) New Revision: 123 Added: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/DataLoader.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/BoatImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Boats.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Contacts.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/services/ContactModelFactory.java trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/pages/Boats.properties trunk/suiviobsmer-ui/src/main/webapp/Boats.tml trunk/suiviobsmer-ui/src/main/webapp/Contacts.tml Log: - BoatInfos last Contact show - List for select an observer when editing a contact - Constraint to create a new contact from boats page Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/DataLoader.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/DataLoader.java 2009-12-15 16:03:30 UTC (rev 122) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/DataLoader.java 2009-12-15 19:28:04 UTC (rev 123) @@ -67,5 +67,10 @@ } } } + + public static void loadContactForBoatInfos(Contact contact) { + contact.getSampleRow(); + contact.getUser(); + } } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/BoatImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/BoatImpl.java 2009-12-15 16:03:30 UTC (rev 122) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/BoatImpl.java 2009-12-15 19:28:04 UTC (rev 123) @@ -21,10 +21,14 @@ package fr.ifremer.suiviobsmer.entity; +import fr.ifremer.suiviobsmer.DataLoader; import fr.ifremer.suiviobsmer.SuiviObsmerException; import fr.ifremer.suiviobsmer.SuiviObsmerModelDAOHelper; import fr.ifremer.suiviobsmer.SuiviObsmerContext; +import fr.ifremer.suiviobsmer.bean.ContactState; import java.io.Serializable; +import java.util.List; +import org.apache.commons.lang.BooleanUtils; import org.nuiton.topia.TopiaContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -86,4 +90,89 @@ } return boatInfos; } + + /** + * Get the last boat contact for the creator company. + * No test on contact state is done here. + * @param company which is the creator of the contact + * @return the last boat contact (opened or not) + * @throws SuiviObsmerException + */ + @Override + @Deprecated + public Contact getLastContact(Company company) throws SuiviObsmerException { + TopiaContext transaction = null; + Contact contact = null; + try { + transaction = SuiviObsmerContext.getTopiaRootContext().beginTransaction(); + + List results = transaction.find( + "FROM ContactImpl C1" + + " WHERE C1.user.company = :company AND C1.boat = :boat " + + " AND C1.topiaCreateDate = " + + " (SELECT MAX(C2.topiaCreateDate) FROM ContactImpl C2" + + " WHERE C2.user.company = :company AND C2.boat = C1.boat)", + "company", company, + "boat", this); + + if (!results.isEmpty()) { + contact = (Contact)results.get(0); + DataLoader.loadContactForBoatInfos(contact); + } + + transaction.closeContext(); + } catch (Exception eee) { + SuiviObsmerContext.serviceException(transaction, + "Impossible de récupérer le dernier contact du navire " + this.getImmatriculation() + + " pour la société '" + company.getName() + "'", + eee); + } + return contact; + } + + /** + * Check if a contact for this boat, company and sampleRow can be created. + * The state is tested for the last created contact. + * A new contact can be created only if the last state is final and is not 'Refus définitif'. + * @param company which is the creator of the contact + * @param row for the contact to be created + * @return true if the contact can be created, false either + * @throws SuiviObsmerException + */ + @Override + public boolean canCreateContact(Company company, SampleRow row) throws SuiviObsmerException { + TopiaContext transaction = null; + boolean result = true; + try { + transaction = SuiviObsmerContext.getTopiaRootContext().beginTransaction(); + + List results = transaction.find( + "FROM ContactImpl C1" + + " WHERE C1.user.company = :company" + + " AND C1.boat = :boat AND C1.sampleRow = :row" + + " AND C1.topiaCreateDate = " + + " (SELECT MAX(C2.topiaCreateDate) FROM ContactImpl C2" + + " WHERE C2.user.company = :company AND C2.boat = C1.boat)", + "company", company, + "boat", this, + "row", row); + + if (!results.isEmpty()) { + Contact contact = (Contact)results.get(0); + boolean validation = contact.getValidationProgram() != null || BooleanUtils.isFalse(contact.getValidationCompany()); + ContactState state = ContactState.createContactStateEnum(contact.getState()); + result = validation && !state.equals(ContactState.BOAT_DEFINITIVE_REFUSED); + } + + transaction.closeContext(); + } catch (Exception eee) { + SuiviObsmerContext.serviceException(transaction, + "Impossible de récupérer les informations privées du navire lié à la société " + + "'" + company.getName() + "'", + eee); + } + return result; + } + + } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java 2009-12-15 16:03:30 UTC (rev 122) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowImpl.java 2009-12-15 19:28:04 UTC (rev 123) @@ -175,6 +175,9 @@ @Override public void addRealTideTime(Contact contact) throws SuiviObsmerException { + if (contact.getTideEndDate() == null || contact.getTideBeginDate() == null) { + return; + } int nbDays = getDifferenceDays(contact); SampleMonth month = getSampleMonth(contact.getTideBeginDate()); if (log.isDebugEnabled()) { @@ -186,6 +189,9 @@ @Override public void removeRealTideTime(Contact contact) throws SuiviObsmerException { + if (contact.getTideEndDate() == null || contact.getTideBeginDate() == null) { + return; + } int nbDays = getDifferenceDays(contact); SampleMonth month = getSampleMonth(contact.getTideBeginDate()); if (log.isDebugEnabled()) { Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java 2009-12-15 16:03:30 UTC (rev 122) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java 2009-12-15 19:28:04 UTC (rev 123) @@ -275,7 +275,23 @@ } } } + // Last contact + List results = transaction.find( + "FROM ContactImpl C1" + + " WHERE C1.user.company = :company AND C1.boat = :boat " + + " AND C1.topiaCreateDate = " + + " (SELECT MAX(C2.topiaCreateDate) FROM ContactImpl C2" + + " WHERE C2.user.company = :company AND C2.boat = C1.boat)", + "company", company, + "boat", boat); + if (!results.isEmpty()) { + Contact contact = (Contact)results.get(0); + DataLoader.loadContactForBoatInfos(contact); + result.setLastContact(contact); + } + + transaction.closeContext(); } catch (Exception eee) { SuiviObsmerContext.serviceException(transaction, Modified: trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo =================================================================== (Binary files differ) Added: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java =================================================================== --- trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java (rev 0) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java 2009-12-15 19:28:04 UTC (rev 123) @@ -0,0 +1,220 @@ + +package fr.ifremer.suiviobsmer.entity; + +import fr.ifremer.suiviobsmer.SuiviObsmerContext; +import fr.ifremer.suiviobsmer.SuiviObsmerModelDAOHelper; +import fr.ifremer.suiviobsmer.SuiviObsmerRunner; +import fr.ifremer.suiviobsmer.bean.ContactState; +import fr.ifremer.suiviobsmer.business.SuiviObsmerRunnerTest; +import fr.ifremer.suiviobsmer.impl.ServiceBoatImpl; +import fr.ifremer.suiviobsmer.impl.ServiceContactImpl; +import fr.ifremer.suiviobsmer.impl.ServiceSamplingImpl; +import fr.ifremer.suiviobsmer.impl.ServiceUserImpl; +import fr.ifremer.suiviobsmer.services.ServiceBoat; +import fr.ifremer.suiviobsmer.services.ServiceContact; +import fr.ifremer.suiviobsmer.services.ServiceSampling; +import fr.ifremer.suiviobsmer.services.ServiceUser; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.nuiton.topia.TopiaContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * BoatImpl + * + * Created: 15 déc. 2009 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class BoatImplTest { + + private static SuiviObsmerRunner runner; + + private static final Logger log = LoggerFactory.getLogger(BoatImplTest.class); + + public BoatImplTest() { + } + + @BeforeClass + public static void setUpClass() throws Exception { + runner = new SuiviObsmerRunnerTest(); + } + + @AfterClass + public static void tearDownClass() throws Exception { + } + + @Before + public void setUp() throws Exception { + runner.start(); + } + + @After + public void tearDown() throws Exception { + runner.stop(); + } + + /** + * Test of getBoatInfos method, of class BoatImpl. + */ + //@Test + public void testGetBoatInfos() throws Exception { + System.out.println("getBoatInfos"); + } + + /** + * Test of getLastContact method, of class BoatImpl. + */ + @Test + public void testGetLastContact() throws Exception { + log.info("getLastContact"); + + /** PREPARE DATA **/ + ServiceUser serviceUser = new ServiceUserImpl(); + Company company = new CompanyImpl(); + company.setName("TARTANPION"); + serviceUser.createUpdateCompany(company); + User user = new UserImpl(); + user.setFirstName("Jean"); + user.setLastName("Michmuche"); + user.setCompany(company); + serviceUser.createUpdateUser(user, true); + + InputStream input = getClass().getResourceAsStream("/import/navires.csv"); + ServiceBoat serviceBoat = new ServiceBoatImpl(); + serviceBoat.importBoatCsv(input); + List<Boat> boats = serviceBoat.getBoats("174258"); + Boat boat = boats.get(0); + + TopiaContext transaction = SuiviObsmerContext.getTopiaRootContext().beginTransaction(); + + FishingZoneDAO zoneDAO = SuiviObsmerModelDAOHelper.getFishingZoneDAO(transaction); + FishingZone zoneIId = zoneDAO.create(FishingZone.DISTRICT_CODE, "IId"); + FishingZone zoneIV = zoneDAO.create(FishingZone.DISTRICT_CODE, "IV"); + FishingZone zoneI = zoneDAO.create(FishingZone.DISTRICT_CODE, "I"); + + transaction.commitTransaction(); + + ServiceSampling serviceSampling = new ServiceSamplingImpl(); + input = getClass().getResourceAsStream("/import/echantillonnage.csv"); + serviceSampling.importSamplingPlanCsv(input); + + SampleRowDAO rowDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); + SampleRow row = rowDAO.findByCode("2010_1"); + row.getCompany(); + row.getProgram(); + row.getProfession(); + transaction.closeContext(); + + row.setCompany(company); + serviceSampling.createUpdateSampleRow(row, boats); + + ServiceContact serviceContact = new ServiceContactImpl(); + Contact contact1 = serviceContact.getNewContact(user, row, boat); + contact1.setState(ContactState.CONTACT_START.toString()); + serviceContact.saveContact(contact1, false); + + /** EXEC METHOD **/ + Contact result = boat.getLastContact(company); + Assert.assertEquals(contact1.getTopiaId(), result.getTopiaId()); + } + + /** + * Test of canCreateContact method, of class BoatImpl. + */ + @Test + public void testCanCreateContact() throws Exception { + log.info("canCreateContact"); + /** PREPARE DATA **/ + ServiceUser serviceUser = new ServiceUserImpl(); + Company company = new CompanyImpl(); + company.setName("TARTANPION"); + serviceUser.createUpdateCompany(company); + User user = new UserImpl(); + user.setFirstName("Jean"); + user.setLastName("Michmuche"); + user.setCompany(company); + serviceUser.createUpdateUser(user, true); + + InputStream input = getClass().getResourceAsStream("/import/navires.csv"); + ServiceBoat serviceBoat = new ServiceBoatImpl(); + serviceBoat.importBoatCsv(input); + List<Boat> boats = serviceBoat.getBoats("174258"); + Boat boat = boats.get(0); + + TopiaContext transaction = SuiviObsmerContext.getTopiaRootContext().beginTransaction(); + + FishingZoneDAO zoneDAO = SuiviObsmerModelDAOHelper.getFishingZoneDAO(transaction); + FishingZone zoneIId = zoneDAO.create(FishingZone.DISTRICT_CODE, "IId"); + FishingZone zoneIV = zoneDAO.create(FishingZone.DISTRICT_CODE, "IV"); + FishingZone zoneI = zoneDAO.create(FishingZone.DISTRICT_CODE, "I"); + + transaction.commitTransaction(); + + ServiceSampling serviceSampling = new ServiceSamplingImpl(); + input = getClass().getResourceAsStream("/import/echantillonnage.csv"); + serviceSampling.importSamplingPlanCsv(input); + + SampleRowDAO rowDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); + SampleRow row = rowDAO.findByCode("2010_1"); + row.getCompany(); + row.getProgram(); + row.getProfession(); + transaction.closeContext(); + + row.setCompany(company); + serviceSampling.createUpdateSampleRow(row, boats); + + ServiceContact serviceContact = new ServiceContactImpl(); + Contact contact1 = serviceContact.getNewContact(user, row, boat); + contact1.setState(ContactState.CONTACT_START.toString()); + serviceContact.saveContact(contact1, false); + + /** EXEC METHOD **/ + boolean result = boat.canCreateContact(company, row); + // contact still open + Assert.assertFalse(result); + + contact1.setState(ContactState.BOAT_DEFINITIVE_REFUSED.toString()); + contact1.setValidationProgram(Boolean.TRUE); + serviceContact.saveContact(contact1, false); + + result = boat.canCreateContact(company, row); + // contact have a definitive refused for this boat + Assert.assertFalse(result); + + contact1.setState(ContactState.BOARDING_DONE.toString()); + serviceContact.saveContact(contact1, false); + + result = boat.canCreateContact(company, row); + // contact is finished + Assert.assertTrue(result); + + contact1.setState(ContactState.BOAT_UNAVAILABLE.toString()); + serviceContact.saveContact(contact1, false); + + result = boat.canCreateContact(company, row); + // contact is finished + Assert.assertTrue(result); + + contact1.setState(ContactState.BOAT_REFUSED.toString()); + serviceContact.saveContact(contact1, false); + + result = boat.canCreateContact(company, row); + // contact is finished + Assert.assertTrue(result); + } + +} \ No newline at end of file Property changes on: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Boats.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Boats.java 2009-12-15 16:03:30 UTC (rev 122) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Boats.java 2009-12-15 19:28:04 UTC (rev 123) @@ -29,6 +29,7 @@ import fr.ifremer.suiviobsmer.bean.CompanyBoatInfos; import fr.ifremer.suiviobsmer.entity.BoatInfos; import fr.ifremer.suiviobsmer.entity.Company; +import fr.ifremer.suiviobsmer.entity.Contact; import fr.ifremer.suiviobsmer.entity.ElligibleBoat; import fr.ifremer.suiviobsmer.entity.FishingZone; import fr.ifremer.suiviobsmer.entity.Profession; @@ -141,10 +142,6 @@ } } -// public User getUser() { -// return layout.getCurrentUser(); -// } - void onActivate(EventContext ec) { if (ec.getCount() > 0) { sampleRowCode = ec.get(String.class, 0); @@ -440,6 +437,13 @@ public DateFormat getDateFormat() { return new SimpleDateFormat("dd/MM/yyyy"); } + + public boolean canCreateNewContactFromList() throws SuiviObsmerException { + if (!user.getAdmin() && isSampleRowExists()) { + return boat.canCreateContact(user.getCompany(), getSampleRow()); + } + return false; + } Block onActionFromShowBoatInfos(Integer boatImma) { boatSelectedImmatriculation = boatImma; @@ -452,9 +456,6 @@ /**************************** Boat selected Infos *************************/ -// @Persist -// private BoatInfos boatInfos; - @Persist private CompanyBoatInfos companyBoatInfos; @@ -486,6 +487,8 @@ /*@Persist private SuiviObsmerPropertyChangeListener propertyChange;*/ + /** /////////////////////// GLOBAL TO THE BLOCK /////////////////////// **/ + public boolean isActivityCalendarImportRun() { return SuiviObsmerContext.isActivityCalendarImportRun(); } @@ -501,6 +504,25 @@ return displayBoatInfos; } + public Company getCompany() throws SuiviObsmerException { + if (user.getAdmin() && companyId != null) { + return getCompanySelectModel().findObject(companyId); + } + return user.getCompany(); + } + + public GenericSelectModel<Company> getCompanySelectModel() throws SuiviObsmerException { + if (companySelectModel == null) { + if (log.isDebugEnabled()) { + log.debug("BUSINESS REQUEST [getCompanies]"); + } + List<Company> companies = serviceUser.getCompanies(); + companySelectModel = new GenericSelectModel<Company>(companies,Company.class, + "name","topiaId",propertyAccess); + } + return companySelectModel; + } + public CompanyBoatInfos getCompanyBoatInfos() throws SuiviObsmerException { if (companyBoatInfos == null && boatSelectedImmatriculation != null) { if (log.isInfoEnabled()) { @@ -525,6 +547,8 @@ return getCompanyBoatInfos().getBoatInfos(); } + /** /////////////////////// FOR EACH ELLIGIBLEBOAT ROW ///////////////// **/ + public String getElligibleRowInfos() { return BusinessUtils.getTooltipSampleRow(elligibleBoat.getSampleRow()); } @@ -533,31 +557,21 @@ return BooleanUtils.isFalse(elligibleBoat.getCompanyActive()); } + public boolean canCreateNewContactFromElligibleBoat() throws SuiviObsmerException { + if (!user.getAdmin() && !isElligibleBoatCompanyActiveFalse()) { + return getBoatInfos().getBoat().canCreateContact(user.getCompany(), elligibleBoat.getSampleRow()); + } + return false; + } + public String getElligibleRowClass() { boolean condition1 = elligibleBoat.getCompanyActive() == null && !elligibleBoat.getGlobalActive(); return condition1 || isElligibleBoatCompanyActiveFalse() ? "line-through" : ""; } - public Company getCompany() throws SuiviObsmerException { - if (user.getAdmin() && companyId != null) { - return getCompanySelectModel().findObject(companyId); - } - return user.getCompany(); - } + /** /////////////////////// ACTIONS //////////////////////////////////// **/ - public GenericSelectModel<Company> getCompanySelectModel() throws SuiviObsmerException { - if (companySelectModel == null) { - if (log.isDebugEnabled()) { - log.debug("BUSINESS REQUEST [getCompanies]"); - } - List<Company> companies = serviceUser.getCompanies(); - companySelectModel = new GenericSelectModel<Company>(companies,Company.class, - "name","topiaId",propertyAccess); - } - return companySelectModel; - } - Block onSuccessFromCompanySelectForm() throws SuiviObsmerException { companyBoatInfos = null; // boatSelectedImmatriculation is getting from Persist("flash") Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Contacts.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Contacts.java 2009-12-15 16:03:30 UTC (rev 122) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/Contacts.java 2009-12-15 19:28:04 UTC (rev 123) @@ -26,19 +26,20 @@ import fr.ifremer.suiviobsmer.entity.Boat; import fr.ifremer.suiviobsmer.entity.Company; import fr.ifremer.suiviobsmer.entity.Contact; -import fr.ifremer.suiviobsmer.entity.SampleMonth; import fr.ifremer.suiviobsmer.entity.SampleRow; import fr.ifremer.suiviobsmer.entity.User; import fr.ifremer.suiviobsmer.services.ServiceBoat; import fr.ifremer.suiviobsmer.services.ServiceContact; import fr.ifremer.suiviobsmer.services.ServiceSampling; import fr.ifremer.suiviobsmer.ui.base.BusinessUtils; +import fr.ifremer.suiviobsmer.ui.base.GenericSelectModel; import fr.ifremer.suiviobsmer.ui.base.SuiviObsmerPage; import fr.ifremer.suiviobsmer.ui.components.Layout; import fr.ifremer.suiviobsmer.ui.services.ContactModelFactory; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; import java.util.Map; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; @@ -52,9 +53,9 @@ import org.apache.tapestry5.beaneditor.BeanModel; import org.apache.tapestry5.corelib.components.Form; import org.apache.tapestry5.ioc.annotations.Inject; +import org.apache.tapestry5.ioc.services.PropertyAccess; import org.apache.tapestry5.services.BeanModelSource; import org.slf4j.Logger; -import org.nuiton.util.DateUtils; /** * Contacts @@ -120,6 +121,15 @@ private Contact contact; private BeanModel<Contact> contactModel; + + @Inject + private PropertyAccess propertyAccess; + + private GenericSelectModel<User> userSelectModel; + + @Property + @Persist("flash") + private String contactUserId; private ContactState contactState; @@ -153,6 +163,17 @@ return this.contactState; } + public GenericSelectModel<User> getUserSelectModel() { + if (userSelectModel == null) { + List<User> users = user.getCompany().getUser(); + if (log.isDebugEnabled()) { + log.debug("Nb users : " + users.size()); + } + userSelectModel = new GenericSelectModel<User>(users, User.class, "fullName", "id", propertyAccess); + } + return userSelectModel; + } + public void setContactState(ContactState contactState) { this.contactState = contactState; } @@ -264,7 +285,9 @@ } } - void onSelectedFromEditContact(String contactId) { + void onSelectedFromEditContact(String contactId) throws SuiviObsmerException { + contact = getContacts().get(contactId); + contactUserId = contact.getUser().getTopiaId(); editableContactId = contactId; contactSelectedId = contactId; contactEdited = true; @@ -278,6 +301,8 @@ void onSelectedFromSaveContact(String contactId) throws SuiviObsmerException { contact = getContacts().get(contactId); contact.setState(contactState.toString()); + User contactUser = getUserSelectModel().findObject(contactUserId); + contact.setUser(contactUser); contactsForm.clearErrors(); if (!validateState()) { if (log.isDebugEnabled()) { Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/services/ContactModelFactory.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/services/ContactModelFactory.java 2009-12-15 16:03:30 UTC (rev 122) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/services/ContactModelFactory.java 2009-12-15 19:28:04 UTC (rev 123) @@ -52,7 +52,7 @@ BeanModel<Contact> contactModel = beanModelSource.createDisplayModel(Contact.class, resources.getMessages()); // New properties for contactModel - contactModel.add("createdBy", getUserPropertyConduit()); + contactModel.add("createdBy", null); contactModel.add("sampleRow", getSampleRowPropertyConduit()); contactModel.add("boat", getBoatPropertyConduit()); contactModel.add("mammals", null); @@ -79,7 +79,9 @@ public BeanModel<Contact> buildAdminContactModel(BeanModelSource beanModelSource, ComponentResources resources) { BeanModel<Contact> contactModel = buildContactModel(beanModelSource, resources); - contactModel.add(RelativePosition.BEFORE, "createdBy", "company", getCompanyPropertyConduit()); + contactModel.exclude("createdBy"); + contactModel.add(RelativePosition.AFTER,"topiaCreateDate", "observer", getUserPropertyConduit()); + contactModel.add(RelativePosition.AFTER, "observer", "company", getCompanyPropertyConduit()); contactModel.add(RelativePosition.AFTER, "sampleRow", "program", getProgramPropertyConduit()); contactModel.add(RelativePosition.AFTER, "program", "professionCode", getProfessionCodePropertyConduit()); contactModel.add(RelativePosition.AFTER, "professionCode", "professionLibelle", getProfessionLibellePropertyConduit()); Modified: trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/pages/Boats.properties =================================================================== --- trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/pages/Boats.properties 2009-12-15 16:03:30 UTC (rev 122) +++ trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/pages/Boats.properties 2009-12-15 19:28:04 UTC (rev 123) @@ -17,8 +17,13 @@ boatLength-label: Longueur # BOAT INFOS +topiaCreateDate-label: Date +state-label: Etat +createdBy-label: Observateur +sampleRowCode-label: Code plan contactFirstName-label: Pr\u00E9nom contactLastName-label: Nom contactPhoneNumber-label: T\u00E9l\u00E9phone contactEmail-label: E-mail +shipOwner-label: Armateur dup-label: Capacit\u00E9 d'accueil du navire en personnels sp\u00E9cialis\u00E9s \ No newline at end of file Modified: trunk/suiviobsmer-ui/src/main/webapp/Boats.tml =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/Boats.tml 2009-12-15 16:03:30 UTC (rev 122) +++ trunk/suiviobsmer-ui/src/main/webapp/Boats.tml 2009-12-15 19:28:04 UTC (rev 123) @@ -110,13 +110,11 @@ <div t:type="grid" t:source="boats.values()" t:row="boat" t:include="name, immatriculation, districtCode, boatLength, buildYear" t:rowClass="prop:rowClass" t:rowsPerPage="20"> <p:nameCell> - <t:unless t:test="user.admin"> - <t:if t:test="sampleRowExists"> - <a t:type="actionlink" t:id="addNewContactFromBoat" t:context="boat.immatriculation"> - <img src="${asset:context:}/img/contact-22px.png" title="Créer un nouveau contact pour ce navire et la ligne sélectionnée dans les filtres"/> - </a> - </t:if> - </t:unless> + <t:if t:test="canCreateNewContactFromList()"> + <a t:type="actionlink" t:id="addNewContactFromBoat" t:context="boat.immatriculation"> + <img src="${asset:context:}/img/contact-22px.png" title="Créer un nouveau contact pour ce navire et la ligne sélectionnée dans les filtres"/> + </a> + </t:if> <a t:type="actionlink" t:id="showBoatInfos" t:context="boat.immatriculation" t:zone="boatsZone">${boat.name}</a> </p:nameCell> <p:boatLengthCell> @@ -192,24 +190,50 @@ </t:unless> <!-- BODY - armateur, contact --> - <fieldset id="so-boats-boat-infos-shipowner"> +<!-- <fieldset id="so-boats-boat-infos-shipowner"> <legend>Armateur</legend> <div t:type="beandisplay" t:id="boatInfosShipOwner" t:object="boatInfos.boat.shipOwner" t:include="firstName, lastName" /> - </fieldset> + </fieldset>--> + <t:if t:test="companyBoatInfos.lastContact"> + <fieldset id="so-boats-boat-infos-shipowner"> + <legend>Dernier contact avec le navire</legend> + <div t:type="beandisplay" t:id="boatInfosLastContact" t:object="companyBoatInfos.lastContact" + t:include="topiaCreateDate, state" t:add="createdBy, sampleRowCode"> + <p:createdBy> + ${companyBoatInfos.lastContact.user.fullName} + </p:createdBy> + <p:sampleRowCode> + ${companyBoatInfos.lastContact.sampleRow.code} + </p:sampleRowCode> + </div> + </fieldset> + </t:if> <fieldset id="so-boats-boat-infos-contact"> <legend>Contact</legend> <div t:type="beandisplay" t:id="boatInfosContact" t:object="boatInfos" t:include="contactFirstName, contactLastName, contactPhoneNumber, contactEmail" /> </fieldset> + <!-- BODY - autres --> <fieldset id="so-boats-boat-infos-boarding"> <legend>Autres informations sur le navire</legend> <div> - <p><label>${message:dup-label} : </label>${boatInfos.dup}</p> + <p> + <label>${message:shipOwner-label} : </label> + ${boatInfos.boat.shipOwner.firstName} ${boatInfos.boat.shipOwner.lastName} + </p> <p class="sep"> </p> <p> + <label>${message:dup-label} : </label> + <t:if t:test="boatInfos.dup"> + ${boatInfos.dup} + <p:else>aucun</p:else> + </t:if> + </p> + <p class="sep"> </p> + <p> <strong>${boatInfos.nbBoarding}</strong> embarquements dont <strong>${boatInfos.nbBoardingForCompany}</strong> pour votre société depuis le <strong><t:output value="boatInfos.firstBoardingDate" format="dateFormat" /></strong> @@ -223,13 +247,11 @@ ${elligibleBoat.sampleRow.code} </span> </span> - <t:unless t:test="user.admin"> - <t:unless t:test="elligibleBoatCompanyActiveFalse"> - <a t:type="actionlink" t:id="addNewContactFromSampleRow" t:context="elligibleBoat.sampleRow.code"> - <img src="${asset:context:}/img/contact-22px.png" title="Créer un nouveau contact pour ce navire et cette ligne du plan"/> - </a> - </t:unless> - </t:unless> + <t:if t:test="canCreateNewContactFromElligibleBoat()"> + <a t:type="actionlink" t:id="addNewContactFromSampleRow" t:context="elligibleBoat.sampleRow.code"> + <img src="${asset:context:}/img/contact-22px.png" title="Créer un nouveau contact pour ce navire et cette ligne du plan"/> + </a> + </t:if> </li> </ul> <t:if t:test="boatInfos.comment"> Modified: trunk/suiviobsmer-ui/src/main/webapp/Contacts.tml =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/Contacts.tml 2009-12-15 16:03:30 UTC (rev 122) +++ trunk/suiviobsmer-ui/src/main/webapp/Contacts.tml 2009-12-15 19:28:04 UTC (rev 123) @@ -8,6 +8,12 @@ <t:errors id="so-contact-form-errors" t:banner="message:contactsForm-errors-banner"/> <div t:type="grid" t:source="contacts.values()" t:row="contact" class="t-data-grid ${gridClass}" t:model="contactModel" t:rowClass="prop:rowClass" t:rowsPerPage="20"> + <p:createdByCell> + <t:if t:test="editionMode"> + <input t:type="select" t:model="userSelectModel" t:validate="required" t:value="contactUserId"/> + <p:else>${contact.user.fullName}</p:else> + </t:if> + </p:createdByCell> <p:sampleRowCell> <span t:type="ck/Tooltip" title="Infos" t:value="prop:sampleRowDescription" t:effect="appear"> ${contact.sampleRow.code}