From 8603377361f7702b03e9dd85ccd1794bc35b04ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Sat, 11 Dec 2010 22:55:30 +0100 Subject: [PATCH] Build Task dates correctly Task's dates must also be calculated when the order's init date is null. FEA: ItEr64OTS03PlanificacionHaciaAtras --- .../business/orders/entities/TaskSource.java | 4 +- .../business/planner/entities/Task.java | 20 ++++++--- .../planner/entities/TaskElement.java | 17 +++++--- .../business/planner/entities/TaskGroup.java | 42 +++++++++++-------- .../planner/entities/TaskMilestone.java | 2 +- .../test/planner/entities/TaskGroupTest.java | 12 +++++- .../LimitingResourceQueueModel.java | 2 +- 7 files changed, 64 insertions(+), 35 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/TaskSource.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/TaskSource.java index 0f04c7318..6411d8a19 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/TaskSource.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/entities/TaskSource.java @@ -123,11 +123,11 @@ public class TaskSource extends BaseEntity { task.setStartDate(orderElement.getOrder().getInitDate()); } if (task.getEndDate() == null) { - task.initializeEndDateIfDoesntExist(); + task.initializeDatesIfNeeded(); } if (task.getSatisfiedResourceAllocations().isEmpty()) { task.setEndDate(null); - task.initializeEndDateIfDoesntExist(); + task.initializeDatesIfNeeded(); } task.updateDeadlineFromOrderElement(); } 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 e18dd0800..c64a7889f 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 @@ -68,12 +68,12 @@ public class Task extends TaskElement implements ITaskLeafConstraint { OrderElement orderElement = taskSource.getOrderElement(); orderElement.applyStartConstraintIfNeededTo(task); Task result = create(task, taskSource); - result.initializeEndDate(); + result.initializeDates(); return result; } @Override - protected void initializeEndDate() { + protected void initializeDates() { EffortDuration workHours = EffortDuration.hours(getWorkHours()); EffortDuration effortStandardPerDay = EffortDuration.hours(8); @@ -81,10 +81,18 @@ public class Task extends TaskElement implements ITaskLeafConstraint { EffortDuration remainder = workHours.remainderFor(effortStandardPerDay); IntraDayDate start = getIntraDayStartDate(); - IntraDayDate newEnd = IntraDayDate.create( - start.getDate().plusDays(daysElapsed), start - .getEffortDuration().plus(remainder)); - setIntraDayEndDate(newEnd); + if (start != null) { + IntraDayDate calculatedEnd = IntraDayDate.create( + start.getDate().plusDays(daysElapsed), start + .getEffortDuration().plus(remainder)); + setIntraDayEndDate(calculatedEnd); + } else { + IntraDayDate end = getIntraDayEndDate(); + IntraDayDate calculatedStart = IntraDayDate.startOfDay(end + .getDate().minusDays( + daysElapsed + (remainder.isZero() ? 0 : 1))); + setIntraDayStartDate(calculatedStart); + } } private CalculatedValue calculatedValue = CalculatedValue.END_DATE; diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java index 52d9a85c2..e0c0ceaf5 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java @@ -42,6 +42,7 @@ import org.joda.time.LocalDate; import org.navalplanner.business.calendars.entities.BaseCalendar; import org.navalplanner.business.common.BaseEntity; import org.navalplanner.business.common.entities.ProgressType; +import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.orders.entities.TaskSource; import org.navalplanner.business.planner.entities.Dependency.Type; @@ -106,8 +107,12 @@ public abstract class TaskElement extends BaseEntity { taskElement.taskSource = taskSource; taskElement.updateDeadlineFromOrderElement(); taskElement.setName(taskElement.getOrderElement().getName()); - taskElement.setStartDate(taskElement.getOrderElement().getOrder() - .getInitDate()); + Order order = taskElement.getOrderElement().getOrder(); + if (order.isScheduleBackwards()) { + taskElement.setEndDate(order.getDeadline()); + } else { + taskElement.setStartDate(order.getInitDate()); + } return create(taskElement); } @@ -144,13 +149,13 @@ public abstract class TaskElement extends BaseEntity { private Boolean simplifiedAssignedStatusCalculationEnabled = false; - public void initializeEndDateIfDoesntExist() { - if (getEndDate() == null) { - initializeEndDate(); + public void initializeDatesIfNeeded() { + if (getIntraDayEndDate() == null || getIntraDayStartDate() == null) { + initializeDates(); } } - protected abstract void initializeEndDate(); + protected abstract void initializeDates(); public void updateDeadlineFromOrderElement() { Date newDeadline = this.taskSource.getOrderElement().getDeadline(); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskGroup.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskGroup.java index cc56734f2..ca6a51e98 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskGroup.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskGroup.java @@ -22,9 +22,7 @@ package org.navalplanner.business.planner.entities; import java.math.BigDecimal; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; -import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.ListIterator; @@ -83,10 +81,15 @@ public class TaskGroup extends TaskElement { Validate.notNull(task); task.setParent(this); addTaskElement(taskElements.size(), task); - Date newPossibleEndDate = task.getEndDate(); - if (getEndDate() == null - || getEndDate().compareTo(newPossibleEndDate) < 0) { - setEndDate(newPossibleEndDate); + IntraDayDate newPossibleEndDate = task.getIntraDayEndDate(); + if (getIntraDayEndDate() == null + || getIntraDayEndDate().compareTo(newPossibleEndDate) < 0) { + setIntraDayEndDate(newPossibleEndDate); + } + IntraDayDate newPossibleStart = task.getIntraDayStartDate(); + if (getIntraDayStartDate() == null + || getIntraDayStartDate().compareTo(newPossibleStart) > 0) { + setIntraDayStartDate(newPossibleStart); } } @@ -187,18 +190,9 @@ public class TaskGroup extends TaskElement { } @Override - protected void initializeEndDate() { - List endDates = getEndDates(getChildren()); - setEndDate(Collections.max(endDates)); - } - - private List getEndDates(Collection children) { - List result = new ArrayList(); - for (TaskElement each : children) { - Validate.notNull(each.getEndDate()); - result.add(each.getEndDate()); - } - return result; + protected void initializeDates() { + setIntraDayStartDate(getSmallestStartDateFromChildren()); + setIntraDayEndDate(getBiggestEndDateFromChildren()); } @Override @@ -233,6 +227,18 @@ public class TaskGroup extends TaskElement { return result; } + public IntraDayDate getBiggestEndDateFromChildren() { + return Collections.max(getChildrenEndDates()); + } + + private List getChildrenEndDates() { + List result = new ArrayList(); + for (TaskElement each : getChildren()) { + result.add(each.getIntraDayEndDate()); + } + return result; + } + public void updateCriticalPathProgress(List criticalPath) { Validate.isTrue(getParent() == null); if (planningData == null) { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskMilestone.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskMilestone.java index 5bd7c2e71..01ac1ca2f 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskMilestone.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskMilestone.java @@ -139,7 +139,7 @@ public class TaskMilestone extends TaskElement implements ITaskLeafConstraint { } @Override - protected void initializeEndDate() { + protected void initializeDates() { // do nothing } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskGroupTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskGroupTest.java index 7b2bf5c18..b699017a9 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskGroupTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/TaskGroupTest.java @@ -28,6 +28,7 @@ import java.util.Arrays; import java.util.Date; import java.util.List; +import org.joda.time.LocalDate; import org.junit.Test; import org.navalplanner.business.orders.entities.HoursGroup; import org.navalplanner.business.orders.entities.Order; @@ -37,6 +38,7 @@ import org.navalplanner.business.orders.entities.TaskSource; import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; import org.navalplanner.business.planner.entities.TaskGroup; +import org.navalplanner.business.workingday.IntraDayDate; /** * @author Óscar González Fernández @@ -55,9 +57,14 @@ public class TaskGroupTest { assertTrue("a task group has no task elements initially", tasks .isEmpty()); TaskElement child1 = new Task(); + LocalDate start = new LocalDate(2000, 10, 20); + child1.setIntraDayStartDate(IntraDayDate.startOfDay(start)); + child1.setIntraDayEndDate(IntraDayDate.startOfDay(start.plusDays(10))); taskGroup.addTaskElement(child1); + TaskGroup child2 = createValidTaskGroup(); taskGroup.addTaskElement(child2); + List taskElements = taskGroup.getChildren(); assertThat(taskElements.size(), equalTo(2)); assertThat(taskGroup.getChildren(), equalTo(Arrays.asList(child1, @@ -93,7 +100,10 @@ public class TaskGroupTest { .mockSchedulingDataForVersion(orderLine); TaskSource taskSource = TaskSource.create(version, Arrays .asList(hoursGroup)); - return TaskGroup.create(taskSource); + TaskGroup result = TaskGroup.create(taskSource); + result.setIntraDayEndDate(IntraDayDate.startOfDay(result + .getIntraDayStartDate().getDate().plusDays(10))); + return result; } } 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 29df14d85..f7cbc0cc2 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 @@ -775,7 +775,7 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { TaskElement parent = task; while(parent != null) { parent.setIntraDayEndDate(null); - parent.initializeEndDateIfDoesntExist(); + parent.initializeDatesIfNeeded(); taskDAO.save(parent); parent = parent.getParent(); }