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:
parent
64b09ffbdd
commit
8603377361
7 changed files with 64 additions and 35 deletions
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ public class TaskMilestone extends TaskElement implements ITaskLeafConstraint {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected void initializeEndDate() {
|
||||
protected void initializeDates() {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue