You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by na...@apache.org on 2017/03/30 11:12:39 UTC

incubator-fineract git commit: FINERACT-78 : Specified due date percentage charge calculation uses loan principal amount instead of installment principal amount

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 <na...@confluxtechnologies.com>
Authored: Mon Mar 27 17:34:20 2017 +0530
Committer: nazeer1100126 <na...@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);