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

commit fb43706e6c23d3bde00aa2d728628e107dd9332c
Author: Soma Sörös <[email protected]>
AuthorDate: Thu Feb 5 19:33:18 2026 +0100

    FINERACT-2413: Re-amortization:- Accrual and Accrual Activity handling - 
Equal outstanding interest split
---
 .../features/LoanReAgingEqualAmortization.feature  | 20 ++++++------
 .../resources/features/LoanReAmortization.feature  | 36 +++++++++++-----------
 .../loanproduct/calc/ProgressiveEMICalculator.java | 26 ++++++++++------
 .../loanproduct/calc/data/RepaymentPeriod.java     | 28 +++++++++--------
 4 files changed, 60 insertions(+), 50 deletions(-)

diff --git 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanReAgingEqualAmortization.feature
 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanReAgingEqualAmortization.feature
index 5a0f02d3b0..07f950103a 100644
--- 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanReAgingEqualAmortization.feature
+++ 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanReAgingEqualAmortization.feature
@@ -9366,16 +9366,16 @@ Feature: LoanReAgingEqualAmortization
       | frequencyNumber | frequencyType | startDate        | 
numberOfInstallments | reAgeInterestHandling            |
       | 1               | MONTHS        | 15 February 2024 | 6                 
   | EQUAL_AMORTIZATION_FULL_INTEREST |
     Then Loan Repayment schedule has 8 periods, with the following data for 
periods:
-      | Nr | Days | Date              | Paid date        | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due   | Paid  | In advance | Late 
| Outstanding |
-      |    |      | 01 January 2024   |                  | 100.0           |   
            |          | 0.0  |           | 0.0   | 0.0   |            |      | 
            |
-      | 1  | 31   | 01 February 2024  | 01 February 2024 | 83.57           | 
16.43         | 0.58     | 0.0  | 0.0       | 17.01 | 17.01 | 0.0        | 0.0  
| 0.0         |
-      | 2  | 14   | 15 February 2024  | 15 February 2024 | 83.57           | 
0.0           | 0.0      | 0.0  | 0.0       | 0.0   | 0.0   | 0.0        | 0.0  
| 0.0         |
-      | 3  |  0   | 15 February 2024  |                  | 69.64           | 
13.93         | 0.24     | 0.0  | 0.0       | 14.17 | 0.0   | 0.0        | 0.0  
| 14.17       |
-      | 4  | 29   | 15 March 2024     |                  | 55.71           | 
13.93         | 0.24     | 0.0  | 0.0       | 14.17 | 0.0   | 0.0        | 0.0  
| 14.17       |
-      | 5  | 31   | 15 April 2024     |                  | 41.77           | 
13.94         | 0.24     | 0.0  | 0.0       | 14.18 | 0.0   | 0.0        | 0.0  
| 14.18       |
-      | 6  | 30   | 15 May 2024       |                  | 27.83           | 
13.94         | 0.24     | 0.0  | 0.0       | 14.18 | 0.0   | 0.0        | 0.0  
| 14.18       |
-      | 7  | 31   | 15 June 2024      |                  | 13.89           | 
13.94         | 0.24     | 0.0  | 0.0       | 14.18 | 0.0   | 0.0        | 0.0  
| 14.18       |
-      | 8  | 30   | 15 July 2024      |                  | 0.0             | 
13.89         | 0.27     | 0.0  | 0.0       | 14.16 | 0.0   | 0.0        | 0.0  
| 14.16       |
+      | Nr | Days | Date             | Paid date        | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due   | Paid  | In advance | Late 
| Outstanding |
+      |    |      | 01 January 2024  |                  | 100.0           |    
           |          | 0.0  |           | 0.0   | 0.0   |            |      |  
           |
