Author: fdesbois Date: 2010-02-05 18:10:00 +0000 (Fri, 05 Feb 2010) New Revision: 331 Added: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ContactStateStatisticsImpl.java Modified: trunk/changelog.txt trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSynthesisImpl.java trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSynthesisImplTest.java Log: Evo #1986 : Add indicator for contact states (business only) Modified: trunk/changelog.txt =================================================================== --- trunk/changelog.txt 2010-02-05 14:04:29 UTC (rev 330) +++ trunk/changelog.txt 2010-02-05 18:10:00 UTC (rev 331) @@ -1,6 +1,8 @@ Release note ============ +Historique des versions + 1.0.0 ----- @@ -24,6 +26,16 @@ - [fdesbois] Ano #1992 : Session : Problème d'instanciation sur User lors de la perte de la session + +0.4.1 +----- + +Evolutions +++++++++++ + +Anomalies ++++++++++ + - [fdesbois] Ano #2073 : Contacts : Erreur tableau contact sur commentaire refus 0.4.0 Added: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ContactStateStatisticsImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ContactStateStatisticsImpl.java (rev 0) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ContactStateStatisticsImpl.java 2010-02-05 18:10:00 UTC (rev 331) @@ -0,0 +1,48 @@ + +package fr.ifremer.suiviobsmer.bean; + +import fr.ifremer.suiviobsmer.entity.Company; +import java.util.HashMap; +import java.util.Map; + +/** + * ContactStateStatisticsImpl + * + * Created: 5 févr. 2010 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class ContactStateStatisticsImpl extends ContactStateStatistics { + + @Override + public void addResult(String state, int nbResults) { + + ContactState stateEnum = ContactState.createContactStateEnum(state); + getData().put(stateEnum, nbResults); + + total += nbResults; + } + + @Override + public Map<ContactState, Integer> getData() { + if (data == null) { + data = new HashMap<ContactState, Integer>(); + + // Initialize all contact states + for (ContactState state : ContactState.values()) { + data.put(state, 0); + } + } + return data; + } + + @Override + public boolean isDefined() { + return total != 0; + } + +} Property changes on: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ContactStateStatisticsImpl.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSynthesisImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSynthesisImpl.java 2010-02-05 14:04:29 UTC (rev 330) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSynthesisImpl.java 2010-02-05 18:10:00 UTC (rev 331) @@ -26,6 +26,8 @@ import fr.ifremer.suiviobsmer.SuiviObsmerModelDAOHelper; import fr.ifremer.suiviobsmer.bean.BoardingResult; import fr.ifremer.suiviobsmer.bean.BoardingResultImpl; +import fr.ifremer.suiviobsmer.bean.ContactStateStatistics; +import fr.ifremer.suiviobsmer.bean.ContactStateStatisticsImpl; import fr.ifremer.suiviobsmer.bean.SamplingFilter; import fr.ifremer.suiviobsmer.entity.Boat; import fr.ifremer.suiviobsmer.entity.Company; @@ -34,10 +36,12 @@ import fr.ifremer.suiviobsmer.entity.SampleMonth; import fr.ifremer.suiviobsmer.entity.SampleMonthDAO; import fr.ifremer.suiviobsmer.entity.SampleRow; +import fr.ifremer.suiviobsmer.entity.WaoUser; import fr.ifremer.suiviobsmer.services.ServiceSynthesis; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; @@ -48,6 +52,7 @@ import org.nuiton.topia.TopiaContext; import org.nuiton.topia.framework.TopiaQuery; import org.nuiton.topia.framework.TopiaQuery.Op; +import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.util.PeriodDates; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -324,4 +329,82 @@ return results; } + @Override + public Collection<ContactStateStatistics> getContactStateStatistics(Company company, PeriodDates period) throws SuiviObsmerException { + TopiaContext transaction = null; + Map<Company, ContactStateStatistics> results = new HashMap<Company, ContactStateStatistics>(); + try { + transaction = rootContext.beginTransaction(); + + ContactDAO dao = SuiviObsmerModelDAOHelper.getContactDAO(transaction); + + // Only for contacts not refused by the program + String contactKey = "C"; + String validationProgramKey = contactKey + "." + Contact.VALIDATION_PROGRAM; + TopiaQuery<Contact> query = dao.createQuery(contactKey). + add(validationProgramKey + " IS NULL " + + "OR " + validationProgramKey + " = :booleanTrue"). + addParam("booleanTrue", Boolean.TRUE); + + String companyKey = contactKey + "." + Contact.OBSERVER + "." + WaoUser.COMPANY; + + if (company != null) { + query.add(companyKey, company); + } + + if (period != null) { + // Contacts include in the period + String tideBeginDateKey = contactKey + "." + Contact.TIDE_BEGIN_DATE; + String createDateKey = contactKey + "." + TopiaEntity.TOPIA_CREATE_DATE; + query.add("(" + tideBeginDateKey + " IS NOT NULL " + + "AND " + tideBeginDateKey + " >= :fromDate " + + "AND " + tideBeginDateKey + " <= :thruDate)" + + " OR (" + tideBeginDateKey + " IS NULL " + + "AND " + createDateKey + " >= :fromDate " + + "AND " + createDateKey + " <= :thruDate)"); + + query.addParam("fromDate", period.getFromDate()). + addParam("thruDate", period.getThruDate()); + } + + String stateKey = contactKey + "." + Contact.STATE; + query.addGroup(companyKey).addGroup(stateKey). + addOrder(companyKey). + setSelect(companyKey).addSelect(stateKey).addSelect("COUNT(*)"); + + if (log.isDebugEnabled()) { + log.debug("Exec query : " + query); + } + + List<Object[]> res = query.execute(); + + for (Object[] row : res) { + Company rowCompany = (Company)row[0]; + String rowState = (String)row[1]; + Long rowCount = (Long)row[2]; + if (log.isDebugEnabled()) { + log.debug("res : " + rowCompany.getName() + " _ " + rowState + " _ " + rowCount); + } + ContactStateStatistics stats = results.get(rowCompany); + if (stats == null) { + stats = new ContactStateStatisticsImpl(); + stats.setCompany(rowCompany); + results.put(rowCompany, stats); + } + stats.addResult(rowState, rowCount.intValue()); + } + + transaction.closeContext(); + } catch (Exception eee) { + String msgEnd = ""; + if (company != null) { + msgEnd = " pour la société " + company.getName(); + } + SuiviObsmerContext.serviceException(transaction, + "Impossible de récupérer les statistiques sur les états des " + + "contacts " + msgEnd, eee); + } + return results.values(); + } + } Modified: trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo =================================================================== (Binary files differ) Modified: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSynthesisImplTest.java =================================================================== --- trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSynthesisImplTest.java 2010-02-05 14:04:29 UTC (rev 330) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSynthesisImplTest.java 2010-02-05 18:10:00 UTC (rev 331) @@ -7,6 +7,7 @@ import fr.ifremer.suiviobsmer.SuiviObsmerRunnerTest; import fr.ifremer.suiviobsmer.bean.BoardingResult; import fr.ifremer.suiviobsmer.bean.ContactState; +import fr.ifremer.suiviobsmer.bean.ContactStateStatistics; import fr.ifremer.suiviobsmer.entity.Boat; import fr.ifremer.suiviobsmer.entity.Company; import fr.ifremer.suiviobsmer.entity.CompanyDAO; @@ -21,9 +22,11 @@ import fr.ifremer.suiviobsmer.services.ServiceReferential; import fr.ifremer.suiviobsmer.services.ServiceSampling; import java.io.InputStream; +import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; +import org.apache.commons.collections.CollectionUtils; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; @@ -31,6 +34,7 @@ import org.junit.Test; import org.nuiton.topia.TopiaContext; import org.nuiton.util.DateUtils; +import org.nuiton.util.PeriodDates; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.junit.Assert.*; @@ -273,4 +277,147 @@ assertEquals(1., value, 0); } + /** + * Test of getBoardingBoats method, of class ServiceSynthesisImpl. + */ + @Test + public void testGetContactStateStatistics() throws Exception { + log.info("getContactStateStatistics"); + /** PREPARE DATA **/ + InputStream input = getClass().getResourceAsStream("/import/navires.csv"); + ServiceBoat serviceBoat = new ServiceBoatImpl(); + serviceBoat.importBoatCsv(input); + List<Boat> boats = serviceBoat.getBoatsByImmatriculations("174258"); + Boat boat = boats.get(0); + + List<Boat> boats2 = serviceBoat.getBoatsByImmatriculations("177474"); + Boat boat2 = boats2.get(0); + + TopiaContext transaction = SuiviObsmerContext.getTopiaRootContext().beginTransaction(); + + CompanyDAO companyDAO = SuiviObsmerModelDAOHelper.getCompanyDAO(transaction); + Company company = companyDAO.create(Company.NAME, "TARTANPION"); + Company company2 = companyDAO.create(Company.NAME, "BIS"); + + WaoUserDAO userDAO = SuiviObsmerModelDAOHelper.getWaoUserDAO(transaction); + WaoUser user = userDAO.create(WaoUser.FIRST_NAME,"Jean", WaoUser.LAST_NAME, "Michmuche", + WaoUser.COMPANY, company); + company.addWaoUser(user); + WaoUser user2 = userDAO.create(WaoUser.FIRST_NAME,"Bill", WaoUser.LAST_NAME, "Murray", + WaoUser.COMPANY, company2); + company2.addWaoUser(user2); + + transaction.commitTransaction(); + + input = getClass().getResourceAsStream("/import/zonesPeche.csv"); + ServiceReferential serviceReferential = new ServiceReferentialImpl(); + serviceReferential.importFishingZoneCsv(input); + + input = getClass().getResourceAsStream("/import/echantillonnage.csv"); + ServiceSampling serviceSampling = new ServiceSamplingImpl(); + serviceSampling.importSamplingPlanCsv(input); + + SampleRowDAO rowDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); + SampleRow row = rowDAO.findByCode("2010_0001"); + + transaction.closeContext(); + + + ServiceContact serviceContact = new ServiceContactImpl(); + + // Contacts for company TARTANPION + Contact contact1 = new ContactImpl(); + contact1.setObserver(user); + contact1.setState(ContactState.BOARDING_DONE.toString()); + Date begin = DateUtils.createDate(3, 3, 2009); + contact1.setTideBeginDate(begin); + serviceContact.saveContact(contact1, false); + + Contact contact2 = new ContactImpl(); + contact2.setObserver(user); + contact2.setState(ContactState.BOARDING_DONE.toString()); + begin = DateUtils.createDate(3, 10, 2009); + contact2.setTideBeginDate(begin); + serviceContact.saveContact(contact2, false); + + Contact contact3 = new ContactImpl(); + contact3.setObserver(user); + contact3.setState(ContactState.BOAT_REFUSED.toString()); + begin = DateUtils.createDate(3, 5, 2009); + contact3.setTopiaCreateDate(begin); + serviceContact.saveContact(contact3, false); + + // Contacts for company BIS + Contact contact4 = new ContactImpl(); + contact4.setObserver(user2); + contact4.setState(ContactState.BOARDING_EXPECTED.toString()); + begin = DateUtils.createDate(3, 5, 2009); + contact4.setTopiaCreateDate(begin); + serviceContact.saveContact(contact4, false); + + Contact contact5 = new ContactImpl(); + contact5.setObserver(user2); + contact5.setState(ContactState.BOAT_UNAVAILABLE.toString()); + begin = DateUtils.createDate(3, 3, 2010); + contact5.setTopiaCreateDate(begin); + serviceContact.saveContact(contact5, false); + + // Contact refused by program, will not be in result + Contact contact6 = new ContactImpl(); + contact6.setObserver(user2); + contact6.setState(ContactState.BOAT_UNAVAILABLE.toString()); + begin = DateUtils.createDate(3, 3, 2010); + contact6.setTopiaCreateDate(begin); + contact6.setValidationProgram(Boolean.FALSE); + serviceContact.saveContact(contact6, false); + + /** EXEC METHOD **/ + + // result for company TARTANPION with no period + Collection<ContactStateStatistics> results = + service.getContactStateStatistics(company, null); + + assertEquals(1, results.size()); + ContactStateStatistics result = (ContactStateStatistics)CollectionUtils.get(results, 0); + assertEquals(3, result.getTotal()); + Map<ContactState, Integer> data = result.getData(); + assertNotNull(data); + + assertEquals(ContactState.values().length, data.size()); + assertEquals(2, data.get(ContactState.BOARDING_DONE).intValue()); + assertEquals(1, data.get(ContactState.BOAT_REFUSED).intValue()); + + // result for company BIS using admin mode + results = service.getContactStateStatistics(null, null); + assertEquals(2, results.size()); + + result = null; + for (ContactStateStatistics stats : results) { + if (stats.getCompany().equals(company2)) { + result = stats; + break; + } + } + + assertEquals(2, result.getTotal()); + data = result.getData(); + assertEquals(1, data.get(ContactState.BOARDING_EXPECTED).intValue()); + assertEquals(1, data.get(ContactState.BOAT_UNAVAILABLE).intValue()); + + // result for period 3/5/2009 to 3/10/2009 for BIS company + begin = DateUtils.createDate(3, 5, 2009); + Date end = DateUtils.createDate(31, 10, 2009); + PeriodDates period = new PeriodDates(begin, end); + + results = service.getContactStateStatistics(company2, period); + assertEquals(1, results.size()); + + result = (ContactStateStatistics)CollectionUtils.get(results, 0); + + assertEquals(1, result.getTotal()); + data = result.getData(); + assertEquals(1, data.get(ContactState.BOARDING_EXPECTED).intValue()); + assertEquals(0, data.get(ContactState.BOAT_UNAVAILABLE).intValue()); + } + } \ No newline at end of file