From e5c2dadf16dcfef6096576239c844913d91a8bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Fri, 13 May 2011 19:26:53 +0200 Subject: [PATCH] Move calculation of efforts to Consolidation FEA: ItEr74S04BugFixing --- .../planner/entities/ResourceAllocation.java | 44 +++++-------------- .../consolidations/Consolidation.java | 42 ++++++++++++++++++ .../AdvanceConsolidationModel.java | 36 ++++----------- 3 files changed, 61 insertions(+), 61 deletions(-) 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 8a50feee0..46bf4bc84 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 @@ -26,7 +26,6 @@ import static org.navalplanner.business.workingday.EffortDuration.seconds; import static org.navalplanner.business.workingday.EffortDuration.zero; import java.math.BigDecimal; -import java.math.RoundingMode; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -59,6 +58,7 @@ import org.navalplanner.business.planner.entities.allocationalgorithms.Allocator import org.navalplanner.business.planner.entities.allocationalgorithms.EffortModification; import org.navalplanner.business.planner.entities.allocationalgorithms.ResourcesPerDayModification; import org.navalplanner.business.planner.entities.allocationalgorithms.UntilFillingHoursAllocator; +import org.navalplanner.business.planner.entities.consolidations.Consolidation; import org.navalplanner.business.planner.limiting.entities.LimitingResourceQueueElement; import org.navalplanner.business.resources.daos.IResourcesSearcher; import org.navalplanner.business.resources.entities.Criterion; @@ -615,43 +615,16 @@ public abstract class ResourceAllocation extends return; } intendedNonConsolidatedEffort = getNonConsolidatedEffort(); - if ((task.getConsolidation() == null) - || (task.getConsolidation().getConsolidatedValues().isEmpty())) { + Consolidation consolidation = task.getConsolidation(); + if (consolidation == null) { intendedTotalAssignment = intendedNonConsolidatedEffort; + } else if (consolidation.isCompletelyConsolidated()) { + intendedTotalAssignment = getConsolidatedEffort(); } else { - if (isCompletelyConsolidated()) { - intendedTotalAssignment = getConsolidatedEffort(); - } else { - intendedTotalAssignment = EffortDuration - .seconds(new BigDecimal(getNonConsolidatedEffort() - .getSeconds()).divide( - getUnconsolidatedPercentage(), - RoundingMode.DOWN).intValue()); - } + intendedTotalAssignment = consolidation.getTotalFromNotConsolidated(getNonConsolidatedEffort()); } } - private boolean isCompletelyConsolidated() { - return hasConsolidationValues() - && getUnconsolidatedPercentage().setScale(2).equals( - BigDecimal.ZERO.setScale(2)); - } - - private boolean hasConsolidationValues() { - return task.getConsolidation() != null - && !task.getConsolidation().getConsolidatedValues().isEmpty(); - } - - private BigDecimal getUnconsolidatedPercentage() { - assert hasConsolidationValues(); - BigDecimal lastConslidation = task.getConsolidation() - .getConsolidatedValues().last().getValue(); - BigDecimal unconsolitedPercentage = BigDecimal.ONE - .subtract(lastConslidation.setScale(2).divide( - new BigDecimal(100), RoundingMode.DOWN)); - return unconsolitedPercentage; - } - @NotNull public EffortDuration getIntendedTotalAssigment() { return intendedTotalAssignment; @@ -1062,6 +1035,11 @@ public abstract class ResourceAllocation extends } } + private boolean isCompletelyConsolidated() { + return task.getConsolidation() != null + && task.getConsolidation().isCompletelyConsolidated(); + } + public boolean isUnsatisfied() { return !isSatisfied(); } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/consolidations/Consolidation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/consolidations/Consolidation.java index 383dd717b..b4af5b197 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/consolidations/Consolidation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/consolidations/Consolidation.java @@ -21,11 +21,14 @@ package org.navalplanner.business.planner.entities.consolidations; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.SortedSet; import org.joda.time.LocalDate; import org.navalplanner.business.common.BaseEntity; import org.navalplanner.business.planner.entities.Task; +import org.navalplanner.business.workingday.EffortDuration; /** * @author Susana Montes Pedreira @@ -62,4 +65,43 @@ public abstract class Consolidation extends BaseEntity { .last().getDate(); } + public EffortDuration getNotConsolidated(EffortDuration total) { + BigDecimal notConsolidatedProportion = getNotConsolidatedProportion(); + int notConsolidatedSecons = notConsolidatedProportion.multiply( + new BigDecimal(total.getSeconds())).intValue(); + return EffortDuration.seconds(notConsolidatedSecons); + } + + public EffortDuration getTotalFromNotConsolidated( + EffortDuration notConsolidated) { + if (isCompletelyConsolidated()) { + throw new IllegalStateException( + "Can't calculate the total using a completely consolidated consolidation"); + } + BigDecimal notConsolidatedDecimal = new BigDecimal( + notConsolidated.getSeconds()).setScale(2); + int totalSeconds = notConsolidatedDecimal + .divide(getNotConsolidatedProportion(), RoundingMode.DOWN) + .intValue(); + return EffortDuration.seconds(totalSeconds); + } + + public boolean isCompletelyConsolidated() { + return getNotConsolidatedProportion().signum() == 0; + } + + private BigDecimal getNotConsolidatedProportion() { + return BigDecimal.ONE.subtract(getConsolidatedProportion()); + } + + private BigDecimal getConsolidatedProportion() { + return getConsolidatedPercentage().setScale(2).divide( + new BigDecimal(100), RoundingMode.DOWN); + } + + private BigDecimal getConsolidatedPercentage() { + return getConsolidatedValues().isEmpty() ? BigDecimal.ZERO + : getConsolidatedValues().last().getValue(); + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationModel.java index e38988062..d0edfc781 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/consolidations/AdvanceConsolidationModel.java @@ -23,8 +23,6 @@ package org.navalplanner.web.planner.consolidations; import static org.navalplanner.web.I18nHelper._; -import java.math.BigDecimal; -import java.math.RoundingMode; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -217,17 +215,10 @@ public class AdvanceConsolidationModel implements IAdvanceConsolidationModel { LocalDate endExclusive = LocalDate.fromDateFields(task .getEndDate()); - int pendingSeconds = BigDecimal.ONE - .subtract( - value.getValue().setScale(2).divide( - new BigDecimal(100), RoundingMode.DOWN)) - .multiply( - new BigDecimal(resourceAllocation - .getIntendedTotalAssigment() - .getSeconds())) - .intValue(); - EffortDuration pendingEffort = EffortDuration - .seconds(pendingSeconds); + EffortDuration pendingEffort = consolidation + .getNotConsolidated(resourceAllocation + .getIntendedTotalAssigment()); + resourceAllocation .setOnDayAssignmentRemoval(new DetachDayAssignmentOnRemoval()); @@ -321,21 +312,10 @@ public class AdvanceConsolidationModel implements IAdvanceConsolidationModel { for (ResourceAllocation resourceAllocation : allResourceAllocations) { resourceAllocation .setOnDayAssignmentRemoval(new DetachDayAssignmentOnRemoval()); - EffortDuration pendingEffort = resourceAllocation - .getIntendedTotalAssigment(); - if (!consolidation.getConsolidatedValues().isEmpty()) { - BigDecimal lastConslidation = task.getConsolidation() - .getConsolidatedValues().last().getValue(); - - pendingEffort = EffortDuration.seconds(BigDecimal.ONE - .subtract( - lastConslidation.setScale(2).divide( - new BigDecimal(100), - RoundingMode.DOWN)) - .multiply( - new BigDecimal(pendingEffort - .getSeconds())).intValue()); - } + EffortDuration pendingEffort = task.getConsolidation() + .getNotConsolidated( + resourceAllocation + .getIntendedTotalAssigment()); if (!taskEndDate.equals(endExclusive)) { if ((taskEndDate != null) && (endExclusive != null) && (taskEndDate.compareTo(endExclusive) <= 0)) {