Make calculateResourcesPerDayFromAssignments use EffortDuration instead of hours
FEA: ItEr60S19TimeUnitDataType
This commit is contained in:
parent
b6ef514f21
commit
a523391ce0
3 changed files with 45 additions and 29 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue