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 dc0162c09a8ff54cbc0aed2eae92711be288318c
Author: Adam Saghy <[email protected]>
AuthorDate: Thu Oct 30 14:43:08 2025 +0100

    FINERACT-2403: Fix incorrect EMI calculation of last installment
---
 .../test/resources/features/LoanRepayment.feature  | 168 +++++++++++++++++++++
 .../loanproduct/calc/ProgressiveEMICalculator.java |  18 ++-
 2 files changed, 179 insertions(+), 7 deletions(-)

diff --git 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanRepayment.feature 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanRepayment.feature
index 7d802b6fae..bd2290be65 100644
--- 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanRepayment.feature
+++ 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanRepayment.feature
@@ -5688,3 +5688,171 @@ Feature: LoanRepayment
       | 22 August 2025   | Repayment        | 195.07 | 186.99    | 5.28     | 
0.0  | 2.8       | 0.0          | true     | false    |
     Then Loan status will be "ACTIVE"
     Then Loan has 195.07 outstanding amount
+
+  @TestRailId:C4148
+  Scenario: Verify 2 months of EMIs to be paid early and late
+    When Admin sets the business date to "16 April 2025"
+    And Admin creates a client with random data
+    And Admin creates a fully customized loan with the following data:
+      | LoanProduct                                                   | 
submitted on date | with Principal | ANNUAL interest rate % | interest type     
| interest calculation period | amortization type  | loanTermFrequency | 
loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | 
numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | 
interest free period | Payment strategy            |
+      | LP2_ADV_CUSTOM_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL | 16 
April 2025      | 1000           | 35.99                  | DECLINING_BALANCE | 
DAILY                       | EQUAL_INSTALLMENTS | 6                | MONTHS    
            | 1              | MONTHS                 | 6                 | 0   
                    | 0                      | 0                    | 
ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "16 April 2025" with "1000" 
amount and expected disbursement date on "16 April 2025"
+    And Admin successfully disburse the loan on "16 April 2025" with "1207.18" 
EUR transaction amount
+    Then Loan Repayment schedule has 6 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 |
+      |    |      | 16 April 2025     |                | 1207.18         |     
          |          | 0.0  |           | 0.0    | 0.0   |            |       | 
            |
+      | 1  | 30   | 16 May 2025       |                | 1020.55         | 
186.63        | 36.21    | 0.0  | 0.0       | 222.84 | 0.0   | 0.0        | 0.0 
  | 222.84      |
+      | 2  | 31   | 16 June 2025      |                |  828.32         | 
192.23        | 30.61    | 0.0  | 0.0       | 222.84 | 0.0   | 0.0        | 0.0 
  | 222.84      |
+      | 3  | 30   | 16 July 2025      |                |  630.32         | 
198.0         | 24.84    | 0.0  | 0.0       | 222.84 | 0.0   | 0.0        | 0.0 
  | 222.84      |
+      | 4  | 31   | 16 August 2025    |                |  426.38         | 
203.94        | 18.9     | 0.0  | 0.0       | 222.84 | 0.0   | 0.0        | 0.0 
  | 222.84      |
+      | 5  | 31   | 16 September 2025 |                |  216.33         | 
210.05        | 12.79    | 0.0  | 0.0       | 222.84 | 0.0   | 0.0        | 0.0 
  | 222.84      |
+      | 6  | 30   | 16 October 2025   |                |    0.0          | 
216.33        |  6.49    | 0.0  | 0.0       | 222.82 | 0.0   | 0.0        | 0.0 
  | 222.82      |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest   | Fees | Penalties | Due     | Paid   | In 
advance | Late   | Outstanding |
+      | 1207.18       | 129.84     | 0.0  | 0.0       | 1337.02 | 0.0    | 0.0 
       | 0.0    | 1337.02     |
