[Bug #942] Detect it can't fullfil the request duration beforehand

Calendar's thereAreCapacityFor is used.
This commit is contained in:
Óscar González Fernández 2011-04-05 13:12:34 +02:00
parent 36cbb9f650
commit 6b4bd00be0

View file

@ -39,6 +39,7 @@ import org.hibernate.validator.AssertTrue;
import org.hibernate.validator.Valid;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.navalplanner.business.calendars.entities.AvailabilityTimeLine;
import org.navalplanner.business.calendars.entities.ICalendar;
import org.navalplanner.business.calendars.entities.SameWorkHoursEveryDay;
import org.navalplanner.business.orders.entities.AggregatedHoursGroup;
@ -60,6 +61,7 @@ import org.navalplanner.business.util.deepcopy.AfterCopy;
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;
/**
* @author Óscar González Fernández <ogonzalez@igalia.com>
@ -628,6 +630,10 @@ public class Task extends TaskElement implements ITaskPositionConstrained {
EffortDuration originalRemaining = remaining;
LocalDate startDate = start.getDate();
LocalDate current = startDate;
if (!canBeFulfilled(start, originalRemaining)) {
return roughApproximationDueToNotFullfilingCalendar(startDate,
originalRemaining);
}
while (!remaining.isZero()) {
EffortDuration capacity = calendar.getCapacityOn(PartialDay
.wholeDay(current));
@ -635,17 +641,35 @@ public class Task extends TaskElement implements ITaskPositionConstrained {
remaining = remaining.minus(min(capacity, remaining));
current = current.plusDays(1);
if (Days.daysBetween(startDate, current).getDays() > MAX_DAYS_LOOKING_CAPACITY) {
LOG
.warn("Calendar doesn't have enough capacity in 5 years, "
+ "using 8h per day to calculate end date for the task");
return IntraDayDate.create(startDate
.plusDays(originalRemaining.getHours() / 8),
EffortDuration.zero());
LOG.error("thereAreCapacityFor didn't detect that it didn't"
+ " really have enough capacity to fulfill the required hours"
+ " or this capacity is more than "
+ MAX_DAYS_LOOKING_CAPACITY + " in the future");
return roughApproximationDueToNotFullfilingCalendar(
startDate, originalRemaining);
}
}
return result;
}
private boolean canBeFulfilled(IntraDayDate start,
EffortDuration originalRemaining) {
AvailabilityTimeLine availability = AvailabilityTimeLine.allValid();
availability.invalidUntil(start.getDate());
return calendar.thereAreCapacityFor(availability,
ResourcesPerDay.amount(1), originalRemaining);
}
private IntraDayDate roughApproximationDueToNotFullfilingCalendar(
LocalDate startDate,
EffortDuration originalRemaining) {
LOG.warn("Calendar " + calendar + " doesn't have enough capacity, "
+ "using 8h per day to calculate end date for the task");
return IntraDayDate.create(
startDate.plusDays(originalRemaining.getHours() / 8),
EffortDuration.zero());
}
public IntraDayDate fromEndToStart(IntraDayDate newEnd) {
LocalDate resultDay = calculateStartGivenWorkableDays(
newEnd.getDate(), numberOfWorkableDays);