Author: fdesbois Date: 2010-01-13 11:27:45 +0000 (Wed, 13 Jan 2010) New Revision: 190 Added: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowHistoric.java trunk/suiviobsmer-ui/src/main/webapp/SampleRowHistoric.tml trunk/suiviobsmer-ui/src/main/webapp/img/clock-22px.png trunk/suiviobsmer-ui/src/main/webapp/img/suppr-unavailable-16px.png Modified: trunk/src/site/rst/business-rules.rst trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProfessionImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowLogImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.properties trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImplTest.java trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImplTest.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowForm.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SamplingPlan.java trunk/suiviobsmer-ui/src/main/webapp/SampleRowForm.tml trunk/suiviobsmer-ui/src/main/webapp/SamplingPlan.tml trunk/suiviobsmer-ui/src/main/webapp/css/sampling.css Log: - Add historic for SampleRow (SampleRowLog + SampleRowHistoric page) - Problem with saving FishingZone for SampleRow, logging for FishingZone and Profession - Add constraint on SampleMonth when realTidesValue exist Modified: trunk/src/site/rst/business-rules.rst =================================================================== --- trunk/src/site/rst/business-rules.rst 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/src/site/rst/business-rules.rst 2010-01-13 11:27:45 UTC (rev 190) @@ -11,8 +11,9 @@ * (obligatoire) profession : toujours une nouvelle profession * (obligatoire) zone de pêche : au moins une zone de pêche doit être ajouté à la ligne * (obligatoire) programme : déjà existant ou nouveau programme - * (obligatoire) période du programme : modifiable si cela ne pose pas de problème sur des données d'embarquements réels + * (obligatoire) période : modifiable si cela ne pose pas de problème sur des données d'embarquements réels * données des marées / mois : toujours minimum à 0 + * suppression possible d'un mois au milieu de la période choisie * (obligatoire) code de la ligne : générer automatiquement à partir de la date de début du programme : [year]_[lastNum] * autres champs non obligatoire @@ -24,6 +25,8 @@ - Modification (si des embarquements réels ont été effectuées sur la ligne) : * Modification impossible pour les champs : profession, zones de pêche, programme + * Impossible d'avoir des données d'une marée inférieurs aux données réels + * Impossible de supprimer un mois avec des données réels * (obligatoire) Commentaire de modification - Suppression : possible uniquement si aucun embarquement réel n'a été enregistré sur la ligne @@ -70,9 +73,12 @@ - Contraintes sur les dates : - * Date de fin postérieure ou égal à la date de début + * Date de début doit correspondre à un mois existant de la ligne (non vide) + * Date de fin postérieure ou égale à la date de début * Date de fin antérieure à la date du jour * Date de début et date de fin incluses dans la période du programme de la ligne du plan lié au contact + * Date de saisie des données postérieure ou égale à la date de fin de la marée + * Date de saisie des données antérieure ou égale à la date du jour - Validation par la société : Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProfessionImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProfessionImpl.java 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/ProfessionImpl.java 2010-01-13 11:27:45 UTC (rev 190) @@ -47,11 +47,14 @@ public String getCode() { String code = getCodeDCF5(); if (!StringUtils.isEmpty(getMeshSize())) { - code += getMeshSize(); + code += " " + getMeshSize(); } if (!StringUtils.isEmpty(getSize())) { - code += getSize(); + code += " " + getSize(); } + if (!StringUtils.isEmpty(getOther())) { + code += " " + getOther(); + } return code; } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowLogImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowLogImpl.java 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/entity/SampleRowLogImpl.java 2010-01-13 11:27:45 UTC (rev 190) @@ -1,9 +1,11 @@ package fr.ifremer.suiviobsmer.entity; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.List; import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.nuiton.util.PeriodDates; /** * SampleRowLogImpl @@ -34,4 +36,91 @@ setLogText(log); } + @Override + public void addChangeProfession(Profession oldProfession, Profession newProfession) { + if (oldProfession == null) { + addChange("Le métier de la ligne est " + newProfession.getCode()); + if (newProfession.getLibelle() != null) { + addChange("Le libelle du métier est " + newProfession.getLibelle()); + } + if (newProfession.getSpecies() != null) { + addChange("Les espèces cibles du métier sont " + newProfession.getSpecies()); + } + return; + } + + // FIXME doesn't work +// if (nvl(oldProfession.getCode()).equals(nvl(newProfession.getCode()))) { +// addChange("Le métier de la ligne est passé de " + oldProfession.getCode() + " à " + newProfession.getCode()); +// } +// if (newProfession.getLibelle() != null && nvl(oldProfession.getLibelle()).equals(nvl(newProfession.getLibelle()))) { +// addChange("Le libellé du métier est passé de " + oldProfession.getLibelle() + " à " + newProfession.getLibelle()); +// } +// if (newProfession.getSpecies() != null && nvl(oldProfession.getSpecies()).equals(nvl(newProfession.getSpecies()))) { +// addChange("Les espèces cibles du métier sont passées de " + oldProfession.getSpecies() + " à " + newProfession.getSpecies()); +// } + } + + protected String nvl(String str) { + return str == null ? "" : str; + } + + @Override + public void addChangeCompany(Company oldCompany, Company newCompany) { + if (oldCompany != null) { + String msg = "La ligne n'est plus associé à la société " + oldCompany.getName(); + if (newCompany != null && !newCompany.equals(oldCompany)) { + addChange(msg + " mais à la société " + newCompany.getName()); + } else if (newCompany == null) { + addChange(msg); + } + } else if (newCompany != null) { + addChange("La ligne est désormais associé à la société " + newCompany.getName()); + } + } + + @Override + public void addChangeProgram(String oldProgram, String newProgram) { + if (!StringUtils.isEmpty(oldProgram)) { + if (!oldProgram.equals(newProgram)) { + addChange("La ligne n'est plus associé au programme " + oldProgram + " mais au programme " + newProgram); + } + } else if (!StringUtils.isEmpty(newProgram)) { + addChange("La ligne est désormais associé au programme " + newProgram); + } + } + + @Override + public void addChangePeriod(PeriodDates oldPeriod, PeriodDates newPeriod, String pattern) { + DateFormat dateFormat = new SimpleDateFormat(pattern); + String newPeriodBegin = dateFormat.format(newPeriod.getFromDate()); + String newPeriodEnd = dateFormat.format(newPeriod.getThruDate()); + if (oldPeriod == null) { + addChange("La ligne est sur la période du " + newPeriodBegin + " au " + newPeriodEnd); + return; + } + // dates inside oldPeriod and newPeriod can't be null + String oldPeriodBegin = dateFormat.format(oldPeriod.getFromDate()); + if (!oldPeriodBegin.equals(newPeriodBegin)) { + addChange("La date de début est passé de " + oldPeriodBegin + " à " + newPeriodBegin); + } + String oldPeriodEnd = dateFormat.format(oldPeriod.getThruDate()); + if (!oldPeriodEnd.equals(newPeriodEnd)) { + addChange("La date de fin est passé de " + oldPeriodEnd + " à " + newPeriodEnd); + } + } + + @Override + public void addChangeBoats(String oldBoats, String newBoats) { + if (oldBoats.isEmpty() && !newBoats.isEmpty()) { + addChange("La liste des immatriculations des navires est (" + newBoats + ")"); + return; + } + + if (!newBoats.isEmpty() && !oldBoats.equals(newBoats)) { + addChange("La liste des immatriculations des navires est passé de (" + oldBoats + ") à (" + newBoats + ")"); + } + + } + } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java 2010-01-13 11:27:45 UTC (rev 190) @@ -83,54 +83,80 @@ } @Override - public void createUpdateSampleRow(SampleRow row, List<Boat> boats, String updateComment) throws SuiviObsmerException { + public void createUpdateSampleRow(SampleRow row, List<Boat> boats, SampleRowLog rowLog) throws SuiviObsmerException { TopiaContext transaction = null; try { transaction = rootContext.beginTransaction(); SampleRowLogDAO logDAO = SuiviObsmerModelDAOHelper.getSampleRowLogDAO(transaction); - SampleRowLog rowLog = logDAO.create(SampleRowLog.COMMENT, updateComment); + SuiviObsmerContext.prepareTopiaId(SampleRowLog.class, rowLog); + logDAO.update(rowLog); boolean newRow = SuiviObsmerContext.prepareTopiaId(SampleRow.class, row); - DateFormat dateFormat = new SimpleDateFormat("MM/yyyy"); + if (log.isDebugEnabled()) { + log.debug("new sampleRow : " + newRow); + log.debug("samplRow topiaId : " + row.getTopiaId()); + } + String pattern = DateUtils.MONTH_PATTERN; + DateFormat dateFormat = new SimpleDateFormat(pattern); + SampleRow oldRow = null; + Profession oldProfession = null; + Company oldCompany = null; Map<String, SampleMonth> oldMonths = new HashMap<String, SampleMonth>(); + List<FishingZone> oldZones = new ArrayList<FishingZone>(); + // UPDATE if (!newRow) { // Prepare data for logging or deleting oldMonths TopiaContext transaction2 = rootContext.beginTransaction(); SampleRowDAO oldDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction2); oldRow = oldDAO.findByTopiaId(row.getTopiaId()); - oldRow.getCompany(); - oldRow.getProfession(); + oldCompany = oldRow.getCompany(); + oldProfession = oldRow.getProfession(); for (SampleMonth month : oldRow.getSampleMonth()) { oldMonths.put(month.getTopiaId(), month); } + oldZones = oldRow.getFishingZone(); transaction2.closeContext(); - } - if (log.isDebugEnabled()) { - log.debug("new sampleRow : " + newRow); - log.debug("samplRow topiaId : " + row.getTopiaId()); - } - - // Creation - if (newRow) { - // Save profession : create or update - ProfessionDAO professionDAO = SuiviObsmerModelDAOHelper.getProfessionDAO(transaction); - SuiviObsmerContext.prepareTopiaId(Profession.class, row.getProfession()); - if (log.isDebugEnabled()) { - log.debug("create or update profession : " + row.getProfession()); + // NbObservants + if (oldRow.getNbObservants() != row.getNbObservants()) { + rowLog.addChange("Le nombre d'observateurs est passé de " + oldRow.getNbObservants() + " à " + row.getNbObservants()); } - professionDAO.update(row.getProfession()); + // AverageTideTime + if (oldRow.getAverageTideTime() != row.getAverageTideTime()) { + rowLog.addChange("La durée moyenne d'une marée est passé de " + oldRow.getAverageTideTime() + " jours à " + row.getAverageTideTime()); + } + } else { + rowLog.addChange("Le nombre d'observateurs est " + row.getNbObservants()); + rowLog.addChange("La durée moyenne d'une marée est " + row.getAverageTideTime()); } + // ChangeLog Company + rowLog.addChangeCompany(oldCompany, row.getCompany()); + // ChangeLog Program + String oldProgram = oldRow != null ? oldRow.getProgramName() : null; + rowLog.addChangeProgram(oldProgram, row.getProgramName()); + // ChangeLog Period + PeriodDates oldPeriod = null; + if (oldRow != null) { + oldPeriod = new PeriodDates(oldRow.getPeriodBegin(), oldRow.getPeriodEnd()); + } + PeriodDates newPeriod = new PeriodDates(row.getPeriodBegin(), row.getPeriodEnd()); + rowLog.addChangePeriod(oldPeriod, newPeriod, pattern); + // Save Profession + ProfessionDAO professionDAO = SuiviObsmerModelDAOHelper.getProfessionDAO(transaction); + SuiviObsmerContext.prepareTopiaId(Profession.class, row.getProfession()); + rowLog.addChangeProfession(oldProfession, row.getProfession()); + professionDAO.update(row.getProfession()); + // Save sampleMonth SampleMonthDAO monthDAO = SuiviObsmerModelDAOHelper.getSampleMonthDAO(transaction); + // Delete oldMonths List<SampleMonth> newMonths = row.getSampleMonth(); - for (SampleMonth oldMonth : oldMonths.values()) { if (!newMonths.contains(oldMonth)) { String date = dateFormat.format(oldMonth.getPeriodDate()); @@ -139,8 +165,8 @@ rowLog.addChange("Le mois " + date + " a été supprimé"); } } - - for (SampleMonth month : row.getSampleMonth()) { + // Create or update months + for (SampleMonth month : newMonths) { boolean monthCreated = SuiviObsmerContext.prepareTopiaId(SampleMonth.class, month); String date = dateFormat.format(month.getPeriodDate()); if (monthCreated) { @@ -171,12 +197,34 @@ } } + // ChangeLog boats + String oldBoats = oldRow != null ? oldRow.getMainElligibleBoatsAsString() : ""; + rowLog.addChangeBoats(oldBoats, row.getMainElligibleBoatsAsString()); + + // Remove no longer linked FishingZone + List<FishingZone> newZones = row.getFishingZone(); +// for (FishingZone oldZone : oldZones) { +// if (!newZones.contains(oldZone)) { +// updateFishingZones(transaction, oldZone.getTopiaId(), row, true); +// rowLog.addChange("La zone de pêche " + oldZone.getCode() + " a été dissocié de la ligne"); +// } +// } + // Add new linked FishingZone + // ConcurrentModificationException ???? +// for (FishingZone zone : newZones) { +// if (!oldZones.contains(zone)) { +// updateFishingZones(transaction, zone.getTopiaId(), row, false); +// rowLog.addChange("La zone de pêche " + zone.getCode() + " a été associé de la ligne"); +// } +// } + // Save sampleRow : create or update SampleRowDAO rowDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); if (log.isDebugEnabled()) { log.debug("update row : " + row); } + row.addSampleRowLog(rowLog); rowDAO.update(row); if(newRow) { @@ -206,6 +254,37 @@ } } + protected void updateFishingZones(TopiaContext transaction, String zoneId, SampleRow row, boolean delete) throws TopiaException { + // FIXME find a way to avoid saving links from FishingZone instead of SampleRow : + // variable inverse="true" in hibernate mapping of FishingZone, how to set this variable to SampleRow instead + FishingZoneDAO fishingZoneDAO = SuiviObsmerModelDAOHelper.getFishingZoneDAO(transaction); + FishingZone zoneFromDB = fishingZoneDAO.findByTopiaId(zoneId); + if (delete) { + zoneFromDB.removeSampleRow(row); + } else { + zoneFromDB.addSampleRow(row); + } + fishingZoneDAO.update(zoneFromDB); + } + +// @Override +// public List<SampleRowLog> getSampleRowLogs(SampleRow sampleRow) throws SuiviObsmerException { +// TopiaContext transaction = null; +// List<SampleRowLog> results = new ArrayList<SampleRowLog>(); +// try { +// transaction = rootContext.beginTransaction(); +// +// SampleRowLogDAO dao = SuiviObsmerModelDAOHelper.getSampleRowLogDAO(transaction); +// results = dao.createQuery().add(SampleRowLog.SAMPLE_ROW, sampleRow).addOrderDesc(TopiaEntity.TOPIA_CREATE_DATE).executeToEntityList(); +// +// transaction.closeContext(); +// } catch (Exception eee) { +// SuiviObsmerContext.serviceException(transaction, +// "Impossible de récupérer l'historique de la ligne d'échantillonnage", eee); +// } +// return results; +// } + @Override public List<SampleRow> getSampleRowsOrderedByFishingZone(PeriodDates period, Company company) throws SuiviObsmerException { TopiaContext transaction = null; Modified: trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.properties =================================================================== --- trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.properties 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.properties 2010-01-13 11:27:45 UTC (rev 190) @@ -10,6 +10,9 @@ #fr.ifremer.suiviobsmer.entity.SampleRow.attribute.pogram.tagvalue.lazy=false fr.ifremer.suiviobsmer.entity.SampleRow.attribute.elligibleBoat.tagvalue.lazy=false fr.ifremer.suiviobsmer.entity.SampleRow.attribute.elligibleBoat.tagvalue.orderBy=companyActive +fr.ifremer.suiviobsmer.entity.SampleRow.attribute.sampleRowLog.tagvalue.lazy=false +fr.ifremer.suiviobsmer.entity.SampleRow.attribute.sampleRowLog.tagvalue.orderBy=topiaCreateDate desc +fr.ifremer.suiviobsmer.entity.SampleRowLog.attribute.user.tagvalue.lazy=false fr.ifremer.suiviobsmer.entity.FishingZone.attribute.sampleRow.tagvalue.orderBy=code Modified: trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo =================================================================== (Binary files differ) Modified: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java =================================================================== --- trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java 2010-01-13 11:27:45 UTC (rev 190) @@ -35,7 +35,6 @@ 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; @@ -130,7 +129,7 @@ transaction.closeContext(); row.setCompany(company); - serviceSampling.createUpdateSampleRow(row, boats, null); + serviceSampling.createUpdateSampleRow(row, boats, new SampleRowLogImpl()); ServiceContact serviceContact = new ServiceContactImpl(); Contact contact1 = serviceContact.getNewContact(user, row, boat); Modified: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImplTest.java =================================================================== --- trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImplTest.java 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImplTest.java 2010-01-13 11:27:45 UTC (rev 190) @@ -42,6 +42,7 @@ import fr.ifremer.suiviobsmer.entity.ElligibleBoat; import fr.ifremer.suiviobsmer.entity.SampleRow; import fr.ifremer.suiviobsmer.entity.SampleRowDAO; +import fr.ifremer.suiviobsmer.entity.SampleRowLogImpl; import fr.ifremer.suiviobsmer.entity.User; import fr.ifremer.suiviobsmer.entity.UserImpl; import fr.ifremer.suiviobsmer.services.ServiceContact; @@ -51,7 +52,6 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; import java.util.List; import java.util.Map; import org.junit.After; @@ -235,10 +235,10 @@ // Set company and elligibleBoats '174592 177474' for row1 List<Boat> boats = service.getBoats("174592 177474"); row1.setCompany(company); - serviceSampling.createUpdateSampleRow(row1, boats, null); + serviceSampling.createUpdateSampleRow(row1, boats, new SampleRowLogImpl()); // Set company only for row2 row2.setCompany(company); - serviceSampling.createUpdateSampleRow(row2, new ArrayList<Boat>(), null); + serviceSampling.createUpdateSampleRow(row2, new ArrayList<Boat>(), new SampleRowLogImpl()); return Arrays.asList(new SampleRow[] { row1, row2}); } Modified: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImplTest.java =================================================================== --- trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImplTest.java 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImplTest.java 2010-01-13 11:27:45 UTC (rev 190) @@ -41,6 +41,7 @@ import fr.ifremer.suiviobsmer.entity.SampleMonthImpl; import fr.ifremer.suiviobsmer.entity.SampleRow; import fr.ifremer.suiviobsmer.entity.SampleRowDAO; +import fr.ifremer.suiviobsmer.entity.SampleRowLogImpl; import fr.ifremer.suiviobsmer.entity.User; import fr.ifremer.suiviobsmer.entity.UserImpl; import fr.ifremer.suiviobsmer.services.ServiceBoat; @@ -160,7 +161,7 @@ /** EXEC CREATE **/ List<Boat> boats = serviceBoat.getBoats("174592 978419 273129"); - service.createUpdateSampleRow(row, boats, null); + service.createUpdateSampleRow(row, boats, new SampleRowLogImpl()); assertNotNull(row.getTopiaId()); assertNotNull(row.getProfession().getTopiaId()); @@ -170,7 +171,7 @@ // TEST FOR DELETE ELLIGIBLE BOAT boats.remove(2); - service.createUpdateSampleRow(result, boats, null); + service.createUpdateSampleRow(result, boats, new SampleRowLogImpl()); result = service.getSampleRow(row.getTopiaId()); assertEquals(2, result.getElligibleBoat().size()); @@ -423,7 +424,7 @@ serviceBoat.importBoatCsv(input); List<Boat> boats = serviceBoat.getBoats("174592 978419 273129"); - service.createUpdateSampleRow(row, boats, null); + service.createUpdateSampleRow(row, boats, new SampleRowLogImpl()); /** EXEC METHOD **/ service.deleteSampleRow(row); Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowForm.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowForm.java 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowForm.java 2010-01-13 11:27:45 UTC (rev 190) @@ -30,6 +30,8 @@ import fr.ifremer.suiviobsmer.entity.ProfessionImpl; import fr.ifremer.suiviobsmer.entity.SampleMonth; import fr.ifremer.suiviobsmer.entity.SampleRow; +import fr.ifremer.suiviobsmer.entity.SampleRowLog; +import fr.ifremer.suiviobsmer.entity.SampleRowLogImpl; import fr.ifremer.suiviobsmer.entity.User; import fr.ifremer.suiviobsmer.services.ServiceBoat; import fr.ifremer.suiviobsmer.services.ServiceReferential; @@ -119,10 +121,23 @@ } void setupRender() throws SuiviObsmerException { + // Reset data sampleRow = null; getSampleRow(); sampleMonths = null; getSampleMonths(); + sampleRowLog = null; + getSampleRowLog(); + + // Reset persist select + professionSelectModel = null; + getProfessionSelectModel(); + programSelectModel = null; + getProgramSelectModel(); + fishingZoneSelectModel = null; + getFishingZoneSelectModel(); + companySelectModel = null; + getCompanySelectModel(); professionId = null; sampleRowForm.clearErrors(); @@ -438,9 +453,12 @@ @InjectComponent private Form sampleRowForm; - @Property - private String updateComment; + @InjectComponent + private Field updateComment; + @Persist + private SampleRowLog sampleRowLog; + @Property private String immatriculations; @@ -467,6 +485,15 @@ return sampleRow; } + public SampleRowLog getSampleRowLog() throws SuiviObsmerException { + if (sampleRowLog == null) { + sampleRowLog = new SampleRowLogImpl(); + sampleRowLog.setSampleRow(getSampleRow()); + sampleRowLog.setUser(user); + } + return sampleRowLog; + } + public BeanModel<SampleRow> getSampleRowModel() { if (sampleRowModel == null) { sampleRowModel = beanModelSource.createEditModel(SampleRow.class, resources.getMessages()); @@ -529,8 +556,7 @@ SampleMonth lastMonth = getSampleMonths().get(size-1); if (firstMonth != null) { - Date firstDate = DateUtils.createDate( - 1, firstMonth.getPeriodMonth(), firstMonth.getPeriodYear()); + Date firstDate = firstMonth.getPeriodDate(); if (periodBegin.after(firstDate) && firstMonth.getRealTidesValue() != 0) { sampleRowForm.recordError(programPeriodBegin, @@ -538,11 +564,25 @@ "Il existe des enregistrements de marées réels."); } } + + for (SampleMonth month : getSampleMonths()) { + if (month.getExpectedTidesValue() < month.getRealTidesValue()) { + sampleRowForm.recordError( + "Il n'est pas possible de mettre moins de marées (" + month.getExpectedTidesValue() + ") " + + "pour le mois " + getDateFormat().format(month.getPeriodDate()) + + " qu'il y en a de réels (" + month.getRealTidesValue() + ")"); + } + } } // Validate profession, fishingZone and boats (from immatriculations) if no programChanged if (!periodChanged) { + if (!isCreateMode() && StringUtils.isEmpty(sampleRowLog.getComment())) { + sampleRowForm.recordError(updateComment, + "Un commentaire est obligatoire lors d'une modification de la ligne"); + } + Profession profession = getSampleRow().getProfession(); if (StringUtils.isEmpty(profession.getCodeDCF5())) { sampleRowForm.recordError( @@ -596,7 +636,7 @@ getSampleRow().setSampleMonth(getSampleMonths()); - serviceSampling.createUpdateSampleRow(sampleRow, boats, updateComment); + serviceSampling.createUpdateSampleRow(sampleRow, boats, getSampleRowLog()); return SamplingPlan.class; } else { Added: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowHistoric.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowHistoric.java (rev 0) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowHistoric.java 2010-01-13 11:27:45 UTC (rev 190) @@ -0,0 +1,82 @@ + +package fr.ifremer.suiviobsmer.ui.pages; + +import fr.ifremer.suiviobsmer.SuiviObsmerException; +import fr.ifremer.suiviobsmer.entity.SampleRow; +import fr.ifremer.suiviobsmer.entity.SampleRowLog; +import fr.ifremer.suiviobsmer.services.ServiceSampling; +import fr.ifremer.suiviobsmer.ui.base.SuiviObsmerPage; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Locale; +import org.apache.tapestry5.annotations.IncludeStylesheet; +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.ioc.annotations.Inject; +import org.slf4j.Logger; + +/** + * SampleRowHistoric + * + * Created: 12 janv. 2010 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ + at IncludeStylesheet("context:css/sampling.css") +public class SampleRowHistoric implements SuiviObsmerPage { + + @Override + public boolean isOnlyForAdmin() { + return true; + } + + @Inject + private Logger log; + + @Inject + private ServiceSampling serviceSampling; + + private String sampleRowId; + + @Persist + private SampleRow sampleRow; + + @Property + private SampleRowLog sampleRowLog; + + void onActivate(String id) { + sampleRowId = id; + } + + String onPassivate() { + return sampleRowId; + } + + void setupRender() throws SuiviObsmerException { + sampleRow = null; + getSampleRow(); + } + + public SampleRow getSampleRow() throws SuiviObsmerException { + if (sampleRow == null) { + if (log.isInfoEnabled()) { + log.info("BUSINESS REQUEST [getSampleRow]"); + } + sampleRow = serviceSampling.getSampleRow(sampleRowId); + } + return sampleRow; + } + + public DateFormat getDateFormat() { + return new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.FRENCH); + } + + public String getContent() { + return sampleRowLog.getLogText().replaceAll("\\n", "<br />"); + } + +} Property changes on: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SampleRowHistoric.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SamplingPlan.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SamplingPlan.java 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/pages/SamplingPlan.java 2010-01-13 11:27:45 UTC (rev 190) @@ -313,7 +313,7 @@ } public String getActionsClass() { - return user.getAdmin() ? "width70" : "width30"; + return user.getAdmin() ? "width100" : "width30"; } public String getRealTidesClass() { Modified: trunk/suiviobsmer-ui/src/main/webapp/SampleRowForm.tml =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/SampleRowForm.tml 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/suiviobsmer-ui/src/main/webapp/SampleRowForm.tml 2010-01-13 11:27:45 UTC (rev 190) @@ -106,8 +106,14 @@ <tr class="firstRow"> <td t:type="loop" class="acenter" volatile="true" t:source="sampleMonths" t:value="sampleMonth" t:index="monthIndex"> <t:output value="sampleMonth.periodDate" format="dateFormat" /> - <input t:type="submitContext" class="ico16px suppr" t:id="deleteMonth" value="Delete" t:context="monthIndex" - title="Supprimer ce mois"/> + <t:unless t:test="sampleMonth.realTidesValue"> + <input t:type="submitContext" class="ico16px suppr" t:id="deleteMonth" value="Delete" t:context="monthIndex" + title="Supprimer ce mois"/> + <p:else> + <img src="${asset:context:}/img/suppr-unavailable-16px.png" alt="Supprimer" + title="Suppression indisponible en raison de données réels existantes" /> + </p:else> + </t:unless> </td> <!-- <td t:type="loop" t:source="months" t:value="month" volatile="true"> <t:output value="month" format="dateFormat" /> @@ -155,10 +161,10 @@ </fieldset> <fieldset class="clearfix"> <t:errors t:banner="message:errors-banner"/> - <p><label>Enregistrement fait par : </label>${user.fullName}</p> + <p><label>Enregistrement fait par : </label>${sampleRowLog.user.fullName}</p> <t:unless t:test="createMode"> <p><label>Commentaire sur la modification* :</label></p> - <p><input t:type="textarea" t:id="updateComment" cols="50" rows="5" value="updateComment"/></p> + <p><input t:type="textarea" t:id="updateComment" cols="50" rows="5" value="sampleRowLog.comment"/></p> </t:unless> <div class="fright"> <input t:type="submit" t:id="saveData" class="ico save" value="Save" title="Enregistrer les modifications" /> Added: trunk/suiviobsmer-ui/src/main/webapp/SampleRowHistoric.tml =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/SampleRowHistoric.tml (rev 0) +++ trunk/suiviobsmer-ui/src/main/webapp/SampleRowHistoric.tml 2010-01-13 11:27:45 UTC (rev 190) @@ -0,0 +1,22 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<t:layout t:pageTitle="Historique d'une ligne du plan" t:contentId="so-samplerow-historic" + xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> + <h1>Historique de la ligne ${sampleRow.code}</h1> + <p class="aright">créée le <t:output t:format="dateFormat" t:value="sampleRow.topiaCreateDate"/></p> + <hr /> + <div class="so-samplerow-log" t:type="loop" t:source="sampleRow.sampleRowLog" t:value="sampleRowLog"> + <p class="head"> + Modification du + <strong><t:output t:format="dateFormat" t:value="sampleRowLog.topiaCreateDate"/></strong> + par <strong>${sampleRowLog.user.fullName}</strong> + </p> + <p class="content"><t:outputraw value="content"/></p> + <p>Commentaire : </p> + <p class="comment"> + ${sampleRowLog.comment} + </p> + <hr /> + </div> + + +</t:layout> Modified: trunk/suiviobsmer-ui/src/main/webapp/SamplingPlan.tml =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/SamplingPlan.tml 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/suiviobsmer-ui/src/main/webapp/SamplingPlan.tml 2010-01-13 11:27:45 UTC (rev 190) @@ -150,6 +150,9 @@ <a t:type="pagelink" t:page="sampleRowForm" t:context="row.topiaId"> <img src="${asset:context:}/img/edit.png" alt="Modifier" title="Modifier la ligne"/> </a> + <a t:type="pagelink" t:page="sampleRowHistoric" t:context="row.topiaId"> + <img src="${asset:context:}/img/clock-22px.png" alt="Historique" title="Voir historique de la ligne"/> + </a> <t:unless t:test="row.hasSampleMonthRealTideTime()"> <a t:type="actionlink" t:id="deleteSampleRow" t:context="rowIndex" title="Supprimer la ligne d'échantillon" t:mixins="confirm" t:message="Etes-vous sûr de vouloir supprimer définitivement la ligne ${row.code} du plan d\'échantillonnage ?"> Modified: trunk/suiviobsmer-ui/src/main/webapp/css/sampling.css =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/css/sampling.css 2010-01-12 20:18:57 UTC (rev 189) +++ trunk/suiviobsmer-ui/src/main/webapp/css/sampling.css 2010-01-13 11:27:45 UTC (rev 190) @@ -225,3 +225,37 @@ font-size: 0.8em; color: red; } + +/* SAMPLEROW HISTORIC */ +div#so-samplerow-historic { + width: 80%; + margin-left: auto; + margin-right: auto; + margin-top: 20px; +} + +div#so-samplerow-historic h1 { + text-align: center; +} + +div#so-samplerow-historic div.so-samplerow-log p.head { + color: #007CC2; +} + +div#so-samplerow-historic div.so-samplerow-log p.content { + padding-left: 15px; + padding-bottom: 20px; +} + +div#so-samplerow-historic div.so-samplerow-log p.comment { + text-indent: 10px; + text-align: justify; +} + +div#so-samplerow-historic hr { + width: 50%; + margin-left: auto; + margin-right: auto; + margin-top: 20px; + margin-bottom: 20px; +} \ No newline at end of file Added: trunk/suiviobsmer-ui/src/main/webapp/img/clock-22px.png =================================================================== (Binary files differ) Property changes on: trunk/suiviobsmer-ui/src/main/webapp/img/clock-22px.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/suiviobsmer-ui/src/main/webapp/img/suppr-unavailable-16px.png =================================================================== (Binary files differ) Property changes on: trunk/suiviobsmer-ui/src/main/webapp/img/suppr-unavailable-16px.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream