diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/ITaskPositionConstrained.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/ITaskPositionConstrained.java index ed0bafa6f..087f234fb 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/ITaskPositionConstrained.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/ITaskPositionConstrained.java @@ -31,5 +31,5 @@ public interface ITaskPositionConstrained { TaskPositionConstraint getPositionConstraint(); - void explicityMoved(IntraDayDate date); + void explicityMoved(IntraDayDate startDate, IntraDayDate endDate); } \ No newline at end of file diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java index 79f96c4b9..be3ba846c 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java @@ -20,6 +20,8 @@ */ package org.libreplan.business.planner.entities; +import org.libreplan.business.orders.entities.Order.SchedulingMode; + /** * Enum with all possible ways of calculating the start of a task
@@ -29,7 +31,7 @@ public enum PositionConstraintType { AS_SOON_AS_POSSIBLE(false, _("as soon as possible")) { @Override - public PositionConstraintType newTypeAfterMoved() { + public PositionConstraintType newTypeAfterMoved(SchedulingMode mode) { return START_NOT_EARLIER_THAN; } @@ -41,8 +43,11 @@ public enum PositionConstraintType { START_NOT_EARLIER_THAN(true, _("start not earlier than")) { @Override - public PositionConstraintType newTypeAfterMoved() { - return START_NOT_EARLIER_THAN; + public PositionConstraintType newTypeAfterMoved(SchedulingMode mode) { + if(mode == SchedulingMode.FORWARD) + return START_NOT_EARLIER_THAN; + else + return FINISH_NOT_LATER_THAN; } @Override @@ -53,7 +58,7 @@ public enum PositionConstraintType { START_IN_FIXED_DATE(true, _("start in fixed date")) { @Override - public PositionConstraintType newTypeAfterMoved() { + public PositionConstraintType newTypeAfterMoved(SchedulingMode mode) { return START_IN_FIXED_DATE; } @@ -65,7 +70,7 @@ public enum PositionConstraintType { AS_LATE_AS_POSSIBLE(false, _("as late as possible")) { @Override - public PositionConstraintType newTypeAfterMoved() { + public PositionConstraintType newTypeAfterMoved(SchedulingMode mode) { return FINISH_NOT_LATER_THAN; } @@ -77,8 +82,11 @@ public enum PositionConstraintType { FINISH_NOT_LATER_THAN(true, _("finish not later than")) { @Override - public PositionConstraintType newTypeAfterMoved() { - return FINISH_NOT_LATER_THAN; + public PositionConstraintType newTypeAfterMoved(SchedulingMode mode) { + if(mode == SchedulingMode.FORWARD) + return START_NOT_EARLIER_THAN; + else + return FINISH_NOT_LATER_THAN; } @Override @@ -102,7 +110,7 @@ public enum PositionConstraintType { this.name = name; } - public abstract PositionConstraintType newTypeAfterMoved(); + public abstract PositionConstraintType newTypeAfterMoved(SchedulingMode mode); public boolean isAssociatedDateRequired() { return dateRequired; diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java index 2ba3993ba..060ac7d55 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java @@ -419,8 +419,9 @@ public class Task extends TaskElement implements ITaskPositionConstrained { } } - public void explicityMoved(IntraDayDate date) { - getPositionConstraint().explicityMovedTo(date); + public void explicityMoved(IntraDayDate startDate, IntraDayDate endDate) { + getPositionConstraint().explicityMovedTo(startDate, endDate, + getOrderElement().getOrder().getSchedulingMode()); } public TaskPositionConstraint getPositionConstraint() { diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskMilestone.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskMilestone.java index 04fe416ac..f17812c8c 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskMilestone.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskMilestone.java @@ -168,8 +168,9 @@ public class TaskMilestone extends TaskElement implements ITaskPositionConstrain return false; } - public void explicityMoved(IntraDayDate date) { - getPositionConstraint().explicityMovedTo(date); + public void explicityMoved(IntraDayDate startDate, IntraDayDate endDate) { + getPositionConstraint().explicityMovedTo(startDate, endDate, + getOrderElement().getOrder().getSchedulingMode()); } public TaskPositionConstraint getPositionConstraint() { diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskPositionConstraint.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskPositionConstraint.java index afb9ae34e..b12bde999 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskPositionConstraint.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskPositionConstraint.java @@ -23,6 +23,7 @@ package org.libreplan.business.planner.entities; import java.util.Date; import org.apache.commons.lang.Validate; +import org.libreplan.business.orders.entities.Order.SchedulingMode; import org.libreplan.business.workingday.IntraDayDate; /** @@ -57,10 +58,16 @@ public class TaskPositionConstraint { .toDate() : null; } - public void explicityMovedTo(IntraDayDate date) { - Validate.notNull(date); - constraintType = constraintType.newTypeAfterMoved(); - constraintDate = date; + public void explicityMovedTo(IntraDayDate startDate, IntraDayDate endDate, + SchedulingMode mode) { + Validate.notNull(startDate); + Validate.notNull(endDate); + constraintType = constraintType.newTypeAfterMoved(mode); + if (isConstraintAppliedToStart()) { + constraintDate = startDate; + } else { + constraintDate = endDate; + } } public IntraDayDate getConstraintDate() { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourceQueueModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourceQueueModel.java index dc1a30164..07fff39aa 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourceQueueModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourceQueueModel.java @@ -897,7 +897,7 @@ public class LimitingResourceQueueModel implements ILimitingResourceQueueModel { IntraDayDate endDate) { task.setIntraDayStartDate(startDate); task.setIntraDayEndDate(endDate); - task.explicityMoved(startDate); + task.explicityMoved(startDate, endDate); } private void addLimitingResourceQueueElementIfNeeded(LimitingResourceQueue queue, diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java index d61f80339..c8124a48a 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java @@ -525,7 +525,8 @@ public class TaskElementAdapter { .compareTo(PositionConstraintType.FINISH_NOT_LATER_THAN) == 0 || constraintType .compareTo(PositionConstraintType.AS_LATE_AS_POSSIBLE) == 0) { - task.explicityMoved(toIntraDay(endDate)); + task.explicityMoved(taskElement.getIntraDayStartDate(), + toIntraDay(endDate)); } } } @@ -1013,15 +1014,14 @@ public class TaskElementAdapter { public void moveTo(GanttDate newStart) { if (taskElement instanceof ITaskPositionConstrained) { ITaskPositionConstrained task = (ITaskPositionConstrained) taskElement; + GanttDate newEnd = inferEndFrom(newStart); if (task.getPositionConstraint() .isConstraintAppliedToStart()) { setBeginDate(newStart); - task.explicityMoved(toIntraDay(newStart)); } else { - GanttDate newEnd = inferEndFrom(newStart); setEndDate(newEnd); - task.explicityMoved(toIntraDay(newEnd)); } + task.explicityMoved(toIntraDay(newStart), toIntraDay(newEnd)); } }