From 097189621f709ad15f23f14e01aa78022f5e306e Mon Sep 17 00:00:00 2001 From: Pramod Nuthakki Date: Fri, 24 Jan 2014 23:47:12 +0530 Subject: [PATCH] MIFOSX-827 corrected update loan charge functionality from modify application --- .../loanaccount/data/LoanChargeData.java | 34 +++++++++++++++++++ .../portfolio/loanaccount/domain/Loan.java | 6 ++-- .../loanaccount/domain/LoanCharge.java | 7 +++- ...WritePlatformServiceJpaRepositoryImpl.java | 26 ++++++++++++-- 4 files changed, 66 insertions(+), 7 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanChargeData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanChargeData.java index bbecea402..83d363b35 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanChargeData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanChargeData.java @@ -221,6 +221,35 @@ public class LoanChargeData { this.loanId = chargeData.loanId; this.installmentChargeData = installmentChargeData; } + + public LoanChargeData(final Long id, final LocalDate dueAsOfDate, final BigDecimal amountOrPercentage) { + this.id = id; + this.chargeId = null; + this.name = null; + this.currency = null; + this.amount = null; + this.amountPaid = null; + this.amountWaived = null; + this.amountWrittenOff = null; + this.amountOutstanding = null; + this.chargeTimeType = null; + this.dueDate = dueAsOfDate; + this.chargeCalculationType = null; + this.percentage = null; + this.amountPercentageAppliedTo = null; + this.penalty = false; + this.chargePaymentMode = null; + this.paid = false; + this.waived = false; + this.amountOrPercentage = amountOrPercentage; + this.chargeOptions = null; + this.chargePayable = false; + this.loanId = null; + this.minCap = null; + this.maxCap = null; + this.installmentChargeData = null; + } + public boolean isChargePayable() { @@ -254,4 +283,9 @@ public class LoanChargeData { } return isInstalmentFee; } + + + public BigDecimal amountOrPercentage() { + return this.amountOrPercentage; + } } \ No newline at end of file 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 c70b4a681..546039e97 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 @@ -963,7 +963,7 @@ public class Loan extends AbstractPersistable { } public Map loanApplicationModification(final JsonCommand command, final Set possiblyModifedLoanCharges, - final Set possiblyModifedLoanCollateralItems, final AprCalculator aprCalculator) { + final Set possiblyModifedLoanCollateralItems, final AprCalculator aprCalculator, boolean isChargesModified) { final Map actualChanges = this.loanRepaymentScheduleDetail.updateLoanApplicationAttributes(command, aprCalculator); if (!actualChanges.isEmpty()) { @@ -1141,9 +1141,7 @@ public class Loan extends AbstractPersistable { final String chargesParamName = "charges"; if (command.parameterExists(chargesParamName)) { - final Set existingLoanCharges = charges(); - - if (!possiblyModifedLoanCharges.equals(existingLoanCharges)) { + if (isChargesModified) { actualChanges.put(chargesParamName, getLoanCharges(possiblyModifedLoanCharges)); actualChanges.put(chargesParamName, getLoanCharges(possiblyModifedLoanCharges)); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java index 330d4fb80..4b847b9e3 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java @@ -352,10 +352,10 @@ public class LoanCharge extends AbstractPersistable { loanCharge = percentageOf(this.amountPercentageAppliedTo); } this.amount = minimumAndMaximumCap(loanCharge); - this.amountOutstanding = calculateOutstanding(); break; } this.amountOrPercentage = amount; + this.amountOutstanding = calculateOutstanding(); if(this.loan !=null && isInstalmentFee()){ final Set chargePerInstallments = this.loan.generateInstallmentLoanCharges(this); if(this.loanInstallmentCharge.isEmpty()){ @@ -786,4 +786,9 @@ public class LoanCharge extends AbstractPersistable { public void setActive(boolean active) { this.active = active; } + + + public BigDecimal amountOrPercentage() { + return this.amountOrPercentage; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java index d78039c7d..db618cf78 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanApplicationWritePlatformServiceJpaRepositoryImpl.java @@ -7,6 +7,7 @@ package org.mifosplatform.portfolio.loanaccount.service; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -45,6 +46,7 @@ import org.mifosplatform.portfolio.fund.domain.Fund; import org.mifosplatform.portfolio.group.domain.Group; import org.mifosplatform.portfolio.group.domain.GroupRepositoryWrapper; import org.mifosplatform.portfolio.group.exception.GroupNotActiveException; +import org.mifosplatform.portfolio.loanaccount.data.LoanChargeData; import org.mifosplatform.portfolio.loanaccount.domain.DefaultLoanLifecycleStateMachine; import org.mifosplatform.portfolio.loanaccount.domain.Loan; import org.mifosplatform.portfolio.loanaccount.domain.LoanCharge; @@ -267,13 +269,33 @@ public class LoanApplicationWritePlatformServiceJpaRepositoryImpl implements Loa if (!existingLoanApplication.isSubmittedAndPendingApproval()) { throw new LoanApplicationNotInSubmittedAndPendingApprovalStateCannotBeModified( loanId); } - + + final Set existingCharges = existingLoanApplication.charges(); + Map chargesMap = new HashMap(); + for(LoanCharge charge:existingCharges){ + LoanChargeData chargeData = new LoanChargeData(charge.getId(),charge.getDueLocalDate() ,charge.amountOrPercentage()); + chargesMap.put(charge.getId(), chargeData); + } + final Set possiblyModifedLoanCharges = this.loanChargeAssembler.fromParsedJson(command.parsedJson()); + boolean isChargeModified = false; + for(LoanCharge loanCharge : possiblyModifedLoanCharges){ + if(loanCharge.getId() == null){ + isChargeModified = true; + }else{ + LoanChargeData chargeData = chargesMap.get(loanCharge.getId()); + if(loanCharge.amountOrPercentage().compareTo(chargeData.amountOrPercentage()) != 0 || + (loanCharge.isSpecifiedDueDate() && !loanCharge.getDueLocalDate().equals(chargeData.getDueDate()))){ + isChargeModified = true; + } + } + } + final Set possiblyModifedLoanCollateralItems = this.loanCollateralAssembler .fromParsedJson(command.parsedJson()); final Map changes = existingLoanApplication.loanApplicationModification(command, possiblyModifedLoanCharges, - possiblyModifedLoanCollateralItems, this.aprCalculator); + possiblyModifedLoanCollateralItems, this.aprCalculator, isChargeModified); if (changes.containsKey("expectedDisbursementDate")) { this.loanAssembler.validateExpectedDisbursementForHolidayAndNonWorkingDay(existingLoanApplication);