diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsAccountTransactionDTO.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsAccountTransactionDTO.java index f3ef177cf..cdaa9218c 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsAccountTransactionDTO.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsAccountTransactionDTO.java @@ -15,18 +15,16 @@ public class SavingsAccountTransactionDTO { private List existingTransactionIds; private List existingReversedTransactionIds; private PaymentDetail paymentDetail; - private boolean checkAccountStatus; public SavingsAccountTransactionDTO(final DateTimeFormatter formatter, final LocalDate transactionDate, final BigDecimal transactionAmount, final List existingTransactionIds, final List existingReversedTransactionIds, - final PaymentDetail paymentDetail, boolean checkAccountStatus) { + final PaymentDetail paymentDetail) { this.formatter = formatter; this.transactionDate = transactionDate; this.transactionAmount = transactionAmount; this.existingTransactionIds = existingTransactionIds; this.existingReversedTransactionIds = existingReversedTransactionIds; this.paymentDetail = paymentDetail; - this.checkAccountStatus = checkAccountStatus; } public DateTimeFormatter getFormatter() { @@ -52,8 +50,4 @@ public class SavingsAccountTransactionDTO { public PaymentDetail getPaymentDetail() { return this.paymentDetail; } - - public boolean isCheckAccountStatus() { - return this.checkAccountStatus; - } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccount.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccount.java index 014b7147a..6aa7ceb04 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccount.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccount.java @@ -550,7 +550,7 @@ public class SavingsAccount extends AbstractPersistable { public SavingsAccountTransaction deposit(final SavingsAccountTransactionDTO transactionDTO) { - if (transactionDTO.isCheckAccountStatus() && isNotActive()) { + if (isNotActive()) { final String defaultUserMessage = "Transaction is not allowed. Account is not active."; final ApiParameterError error = ApiParameterError.parameterError("error.msg.savingsaccount.transaction.account.is.not.active", defaultUserMessage, "transactionDate", transactionDTO.getTransactionDate().toString(transactionDTO.getFormatter())); @@ -609,7 +609,7 @@ public class SavingsAccount extends AbstractPersistable { public SavingsAccountTransaction withdraw(SavingsAccountTransactionDTO transactionDTO, final boolean applyWithdrawFee) { - if (transactionDTO.isCheckAccountStatus() && isNotActive()) { + if (isNotActive()) { final String defaultUserMessage = "Transaction is not allowed. Account is not active."; final ApiParameterError error = ApiParameterError.parameterError("error.msg.savingsaccount.transaction.account.is.not.active", @@ -689,8 +689,6 @@ public class SavingsAccount extends AbstractPersistable { } } - validateAccountBalanceDoesNotBecomeNegative(retreiveListOfTransactions(), transactionAmountMoney); - this.summary.updateSummary(this.currency, this.savingsAccountTransactionSummaryWrapper, this.transactions); return transaction; @@ -710,9 +708,8 @@ public class SavingsAccount extends AbstractPersistable { return transactionBeforeLastInterestPosting; } - private void validateAccountBalanceDoesNotBecomeNegative(final List transactionsSortedByDate, - final Money transactionAmount) { - + public void validateAccountBalanceDoesNotBecomeNegative(final BigDecimal transactionAmount) { + final List transactionsSortedByDate = retreiveListOfTransactions(); Money runningBalance = Money.zero(this.currency); for (final SavingsAccountTransaction transaction : transactionsSortedByDate) { @@ -726,7 +723,7 @@ public class SavingsAccount extends AbstractPersistable { // final BigDecimal withdrawalFee = null; throw new InsufficientAccountBalanceException("transactionAmount", getAccountBalance(), withdrawalFee, - transactionAmount.getAmount()); + transactionAmount); } } } @@ -1672,8 +1669,8 @@ public class SavingsAccount extends AbstractPersistable { // activating account. final Money minRequiredOpeningBalance = Money.of(this.currency, this.minRequiredOpeningBalance); if (minRequiredOpeningBalance.isGreaterThanZero()) { - SavingsAccountTransactionDTO transactionDTO = new SavingsAccountTransactionDTO(fmt, activationDate, - minRequiredOpeningBalance.getAmount(), existingTransactionIds, existingReversedTransactionIds, null, true); + SavingsAccountTransactionDTO transactionDTO = new SavingsAccountTransactionDTO(fmt, activationDate, minRequiredOpeningBalance.getAmount(), + existingTransactionIds, existingReversedTransactionIds, null); deposit(transactionDTO); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java index 642c66940..8bd651172 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java @@ -51,7 +51,7 @@ public class SavingsAccountDomainServiceJpa implements SavingsAccountDomainServi final List existingTransactionIds = new ArrayList(); final List existingReversedTransactionIds = new ArrayList(); SavingsAccountTransactionDTO transactionDTO = new SavingsAccountTransactionDTO(fmt, transactionDate, transactionAmount, - existingTransactionIds,existingReversedTransactionIds, paymentDetail,true); + existingTransactionIds,existingReversedTransactionIds, paymentDetail); final SavingsAccountTransaction withdrawal = account.withdraw(transactionDTO , applyWithdrawFee); final MathContext mc = MathContext.DECIMAL64; @@ -62,7 +62,7 @@ public class SavingsAccountDomainServiceJpa implements SavingsAccountDomainServi final LocalDate today = DateUtils.getLocalDateOfTenant(); account.calculateInterestUsing(mc, today); } - + account.validateAccountBalanceDoesNotBecomeNegative(transactionAmount); saveTransactionToGenerateTransactionId(withdrawal); this.savingsAccountRepository.save(account); @@ -79,7 +79,7 @@ public class SavingsAccountDomainServiceJpa implements SavingsAccountDomainServi final List existingTransactionIds = new ArrayList(); final List existingReversedTransactionIds = new ArrayList(); SavingsAccountTransactionDTO transactionDTO = new SavingsAccountTransactionDTO(fmt, transactionDate, transactionAmount, - existingTransactionIds, existingReversedTransactionIds, paymentDetail, true); + existingTransactionIds, existingReversedTransactionIds, paymentDetail); final SavingsAccountTransaction deposit = account.deposit(transactionDTO); final MathContext mc = MathContext.DECIMAL64; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java index 924e412ab..4c3d9e59f 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java @@ -5,6 +5,8 @@ */ package org.mifosplatform.portfolio.savings.service; +import static org.mifosplatform.portfolio.savings.SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME; + import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; @@ -20,8 +22,11 @@ import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.mifosplatform.accounting.journalentry.service.JournalEntryWritePlatformService; import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.ApiParameterError; import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder; +import org.mifosplatform.infrastructure.core.data.DataValidatorBuilder; +import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException; import org.mifosplatform.infrastructure.core.service.DateUtils; import org.mifosplatform.infrastructure.jobs.annotation.CronTarget; import org.mifosplatform.infrastructure.jobs.service.JobName; @@ -299,6 +304,9 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final MathContext mc = new MathContext(15, RoundingMode.HALF_EVEN); final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId); + if(account.isNotActive()){ + throwValidationForActiveStatus(SavingsApiConstants.undoTransactionAction); + } account.undoTransaction(transactionId, reversedTransactionIds); checkClientOrGroupActive(account); if ((savingsAccountTransaction.isDeposit() || savingsAccountTransaction.isWithdrawal()) @@ -334,6 +342,9 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final LocalDate today = DateUtils.getLocalDateOfTenant(); final SavingsAccount account = this.savingAccountAssembler.assembleFrom(savingsId); + if(account.isNotActive()){ + throwValidationForActiveStatus(SavingsApiConstants.adjustTransactionAction); + } final Locale locale = command.extractLocale(); final DateTimeFormatter fmt = DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale); @@ -357,11 +368,11 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi SavingsAccountTransaction transaction = null; if (savingsAccountTransaction.isDeposit()) { SavingsAccountTransactionDTO transactionDTO = new SavingsAccountTransactionDTO(fmt, transactionDate, transactionAmount, - existingTransactionIds, existingReversedTransactionIds,paymentDetail, false); + existingTransactionIds, existingReversedTransactionIds,paymentDetail); transaction = account.deposit(transactionDTO); } else { SavingsAccountTransactionDTO transactionDTO = new SavingsAccountTransactionDTO(fmt, transactionDate, transactionAmount, - existingTransactionIds, existingReversedTransactionIds, paymentDetail, false); + existingTransactionIds, existingReversedTransactionIds, paymentDetail); transaction = account.withdraw(transactionDTO , true); } final Long newtransactionId = saveTransactionToGenerateTransactionId(transaction); @@ -385,6 +396,17 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi .build(); } + /** + * + */ + private void throwValidationForActiveStatus(String actionName) { + final List dataValidationErrors = new ArrayList(); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) + .resource(SAVINGS_ACCOUNT_RESOURCE_NAME + actionName); + baseDataValidator.reset().failWithCodeNoParameterAddedToErrorCode("account.is.not.active"); + throw new PlatformApiDataValidationException(dataValidationErrors); + } + private void postJournalEntries(final SavingsAccount savingsAccount, final List existingTransactionIds, final List existingReversedTransactionIds) {