From bb0bdb9670afa953fbfc212a6f3e5d499d42b233 Mon Sep 17 00:00:00 2001 From: Peter Kovacs Date: Tue, 29 Apr 2025 08:58:52 +0200 Subject: [PATCH] FINERACT-2210: fix previously refunded interest calculation during interest refund - E2E test --- .../data/loanproduct/DefaultLoanProduct.java | 1 + .../LoanProductGlobalInitializerStep.java | 28 +++++ .../fineract/test/support/TestContextKey.java | 1 + .../resources/features/EMICalculation.feature | 107 ++++++++++++++++++ 4 files changed, 137 insertions(+) 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 b7ebe1f9d..e5e1d4d0d 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 @@ -84,6 +84,7 @@ public enum DefaultLoanProduct implements LoanProduct { LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_WHOLE_TERM, // LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_IR_DAILY_TILL_PRECLOSE_LAST_INSTALLMENT_STRATEGY, // LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION, // + LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION_MULTIDISB, // LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR, // LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF, // LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR, // 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 c2fed3282..b2b8f492e 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 @@ -1024,6 +1024,34 @@ public class LoanProductGlobalInitializerStep implements FineractGlobalInitializ TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION, responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundInterestRecalculation); + // LP2 with progressive loan schedule + horizontal + interest EMI + actual/actual + interest refund with + // Merchant issued and Payment refund + interest recalculation + Multidisbursement + // (LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION_MULTIDISB) + String name97 = DefaultLoanProduct.LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION_MULTIDISB + .getName(); + PostLoanProductsRequest loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundRecalculationMultiDisb = loanProductsRequestFactory + .defaultLoanProductsRequestLP2Emi()// + .isInterestRecalculationEnabled(true)// + .preClosureInterestCalculationStrategy(1)// + .rescheduleStrategyMethod(4)// + .interestRecalculationCompoundingMethod(0)// + .recalculationRestFrequencyType(2)// + .recalculationRestFrequencyInterval(1)// + .name(name97)// + .multiDisburseLoan(true)// + .disallowExpectedDisbursements(true)// + .maxTrancheCount(10)// + .outstandingLoanBalance(10000.0)// + .supportedInterestRefundTypes(Arrays.asList("MERCHANT_ISSUED_REFUND", "PAYOUT_REFUND"))// + .paymentAllocation(List.of(// + createPaymentAllocation("DEFAULT", "NEXT_INSTALLMENT")));// + Response responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundInterestRecalculationMultidisb = loanProductsApi + .createLoanProduct(loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundRecalculationMultiDisb) + .execute(); + TestContext.INSTANCE.set( + TestContextKey.DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION_MULTIDISB, + responseLoanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundInterestRecalculationMultidisb); + // LP2 with progressive loan schedule + horizontal + interest EMI + 360/30 + multidisbursement + downpayment + // interest recalculation // 25%, auto disabled 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 2f2a26e22..a8c1b73c9 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 @@ -117,6 +117,7 @@ public abstract class TestContextKey { public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP1_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL = "loanProductCreateResponseLP1ProgressiveLoanScheduleHorizontal"; public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_360_30_INTEREST_RECALCULATION_DAILY_TILL_PRECLOSE_WHOLE_TERM = "loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmi36030InterestRecalculationSameAsRepTillPreCloseWholeTerm"; public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION = "loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmiActualActualInterestRefundFInterestRecalculation"; + public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_EMI_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION_MULTIDISB = "loanProductCreateResponseLP2AdvancedPaymentInterestDailyEmiActualActualInterestRefundFInterestRecalculationMultiDisb"; public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR = "loanProductCreateResponseLP2AdvancedPaymentInterestDailyInterestRecalculationZeroInterestChargeOffBehaviour"; public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_INTEREST_DAILY_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF = "loanProductCreateResponseLP2AdvancedPaymentInterestDailyInterestRecalculationZeroInterestChargeOff"; public static final String DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_BEHAVIOUR = "loanProductCreateResponseLP2AdvancedPaymentZeroInterestChargeOffBehaviour"; 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 ba2689467..fa24470bc 100644 --- a/fineract-e2e-tests-runner/src/test/resources/features/EMICalculation.feature +++ b/fineract-e2e-tests-runner/src/test/resources/features/EMICalculation.feature @@ -7890,3 +7890,110 @@ Feature: EMI calculation and repayment schedule checks for interest bearing loan And Loan Repayment schedule has the following data in Total row: | 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: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" + 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_ACTUAL_ACTUAL_INTEREST_REFUND_INTEREST_RECALCULATION_MULTIDISB | 05 April 2025 | 300 | 20.99 | DECLINING_BALANCE | DAILY | EQUAL_INSTALLMENTS | 6 | MONTHS | 1 | MONTHS | 6 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION | + And Admin successfully approves the loan on "05 April 2025" with "300" amount and expected disbursement date on "05 April 2025" + And Admin successfully disburse the loan on "05 April 2025" with "265.91" EUR transaction amount + And Admin successfully disburse the loan on "05 April 2025" with "1.99" EUR transaction amount + And Admin successfully disburse the loan on "05 April 2025" with "20.0" 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 | + | | | 05 April 2025 | | 265.91 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 05 April 2025 | | 1.99 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 05 April 2025 | | 20.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 30 | 05 May 2025 | | 241.9 | 46.0 | 4.97 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 2 | 31 | 05 June 2025 | | 195.24 | 46.66 | 4.31 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 3 | 30 | 05 July 2025 | | 147.64 | 47.6 | 3.37 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 4 | 31 | 05 August 2025 | | 99.3 | 48.34 | 2.63 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 5 | 31 | 05 September 2025 | | 50.1 | 49.2 | 1.77 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 6 | 30 | 05 October 2025 | | 0.0 | 50.1 | 0.86 | 0.0 | 0.0 | 50.96 | 0.0 | 0.0 | 0.0 | 50.96 | + And Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 287.9 | 17.91 | 0.0 | 0.0 | 305.81 | 0.0 | 0.0 | 0.0 | 305.81 | + And Loan Transactions tab has the following data: + | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed | + | 05 April 2025 | Disbursement | 265.91 | 0.0 | 0.0 | 0.0 | 0.0 | 265.91 | false | false | + | 05 April 2025 | Disbursement | 1.99 | 0.0 | 0.0 | 0.0 | 0.0 | 267.9 | false | false | + | 05 April 2025 | Disbursement | 20.0 | 0.0 | 0.0 | 0.0 | 0.0 | 287.9 | false | false | + When Admin sets the business date to "06 April 2025" + And Customer makes "MERCHANT_ISSUED_REFUND" transaction with "AUTOPAY" payment type on "06 April 2025" with 6.29 EUR transaction amount and system-generated Idempotency key + And 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 | + | | | 05 April 2025 | | 265.91 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 05 April 2025 | | 1.99 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 05 April 2025 | | 20.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 30 | 05 May 2025 | | 241.79 | 46.11 | 4.86 | 0.0 | 0.0 | 50.97 | 6.3 | 6.3 | 0.0 | 44.67 | + | 2 | 31 | 05 June 2025 | | 195.13 | 46.66 | 4.31 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 3 | 30 | 05 July 2025 | | 147.53 | 47.6 | 3.37 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 4 | 31 | 05 August 2025 | | 99.19 | 48.34 | 2.63 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 5 | 31 | 05 September 2025 | | 49.99 | 49.2 | 1.77 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 6 | 30 | 05 October 2025 | | 0.0 | 49.99 | 0.86 | 0.0 | 0.0 | 50.85 | 0.0 | 0.0 | 0.0 | 50.85 | + And Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 287.9 | 17.8 | 0.0 | 0.0 | 305.7 | 6.3 | 6.3 | 0.0 | 299.4 | + And Loan Transactions tab has the following data: + | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed | + | 05 April 2025 | Disbursement | 265.91 | 0.0 | 0.0 | 0.0 | 0.0 | 265.91 | false | false | + | 05 April 2025 | Disbursement | 1.99 | 0.0 | 0.0 | 0.0 | 0.0 | 267.9 | false | false | + | 05 April 2025 | Disbursement | 20.0 | 0.0 | 0.0 | 0.0 | 0.0 | 287.9 | false | false | + | 06 April 2025 | Merchant Issued Refund | 6.29 | 6.29 | 0.0 | 0.0 | 0.0 | 281.61 | false | false | + | 06 April 2025 | Interest Refund | 0.01 | 0.01 | 0.0 | 0.0 | 0.0 | 281.6 | false | false | + When Admin sets the business date to "07 April 2025" + And Customer makes "MERCHANT_ISSUED_REFUND" transaction with "AUTOPAY" payment type on "07 April 2025" with 1.99 EUR transaction amount and system-generated Idempotency key + And 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 | + | | | 05 April 2025 | | 265.91 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 05 April 2025 | | 1.99 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 05 April 2025 | | 20.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 30 | 05 May 2025 | | 241.76 | 46.14 | 4.83 | 0.0 | 0.0 | 50.97 | 8.29 | 8.29 | 0.0 | 42.68 | + | 2 | 31 | 05 June 2025 | | 195.1 | 46.66 | 4.31 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 3 | 30 | 05 July 2025 | | 147.5 | 47.6 | 3.37 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 4 | 31 | 05 August 2025 | | 99.16 | 48.34 | 2.63 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 5 | 31 | 05 September 2025 | | 49.96 | 49.2 | 1.77 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 6 | 30 | 05 October 2025 | | 0.0 | 49.96 | 0.86 | 0.0 | 0.0 | 50.82 | 0.0 | 0.0 | 0.0 | 50.82 | + And Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 287.9 | 17.77 | 0.0 | 0.0 | 305.67 | 8.29 | 8.29 | 0.0 | 297.38 | + And Loan Transactions tab has the following data: + | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed | + | 05 April 2025 | Disbursement | 265.91 | 0.0 | 0.0 | 0.0 | 0.0 | 265.91 | false | false | + | 05 April 2025 | Disbursement | 1.99 | 0.0 | 0.0 | 0.0 | 0.0 | 267.9 | false | false | + | 05 April 2025 | Disbursement | 20.0 | 0.0 | 0.0 | 0.0 | 0.0 | 287.9 | false | false | + | 06 April 2025 | Merchant Issued Refund | 6.29 | 6.29 | 0.0 | 0.0 | 0.0 | 281.61 | false | false | + | 06 April 2025 | Interest Refund | 0.01 | 0.01 | 0.0 | 0.0 | 0.0 | 281.6 | false | false | + | 06 April 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 07 April 2025 | Merchant Issued Refund | 1.99 | 1.99 | 0.0 | 0.0 | 0.0 | 279.61 | false | false | + When Admin sets the business date to "08 April 2025" + And 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 | + | | | 05 April 2025 | | 265.91 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 05 April 2025 | | 1.99 | | | 0.0 | | 0.0 | 0.0 | | | | + | | | 05 April 2025 | | 20.0 | | | 0.0 | | 0.0 | 0.0 | | | | + | 1 | 30 | 05 May 2025 | | 241.76 | 46.14 | 4.83 | 0.0 | 0.0 | 50.97 | 8.29 | 8.29 | 0.0 | 42.68 | + | 2 | 31 | 05 June 2025 | | 195.1 | 46.66 | 4.31 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 3 | 30 | 05 July 2025 | | 147.5 | 47.6 | 3.37 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 4 | 31 | 05 August 2025 | | 99.16 | 48.34 | 2.63 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 5 | 31 | 05 September 2025 | | 49.96 | 49.2 | 1.77 | 0.0 | 0.0 | 50.97 | 0.0 | 0.0 | 0.0 | 50.97 | + | 6 | 30 | 05 October 2025 | | 0.0 | 49.96 | 0.86 | 0.0 | 0.0 | 50.82 | 0.0 | 0.0 | 0.0 | 50.82 | + And Loan Repayment schedule has the following data in Total row: + | Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding | + | 287.9 | 17.77 | 0.0 | 0.0 | 305.67 | 8.29 | 8.29 | 0.0 | 297.38 | + And Loan Transactions tab has the following data: + | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed | + | 05 April 2025 | Disbursement | 265.91 | 0.0 | 0.0 | 0.0 | 0.0 | 265.91 | false | false | + | 05 April 2025 | Disbursement | 1.99 | 0.0 | 0.0 | 0.0 | 0.0 | 267.9 | false | false | + | 05 April 2025 | Disbursement | 20.0 | 0.0 | 0.0 | 0.0 | 0.0 | 287.9 | false | false | + | 06 April 2025 | Merchant Issued Refund | 6.29 | 6.29 | 0.0 | 0.0 | 0.0 | 281.61 | false | false | + | 06 April 2025 | Interest Refund | 0.01 | 0.01 | 0.0 | 0.0 | 0.0 | 281.6 | false | false | + | 06 April 2025 | Accrual | 0.17 | 0.0 | 0.17 | 0.0 | 0.0 | 0.0 | false | false | + | 07 April 2025 | Merchant Issued Refund | 1.99 | 1.99 | 0.0 | 0.0 | 0.0 | 279.61 | false | false | + | 07 April 2025 | Accrual | 0.16 | 0.0 | 0.16 | 0.0 | 0.0 | 0.0 | false | false |