From 289e5309fcec36caefa10e770d5af048d24418ed Mon Sep 17 00:00:00 2001 From: Sander van der Heyden Date: Tue, 11 Feb 2014 10:11:50 +0100 Subject: [PATCH] MIFOSX-900 - Refuse deactivating charges that are currently in use --- .../ChargeCannotBeUpdatedException.java | 13 +++++ ...WritePlatformServiceJpaRepositoryImpl.java | 50 +++++++++++++++++-- 2 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/exception/ChargeCannotBeUpdatedException.java diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/exception/ChargeCannotBeUpdatedException.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/exception/ChargeCannotBeUpdatedException.java new file mode 100644 index 000000000..045c21a55 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/exception/ChargeCannotBeUpdatedException.java @@ -0,0 +1,13 @@ +package org.mifosplatform.portfolio.charge.exception; + +import org.mifosplatform.infrastructure.core.exception.AbstractPlatformDomainRuleException; + +public class ChargeCannotBeUpdatedException extends AbstractPlatformDomainRuleException { + + public ChargeCannotBeUpdatedException(final String globalisationMessageCode, final String defaultUserMessage, + final Object... defaultUserMessageArgs) { + + super(globalisationMessageCode, defaultUserMessage, defaultUserMessageArgs); + } + +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java index 1309bec86..ed7bd1805 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/service/ChargeWritePlatformServiceJpaRepositoryImpl.java @@ -18,6 +18,7 @@ import org.mifosplatform.infrastructure.core.service.RoutingDataSource; import org.mifosplatform.portfolio.charge.domain.Charge; import org.mifosplatform.portfolio.charge.domain.ChargeRepository; import org.mifosplatform.portfolio.charge.exception.ChargeCannotBeDeletedException; +import org.mifosplatform.portfolio.charge.exception.ChargeCannotBeUpdatedException; import org.mifosplatform.portfolio.charge.exception.ChargeNotFoundException; import org.mifosplatform.portfolio.charge.serialization.ChargeDefinitionCommandFromApiJsonDeserializer; import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct; @@ -82,7 +83,26 @@ public class ChargeWritePlatformServiceJpaRepositoryImpl implements ChargeWriteP final Map changes = chargeForUpdate.update(command); - if (!changes.isEmpty()) { + // MIFOSX-900: Check if the Charge has been active before and now is deactivated: + if (changes.containsKey("active")) { + // IF the key exists then it has changed (otherwise it would have been filtered), so check current state: + if(!chargeForUpdate.isActive()) + { + // TODO: Change this function to only check the mappings!!! + final Boolean isChargeExistWithLoans = isAnyLoanProductsAssociateWithThisCharge(chargeId); + final Boolean isChargeExistWithSavings = isAnySavingsProductsAssociateWithThisCharge(chargeId); + + if(isChargeExistWithLoans || isChargeExistWithSavings) + { + throw new ChargeCannotBeUpdatedException( + "error.msg.charge.cannot.be.updated.it.is.used.in.loan", + "This charge cannot be updated, it is used in loan"); + } + } + } + + if (!changes.isEmpty()) { + this.chargeRepository.save(chargeForUpdate); } @@ -103,8 +123,10 @@ public class ChargeWritePlatformServiceJpaRepositoryImpl implements ChargeWriteP final Collection loanProducts = this.loanProductRepository.retrieveLoanProductsByChargeId(chargeId); final Boolean isChargeExistWithLoans = isAnyLoansAssociateWithThisCharge(chargeId); - - if (!loanProducts.isEmpty() || isChargeExistWithLoans) { throw new ChargeCannotBeDeletedException( + final Boolean isChargeExistWithSavings = isAnySavingsAssociateWithThisCharge(chargeId); + + // TODO: Change error messages around: + if (!loanProducts.isEmpty() || isChargeExistWithLoans || isChargeExistWithSavings) { throw new ChargeCannotBeDeletedException( "error.msg.charge.cannot.be.deleted.it.is.already.used.in.loan", "This charge cannot be deleted, it is already used in loan"); } @@ -139,4 +161,26 @@ public class ChargeWritePlatformServiceJpaRepositoryImpl implements ChargeWriteP final String isLoansUsingCharge = this.jdbcTemplate.queryForObject(sql, String.class, new Object[] { chargeId }); return new Boolean(isLoansUsingCharge); } + + private boolean isAnySavingsAssociateWithThisCharge(final Long chargeId) { + + final String sql = "select if((exists (select 1 from m_savings_account_charge sc where sc.charge_id = ?)) = 1, 'true', 'false')"; + final String isSavingsUsingCharge = this.jdbcTemplate.queryForObject(sql, String.class, new Object[] { chargeId }); + return new Boolean(isSavingsUsingCharge); + } + + + private boolean isAnyLoanProductsAssociateWithThisCharge(final Long chargeId) { + + final String sql = "select if((exists (select 1 from m_product_loan_charge lc where lc.charge_id = ?)) = 1, 'true', 'false')"; + final String isLoansUsingCharge = this.jdbcTemplate.queryForObject(sql, String.class, new Object[] { chargeId }); + return new Boolean(isLoansUsingCharge); + } + + private boolean isAnySavingsProductsAssociateWithThisCharge(final Long chargeId) { + + final String sql = "select if((exists (select 1 from m_savings_product_charge sc where sc.charge_id = ?)) = 1, 'true', 'false')"; + final String isSavingsUsingCharge = this.jdbcTemplate.queryForObject(sql, String.class, new Object[] { chargeId }); + return new Boolean(isSavingsUsingCharge); + } }