Fix as soon as possible constraint in backwards scheduling mode

A initDate must be provided to the getStartConstraints method in order
to calculate the ASAP constraint.

FEA: ItEr66S04BugFixing
This commit is contained in:
Óscar González Fernández 2010-12-22 19:29:21 +01:00
parent fc01b5d223
commit ebaa4a5127
6 changed files with 55 additions and 18 deletions

View file

@ -23,6 +23,7 @@ package org.navalplanner.web.common;
import static org.navalplanner.business.i18n.I18nHelper._;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
@ -364,12 +365,17 @@ public class TemplateModel implements ITemplateModel {
private void doReassignationsOn(Order order, Scenario from, Scenario to) {
copyAssignments(order, from, to);
installDependenciesEnforcer(order,
TemplateModelAdapter.create(to, LocalDate.fromDateFields(order.getDeadline())));
installDependenciesEnforcer(order, TemplateModelAdapter.create(to,
asLocalDate(order.getInitDate()),
asLocalDate(order.getDeadline())));
doReassignations(order, to);
doTheSaving(order);
}
private LocalDate asLocalDate(Date date) {
return date != null ? LocalDate.fromDateFields(date) : null;
}
private void copyAssignments(Order order, Scenario from, Scenario to) {
for (Task each : getTasksFrom(order)) {
each.copyAssignmentsFromOneScenarioToAnother(from, to);

View file

@ -34,15 +34,20 @@ public class TemplateModelAdapter implements
private final Scenario scenario;
private LocalDate deadline;
private final LocalDate orderInitDate;
public static TemplateModelAdapter create(Scenario scenario, LocalDate deadline) {
return new TemplateModelAdapter(scenario, deadline);
private final LocalDate deadline;
public static TemplateModelAdapter create(Scenario scenario,
LocalDate initDate, LocalDate deadline) {
return new TemplateModelAdapter(scenario, initDate, deadline);
}
private TemplateModelAdapter(Scenario scenario, LocalDate deadline) {
private TemplateModelAdapter(Scenario scenario, LocalDate orderInitDate,
LocalDate deadline) {
Validate.notNull(scenario);
this.scenario = scenario;
this.orderInitDate = orderInitDate;
this.deadline = deadline;
}
@ -84,7 +89,7 @@ public class TemplateModelAdapter implements
@Override
public List<Constraint<GanttDate>> getStartConstraintsFor(TaskElement task) {
return TaskElementAdapter.getStartConstraintsFor(task);
return TaskElementAdapter.getStartConstraintsFor(task, orderInitDate);
}
@Override

View file

@ -33,6 +33,8 @@ public interface ITaskElementAdapter extends IAdapterToTaskFundamentalProperties
void useScenario(Scenario scenario);
void setInitDate(LocalDate initDate);
void setDeadline(LocalDate deadline);
void setPreventCalculateResourcesText(boolean preventCalculateResourcesText);

View file

@ -39,8 +39,8 @@ import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
@ -63,17 +63,17 @@ import org.navalplanner.business.orders.entities.OrderStatusEnum;
import org.navalplanner.business.planner.daos.IResourceAllocationDAO;
import org.navalplanner.business.planner.daos.ITaskElementDAO;
import org.navalplanner.business.planner.entities.Dependency;
import org.navalplanner.business.planner.entities.Dependency.Type;
import org.navalplanner.business.planner.entities.GenericResourceAllocation;
import org.navalplanner.business.planner.entities.ITaskPositionConstrained;
import org.navalplanner.business.planner.entities.PositionConstraintType;
import org.navalplanner.business.planner.entities.ResourceAllocation;
import org.navalplanner.business.planner.entities.ResourceAllocation.Direction;
import org.navalplanner.business.planner.entities.SpecificResourceAllocation;
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.planner.entities.TaskPositionConstraint;
import org.navalplanner.business.planner.entities.Dependency.Type;
import org.navalplanner.business.planner.entities.ResourceAllocation.Direction;
import org.navalplanner.business.resources.daos.ICriterionDAO;
import org.navalplanner.business.resources.entities.Criterion;
import org.navalplanner.business.resources.entities.Resource;
@ -89,10 +89,10 @@ import org.zkoss.ganttz.IDatesMapper;
import org.zkoss.ganttz.adapters.DomainDependency;
import org.zkoss.ganttz.data.DependencyType;
import org.zkoss.ganttz.data.GanttDate;
import org.zkoss.ganttz.data.ITaskFundamentalProperties;
import org.zkoss.ganttz.data.GanttDate.Cases;
import org.zkoss.ganttz.data.GanttDate.CustomDate;
import org.zkoss.ganttz.data.GanttDate.LocalDateBased;
import org.zkoss.ganttz.data.ITaskFundamentalProperties;
import org.zkoss.ganttz.data.constraint.Constraint;
/**
* Responsible of adaptating a {@link TaskElement} into a
@ -117,7 +117,7 @@ public class TaskElementAdapter implements ITaskElementAdapter {
}
public static List<Constraint<GanttDate>> getStartConstraintsFor(
TaskElement taskElement) {
TaskElement taskElement, LocalDate orderInitDate) {
if (taskElement instanceof ITaskPositionConstrained) {
ITaskPositionConstrained task = (ITaskPositionConstrained) taskElement;
TaskPositionConstraint startConstraint = task.getPositionConstraint();
@ -125,6 +125,10 @@ public class TaskElementAdapter implements ITaskElementAdapter {
.getConstraintType();
switch (constraintType) {
case AS_SOON_AS_POSSIBLE:
if (orderInitDate != null) {
return Collections
.singletonList(biggerOrEqualThan(toGantt(orderInitDate)));
}
return Collections.emptyList();
case START_IN_FIXED_DATE:
return Collections
@ -179,6 +183,8 @@ public class TaskElementAdapter implements ITaskElementAdapter {
private Scenario scenario;
private LocalDate initDate;
private LocalDate deadline;
@ -187,6 +193,11 @@ public class TaskElementAdapter implements ITaskElementAdapter {
this.scenario = scenario;
}
@Override
public void setInitDate(LocalDate initDate) {
this.initDate = initDate;
}
@Override
public void setDeadline(LocalDate deadline) {
this.deadline = deadline;
@ -862,7 +873,7 @@ public class TaskElementAdapter implements ITaskElementAdapter {
@Override
public List<Constraint<GanttDate>> getStartConstraints() {
return getStartConstraintsFor(this.taskElement);
return getStartConstraintsFor(this.taskElement, initDate);
}
@Override

View file

@ -94,8 +94,8 @@ import org.navalplanner.web.planner.calendar.ICalendarAllocationCommand;
import org.navalplanner.web.planner.chart.Chart;
import org.navalplanner.web.planner.chart.ChartFiller;
import org.navalplanner.web.planner.chart.EarnedValueChartFiller;
import org.navalplanner.web.planner.chart.IChartFiller;
import org.navalplanner.web.planner.chart.EarnedValueChartFiller.EarnedValueType;
import org.navalplanner.web.planner.chart.IChartFiller;
import org.navalplanner.web.planner.consolidations.AdvanceConsolidationController;
import org.navalplanner.web.planner.consolidations.IAdvanceConsolidationCommand;
import org.navalplanner.web.planner.milestone.IAddMilestoneCommand;
@ -1003,8 +1003,9 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel {
taskElementAdapter.useScenario(currentScenario);
planningState = createPlanningStateFor(planner, orderReloaded);
taskElementAdapter
.setDeadline(orderReloaded.getDeadline() != null ? LocalDate
.fromDateFields(orderReloaded.getDeadline()) : null);
.setInitDate(asLocalDate(orderReloaded.getInitDate()));
taskElementAdapter
.setDeadline(asLocalDate(orderReloaded.getDeadline()));
PlannerConfiguration<TaskElement> result = new PlannerConfiguration<TaskElement>(
taskElementAdapter,
new TaskElementNavigator(), planningState.getInitial());
@ -1016,6 +1017,10 @@ public abstract class OrderPlanningModel implements IOrderPlanningModel {
return result;
}
private LocalDate asLocalDate(Date date) {
return date != null ? LocalDate.fromDateFields(date) : null;
}
private PlanningState createPlanningStateFor(
Planner planner, Order orderReloaded) {
if (!orderReloaded.isSomeTaskElementScheduled()) {

View file

@ -24,6 +24,7 @@ import static org.navalplanner.web.planner.tabs.MultipleTabsPlannerController.BR
import static org.navalplanner.web.planner.tabs.MultipleTabsPlannerController.PLANNIFICATION;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@ -41,8 +42,8 @@ import org.navalplanner.business.planner.entities.Dependency;
import org.navalplanner.business.planner.entities.TaskElement;
import org.navalplanner.business.scenarios.IScenarioManager;
import org.navalplanner.business.scenarios.entities.Scenario;
import org.navalplanner.web.common.TemplateModelAdapter;
import org.navalplanner.web.common.TemplateModel.DependencyWithVisibility;
import org.navalplanner.web.common.TemplateModelAdapter;
import org.navalplanner.web.montecarlo.MonteCarloController;
import org.navalplanner.web.planner.order.OrderPlanningController;
import org.navalplanner.web.planner.tabs.CreatedOnDemandTab.IComponentCreator;
@ -175,7 +176,9 @@ public class MonteCarloTabCreator {
CriticalPathCalculator<TaskElement, DependencyWithVisibility> criticalPathCalculator = CriticalPathCalculator
.create();
IAdapter<TaskElement, DependencyWithVisibility> adapter = TemplateModelAdapter
.create(getCurrentScenario(), new LocalDate(order.getDeadline()));
.create(getCurrentScenario(),
asLocalDate(order.getInitDate()),
asLocalDate(order.getDeadline()));
GanttDiagramGraph<TaskElement, DependencyWithVisibility> graph = createFor(
order, adapter);
graph.addTasks(order.getAllChildrenAssociatedTaskElements());
@ -183,6 +186,11 @@ public class MonteCarloTabCreator {
return criticalPathCalculator.calculateCriticalPath(graph);
}
private LocalDate asLocalDate(Date date) {
return date != null ? LocalDate.fromDateFields(date)
: null;
}
private Scenario getCurrentScenario() {
IScenarioManager scenarioManager = Registry.getScenarioManager();
return scenarioManager.getCurrent();