From cf8482d8783b3430242f013309e9044e21eb4d22 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 15 Oct 2012 10:08:24 +0200 Subject: [PATCH] Bug #1542: Fix bug getting project end date from children tasks End date for root task is only updated while saving the project in the method: SaveCommand.updateRootTaskPosition. Now the end date is calculated checking the dates of the children tasks and getting the bigger one. FEA: ItEr77S04BugFixing --- .../planner/entities/TaskElement.java | 40 +++++++++++++++++ .../web/dashboard/DashboardModel.java | 12 +++-- .../web/planner/order/SaveCommandBuilder.java | 45 ++----------------- 3 files changed, 52 insertions(+), 45 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java index cebdfca88..3afb60855 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java @@ -793,4 +793,44 @@ public abstract class TaskElement extends BaseEntity { } } + public static IntraDayDate maxDate( + Collection tasksToSave) { + List endDates = toEndDates(tasksToSave); + return endDates.isEmpty() ? null : Collections.max(endDates); + } + + private static List toEndDates( + Collection tasksToSave) { + List result = new ArrayList(); + for (TaskElement taskElement : tasksToSave) { + IntraDayDate endDate = taskElement.getIntraDayEndDate(); + if (endDate != null) { + result.add(endDate); + } else { + LOG.warn("the task" + taskElement + " has null end date"); + } + } + return result; + } + + public static IntraDayDate minDate( + Collection tasksToSave) { + List startDates = toStartDates(tasksToSave); + return startDates.isEmpty() ? null : Collections.min(startDates); + } + + private static List toStartDates( + Collection tasksToSave) { + List result = new ArrayList(); + for (TaskElement taskElement : tasksToSave) { + IntraDayDate startDate = taskElement.getIntraDayStartDate(); + if (startDate != null) { + result.add(startDate); + } else { + LOG.warn("the task" + taskElement + " has null start date"); + } + } + return result; + } + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java index 1723f0f5b..4c2e28196 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java @@ -48,6 +48,7 @@ import org.libreplan.business.planner.entities.visitors.CalculateFinishedTasksEs import org.libreplan.business.planner.entities.visitors.CalculateFinishedTasksLagInCompletionVisitor; import org.libreplan.business.planner.entities.visitors.ResetTasksStatusVisitor; import org.libreplan.business.workingday.EffortDuration; +import org.libreplan.business.workingday.IntraDayDate; import org.libreplan.web.planner.order.PlanningStateCreator.PlanningState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; @@ -222,12 +223,14 @@ public class DashboardModel implements IDashboardModel { return; } TaskGroup rootTask = getRootTask(); - Days orderDuration = Days.daysBetween(rootTask.getStartAsLocalDate(), - rootTask.getEndAsLocalDate().plusDays(1)); + IntraDayDate endDate = TaskElement.maxDate(rootTask.getChildren()); + Days orderDuration = Days.daysBetween( + TaskElement.minDate(rootTask.getChildren()).getDate(), + endDate.asExclusiveEnd()); LocalDate deadLineAsLocalDate = LocalDate.fromDateFields(currentOrder .getDeadline()); - Days deadlineOffset = Days.daysBetween(rootTask.getEndAsLocalDate(), + Days deadlineOffset = Days.daysBetween(endDate.getDate(), deadLineAsLocalDate); BigDecimal outcome = new BigDecimal(deadlineOffset.getDays(), @@ -253,7 +256,8 @@ public class DashboardModel implements IDashboardModel { this.absoluteMarginWithDeadLine = null; return; } - absoluteMarginWithDeadLine = daysBetween(rootTask.getEndAsLocalDate(), + absoluteMarginWithDeadLine = daysBetween( + TaskElement.maxDate(rootTask.getChildren()).getDate(), LocalDate.fromDateFields(deadline)); } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java index 5545e6015..8a065b2ef 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java @@ -26,7 +26,6 @@ import static org.libreplan.web.I18nHelper._; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Set; import java.util.SortedSet; @@ -631,11 +630,13 @@ public class SaveCommandBuilder { } private void updateRootTaskPosition(TaskGroup rootTask) { - final IntraDayDate min = minDate(rootTask.getChildren()); + final IntraDayDate min = TaskElement + .minDate(rootTask.getChildren()); if (min != null) { rootTask.setIntraDayStartDate(min); } - final IntraDayDate max = maxDate(rootTask.getChildren()); + final IntraDayDate max = TaskElement + .maxDate(rootTask.getChildren()); if (max != null) { rootTask.setIntraDayEndDate(max); } @@ -867,44 +868,6 @@ public class SaveCommandBuilder { taskElement.getDependenciesWithThisDestination().size(); } - private IntraDayDate maxDate(Collection tasksToSave) { - List endDates = toEndDates(tasksToSave); - return endDates.isEmpty() ? null : Collections.max(endDates); - } - - private List toEndDates( - Collection tasksToSave) { - List result = new ArrayList(); - for (TaskElement taskElement : tasksToSave) { - IntraDayDate endDate = taskElement.getIntraDayEndDate(); - if (endDate != null) { - result.add(endDate); - } else { - LOG.warn("the task" + taskElement + " has null end date"); - } - } - return result; - } - - private IntraDayDate minDate(Collection tasksToSave) { - List startDates = toStartDates(tasksToSave); - return startDates.isEmpty() ? null : Collections.min(startDates); - } - - private List toStartDates( - Collection tasksToSave) { - List result = new ArrayList(); - for (TaskElement taskElement : tasksToSave) { - IntraDayDate startDate = taskElement.getIntraDayStartDate(); - if (startDate != null) { - result.add(startDate); - } else { - LOG.warn("the task" + taskElement + " has null start date"); - } - } - return result; - } - @Override public String getName() { return _("Save");