This is an automated email from the ASF dual-hosted git repository.

adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new 84d606552 FINERACT-1981: Fix Better EMI check in EMI Calculator
84d606552 is described below

commit 84d606552df273c27fbcbd119c728a530f7788ce
Author: Janos Meszaros <[email protected]>
AuthorDate: Fri Oct 18 17:14:38 2024 +0200

    FINERACT-1981: Fix Better EMI check in EMI Calculator
---
 .../loanschedule/data/RepaymentPeriod.java         |  2 +-
 .../loanproduct/calc/ProgressiveEMICalculator.java |  6 ++--
 .../calc/ProgressiveEMICalculatorTest.java         | 37 ++++++++++++++++++++++
 3 files changed, 41 insertions(+), 4 deletions(-)

diff --git 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/RepaymentPeriod.java
 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/RepaymentPeriod.java
index 132bfb67f..d9ff4e89f 100644
--- 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/RepaymentPeriod.java
+++ 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/RepaymentPeriod.java
@@ -155,7 +155,7 @@ public class RepaymentPeriod {
                         .minus(getDuePrincipal())//
                         .plus(getPaidPrincipal());//
                 return 
MathUtil.negativeToZero(calculatedOutStandingLoanBalance);
-            }, () -> interestPeriods);
+            }, () -> new Object[] { paidPrincipal, paidInterest, 
interestPeriods });
         }
         return outstandingBalanceCalculation.get();
     }
diff --git 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/ProgressiveEMICalculator.java
 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/ProgressiveEMICalculator.java
index a632654f6..c2ab25fa8 100644
--- 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/ProgressiveEMICalculator.java
+++ 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/ProgressiveEMICalculator.java
@@ -186,9 +186,6 @@ public final class ProgressiveEMICalculator implements 
EMICalculator {
         calculateOutstandingBalance(scheduleModel);
         calculateLastUnpaidRepaymentPeriodEMI(scheduleModel);
         checkAndAdjustEmiIfNeededOnRelatedRepaymentPeriods(scheduleModel, 
relatedRepaymentPeriods);
-        // TODO: optimalize
-        calculateOutstandingBalance(scheduleModel);
-        calculateLastUnpaidRepaymentPeriodEMI(scheduleModel);
     }
 
     private void 
calculateLastUnpaidRepaymentPeriodEMI(ProgressiveLoanInterestScheduleModel 
scheduleModel) {
@@ -235,6 +232,8 @@ public final class ProgressiveEMICalculator implements 
EMICalculator {
                     period.setEmi(adjustedEqualMonthlyInstallmentValue);
                 }
             });
+            calculateOutstandingBalance(newScheduleModel);
+            calculateLastUnpaidRepaymentPeriodEMI(newScheduleModel);
             final Money newEmiDifference = 
getDifferenceBetweenLastTwoPeriod(newScheduleModel.repaymentPeriods(), 
scheduleModel);
             final boolean newEmiHasLessDifference = 
newEmiDifference.abs().isLessThan(emiDifference.abs());
             if (!newEmiHasLessDifference) {
@@ -252,6 +251,7 @@ public final class ProgressiveEMICalculator implements 
EMICalculator {
                 final RepaymentPeriod newRepaymentPeriod = 
relatedPeriodFromNewModelIterator.next();
                 relatedRepaymentPeriod.setEmi(newRepaymentPeriod.getEmi());
             });
+            calculateOutstandingBalance(scheduleModel);
         }
     }
 
diff --git 
a/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/calc/ProgressiveEMICalculatorTest.java
 
b/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/calc/ProgressiveEMICalculatorTest.java
index 6d3de1cd4..1f7b6cb87 100644
--- 
a/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/calc/ProgressiveEMICalculatorTest.java
+++ 
b/fineract-progressive-loan/src/test/java/org/apache/fineract/portfolio/loanproduct/calc/ProgressiveEMICalculatorTest.java
@@ -233,6 +233,43 @@ class ProgressiveEMICalculatorTest {
         }
     }
 
+    @Test
+    public void testEMICalculation_CheckEmiButNewEmiNotBetterThanOriginal() {
+
+        final List<LoanScheduleModelRepaymentPeriod> expectedRepaymentPeriods 
= new ArrayList<>();
+
+        expectedRepaymentPeriods.add(repayment(1, LocalDate.of(2024, 1, 1), 
LocalDate.of(2024, 2, 1)));
+        expectedRepaymentPeriods.add(repayment(2, LocalDate.of(2024, 2, 1), 
LocalDate.of(2024, 3, 1)));
+        expectedRepaymentPeriods.add(repayment(3, LocalDate.of(2024, 3, 1), 
LocalDate.of(2024, 4, 1)));
+        expectedRepaymentPeriods.add(repayment(4, LocalDate.of(2024, 4, 1), 
LocalDate.of(2024, 5, 1)));
+        expectedRepaymentPeriods.add(repayment(5, LocalDate.of(2024, 5, 1), 
LocalDate.of(2024, 6, 1)));
+        expectedRepaymentPeriods.add(repayment(6, LocalDate.of(2024, 6, 1), 
LocalDate.of(2024, 7, 1)));
+
+        final BigDecimal interestRate = BigDecimal.valueOf(15.678);
+        final Integer installmentAmountInMultiplesOf = null;
+
+        
Mockito.when(loanProductRelatedDetail.getAnnualNominalInterestRate()).thenReturn(interestRate);
+        
Mockito.when(loanProductRelatedDetail.getDaysInYearType()).thenReturn(DaysInYearType.DAYS_365.getValue());
+        
Mockito.when(loanProductRelatedDetail.getDaysInMonthType()).thenReturn(DaysInMonthType.ACTUAL.getValue());
+        
Mockito.when(loanProductRelatedDetail.getRepaymentPeriodFrequencyType()).thenReturn(PeriodFrequencyType.MONTHS);
+        Mockito.when(loanProductRelatedDetail.getRepayEvery()).thenReturn(1);
+        
Mockito.when(loanProductRelatedDetail.getCurrency()).thenReturn(monetaryCurrency);
+
+        final ProgressiveLoanInterestScheduleModel interestSchedule = 
emiCalculator.generateInterestScheduleModel(expectedRepaymentPeriods,
+                loanProductRelatedDetail, installmentAmountInMultiplesOf);
+
+        final Money disbursedAmount = toMoney(100.0);
+        emiCalculator.addDisbursement(interestSchedule, LocalDate.of(2024, 1, 
1), disbursedAmount);
+
+        checkPeriod(interestSchedule, 0, 0, 17.43, 0.0, 0.0, 1.33, 16.1, 83.9);
+        checkPeriod(interestSchedule, 0, 1, 17.43, 0.013315561644, 1.33, 16.1, 
83.9);
+        checkPeriod(interestSchedule, 1, 0, 17.43, 0.012456493151, 1.05, 
16.38, 67.52);
+        checkPeriod(interestSchedule, 2, 0, 17.43, 0.013315561644, 0.90, 
16.53, 50.99);
+        checkPeriod(interestSchedule, 3, 0, 17.43, 0.012886027397, 0.66, 
16.77, 34.22);
+        checkPeriod(interestSchedule, 4, 0, 17.43, 0.013315561644, 0.46, 
16.97, 17.25);
+        checkPeriod(interestSchedule, 5, 0, 17.47, 0.012886027397, 0.22, 
17.25, 0.0);
+    }
+
     @Test
     public void 
testEMICalculation_disbursedAmt100_dayInYears360_daysInMonth30_repayEvery1Month()
 {
 

Reply via email to