diff --git a/libreplan-business/src/main/java/org/libreplan/business/orders/daos/SumChargedEffortDAO.java b/libreplan-business/src/main/java/org/libreplan/business/orders/daos/SumChargedEffortDAO.java index babaab2cb..aad876f66 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/orders/daos/SumChargedEffortDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/orders/daos/SumChargedEffortDAO.java @@ -19,7 +19,11 @@ package org.libreplan.business.orders.daos; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -149,9 +153,6 @@ public class SumChargedEffortDAO extends private void addDirectChargedEffort(OrderElement orderElement, EffortDuration effort) { SumChargedEffort sumChargedEffort = getByOrderElement(orderElement); - if (sumChargedEffort == null) { - sumChargedEffort = SumChargedEffort.create(orderElement); - } sumChargedEffort.addDirectChargedEffort(effort); save(sumChargedEffort); @@ -163,9 +164,6 @@ public class SumChargedEffortDAO extends EffortDuration effort) { if (orderElement != null) { SumChargedEffort sumChargedEffort = getByOrderElement(orderElement); - if (sumChargedEffort == null) { - sumChargedEffort = SumChargedEffort.create(orderElement); - } sumChargedEffort.addIndirectChargedEffort(effort); save(sumChargedEffort); @@ -231,6 +229,9 @@ public class SumChargedEffortDAO extends .get(orderElement); if (sumChargedEffort == null) { sumChargedEffort = findByOrderElement(orderElement); + if (sumChargedEffort == null) { + sumChargedEffort = SumChargedEffort.create(orderElement); + } mapSumChargedEfforts.put(orderElement, sumChargedEffort); } return sumChargedEffort; @@ -251,6 +252,7 @@ public class SumChargedEffortDAO extends resetMapSumChargedEfforts(); resetSumChargedEffort(order); calculateDirectChargedEffort(order); + calculateFirstAndLastTimesheetDates(order); } catch (InstanceNotFoundException e) { throw new RuntimeException(e); } @@ -258,9 +260,6 @@ public class SumChargedEffortDAO extends private void resetSumChargedEffort(OrderElement orderElement) { SumChargedEffort sumChargedEffort = getByOrderElement(orderElement); - if (sumChargedEffort == null) { - sumChargedEffort = SumChargedEffort.create(orderElement); - } sumChargedEffort.reset(); for (OrderElement each : orderElement.getChildren()) { @@ -281,4 +280,36 @@ public class SumChargedEffortDAO extends addDirectChargedEffort(orderElement, effort); } + private Pair calculateFirstAndLastTimesheetDates( + OrderElement orderElement) { + Pair minMax = workReportLineDAO + .findMinAndMaxDatesByOrderElement(orderElement); + + Set minDates = new HashSet(); + Set maxDates = new HashSet(); + + addIfNotNull(minDates, minMax.getFirst()); + addIfNotNull(maxDates, minMax.getSecond()); + + for (OrderElement child : orderElement.getChildren()) { + Pair minMaxChild = calculateFirstAndLastTimesheetDates(child); + addIfNotNull(minDates, minMaxChild.getFirst()); + addIfNotNull(maxDates, minMaxChild.getSecond()); + } + + SumChargedEffort sumChargedEffort = getByOrderElement(orderElement); + sumChargedEffort.setTimesheetDates(minMax.getFirst(), + minMax.getSecond()); + + return Pair.create( + minDates.isEmpty() ? null : Collections.min(minDates), + maxDates.isEmpty() ? null : Collections.max(maxDates)); + } + + private void addIfNotNull(Collection list, Date date) { + if (date != null) { + list.add(date); + } + } + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/SumChargedEffort.java b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/SumChargedEffort.java index fdd513247..b49ccb296 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/SumChargedEffort.java +++ b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/SumChargedEffort.java @@ -119,4 +119,10 @@ public class SumChargedEffort extends BaseEntity { this.lastTimesheetDate = lastTimesheetDate; } + public void setTimesheetDates(Date firstTimesheetDate, + Date lastTimesheetDate) { + setFirstTimesheetDate(firstTimesheetDate); + setLastTimesheetDate(lastTimesheetDate); + } + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/IWorkReportLineDAO.java b/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/IWorkReportLineDAO.java index 61b410c95..5af312036 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/IWorkReportLineDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/IWorkReportLineDAO.java @@ -28,6 +28,7 @@ import org.libreplan.business.common.daos.IIntegrationEntityDAO; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.reports.dtos.WorkReportLineDTO; import org.libreplan.business.resources.entities.Resource; +import org.libreplan.business.util.Pair; import org.libreplan.business.workreports.entities.WorkReport; import org.libreplan.business.workreports.entities.WorkReportLine; @@ -65,4 +66,7 @@ public interface IWorkReportLineDAO extends List findByResourceFilteredByDateNotInWorkReport( Resource resource, Date start, Date end, WorkReport workReport); + Pair findMinAndMaxDatesByOrderElement( + OrderElement orderElement); + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/WorkReportLineDAO.java b/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/WorkReportLineDAO.java index 4a40878d5..27036e0fc 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/WorkReportLineDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/WorkReportLineDAO.java @@ -34,6 +34,7 @@ import org.libreplan.business.common.daos.IntegrationEntityDAO; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.reports.dtos.WorkReportLineDTO; import org.libreplan.business.resources.entities.Resource; +import org.libreplan.business.util.Pair; import org.libreplan.business.workreports.entities.WorkReport; import org.libreplan.business.workreports.entities.WorkReportLine; import org.springframework.beans.factory.config.BeanDefinition; @@ -146,4 +147,25 @@ public class WorkReportLineDAO extends IntegrationEntityDAO return criteria.list(); } + @Override + public Pair findMinAndMaxDatesByOrderElement( + OrderElement orderElement) { + + String strQuery = "SELECT MIN(date) AS min, MAX(date) AS max " + + "FROM WorkReportLine " + "WHERE orderElement = :orderElement"; + + Query query = getSession().createQuery(strQuery); + query.setParameter("orderElement", orderElement); + + Object[] result = (Object[]) query.uniqueResult(); + + Date min = null; + Date max = null; + if (result != null) { + min = (Date) result[0]; + max = (Date) result[1]; + } + return Pair.create(min, max); + } + }