diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/TemplateModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/TemplateModel.java index bacd1b7b6..3cc6076d0 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/TemplateModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/TemplateModel.java @@ -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); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/TemplateModelAdapter.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/TemplateModelAdapter.java index d87e9408c..31369ea7a 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/TemplateModelAdapter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/TemplateModelAdapter.java @@ -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> getStartConstraintsFor(TaskElement task) { - return TaskElementAdapter.getStartConstraintsFor(task); + return TaskElementAdapter.getStartConstraintsFor(task, orderInitDate); } @Override diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ITaskElementAdapter.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ITaskElementAdapter.java index affe0e8a7..e971774d0 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ITaskElementAdapter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/ITaskElementAdapter.java @@ -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); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java index 1fda38c92..37e643966 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/TaskElementAdapter.java @@ -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> 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> getStartConstraints() { - return getStartConstraintsFor(this.taskElement); + return getStartConstraintsFor(this.taskElement, initDate); } @Override diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningModel.java index 72105e35b..d4f4e3237 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/order/OrderPlanningModel.java @@ -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 result = new PlannerConfiguration( 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()) { diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/MonteCarloTabCreator.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/MonteCarloTabCreator.java index 65ed77dd9..c63ac35dc 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/MonteCarloTabCreator.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/planner/tabs/MonteCarloTabCreator.java @@ -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 criticalPathCalculator = CriticalPathCalculator .create(); IAdapter adapter = TemplateModelAdapter - .create(getCurrentScenario(), new LocalDate(order.getDeadline())); + .create(getCurrentScenario(), + asLocalDate(order.getInitDate()), + asLocalDate(order.getDeadline())); GanttDiagramGraph 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();