+      | 1  | 31   | 01 February 2024 | 01 February 2024 | 83.57           | 
16.43         | 0.58     | 0.0  | 0.0       | 17.01 | 17.01 | 0.0        | 0.0  
| 0.0         |
+      | 2  | 14   | 15 February 2024 | 15 February 2024 | 83.57           | 
0.0           | 0.0      | 0.0  | 0.0       | 0.0   | 0.0   | 0.0        | 0.0  
| 0.0         |
+      | 3  | 0    | 15 February 2024 |                  | 69.64           | 
13.93         | 0.24     | 0.0  | 0.0       | 14.17 | 0.0   | 0.0        | 0.0  
| 14.17       |
+      | 4  | 29   | 15 March 2024    |                  | 55.71           | 
13.93         | 0.24     | 0.0  | 0.0       | 14.17 | 0.0   | 0.0        | 0.0  
| 14.17       |
+      | 5  | 31   | 15 April 2024    |                  | 41.78           | 
13.93         | 0.24     | 0.0  | 0.0       | 14.17 | 0.0   | 0.0        | 0.0  
| 14.17       |
+      | 6  | 30   | 15 May 2024      |                  | 27.85           | 
13.93         | 0.24     | 0.0  | 0.0       | 14.17 | 0.0   | 0.0        | 0.0  
| 14.17       |
+      | 7  | 31   | 15 June 2024     |                  | 13.92           | 
13.93         | 0.24     | 0.0  | 0.0       | 14.17 | 0.0   | 0.0        | 0.0  
| 14.17       |
+      | 8  | 30   | 15 July 2024     |                  | 0.0             | 
13.92         | 0.27     | 0.0  | 0.0       | 14.19 | 0.0   | 0.0        | 0.0  
| 14.19       |
     And Loan Repayment schedule has the following data in Total row:
       | Principal due | Interest | Fees | Penalties | Due    | Paid  | In 
advance | Late | Outstanding |
       | 100.0         | 2.05     | 0.0  | 0.0       | 102.05 | 17.01 | 0.0     
   | 0.0  | 85.04       |
diff --git 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanReAmortization.feature
 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanReAmortization.feature
index 69f4a60af2..3ba1635d27 100644
--- 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanReAmortization.feature
+++ 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanReAmortization.feature
@@ -4818,13 +4818,13 @@ Feature: LoanReAmortization
       | Nr | Days | Date              | Paid date        | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due   | Paid  | In advance | Late 
| Outstanding |
       |    |      | 01 January 2024   |                  | 100.0           |   
            |          | 0.0  |           | 0.0   | 0.0   |            |      | 
            |
       | 1  | 31   | 01 February 2024  | 01 February 2024 | 83.57           | 
16.43         | 0.58     | 0.0  | 0.0       | 17.01 | 17.01 | 0.0        | 0.0  
| 0.0         |
-      | 2  | 29   | 01 March 2024     | 15 March 2024    | 83.57           |  
0.0          | 0.0      | 0.0  | 0.0       | 0.0   | 0.0   | 0.0        | 0.0  
| 0.0         |
-      | 3  | 31   | 01 April 2024     |                  | 69.84           | 
13.73         | 0.57     | 0.0  | 0.0       | 14.3  | 0.0   | 0.0        | 0.0  
| 14.3        |
-      | 4  | 30   | 01 May 2024       |                  | 56.03           | 
13.81         | 0.49     | 0.0  | 0.0       | 14.3  | 0.0   | 0.0        | 0.0  
| 14.3        |
-      | 5  | 31   | 01 June 2024      |                  | 42.14           | 
13.89         | 0.41     | 0.0  | 0.0       | 14.3  | 0.0   | 0.0        | 0.0  
| 14.3        |
-      | 6  | 30   | 01 July 2024      |                  | 28.17           | 
13.97         | 0.33     | 0.0  | 0.0       | 14.3  | 0.0   | 0.0        | 0.0  
| 14.3        |
-      | 7  | 31   | 01 August 2024    |                  | 14.11           | 
14.06         | 0.24     | 0.0  | 0.0       | 14.3  | 0.0   | 0.0        | 0.0  
| 14.3        |
-      | 8  | 31   | 01 September 2024 |                  | 0.0             | 
14.11         | 0.16     | 0.0  | 0.0       | 14.27 | 0.0   | 0.0        | 0.0  
| 14.27       |
+      | 2  | 29   | 01 March 2024     | 15 March 2024    | 83.57           | 
0.0           | 0.0      | 0.0  | 0.0       | 0.0   | 0.0   | 0.0        | 0.0  
| 0.0         |
+      | 3  | 31   | 01 April 2024     |                  | 69.85           | 
13.72         | 0.57     | 0.0  | 0.0       | 14.29 | 0.0   | 0.0        | 0.0  
| 14.29       |
+      | 4  | 30   | 01 May 2024       |                  | 56.05           | 
13.8          | 0.49     | 0.0  | 0.0       | 14.29 | 0.0   | 0.0        | 0.0  
| 14.29       |
+      | 5  | 31   | 01 June 2024      |                  | 42.17           | 
13.88         | 0.41     | 0.0  | 0.0       | 14.29 | 0.0   | 0.0        | 0.0  
| 14.29       |
+      | 6  | 30   | 01 July 2024      |                  | 28.21           | 
13.96         | 0.33     | 0.0  | 0.0       | 14.29 | 0.0   | 0.0        | 0.0  
| 14.29       |
+      | 7  | 31   | 01 August 2024    |                  | 14.16           | 
14.05         | 0.24     | 0.0  | 0.0       | 14.29 | 0.0   | 0.0        | 0.0  
| 14.29       |
+      | 8  | 31   | 01 September 2024 |                  | 0.0             | 
14.16         | 0.16     | 0.0  | 0.0       | 14.32 | 0.0   | 0.0        | 0.0  
| 14.32       |
     Then Loan Repayment schedule has the following data in Total row:
       | Principal due | Interest | Fees | Penalties | Due    | Paid  | In 
