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 60526f0ce9 FINERACT-2389: Negative amount is shown on repayment 
schedule
60526f0ce9 is described below

commit 60526f0ce91c8706f735dea1cf5d147d464f474d
Author: Jose Alberto Hernandez <[email protected]>
AuthorDate: Wed Nov 12 20:50:18 2025 -0500

    FINERACT-2389: Negative amount is shown on repayment schedule
---
 .../test/data/loanproduct/DefaultLoanProduct.java  |   2 +
 .../global/LoanProductGlobalInitializerStep.java   |  42 ++++++
 .../fineract/test/support/TestContextKey.java      |   2 +
 .../src/test/resources/features/Loan.feature       | 161 +++++++++++++++++++++
 .../data/LoanSchedulePeriodDataWrapper.java        |   1 +
 .../service/LoanRepaymentScheduleService.java      |  15 +-
 .../LoanReschedulingWithinCenterTest.java          |   4 +-
 7 files changed, 218 insertions(+), 9 deletions(-)

diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/loanproduct/DefaultLoanProduct.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/loanproduct/DefaultLoanProduct.java
index bec004ff72..887c731b41 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/loanproduct/DefaultLoanProduct.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/loanproduct/DefaultLoanProduct.java
@@ -175,6 +175,8 @@ public enum DefaultLoanProduct implements LoanProduct {
     LP1_NO_OVERRIDES, //
     
LP2_ADV_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OF_ACCRUAL,
 //
     
LP2_ADV_CUSTOM_PMT_ALLOC_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OFF_ACCRUAL,
 //
+    LP1_INTEREST_FLAT_DAILY_RECALCULATION_SAR_MULTIDISB_EXPECT_TRANCHES, //
+    LP1_INTEREST_FLAT_DAILY_ACTUAL_ACTUAL_MULTIDISB_EXPECT_TRANCHES, //
     ;
 
     @Override
diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
index 0d4556ce6d..fd27debcee 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
@@ -4196,6 +4196,48 @@ public class LoanProductGlobalInitializerStep implements 
FineractGlobalInitializ
         TestContext.INSTANCE.set(
                 
TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OF_ACCRUAL,
                 
responseLoanProductsResponseAdvCustomPaymentAllocationProgressiveLoanInterestDailyEmiActualInterestRecalcZeroChargeOffChargebackAccruals);
+
+        // LP1 with 12% Flat interest, interest period: Daily, Interest 
recalculation- Same as repayment
+        // Multi-disbursement that expects tranches
+        PostLoanProductsRequest 
loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementExpectsTranches
 = loanProductsRequestFactory
+                
.defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()//
+                
.name(DefaultLoanProduct.LP1_INTEREST_FLAT_DAILY_RECALCULATION_SAR_MULTIDISB_EXPECT_TRANCHES.getName())//
+                .interestType(INTEREST_TYPE_FLAT)//
+                
.interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
+                .allowPartialPeriodInterestCalcualtion(false)//
+                
.recalculationRestFrequencyType(RecalculationRestFrequencyType.SAME_AS_REPAYMENT.value)//
+                .recalculationRestFrequencyInterval(1)//
+                .installmentAmountInMultiplesOf(null)//
+                .multiDisburseLoan(true)//
+                .disallowExpectedDisbursements(false)//
+                .maxTrancheCount(10)//
+                .outstandingLoanBalance(10000.0);//
+        Response<PostLoanProductsResponse> 
responseLoanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementExpectsTranches
 = loanProductsApi
+                
.createLoanProduct(loanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementExpectsTranches)
+                .execute();
+        
TestContext.INSTANCE.set(TestContextKey.LP1_INTEREST_FLAT_DAILY_RECALCULATION_SAR_MULTIDISB_EXPECT_TRANCHES,
+                
responseLoanProductsRequestInterestFlatSaRRecalculationSameAsRepaymentMultiDisbursementExpectsTranches);
+
+        // LP1 with 12% Flat interest, interest period: Daily, Interest 
recalculation- Actual
+        // Multi-disbursement that expects tranches
+        PostLoanProductsRequest 
loanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches = 
loanProductsRequestFactory
+                .defaultLoanProductsRequestLP1InterestFlat()//
+                
.name(DefaultLoanProduct.LP1_INTEREST_FLAT_DAILY_ACTUAL_ACTUAL_MULTIDISB_EXPECT_TRANCHES.getName())//
+                .interestType(INTEREST_TYPE_FLAT)//
+                
.interestCalculationPeriodType(InterestCalculationPeriodTime.DAILY.value)//
+                .allowPartialPeriodInterestCalcualtion(false)//
+                
.recalculationRestFrequencyType(RecalculationRestFrequencyType.DAILY.value)//
+                .interestRecalculationCompoundingMethod(0)//
+                .recalculationRestFrequencyInterval(1)//
+                .installmentAmountInMultiplesOf(null)//
+                .multiDisburseLoan(true)//
+                .disallowExpectedDisbursements(false)//
+                .maxTrancheCount(10)//
+                .outstandingLoanBalance(10000.0);//
+        Response<PostLoanProductsResponse> 
responseLoanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches
 = loanProductsApi
+                
.createLoanProduct(loanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches).execute();
+        
TestContext.INSTANCE.set(TestContextKey.LP1_INTEREST_FLAT_DAILY_ACTUAL_ACTUAL_MULTIDISB_EXPECT_TRANCHES,
+                
responseLoanProductsRequestInterestFlatActualActualMultiDisbursementExpectsTranches);
     }
 
     public static AdvancedPaymentData createPaymentAllocation(String 
transactionType, String futureInstallmentAllocationRule,
diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java
index f294b9e893..5cbd10966f 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java
@@ -282,4 +282,6 @@ public abstract class TestContextKey {
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_NO_OVERRIDES = 
"loanProductCreateResponseLP1NoOverrides";
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OF_ACCRUAL
 = 
"loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmiActualInterestRecalcChargeOffAccruals";
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_CUSTOM_PMT_ALLOC_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_RECALC_ZERO_CHARGE_OFF_ACCRUAL
 = 
"loanProductCreateResponseLP2AdvancedPaymentCustomAllocationInterestDailyEmiActualInterestRecalcChargeOffAccruals";
+    public static final String 
LP1_INTEREST_FLAT_DAILY_RECALCULATION_SAR_MULTIDISB_EXPECT_TRANCHES = 
"loanProductCreateResponseLP1InterestFlatDailyRecalculationSameAsRepaymentMultiDisbursementExpectTranches";
+    public static final String 
LP1_INTEREST_FLAT_DAILY_ACTUAL_ACTUAL_MULTIDISB_EXPECT_TRANCHES = 
"loanProductCreateResponseLP1InterestFlatDailyActualActualMultiDisbursementExpectTranches";
 }
diff --git a/fineract-e2e-tests-runner/src/test/resources/features/Loan.feature 
b/fineract-e2e-tests-runner/src/test/resources/features/Loan.feature
index b992e3026f..8bdd072cf7 100644
--- a/fineract-e2e-tests-runner/src/test/resources/features/Loan.feature
+++ b/fineract-e2e-tests-runner/src/test/resources/features/Loan.feature
@@ -8861,3 +8861,164 @@ Feature: Loan
       | 06 November 2025  | Accrual          | 1.21   | 0.0       | 1.21     | 
0.0  | 0.0       | 0.0          | false    | false    |
     And Customer makes "AUTOPAY" repayment on "06 November 2025" with 35.28 
EUR transaction amount
     Then Loan status will be "CLOSED_OBLIGATIONS_MET"
+
+  @TestRailId:C4124
+  Scenario: Verify cumulative multidisbursal loan that expects tranches with 
flat interest type and daily interest calculation period - UC7
+    When Admin sets the business date to "01 January 2025"
+    When Admin creates a client with random data
+    When Admin creates a fully customized loan with disbursements details and 
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                        | 
1st_tranche_disb_expected_date |1st_tranche_disb_principal  [...]
+      | LP1_INTEREST_FLAT_DAILY_RECALCULATION_SAR_MULTIDISB_EXPECT_TRANCHES | 
01 January 2025   | 1500           | 7                      | FLAT             
| DAILY                       | EQUAL_INSTALLMENTS | 3                 | MONTHS 
               | 1              | MONTHS                 | 3                  | 
0                       | 0                      | 0                    | 
PENALTIES_FEES_INTEREST_PRINCIPAL_ORDER | 01 January 2025                | 
1000.0                     [...]
+    And Admin successfully approves the loan on "01 January 2025" with "1500" 
amount and expected disbursement date on "01 January 2025"
+    Then Loan Repayment schedule has 3 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 2025  |           | 1000.0          |           
    |          | 0.0  |           | 0.0    |      |            |      | 0.0     
    |
+      |    |      | 15 January 2025  |           |  500.0          |           
    |          | 0.0  |           | 0.0    |      |            |      | 0.0     
    |
+      | 1  | 31   | 01 February 2025 |           | 1000.0          | 500.0     
    | 8.63     | 0.0  | 0.0       | 508.63 | 0.0  | 0.0        | 0.0  | 508.63  
    |
+      | 2  | 28   | 01 March 2025    |           |  500.0          | 500.0     
    | 8.63     | 0.0  | 0.0       | 508.63 | 0.0  | 0.0        | 0.0  | 508.63  
    |
+      | 3  | 31   | 01 April 2025    |           |    0.0          | 500.0     
    | 8.63     | 0.0  | 0.0       | 508.63 | 0.0  | 0.0        | 0.0  | 508.63  
    |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1500.0        | 25.89    | 0.0  | 0.0       | 1525.89 | 0.0  | 0.0     
   | 0.0  | 1525.89     |
+    Then Loan Transactions tab has none transaction
+    When Admin successfully disburse the loan on "01 January 2025" with "1000" 
EUR transaction amount
+    Then Loan Repayment schedule has 3 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 2025  |           | 1000.0          |           
    |          | 0.0  |           | 0.0    | 0.0  |            |      |         
    |
+      |    |      | 15 January 2025  |           |  500.0          |           
    |          | 0.0  |           | 0.0    |      |            |      | 0.0     
    |
+      | 1  | 31   | 01 February 2025 |           | 1000.0          | 500.0     
    | 5.75     | 0.0  | 0.0       | 505.75 | 0.0  | 0.0        | 0.0  | 505.75  
    |
+      | 2  | 28   | 01 March 2025    |           |  500.0          | 500.0     
    | 5.75     | 0.0  | 0.0       | 505.75 | 0.0  | 0.0        | 0.0  | 505.75  
    |
+      | 3  | 31   | 01 April 2025    |           |    0.0          | 500.0     
    | 5.76     | 0.0  | 0.0       | 505.76 | 0.0  | 0.0        | 0.0  | 505.76  
    |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1500.0        | 17.26    | 0.0  | 0.0       | 1517.26 | 0.0  | 0.0     
   | 0.0  | 1517.26     |
+    Then Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type  | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 January 2025  | Disbursement      | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+    Then Loan Tranche Details tab has the following data:
+      | Expected Disbursement On | Disbursed On    | Principal   | Net 
Disbursal Amount |
+      | 01 January 2025          | 01 January 2025 | 1000.0      |             
         |
+      | 15 January 2025          |                 |  500.0      |             
         |
+# -- 2nd disb - on Jan, 15, 2025 --#
+     When Admin sets the business date to "15 January 2025"
+    When Admin successfully disburse the loan on "15 January 2025" with "500" 
EUR transaction amount
+    Then Loan Repayment schedule has 3 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 2025  |           | 1000.0          |           
    |          | 0.0  |           | 0.0    | 0.0  |            |      |         
    |
+      |    |      | 15 January 2025  |           |  500.0          |           
    |          | 0.0  |           | 0.0    | 0.0  |            |      |         
    |
+      | 1  | 31   | 01 February 2025 |           | 1000.0          | 500.0     
    | 8.63     | 0.0  | 0.0       | 508.63 | 0.0  | 0.0        | 0.0  | 508.63  
    |
+      | 2  | 28   | 01 March 2025    |           |  500.0          | 500.0     
    | 8.63     | 0.0  | 0.0       | 508.63 | 0.0  | 0.0        | 0.0  | 508.63  
    |
+      | 3  | 31   | 01 April 2025    |           |    0.0          | 500.0     
    | 8.63     | 0.0  | 0.0       | 508.63 | 0.0  | 0.0        | 0.0  | 508.63  
    |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1500.0        | 25.89    | 0.0  | 0.0       | 1525.89 | 0.0  | 0.0     
   | 0.0  | 1525.89     |
+    Then Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type  | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 January 2025  | Disbursement      | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+      | 15 January 2025  | Disbursement      |  500.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1500.0       | false    | false    |
+    Then Loan Tranche Details tab has the following data:
+      | Expected Disbursement On | Disbursed On    | Principal   | Net 
Disbursal Amount |
+      | 01 January 2025          | 01 January 2025 | 1000.0      |             
         |
+      | 15 January 2025          | 15 January 2025 |  500.0      |             
         |
+    When Loan Pay-off is made on "15 January 2025"
+    Then Loan's all installments have obligations met
+
+  @TestRailId:4227
+  Scenario: Verify cumulative multidisbursal loan that expects tranches with 
flat interest type and no interest calculation period - UC7.1
+    When Admin sets the business date to "01 January 2025"
+    When Admin creates a client with random data
+    When Admin creates a fully customized loan with disbursements details and 
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                        | 
1st_tranche_disb_expected_date |1st_tranche_disb_principal | 2n [...]
+      | LP1_INTEREST_FLAT_DAILY_ACTUAL_ACTUAL_MULTIDISB_EXPECT_TRANCHES | 01 
January 2025   | 1500           | 7                      | FLAT             | 
DAILY                       | EQUAL_INSTALLMENTS | 3                 | MONTHS   
             | 1              | MONTHS                 | 3                  | 0 
                      | 0                      | 0                    | 
PENALTIES_FEES_INTEREST_PRINCIPAL_ORDER | 01 January 2025                | 
1000.0                    | 15 [...]
+    And Admin successfully approves the loan on "01 January 2025" with "1500" 
amount and expected disbursement date on "01 January 2025"
+    Then Loan Repayment schedule has 3 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 2025  |           | 1000.0          |           
    |          | 0.0  |           | 0.0    |      |            |      | 0.0     
    |
+      |    |      | 15 January 2025  |           |  500.0          |           
    |          | 0.0  |           | 0.0    |      |            |      | 0.0     
    |
+      | 1  | 31   | 01 February 2025 |           | 1000.0          | 500.0     
    | 8.63     | 0.0  | 0.0       | 508.63 | 0.0  | 0.0        | 0.0  | 508.63  
    |
+      | 2  | 28   | 01 March 2025    |           |  500.0          | 500.0     
    | 8.63     | 0.0  | 0.0       | 508.63 | 0.0  | 0.0        | 0.0  | 508.63  
    |
+      | 3  | 31   | 01 April 2025    |           |    0.0          | 500.0     
    | 8.63     | 0.0  | 0.0       | 508.63 | 0.0  | 0.0        | 0.0  | 508.63  
    |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1500.0        | 25.89    | 0.0  | 0.0       | 1525.89 | 0.0  | 0.0     
   | 0.0  | 1525.89     |
+    Then Loan Transactions tab has none transaction
+    When Admin successfully disburse the loan on "01 January 2025" with "1000" 
EUR transaction amount
+    Then Loan Repayment schedule has 3 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 2025  |           | 1000.0          |           
    |          | 0.0  |           | 0.0    | 0.0  |            |      |         
    |
+      |    |      | 15 January 2025  |           |  500.0          |           
    |          | 0.0  |           | 0.0    |      |            |      | 0.0     
    |
+      | 1  | 31   | 01 February 2025 |           | 1000.0          | 500.0     
    | 5.75     | 0.0  | 0.0       | 505.75 | 0.0  | 0.0        | 0.0  | 505.75  
    |
+      | 2  | 28   | 01 March 2025    |           |  500.0          | 500.0     
    | 5.75     | 0.0  | 0.0       | 505.75 | 0.0  | 0.0        | 0.0  | 505.75  
    |
+      | 3  | 31   | 01 April 2025    |           |    0.0          | 500.0     
    | 5.76     | 0.0  | 0.0       | 505.76 | 0.0  | 0.0        | 0.0  | 505.76  
    |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1500.0        | 17.26    | 0.0  | 0.0       | 1517.26 | 0.0  | 0.0     
   | 0.0  | 1517.26     |
+    Then Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type  | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 January 2025  | Disbursement      | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+    Then Loan Tranche Details tab has the following data:
+      | Expected Disbursement On | Disbursed On    | Principal   | Net 
Disbursal Amount |
+      | 01 January 2025          | 01 January 2025 | 1000.0      |             
         |
+      | 15 January 2025          |                 |  500.0      |             
         |
+    When Admin sets the business date to "16 January 2025"
+    Then Loan Repayment schedule has 3 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 2025  |           | 1000.0          |           
    |          | 0.0  |           | 0.0    | 0.0  |            |      |         
    |
+      |    |      | 15 January 2025  |           |  500.0          |           
    |          | 0.0  |           | 0.0    |      |            |      | 0.0     
    |
+      | 1  | 31   | 01 February 2025 |           | 1000.0          | 500.0     
    | 5.75     | 0.0  | 0.0       | 505.75 | 0.0  | 0.0        | 0.0  | 505.75  
    |
+      | 2  | 28   | 01 March 2025    |           |  500.0          | 500.0     
    | 5.75     | 0.0  | 0.0       | 505.75 | 0.0  | 0.0        | 0.0  | 505.75  
    |
+      | 3  | 31   | 01 April 2025    |           |    0.0          | 500.0     
    | 5.76     | 0.0  | 0.0       | 505.76 | 0.0  | 0.0        | 0.0  | 505.76  
    |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1500.0        | 17.26    | 0.0  | 0.0       | 1517.26 | 0.0  | 0.0     
   | 0.0  | 1517.26     |
+    When Admin sets the business date to "01 February 2025"
+    Then Loan Repayment schedule has 3 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 2025  |           | 1000.0          |           
    |          | 0.0  |           | 0.0    | 0.0  |            |      |         
    |
+      |    |      | 15 January 2025  |           |  500.0          |           
    |          | 0.0  |           | 0.0    |      |            |      | 0.0     
    |
+      | 1  | 31   | 01 February 2025 |           | 1000.0          | 500.0     
    | 5.75     | 0.0  | 0.0       | 505.75 | 0.0  | 0.0        | 0.0  | 505.75  
    |
+      | 2  | 28   | 01 March 2025    |           |  500.0          | 500.0     
    | 5.75     | 0.0  | 0.0       | 505.75 | 0.0  | 0.0        | 0.0  | 505.75  
    |
+      | 3  | 31   | 01 April 2025    |           |    0.0          | 500.0     
    | 5.76     | 0.0  | 0.0       | 505.76 | 0.0  | 0.0        | 0.0  | 505.76  
    |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1500.0        | 17.26    | 0.0  | 0.0       | 1517.26 | 0.0  | 0.0     
   | 0.0  | 1517.26     |
+
+# -- 2nd disb - on Feb, 1, 2025 --#
+    When Admin successfully disburse the loan on "01 February 2025" with "500" 
EUR transaction amount
+    Then Loan Repayment schedule has 3 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 2025  |           | 1000.0          |           
    |          | 0.0  |           | 0.0    | 0.0  |            |      |         
    |
+      |    |      | 01 February 2025 |           |  500.0          |           
    |          | 0.0  |           | 0.0    | 0.0  |            |      |         
    |
+      | 1  | 31   | 01 February 2025 |           | 1000.0          | 500.0     
    | 8.63     | 0.0  | 0.0       | 508.63 | 0.0  | 0.0        | 0.0  | 508.63  
    |
+      | 2  | 28   | 01 March 2025    |           |  500.0          | 500.0     
    | 8.63     | 0.0  | 0.0       | 508.63 | 0.0  | 0.0        | 0.0  | 508.63  
    |
+      | 3  | 31   | 01 April 2025    |           |    0.0          | 500.0     
    | 8.63     | 0.0  | 0.0       | 508.63 | 0.0  | 0.0        | 0.0  | 508.63  
    |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due     | Paid | In 
advance | Late | Outstanding |
+      | 1500.0        | 25.89    | 0.0  | 0.0       | 1525.89 | 0.0  | 0.0     
   | 0.0  | 1525.89     |
+    Then Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type  | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 January 2025  | Disbursement      | 1000.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1000.0       | false    | false    |
+      | 01 February 2025 | Disbursement      |  500.0 | 0.0       | 0.0      | 
0.0  | 0.0       | 1500.0       | false    | false    |
+    Then Loan Tranche Details tab has the following data:
+      | Expected Disbursement On | Disbursed On     | Principal   | Net 
Disbursal Amount |
+      | 01 January 2025          | 01 January 2025  | 1000.0      |            
          |
+      | 15 January 2025          | 01 February 2025 |  500.0      |            
          |
+
+    When Loan Pay-off is made on "01 February 2025"
+    Then Loan is closed with zero outstanding balance and it's all 
installments have obligations met
+    Then Loan Repayment schedule has 3 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 2025  |                  | 1000.0          |    
           |          | 0.0  |           | 0.0    | 0.0    |            |      
|             |
+      |    |      | 01 February 2025 |                  |  500.0          |    
           |          | 0.0  |           | 0.0    | 0.0    |            |      
|             |
+      | 1  | 31   | 01 February 2025 | 01 February 2025 | 1000.0          | 
500.0         | 8.63     | 0.0  | 0.0       | 508.63 | 508.63 | 0.0        | 
0.0  | 0.0         |
+      | 2  | 28   | 01 March 2025    | 01 February 2025 |  500.0          | 
500.0         | 8.63     | 0.0  | 0.0       | 508.63 | 508.63 | 508.63     | 
0.0  | 0.0         |
+      | 3  | 31   | 01 April 2025    | 01 February 2025 |    0.0          | 
500.0         | 8.63     | 0.0  | 0.0       | 508.63 | 508.63 | 508.63     | 
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 |
+      | 1500.0        | 25.89    | 0.0  | 0.0       | 1525.89 | 1525.89 | 
1017.26    | 0.0  | 0.0         |
+    Then Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type  | Amount  | Principal | Interest 
| Fees | Penalties | Loan Balance | Reverted | Replayed |
+      | 01 January 2025  | Disbursement      | 1000.0  | 0.0       | 0.0      
| 0.0  | 0.0       | 1000.0       | false    | false    |
+      | 01 February 2025 | Disbursement      |  500.0  | 0.0       | 0.0      
| 0.0  | 0.0       | 1500.0       | false    | false    |
+      | 01 February 2025 | Repayment         | 1525.89 | 1500.0    | 25.89    
| 0.0  | 0.0       |    0.0       | false    | false    |
+      | 01 February 2025 | Accrual           |  25.89  | 0.0       | 25.89    
| 0.0  | 0.0       |    0.0       | false    | false    |
\ No newline at end of file
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanSchedulePeriodDataWrapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanSchedulePeriodDataWrapper.java
index 760161797a..28d7f2f1f6 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanSchedulePeriodDataWrapper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanSchedulePeriodDataWrapper.java
@@ -29,4 +29,5 @@ public class LoanSchedulePeriodDataWrapper {
     private final LoanPrincipalRelatedDataHolder data;
     private final LocalDate date;
     private final boolean isDisbursement;
+    private final boolean isDisbursed;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanRepaymentScheduleService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanRepaymentScheduleService.java
index d39d0515ef..9943a626a7 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanRepaymentScheduleService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanRepaymentScheduleService.java
@@ -70,8 +70,7 @@ public class LoanRepaymentScheduleService {
         final BigDecimal totalFeeChargesDueAtDisbursement = 
repaymentScheduleRelatedLoanData.getTotalFeeChargesAtDisbursement();
         LocalDate lastDueDate = disbursement.disbursementDate();
         BigDecimal outstandingLoanPrincipalBalance = 
disbursement.getPrincipal();
-        boolean excludePastUnDisbursed = isInterestRecalculationEnabled;
-
+        boolean excludePastUnDisbursed = 
LoanScheduleType.PROGRESSIVE.equals(loanScheduleType) && 
isInterestRecalculationEnabled;
         BigDecimal waivedChargeAmount = BigDecimal.ZERO;
         for (DisbursementData disbursementDetail : disbursementData) {
             waivedChargeAmount = 
waivedChargeAmount.add(disbursementDetail.getWaivedChargeAmount());
@@ -295,16 +294,18 @@ public class LoanRepaymentScheduleService {
 
                     if (!disbursedTranches.isEmpty()) {
                         for (DisbursementData data : disbursedTranches) {
-                            disbursementDataList.add(new 
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true));
+                            disbursementDataList
+                                    .add(new 
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true, 
data.isDisbursed()));
                         }
                     } else {
                         for (DisbursementData data : sameDateDisbursements) {
-                            disbursementDataList.add(new 
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true));
+                            disbursementDataList
+                                    .add(new 
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true, 
data.isDisbursed()));
                         }
                     }
                 } else {
                     DisbursementData data = sameDateDisbursements.get(0);
-                    disbursementDataList.add(new 
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true));
+                    disbursementDataList.add(new 
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true, 
data.isDisbursed()));
                 }
             }
         } else {
@@ -316,7 +317,7 @@ public class LoanRepaymentScheduleService {
                         && !disbursementPeriodIds.contains(data.getId());
 
                 if (isEligible) {
-                    disbursementDataList.add(new 
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true));
+                    disbursementDataList.add(new 
LoanSchedulePeriodDataWrapper(data, data.disbursementDate(), true, 
data.isDisbursed()));
                     disbursementPeriodIds.add(data.getId());
                 }
             }
