From 9f2247953e699378b548efa32ec93b4d70aba755 Mon Sep 17 00:00:00 2001 From: Pramod Nuthakki Date: Thu, 19 Sep 2013 20:41:44 +0530 Subject: [PATCH] resolved concurrent exception --- api-docs/apiLive.htm | 4 ++-- .../portfolio/loanaccount/domain/Loan.java | 19 +++++++++++-------- .../domain/LoanAccountDomainServiceJpa.java | 2 +- ...WritePlatformServiceJpaRepositoryImpl.java | 16 +++++++++++----- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm index b8fc7a7a4..cec952c08 100644 --- a/api-docs/apiLive.htm +++ b/api-docs/apiLive.htm @@ -458,7 +458,7 @@ loans/{loanId}/charges/{loanChargeId} - Pay Loan Charge + Pay Loan Charge from Linked Savings Retrieve a Loan Charge Modify a Loan Charge Delete a Loan Charge @@ -19145,7 +19145,7 @@ GET https://DomainName/api/v1/search?query=000000111 loans/{loanId}/charges/{loanChargeId} - Pay a Loan Charge + Pay Loan Charge from Linked Savings Retrieve a Loan Charge Modify a Loan Charge Delete a Loan Charge 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 44df3bf05..4ccd0aedc 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 @@ -1452,25 +1452,28 @@ public class Loan extends AbstractPersistable { * "APPLY Charge" transactions are created for all other fees ( * which are created during disbursal but not repaid) **/ + Money disbursentMoney = Money.zero(getCurrency()); + final LoanTransaction chargesPayment = LoanTransaction.repaymentAtDisbursement(this.getOffice(), + disbursentMoney, null, disbursedOn, txnExternalId); for (final LoanCharge charge : setOfLoanCharges()) { if (charge.isDueAtDisbursement()) { if (totalFeeChargesDueAtDisbursement.isGreaterThanZero() && !charge.getChargePaymentMode().isPaymentModeAccountTransfer()) { - final LoanTransaction chargesPayment = LoanTransaction.repaymentAtDisbursement(this.getOffice(), - charge.getAmount(getCurrency()), null, disbursedOn, txnExternalId); - final Money zero = Money.zero(getCurrency()); - chargesPayment.updateComponents(zero, zero, charge.getAmount(getCurrency()), zero); - chargesPayment.updateLoan(this); - this.loanTransactions.add(chargesPayment); - charge.markAsFullyPaid(); // Add "Loan Charge Paid By" details to this transaction final LoanChargePaidBy loanChargePaidBy = new LoanChargePaidBy(chargesPayment, charge, charge.amount()); chargesPayment.getLoanChargesPaid().add(loanChargePaidBy); + disbursentMoney = disbursentMoney.plus(charge.amount()); } } else { handleChargeAppliedTransaction(charge, disbursedOn); } - } + } + if(disbursentMoney.isGreaterThanZero()){ + final Money zero = Money.zero(getCurrency()); + chargesPayment.updateComponentsAndTotal(zero, zero, disbursentMoney, zero); + chargesPayment.updateLoan(this); + this.loanTransactions.add(chargesPayment); + } if (getApprovedOnDate() != null && disbursedOn.isBefore(getApprovedOnDate())) { final String errorMessage = "The date on which a loan is disbursed cannot be before its approval date: " 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 1fd68c6b5..85e4b6a1d 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 @@ -164,7 +164,7 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { allowTransactionsOnHoliday, holidays, workingDays, allowTransactionsOnNonWorkingDay, newPaymentTransaction); } this.loanTransactionRepository.save(newPaymentTransaction); - this.loanRepository.save(loan); + this.loanRepository.saveAndFlush(loan); if (StringUtils.isNotBlank(noteText)) { final Note note = Note.loanTransactionNote(loan, newPaymentTransaction, noteText); 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 49c93cc4d..02435d792 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 @@ -9,6 +9,8 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; @@ -245,17 +247,21 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf } Set loanCharges = loan.charges(); - final Locale locale = command.extractLocale(); - final DateTimeFormatter fmt = DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale); + Map disBuLoanCharges = new HashMap(); for (LoanCharge loanCharge : loanCharges) { if (loanCharge.isDueAtDisbursement() && loanCharge.getChargePaymentMode().isPaymentModeAccountTransfer()) { + disBuLoanCharges.put(loanCharge.getId(), loanCharge.amount()); + } + } + final Locale locale = command.extractLocale(); + final DateTimeFormatter fmt = DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale); + for (Map.Entry entrySet: disBuLoanCharges.entrySet()) { PortfolioAccountData savingAccountData = this.accountAssociationsReadPlatformService.retriveLoanAssociation(loanId); - AccountTransferDTO accountTransferDTO = new AccountTransferDTO(actualDisbursementDate, loanCharge.amount(), + AccountTransferDTO accountTransferDTO = new AccountTransferDTO(actualDisbursementDate, entrySet.getValue(), PortfolioAccountType.SAVINGS, PortfolioAccountType.LOAN, savingAccountData.accountId(), loanId, "Loan Charge Payment", locale, fmt, null, null, LoanTransactionType.REPAYMENT_AT_DISBURSEMENT.getValue(), - loanCharge.getId()); + entrySet.getKey()); accountTransfersWritePlatformService.transferFunds(accountTransferDTO); - } } return new CommandProcessingResultBuilder() //