From 963268600438d3ad23a7a401aae454bdce478d64 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Wed, 18 Apr 2012 18:19:47 +0200 Subject: [PATCH] Bug #1384: Add validation in starting date and deadline depending on position constraints FEA: ItEr76S04BugFixing --- .../business/planner/entities/Task.java | 9 +++- .../planner/entities/TaskElement.java | 5 +- .../business/planner/entities/TaskGroup.java | 14 +++++- .../planner/entities/TaskMilestone.java | 8 +++- .../org/libreplan/web/orders/IOrderModel.java | 6 ++- .../web/orders/OrderCRUDController.java | 48 ++++++++++++++++--- .../org/libreplan/web/orders/OrderModel.java | 12 ++++- 7 files changed, 90 insertions(+), 12 deletions(-) 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 317148192..15a24867b 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 @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -73,6 +73,7 @@ import org.libreplan.business.workingday.ResourcesPerDay; /** * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public class Task extends TaskElement implements ITaskPositionConstrained { @@ -1218,4 +1219,10 @@ public class Task extends TaskElement implements ITaskPositionConstrained { public void resetStatus() { this.currentStatus = null; } + + @Override + public boolean isAnyTaskWithConstraint(PositionConstraintType type) { + return getPositionConstraint().getConstraintType().equals(type); + } + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java index 7ddc7d3ac..23262c025 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -63,6 +63,7 @@ import org.libreplan.business.workingday.ResourcesPerDay; /** * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public abstract class TaskElement extends BaseEntity { @@ -769,4 +770,6 @@ public abstract class TaskElement extends BaseEntity { return null; } + public abstract boolean isAnyTaskWithConstraint(PositionConstraintType type); + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java index c06d5896b..0edfd3817 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -44,6 +44,7 @@ import org.libreplan.business.workingday.IntraDayDate; /** * @author Óscar González Fernández * @author Javier Moran Rua + * @author Manuel Rego Casasnovas */ public class TaskGroup extends TaskElement { @@ -376,4 +377,15 @@ public class TaskGroup extends TaskElement { public void resetStatus() { this.isFinished = this.isInProgress = null; } + + @Override + public boolean isAnyTaskWithConstraint(PositionConstraintType type) { + for (TaskElement taskElement : getChildren()) { + if (taskElement.isAnyTaskWithConstraint(type)) { + return true; + } + } + return false; + } + } 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 e744eb35d..2583920f4 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 @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -43,6 +43,7 @@ import org.libreplan.business.workingday.IntraDayDate; /** * @author Lorenzo Tilve Álvaro * @author Javier Moran Rua + * @author Manuel Rego Casasnovas */ public class TaskMilestone extends TaskElement implements ITaskPositionConstrained { @@ -225,4 +226,9 @@ public class TaskMilestone extends TaskElement implements ITaskPositionConstrain return false; } + @Override + public boolean isAnyTaskWithConstraint(PositionConstraintType type) { + return getPositionConstraint().getConstraintType().equals(type); + } + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/IOrderModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/IOrderModel.java index b79408223..0f549e859 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/IOrderModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/IOrderModel.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -30,6 +30,7 @@ import org.libreplan.business.labels.entities.Label; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLineGroup; +import org.libreplan.business.planner.entities.PositionConstraintType; import org.libreplan.business.qualityforms.entities.QualityForm; import org.libreplan.business.resources.entities.Criterion; import org.libreplan.business.resources.entities.CriterionType; @@ -45,6 +46,7 @@ import org.zkoss.zk.ui.Desktop; * * @author Óscar González Fernández * @author Diego Pino García + * @author Manuel Rego Casasnovas */ public interface IOrderModel extends IIntegrationEntityModel { @@ -128,4 +130,6 @@ public interface IOrderModel extends IIntegrationEntityModel { PlanningState getPlanningState(); + boolean isAnyTaskWithConstraint(PositionConstraintType type); + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java index bbd39fdb9..58c60e314 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -45,6 +45,7 @@ import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.Order.SchedulingMode; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderStatusEnum; +import org.libreplan.business.planner.entities.PositionConstraintType; import org.libreplan.business.templates.entities.OrderTemplate; import org.libreplan.business.users.entities.UserRole; import org.libreplan.web.common.IMessagesForUser; @@ -108,6 +109,7 @@ import org.zkoss.zul.api.Window; * * @author Óscar González Fernández * @author Lorenzo Tilve Álvaro + * @author Manuel Rego Casasnovas */ @org.springframework.stereotype.Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) @@ -387,11 +389,45 @@ public class OrderCRUDController extends GenericForwardComposer { return result; } - private void setConstraintsFor(SchedulingMode mode) { - initDate.setConstraint(mode == SchedulingMode.FORWARD ? "no empty" - : null); - deadline.setConstraint(mode == SchedulingMode.BACKWARDS ? "no empty" - : null); + private void setConstraintsFor(final SchedulingMode mode) { + initDate.setConstraint(new Constraint() { + + @Override + public void validate(Component comp, Object value) + throws WrongValueException { + if (value == null) { + if (mode == SchedulingMode.FORWARD) { + throw new WrongValueException( + comp, + _("Starting date cannot be empty in forward mode")); + } + if (orderModel + .isAnyTaskWithConstraint(PositionConstraintType.AS_SOON_AS_POSSIBLE)) { + throw new WrongValueException(comp, + _("Starting date cannot be empty because there is a task with constraint \"as soon as possible\"")); + } + } + } + }); + deadline.setConstraint(new Constraint() { + + @Override + public void validate(Component comp, Object value) + throws WrongValueException { + if (value == null) { + if (mode == SchedulingMode.BACKWARDS) { + throw new WrongValueException( + comp, + _("Starting date cannot be empty in backwards mode")); + } + if (orderModel + .isAnyTaskWithConstraint(PositionConstraintType.AS_LATE_AS_POSSIBLE)) { + throw new WrongValueException(comp, + _("Starting date cannot be empty because there is a task with constraint \"as late as possible\"")); + } + } + } + }); } private void changeFocusAccordingTo(SchedulingMode chosen) { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java index d379276e2..3edba79f3 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2012 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License as published by the Free @@ -56,6 +56,7 @@ import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLineGroup; import org.libreplan.business.planner.entities.IMoneyCostCalculator; +import org.libreplan.business.planner.entities.PositionConstraintType; import org.libreplan.business.qualityforms.daos.IQualityFormDAO; import org.libreplan.business.qualityforms.entities.QualityForm; import org.libreplan.business.requirements.entities.DirectCriterionRequirement; @@ -850,4 +851,13 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel { return planningState; } + @Override + public boolean isAnyTaskWithConstraint(PositionConstraintType type) { + if ((planningState == null) || (planningState.getRootTask() == null)) { + return false; + } + + return planningState.getRootTask().isAnyTaskWithConstraint(type); + } + }