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 ecbefb04c434636831d48d96bc359a275bcfe49f
Author: Rustam Zeinalov <[email protected]>
AuthorDate: Thu Jul 17 14:59:17 2025 +0200

    FINERACT-2317: Added e2e tests covering support for modifying loan approved 
amounts with validation and history tracking
---
 .../test/data/loanproduct/DefaultLoanProduct.java  |   2 +
 .../fineract/test/helper/ErrorMessageHelper.java   |   4 +
 .../global/LoanProductGlobalInitializerStep.java   |  61 ++++++++
 .../fineract/test/stepdef/loan/LoanStepDef.java    |  29 +++-
 .../fineract/test/support/TestContextKey.java      |   2 +
 .../src/test/resources/features/Loan.feature       | 161 +++++++++++++++++++++
 6 files changed, 258 insertions(+), 1 deletion(-)

diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/loanproduct/DefaultLoanProduct.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/loanproduct/DefaultLoanProduct.java
index c302c5f083..43dbdab2ee 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/loanproduct/DefaultLoanProduct.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/loanproduct/DefaultLoanProduct.java
@@ -144,6 +144,7 @@ public enum DefaultLoanProduct implements LoanProduct {
     
LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_PERCENTAGE_CAPITALIZED_INCOME,
 //
     
LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_FLAT_CAPITALIZED_INCOME,
 //
     
LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC,
 //
+    
LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_APPROVED_OVER_APPLIED_CAPITALIZED_INCOME,
 //
     
LP2_ADV_PYMNT_360_30_INTEREST_RECALC_AUTO_DOWNPAYMENT_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY,
 //
     
LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALC_DAILY_INSTALLMENT_FEE_FLAT_CHARGES,
 //
     LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_CHARGES, //
@@ -151,6 +152,7 @@ public enum DefaultLoanProduct implements LoanProduct {
     
LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_PERCENT_AMOUNT_INTEREST_CHARGES, //
     LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_ALL_CHARGES, //
     
LP2_ADV_PYMNT_INTEREST_DAILY_INSTALLMENT_FEE_FLAT_INTEREST_CHARGES_TRANCHE, //
+    LP1_MULTIDISBURSAL_EXPECTS_TRANCHES, //
     ;
 
     @Override
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 912db6b868..595abad3ef 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
@@ -982,6 +982,10 @@ public final class ErrorMessageHelper {
     }
 
     public static String updateApprovedLoanExceedPrincipalFailure() {
+        return "Failed data validation due to: 
can't.be.greater.than.maximum.applied.loan.amount.calculation.";
+    }
+
+    public static String 
updateApprovedLoanLessThanDisbursedPrincipalAndCapitalizedIncomeFailure() {
         return "Failed data validation due to: 
less.than.disbursed.principal.and.capitalized.income.";
     }
 
diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
index a19f9fabbb..970d25858f 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
@@ -3361,6 +3361,67 @@ public class LoanProductGlobalInitializerStep implements 
FineractGlobalInitializ
                 
TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_PROGRESSIVE_ADV_PYMNT_BUYDOWN_FEES_CHARGE_OFF_REASON,
                 
responseLoanProductsRequestLP2ProgressiveAdvPaymentBuyDownFeesWithChargeOffReason);
 
+        // LP2 with progressive loan schedule + horizontal + interest EMI + 
360/30
+        // + interest recalculation, preClosureInterestCalculationStrategy= 
till preclose,
+        // Frequency for recalculate Outstanding Principal: Daily, Frequency 
Interval for recalculation: 1
+        // capitalized income enabled; allow approved/disbursed amount over 
applied amount is enabled with percentage
+        // type
+        final String name129 = 
DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_APPROVED_OVER_APPLIED_CAPITALIZED_INCOME
+                .getName();
+        final PostLoanProductsRequest 
loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedCapitalizedIncome
 = loanProductsRequestFactory
+                .defaultLoanProductsRequestLP2EmiCapitalizedIncome()//
+                .name(name129)//
+                .daysInYearType(DaysInYearType.DAYS360.value)//
+                .daysInMonthType(DaysInMonthType.DAYS30.value)//
+                .isInterestRecalculationEnabled(true)//
+                .preClosureInterestCalculationStrategy(1)//
+                .rescheduleStrategyMethod(4)//
+                .interestRecalculationCompoundingMethod(0)//
+                .recalculationRestFrequencyType(2)//
+                .recalculationRestFrequencyInterval(1)//
+                .paymentAllocation(List.of(//
+                        createPaymentAllocation("DEFAULT", 
"NEXT_INSTALLMENT"), //
+                        createPaymentAllocation("GOODWILL_CREDIT", 
"LAST_INSTALLMENT"), //
+                        createPaymentAllocation("MERCHANT_ISSUED_REFUND", 
"REAMORTIZATION"), //
+                        createPaymentAllocation("PAYOUT_REFUND", 
"NEXT_INSTALLMENT"))) //
+                .allowApprovedDisbursedAmountsOverApplied(true)//
+                
.overAppliedCalculationType(OverAppliedCalculationType.PERCENTAGE.value)//
+                .overAppliedNumber(50)//
+                .multiDisburseLoan(true)//
+                .disallowExpectedDisbursements(true)//
+                .maxTrancheCount(10)//
+                .outstandingLoanBalance(10000.0);//
+        final Response<PostLoanProductsResponse> 
responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedCapitalizedIncome
 = loanProductsApi
+                .createLoanProduct(
+                        
loanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedCapitalizedIncome)
+                .execute();
+        TestContext.INSTANCE.set(
+                
TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_APPROVED_OVER_APPLIED_CAPITALIZED_INCOME,
+                
responseLoanProductsRequestLP2ProgressiveAdvPymnt36030InterestRecalcMultidisbApprovedOverAppliedCapitalizedIncome);
+
+        // LP1 with new 
due-penalty-fee-interest-principal-in-advance-principal-penalty-fee-interest-strategy
 payment
+        // strategy and with 12% FLAT interest
+        // multidisbursal that expects tranche(s)
+        // (LP1_PAYMENT_STRATEGY_DUE_IN_ADVANCE_INTEREST_FLAT)
+        String name130 = 
DefaultLoanProduct.LP1_MULTIDISBURSAL_EXPECTS_TRANCHES.getName();
+        PostLoanProductsRequest 
loanProductsRequestMultidisbursalExpectTranches = loanProductsRequestFactory
+                // .defaultLoanProductsRequestLP1InterestFlat()//
+                // .interestType(INTEREST_TYPE_DECLINING_BALANCE)//
+                .defaultLoanProductsRequestLP1() //
+                .interestCalculationPeriodType(0)//
+                // .allowApprovedDisbursedAmountsOverApplied(false)//
+                .name(name130)//
+                .transactionProcessingStrategyCode(
+                        
TransactionProcessingStrategyCode.DUE_PENALTY_FEE_INTEREST_PRINCIPAL_IN_ADVANCE_PRINCIPAL_PENALTY_FEE_INTEREST.value)//
+                .multiDisburseLoan(true)//
+                .disallowExpectedDisbursements(false)//
+                .maxTrancheCount(10)//
+                .outstandingLoanBalance(10000.0);//
+        Response<PostLoanProductsResponse> 
responseLoanProductMultidisbursalExpectTranches = loanProductsApi
+                
.createLoanProduct(loanProductsRequestMultidisbursalExpectTranches).execute();
+        
TestContext.INSTANCE.set(TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_MULTIDISBURSAL_EXPECTS_TRANCHES,
+                responseLoanProductMultidisbursalExpectTranches);
+
     }
 
     public static AdvancedPaymentData createPaymentAllocation(String 
transactionType, String futureInstallmentAllocationRule,
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 5f451dc347..8e82eb3d10 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
@@ -4932,6 +4932,33 @@ public class LoanStepDef extends AbstractStepDef {
         
assertThat(developerMessage).isEqualTo(ErrorMessageHelper.updateApprovedLoanExceedPrincipalFailure());
     }
 
+    @Then("Update loan approved amount is forbidden with amount {string} due 
to higher principal amount on loan")
+    public void 
updateLoanApprovedAmountForbiddenHigherPrincipalAmountOnLoan(final String 
amount) throws IOException {
+        final Response<PostLoansResponse> loanResponse = 
testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
+        final long loanId = loanResponse.body().getLoanId();
+        final Response<GetLoansLoanIdResponse> loanDetailsResponse = 
loansApi.retrieveLoan(loanId, false, "transactions", "", "").execute();
+        ErrorHelper.checkSuccessfulApiCall(loanDetailsResponse);
+
+        final PutLoansApprovedAmountRequest modifyLoanApprovedAmountRequest = 
new PutLoansApprovedAmountRequest().locale(LOCALE_EN)
+                .amount(new BigDecimal(amount));
+
+        final Response<PutLoansApprovedAmountResponse> 
modifyLoanApprovedAmountResponse = loansApi
+                .modifyLoanApprovedAmount(loanId, 
modifyLoanApprovedAmountRequest).execute();
+
+        ErrorResponse errorDetails = 
ErrorResponse.from(modifyLoanApprovedAmountResponse);
+        assertThat(errorDetails.getHttpStatusCode()).isEqualTo(403);
+
+        Object errorArgs = 
errorDetails.getErrors().getFirst().getArgs().getFirst().getValue();
+        String developerMessage;
+        if (errorArgs instanceof Map errorArgsMap) {
+            developerMessage = (String) errorArgsMap.get("developerMessage");
+        } else {
+            developerMessage = errorDetails.getDeveloperMessage();
+        }
+        assertThat(developerMessage)
+                
.isEqualTo(ErrorMessageHelper.updateApprovedLoanLessThanDisbursedPrincipalAndCapitalizedIncomeFailure());
+    }
+
     @Then("Update loan approved amount is forbidden with amount {string} due 
to min allowed amount")
     public void updateLoanApprovedAmountForbiddenMinAllowedAmount(final String 
amount) throws IOException {
         final Response<PostLoansResponse> loanResponse = 
testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
@@ -4946,7 +4973,7 @@ public class LoanStepDef extends AbstractStepDef {
                 .modifyLoanApprovedAmount(loanId, 
modifyLoanApprovedAmountRequest).execute();
 
         ErrorResponse errorDetails = 
ErrorResponse.from(modifyLoanApprovedAmountResponse);
-        assertThat(errorDetails.getHttpStatusCode()).isEqualTo(400);
+        assertThat(errorDetails.getHttpStatusCode()).isEqualTo(403);
 
         Object errorArgs = 
errorDetails.getErrors().getFirst().getArgs().getFirst().getValue();
         String developerMessage;
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 789b9a5556..9b7c554cc9 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
@@ -161,6 +161,7 @@ public abstract class TestContextKey {
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_OVER_APPLIED_PERCENTAGE_CAPITALIZED_INCOME
 = 
"loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmi36030InterestRecalculationDailyMultidisbursalApprovedOVerAppliedPercentageCapitalizedIncome";
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_OVER_APPLIED_FLAT_CAPITALIZED_INCOME
 = 
"loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmi36030InterestRecalculationDailyMultidisbursalApprovedOVerAppliedFlatCapitalizedIncome";
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_PERCENTAGE_CAPITALIZED_INCOME
 = 
"loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmi36030InterestRecalculationDailyApprovedOVerAppliedAmountPercentageCapitalizedIncome";
+    public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_APPROVED_OVER_APPLIED_CAPITALIZED_INCOME
 = 
"loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmi36030InterestRecalcDailyMultidisbursalApprovedOVerAppliedAmountPercentageCapitalizedIncome";
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_FLAT_CAPITALIZED_INCOME
 = 
"loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmi36030InterestRecalculationDailyApprovedOVerAppliedAmountFlatCapitalizedIncome";
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME
 = 
"loanProductCreateResponseLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncome";
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME_FEE
 = 
"loanProductCreateResponseLP2ProgressiveAdvPayment36030InterestRecalcCapitalizedIncomeFee";
@@ -176,6 +177,7 @@ public abstract class TestContextKey {
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_IR_DAILY_TILL_REST_FREQUENCY_DATE_LAST_INSTALLMENT
 = 
"loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmi36030InterestRecalculationDailyTillRestFrequencyDateLastInstallment";
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_ACCRUAL_ACTIVITY
 = 
"loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmi36030InterestRefundInterestRecalculationAccrualActivity";
     public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_REFUND_INTEREST_RECALC_DOWNPAYMENT_ACCRUAL_ACTIVITY
 = 
"loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmi36030InterestRefundInterestRecalculatioDownpaymentnAccrualActivity";
+    public static final String 
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_MULTIDISBURSAL_EXPECTS_TRANCHES = 
"loanProductCreateResponseLP1MultidisbursalThatExpectTranches";
     public static final String CHARGE_FOR_LOAN_PERCENT_LATE_CREATE_RESPONSE = 
"ChargeForLoanPercentLateCreateResponse";
     public static final String 
CHARGE_FOR_LOAN_PERCENT_LATE_AMOUNT_PLUS_INTEREST_CREATE_RESPONSE = 
"ChargeForLoanPercentLateAmountPlusInterestCreateResponse";
     public static final String 
CHARGE_FOR_LOAN_PERCENT_PROCESSING_CREATE_RESPONSE = 
"ChargeForLoanPercentProcessingCreateResponse";
diff --git a/fineract-e2e-tests-runner/src/test/resources/features/Loan.feature 
b/fineract-e2e-tests-runner/src/test/resources/features/Loan.feature
index fa2a9ad094..c0044f3fa9 100644
--- a/fineract-e2e-tests-runner/src/test/resources/features/Loan.feature
+++ b/fineract-e2e-tests-runner/src/test/resources/features/Loan.feature
@@ -7247,3 +7247,164 @@ Feature: Loan
       | 08 August 2025   | Accrual          | 2.8     | 0.0       | 0.0      | 
0.0  | 2.8       | 0.0          | false    | false    |
       | 08 August 2025   | Accrual Activity | 6.22    | 0.0       | 3.42     | 
0.0  | 2.8       | 0.0          | false    | false    |
       | 15 August 2025   | Repayment        | 2.8     | 0.0       | 0.0      | 
0.0  | 2.8       | 0.0          | false    | false    |
+
+  @TestRailId:C3858
+  Scenario: Verify update approved amount for progressive loan - 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 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_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_PMT_ALLOC_1
 | 01 January 2025   | 1000            | 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 2025" with "1000" 
amount and expected disbursement date on "01 January 2025"
+   Then Update loan approved amount is forbidden with amount "0" due to min 
allowed amount
+   When Admin successfully disburse the loan on "01 January 2025" with "1000" 
EUR transaction amount
+
+  @TestRailId:C3859
+  Scenario: Verify update approved amount after undo disbursement for single 
disb progressive loan - UC3
+    When Admin sets the business date to "1 January 2025"
+    And 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_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE
 | 01 January 2025   | 1000           | 7                      | 
DECLINING_BALANCE | DAILY                       | EQUAL_INSTALLMENTS | 6        
         | MONTHS                | 1              | MONTHS                 | 6  
                | 0                       | 0                      | 0          
          | ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "1 January 2025" with "1000" 
amount and expected disbursement date on "1 January 2025"
+    And Admin successfully disburse the loan on "1 January 2025" with "100" 
EUR transaction amount
+    Then Update loan approved amount with new amount "600" value
+    When Admin successfully undo disbursal
+    Then Admin fails to disburse the loan on "1 January 2025" with "700" EUR 
transaction amount due to exceed approved amount
+
+  @TestRailId:C3860
+  Scenario: Verify update approved amount with approved over applied amount 
for progressive multidisbursal loan with percentage overAppliedCalculationType 
- UC4
+    When Admin sets the business date to "1 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_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_APPROVED_OVER_APPLIED_CAPITALIZED_INCOME
 | 01 January 2025   | 1000           | 7                      | 
DECLINING_BALANCE | DAILY                       | EQUAL_INSTALLMENTS | 6        
         | MONTHS                | 1              | MONTHS                 | 6  
                | 0                       | 0                      | 0          
          | ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "1 January 2025" with "1000" 
amount and expected disbursement date on "1 January 2025"
+    And Admin successfully disburse the loan on "1 January 2025" with "1100" 
EUR transaction amount
+    Then Update loan approved amount is forbidden with amount "1600" due to 
exceed applied amount
+    Then Update loan approved amount with new amount "1300" value
+    And Admin successfully disburse the loan on "1 January 2025" with "400" 
EUR transaction amount
+
+  @TestRailId:C3861
+  Scenario: Verify update approved amount with approved over applied amount 
and capitalized income for progressive loan with percentage 
overAppliedCalculationType - UC8_1
+    When Admin sets the business date to "1 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_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_APPROVED_OVER_APPLIED_PERCENTAGE_CAPITALIZED_INCOME
 | 01 January 2025   | 1000           | 7                      | 
DECLINING_BALANCE | DAILY                       | EQUAL_INSTALLMENTS | 6        
         | MONTHS                | 1              | MONTHS                 | 6  
                | 0                       | 0                      | 0          
          | ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "1 January 2025" with "1000" 
amount and expected disbursement date on "1 January 2025"
+    And Admin successfully disburse the loan on "1 January 2025" with "1100" 
EUR transaction amount
+    Then Update loan approved amount is forbidden with amount "1600" due to 
exceed applied amount
+    Then Update loan approved amount with new amount "1400" value
+    And Admin adds capitalized income with "AUTOPAY" payment type to the loan 
on "1 January 2025" with "400" EUR transaction amount
+
+  @TestRailId:C3862
+  Scenario: Verify update approved amount with capitalized income for 
progressive loan - UC8_2
+    When Admin sets the business date to "1 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_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_CAPITALIZED_INCOME
 | 01 January 2025   | 1000           | 7                      | 
DECLINING_BALANCE | DAILY                       | EQUAL_INSTALLMENTS | 6        
         | MONTHS                | 1              | MONTHS                 | 6  
                | 0                       | 0                      | 0          
          | ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "1 January 2025" with "900" 
amount and expected disbursement date on "1 January 2025"
+    And Admin successfully disburse the loan on "1 January 2025" with "600" 
EUR transaction amount
+    Then Update loan approved amount is forbidden with amount "500" due to 
higher principal amount on loan
+    And Admin adds capitalized income with "AUTOPAY" payment type to the loan 
on "1 January 2025" with "200" EUR transaction amount
+    Then Update loan approved amount with new amount "1000" value
+    And Admin adds capitalized income with "AUTOPAY" payment type to the loan 
on "1 January 2025" with "200" EUR transaction amount
+
+  @TestRailId:C3863
+  Scenario: Verify update approved amount with capitalized income for 
progressive multidisbursal loan - UC8_3
+    When Admin sets the business date to "1 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_ADV_PYMNT_INTEREST_DAILY_RECALC_EMI_360_30_MULTIDISB_CAPITALIZED_INCOME_ADJ_CUSTOM_ALLOC
 | 01 January 2025   | 1000           | 7                      | 
DECLINING_BALANCE | DAILY                       | EQUAL_INSTALLMENTS | 6        
         | MONTHS                | 1              | MONTHS                 | 6  
                | 0                       | 0                      | 0          
          | ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "1 January 2025" with "900" 
amount and expected disbursement date on "1 January 2025"
+    And Admin successfully disburse the loan on "1 January 2025" with "600" 
EUR transaction amount
+    Then Update loan approved amount is forbidden with amount "500" due to 
higher principal amount on loan
+    And Admin adds capitalized income with "AUTOPAY" payment type to the loan 
on "1 January 2025" with "200" EUR transaction amount
+    Then Update loan approved amount with new amount "1000" value
+    And Admin successfully disburse the loan on "1 January 2025" with "200" 
EUR transaction amount
+
+  @TestRailId:C3864
+  Scenario: Verify update approved amount before disbursement for single disb 
cumulative loan - UC5_1
+    When Admin sets the business date to "1 January 2025"
+    And 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                
        |
+      | LP1         | 1 January 2025    | 1000           | 0                   
   | DECLINING_BALANCE | SAME_AS_REPAYMENT_PERIOD    | EQUAL_INSTALLMENTS | 3   
              | MONTHS                | 1              | MONTHS                 
| 3                  | 0                       | 0                      | 0     
               | PENALTIES_FEES_INTEREST_PRINCIPAL_ORDER |
+    And Admin successfully approves the loan on "1 January 2025" with "1000" 
amount and expected disbursement date on "1 January 2025"
+    Then Update loan approved amount with new amount "900" value
+    And Admin successfully disburse the loan on "1 January 2025" with "100" 
EUR transaction amount
+
+  @TestRailId:C3865
+  Scenario: Verify update approved amount before disbursement for single disb 
progressive loan - UC5_2
+    When Admin sets the business date to "1 January 2025"
+    And 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_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE
 | 01 January 2025   | 1000           | 7                      | 
DECLINING_BALANCE | DAILY                       | EQUAL_INSTALLMENTS | 6        
         | MONTHS                | 1              | MONTHS                 | 6  
                | 0                       | 0                      | 0          
          | ADVANCED_PAYMENT_ALLOCATION |
+    And Admin successfully approves the loan on "1 January 2025" with "1000" 
amount and expected disbursement date on "1 January 2025"
+    Then Update loan approved amount with new amount "900" value
+    And Admin successfully disburse the loan on "1 January 2025" with "100" 
EUR transaction amount
+
+  @TestRailId:C3866
+  Scenario: Verify approved amount change for progressive multidisbursal loan 
that doesn't expect tranches - UC6
+    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 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_INTEREST_DAILY_EMI_360_30_INTEREST_RECALC_DAILY_MULTIDISBURSE | 
01 January 2025   | 1000           | 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 2025" with "1000" 
amount and expected disbursement date on "01 January 2025"
+    When Admin successfully disburse the loan on "01 January 2025" with "200" 
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  |           | 200.0           |           
    |          | 0.0  |           | 0.0   | 0.0  |            |      |          
   |
+      | 1  | 31   | 01 February 2025 |           | 167.15          | 32.85     
    | 1.17     | 0.0  | 0.0       | 34.02 | 0.0  | 0.0        | 0.0  | 34.02    
   |
+      | 2  | 28   | 01 March 2025    |           | 134.11          | 33.04     
    | 0.98     | 0.0  | 0.0       | 34.02 | 0.0  | 0.0        | 0.0  | 34.02    
   |
+      | 3  | 31   | 01 April 2025    |           | 100.87          | 33.24     
    | 0.78     | 0.0  | 0.0       | 34.02 | 0.0  | 0.0        | 0.0  | 34.02    
   |
+      | 4  | 30   | 01 May 2025      |           |  67.44          | 33.43     
    | 0.59     | 0.0  | 0.0       | 34.02 | 0.0  | 0.0        | 0.0  | 34.02    
   |
+      | 5  | 31   | 01 June 2025     |           |  33.81          | 33.63     
    | 0.39     | 0.0  | 0.0       | 34.02 | 0.0  | 0.0        | 0.0  | 34.02    
   |
+      | 6  | 30   | 01 July 2025     |           |   0.0           | 33.81     
    | 0.2      | 0.0  | 0.0       | 34.01 | 0.0  | 0.0        | 0.0  | 34.01    
   |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due    | Paid | In 
advance | Late | Outstanding |
+      | 200.0         | 4.11     | 0.0  | 0.0       | 204.11 | 0.0  | 0.0      
  | 0.0  | 204.11      |
+    Then Update loan approved amount with new amount "600" value
+    When Admin successfully disburse the loan on "01 January 2025" with "400" 
EUR transaction amount
+    Then Update loan approved amount is forbidden with amount "500" due to 
higher principal amount on loan
+
+  @TestRailId:C3867
+  Scenario: Verify approved amount change with lower vallue for progressive 
multidisbursal loan that expects two tranches - UC7_1
+    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 three expected 
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                | 
300.0          [...]
+    And Admin successfully approves the loan on "01 January 2025" with "1000" 
amount and expected disbursement date on "01 January 2025"
+    Then Loan Tranche Details tab has the following data:
+      | Expected Disbursement On | Disbursed On    | Principal   | Net 
Disbursal Amount |
+      | 01 January 2025          |                 | 300.0       |             
         |
+      | 02 January 2025          |                 | 200.0       |             
         |
+      | 03 January 2025          |                 | 500.0       |             
         |
+#    --- disbursement - 1 January, 2025  ---
+    When Admin successfully disburse the loan on "01 January 2025" with "300" 
EUR transaction amount
+    When Admin sets the business date to "03 January 2025"
+    Then Update loan approved amount with new amount "800" value
+
+  @TestRailId:C3868
+  Scenario: Verify approved amount change with greater value for progressive 
multidisbursal loan that expects two tranches - UC7_2
+    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 three expected 
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   | 1200           | 7                      | 
DECLINING_BALANCE | DAILY                       | EQUAL_INSTALLMENTS | 6        
         | MONTHS                | 1              | MONTHS                 | 6  
                | 0                       | 0                      | 0          
          | ADVANCED_PAYMENT_ALLOCATION | 01 January 2025                | 
300.0          [...]
+    And Admin successfully approves the loan on "01 January 2025" with "1000" 
amount and expected disbursement date on "01 January 2025"
+    Then Loan Tranche Details tab has the following data:
+      | Expected Disbursement On | Disbursed On    | Principal   | Net 
Disbursal Amount |
+      | 01 January 2025          |                 | 300.0       |             
         |
+      | 02 January 2025          |                 | 200.0       |             
         |
+      | 03 January 2025          |                 | 500.0       |             
         |
+#    --- disbursement - 1 January, 2025  ---
+    When Admin successfully disburse the loan on "01 January 2025" with "300" 
EUR transaction amount
+    When Admin sets the business date to "03 January 2025"
+    Then Update loan approved amount with new amount "1200" value


Reply via email to