diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/HourCostDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/HourCostDAO.java index b152fd5c8..9b712a2c6 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/HourCostDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/HourCostDAO.java @@ -53,13 +53,4 @@ public class HourCostDAO extends IntegrationEntityDAO implements super.remove(id); } - @SuppressWarnings("unchecked") - @Override - public Collection hoursCostsByTypeOfWorkHour( - TypeOfWorkHours typeOfWorkHours) { - return getSession().createCriteria(HourCost.class) - .add(Restrictions.eq("type", typeOfWorkHours)) - .list(); - } - } \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/IHourCostDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/IHourCostDAO.java index 1c49eb8d1..34df8daff 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/IHourCostDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/IHourCostDAO.java @@ -21,12 +21,9 @@ package org.navalplanner.business.costcategories.daos; -import java.util.Collection; - import org.navalplanner.business.common.daos.IIntegrationEntityDAO; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; import org.navalplanner.business.costcategories.entities.HourCost; -import org.navalplanner.business.costcategories.entities.TypeOfWorkHours; /** * @author Jacobo Aragunde Perez @@ -37,6 +34,4 @@ public interface IHourCostDAO extends IIntegrationEntityDAO { @Override public void remove(Long id) throws InstanceNotFoundException; - public Collection hoursCostsByTypeOfWorkHour(TypeOfWorkHours typeOfWorkHours); - } \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/ITypeOfWorkHoursDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/ITypeOfWorkHoursDAO.java index fb8f65d7f..3918a108e 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/ITypeOfWorkHoursDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/ITypeOfWorkHoursDAO.java @@ -25,34 +25,46 @@ import java.util.List; import org.navalplanner.business.common.daos.IIntegrationEntityDAO; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.costcategories.entities.TypeOfWorkHours; /** * @author Jacobo Aragunde Perez + * @author Diego Pino García */ public interface ITypeOfWorkHoursDAO extends IIntegrationEntityDAO { - TypeOfWorkHours findUniqueByCode(TypeOfWorkHours typeOfWorkHours) - throws InstanceNotFoundException; + /** + * Checks if type is referenced by other entities examining the entities + * that are related with {@link TypeOfWorkHours} via a foreign key + * + * @param type + * @throws ValidationException + */ + void checkIsReferencedByOtherEntities(TypeOfWorkHours type) throws ValidationException; + + boolean existsByCode(TypeOfWorkHours typeOfWorkHours); + + boolean existsTypeWithCodeInAnotherTransaction(String code); + + List findActive(); TypeOfWorkHours findUniqueByCode(String code) throws InstanceNotFoundException; - boolean existsByCode(TypeOfWorkHours typeOfWorkHours); - - List findActive(); - - boolean existsTypeWithCodeInAnotherTransaction(String code); + TypeOfWorkHours findUniqueByCode(TypeOfWorkHours typeOfWorkHours) + throws InstanceNotFoundException; TypeOfWorkHours findUniqueByCodeInAnotherTransaction(String code) throws InstanceNotFoundException; - TypeOfWorkHours findUniqueByNameInAnotherTransaction(String name) - throws InstanceNotFoundException; - TypeOfWorkHours findUniqueByName(String name) throws InstanceNotFoundException; + TypeOfWorkHours findUniqueByNameInAnotherTransaction(String name) + throws InstanceNotFoundException; + List hoursTypeByNameAsc(); -} + +} \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/TypeOfWorkHoursDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/TypeOfWorkHoursDAO.java index 93f9aeec4..391cf5df2 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/TypeOfWorkHoursDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/costcategories/daos/TypeOfWorkHoursDAO.java @@ -30,7 +30,10 @@ import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.navalplanner.business.common.daos.IntegrationEntityDAO; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.common.exceptions.ValidationException; +import org.navalplanner.business.costcategories.entities.HourCost; import org.navalplanner.business.costcategories.entities.TypeOfWorkHours; +import org.navalplanner.business.workreports.entities.WorkReportLine; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @@ -39,6 +42,7 @@ import org.springframework.transaction.annotation.Transactional; /** * @author Jacobo Aragunde Perez + * @author Diego Pino García */ @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) @@ -134,4 +138,33 @@ public class TypeOfWorkHoursDAO extends IntegrationEntityDAO .addOrder(Order.asc("name")).list(); } + @Override + public void checkIsReferencedByOtherEntities(TypeOfWorkHours type) throws ValidationException { + checkHasHourCost(type); + checkHasWorkReportLine(type); + } + + private void checkHasWorkReportLine(TypeOfWorkHours type) { + List workReportLines = getSession() + .createCriteria(WorkReportLine.class) + .add(Restrictions.eq("typeOfWorkHours", type)).list(); + if (!workReportLines.isEmpty()) { + throw ValidationException + .invalidValue( + "Cannot delete type of work hours. It is being used at this moment in some work report line.", + type); + } + } + + private void checkHasHourCost(TypeOfWorkHours type) { + List hoursCost = getSession().createCriteria(HourCost.class) + .add(Restrictions.eq("type", type)).list(); + if (!hoursCost.isEmpty()) { + throw ValidationException + .invalidValue( + "Cannot delete type of work hours. It is being used at this moment in some cost category.", + type); + } + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/ITypeOfWorkHoursModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/ITypeOfWorkHoursModel.java index 5f9f1e972..c74764fa2 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/ITypeOfWorkHoursModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/ITypeOfWorkHoursModel.java @@ -36,6 +36,8 @@ import org.navalplanner.web.common.IIntegrationEntityModel; */ public interface ITypeOfWorkHoursModel extends IIntegrationEntityModel { + void checkIsReferencedByOtherEntities(TypeOfWorkHours typeOfWorkHours) throws ValidationException; + void confirmRemove(TypeOfWorkHours typeOfWorkHours); /** @@ -46,8 +48,6 @@ public interface ITypeOfWorkHoursModel extends IIntegrationEntityModel { */ void confirmSave() throws ValidationException; - boolean existsCostCategoriesUsing(TypeOfWorkHours typeOfWorkHours); - /** * Gets the current {@link TypeOfWorkHours}. * diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/TypeOfWorkHoursCRUDController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/TypeOfWorkHoursCRUDController.java index 1dc330c69..235f49833 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/TypeOfWorkHoursCRUDController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/TypeOfWorkHoursCRUDController.java @@ -159,15 +159,33 @@ public class TypeOfWorkHoursCRUDController extends GenericForwardComposer implem } public void confirmDelete(TypeOfWorkHours typeOfWorkHours) { - boolean canDelete = existsCostCategoriesUsing(typeOfWorkHours); - if (!canDelete) { - showCannotDeleteWorkHoursTypeDialog(typeOfWorkHours); - return; + if (!isReferencedByOtherEntities(typeOfWorkHours)) { + int result = showConfirmDeleteWorkHoursType(typeOfWorkHours); + if (result == Messagebox.OK) { + typeOfWorkHoursModel.confirmRemove(typeOfWorkHours); + Util.reloadBindings(listing); + } } - int result = showConfirmDeleteWorkHoursType(typeOfWorkHours); - if (result == Messagebox.OK) { - typeOfWorkHoursModel.confirmRemove(typeOfWorkHours); - Util.reloadBindings(listing); + } + + private boolean isReferencedByOtherEntities(TypeOfWorkHours typeOfWorkHours) { + try { + typeOfWorkHoursModel.checkIsReferencedByOtherEntities(typeOfWorkHours); + return false; + } catch (ValidationException e) { + showCannotDeleteWorkHoursTypeDialog(e.getInvalidValue() + .getMessage(), typeOfWorkHours); + } + return true; + } + + private void showCannotDeleteWorkHoursTypeDialog(String message, + TypeOfWorkHours typeOfWorkHours) { + try { + Messagebox.show(_(message), _("Warning"), Messagebox.OK, + Messagebox.EXCLAMATION); + } catch (InterruptedException e) { + LOG.error(_("Error on showing warning message removing typeOfWorkHours: ", typeOfWorkHours.getId()), e); } } @@ -181,17 +199,4 @@ public class TypeOfWorkHoursCRUDController extends GenericForwardComposer implem return Messagebox.CANCEL; } - private boolean existsCostCategoriesUsing(TypeOfWorkHours typeOfWorkHours) { - return typeOfWorkHoursModel.existsCostCategoriesUsing(typeOfWorkHours); - } - - private void showCannotDeleteWorkHoursTypeDialog(TypeOfWorkHours typeOfWorkHours) { - try { - Messagebox.show(_("Cannot delete type of work hours. It is being used at this moment in some cost category."), - _("Warning"), Messagebox.OK, Messagebox.EXCLAMATION); - } catch (InterruptedException e) { - LOG.error(_("Error on showing warning message removing typeOfWorkHours: ", typeOfWorkHours.getId()), e); - } - } - } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/TypeOfWorkHoursModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/TypeOfWorkHoursModel.java index f876872e0..d39bbdc8c 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/TypeOfWorkHoursModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/costcategories/TypeOfWorkHoursModel.java @@ -80,6 +80,12 @@ public class TypeOfWorkHoursModel extends IntegrationEntityModel implements } } + @Override + @Transactional(readOnly = true) + public void checkIsReferencedByOtherEntities(TypeOfWorkHours typeOfWorkHours) throws ValidationException { + typeOfWorkHoursDAO.checkIsReferencedByOtherEntities(typeOfWorkHours); + } + @Override public TypeOfWorkHours getTypeOfWorkHours() { return typeOfWorkHours; @@ -132,10 +138,4 @@ public class TypeOfWorkHoursModel extends IntegrationEntityModel implements return this.typeOfWorkHours; } - @Override - @Transactional(readOnly = true) - public boolean existsCostCategoriesUsing(TypeOfWorkHours typeOfWorkHours) { - return hourCostDAO.hoursCostsByTypeOfWorkHour(typeOfWorkHours).isEmpty(); - } - } \ No newline at end of file