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
This commit is contained in:
Manuel Rego Casasnovas 2012-10-15 10:08:24 +02:00
parent d4fa4017e5
commit cf8482d878
3 changed files with 52 additions and 45 deletions

View file

@ -793,4 +793,44 @@ public abstract class TaskElement extends BaseEntity {
}
}
public static IntraDayDate maxDate(
Collection<? extends TaskElement> tasksToSave) {
List<IntraDayDate> endDates = toEndDates(tasksToSave);
return endDates.isEmpty() ? null : Collections.max(endDates);
}
private static List<IntraDayDate> toEndDates(
Collection<? extends TaskElement> tasksToSave) {
List<IntraDayDate> result = new ArrayList<IntraDayDate>();
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<? extends TaskElement> tasksToSave) {
List<IntraDayDate> startDates = toStartDates(tasksToSave);
return startDates.isEmpty() ? null : Collections.min(startDates);
}
private static List<IntraDayDate> toStartDates(
Collection<? extends TaskElement> tasksToSave) {
List<IntraDayDate> result = new ArrayList<IntraDayDate>();
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;
}
}

View file

@ -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));
}

View file

@ -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<? extends TaskElement> tasksToSave) {
List<IntraDayDate> endDates = toEndDates(tasksToSave);
return endDates.isEmpty() ? null : Collections.max(endDates);
}
private List<IntraDayDate> toEndDates(
Collection<? extends TaskElement> tasksToSave) {
List<IntraDayDate> result = new ArrayList<IntraDayDate>();
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<? extends TaskElement> tasksToSave) {
List<IntraDayDate> startDates = toStartDates(tasksToSave);
return startDates.isEmpty() ? null : Collections.min(startDates);
}
private List<IntraDayDate> toStartDates(
Collection<? extends TaskElement> tasksToSave) {
List<IntraDayDate> result = new ArrayList<IntraDayDate>();
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");