diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/domain/AccountTransfer.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/domain/AccountTransfer.java index 4fc639270..212e991a5 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/domain/AccountTransfer.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/account/domain/AccountTransfer.java @@ -175,4 +175,9 @@ public class AccountTransfer extends AbstractPersistable { public SavingsAccount getFromAccount() { return this.fromAccount; } + + + public void updateToLoanTransaction(LoanTransaction toLoanTransaction) { + this.toLoanTransaction = toLoanTransaction; + } } \ No newline at end of file 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 fa04fc9cc..8fa7983af 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 @@ -19,4 +19,7 @@ public interface AccountTransferRepository extends JpaRepository findAllByLoanId(@Param("accountNumber") Long accountNumber); + + @Query("from AccountTransfer at where at.toLoanTransaction.id= :loanTransactionId and at.reversed=false") + AccountTransfer findByToLoanTransactionId(@Param("loanTransactionId") Long loanTransactionId); } \ 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 2c484b47e..68d043e3d 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 @@ -9,6 +9,7 @@ import org.mifosplatform.infrastructure.core.api.JsonCommand; import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; import org.mifosplatform.portfolio.account.PortfolioAccountType; import org.mifosplatform.portfolio.account.data.AccountTransferDTO; +import org.mifosplatform.portfolio.loanaccount.domain.LoanTransaction; public interface AccountTransfersWritePlatformService { @@ -19,4 +20,6 @@ public interface AccountTransfersWritePlatformService { Long transferFunds(AccountTransferDTO accountTransferDTO); void reverseAllTransactions(Long accountId, PortfolioAccountType accountTypeId); + + void updateLoanTransaction(Long loanTransactionId, LoanTransaction newLoanTransaction); } \ 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 3c23a7fc5..029fd2e74 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 @@ -239,6 +239,16 @@ public class AccountTransfersWritePlatformServiceImpl implements AccountTransfer return transferTransactionId; } + + @Override + @Transactional + public void updateLoanTransaction(final Long loanTransactionId,final LoanTransaction newLoanTransaction){ + final AccountTransfer transferTransaction = this.accountTransferRepository.findByToLoanTransactionId(loanTransactionId); + if(transferTransaction!=null){ + transferTransaction.updateToLoanTransaction(newLoanTransaction); + this.accountTransferRepository.save(transferTransaction); + } + } private boolean isLoanToSavingsAccountTransfer(final PortfolioAccountType fromAccountType, final PortfolioAccountType toAccountType) { return fromAccountType.isLoanAccount() && toAccountType.isSavingsAccount(); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/ChangedTransactionDetail.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/ChangedTransactionDetail.java index 2cc96cba1..69d0889e8 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/ChangedTransactionDetail.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/ChangedTransactionDetail.java @@ -5,8 +5,8 @@ */ package org.mifosplatform.portfolio.loanaccount.domain; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; /** * Stores details of {@link LoanTransaction}'s that were reversed or newly @@ -16,16 +16,10 @@ import java.util.List; */ public class ChangedTransactionDetail { - private final List newTransactions = new ArrayList(); + private final Map newTransactionMappings = new HashMap(); - private final List reversedTransactions = new ArrayList(); - - public List getNewTransactions() { - return this.newTransactions; - } - - public List getReversedTransactions() { - return this.reversedTransactions; + public Map getNewTransactionMappings() { + return this.newTransactionMappings; } } 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 fd788bc21..a64e72a30 100644 --- 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 @@ -444,10 +444,10 @@ public class Loan extends AbstractPersistable { final List allNonContraTransactionsPostDisbursement = retreiveListOfTransactionsPostDisbursement(); changedTransactionDetail = loanRepaymentScheduleTransactionProcessor.handleTransaction(getDisbursementDate(), allNonContraTransactionsPostDisbursement, getCurrency(), this.repaymentScheduleInstallments, setOfLoanCharges()); - for (final LoanTransaction transaction : changedTransactionDetail.getNewTransactions()) { - transaction.updateLoan(this); + for(Map.Entry mapEntry:changedTransactionDetail.getNewTransactionMappings().entrySet()){ + mapEntry.getValue().updateLoan(this); } - this.loanTransactions.addAll(changedTransactionDetail.getNewTransactions()); + this.loanTransactions.addAll(changedTransactionDetail.getNewTransactionMappings().values()); } else { // just reprocess the loan schedule only for now. final LoanRepaymentScheduleProcessingWrapper wrapper = new LoanRepaymentScheduleProcessingWrapper(); @@ -1710,10 +1710,10 @@ public class Loan extends AbstractPersistable { final List allNonContraTransactionsPostDisbursement = retreiveListOfTransactionsPostDisbursement(); changedTransactionDetail = loanRepaymentScheduleTransactionProcessor.handleTransaction(getDisbursementDate(), allNonContraTransactionsPostDisbursement, getCurrency(), this.repaymentScheduleInstallments, setOfLoanCharges()); - for (final LoanTransaction newLoanTransaction : changedTransactionDetail.getNewTransactions()) { - newLoanTransaction.updateLoan(this); + for(Map.Entry mapEntry:changedTransactionDetail.getNewTransactionMappings().entrySet()){ + mapEntry.getValue().updateLoan(this); } - this.loanTransactions.addAll(changedTransactionDetail.getNewTransactions()); + this.loanTransactions.addAll(changedTransactionDetail.getNewTransactionMappings().values()); } updateLoanSummaryDerivedFields(); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java index 32d88f2b7..57d3c4bfe 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java @@ -24,6 +24,8 @@ import org.mifosplatform.organisation.monetary.domain.MonetaryCurrency; import org.mifosplatform.organisation.monetary.domain.Money; import org.mifosplatform.organisation.workingdays.domain.WorkingDays; import org.mifosplatform.organisation.workingdays.domain.WorkingDaysRepositoryWrapper; +import org.mifosplatform.portfolio.account.domain.AccountTransfer; +import org.mifosplatform.portfolio.account.domain.AccountTransferRepository; import org.mifosplatform.portfolio.client.domain.Client; import org.mifosplatform.portfolio.client.exception.ClientNotActiveException; import org.mifosplatform.portfolio.group.domain.Group; @@ -49,6 +51,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { private final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepositoryWrapper; private final JournalEntryWritePlatformService journalEntryWritePlatformService; private final NoteRepository noteRepository; + private final AccountTransferRepository accountTransferRepository; @Autowired public LoanAccountDomainServiceJpa(final LoanAssembler loanAccountAssembler, final LoanRepository loanRepository, @@ -56,7 +59,8 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { final ConfigurationDomainService configurationDomainService, final HolidayRepository holidayRepository, final WorkingDaysRepositoryWrapper workingDaysRepository, final ApplicationCurrencyRepositoryWrapper applicationCurrencyRepositoryWrapper, - final JournalEntryWritePlatformService journalEntryWritePlatformService) { + final JournalEntryWritePlatformService journalEntryWritePlatformService, + final AccountTransferRepository accountTransferRepository) { this.loanAccountAssembler = loanAccountAssembler; this.loanRepository = loanRepository; this.loanTransactionRepository = loanTransactionRepository; @@ -66,6 +70,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { this.workingDaysRepository = workingDaysRepository; this.applicationCurrencyRepositoryWrapper = applicationCurrencyRepositoryWrapper; this.journalEntryWritePlatformService = journalEntryWritePlatformService; + this.accountTransferRepository = accountTransferRepository; } @Transactional @@ -115,8 +120,9 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { * recorded against the loan) ***/ if (changedTransactionDetail != null) { - for (final LoanTransaction loanTransaction : changedTransactionDetail.getNewTransactions()) { - this.loanTransactionRepository.save(loanTransaction); + for(Map.Entry mapEntry:changedTransactionDetail.getNewTransactionMappings().entrySet()){ + this.loanTransactionRepository.save(mapEntry.getValue()); + updateLoanTransaction(mapEntry.getKey(), mapEntry.getValue()); } } this.loanRepository.save(loan); @@ -125,6 +131,8 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { final Note note = Note.loanTransactionNote(loan, newRepaymentTransaction, noteText); this.noteRepository.save(note); } + + postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); @@ -247,4 +255,13 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { loanTransaction.reverse(); this.loanTransactionRepository.save(loanTransaction); } + + private void updateLoanTransaction(final Long loanTransactionId,final LoanTransaction newLoanTransaction){ + final AccountTransfer transferTransaction = this.accountTransferRepository.findByToLoanTransactionId(loanTransactionId); + if(transferTransaction!=null){ + transferTransaction.updateToLoanTransaction(newLoanTransaction); + this.accountTransferRepository.save(transferTransaction); + } + } + } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java index 404e3d290..4fca20850 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java @@ -118,8 +118,7 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen **/ if (!LoanTransaction.transactionAmountsMatch(currency, loanTransaction, newLoanTransaction)) { loanTransaction.reverse(); - changedTransactionDetail.getReversedTransactions().add(loanTransaction); - changedTransactionDetail.getNewTransactions().add(newLoanTransaction); + changedTransactionDetail.getNewTransactionMappings().put(loanTransaction.getId(), newLoanTransaction); } } 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 5021d484a..57eb08c83 100644 --- 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 @@ -523,8 +523,9 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf * payment recorded against the loan) ***/ if (changedTransactionDetail != null) { - for (final LoanTransaction loanTransaction : changedTransactionDetail.getNewTransactions()) { - this.loanTransactionRepository.save(loanTransaction); + for(Map.Entry mapEntry:changedTransactionDetail.getNewTransactionMappings().entrySet()){ + this.loanTransactionRepository.save(mapEntry.getValue()); + this.accountTransfersWritePlatformService.updateLoanTransaction(mapEntry.getKey(), mapEntry.getValue()); } } @@ -598,8 +599,9 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf * recorded against the loan) ***/ if (changedTransactionDetail != null) { - for (final LoanTransaction loanTransaction : changedTransactionDetail.getNewTransactions()) { - this.loanTransactionRepository.save(loanTransaction); + for(Map.Entry mapEntry:changedTransactionDetail.getNewTransactionMappings().entrySet()){ + this.loanTransactionRepository.save(mapEntry.getValue()); + this.accountTransfersWritePlatformService.updateLoanTransaction(mapEntry.getKey(), mapEntry.getValue()); } } @@ -819,8 +821,9 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf * latest payment recorded against the loan) ***/ if (changedTransactionDetail != null) { - for (final LoanTransaction loanTransaction : changedTransactionDetail.getNewTransactions()) { - this.loanTransactionRepository.save(loanTransaction); + for(Map.Entry mapEntry:changedTransactionDetail.getNewTransactionMappings().entrySet()){ + this.loanTransactionRepository.save(mapEntry.getValue()); + this.accountTransfersWritePlatformService.updateLoanTransaction(mapEntry.getKey(), mapEntry.getValue()); } }