From 2a382e201e8e0590dd10d6d191588955a2bfe93e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Wed, 19 Jan 2011 16:41:05 +0100 Subject: [PATCH] Make canWork rely on Capacity data FEA: ItEr68OTS05IntroducionLimiteSobreasignacionCalendarios --- .../calendars/entities/BaseCalendar.java | 17 +++------- .../business/calendars/entities/Capacity.java | 5 +++ .../planner/entities/EffortDistributor.java | 2 +- .../calendars/entities/BaseCalendarTest.java | 31 +++++++++++++++++++ .../test/calendars/entities/CapacityTest.java | 25 +++++++++++++++ .../GenericResourceAllocationTest.java | 4 +-- 6 files changed, 68 insertions(+), 16 deletions(-) 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 040a2e725..9f151363e 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 @@ -695,15 +695,11 @@ public class BaseCalendar extends IntegrationEntity implements ICalendar { return false; } - public boolean canWork(LocalDate date) { - return isActive(date) && canWorkConsideringOnlyException(date); + public boolean canWorkOn(LocalDate date) { + Capacity capacity = findCapacityAt(date); + return capacity.allowsWorking(); } - - private boolean canWorkConsideringOnlyException(LocalDate date) { - CalendarException exceptionDay = getExceptionDay(date); - return exceptionDay == null || canWorkAt(exceptionDay); - } public CalendarAvailability getLastCalendarAvailability() { if (calendarAvailabilities.isEmpty()) { return null; @@ -848,17 +844,12 @@ public class BaseCalendar extends IntegrationEntity implements ICalendar { private void addInvaliditiesFromExceptions(AvailabilityTimeLine timeLine) { for (CalendarException each : getExceptions()) { - if (!canWorkAt(each)) { + if (!each.getCapacity().allowsWorking()) { timeLine.invalidAt(each.getDate()); } } } - private boolean canWorkAt(CalendarException each) { - return !each.getDuration().isZero() - || each.getType().isOverAssignableWithoutLimit(); - } - @Override protected IBaseCalendarDAO getIntegrationEntityDAO() { return org.navalplanner.business.common.Registry.getBaseCalendarDAO(); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/Capacity.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/Capacity.java index db1bf51df..76107f769 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/Capacity.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/Capacity.java @@ -150,4 +150,9 @@ public class Capacity { duration); } + public boolean allowsWorking() { + return !getStandardEffort().isZero() || isOverAssignableWithoutLimit() + || !getAllowedExtraEffort().isZero(); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/EffortDistributor.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/EffortDistributor.java index 23b07b6ea..a7cdf75c1 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/EffortDistributor.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/EffortDistributor.java @@ -72,7 +72,7 @@ public class EffortDistributor { @Override public boolean isSelectable(Resource resource, LocalDate day) { ResourceCalendar resourceCalendar = resource.getCalendar(); - return resourceCalendar == null || resourceCalendar.canWork(day); + return resourceCalendar == null || resourceCalendar.canWorkOn(day); } } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/calendars/entities/BaseCalendarTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/calendars/entities/BaseCalendarTest.java index 84d35e7c5..07afd2202 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/calendars/entities/BaseCalendarTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/calendars/entities/BaseCalendarTest.java @@ -878,4 +878,35 @@ public class BaseCalendarTest { ResourcesPerDay.amount(3)), equalTo(hours(5))); } + @Test + public void canWorkOnRespectsTheCapacityOfTheException() { + BaseCalendar calendar = createBasicCalendar(); + addExceptionOn(calendar, MONDAY_LOCAL_DATE, Capacity.create(hours(0)) + .extraEffort(hours(0))); + + assertFalse(calendar.canWorkOn(MONDAY_LOCAL_DATE)); + } + + @Test + public void canWorkOnRespectsIsOverAssignable() { + BaseCalendar calendar = createBasicCalendar(); + addExceptionOn(calendar, MONDAY_LOCAL_DATE, Capacity.create(hours(0)) + .overAssignableWithoutLimit(true)); + + assertTrue(calendar.canWorkOn(MONDAY_LOCAL_DATE)); + } + + @Test + public void canWorkOnRespectsCalendarData() { + BaseCalendar calendar = createBasicCalendar(); + calendar.setCapacityAt(Days.MONDAY, Capacity.create(hours(0)) + .overAssignableWithoutLimit(true)); + + assertTrue(calendar.canWorkOn(MONDAY_LOCAL_DATE)); + + calendar.setCapacityAt(Days.MONDAY, Capacity.create(hours(0)) + .overAssignableWithoutLimit(false)); + assertFalse(calendar.canWorkOn(MONDAY_LOCAL_DATE)); + } + } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/calendars/entities/CapacityTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/calendars/entities/CapacityTest.java index 3e3d3efbf..d708a0979 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/calendars/entities/CapacityTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/calendars/entities/CapacityTest.java @@ -83,4 +83,29 @@ public class CapacityTest { Capacity capacity = new Capacity(); assertThat(capacity.getStandardEffort(), equalTo(EffortDuration.zero())); } + + @Test + public void aInitiallyZeroCapacityDoesNotAllowWorking() { + Capacity zero = Capacity.zero(); + assertFalse(zero.allowsWorking()); + } + + @Test + public void aNonZeroCapacityAllowsWorking() { + Capacity capacity = Capacity.create(EffortDuration.minutes(1)); + assertTrue(capacity.allowsWorking()); + } + + @Test + public void aCapacityWithExtraHoursAndZeroEffortAllowsWorking() { + Capacity capacity = Capacity.create(EffortDuration.zero()).extraEffort( + EffortDuration.minutes(1)); + assertTrue(capacity.allowsWorking()); + } + + @Test + public void aCapacityWithZeroHoursAndOverAssignableWithoutLimitAllowsWorking() { + Capacity capacity = Capacity.zero().overAssignableWithoutLimit(true); + assertTrue(capacity.allowsWorking()); + } } 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 870a5d1b7..f63172278 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 @@ -242,7 +242,7 @@ public class GenericResourceAllocationTest { hours(hoursPerDay)).anyTimes(); expect(baseCalendar.isActive(isA(LocalDate.class))).andReturn(true) .anyTimes(); - expect(baseCalendar.canWork(isA(LocalDate.class))).andReturn(true) + expect(baseCalendar.canWorkOn(isA(LocalDate.class))).andReturn(true) .anyTimes(); expect(baseCalendar.getAvailability()).andReturn( AvailabilityTimeLine.allValid()).anyTimes(); @@ -588,7 +588,7 @@ public class GenericResourceAllocationTest { isA(ResourcesPerDay.class))).andReturn(hours(unit)) .anyTimes(); - expect(calendar.canWork(isA(LocalDate.class))).andReturn(true) + expect(calendar.canWorkOn(isA(LocalDate.class))).andReturn(true) .anyTimes(); expect(calendar.getCapacity()).andReturn(capacity).anyTimes(); replay(calendar);