From fc01b5d22309e7efa3838871bd140e5071236300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Wed, 22 Dec 2010 18:59:25 +0100 Subject: [PATCH] Take into account the allocation direction The scheduling window must do the scheduling according to the last allocation direction. The start and end dates are updated depending on the type of scheduling done. FEA: ItEr66S04BugFixing --- .../business/planner/entities/Task.java | 18 +++++++-- .../allocation/AllocationRowsHandler.java | 28 +++++++++++--- .../web/planner/allocation/FormBinder.java | 37 +++++++++++++++---- .../taskedition/TaskPropertiesController.java | 8 ++++ 4 files changed, 74 insertions(+), 17 deletions(-) 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 1883a43bb..bb6db7974 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 @@ -831,9 +831,14 @@ public class Task extends TaskElement implements ITaskPositionConstrained { } public Integer getWorkableDaysUntil(LocalDate end) { + return getWorkableDaysFrom(getStartAsLocalDate(), end); + } + + public Integer getWorkableDaysFrom(LocalDate startInclusive, + LocalDate endExclusive) { int result = 0; - LocalDate start = getStartAsLocalDate(); - for (LocalDate current = start; current.compareTo(end) < 0; current = current + for (LocalDate current = startInclusive; current + .compareTo(endExclusive) < 0; current = current .plusDays(1)) { if (isWorkable(current)) { result++; @@ -843,8 +848,13 @@ public class Task extends TaskElement implements ITaskPositionConstrained { } public LocalDate calculateEndGivenWorkableDays(int workableDays) { - LocalDate result = getIntraDayStartDate().getDate(); - return calculateEndGivenWorkableDays(result, workableDays); + return calculateEndGivenWorkableDays(getIntraDayStartDate().getDate(), + workableDays); + } + + public LocalDate calculateStartGivenWorkableDays(int workableDays) { + return calculateStartGivenWorkableDays(getEndAsLocalDate(), + workableDays); } private LocalDate calculateEndGivenWorkableDays(LocalDate start, diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/AllocationRowsHandler.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/AllocationRowsHandler.java index 6ac1d2c9a..a1daa7e48 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/AllocationRowsHandler.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/AllocationRowsHandler.java @@ -33,6 +33,7 @@ import org.navalplanner.business.planner.entities.CalculatedValue; import org.navalplanner.business.planner.entities.DerivedAllocationGenerator.IWorkerFinder; import org.navalplanner.business.planner.entities.ResourceAllocation; import org.navalplanner.business.planner.entities.ResourceAllocation.AllocationsSpecified.INotFulfilledReceiver; +import org.navalplanner.business.planner.entities.ResourceAllocation.Direction; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.allocationalgorithms.HoursModification; import org.navalplanner.business.planner.entities.allocationalgorithms.ResourcesPerDayModification; @@ -230,7 +231,7 @@ public class AllocationRowsHandler { calculateNumberOfHoursAllocation(); break; case END_DATE: - calculateEndDateAllocation(); + calculateEndDateOrStartDateAllocation(); break; case RESOURCES_PER_DAY: calculateResourcesPerDayAllocation(); @@ -249,14 +250,24 @@ public class AllocationRowsHandler { private void calculateNumberOfHoursAllocation() { List allocations = AllocationRow .createAndAssociate(task, currentRows); - ResourceAllocation.allocating(allocations).allocateUntil( - formBinder.getAllocationEnd()); + if (isForwardsAllocation()) { + ResourceAllocation.allocating(allocations).allocateUntil( + formBinder.getAllocationEnd()); + } else { + ResourceAllocation.allocating(allocations).allocateFromEndUntil( + formBinder.getAllocationStart()); + } } - private void calculateEndDateAllocation() { + private boolean isForwardsAllocation() { + return Direction.FORWARD.equals(task.getLastAllocationDirection()); + } + + private void calculateEndDateOrStartDateAllocation() { List allocations = AllocationRow .createAndAssociate(task, currentRows); ResourceAllocation.allocating(allocations).untilAllocating( + task.getLastAllocationDirection(), formBinder.getAssignedHours(), notFullfiledReceiver()); } @@ -279,8 +290,13 @@ public class AllocationRowsHandler { private void calculateResourcesPerDayAllocation() { List hours = AllocationRow .createHoursModificationsAndAssociate(task, currentRows); - ResourceAllocation.allocatingHours(hours).allocateUntil( - formBinder.getAllocationEnd()); + if (isForwardsAllocation()) { + ResourceAllocation.allocatingHours(hours).allocateUntil( + formBinder.getAllocationEnd()); + } else { + ResourceAllocation.allocatingHours(hours).allocateFromEndUntil( + formBinder.getAllocationStart()); + } } private Integer getWorkableDaysIfApplyable() { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/FormBinder.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/FormBinder.java index f2eab1590..0728513bb 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/FormBinder.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/allocation/FormBinder.java @@ -37,6 +37,7 @@ import org.joda.time.format.DateTimeFormatter; import org.navalplanner.business.common.ProportionalDistributor; import org.navalplanner.business.planner.entities.AggregateOfResourceAllocations; import org.navalplanner.business.planner.entities.CalculatedValue; +import org.navalplanner.business.planner.entities.ResourceAllocation.Direction; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.resources.entities.Criterion; import org.navalplanner.business.resources.entities.Resource; @@ -299,6 +300,11 @@ public class FormBinder { taskPropertiesController); } + private boolean isForwardAllocated() { + Direction direction = getTask().getLastAllocationDirection(); + return Direction.FORWARD.equals(direction); + } + class WorkableDaysAndDatesBinder { private Intbox taskWorkableDays; @@ -308,7 +314,7 @@ public class FormBinder { private Label labelTaskEnd; WorkableDaysAndDatesBinder(final Intbox taskWorkableDays, - Label labelTaskStart, final Label labelTaskEnd, + final Label labelTaskStart, final Label labelTaskEnd, final TaskPropertiesController taskPropertiesController) { this.taskWorkableDays = taskWorkableDays; this.labelTaskStart = labelTaskStart; @@ -321,10 +327,19 @@ public class FormBinder { public void onEvent(Event event) throws Exception { Task task = getTask(); Integer workableDays = taskWorkableDays.getValue(); - LocalDate newEndDate = task - .calculateEndGivenWorkableDays(workableDays); - taskPropertiesController.updateTaskEndDate(newEndDate); - showValueOfDateOn(labelTaskEnd, newEndDate); + if (isForwardAllocated()) { + LocalDate newEndDate = task + .calculateEndGivenWorkableDays(workableDays); + taskPropertiesController + .updateTaskEndDate(newEndDate); + showValueOfDateOn(labelTaskEnd, newEndDate); + } else { + LocalDate newStart = task + .calculateStartGivenWorkableDays(workableDays); + taskPropertiesController + .updateTaskStartDate(newStart); + showValueOfDateOn(labelTaskStart, newStart); + } } }); applyDisabledRules(); @@ -363,7 +378,7 @@ public class FormBinder { } private void clearDateAndDurationFields() { - labelTaskEnd.setValue(""); + (isForwardAllocated() ? labelTaskEnd : labelTaskStart).setValue(""); taskWorkableDays.setConstraint((Constraint) null); lastSpecifiedWorkableDays = taskWorkableDays.getValue(); taskWorkableDays.setValue(null); @@ -388,9 +403,12 @@ public class FormBinder { || aggregate.isEmpty()) { return; } + LocalDate start = aggregate.getStart().getDate(); LocalDate end = aggregate.getEnd().asExclusiveEnd(); + showValueOfDateOn(labelTaskStart, start); showValueOfDateOn(labelTaskEnd, end); - taskWorkableDays.setValue(getTask().getWorkableDaysUntil(end)); + taskWorkableDays + .setValue(getTask().getWorkableDaysFrom(start, end)); } private void showValueOfDateOn(final Label label, LocalDate date) { @@ -411,6 +429,11 @@ public class FormBinder { workableDaysAndDatesBinder.getValue()); } + public LocalDate getAllocationStart() { + return getTask().calculateStartGivenWorkableDays( + workableDaysAndDatesBinder.getValue()); + } + private Task getTask() { return allocationRowsHandler.getTask(); } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/TaskPropertiesController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/TaskPropertiesController.java index e773c8b5c..7380fd4b8 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/TaskPropertiesController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/taskedition/TaskPropertiesController.java @@ -196,6 +196,8 @@ public class TaskPropertiesController extends GenericForwardComposer { private Intbox duration; + private Datebox startDateBox; + private Datebox endDateBox; private Combobox startConstraintTypes; @@ -706,4 +708,10 @@ public class TaskPropertiesController extends GenericForwardComposer { getGanttTaskDTO().endDate = endDate.toDateTimeAtStartOfDay().toDate(); Util.reloadBindings(endDateBox); } + + public void updateTaskStartDate(LocalDate newStart) { + getGanttTaskDTO().beginDate = newStart.toDateTimeAtStartOfDay() + .toDate(); + Util.reloadBindings(startDateBox); + } }