From 207ba45e5e58855d35c56d2f290565fd56b699e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Tue, 28 Dec 2010 20:25:21 +0100 Subject: [PATCH] Improve the stickiness of the parameters specified by the user After doing an allocation if the task was moved to a place where it cannot be satisfied the parameters specified by the user were overriden with zero like values. Now it keeps the fields originalTotalAssignment and resourcesPerDay so if the allocation can be satisfied again it uses the original values. FEA: ItEr66S04BugFixing --- .../AggregateOfResourceAllocations.java | 13 +++++++++ .../entities/GenericResourceAllocation.java | 4 +-- .../planner/entities/ResourceAllocation.java | 28 +++++++++++++++++-- .../entities/SpecificResourceAllocation.java | 4 +-- .../business/planner/entities/Task.java | 10 +++++-- .../ResourcesPerDayModification.java | 4 +-- 6 files changed, 51 insertions(+), 12 deletions(-) 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()); }