Make calculateResourcesPerDayFromAssignments use EffortDuration instead of hours

FEA: ItEr60S19TimeUnitDataType
This commit is contained in:
Óscar González Fernández 2010-09-13 20:05:20 +02:00
parent b6ef514f21
commit a523391ce0
3 changed files with 45 additions and 29 deletions

View file

@ -20,6 +20,9 @@
package org.navalplanner.business.planner.entities;
import static org.navalplanner.business.workingday.EffortDuration.hours;
import static org.navalplanner.business.workingday.EffortDuration.zero;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
@ -724,18 +727,20 @@ public abstract class ResourceAllocation<T extends DayAssignment> extends
private ResourcesPerDay calculateResourcesPerDayFromAssignments(
Collection<? extends T> assignments) {
Map<LocalDate, List<T>> byDay = DayAssignment.byDay(assignments);
int sumTotalHours = 0;
int sumWorkableHours = 0;
EffortDuration sumTotalEffort = zero();
EffortDuration sumWorkableEffort = zero();
final ResourcesPerDay one = ResourcesPerDay.amount(1);
for (Entry<LocalDate, List<T>> entry : byDay.entrySet()) {
sumWorkableHours += getWorkHoursPerDay().toHours(entry.getKey(),
one);
sumTotalHours += getAssignedHours(entry.getValue());
sumWorkableEffort = sumWorkableEffort
.plus(hours(getWorkHoursPerDay().toHours(entry.getKey(),
one)));
sumTotalEffort = sumTotalEffort.plus(getAssignedDuration(entry
.getValue()));
}
if (sumWorkableHours == 0) {
if (sumWorkableEffort.equals(zero())) {
return ResourcesPerDay.amount(0);
}
return ResourcesPerDay.calculateFrom(sumTotalHours, sumWorkableHours);
return ResourcesPerDay.calculateFrom(sumTotalEffort, sumWorkableEffort);
}
private IWorkHours getWorkHoursPerDay() {
@ -1073,13 +1078,14 @@ public abstract class ResourceAllocation<T extends DayAssignment> extends
public int getAssignedHours(final Resource resource, LocalDate start,
LocalDate endExclusive) {
return getAssignedHours(filter(getAssignments(start, endExclusive),new PredicateOnDayAssignment() {
@Override
public boolean satisfiedBy(DayAssignment dayAssignment) {
return dayAssignment.isAssignedTo(resource);
}
}));
return getAssignedDuration(filter(getAssignments(start, endExclusive),
new PredicateOnDayAssignment() {
@Override
public boolean satisfiedBy(
DayAssignment dayAssignment) {
return dayAssignment.isAssignedTo(resource);
}
})).roundToHours();
}
public List<DayAssignment> getAssignments(LocalDate start,
@ -1089,7 +1095,8 @@ public abstract class ResourceAllocation<T extends DayAssignment> extends
}
public int getAssignedHours(LocalDate start, LocalDate endExclusive) {
return getAssignedHours(getAssignments(start, endExclusive));
return getAssignedDuration(getAssignments(start, endExclusive))
.roundToHours();
}
private List<DayAssignment> filter(List<DayAssignment> assignments,
@ -1103,12 +1110,13 @@ public abstract class ResourceAllocation<T extends DayAssignment> extends
return result;
}
private int getAssignedHours(List<? extends DayAssignment> assignments) {
int sum = 0;
private EffortDuration getAssignedDuration(
List<? extends DayAssignment> assignments) {
EffortDuration result = zero();
for (DayAssignment dayAssignment : assignments) {
sum += dayAssignment.getHours();
result = result.plus(dayAssignment.getDuration());
}
return sum;
return result;
}
public void mergeAssignmentsAndResourcesPerDay(Scenario scenario,

View file

@ -76,9 +76,11 @@ public class ResourcesPerDay {
return amount(new BigDecimal(integerFormat).movePointLeft(2));
}
public static ResourcesPerDay calculateFrom(int hoursWorking, int workableHours) {
return amount(new BigDecimal(hoursWorking).divide(new BigDecimal(
workableHours), 2, RoundingMode.HALF_UP));
public static ResourcesPerDay calculateFrom(EffortDuration durationWorking,
EffortDuration durationWorkable) {
return amount(new BigDecimal(durationWorking.getSeconds()).divide(
new BigDecimal(durationWorkable.getSeconds()), 2,
RoundingMode.HALF_UP));
}
public static ResourcesPerDay amount(int amount) {

View file

@ -186,15 +186,21 @@ public class ResourcesPerDayTest {
@SuppressWarnings("unchecked")
@Test
public void canCalculateTheResourcesPerDayFromTheHoursWorkingAndTheWorkableHours() {
Object[] periodicalNumber = { ResourcesPerDay.calculateFrom(10, 3),
public void canCalculateTheResourcesPerDayFromTheWorkingEffortAndTheWorkableEffort() {
Object[] periodicalNumber = {
ResourcesPerDay.calculateFrom(seconds(10), seconds(3)),
readsAs(3, 33) };
Object[][] examples = {
{ ResourcesPerDay.calculateFrom(1000, 1000), readsAs(1, 00) },
{ ResourcesPerDay.calculateFrom(2000, 1000), readsAs(2, 00) },
{ ResourcesPerDay.calculateFrom(500, 1000), readsAs(0, 50) },
{ ResourcesPerDay.calculateFrom(651, 1000), readsAs(0, 65) },
{ ResourcesPerDay.calculateFrom(1986, 1000), readsAs(1, 99) },
{ ResourcesPerDay.calculateFrom(seconds(1000), seconds(1000)),
readsAs(1, 00) },
{ ResourcesPerDay.calculateFrom(seconds(2000), seconds(1000)),
readsAs(2, 00) },
{ ResourcesPerDay.calculateFrom(seconds(500), seconds(1000)),
readsAs(0, 50) },
{ ResourcesPerDay.calculateFrom(seconds(651), seconds(1000)),
readsAs(0, 65) },
{ ResourcesPerDay.calculateFrom(seconds(1986), seconds(1000)),
readsAs(1, 99) },
periodicalNumber };
for (Object[] pair : examples) {
ResourcesPerDay first = (ResourcesPerDay) pair[0];