diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java index d2f1d4251..40d837437 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java @@ -136,7 +136,11 @@ public class GenericResourceAllocation extends } return shares; } + } + @Override + protected IWorkHours getWorkHoursGivenTaskHours(IWorkHours taskWorkHours) { + return taskWorkHours; } public IAllocatable forResources(Collection resources) { 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 6e2982010..1955a8241 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 @@ -207,11 +207,15 @@ public abstract class ResourceAllocation extends final int calculateTotalToDistribute(LocalDate day, ResourcesPerDay resourcesPerDay) { - Integer workableHours = getWorkHours().getWorkableHours(day); + Integer workableHours = getWorkHoursPerDay().getWorkableHours(day); return resourcesPerDay.asHoursGivenResourceWorkingDayOf(workableHours); } - private IWorkHours getWorkHours() { + private IWorkHours getWorkHoursPerDay() { + return getWorkHoursGivenTaskHours(getTaskWorkHoursLimit()); + } + + private IWorkHours getTaskWorkHoursLimit() { return new IWorkHours() { @Override public Integer getWorkableHours(LocalDate day) { @@ -225,6 +229,9 @@ public abstract class ResourceAllocation extends }; } + protected abstract IWorkHours getWorkHoursGivenTaskHours( + IWorkHours taskWorkHours); + protected final BaseCalendar getTaskCalendar() { return getTask().getCalendar(); } 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 fe50ae2ad..d4205a12b 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 @@ -10,6 +10,8 @@ import java.util.Set; import org.apache.commons.lang.Validate; import org.hibernate.validator.NotNull; import org.joda.time.LocalDate; +import org.navalplanner.business.calendars.entities.CombinedWorkHours; +import org.navalplanner.business.calendars.entities.IWorkHours; import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.business.resources.entities.Worker; @@ -96,14 +98,23 @@ public class SpecificResourceAllocation extends assignmentsAllocation.allocate(resourcesPerDay); } + @Override + protected IWorkHours getWorkHoursGivenTaskHours(IWorkHours taskWorkHours) { + if (getResource().getCalendar() == null) { + return taskWorkHours; + } + return CombinedWorkHours.minOf(taskWorkHours, getResource() + .getCalendar()); + } + @Override protected Class getDayAssignmentType() { return SpecificDayAssignment.class; } @Override - protected List createAssignmentsAtDay(List resources, - LocalDate day, + protected List createAssignmentsAtDay( + List resources, LocalDate day, ResourcesPerDay resourcesPerDay, int limit) { int hours = calculateTotalToDistribute(day, resourcesPerDay); SpecificDayAssignment specific = SpecificDayAssignment.create(day, Math 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 cd29bdd5d..65327c199 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 @@ -8,6 +8,8 @@ import static org.junit.Assert.assertThat; import static org.navalplanner.business.test.planner.entities.DayAssignmentMatchers.consecutiveDays; import static org.navalplanner.business.test.planner.entities.DayAssignmentMatchers.from; +import java.util.Date; + import org.joda.time.LocalDate; import org.junit.Test; import org.navalplanner.business.calendars.entities.BaseCalendar; @@ -35,6 +37,15 @@ public class SpecificResourceAllocationTest { this.assignedHours = assignedHours; } + private void givenResourceCalendarAlwaysReturning(int hours) { + this.calendar = createNiceMock(ResourceCalendar.class); + expect(this.calendar.getWorkableHours(isA(LocalDate.class))).andReturn( + hours).anyTimes(); + expect(this.calendar.getWorkableHours(isA(Date.class))) + .andReturn(hours).anyTimes(); + replay(this.calendar); + } + private void givenWorker(){ this.worker = createNiceMock(Worker.class); expect(this.worker.getCalendar()).andReturn(calendar).anyTimes(); @@ -98,4 +109,14 @@ public class SpecificResourceAllocationTest { DayAssignmentMatchers.haveHours(8, 8)); } + @Test + public void theResourcesPerDayAreConvertedTakingIntoAccountTheWorkerCalendar() { + givenResourceCalendarAlwaysReturning(4); + LocalDate start = new LocalDate(2000, 2, 4); + givenSpecificResourceAllocation(start, 2); + specificResourceAllocation.allocate(ResourcesPerDay.amount(1)); + assertThat(specificResourceAllocation.getAssignments(), + DayAssignmentMatchers.haveHours(4, 4)); + } + }