From b87384fa88d8506a3b68bbd085bbdb89a0cdd6bc Mon Sep 17 00:00:00 2001 From: Diego Pino Garcia Date: Tue, 14 Dec 2010 16:54:50 +0100 Subject: [PATCH] Calculate the latestEndDate where a limiting resource task could be allocated FEA: ItEr66OTS03AlgoritmosLimitantesItEr65OTS05 --- .../limiting/entities/DateAndHour.java | 5 ++- .../entities/InsertionRequirements.java | 33 ++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/DateAndHour.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/DateAndHour.java index 7f0e2c6e5..e7c6e66cb 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/DateAndHour.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/DateAndHour.java @@ -21,7 +21,6 @@ package org.navalplanner.business.planner.limiting.entities; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.Iterator; @@ -43,6 +42,10 @@ public class DateAndHour implements Comparable { return new DateAndHour(date, 0); } + public static DateAndHour from(IntraDayDate date) { + return new DateAndHour(date.getDate(), date.getEffortDuration().getHours()); + } + private LocalDate date; private Integer hour; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/InsertionRequirements.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/InsertionRequirements.java index f476839a5..c5e6d3da0 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/InsertionRequirements.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/limiting/entities/InsertionRequirements.java @@ -26,8 +26,12 @@ import java.util.ListIterator; import org.apache.commons.lang.Validate; import org.joda.time.LocalDate; +import org.navalplanner.business.planner.entities.Dependency; +import org.navalplanner.business.planner.entities.Task; +import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.business.planner.limiting.entities.Gap.GapOnQueue; import org.navalplanner.business.resources.entities.Resource; +import org.navalplanner.business.workingday.IntraDayDate; /** @@ -41,10 +45,13 @@ public class InsertionRequirements { private final DateAndHour earliestPossibleEnd; + private final DateAndHour latestPossibleEnd; + public static InsertionRequirements forElement( LimitingResourceQueueElement element, List dependenciesAffectingStart, List dependenciesAffectingEnd) { + return new InsertionRequirements(element, calculateEarliestPossibleStart( element, dependenciesAffectingStart), calculateEarliestPossibleEnd(element, dependenciesAffectingEnd)); @@ -87,13 +94,37 @@ public class InsertionRequirements { } private InsertionRequirements(LimitingResourceQueueElement element, - DateAndHour earliestPossibleStart, DateAndHour earliestPossibleEnd) { + DateAndHour earliestPossibleStart, + DateAndHour earliestPossibleEnd) { Validate.notNull(element); Validate.notNull(earliestPossibleStart); Validate.notNull(earliestPossibleEnd); this.element = element; this.earliestPossibleStart = earliestPossibleStart; this.earliestPossibleEnd = earliestPossibleEnd; + this.latestPossibleEnd = calculateLatestPlanningDate(element); + } + + /** + * Returns the earliest date from all the outgoing tasks from element + * + * @param element + * @return + */ + private DateAndHour calculateLatestPlanningDate(LimitingResourceQueueElement element) { + IntraDayDate result = null; + Task task = element.getTask(); + + for (Dependency each : task.getDependenciesWithThisOrigin()) { + if (each.getType().modifiesDestinationEnd()) { + TaskElement destination = each.getDestination(); + result = (result == null) ? destination.getIntraDayStartDate() + : IntraDayDate.min(result, + destination.getIntraDayStartDate()); + } + } + return (result != null) ? DateAndHour.from(result) : DateAndHour.from(new LocalDate( + element.getEarliestEndDateBecauseOfGantt())); } public boolean isPotentiallyValid(Gap gap) {