This is an automated email from the ASF dual-hosted git repository.

adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new 786789c446 FINERACT-2081: Added tests for validation of batch api call 
with steps to charge off a loan
786789c446 is described below

commit 786789c446f441aa96ebc6c1fb29944844076aee
Author: Rustam Zeinalov <[email protected]>
AuthorDate: Tue Feb 25 20:26:37 2025 +0100

    FINERACT-2081: Added tests for validation of batch api call with steps to 
charge off a loan
---
 .../test/stepdef/common/BatchApiStepDef.java       | 65 ++++++++++++++++++++++
 .../src/test/resources/features/BatchApi.feature   | 63 +++++++++++++++++++++
 2 files changed, 128 insertions(+)

diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/BatchApiStepDef.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/BatchApiStepDef.java
index 6f80c2b68f..a0c25219bf 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/BatchApiStepDef.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/BatchApiStepDef.java
@@ -931,6 +931,71 @@ public class BatchApiStepDef extends AbstractStepDef {
                 .isEqualTo(errorsDeveloperMessageExpected);
     }
 
+    @When("Admin runs Batch API call with chargeOff command on {string}")
+    public void runBatchApiCallWithChargeOffCommand(String chargeOffDate) 
throws IOException {
+        Response<PostLoansResponse> loanResponse = 
testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
+        long loanId = loanResponse.body().getLoanId();
+        String idempotencyKey = UUID.randomUUID().toString();
+
+        List<BatchRequest> requestList = new ArrayList<>();
+
+        requestList.add(createChargeOffRequest(1L, loanId, idempotencyKey, 
chargeOffDate));
+
+        Response<List<BatchResponse>> batchResponseList = 
batchApiApi.handleBatchRequests(requestList, false).execute();
+        testContext().set(TestContextKey.BATCH_API_CALL_RESPONSE, 
batchResponseList);
+        testContext().set(TestContextKey.BATCH_API_CALL_IDEMPOTENCY_KEY, 
idempotencyKey);
+
+        if (batchResponseList.isSuccessful() && batchResponseList.body() != 
null && !batchResponseList.body().isEmpty()) {
+            BatchResponse response = batchResponseList.body().get(0);
+            log.info("Batch charge-off API status code: {}", 
response.getStatusCode());
+            log.info("Batch charge-off API response body: {}", 
response.getBody());
+        } else {
+            log.info("Batch charge-off API call failed or returned empty 
response");
+        }
+    }
+
+    private BatchRequest createChargeOffRequest(Long requestId, Long loanId, 
String idempotencyKey, String chargeOffDate) {
+        // Create a charge-off request with the specified date
+        Map<String, Object> requestMap = new HashMap<>();
+        requestMap.put("transactionDate", chargeOffDate);
+        requestMap.put("dateFormat", DATE_FORMAT);
+        requestMap.put("locale", DEFAULT_LOCALE);
+        requestMap.put("note", "Charge-off due to delinquency");
+
+        String bodyChargeOffRequest = GSON.toJson(requestMap);
+
+        Set<Header> headers = new HashSet<>();
+        headers.add(HEADER);
+        if (idempotencyKey != null) {
+            headers.add(new 
Header().name("Idempotency-Key").value(idempotencyKey));
+        }
+
+        BatchRequest batchRequest = new BatchRequest();
+        batchRequest.requestId(requestId);
+        batchRequest.relativeUrl("loans/" + loanId + 
"/transactions?command=charge-off");
+        batchRequest.method(BATCH_API_METHOD_POST);
+        batchRequest.headers(headers);
+        batchRequest.body(bodyChargeOffRequest);
+
+        return batchRequest;
+    }
+
+    @Then("Admin checks the loan has been charged-off on {string}")
+    public void checkLoanChargedOff(String chargeOffDate) 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();
+        ErrorHelper.checkSuccessfulApiCall(loanDetails);
+
+        // Check loan has a CHARGE_OFF transaction on the specified date
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);
+        boolean hasChargeOffTransaction = 
loanDetails.body().getTransactions().stream().anyMatch(
+                t -> 
t.getType().getCode().equals("loanTransactionType.chargeOff") && 
formatter.format(t.getDate()).equals(chargeOffDate));
+
+        assertThat(hasChargeOffTransaction).as("Loan should have a CHARGE_OFF 
transaction on " + chargeOffDate).isTrue();
+    }
+
     private String getHeaderValueByHeaderKey(List<Header> headersList, String 
headerKey) {
         for (Header header : headersList) {
             if (Objects.requireNonNull(header.getName()).equals(headerKey)) {
diff --git 
a/fineract-e2e-tests-runner/src/test/resources/features/BatchApi.feature 
b/fineract-e2e-tests-runner/src/test/resources/features/BatchApi.feature
index 0923a1f445..fd0702b8d7 100644
--- a/fineract-e2e-tests-runner/src/test/resources/features/BatchApi.feature
+++ b/fineract-e2e-tests-runner/src/test/resources/features/BatchApi.feature
@@ -78,3 +78,66 @@ Feature: Batch API
     And Batch API call with steps: queryDatatable, updateDatatable runs, with 
empty queryDatatable response
     Then Verify that step Nr. 1 results 200
     Then Verify that step Nr. 2 results 400
+
+  @TestRailId:C3509 @ChargeOffFeature
+  Scenario: Verify Batch API call with steps to charge-off a loan
+    When Admin sets the business date to "01 January 2024"
+    When Admin creates a client with random data
+    When Admin creates a fully customized loan with the following data:
+      | LoanProduct                            | submitted on date | with 
Principal | ANNUAL interest rate % | interest type     | interest calculation 
period | amortization type  | loanTermFrequency | loanTermFrequencyType | 
repaymentEvery | repaymentFrequencyType | numberOfRepayments | 
graceOnPrincipalPayment | graceOnInterestPayment | interest free period | 
Payment strategy            |
+      | LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF | 01 January 2024   | 100       
     | 7                      | DECLINING_BALANCE | DAILY                       
| EQUAL_INSTALLMENTS | 6                 | MONTHS                | 1            
  | MONTHS                 | 6                  | 0                       | 0   
                   | 0                    | ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "01 January 2024" with "100" 
amount and expected disbursement date on "01 January 2024"
+    When Admin successfully disburse the loan on "01 January 2024" with "100" 
EUR transaction amount
+    Then Loan Repayment schedule has 6 periods, with the following data for 
periods:
+      | Nr | Days | Date             | Paid date | Balance of loan | Principal 
due | Interest | Fees | Penalties | Due   | Paid | In advance | Late | 
Outstanding |
+      |    |      | 01 January 2024  |           | 100.0           |           
    |          | 0.0  |           | 0.0   | 0.0  |            |      |          
   |
+      | 1  | 31   | 01 February 2024 |           | 83.57           | 16.43     
    | 0.58     | 0.0  | 0.0       | 17.01 | 0.0  | 0.0        | 0.0  | 17.01    
   |
+      | 2  | 29   | 01 March 2024    |           | 67.05           | 16.52     
    | 0.49     | 0.0  | 0.0       | 17.01 | 0.0  | 0.0        | 0.0  | 17.01    
   |
+      | 3  | 31   | 01 April 2024    |           | 50.43           | 16.62     
    | 0.39     | 0.0  | 0.0       | 17.01 | 0.0  | 0.0        | 0.0  | 17.01    
   |
+      | 4  | 30   | 01 May 2024      |           | 33.71           | 16.72     
    | 0.29     | 0.0  | 0.0       | 17.01 | 0.0  | 0.0        | 0.0  | 17.01    
   |
+      | 5  | 31   | 01 June 2024     |           | 16.9            | 16.81     
    | 0.2      | 0.0  | 0.0       | 17.01 | 0.0  | 0.0        | 0.0  | 17.01    
   |
+      | 6  | 30   | 01 July 2024     |           | 0.0             | 16.9      
    | 0.1      | 0.0  | 0.0       | 17.0  | 0.0  | 0.0        | 0.0  | 17.0     
   |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due    | Paid | In 
advance | Late | Outstanding |
+      | 100           | 2.05     | 0    | 0         | 102.05 | 0    | 0        
  | 0    | 102.05      |
+    Then Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type  | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance |
+      | 01 January 2024  | Disbursement      | 100.0  | 0.0       | 0.0      | 
0.0  | 0.0       | 100.0        |
+    When Admin sets the business date to "01 February 2024"
+    And Customer makes "AUTOPAY" repayment on "01 February 2024" with 17.01 
EUR transaction amount
+    Then Loan Repayment schedule has 6 periods, with the following data for 
periods:
+      | Nr | Days | Date             | Paid date        | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due   | Paid  | In advance | Late 
| Outstanding |
+      |    |      | 01 January 2024  |                  | 100.0           |    
           |          | 0.0  |           | 0.0   | 0.0   |            |      |  
           |
+      | 1  | 31   | 01 February 2024 | 01 February 2024 | 83.57           | 
16.43         | 0.58     | 0.0  | 0.0       | 17.01 | 17.01 | 0.0        | 0.0  
| 0.0         |
+      | 2  | 29   | 01 March 2024    |                  | 67.05           | 
16.52         | 0.49     | 0.0  | 0.0       | 17.01 | 0.0   | 0.0        | 0.0  
| 17.01       |
+      | 3  | 31   | 01 April 2024    |                  | 50.43           | 
16.62         | 0.39     | 0.0  | 0.0       | 17.01 | 0.0   | 0.0        | 0.0  
| 17.01       |
+      | 4  | 30   | 01 May 2024      |                  | 33.71           | 
16.72         | 0.29     | 0.0  | 0.0       | 17.01 | 0.0   | 0.0        | 0.0  
| 17.01       |
+      | 5  | 31   | 01 June 2024     |                  | 16.9            | 
16.81         | 0.2      | 0.0  | 0.0       | 17.01 | 0.0   | 0.0        | 0.0  
| 17.01       |
+      | 6  | 30   | 01 July 2024     |                  | 0.0             | 
16.9          | 0.1      | 0.0  | 0.0       | 17.0  | 0.0   | 0.0        | 0.0  
| 17.0        |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due    | Paid  | In 
advance | Late | Outstanding |
+      | 100           | 2.05     | 0    | 0         | 102.05 | 17.01 | 0       
   | 0    | 85.04       |
+    Then Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance |
+      | 01 January 2024  | Disbursement     | 100.0  | 0.0       | 0.0      | 
0.0  | 0.0       | 100.0        |
+      | 01 February 2024 | Repayment        | 17.01  | 16.43     | 0.58     | 
0.0  | 0.0       | 83.57        |
+    When Admin runs Batch API call with chargeOff command on "01 February 2024"
+    Then Admin checks that all steps result 200OK
+    Then Loan Repayment schedule has 6 periods, with the following data for 
periods:
+      | Nr | Days | Date             | Paid date        | Balance of loan | 
Principal due | Interest | Fees | Penalties | Due   | Paid  | In advance | Late 
| Outstanding |
+      |    |      | 01 January 2024  |                  | 100.0           |    
           |          | 0.0  |           | 0.0   | 0.0   |            |      |  
           |
+      | 1  | 31   | 01 February 2024 | 01 February 2024 | 83.57           | 
16.43         | 0.58     | 0.0  | 0.0       | 17.01 | 17.01 | 0.0        | 0.0  
| 0.0         |
+      | 2  | 29   | 01 March 2024    |                  | 66.56           | 
17.01         | 0.0      | 0.0  | 0.0       | 17.01 | 0.0   | 0.0        | 0.0  
| 17.01       |
+      | 3  | 31   | 01 April 2024    |                  | 49.55           | 
17.01         | 0.0      | 0.0  | 0.0       | 17.01 | 0.0   | 0.0        | 0.0  
| 17.01       |
+      | 4  | 30   | 01 May 2024      |                  | 32.54           | 
17.01         | 0.0      | 0.0  | 0.0       | 17.01 | 0.0   | 0.0        | 0.0  
| 17.01       |
+      | 5  | 31   | 01 June 2024     |                  | 15.53           | 
17.01         | 0.0      | 0.0  | 0.0       | 17.01 | 0.0   | 0.0        | 0.0  
| 17.01       |
+      | 6  | 30   | 01 July 2024     |                  | 0.0             | 
15.53         | 0.0      | 0.0  | 0.0       | 15.53 | 0.0   | 0.0        | 0.0  
| 15.53       |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due    | Paid  | In 
advance | Late | Outstanding |
+      | 100           | 0.58     | 0    | 0         | 100.58 | 17.01 | 0       
   | 0    | 83.57       |
+    Then Loan Transactions tab has the following data:
+      | Transaction date | Transaction Type | Amount | Principal | Interest | 
Fees | Penalties | Loan Balance |
+      | 01 January 2024  | Disbursement     | 100.0  | 0.0       | 0.0      | 
0.0  | 0.0       | 100.0        |
+      | 01 February 2024 | Repayment        | 17.01  | 16.43     | 0.58     | 
0.0  | 0.0       | 83.57        |
+      | 01 February 2024 | Charge-off       | 83.57  | 83.57     | 0.0      | 
0.0  | 0.0       | 0.0          |
+    And Admin checks the loan has been charged-off on "01 February 2024"
\ No newline at end of file

Reply via email to