FINERACT-2354: Loan reschedule with extra terms after re-aging
This commit is contained in:
committed by
Adam Saghy
parent
4bfae0400c
commit
97b8bfa26f
@@ -5853,7 +5853,7 @@ Feature: Loan
|
|||||||
| 2 | 15 | 16 February 2024 | | 600.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 |
|
| 2 | 15 | 16 February 2024 | | 600.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 |
|
||||||
| 3 | 15 | 02 March 2024 | | 450.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 |
|
| 3 | 15 | 02 March 2024 | | 450.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 |
|
||||||
| 4 | 10 | 12 March 2024 | | 300.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 |
|
| 4 | 10 | 12 March 2024 | | 300.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 |
|
||||||
| 5 | 15 | 01 April 2024 | | 150.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 |
|
| 5 | 20 | 01 April 2024 | | 150.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 |
|
||||||
| 6 | 15 | 16 April 2024 | | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 |
|
| 6 | 15 | 16 April 2024 | | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 | 0.0 | 0.0 | 0.0 | 150.0 |
|
||||||
Then Loan Repayment schedule has the following data in Total row:
|
Then Loan Repayment schedule has the following data in Total row:
|
||||||
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
|
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
|
||||||
|
|||||||
@@ -1814,7 +1814,7 @@ Feature: LoanReAging
|
|||||||
| 1 | 0 | 01 January 2025 | 01 April 2025 | 500.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 1 | 0 | 01 January 2025 | 01 April 2025 | 500.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| | | 16 January 2025 | | 100.0 | | | 0.0 | | 0.0 | 0.0 | | | |
|
| | | 16 January 2025 | | 100.0 | | | 0.0 | | 0.0 | 0.0 | | | |
|
||||||
| 2 | 0 | 16 January 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 2 | 0 | 16 January 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| 3 | 31 | 01 February 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 3 | 16 | 01 February 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| 4 | 28 | 01 March 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 4 | 28 | 01 March 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| 5 | 31 | 01 April 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 5 | 31 | 01 April 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| 6 | 0 | 01 April 2025 | | 0.0 | 600.0 | 0.0 | 0.0 | 0.0 | 600.0 | 0.0 | 0.0 | 0.0 | 600.0 |
|
| 6 | 0 | 01 April 2025 | | 0.0 | 600.0 | 0.0 | 0.0 | 0.0 | 600.0 | 0.0 | 0.0 | 0.0 | 600.0 |
|
||||||
@@ -8885,8 +8885,7 @@ Then Loan Repayment schedule has 4 periods, with the following data for periods:
|
|||||||
When Loan Pay-off is made on "16 April 2024"
|
When Loan Pay-off is made on "16 April 2024"
|
||||||
Then Loan is closed with zero outstanding balance and it's all installments have obligations met
|
Then Loan is closed with zero outstanding balance and it's all installments have obligations met
|
||||||
|
|
||||||
# TODO check and unSkip when PS-2937 is done
|
@TestRailId:C4286
|
||||||
@Skip @TestRailId:C4286
|
|
||||||
Scenario: Verify Re-aging with loan reschedule: UC1.1: Interest handling: DEFAULT, reschedule - extra terms
|
Scenario: Verify Re-aging with loan reschedule: UC1.1: Interest handling: DEFAULT, reschedule - extra terms
|
||||||
When Admin sets the business date to "01 January 2024"
|
When Admin sets the business date to "01 January 2024"
|
||||||
And Admin creates a client with random data
|
And Admin creates a client with random data
|
||||||
@@ -9002,8 +9001,7 @@ Then Loan Repayment schedule has 4 periods, with the following data for periods:
|
|||||||
When Admin creates and approves Loan reschedule with the following data:
|
When Admin creates and approves Loan reschedule with the following data:
|
||||||
| rescheduleFromDate | submittedOnDate | adjustedDueDate | graceOnPrincipal | graceOnInterest | extraTerms | newInterestRate |
|
| rescheduleFromDate | submittedOnDate | adjustedDueDate | graceOnPrincipal | graceOnInterest | extraTerms | newInterestRate |
|
||||||
| 01 July 2024 | 02 April 2024 | | | | 2 | |
|
| 01 July 2024 | 02 April 2024 | | | | 2 | |
|
||||||
# TODO check numbers
|
Then Loan Repayment schedule has 11 periods, with the following data for periods:
|
||||||
Then Loan Repayment schedule has 9 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 |
|
| 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 | | | |
|
| | | 01 January 2024 | | 100.0 | | | 0.0 | | 0.0 | 0.0 | | | |
|
||||||
| 1 | 31 | 01 February 2024 | 01 February 2024 | 83.57 | 16.43 | 0.58 | 0.0 | 0.0 | 17.01 | 17.01 | 0.0 | 0.0 | 0.0 |
|
| 1 | 31 | 01 February 2024 | 01 February 2024 | 83.57 | 16.43 | 0.58 | 0.0 | 0.0 | 17.01 | 17.01 | 0.0 | 0.0 | 0.0 |
|
||||||
@@ -9012,14 +9010,14 @@ Then Loan Repayment schedule has 4 periods, with the following data for periods:
|
|||||||
| 4 | 17 | 01 April 2024 | | 70.25 | 13.32 | 0.98 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 4 | 17 | 01 April 2024 | | 70.25 | 13.32 | 0.98 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
||||||
| 5 | 30 | 01 May 2024 | | 56.36 | 13.89 | 0.41 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 5 | 30 | 01 May 2024 | | 56.36 | 13.89 | 0.41 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
||||||
| 6 | 31 | 01 June 2024 | | 42.39 | 13.97 | 0.33 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 6 | 31 | 01 June 2024 | | 42.39 | 13.97 | 0.33 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
||||||
| 7 | 30 | 01 July 2024 | | 28.34 | 14.05 | 0.25 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 7 | 30 | 01 July 2024 | | 34.01 | 8.38 | 0.25 | 0.0 | 0.0 | 8.63 | 0.0 | 0.0 | 0.0 | 8.63 |
|
||||||
| 8 | 31 | 01 August 2024 | | 14.21 | 14.13 | 0.17 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 8 | 31 | 01 August 2024 | | 25.58 | 8.43 | 0.2 | 0.0 | 0.0 | 8.63 | 0.0 | 0.0 | 0.0 | 8.63 |
|
||||||
| 9 | 31 | 01 September 2024 | | 0.0 | 14.21 | 0.08 | 0.0 | 0.0 | 14.29 | 0.0 | 0.0 | 0.0 | 14.29 |
|
| 9 | 31 | 01 September 2024 | | 17.1 | 8.48 | 0.15 | 0.0 | 0.0 | 8.63 | 0.0 | 0.0 | 0.0 | 8.63 |
|
||||||
| 10 | 30 | 01 October 2024 | | 0.0 | 14.21 | 0.08 | 0.0 | 0.0 | 14.29 | 0.0 | 0.0 | 0.0 | 14.29 |
|
| 10 | 30 | 01 October 2024 | | 8.57 | 8.53 | 0.1 | 0.0 | 0.0 | 8.63 | 0.0 | 0.0 | 0.0 | 8.63 |
|
||||||
| 11 | 31 | 01 November 2024 | | 0.0 | 14.21 | 0.08 | 0.0 | 0.0 | 14.29 | 0.0 | 0.0 | 0.0 | 14.29 |
|
| 11 | 31 | 01 November 2024 | | 0.0 | 8.57 | 0.05 | 0.0 | 0.0 | 8.62 | 0.0 | 0.0 | 0.0 | 8.62 |
|
||||||
And Loan Repayment schedule has the following data in Total row:
|
And Loan Repayment schedule has the following data in Total row:
|
||||||
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
|
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
|
||||||
| 100.0 | 2.8 | 0.0 | 0.0 | 102.8 | 17.01 | 0.0 | 0.0 | 85.79 |
|
| 100.0 | 3.05 | 0.0 | 0.0 | 103.05 | 17.01 | 0.0 | 0.0 | 86.04 |
|
||||||
And Loan Transactions tab has the following data:
|
And Loan Transactions tab has the following data:
|
||||||
| Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed |
|
| 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 January 2024 | Disbursement | 100.0 | 0.0 | 0.0 | 0.0 | 0.0 | 100.0 | false | false |
|
||||||
@@ -9029,7 +9027,7 @@ Then Loan Repayment schedule has 4 periods, with the following data for periods:
|
|||||||
When Loan Pay-off is made on "02 April 2024"
|
When Loan Pay-off is made on "02 April 2024"
|
||||||
Then Loan is closed with zero outstanding balance and it's all installments have obligations met
|
Then Loan is closed with zero outstanding balance and it's all installments have obligations met
|
||||||
|
|
||||||
# TODO check and unSkip when PS-2937 is done
|
# TODO check and unSkip when WAIVE_INTEREST strategy is implemented
|
||||||
@Skip @TestRailId:C4287
|
@Skip @TestRailId:C4287
|
||||||
Scenario: Verify Re-aging with loan reschedule: UC1.2: Interest handling: WAIVE_INTEREST, reschedule - extra terms
|
Scenario: Verify Re-aging with loan reschedule: UC1.2: Interest handling: WAIVE_INTEREST, reschedule - extra terms
|
||||||
When Admin sets the business date to "01 January 2024"
|
When Admin sets the business date to "01 January 2024"
|
||||||
|
|||||||
+25
-31
@@ -8261,8 +8261,7 @@ Feature: LoanReAgingEqualAmortization
|
|||||||
When Loan Pay-off is made on "01 July 2024"
|
When Loan Pay-off is made on "01 July 2024"
|
||||||
Then Loan is closed with zero outstanding balance and it's all installments have obligations met
|
Then Loan is closed with zero outstanding balance and it's all installments have obligations met
|
||||||
|
|
||||||
# TODO check and unSkip when PS-2937 is done
|
@TestRailId:C4288
|
||||||
@Skip @TestRailId:C4288
|
|
||||||
Scenario: Verify Re-aging with loan reschedule: UC1.3: Interest handling: EQUAL_AMORTIZATION_PAYABLE_INTEREST, reschedule - extra terms
|
Scenario: Verify Re-aging with loan reschedule: UC1.3: Interest handling: EQUAL_AMORTIZATION_PAYABLE_INTEREST, reschedule - extra terms
|
||||||
When Admin sets the business date to "01 January 2024"
|
When Admin sets the business date to "01 January 2024"
|
||||||
And Admin creates a client with random data
|
And Admin creates a client with random data
|
||||||
@@ -8353,7 +8352,6 @@ Feature: LoanReAgingEqualAmortization
|
|||||||
When Admin creates a Loan re-aging transaction with the following data:
|
When Admin creates a Loan re-aging transaction with the following data:
|
||||||
| frequencyNumber | frequencyType | startDate | numberOfInstallments | reAgeInterestHandling |
|
| frequencyNumber | frequencyType | startDate | numberOfInstallments | reAgeInterestHandling |
|
||||||
| 1 | MONTHS | 01 April 2024 | 6 | EQUAL_AMORTIZATION_PAYABLE_INTEREST |
|
| 1 | MONTHS | 01 April 2024 | 6 | EQUAL_AMORTIZATION_PAYABLE_INTEREST |
|
||||||
# TODO check numbers
|
|
||||||
Then Loan Repayment schedule has 9 periods, with the following data for periods:
|
Then Loan Repayment schedule has 9 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 |
|
| 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 | | | |
|
| | | 01 January 2024 | | 100.0 | | | 0.0 | | 0.0 | 0.0 | | | |
|
||||||
@@ -8379,24 +8377,23 @@ Feature: LoanReAgingEqualAmortization
|
|||||||
When Admin creates and approves Loan reschedule with the following data:
|
When Admin creates and approves Loan reschedule with the following data:
|
||||||
| rescheduleFromDate | submittedOnDate | adjustedDueDate | graceOnPrincipal | graceOnInterest | extraTerms | newInterestRate |
|
| rescheduleFromDate | submittedOnDate | adjustedDueDate | graceOnPrincipal | graceOnInterest | extraTerms | newInterestRate |
|
||||||
| 01 July 2024 | 02 April 2024 | | | | 2 | |
|
| 01 July 2024 | 02 April 2024 | | | | 2 | |
|
||||||
# TODO check numbers
|
Then Loan Repayment schedule has 11 periods, with the following data for periods:
|
||||||
Then Loan Repayment schedule has 9 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 |
|
| 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 | | | |
|
| | | 01 January 2024 | | 100.0 | | | 0.0 | | 0.0 | 0.0 | | | |
|
||||||
| 1 | 31 | 01 February 2024 | 01 February 2024 | 83.57 | 16.43 | 0.58 | 0.0 | 0.0 | 17.01 | 17.01 | 0.0 | 0.0 | 0.0 |
|
| 1 | 31 | 01 February 2024 | 01 February 2024 | 83.57 | 16.43 | 0.58 | 0.0 | 0.0 | 17.01 | 17.01 | 0.0 | 0.0 | 0.0 |
|
||||||
| 2 | 29 | 01 March 2024 | 15 March 2024 | 83.57 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 2 | 29 | 01 March 2024 | 15 March 2024 | 83.57 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| 3 | 14 | 15 March 2024 | 15 March 2024 | 83.57 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 3 | 14 | 15 March 2024 | 15 March 2024 | 83.57 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| 4 | 17 | 01 April 2024 | | 70.25 | 13.32 | 0.98 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 4 | 17 | 01 April 2024 | | 69.64 | 13.93 | 0.12 | 0.0 | 0.0 | 14.05 | 0.0 | 0.0 | 0.0 | 14.05 |
|
||||||
| 5 | 30 | 01 May 2024 | | 56.36 | 13.89 | 0.41 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 5 | 30 | 01 May 2024 | | 55.71 | 13.93 | 0.12 | 0.0 | 0.0 | 14.05 | 0.0 | 0.0 | 0.0 | 14.05 |
|
||||||
| 6 | 31 | 01 June 2024 | | 42.39 | 13.97 | 0.33 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 6 | 31 | 01 June 2024 | | 41.78 | 13.93 | 0.12 | 0.0 | 0.0 | 14.05 | 0.0 | 0.0 | 0.0 | 14.05 |
|
||||||
| 7 | 30 | 01 July 2024 | | 28.34 | 14.05 | 0.25 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 7 | 30 | 01 July 2024 | | 33.47 | 8.31 | 0.12 | 0.0 | 0.0 | 8.43 | 0.0 | 0.0 | 0.0 | 8.43 |
|
||||||
| 8 | 31 | 01 August 2024 | | 14.21 | 14.13 | 0.17 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 8 | 31 | 01 August 2024 | | 25.16 | 8.31 | 0.12 | 0.0 | 0.0 | 8.43 | 0.0 | 0.0 | 0.0 | 8.43 |
|
||||||
| 9 | 31 | 01 September 2024 | | 0.0 | 14.21 | 0.08 | 0.0 | 0.0 | 14.29 | 0.0 | 0.0 | 0.0 | 14.29 |
|
| 9 | 31 | 01 September 2024 | | 16.84 | 8.32 | 0.11 | 0.0 | 0.0 | 8.43 | 0.0 | 0.0 | 0.0 | 8.43 |
|
||||||
| 10 | 30 | 01 October 2024 | | 0.0 | 14.21 | 0.08 | 0.0 | 0.0 | 14.29 | 0.0 | 0.0 | 0.0 | 14.29 |
|
| 10 | 30 | 01 October 2024 | | 8.41 | 8.43 | 0.0 | 0.0 | 0.0 | 8.43 | 0.0 | 0.0 | 0.0 | 8.43 |
|
||||||
| 11 | 31 | 01 November 2024 | | 0.0 | 14.21 | 0.08 | 0.0 | 0.0 | 14.29 | 0.0 | 0.0 | 0.0 | 14.29 |
|
| 11 | 31 | 01 November 2024 | | 0.0 | 8.41 | 0.0 | 0.0 | 0.0 | 8.41 | 0.0 | 0.0 | 0.0 | 8.41 |
|
||||||
And Loan Repayment schedule has the following data in Total row:
|
And Loan Repayment schedule has the following data in Total row:
|
||||||
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
|
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
|
||||||
| 100.0 | 2.8 | 0.0 | 0.0 | 102.8 | 17.01 | 0.0 | 0.0 | 85.79 |
|
| 100.0 | 1.29 | 0.0 | 0.0 | 101.29 | 17.01 | 0.0 | 0.0 | 84.28 |
|
||||||
And Loan Transactions tab has the following data:
|
And Loan Transactions tab has the following data:
|
||||||
| Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed |
|
| 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 January 2024 | Disbursement | 100.0 | 0.0 | 0.0 | 0.0 | 0.0 | 100.0 | false | false |
|
||||||
@@ -8406,8 +8403,7 @@ Feature: LoanReAgingEqualAmortization
|
|||||||
When Loan Pay-off is made on "02 April 2024"
|
When Loan Pay-off is made on "02 April 2024"
|
||||||
Then Loan is closed with zero outstanding balance and it's all installments have obligations met
|
Then Loan is closed with zero outstanding balance and it's all installments have obligations met
|
||||||
|
|
||||||
# TODO check and unSkip when PS-2937 is done
|
@TestRailId:C4289
|
||||||
@Skip @TestRailId:C4289
|
|
||||||
Scenario: Verify Re-aging with loan reschedule: UC1.4: Interest handling: EQUAL_AMORTIZATION_FULL_INTEREST, reschedule - extra terms
|
Scenario: Verify Re-aging with loan reschedule: UC1.4: Interest handling: EQUAL_AMORTIZATION_FULL_INTEREST, reschedule - extra terms
|
||||||
When Admin sets the business date to "01 January 2024"
|
When Admin sets the business date to "01 January 2024"
|
||||||
And Admin creates a client with random data
|
And Admin creates a client with random data
|
||||||
@@ -8498,7 +8494,6 @@ Feature: LoanReAgingEqualAmortization
|
|||||||
When Admin creates a Loan re-aging transaction with the following data:
|
When Admin creates a Loan re-aging transaction with the following data:
|
||||||
| frequencyNumber | frequencyType | startDate | numberOfInstallments | reAgeInterestHandling |
|
| frequencyNumber | frequencyType | startDate | numberOfInstallments | reAgeInterestHandling |
|
||||||
| 1 | MONTHS | 01 April 2024 | 6 | EQUAL_AMORTIZATION_FULL_INTEREST |
|
| 1 | MONTHS | 01 April 2024 | 6 | EQUAL_AMORTIZATION_FULL_INTEREST |
|
||||||
# TODO check numbers
|
|
||||||
Then Loan Repayment schedule has 9 periods, with the following data for periods:
|
Then Loan Repayment schedule has 9 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 |
|
| 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 | | | |
|
| | | 01 January 2024 | | 100.0 | | | 0.0 | | 0.0 | 0.0 | | | |
|
||||||
@@ -8524,29 +8519,28 @@ Feature: LoanReAgingEqualAmortization
|
|||||||
When Admin creates and approves Loan reschedule with the following data:
|
When Admin creates and approves Loan reschedule with the following data:
|
||||||
| rescheduleFromDate | submittedOnDate | adjustedDueDate | graceOnPrincipal | graceOnInterest | extraTerms | newInterestRate |
|
| rescheduleFromDate | submittedOnDate | adjustedDueDate | graceOnPrincipal | graceOnInterest | extraTerms | newInterestRate |
|
||||||
| 01 July 2024 | 02 April 2024 | | | | 2 | |
|
| 01 July 2024 | 02 April 2024 | | | | 2 | |
|
||||||
# TODO check numbers
|
Then Loan Repayment schedule has 11 periods, with the following data for periods:
|
||||||
Then Loan Repayment schedule has 9 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 |
|
| 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 | | | |
|
| | | 01 January 2024 | | 100.0 | | | 0.0 | | 0.0 | 0.0 | | | |
|
||||||
| 1 | 31 | 01 February 2024 | 01 February 2024 | 83.57 | 16.43 | 0.58 | 0.0 | 0.0 | 17.01 | 17.01 | 0.0 | 0.0 | 0.0 |
|
| 1 | 31 | 01 February 2024 | 01 February 2024 | 83.57 | 16.43 | 0.58 | 0.0 | 0.0 | 17.01 | 17.01 | 0.0 | 0.0 | 0.0 |
|
||||||
| 2 | 29 | 01 March 2024 | 15 March 2024 | 83.57 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 2 | 29 | 01 March 2024 | 15 March 2024 | 83.57 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| 3 | 14 | 15 March 2024 | 15 March 2024 | 83.57 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 3 | 14 | 15 March 2024 | 15 March 2024 | 83.57 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| 4 | 17 | 01 April 2024 | | 70.25 | 13.32 | 0.98 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 4 | 17 | 01 April 2024 | | 69.64 | 13.93 | 0.33 | 0.0 | 0.0 | 14.26 | 0.0 | 0.0 | 0.0 | 14.26 |
|
||||||
| 5 | 30 | 01 May 2024 | | 56.36 | 13.89 | 0.41 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 5 | 30 | 01 May 2024 | | 55.71 | 13.93 | 0.33 | 0.0 | 0.0 | 14.26 | 0.0 | 0.0 | 0.0 | 14.26 |
|
||||||
| 6 | 31 | 01 June 2024 | | 42.39 | 13.97 | 0.33 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 6 | 31 | 01 June 2024 | | 41.78 | 13.93 | 0.33 | 0.0 | 0.0 | 14.26 | 0.0 | 0.0 | 0.0 | 14.26 |
|
||||||
| 7 | 30 | 01 July 2024 | | 28.34 | 14.05 | 0.25 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 7 | 30 | 01 July 2024 | | 33.55 | 8.23 | 0.33 | 0.0 | 0.0 | 8.56 | 0.0 | 0.0 | 0.0 | 8.56 |
|
||||||
| 8 | 31 | 01 August 2024 | | 14.21 | 14.13 | 0.17 | 0.0 | 0.0 | 14.3 | 0.0 | 0.0 | 0.0 | 14.3 |
|
| 8 | 31 | 01 August 2024 | | 25.32 | 8.23 | 0.33 | 0.0 | 0.0 | 8.56 | 0.0 | 0.0 | 0.0 | 8.56 |
|
||||||
| 9 | 31 | 01 September 2024 | | 0.0 | 14.21 | 0.08 | 0.0 | 0.0 | 14.29 | 0.0 | 0.0 | 0.0 | 14.29 |
|
| 9 | 31 | 01 September 2024 | | 17.1 | 8.22 | 0.34 | 0.0 | 0.0 | 8.56 | 0.0 | 0.0 | 0.0 | 8.56 |
|
||||||
| 10 | 30 | 01 October 2024 | | 0.0 | 14.21 | 0.08 | 0.0 | 0.0 | 14.29 | 0.0 | 0.0 | 0.0 | 14.29 |
|
| 10 | 30 | 01 October 2024 | | 8.54 | 8.56 | 0.0 | 0.0 | 0.0 | 8.56 | 0.0 | 0.0 | 0.0 | 8.56 |
|
||||||
| 11 | 31 | 01 November 2024 | | 0.0 | 14.21 | 0.08 | 0.0 | 0.0 | 14.29 | 0.0 | 0.0 | 0.0 | 14.29 |
|
| 11 | 31 | 01 November 2024 | | 0.0 | 8.54 | 0.0 | 0.0 | 0.0 | 8.54 | 0.0 | 0.0 | 0.0 | 8.54 |
|
||||||
And Loan Repayment schedule has the following data in Total row:
|
And Loan Repayment schedule has the following data in Total row:
|
||||||
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
|
| Principal due | Interest | Fees | Penalties | Due | Paid | In advance | Late | Outstanding |
|
||||||
| 100.0 | 2.8 | 0.0 | 0.0 | 102.8 | 17.01 | 0.0 | 0.0 | 85.79 |
|
| 100.0 | 2.57 | 0.0 | 0.0 | 102.57 | 17.01 | 0.0 | 0.0 | 85.56 |
|
||||||
And Loan Transactions tab has the following data:
|
And Loan Transactions tab has the following data:
|
||||||
| Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | Reverted | Replayed |
|
| 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 January 2024 | Disbursement | 100.0 | 0.0 | 0.0 | 0.0 | 0.0 | 100.0 | false | false |
|
||||||
| 01 February 2024 | Repayment | 17.01 | 16.43 | 0.58 | 0.0 | 0.0 | 83.57 | false | false |
|
| 01 February 2024 | Repayment | 17.01 | 16.43 | 0.58 | 0.0 | 0.0 | 83.57 | false | false |
|
||||||
| 15 March 2024 | Re-age | 84.28 | 83.57 | 0.71 | 0.0 | 0.0 | 0.0 | false | false |
|
| 15 March 2024 | Re-age | 85.56 | 83.57 | 1.99 | 0.0 | 0.0 | 0.0 | false | false |
|
||||||
# --- Close loan ---
|
# --- Close loan ---
|
||||||
When Loan Pay-off is made on "02 April 2024"
|
When Loan Pay-off is made on "02 April 2024"
|
||||||
Then Loan is closed with zero outstanding balance and it's all installments have obligations met
|
Then Loan is closed with zero outstanding balance and it's all installments have obligations met
|
||||||
|
|||||||
@@ -471,7 +471,7 @@ Feature: LoanReAgingPreview
|
|||||||
| 1 | 0 | 01 January 2025 | 01 April 2025 | 500.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 1 | 0 | 01 January 2025 | 01 April 2025 | 500.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| | | 16 January 2025 | | 100.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | | | |
|
| | | 16 January 2025 | | 100.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | | | |
|
||||||
| 2 | 0 | 16 January 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 2 | 0 | 16 January 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| 3 | 31 | 01 February 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 3 | 16 | 01 February 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| 4 | 28 | 01 March 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 4 | 28 | 01 March 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| 5 | 31 | 01 April 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
| 5 | 31 | 01 April 2025 | 01 April 2025 | 600.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
|
||||||
| 6 | 0 | 01 April 2025 | | 0.0 | 600.0 | 0.0 | 0.0 | 0.0 | 600.0 | 0.0 | 0.0 | 0.0 | 600.0 |
|
| 6 | 0 | 01 April 2025 | | 0.0 | 600.0 | 0.0 | 0.0 | 0.0 | 600.0 | 0.0 | 0.0 | 0.0 | 600.0 |
|
||||||
|
|||||||
+13
-8
@@ -237,7 +237,7 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep
|
|||||||
for (final ChangeOperation changeOperation : changeOperations) {
|
for (final ChangeOperation changeOperation : changeOperations) {
|
||||||
if (changeOperation.isLoanTermVariationsData()) {
|
if (changeOperation.isLoanTermVariationsData()) {
|
||||||
final LoanTermVariationsData termVariationsData = changeOperation.getLoanTermVariationsData().get();
|
final LoanTermVariationsData termVariationsData = changeOperation.getLoanTermVariationsData().get();
|
||||||
processLoanTermVariation(installments, termVariationsData, scheduleModel);
|
processLoanTermVariation(termVariationsData, ctx);
|
||||||
} else if (changeOperation.isTransaction()) {
|
} else if (changeOperation.isTransaction()) {
|
||||||
LoanTransaction transaction = changeOperation.getLoanTransaction().get();
|
LoanTransaction transaction = changeOperation.getLoanTransaction().get();
|
||||||
if (loan.getStatus().isOverpaid() && transaction.isAccrualActivity()) {
|
if (loan.getStatus().isOverpaid() && transaction.isAccrualActivity()) {
|
||||||
@@ -303,12 +303,14 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep
|
|||||||
.map(TransactionChangeData::getNewTransaction).findFirst().orElse(transaction);
|
.map(TransactionChangeData::getNewTransaction).findFirst().orElse(transaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processLoanTermVariation(final List<LoanRepaymentScheduleInstallment> installments,
|
private void processLoanTermVariation(final LoanTermVariationsData termVariationsData, final ProgressiveTransactionCtx ctx) {
|
||||||
final LoanTermVariationsData termVariationsData, final ProgressiveLoanInterestScheduleModel scheduleModel) {
|
final List<LoanRepaymentScheduleInstallment> installments = ctx.getInstallments();
|
||||||
|
final ProgressiveLoanInterestScheduleModel scheduleModel = ctx.getModel();
|
||||||
switch (termVariationsData.getTermVariationType()) {
|
switch (termVariationsData.getTermVariationType()) {
|
||||||
case INTEREST_PAUSE -> handleInterestPause(installments, termVariationsData, scheduleModel);
|
case INTEREST_PAUSE -> handleInterestPause(installments, termVariationsData, scheduleModel);
|
||||||
case INTEREST_RATE_FROM_INSTALLMENT -> handleChangeInterestRate(installments, termVariationsData, scheduleModel);
|
case INTEREST_RATE_FROM_INSTALLMENT -> handleChangeInterestRate(installments, termVariationsData, scheduleModel);
|
||||||
case EXTEND_REPAYMENT_PERIOD -> handleExtraRepaymentPeriod(installments, termVariationsData, scheduleModel);
|
case EXTEND_REPAYMENT_PERIOD ->
|
||||||
|
handleExtraRepaymentPeriod(installments, termVariationsData, scheduleModel, ctx.getAlreadyProcessedTransactions());
|
||||||
case DUE_DATE -> handleDueDateChangeOnRepaymentPeriod(installments, termVariationsData, scheduleModel);
|
case DUE_DATE -> handleDueDateChangeOnRepaymentPeriod(installments, termVariationsData, scheduleModel);
|
||||||
default -> throw new IllegalStateException("Unhandled LoanTermVariationType.");
|
default -> throw new IllegalStateException("Unhandled LoanTermVariationType.");
|
||||||
}
|
}
|
||||||
@@ -396,10 +398,12 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void handleExtraRepaymentPeriod(final List<LoanRepaymentScheduleInstallment> installments,
|
private void handleExtraRepaymentPeriod(final List<LoanRepaymentScheduleInstallment> installments,
|
||||||
final LoanTermVariationsData termVariationsData, final ProgressiveLoanInterestScheduleModel scheduleModel) {
|
final LoanTermVariationsData termVariationsData, final ProgressiveLoanInterestScheduleModel scheduleModel,
|
||||||
|
final List<LoanTransaction> alreadyProcessedTransactions) {
|
||||||
final LocalDate interestRateChangeSubmittedOnDate = termVariationsData.getTermVariationApplicableFrom();
|
final LocalDate interestRateChangeSubmittedOnDate = termVariationsData.getTermVariationApplicableFrom();
|
||||||
final int repaymentPeriodsToAdd = termVariationsData.getDecimalValue().intValue();
|
final int repaymentPeriodsToAdd = termVariationsData.getDecimalValue().intValue();
|
||||||
emiCalculator.addRepaymentPeriods(scheduleModel, interestRateChangeSubmittedOnDate, repaymentPeriodsToAdd);
|
emiCalculator.addRepaymentPeriods(scheduleModel, interestRateChangeSubmittedOnDate, repaymentPeriodsToAdd,
|
||||||
|
alreadyProcessedTransactions);
|
||||||
final Loan loan = installments.getFirst().getLoan();
|
final Loan loan = installments.getFirst().getLoan();
|
||||||
|
|
||||||
int nextInstallmentNumber = installments.stream().mapToInt(LoanRepaymentScheduleInstallment::getInstallmentNumber).max().orElse(0)
|
int nextInstallmentNumber = installments.stream().mapToInt(LoanRepaymentScheduleInstallment::getInstallmentNumber).max().orElse(0)
|
||||||
@@ -419,6 +423,7 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
processInterestRateChangeOnInstallments(scheduleModel, interestRateChangeSubmittedOnDate, installments);
|
processInterestRateChangeOnInstallments(scheduleModel, interestRateChangeSubmittedOnDate, installments);
|
||||||
|
reprocessInstallments(installments);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleChangeInterestRate(final List<LoanRepaymentScheduleInstallment> installments,
|
private void handleChangeInterestRate(final List<LoanRepaymentScheduleInstallment> installments,
|
||||||
@@ -3219,7 +3224,7 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep
|
|||||||
}).map(LoanTermVariations::toData).collect(Collectors.toCollection(ArrayList::new));
|
}).map(LoanTermVariations::toData).collect(Collectors.toCollection(ArrayList::new));
|
||||||
|
|
||||||
for (LoanTermVariationsData termVariationsData : loanTermVariationsToReprocess) {
|
for (LoanTermVariationsData termVariationsData : loanTermVariationsToReprocess) {
|
||||||
processLoanTermVariation(installments, termVariationsData, ctx.getModel());
|
processLoanTermVariation(termVariationsData, ctx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3273,7 +3278,7 @@ public class AdvancedPaymentScheduleTransactionProcessor extends AbstractLoanRep
|
|||||||
installments.stream().sorted(LoanRepaymentScheduleInstallment::compareToByFromDueDate).forEachOrdered(i -> {
|
installments.stream().sorted(LoanRepaymentScheduleInstallment::compareToByFromDueDate).forEachOrdered(i -> {
|
||||||
i.updateInstallmentNumber(counter.getAndIncrement());
|
i.updateInstallmentNumber(counter.getAndIncrement());
|
||||||
final LocalDate prev = previousDueDate.get();
|
final LocalDate prev = previousDueDate.get();
|
||||||
if (prev != null && (i.isAdditional() || i.isReAged())) {
|
if (prev != null && !i.getFromDate().isEqual(prev) && !i.isDownPayment()) {
|
||||||
i.updateFromDate(prev);
|
i.updateFromDate(prev);
|
||||||
}
|
}
|
||||||
previousDueDate.set(i.getDueDate());
|
previousDueDate.set(i.getDueDate());
|
||||||
|
|||||||
+2
-1
@@ -27,6 +27,7 @@ import java.util.Optional;
|
|||||||
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
|
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
|
||||||
import org.apache.fineract.organisation.monetary.domain.Money;
|
import org.apache.fineract.organisation.monetary.domain.Money;
|
||||||
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
|
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
|
||||||
|
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
|
||||||
import org.apache.fineract.portfolio.loanaccount.domain.reaging.LoanReAgeParameter;
|
import org.apache.fineract.portfolio.loanaccount.domain.reaging.LoanReAgeParameter;
|
||||||
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplicationTerms;
|
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplicationTerms;
|
||||||
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModelRepaymentPeriod;
|
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModelRepaymentPeriod;
|
||||||
@@ -81,7 +82,7 @@ public interface EMICalculator {
|
|||||||
BigDecimal newInterestRate);
|
BigDecimal newInterestRate);
|
||||||
|
|
||||||
void addRepaymentPeriods(ProgressiveLoanInterestScheduleModel scheduleModel, LocalDate submittedOnDate,
|
void addRepaymentPeriods(ProgressiveLoanInterestScheduleModel scheduleModel, LocalDate submittedOnDate,
|
||||||
int numberOfRepaymentPeriodsToAdd);
|
int numberOfRepaymentPeriodsToAdd, List<LoanTransaction> alreadyProcessedTransactions);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method applies outstanding balance correction on the interest model. Negative amount decreases the
|
* This method applies outstanding balance correction on the interest model. Negative amount decreases the
|
||||||
|
|||||||
+14
-7
@@ -46,6 +46,7 @@ import org.apache.fineract.portfolio.common.domain.DaysInYearCustomStrategyType;
|
|||||||
import org.apache.fineract.portfolio.common.domain.DaysInYearType;
|
import org.apache.fineract.portfolio.common.domain.DaysInYearType;
|
||||||
import org.apache.fineract.portfolio.common.domain.PeriodFrequencyType;
|
import org.apache.fineract.portfolio.common.domain.PeriodFrequencyType;
|
||||||
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
|
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment;
|
||||||
|
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
|
||||||
import org.apache.fineract.portfolio.loanaccount.domain.reaging.LoanReAgeInterestHandlingType;
|
import org.apache.fineract.portfolio.loanaccount.domain.reaging.LoanReAgeInterestHandlingType;
|
||||||
import org.apache.fineract.portfolio.loanaccount.domain.reaging.LoanReAgeParameter;
|
import org.apache.fineract.portfolio.loanaccount.domain.reaging.LoanReAgeParameter;
|
||||||
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplicationTerms;
|
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanApplicationTerms;
|
||||||
@@ -185,18 +186,24 @@ public final class ProgressiveEMICalculator implements EMICalculator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addRepaymentPeriods(final ProgressiveLoanInterestScheduleModel scheduleModel, final LocalDate submittedOnDate,
|
public void addRepaymentPeriods(final ProgressiveLoanInterestScheduleModel scheduleModel, final LocalDate submittedOnDate,
|
||||||
final int numberOfRepaymentPeriodsToAdd) {
|
final int numberOfRepaymentPeriodsToAdd, final List<LoanTransaction> alreadyProcessedTransactions) {
|
||||||
addRepaymentPeriods(scheduleModel,
|
addRepaymentPeriods(scheduleModel,
|
||||||
EmiChangeOperation.addRepaymentPeriods(submittedOnDate, scheduleModel.zero(), numberOfRepaymentPeriodsToAdd));
|
EmiChangeOperation.addRepaymentPeriods(submittedOnDate, scheduleModel.zero(), numberOfRepaymentPeriodsToAdd),
|
||||||
|
alreadyProcessedTransactions);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addRepaymentPeriods(final ProgressiveLoanInterestScheduleModel scheduleModel, final EmiChangeOperation operation) {
|
private void addRepaymentPeriods(final ProgressiveLoanInterestScheduleModel scheduleModel, final EmiChangeOperation operation,
|
||||||
LocalDate disbursementDate = scheduleModel.getStartDate();
|
final List<LoanTransaction> alreadyProcessedTransactions) {
|
||||||
int repaymentPeriodCount = scheduleModel.repaymentPeriods().size();
|
final Optional<LoanReAgeParameter> reAgeTransactionParameter = alreadyProcessedTransactions.stream()
|
||||||
|
.filter(t -> t.isReAge() && !t.isReversed()).findFirst().map(LoanTransaction::getLoanReAgeParameter);
|
||||||
|
final LocalDate seedDate = reAgeTransactionParameter.map(LoanReAgeParameter::getStartDate).orElse(scheduleModel.getStartDate());
|
||||||
|
final int repaymentPeriodCount = reAgeTransactionParameter.map(param -> param.getNumberOfInstallments() - 1)
|
||||||
|
.orElse(scheduleModel.repaymentPeriods().size());
|
||||||
|
|
||||||
final LocalDate interestRateChangeEffectiveDate = operation.getSubmittedOnDate().minusDays(1);
|
final LocalDate interestRateChangeEffectiveDate = operation.getSubmittedOnDate().minusDays(1);
|
||||||
|
|
||||||
List<LocalDateInterval> periods2 = generateAdditionalRepaymentPeriodDueDates(scheduleModel, operation.getPeriodsToAdd(),
|
final List<LocalDateInterval> periods2 = generateAdditionalRepaymentPeriodDueDates(scheduleModel, operation.getPeriodsToAdd(),
|
||||||
repaymentPeriodCount, scheduleModel.resolveRepaymentPEriodLengthGeneratorFunction(disbursementDate));
|
repaymentPeriodCount, scheduleModel.resolveRepaymentPeriodLengthGeneratorFunction(seedDate));
|
||||||
updateModel(scheduleModel, periods2, LocalDateInterval::startDate, LocalDateInterval::endDate);
|
updateModel(scheduleModel, periods2, LocalDateInterval::startDate, LocalDateInterval::endDate);
|
||||||
|
|
||||||
scheduleModel
|
scheduleModel
|
||||||
|
|||||||
+1
-4
@@ -420,7 +420,7 @@ public class ProgressiveLoanInterestScheduleModel {
|
|||||||
return this.modifiers.get(COPY);
|
return this.modifiers.get(COPY);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Function<Long, LocalDate> resolveRepaymentPEriodLengthGeneratorFunction(LocalDate instance) {
|
public Function<Long, LocalDate> resolveRepaymentPeriodLengthGeneratorFunction(final LocalDate instance) {
|
||||||
return switch (loanProductRelatedDetail.getRepaymentPeriodFrequencyType()) {
|
return switch (loanProductRelatedDetail.getRepaymentPeriodFrequencyType()) {
|
||||||
case MONTHS -> instance::plusMonths;
|
case MONTHS -> instance::plusMonths;
|
||||||
case WEEKS -> instance::plusWeeks;
|
case WEEKS -> instance::plusWeeks;
|
||||||
@@ -429,7 +429,4 @@ public class ProgressiveLoanInterestScheduleModel {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInterestRecalculationIsAllowed() {
|
|
||||||
return modifiers.get(INTEREST_RECALCULATION_ENABLED);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-8
@@ -4049,14 +4049,14 @@ class ProgressiveEMICalculatorTest {
|
|||||||
checkPeriod(interestSchedule, 2, 340.03, 3.37, 336.66, 0.00, false); //
|
checkPeriod(interestSchedule, 2, 340.03, 3.37, 336.66, 0.00, false); //
|
||||||
|
|
||||||
// add extra repayment period 1
|
// add extra repayment period 1
|
||||||
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 7, 2), 1);
|
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 7, 2), 1, List.of());
|
||||||
|
|
||||||
checkPeriod(interestSchedule, 0, 340.02, 10.00, 330.02, 669.98, false); //
|
checkPeriod(interestSchedule, 0, 340.02, 10.00, 330.02, 669.98, false); //
|
||||||
checkPeriod(interestSchedule, 1, 227.81, 6.70, 221.11, 448.87, false); //
|
checkPeriod(interestSchedule, 1, 227.81, 6.70, 221.11, 448.87, false); //
|
||||||
checkPeriod(interestSchedule, 2, 227.81, 4.49, 223.32, 225.55, false); //
|
checkPeriod(interestSchedule, 2, 227.81, 4.49, 223.32, 225.55, false); //
|
||||||
checkPeriod(interestSchedule, 3, 227.81, 2.26, 225.55, 0.00, false); //
|
checkPeriod(interestSchedule, 3, 227.81, 2.26, 225.55, 0.00, false); //
|
||||||
|
|
||||||
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 8, 2), 2);
|
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 8, 2), 2, List.of());
|
||||||
|
|
||||||
checkPeriod(interestSchedule, 0, 340.02, 10.00, 330.02, 669.98, false); //
|
checkPeriod(interestSchedule, 0, 340.02, 10.00, 330.02, 669.98, false); //
|
||||||
checkPeriod(interestSchedule, 1, 227.81, 6.70, 221.11, 448.87, false); //
|
checkPeriod(interestSchedule, 1, 227.81, 6.70, 221.11, 448.87, false); //
|
||||||
@@ -4088,14 +4088,14 @@ class ProgressiveEMICalculatorTest {
|
|||||||
checkPeriod(interestSchedule, 2, 343.34, 10.00, 333.34, 0.00, false); //
|
checkPeriod(interestSchedule, 2, 343.34, 10.00, 333.34, 0.00, false); //
|
||||||
|
|
||||||
// add extra repayment period 1
|
// add extra repayment period 1
|
||||||
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 7, 2), 1);
|
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 7, 2), 1, List.of());
|
||||||
|
|
||||||
checkPeriod(interestSchedule, 0, 343.33, 10.00, 333.33, 666.67, false); //
|
checkPeriod(interestSchedule, 0, 343.33, 10.00, 333.33, 666.67, false); //
|
||||||
checkPeriod(interestSchedule, 1, 232.22, 10.00, 222.22, 444.45, false); //
|
checkPeriod(interestSchedule, 1, 232.22, 10.00, 222.22, 444.45, false); //
|
||||||
checkPeriod(interestSchedule, 2, 232.22, 10.00, 222.22, 222.23, false); //
|
checkPeriod(interestSchedule, 2, 232.22, 10.00, 222.22, 222.23, false); //
|
||||||
checkPeriod(interestSchedule, 3, 232.23, 10.00, 222.23, 0.00, false); //
|
checkPeriod(interestSchedule, 3, 232.23, 10.00, 222.23, 0.00, false); //
|
||||||
|
|
||||||
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 8, 2), 2);
|
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 8, 2), 2, List.of());
|
||||||
|
|
||||||
checkPeriod(interestSchedule, 0, 343.33, 10.00, 333.33, 666.67, false); //
|
checkPeriod(interestSchedule, 0, 343.33, 10.00, 333.33, 666.67, false); //
|
||||||
checkPeriod(interestSchedule, 1, 232.22, 10.00, 222.22, 444.45, false); //
|
checkPeriod(interestSchedule, 1, 232.22, 10.00, 222.22, 444.45, false); //
|
||||||
@@ -4140,7 +4140,7 @@ class ProgressiveEMICalculatorTest {
|
|||||||
checkPeriod(interestSchedule, 3, 256.29, 0.00, 256.29, 0.00, true); //
|
checkPeriod(interestSchedule, 3, 256.29, 0.00, 256.29, 0.00, true); //
|
||||||
|
|
||||||
// add extra repayment period 1
|
// add extra repayment period 1
|
||||||
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 6, 15), 1);
|
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 6, 15), 1, List.of());
|
||||||
|
|
||||||
// verify 1st and 4th installments are not modified, additional principal paid are substract from last
|
// verify 1st and 4th installments are not modified, additional principal paid are substract from last
|
||||||
// period
|
// period
|
||||||
@@ -4150,7 +4150,7 @@ class ProgressiveEMICalculatorTest {
|
|||||||
checkPeriod(interestSchedule, 3, 256.29, 0.00, 256.29, 88.00, true); //
|
checkPeriod(interestSchedule, 3, 256.29, 0.00, 256.29, 88.00, true); //
|
||||||
checkPeriod(interestSchedule, 4, 89.76, 1.76, 88.00, 0.00, false); //
|
checkPeriod(interestSchedule, 4, 89.76, 1.76, 88.00, 0.00, false); //
|
||||||
|
|
||||||
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 6, 15), 2);
|
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 6, 15), 2, List.of());
|
||||||
|
|
||||||
// verify 1st and 4th installments are not modified, additional principal paid are substract from last
|
// verify 1st and 4th installments are not modified, additional principal paid are substract from last
|
||||||
// periods
|
// periods
|
||||||
@@ -4210,7 +4210,7 @@ class ProgressiveEMICalculatorTest {
|
|||||||
checkPeriod(interestSchedule, 3, 260.00, 10.00, 250.00, 0.00, true); //
|
checkPeriod(interestSchedule, 3, 260.00, 10.00, 250.00, 0.00, true); //
|
||||||
|
|
||||||
// add extra repayment period 1
|
// add extra repayment period 1
|
||||||
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 6, 15), 1);
|
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 6, 15), 1, List.of());
|
||||||
|
|
||||||
// verify 1st and 4th installments are not modified, additional principal paid are substract from last
|
// verify 1st and 4th installments are not modified, additional principal paid are substract from last
|
||||||
// period
|
// period
|
||||||
@@ -4221,7 +4221,7 @@ class ProgressiveEMICalculatorTest {
|
|||||||
checkPeriod(interestSchedule, 4, 110.00, 10.00, 100.00, 0.00, false); //
|
checkPeriod(interestSchedule, 4, 110.00, 10.00, 100.00, 0.00, false); //
|
||||||
|
|
||||||
// add extra repayment period 2
|
// add extra repayment period 2
|
||||||
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 6, 15), 2);
|
emiCalculator.addRepaymentPeriods(interestSchedule, LocalDate.of(2024, 6, 15), 2, List.of());
|
||||||
|
|
||||||
// verify 1st and 4th installments are not modified, additional principal paid are substract from last
|
// verify 1st and 4th installments are not modified, additional principal paid are substract from last
|
||||||
// periods
|
// periods
|
||||||
|
|||||||
Reference in New Issue
Block a user