diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/domain/AccountTransferRepository.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/domain/AccountTransferRepository.java index 8ec735b15..a6968d253 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/domain/AccountTransferRepository.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/domain/AccountTransferRepository.java @@ -5,6 +5,7 @@ */ package org.mifosplatform.portfolio.account.domain; +import java.util.Collection; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; @@ -12,14 +13,18 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -public interface AccountTransferRepository extends JpaRepository, JpaSpecificationExecutor { +public interface AccountTransferRepository extends JpaRepository, + JpaSpecificationExecutor { @Query("from AccountTransferTransaction att where att.accountTransferDetails.fromLoanAccount.id= :accountNumber and att.reversed=false") List findByFromLoanId(@Param("accountNumber") Long accountNumber); - @Query("from AccountTransferTransaction att where (att.accountTransferDetails.fromLoanAccount.id= :accountNumber or att.accountTransferDetails.toLoanAccount.id=:accountNumber) and att.reversed=false") + @Query("from AccountTransferTransaction att where (att.accountTransferDetails.fromLoanAccount.id= :accountNumber or att.accountTransferDetails.toLoanAccount.id=:accountNumber) and att.reversed=false order by att.id desc") List findAllByLoanId(@Param("accountNumber") Long accountNumber); @Query("from AccountTransferTransaction att where att.toLoanTransaction.id= :loanTransactionId and att.reversed=false") AccountTransferTransaction findByToLoanTransactionId(@Param("loanTransactionId") Long loanTransactionId); + + @Query("from AccountTransferTransaction att where att.fromLoanTransaction.id IN :loanTransactions and att.reversed=false") + List findByFromLoanTransactions(@Param("loanTransactions") Collection loanTransactions); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/service/AccountTransfersWritePlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/service/AccountTransfersWritePlatformService.java index 4f2ce4154..351f2516b 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/service/AccountTransfersWritePlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/service/AccountTransfersWritePlatformService.java @@ -5,6 +5,8 @@ */ package org.mifosplatform.portfolio.account.service; +import java.util.Collection; + import org.mifosplatform.infrastructure.core.api.JsonCommand; import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; import org.mifosplatform.portfolio.account.PortfolioAccountType; @@ -24,4 +26,6 @@ public interface AccountTransfersWritePlatformService { void updateLoanTransaction(Long loanTransactionId, LoanTransaction newLoanTransaction); CommandProcessingResult refundByTransfer(JsonCommand command); + + void reverseTransfersWithFromAccountTransactions(Collection fromTransactionIds, PortfolioAccountType accountTypeId); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/service/AccountTransfersWritePlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/service/AccountTransfersWritePlatformServiceImpl.java index 33d852cfd..2e6dec65e 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/service/AccountTransfersWritePlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/service/AccountTransfersWritePlatformServiceImpl.java @@ -13,6 +13,7 @@ import static org.mifosplatform.portfolio.account.api.AccountTransfersApiConstan import static org.mifosplatform.portfolio.account.api.AccountTransfersApiConstants.transferDateParamName; import java.math.BigDecimal; +import java.util.Collection; import java.util.List; import java.util.Locale; @@ -203,6 +204,19 @@ public class AccountTransfersWritePlatformServiceImpl implements AccountTransfer } } + + @Override + @Transactional + public void reverseTransfersWithFromAccountTransactions(final Collection fromTransactionIds, final PortfolioAccountType accountTypeId) { + List acccountTransfers = null; + if (accountTypeId.isLoanAccount()) { + acccountTransfers = this.accountTransferRepository.findByFromLoanTransactions(fromTransactionIds); + } + if (acccountTransfers != null && acccountTransfers.size() > 0) { + undoTransactions(acccountTransfers); + } + + } @Override @Transactional diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java index 7c4095fe9..9266d5a02 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java @@ -1194,6 +1194,11 @@ public class Loan extends AbstractPersistable { updateLoanOutstandingBalaces(); } } + + public void updateLoanSummarAndStatus(){ + updateLoanSummaryDerivedFields(); + doPostLoanTransactionChecks(getLastUserTransactionDate(), loanLifecycleStateMachine); + } public Map loanApplicationModification(final JsonCommand command, final Set possiblyModifedLoanCharges, final Set possiblyModifedLoanCollateralItems, final AprCalculator aprCalculator, boolean isChargesModified) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index c0cf49443..88b38c017 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -944,7 +944,19 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf } this.noteRepository.save(note); } - this.accountTransfersWritePlatformService.reverseTransfersWithFromAccountType(loanId, PortfolioAccountType.LOAN); + + Collection transactionIds = new ArrayList<>(); + for (LoanTransaction transaction : loan.getLoanTransactions()) { + if (transaction.isRefund() && transaction.isNotReversed()) { + transactionIds.add(transaction.getId()); + } + } + + if (!transactionIds.isEmpty()) { + this.accountTransfersWritePlatformService + .reverseTransfersWithFromAccountTransactions(transactionIds, PortfolioAccountType.LOAN); + loan.updateLoanSummarAndStatus(); + } postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); @@ -1307,16 +1319,15 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf boolean pendingDisbursementAvailable = false; for (LoanDisbursementDetails disbursementDetail : loanDisburseDetails) { if (disbursementDetail.actualDisbursementDate() == null) { - pendingDisbursementAvailable = true ; - break ; + pendingDisbursementAvailable = true; + break; } } - if(!pendingDisbursementAvailable) { - throw new ChargeCannotBeUpdatedException( - "error.msg.charge.cannot.be.updated.no.pending.disbursements.in.loan", "This charge cannot be added, No disbursement is pending"); - } + if (!pendingDisbursementAvailable) { throw new ChargeCannotBeUpdatedException( + "error.msg.charge.cannot.be.updated.no.pending.disbursements.in.loan", + "This charge cannot be added, No disbursement is pending"); } } - + @Transactional @Override public CommandProcessingResult addLoanCharge(final Long loanId, final JsonCommand command) { @@ -1330,12 +1341,19 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final Long chargeDefinitionId = command.longValueOfParameterNamed("chargeId"); final Charge chargeDefinition = this.chargeRepository.findOneWithNotFoundDetection(chargeDefinitionId); - if(loan.isDisbursed() && chargeDefinition.isDisbursementCharge()) { - validateAddingNewChargeAllowed(loanDisburseDetails) ; //validates whether any pending disbursements are available to apply this charge + if (loan.isDisbursed() && chargeDefinition.isDisbursementCharge()) { + validateAddingNewChargeAllowed(loanDisburseDetails); // validates + // whether any + // pending + // disbursements + // are + // available to + // apply this + // charge } final List existingTransactionIds = new ArrayList<>(loan.findExistingTransactionIds()); final List existingReversedTransactionIds = new ArrayList<>(loan.findExistingReversedTransactionIds()); - + boolean isAppliedOnBackDate = false; LoanCharge loanCharge = null; if (chargeDefinition.isPercentageOfDisbursementAmount()) { @@ -2704,7 +2722,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf loan.regenerateRepaymentScheduleWithInterestRecalculation(scheduleGeneratorDTO, currentUser); } else { loan.regenerateRepaymentSchedule(scheduleGeneratorDTO, currentUser); - loan.processPostDisbursementTransactions() ; + loan.processPostDisbursementTransactions(); } }