@@ -343,7 +344,7 @@ public class LoanRepaymentScheduleService {
                     && 
!disbursementPeriodIds.contains(data.getTransactionId());
 
             if (isEligible) {
-                capitalizedIncomeDataList.add(new 
LoanSchedulePeriodDataWrapper(data, data.getDate(), false));
+                capitalizedIncomeDataList.add(new 
LoanSchedulePeriodDataWrapper(data, data.getDate(), false, false));
                 disbursementPeriodIds.add(data.getTransactionId());
             }
         }
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanReschedulingWithinCenterTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanReschedulingWithinCenterTest.java
index 38727e57b0..f800042a26 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanReschedulingWithinCenterTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanReschedulingWithinCenterTest.java
@@ -312,11 +312,11 @@ public class LoanReschedulingWithinCenterTest extends 
BaseLoanIntegrationTest {
 
         ArrayList loanRepaymnetSchedule = 
this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, 
generalResponseSpec, loanID);
         // VERIFY RESCHEDULED DATE
-        ArrayList dueDateLoanSchedule = (ArrayList) ((HashMap) 
loanRepaymnetSchedule.get(2)).get("dueDate");
+        ArrayList dueDateLoanSchedule = (ArrayList) ((HashMap) 
loanRepaymnetSchedule.get(3)).get("dueDate");
         assertEquals(getDateAsArray(todaysdate, 0), dueDateLoanSchedule);
 
         // VERIFY THE INTEREST
-        Float interestDue = (Float) ((HashMap) 
loanRepaymnetSchedule.get(2)).get("interestDue");
+        Float interestDue = (Float) ((HashMap) 
loanRepaymnetSchedule.get(3)).get("interestDue");
         assertEquals("41.05", String.valueOf(interestDue));
 
         // DISBURSE THE SECOND TRANCHE (for let the loan test lifecycle 
callback to close the loan

Reply via email to