+    Then Loan Transactions tab has the following data:
+      | Transaction date   | Transaction Type | Amount  | Principal | Interest 
| Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 16 April 2025      | Disbursement     | 1207.18 | 0.0       | 0.0      
| 0.0  | 0.0       | 1207.18      | false    | false    |
+    Then Loan status will be "ACTIVE"
+    Then Loan has 1337.02 outstanding amount
+    When Admin sets the business date to "10 May 2025"
+    And Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on 
"10 May 2025" with 222.84 EUR transaction amount and system-generated 
Idempotency key
+    Then Loan Repayment schedule has 6 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 |
+      |    |      | 16 April 2025     |                | 1207.18         |     
          |          | 0.0  |           | 0.0    | 0.0     |            |       
|             |
+      | 1  | 30   | 16 May 2025       | 10 May 2025    | 1013.3          | 
193.88        | 28.96    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0   |   0.0       |
+      | 2  | 31   | 16 June 2025      |                |  826.93         | 
186.37        | 36.47    | 0.0  | 0.0       | 222.84 | 0.0     | 0.0        | 
0.0   | 222.84      |
+      | 3  | 30   | 16 July 2025      |                |  628.89         | 
198.04        | 24.8     | 0.0  | 0.0       | 222.84 | 0.0     | 0.0        | 
0.0   | 222.84      |
+      | 4  | 31   | 16 August 2025    |                |  424.91         | 
203.98        | 18.86    | 0.0  | 0.0       | 222.84 | 0.0     | 0.0        | 
0.0   | 222.84      |
+      | 5  | 31   | 16 September 2025 |                |  214.81         | 
210.1         | 12.74    | 0.0  | 0.0       | 222.84 | 0.0     | 0.0        | 
0.0   | 222.84      |
+      | 6  | 30   | 16 October 2025   |                |    0.0          | 
214.81        |  6.44    | 0.0  | 0.0       | 221.25 | 0.0     | 0.0        | 
0.0   | 221.25      |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest   | Fees | Penalties | Due     | Paid   | In 
advance | Late   | Outstanding |
+      | 1207.18       | 128.27     | 0.0  | 0.0       | 1335.45 | 222.84 | 
222.84     | 0.0    | 1112.61     |
+    Then Loan Transactions tab has the following data:
+      | Transaction date   | Transaction Type | Amount  | Principal | Interest 
| Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 16 April 2025      | Disbursement     | 1207.18 | 0.0       | 0.0      
| 0.0  | 0.0       | 1207.18      | false    | false    |
+      | 10 May 2025        | Repayment        | 222.84  | 193.88    | 28.96    
| 0.0  | 0.0       | 1013.3       | false    | false    |
+    Then Loan status will be "ACTIVE"
+    Then Loan has 1112.61 outstanding amount
+    When Admin sets the business date to "06 June 2025"
+    And Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on 
"06 June 2025" with 222.84 EUR transaction amount and system-generated 
Idempotency key
+    Then Loan Repayment schedule has 6 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 |
+      |    |      | 16 April 2025     |                | 1207.18         |     
          |          | 0.0  |           | 0.0    | 0.0     |            |       
