Take into consideration that some days could not have day assignments
FEA: ItEr74S04BugFixing
This commit is contained in:
parent
da985cf27f
commit
780ca8ba0f
1 changed files with 32 additions and 16 deletions
|
|
@ -1118,18 +1118,28 @@ public abstract class ResourceAllocation<T extends DayAssignment> extends
|
|||
|
||||
private ResourcesPerDay calculateResourcesPerDayFromAssignments(
|
||||
Collection<? extends T> assignments) {
|
||||
if (assignments.isEmpty()) {
|
||||
return ResourcesPerDay.amount(0);
|
||||
}
|
||||
|
||||
Map<LocalDate, List<T>> byDay = DayAssignment.byDay(assignments);
|
||||
LocalDate min = Collections.min(byDay.keySet());
|
||||
LocalDate max = Collections.max(byDay.keySet());
|
||||
Iterable<PartialDay> daysToIterate = startFor(min).daysUntil(
|
||||
endFor(max));
|
||||
|
||||
EffortDuration sumTotalEffort = zero();
|
||||
EffortDuration sumWorkableEffort = zero();
|
||||
final ResourcesPerDay ONE_RESOURCE_PER_DAY = ResourcesPerDay.amount(1);
|
||||
for (Entry<LocalDate, List<T>> entry : byDay.entrySet()) {
|
||||
LocalDate dayDate = entry.getKey();
|
||||
PartialDay day = dayFor(dayDate);
|
||||
|
||||
for (PartialDay day : daysToIterate) {
|
||||
List<T> assignmentsAtDay = avoidNull(byDay.get(day.getDate()),
|
||||
Collections.<T> 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<T extends DayAssignment> 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<T extends DayAssignment> 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> T avoidNull(T value, T defaultValue) {
|
||||
if (value != null) {
|
||||
return value;
|
||||
} else {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
public ICalendar getAllocationCalendar() {
|
||||
return getCalendarGivenTaskCalendar(getTaskCalendar());
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue