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 d567f1d1e9e5928483cd6619e56edd740c217ddb
Author: Oleksii Novikov <[email protected]>
AuthorDate: Fri Feb 20 00:48:21 2026 +0200

    FINERACT-2421: Add E2E test for loan modification charge recalculation
---
 .../fineract/test/data/ChargeProductType.java      |  3 +-
 .../fineract/test/stepdef/loan/LoanStepDef.java    | 92 +++++++++++++---------
 .../fineract/test/support/TestContextKey.java      |  1 +
 .../global/ChargeGlobalInitializerStep.java        |  7 ++
 .../src/test/resources/features/LoanCharge.feature | 71 +++++++++++++++++
 .../loanaccount/api/LoansApiResourceSwagger.java   |  6 +-
 6 files changed, 140 insertions(+), 40 deletions(-)

diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/ChargeProductType.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/ChargeProductType.java
index b84f47ccc1..11e570e9f7 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/ChargeProductType.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/ChargeProductType.java
@@ -36,7 +36,8 @@ public enum ChargeProductType {
     CHARGE_LOAN_TRANCHE_DISBURSEMENT_CHARGE_PERCENT(14L), //
     LOAN_INSTALLMENT_FEE_FLAT(15L), //
     LOAN_INSTALLMENT_FEE_PERCENTAGE_AMOUNT(16L), //
-    LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST(17L); //
+    LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST(17L), //
+    LOAN_DISBURSEMENT_PERCENTAGE_AMOUNT_PLUS_INTEREST_FEE(18L); //
 
     public final Long value;
 
diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java
index f58d695b0f..d29ff8dc5f 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java
@@ -61,6 +61,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Collectors;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.fineract.avro.loan.v1.LoanAccountDataV1;
 import org.apache.fineract.avro.loan.v1.LoanChargePaidByDataV1;
@@ -117,6 +118,7 @@ import org.apache.fineract.client.models.PostLoansResponse;
 import org.apache.fineract.client.models.PutLoanProductsProductIdRequest;
 import org.apache.fineract.client.models.PutLoansApprovedAmountRequest;
 import 
org.apache.fineract.client.models.PutLoansAvailableDisbursementAmountRequest;
+import org.apache.fineract.client.models.PutLoansLoanIdChargeData;
 import org.apache.fineract.client.models.PutLoansLoanIdRequest;
 import org.apache.fineract.client.models.PutLoansLoanIdResponse;
 import org.apache.fineract.test.data.AmortizationType;
@@ -171,9 +173,9 @@ import org.apache.fineract.test.stepdef.AbstractStepDef;
 import org.apache.fineract.test.support.TestContextKey;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.Assertions;
-import org.springframework.beans.factory.annotation.Autowired;
 
 @Slf4j
+@RequiredArgsConstructor
 public class LoanStepDef extends AbstractStepDef {
 
     public static final String DATE_FORMAT = "dd MMMM yyyy";
@@ -188,47 +190,24 @@ public class LoanStepDef extends AbstractStepDef {
     private static final DateTimeFormatter FORMATTER_EVENTS = 
DateTimeFormatter.ofPattern(DATE_FORMAT_EVENTS);
     private static final String TRANSACTION_DATE_FORMAT = "dd MMMM yyyy";
 
-    @Autowired
-    private BusinessDateHelper businessDateHelper;
-
-    @Autowired
-    private FineractFeignClient fineractClient;
-
-    @Autowired
-    private EventAssertion eventAssertion;
-
-    @Autowired
-    private PaymentTypeResolver paymentTypeResolver;
-
-    @Autowired
-    private LoanProductResolver loanProductResolver;
-
-    @Autowired
-    private LoanRequestFactory loanRequestFactory;
-
-    @Autowired
-    private EventCheckHelper eventCheckHelper;
+    private final BusinessDateHelper businessDateHelper;
+    private final FineractFeignClient fineractClient;
+    private final EventAssertion eventAssertion;
+    private final PaymentTypeResolver paymentTypeResolver;
+    private final LoanProductResolver loanProductResolver;
+    private final LoanRequestFactory loanRequestFactory;
+    private final EventCheckHelper eventCheckHelper;
+    private final EventStore eventStore;
+    private final CodeValueResolver codeValueResolver;
+    private final CodeHelper codeHelper;
+    private final EventProperties eventProperties;
+    private final JobPollingProperties jobPollingProperties;
 
     private void 
storePaymentTransactionResponse(ApiResponse<PostLoansLoanIdTransactionsResponse>
 apiResponse) {
         testContext().set(TestContextKey.LOAN_PAYMENT_TRANSACTION_RESPONSE, 
apiResponse.getData());
         testContext().set(TestContextKey.LOAN_PAYMENT_TRANSACTION_HEADERS, 
apiResponse.getHeaders());
     }
 
-    @Autowired
-    private EventStore eventStore;
-
-    @Autowired
-    private CodeValueResolver codeValueResolver;
-
-    @Autowired
-    private CodeHelper codeHelper;
-
-    @Autowired
-    private EventProperties eventProperties;
-
-    @Autowired
-    private JobPollingProperties jobPollingProperties;
-
     @When("Admin creates a new Loan")
     public void createLoan() {
         PostClientsResponse clientResponse = 
testContext().get(TestContextKey.CLIENT_CREATE_RESPONSE);
@@ -1485,6 +1464,47 @@ public class LoanStepDef extends AbstractStepDef {
         testContext().set(TestContextKey.LOAN_MODIFY_RESPONSE, responseMod);
     }
 
+    @Then("Admin modifies the loan and changes the ANNUAL interest rate to 
{string}")
+    public void modifyLoanInterestRate(final String newInterestRate) {
+        final PostLoansResponse loanResponse = 
testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
+        final Long loanId = loanResponse.getResourceId();
+
+        final GetLoansLoanIdResponse loanDetails = ok(
+                () -> fineractClient.loans().retrieveLoan(loanId, 
Map.of("staffInSelectedOfficeOnly", "false", "associations", "charges")));
+
+        final PutLoansLoanIdRequest putLoansLoanIdRequest = new 
PutLoansLoanIdRequest()//
+                .productId(loanDetails.getLoanProductId())//
+                .principal(loanDetails.getPrincipal().longValue())//
+                .loanTermFrequency(loanDetails.getTermFrequency())//
+                
.loanTermFrequencyType(loanDetails.getTermPeriodFrequencyType().getId())//
+                .numberOfRepayments(loanDetails.getNumberOfRepayments())//
+                .repaymentEvery(loanDetails.getRepaymentEvery())//
+                
.repaymentFrequencyType(loanDetails.getRepaymentFrequencyType().getId())//
+                .interestRatePerPeriod(new BigDecimal(newInterestRate))//
+                .interestType(loanDetails.getInterestType().getId())//
+                
.interestCalculationPeriodType(loanDetails.getInterestCalculationPeriodType().getId())//
+                .amortizationType(loanDetails.getAmortizationType().getId())//
+                
.transactionProcessingStrategyCode(loanDetails.getTransactionProcessingStrategyCode())//
+                
.expectedDisbursementDate(FORMATTER.format(loanDetails.getTimeline().getExpectedDisbursementDate()))//
+                
.submittedOnDate(FORMATTER.format(loanDetails.getTimeline().getSubmittedOnDate()))//
+                .clientId(loanDetails.getClientId())//
+                .dateFormat(DATE_FORMAT)//
+                .locale("en")//
+                .loanType("individual");//
+
+        final List<GetLoansLoanIdLoanChargeData> existingCharges = 
loanDetails.getCharges();
+        if (existingCharges != null && !existingCharges.isEmpty()) {
+            existingCharges.stream()
+                    .map(charge -> new 
PutLoansLoanIdChargeData().id(charge.getId()).chargeId(charge.getChargeId())
+                            
.dueDate(charge.getDueDate().format(FORMATTER)).amount(charge.getAmountOrPercentage()))
+                    .forEach(putLoansLoanIdRequest::addChargesItem);
+        }
+
+        final PutLoansLoanIdResponse responseMod = ok(
+                () -> fineractClient.loans().modifyLoanApplication(loanId, 
putLoansLoanIdRequest, Map.of()));
+        testContext().set(TestContextKey.LOAN_MODIFY_RESPONSE, responseMod);
+    }
+
     @Then("Admin fails to create a new customised Loan submitted on date: 
{string}, with Principal: {string}, a loanTermFrequency: {int} months, and 
numberOfRepayments: {int}")
     public void createCustomizedLoanFailure(String submitDate, String 
principal, Integer loanTermFrequency, Integer numberOfRepayments) {
         PostClientsResponse clientResponse = 
testContext().get(TestContextKey.CLIENT_CREATE_RESPONSE);
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 7820e74d0a..97ae045157 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
@@ -213,6 +213,7 @@ public abstract class TestContextKey {
     public static final String 
CHARGE_FOR_LOAN_INSTALLMENT_FEE_FLAT_CREATE_RESPONSE = 
"ChargeForLoanInstallmentFeeFlatCreateResponse";
     public static final String CHARGE_FOR_CLIENT_FIXED_FEE_CREATE_RESPONSE = 
"ChargeForClientFixedFeeCreateResponse";
     public static final String 
CHARGE_FOR_LOAN_DISBURSEMENT_CHARGE_CREATE_RESPONSE = 
"ChargeForLoanDisbursementChargeCreateResponse";
+    public static final String 
CHARGE_FOR_LOAN_DISBURSEMENT_PERCENTAGE_AMOUNT_PLUS_INTEREST_CREATE_RESPONSE = 
"ChargeForLoanDisbursementPercentageAmountPlusInterestCreateResponse";
     public static final String LOAN_RESPONSE = "loanResponse";
     public static final String LOAN_REPAYMENT_UNDO_RESPONSE = 
"loanRepaymentUndoResponse";
     public static final String 
LOAN_CAPITALIZED_INCOME_ADJUSTMENT_UNDO_RESPONSE = 
"loanCapitalizedIncomeAdjustmentUndoResponse";
diff --git 
a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/ChargeGlobalInitializerStep.java
 
b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/ChargeGlobalInitializerStep.java
index 0a98ddad8d..6dfec136ab 100644
--- 
a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/ChargeGlobalInitializerStep.java
+++ 
b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/ChargeGlobalInitializerStep.java
@@ -64,6 +64,7 @@ public class ChargeGlobalInitializerStep implements 
FineractGlobalInitializerSte
     public static final String CHARGE_LOAN_INSTALLMENT_FEE_PERCENT_AMOUNT = 
"Installment percentage amount fee";
     public static final String CHARGE_LOAN_INSTALLMENT_FEE_PERCENT_INTEREST = 
"Installment percentage interest fee";
     public static final String 
CHARGE_LOAN_INSTALLMENT_FEE_PERCENT_AMOUNT_PLUS_INTEREST = "Installment 
percentage amount + interest fee";
+    public static final String 
CHARGE_LOAN_DISBURSEMENT_PERCENT_AMOUNT_PLUS_INTEREST_FEE = "Disbursement 
percentage amount + interest fee";
     public static final String CHARGE_CLIENT_FIXED_FEE = "Fixed fee for 
Client";
     public static final String CHARGE_DISBURSEMENT_CHARGE = "Disbursement 
Charge";
     public static final String CHARGE_LOAN_TRANCHE_DISBURSEMENT_CHARGE_AMOUNT 
= "Tranche Disbursement Charge Amount";
@@ -185,6 +186,12 @@ public class ChargeGlobalInitializerStep implements 
FineractGlobalInitializerSte
                 CHARGE_AMOUNT_PERCENTAGE, true, false);
         
TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST_CREATE_RESPONSE,
                 responseLoanInstallmentPercentInterest);
+
+        PostChargesResponse responseLoanDisbursementPercentAmountPlusInterest 
= createChargeIfNotExists(charges, CHARGE_APPLIES_TO_LOAN,
+                CHARGE_LOAN_DISBURSEMENT_PERCENT_AMOUNT_PLUS_INTEREST_FEE, 
CHARGE_TIME_TYPE_DISBURSEMENT,
+                CHARGE_CALCULATION_TYPE_PERCENTAGE_LOAN_AMOUNT_PLUS_INTEREST, 
CHARGE_AMOUNT_PERCENTAGE, true, false);
+        
TestContext.INSTANCE.set(TestContextKey.CHARGE_FOR_LOAN_DISBURSEMENT_PERCENTAGE_AMOUNT_PLUS_INTEREST_CREATE_RESPONSE,
+                responseLoanDisbursementPercentAmountPlusInterest);
     }
 
     private PostChargesResponse createChargeIfNotExists(List<ChargeData> 
existingCharges, Enum<ChargeProductAppliesTo> appliesTo,
diff --git 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanCharge.feature 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanCharge.feature
index 1c5b306072..b0a34dfa58 100644
--- a/fineract-e2e-tests-runner/src/test/resources/features/LoanCharge.feature
+++ b/fineract-e2e-tests-runner/src/test/resources/features/LoanCharge.feature
@@ -8054,3 +8054,74 @@ Feature: LoanCharge
     Then LoanDisbursalTransactionBusinessEvent has changedTerms "false"
     When Loan Pay-off is made on "01 March 2024"
     Then Loan is closed with zero outstanding balance and it's all 
installments have obligations met
+
+  Scenario: Loan modification should recalculate percentage charge based on 
new interest, not accumulate old and new interest
+    When Admin sets the business date to "01 January 2024"
+    When Admin creates a client with random data
+    When Admin creates a fully customized loan with charges 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            | 
chargesCalculationType                            [...]
+      | 
LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_ACCRUAL_ACTIVITY
 | 01 January 2024   | 100            | 10                     | 
DECLINING_BALANCE | DAILY                       | EQUAL_INSTALLMENTS | 6        
         | MONTHS                | 1              | MONTHS                 | 6  
                | 0                       | 0                      | 0          
          | ADVANCED_PAYMENT_ALLOCATION | 
LOAN_DISBURSEMENT_PERCENTAGE_AMOUNT_PLUS_INTEREST [...]
+    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 |
+      |    |      | 01 January 2024  |           | 100.0           |           
    |          | 10.29 |           | 10.29 |      |            |      | 10.29   
    |
+      | 1  | 31   | 01 February 2024 |           | 83.67           | 16.33     
    | 0.83     | 0.0   | 0.0       | 17.16 | 0.0  | 0.0        | 0.0  | 17.16   
    |
+      | 2  | 29   | 01 March 2024    |           | 67.21           | 16.46     
    | 0.7      | 0.0   | 0.0       | 17.16 | 0.0  | 0.0        | 0.0  | 17.16   
    |
+      | 3  | 31   | 01 April 2024    |           | 50.61           | 16.6      
    | 0.56     | 0.0   | 0.0       | 17.16 | 0.0  | 0.0        | 0.0  | 17.16   
    |
+      | 4  | 30   | 01 May 2024      |           | 33.87           | 16.74     
    | 0.42     | 0.0   | 0.0       | 17.16 | 0.0  | 0.0        | 0.0  | 17.16   
    |
+      | 5  | 31   | 01 June 2024     |           | 16.99           | 16.88     
    | 0.28     | 0.0   | 0.0       | 17.16 | 0.0  | 0.0        | 0.0  | 17.16   
    |
+      | 6  | 30   | 01 July 2024     |           | 0.0             | 16.99     
    | 0.14     | 0.0   | 0.0       | 17.13 | 0.0  | 0.0        | 0.0  | 17.13   
    |
+    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.93     | 10.29 | 0.0       | 113.22 | 0.0  | 0.0     
   | 0.0  | 113.22      |
+    Then Loan Charges tab has the following data:
+      | Name                                          | isPenalty | Payment 
due at | Due as of | Calculation type         | Due   | Paid | Waived | 
Outstanding |
+      | Disbursement percentage amount + interest fee | false     | 
Disbursement   |           | % Loan Amount + Interest | 10.29 | 0.0  | 0.0    | 
10.29       |
+    And Admin successfully approves the loan on "01 January 2024" with "100" 
amount and expected disbursement date on "01 January 2024"
+    Then Admin can successfully undone the loan approval
+    Then Admin modifies the loan and changes the ANNUAL interest rate to "9"
+    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 |
+      |    |      | 01 January 2024  |           | 100.0           |           
    |          | 10.26 |           | 10.26 |      |            |      | 10.26   
    |
+      | 1  | 31   | 01 February 2024 |           | 83.64           | 16.36     
    | 0.75     | 0.0   | 0.0       | 17.11 | 0.0  | 0.0        | 0.0  | 17.11   
    |
+      | 2  | 29   | 01 March 2024    |           | 67.16           | 16.48     
    | 0.63     | 0.0   | 0.0       | 17.11 | 0.0  | 0.0        | 0.0  | 17.11   
    |
+      | 3  | 31   | 01 April 2024    |           | 50.55           | 16.61     
    | 0.5      | 0.0   | 0.0       | 17.11 | 0.0  | 0.0        | 0.0  | 17.11   
    |
+      | 4  | 30   | 01 May 2024      |           | 33.82           | 16.73     
    | 0.38     | 0.0   | 0.0       | 17.11 | 0.0  | 0.0        | 0.0  | 17.11   
    |
+      | 5  | 31   | 01 June 2024     |           | 16.96           | 16.86     
    | 0.25     | 0.0   | 0.0       | 17.11 | 0.0  | 0.0        | 0.0  | 17.11   
    |
+      | 6  | 30   | 01 July 2024     |           | 0.0             | 16.96     
    | 0.13     | 0.0   | 0.0       | 17.09 | 0.0  | 0.0        | 0.0  | 17.09   
    |
+    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.64     | 10.26 | 0.0       | 112.9 | 0.0  | 0.0      
  | 0.0  | 112.9       |
+    Then Loan Charges tab has the following data:
+      | Name                                          | isPenalty | Payment 
due at | Due as of | Calculation type         | Due   | Paid | Waived | 
Outstanding |
+      | Disbursement percentage amount + interest fee | false     | 
Disbursement   |           | % Loan Amount + Interest | 10.26 | 0.0  | 0.0    | 
10.26       |
+    And Admin successfully approves the loan on "01 January 2024" with "100" 
amount and expected disbursement date on "01 January 2024"
+    When Admin successfully disburse the loan on "01 January 2024" with "100" 
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 |
+      |    |      | 01 January 2024  |           | 100.0           |           
    |          | 10.26 |           | 10.26 | 10.26 |            |      |        
     |
+      | 1  | 31   | 01 February 2024 |           | 83.64           | 16.36     
    | 0.75     | 0.0   | 0.0       | 17.11 | 0.0   | 0.0        | 0.0  | 17.11  
     |
+      | 2  | 29   | 01 March 2024    |           | 67.16           | 16.48     
    | 0.63     | 0.0   | 0.0       | 17.11 | 0.0   | 0.0        | 0.0  | 17.11  
     |
+      | 3  | 31   | 01 April 2024    |           | 50.55           | 16.61     
    | 0.5      | 0.0   | 0.0       | 17.11 | 0.0   | 0.0        | 0.0  | 17.11  
     |
+      | 4  | 30   | 01 May 2024      |           | 33.82           | 16.73     
    | 0.38     | 0.0   | 0.0       | 17.11 | 0.0   | 0.0        | 0.0  | 17.11  
     |
+      | 5  | 31   | 01 June 2024     |           | 16.96           | 16.86     
    | 0.25     | 0.0   | 0.0       | 17.11 | 0.0   | 0.0        | 0.0  | 17.11  
     |
+      | 6  | 30   | 01 July 2024     |           | 0.0             | 16.96     
    | 0.13     | 0.0   | 0.0       | 17.09 | 0.0   | 0.0        | 0.0  | 17.09  
     |
+    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.64     | 10.26 | 0.0       | 112.9 | 10.26 | 0.0     
   | 0.0  | 102.64      |
+    Then Loan Charges tab has the following data:
+      | Name                                          | isPenalty | Payment 
due at | Due as of | Calculation type         | Due   | Paid  | Waived | 
Outstanding |
+      | Disbursement percentage amount + interest fee | false     | 
Disbursement   |           | % Loan Amount + Interest | 10.26 | 10.26 | 0.0    
| 0.0         |
+    When Admin sets the business date to "01 February 2024"
+    And Customer makes "AUTOPAY" repayment on "01 February 2024" with 17.11 
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 |
+      |    |      | 01 January 2024  |                  | 100.0           |    
           |          | 10.26 |           | 10.26 | 10.26 |            |      | 
            |
+      | 1  | 31   | 01 February 2024 | 01 February 2024 | 83.64           | 
16.36         | 0.75     | 0.0   | 0.0       | 17.11 | 17.11 | 0.0        | 0.0 
 | 0.0         |
+      | 2  | 29   | 01 March 2024    |                  | 67.16           | 
16.48         | 0.63     | 0.0   | 0.0       | 17.11 | 0.0   | 0.0        | 0.0 
 | 17.11       |
+      | 3  | 31   | 01 April 2024    |                  | 50.55           | 
16.61         | 0.5      | 0.0   | 0.0       | 17.11 | 0.0   | 0.0        | 0.0 
 | 17.11       |
+      | 4  | 30   | 01 May 2024      |                  | 33.82           | 
16.73         | 0.38     | 0.0   | 0.0       | 17.11 | 0.0   | 0.0        | 0.0 
 | 17.11       |
+      | 5  | 31   | 01 June 2024     |                  | 16.96           | 
16.86         | 0.25     | 0.0   | 0.0       | 17.11 | 0.0   | 0.0        | 0.0 
 | 17.11       |
+      | 6  | 30   | 01 July 2024     |                  | 0.0             | 
16.96         | 0.13     | 0.0   | 0.0       | 17.09 | 0.0   | 0.0        | 0.0 
 | 17.09       |
+    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.64     | 10.26 | 0.0       | 112.9 | 27.37 | 0.0     
   | 0.0  | 85.53       |
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
index 45bb2367fb..723a9b25c0 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
@@ -1610,7 +1610,7 @@ final class LoansApiResourceSwagger {
         public Long clientId;
         @Schema(example = "individual")
         public String loanType;
-        public List<PutLoansLoanIdChanges> charges;
+        public List<PutLoansLoanIdChargeData> charges;
         public List<PutLoansLoanIdCollateral> collateral;
         public List<PutLoansLoanIdDisbursementData> disbursementData;
         @Schema(example = "false", description = "Allow full term length for 
each tranche disbursement")
@@ -1628,9 +1628,9 @@ final class LoansApiResourceSwagger {
         @Schema(example = "false")
         public Boolean interestRecognitionOnDisbursementDate;
 
-        static final class PutLoansLoanIdChanges {
+        static final class PutLoansLoanIdChargeData {
 
-            private PutLoansLoanIdChanges() {}
+            private PutLoansLoanIdChargeData() {}
 
             @Schema(example = "dd MMMM yyyy")
             public String dateFormat;

Reply via email to