Repository: incubator-fineract Updated Branches: refs/heads/develop 254d25970 -> 8baf9f4cd
FINERACT-78 : Specified due date percentage charge calculation uses loan principal amount instead of installment principal amount Project: http://git-wip-us.apache.org/repos/asf/incubator-fineract/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-fineract/commit/8baf9f4c Tree: http://git-wip-us.apache.org/repos/asf/incubator-fineract/tree/8baf9f4c Diff: http://git-wip-us.apache.org/repos/asf/incubator-fineract/diff/8baf9f4c Branch: refs/heads/develop Commit: 8baf9f4cd0de899ae015f1994e17b1b0e8b39641 Parents: 254d259 Author: nazeer1100126 <nazeer.sh...@confluxtechnologies.com> Authored: Mon Mar 27 17:34:20 2017 +0530 Committer: nazeer1100126 <nazeer.sh...@confluxtechnologies.com> Committed: Tue Mar 28 13:52:20 2017 +0530 ---------------------------------------------------------------------- .../portfolio/loanaccount/domain/Loan.java | 16 ++++++++-- .../loanaccount/domain/LoanCharge.java | 31 +++++++++++++++++++- .../LoanRepaymentScheduleProcessingWrapper.java | 16 ++++++++-- 3 files changed, 58 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/8baf9f4c/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java ---------------------------------------------------------------------- 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 8b1cc2a..56eba26 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<Long> { 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; } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/8baf9f4c/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java ---------------------------------------------------------------------- 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 5a8582f..8dc7207 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<Long> { 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<Long> { 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<Long> { } return dueDate; } + + public Date getDueDate() { + return this.dueDate; + } private boolean determineIfFullyPaid() { if (this.amount == null) { return true; } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/8baf9f4c/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java ---------------------------------------------------------------------- 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 e8a5aa3..aad2bab 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);