diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java index 4947700ab..eca2743c3 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java @@ -50,6 +50,8 @@ import org.libreplan.business.orders.entities.HoursGroup; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.SumChargedEffort; import org.libreplan.business.orders.entities.TaskSource; +import org.libreplan.business.planner.entities.AssignedEffortForResource.IAssignedEffortForResource; +import org.libreplan.business.planner.entities.AssignedEffortForResource.WithTheLoadOf; import org.libreplan.business.planner.entities.DayAssignment.FilterType; import org.libreplan.business.planner.entities.Dependency.Type; import org.libreplan.business.planner.entities.DerivedAllocationGenerator.IWorkerFinder; @@ -365,7 +367,7 @@ public class Task extends TaskElement implements ITaskPositionConstrained { } public static List> modified( - Collection collection) { + Collection collection) { List> result = new ArrayList>(); for (ModifiedAllocation modifiedAllocation : collection) { result.add(modifiedAllocation.getModification()); @@ -373,6 +375,15 @@ public class Task extends TaskElement implements ITaskPositionConstrained { return result; } + public static List> originals( + Collection modifiedAllocations) { + List> result = new ArrayList>(); + for (ModifiedAllocation each : modifiedAllocations) { + result.add(each.getOriginal()); + } + return result; + } + private final ResourceAllocation original; private final ResourceAllocation modification; @@ -741,6 +752,7 @@ public class Task extends TaskElement implements ITaskPositionConstrained { if (toBeModified.isEmpty()) { return; } + setCustomAssignedEffortForResource(copied); doAllocation(strategy, direction, toBeModified); updateDerived(copied); @@ -754,6 +766,24 @@ public class Task extends TaskElement implements ITaskPositionConstrained { } } + private void setCustomAssignedEffortForResource( + List modifiedAllocations) { + List> originals = ModifiedAllocation + .originals(modifiedAllocations); + IAssignedEffortForResource discounting = AssignedEffortForResource + .effortDiscounting(originals); + List> beingModified = ModifiedAllocation + .modified(modifiedAllocations); + WithTheLoadOf allNewLoad = AssignedEffortForResource + .withTheLoadOf(beingModified); + List generic = ResourceAllocation.getOfType( + GenericResourceAllocation.class, beingModified); + for (GenericResourceAllocation each : generic) { + each.customAssignedEffortForResource(AssignedEffortForResource.sum( + allNewLoad.withoutConsidering(each), discounting)); + } + } + private void doAllocation(WithPotentiallyNewResources strategy, Direction direction, List> toBeModified) { ModificationsResult modificationsResult = strategy