FINERACT-2124: Fix final income accrual calculation with multiple fee charges

This commit is contained in:
mariiaKraievska
2025-08-05 13:46:22 +02:00
committed by Adam Saghy
parent 68f20c29e9
commit 0daf42ec33
6 changed files with 328 additions and 3 deletions
@@ -7486,3 +7486,294 @@ Feature: LoanCharge
| Name | isPenalty | Payment due at | Due as of | Calculation type | Due | Paid | Waived | Outstanding |
| Installment flat fee | false | Installment Fee | | Flat | 60.0 | 20.0 | 0.0 | 40.0 |
| Installment percentage interest fee | false | Installment Fee | | % Interest | 0.17 | 0.05 | 0.0 | 0.12 |
@TestRailId:C3890
Scenario: Cumulative loan - Verify final income accrual with multiple fee charges created successfully
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_DOWNPAYMENT | 01 October 2023 | 100 | 0 | DECLINING_BALANCE | SAME_AS_REPAYMENT_PERIOD | EQUAL_INSTALLMENTS | 6 | MONTHS | 1 | MONTHS | 6 | 0 | 0 | 0 | DUE_PENALTY_INTEREST_PRINCIPAL_FEE_IN_ADVANCE_PENALTY_INTEREST_PRINCIPAL_FEE |
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
When Admin adds "LOAN_SNOOZE_FEE" due date charge with "06 April 2024" due date and 50 EUR transaction amount
When Admin adds "LOAN_SNOOZE_FEE" due date charge with "06 April 2024" due date and 35 EUR transaction amount
When Admin adds "LOAN_FIXED_RETURNED_PAYMENT_FEE" due date charge with "06 April 2024" due date and 10 EUR transaction amount
When Admin adds "LOAN_FIXED_RETURNED_PAYMENT_FEE" due date charge with "10 April 2024" due date and 5 EUR transaction amount
When Admin adds "LOAN_INSTALLMENT_FEE_FLAT" installment charge with 10 amount
Then Loan Repayment schedule has 7 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 | 0 | 01 January 2024 | | 75.0 | 25.0 | 0.0 | 0.0 | 0.0 | 25.0 | 0.0 | 0.0 | 0.0 | 25.0 |
| 2 | 31 | 01 February 2024 | | 63.0 | 12.0 | 0.0 | 10.0 | 0.0 | 22.0 | 0.0 | 0.0 | 0.0 | 22.0 |
| 3 | 29 | 01 March 2024 | | 51.0 | 12.0 | 0.0 | 10.0 | 0.0 | 22.0 | 0.0 | 0.0 | 0.0 | 22.0 |
| 4 | 31 | 01 April 2024 | | 39.0 | 12.0 | 0.0 | 10.0 | 0.0 | 22.0 | 0.0 | 0.0 | 0.0 | 22.0 |
| 5 | 30 | 01 May 2024 | | 27.0 | 12.0 | 0.0 | 110.0 | 0.0 | 122.0 | 0.0 | 0.0 | 0.0 | 122.0 |
| 6 | 31 | 01 June 2024 | | 15.0 | 12.0 | 0.0 | 10.0 | 0.0 | 22.0 | 0.0 | 0.0 | 0.0 | 22.0 |
| 7 | 30 | 01 July 2024 | | 0.0 | 15.0 | 0.0 | 10.0 | 0.0 | 25.0 | 0.0 | 0.0 | 0.0 | 25.0 |
Then Loan Repayment schedule has the following data in Total row:
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
| 100.0 | 0.0 | 160.0 | 0.0 | 260.0 | 0.0 | 0.0 | 0.0 | 260.0 |
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 | 100.0 | 0.0 | 0.0 | 0.0 | 0.0 | 100.0 | false | false |
Then Loan Charges tab has the following data:
| Name | isPenalty | Payment due at | Due as of | Calculation type | Due | Paid | Waived | Outstanding |
| Installment flat fee | false | Installment Fee | | Flat | 60.0 | 0.0 | 0.0 | 60.0 |
| Snooze fee | false | Specified due date | 06 April 2024 | Flat | 50.0 | 0.0 | 0.0 | 50.0 |
| Snooze fee | false | Specified due date | 06 April 2024 | Flat | 35.0 | 0.0 | 0.0 | 35.0 |
| Fixed Returned payment fee | false | Specified due date | 06 April 2024 | Flat | 10.0 | 0.0 | 0.0 | 10.0 |
| Fixed Returned payment fee | false | Specified due date | 10 April 2024 | Flat | 5.0 | 0.0 | 0.0 | 5.0 |
When Admin sets the business date to "02 January 2024"
When Admin runs inline COB job for Loan
When Admin sets the business date to "03 March 2024"
When Admin runs inline COB job for Loan
And Customer makes "AUTOPAY" repayment on "03 March 2024" with 260.0 EUR transaction amount
Then Loan Repayment schedule has 7 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 | 0 | 01 January 2024 | 03 March 2024 | 75.0 | 25.0 | 0.0 | 0.0 | 0.0 | 25.0 | 25.0 | 0.0 | 25.0 | 0.0 |
| 2 | 31 | 01 February 2024 | 03 March 2024 | 63.0 | 12.0 | 0.0 | 10.0 | 0.0 | 22.0 | 22.0 | 0.0 | 22.0 | 0.0 |
| 3 | 29 | 01 March 2024 | 03 March 2024 | 51.0 | 12.0 | 0.0 | 10.0 | 0.0 | 22.0 | 22.0 | 0.0 | 22.0 | 0.0 |
| 4 | 31 | 01 April 2024 | 03 March 2024 | 39.0 | 12.0 | 0.0 | 10.0 | 0.0 | 22.0 | 22.0 | 22.0 | 0.0 | 0.0 |
| 5 | 30 | 01 May 2024 | 03 March 2024 | 27.0 | 12.0 | 0.0 | 110.0 | 0.0 | 122.0 | 122.0 | 122.0 | 0.0 | 0.0 |
| 6 | 31 | 01 June 2024 | 03 March 2024 | 15.0 | 12.0 | 0.0 | 10.0 | 0.0 | 22.0 | 22.0 | 22.0 | 0.0 | 0.0 |
| 7 | 30 | 01 July 2024 | 03 March 2024 | 0.0 | 15.0 | 0.0 | 10.0 | 0.0 | 25.0 | 25.0 | 25.0 | 0.0 | 0.0 |
Then Loan Repayment schedule has the following data in Total row:
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
| 100.0 | 0.0 | 160.0 | 0.0 | 260.0 | 260.0 | 191.0 | 69.0 | 0.0 |
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 | 100.0 | 0.0 | 0.0 | 0.0 | 0.0 | 100.0 | false | false |
| 01 February 2024 | Accrual | 10.0 | 0.0 | 0.0 | 10.0 | 0.0 | 0.0 | false | false |
| 01 March 2024 | Accrual | 10.0 | 0.0 | 0.0 | 10.0 | 0.0 | 0.0 | false | false |
| 03 March 2024 | Repayment | 260.0 | 100.0 | 0.0 | 160.0 | 0.0 | 0.0 | false | false |
| 03 March 2024 | Accrual | 140.0 | 0.0 | 0.0 | 140.0 | 0.0 | 0.0 | false | false |
Then Loan Charges tab has the following data:
| Name | isPenalty | Payment due at | Due as of | Calculation type | Due | Paid | Waived | Outstanding |
| Installment flat fee | false | Installment Fee | | Flat | 60.0 | 60.0 | 0.0 | 0.0 |
| Snooze fee | false | Specified due date | 06 April 2024 | Flat | 50.0 | 50.0 | 0.0 | 0.0 |
| Snooze fee | false | Specified due date | 06 April 2024 | Flat | 35.0 | 35.0 | 0.0 | 0.0 |
| Fixed Returned payment fee | false | Specified due date | 06 April 2024 | Flat | 10.0 | 10.0 | 0.0 | 0.0 |
| Fixed Returned payment fee | false | Specified due date | 10 April 2024 | Flat | 5.0 | 5.0 | 0.0 | 0.0 |
@TestRailId:C3891
Scenario: Progressive loan - Verify final income accrual with multiple fee charges created successfully
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_INTEREST_DAILY_EMI_360_30 | 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
When Admin adds "LOAN_SNOOZE_FEE" due date charge with "06 April 2024" due date and 50 EUR transaction amount
When Admin adds "LOAN_SNOOZE_FEE" due date charge with "06 April 2024" due date and 35 EUR transaction amount
When Admin adds "LOAN_FIXED_RETURNED_PAYMENT_FEE" due date charge with "06 April 2024" due date and 10 EUR transaction amount
When Admin adds "LOAN_FIXED_RETURNED_PAYMENT_FEE" due date charge with "10 April 2024" due date and 5 EUR transaction amount
When Admin adds "LOAN_INSTALLMENT_FEE_FLAT" installment charge with 10 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 | 10.0 | 0.0 | 27.01 | 0.0 | 0.0 | 0.0 | 27.01 |
| 2 | 29 | 01 March 2024 | | 67.05 | 16.52 | 0.49 | 10.0 | 0.0 | 27.01 | 0.0 | 0.0 | 0.0 | 27.01 |
| 3 | 31 | 01 April 2024 | | 50.43 | 16.62 | 0.39 | 10.0 | 0.0 | 27.01 | 0.0 | 0.0 | 0.0 | 27.01 |
| 4 | 30 | 01 May 2024 | | 33.71 | 16.72 | 0.29 | 110.0 | 0.0 | 127.01 | 0.0 | 0.0 | 0.0 | 127.01 |
| 5 | 31 | 01 June 2024 | | 16.9 | 16.81 | 0.2 | 10.0 | 0.0 | 27.01 | 0.0 | 0.0 | 0.0 | 27.01 |
| 6 | 30 | 01 July 2024 | | 0.0 | 16.9 | 0.1 | 10.0 | 0.0 | 27.0 | 0.0 | 0.0 | 0.0 | 27.0 |
Then Loan Repayment schedule has the following data in Total row:
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
| 100.0 | 2.05 | 160.0 | 0.0 | 262.05 | 0.0 | 0.0 | 0.0 | 262.05 |
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 | 100.0 | 0.0 | 0.0 | 0.0 | 0.0 | 100.0 | false | false |
Then Loan Charges tab has the following data:
| Name | isPenalty | Payment due at | Due as of | Calculation type | Due | Paid | Waived | Outstanding |
| Installment flat fee | false | Installment Fee | | Flat | 60.0 | 0.0 | 0.0 | 60.0 |
| Snooze fee | false | Specified due date | 06 April 2024 | Flat | 50.0 | 0.0 | 0.0 | 50.0 |
| Snooze fee | false | Specified due date | 06 April 2024 | Flat | 35.0 | 0.0 | 0.0 | 35.0 |
| Fixed Returned payment fee | false | Specified due date | 06 April 2024 | Flat | 10.0 | 0.0 | 0.0 | 10.0 |
| Fixed Returned payment fee | false | Specified due date | 10 April 2024 | Flat | 5.0 | 0.0 | 0.0 | 5.0 |
When Admin sets the business date to "02 January 2024"
When Admin runs inline COB job for Loan
When Admin sets the business date to "03 March 2024"
When Admin runs inline COB job for Loan
And Customer makes "AUTOPAY" repayment on "03 March 2024" with 262.05 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 | 03 March 2024 | 83.57 | 16.43 | 0.58 | 10.0 | 0.0 | 27.01 | 27.01 | 0.0 | 27.01 | 0.0 |
| 2 | 29 | 01 March 2024 | 03 March 2024 | 67.05 | 16.52 | 0.49 | 10.0 | 0.0 | 27.01 | 27.01 | 0.0 | 27.01 | 0.0 |
| 3 | 31 | 01 April 2024 | 03 March 2024 | 50.43 | 16.62 | 0.39 | 10.0 | 0.0 | 27.01 | 27.01 | 27.01 | 0.0 | 0.0 |
| 4 | 30 | 01 May 2024 | 03 March 2024 | 33.71 | 16.72 | 0.29 | 110.0 | 0.0 | 127.01 | 127.01 | 127.01 | 0.0 | 0.0 |
| 5 | 31 | 01 June 2024 | 03 March 2024 | 16.9 | 16.81 | 0.2 | 10.0 | 0.0 | 27.01 | 27.01 | 27.01 | 0.0 | 0.0 |
| 6 | 30 | 01 July 2024 | 03 March 2024 | 0.0 | 16.9 | 0.1 | 10.0 | 0.0 | 27.0 | 27.0 | 27.0 | 0.0 | 0.0 |
Then Loan Repayment schedule has the following data in Total row:
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
| 100.0 | 2.05 | 160.0 | 0.0 | 262.05 | 262.05 | 208.03 | 54.02 | 0.0 |
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 | 100.0 | 0.0 | 0.0 | 0.0 | 0.0 | 100.0 | false | false |
| 02 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 03 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 04 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 05 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 06 January 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 07 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 08 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 09 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 10 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 11 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 12 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 13 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 14 January 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 15 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 16 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 17 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 18 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 19 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 20 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 21 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 22 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 23 January 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 24 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 25 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 26 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 27 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 28 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 29 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 30 January 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 31 January 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 01 February 2024 | Accrual | 10.02 | 0.0 | 0.02 | 10.0 | 0.0 | 0.0 | false | false |
| 02 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 03 February 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 04 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 05 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 06 February 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 07 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 08 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 09 February 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 10 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 11 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 12 February 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 13 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 14 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 15 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 16 February 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 17 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 18 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 19 February 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 20 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 21 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 22 February 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 23 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 24 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 25 February 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 26 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 27 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 28 February 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 29 February 2024 | Accrual | 0.02 | 0.0 | 0.02 | 0.0 | 0.0 | 0.0 | false | false |
| 01 March 2024 | Accrual | 10.02 | 0.0 | 0.02 | 10.0 | 0.0 | 0.0 | false | false |
| 02 March 2024 | Accrual | 0.01 | 0.0 | 0.01 | 0.0 | 0.0 | 0.0 | false | false |
| 03 March 2024 | Repayment | 262.05 | 100.0 | 2.05 | 160.0 | 0.0 | 0.0 | false | false |
| 03 March 2024 | Accrual | 140.97 | 0.0 | 0.97 | 140.0 | 0.0 | 0.0 | false | false |
Then Loan Charges tab has the following data:
| Name | isPenalty | Payment due at | Due as of | Calculation type | Due | Paid | Waived | Outstanding |
| Installment flat fee | false | Installment Fee | | Flat | 60.0 | 60.0 | 0.0 | 0.0 |
| Snooze fee | false | Specified due date | 06 April 2024 | Flat | 50.0 | 50.0 | 0.0 | 0.0 |
| Snooze fee | false | Specified due date | 06 April 2024 | Flat | 35.0 | 35.0 | 0.0 | 0.0 |
| Fixed Returned payment fee | false | Specified due date | 06 April 2024 | Flat | 10.0 | 10.0 | 0.0 | 0.0 |
| Fixed Returned payment fee | false | Specified due date | 10 April 2024 | Flat | 5.0 | 5.0 | 0.0 | 0.0 |
@TestRailId:C3892
Scenario: Verify installment fee charge allocation when loan has down payment, additional installment and re-aging
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_DOWNPAYMENT_ADV_PMT_ALLOC_PROGRESSIVE_LOAN_SCHEDULE_HORIZONTAL | 01 January 2024 | 1000 | 0 | FLAT | SAME_AS_REPAYMENT_PERIOD | EQUAL_INSTALLMENTS | 45 | DAYS | 15 | DAYS | 3 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION |
And Admin successfully approves the loan on "01 January 2024" with "1000" amount and expected disbursement date on "01 January 2024"
When Admin successfully disburse the loan on "01 January 2024" with "1000" EUR transaction amount
When Admin adds "LOAN_INSTALLMENT_FEE_FLAT" installment charge with 10 amount
Then Loan Repayment schedule has 4 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 | | 1000.0 | | | 0.0 | | 0.0 | 0.0 | | | |
| 1 | 0 | 01 January 2024 | | 750.0 | 250.0 | 0.0 | 0.0 | 0.0 | 250.0 | 0.0 | 0.0 | 0.0 | 250.0 |
| 2 | 15 | 16 January 2024 | | 500.0 | 250.0 | 0.0 | 10.0 | 0.0 | 260.0 | 0.0 | 0.0 | 0.0 | 260.0 |
| 3 | 15 | 31 January 2024 | | 250.0 | 250.0 | 0.0 | 10.0 | 0.0 | 260.0 | 0.0 | 0.0 | 0.0 | 260.0 |
| 4 | 15 | 15 February 2024 | | 0.0 | 250.0 | 0.0 | 10.0 | 0.0 | 260.0 | 0.0 | 0.0 | 0.0 | 260.0 |
Then Loan Repayment schedule has the following data in Total row:
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
| 1000.0 | 0.0 | 30.0 | 0.0 | 1030.0 | 0.0 | 0.0 | 0.0 | 1030.0 |
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 |
Then Loan Charges tab has the following data:
| Name | isPenalty | Payment due at | Due as of | Calculation type | Due | Paid | Waived | Outstanding |
| Installment flat fee | false | Installment Fee | | Flat | 30.0 | 0.0 | 0.0 | 30.0 |
When Admin sets the business date to "01 January 2024"
And Customer makes "AUTOPAY" repayment on "01 January 2024" with 250 EUR transaction amount
Then Loan Repayment schedule has 4 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 | | 1000.0 | | | 0.0 | | 0.0 | 0.0 | | | |
| 1 | 0 | 01 January 2024 | 01 January 2024 | 750.0 | 250.0 | 0.0 | 0.0 | 0.0 | 250.0 | 250.0 | 0.0 | 0.0 | 0.0 |
| 2 | 15 | 16 January 2024 | | 500.0 | 250.0 | 0.0 | 10.0 | 0.0 | 260.0 | 0.0 | 0.0 | 0.0 | 260.0 |
| 3 | 15 | 31 January 2024 | | 250.0 | 250.0 | 0.0 | 10.0 | 0.0 | 260.0 | 0.0 | 0.0 | 0.0 | 260.0 |
| 4 | 15 | 15 February 2024 | | 0.0 | 250.0 | 0.0 | 10.0 | 0.0 | 260.0 | 0.0 | 0.0 | 0.0 | 260.0 |
Then 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 |
| 01 January 2024 | Repayment | 250.0 | 250.0 | 0.0 | 0.0 | 0.0 | 750.0 | false |
Then Loan Repayment schedule has the following data in Total row:
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
| 1000.0 | 0.0 | 30.0 | 0.0 | 1030.0 | 250.0 | 0.0 | 0.0 | 780.0 |
Then Loan Charges tab has the following data:
| Name | isPenalty | Payment due at | Due as of | Calculation type | Due | Paid | Waived | Outstanding |
| Installment flat fee | false | Installment Fee | | Flat | 30.0 | 0.0 | 0.0 | 30.0 |
When Admin sets the business date to "20 February 2024"
When Admin makes "REPAYMENT_ADJUSTMENT_CHARGEBACK" chargeback with 125 EUR transaction amount
Then Loan Repayment schedule has 5 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 | | 1000.0 | | | 0.0 | | 0.0 | 0.0 | | | |
| 1 | 0 | 01 January 2024 | 01 January 2024 | 750.0 | 250.0 | 0.0 | 0.0 | 0.0 | 250.0 | 250.0 | 0.0 | 0.0 | 0.0 |
| 2 | 15 | 16 January 2024 | | 500.0 | 250.0 | 0.0 | 10.0 | 0.0 | 260.0 | 0.0 | 0.0 | 0.0 | 260.0 |
| 3 | 15 | 31 January 2024 | | 250.0 | 250.0 | 0.0 | 10.0 | 0.0 | 260.0 | 0.0 | 0.0 | 0.0 | 260.0 |
| 4 | 15 | 15 February 2024 | | 0.0 | 250.0 | 0.0 | 10.0 | 0.0 | 260.0 | 0.0 | 0.0 | 0.0 | 260.0 |
| 5 | 5 | 20 February 2024 | | 0.0 | 125.0 | 0.0 | 0.0 | 0.0 | 125.0 | 0.0 | 0.0 | 0.0 | 125.0 |
Then 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 |
| 01 January 2024 | Repayment | 250.0 | 250.0 | 0.0 | 0.0 | 0.0 | 750.0 | false |
| 20 February 2024 | Chargeback | 125.0 | 125.0 | 0.0 | 0.0 | 0.0 | 875.0 | false |
Then Loan Repayment schedule has the following data in Total row:
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
| 1125.0 | 0.0 | 30.0 | 0.0 | 1155.0 | 250.0 | 0.0 | 0.0 | 905.0 |
Then Loan Charges tab has the following data:
| Name | isPenalty | Payment due at | Due as of | Calculation type | Due | Paid | Waived | Outstanding |
| Installment flat fee | false | Installment Fee | | Flat | 30.0 | 0.0 | 0.0 | 30.0 |
When Admin sets the business date to "21 February 2024"
When Admin creates a Loan re-aging transaction by Loan external ID with the following data:
| frequencyNumber | frequencyType | startDate | numberOfInstallments |
| 2 | MONTHS | 10 March 2024 | 3 |
Then Loan Repayment schedule has 8 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 | | 1000.0 | | | 0.0 | | 0.0 | 0.0 | | | |
| 1 | 0 | 01 January 2024 | 01 January 2024 | 750.0 | 250.0 | 0.0 | 0.0 | 0.0 | 250.0 | 250.0 | 0.0 | 0.0 | 0.0 |
| 2 | 15 | 16 January 2024 | | 750.0 | 0.0 | 0.0 | 10.0 | 0.0 | 10.0 | 0.0 | 0.0 | 0.0 | 10.0 |
| 3 | 15 | 31 January 2024 | | 750.0 | 0.0 | 0.0 | 10.0 | 0.0 | 10.0 | 0.0 | 0.0 | 0.0 | 10.0 |
| 4 | 15 | 15 February 2024 | | 750.0 | 0.0 | 0.0 | 10.0 | 0.0 | 10.0 | 0.0 | 0.0 | 0.0 | 10.0 |
| 5 | 5 | 20 February 2024 | 21 February 2024 | 875.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
| 6 | 19 | 10 March 2024 | | 583.33 | 291.67 | 0.0 | 0.0 | 0.0 | 291.67 | 0.0 | 0.0 | 0.0 | 291.67 |
| 7 | 61 | 10 May 2024 | | 291.66 | 291.67 | 0.0 | 0.0 | 0.0 | 291.67 | 0.0 | 0.0 | 0.0 | 291.67 |
| 8 | 61 | 10 July 2024 | | 0.0 | 291.66 | 0.0 | 0.0 | 0.0 | 291.66 | 0.0 | 0.0 | 0.0 | 291.66 |
Then 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 |
| 01 January 2024 | Repayment | 250.0 | 250.0 | 0.0 | 0.0 | 0.0 | 750.0 | false |
| 20 February 2024 | Chargeback | 125.0 | 125.0 | 0.0 | 0.0 | 0.0 | 875.0 | false |
| 21 February 2024 | Re-age | 875.0 | 875.0 | 0.0 | 0.0 | 0.0 | 0.0 | false |
Then Loan Repayment schedule has the following data in Total row:
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
| 1125.0 | 0.0 | 30.0 | 0.0 | 1155.0 | 250.0 | 0.0 | 0.0 | 905.0 |
Then Loan Charges tab has the following data:
| Name | isPenalty | Payment due at | Due as of | Calculation type | Due | Paid | Waived | Outstanding |
| Installment flat fee | false | Installment Fee | | Flat | 30.0 | 0.0 | 0.0 | 30.0 |
@@ -1541,7 +1541,8 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom<Long> {
List<LoanRepaymentScheduleInstallment> installments = getRepaymentScheduleInstallments();
int numberOfInstallments = 0;
for (final LoanRepaymentScheduleInstallment installment : installments) {
if (!installment.isRecalculatedInterestComponent()) {
if (!installment.isRecalculatedInterestComponent() && !installment.isAdditional() && !installment.isDownPayment()
&& !installment.isReAged()) {
numberOfInstallments++;
}
}
@@ -281,6 +281,19 @@ public interface LoanTransactionRepository extends JpaRepository<LoanTransaction
""")
BigDecimal findChargeAccrualAmount(@Param("loanCharge") LoanCharge loanCharge);
@Query("""
SELECT COALESCE(SUM(CASE WHEN lt.typeOf = org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType.ACCRUAL THEN lcpb.amount
WHEN lt.typeOf = org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType.ACCRUAL_ADJUSTMENT THEN -lcpb.amount
ELSE 0 END), 0)
FROM LoanChargePaidBy lcpb
JOIN lcpb.loanTransaction lt
WHERE lcpb.loanCharge = :loanCharge
AND lcpb.installmentNumber = :installmentNumber
AND lt.reversed = false
""")
BigDecimal findChargeAccrualAmountByInstallment(@Param("loanCharge") LoanCharge loanCharge,
@Param("installmentNumber") Integer installmentNumber);
@Query("""
SELECT COALESCE(SUM(lt.unrecognizedIncomePortion), 0)
FROM LoanChargePaidBy lcpb
@@ -725,6 +725,8 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen
final Integer installmentNumber) {
Money amountRemaining = chargeAmount;
final Set<LoanCharge> chargesThatCannotBeFullyPaidByOneInstallment = new HashSet<>();
while (amountRemaining.isGreaterThanZero()) {
final LoanCharge unpaidCharge = findEarliestUnpaidChargeFromUnOrderedSet(charges, chargeAmount.getCurrency());
Money feeAmount = chargeAmount.zero();
@@ -734,6 +736,12 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen
if (unpaidCharge == null) {
break; // All are trache charges
}
// If we've already determined this charge cannot be fully paid by one installment, skip it
if (chargesThatCannotBeFullyPaidByOneInstallment.contains(unpaidCharge)) {
charges.remove(unpaidCharge);
}
final Money amountPaidTowardsCharge = unpaidCharge.updatePaidAmountBy(amountRemaining, installmentNumber, feeAmount);
if (!amountPaidTowardsCharge.isZero()) {
Set<LoanChargePaidBy> chargesPaidBies = loanTransaction.getLoanChargesPaid();
@@ -750,6 +758,8 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen
chargesPaidBies.add(loanChargePaidBy);
}
amountRemaining = amountRemaining.minus(amountPaidTowardsCharge);
} else {
chargesThatCannotBeFullyPaidByOneInstallment.add(unpaidCharge);
}
}
@@ -786,6 +796,7 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen
}
}
}
if (earliestUnpaidCharge == null || (chargePerInstallment != null && DateUtils.isAfter(earliestUnpaidCharge.getDueLocalDate(),
chargePerInstallment.getRepaymentInstallment().getDueDate()))) {
earliestUnpaidCharge = installemntCharge;
@@ -655,7 +655,8 @@ public class LoanChargeService {
private List<LoanInstallmentCharge> generateInstallmentLoanCharges(final Loan loan, final LoanCharge loanCharge) {
final List<LoanInstallmentCharge> loanChargePerInstallments = new ArrayList<>();
if (loanCharge.isInstalmentFee()) {
List<LoanRepaymentScheduleInstallment> installments = loan.getRepaymentScheduleInstallments();
final List<LoanRepaymentScheduleInstallment> installments = loan.getRepaymentScheduleInstallments().stream()
.filter(i -> !i.isDownPayment() && !i.isAdditional() && !i.isReAged()).toList();
for (final LoanRepaymentScheduleInstallment installment : installments) {
BigDecimal amount;
if (loanCharge.getChargeCalculation().isFlat()) {
@@ -620,7 +620,15 @@ public class LoanAccrualsProcessingServiceImpl implements LoanAccrualsProcessing
final Money unrecognizedWaived = MathUtil
.toMoney(loanTransactionRepository.findChargeUnrecognizedWaivedAmount(loanCharge, tillDate), currency);
final Money transactionWaived = MathUtil.minusToZero(waived, unrecognizedWaived);
final Money transactionAccrued = MathUtil.toMoney(loanTransactionRepository.findChargeAccrualAmount(loanCharge), currency);
// For installment fees, use installment-specific accrual amount
final Money transactionAccrued;
if (installmentFee && installmentChargeId != null) {
transactionAccrued = MathUtil.toMoney(
loanTransactionRepository.findChargeAccrualAmountByInstallment(loanCharge, dueInstallment.getInstallmentNumber()),
currency);
} else {
transactionAccrued = MathUtil.toMoney(loanTransactionRepository.findChargeAccrualAmount(loanCharge), currency);
}
chargeData.setTransactionAccrued(transactionAccrued);
chargeData.setChargeAccrued(MathUtil.minusToZero(transactionAccrued, transactionWaived));