diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java index 24945aceb..a51be6839 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/IOrderElementDAO.java @@ -113,4 +113,6 @@ public interface IOrderElementDAO extends IGenericDAO { BigDecimal calculateMinWorkedHours(final List list); + boolean isAlreadyInUseThisOrAnyOfItsChildren(OrderElement orderElement); + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java index 8134570d6..a740ba080 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/orders/daos/OrderElementDAO.java @@ -38,6 +38,7 @@ import org.navalplanner.business.orders.entities.TaskSource; import org.navalplanner.business.planner.daos.ITaskSourceDAO; import org.navalplanner.business.templates.entities.OrderElementTemplate; import org.navalplanner.business.workreports.daos.IWorkReportLineDAO; +import org.navalplanner.business.workreports.entities.WorkReport; import org.navalplanner.business.workreports.entities.WorkReportLine; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; @@ -362,4 +363,31 @@ public class OrderElementDAO extends GenericDAOHibernate return min; } + private boolean isAlreadyInUse(OrderElement orderElement) { + boolean usedInWorkReports = !getSession().createCriteria( + WorkReport.class).add( + Restrictions.eq("orderElement", orderElement)).list().isEmpty(); + boolean usedInWorkReportLines = !getSession().createCriteria( + WorkReportLine.class).add( + Restrictions.eq("orderElement", orderElement)).list().isEmpty(); + + return usedInWorkReports || usedInWorkReportLines; + } + + @Override + public boolean isAlreadyInUseThisOrAnyOfItsChildren( + OrderElement orderElement) { + if (isAlreadyInUse(orderElement)) { + return true; + } + + for (OrderElement child : orderElement.getChildren()) { + if (isAlreadyInUseThisOrAnyOfItsChildren(child)) { + return true; + } + } + + return false; + } + } \ No newline at end of file diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IOrderModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IOrderModel.java index 5b1e4e78f..2b7aa4d62 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IOrderModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/IOrderModel.java @@ -119,4 +119,6 @@ public interface IOrderModel { boolean userCanWrite(Order order, String loginName); + boolean isAlreadyInUse(OrderElement element); + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderCRUDController.java index d99e80f95..30bcae161 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderCRUDController.java @@ -277,7 +277,7 @@ public class OrderCRUDController extends GenericForwardComposer { orderElementController.doAfterCompose(self .getFellow("editOrderElement")); orderElementTreeController = new OrderElementTreeController( - orderModel, orderElementController); + orderModel, orderElementController, messagesForUser); TreeComponent orderElementsTree = (TreeComponent) editWindow .getFellow("orderElementTree"); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java index 81dc44613..d527e3643 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java @@ -38,6 +38,8 @@ import org.navalplanner.business.orders.entities.OrderLineGroup; import org.navalplanner.business.orders.entities.SchedulingState; import org.navalplanner.business.requirements.entities.CriterionRequirement; import org.navalplanner.business.templates.entities.OrderElementTemplate; +import org.navalplanner.web.common.IMessagesForUser; +import org.navalplanner.web.common.Level; import org.navalplanner.web.common.Util; import org.navalplanner.web.common.Util.Getter; import org.navalplanner.web.common.Util.Setter; @@ -97,6 +99,8 @@ public class OrderElementTreeController extends TreeController { @Resource private IOrderTemplatesControllerEntryPoints orderTemplates; + private final IMessagesForUser messagesForUser; + public List getLabels() { return orderModel.getLabels(); } @@ -107,10 +111,12 @@ public class OrderElementTreeController extends TreeController { } public OrderElementTreeController(IOrderModel orderModel, - OrderElementController orderElementController) { + OrderElementController orderElementController, + IMessagesForUser messagesForUser) { super(OrderElement.class); this.orderModel = orderModel; this.orderElementController = orderElementController; + this.messagesForUser = messagesForUser; } public OrderElementController getOrderElementController() { @@ -673,4 +679,19 @@ public class OrderElementTreeController extends TreeController { }; } + @Override + protected void remove(OrderElement element) { + boolean alreadyInUse = orderModel.isAlreadyInUse(element); + if (alreadyInUse) { + messagesForUser + .showMessage( + Level.ERROR, + _( + "You can not remove the order element \"{0}\" because of this or any of its children are already in use in some work reports", + element.getName())); + } else { + super.remove(element); + } + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java index 07b550db9..92522c6ec 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderModel.java @@ -50,7 +50,6 @@ import org.navalplanner.business.labels.daos.ILabelDAO; import org.navalplanner.business.labels.entities.Label; import org.navalplanner.business.orders.daos.IOrderDAO; import org.navalplanner.business.orders.daos.IOrderElementDAO; -import org.navalplanner.business.orders.entities.CriterionRequirementOrderElementHandler; import org.navalplanner.business.orders.entities.HoursGroup; import org.navalplanner.business.orders.entities.Order; import org.navalplanner.business.orders.entities.OrderElement; @@ -754,4 +753,10 @@ public class OrderModel implements IOrderModel { return false; } + @Override + @Transactional(readOnly = true) + public boolean isAlreadyInUse(OrderElement element) { + return orderElementDAO.isAlreadyInUseThisOrAnyOfItsChildren(element); + } + }