This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository wao. See http://git.codelutin.com/wao.git commit 1342d6fa60c2fcfa621d1d3d4aeb401494b70129 Author: Brendan Le Ny <bleny@codelutin.com> Date: Wed Jan 14 18:08:26 2015 +0100 Passage de la synthèse scléro en trimestres --- .../src/main/java/fr/ifremer/wao/WaoUtils.java | 62 +++++++++++++++++++++- .../fr/ifremer/wao/entity/ContactTopiaDao.java | 18 +++---- .../fr/ifremer/wao/entity/SampleRowTopiaDao.java | 14 +++-- .../wao/services/service/SynthesisService.java | 33 ++++++++---- 4 files changed, 102 insertions(+), 25 deletions(-) diff --git a/wao-persistence/src/main/java/fr/ifremer/wao/WaoUtils.java b/wao-persistence/src/main/java/fr/ifremer/wao/WaoUtils.java index 79211c0..0f6a1ce 100644 --- a/wao-persistence/src/main/java/fr/ifremer/wao/WaoUtils.java +++ b/wao-persistence/src/main/java/fr/ifremer/wao/WaoUtils.java @@ -21,6 +21,7 @@ package fr.ifremer.wao; * #L% */ +import com.google.common.base.Function; import com.google.common.base.Verify; import fr.ifremer.wao.entity.I18nAble; import org.apache.commons.collections4.CollectionUtils; @@ -70,6 +71,10 @@ public class WaoUtils { public static String formatMonth(Locale locale, Date date) { return I18n.l(locale, "wao.month.formatter", date); } + + public static String formatTrimester(Locale locale, Date date) { + return String.format("%s - %s", formatMonth(locale, date), formatMonth(locale, DateUtils.addMonths(date, 2))); + } public static String formatDateMonth(Locale locale, Date date) { return I18n.l(locale, "wao.datemonth.formatter", date); @@ -176,7 +181,7 @@ public class WaoUtils { Map<Date, MutableInt> tempResult = new HashMap<>(); Date aDay = DateUtils.truncate(observationBeginDate, Calendar.DAY_OF_MONTH); do { - Date month = DateUtils.truncate(aDay, Calendar.MONTH); + Date month = truncateToMonth(aDay); MutableInt count = tempResult.get(month); if (count == null) { count = new MutableInt(); @@ -214,4 +219,59 @@ public class WaoUtils { } return sum; } + + public static Date truncateToTrimester(Date date) { + Date month = truncateToMonth(date); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(month); + int m = calendar.get(Calendar.MONTH); + int trimester = m / 3; + m = trimester * 3; + calendar.set(Calendar.MONTH, m); + return calendar.getTime(); + } + + public static Date truncateToMonth(Date date) { + return DateUtils.truncate(date, Calendar.MONTH); + } + + public static Function<Date, Date> truncateToTrimesterFunction() { + return new Function<Date, Date>() { + + @Override + public Date apply(Date date) { + return truncateToTrimester(date); + } + }; + } + + public static Function<Date, Date> truncateToMonthFunction() { + return new Function<Date, Date>() { + + @Override + public Date apply(Date date) { + return truncateToMonth(date); + } + }; + } + + public static Function<Date, String> formatTrimesterFunction(final Locale locale) { + return new Function<Date, String>() { + + @Override + public String apply(Date date) { + return formatTrimester(locale, date); + } + }; + } + + public static Function<Date, String> formatMonthFunction(final Locale locale) { + return new Function<Date, String>() { + + @Override + public String apply(Date date) { + return formatMonth(locale, date); + } + }; + } } 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 75b6e22..efc04b7 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 @@ -21,6 +21,7 @@ package fr.ifremer.wao.entity; * #L% */ +import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Multimap; @@ -29,7 +30,6 @@ import com.google.common.collect.Sets; import fr.ifremer.wao.ContactsFilter; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.Range; -import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -39,7 +39,6 @@ import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; import org.nuiton.topia.persistence.TopiaQueryBuilderRunQueryStep; import java.util.Arrays; -import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.HashMap; @@ -208,19 +207,19 @@ public class ContactTopiaDao extends AbstractContactTopiaDao<Contact> { return query.findFirstOrNull(); } - public SortedMap<Date, Integer> getActualObservationsByMonths(Date periodFromMonth, Date periodToMonth, ContactsFilter filter) { + public SortedMap<Date, Integer> getActualObservationsByMonths(Date periodFromMonth, Date periodToMonth, ContactsFilter filter, Function<Date, Date> truncateToTimePeriodFunction) { HqlAndParametersBuilder<Contact> query = toContactHqlAndParametersBuilder(filter); query.addEquals(Contact.PROPERTY_CONTACT_STATE, ContactState.OBSERVATION_DONE); List<Contact> contacts = findAll(query.getHql(), query.getHqlParameters()); - SortedMap<Date, Integer> actualObservationsByMonths = new TreeMap<>(); + SortedMap<Date, Integer> actualObservationsByPeriods = new TreeMap<>(); Range<Date> range = Range.between(periodFromMonth, periodToMonth); for (Contact contact : contacts) { - Date contactMonth = DateUtils.truncate(contact.getObservationBeginDate(), Calendar.MONTH); - if (range.contains(contactMonth)) { - Integer count = actualObservationsByMonths.get(contactMonth); + Date period = truncateToTimePeriodFunction.apply(contact.getObservationBeginDate()); + if (range.contains(period)) { + Integer count = actualObservationsByPeriods.get(period); if (count == null) { count = 0; } @@ -231,12 +230,11 @@ public class ContactTopiaDao extends AbstractContactTopiaDao<Contact> { // le réalisé est le nombre d'observation, on compte 1 observation pour 1 navire donc 1 pour chaque contact count += 1; } - actualObservationsByMonths.put(contactMonth, count); - + actualObservationsByPeriods.put(period, count); } } - return actualObservationsByMonths; + return actualObservationsByPeriods; } diff --git a/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowTopiaDao.java b/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowTopiaDao.java index 948d2b2..94889f8 100644 --- a/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowTopiaDao.java +++ b/wao-persistence/src/main/java/fr/ifremer/wao/entity/SampleRowTopiaDao.java @@ -21,6 +21,7 @@ package fr.ifremer.wao.entity; * #L% */ +import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; import fr.ifremer.wao.SampleRowsFilter; @@ -166,7 +167,7 @@ public class SampleRowTopiaDao extends AbstractSampleRowTopiaDao<SampleRow> { topiaHibernateSupport.getHibernateSession().evict(sampleRow); } - public SortedMap<Date, Integer> getExpectedObservationsByMonths(Date periodFromMonth, Date periodToMonth, SampleRowsFilter sampleRowFilter) { + public SortedMap<Date, Integer> getExpectedObservationsByMonths(Date periodFromMonth, Date periodToMonth, SampleRowsFilter sampleRowFilter, Function<Date, Date> truncateToTimePeriodFunction) { HqlAndParametersBuilder<SampleRow> sampleRowsQuery = toSampleRowHqlAndParametersBuilder(sampleRowFilter); @@ -200,9 +201,14 @@ public class SampleRowTopiaDao extends AbstractSampleRowTopiaDao<SampleRow> { SortedMap<Date, Integer> expectedObservationsByMonths = new TreeMap<>(); for (Object[] line : result) { - Date month = (Date)line[0]; - int expectedValue = ((Long) line[1]).intValue(); - expectedObservationsByMonths.put(month, expectedValue); + Date month = (Date) line[0]; + Date period = truncateToTimePeriodFunction.apply(month); + Integer expectedValue = expectedObservationsByMonths.get(period); + if (expectedValue == null) { + expectedValue = 0; + } + expectedValue += ((Long) line[1]).intValue(); + expectedObservationsByMonths.put(period, expectedValue); } return expectedObservationsByMonths; diff --git a/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java b/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java index 3256c1a..e22b9f5 100644 --- a/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java +++ b/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java @@ -21,6 +21,7 @@ package fr.ifremer.wao.services.service; * #L% */ +import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.cache.Cache; import com.google.common.collect.Multimap; @@ -34,7 +35,6 @@ import fr.ifremer.wao.entity.ObsProgram; import fr.ifremer.wao.entity.SampleRowTopiaDao; import fr.ifremer.wao.entity.SynthesisId; import fr.ifremer.wao.services.AuthenticatedWaoUser; -import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -52,7 +52,6 @@ import org.jfree.ui.RectangleInsets; import org.nuiton.i18n.I18n; import org.nuiton.util.DateUtil; -import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.LinkedHashMap; @@ -216,26 +215,40 @@ public class SynthesisService extends WaoServiceSupport { Locale locale = serviceContext.getLocale(); + ObsProgram obsProgram = filter.getSampleRowFilter().getObsProgram(); + + Function<Date, Date> truncateToTimePeriodFunction; + Function<Date, String> formatPeriodFunction; + if (obsProgram.isObsMer() || obsProgram.isObsVente()) { + truncateToTimePeriodFunction = WaoUtils.truncateToMonthFunction(); + formatPeriodFunction = WaoUtils.formatMonthFunction(locale); + } else if (obsProgram.isSclerochronology()) { + truncateToTimePeriodFunction = WaoUtils.truncateToTrimesterFunction(); + formatPeriodFunction = WaoUtils.formatTrimesterFunction(locale); + } else { + throw new UnsupportedOperationException("unsupported " + obsProgram); + } + // définition de la fenêtre - Date periodFromMonth = DateUtils.truncate(filter.getPeriodFrom(), Calendar.MONTH); - Date periodToMonth = DateUtils.truncate(filter.getPeriodTo(), Calendar.MONTH); + Date periodFromMonth = truncateToTimePeriodFunction.apply(filter.getPeriodFrom()); + Date periodToMonth = truncateToTimePeriodFunction.apply(filter.getPeriodTo()); // Calcul du programmé SampleRowTopiaDao dao = getSampleRowDao(); SortedMap<Date, Integer> expectedObservationsByMonths = - dao.getExpectedObservationsByMonths(periodFromMonth, periodToMonth, filter.getSampleRowFilter()); + dao.getExpectedObservationsByMonths(periodFromMonth, periodToMonth, filter.getSampleRowFilter(), truncateToTimePeriodFunction); // Calcul du réalisé ContactTopiaDao contactDao = getContactDao(); SortedMap<Date, Integer> actualObservationsMyMonths = - contactDao.getActualObservationsByMonths(periodFromMonth, periodToMonth, filter); + contactDao.getActualObservationsByMonths(periodFromMonth, periodToMonth, filter, truncateToTimePeriodFunction); DefaultCategoryDataset dataset = new DefaultCategoryDataset(); for (Map.Entry<Date, Integer> entry : expectedObservationsByMonths.entrySet()) { - Date month = entry.getKey(); + Date period = entry.getKey(); Integer expected = entry.getValue(); - dataset.setValue(expected, I18n.l(locale, "wao.synthesis.planned"), WaoUtils.formatMonth(locale, month)); + dataset.setValue(expected, I18n.l(locale, "wao.synthesis.planned"), formatPeriodFunction.apply(period)); } String rowKey; if (filter.getRealVsEstimated()) { @@ -244,9 +257,9 @@ public class SynthesisService extends WaoServiceSupport { rowKey = I18n.l(locale, "wao.synthesis.estimated"); } for (Map.Entry<Date, Integer> entry : actualObservationsMyMonths.entrySet()) { - Date month = entry.getKey(); + Date period = entry.getKey(); Integer actual = entry.getValue(); - dataset.setValue(actual, rowKey, WaoUtils.formatMonth(locale, month)); + dataset.setValue(actual, rowKey, formatPeriodFunction.apply(period)); } // Axises -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.