|             |
+      | 1  | 30   | 16 May 2025       | 10 May 2025    | 1013.3          | 
193.88        | 28.96    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0   |   0.0       |
+      | 2  | 31   | 16 June 2025      | 06 June 2025   |  817.13         | 
196.17        | 26.67    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0   |   0.0       |
+      | 3  | 30   | 16 July 2025      |                |  626.7          | 
190.43        | 32.41    | 0.0  | 0.0       | 222.84 | 0.0     | 0.0        | 
0.0   | 222.84      |
+      | 4  | 31   | 16 August 2025    |                |  422.66         | 
204.04        | 18.8     | 0.0  | 0.0       | 222.84 | 0.0     | 0.0        | 
0.0   | 222.84      |
+      | 5  | 31   | 16 September 2025 |                |  212.5          | 
210.16        | 12.68    | 0.0  | 0.0       | 222.84 | 0.0     | 0.0        | 
0.0   | 222.84      |
+      | 6  | 30   | 16 October 2025   |                |    0.0          | 
212.5         |  6.37    | 0.0  | 0.0       | 218.87 | 0.0     | 0.0        | 
0.0   | 218.87      |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest   | Fees | Penalties | Due     | Paid   | In 
advance | Late   | Outstanding |
+      | 1207.18       | 125.89     | 0.0  | 0.0       | 1333.07 | 445.68 | 
445.68     | 0.0    | 887.39      |
+    Then Loan Transactions tab has the following data:
+      | Transaction date   | Transaction Type | Amount  | Principal | Interest 
| Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 16 April 2025      | Disbursement     | 1207.18 | 0.0       | 0.0      
| 0.0  | 0.0       | 1207.18      | false    | false    |
+      | 10 May 2025        | Repayment        | 222.84  | 193.88    | 28.96    
| 0.0  | 0.0       | 1013.3       | false    | false    |
+      | 06 June 2025       | Repayment        | 222.84  | 196.17    | 26.67    
| 0.0  | 0.0       | 817.13       | false    | false    |
+    Then Loan status will be "ACTIVE"
+    Then Loan has 887.39 outstanding amount
+    When Admin sets the business date to "12 September 2025"
+    And Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on 
"12 September 2025" with 445.68 EUR transaction amount and system-generated 
Idempotency key
+    Then Loan Repayment schedule has 6 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 |
+      |    |      | 16 April 2025     |                     | 1207.18         
|               |          | 0.0  |           | 0.0    | 0.0     |            | 
        |             |
+      | 1  | 30   | 16 May 2025       | 10 May 2025         | 1013.3          
| 193.88        | 28.96    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0     |   0.0       |
+      | 2  | 31   | 16 June 2025      | 06 June 2025        |  817.13         
| 196.17        | 26.67    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0     |   0.0       |
+      | 3  | 30   | 16 July 2025      | 12 September 2025   |  626.7          
| 190.43        | 32.41    | 0.0  | 0.0       | 222.84 | 222.84  | 0.0        | 
222.84  |   0.0       |
+      | 4  | 31   | 16 August 2025    | 12 September 2025   |  428.37         
| 198.33        | 24.51    | 0.0  | 0.0       | 222.84 | 222.84  | 0.0        | 
222.84  |   0.0       |
+      | 5  | 31   | 16 September 2025 |                     |  228.53         
| 199.84        | 23.0     | 0.0  | 0.0       | 222.84 | 0.0     | 0.0        | 
0.0     | 222.84      |
+      | 6  | 30   | 16 October 2025   |                     |    0.0          
| 228.53        |  6.85    | 0.0  | 0.0       | 235.38 | 0.0     | 0.0        | 
0.0     | 235.38      |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest   | Fees | Penalties | Due     | Paid   | In 
advance | Late    | Outstanding |
+      | 1207.18       | 142.4      | 0.0  | 0.0       | 1349.58 | 891.36 | 
445.68     | 445.68  | 458.22      |
+    Then Loan Transactions tab has the following data:
+      | Transaction date   | Transaction Type | Amount  | Principal | Interest 
| Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 16 April 2025      | Disbursement     | 1207.18 | 0.0       | 0.0      
| 0.0  | 0.0       | 1207.18      | false    | false    |
+      | 10 May 2025        | Repayment        | 222.84  | 193.88    | 28.96    
| 0.0  | 0.0       | 1013.3       | false    | false    |
+      | 06 June 2025       | Repayment        | 222.84  | 196.17    | 26.67    
| 0.0  | 0.0       | 817.13       | false    | false    |
+      | 12 September 2025  | Repayment        | 445.68  | 388.76    | 56.92    
| 0.0  | 0.0       | 428.37       | false    | false    |
+    Then Loan status will be "ACTIVE"
+    Then Loan has 458.22 outstanding amount
+    And Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on 
"12 September 2025" with 445.68 EUR transaction amount and system-generated 
Idempotency key
+    Then Loan Repayment schedule has 6 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 |
+      |    |      | 16 April 2025     |                     | 1207.18         
|               |          | 0.0  |           | 0.0    | 0.0     |            | 
        |             |
