diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java index 35345c736..3ca65c21a 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/BaseCalendar.java @@ -891,10 +891,17 @@ public class BaseCalendar extends IntegrationEntity implements ICalendar { @Override public EffortDuration asDurationOn(LocalDate day, ResourcesPerDay resourcesPerDay) { - final EffortDuration workableHours = getWorkableTimeAt(day); - return limitOverAssignability(day, - resourcesPerDay.asDurationGivenWorkingDayOf(workableHours), - workableHours); + return asDurationOn(PartialDay.wholeDay(day), resourcesPerDay); + } + + @Override + public EffortDuration asDurationOn(PartialDay day, ResourcesPerDay amount) { + EffortDuration workableDuration = day + .limitDuration(getWorkableTimeAt(day.getDate())); + EffortDuration asDuration = amount + .asDurationGivenWorkingDayOf(workableDuration); + return limitOverAssignability(day.getDate(), asDuration, + workableDuration); } private EffortDuration limitOverAssignability(LocalDate day, diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CombinedWorkHours.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CombinedWorkHours.java index aa87a4df2..5f5c340d6 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CombinedWorkHours.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/CombinedWorkHours.java @@ -90,6 +90,11 @@ public abstract class CombinedWorkHours implements ICalendar { @Override public EffortDuration asDurationOn(LocalDate day, ResourcesPerDay amount) { + return asDurationOn(PartialDay.wholeDay(day), amount); + } + + @Override + public EffortDuration asDurationOn(PartialDay day, ResourcesPerDay amount) { EffortDuration result = null; for (ICalendar each : calendars) { result = result == null ? each.asDurationOn(day, amount) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/ICalendar.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/ICalendar.java index 78a286f80..578642ada 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/ICalendar.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/ICalendar.java @@ -37,6 +37,16 @@ public interface ICalendar { */ public EffortDuration asDurationOn(LocalDate day, ResourcesPerDay amount); + /** + * Translates the received amount into the corresponding duration at the + * given date. It takes into account the partial capacity of the day. + * + * @param day + * @param amount + * @return + */ + public EffortDuration asDurationOn(PartialDay day, ResourcesPerDay amount); + /** * Calculates the capacity duration at a given date. It means all the time * that could be worked without having overtime diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/SameWorkHoursEveryDay.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/SameWorkHoursEveryDay.java index c6ca312d3..ad6a331ac 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/SameWorkHoursEveryDay.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/SameWorkHoursEveryDay.java @@ -54,6 +54,11 @@ public class SameWorkHoursEveryDay implements ICalendar { @Override public EffortDuration asDurationOn(LocalDate day, ResourcesPerDay amount) { + return asDurationOn(PartialDay.wholeDay(day), amount); + } + + @Override + public EffortDuration asDurationOn(PartialDay day, ResourcesPerDay amount) { return amount.asDurationGivenWorkingDayOf(getCapacityOn(day)); } 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 afca7ad1e..ee4f82e59 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 @@ -57,6 +57,7 @@ import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.resources.entities.Worker; import org.navalplanner.business.workingday.EffortDuration; import org.navalplanner.business.workingday.IntraDayDate; +import org.navalplanner.business.workingday.IntraDayDate.PartialDay; import org.navalplanner.business.workingday.ResourcesPerDay; public class SpecificResourceAllocationTest { @@ -81,10 +82,15 @@ public class SpecificResourceAllocationTest { this.calendar = createNiceMock(ResourceCalendar.class); expect(this.calendar.getCapacityOn(isA(LocalDate.class))) .andReturn(EffortDuration.hours(hours)).anyTimes(); + IAnswer asDurationAnswer = asDurationOnAnswer(hours(hours)); expect( this.calendar.asDurationOn(isA(LocalDate.class), - isA(ResourcesPerDay.class))).andAnswer( - asDurationOnAnswer(hours(hours))).anyTimes(); + isA(ResourcesPerDay.class))) + .andAnswer(asDurationAnswer).anyTimes(); + expect( + this.calendar.asDurationOn(isA(PartialDay.class), + isA(ResourcesPerDay.class))) + .andAnswer(asDurationAnswer).anyTimes(); expect(this.calendar.getAvailability()).andReturn( AvailabilityTimeLine.allValid()).anyTimes(); replay(this.calendar); @@ -134,8 +140,14 @@ public class SpecificResourceAllocationTest { @Override public Integer answer() throws Throwable { - LocalDate date = (LocalDate) EasyMock + Object argument = EasyMock .getCurrentArguments()[0]; + LocalDate date; + if (argument instanceof LocalDate) { + date = (LocalDate) argument; + }else{ + date = ((PartialDay) argument).getDate(); + } int hours; if (answersForDates.containsKey(date)) { hours = answersForDates.get(date); @@ -155,6 +167,10 @@ public class SpecificResourceAllocationTest { this.calendar.asDurationOn(isA(LocalDate.class), isA(ResourcesPerDay.class))).andAnswer( effortAnswer).anyTimes(); + expect( + this.calendar.asDurationOn(isA(PartialDay.class), + isA(ResourcesPerDay.class))).andAnswer(effortAnswer) + .anyTimes(); expect(this.calendar.getAvailability()).andReturn( AvailabilityTimeLine.allValid()).anyTimes(); replay(this.calendar);