From 95d210b39b05e34381cff65b947becf9c8b9aff1 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Tue, 23 Aug 2011 19:24:58 +0200 Subject: [PATCH] Fix issue when moving a task with an assignment function. Now assignment function is applied again in destination. For StretchesFunction a new method was needed in order to update stretches dates in destination. Actually, dates shouldn't be stored in Stretch class. This should be changed in the future. FEA: ItEr75S23FixAllocationModel --- .../planner/entities/AssignmentFunction.java | 20 +++++++++++++++ .../planner/entities/StretchesFunction.java | 25 ++++++++++++++++++- .../business/planner/entities/Task.java | 2 ++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AssignmentFunction.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AssignmentFunction.java index 8790e2aa3..1f290d42d 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AssignmentFunction.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/AssignmentFunction.java @@ -23,6 +23,8 @@ package org.navalplanner.business.planner.entities; import static org.navalplanner.business.i18n.I18nHelper._; +import java.util.List; + import org.navalplanner.business.common.BaseEntity; /** @@ -36,6 +38,24 @@ public class AssignmentFunction extends BaseEntity { return create(new AssignmentFunction()); } + /** + * This method goes over the {@link ResourceAllocation} list and apply the + * assignment function if it is defined. + * + * @param resourceAllocations + * List of {@link ResourceAllocation} + */ + public static void applyAssignmentFunctionsIfAny( + List> resourceAllocations) { + for (ResourceAllocation resourceAllocation : resourceAllocations) { + AssignmentFunction assignmentFunction = resourceAllocation + .getAssignmentFunction(); + if (assignmentFunction != null) { + assignmentFunction.applyTo(resourceAllocation); + } + } + } + public AssignmentFunction() { } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/StretchesFunction.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/StretchesFunction.java index 05d1c3c0a..82ef542e2 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/StretchesFunction.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/StretchesFunction.java @@ -29,7 +29,6 @@ import java.math.RoundingMode; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.Iterator; import java.util.List; @@ -375,6 +374,7 @@ public class StretchesFunction extends AssignmentFunction { if (resourceAllocation.getFirstNonConsolidatedDate() == null) { return; } + updateStretchesDates(resourceAllocation); taskEndDate = getTaskEndDate(resourceAllocation); getDesiredType().applyTo(resourceAllocation, this); type = getDesiredType(); @@ -453,4 +453,27 @@ public class StretchesFunction extends AssignmentFunction { this.taskEndDate = taskEndDate; } + /** + * {@link Stretch} is storing date in an attribute. When a task is moved + * these dates have to be updated. + * + * FIXME: Maybe in the future we could remove these dates as they could be + * calculated from task information. + */ + private void updateStretchesDates(ResourceAllocation resourceAllocation) { + Task task = resourceAllocation.getTask(); + + long startDate = task.getStartDate().getTime(); + long endDate = task.getEndDate().getTime(); + + for (Stretch stretch : stretches) { + // startDate + (percentage * (endDate - startDate)) + long stretchDate = startDate + + stretch.getLengthPercentage() + .multiply(new BigDecimal(endDate - startDate)) + .longValue(); + stretch.setDate(new LocalDate(stretchDate)); + } + } + } 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 a6ec3aa63..950b966fc 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 @@ -825,6 +825,8 @@ public class Task extends TaskElement implements ITaskPositionConstrained { default: throw new RuntimeException("cant handle: " + calculatedValue); } + + AssignmentFunction.applyAssignmentFunctionsIfAny(toBeModified); } private void markAsUnsatisfied(