Fix MIFOSX-1302: Throw a CurrencyInUseException whenever a currency is requested for deletion that is still in use by a charge, a loan or a savings product.
This commit is contained in:
+25
-1
@@ -18,9 +18,13 @@ import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder
|
|||||||
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
||||||
import org.mifosplatform.organisation.monetary.domain.ApplicationCurrency;
|
import org.mifosplatform.organisation.monetary.domain.ApplicationCurrency;
|
||||||
import org.mifosplatform.organisation.monetary.domain.ApplicationCurrencyRepositoryWrapper;
|
import org.mifosplatform.organisation.monetary.domain.ApplicationCurrencyRepositoryWrapper;
|
||||||
|
import org.mifosplatform.organisation.monetary.exception.CurrencyInUseException;
|
||||||
import org.mifosplatform.organisation.monetary.serialization.CurrencyCommandFromApiJsonDeserializer;
|
import org.mifosplatform.organisation.monetary.serialization.CurrencyCommandFromApiJsonDeserializer;
|
||||||
import org.mifosplatform.organisation.office.domain.OrganisationCurrency;
|
import org.mifosplatform.organisation.office.domain.OrganisationCurrency;
|
||||||
import org.mifosplatform.organisation.office.domain.OrganisationCurrencyRepository;
|
import org.mifosplatform.organisation.office.domain.OrganisationCurrencyRepository;
|
||||||
|
import org.mifosplatform.portfolio.charge.service.ChargeReadPlatformService;
|
||||||
|
import org.mifosplatform.portfolio.loanproduct.service.LoanProductReadPlatformService;
|
||||||
|
import org.mifosplatform.portfolio.savings.service.SavingsProductReadPlatformService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
@@ -32,16 +36,25 @@ public class CurrencyWritePlatformServiceJpaRepositoryImpl implements CurrencyWr
|
|||||||
private final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository;
|
private final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository;
|
||||||
private final OrganisationCurrencyRepository organisationCurrencyRepository;
|
private final OrganisationCurrencyRepository organisationCurrencyRepository;
|
||||||
private final CurrencyCommandFromApiJsonDeserializer fromApiJsonDeserializer;
|
private final CurrencyCommandFromApiJsonDeserializer fromApiJsonDeserializer;
|
||||||
|
private final LoanProductReadPlatformService loanProductService;
|
||||||
|
private final SavingsProductReadPlatformService savingsProductService;
|
||||||
|
private final ChargeReadPlatformService chargeService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public CurrencyWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context,
|
public CurrencyWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context,
|
||||||
final CurrencyCommandFromApiJsonDeserializer fromApiJsonDeserializer,
|
final CurrencyCommandFromApiJsonDeserializer fromApiJsonDeserializer,
|
||||||
final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository,
|
final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepository,
|
||||||
final OrganisationCurrencyRepository organisationCurrencyRepository) {
|
final OrganisationCurrencyRepository organisationCurrencyRepository,
|
||||||
|
final LoanProductReadPlatformService loanProductService,
|
||||||
|
final SavingsProductReadPlatformService savingsProductService,
|
||||||
|
final ChargeReadPlatformService chargeService) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
|
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
|
||||||
this.applicationCurrencyRepository = applicationCurrencyRepository;
|
this.applicationCurrencyRepository = applicationCurrencyRepository;
|
||||||
this.organisationCurrencyRepository = organisationCurrencyRepository;
|
this.organisationCurrencyRepository = organisationCurrencyRepository;
|
||||||
|
this.loanProductService = loanProductService;
|
||||||
|
this.savingsProductService = savingsProductService;
|
||||||
|
this.chargeService = chargeService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
@@ -67,6 +80,17 @@ public class CurrencyWritePlatformServiceJpaRepositoryImpl implements CurrencyWr
|
|||||||
allowedCurrencies.add(allowedCurrency);
|
allowedCurrencies.add(allowedCurrency);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (OrganisationCurrency priorCurrency : this.organisationCurrencyRepository.findAll()) {
|
||||||
|
if (!allowedCurrencyCodes.contains(priorCurrency.getCode())) {
|
||||||
|
// Check if it's safe to remove this currency.
|
||||||
|
if (!loanProductService.retrieveAllLoanProductsForCurrency(priorCurrency).isEmpty() ||
|
||||||
|
!savingsProductService.retrieveAllForCurrency(priorCurrency).isEmpty() ||
|
||||||
|
!chargeService.retrieveAllChargesForCurrency(priorCurrency).isEmpty()) {
|
||||||
|
throw new CurrencyInUseException(priorCurrency.getCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
changes.put("currencies", allowedCurrencyCodes.toArray(new String[allowedCurrencyCodes.size()]));
|
changes.put("currencies", allowedCurrencyCodes.toArray(new String[allowedCurrencyCodes.size()]));
|
||||||
|
|
||||||
this.organisationCurrencyRepository.deleteAll();
|
this.organisationCurrencyRepository.deleteAll();
|
||||||
|
|||||||
+4
@@ -54,4 +54,8 @@ public class OrganisationCurrency extends AbstractPersistable<Long> {
|
|||||||
this.nameCode = nameCode;
|
this.nameCode = nameCode;
|
||||||
this.displaySymbol = displaySymbol;
|
this.displaySymbol = displaySymbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final String getCode() {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+3
@@ -7,12 +7,15 @@ package org.mifosplatform.portfolio.charge.service;
|
|||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.mifosplatform.organisation.office.domain.OrganisationCurrency;
|
||||||
import org.mifosplatform.portfolio.charge.data.ChargeData;
|
import org.mifosplatform.portfolio.charge.data.ChargeData;
|
||||||
|
|
||||||
public interface ChargeReadPlatformService {
|
public interface ChargeReadPlatformService {
|
||||||
|
|
||||||
Collection<ChargeData> retrieveAllCharges();
|
Collection<ChargeData> retrieveAllCharges();
|
||||||
|
|
||||||
|
Collection<ChargeData> retrieveAllChargesForCurrency(OrganisationCurrency currency);
|
||||||
|
|
||||||
ChargeData retrieveCharge(Long chargeId);
|
ChargeData retrieveCharge(Long chargeId);
|
||||||
|
|
||||||
ChargeData retrieveNewChargeDetails();
|
ChargeData retrieveNewChargeDetails();
|
||||||
|
|||||||
+16
@@ -18,6 +18,7 @@ import org.mifosplatform.infrastructure.core.service.RoutingDataSource;
|
|||||||
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
||||||
import org.mifosplatform.organisation.monetary.data.CurrencyData;
|
import org.mifosplatform.organisation.monetary.data.CurrencyData;
|
||||||
import org.mifosplatform.organisation.monetary.service.CurrencyReadPlatformService;
|
import org.mifosplatform.organisation.monetary.service.CurrencyReadPlatformService;
|
||||||
|
import org.mifosplatform.organisation.office.domain.OrganisationCurrency;
|
||||||
import org.mifosplatform.portfolio.charge.data.ChargeData;
|
import org.mifosplatform.portfolio.charge.data.ChargeData;
|
||||||
import org.mifosplatform.portfolio.charge.domain.ChargeAppliesTo;
|
import org.mifosplatform.portfolio.charge.domain.ChargeAppliesTo;
|
||||||
import org.mifosplatform.portfolio.charge.exception.ChargeNotFoundException;
|
import org.mifosplatform.portfolio.charge.exception.ChargeNotFoundException;
|
||||||
@@ -63,6 +64,21 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService
|
|||||||
return this.jdbcTemplate.query(sql, rm, new Object[] {});
|
return this.jdbcTemplate.query(sql, rm, new Object[] {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Cacheable(value = "charges", key = "T(org.mifosplatform.infrastructure.core.service.ThreadLocalContextUtil).getTenant().getTenantIdentifier().concat('ch')")
|
||||||
|
public Collection<ChargeData> retrieveAllChargesForCurrency(
|
||||||
|
OrganisationCurrency currency) {
|
||||||
|
this.context.authenticatedUser();
|
||||||
|
|
||||||
|
final ChargeMapper rm = new ChargeMapper();
|
||||||
|
|
||||||
|
final String sql = "select " + rm.chargeSchema()
|
||||||
|
+ " where c.is_deleted=0 and c.currency_code='" + currency.getCode()
|
||||||
|
+ "' order by c.name ";
|
||||||
|
|
||||||
|
return this.jdbcTemplate.query(sql, rm, new Object[] {});
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ChargeData retrieveCharge(final Long chargeId) {
|
public ChargeData retrieveCharge(final Long chargeId) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
+3
@@ -7,6 +7,7 @@ package org.mifosplatform.portfolio.loanproduct.service;
|
|||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.mifosplatform.organisation.office.domain.OrganisationCurrency;
|
||||||
import org.mifosplatform.portfolio.loanproduct.data.LoanProductBorrowerCycleVariationData;
|
import org.mifosplatform.portfolio.loanproduct.data.LoanProductBorrowerCycleVariationData;
|
||||||
import org.mifosplatform.portfolio.loanproduct.data.LoanProductData;
|
import org.mifosplatform.portfolio.loanproduct.data.LoanProductData;
|
||||||
|
|
||||||
@@ -20,6 +21,8 @@ public interface LoanProductReadPlatformService {
|
|||||||
|
|
||||||
LoanProductData retrieveNewLoanProductDetails();
|
LoanProductData retrieveNewLoanProductDetails();
|
||||||
|
|
||||||
|
Collection<LoanProductData> retrieveAllLoanProductsForCurrency(OrganisationCurrency currency);
|
||||||
|
|
||||||
Collection<LoanProductData> retrieveAvailableLoanProductsForMix();
|
Collection<LoanProductData> retrieveAvailableLoanProductsForMix();
|
||||||
|
|
||||||
Collection<LoanProductData> retrieveRestrictedProductsForMix(Long productId);
|
Collection<LoanProductData> retrieveRestrictedProductsForMix(Long productId);
|
||||||
|
|||||||
+14
@@ -19,6 +19,7 @@ import org.mifosplatform.infrastructure.core.service.DateUtils;
|
|||||||
import org.mifosplatform.infrastructure.core.service.RoutingDataSource;
|
import org.mifosplatform.infrastructure.core.service.RoutingDataSource;
|
||||||
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
||||||
import org.mifosplatform.organisation.monetary.data.CurrencyData;
|
import org.mifosplatform.organisation.monetary.data.CurrencyData;
|
||||||
|
import org.mifosplatform.organisation.office.domain.OrganisationCurrency;
|
||||||
import org.mifosplatform.portfolio.charge.data.ChargeData;
|
import org.mifosplatform.portfolio.charge.data.ChargeData;
|
||||||
import org.mifosplatform.portfolio.charge.service.ChargeReadPlatformService;
|
import org.mifosplatform.portfolio.charge.service.ChargeReadPlatformService;
|
||||||
import org.mifosplatform.portfolio.loanproduct.data.LoanProductBorrowerCycleVariationData;
|
import org.mifosplatform.portfolio.loanproduct.data.LoanProductBorrowerCycleVariationData;
|
||||||
@@ -291,6 +292,19 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<LoanProductData> retrieveAllLoanProductsForCurrency(
|
||||||
|
OrganisationCurrency currency) {
|
||||||
|
this.context.authenticatedUser();
|
||||||
|
|
||||||
|
final LoanProductMapper rm = new LoanProductMapper(null, null);
|
||||||
|
|
||||||
|
final String sql = "select " + rm.loanProductSchema()
|
||||||
|
+ " where lp.currency_code='" + currency.getCode() + "'";
|
||||||
|
|
||||||
|
return this.jdbcTemplate.query(sql, rm, new Object[] {});
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<LoanProductData> retrieveAvailableLoanProductsForMix() {
|
public Collection<LoanProductData> retrieveAvailableLoanProductsForMix() {
|
||||||
|
|
||||||
|
|||||||
+3
@@ -7,6 +7,7 @@ package org.mifosplatform.portfolio.savings.service;
|
|||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.mifosplatform.organisation.office.domain.OrganisationCurrency;
|
||||||
import org.mifosplatform.portfolio.savings.data.SavingsProductData;
|
import org.mifosplatform.portfolio.savings.data.SavingsProductData;
|
||||||
|
|
||||||
public interface SavingsProductReadPlatformService {
|
public interface SavingsProductReadPlatformService {
|
||||||
@@ -17,6 +18,8 @@ public interface SavingsProductReadPlatformService {
|
|||||||
|
|
||||||
Collection<SavingsProductData> retrieveAllForLookupByType(Boolean isOverdraftType);
|
Collection<SavingsProductData> retrieveAllForLookupByType(Boolean isOverdraftType);
|
||||||
|
|
||||||
|
Collection<SavingsProductData> retrieveAllForCurrency(OrganisationCurrency currency);
|
||||||
|
|
||||||
SavingsProductData retrieveOne(Long productId);
|
SavingsProductData retrieveOne(Long productId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+13
@@ -16,6 +16,7 @@ import org.mifosplatform.infrastructure.core.domain.JdbcSupport;
|
|||||||
import org.mifosplatform.infrastructure.core.service.RoutingDataSource;
|
import org.mifosplatform.infrastructure.core.service.RoutingDataSource;
|
||||||
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
|
||||||
import org.mifosplatform.organisation.monetary.data.CurrencyData;
|
import org.mifosplatform.organisation.monetary.data.CurrencyData;
|
||||||
|
import org.mifosplatform.organisation.office.domain.OrganisationCurrency;
|
||||||
import org.mifosplatform.portfolio.savings.DepositAccountType;
|
import org.mifosplatform.portfolio.savings.DepositAccountType;
|
||||||
import org.mifosplatform.portfolio.savings.data.SavingsProductData;
|
import org.mifosplatform.portfolio.savings.data.SavingsProductData;
|
||||||
import org.mifosplatform.portfolio.savings.exception.SavingsProductNotFoundException;
|
import org.mifosplatform.portfolio.savings.exception.SavingsProductNotFoundException;
|
||||||
@@ -187,4 +188,16 @@ public class SavingsProductReadPlatformServiceImpl implements SavingsProductRead
|
|||||||
return this.jdbcTemplate.query(sql, this.savingsProductLookupsRowMapper);
|
return this.jdbcTemplate.query(sql, this.savingsProductLookupsRowMapper);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<SavingsProductData> retrieveAllForCurrency(
|
||||||
|
OrganisationCurrency currency) {
|
||||||
|
|
||||||
|
this.context.authenticatedUser();
|
||||||
|
|
||||||
|
final String sql = "select " + this.savingsProductRowMapper.schema()
|
||||||
|
+ " where sp.currency_code='" + currency.getCode() + "'";
|
||||||
|
|
||||||
|
return this.jdbcTemplate.query(sql, this.savingsProductRowMapper, new Object[] { DepositAccountType.SAVINGS_DEPOSIT.getValue() });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user