diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AggregateOfResourceAllocations.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AggregateOfResourceAllocations.java index 075baacce..2055e9ecf 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AggregateOfResourceAllocations.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AggregateOfResourceAllocations.java @@ -48,6 +48,11 @@ public class AggregateOfResourceAllocations { ResourceAllocation.getSatisfied(allocations)); } + public static AggregateOfResourceAllocations createFromAll( + Collection> allocations) { + return new AggregateOfResourceAllocations(allocations); + } + private Set> resourceAllocations; private AggregateOfResourceAllocations( @@ -66,6 +71,14 @@ public class AggregateOfResourceAllocations { return sum; } + public int getIntendedHours() { + int sum = 0; + for (ResourceAllocation resourceAllocation : resourceAllocations) { + sum += resourceAllocation.getIntendedHours(); + } + return sum; + } + public Map, ResourcesPerDay> getResourcesPerDay() { HashMap, ResourcesPerDay> result = new HashMap, ResourcesPerDay>(); for (ResourceAllocation r : resourceAllocations) { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java index 9e21f7a3d..65626ea0e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/GenericResourceAllocation.java @@ -324,12 +324,12 @@ public class GenericResourceAllocation extends @Override public ResourcesPerDayModification asResourcesPerDayModification() { return ResourcesPerDayModification.create(this, - getNonConsolidatedResourcePerDay(), getAssociatedResources()); + getIntendedResourcesPerDay(), getAssociatedResources()); } @Override public HoursModification asHoursModification() { - return HoursModification.create(this, getAssignedHours(), + return HoursModification.create(this, getIntendedHours(), getAssociatedResources()); } 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 e5507257f..62f041a91 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 @@ -547,6 +547,9 @@ public abstract class ResourceAllocation extends } private void updateOriginalTotalAssigment() { + if (!isSatisfied()) { + return; + } if ((task.getConsolidation() == null) || (task.getConsolidation().getConsolidatedValues().isEmpty())) { originalTotalAssignment = getNonConsolidatedHours(); @@ -1031,6 +1034,13 @@ public abstract class ResourceAllocation extends return DayAssignment.sum(getAssignments()).roundToHours(); } + protected int getIntendedHours() { + if (isUnsatisfied()) { + return originalTotalAssignment; + } + return getAssignedHours(); + } + @OnCopy(Strategy.IGNORE) private DayAssignmentsState assignmentsState; @@ -1390,6 +1400,18 @@ public abstract class ResourceAllocation extends return calculateResourcesPerDayFromAssignments(getNonConsolidatedAssignments()); } + /** + * Calculates the intended resources per day for this allocation. If the + * allocation is not satisfied cannot be calculated on the current + * assignment values and must be retrieved from the value in the field. + */ + protected ResourcesPerDay getIntendedResourcesPerDay() { + if (isUnsatisfied()) { + return getResourcesPerDay(); + } + return getNonConsolidatedResourcePerDay(); + } + public ResourcesPerDay getConsolidatedResourcePerDay() { return calculateResourcesPerDayFromAssignments(getConsolidatedAssignments()); } @@ -1548,8 +1570,10 @@ public abstract class ResourceAllocation extends } switchToScenario(scenario); mergeAssignments(modifications); - updateOriginalTotalAssigment(); - updateResourcesPerDay(); + if (modifications.isSatisfied()) { + updateOriginalTotalAssigment(); + updateResourcesPerDay(); + } setWithoutApply(modifications.getAssignmentFunction()); mergeDerivedAllocations(scenario, modifications.getDerivedAllocations()); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java index ac62c4a88..ba368b1d0 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java @@ -244,12 +244,12 @@ public class SpecificResourceAllocation extends @Override public ResourcesPerDayModification asResourcesPerDayModification() { return ResourcesPerDayModification.create(this, - getNonConsolidatedResourcePerDay()); + getIntendedResourcesPerDay()); } @Override public HoursModification asHoursModification() { - return HoursModification.create(this, getAssignedHours()); + return HoursModification.create(this, getIntendedHours()); } @Override diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java index 6659096d4..c82133792 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java @@ -100,7 +100,6 @@ public class Task extends TaskElement implements ITaskPositionConstrained { private Set> resourceAllocations = new HashSet>(); @Valid - @SuppressWarnings("unused") private Set> getResourceAlloations() { return new HashSet>(resourceAllocations); } @@ -157,6 +156,11 @@ public class Task extends TaskElement implements ITaskPositionConstrained { .getTotalHours(); } + private int getTotalIntendedHours() { + return AggregateOfResourceAllocations + .createFromAll(resourceAllocations).getIntendedHours(); + } + public int getTotalHours() { return (getTaskSource() != null) ? getTaskSource().getTotalHours() : 0; } @@ -627,7 +631,7 @@ public class Task extends TaskElement implements ITaskPositionConstrained { return; } List copied = ModifiedAllocation.copy(onScenario, - getSatisfiedResourceAllocations()); + getResourceAlloations()); List> toBeModified = ModifiedAllocation .modified(copied); if (toBeModified.isEmpty()) { @@ -653,7 +657,7 @@ public class Task extends TaskElement implements ITaskPositionConstrained { break; case END_DATE: IntraDayDate date = ResourceAllocation.allocating(allocations) - .untilAllocating(direction, getAssignedHours()); + .untilAllocating(direction, getTotalIntendedHours()); if (direction == Direction.FORWARD) { setIntraDayEndDate(date); } else { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java index 363e0e87b..1993e3c1e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java @@ -215,9 +215,7 @@ public abstract class ResourcesPerDayModification extends Collection> allocations) { List result = new ArrayList(); for (ResourceAllocation resourceAllocation : allocations) { - Validate.isTrue(resourceAllocation.hasAssignments()); - ResourcesPerDay perDay = resourceAllocation - .getResourcesPerDay(); + ResourcesPerDay perDay = resourceAllocation.getResourcesPerDay(); Validate.notNull(perDay); result.add(resourceAllocation.asResourcesPerDayModification()); }