You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by ad...@apache.org on 2025/06/10 08:06:55 UTC
(fineract) 02/02: FINERACT-2232: added e2e test for validation of capitalized income balance handling during reverse replay situations
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 3ce44f836d469d6b67d7d844e93a5041be84b40a
Author: Rustam Zeinalov <ru...@binariks.com>
AuthorDate: Fri Jun 6 14:58:34 2025 +0200
FINERACT-2232: added e2e test for validation of capitalized income balance handling during reverse replay situations
---
.../features/LoanCapitalizedIncome.feature | 192 +++++++++++++++++++++
.../LoanCapitalizedIncomeTest.java | 1 -
2 files changed, 192 insertions(+), 1 deletion(-)
diff --git a/fineract-e2e-tests-runner/src/test/resources/features/LoanCapitalizedIncome.feature b/fineract-e2e-tests-runner/src/test/resources/features/LoanCapitalizedIncome.feature
index a491d34f2b..e23cc95518 100644
--- a/fineract-e2e-tests-runner/src/test/resources/features/LoanCapitalizedIncome.feature
+++ b/fineract-e2e-tests-runner/src/test/resources/features/LoanCapitalizedIncome.feature
@@ -3958,3 +3958,195 @@ Feature: Capitalized Income
| 16 February 2024 | Capitalized Income | 50.0 | 50.0 | 0.0 | 0.0 | 0.0 | 100.0 | false | false |
Then LoanCapitalizedIncomeAmortizationAdjustmentTransactionCreatedBusinessEvent is raised on "15 February 2024"
Then Customer is forbidden to undo "1"th "Capitalized Income" transaction made on "01 January 2024" due to transaction type is non-reversal
+
+ @TestRailId:C3737
+ Scenario: Verify overpayment amount when capitalized income transactions are reversed and replayed - basic flow
+ When Admin sets the business date to "1 January 2024"
+ 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 2024 | 1200 | 7 | DECLINING_BALANCE | DAILY | EQUAL_INSTALLMENTS | 3 | MONTHS | 1 | MONTHS | 3 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION |
+ And Admin successfully approves the loan on "1 January 2024" with "1200" amount and expected disbursement date on "1 January 2024"
+ And Admin successfully disburse the loan on "1 January 2024" with "1000" EUR transaction amount
+ Then Loan status will be "ACTIVE"
+ When Admin sets the business date to "5 January 2024"
+ And Admin adds capitalized income with "AUTOPAY" payment type to the loan on "5 January 2024" with "200" EUR transaction amount
+ Then Loan has 1213.88 outstanding amount
+ # Make overpayment
+ When Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on "5 January 2024" with 1300 EUR transaction amount and system-generated Idempotency key
+ Then Loan status will be "OVERPAID"
+ And Loan has 0 outstanding amount
+ And Loan Transactions tab has the following data:
+ | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted |
+ | 01 January 2024 | Disbursement | 1000.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1000.0 | false |
+ | 05 January 2024 | Capitalized Income | 200.0 | 200.0 | 0.0 | 0.0 | 0.0 | 1200.0 | false |
+ | 05 January 2024 | Repayment | 1300.0 | 1200.0 | 0.75 | 0.0 | 0.0 | 0.0 | false |
+ | 05 January 2024 | Accrual | 0.75 | 0.0 | 0.75 | 0.0 | 0.0 | 0.0 | false |
+ | 05 January 2024 | Capitalized Income Amortization | 200.0 | 0.0 | 200.0 | 0.0 | 0.0 | 0.0 | false |
+ # Undo capitalized income - should trigger reverse-replay
+ When Customer undo "1"th "Capitalized Income" transaction made on "05 January 2024"
+ Then Loan has 0 outstanding amount
+ And Loan Transactions tab has the following data:
+ | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed |
+ | 01 January 2024 | Disbursement | 1000.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1000.0 | false | false |
+ | 05 January 2024 | Capitalized Income | 200.0 | 200.0 | 0.0 | 0.0 | 0.0 | 1200.0 | true | false |
+ | 05 January 2024 | Accrual | 0.75 | 0.0 | 0.75 | 0.0 | 0.0 | 0.0 | false | false |
+ | 05 January 2024 | Capitalized Income Amortization | 200.0 | 0.0 | 200.0 | 0.0 | 0.0 | 0.0 | false | false |
+ | 05 January 2024 | Repayment | 1300.0 | 1000.0 | 0.75 | 0.0 | 0.0 | 0.0 | false | true |
+ | 05 January 2024 | Capitalized Income Amortization Adjustment | 200.0 | 0.0 | 200.0 | 0.0 | 0.0 | 0.0 | false | false |
+ Then Loan status will be "OVERPAID"
+ Then Loan has 299.25 overpaid amount
+
+ @TestRailId:C3739
+ Scenario: Verify multiple capitalized income transactions reversal with overpayment - selective middle transaction reversal
+ When Admin sets the business date to "1 January 2024"
+ 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 2024 | 1600 | 7 | DECLINING_BALANCE | DAILY | EQUAL_INSTALLMENTS | 3 | MONTHS | 1 | MONTHS | 3 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION |
+ And Admin successfully approves the loan on "1 January 2024" with "1600" amount and expected disbursement date on "1 January 2024"
+ And Admin successfully disburse the loan on "1 January 2024" with "1000" EUR transaction amount
+ Then Loan status will be "ACTIVE"
+ When Admin sets the business date to "5 January 2024"
+ And Admin adds capitalized income with "AUTOPAY" payment type to the loan on "5 January 2024" with "100" EUR transaction amount
+ When Admin sets the business date to "10 January 2024"
+ And Admin adds capitalized income with "AUTOPAY" payment type to the loan on "10 January 2024" with "150" EUR transaction amount
+ When Admin sets the business date to "15 January 2024"
+ And Admin adds capitalized income with "AUTOPAY" payment type to the loan on "15 January 2024" with "200" EUR transaction amount
+ Then Loan has 1466.08 outstanding amount
+ # Overpay the loan
+ When Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on "15 January 2024" with 1500 EUR transaction amount and system-generated Idempotency key
+ Then Loan status will be "OVERPAID"
+ And Loan Transactions tab has the following data:
+ | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted |
+ | 01 January 2024 | Disbursement | 1000.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1000.0 | false |
+ | 05 January 2024 | Capitalized Income | 100.0 | 100.0 | 0.0 | 0.0 | 0.0 | 1100.0 | false |
+ | 10 January 2024 | Capitalized Income | 150.0 | 150.0 | 0.0 | 0.0 | 0.0 | 1250.0 | false |
+ | 15 January 2024 | Capitalized Income | 200.0 | 200.0 | 0.0 | 0.0 | 0.0 | 1450.0 | false |
+ | 15 January 2024 | Repayment | 1500.0 | 1450.0 | 2.96 | 0.0 | 0.0 | 0.0 | false |
+ | 15 January 2024 | Accrual | 2.96 | 0.0 | 2.96 | 0.0 | 0.0 | 0.0 | false |
+ | 15 January 2024 | Capitalized Income Amortization | 450.0 | 0.0 | 450.0 | 0.0 | 0.0 | 0.0 | false |
+ # Undo middle capitalized income transaction
+ When Customer undo "1"th "Capitalized Income" transaction made on "10 January 2024"
+ Then Loan Transactions tab has the following data:
+ | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed |
+ | 01 January 2024 | Disbursement | 1000.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1000.0 | false | false |
+ | 05 January 2024 | Capitalized Income | 100.0 | 100.0 | 0.0 | 0.0 | 0.0 | 1100.0 | false | false |
+ | 10 January 2024 | Capitalized Income | 150.0 | 150.0 | 0.0 | 0.0 | 0.0 | 1250.0 | true | false |
+ | 15 January 2024 | Capitalized Income | 200.0 | 200.0 | 0.0 | 0.0 | 0.0 | 1300.0 | false | false |
+ | 15 January 2024 | Accrual | 2.96 | 0.0 | 2.96 | 0.0 | 0.0 | 0.0 | false | false |
+ | 15 January 2024 | Capitalized Income Amortization | 450.0 | 0.0 | 450.0 | 0.0 | 0.0 | 0.0 | false | false |
+ | 15 January 2024 | Repayment | 1500.0 | 1300.0 | 2.82 | 0.0 | 0.0 | 0.0 | false | true |
+ | 15 January 2024 | Capitalized Income Amortization Adjustment | 150.0 | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | false | false |
+ | 15 January 2024 | Accrual Adjustment | 0.14 | 0.0 | 0.14 | 0.0 | 0.0 | 0.0 | false | false |
+ Then Loan status will be "OVERPAID"
+ Then Loan has 197.18 overpaid amount
+
+ @TestRailId:C3740
+ Scenario: Verify capitalized income reversal with partial repayment when loan transitions from active to overpaid state
+ When Admin sets the business date to "1 January 2024"
+ 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 2024 | 1800 | 7 | DECLINING_BALANCE | DAILY | EQUAL_INSTALLMENTS | 3 | MONTHS | 1 | MONTHS | 3 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION |
+ And Admin successfully approves the loan on "1 January 2024" with "1800" amount and expected disbursement date on "1 January 2024"
+ And Admin successfully disburse the loan on "1 January 2024" with "1000" EUR transaction amount
+ Then Loan status will be "ACTIVE"
+ When Admin sets the business date to "5 January 2024"
+ And Admin adds capitalized income with "AUTOPAY" payment type to the loan on "5 January 2024" with "500" EUR transaction amount
+ Then Loan has 1517.15 outstanding amount
+ # Partial payment
+ When Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on "5 January 2024" with 1200 EUR transaction amount and system-generated Idempotency key
+ Then Loan status will be "ACTIVE"
+ And Loan has 305.78 outstanding amount
+ # Undo capitalized income - this should cause overpayment
+ When Customer undo "1"th "Capitalized Income" transaction made on "05 January 2024"
+ Then Loan status will be "OVERPAID"
+ And Loan Transactions tab has the following data:
+ | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed |
+ | 01 January 2024 | Disbursement | 1000.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1000.0 | false | false |
+ | 05 January 2024 | Capitalized Income | 500.0 | 500.0 | 0.0 | 0.0 | 0.0 | 1500.0 | true | false |
+ | 05 January 2024 | Repayment | 1200.0 | 1000.0 | 0.75 | 0.0 | 0.0 | 0.0 | false | true |
+ | 05 January 2024 | Accrual | 0.75 | 0.0 | 0.75 | 0.0 | 0.0 | 0.0 | false | false |
+ And Loan has 0.0 outstanding amount
+ And Loan has 199.25 overpaid amount
+
+ @TestRailId:C3741
+ Scenario: Verify backdated disbursement with capitalized income and overpayment reverse-replay
+ When Admin sets the business date to "1 January 2024"
+ 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_MULTIDISBURSAL_CAPITALIZED_INCOME | 01 January 2024 | 1200 | 7 | DECLINING_BALANCE | DAILY | EQUAL_INSTALLMENTS | 3 | MONTHS | 1 | MONTHS | 3 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION |
+ And Admin successfully approves the loan on "1 January 2024" with "1200" amount and expected disbursement date on "1 January 2024"
+ And Admin successfully disburse the loan on "1 January 2024" with "500" EUR transaction amount
+ Then Loan status will be "ACTIVE"
+ When Admin sets the business date to "10 January 2024"
+ And Admin adds capitalized income with "AUTOPAY" payment type to the loan on "10 January 2024" with "200" EUR transaction amount
+ # Overpay current balance
+ When Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on "10 January 2024" with 750 EUR transaction amount and system-generated Idempotency key
+ Then Loan status will be "OVERPAID"
+ And Loan Transactions tab has the following data:
+ | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted |
+ | 01 January 2024 | Disbursement | 500.0 | 0.0 | 0.0 | 0.0 | 0.0 | 500.0 | false |
+ | 10 January 2024 | Capitalized Income | 200.0 | 200.0 | 0.0 | 0.0 | 0.0 | 700.0 | false |
+ | 10 January 2024 | Repayment | 750.0 | 700.0 | 0.85 | 0.0 | 0.0 | 0.0 | false |
+ | 10 January 2024 | Accrual | 0.85 | 0.0 | 0.85 | 0.0 | 0.0 | 0.0 | false |
+ | 10 January 2024 | Capitalized Income Amortization | 200.0 | 0.0 | 200.0 | 0.0 | 0.0 | 0.0 | false |
+ # Backdated disbursement should trigger reverse-replay
+ When Admin successfully disburse the loan on "5 January 2024" with "300" EUR transaction amount
+ Then Loan status will be "ACTIVE"
+ And Loan Transactions tab has the following data:
+ | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed |
+ | 01 January 2024 | Disbursement | 500.0 | 0.0 | 0.0 | 0.0 | 0.0 | 500.0 | false | false |
+ | 05 January 2024 | Disbursement | 300.0 | 0.0 | 0.0 | 0.0 | 0.0 | 800.0 | false | true |
+ | 10 January 2024 | Capitalized Income | 200.0 | 200.0 | 0.0 | 0.0 | 0.0 | 1000.0 | false | false |
+ | 10 January 2024 | Accrual | 0.85 | 0.0 | 0.85 | 0.0 | 0.0 | 0.0 | false | false |
+ | 10 January 2024 | Capitalized Income Amortization | 200.0 | 0.0 | 200.0 | 0.0 | 0.0 | 0.0 | false | false |
+ | 10 January 2024 | Repayment | 750.0 | 748.87 | 1.13 | 0.0 | 0.0 | 251.13 | false | true |
+ And Loan has 255.09 outstanding amount
+
+ @TestRailId:C3742
+ Scenario: Verify capitalized income amortization reversal when multiple payments create complex overpayment scenario
+ When Admin sets the business date to "1 January 2024"
+ 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 2024 | 2000 | 7 | DECLINING_BALANCE | DAILY | EQUAL_INSTALLMENTS | 3 | MONTHS | 1 | MONTHS | 3 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION |
+ And Admin successfully approves the loan on "1 January 2024" with "2000" amount and expected disbursement date on "1 January 2024"
+ And Admin successfully disburse the loan on "1 January 2024" with "1500" EUR transaction amount
+ Then Loan status will be "ACTIVE"
+ When Admin sets the business date to "5 January 2024"
+ And Admin adds capitalized income with "AUTOPAY" payment type to the loan on "5 January 2024" with "300" EUR transaction amount
+ # First partial payment
+ When Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on "5 January 2024" with 900 EUR transaction amount and system-generated Idempotency key
+ Then Loan status will be "ACTIVE"
+ When Admin sets the business date to "8 January 2024"
+ And Admin adds capitalized income with "AUTOPAY" payment type to the loan on "8 January 2024" with "200" EUR transaction amount
+ # Second payment that causes overpayment
+ When Customer makes "REPAYMENT" transaction with "AUTOPAY" payment type on "8 January 2024" with 1200 EUR transaction amount and system-generated Idempotency key
+ Then Loan status will be "OVERPAID"
+ And Loan Transactions tab has the following data:
+ | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted |
+ | 01 January 2024 | Disbursement | 1500.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1500.0 | false |
+ | 05 January 2024 | Capitalized Income | 300.0 | 300.0 | 0.0 | 0.0 | 0.0 | 1800.0 | false |
+ | 05 January 2024 | Repayment | 900.0 | 898.87 | 1.13 | 0.0 | 0.0 | 901.13 | false |
+ | 08 January 2024 | Capitalized Income | 200.0 | 200.0 | 0.0 | 0.0 | 0.0 | 1101.13 | false |
+ | 08 January 2024 | Repayment | 1200.0 | 1101.13 | 0.51 | 0.0 | 0.0 | 0.0 | false |
+ | 08 January 2024 | Accrual | 1.64 | 0.0 | 1.64 | 0.0 | 0.0 | 0.0 | false |
+ | 08 January 2024 | Capitalized Income Amortization | 500.0 | 0.0 | 500.0 | 0.0 | 0.0 | 0.0 | false |
+ # Undo first capitalized income
+ When Customer undo "1"th "Capitalized Income" transaction made on "05 January 2024"
+ Then Loan Transactions tab has the following data:
+ | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed |
+ | 01 January 2024 | Disbursement | 1500.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1500.0 | false | false |
+ | 05 January 2024 | Capitalized Income | 300.0 | 300.0 | 0.0 | 0.0 | 0.0 | 1800.0 | true | false |
+ | 05 January 2024 | Repayment | 900.0 | 898.87 | 1.13 | 0.0 | 0.0 | 601.13 | false | false |
+ | 08 January 2024 | Capitalized Income | 200.0 | 200.0 | 0.0 | 0.0 | 0.0 | 801.13 | false | false |
+ | 08 January 2024 | Accrual | 1.64 | 0.0 | 1.64 | 0.0 | 0.0 | 0.0 | false | false |
+ | 08 January 2024 | Capitalized Income Amortization | 500.0 | 0.0 | 500.0 | 0.0 | 0.0 | 0.0 | false | false |
+ | 08 January 2024 | Repayment | 1200.0 | 801.13 | 0.34 | 0.0 | 0.0 | 0.0 | false | true |
+ | 08 January 2024 | Capitalized Income Amortization Adjustment | 300.0 | 0.0 | 300.0 | 0.0 | 0.0 | 0.0 | false | false |
+ | 08 January 2024 | Accrual Adjustment | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false |
+ And Loan has 0.0 outstanding amount
+ And Loan has 398.53 overpaid amount
\ No newline at end of file
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCapitalizedIncomeTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCapitalizedIncomeTest.java
index eecb08bac6..88e6750325 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCapitalizedIncomeTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCapitalizedIncomeTest.java
@@ -685,7 +685,6 @@ public class LoanCapitalizedIncomeTest extends BaseLoanIntegrationTest {
});
}
-
@Test
public void testOverpaymentAmountWhenCapitalizedIncomeTransactionsAreReversed() {
final AtomicReference<Long> loanIdRef = new AtomicReference<>();