+      | 1  | 30   | 16 May 2025       | 10 May 2025         | 1013.3          
| 193.88        | 28.96    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0     |   0.0       |
+      | 2  | 31   | 16 June 2025      | 06 June 2025        |  817.13         
| 196.17        | 26.67    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0     |   0.0       |
+      | 3  | 30   | 16 July 2025      | 12 September 2025   |  626.7          
| 190.43        | 32.41    | 0.0  | 0.0       | 222.84 | 222.84  | 0.0        | 
222.84  |   0.0       |
+      | 4  | 31   | 16 August 2025    | 12 September 2025   |  428.37         
| 198.33        | 24.51    | 0.0  | 0.0       | 222.84 | 222.84  | 0.0        | 
222.84  |   0.0       |
+      | 5  | 31   | 16 September 2025 | 12 September 2025   |  226.87         
| 201.5         | 21.34    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0     |   0.0       |
+      | 6  | 30   | 16 October 2025   |                     |    0.0          
| 226.87        |  0.14    | 0.0  | 0.0       | 227.01 | 222.84  | 222.84     | 
0.0     |   4.17      |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest   | Fees | Penalties | Due     | Paid    | In 
advance | Late    | Outstanding |
+      | 1207.18       | 134.03     | 0.0  | 0.0       | 1341.21 | 1337.04 | 
891.36     | 445.68  |   4.17      |
+    Then Loan Transactions tab has the following data:
+      | Transaction date   | Transaction Type | Amount  | Principal | Interest 
| Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 16 April 2025      | Disbursement     | 1207.18 | 0.0       | 0.0      
| 0.0  | 0.0       | 1207.18      | false    | false    |
+      | 10 May 2025        | Repayment        | 222.84  | 193.88    | 28.96    
| 0.0  | 0.0       | 1013.3       | false    | false    |
+      | 06 June 2025       | Repayment        | 222.84  | 196.17    | 26.67    
| 0.0  | 0.0       | 817.13       | false    | false    |
+      | 12 September 2025  | Repayment        | 445.68  | 388.76    | 56.92    
| 0.0  | 0.0       | 428.37       | false    | false    |
+      | 12 September 2025  | Repayment        | 445.68  | 424.34    | 21.34    
| 0.0  | 0.0       |   4.03       | false    | false    |
+    Then Loan status will be "ACTIVE"
+    Then Loan has 4.17 outstanding amount
+    When Admin sets the business date to "04 October 2025"
+    And Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on 
"04 October 2025" with 4.03 EUR transaction amount and system-generated 
Idempotency key
+    Then Loan Repayment schedule has 6 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 |
+      |    |      | 16 April 2025     |                     | 1207.18         
|               |          | 0.0  |           | 0.0    | 0.0     |            | 
        |             |
+      | 1  | 30   | 16 May 2025       | 10 May 2025         | 1013.3          
| 193.88        | 28.96    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0     |   0.0       |
+      | 2  | 31   | 16 June 2025      | 06 June 2025        |  817.13         
| 196.17        | 26.67    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0     |   0.0       |
+      | 3  | 30   | 16 July 2025      | 12 September 2025   |  626.7          
| 190.43        | 32.41    | 0.0  | 0.0       | 222.84 | 222.84  | 0.0        | 
222.84  |   0.0       |
+      | 4  | 31   | 16 August 2025    | 12 September 2025   |  428.37         
| 198.33        | 24.51    | 0.0  | 0.0       | 222.84 | 222.84  | 0.0        | 
222.84  |   0.0       |
+      | 5  | 31   | 16 September 2025 | 12 September 2025   |  226.87         
| 201.5         | 21.34    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0     |   0.0       |
+      | 6  | 30   | 16 October 2025   |                     |    0.0          
| 226.87        |  0.09    | 0.0  | 0.0       | 226.96 | 226.87  | 226.87     | 
0.0     |   0.09      |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest   | Fees | Penalties | Due     | Paid    | In 
advance | Late    | Outstanding |
+      | 1207.18       | 133.98     | 0.0  | 0.0       | 1341.16 | 1341.07 | 
895.39     | 445.68  |   0.09      |
+    Then Loan Transactions tab has the following data:
+      | Transaction date   | Transaction Type | Amount  | Principal | Interest 
| Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 16 April 2025      | Disbursement     | 1207.18 | 0.0       | 0.0      
| 0.0  | 0.0       | 1207.18      | false    | false    |
+      | 10 May 2025        | Repayment        | 222.84  | 193.88    | 28.96    
| 0.0  | 0.0       | 1013.3       | false    | false    |
+      | 06 June 2025       | Repayment        | 222.84  | 196.17    | 26.67    
| 0.0  | 0.0       | 817.13       | false    | false    |
+      | 12 September 2025  | Repayment        | 445.68  | 388.76    | 56.92    
| 0.0  | 0.0       | 428.37       | false    | false    |
+      | 12 September 2025  | Repayment        | 445.68  | 424.34    | 21.34    
| 0.0  | 0.0       |   4.03       | false    | false    |
+      | 04 October 2025    | Repayment        |   4.03  |   3.94    |  0.09    
| 0.0  | 0.0       |   0.09       | false    | false    |
+    Then Loan status will be "ACTIVE"
+    Then Loan has 0.09 outstanding amount
+    When Admin sets the business date to "12 October 2025"
+    And Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on 
"12 October 2025" with 0.09 EUR transaction amount and system-generated 
Idempotency key
+    Then Loan Repayment schedule has 6 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 |
+      |    |      | 16 April 2025     |                     | 1207.18         
|               |          | 0.0  |           | 0.0    | 0.0     |            | 
        |             |
