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

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

commit 22a96c658eea9bcaa9f1b4146e819bd395384d73
Author: Peter Kovacs <[email protected]>
AuthorDate: Tue Oct 28 10:25:06 2025 +0100

    FINERACT-2389: Fix the handling of nullable field overrides - E2E tests
---
 .../fineract/test/stepdef/loan/LoanStepDef.java    | 80 ++++++++++++++++++++++
 .../resources/features/LoanDelinquency.feature     | 32 +++++++++
 .../resources/features/LoanOverrideFileds.feature  |  4 ++
 3 files changed, 116 insertions(+)

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 83d589b1a4..b4664fe721 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
@@ -714,6 +714,12 @@ public class LoanStepDef extends AbstractStepDef {
         createFullyCustomizedLoanWithInterestRateFrequency(data.get(1));
     }
 
+    @When("Admin creates a fully customized loan with graceOnArrearsAgeing and 
following data:")
+    public void createFullyCustomizedLoanWithGraceOnArrearsAgeing(final 
DataTable table) throws IOException {
+        final List<List<String>> data = table.asLists();
+        createFullyCustomizedLoanWithGraceOnArrearsAgeing(data.get(1));
+    }
+
     @When("Admin creates a fully customized loan with charges and following 
data:")
     public void createFullyCustomizedLoanWithLoanCharges(final DataTable 
table) throws IOException {
         final List<List<String>> data = table.asLists();
@@ -3758,6 +3764,80 @@ public class LoanStepDef extends AbstractStepDef {
         eventCheckHelper.createLoanEventCheck(response);
     }
 
+    public void createFullyCustomizedLoanWithGraceOnArrearsAgeing(final 
List<String> loanData) 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 String graceOnArrearsAgeingStr = loanData.get(16);
+
+        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();
+
+        Integer graceOnArrearsAgeingValue = 
Integer.valueOf(graceOnArrearsAgeingStr);
+
+        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)//
+                .graceOnArrearsAgeing(graceOnArrearsAgeingValue);//
+
+        final Response<PostLoansResponse> response = 
loansApi.calculateLoanScheduleOrSubmitLoanApplication(loansRequest, 
"").execute();
+        testContext().set(TestContextKey.LOAN_CREATE_RESPONSE, response);
+        ErrorHelper.checkSuccessfulApiCall(response);
+
+        eventCheckHelper.createLoanEventCheck(response);
+    }
+
     public void createFullyCustomizedLoanWithCharges(final List<String> 
loanData) throws IOException {
         final String loanProduct = loanData.get(0);
         final String submitDate = loanData.get(1);
diff --git 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanDelinquency.feature 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanDelinquency.feature
index a382d7e919..e94a899490 100644
--- 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanDelinquency.feature
+++ 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanDelinquency.feature
@@ -2144,3 +2144,35 @@ Feature: LoanDelinquency
       | 3       | RANGE_30 | 125.00 |
       | 4       | RANGE_60 | 375.00 |
       | 5       | RANGE_90 | 250.00 |
+
+  @TestRailId:C4140
+  Scenario: Verify that loan delinquent days are correct when 
graceOnArrearsAgeing is set on loan product level (value=3)
+    When Admin sets the business date to "01 January 2025"
+    And Admin creates a client with random data
+    And 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_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES | 01 January 
2025   | 1000           | 0                      | 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 2025" with "1000" 
amount and expected disbursement date on "01 January 2025"
+    And Admin successfully disburse the loan on "01 January 2025" with "1000" 
EUR transaction amount
+    And Admin sets the business date to "15 May 2025"
+    And Admin runs inline COB job for Loan
+    Then Admin checks that delinquency range is: "RANGE_90" and has 
delinquentDate "2025-02-04"
+    And Loan has the following LOAN level delinquency data:
+      | classification | delinquentAmount | delinquentDate   | delinquentDays 
| pastDueDays |
+      | RANGE_90       | 666.68           | 04 February 2025 | 100            
| 103         |
+
+  @TestRailId:C4141
+  Scenario: Verify that loan delinquent days are correct when 
graceOnArrearsAgeing is overrided on loan level (value=5)
+    When Admin sets the business date to "01 January 2025"
+    And Admin creates a client with random data
+    And Admin creates a fully customized loan with graceOnArrearsAgeing 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            | graceOnArrearsAgeing |
+      | LP2_PROGRESSIVE_ADVANCED_PAYMENT_ALLOCATION_BUYDOWN_FEES | 01 January 
2025   | 1000           | 0                      | DECLINING_BALANCE | DAILY    
                   | EQUAL_INSTALLMENTS | 6                 | MONTHS            
    | 1              | MONTHS                 | 6                  | 0          
             | 0                      | 0                    | 
ADVANCED_PAYMENT_ALLOCATION | 5                    |
+    And Admin successfully approves the loan on "01 January 2025" with "1000" 
amount and expected disbursement date on "01 January 2025"
+    And Admin successfully disburse the loan on "01 January 2025" with "1000" 
EUR transaction amount
+    And Admin sets the business date to "15 May 2025"
+    And Admin runs inline COB job for Loan
+    Then Admin checks that delinquency range is: "RANGE_90" and has 
delinquentDate "2025-02-06"
+    And Loan has the following LOAN level delinquency data:
+      | classification | delinquentAmount | delinquentDate   | delinquentDays 
| pastDueDays |
+      | RANGE_90       | 666.68           | 06 February 2025 | 98             
| 103         |
diff --git 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanOverrideFileds.feature
 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanOverrideFileds.feature
index b955d0f272..7d8fc9aa93 100644
--- 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanOverrideFileds.feature
+++ 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanOverrideFileds.feature
@@ -1,6 +1,7 @@
 @LoanOverrideFields
 Feature: LoanOverrideFields
 
+  @TestRailId:C4142
   Scenario: Verify that all nullable fields default to product when overrides 
not allowed and not provided
     When Admin sets the business date to the actual date
     When Admin creates a client with random data
@@ -15,6 +16,7 @@ Feature: LoanOverrideFields
     Then LoanDetails has "graceOnInterestPayment" field with value: "1"
     Then LoanDetails has "graceOnArrearsAgeing" field with value: "3"
 
+  @TestRailId:C4143
   Scenario: Verify that all nullable fields ignore overrides when overrides 
not allowed
     When Admin sets the business date to the actual date
     When Admin creates a client with random data
@@ -29,6 +31,7 @@ Feature: LoanOverrideFields
     Then LoanDetails has "graceOnInterestPayment" field with value: "1"
     Then LoanDetails has "graceOnArrearsAgeing" field with value: "3"
 
+  @TestRailId:C4144
   Scenario: Verify that nullable fields default to product when override is 
allowed but not provided
     When Admin sets the business date to the actual date
     When Admin creates a client with random data
@@ -43,6 +46,7 @@ Feature: LoanOverrideFields
     Then LoanDetails has "graceOnInterestPayment" field with value: "1"
     Then LoanDetails has "graceOnArrearsAgeing" field with value: "3"
 
+  @TestRailId:C4145
   Scenario: Verify that nullable fields default to product when override is 
allowed and provided
     When Admin sets the business date to the actual date
     When Admin creates a client with random data

Reply via email to