Build Task dates correctly

Task's dates must also be calculated when the order's init date is
null.

FEA: ItEr64OTS03PlanificacionHaciaAtras
This commit is contained in:
Óscar González Fernández 2010-12-11 22:55:30 +01:00
parent 64b09ffbdd
commit 8603377361
7 changed files with 64 additions and 35 deletions

View file

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

View file

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

View file

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

View file

@ -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<Date> endDates = getEndDates(getChildren());
setEndDate(Collections.max(endDates));
}
private List<Date> getEndDates(Collection<? extends TaskElement> children) {
List<Date> result = new ArrayList<Date>();
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<IntraDayDate> getChildrenEndDates() {
List<IntraDayDate> result = new ArrayList<IntraDayDate>();
for (TaskElement each : getChildren()) {
result.add(each.getIntraDayEndDate());
}
return result;
}
public void updateCriticalPathProgress(List<TaskElement> criticalPath) {
Validate.isTrue(getParent() == null);
if (planningData == null) {

View file

@ -139,7 +139,7 @@ public class TaskMilestone extends TaskElement implements ITaskLeafConstraint {
}
@Override
protected void initializeEndDate() {
protected void initializeDates() {
// do nothing
}

View file

@ -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 <ogonzalez@igalia.com>
@ -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<TaskElement> 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;
}
}

View file

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