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 faeebd0d5..95a229f00 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 @@ -1118,18 +1118,28 @@ public abstract class ResourceAllocation extends private ResourcesPerDay calculateResourcesPerDayFromAssignments( Collection assignments) { + if (assignments.isEmpty()) { + return ResourcesPerDay.amount(0); + } + Map> byDay = DayAssignment.byDay(assignments); + LocalDate min = Collections.min(byDay.keySet()); + LocalDate max = Collections.max(byDay.keySet()); + Iterable daysToIterate = startFor(min).daysUntil( + endFor(max)); + EffortDuration sumTotalEffort = zero(); EffortDuration sumWorkableEffort = zero(); final ResourcesPerDay ONE_RESOURCE_PER_DAY = ResourcesPerDay.amount(1); - for (Entry> entry : byDay.entrySet()) { - LocalDate dayDate = entry.getKey(); - PartialDay day = dayFor(dayDate); + + for (PartialDay day : daysToIterate) { + List assignmentsAtDay = avoidNull(byDay.get(day.getDate()), + Collections. emptyList()); EffortDuration incrementWorkable = getAllocationCalendar() .asDurationOn(day, ONE_RESOURCE_PER_DAY); sumWorkableEffort = sumWorkableEffort.plus(incrementWorkable); - sumTotalEffort = sumTotalEffort.plus(getAssignedDuration(entry - .getValue())); + sumTotalEffort = sumTotalEffort + .plus(getAssignedDuration(assignmentsAtDay)); } if (sumWorkableEffort.equals(zero())) { return ResourcesPerDay.amount(0); @@ -1137,17 +1147,6 @@ public abstract class ResourceAllocation extends return ResourcesPerDay.calculateFrom(sumTotalEffort, sumWorkableEffort); } - private PartialDay dayFor(LocalDate dayDate) { - IntraDayDate startDate = startFor(dayDate); - - IntraDayDate intraDayEnd = getDayAssignmentsState() - .getIntraDayEnd(); - if (intraDayEnd != null && dayDate.equals(intraDayEnd.getDate())) { - return new PartialDay(startDate, intraDayEnd); - } - return new PartialDay(startDate, startDate.nextDayAtStart()); - } - private IntraDayDate startFor(LocalDate dayDate) { IntraDayDate start = getIntraDayStartDate(); if (start.getDate().equals(dayDate)) { @@ -1157,6 +1156,23 @@ public abstract class ResourceAllocation extends } } + private IntraDayDate endFor(LocalDate assignmentDate) { + IntraDayDate end = getIntraDayEndDate(); + if (end.getDate().equals(assignmentDate)) { + return end; + } else { + return IntraDayDate.startOfDay(assignmentDate).nextDayAtStart(); + } + } + + private static T avoidNull(T value, T defaultValue) { + if (value != null) { + return value; + } else { + return defaultValue; + } + } + public ICalendar getAllocationCalendar() { return getCalendarGivenTaskCalendar(getTaskCalendar()); }