From 5c2be621fe4082d181aff2a35a804084abfefba6 Mon Sep 17 00:00:00 2001 From: Nacho Barrientos Date: Wed, 2 Nov 2011 17:18:31 +0100 Subject: [PATCH] Use EffortDuration to compute time instead of using raw hours. FEA: ItEr75S27PerProjectDashboard --- .../entities/AggregateOfDayAssignments.java | 9 ++++----- .../business/planner/entities/PlanningData.java | 12 +++++++----- .../business/planner/entities/Task.java | 4 ++-- .../business/planner/entities/TaskElement.java | 15 +++++++-------- .../business/planner/entities/TaskGroup.java | 8 +++++--- .../planner/entities/TaskMilestone.java | 5 +++-- .../test/planner/entities/TaskTest.java | 17 ++++++++++++----- 7 files changed, 40 insertions(+), 30 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/AggregateOfDayAssignments.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/AggregateOfDayAssignments.java index 502b9e410..250000fec 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/AggregateOfDayAssignments.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/AggregateOfDayAssignments.java @@ -22,8 +22,6 @@ package org.libreplan.business.planner.entities; import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; import java.util.Date; import java.util.HashSet; import java.util.List; @@ -33,6 +31,7 @@ import org.apache.commons.lang.Validate; import org.joda.time.LocalDate; import org.libreplan.business.planner.entities.DayAssignment; +import org.libreplan.business.workingday.EffortDuration; /** * Computes aggregate values on a set{@link DayAssignment}. @@ -67,10 +66,10 @@ public class AggregateOfDayAssignments { assignments); } - public int getTotalHours() { - int sum = 0; + public EffortDuration getTotalTime() { + EffortDuration sum = EffortDuration.zero(); for (DayAssignment dayAssignment : dayAssignments) { - sum += dayAssignment.getDuration().getHours(); + sum = EffortDuration.sum(sum, dayAssignment.getDuration()); } return sum; } diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/PlanningData.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/PlanningData.java index e65421bb7..6124d1846 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/PlanningData.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/PlanningData.java @@ -29,6 +29,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.joda.time.LocalDate; import org.libreplan.business.common.BaseEntity; +import org.libreplan.business.workingday.EffortDuration; /** * @@ -159,14 +160,15 @@ public class PlanningData extends BaseEntity { private BigDecimal calculateTheoreticalAdvanceByNumHoursForCriticalPath( List criticalPath, Date limit) { - int theoreticalNumHours = 0, totalNumHours = 0; + EffortDuration theoreticalCompletedTime = EffortDuration.zero(); + EffortDuration totalAssignedTime = EffortDuration.zero(); for (Task each: criticalPath) { - theoreticalNumHours += each.getTheoreticalCompletedHoursUntilDate(limit); - totalNumHours += AggregateOfDayAssignments.create( - each.getDayAssignments()).getTotalHours(); + EffortDuration.sum(theoreticalCompletedTime, each.getTheoreticalCompletedTimeUntilDate(limit)); + EffortDuration.sum(totalAssignedTime, AggregateOfDayAssignments.create( + each.getDayAssignments()).getTotalTime()); } - return divide(new BigDecimal(theoreticalNumHours), totalNumHours); + return theoreticalCompletedTime.dividedByAndResultAsBigDecimal(totalAssignedTime); } private BigDecimal calculateTheoreticalAdvanceByDurationForCriticalPath( diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java index 027c6c7fc..012c59678 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java @@ -1087,10 +1087,10 @@ public class Task extends TaskElement implements ITaskPositionConstrained { } @Override - public Integer getTheoreticalCompletedHoursUntilDate(Date date) { + public EffortDuration getTheoreticalCompletedTimeUntilDate(Date date) { return AggregateOfDayAssignments.createByDataRange( this.getDayAssignments(), this.getStartDate(), - date).getTotalHours(); + date).getTotalTime(); } } diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java index 793de21ab..b1bef568b 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java @@ -701,17 +701,16 @@ public abstract class TaskElement extends BaseEntity { return result; } - public abstract Integer getTheoreticalCompletedHoursUntilDate(Date date); + public abstract EffortDuration getTheoreticalCompletedTimeUntilDate(Date date); public BigDecimal getTheoreticalAdvancePercentageUntilDate(Date date) { - int totalAllocatedHours = AggregateOfDayAssignments.create( - this.getDayAssignments()).getTotalHours(); - int totalTheoreticalCompletedHours = this.getTheoreticalCompletedHoursUntilDate(date); - if(Math.min(totalAllocatedHours, totalTheoreticalCompletedHours) == 0) { + EffortDuration totalAllocatedTime = AggregateOfDayAssignments.create( + this.getDayAssignments()).getTotalTime(); + EffortDuration totalTheoreticalCompletedTime = this.getTheoreticalCompletedTimeUntilDate(date); + if(totalAllocatedTime.isZero() || totalTheoreticalCompletedTime.isZero()) { return BigDecimal.ZERO; } - Validate.isTrue(totalTheoreticalCompletedHours <= totalAllocatedHours); - return new BigDecimal(totalTheoreticalCompletedHours).divide( - new BigDecimal(totalAllocatedHours), 8, BigDecimal.ROUND_HALF_EVEN); + Validate.isTrue(totalTheoreticalCompletedTime.getSeconds() <= totalAllocatedTime.getSeconds()); + return totalTheoreticalCompletedTime.dividedByAndResultAsBigDecimal(totalAllocatedTime); } } diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java index 16cd02843..27852a828 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java @@ -37,6 +37,7 @@ import org.libreplan.business.common.entities.ProgressType; import org.libreplan.business.orders.entities.TaskSource; import org.libreplan.business.resources.daos.IResourcesSearcher; import org.libreplan.business.scenarios.entities.Scenario; +import org.libreplan.business.workingday.EffortDuration; import org.libreplan.business.workingday.IntraDayDate; /** @@ -306,10 +307,11 @@ public class TaskGroup extends TaskElement { } @Override - public Integer getTheoreticalCompletedHoursUntilDate(Date date) { - int sum = 0; + public EffortDuration getTheoreticalCompletedTimeUntilDate(Date date) { + EffortDuration sum = EffortDuration.zero(); for(TaskElement each: taskElements) { - sum += each.getTheoreticalCompletedHoursUntilDate(date); + sum = EffortDuration.sum(sum, each.getTheoreticalCompletedTimeUntilDate(date)); + } return sum; } diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskMilestone.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskMilestone.java index 1e3a4eebd..cb691ad51 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskMilestone.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskMilestone.java @@ -32,6 +32,7 @@ import org.joda.time.DateTime; import org.joda.time.Days; import org.libreplan.business.resources.daos.IResourcesSearcher; import org.libreplan.business.scenarios.entities.Scenario; +import org.libreplan.business.workingday.EffortDuration; import org.libreplan.business.workingday.IntraDayDate; /** @@ -182,9 +183,9 @@ public class TaskMilestone extends TaskElement implements ITaskPositionConstrain } @Override - public Integer getTheoreticalCompletedHoursUntilDate(Date date) { + public EffortDuration getTheoreticalCompletedTimeUntilDate(Date date) { // TODO Auto-generated method stub FIXME - return null; + return EffortDuration.zero(); } } \ No newline at end of file diff --git a/libreplan-business/src/test/java/org/libreplan/business/test/planner/entities/TaskTest.java b/libreplan-business/src/test/java/org/libreplan/business/test/planner/entities/TaskTest.java index 209408174..59cb63ab1 100644 --- a/libreplan-business/src/test/java/org/libreplan/business/test/planner/entities/TaskTest.java +++ b/libreplan-business/src/test/java/org/libreplan/business/test/planner/entities/TaskTest.java @@ -58,6 +58,7 @@ import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderLine; import org.libreplan.business.orders.entities.SchedulingDataForVersion; import org.libreplan.business.orders.entities.TaskSource; +import org.libreplan.business.planner.entities.AggregateOfDayAssignments; import org.libreplan.business.planner.entities.SpecificResourceAllocation; import org.libreplan.business.planner.entities.Task; import org.libreplan.business.planner.entities.TaskElement; @@ -309,20 +310,22 @@ public class TaskTest { @Test public void theoreticalHoursIsZeroIfNoResourcesAreAllocated() { - assertThat(task.getTheoreticalCompletedHoursUntilDate(new Date()), equalTo(0)); + assertThat(task.getTheoreticalCompletedTimeUntilDate(new Date()), equalTo(EffortDuration.zero())); } @Test public void theoreticalHoursIsTotalIfDateIsLaterThanEndDate() { prepareTaskForTheoreticalAdvanceTesting(); - assertThat(task.getTheoreticalCompletedHoursUntilDate(task.getEndDate()), equalTo(task.getTotalHours())); + EffortDuration totalAllocatedTime = AggregateOfDayAssignments.create( + task.getDayAssignments()).getTotalTime(); + assertThat(task.getTheoreticalCompletedTimeUntilDate(task.getEndDate()), equalTo(totalAllocatedTime)); } @Test public void theoreticalHoursIsZeroIfDateIsEarlierThanStartDate() { prepareTaskForTheoreticalAdvanceTesting(); - assertThat(task.getTheoreticalCompletedHoursUntilDate(task.getStartDate()), equalTo(0)); + assertThat(task.getTheoreticalCompletedTimeUntilDate(task.getStartDate()), equalTo(EffortDuration.zero())); } @@ -330,14 +333,18 @@ public class TaskTest { public void theoreticalHoursWithADateWithinStartAndEndDateHead() { prepareTaskForTheoreticalAdvanceTesting(); LocalDate limit = task.getStartAsLocalDate().plusDays(1); - assertThat(task.getTheoreticalCompletedHoursUntilDate(limit.toDateTimeAtStartOfDay().toDate()), equalTo(8)); + EffortDuration expected = EffortDuration.hours(8); + assertThat(task.getTheoreticalCompletedTimeUntilDate(limit.toDateTimeAtStartOfDay().toDate()), + equalTo(expected)); } @Test public void theoreticalHoursWithADateWithinStartAndEndDateTail() { prepareTaskForTheoreticalAdvanceTesting(); LocalDate limit = task.getEndAsLocalDate().minusDays(1); - assertThat(task.getTheoreticalCompletedHoursUntilDate(limit.toDateTimeAtStartOfDay().toDate()), equalTo(32)); + EffortDuration expected = EffortDuration.hours(32); + assertThat(task.getTheoreticalCompletedTimeUntilDate(limit.toDateTimeAtStartOfDay().toDate()), + equalTo(expected)); } @Test