Make canWork rely on Capacity data

FEA: ItEr68OTS05IntroducionLimiteSobreasignacionCalendarios
This commit is contained in:
Óscar González Fernández 2011-01-19 16:41:05 +01:00
parent 252e994ba1
commit 2a382e201e
6 changed files with 68 additions and 16 deletions

View file

@ -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();

View file

@ -150,4 +150,9 @@ public class Capacity {
duration);
}
public boolean allowsWorking() {
return !getStandardEffort().isZero() || isOverAssignableWithoutLimit()
|| !getAllowedExtraEffort().isZero();
}
}

View file

@ -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);
}
}

View file

@ -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));
}
}

View file

@ -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());
}
}

View file

@ -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);