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;
