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:
parent
fc01b5d223
commit
ebaa4a5127
6 changed files with 55 additions and 18 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue