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 d1154c59ba7463d2991535ca75fc52f1ad96b649 Author: mdmytriv <[email protected]> AuthorDate: Mon May 12 10:32:44 2025 +0300 FINERACT-2181: added e2e automation tests for expected tranches with disbursements fix --- .../apache/fineract/test/api/ApiConfiguration.java | 6 + .../fineract/test/factory/LoanRequestFactory.java | 9 + .../fineract/test/helper/ErrorMessageHelper.java | 19 + .../fineract/test/stepdef/loan/LoanStepDef.java | 348 ++++++++-- .../fineract/test/support/TestContextKey.java | 1 + .../test/resources/features/EMICalculation.feature | 706 +++++++++++++++++++++ .../src/test/resources/features/LoanCharge.feature | 4 +- 7 files changed, 1024 insertions(+), 69 deletions(-) diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/api/ApiConfiguration.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/api/ApiConfiguration.java index 4ec481857e..0cfaeb6232 100644 --- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/api/ApiConfiguration.java +++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/api/ApiConfiguration.java @@ -41,6 +41,7 @@ import org.apache.fineract.client.services.JournalEntriesApi; import org.apache.fineract.client.services.LoanAccountLockApi; import org.apache.fineract.client.services.LoanChargesApi; import org.apache.fineract.client.services.LoanCobCatchUpApi; +import org.apache.fineract.client.services.LoanDisbursementDetailsApi; import org.apache.fineract.client.services.LoanInterestPauseApi; import org.apache.fineract.client.services.LoanProductsApi; import org.apache.fineract.client.services.LoanTransactionsApi; @@ -250,4 +251,9 @@ public class ApiConfiguration { public LoanInterestPauseApi loanInterestPauseApi() { return fineractClient.createService(LoanInterestPauseApi.class); } + + @Bean + public LoanDisbursementDetailsApi loanDisbursementDetailsApi() { + return fineractClient.createService(LoanDisbursementDetailsApi.class); + } } diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanRequestFactory.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanRequestFactory.java index 5602506310..4c13f801a5 100644 --- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanRequestFactory.java +++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanRequestFactory.java @@ -21,8 +21,11 @@ package org.apache.fineract.test.factory; import java.math.BigDecimal; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.List; import lombok.RequiredArgsConstructor; +import org.apache.fineract.client.models.DisbursementDetail; import org.apache.fineract.client.models.InterestPauseRequestDto; +import org.apache.fineract.client.models.PostAddAndDeleteDisbursementDetailRequest; import org.apache.fineract.client.models.PostCreateRescheduleLoansRequest; import org.apache.fineract.client.models.PostLoansLoanIdChargesChargeIdRequest; import org.apache.fineract.client.models.PostLoansLoanIdRequest; @@ -183,6 +186,12 @@ public class LoanRequestFactory { .paymentTypeId(Math.toIntExact(DEFAULT_PAYMENT_TYPE_ID)).dateFormat(DATE_FORMAT).locale(DEFAULT_LOCALE); } + public static PostAddAndDeleteDisbursementDetailRequest defaultLoanDisbursementDetailRequest( + List<DisbursementDetail> disbursementData) { + return new PostAddAndDeleteDisbursementDetailRequest().disbursementData(disbursementData).dateFormat(DATE_FORMAT) + .locale(DEFAULT_LOCALE); + } + public static PostLoansLoanIdTransactionsRequest defaultPaymentTransactionRequest() { return new PostLoansLoanIdTransactionsRequest().transactionDate(DEFAULT_TRANSACTION_DATE) .transactionAmount(DEFAULT_PAYMENT_TRANSACTION_AMOUNT).paymentTypeId(DEFAULT_PAYMENT_TYPE_ID).dateFormat(DATE_FORMAT) diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java index fc24a0e791..abb2d13cb6 100644 --- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java +++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java @@ -24,6 +24,7 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.apache.fineract.client.models.BatchResponse; @@ -75,6 +76,10 @@ public final class ErrorMessageHelper { return "Loan: [0-9]* disbursement is not allowed on charged-off loan."; } + public static String disburseIsNotAllowedFailure() { + return "Loan Disbursal is not allowed. Loan Account is not in approved and not disbursed state."; + } + public static String loanSubmitDateInFutureFailureMsg() { return "The date on which a loan is submitted cannot be in the future."; } @@ -910,4 +915,18 @@ public final class ErrorMessageHelper { public static String wrongValueInTotalPages(Integer actual, Integer expected) { return String.format("Wrong value for Total pages. %nActual value is: %s %nExpected value is: %s", actual, expected); } + + public static String wrongValueInLineInDisbursementDetailsTab(String resourceId, int line, Set<List<String>> actualList, + List<String> expected) { + String actual = actualList.stream().map(Object::toString).collect(Collectors.joining(System.lineSeparator())); + return String.format("%nWrong value in Loan Tranche Details tab of resource %s line %s." // + + "%nActual values in line (with the same date) are: %n%s %nExpected values in line: %n%s", resourceId, line, actual, + expected); + } + + public static String nrOfLinesWrongInLoanTrancheDetailsTab(String resourceId, int actual, int expected) { + return String.format("%nNumber of lines does not match in Loan Tranche Details tab and expected datatable of resource %s." // + + "%nNumber of disbursement details tab lines: %s %nNumber of expected datatable lines: %s%n", resourceId, actual, + expected); + } } 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 a10952ae66..375c43cc63 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 @@ -63,11 +63,13 @@ import org.apache.fineract.avro.loan.v1.LoanTransactionDataV1; import org.apache.fineract.client.models.AdvancedPaymentData; import org.apache.fineract.client.models.CommandProcessingResult; import org.apache.fineract.client.models.DeleteLoansLoanIdResponse; +import org.apache.fineract.client.models.DisbursementDetail; import org.apache.fineract.client.models.GetLoanProductsChargeOffReasonOptions; import org.apache.fineract.client.models.GetLoanProductsProductIdResponse; import org.apache.fineract.client.models.GetLoanProductsResponse; import org.apache.fineract.client.models.GetLoanProductsTemplateResponse; import org.apache.fineract.client.models.GetLoansLoanIdDelinquencySummary; +import org.apache.fineract.client.models.GetLoansLoanIdDisbursementDetails; import org.apache.fineract.client.models.GetLoansLoanIdLoanChargeData; import org.apache.fineract.client.models.GetLoansLoanIdLoanChargePaidByData; import org.apache.fineract.client.models.GetLoansLoanIdLoanTermVariations; @@ -82,6 +84,7 @@ import org.apache.fineract.client.models.GetLoansLoanIdTransactionsTransactionId import org.apache.fineract.client.models.InterestPauseRequestDto; import org.apache.fineract.client.models.IsCatchUpRunningDTO; import org.apache.fineract.client.models.PaymentAllocationOrder; +import org.apache.fineract.client.models.PostAddAndDeleteDisbursementDetailRequest; import org.apache.fineract.client.models.PostClientsResponse; import org.apache.fineract.client.models.PostLoansDisbursementData; import org.apache.fineract.client.models.PostLoansLoanIdRequest; @@ -97,6 +100,7 @@ import org.apache.fineract.client.models.PutLoanProductsProductIdResponse; import org.apache.fineract.client.models.PutLoansLoanIdRequest; import org.apache.fineract.client.models.PutLoansLoanIdResponse; import org.apache.fineract.client.services.LoanCobCatchUpApi; +import org.apache.fineract.client.services.LoanDisbursementDetailsApi; import org.apache.fineract.client.services.LoanInterestPauseApi; import org.apache.fineract.client.services.LoanProductsApi; import org.apache.fineract.client.services.LoanTransactionsApi; @@ -205,6 +209,9 @@ public class LoanStepDef extends AbstractStepDef { @Autowired private EventProperties eventProperties; + @Autowired + private LoanDisbursementDetailsApi loanDisbursementDetailsApi; + @When("Admin creates a new Loan") public void createLoan() throws IOException { Response<PostClientsResponse> clientResponse = testContext().get(TestContextKey.CLIENT_CREATE_RESPONSE); @@ -470,6 +477,18 @@ public class LoanStepDef extends AbstractStepDef { createFullyCustomizedLoanWithChargesAndExpectedTrancheDisbursementsDetails(data.get(1)); } + @When("Admin creates a fully customized loan with disbursement details and following data:") + public void createFullyCustomizedLoanWithDisbursementDetails(final DataTable table) throws IOException { + final List<List<String>> data = table.asLists(); + createFullyCustomizedLoanWithExpectedTrancheDisbursementDetails(data.get(1)); + } + + @When("Admin creates a fully customized loan with disbursements details and following data:") + public void createFullyCustomizedLoanWithDisbursementsDetails(final DataTable table) throws IOException { + final List<List<String>> data = table.asLists(); + createFullyCustomizedLoanWithExpectedTrancheDisbursementsDetails(data.get(1)); + } + @When("Admin creates a fully customized loan with forced disabled downpayment with the following data:") public void createFullyCustomizedLoanWithForcedDisabledDownpayment(DataTable table) throws IOException { List<List<String>> data = table.asLists(); @@ -1375,6 +1394,71 @@ public class LoanStepDef extends AbstractStepDef { eventCheckHelper.loanDisbursalTransactionEventCheck(loanDisburseResponse); } + @And("Admin successfully add disbursement detail to the loan on {string} with {double} EUR transaction amount") + public void addDisbursementDetailToLoan(String expectedDisbursementDate, Double disbursementAmount) throws IOException { + Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); + long loanId = loanResponse.body().getLoanId(); + + Response<GetLoansLoanIdResponse> loanDetails = loansApi.retrieveLoan(loanId, false, "all", "", "").execute(); + Set<GetLoansLoanIdDisbursementDetails> disbursementDetailsList = loanDetails.body().getDisbursementDetails(); + + List<DisbursementDetail> disbursementData = new ArrayList<>(); + + // get and add already existing entries - just do not delete them + if (disbursementDetailsList != null) { + disbursementDetailsList.stream().forEach(disbursementDetail -> { + LocalDate expectedDisbursementDateExisting = disbursementDetail.getExpectedDisbursementDate(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT); + String formatted = expectedDisbursementDateExisting.format(formatter); + + DisbursementDetail disbursementDetailEntryExisting = new DisbursementDetail().id(disbursementDetail.getId()) + .expectedDisbursementDate(formatted).principal(disbursementDetail.getPrincipal()); + disbursementData.add(disbursementDetailEntryExisting); + }); + } + + // add new entry with expected disbursement detail + DisbursementDetail disbursementDetailsEntryNew = new DisbursementDetail().principal(disbursementAmount) + .expectedDisbursementDate(expectedDisbursementDate); + disbursementData.add(disbursementDetailsEntryNew); + + PostAddAndDeleteDisbursementDetailRequest disbursementDetailRequest = LoanRequestFactory + .defaultLoanDisbursementDetailRequest(disbursementData); + Response<String> loanDisburseResponse = loanDisbursementDetailsApi.addAndDeleteDisbursementDetail(loanId, disbursementDetailRequest) + .execute(); + testContext().set(TestContextKey.LOAN_DISBURSEMENT_DETAIL_RESPONSE, loanDisburseResponse); + ErrorHelper.checkSuccessfulApiCall(loanDisburseResponse); + } + + @Then("Loan Tranche Details tab has the following data:") + public void loanTrancheDetailsTabCheck(DataTable table) throws IOException { + Response<PostLoansResponse> loanCreateResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); + long loanId = loanCreateResponse.body().getLoanId(); + String resourceId = String.valueOf(loanId); + + Response<GetLoansLoanIdResponse> loanDetailsResponse = loansApi.retrieveLoan(loanId, false, "all", "", "").execute(); + ErrorHelper.checkSuccessfulApiCall(loanDetailsResponse); + Set<GetLoansLoanIdDisbursementDetails> disbursementDetails = loanDetailsResponse.body().getDisbursementDetails(); + List<List<String>> data = table.asLists(); + for (int i = 1; i < data.size(); i++) { + List<String> expectedValues = data.get(i); + String expectedDisbursementDateExpected = expectedValues.get(0); + + Set<List<String>> actualValuesList = disbursementDetails.stream()// + .filter(t -> expectedDisbursementDateExpected.equals(FORMATTER.format(t.getExpectedDisbursementDate())))// + .map(t -> fetchValuesOfDisbursementDetails(table.row(0), t))// + .collect(Collectors.toSet());// + boolean containsExpectedValues = actualValuesList.stream()// + .anyMatch(actualValues -> actualValues.equals(expectedValues));// + assertThat(containsExpectedValues) + .as(ErrorMessageHelper.wrongValueInLineInDisbursementDetailsTab(resourceId, i, actualValuesList, expectedValues)) + .isTrue(); + } + assertThat(disbursementDetails.size()) + .as(ErrorMessageHelper.nrOfLinesWrongInTransactionsTab(resourceId, disbursementDetails.size(), data.size() - 1)) + .isEqualTo(data.size() - 1); + } + @And("Admin successfully disburse the loan without auto downpayment on {string} with {string} EUR transaction amount") public void disburseLoanWithoutAutoDownpayment(String actualDisbursementDate, String transactionAmount) throws IOException { Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); @@ -1440,6 +1524,85 @@ public class LoanStepDef extends AbstractStepDef { eventCheckHelper.loanDisbursalTransactionEventCheck(loanDisburseResponse); } + @When("Admin successfully undo disbursal") + public void undoDisbursal() throws IOException { + Response<PostLoansLoanIdResponse> loanApproveResponse = testContext().get(TestContextKey.LOAN_APPROVAL_RESPONSE); + long loanId = loanApproveResponse.body().getLoanId(); + + PostLoansLoanIdRequest undoDisbursalRequest = new PostLoansLoanIdRequest().note(""); + Response<PostLoansLoanIdResponse> undoLastDisbursalResponse = loansApi + .stateTransitions(loanId, undoDisbursalRequest, "undodisbursal").execute(); + ErrorHelper.checkSuccessfulApiCall(undoLastDisbursalResponse); + } + + @When("Admin successfully undo last disbursal") + public void undoLastDisbursal() throws IOException { + Response<PostLoansLoanIdResponse> loanApproveResponse = testContext().get(TestContextKey.LOAN_APPROVAL_RESPONSE); + long loanId = loanApproveResponse.body().getLoanId(); + + PostLoansLoanIdRequest undoDisbursalRequest = new PostLoansLoanIdRequest().note(""); + Response<PostLoansLoanIdResponse> undoLastDisbursalResponse = loansApi + .stateTransitions(loanId, undoDisbursalRequest, "undolastdisbursal").execute(); + ErrorHelper.checkSuccessfulApiCall(undoLastDisbursalResponse); + } + + @Then("Admin can successfully undone the loan disbursal") + public void checkUndoLoanDisbursal() throws IOException { + Response<PostLoansLoanIdResponse> loanApproveResponse = testContext().get(TestContextKey.LOAN_APPROVAL_RESPONSE); + long loanId = loanApproveResponse.body().getLoanId(); + PostLoansLoanIdRequest undoDisbursalRequest = new PostLoansLoanIdRequest().note(""); + + Response<PostLoansLoanIdResponse> undoDisbursalResponse = loansApi.stateTransitions(loanId, undoDisbursalRequest, "undodisbursal") + .execute(); + testContext().set(TestContextKey.LOAN_UNDO_DISBURSE_RESPONSE, undoDisbursalResponse); + ErrorHelper.checkSuccessfulApiCall(undoDisbursalResponse); + assertThat(undoDisbursalResponse.body().getChanges().getStatus().getValue()).isEqualTo(LOAN_STATE_APPROVED); + } + + @Then("Admin fails to disburse the loan on {string} with {string} EUR transaction amount because of wrong date") + public void disburseLoanFailureWithDate(String actualDisbursementDate, String transactionAmount) throws IOException { + Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); + long loanId = loanResponse.body().getLoanId(); + PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest() + .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount)); + + Response<PostLoansLoanIdResponse> loanDisburseResponse = loansApi.stateTransitions(loanId, disburseRequest, "disburse").execute(); + testContext().set(TestContextKey.LOAN_DISBURSE_RESPONSE, loanDisburseResponse); + ErrorResponse errorDetails = ErrorResponse.from(loanDisburseResponse); + assertThat(errorDetails.getHttpStatusCode()).as(ErrorMessageHelper.dateFailureErrorCodeMsg()).isEqualTo(403); + assertThat(errorDetails.getSingleError().getDeveloperMessage()).isEqualTo(ErrorMessageHelper.disburseDateFailure((int) loanId)); + } + + @Then("Admin fails to disburse the loan on {string} with {string} EUR transaction amount because of wrong amount") + public void disburseLoanFailureWithAmount(String actualDisbursementDate, String transactionAmount) throws IOException { + Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); + long loanId = loanResponse.body().getLoanId(); + PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest() + .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount)); + + Response<PostLoansLoanIdResponse> loanDisburseResponse = loansApi.stateTransitions(loanId, disburseRequest, "disburse").execute(); + testContext().set(TestContextKey.LOAN_DISBURSE_RESPONSE, loanDisburseResponse); + ErrorResponse errorDetails = ErrorResponse.from(loanDisburseResponse); + String developerMessage = errorDetails.getSingleError().getDeveloperMessage(); + + assertThat(errorDetails.getHttpStatusCode()).as(ErrorMessageHelper.dateFailureErrorCodeMsg()).isEqualTo(403); + assertThat(developerMessage).matches(ErrorMessageHelper.disburseMaxAmountFailure()); + log.debug("Error message: {}", developerMessage); + } + + @Then("Admin fails to disburse the loan on {string} with {string} amount") + public void disburseLoanFailureIsNotAllowed(String disbursementDate, String disbursementAmount) throws IOException { + Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); + long loanId = loanResponse.body().getLoanId(); + PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest().actualDisbursementDate(disbursementDate) + .transactionAmount(new BigDecimal(disbursementAmount)); + + Response<PostLoansLoanIdResponse> loanDisburseResponse = loansApi.stateTransitions(loanId, disburseRequest, "disburse").execute(); + ErrorResponse errorDetails = ErrorResponse.from(loanDisburseResponse); + assertThat(errorDetails.getHttpStatusCode()).as(ErrorMessageHelper.dateFailureErrorCodeMsg()).isEqualTo(400); + assertThat(errorDetails.getSingleError().getDeveloperMessage()).isEqualTo(ErrorMessageHelper.disburseIsNotAllowedFailure()); + } + @And("Admin does charge-off the loan on {string}") public void chargeOffLoan(String transactionDate) throws IOException { Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); @@ -1616,72 +1779,6 @@ public class LoanStepDef extends AbstractStepDef { assertThat(errorDetails.getSingleError().getDeveloperMessage()).isEqualTo(ErrorMessageHelper.notChargedOffFailure(loanId)); } - @When("Admin successfully undo disbursal") - public void undoDisbursal() throws IOException { - Response<PostLoansLoanIdResponse> loanApproveResponse = testContext().get(TestContextKey.LOAN_APPROVAL_RESPONSE); - long loanId = loanApproveResponse.body().getLoanId(); - - PostLoansLoanIdRequest undoDisbursalRequest = new PostLoansLoanIdRequest().note(""); - Response<PostLoansLoanIdResponse> undoLastDisbursalResponse = loansApi - .stateTransitions(loanId, undoDisbursalRequest, "undodisbursal").execute(); - ErrorHelper.checkSuccessfulApiCall(undoLastDisbursalResponse); - } - - @When("Admin successfully undo last disbursal") - public void undoLastDisbursal() throws IOException { - Response<PostLoansLoanIdResponse> loanApproveResponse = testContext().get(TestContextKey.LOAN_APPROVAL_RESPONSE); - long loanId = loanApproveResponse.body().getLoanId(); - - PostLoansLoanIdRequest undoDisbursalRequest = new PostLoansLoanIdRequest().note(""); - Response<PostLoansLoanIdResponse> undoLastDisbursalResponse = loansApi - .stateTransitions(loanId, undoDisbursalRequest, "undolastdisbursal").execute(); - ErrorHelper.checkSuccessfulApiCall(undoLastDisbursalResponse); - } - - @Then("Admin can successfully undone the loan disbursal") - public void checkUndoLoanDisbursal() throws IOException { - Response<PostLoansLoanIdResponse> loanApproveResponse = testContext().get(TestContextKey.LOAN_APPROVAL_RESPONSE); - long loanId = loanApproveResponse.body().getLoanId(); - PostLoansLoanIdRequest undoDisbursalRequest = new PostLoansLoanIdRequest().note(""); - - Response<PostLoansLoanIdResponse> undoDisbursalResponse = loansApi.stateTransitions(loanId, undoDisbursalRequest, "undodisbursal") - .execute(); - testContext().set(TestContextKey.LOAN_UNDO_DISBURSE_RESPONSE, undoDisbursalResponse); - ErrorHelper.checkSuccessfulApiCall(undoDisbursalResponse); - assertThat(undoDisbursalResponse.body().getChanges().getStatus().getValue()).isEqualTo(LOAN_STATE_APPROVED); - } - - @Then("Admin fails to disburse the loan on {string} with {string} EUR transaction amount because of wrong date") - public void disburseLoanFailureWithDate(String actualDisbursementDate, String transactionAmount) throws IOException { - Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); - long loanId = loanResponse.body().getLoanId(); - PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest() - .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount)); - - Response<PostLoansLoanIdResponse> loanDisburseResponse = loansApi.stateTransitions(loanId, disburseRequest, "disburse").execute(); - testContext().set(TestContextKey.LOAN_DISBURSE_RESPONSE, loanDisburseResponse); - ErrorResponse errorDetails = ErrorResponse.from(loanDisburseResponse); - assertThat(errorDetails.getHttpStatusCode()).as(ErrorMessageHelper.dateFailureErrorCodeMsg()).isEqualTo(403); - assertThat(errorDetails.getSingleError().getDeveloperMessage()).isEqualTo(ErrorMessageHelper.disburseDateFailure((int) loanId)); - } - - @Then("Admin fails to disburse the loan on {string} with {string} EUR transaction amount because of wrong amount") - public void disburseLoanFailureWithAmount(String actualDisbursementDate, String transactionAmount) throws IOException { - Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); - long loanId = loanResponse.body().getLoanId(); - PostLoansLoanIdRequest disburseRequest = LoanRequestFactory.defaultLoanDisburseRequest() - .actualDisbursementDate(actualDisbursementDate).transactionAmount(new BigDecimal(transactionAmount)); - - Response<PostLoansLoanIdResponse> loanDisburseResponse = loansApi.stateTransitions(loanId, disburseRequest, "disburse").execute(); - testContext().set(TestContextKey.LOAN_DISBURSE_RESPONSE, loanDisburseResponse); - ErrorResponse errorDetails = ErrorResponse.from(loanDisburseResponse); - String developerMessage = errorDetails.getSingleError().getDeveloperMessage(); - - assertThat(errorDetails.getHttpStatusCode()).as(ErrorMessageHelper.dateFailureErrorCodeMsg()).isEqualTo(403); - assertThat(developerMessage).matches(ErrorMessageHelper.disburseMaxAmountFailure()); - log.debug("Error message: {}", developerMessage); - } - @Then("Admin fails to disburse the loan on {string} with {string} EUR transaction amount because of charge-off that was performed for the loan") public void disburseChargedOffLoanFailure(String actualDisbursementDate, String transactionAmount) throws IOException { Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE); @@ -3308,7 +3405,107 @@ public class LoanStepDef extends AbstractStepDef { .graceOnInterestPayment(graceOnInterestPayment)// .graceOnInterestPayment(graceOnInterestCharged)// .transactionProcessingStrategyCode(transactionProcessingStrategyCodeValue)// - .disbursementData(disbursementDetail).charges(charges);// + .disbursementData(disbursementDetail)// + .charges(charges);// + + final Response<PostLoansResponse> response = loansApi.calculateLoanScheduleOrSubmitLoanApplication(loansRequest, "").execute(); + testContext().set(TestContextKey.LOAN_CREATE_RESPONSE, response); + ErrorHelper.checkSuccessfulApiCall(response); + + eventCheckHelper.createLoanEventCheck(response); + } + + public void createFullyCustomizedLoanWithExpectedTrancheDisbursementDetails(final List<String> loanData) throws IOException { + final String expectedDisbursementDate = loanData.get(16); + final Double disbursementPrincipalAmount = Double.valueOf(loanData.get(17)); + + List<PostLoansDisbursementData> disbursementDetail = new ArrayList<>(); + disbursementDetail.add( + new PostLoansDisbursementData().expectedDisbursementDate(expectedDisbursementDate).principal(disbursementPrincipalAmount)); + + createFullyCustomizedLoanExpectsTrancheDisbursementDetails(loanData, disbursementDetail); + } + + public void createFullyCustomizedLoanWithExpectedTrancheDisbursementsDetails(final List<String> loanData) throws IOException { + final String expectedDisbursementDateFirstDisbursal = loanData.get(16); + final Double disbursementPrincipalAmountFirstDisbursal = Double.valueOf(loanData.get(17)); + + final String expectedDisbursementDateSecondDisbursal = loanData.get(18); + final Double disbursementPrincipalAmountSecondDisbursal = Double.valueOf(loanData.get(19)); + + List<PostLoansDisbursementData> disbursementDetail = new ArrayList<>(); + disbursementDetail.add(new PostLoansDisbursementData().expectedDisbursementDate(expectedDisbursementDateFirstDisbursal) + .principal(disbursementPrincipalAmountFirstDisbursal)); + disbursementDetail.add(new PostLoansDisbursementData().expectedDisbursementDate(expectedDisbursementDateSecondDisbursal) + .principal(disbursementPrincipalAmountSecondDisbursal)); + + createFullyCustomizedLoanExpectsTrancheDisbursementDetails(loanData, disbursementDetail); + } + + public void createFullyCustomizedLoanExpectsTrancheDisbursementDetails(final List<String> loanData, + List<PostLoansDisbursementData> disbursementDetail) throws IOException { + final String loanProduct = loanData.get(0); + final String submitDate = loanData.get(1); + final String principal = loanData.get(2); + final BigDecimal interestRate = new BigDecimal(loanData.get(3)); + final String interestTypeStr = loanData.get(4); + final String interestCalculationPeriodStr = loanData.get(5); + final String amortizationTypeStr = loanData.get(6); + final Integer loanTermFrequency = Integer.valueOf(loanData.get(7)); + final String loanTermFrequencyType = loanData.get(8); + final Integer repaymentFrequency = Integer.valueOf(loanData.get(9)); + final String repaymentFrequencyTypeStr = loanData.get(10); + final Integer numberOfRepayments = Integer.valueOf(loanData.get(11)); + final Integer graceOnPrincipalPayment = Integer.valueOf(loanData.get(12)); + final Integer graceOnInterestPayment = Integer.valueOf(loanData.get(13)); + final Integer graceOnInterestCharged = Integer.valueOf(loanData.get(14)); + final String transactionProcessingStrategyCode = loanData.get(15); + + final Response<PostClientsResponse> clientResponse = testContext().get(TestContextKey.CLIENT_CREATE_RESPONSE); + final Long clientId = clientResponse.body().getClientId(); + + final DefaultLoanProduct product = DefaultLoanProduct.valueOf(loanProduct); + final Long loanProductId = loanProductResolver.resolve(product); + + final LoanTermFrequencyType termFrequencyType = LoanTermFrequencyType.valueOf(loanTermFrequencyType); + final Integer loanTermFrequencyTypeValue = termFrequencyType.getValue(); + + final RepaymentFrequencyType repaymentFrequencyType = RepaymentFrequencyType.valueOf(repaymentFrequencyTypeStr); + final Integer repaymentFrequencyTypeValue = repaymentFrequencyType.getValue(); + + final InterestType interestType = InterestType.valueOf(interestTypeStr); + final Integer interestTypeValue = interestType.getValue(); + + final InterestCalculationPeriodTime interestCalculationPeriod = InterestCalculationPeriodTime.valueOf(interestCalculationPeriodStr); + final Integer interestCalculationPeriodValue = interestCalculationPeriod.getValue(); + + final AmortizationType amortizationType = AmortizationType.valueOf(amortizationTypeStr); + final Integer amortizationTypeValue = amortizationType.getValue(); + + final TransactionProcessingStrategyCode processingStrategyCode = TransactionProcessingStrategyCode + .valueOf(transactionProcessingStrategyCode); + final String transactionProcessingStrategyCodeValue = processingStrategyCode.getValue(); + + final PostLoansRequest loansRequest = loanRequestFactory// + .defaultLoansRequest(clientId)// + .productId(loanProductId)// + .principal(new BigDecimal(principal))// + .interestRatePerPeriod(interestRate)// + .interestType(interestTypeValue)// + .interestCalculationPeriodType(interestCalculationPeriodValue)// + .amortizationType(amortizationTypeValue)// + .loanTermFrequency(loanTermFrequency)// + .loanTermFrequencyType(loanTermFrequencyTypeValue)// + .numberOfRepayments(numberOfRepayments)// + .repaymentEvery(repaymentFrequency)// + .repaymentFrequencyType(repaymentFrequencyTypeValue)// + .submittedOnDate(submitDate)// + .expectedDisbursementDate(submitDate)// + .graceOnPrincipalPayment(graceOnPrincipalPayment)// + .graceOnInterestPayment(graceOnInterestPayment)// + .graceOnInterestPayment(graceOnInterestCharged)// + .transactionProcessingStrategyCode(transactionProcessingStrategyCodeValue)// + .disbursementData(disbursementDetail);// final Response<PostLoansResponse> response = loansApi.calculateLoanScheduleOrSubmitLoanApplication(loansRequest, "").execute(); testContext().set(TestContextKey.LOAN_CREATE_RESPONSE, response); @@ -3524,6 +3721,23 @@ public class LoanStepDef extends AbstractStepDef { return actualValues; } + private List<String> fetchValuesOfDisbursementDetails(List<String> header, GetLoansLoanIdDisbursementDetails t) { + List<String> actualValues = new ArrayList<>(); + for (String headerName : header) { + switch (headerName) { + case "Expected Disbursement On" -> + actualValues.add(t.getExpectedDisbursementDate() == null ? null : FORMATTER.format(t.getExpectedDisbursementDate())); + case "Disbursed On" -> + actualValues.add(t.getActualDisbursementDate() == null ? null : FORMATTER.format(t.getActualDisbursementDate())); + case "Principal" -> actualValues.add(t.getPrincipal() == null ? null : String.valueOf(t.getPrincipal())); + case "Net Disbursal Amount" -> + actualValues.add(t.getNetDisbursalAmount() == null ? null : String.valueOf(t.getNetDisbursalAmount())); + default -> throw new IllegalStateException(String.format("Header name %s cannot be found", headerName)); + } + } + return actualValues; + } + private List<String> fetchValuesOfRepaymentSchedule(List<String> header, GetLoansLoanIdRepaymentPeriod repaymentPeriod) { List<String> actualValues = new ArrayList<>(); for (String headerName : header) { 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 c44f1a5b27..b6d1862b85 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 @@ -207,4 +207,5 @@ public abstract class TestContextKey { public static final String LOAN_DELINQUENCY_ACTION_RESPONSE = "loanDelinquencyActionResponse"; public static final String LOAN_TRANSACTION_RESPONSE = "loanTransactionResponse"; public static final String LOAN_CAPITALIZED_INCOME_RESPONSE = "loanCapitalizedIncomeResponse"; + public static final String LOAN_DISBURSEMENT_DETAIL_RESPONSE = "loanDisbursementDetailResponse"; } diff --git a/fineract-e2e-tests-runner/src/test/resources/features/EMICalculation.feature b/fineract-e2e-tests-runner/src/test/resources/features/EMICalculation.feature index fa24470bcb..f863a64dd3 100644 --- a/fineract-e2e-tests-runner/src/test/resources/features/EMICalculation.feature +++ b/fineract-e2e-tests-runner/src/test/resources/features/EMICalculation.feature @@ -7891,6 +7891,712 @@ Feature: EMI calculation and repayment schedule checks for interest bearing loan | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | | 8000.0 | 3456.78 | 0.0 | 0.0 | 11456.78 | 0.05 | 0.0 | 0.04 | 11456.73 | + @TestRailId:C3657 + Scenario: Verify tranche interest bearing progressive loan that expects two tranches with repayment and undo last disbursement - UC1 + 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_di [...] + | LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_EXPECT_TRANCHE | 01 January 2025 | 1000 | 7 | DECLINING_BALANCE | DAILY | EQUAL_INSTALLMENTS | 6 | MONTHS | 1 | MONTHS | 6 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION | 01 January 2025 | 600.0 [...] + And Admin successfully approves the loan on "01 January 2025" with "1000" amount and expected disbursement date on "01 January 2025" + 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 2025 | | 600.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 1 | 31 | 01 February 2025 | | 501.45 | 98.55 | 3.5 | 0.0 | 0.0 | 102.05 | 0.0 | 0.0 | 0.0 | 102.05 | + | | | 01 February 2025 | | 200.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 2 | 28 | 01 March 2025 | | 562.79 | 138.66 | 4.09 | 0.0 | 0.0 | 142.75 | 0.0 | 0.0 | 0.0 | 142.75 | + | 3 | 31 | 01 April 2025 | | 423.32 | 139.47 | 3.28 | 0.0 | 0.0 | 142.75 | 0.0 | 0.0 | 0.0 | 142.75 | + | 4 | 30 | 01 May 2025 | | 283.04 | 140.28 | 2.47 | 0.0 | 0.0 | 142.75 | 0.0 | 0.0 | 0.0 | 142.75 | + | 5 | 31 | 01 June 2025 | | 141.94 | 141.1 | 1.65 | 0.0 | 0.0 | 142.75 | 0.0 | 0.0 | 0.0 | 142.75 | + | 6 | 30 | 01 July 2025 | | 0.0 | 141.94 | 0.83 | 0.0 | 0.0 | 142.77 | 0.0 | 0.0 | 0.0 | 142.77 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 800.0 | 15.82 | 0.0 | 0.0 | 815.82 | 0.0 | 0.0 | 0.0 | 815.82 | + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | | 600.0 | | + | 01 February 2025 | | 200.0 | | +# --- 1st disbursement - 1 January, 2025 --- + When Admin successfully disburse the loan on "01 January 2025" with "700" EUR transaction amount + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 700.0 | | + | 01 February 2025 | | 200.0 | | + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 31 | 01 February 2025 | | 585.02 | 114.98 | 4.08 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | | | 01 February 2025 | | 200.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 2 | 28 | 01 March 2025 | | 669.37 | 115.65 | 3.41 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 3 | 31 | 01 April 2025 | | 553.05 | 116.32 | 2.74 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 4 | 30 | 01 May 2025 | | 436.05 | 117.0 | 2.06 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 5 | 31 | 01 June 2025 | | 318.37 | 117.68 | 1.38 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 6 | 30 | 01 July 2025 | | 200.0 | 118.37 | 0.69 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 700.0 | 14.36 | 0.0 | 0.0 | 714.36 | 0.0 | 0.0 | 0.0 | 714.36 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | +# --- 1st repayment - 15 January, 2025 --- + When Admin sets the business date to "15 January 2025" + When Admin runs inline COB job for Loan + And Customer makes "AUTOPAY" repayment on "15 January 2025" with 119.06 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 31 | 01 February 2025 | 15 January 2025 | 582.78 | 117.22 | 1.84 | 0.0 | 0.0 | 119.06 | 119.06 | 119.06 | 0.0 | 0.0 | + | | | 01 February 2025 | | 200.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 2 | 28 | 01 March 2025 | | 668.99 | 113.79 | 5.27 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 3 | 31 | 01 April 2025 | | 552.67 | 116.32 | 2.74 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 4 | 30 | 01 May 2025 | | 435.67 | 117.0 | 2.06 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 5 | 31 | 01 June 2025 | | 317.98 | 117.69 | 1.37 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 6 | 30 | 01 July 2025 | | 200.0 | 117.98 | 0.69 | 0.0 | 0.0 | 118.67 | 0.0 | 0.0 | 0.0 | 118.67 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 700.0 | 13.97 | 0.0 | 0.0 | 713.97 | 119.06 | 119.06 | 0.0 | 594.91 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | + | 14 January 2025 | Accrual | 1.71 | 0.0 | 1.71 | 0.0 | 0.0 | 0.0 | false | false | + | 15 January 2025 | Repayment | 119.06 | 117.22 | 1.84 | 0.0 | 0.0 | 582.78 | false | false | +# --- 2nd disbursement - 1 February, 2025 --- + When Admin sets the business date to "01 February 2025" + When Admin runs inline COB job for Loan + When Admin successfully disburse the loan on "01 February 2025" with "300" EUR transaction amount + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 700.0 | | + | 01 February 2025 | 01 February 2025 | 300.0 | | + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 31 | 01 February 2025 | 15 January 2025 | 582.78 | 117.22 | 1.84 | 0.0 | 0.0 | 119.06 | 119.06 | 119.06 | 0.0 | 0.0 | + | | | 01 February 2025 | | 300.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 2 | 28 | 01 March 2025 | | 709.69 | 173.09 | 7.02 | 0.0 | 0.0 | 180.11 | 0.0 | 0.0 | 0.0 | 180.11 | + | 3 | 31 | 01 April 2025 | | 533.72 | 175.97 | 4.14 | 0.0 | 0.0 | 180.11 | 0.0 | 0.0 | 0.0 | 180.11 | + | 4 | 30 | 01 May 2025 | | 356.72 | 177.0 | 3.11 | 0.0 | 0.0 | 180.11 | 0.0 | 0.0 | 0.0 | 180.11 | + | 5 | 31 | 01 June 2025 | | 178.69 | 178.03 | 2.08 | 0.0 | 0.0 | 180.11 | 0.0 | 0.0 | 0.0 | 180.11 | + | 6 | 30 | 01 July 2025 | | 0.0 | 178.69 | 1.04 | 0.0 | 0.0 | 179.73 | 0.0 | 0.0 | 0.0 | 179.73 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 1000.0 | 19.23 | 0.0 | 0.0 | 1019.23 | 119.06 | 119.06 | 0.0 | 900.17 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | + | 14 January 2025 | Accrual | 1.71 | 0.0 | 1.71 | 0.0 | 0.0 | 0.0 | false | false | + | 15 January 2025 | Repayment | 119.06 | 117.22 | 1.84 | 0.0 | 0.0 | 582.78 | false | false | + | 15 January 2025 | Accrual | 0.13 | 0.0 | 0.13 | 0.0 | 0.0 | 0.0 | false | false | + | 16 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 17 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 18 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 19 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 20 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 21 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 22 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 23 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 24 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 25 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 26 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 27 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 28 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 29 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 30 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 31 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 01 February 2025 | Disbursement | 300.0 | 0.0 | 0.0 | 0.0 | 0.0 | 882.78 | false | false | + Then Admin fails to disburse the loan on "01 February 2025" with "100" amount +# --- undo last disbursement --- # + When Admin successfully undo last disbursal + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 700.0 | | + When Admin sets the business date to "02 February 2025" + When Admin runs inline COB job for Loan + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 31 | 01 February 2025 | 15 January 2025 | 582.78 | 117.22 | 1.84 | 0.0 | 0.0 | 119.06 | 119.06 | 119.06 | 0.0 | 0.0 | + | 2 | 28 | 01 March 2025 | | 468.99 | 113.79 | 5.27 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 3 | 31 | 01 April 2025 | | 352.67 | 116.32 | 2.74 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 4 | 30 | 01 May 2025 | | 235.67 | 117.0 | 2.06 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 5 | 31 | 01 June 2025 | | 117.98 | 117.69 | 1.37 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 6 | 30 | 01 July 2025 | | 0.0 | 117.98 | 0.69 | 0.0 | 0.0 | 118.67 | 0.0 | 0.0 | 0.0 | 118.67 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 700.0 | 13.97 | 0.0 | 0.0 | 713.97 | 119.06 | 119.06 | 0.0 | 594.91 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | + | 14 January 2025 | Accrual | 1.71 | 0.0 | 1.71 | 0.0 | 0.0 | 0.0 | false | false | + | 15 January 2025 | Repayment | 119.06 | 117.22 | 1.84 | 0.0 | 0.0 | 582.78 | false | false | + | 15 January 2025 | Accrual | 0.13 | 0.0 | 0.13 | 0.0 | 0.0 | 0.0 | false | false | + | 16 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 17 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 18 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 19 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 20 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 21 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 22 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 23 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 24 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 25 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 26 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 27 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 28 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 29 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 30 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 31 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 01 February 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + Then Admin fails to disburse the loan on "02 February 2025" with "200" amount + + @TestRailId:C3658 + Scenario: Verify tranche interest bearing progressive loan that expects two tranches with two repayments and undo last disbursement - UC2 + 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_dis [...] + | LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_EXPECT_TRANCHE | 01 January 2025 | 1000 | 7 | DECLINING_BALANCE | DAILY | EQUAL_INSTALLMENTS | 90 | DAYS | 15 | DAYS | 6 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION | 01 January 2025 | 700.0 [...] + And Admin successfully approves the loan on "01 January 2025" with "1000" amount and expected disbursement date on "01 January 2025" + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 1 | 15 | 16 January 2025 | | 584.18 | 115.82 | 2.04 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | | | 16 January 2025 | | 300.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 2 | 15 | 31 January 2025 | | 708.37 | 175.81 | 2.58 | 0.0 | 0.0 | 178.39 | 0.0 | 0.0 | 0.0 | 178.39 | + | 3 | 15 | 15 February 2025 | | 532.05 | 176.32 | 2.07 | 0.0 | 0.0 | 178.39 | 0.0 | 0.0 | 0.0 | 178.39 | + | 4 | 15 | 02 March 2025 | | 355.21 | 176.84 | 1.55 | 0.0 | 0.0 | 178.39 | 0.0 | 0.0 | 0.0 | 178.39 | + | 5 | 15 | 17 March 2025 | | 177.86 | 177.35 | 1.04 | 0.0 | 0.0 | 178.39 | 0.0 | 0.0 | 0.0 | 178.39 | + | 6 | 15 | 01 April 2025 | | 0.0 | 177.86 | 0.52 | 0.0 | 0.0 | 178.38 | 0.0 | 0.0 | 0.0 | 178.38 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 1000.0 | 9.8 | 0.0 | 0.0 | 1009.8 | 0.0 | 0.0 | 0.0 | 1009.8 | +# --- 1st disbursement - 1 January, 2025 --- + When Admin successfully disburse the loan on "01 January 2025" with "700" EUR transaction amount + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 700.0 | | + | 16 January 2025 | | 300.0 | | + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 15 | 16 January 2025 | | 584.18 | 115.82 | 2.04 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | | | 16 January 2025 | | 300.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 2 | 15 | 31 January 2025 | | 768.02 | 116.16 | 1.7 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 3 | 15 | 15 February 2025 | | 651.53 | 116.49 | 1.37 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 4 | 15 | 02 March 2025 | | 534.7 | 116.83 | 1.03 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 5 | 15 | 17 March 2025 | | 417.52 | 117.18 | 0.68 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 6 | 15 | 01 April 2025 | | 300.0 | 117.52 | 0.34 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 700.0 | 7.16 | 0.0 | 0.0 | 707.16 | 0.0 | 0.0 | 0.0 | 707.16 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | +# --- 1st repayment - 16 January, 2025 --- + When Admin sets the business date to "16 January 2025" + When Admin runs inline COB job for Loan + And Customer makes "AUTOPAY" repayment on "16 January 2025" with 117.86 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 15 | 16 January 2025 | 16 January 2025 | 584.18 | 115.82 | 2.04 | 0.0 | 0.0 | 117.86 | 117.86 | 0.0 | 0.0 | 0.0 | + | | | 16 January 2025 | | 300.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 2 | 15 | 31 January 2025 | | 768.02 | 116.16 | 1.7 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 3 | 15 | 15 February 2025 | | 651.53 | 116.49 | 1.37 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 4 | 15 | 02 March 2025 | | 534.7 | 116.83 | 1.03 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 5 | 15 | 17 March 2025 | | 417.52 | 117.18 | 0.68 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 6 | 15 | 01 April 2025 | | 300.0 | 117.52 | 0.34 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 700.0 | 7.16 | 0.0 | 0.0 | 707.16 | 117.86 | 0.0 | 0.0 | 589.3 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | + | 15 January 2025 | Accrual | 1.91 | 0.0 | 1.91 | 0.0 | 0.0 | 0.0 | false | false | + | 16 January 2025 | Repayment | 117.86 | 115.82 | 2.04 | 0.0 | 0.0 | 584.18 | false | false | +# --- 2nd repayment - 31 January, 2025 --- + When Admin sets the business date to "31 January 2025" + When Admin runs inline COB job for Loan + And Customer makes "AUTOPAY" repayment on "31 January 2025" with 117.86 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 15 | 16 January 2025 | 16 January 2025 | 584.18 | 115.82 | 2.04 | 0.0 | 0.0 | 117.86 | 117.86 | 0.0 | 0.0 | 0.0 | + | 2 | 15 | 31 January 2025 | 31 January 2025 | 468.02 | 116.16 | 1.7 | 0.0 | 0.0 | 117.86 | 117.86 | 0.0 | 0.0 | 0.0 | + | 3 | 15 | 15 February 2025 | | 351.53 | 116.49 | 1.37 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 4 | 15 | 02 March 2025 | | 234.7 | 116.83 | 1.03 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 5 | 15 | 17 March 2025 | | 117.52 | 117.18 | 0.68 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 6 | 15 | 01 April 2025 | | 0.0 | 117.52 | 0.34 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 700.0 | 7.16 | 0.0 | 0.0 | 707.16 | 235.72 | 0.0 | 0.0 | 471.44 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | + | 15 January 2025 | Accrual | 1.91 | 0.0 | 1.91 | 0.0 | 0.0 | 0.0 | false | false | + | 16 January 2025 | Repayment | 117.86 | 115.82 | 2.04 | 0.0 | 0.0 | 584.18 | false | false | + | 16 January 2025 | Accrual | 0.13 | 0.0 | 0.13 | 0.0 | 0.0 | 0.0 | false | false | + | 17 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 18 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 19 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 20 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 21 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 22 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 23 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 24 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 25 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 26 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 27 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 28 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 29 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 30 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 31 January 2025 | Repayment | 117.86 | 116.16 | 1.7 | 0.0 | 0.0 | 468.02 | false | false | +# --- 2nd disbursement - 1 February, 2025 --- + When Admin sets the business date to "01 February 2025" + When Admin runs inline COB job for Loan + When Admin successfully disburse the loan on "01 February 2025" with "300" EUR transaction amount + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 700.0 | | + | 16 January 2025 | 01 February 2025 | 300.0 | | + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 15 | 16 January 2025 | 16 January 2025 | 584.18 | 115.82 | 2.04 | 0.0 | 0.0 | 117.86 | 117.86 | 0.0 | 0.0 | 0.0 | + | 2 | 15 | 31 January 2025 | 31 January 2025 | 468.02 | 116.16 | 1.7 | 0.0 | 0.0 | 117.86 | 117.86 | 0.0 | 0.0 | 0.0 | + | | | 01 February 2025 | | 300.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 3 | 15 | 15 February 2025 | | 576.81 | 191.21 | 2.18 | 0.0 | 0.0 | 193.39 | 0.0 | 0.0 | 0.0 | 193.39 | + | 4 | 15 | 02 March 2025 | | 385.1 | 191.71 | 1.68 | 0.0 | 0.0 | 193.39 | 0.0 | 0.0 | 0.0 | 193.39 | + | 5 | 15 | 17 March 2025 | | 192.83 | 192.27 | 1.12 | 0.0 | 0.0 | 193.39 | 0.0 | 0.0 | 0.0 | 193.39 | + | 6 | 15 | 01 April 2025 | | 0.0 | 192.83 | 0.56 | 0.0 | 0.0 | 193.39 | 0.0 | 0.0 | 0.0 | 193.39 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 1000.0 | 9.28 | 0.0 | 0.0 | 1009.28 | 235.72 | 0.0 | 0.0 | 773.56 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | + | 15 January 2025 | Accrual | 1.91 | 0.0 | 1.91 | 0.0 | 0.0 | 0.0 | false | false | + | 16 January 2025 | Repayment | 117.86 | 115.82 | 2.04 | 0.0 | 0.0 | 584.18 | false | false | + | 16 January 2025 | Accrual | 0.13 | 0.0 | 0.13 | 0.0 | 0.0 | 0.0 | false | false | + | 17 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 18 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 19 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 20 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 21 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 22 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 23 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 24 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 25 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 26 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 27 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 28 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 29 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 30 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 31 January 2025 | Repayment | 117.86 | 116.16 | 1.7 | 0.0 | 0.0 | 468.02 | false | false | + | 31 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 01 February 2025 | Disbursement | 300.0 | 0.0 | 0.0 | 0.0 | 0.0 | 768.02 | false | false | + Then Admin fails to disburse the loan on "01 February 2025" with "100" amount +# --- undo disbursement --- # + When Admin sets the business date to "02 February 2025" + When Admin runs inline COB job for Loan + When Admin successfully undo last disbursal + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 700.0 | | + When Admin sets the business date to "02 February 2025" + When Admin runs inline COB job for Loan + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 15 | 16 January 2025 | 16 January 2025 | 584.18 | 115.82 | 2.04 | 0.0 | 0.0 | 117.86 | 117.86 | 0.0 | 0.0 | 0.0 | + | 2 | 15 | 31 January 2025 | 31 January 2025 | 468.02 | 116.16 | 1.7 | 0.0 | 0.0 | 117.86 | 117.86 | 0.0 | 0.0 | 0.0 | + | 3 | 15 | 15 February 2025 | | 351.53 | 116.49 | 1.37 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 4 | 15 | 02 March 2025 | | 234.7 | 116.83 | 1.03 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 5 | 15 | 17 March 2025 | | 117.52 | 117.18 | 0.68 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + | 6 | 15 | 01 April 2025 | | 0.0 | 117.52 | 0.34 | 0.0 | 0.0 | 117.86 | 0.0 | 0.0 | 0.0 | 117.86 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 700.0 | 7.16 | 0.0 | 0.0 | 707.16 | 235.72 | 0.0 | 0.0 | 471.44 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | + | 15 January 2025 | Accrual | 1.91 | 0.0 | 1.91 | 0.0 | 0.0 | 0.0 | false | false | + | 16 January 2025 | Repayment | 117.86 | 115.82 | 2.04 | 0.0 | 0.0 | 584.18 | false | false | + | 16 January 2025 | Accrual | 0.13 | 0.0 | 0.13 | 0.0 | 0.0 | 0.0 | false | false | + | 17 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 18 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 19 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 20 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 21 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 22 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 23 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 24 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 25 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 26 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 27 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 28 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 29 January 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 30 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 31 January 2025 | Repayment | 117.86 | 116.16 | 1.7 | 0.0 | 0.0 | 468.02 | false | false | + | 31 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 01 February 2025 | Accrual | 0.09 | 0.0 | 0.09 | 0.0 | 0.0 | 0.0 | false | false | + Then Admin fails to disburse the loan on "02 February 2025" with "200" amount + + @TestRailId:C3659 + Scenario: Verify tranche interest bearing progressive loan that expects tranche with added 2 more tranches and undo last disbursement - UC3 + 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 disbursement 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_dis [...] + | LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_EXPECT_TRANCHE | 01 January 2025 | 1000 | 7 | DECLINING_BALANCE | DAILY | EQUAL_INSTALLMENTS | 6 | MONTHS | 1 | MONTHS | 6 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION | 01 January 2025 | 700.0 [...] + And Admin successfully approves the loan on "01 January 2025" with "1000" amount and expected disbursement date on "01 January 2025" + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 1 | 31 | 01 February 2025 | | 585.02 | 114.98 | 4.08 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 2 | 28 | 01 March 2025 | | 469.37 | 115.65 | 3.41 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 3 | 31 | 01 April 2025 | | 353.05 | 116.32 | 2.74 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 4 | 30 | 01 May 2025 | | 236.05 | 117.0 | 2.06 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 5 | 31 | 01 June 2025 | | 118.37 | 117.68 | 1.38 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 6 | 30 | 01 July 2025 | | 0.0 | 118.37 | 0.69 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 700.0 | 14.36 | 0.0 | 0.0 | 714.36 | 0.0 | 0.0 | 0.0 | 714.36 | + When Admin successfully disburse the loan on "01 January 2025" with "600" EUR transaction amount + # When Admin runs inline COB job for Loan + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 600.0 | | + 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 2025 | | 600.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 31 | 01 February 2025 | | 501.45 | 98.55 | 3.5 | 0.0 | 0.0 | 102.05 | 0.0 | 0.0 | 0.0 | 102.05 | + | 2 | 28 | 01 March 2025 | | 402.33 | 99.12 | 2.93 | 0.0 | 0.0 | 102.05 | 0.0 | 0.0 | 0.0 | 102.05 | + | 3 | 31 | 01 April 2025 | | 302.63 | 99.7 | 2.35 | 0.0 | 0.0 | 102.05 | 0.0 | 0.0 | 0.0 | 102.05 | + | 4 | 30 | 01 May 2025 | | 202.35 | 100.28 | 1.77 | 0.0 | 0.0 | 102.05 | 0.0 | 0.0 | 0.0 | 102.05 | + | 5 | 31 | 01 June 2025 | | 101.48 | 100.87 | 1.18 | 0.0 | 0.0 | 102.05 | 0.0 | 0.0 | 0.0 | 102.05 | + | 6 | 30 | 01 July 2025 | | 0.0 | 101.48 | 0.59 | 0.0 | 0.0 | 102.07 | 0.0 | 0.0 | 0.0 | 102.07 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 600.0 | 12.32 | 0.0 | 0.0 | 612.32 | 0.0 | 0.0 | 0.0 | 612.32 | + 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 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 600.0 | false | false | + Then Admin fails to disburse the loan on "01 January 2025" with "200" amount +# --- add 2nd expected disbursement details with expected disbursement date - 8 Jan, 2025 --- # + And Admin successfully add disbursement detail to the loan on "08 January 2025" with 300 EUR transaction amount + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 600.0 | | + | 08 January 2025 | | 300.0 | 600.0 | + When Admin sets the business date to "08 January 2025" + When Admin runs inline COB job for Loan + 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 2025 | | 600.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 08 January 2025 | | 300.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 1 | 31 | 01 February 2025 | | 801.45 | 98.55 | 3.5 | 0.0 | 0.0 | 102.05 | 0.0 | 0.0 | 0.0 | 102.05 | + | 2 | 28 | 01 March 2025 | | 702.33 | 99.12 | 2.93 | 0.0 | 0.0 | 102.05 | 0.0 | 0.0 | 0.0 | 102.05 | + | 3 | 31 | 01 April 2025 | | 602.63 | 99.7 | 2.35 | 0.0 | 0.0 | 102.05 | 0.0 | 0.0 | 0.0 | 102.05 | + | 4 | 30 | 01 May 2025 | | 502.35 | 100.28 | 1.77 | 0.0 | 0.0 | 102.05 | 0.0 | 0.0 | 0.0 | 102.05 | + | 5 | 31 | 01 June 2025 | | 401.48 | 100.87 | 1.18 | 0.0 | 0.0 | 102.05 | 0.0 | 0.0 | 0.0 | 102.05 | + | 6 | 30 | 01 July 2025 | | 300.0 | 101.48 | 0.59 | 0.0 | 0.0 | 102.07 | 0.0 | 0.0 | 0.0 | 102.07 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 600.0 | 12.32 | 0.0 | 0.0 | 612.32 | 0.0 | 0.0 | 0.0 | 612.32 | + 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 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 600.0 | false | false | + | 07 January 2025 | Accrual | 0.68 | 0.0 | 0.68 | 0.0 | 0.0 | 0.0 | false | false | +# --- 2nd disbursement partial - 8 January, 2025 --- # + When Admin successfully disburse the loan on "08 January 2025" with "300" 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 2025 | | 600.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 08 January 2025 | | 300.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 31 | 01 February 2025 | | 751.84 | 148.16 | 4.85 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 2 | 28 | 01 March 2025 | | 603.22 | 148.62 | 4.39 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 3 | 31 | 01 April 2025 | | 453.73 | 149.49 | 3.52 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 4 | 30 | 01 May 2025 | | 303.37 | 150.36 | 2.65 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 5 | 31 | 01 June 2025 | | 152.13 | 151.24 | 1.77 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 6 | 30 | 01 July 2025 | | 0.0 | 152.13 | 0.89 | 0.0 | 0.0 | 153.02 | 0.0 | 0.0 | 0.0 | 153.02 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 900.0 | 18.07 | 0.0 | 0.0 | 918.07 | 0.0 | 0.0 | 0.0 | 918.07 | + 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 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 600.0 | false | false | + | 07 January 2025 | Accrual | 0.68 | 0.0 | 0.68 | 0.0 | 0.0 | 0.0 | false | false | + | 08 January 2025 | Disbursement | 300.0 | 0.0 | 0.0 | 0.0 | 0.0 | 900.0 | false | false | + Then Admin fails to disburse the loan on "08 January 2025" with "100" amount +# --- add 3rd expected disbursement details with expected disbursement date - 15 Jan, 2025 --- # + And Admin successfully add disbursement detail to the loan on "15 January 2025" with 100 EUR transaction amount + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 600.0 | | + | 08 January 2025 | 08 January 2025 | 300.0 | 600.0 | + | 15 January 2025 | | 100.0 | 300.0 | + When Admin sets the business date to "15 January 2025" + When Admin runs inline COB job for Loan + 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 2025 | | 600.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 08 January 2025 | | 300.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 15 January 2025 | | 100.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 1 | 31 | 01 February 2025 | | 851.84 | 148.16 | 4.85 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 2 | 28 | 01 March 2025 | | 703.22 | 148.62 | 4.39 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 3 | 31 | 01 April 2025 | | 553.73 | 149.49 | 3.52 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 4 | 30 | 01 May 2025 | | 403.37 | 150.36 | 2.65 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 5 | 31 | 01 June 2025 | | 252.13 | 151.24 | 1.77 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 6 | 30 | 01 July 2025 | | 100.0 | 152.13 | 0.89 | 0.0 | 0.0 | 153.02 | 0.0 | 0.0 | 0.0 | 153.02 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 900.0 | 18.07 | 0.0 | 0.0 | 918.07 | 0.0 | 0.0 | 0.0 | 918.07 | + 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 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 600.0 | false | false | + | 07 January 2025 | Accrual | 0.68 | 0.0 | 0.68 | 0.0 | 0.0 | 0.0 | false | false | + | 08 January 2025 | Disbursement | 300.0 | 0.0 | 0.0 | 0.0 | 0.0 | 900.0 | false | false | + | 08 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 09 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 10 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 11 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 12 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 13 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 14 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | +# --- 3rd disbursement partial - 15 Jan, 2025 --- # + When Admin successfully disburse the loan on "15 January 2025" with "50" 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 2025 | | 600.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 08 January 2025 | | 300.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 15 January 2025 | | 50.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 31 | 01 February 2025 | | 793.52 | 156.48 | 5.01 | 0.0 | 0.0 | 161.49 | 0.0 | 0.0 | 0.0 | 161.49 | + | 2 | 28 | 01 March 2025 | | 636.66 | 156.86 | 4.63 | 0.0 | 0.0 | 161.49 | 0.0 | 0.0 | 0.0 | 161.49 | + | 3 | 31 | 01 April 2025 | | 478.88 | 157.78 | 3.71 | 0.0 | 0.0 | 161.49 | 0.0 | 0.0 | 0.0 | 161.49 | + | 4 | 30 | 01 May 2025 | | 320.18 | 158.7 | 2.79 | 0.0 | 0.0 | 161.49 | 0.0 | 0.0 | 0.0 | 161.49 | + | 5 | 31 | 01 June 2025 | | 160.56 | 159.62 | 1.87 | 0.0 | 0.0 | 161.49 | 0.0 | 0.0 | 0.0 | 161.49 | + | 6 | 30 | 01 July 2025 | | 0.0 | 160.56 | 0.94 | 0.0 | 0.0 | 161.5 | 0.0 | 0.0 | 0.0 | 161.5 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 950.0 | 18.95 | 0.0 | 0.0 | 968.95 | 0.0 | 0.0 | 0.0 | 968.95 | + 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 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 600.0 | false | false | + | 07 January 2025 | Accrual | 0.68 | 0.0 | 0.68 | 0.0 | 0.0 | 0.0 | false | false | + | 08 January 2025 | Disbursement | 300.0 | 0.0 | 0.0 | 0.0 | 0.0 | 900.0 | false | false | + | 08 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 09 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 10 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 11 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 12 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 13 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 14 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 15 January 2025 | Disbursement | 50.0 | 0.0 | 0.0 | 0.0 | 0.0 | 950.0 | false | false | +# --- undo last disbursement --- # + When Admin sets the business date to "16 January 2025" + When Admin runs inline COB job for Loan + When Admin successfully undo last disbursal + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 600.0 | | + | 08 January 2025 | 08 January 2025 | 300.0 | 600.0 | + 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 2025 | | 600.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 08 January 2025 | | 300.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 31 | 01 February 2025 | | 751.84 | 148.16 | 4.85 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 2 | 28 | 01 March 2025 | | 603.22 | 148.62 | 4.39 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 3 | 31 | 01 April 2025 | | 453.73 | 149.49 | 3.52 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 4 | 30 | 01 May 2025 | | 303.37 | 150.36 | 2.65 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 5 | 31 | 01 June 2025 | | 152.13 | 151.24 | 1.77 | 0.0 | 0.0 | 153.01 | 0.0 | 0.0 | 0.0 | 153.01 | + | 6 | 30 | 01 July 2025 | | 0.0 | 152.13 | 0.89 | 0.0 | 0.0 | 153.02 | 0.0 | 0.0 | 0.0 | 153.02 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 900.0 | 18.07 | 0.0 | 0.0 | 918.07 | 0.0 | 0.0 | 0.0 | 918.07 | + 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 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 600.0 | false | false | + | 07 January 2025 | Accrual | 0.68 | 0.0 | 0.68 | 0.0 | 0.0 | 0.0 | false | false | + | 08 January 2025 | Disbursement | 300.0 | 0.0 | 0.0 | 0.0 | 0.0 | 900.0 | false | false | + | 08 January 2025 | Accrual | 0.11 | 0.0 | 0.11 | 0.0 | 0.0 | 0.0 | false | false | + | 09 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 10 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 11 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 12 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 13 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 14 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 15 January 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + Then Admin fails to disburse the loan on "16 January 2025" with "100" amount + + @TestRailId:C3660 + Scenario: Verify tranche interest bearing progressive loan that expects tranche with repayment and undo disbursement - UC4 + 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 disbursement 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_dis [...] + | LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE_EXPECT_TRANCHE | 01 January 2025 | 1000 | 7 | DECLINING_BALANCE | DAILY | EQUAL_INSTALLMENTS | 6 | MONTHS | 1 | MONTHS | 6 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION | 01 January 2025 | 700.0 [...] + And Admin successfully approves the loan on "01 January 2025" with "1000" amount and expected disbursement date on "01 January 2025" + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 1 | 31 | 01 February 2025 | | 585.02 | 114.98 | 4.08 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 2 | 28 | 01 March 2025 | | 469.37 | 115.65 | 3.41 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 3 | 31 | 01 April 2025 | | 353.05 | 116.32 | 2.74 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 4 | 30 | 01 May 2025 | | 236.05 | 117.0 | 2.06 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 5 | 31 | 01 June 2025 | | 118.37 | 117.68 | 1.38 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 6 | 30 | 01 July 2025 | | 0.0 | 118.37 | 0.69 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 700.0 | 14.36 | 0.0 | 0.0 | 714.36 | 0.0 | 0.0 | 0.0 | 714.36 | + When Admin successfully disburse the loan on "01 January 2025" with "700" EUR transaction amount + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 700.0 | | + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 31 | 01 February 2025 | | 585.02 | 114.98 | 4.08 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 2 | 28 | 01 March 2025 | | 469.37 | 115.65 | 3.41 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 3 | 31 | 01 April 2025 | | 353.05 | 116.32 | 2.74 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 4 | 30 | 01 May 2025 | | 236.05 | 117.0 | 2.06 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 5 | 31 | 01 June 2025 | | 118.37 | 117.68 | 1.38 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 6 | 30 | 01 July 2025 | | 0.0 | 118.37 | 0.69 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 700.0 | 14.36 | 0.0 | 0.0 | 714.36 | 0.0 | 0.0 | 0.0 | 714.36 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | +# --- 1st repayment - 1 Feb, 2025 --- # + When Admin sets the business date to "01 February 2025" + When Admin runs inline COB job for Loan + And Customer makes "AUTOPAY" repayment on "01 February 2025" with 119.06 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 31 | 01 February 2025 | 01 February 2025 | 585.02 | 114.98 | 4.08 | 0.0 | 0.0 | 119.06 | 119.06 | 0.0 | 0.0 | 0.0 | + | 2 | 28 | 01 March 2025 | | 469.37 | 115.65 | 3.41 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 3 | 31 | 01 April 2025 | | 353.05 | 116.32 | 2.74 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 4 | 30 | 01 May 2025 | | 236.05 | 117.0 | 2.06 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 5 | 31 | 01 June 2025 | | 118.37 | 117.68 | 1.38 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 6 | 30 | 01 July 2025 | | 0.0 | 118.37 | 0.69 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 700.0 | 14.36 | 0.0 | 0.0 | 714.36 | 119.06 | 0.0 | 0.0 | 595.3 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | + | 31 January 2025 | Accrual | 3.95 | 0.0 | 3.95 | 0.0 | 0.0 | 0.0 | false | false | + | 01 February 2025 | Repayment | 119.06 | 114.98 | 4.08 | 0.0 | 0.0 | 585.02 | false | false | +# --- add 2nd expected disbursement details with expected disbursement date - 5 Feb, 2025 --- # + And Admin successfully add disbursement detail to the loan on "05 February 2025" with 300 EUR transaction amount + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 700.0 | | + | 05 February 2025 | | 300.0 | 700.0 | + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 31 | 01 February 2025 | 01 February 2025 | 585.02 | 114.98 | 4.08 | 0.0 | 0.0 | 119.06 | 119.06 | 0.0 | 0.0 | 0.0 | + | | | 05 February 2025 | | 300.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 2 | 28 | 01 March 2025 | | 769.37 | 115.65 | 3.41 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 3 | 31 | 01 April 2025 | | 653.05 | 116.32 | 2.74 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 4 | 30 | 01 May 2025 | | 536.05 | 117.0 | 2.06 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 5 | 31 | 01 June 2025 | | 418.37 | 117.68 | 1.38 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | 6 | 30 | 01 July 2025 | | 300.0 | 118.37 | 0.69 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 700.0 | 14.36 | 0.0 | 0.0 | 714.36 | 119.06 | 0.0 | 0.0 | 595.3 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | + | 31 January 2025 | Accrual | 3.95 | 0.0 | 3.95 | 0.0 | 0.0 | 0.0 | false | false | + | 01 February 2025 | Repayment | 119.06 | 114.98 | 4.08 | 0.0 | 0.0 | 585.02 | false | false | +# --- 2nd disbursement - 5 February, 2025 --- + When Admin sets the business date to "05 February 2025" + When Admin runs inline COB job for Loan + When Admin successfully disburse the loan on "05 February 2025" with "200" EUR transaction amount + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 January 2025 | 700.0 | | + | 05 February 2025 | 05 February 2025 | 200.0 | 700.0 | + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 31 | 01 February 2025 | 01 February 2025 | 585.02 | 114.98 | 4.08 | 0.0 | 0.0 | 119.06 | 119.06 | 0.0 | 0.0 | 0.0 | + | | | 05 February 2025 | | 200.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 2 | 28 | 01 March 2025 | | 629.7 | 155.32 | 4.41 | 0.0 | 0.0 | 159.73 | 0.0 | 0.0 | 0.0 | 159.73 | + | 3 | 31 | 01 April 2025 | | 473.64 | 156.06 | 3.67 | 0.0 | 0.0 | 159.73 | 0.0 | 0.0 | 0.0 | 159.73 | + | 4 | 30 | 01 May 2025 | | 316.67 | 156.97 | 2.76 | 0.0 | 0.0 | 159.73 | 0.0 | 0.0 | 0.0 | 159.73 | + | 5 | 31 | 01 June 2025 | | 158.79 | 157.88 | 1.85 | 0.0 | 0.0 | 159.73 | 0.0 | 0.0 | 0.0 | 159.73 | + | 6 | 30 | 01 July 2025 | | 0.0 | 158.79 | 0.93 | 0.0 | 0.0 | 159.72 | 0.0 | 0.0 | 0.0 | 159.72 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 900.0 | 17.7 | 0.0 | 0.0 | 917.7 | 119.06 | 0.0 | 0.0 | 798.64 | + 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 | 700.0 | 0.0 | 0.0 | 0.0 | 0.0 | 700.0 | false | false | + | 31 January 2025 | Accrual | 3.95 | 0.0 | 3.95 | 0.0 | 0.0 | 0.0 | false | false | + | 01 February 2025 | Repayment | 119.06 | 114.98 | 4.08 | 0.0 | 0.0 | 585.02 | false | false | + | 01 February 2025 | Accrual | 0.13 | 0.0 | 0.13 | 0.0 | 0.0 | 0.0 | false | false | + | 02 February 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 03 February 2025 | Accrual | 0.12 | 0.0 | 0.12 | 0.0 | 0.0 | 0.0 | false | false | + | 04 February 2025 | Accrual | 0.13 | 0.0 | 0.13 | 0.0 | 0.0 | 0.0 | false | false | + | 05 February 2025 | Disbursement | 200.0 | 0.0 | 0.0 | 0.0 | 0.0 | 785.02 | false | false | + Then Admin fails to disburse the loan on "05 February 2025" with "100" amount + # -- undo disbursement ---- + When Admin sets the business date to "06 February 2025" + When Admin runs inline COB job for Loan + When Admin successfully undo disbursal + Then Loan status has changed to "Approved" + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | | 700.0 | | + | 05 February 2025 | | 200.0 | 700.0 | + When Admin sets the business date to "02 February 2025" + When Admin runs inline COB job for Loan + 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 2025 | | 700.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 1 | 31 | 01 February 2025 | | 585.02 | 114.98 | 4.08 | 0.0 | 0.0 | 119.06 | 0.0 | 0.0 | 0.0 | 119.06 | + | | | 05 February 2025 | | 200.0 | | | 0.0 | | 0.0 | | | | 0.0 | + | 2 | 28 | 01 March 2025 | | 629.7 | 155.32 | 4.41 | 0.0 | 0.0 | 159.73 | 0.0 | 0.0 | 0.0 | 159.73 | + | 3 | 31 | 01 April 2025 | | 473.64 | 156.06 | 3.67 | 0.0 | 0.0 | 159.73 | 0.0 | 0.0 | 0.0 | 159.73 | + | 4 | 30 | 01 May 2025 | | 316.67 | 156.97 | 2.76 | 0.0 | 0.0 | 159.73 | 0.0 | 0.0 | 0.0 | 159.73 | + | 5 | 31 | 01 June 2025 | | 158.79 | 157.88 | 1.85 | 0.0 | 0.0 | 159.73 | 0.0 | 0.0 | 0.0 | 159.73 | + | 6 | 30 | 01 July 2025 | | 0.0 | 158.79 | 0.93 | 0.0 | 0.0 | 159.72 | 0.0 | 0.0 | 0.0 | 159.72 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 900.0 | 17.7 | 0.0 | 0.0 | 917.7 | 0.0 | 0.0 | 0.0 | 917.7 | + Then Loan Transactions tab has none transaction + When Admin sets the business date to "02 March 2025" + When Admin runs inline COB job for Loan + When Admin successfully disburse the loan on "01 February 2025" with "750" EUR transaction amount + When Admin successfully disburse the loan on "01 March 2025" with "200" EUR transaction amount + Then Loan Tranche Details tab has the following data: + | Expected Disbursement On | Disbursed On | Principal | Net Disbursal Amount | + | 01 January 2025 | 01 February 2025 | 750.0 | | + | 05 February 2025 | 01 March 2025 | 200.0 | 700.0 | + 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 February 2025 | | 750.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 28 | 01 March 2025 | | 626.81 | 123.19 | 4.37 | 0.0 | 0.0 | 127.56 | 0.0 | 0.0 | 0.0 | 127.56 | + | | | 01 March 2025 | | 200.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 2 | 31 | 01 April 2025 | | 663.39 | 163.42 | 4.85 | 0.0 | 0.0 | 168.27 | 0.0 | 0.0 | 0.0 | 168.27 | + | 3 | 30 | 01 May 2025 | | 498.99 | 164.4 | 3.87 | 0.0 | 0.0 | 168.27 | 0.0 | 0.0 | 0.0 | 168.27 | + | 4 | 31 | 01 June 2025 | | 333.63 | 165.36 | 2.91 | 0.0 | 0.0 | 168.27 | 0.0 | 0.0 | 0.0 | 168.27 | + | 5 | 30 | 01 July 2025 | | 167.31 | 166.32 | 1.95 | 0.0 | 0.0 | 168.27 | 0.0 | 0.0 | 0.0 | 168.27 | + | 6 | 31 | 01 August 2025 | | 0.0 | 167.31 | 0.98 | 0.0 | 0.0 | 168.29 | 0.0 | 0.0 | 0.0 | 168.29 | + Then Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 950.0 | 18.93 | 0.0 | 0.0 | 968.93 | 0.0 | 0.0 | 0.0 | 968.93 | + Then Loan Transactions tab has the following data: + | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed | + | 01 February 2025 | Disbursement | 750.0 | 0.0 | 0.0 | 0.0 | 0.0 | 750.0 | false | false | + | 01 March 2025 | Disbursement | 200.0 | 0.0 | 0.0 | 0.0 | 0.0 | 950.0 | false | false | + Then Admin fails to disburse the loan on "01 March 2025" with "50" amount + @TestRailId:C3636 Scenario: Verify that no negative amount interest refund created after multiple Merchant Issued Refund When Admin sets the business date to "05 April 2025" 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 2886bb482d..8f95a4c162 100644 --- a/fineract-e2e-tests-runner/src/test/resources/features/LoanCharge.feature +++ b/fineract-e2e-tests-runner/src/test/resources/features/LoanCharge.feature @@ -4265,7 +4265,7 @@ Feature: LoanCharge @Skip @TestRailId:C3561 - Scenario: Verify amount+interest disbursement charge for tranche interest bearing progressive loan that doesn't expects tranches with undo disbursement - UC8.2.7 + Scenario: Verify amount+interest disbursement charge for tranche interest bearing progressive loan that doesn't expect tranches with undo disbursement - UC8.2.7 When Admin sets the business date to "01 January 2024" When Admin creates a client with random data When Admin updates charge "LOAN_DISBURSEMENT_CHARGE" with "PERCENTAGE_LOAN_AMOUNT_PLUS_INTEREST" calculation type and 2.0 % of transaction amount @@ -4343,7 +4343,7 @@ Feature: LoanCharge @Skip @TestRailId:C3562 - Scenario: Verify interest disbursement charge for tranche interest bearing progressive loan that doesn't expects tranches with undo last disbursement - UC8.2.8 + Scenario: Verify interest disbursement charge for tranche interest bearing progressive loan that doesn't expect tranches with undo last disbursement - UC8.2.8 When Admin sets the business date to "01 January 2024" When Admin creates a client with random data When Admin updates charge "LOAN_DISBURSEMENT_CHARGE" with "PERCENTAGE_INTEREST" calculation type and 2.0 % of transaction amount
