diff --git a/libreplan-business/src/main/java/org/libreplan/business/expensesheet/daos/ExpenseSheetLineDAO.java b/libreplan-business/src/main/java/org/libreplan/business/expensesheet/daos/ExpenseSheetLineDAO.java index f1fc0d4d0..b89f77613 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/expensesheet/daos/ExpenseSheetLineDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/expensesheet/daos/ExpenseSheetLineDAO.java @@ -19,11 +19,19 @@ package org.libreplan.business.expensesheet.daos; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.hibernate.Criteria; +import org.hibernate.criterion.Restrictions; import org.libreplan.business.common.daos.IntegrationEntityDAO; import org.libreplan.business.expensesheet.entities.ExpenseSheetLine; +import org.libreplan.business.orders.entities.OrderElement; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; /** * DAO for {@link ExpenseSheetLine} @@ -35,6 +43,39 @@ import org.springframework.stereotype.Repository; public class ExpenseSheetLineDAO extends IntegrationEntityDAO implements IExpenseSheetLineDAO { + @SuppressWarnings("unchecked") + @Override + @Transactional(readOnly = true) + public List findByOrderElement(OrderElement orderElement) { + if (orderElement.isNewObject()) { + return new ArrayList(); + } + // Prepare criteria + final Criteria criteria = getSession().createCriteria(ExpenseSheetLine.class); + criteria.add(Restrictions.eq("orderElement", orderElement)); + return criteria.list(); + } + + @Override + public List findByOrderElementAndChildren(OrderElement orderElement) { + if (orderElement.isNewObject()) { + return new ArrayList(); + } + return findByOrderAndItsChildren(orderElement); + } + + @SuppressWarnings("unchecked") + @Transactional(readOnly = true) + public List findByOrderAndItsChildren(OrderElement orderElement) { + // Create collection with current orderElement and all its children + Collection orderElements = orderElement.getAllChildren(); + orderElements.add(orderElement); + + // Prepare criteria + final Criteria criteria = getSession().createCriteria(ExpenseSheetLine.class); + criteria.add(Restrictions.in("orderElement", orderElements)); + return criteria.list(); + } } diff --git a/libreplan-business/src/main/java/org/libreplan/business/expensesheet/daos/IExpenseSheetLineDAO.java b/libreplan-business/src/main/java/org/libreplan/business/expensesheet/daos/IExpenseSheetLineDAO.java index 62c88fb23..7b1b88fcb 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/expensesheet/daos/IExpenseSheetLineDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/expensesheet/daos/IExpenseSheetLineDAO.java @@ -19,8 +19,11 @@ package org.libreplan.business.expensesheet.daos; +import java.util.List; + import org.libreplan.business.common.daos.IIntegrationEntityDAO; import org.libreplan.business.expensesheet.entities.ExpenseSheetLine; +import org.libreplan.business.orders.entities.OrderElement; /** * Interface for ExpenseSheetLine DAO @@ -30,4 +33,8 @@ import org.libreplan.business.expensesheet.entities.ExpenseSheetLine; */ public interface IExpenseSheetLineDAO extends IIntegrationEntityDAO { + List findByOrderElement(OrderElement orderElement); + + List findByOrderElementAndChildren(OrderElement orderElement); + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/orders/daos/IOrderElementDAO.java b/libreplan-business/src/main/java/org/libreplan/business/orders/daos/IOrderElementDAO.java index 3d1d49ee6..dcddd9778 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/orders/daos/IOrderElementDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/orders/daos/IOrderElementDAO.java @@ -126,4 +126,6 @@ public interface IOrderElementDAO extends IIntegrationEntityDAO { */ OrderElement findRepeatedOrderCodeInDB(OrderElement order); + boolean hasImputedExpenseSheet(Long id) throws InstanceNotFoundException; + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/orders/daos/OrderElementDAO.java b/libreplan-business/src/main/java/org/libreplan/business/orders/daos/OrderElementDAO.java index 150a09daf..29dab5380 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/orders/daos/OrderElementDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/orders/daos/OrderElementDAO.java @@ -40,6 +40,7 @@ import org.hibernate.criterion.Restrictions; import org.libreplan.business.common.IAdHocTransactionService; import org.libreplan.business.common.daos.IntegrationEntityDAO; import org.libreplan.business.common.exceptions.InstanceNotFoundException; +import org.libreplan.business.expensesheet.daos.IExpenseSheetLineDAO; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.SchedulingDataForVersion; import org.libreplan.business.orders.entities.TaskSource; @@ -73,6 +74,9 @@ public class OrderElementDAO extends IntegrationEntityDAO @Autowired private IWorkReportLineDAO workReportLineDAO; + @Autowired + private IExpenseSheetLineDAO expenseSheetLineDAO; + @Autowired private IWorkReportDAO workReportDAO; @@ -486,4 +490,9 @@ public class OrderElementDAO extends IntegrationEntityDAO return result; } + @Override + public boolean hasImputedExpenseSheet(Long id) throws InstanceNotFoundException { + OrderElement orderElement = find(id); + return (!expenseSheetLineDAO.findByOrderElementAndChildren(orderElement).isEmpty()); + } } \ No newline at end of file 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..c7f2cd096 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 @@ -128,4 +128,6 @@ public interface IOrderModel extends IIntegrationEntityModel { PlanningState getPlanningState(); + boolean hasImputedExpenseSheets(OrderElement order); + } 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..9b76865c9 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 @@ -855,6 +855,16 @@ public class OrderCRUDController extends GenericForwardComposer { } private void remove(Order order) { + boolean hasImputedExpenseSheets = orderModel.hasImputedExpenseSheets(order); + if (hasImputedExpenseSheets) { + messagesForUser + .showMessage( + Level.ERROR, + _("You can not remove the project \"{0}\" because this one has imputed expense sheets.", + order.getName())); + return; + } + boolean alreadyInUse = orderModel.isAlreadyInUseAndIsOnlyInCurrentScenario(order); if (alreadyInUse) { messagesForUser diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java index a01a96076..3dc68307e 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java @@ -679,6 +679,16 @@ public class OrderElementTreeController extends TreeController { @Override public void remove(OrderElement element) { + boolean hasImputedExpenseSheets = orderModel.hasImputedExpenseSheets(element); + if (hasImputedExpenseSheets) { + messagesForUser + .showMessage( + Level.ERROR, + _("You can not remove the project \"{0}\" because this one has imputed expense sheets.", + element.getName())); + return; + } + boolean alreadyInUse = orderModel.isAlreadyInUse(element); if (alreadyInUse) { messagesForUser 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..f0b26ba0d 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 @@ -850,4 +850,14 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel { return planningState; } + @Override + @Transactional(readOnly = true) + public boolean hasImputedExpenseSheets(OrderElement order) { + try { + return orderElementDAO.hasImputedExpenseSheet(order.getId()); + } catch (InstanceNotFoundException e) { + throw new RuntimeException(e); + } + } + }