From 46ed8f5ea5e4728a25c0348c4fd57ebb452b7aee Mon Sep 17 00:00:00 2001 From: Diego Pino Garcia Date: Wed, 12 May 2010 11:48:38 +0200 Subject: [PATCH] ItEr58S10CUAsignacionRecursosLimitantesItEr57S11: Fix bug consider earlierStartDateBecauseOfGantt on assigning a limiting resource queue element --- .../planner/entities/DateAndHour.java | 6 ++- .../LimitingResourceQueueElementGap.java | 23 ++++++--- .../LimitingResourceQueueModel.java | 49 ++++++++++++------- .../LimitingResourcesController.java | 22 ++++++++- .../limitingResourcesLayout.zul | 4 +- 5 files changed, 75 insertions(+), 29 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/DateAndHour.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/DateAndHour.java index c3577d06f..ff5b37930 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/DateAndHour.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/DateAndHour.java @@ -39,11 +39,15 @@ public class DateAndHour implements Comparable { private int compareHour(int hour) { int deltaHour = this.hour - hour; - return (deltaHour != 0) ? Math.abs(deltaHour) : 0; + return (deltaHour != 0) ? deltaHour / Math.abs(deltaHour) : 0; } public String toString() { return date + "; " + hour; } + public static DateAndHour Max(DateAndHour arg0, DateAndHour arg1) { + return (arg0.compareTo(arg1) > 0) ? arg0 : arg1; + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/LimitingResourceQueueElementGap.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/LimitingResourceQueueElementGap.java index 512f49e60..a10bad800 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/LimitingResourceQueueElementGap.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/LimitingResourceQueueElementGap.java @@ -35,10 +35,6 @@ public class LimitingResourceQueueElementGap { - startHour; int hoursInBetween = calendar.getWorkableHours(startDate .plusDays(1), endDate.minusDays(1)); - if (hoursAtStart <= 0) { - startDate = startDate.plusDays(1); - startHour = 0; - } hoursInGap = hoursAtStart + hoursInBetween + endHour; } @@ -61,13 +57,26 @@ public class LimitingResourceQueueElementGap { } /** - * Returns true if hours for this gap is big enough for fitting hours + * Returns true if the gap starts after earlierStartDateBecauseOfGantt and + * if it's big enough for fitting candidate * * @param hours * @return */ - public boolean canFit(Integer hours) { - return hoursInGap.compareTo(hours) >= 0; + public boolean canFit(LimitingResourceQueueElement candidate) { + final LocalDate earlierStartDateBecauseOfGantt = new LocalDate( + candidate.getEarlierStartDateBecauseOfGantt()); + final LocalDate startDate = startTime.getDate(); + if (earlierStartDateBecauseOfGantt.isBefore(startDate) + || earlierStartDateBecauseOfGantt.isEqual(startDate)) { + return hoursInGap - candidate.getIntentedTotalHours() >= 0; + } + return false; + } + + public String toString() { + return startTime.getDate() + " - " + startTime.getHour() + "; " + + endTime.getDate() + " - " + endTime.getHour(); } } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java index 8a2c08bbb..3f27137e7 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourceQueueModel.java @@ -347,22 +347,27 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { final SortedSet elements = queue.getLimitingResourceQueueElements(); if (!elements.isEmpty()) { final List gapList = buildGapList(candidate, elements); - final DateAndHour startTime = findStartTimeInGapList(candidate - .getIntentedTotalHours(), gapList); - return (startTime != null) ? startTime : afterLastElement(elements); + final DateAndHour startTime = findStartTimeInGapList(candidate, gapList); + return (startTime != null) ? startTime : afterLastElement(candidate, elements); } - return new DateAndHour(new LocalDate(candidate.getEarlierStartDateBecauseOfGantt()), 0); + return getStartTimeBecauseOfGantt(candidate); } - private DateAndHour afterLastElement( + private DateAndHour afterLastElement(LimitingResourceQueueElement candidate, SortedSet elements) { - return elements.last().getEndTime(); + final DateAndHour lastElementEndTime = elements.last().getEndTime(); + final DateAndHour candidateStartTime = getStartTimeBecauseOfGantt(candidate); + return DateAndHour.Max(lastElementEndTime, candidateStartTime); } - private DateAndHour findStartTimeInGapList(Integer hours, + private DateAndHour getStartTimeBecauseOfGantt(LimitingResourceQueueElement element) { + return new DateAndHour(new LocalDate(element.getEarlierStartDateBecauseOfGantt()), 0); + } + + private DateAndHour findStartTimeInGapList(LimitingResourceQueueElement candidate, List gapList) { for (LimitingResourceQueueElementGap each : gapList) { - if (each.canFit(hours)) { + if (each.canFit(candidate)) { return each.getStartTime(); } } @@ -376,25 +381,33 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { // If start time of candidate element to fit in queue is before first // element, create a gap between candidate and the first element of the // queue - DateAndHour candidateTime = new DateAndHour(new LocalDate(candidate - .getEarlierStartDateBecauseOfGantt()), 0); + DateAndHour startTimeBecauseOfGantt = getStartTimeBecauseOfGantt(candidate); final LimitingResourceQueueElement firstElement = elements.first(); - if (candidateTime.compareTo(firstElement.getStartTime()) <= 0) { - result.add(createGap(firstElement.getResource(), candidateTime, + if (startTimeBecauseOfGantt.compareTo(firstElement.getStartTime()) < 0) { + result.add(createGap(firstElement.getResource(), startTimeBecauseOfGantt, firstElement.getStartTime())); } + LimitingResourceQueueElement current, next; // Only include gaps from candidate start time on for (Iterator i = elements.iterator(); i .hasNext();) { - LimitingResourceQueueElement current = i.next(); + + current = i.next(); if (i.hasNext()) { - LimitingResourceQueueElement next = i.next(); - if (candidateTime.compareTo(current.getEndTime()) > 1) { - final DateAndHour startTime = current.getEndTime(); - final DateAndHour endTime = next.getStartTime(); - result.add(createGap(current.getResource(), startTime, endTime)); + next = i.next(); + DateAndHour startTime = current.getEndTime(); + final DateAndHour endTime = next.getStartTime(); + + if (startTime.compareTo(startTimeBecauseOfGantt) <= 0) { + if (endTime.compareTo(startTimeBecauseOfGantt) <= 0) { + // Start and end of the gap are before earlierStartDateBecauseOfGanttTime + continue; + } + // earliestStartDateBecauseOfGantt is in between + startTime = startTimeBecauseOfGantt; } + result.add(createGap(current.getResource(), startTime, endTime)); } } return result; diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java index 9c77424f2..b1d6ef570 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/limitingresources/LimitingResourcesController.java @@ -34,6 +34,7 @@ import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.planner.entities.GenericResourceAllocation; import org.navalplanner.business.planner.entities.LimitingResourceQueueElement; import org.navalplanner.business.planner.entities.Task; +import org.navalplanner.business.resources.entities.Resource; import org.navalplanner.web.common.Util; import org.navalplanner.web.limitingresources.LimitingResourcesPanel.IToolbarCommand; import org.navalplanner.web.planner.order.BankHolidaysMarker; @@ -189,12 +190,12 @@ public class LimitingResourcesController implements Composer { List result = new ArrayList(); for (LimitingResourceQueueElement each : limitingResourceQueueModel .getUnassignedLimitingResourceQueueElements()) { - result.add(toUnassignedLimitingResourceQueueElementDTO(each)); + result.add(toLimitingResourceQueueElementDTO(each)); } return result; } - private LimitingResourceQueueElementDTO toUnassignedLimitingResourceQueueElementDTO( + private LimitingResourceQueueElementDTO toLimitingResourceQueueElementDTO( LimitingResourceQueueElement element) { final Task task = element.getResourceAllocation().getTask(); final Order order = limitingResourceQueueModel.getOrderByTask(task); @@ -221,6 +222,10 @@ public class LimitingResourcesController implements Composer { private String date; + private Integer hoursToAllocate; + + private String resourceName; + public LimitingResourceQueueElementDTO( LimitingResourceQueueElement element, String orderName, String taskName, Date date) { @@ -228,6 +233,9 @@ public class LimitingResourcesController implements Composer { this.orderName = orderName; this.taskName = taskName; this.date = DATE_FORMAT.format(date); + this.hoursToAllocate = element.getIntentedTotalHours(); + final Resource resource = element.getResource(); + this.resourceName = (resource != null) ? resource.getName() : ""; } public LimitingResourceQueueElement getOriginal() { @@ -246,6 +254,14 @@ public class LimitingResourcesController implements Composer { return date; } + public Integer getHoursToAllocate() { + return (hoursToAllocate != null) ? hoursToAllocate : 0; + } + + public String getResourceName() { + return resourceName; + } + } public void filterBy(Order order) { @@ -278,7 +294,9 @@ public class LimitingResourcesController implements Composer { row.appendChild(label(element.getTaskName())); row.appendChild(label(element.getOrderName())); + row.appendChild(label(element.getResourceName())); row.appendChild(label(element.getDate())); + row.appendChild(label(element.getHoursToAllocate().toString())); row.appendChild(assignButton(element)); row.appendChild(automaticQueueing(element)); } diff --git a/navalplanner-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul b/navalplanner-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul index 4785c8b01..5b8ccc273 100644 --- a/navalplanner-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul +++ b/navalplanner-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul @@ -114,8 +114,10 @@ resourcesLoadPanel = self; style="margin: 10px" > - + + +