diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/HoursDistributor.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/HoursDistributor.java index 5ed508e23..6cf3174fe 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/HoursDistributor.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/HoursDistributor.java @@ -44,37 +44,7 @@ public class HoursDistributor { } } - private final List resources; - - private final List workHours; - - private final List capacities; - - private final IAssignedHoursForResource assignedHoursForResource; - - public HoursDistributor(List resources, - IAssignedHoursForResource assignedHoursForResource) { - this.resources = resources; - this.assignedHoursForResource = assignedHoursForResource; - this.workHours = new ArrayList(); - for (Resource resource : resources) { - this.workHours.add(generateWorkHoursFor(resource)); - } - this.capacities = new ArrayList(); - for (Resource resource : resources) { - this.capacities.add(getCapacityFor(resource)); - } - } - - private Integer getCapacityFor(Resource resource) { - if (resource.getCalendar() != null) { - return resource.getCalendar().getCapacity(); - } else { - return 1; - } - } - - private final IWorkHours generateWorkHoursFor(Resource resource) { + private static final IWorkHours generateWorkHoursFor(Resource resource) { if (resource.getCalendar() != null) { return resource.getCalendar(); } else { @@ -82,13 +52,67 @@ public class HoursDistributor { } } + private static int getCapacityFor(Resource resource) { + if (resource.getCalendar() != null) { + return resource.getCalendar().getCapacity(); + } else { + return 1; + } + } + + private static class ResourceWithDerivedData { + + public static List from( + List resources) { + List result = new ArrayList(); + for (Resource each : resources) { + result.add(new ResourceWithDerivedData(each)); + } + return result; + } + + public static List resources( + List resources) { + List result = new ArrayList(); + for (ResourceWithDerivedData each : resources) { + result.add(each.resource); + } + return result; + } + + public final Resource resource; + + public final int capacityUnits; + + public final IWorkHours workHours; + + public ResourceWithDerivedData(Resource resource) { + this.resource = resource; + this.capacityUnits = getCapacityFor(resource); + this.workHours = generateWorkHoursFor(resource); + } + + } + + private final List resources; + + private final IAssignedHoursForResource assignedHoursForResource; + + public HoursDistributor(List resources, + IAssignedHoursForResource assignedHoursForResource) { + this.resources = ResourceWithDerivedData.from(resources); + this.assignedHoursForResource = assignedHoursForResource; + } + + public List distributeForDay(LocalDate day, int totalHours) { - List shares = divisionAt(day); + List shares = divisionAt(resources, day); ShareDivision currentDivision = ShareSource.all(shares); ShareDivision newDivison = currentDivision.plus(totalHours); int[] differences = currentDivision.to(newDivison); - return ShareSource.hoursForEachResource(shares, differences, resources); + return ShareSource.hoursForEachResource(shares, differences, + ResourceWithDerivedData.resources(resources)); } private static final ResourcesPerDay ONE = ResourcesPerDay.amount(1); @@ -137,16 +161,17 @@ public class HoursDistributor { } - public List divisionAt(LocalDate day) { + public List divisionAt( + List resources, LocalDate day) { List result = new ArrayList(); for (int i = 0; i < resources.size(); i++) { List shares = new ArrayList(); - Resource resource = resources.get(i); - IWorkHours workHoursForResource = workHours.get(i); + Resource resource = resources.get(i).resource; + IWorkHours workHoursForResource = resources.get(i).workHours; int alreadyAssignedHours = assignedHoursForResource .getAssignedHoursAt(resource, day); Integer capacityEachOne = workHoursForResource.toHours(day, ONE); - final int capacityUnits = capacities.get(i); + final int capacityUnits = resources.get(i).capacityUnits; assert capacityUnits >= 1; final int assignedForEach = alreadyAssignedHours / capacityUnits; final int remainder = alreadyAssignedHours % capacityUnits;