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 2c6725df8..56ba5a77f 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 @@ -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 extends private ResourcesPerDay calculateResourcesPerDayFromAssignments( Collection assignments) { Map> byDay = DayAssignment.byDay(assignments); - int sumTotalHours = 0; - int sumWorkableHours = 0; + EffortDuration sumTotalEffort = zero(); + EffortDuration sumWorkableEffort = zero(); final ResourcesPerDay one = ResourcesPerDay.amount(1); for (Entry> 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 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 getAssignments(LocalDate start, @@ -1089,7 +1095,8 @@ public abstract class ResourceAllocation extends } public int getAssignedHours(LocalDate start, LocalDate endExclusive) { - return getAssignedHours(getAssignments(start, endExclusive)); + return getAssignedDuration(getAssignments(start, endExclusive)) + .roundToHours(); } private List filter(List assignments, @@ -1103,12 +1110,13 @@ public abstract class ResourceAllocation extends return result; } - private int getAssignedHours(List assignments) { - int sum = 0; + private EffortDuration getAssignedDuration( + List 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, diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/workingday/ResourcesPerDay.java b/navalplanner-business/src/main/java/org/navalplanner/business/workingday/ResourcesPerDay.java index 60a55af61..35068f606 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/workingday/ResourcesPerDay.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/workingday/ResourcesPerDay.java @@ -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) { diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/workingday/ResourcesPerDayTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/workingday/ResourcesPerDayTest.java index 7fe6a653b..70c107367 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/workingday/ResourcesPerDayTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/workingday/ResourcesPerDayTest.java @@ -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];