advance | Late | Outstanding |
       | 100.0         | 2.78     | 0.0  | 0.0       | 102.78 | 17.01 | 0.0     
   | 0.0  | 85.77       |
@@ -4842,15 +4842,15 @@ Feature: LoanReAmortization
       | Nr | Days | Date              | Paid date        | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due   | Paid  | In advance | Late 
| Outstanding |
       |    |      | 01 January 2024   |                  | 100.0           |   
            |          | 0.0  |           | 0.0   | 0.0   |            |      | 
            |
       | 1  | 31   | 01 February 2024  | 01 February 2024 | 83.57           | 
16.43         | 0.58     | 0.0  | 0.0       | 17.01 | 17.01 | 0.0        | 0.0  
| 0.0         |
-      | 2  | 29   | 01 March 2024     | 15 March 2024    | 83.57           |  
0.0          | 0.0      | 0.0  | 0.0       | 0.0   | 0.0   | 0.0        | 0.0  
| 0.0         |
-      | 3  | 31   | 01 April 2024     |                  | 69.84           | 
13.73         | 0.57     | 0.0  | 0.0       | 14.3  | 0.0   | 0.0        | 0.0  
| 14.3        |
-      | 4  | 30   | 01 May 2024       |                  | 56.03           | 
13.81         | 0.49     | 0.0  | 0.0       | 14.3  | 0.0   | 0.0        | 0.0  
| 14.3        |
-      | 5  | 31   | 01 June 2024      |                  | 42.14           | 
13.89         | 0.41     | 0.0  | 0.0       | 14.3  | 0.0   | 0.0        | 0.0  
| 14.3        |
-      | 6  | 30   | 01 July 2024      |                  | 33.84           | 
8.3           | 0.33     | 0.0  | 0.0       | 8.63  | 0.0   | 0.0        | 0.0  
| 8.63        |
-      | 7  | 31   | 01 August 2024    |                  | 25.49           | 
8.35          | 0.28     | 0.0  | 0.0       | 8.63  | 0.0   | 0.0        | 0.0  
| 8.63        |
-      | 8  | 31   | 01 September 2024 |                  | 17.09           | 
8.4           | 0.23     | 0.0  | 0.0       | 8.63  | 0.0   | 0.0        | 0.0  
| 8.63        |
-      | 9  | 30   | 01 October 2024   |                  | 8.56            | 
8.53          | 0.1      | 0.0  | 0.0       | 8.63  | 0.0   | 0.0        | 0.0  
| 8.63        |
-      | 10 | 31   | 01 November 2024  |                  | 0.0             | 
8.56          | 0.05     | 0.0  | 0.0       | 8.61  | 0.0   | 0.0        | 0.0  
| 8.61        |
+      | 2  | 29   | 01 March 2024     | 15 March 2024    | 83.57           | 
0.0           | 0.0      | 0.0  | 0.0       | 0.0   | 0.0   | 0.0        | 0.0  
| 0.0         |
+      | 3  | 31   | 01 April 2024     |                  | 69.85           | 
13.72         | 0.57     | 0.0  | 0.0       | 14.29 | 0.0   | 0.0        | 0.0  
| 14.29       |
+      | 4  | 30   | 01 May 2024       |                  | 56.05           | 
13.8          | 0.49     | 0.0  | 0.0       | 14.29 | 0.0   | 0.0        | 0.0  
| 14.29       |
+      | 5  | 31   | 01 June 2024      |                  | 42.17           | 
13.88         | 0.41     | 0.0  | 0.0       | 14.29 | 0.0   | 0.0        | 0.0  
| 14.29       |
+      | 6  | 30   | 01 July 2024      |                  | 33.87           | 
8.3           | 0.33     | 0.0  | 0.0       | 8.63  | 0.0   | 0.0        | 0.0  
| 8.63        |
+      | 7  | 31   | 01 August 2024    |                  | 25.52           | 
8.35          | 0.28     | 0.0  | 0.0       | 8.63  | 0.0   | 0.0        | 0.0  
| 8.63        |
+      | 8  | 31   | 01 September 2024 |                  | 17.12           | 
8.4           | 0.23     | 0.0  | 0.0       | 8.63  | 0.0   | 0.0        | 0.0  
| 8.63        |
+      | 9  | 30   | 01 October 2024   |                  | 8.59            | 
8.53          | 0.1      | 0.0  | 0.0       | 8.63  | 0.0   | 0.0        | 0.0  
| 8.63        |
+      | 10 | 31   | 01 November 2024  |                  | 0.0             | 
8.59          | 0.05     | 0.0  | 0.0       | 8.64  | 0.0   | 0.0        | 0.0  
| 8.64        |
     Then Loan Repayment schedule has the following data in Total row:
       | Principal due | Interest | Fees | Penalties | Due    | Paid  | In 