+      | 1  | 30   | 16 May 2025       | 10 May 2025         | 1013.3          
| 193.88        | 28.96    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0     |   0.0       |
+      | 2  | 31   | 16 June 2025      | 06 June 2025        |  817.13         
| 196.17        | 26.67    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0     |   0.0       |
+      | 3  | 30   | 16 July 2025      | 12 September 2025   |  626.7          
| 190.43        | 32.41    | 0.0  | 0.0       | 222.84 | 222.84  | 0.0        | 
222.84  |   0.0       |
+      | 4  | 31   | 16 August 2025    | 12 September 2025   |  428.37         
| 198.33        | 24.51    | 0.0  | 0.0       | 222.84 | 222.84  | 0.0        | 
222.84  |   0.0       |
+      | 5  | 31   | 16 September 2025 | 12 September 2025   |  226.87         
| 201.5         | 21.34    | 0.0  | 0.0       | 222.84 | 222.84  | 222.84     | 
0.0     |   0.0       |
+      | 6  | 30   | 16 October 2025   | 12 October 2025     |    0.0          
| 226.87        |  0.09    | 0.0  | 0.0       | 226.96 | 226.96  | 226.96     | 
0.0     |   0.0       |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest   | Fees | Penalties | Due     | Paid    | In 
advance | Late    | Outstanding |
+      | 1207.18       | 133.98     | 0.0  | 0.0       | 1341.16 | 1341.16 | 
895.48     | 445.68  |   0.0       |
+    Then Loan Transactions tab has the following data:
+      | Transaction date   | Transaction Type | Amount  | Principal | Interest 
| Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 16 April 2025      | Disbursement     | 1207.18 | 0.0       |  0.0     
 | 0.0  | 0.0       | 1207.18      | false    | false    |
+      | 10 May 2025        | Repayment        | 222.84  | 193.88    |  28.96   
 | 0.0  | 0.0       | 1013.3       | false    | false    |
+      | 16 May 2025        | Accrual Activity |  28.96  |   0.0     |  28.96   
 | 0.0  | 0.0       |    0.0       | false    | false    |
+      | 06 June 2025       | Repayment        | 222.84  | 196.17    |  26.67   
 | 0.0  | 0.0       | 817.13       | false    | false    |
+      | 16 June 2025       | Accrual Activity |  26.67  |   0.0     |  26.67   
 | 0.0  | 0.0       |    0.0       | false    | false    |
+      | 16 July 2025       | Accrual Activity |  32.41  |   0.0     |  32.41   
 | 0.0  | 0.0       |    0.0       | false    | false    |
