diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/HoursDistributor.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/HoursDistributor.java index 6cf3174fe..02841293e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/HoursDistributor.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/HoursDistributor.java @@ -25,6 +25,7 @@ import java.util.List; import org.joda.time.LocalDate; import org.navalplanner.business.calendars.entities.IWorkHours; +import org.navalplanner.business.calendars.entities.ResourceCalendar; import org.navalplanner.business.calendars.entities.SameWorkHoursEveryDay; import org.navalplanner.business.resources.entities.Resource; @@ -107,12 +108,28 @@ public class HoursDistributor { public List distributeForDay(LocalDate day, int totalHours) { - List shares = divisionAt(resources, day); + List resourcesAssignable = resourcesAssignableAt(day); + List shares = divisionAt(resourcesAssignable, day); ShareDivision currentDivision = ShareSource.all(shares); ShareDivision newDivison = currentDivision.plus(totalHours); int[] differences = currentDivision.to(newDivison); return ShareSource.hoursForEachResource(shares, differences, - ResourceWithDerivedData.resources(resources)); + ResourceWithDerivedData.resources(resourcesAssignable)); + } + + private List resourcesAssignableAt(LocalDate day) { + List result = new ArrayList(); + for (ResourceWithDerivedData each : resources) { + if (isActiveAt(day, each)) { + result.add(each); + } + } + return result; + } + + private boolean isActiveAt(LocalDate day, ResourceWithDerivedData each) { + ResourceCalendar resourceCalendar = each.resource.getCalendar(); + return resourceCalendar != null ? resourceCalendar.isActive(day) : true; } private static final ResourcesPerDay ONE = ResourcesPerDay.amount(1); diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/GenericResourceAllocationTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/GenericResourceAllocationTest.java index bdecf4c65..00523814f 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/GenericResourceAllocationTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/GenericResourceAllocationTest.java @@ -157,7 +157,7 @@ public class GenericResourceAllocationTest { private void givenWorkersWithLoads(int hours1, int hours2, int hours3) { ResourceCalendar[] calendars; - if(workerCalendars ==null){ + if (workerCalendars == null) { calendars = new ResourceCalendar[] { null, null, null }; } else { calendars = new ResourceCalendar[] { workerCalendars.get(0), @@ -186,6 +186,8 @@ public class GenericResourceAllocationTest { hoursPerDay).anyTimes(); expect(baseCalendar.getCapacityAt(isA(LocalDate.class))).andReturn( hoursPerDay).anyTimes(); + expect(baseCalendar.isActive(isA(LocalDate.class))).andReturn(true) + .anyTimes(); expect( baseCalendar.toHours(isA(LocalDate.class), isA(ResourcesPerDay.class))).andAnswer( @@ -519,6 +521,8 @@ public class GenericResourceAllocationTest { capacity * unit).anyTimes(); expect(calendar.toHours(isA(LocalDate.class), isA(ResourcesPerDay.class))).andReturn(unit).anyTimes(); + expect(calendar.isActive(isA(LocalDate.class))).andReturn(true) + .anyTimes(); expect(calendar.getCapacity()).andReturn(capacity).anyTimes(); replay(calendar); return calendar;