advance | Late | Outstanding |
       | 100.0         | 3.04     | 0.0  | 0.0       | 103.04 | 17.01 | 0.0     
   | 0.0  | 86.03       |
@@ -7129,14 +7129,14 @@ Feature: LoanReAmortization
     When Admin runs inline COB job for Loan
     Then Loan Transactions tab has the following new accrual data:
       | Transaction date | Transaction Type   | Amount | Principal | Interest 
| Fees | Penalties | Loan Balance | Reverted | Replayed |
-      | 01 April 2024    | Accrual Adjustment | 0.42   | 0.0       | 0.42     
| 0.0  | 0.0       | 0.0          | false    | false    |
+      | 01 April 2024    | Accrual Adjustment | 0.86   | 0.0       | 0.86     
| 0.0  | 0.0       | 0.0          | false    | false    |
 
     When Admin sets the business date to "01 May 2024"
     When Admin runs inline COB job for Loan
     ## Why we have accrual adjustment on 02 april
     Then Loan Transactions tab has the following new accrual data:
       | Transaction date | Transaction Type   | Amount | Principal | Interest 
| Fees | Penalties | Loan Balance | Reverted | Replayed |
-      | 02 April 2024    | Accrual Adjustment | 0.4    | 0.0       | 0.4      
| 0.0  | 0.0       | 0.0          | false    | false    |
+      | 02 April 2024    | Accrual            | 0.04   | 0.0       | 0.04     
| 0.0  | 0.0       | 0.0          | false    | false    |
       | 03 April 2024    | Accrual            | 0.05   | 0.0       | 0.05     
| 0.0  | 0.0       | 0.0          | false    | false    |
       | 04 April 2024    | Accrual            | 0.04   | 0.0       | 0.04     
| 0.0  | 0.0       | 0.0          | false    | false    |
       | 05 April 2024    | Accrual            | 0.05   | 0.0       | 0.05     
| 0.0  | 0.0       | 0.0          | false    | false    |
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 e6b9d6b7cf..cf7cd8c34f 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
@@ -896,7 +896,7 @@ public final class ProgressiveEMICalculator implements 
EMICalculator {
             }
             rp.setEmi(rp.getTotalPaidAmount());
             rp.moveOutstandingDueToReAging();
-            rp.setNoUnrecognisedInterest(true);
+            rp.setInterestMovedDownward(true);
         });
     }
 
