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 47ada555d..2d6061e26 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 @@ -37,6 +37,7 @@ import org.hibernate.validator.NotNull; import org.joda.time.LocalDate; import org.navalplanner.business.calendars.entities.AvailabilityTimeLine; import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.calendars.entities.CombinedWorkHours; import org.navalplanner.business.calendars.entities.IWorkHours; import org.navalplanner.business.calendars.entities.SameWorkHoursEveryDay; import org.navalplanner.business.calendars.entities.ThereAreHoursOnWorkHoursCalculator; @@ -214,8 +215,7 @@ public abstract class ResourceAllocation extends LocalDate start, ResourcesPerDayModification resourcesPerDayModification, int hoursToAllocate) { - IWorkHours workHoursPerDay = resourcesPerDayModification - .getBeingModified().getWorkHoursPerDay(); + IWorkHours workHoursPerDay = getWorkHoursPerDay(resourcesPerDayModification); ResourcesPerDay resourcesPerDay = resourcesPerDayModification .getGoal(); AvailabilityTimeLine availability = resourcesPerDayModification @@ -225,6 +225,14 @@ public abstract class ResourceAllocation extends resourcesPerDay, hoursToAllocate); } + private CombinedWorkHours getWorkHoursPerDay( + ResourcesPerDayModification resourcesPerDayModification) { + return CombinedWorkHours.minOf(resourcesPerDayModification + .getBeingModified().getTaskWorkHours(), + resourcesPerDayModification + .getResourcesWorkHoursPerDay()); + } + @Override protected void markUnsatisfied(ResourceAllocation allocation) { allocation.markAsUnsatisfied(); @@ -566,10 +574,10 @@ public abstract class ResourceAllocation extends } private IWorkHours getWorkHoursPerDay() { - return getWorkHoursGivenTaskHours(getTaskWorkHoursLimit()); + return getWorkHoursGivenTaskHours(getTaskWorkHours()); } - private IWorkHours getTaskWorkHoursLimit() { + private IWorkHours getTaskWorkHours() { return new IWorkHours() { @Override public Integer getCapacityAt(LocalDate day) { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java index 8d7cef4e1..78b536709 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java @@ -28,6 +28,10 @@ import java.util.List; import org.apache.commons.lang.Validate; import org.joda.time.LocalDate; import org.navalplanner.business.calendars.entities.AvailabilityTimeLine; +import org.navalplanner.business.calendars.entities.CombinedWorkHours; +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.planner.entities.AvailabilityCalculator; import org.navalplanner.business.planner.entities.DayAssignment; import org.navalplanner.business.planner.entities.GenericResourceAllocation; @@ -79,6 +83,19 @@ public abstract class ResourcesPerDayModification extends .getCriterions(), getResources()); } + @Override + public IWorkHours getResourcesWorkHoursPerDay() { + return CombinedWorkHours.maxOf(resourcesWorkHours()); + } + + private List resourcesWorkHours() { + List workHours = new ArrayList(); + for (Resource each : getResources()) { + workHours.add(workHoursFor(each)); + } + return workHours; + } + } private static class OnSpecificAllocation extends @@ -120,6 +137,12 @@ public abstract class ResourcesPerDayModification extends private Resource getAssociatedResource() { return getResources().get(0); } + + @Override + public IWorkHours getResourcesWorkHoursPerDay() { + return workHoursFor(getAssociatedResource()); + } + } public static ResourcesPerDayModification create( @@ -159,6 +182,12 @@ public abstract class ResourcesPerDayModification extends return result; } + protected static IWorkHours workHoursFor(Resource associatedResource) { + ResourceCalendar calendar = associatedResource.getCalendar(); + return calendar != null ? calendar : SameWorkHoursEveryDay + .getDefaultWorkingDay(); + } + private final ResourcesPerDay goal; private ResourcesPerDayModification( @@ -173,6 +202,8 @@ public abstract class ResourcesPerDayModification extends return goal; } + public abstract IWorkHours getResourcesWorkHoursPerDay(); + public abstract void applyAllocationOnAllTaskLength(); public abstract void applyAllocationUntil(LocalDate endExclusive); @@ -182,4 +213,5 @@ public abstract class ResourcesPerDayModification extends public abstract AvailabilityTimeLine getAvailability(); + }