Calculate first/last timesheet dates when recalculating a SumChargedEffortDAO

FEA: ItEr77S12AdaptPlanningAccordingTimesheets
This commit is contained in:
Manuel Rego Casasnovas 2012-10-30 11:16:30 +01:00
parent ba2ce0371d
commit 460896ee8b
4 changed files with 72 additions and 9 deletions

View file

@ -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<Date, Date> calculateFirstAndLastTimesheetDates(
OrderElement orderElement) {
Pair<Date, Date> minMax = workReportLineDAO
.findMinAndMaxDatesByOrderElement(orderElement);
Set<Date> minDates = new HashSet<Date>();
Set<Date> maxDates = new HashSet<Date>();
addIfNotNull(minDates, minMax.getFirst());
addIfNotNull(maxDates, minMax.getSecond());
for (OrderElement child : orderElement.getChildren()) {
Pair<Date, Date> 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<Date> list, Date date) {
if (date != null) {
list.add(date);
}
}
}

View file

@ -119,4 +119,10 @@ public class SumChargedEffort extends BaseEntity {
this.lastTimesheetDate = lastTimesheetDate;
}
public void setTimesheetDates(Date firstTimesheetDate,
Date lastTimesheetDate) {
setFirstTimesheetDate(firstTimesheetDate);
setLastTimesheetDate(lastTimesheetDate);
}
}

View file

@ -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<WorkReportLine> findByResourceFilteredByDateNotInWorkReport(
Resource resource, Date start, Date end, WorkReport workReport);
Pair<Date, Date> findMinAndMaxDatesByOrderElement(
OrderElement orderElement);
}

View file

@ -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<WorkReportLine>
return criteria.list();
}
@Override
public Pair<Date, Date> 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);
}
}