@@ -1098,7 +1098,7 @@ public final class ProgressiveEMICalculator implements 
EMICalculator {
         findLastUnpaidRepaymentPeriod.ifPresent(repaymentPeriod -> {
             
repaymentPeriod.setFutureUnrecognizedInterest(scheduleModel.zero());
             scheduleModel.repaymentPeriods().forEach(rp -> {
-                rp.setInterestMoved(false);
+                rp.setInterestMovedUpward(false);
             });
 
             MathContext mc = scheduleModel.mc();
@@ -1161,7 +1161,7 @@ public final class ProgressiveEMICalculator implements 
EMICalculator {
             
repaymentPeriod.setFutureUnrecognizedInterest(period.getUnrecognizedInterest());
             scheduleModel.repaymentPeriods().stream().filter(rp -> 
rp.getDueDate().isAfter(repaymentPeriod.getDueDate())) //
                     .forEach(rp -> {
-                        rp.setInterestMoved(true);
+                        rp.setInterestMovedUpward(true);
                     });
         });
     }
@@ -1530,7 +1530,7 @@ public final class ProgressiveEMICalculator implements 
EMICalculator {
         final CurrencyData currency = 
scheduleModel.loanProductRelatedDetail().getCurrencyData();
         RepaymentPeriod firstRepaymentPeriod = repaymentPeriods.getFirst();
         RepaymentPeriod lastRepaymentPeriod = repaymentPeriods.getLast();
-        Money sumOfInterest = Money.zero(currency);
+        Money sumOfInterest = Money.of(currency, 
calculateEMIValueForFixedInterest(repaymentPeriods, mc), mc);
         for (RepaymentPeriod rp : repaymentPeriods) {
             Money interest = rp.calculateCalculatedDueInterest();
             sumOfInterest = sumOfInterest.add(interest);
@@ -1604,8 +1604,9 @@ public final class ProgressiveEMICalculator implements 
EMICalculator {
 
         final Money outstandingBalance = 
startPeriod.getInitialBalanceForEmiRecalculation();
 
-        final Money equalMonthlyInstallment = 
Money.of(outstandingBalance.getCurrencyData(),
-                calculateEMIValue(rateFactorN, outstandingBalance.getAmount(), 
fnResult, mc), mc);
+        final Money equalMonthlyInstallment = Money
+                .of(outstandingBalance.getCurrencyData(), 
calculateEMIValue(rateFactorN, outstandingBalance.getAmount(), fnResult, mc), 
mc)
+                .add(calculateEMIValueForFixedInterest(repaymentPeriods, mc));
         final Money finalEqualMonthlyInstallment = 
applyInstallmentAmountInMultiplesOf(scheduleModel, equalMonthlyInstallment);
 
         repaymentPeriods.forEach(period -> {
@@ -1716,6 +1717,14 @@ public final class ProgressiveEMICalculator implements 
EMICalculator {
         return rateFactorPlus1N.multiply(outstandingBalanceForRest, 
mc).divide(fnResult, mc);
     }
 
+    /**
+     * Calculate the EMI (Equal Monthly Installment) value for fixed interest 
portion
+     */
+    private BigDecimal calculateEMIValueForFixedInterest(final 
List<RepaymentPeriod> repaymentPeriods, MathContext mc) {
+        return 
repaymentPeriods.stream().map(RepaymentPeriod::getFixedInterest).map(Money::getAmount).reduce(ZERO,
 BigDecimal::add)
+                .divide(BigDecimal.valueOf(repaymentPeriods.isEmpty() ? 1 : 
repaymentPeriods.size()), mc);
+    }
+
     /**
      * To calculate the daily payment, we first need to calculate something 
called the Rate Factor. We're going to be
      * using simple interest. The Rate Factor for simple interest is 
calculated by the following formula:
@@ -1994,12 +2003,9 @@ public final class ProgressiveEMICalculator implements 
EMICalculator {
                     
.addCreditedInterestAmount(MathUtil.min(rp.getOutstandingInterest(), 
rp.getCreditedInterest(), false).negated());
             rp.setEmi(rp.getTotalPaidAmount());
             rp.moveOutstandingDueToReAging();
-            rp.setNoUnrecognisedInterest(true);
+            rp.setInterestMovedDownward(true);
         });
 
-        // stop calculate unrecognised interest at this point because all
-        
interestSchedule.getLastRepaymentPeriod().setNoUnrecognisedInterest(true);
-
         if (!originalMaturityDate.isBefore(transactionDate)) {
             
createRepaymentPeriodForEarlyRepaidAmountsDuringReAgeing(interestSchedule,
                     paidBalancesFromTransactionDate.getOutstandingPrincipal(), 
paidBalancesFromTransactionDate.getOutstandingInterest(),
diff --git 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/data/RepaymentPeriod.java
 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/data/RepaymentPeriod.java
index 95011fb955..eca58ee334 100644
--- 
a/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/data/RepaymentPeriod.java
+++ 
b/fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/calc/data/RepaymentPeriod.java
@@ -77,7 +77,7 @@ public class RepaymentPeriod {
     private Memo<Money> outstandingBalanceCalculation;
     @Getter
     @Setter
-    private boolean isInterestMoved = false;
+    private boolean isInterestMovedUpward = false;
 
     @Setter
     private Money totalDisbursedAmount;
@@ -99,7 +99,7 @@ public class RepaymentPeriod {
     private Money creditedInterestMovedDueReAge;
     @Setter
     @Getter
-    private boolean noUnrecognisedInterest;
+    private boolean isInterestMovedDownward;
     @Setter
     @Getter
     private boolean reAged;
@@ -111,7 +111,7 @@ public class RepaymentPeriod {
 
     protected RepaymentPeriod(RepaymentPeriod previous, LocalDate fromDate, 
LocalDate dueDate, List<InterestPeriod> interestPeriods,
             Money emi, Money originalEmi, Money paidPrincipal, Money 
paidInterest, Money futureUnrecognizedInterest, MathContext mc,
-            ILoanConfigurationDetails loanProductRelatedDetail, boolean 
noUnrecognisedInterest, boolean reAged,
+            ILoanConfigurationDetails loanProductRelatedDetail, boolean 
isInterestMovedDownward, boolean reAged,
             boolean reAgedEarlyRepaymentHolder, Money fixedInterest) {
         this.previous = previous;
         this.fromDate = fromDate;
@@ -124,7 +124,7 @@ public class RepaymentPeriod {
         this.futureUnrecognizedInterest = futureUnrecognizedInterest;
         this.mc = mc;
         this.loanProductRelatedDetail = loanProductRelatedDetail;
-        this.noUnrecognisedInterest = noUnrecognisedInterest;
+        this.isInterestMovedDownward = isInterestMovedDownward;
         this.reAged = reAged;
         this.reAgedEarlyRepaymentHolder = reAgedEarlyRepaymentHolder;
         this.fixedInterest = fixedInterest;
@@ -151,13 +151,13 @@ public class RepaymentPeriod {
         final RepaymentPeriod newRepaymentPeriod = new 
RepaymentPeriod(previous, repaymentPeriod.getFromDate(),
                 repaymentPeriod.getDueDate(), new ArrayList<>(), 
repaymentPeriod.getEmi(), repaymentPeriod.getOriginalEmi(),
                 repaymentPeriod.getPaidPrincipal(), 
repaymentPeriod.getPaidInterest(), 
repaymentPeriod.getFutureUnrecognizedInterest(), mc,
-                repaymentPeriod.getLoanProductRelatedDetail(), 
repaymentPeriod.isNoUnrecognisedInterest(), repaymentPeriod.isReAged(),
+                repaymentPeriod.getLoanProductRelatedDetail(), 
repaymentPeriod.isInterestMovedDownward(), repaymentPeriod.isReAged(),
                 repaymentPeriod.isReAgedEarlyRepaymentHolder(), 
repaymentPeriod.getFixedInterest());
         
newRepaymentPeriod.setCreditedPrincipalMovedDueReAge(repaymentPeriod.getCreditedPrincipalMovedDueReAge());
         
newRepaymentPeriod.setCreditedInterestMovedDueReAge(repaymentPeriod.getCreditedInterestMovedDueReAge());
         
newRepaymentPeriod.setTotalDisbursedAmount(repaymentPeriod.getTotalDisbursedAmount());
         
newRepaymentPeriod.setTotalCapitalizedIncomeAmount(repaymentPeriod.getTotalCapitalizedIncomeAmount());
-        newRepaymentPeriod.setInterestMoved(repaymentPeriod.isInterestMoved());
+        
newRepaymentPeriod.setInterestMovedUpward(repaymentPeriod.isInterestMovedUpward());
         newRepaymentPeriod.setCurrency(repaymentPeriod.getCurrency());
         // There is always at least 1 interest period, by default with same 
from-due date as repayment period
         for (InterestPeriod interestPeriod : 
repaymentPeriod.getInterestPeriods()) {
@@ -170,13 +170,16 @@ public class RepaymentPeriod {
         final Money zero = Money.zero(repaymentPeriod.getCurrency(), mc);
         final RepaymentPeriod newRepaymentPeriod = new 
RepaymentPeriod(previous, repaymentPeriod.getFromDate(),
                 repaymentPeriod.getDueDate(), new ArrayList<>(), 
repaymentPeriod.getEmi(), repaymentPeriod.getOriginalEmi(), zero, zero,
-                zero, mc, repaymentPeriod.getLoanProductRelatedDetail(), 
repaymentPeriod.isNoUnrecognisedInterest(),
+                zero, mc, repaymentPeriod.getLoanProductRelatedDetail(), 
repaymentPeriod.isInterestMovedDownward(),
                 repaymentPeriod.isReAged(), 
repaymentPeriod.isReAgedEarlyRepaymentHolder(), 
repaymentPeriod.getFixedInterest());
         
newRepaymentPeriod.setCreditedPrincipalMovedDueReAge(repaymentPeriod.getCreditedPrincipalMovedDueReAge());
         
newRepaymentPeriod.setCreditedInterestMovedDueReAge(repaymentPeriod.getCreditedInterestMovedDueReAge());
+        if (repaymentPeriod.isInterestMovedDownward()) {
+            
newRepaymentPeriod.setFixedInterest(repaymentPeriod.getPaidInterest());
+        }
         
newRepaymentPeriod.setTotalDisbursedAmount(repaymentPeriod.getTotalDisbursedAmount());
         
newRepaymentPeriod.setTotalCapitalizedIncomeAmount(repaymentPeriod.getTotalCapitalizedIncomeAmount());
-        newRepaymentPeriod.setInterestMoved(repaymentPeriod.isInterestMoved());
+        
newRepaymentPeriod.setInterestMovedUpward(repaymentPeriod.isInterestMovedUpward());
         newRepaymentPeriod.setCurrency(repaymentPeriod.getCurrency());
         // There is always at least 1 interest period, by default with same 
from-due date as repayment period
         for (InterestPeriod interestPeriod : 
repaymentPeriod.getInterestPeriods()) {
@@ -217,8 +220,9 @@ public class RepaymentPeriod {
     @NotNull
     public Money getCalculatedDueInterest() {
         if (calculatedDueInterestCalculation == null) {
-            calculatedDueInterestCalculation = 
Memo.of(this::calculateCalculatedDueInterest, () -> new Object[] { previous, 
interestPeriods,
-                    futureUnrecognizedInterest, isInterestMoved, 
totalDisbursedAmount, fixedInterest, reAged });
+            calculatedDueInterestCalculation = 
Memo.of(this::calculateCalculatedDueInterest,
+                    () -> new Object[] { previous, interestPeriods, 
futureUnrecognizedInterest, isInterestMovedUpward,
+                            isInterestMovedDownward, totalDisbursedAmount, 
fixedInterest, reAged });
         }
         return calculatedDueInterestCalculation.get();
     }
@@ -242,7 +246,7 @@ public class RepaymentPeriod {
 
     public Money calculateCalculatedDueInterest() {
         Money calculatedDueInterest = getZero();
-        if (!isInterestMoved()) {
+        if (!isInterestMovedUpward() && !isInterestMovedDownward()) {
             calculatedDueInterest = Money.of(getEmi().getCurrencyData(),
                     
getInterestPeriods().stream().map(InterestPeriod::getCalculatedDueInterest).reduce(BigDecimal.ZERO,
 BigDecimal::add),
                     mc);
@@ -367,7 +371,7 @@ public class RepaymentPeriod {
      * @return
      */
     public Money getUnrecognizedInterest() {
-        return noUnrecognisedInterest ? getZero() : 
getCalculatedDueInterest().minus(getDueInterest(), getMc());
+        return 
MathUtil.negativeToZero(getCalculatedDueInterest().minus(getDueInterest(), 
getMc()), getMc());
     }
 
     public Money getCreditedAmounts() {

Reply via email to