From 8baf9f4cd0de899ae015f1994e17b1b0e8b39641 Mon Sep 17 00:00:00 2001 From: nazeer1100126 Date: Mon, 27 Mar 2017 17:34:20 +0530 Subject: [PATCH] FINERACT-78 : Specified due date percentage charge calculation uses loan principal amount instead of installment principal amount --- .../portfolio/loanaccount/domain/Loan.java | 16 ++++++++-- .../loanaccount/domain/LoanCharge.java | 31 ++++++++++++++++++- ...oanRepaymentScheduleProcessingWrapper.java | 16 ++++++++-- 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java index 8b1cc2a41..56eba2696 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java @@ -6065,12 +6065,24 @@ public class Loan extends AbstractPersistableCustom { return nextRepaymentDate; } - public BigDecimal getDerivedAmountForCharge(LoanCharge loanCharge) { + public BigDecimal getDerivedAmountForCharge(final LoanCharge loanCharge) { BigDecimal amount = BigDecimal.ZERO; if (isMultiDisburmentLoan() && (loanCharge.getCharge().getChargeTimeType() == ChargeTimeType.DISBURSEMENT.getValue())) { amount = getApprovedPrincipal(); } else { - amount = getPrincpal().getAmount(); + // If charge type is specified due date and loan is multi disburment + // loan. + // Then we need to get as of this loan charge due date how much + // amount disbursed. + if (loanCharge.isSpecifiedDueDate() && this.isMultiDisburmentLoan()) { + for (final LoanDisbursementDetails loanDisbursementDetails : this.getDisbursementDetails()) { + if (!loanDisbursementDetails.expectedDisbursementDate().after(loanCharge.getDueDate())) { + amount = amount.add(loanDisbursementDetails.principal()); + } + } + } else { + amount = getPrincpal().getAmount(); + } } return amount; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java index 5a8582f4b..8dc72071b 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java @@ -182,6 +182,19 @@ public class LoanCharge extends AbstractPersistableCustom { percentage); } + // If charge type is specified due date and loan is multi disburment + // loan. + // Then we need to get as of this loan charge due date how much amount + // disbursed. + if (chargeDefinition.getChargeTimeType().equals(ChargeTimeType.SPECIFIED_DUE_DATE.getValue()) && loan.isMultiDisburmentLoan()) { + amountPercentageAppliedTo = BigDecimal.ZERO; + for (final LoanDisbursementDetails loanDisbursementDetails : loan.getDisbursementDetails()) { + if (!loanDisbursementDetails.expectedDisbursementDate().after(dueDate.toDate())) { + amountPercentageAppliedTo = amountPercentageAppliedTo.add(loanDisbursementDetails.principal()); + } + } + } + return new LoanCharge(loan, chargeDefinition, amountPercentageAppliedTo, amount, chargeTime, chargeCalculation, dueDate, chargePaymentMode, null, loanCharge); } @@ -408,7 +421,19 @@ public class LoanCharge extends AbstractPersistableCustom { if (this.loan != null) { switch (ChargeCalculationType.fromInt(this.chargeCalculation)) { case PERCENT_OF_AMOUNT: - amountPercentageAppliedTo = this.loan.getPrincpal().getAmount(); + // If charge type is specified due date and loan is multi + // disburment loan. + // Then we need to get as of this loan charge due date how + // much amount disbursed. + if (this.loan.isMultiDisburmentLoan() && this.isSpecifiedDueDate()) { + for (final LoanDisbursementDetails loanDisbursementDetails : this.loan.getDisbursementDetails()) { + if (!loanDisbursementDetails.expectedDisbursementDate().after(this.getDueDate())) { + amountPercentageAppliedTo = amountPercentageAppliedTo.add(loanDisbursementDetails.principal()); + } + } + } else { + amountPercentageAppliedTo = this.loan.getPrincpal().getAmount(); + } break; case PERCENT_OF_AMOUNT_AND_INTEREST: amountPercentageAppliedTo = this.loan.getPrincpal().getAmount().add(this.loan.getTotalInterest()); @@ -553,6 +578,10 @@ public class LoanCharge extends AbstractPersistableCustom { } return dueDate; } + + public Date getDueDate() { + return this.dueDate; + } private boolean determineIfFullyPaid() { if (this.amount == null) { return true; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java index e8a5aa3e2..aad2bab8d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java @@ -19,6 +19,7 @@ package org.apache.fineract.portfolio.loanaccount.domain; import java.math.BigDecimal; +import java.util.Date; import java.util.List; import java.util.Set; @@ -71,7 +72,6 @@ public class LoanRepaymentScheduleProcessingWrapper { final Money totalInterest, boolean isInstallmentChargeApplicable) { Money cumulative = Money.zero(monetaryCurrency); - for (final LoanCharge loanCharge : loanCharges) { if (loanCharge.isFeeCharge() && !loanCharge.isDueAtDisbursement()) { if (loanCharge.isInstalmentFee() && isInstallmentChargeApplicable) { @@ -102,7 +102,19 @@ public class LoanRepaymentScheduleProcessingWrapper { } else if (loanCharge.getChargeCalculation().isPercentageOfInterest()) { amount = amount.add(totalInterest.getAmount()); } else { - amount = amount.add(totalPrincipal.getAmount()); + // If charge type is specified due date and loan is + // multi disburment loan. + // Then we need to get as of this loan charge due date + // how much amount disbursed. + if (loanCharge.getLoan() != null && loanCharge.isSpecifiedDueDate() && loanCharge.getLoan().isMultiDisburmentLoan()) { + for (final LoanDisbursementDetails loanDisbursementDetails : loanCharge.getLoan().getDisbursementDetails()) { + if (!loanDisbursementDetails.expectedDisbursementDate().after(loanCharge.getDueDate())) { + amount = amount.add(loanDisbursementDetails.principal()); + } + } + } else { + amount = amount.add(totalPrincipal.getAmount()); + } } BigDecimal loanChargeAmt = amount.multiply(loanCharge.getPercentage()).divide(BigDecimal.valueOf(100)); cumulative = cumulative.plus(loanChargeAmt);