From 3c9f5690992bb9d965d6c577121dc900e5368d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Fri, 29 Oct 2010 13:06:20 +0200 Subject: [PATCH] The start and end date are always set when reseting all allocations By default, if they are not specified, the start and end are taken from the task. This allows to calculate resources per day correctly when doing backwards scheduling. The external behavior is the same for resource allocations' start date. For the end date now instead of returning the date of the last day assignment, the date set at the reset method would be returned. FEA: ItEr62OTS04PlanificacionHaciaAtras --- .../planner/entities/ResourceAllocation.java | 28 ++++++++++--------- .../SpecificResourceAllocationTest.java | 12 ++++++++ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java index e66bf2949..f0f2e4d0b 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/ResourceAllocation.java @@ -258,7 +258,9 @@ public abstract class ResourceAllocation extends protected void setNewDataForAllocation( ResourceAllocation allocation, IntraDayDate end, ResourcesPerDay resourcesPerDay, List dayAssignments) { - allocation.resetAssignmentsTo(dayAssignments, end); + Task task = AllocationsSpecified.this.task; + allocation.resetAssignmentsTo(dayAssignments, + task.getIntraDayStartDate(), end); allocation.updateResourcesPerDay(); } @@ -538,10 +540,12 @@ public abstract class ResourceAllocation extends @Override public void allocate(ResourcesPerDay resourcesPerDay) { IntraDayDate startInclusive = getStartAfterConsolidated(); + IntraDayDate allocationEnd = IntraDayDate + .startOfDay(endExclusive); List assignmentsCreated = createAssignments( - resourcesPerDay, startInclusive, - IntraDayDate.startOfDay(endExclusive)); - resetAssignmentsTo(assignmentsCreated); + resourcesPerDay, startInclusive, allocationEnd); + resetAssignmentsTo(assignmentsCreated, startInclusive, + allocationEnd); updateResourcesPerDay(); } @@ -587,7 +591,8 @@ public abstract class ResourceAllocation extends @Override public void allocateHours(int hours) { - allocate(end, hours(hours)); + allocate(getStartAfterConsolidated(), + IntraDayDate.startOfDay(end), hours(hours)); } }; } @@ -604,17 +609,11 @@ public abstract class ResourceAllocation extends }; } - private void allocate(LocalDate end, EffortDuration durationToAssign) { - IntraDayDate startInclusive = getStartAfterConsolidated(); - IntraDayDate endExclusive = IntraDayDate.startOfDay(end); - allocate(startInclusive, endExclusive, durationToAssign); - } - private void allocate(IntraDayDate startInclusive, IntraDayDate endExclusive, EffortDuration durationToAssign) { List assignmentsCreated = createAssignments(startInclusive, endExclusive, durationToAssign); - resetAssignmentsTo(assignmentsCreated); + resetAssignmentsTo(assignmentsCreated, startInclusive, endExclusive); updateResourcesPerDay(); } @@ -743,14 +742,17 @@ public abstract class ResourceAllocation extends protected abstract void copyAssignments(Scenario from, Scenario to); protected void resetAssignmentsTo(List assignments) { - resetAssignmentsTo(assignments, null); + resetAssignmentsTo(assignments, task.getIntraDayStartDate(), + task.getIntraDayEndDate()); } protected void resetAssignmentsTo(List assignments, + IntraDayDate intraDayStart, IntraDayDate intraDayEnd) { removingAssignments(withoutConsolidated(getAssignments())); addingAssignments(assignments); updateOriginalTotalAssigment(); + getDayAssignmentsState().setIntraDayStart(intraDayStart); getDayAssignmentsState().setIntraDayEnd(intraDayEnd); } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/SpecificResourceAllocationTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/SpecificResourceAllocationTest.java index f83d052ad..bb3cbd5c0 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/SpecificResourceAllocationTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/SpecificResourceAllocationTest.java @@ -316,6 +316,18 @@ public class SpecificResourceAllocationTest { equalTo(ResourcesPerDay.amount(1))); } + @Test + public void ifEndIsInTheMiddleOfADayFromEndUntilStartCalculatesResourcesPerDayCorrectly() { + LocalDate start = new LocalDate(2000, 2, 4); + IntraDayDate end = IntraDayDate.create(start.plusDays(3), hours(4)); + givenSpecificResourceAllocation(IntraDayDate.startOfDay(start), end); + specificResourceAllocation.fromEndUntil(start).allocateHours(28); + assertThat(specificResourceAllocation.getAssignments(), + haveHours(8, 8, 8, 4)); + assertThat(specificResourceAllocation.getResourcesPerDay(), + equalTo(ResourcesPerDay.amount(1))); + } + @Test public void canBeNotifiedWhenADayAssignmentIsRemoved() { LocalDate start = new LocalDate(2000, 2, 4);