From 6db234ea40d176861ef3b6c71058b653aafbafe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 28 Dec 2009 11:47:31 +0100 Subject: [PATCH] ItEr41S11CUConfiguracionMaquinasItEr40S15: When moving a task the derived allocations are recalculated --- .../planner/entities/DerivedAllocation.java | 2 +- .../business/planner/entities/Task.java | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/DerivedAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/DerivedAllocation.java index be30a85b9..c3ecdc00f 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/DerivedAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/DerivedAllocation.java @@ -163,10 +163,10 @@ public class DerivedAllocation extends BaseEntity { public void resetAssignmentsTo(LocalDate startInclusive, LocalDate endExclusive, List newAssignments) { + checkAreValid(newAssignments); List toBeRemoved = DayAssignment.getAtInterval( getAssignments(), startInclusive, endExclusive); assignments.removeAll(toBeRemoved); - checkAreValid(newAssignments); assignments.addAll(DayAssignment.getAtInterval(newAssignments, startInclusive, endExclusive)); } 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 b962dec65..cc4c06436 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 @@ -39,6 +39,7 @@ import org.navalplanner.business.orders.entities.AggregatedHoursGroup; import org.navalplanner.business.orders.entities.HoursGroup; import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.orders.entities.TaskSource; +import org.navalplanner.business.planner.entities.DerivedAllocationGenerator.IWorkerFinder; import org.navalplanner.business.planner.entities.allocationalgorithms.HoursModification; import org.navalplanner.business.planner.entities.allocationalgorithms.ResourcesPerDayModification; import org.navalplanner.business.resources.entities.Criterion; @@ -337,12 +338,48 @@ public class Task extends TaskElement { default: throw new RuntimeException("cant handle: " + calculatedValue); } + updateDerived(copied); mergeAllocation(asLocalDate(getStartDate()), asLocalDate(getEndDate()), calculatedValue, Collections .> emptyList(), copied, Collections.> emptyList()); } + private void updateDerived(List allocations) { + for (ModifiedAllocation each : allocations) { + ResourceAllocation original = each.getOriginal(); + if (!original.getDerivedAllocations().isEmpty()) { + IWorkerFinder workersFinder = createFromExistentDerivedAllocationsFinder(original); + each.getModification().createDerived(workersFinder); + } + } + } + + private IWorkerFinder createFromExistentDerivedAllocationsFinder( + ResourceAllocation original) { + Set derivedAllocations = original + .getDerivedAllocations(); + final Set allWorkers = new HashSet(); + for (DerivedAllocation each : derivedAllocations) { + allWorkers.addAll(Resource.workers(each.getResources())); + } + return new IWorkerFinder() { + + @Override + public Collection findWorkersMatching( + Collection requiredCriterions) { + Collection result = new ArrayList(); + for (Worker each : allWorkers) { + if (each.satisfiesCriterions(requiredCriterions)) { + result.add(each); + } + } + return result; + } + }; + } + + private LocalDate asLocalDate(Date date) { return new LocalDate(date.getTime()); }