diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/IAllocatable.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/IAllocatable.java index 82001913a..f89d1c241 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/IAllocatable.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/IAllocatable.java @@ -34,4 +34,6 @@ public interface IAllocatable extends IAllocateResourcesPerDay { public IAllocateHoursOnInterval fromStartUntil(LocalDate endExclusive); + public IAllocateHoursOnInterval fromEndUntil(LocalDate start); + } \ No newline at end of file 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 cb8ec1d22..e66bf2949 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 @@ -592,10 +592,28 @@ public abstract class ResourceAllocation extends }; } + @Override + public IAllocateHoursOnInterval fromEndUntil(final LocalDate start) { + return new IAllocateHoursOnInterval() { + + @Override + public void allocateHours(int hours) { + allocate(IntraDayDate.startOfDay(start), + task.getIntraDayEndDate(), hours(hours)); + } + }; + } + 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, - IntraDayDate.startOfDay(end), durationToAssign); + endExclusive, durationToAssign); resetAssignmentsTo(assignmentsCreated); updateResourcesPerDay(); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java index d9f387aca..08b539f34 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java @@ -170,6 +170,11 @@ public class SpecificResourceAllocation extends return new SpecificAssignmentsAllocation().fromStartUntil(endExclusive); } + @Override + public IAllocateHoursOnInterval fromEndUntil(LocalDate start) { + return new SpecificAssignmentsAllocation().fromEndUntil(start); + } + private final class SpecificAssignmentsAllocation extends AssignmentsAllocation { 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 16acea33a..f83d052ad 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 @@ -305,6 +305,17 @@ public class SpecificResourceAllocationTest { equalTo(ResourcesPerDay.amount(1))); } + @Test + public void canAssignFromEndUntilStart() { + LocalDate start = new LocalDate(2000, 2, 4); + givenSpecificResourceAllocation(start, 4); + specificResourceAllocation.fromEndUntil(start).allocateHours(32); + assertThat(specificResourceAllocation.getAssignments(), + haveHours(8, 8, 8, 8)); + assertThat(specificResourceAllocation.getResourcesPerDay(), + equalTo(ResourcesPerDay.amount(1))); + } + @Test public void canBeNotifiedWhenADayAssignmentIsRemoved() { LocalDate start = new LocalDate(2000, 2, 4);