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);