From 0200ca84dc605e3a02ca1851ebd971644c534ec2 Mon Sep 17 00:00:00 2001 From: Pramod Nuthakki Date: Fri, 6 Sep 2013 15:58:36 +0530 Subject: [PATCH] Added support to activate closed account by adjusting the transaction --- .../data/SavingsAccountTransactionDTO.java | 75 ++++++++++++ .../savings/domain/SavingsAccount.java | 110 +++++++++--------- .../SavingsAccountDomainServiceJpa.java | 13 ++- ...WritePlatformServiceJpaRepositoryImpl.java | 22 +++- 4 files changed, 156 insertions(+), 64 deletions(-) create mode 100755 mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsAccountTransactionDTO.java 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 new file mode 100755 index 000000000..09730b104 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savings/data/SavingsAccountTransactionDTO.java @@ -0,0 +1,75 @@ +package org.mifosplatform.portfolio.savings.data; + +import java.math.BigDecimal; +import java.util.List; + +import org.joda.time.LocalDate; +import org.joda.time.format.DateTimeFormatter; +import org.mifosplatform.portfolio.paymentdetail.domain.PaymentDetail; + + +public class SavingsAccountTransactionDTO { + + private DateTimeFormatter formatter; + private LocalDate transactionDate; + private BigDecimal transactionAmount; + 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) { + this.formatter = formatter; + this.transactionDate = transactionDate; + this.transactionAmount = transactionAmount; + this.existingTransactionIds = existingTransactionIds; + this.existingReversedTransactionIds = existingReversedTransactionIds; + this.paymentDetail = paymentDetail; + this.checkAccountStatus = checkAccountStatus; + } + + + + public DateTimeFormatter getFormatter() { + return this.formatter; + } + + + + public LocalDate getTransactionDate() { + return this.transactionDate; + } + + + + public BigDecimal getTransactionAmount() { + return this.transactionAmount; + } + + + + public List getExistingTransactionIds() { + return this.existingTransactionIds; + } + + + + public List getExistingReversedTransactionIds() { + return this.existingReversedTransactionIds; + } + + + + 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 86a788339..092c33a32 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 @@ -63,7 +63,6 @@ import org.mifosplatform.portfolio.accountdetails.domain.AccountType; import org.mifosplatform.portfolio.client.domain.Client; import org.mifosplatform.portfolio.group.domain.Group; import org.mifosplatform.portfolio.loanproduct.domain.PeriodFrequencyType; -import org.mifosplatform.portfolio.paymentdetail.domain.PaymentDetail; import org.mifosplatform.portfolio.savings.SavingsApiConstants; import org.mifosplatform.portfolio.savings.SavingsCompoundingInterestPeriodType; import org.mifosplatform.portfolio.savings.SavingsInterestCalculationDaysInYearType; @@ -71,6 +70,7 @@ import org.mifosplatform.portfolio.savings.SavingsInterestCalculationType; import org.mifosplatform.portfolio.savings.SavingsPeriodFrequencyType; import org.mifosplatform.portfolio.savings.SavingsPostingInterestPeriodType; import org.mifosplatform.portfolio.savings.SavingsWithdrawalFeesType; +import org.mifosplatform.portfolio.savings.data.SavingsAccountTransactionDTO; import org.mifosplatform.portfolio.savings.domain.interest.PostingPeriod; import org.mifosplatform.portfolio.savings.exception.InsufficientAccountBalanceException; import org.mifosplatform.portfolio.savings.service.SavingsEnumerations; @@ -259,14 +259,14 @@ public class SavingsAccount extends AbstractPersistable { final SavingsPostingInterestPeriodType interestPostingPeriodType, final SavingsInterestCalculationType interestCalculationType, final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance, final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, - final BigDecimal withdrawalFeeAmount, final SavingsWithdrawalFeesType withdrawalFeeType, boolean withdrawalFeeApplicableForTransfer, - final BigDecimal annualFeeAmount, final MonthDay annualFeeOnMonthDay) { + final BigDecimal withdrawalFeeAmount, final SavingsWithdrawalFeesType withdrawalFeeType, + boolean withdrawalFeeApplicableForTransfer, final BigDecimal annualFeeAmount, final MonthDay annualFeeOnMonthDay) { final SavingsAccountStatusType status = SavingsAccountStatusType.SUBMITTED_AND_PENDING_APPROVAL; return new SavingsAccount(client, group, product, fieldOfficer, accountNo, externalId, status, accountType, submittedOnDate, interestRate, interestCompoundingPeriodType, interestPostingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minRequiredOpeningBalance, lockinPeriodFrequency, lockinPeriodFrequencyType, - withdrawalFeeAmount, withdrawalFeeType,withdrawalFeeApplicableForTransfer, annualFeeAmount, annualFeeOnMonthDay); + withdrawalFeeAmount, withdrawalFeeType, withdrawalFeeApplicableForTransfer, annualFeeAmount, annualFeeOnMonthDay); } private SavingsAccount(final Client client, final Group group, final SavingsProduct product, final Staff fieldOfficer, @@ -276,8 +276,8 @@ public class SavingsAccount extends AbstractPersistable { final SavingsPostingInterestPeriodType interestPostingPeriodType, final SavingsInterestCalculationType interestCalculationType, final SavingsInterestCalculationDaysInYearType interestCalculationDaysInYearType, final BigDecimal minRequiredOpeningBalance, final Integer lockinPeriodFrequency, final SavingsPeriodFrequencyType lockinPeriodFrequencyType, - final BigDecimal withdrawalFeeAmount, final SavingsWithdrawalFeesType withdrawalFeeType,final boolean withdrawalFeeApplicableForTransfer, final BigDecimal annualFeeAmount, - final MonthDay annualFeeOnMonthDay) { + final BigDecimal withdrawalFeeAmount, final SavingsWithdrawalFeesType withdrawalFeeType, + final boolean withdrawalFeeApplicableForTransfer, final BigDecimal annualFeeAmount, final MonthDay annualFeeOnMonthDay) { this.client = client; this.group = group; this.product = product; @@ -465,8 +465,8 @@ public class SavingsAccount extends AbstractPersistable { for (final LocalDateInterval periodInterval : postingPeriodIntervals) { final PostingPeriod postingPeriod = PostingPeriod.createFrom(periodInterval, periodStartingBalance, - retreiveOrderedListOfTransactions(), this.currency, compoundingPeriodType, interestCalculationType, interestRateAsFraction, - daysInYearType.getValue()); + retreiveOrderedListOfTransactions(), this.currency, compoundingPeriodType, interestCalculationType, + interestRateAsFraction, daysInYearType.getValue()); periodStartingBalance = postingPeriod.closingBalance(); @@ -543,14 +543,12 @@ public class SavingsAccount extends AbstractPersistable { } } - public SavingsAccountTransaction deposit(final DateTimeFormatter formatter, final LocalDate transactionDate, - final BigDecimal transactionAmount, final List existingTransactionIds, final List existingReversedTransactionIds, - final PaymentDetail paymentDetail) { + public SavingsAccountTransaction deposit(final SavingsAccountTransactionDTO transactionDTO) { - if (isNotActive()) { + if (transactionDTO.isCheckAccountStatus() && 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", transactionDate.toString(formatter)); + defaultUserMessage, "transactionDate", transactionDTO.getTransactionDate().toString(transactionDTO.getFormatter())); final List dataValidationErrors = new ArrayList(); dataValidationErrors.add(error); @@ -558,10 +556,10 @@ public class SavingsAccount extends AbstractPersistable { throw new PlatformApiDataValidationException(dataValidationErrors); } - if (isDateInTheFuture(transactionDate)) { + if (isDateInTheFuture(transactionDTO.getTransactionDate())) { final String defaultUserMessage = "Transaction date cannot be in the future."; final ApiParameterError error = ApiParameterError.parameterError("error.msg.savingsaccount.transaction.in.the.future", - defaultUserMessage, "transactionDate", transactionDate.toString(formatter)); + defaultUserMessage, "transactionDate", transactionDTO.getTransactionDate().toString(transactionDTO.getFormatter())); final List dataValidationErrors = new ArrayList(); dataValidationErrors.add(error); @@ -569,9 +567,9 @@ public class SavingsAccount extends AbstractPersistable { throw new PlatformApiDataValidationException(dataValidationErrors); } - if (transactionDate.isBefore(getActivationLocalDate())) { - final Object[] defaultUserArgs = Arrays.asList(transactionDate.toString(formatter), - getActivationLocalDate().toString(formatter)).toArray(); + if (transactionDTO.getTransactionDate().isBefore(getActivationLocalDate())) { + final Object[] defaultUserArgs = Arrays.asList(transactionDTO.getTransactionDate().toString(transactionDTO.getFormatter()), + getActivationLocalDate().toString(transactionDTO.getFormatter())).toArray(); final String defaultUserMessage = "Transaction date cannot be before accounts activation date."; final ApiParameterError error = ApiParameterError.parameterError("error.msg.savingsaccount.transaction.before.activation.date", defaultUserMessage, "transactionDate", defaultUserArgs); @@ -582,12 +580,12 @@ public class SavingsAccount extends AbstractPersistable { throw new PlatformApiDataValidationException(dataValidationErrors); } - existingTransactionIds.addAll(findExistingTransactionIds()); - existingReversedTransactionIds.addAll(findExistingReversedTransactionIds()); + transactionDTO.getExistingTransactionIds().addAll(findExistingTransactionIds()); + transactionDTO.getExistingReversedTransactionIds().addAll(findExistingReversedTransactionIds()); - final Money amount = Money.of(this.currency, transactionAmount); + final Money amount = Money.of(this.currency, transactionDTO.getTransactionAmount()); - final SavingsAccountTransaction transaction = SavingsAccountTransaction.deposit(this, paymentDetail, transactionDate, amount); + final SavingsAccountTransaction transaction = SavingsAccountTransaction.deposit(this, transactionDTO.getPaymentDetail(), transactionDTO.getTransactionDate(), amount); this.transactions.add(transaction); this.summary.updateSummary(this.currency, this.savingsAccountTransactionSummaryWrapper, this.transactions); @@ -603,15 +601,13 @@ public class SavingsAccount extends AbstractPersistable { return activationLocalDate; } - public SavingsAccountTransaction withdraw(final DateTimeFormatter formatter, final LocalDate transactionDate, - final BigDecimal transactionAmount, final List existingTransactionIds, final List existingReversedTransactionIds, - final PaymentDetail paymentDetail,final boolean applyWithdrawFee) { + public SavingsAccountTransaction withdraw(SavingsAccountTransactionDTO transactionDTO, final boolean applyWithdrawFee) { - if (isNotActive()) { + if (transactionDTO.isCheckAccountStatus() && 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", transactionDate.toString(formatter)); + defaultUserMessage, "transactionDate", transactionDTO.getTransactionDate().toString(transactionDTO.getFormatter())); final List dataValidationErrors = new ArrayList(); dataValidationErrors.add(error); @@ -619,10 +615,10 @@ public class SavingsAccount extends AbstractPersistable { throw new PlatformApiDataValidationException(dataValidationErrors); } - if (isDateInTheFuture(transactionDate)) { + if (isDateInTheFuture(transactionDTO.getTransactionDate())) { final String defaultUserMessage = "Transaction date cannot be in the future."; final ApiParameterError error = ApiParameterError.parameterError("error.msg.savingsaccount.transaction.in.the.future", - defaultUserMessage, "transactionDate", transactionDate.toString(formatter)); + defaultUserMessage, "transactionDate", transactionDTO.getTransactionDate().toString(transactionDTO.getFormatter())); final List dataValidationErrors = new ArrayList(); dataValidationErrors.add(error); @@ -630,9 +626,9 @@ public class SavingsAccount extends AbstractPersistable { throw new PlatformApiDataValidationException(dataValidationErrors); } - if (transactionDate.isBefore(getActivationLocalDate())) { - final Object[] defaultUserArgs = Arrays.asList(transactionDate.toString(formatter), - getActivationLocalDate().toString(formatter)).toArray(); + if (transactionDTO.getTransactionDate().isBefore(getActivationLocalDate())) { + final Object[] defaultUserArgs = Arrays.asList(transactionDTO.getTransactionDate().toString(transactionDTO.getFormatter()), + getActivationLocalDate().toString(transactionDTO.getFormatter())).toArray(); final String defaultUserMessage = "Transaction date cannot be before accounts activation date."; final ApiParameterError error = ApiParameterError.parameterError("error.msg.savingsaccount.transaction.before.activation.date", defaultUserMessage, "transactionDate", defaultUserArgs); @@ -643,12 +639,12 @@ public class SavingsAccount extends AbstractPersistable { throw new PlatformApiDataValidationException(dataValidationErrors); } - if (isAccountLocked(transactionDate)) { + if (isAccountLocked(transactionDTO.getTransactionDate())) { final String defaultUserMessage = "Withdrawal is not allowed. No withdrawals are allowed until after " - + getLockedInUntilLocalDate().toString(formatter); + + getLockedInUntilLocalDate().toString(transactionDTO.getFormatter()); final ApiParameterError error = ApiParameterError.parameterError( "error.msg.savingsaccount.transaction.withdrawals.blocked.during.lockin.period", defaultUserMessage, "transactionDate", - transactionDate.toString(formatter), getLockedInUntilLocalDate().toString(formatter)); + transactionDTO.getTransactionDate().toString(transactionDTO.getFormatter()), getLockedInUntilLocalDate().toString(transactionDTO.getFormatter())); final List dataValidationErrors = new ArrayList(); dataValidationErrors.add(error); @@ -656,11 +652,11 @@ public class SavingsAccount extends AbstractPersistable { throw new PlatformApiDataValidationException(dataValidationErrors); } - existingTransactionIds.addAll(findExistingTransactionIds()); - existingReversedTransactionIds.addAll(findExistingReversedTransactionIds()); + transactionDTO.getExistingTransactionIds().addAll(findExistingTransactionIds()); + transactionDTO.getExistingReversedTransactionIds().addAll(findExistingReversedTransactionIds()); - final Money transactionAmountMoney = Money.of(this.currency, transactionAmount); - final SavingsAccountTransaction transaction = SavingsAccountTransaction.withdrawal(this, paymentDetail, transactionDate, + final Money transactionAmountMoney = Money.of(this.currency, transactionDTO.getTransactionAmount()); + final SavingsAccountTransaction transaction = SavingsAccountTransaction.withdrawal(this, transactionDTO.getPaymentDetail(), transactionDTO.getTransactionDate(), transactionAmountMoney); this.transactions.add(transaction); @@ -673,14 +669,14 @@ public class SavingsAccount extends AbstractPersistable { break; case FLAT: feeAmount = Money.of(this.currency, this.withdrawalFeeAmount); - withdrawalFeeTransaction = SavingsAccountTransaction.fee(this, transactionDate, feeAmount); + withdrawalFeeTransaction = SavingsAccountTransaction.fee(this, transactionDTO.getTransactionDate(), feeAmount); this.transactions.add(withdrawalFeeTransaction); break; case PERCENT_OF_AMOUNT: - final BigDecimal feeAmountDecimal = transactionAmount.multiply(this.withdrawalFeeAmount).divide( + final BigDecimal feeAmountDecimal = transactionDTO.getTransactionAmount().multiply(this.withdrawalFeeAmount).divide( BigDecimal.valueOf(100l)); feeAmount = Money.of(this.currency, feeAmountDecimal); - withdrawalFeeTransaction = SavingsAccountTransaction.fee(this, transactionDate, feeAmount); + withdrawalFeeTransaction = SavingsAccountTransaction.fee(this, transactionDTO.getTransactionDate(), feeAmount); this.transactions.add(withdrawalFeeTransaction); break; } @@ -806,11 +802,12 @@ public class SavingsAccount extends AbstractPersistable { existingReversedTransactionIds.addAll(findExistingReversedTransactionIds()); final Money annualFee = Money.of(this.currency, this.annualFeeAmount); - final SavingsAccountTransaction annualFeeTransaction = SavingsAccountTransaction.annualFee(this, annualFeeTransactionDate, annualFee); + final SavingsAccountTransaction annualFeeTransaction = SavingsAccountTransaction.annualFee(this, annualFeeTransactionDate, + annualFee); this.transactions.add(annualFeeTransaction); - + validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.applyAnnualFeeTransactionAction); - + this.summary.updateSummary(this.currency, this.savingsAccountTransactionSummaryWrapper, this.transactions); calculateInterestUsing(mc, today); @@ -1035,8 +1032,8 @@ public class SavingsAccount extends AbstractPersistable { actualChanges.put(withdrawalFeeTypeParamName, newValue); this.withdrawalFeeType = newValue != null ? SavingsWithdrawalFeesType.fromInt(newValue).getValue() : newValue; } - - if(command.isChangeInBooleanParameterNamed(withdrawalFeeForTransfersParamName, this.withdrawalFeeApplicableForTransfer)){ + + if (command.isChangeInBooleanParameterNamed(withdrawalFeeForTransfersParamName, this.withdrawalFeeApplicableForTransfer)) { final boolean newValue = command.booleanPrimitiveValueOfParameterNamed(withdrawalFeeForTransfersParamName); actualChanges.put(withdrawalFeeForTransfersParamName, newValue); this.withdrawalFeeApplicableForTransfer = newValue; @@ -1143,7 +1140,8 @@ public class SavingsAccount extends AbstractPersistable { .integerZeroOrGreater(); } } else { - baseDataValidator.reset().parameter(lockinPeriodFrequencyParamName).value(this.lockinPeriodFrequencyType).integerZeroOrGreater(); + baseDataValidator.reset().parameter(lockinPeriodFrequencyParamName).value(this.lockinPeriodFrequencyType) + .integerZeroOrGreater(); baseDataValidator.reset().parameter(lockinPeriodFrequencyTypeParamName).value(this.lockinPeriodFrequencyType).notNull() .inMinMaxRange(0, 3); } @@ -1438,8 +1436,8 @@ public class SavingsAccount extends AbstractPersistable { if (this.annualFeeNextDueDate == null) { updateToNextAnnualFeeDueDateFrom(getActivationLocalDate()); } else { - final LocalDate newAnnualFeeNextDueDate = new LocalDate(this.annualFeeNextDueDate).withMonthOfYear(this.annualFeeOnMonth) - .withDayOfMonth(this.annualFeeOnDay).plusYears(1); + final LocalDate newAnnualFeeNextDueDate = new LocalDate(this.annualFeeNextDueDate) + .withMonthOfYear(this.annualFeeOnMonth).withDayOfMonth(this.annualFeeOnDay).plusYears(1); this.annualFeeNextDueDate = newAnnualFeeNextDueDate.toDate(); } } @@ -1667,8 +1665,9 @@ public class SavingsAccount extends AbstractPersistable { // activating account. final Money minRequiredOpeningBalance = Money.of(this.currency, this.minRequiredOpeningBalance); if (minRequiredOpeningBalance.isGreaterThanZero()) { - deposit(fmt, activationDate, minRequiredOpeningBalance.getAmount(), existingTransactionIds, existingReversedTransactionIds, - null); + SavingsAccountTransactionDTO transactionDTO = new SavingsAccountTransactionDTO(fmt, activationDate, minRequiredOpeningBalance.getAmount(), existingTransactionIds, existingReversedTransactionIds, + null, true); + deposit(transactionDTO); } return actualChanges; @@ -1759,8 +1758,13 @@ public class SavingsAccount extends AbstractPersistable { return this.group; } - public boolean isWithdrawalFeeApplicableForTransfer() { return this.withdrawalFeeApplicableForTransfer; } + + public void activateAccountBasedOnBalance() { + if (SavingsAccountStatusType.fromInt(this.status).isClosed() && !this.summary.getAccountBalance(getCurrency()).isZero()) { + this.status = SavingsAccountStatusType.ACTIVE.getValue(); + } + } } \ No newline at end of file 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 e5025ea04..642c66940 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 @@ -19,6 +19,7 @@ import org.mifosplatform.organisation.monetary.domain.ApplicationCurrency; import org.mifosplatform.organisation.monetary.domain.ApplicationCurrencyRepositoryWrapper; import org.mifosplatform.organisation.monetary.domain.MonetaryCurrency; import org.mifosplatform.portfolio.paymentdetail.domain.PaymentDetail; +import org.mifosplatform.portfolio.savings.data.SavingsAccountTransactionDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -49,9 +50,9 @@ public class SavingsAccountDomainServiceJpa implements SavingsAccountDomainServi final List existingTransactionIds = new ArrayList(); final List existingReversedTransactionIds = new ArrayList(); - - final SavingsAccountTransaction withdrawal = account.withdraw(fmt, transactionDate, transactionAmount, existingTransactionIds, - existingReversedTransactionIds, paymentDetail, applyWithdrawFee); + SavingsAccountTransactionDTO transactionDTO = new SavingsAccountTransactionDTO(fmt, transactionDate, transactionAmount, + existingTransactionIds,existingReversedTransactionIds, paymentDetail,true); + final SavingsAccountTransaction withdrawal = account.withdraw(transactionDTO , applyWithdrawFee); final MathContext mc = MathContext.DECIMAL64; if (account.isBeforeLastPostingPeriod(transactionDate)) { @@ -77,9 +78,9 @@ public class SavingsAccountDomainServiceJpa implements SavingsAccountDomainServi final List existingTransactionIds = new ArrayList(); final List existingReversedTransactionIds = new ArrayList(); - - final SavingsAccountTransaction deposit = account.deposit(fmt, transactionDate, transactionAmount, existingTransactionIds, - existingReversedTransactionIds, paymentDetail); + SavingsAccountTransactionDTO transactionDTO = new SavingsAccountTransactionDTO(fmt, transactionDate, transactionAmount, + existingTransactionIds, existingReversedTransactionIds, paymentDetail, true); + final SavingsAccountTransaction deposit = account.deposit(transactionDTO); final MathContext mc = MathContext.DECIMAL64; if (account.isBeforeLastPostingPeriod(transactionDate)) { 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 d1c111b8b..924e412ab 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 @@ -38,6 +38,7 @@ import org.mifosplatform.portfolio.note.domain.NoteRepository; import org.mifosplatform.portfolio.paymentdetail.domain.PaymentDetail; import org.mifosplatform.portfolio.paymentdetail.service.PaymentDetailWritePlatformService; import org.mifosplatform.portfolio.savings.SavingsApiConstants; +import org.mifosplatform.portfolio.savings.data.SavingsAccountTransactionDTO; import org.mifosplatform.portfolio.savings.data.SavingsAccountTransactionDataValidator; import org.mifosplatform.portfolio.savings.domain.SavingsAccount; import org.mifosplatform.portfolio.savings.domain.SavingsAccountAssembler; @@ -307,7 +308,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi account.calculateInterestUsing(mc, today); } account.validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.undoTransactionAction); - + account.activateAccountBasedOnBalance(); postJournalEntries(account, newTransactionIds, reversedTransactionIds); return new CommandProcessingResultBuilder() // @@ -345,13 +346,23 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi final MathContext mc = new MathContext(10, RoundingMode.HALF_EVEN); account.undoTransaction(transactionId, existingReversedTransactionIds); + + //for undo withdrawal fee + SavingsAccountTransaction nextSavingsAccountTransaction = this.savingsAccountTransactionRepository.findOneByIdAndSavingsAccountId( + transactionId+1, savingsId); + if(nextSavingsAccountTransaction.isWithdrawalFeeAndNotReversed()){ + account.undoTransaction(transactionId+1, existingReversedTransactionIds); + } + SavingsAccountTransaction transaction = null; if (savingsAccountTransaction.isDeposit()) { - transaction = account.deposit(fmt, transactionDate, transactionAmount, existingTransactionIds, existingReversedTransactionIds, - paymentDetail); + SavingsAccountTransactionDTO transactionDTO = new SavingsAccountTransactionDTO(fmt, transactionDate, transactionAmount, + existingTransactionIds, existingReversedTransactionIds,paymentDetail, false); + transaction = account.deposit(transactionDTO); } else { - transaction = account.withdraw(fmt, transactionDate, transactionAmount, existingTransactionIds, existingReversedTransactionIds, - paymentDetail, true); + SavingsAccountTransactionDTO transactionDTO = new SavingsAccountTransactionDTO(fmt, transactionDate, transactionAmount, + existingTransactionIds, existingReversedTransactionIds, paymentDetail, false); + transaction = account.withdraw(transactionDTO , true); } final Long newtransactionId = saveTransactionToGenerateTransactionId(transaction); @@ -362,6 +373,7 @@ public class SavingsAccountWritePlatformServiceJpaRepositoryImpl implements Savi account.calculateInterestUsing(mc, today); } account.validateAccountBalanceDoesNotBecomeNegative(SavingsApiConstants.adjustTransactionAction); + account.activateAccountBasedOnBalance(); postJournalEntries(account, existingTransactionIds, existingReversedTransactionIds); return new CommandProcessingResultBuilder() // .withEntityId(newtransactionId) //