+      | 16 August 2025     | Accrual Activity |  24.51  |   0.0     |  24.51   
 | 0.0  | 0.0       |    0.0       | false    | false    |
+      | 12 September 2025  | Repayment        | 445.68  | 388.76    |  56.92   
 | 0.0  | 0.0       | 428.37       | false    | false    |
+      | 12 September 2025  | Repayment        | 445.68  | 424.34    |  21.34   
 | 0.0  | 0.0       |   4.03       | false    | false    |
+      | 16 September 2025  | Accrual Activity |  21.34  |   0.0     |  21.34   
 | 0.0  | 0.0       |    0.0       | false    | false    |
+      | 04 October 2025    | Repayment        |   4.03  |   3.94    |   0.09   
 | 0.0  | 0.0       |   0.09       | false    | false    |
+      | 12 October 2025    | Repayment        |   0.09  |   0.09    |   0.0    
 | 0.0  | 0.0       |   0.0        | false    | false    |
+      | 12 October 2025    | Accrual          |  133.98 |   0.0     | 133.98   
 | 0.0  | 0.0       |    0.0       | false    | false    |
+      | 12 October 2025    | Accrual Activity |    0.09 |   0.0     |   0.09   
 | 0.0  | 0.0       |    0.0       | false    | false    |
+    Then Loan status will be "CLOSED_OBLIGATIONS_MET"
+    Then Loan has 0.0 outstanding amount
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 5da7a6fa76..559b2d950a 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
@@ -291,17 +291,21 @@ public final class ProgressiveEMICalculator implements 
EMICalculator {
         LocalDate balanceCorrectionDate = 
DateUtils.isBefore(repaymentPeriodDueDate, transactionDate) ? 
repaymentPeriodDueDate
                 : transactionDate;
         addBalanceCorrection(scheduleModel, balanceCorrectionDate, 
principalAmount.negated());
+        long notFullyRepaidRepaymentPeriodCount = 
scheduleModel.repaymentPeriods().stream().filter(rp -> 
!rp.isFullyPaid()).count();
+        boolean multiplePeriodsAreUnpaid = notFullyRepaidRepaymentPeriodCount 
> 1L;
         if (scheduleModel.isEMIRecalculationEnabled()) {
             repaymentPeriod.ifPresent(rp -> {
                 // If any period total paid > calculated EMI, then set EMI to 
total paid -> effectively it is marked as
                 // fully paid
-                boolean transactionDateIsBefore = 
transactionDate.isBefore(repaymentPeriod.get().getFromDate());
-                if (transactionDateIsBefore
-                        && 
rp.getTotalPaidAmount().isGreaterThan(rp.getEmiPlusCreditedAmountsPlusFutureUnrecognizedInterest()))
 {
-                    
rp.setEmi(rp.getTotalPaidAmount().minus(rp.getTotalCreditedAmount()));
-                } else if (transactionDateIsBefore
-                        && 
rp.getTotalPaidAmount().isEqualTo(rp.getOriginalEmi().add(rp.getTotalCreditedAmount())))
 {
-                    
rp.setEmi(rp.getTotalPaidAmount().minus(rp.getTotalCreditedAmount()));
+                if (multiplePeriodsAreUnpaid) {
+                    boolean transactionDateIsBefore = 
transactionDate.isBefore(repaymentPeriod.get().getFromDate());
+                    if (transactionDateIsBefore
+                            && 
rp.getTotalPaidAmount().isGreaterThan(rp.getEmiPlusCreditedAmountsPlusFutureUnrecognizedInterest()))
 {
+                        
rp.setEmi(rp.getTotalPaidAmount().minus(rp.getTotalCreditedAmount()));
+                    } else if (transactionDateIsBefore
+                            && 
rp.getTotalPaidAmount().isEqualTo(rp.getOriginalEmi().add(rp.getTotalCreditedAmount())))
 {
+                        
rp.setEmi(rp.getTotalPaidAmount().minus(rp.getTotalCreditedAmount()));
+                    }
                 }
                 calculateLastUnpaidRepaymentPeriodEMI(scheduleModel, 
balanceCorrectionDate);
             });

Reply via email to