diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/JournalEntriesStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/JournalEntriesStepDef.java index 74fefcae0..b1b2e0941 100644 --- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/JournalEntriesStepDef.java +++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/JournalEntriesStepDef.java @@ -108,6 +108,10 @@ public class JournalEntriesStepDef extends AbstractStepDef { }).collect(Collectors.toList()); List> data = table.asLists(); + final int expectedCount = data.size() - 1; + final int actualCount = journalLinesActualList.stream().mapToInt(List::size).sum(); + assertThat(actualCount).as("The number of journal entries for the transaction does not match the expected count! Expected: " + + expectedCount + ", Actual: " + actualCount).isEqualTo(expectedCount); for (int i = 1; i < data.size(); i++) { List>> possibleActualValuesList = new ArrayList<>(); List expectedValues = data.get(i); diff --git a/fineract-e2e-tests-runner/src/test/resources/features/Loan.feature b/fineract-e2e-tests-runner/src/test/resources/features/Loan.feature index e9d1532c9..82866bd59 100644 --- a/fineract-e2e-tests-runner/src/test/resources/features/Loan.feature +++ b/fineract-e2e-tests-runner/src/test/resources/features/Loan.feature @@ -501,8 +501,6 @@ Feature: Loan | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 450.0 | | LIABILITY | 145023 | Suspense/Clearing account | 450.0 | | - Then Loan Transactions tab has a "REPAYMENT" transaction with date "05 January 2023" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 100.0 | | LIABILITY | l1 | Overpayment account | | 200.0 | | LIABILITY | 145023 | Suspense/Clearing account | 300.0 | | @@ -544,8 +542,6 @@ Feature: Loan | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 450.0 | | LIABILITY | 145023 | Suspense/Clearing account | 450.0 | | - Then Loan Transactions tab has a "REPAYMENT" transaction with date "05 January 2023" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 300.0 | | LIABILITY | 145023 | Suspense/Clearing account | 300.0 | | @@ -686,8 +682,6 @@ Feature: Loan | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 450.0 | | LIABILITY | 145023 | Suspense/Clearing account | 450.0 | | - Then Loan Transactions tab has a "REPAYMENT" transaction with date "05 January 2023" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 100.0 | | LIABILITY | l1 | Overpayment account | | 200.0 | | LIABILITY | 145023 | Suspense/Clearing account | 300.0 | | @@ -729,8 +723,6 @@ Feature: Loan | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 700.0 | | LIABILITY | 145023 | Suspense/Clearing account | 700.0 | | - Then Loan Transactions tab has a "REPAYMENT" transaction with date "05 January 2023" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 300.0 | | LIABILITY | 145023 | Suspense/Clearing account | 300.0 | | diff --git a/fineract-e2e-tests-runner/src/test/resources/features/LoanAccrualTransaction.feature b/fineract-e2e-tests-runner/src/test/resources/features/LoanAccrualTransaction.feature index a174cb11c..5afc0213e 100644 --- a/fineract-e2e-tests-runner/src/test/resources/features/LoanAccrualTransaction.feature +++ b/fineract-e2e-tests-runner/src/test/resources/features/LoanAccrualTransaction.feature @@ -1566,4 +1566,28 @@ Feature: LoanAccrualTransaction | 19 February 2025 | Repayment | 376.21 | 272.65 | 103.56 | 0.0 | 0.0 | 3477.35 | false | false | | 20 February 2025 | Merchant Issued Refund | 1881.05 | 1881.05 | 0.0 | 0.0 | 0.0 | 1596.3 | false | false | | 20 February 2025 | Accrual | 3.7 | 0.0 | 3.7 | 0.0 | 0.0 | 0.0 | false | false | - | 21 February 2025 | Accrual | 3.7 | 0.0 | 3.7 | 0.0 | 0.0 | 0.0 | false | false | \ No newline at end of file + | 21 February 2025 | Accrual | 3.7 | 0.0 | 3.7 | 0.0 | 0.0 | 0.0 | false | false | + + @TestRailId:C3733 + Scenario: Accruals on accounts where charge adjustments and refunds are done on the same day should not cause duplicate journal entries + When Admin sets the business date to "12 May 2025" + And Admin creates a client with random data + When Admin creates a fully customized loan with the following data: + | LoanProduct | submitted on date | with Principal | ANNUAL interest rate % | interest type | interest calculation period | amortization type | loanTermFrequency | loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | interest free period | Payment strategy | + | LP2_ADV_PYMNT_360_30_INTEREST_RECALCULATION_ZERO_INTEREST_CHARGE_OFF_ACCRUAL_ACTIVITY | 12 May 2025 | 50 | 12.19 | DECLINING_BALANCE | DAILY | EQUAL_INSTALLMENTS | 1 | MONTHS | 1 | MONTHS | 1 | 0 | 0 | 0 | ADVANCED_PAYMENT_ALLOCATION | + And Admin successfully approves the loan on "12 May 2025" with "50" amount and expected disbursement date on "12 May 2025" + And Admin successfully disburse the loan on "12 May 2025" with "48.25" EUR transaction amount + When Admin adds "LOAN_NSF_FEE" due date charge with "12 May 2025" due date and 1.30 EUR transaction amount + And Admin makes a charge adjustment for the last "LOAN_NSF_FEE" type charge which is due on "12 May 2025" with 1.30 EUR transaction amount and externalId "" + When Admin makes "PAYOUT_REFUND" transaction with "AUTOPAY" payment type on "12 May 2025" with 48.25 EUR transaction amount + Then Loan Transactions tab has the following data: + | Transaction date | Transaction Type | Amount | Principal | Interest | Fees | Penalties | Loan Balance | + | 12 May 2025 | Disbursement | 48.25 | 0.0 | 0.0 | 0.0 | 0.0 | 48.25 | + | 12 May 2025 | Charge Adjustment | 1.3 | 0.0 | 0.0 | 0.0 | 1.3 | 48.25 | + | 12 May 2025 | Payout Refund | 48.25 | 48.25 | 0.0 | 0.0 | 0.0 | 0.0 | + | 12 May 2025 | Accrual | 1.3 | 0.0 | 0.0 | 0.0 | 1.3 | 0.0 | + | 12 May 2025 | Accrual Activity | 1.3 | 0.0 | 0.0 | 0.0 | 1.3 | 0.0 | + Then Loan Transactions tab has a "ACCRUAL" transaction with date "12 May 2025" which has the following Journal entries: + | Type | Account code | Account name | Debit | Credit | + | ASSET | 112603 | Interest/Fee Receivable | 1.3 | | + | INCOME | 404007 | Fee Income | | 1.3 | \ No newline at end of file diff --git a/fineract-e2e-tests-runner/src/test/resources/features/LoanCBR.feature b/fineract-e2e-tests-runner/src/test/resources/features/LoanCBR.feature index a342edd50..e3f83fc1d 100644 --- a/fineract-e2e-tests-runner/src/test/resources/features/LoanCBR.feature +++ b/fineract-e2e-tests-runner/src/test/resources/features/LoanCBR.feature @@ -37,8 +37,6 @@ Feature: Credit Balance Refund | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 500.0 | | LIABILITY | 145023 | Suspense/Clearing account | 500.0 | | - Then Loan Transactions tab has a "REPAYMENT" transaction with date "05 January 2023" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 500.0 | | LIABILITY | l1 | Overpayment account | | 100.0 | | LIABILITY | 145023 | Suspense/Clearing account | 600.0 | | @@ -78,8 +76,6 @@ Feature: Credit Balance Refund | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 450.0 | | LIABILITY | 145023 | Suspense/Clearing account | 450.0 | | - Then Loan Transactions tab has a "REPAYMENT" transaction with date "05 January 2023" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 100.0 | | LIABILITY | l1 | Overpayment account | | 200.0 | | LIABILITY | 145023 | Suspense/Clearing account | 300.0 | | @@ -1410,6 +1406,8 @@ Feature: Credit Balance Refund | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 100.0 | | LIABILITY | 145023 | Suspense/Clearing account | 100.0 | | + | ASSET | 112601 | Loans Receivable | 100.0 | | + | LIABILITY | 145023 | Suspense/Clearing account | | 100.0 | Then Loan Transactions tab has a "CHARGE_OFF" transaction with date "03 January 2024" which has the following Journal entries: | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 750.0 | diff --git a/fineract-e2e-tests-runner/src/test/resources/features/LoanCharge.feature b/fineract-e2e-tests-runner/src/test/resources/features/LoanCharge.feature index cede9f5a4..911a0a9d6 100644 --- a/fineract-e2e-tests-runner/src/test/resources/features/LoanCharge.feature +++ b/fineract-e2e-tests-runner/src/test/resources/features/LoanCharge.feature @@ -350,14 +350,12 @@ Feature: LoanCharge | ASSET | 112601 | Loans Receivable | 1.0 | | | ASSET | 112603 | Interest/Fee Receivable | 2.0 | | | INCOME | 404007 | Fee Income | | 3.0 | + | ASSET | 112603 | Interest/Fee Receivable | | 4.0 | + | INCOME | 404007 | Fee Income | 4.0 | | Then Loan Transactions tab has a "ACCRUAL" transaction with date "04 November 2022" which has the following Journal entries: | Type | Account code | Account name | Debit | Credit | | ASSET | 112603 | Interest/Fee Receivable | 9.0 | | | INCOME | 404007 | Fee Income | | 9.0 | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112603 | Interest/Fee Receivable | | 4.0 | - | INCOME | 404007 | Fee Income | 4.0 | | # --- Backdated repayment with 507 EUR --- And Customer makes "AUTOPAY" repayment on "31 October 2022" with 507 EUR transaction amount Then Loan has 500 outstanding amount @@ -408,14 +406,12 @@ Feature: LoanCharge | ASSET | 112601 | Loans Receivable | 1.0 | | | ASSET | 112603 | Interest/Fee Receivable | 2.0 | | | INCOME | 404007 | Fee Income | | 3.0 | + | ASSET | 112601 | Loans Receivable | | 4.0 | + | INCOME | 404007 | Fee Income | 4.0 | | Then Loan Transactions tab has a "ACCRUAL" transaction with date "04 November 2022" which has the following Journal entries: | Type | Account code | Account name | Debit | Credit | | ASSET | 112603 | Interest/Fee Receivable | 9.0 | | | INCOME | 404007 | Fee Income | | 9.0 | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 4.0 | - | INCOME | 404007 | Fee Income | 4.0 | | # --- charge adjustment for nsf fee with 5 --- When Admin makes a charge adjustment for the last "LOAN_NSF_FEE" type charge which is due on "23 October 2022" with 5 EUR transaction amount and externalId "" Then Loan has 495 outstanding amount @@ -467,18 +463,14 @@ Feature: LoanCharge | ASSET | 112601 | Loans Receivable | 1.0 | | | ASSET | 112603 | Interest/Fee Receivable | 2.0 | | | INCOME | 404007 | Fee Income | | 3.0 | + | ASSET | 112601 | Loans Receivable | | 4.0 | + | INCOME | 404007 | Fee Income | 4.0 | | + | ASSET | 112601 | Loans Receivable | | 5.0 | + | INCOME | 404007 | Fee Income | 5.0 | | Then Loan Transactions tab has a "ACCRUAL" transaction with date "04 November 2022" which has the following Journal entries: | Type | Account code | Account name | Debit | Credit | | ASSET | 112603 | Interest/Fee Receivable | 9.0 | | | INCOME | 404007 | Fee Income | | 9.0 | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 4.0 | - | INCOME | 404007 | Fee Income | 4.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 5.0 | - | INCOME | 404007 | Fee Income | 5.0 | | # --- Backdated repayment with 494 EUR --- And Customer makes "AUTOPAY" repayment on "1 November 2022" with 494 EUR transaction amount Then Loan has 1 outstanding amount @@ -535,18 +527,14 @@ Feature: LoanCharge | ASSET | 112601 | Loans Receivable | 1.0 | | | ASSET | 112603 | Interest/Fee Receivable | 2.0 | | | INCOME | 404007 | Fee Income | | 3.0 | + | ASSET | 112601 | Loans Receivable | | 4.0 | + | INCOME | 404007 | Fee Income | 4.0 | | + | ASSET | 112601 | Loans Receivable | | 5.0 | + | INCOME | 404007 | Fee Income | 5.0 | | Then Loan Transactions tab has a "ACCRUAL" transaction with date "04 November 2022" which has the following Journal entries: | Type | Account code | Account name | Debit | Credit | | ASSET | 112603 | Interest/Fee Receivable | 9.0 | | | INCOME | 404007 | Fee Income | | 9.0 | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 4.0 | - | INCOME | 404007 | Fee Income | 4.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 5.0 | - | INCOME | 404007 | Fee Income | 5.0 | | # --- charge adjustment for snooze fee with 1 --- When Admin makes a charge adjustment for the last "LOAN_SNOOZE_FEE" type charge which is due on "27 October 2022" with 1 EUR transaction amount and externalId "" Then Loan status will be "CLOSED_OBLIGATIONS_MET" @@ -605,22 +593,16 @@ Feature: LoanCharge | ASSET | 112601 | Loans Receivable | 1.0 | | | ASSET | 112603 | Interest/Fee Receivable | 2.0 | | | INCOME | 404007 | Fee Income | | 3.0 | + | ASSET | 112601 | Loans Receivable | | 4.0 | + | INCOME | 404007 | Fee Income | 4.0 | | + | ASSET | 112601 | Loans Receivable | | 5.0 | + | INCOME | 404007 | Fee Income | 5.0 | | + | ASSET | 112601 | Loans Receivable | | 1.0 | + | INCOME | 404007 | Fee Income | 1.0 | | Then Loan Transactions tab has a "ACCRUAL" transaction with date "04 November 2022" which has the following Journal entries: | Type | Account code | Account name | Debit | Credit | | ASSET | 112603 | Interest/Fee Receivable | 9.0 | | | INCOME | 404007 | Fee Income | | 9.0 | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 4.0 | - | INCOME | 404007 | Fee Income | 4.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 5.0 | - | INCOME | 404007 | Fee Income | 5.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 1.0 | - | INCOME | 404007 | Fee Income | 1.0 | | # --- revert last charge adjustment (was amount 1) --- When Admin reverts the charge adjustment which was raised on "04 November 2022" with 1 EUR transaction amount Then Loan status will be "ACTIVE" @@ -679,24 +661,18 @@ Feature: LoanCharge | ASSET | 112601 | Loans Receivable | 1.0 | | | ASSET | 112603 | Interest/Fee Receivable | 2.0 | | | INCOME | 404007 | Fee Income | | 3.0 | + | ASSET | 112601 | Loans Receivable | | 4.0 | + | INCOME | 404007 | Fee Income | 4.0 | | + | ASSET | 112601 | Loans Receivable | | 5.0 | + | INCOME | 404007 | Fee Income | 5.0 | | + | ASSET | 112601 | Loans Receivable | | 1.0 | + | INCOME | 404007 | Fee Income | 1.0 | | + | ASSET | 112601 | Loans Receivable | 1.0 | | + | INCOME | 404007 | Fee Income | | 1.0 | Then Loan Transactions tab has a "ACCRUAL" transaction with date "04 November 2022" which has the following Journal entries: | Type | Account code | Account name | Debit | Credit | | ASSET | 112603 | Interest/Fee Receivable | 9.0 | | | INCOME | 404007 | Fee Income | | 9.0 | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 4.0 | - | INCOME | 404007 | Fee Income | 4.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 5.0 | - | INCOME | 404007 | Fee Income | 5.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 1.0 | - | INCOME | 404007 | Fee Income | 1.0 | | - | ASSET | 112601 | Loans Receivable | 1.0 | | - | INCOME | 404007 | Fee Income | | 1.0 | # --- charge adjustment for nsf fee with 1 --- When Admin makes a charge adjustment for the last "LOAN_NSF_FEE" type charge which is due on "23 October 2022" with 1 EUR transaction amount and externalId "" Then Loan status will be "CLOSED_OBLIGATIONS_MET" @@ -756,28 +732,20 @@ Feature: LoanCharge | ASSET | 112601 | Loans Receivable | 1.0 | | | ASSET | 112603 | Interest/Fee Receivable | 2.0 | | | INCOME | 404007 | Fee Income | | 3.0 | + | ASSET | 112601 | Loans Receivable | | 4.0 | + | INCOME | 404007 | Fee Income | 4.0 | | + | ASSET | 112601 | Loans Receivable | | 5.0 | + | INCOME | 404007 | Fee Income | 5.0 | | + | ASSET | 112601 | Loans Receivable | | 1.0 | + | INCOME | 404007 | Fee Income | 1.0 | | + | ASSET | 112601 | Loans Receivable | 1.0 | | + | INCOME | 404007 | Fee Income | | 1.0 | + | ASSET | 112601 | Loans Receivable | | 1.0 | + | INCOME | 404007 | Fee Income | 1.0 | | Then Loan Transactions tab has a "ACCRUAL" transaction with date "04 November 2022" which has the following Journal entries: | Type | Account code | Account name | Debit | Credit | | ASSET | 112603 | Interest/Fee Receivable | 9.0 | | | INCOME | 404007 | Fee Income | | 9.0 | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 4.0 | - | INCOME | 404007 | Fee Income | 4.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 5.0 | - | INCOME | 404007 | Fee Income | 5.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 1.0 | - | INCOME | 404007 | Fee Income | 1.0 | | - | ASSET | 112601 | Loans Receivable | 1.0 | | - | INCOME | 404007 | Fee Income | | 1.0 | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 1.0 | - | INCOME | 404007 | Fee Income | 1.0 | | # --- charge adjustment for nsf fee with 2 --- When Admin makes a charge adjustment for the last "LOAN_NSF_FEE" type charge which is due on "23 October 2022" with 2 EUR transaction amount and externalId "" Then Loan status will be "OVERPAID" @@ -831,39 +799,29 @@ Feature: LoanCharge | ASSET | 112601 | Loans Receivable | | 494.0 | | LIABILITY | 145023 | Suspense/Clearing account | 494.0 | | Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 1.0 | - | ASSET | 112603 | Interest/Fee Receivable | | 2.0 | - | INCOME | 404007 | Fee Income | 3.0 | | - | ASSET | 112601 | Loans Receivable | 1.0 | | - | ASSET | 112603 | Interest/Fee Receivable | 2.0 | | - | INCOME | 404007 | Fee Income | | 3.0 | + | Type | Account code | Account name | Debit | Credit | + | ASSET | 112601 | Loans Receivable | | 1.0 | + | ASSET | 112603 | Interest/Fee Receivable | | 2.0 | + | INCOME | 404007 | Fee Income | 3.0 | | + | ASSET | 112601 | Loans Receivable | 1.0 | | + | ASSET | 112603 | Interest/Fee Receivable | 2.0 | | + | INCOME | 404007 | Fee Income | | 3.0 | + | ASSET | 112601 | Loans Receivable | | 4.0 | + | INCOME | 404007 | Fee Income | 4.0 | | + | ASSET | 112601 | Loans Receivable | | 5.0 | + | INCOME | 404007 | Fee Income | 5.0 | | + | ASSET | 112601 | Loans Receivable | | 1.0 | + | INCOME | 404007 | Fee Income | 1.0 | | + | ASSET | 112601 | Loans Receivable | 1.0 | | + | INCOME | 404007 | Fee Income | | 1.0 | + | ASSET | 112601 | Loans Receivable | | 1.0 | + | INCOME | 404007 | Fee Income | 1.0 | | + | LIABILITY | l1 | Overpayment account | | 2.0 | + | INCOME | 404007 | Fee Income | 2.0 | | Then Loan Transactions tab has a "ACCRUAL" transaction with date "04 November 2022" which has the following Journal entries: | Type | Account code | Account name | Debit | Credit | | ASSET | 112603 | Interest/Fee Receivable | 9.0 | | | INCOME | 404007 | Fee Income | | 9.0 | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 4.0 | - | INCOME | 404007 | Fee Income | 4.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 5.0 | - | INCOME | 404007 | Fee Income | 5.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 1.0 | - | INCOME | 404007 | Fee Income | 1.0 | | - | ASSET | 112601 | Loans Receivable | 1.0 | | - | INCOME | 404007 | Fee Income | | 1.0 | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 1.0 | - | INCOME | 404007 | Fee Income | 1.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | LIABILITY | l1 | Overpayment account | | 2.0 | - | INCOME | 404007 | Fee Income | 2.0 | | # --- revert last charge adjustment (was amount 2) --- When Admin reverts the charge adjustment which was raised on "04 November 2022" with 2 EUR transaction amount Then Loan status will be "CLOSED_OBLIGATIONS_MET" @@ -917,41 +875,31 @@ Feature: LoanCharge | ASSET | 112601 | Loans Receivable | | 494.0 | | LIABILITY | 145023 | Suspense/Clearing account | 494.0 | | Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 1.0 | - | ASSET | 112603 | Interest/Fee Receivable | | 2.0 | - | INCOME | 404007 | Fee Income | 3.0 | | - | ASSET | 112601 | Loans Receivable | 1.0 | | - | ASSET | 112603 | Interest/Fee Receivable | 2.0 | | - | INCOME | 404007 | Fee Income | | 3.0 | + | Type | Account code | Account name | Debit | Credit | + | ASSET | 112601 | Loans Receivable | | 1.0 | + | ASSET | 112603 | Interest/Fee Receivable | | 2.0 | + | INCOME | 404007 | Fee Income | 3.0 | | + | ASSET | 112601 | Loans Receivable | 1.0 | | + | ASSET | 112603 | Interest/Fee Receivable | 2.0 | | + | INCOME | 404007 | Fee Income | | 3.0 | + | ASSET | 112601 | Loans Receivable | | 4.0 | + | INCOME | 404007 | Fee Income | 4.0 | | + | ASSET | 112601 | Loans Receivable | | 5.0 | + | INCOME | 404007 | Fee Income | 5.0 | | + | ASSET | 112601 | Loans Receivable | | 1.0 | + | INCOME | 404007 | Fee Income | 1.0 | | + | ASSET | 112601 | Loans Receivable | 1.0 | | + | INCOME | 404007 | Fee Income | | 1.0 | + | ASSET | 112601 | Loans Receivable | | 1.0 | + | INCOME | 404007 | Fee Income | 1.0 | | + | LIABILITY | l1 | Overpayment account | | 2.0 | + | INCOME | 404007 | Fee Income | 2.0 | | + | LIABILITY | l1 | Overpayment account | 2.0 | | + | INCOME | 404007 | Fee Income | | 2.0 | Then Loan Transactions tab has a "ACCRUAL" transaction with date "04 November 2022" which has the following Journal entries: | Type | Account code | Account name | Debit | Credit | | ASSET | 112603 | Interest/Fee Receivable | 9.0 | | | INCOME | 404007 | Fee Income | | 9.0 | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 4.0 | - | INCOME | 404007 | Fee Income | 4.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 5.0 | - | INCOME | 404007 | Fee Income | 5.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 1.0 | - | INCOME | 404007 | Fee Income | 1.0 | | - | ASSET | 112601 | Loans Receivable | 1.0 | | - | INCOME | 404007 | Fee Income | | 1.0 | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | ASSET | 112601 | Loans Receivable | | 1.0 | - | INCOME | 404007 | Fee Income | 1.0 | | - Then Loan Transactions tab has a "CHARGE_ADJUSTMENT" transaction with date "04 November 2022" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | - | LIABILITY | l1 | Overpayment account | | 2.0 | - | INCOME | 404007 | Fee Income | 2.0 | | - | LIABILITY | l1 | Overpayment account | 2.0 | | - | INCOME | 404007 | Fee Income | | 2.0 | @TestRailId:C2532 Scenario: Verify that charge can be added to loan on disbursement date (loan status is 'active') @@ -5386,8 +5334,9 @@ Feature: LoanCharge | 03 March 2024 | Repayment (at time of disbursement) | 5.0 | 0.0 | 0.0 | 5.0 | 0.0 | 167.05 | false | false | | 03 March 2024 | Accrual | 1.1 | 0.0 | 1.1 | 0.0 | 0.0 | 0.0 | false | false | Then Loan Transactions tab has a "ACCRUAL" transaction with date "03 March 2024" which has the following Journal entries: - | ASSET | 112603 | Interest/Fee Receivable | 1.1 | | - | INCOME | 404000 | Interest Income | | 1.1 | + | Type | Account code | Account name | Debit | Credit | + | ASSET | 112603 | Interest/Fee Receivable | 1.1 | | + | INCOME | 404000 | Interest Income | | 1.1 | # Undo disbursement When Admin successfully undo disbursal Then Loan status has changed to "Approved" diff --git a/fineract-e2e-tests-runner/src/test/resources/features/LoanInterestPaymentWaiver.feature b/fineract-e2e-tests-runner/src/test/resources/features/LoanInterestPaymentWaiver.feature index 995a7310e..5c97d2a41 100644 --- a/fineract-e2e-tests-runner/src/test/resources/features/LoanInterestPaymentWaiver.feature +++ b/fineract-e2e-tests-runner/src/test/resources/features/LoanInterestPaymentWaiver.feature @@ -392,8 +392,6 @@ Feature: LoanInterestWaiver | Type | Account code | Account name | Debit | Credit | | ASSET | 112601 | Loans Receivable | | 250.0 | | LIABILITY | 145023 | Suspense/Clearing account | 250.0 | | - Then Loan Transactions tab has a "REPAYMENT" transaction with date "01 February 2024" which has the following Journal entries: - | Type | Account code | Account name | Debit | Credit | | ASSET | 112603 | Interest/Fee Receivable | | 10.0 | | LIABILITY | 145023 | Suspense/Clearing account | 10.0 | | diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingService.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingService.java index 9b763a437..84ac57ab4 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingService.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingService.java @@ -25,11 +25,11 @@ import org.springframework.lang.NonNull; public interface LoanCapitalizedIncomeAmortizationProcessingService { - void processCapitalizedIncomeAmortizationOnLoanClosure(@NonNull Loan loan); + void processCapitalizedIncomeAmortizationOnLoanClosure(@NonNull Loan loan, boolean addJournal); void processCapitalizedIncomeAmortizationOnLoanChargeOff(@NonNull Loan loan, @NonNull LoanTransaction chargeOffTransaction); void processCapitalizedIncomeAmortizationOnLoanUndoChargeOff(@NonNull LoanTransaction loanTransaction); - void processCapitalizedIncomeAmortizationTillDate(@NonNull Loan loan, @NonNull LocalDate tillDate); + void processCapitalizedIncomeAmortizationTillDate(@NonNull Loan loan, @NonNull LocalDate tillDate, boolean addJournal); } diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImpl.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImpl.java index fb4b8d80f..dfc76a455 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImpl.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImpl.java @@ -29,7 +29,6 @@ import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.domain.ExternalId; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.core.service.MathUtil; -import org.apache.fineract.infrastructure.event.business.domain.loan.LoanBalanceChangedBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanTransactionDownPaymentPostBusinessEvent; import org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanTransactionDownPaymentPreBusinessEvent; import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService; @@ -73,7 +72,6 @@ public class LoanDownPaymentHandlerServiceImpl implements LoanDownPaymentHandler if (downPaymentTransaction != null) { downPaymentTransaction = loanTransactionRepository.saveAndFlush(downPaymentTransaction); businessEventNotifierService.notifyPostBusinessEvent(new LoanTransactionDownPaymentPostBusinessEvent(downPaymentTransaction)); - businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); } return downPaymentTransaction; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/CapitalizedIncomeAmortizationBusinessStep.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/CapitalizedIncomeAmortizationBusinessStep.java index 09b639935..2e7be7055 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/CapitalizedIncomeAmortizationBusinessStep.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/CapitalizedIncomeAmortizationBusinessStep.java @@ -39,7 +39,7 @@ public class CapitalizedIncomeAmortizationBusinessStep implements LoanCOBBusines public Loan execute(Loan loan) { LocalDate businessDate = DateUtils.getBusinessLocalDate(); - loanCapitalizedIncomeAmortizationProcessingService.processCapitalizedIncomeAmortizationTillDate(loan, businessDate); + loanCapitalizedIncomeAmortizationProcessingService.processCapitalizedIncomeAmortizationTillDate(loan, businessDate, true); return loan; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java index 3390ab470..8cf7b662e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccountDomainServiceJpa.java @@ -280,16 +280,15 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { setLoanDelinquencyTag(loan, transactionDate); + postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds, isAccountTransfer, isLoanToLoanTransfer); + loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); if (!repaymentTransactionType.isChargeRefund()) { - LoanTransactionBusinessEvent transactionRepaymentEvent = getTransactionRepaymentTypeBusinessEvent(repaymentTransactionType, - isRecoveryRepayment, newRepaymentTransaction); + final LoanTransactionBusinessEvent transactionRepaymentEvent = getTransactionRepaymentTypeBusinessEvent( + repaymentTransactionType, isRecoveryRepayment, newRepaymentTransaction); businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); businessEventNotifierService.notifyPostBusinessEvent(transactionRepaymentEvent); } - postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds, isAccountTransfer, isLoanToLoanTransfer); - loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); - // disable all active standing orders linked to this loan if status // changes to closed disableStandingInstructionsLinkedToClosedLoan(loan); @@ -434,11 +433,11 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { loanAccrualsProcessingService.processAccrualsOnInterestRecalculation(loan, loan.isInterestBearingAndInterestRecalculationEnabled(), false); - businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); - businessEventNotifierService.notifyPostBusinessEvent(new LoanChargePaymentPostBusinessEvent(newPaymentTransaction)); postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds, isAccountTransfer); loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); + businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); + businessEventNotifierService.notifyPostBusinessEvent(new LoanChargePaymentPostBusinessEvent(newPaymentTransaction)); return newPaymentTransaction; } @@ -686,12 +685,12 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { loanAccrualsProcessingService.processAccrualsOnInterestRecalculation(loan, loan.isInterestBearingAndInterestRecalculationEnabled(), false); - businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); - businessEventNotifierService - .notifyPostBusinessEvent(new LoanCreditBalanceRefundPostBusinessEvent(newCreditBalanceRefundTransaction)); postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds, false); loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); + businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); + businessEventNotifierService + .notifyPostBusinessEvent(new LoanCreditBalanceRefundPostBusinessEvent(newCreditBalanceRefundTransaction)); return newCreditBalanceRefundTransaction; } @@ -739,11 +738,11 @@ public class LoanAccountDomainServiceJpa implements LoanAccountDomainService { loanAccrualsProcessingService.processAccrualsOnInterestRecalculation(loan, loan.isInterestBearingAndInterestRecalculationEnabled(), false); - businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); - businessEventNotifierService.notifyPostBusinessEvent(new LoanRefundPostBusinessEvent(newRefundTransaction)); postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds, false); loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); + businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); + businessEventNotifierService.notifyPostBusinessEvent(new LoanRefundPostBusinessEvent(newRefundTransaction)); builderResult.withEntityId(newRefundTransaction.getId()).withOfficeId(loan.getOfficeId()).withClientId(loan.getClientId()) .withGroupId(loan.getGroupId()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualEventService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualEventService.java index c48dd9f08..80f446f8f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualEventService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualEventService.java @@ -19,7 +19,6 @@ package org.apache.fineract.portfolio.loanaccount.service; import jakarta.annotation.PostConstruct; -import java.util.Objects; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.event.business.BusinessEventListener; @@ -28,7 +27,6 @@ import org.apache.fineract.infrastructure.event.business.domain.loan.LoanCloseBu import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus; -import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRelationTypeEnum; @Slf4j @RequiredArgsConstructor @@ -66,19 +64,9 @@ public class LoanAccrualEventService { LoanStatus status = loan.getStatus(); if (status.isClosedObligationsMet() || status.isOverpaid()) { log.debug("Loan balance change on accrual for loan {}", loan.getId()); - final boolean hasChargeAdjustment = hasChargeAdjustment(loan); - loanAccrualsProcessingService.processAccrualsOnLoanClosure(loan, hasChargeAdjustment); + loanAccrualsProcessingService.processAccrualsOnLoanClosure(loan, true); loanAccrualActivityProcessingService.processAccrualActivityForLoanClosure(loan); } } - - private boolean hasChargeAdjustment(final Loan loan) { - return loan.getLoanTransactions().stream() - .filter(transaction -> transaction.isChargeAdjustment() && transaction.isNotReversed()) - .anyMatch(chargeAdjustment -> chargeAdjustment.getLoanTransactionRelations().stream() - .anyMatch(relation -> relation.getRelationType() == LoanTransactionRelationTypeEnum.CHARGE_ADJUSTMENT - && relation.getFromTransaction() != null - && Objects.equals(relation.getFromTransaction().getId(), chargeAdjustment.getId()))); - } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationEventService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationEventService.java index 5307983e7..0036e1ba8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationEventService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationEventService.java @@ -59,7 +59,7 @@ public class LoanCapitalizedIncomeAmortizationEventService { if (loan.getLoanProductRelatedDetail().isEnableIncomeCapitalization() && (status.isClosedObligationsMet() || status.isClosedWrittenOff() || status.isOverpaid())) { log.debug("Loan closure on capitalized income amortization for loan {}", loan.getId()); - loanCapitalizedIncomeAmortizationProcessingService.processCapitalizedIncomeAmortizationOnLoanClosure(loan); + loanCapitalizedIncomeAmortizationProcessingService.processCapitalizedIncomeAmortizationOnLoanClosure(loan, false); } } } @@ -73,7 +73,7 @@ public class LoanCapitalizedIncomeAmortizationEventService { if (loan.getLoanProductRelatedDetail().isEnableIncomeCapitalization() && (status.isClosedObligationsMet() || status.isClosedWrittenOff() || status.isOverpaid())) { log.debug("Loan balance change on capitalized income amortization for loan {}", loan.getId()); - loanCapitalizedIncomeAmortizationProcessingService.processCapitalizedIncomeAmortizationOnLoanClosure(loan); + loanCapitalizedIncomeAmortizationProcessingService.processCapitalizedIncomeAmortizationOnLoanClosure(loan, true); } } } @@ -100,7 +100,7 @@ public class LoanCapitalizedIncomeAmortizationEventService { if (loan.getLoanProductRelatedDetail().isEnableIncomeCapitalization()) { log.debug("Loan pre charge-off capitalized income amortization for loan {}", loan.getId()); loanCapitalizedIncomeAmortizationProcessingService.processCapitalizedIncomeAmortizationTillDate(loan, - DateUtils.getBusinessLocalDate()); + DateUtils.getBusinessLocalDate(), false); } } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingServiceImpl.java index a8d53148e..17f0cf534 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanCapitalizedIncomeAmortizationProcessingServiceImpl.java @@ -20,6 +20,7 @@ package org.apache.fineract.portfolio.loanaccount.service; import java.math.BigDecimal; import java.time.LocalDate; +import java.util.Collections; import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; @@ -60,7 +61,14 @@ public class LoanCapitalizedIncomeAmortizationProcessingServiceImpl implements L @Override @Transactional - public void processCapitalizedIncomeAmortizationOnLoanClosure(@NotNull final Loan loan) { + public void processCapitalizedIncomeAmortizationOnLoanClosure(@NotNull final Loan loan, final boolean addJournal) { + List existingTransactionIds = Collections.emptyList(); + List existingReversedTransactionIds = Collections.emptyList(); + if (addJournal) { + existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan); + existingReversedTransactionIds = loanTransactionRepository.findReversedTransactionIdsByLoan(loan); + } + final LocalDate transactionDate = getFinalCapitalizedIncomeAmortizationTransactionDate(loan); final Optional amortizationTransaction = createCapitalizedIncomeAmortizationTransaction(loan, transactionDate, false, null); @@ -73,6 +81,10 @@ public class LoanCapitalizedIncomeAmortizationProcessingServiceImpl implements L new LoanCapitalizedIncomeAmortizationAdjustmentTransactionCreatedBusinessEvent(loanTransaction)); } }); + + if (addJournal) { + journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); + } } @Override @@ -175,7 +187,8 @@ public class LoanCapitalizedIncomeAmortizationProcessingServiceImpl implements L @Override @Transactional - public void processCapitalizedIncomeAmortizationTillDate(@NonNull Loan loan, @NonNull LocalDate tillDate) { + public void processCapitalizedIncomeAmortizationTillDate(@NonNull final Loan loan, @NonNull final LocalDate tillDate, + final boolean addJournal) { final List existingTransactionIds = loanTransactionRepository.findTransactionIdsByLoan(loan); final List existingReversedTransactionIds = loanTransactionRepository.findReversedTransactionIdsByLoan(loan); @@ -215,7 +228,9 @@ public class LoanCapitalizedIncomeAmortizationProcessingServiceImpl implements L transaction = loanTransactionRepository.save(transaction); loanTransactionRepository.flush(); - journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); + if (addJournal) { + journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); + } BusinessEvent event = MathUtil.isGreaterThanZero(totalAmortizationAmount) ? new LoanCapitalizedIncomeAmortizationTransactionCreatedBusinessEvent(transaction) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeWritePlatformServiceImpl.java index 7f6721f3d..db4058b69 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeWritePlatformServiceImpl.java @@ -318,10 +318,10 @@ public class LoanChargeWritePlatformServiceImpl implements LoanChargeWritePlatfo this.loanAccountDomainService.setLoanDelinquencyTag(loan, DateUtils.getBusinessLocalDate()); businessEventNotifierService.notifyPostBusinessEvent(new LoanAddChargeBusinessEvent(loanCharge)); - businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); + businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); return new CommandProcessingResultBuilder().withCommandId(command.commandId()) // .withEntityId(loanCharge.getId()) // diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index 0c7fbfe50..1ce81ca00 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -524,6 +524,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); + businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); return new CommandProcessingResultBuilder() // .withCommandId(command.commandId()) // @@ -1073,14 +1074,13 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf loanAccountDomainService.updateAndSaveLoanCollateralTransactionsForIndividualAccounts(loan, newInterestPaymentWaiverTransaction); // Finished Notification - - LoanTransactionBusinessEvent transactionRepaymentEvent = new LoanTransactionInterestPaymentWaiverPostBusinessEvent( + final LoanTransactionBusinessEvent transactionRepaymentEvent = new LoanTransactionInterestPaymentWaiverPostBusinessEvent( newInterestPaymentWaiverTransaction); - businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); - businessEventNotifierService.notifyPostBusinessEvent(transactionRepaymentEvent); journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); + businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); + businessEventNotifierService.notifyPostBusinessEvent(transactionRepaymentEvent); return new CommandProcessingResultBuilder().withCommandId(command.commandId()) // .withLoanId(loan.getId()) // @@ -1457,11 +1457,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf false); loanAccountDomainService.setLoanDelinquencyTag(loan, DateUtils.getBusinessLocalDate()); - businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); - businessEventNotifierService.notifyPostBusinessEvent(new LoanWaiveInterestBusinessEvent(waiveInterestTransaction)); - journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); + businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); + businessEventNotifierService.notifyPostBusinessEvent(new LoanWaiveInterestBusinessEvent(waiveInterestTransaction)); return new CommandProcessingResultBuilder() // .withCommandId(command.commandId()) // .withEntityId(waiveInterestTransaction.getId()) // @@ -1551,11 +1550,11 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf loanAccrualsProcessingService.processAccrualsOnInterestRecalculation(loan, loan.isInterestBearingAndInterestRecalculationEnabled(), false); loanAccountDomainService.setLoanDelinquencyTag(loan, DateUtils.getBusinessLocalDate()); - businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); - businessEventNotifierService.notifyPostBusinessEvent(new LoanWrittenOffPostBusinessEvent(loanTransaction)); journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); + businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); + businessEventNotifierService.notifyPostBusinessEvent(new LoanWrittenOffPostBusinessEvent(loanTransaction)); builder.withEntityId(loanTransaction.getId()).withEntityExternalId(loanTransaction.getExternalId()); } @@ -2215,13 +2214,12 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf loanAccrualsProcessingService.processAccrualsOnInterestRecalculation(loan, loan.isInterestBearingAndInterestRecalculationEnabled(), false); - businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); - businessEventNotifierService.notifyPostBusinessEvent(new LoanUndoWrittenOffBusinessEvent(writeOffTransaction)); - this.loanAccountDomainService.setLoanDelinquencyTag(loan, DateUtils.getBusinessLocalDate()); journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); + businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); + businessEventNotifierService.notifyPostBusinessEvent(new LoanUndoWrittenOffBusinessEvent(writeOffTransaction)); return new CommandProcessingResultBuilder() // .withOfficeId(loan.getOfficeId()) // @@ -2987,11 +2985,11 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf // Raise business events loanAccrualsProcessingService.processAccrualsOnInterestRecalculation(loan, loan.isInterestBearingAndInterestRecalculationEnabled(), false); - businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); // Create journal entries for the new transaction(s) journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); + businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); Long entityId = refundTransaction.getId(); ExternalId entityExternalId = refundTransaction.getExternalId(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/adjustment/LoanAdjustmentServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/adjustment/LoanAdjustmentServiceImpl.java index 1c7ff1b59..91ea260e9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/adjustment/LoanAdjustmentServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/adjustment/LoanAdjustmentServiceImpl.java @@ -255,11 +255,11 @@ public class LoanAdjustmentServiceImpl implements LoanAdjustmentService { entityId = newTransactionDetail.getId(); entityExternalId = newTransactionDetail.getExternalId(); } - businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); - businessEventNotifierService.notifyPostBusinessEvent(new LoanAdjustTransactionBusinessEvent(eventData)); journalEntryPoster.postJournalEntries(loan, existingTransactionIds, existingReversedTransactionIds); loanAccrualTransactionBusinessEventService.raiseBusinessEventForAccrualTransactions(loan, existingTransactionIds); + businessEventNotifierService.notifyPostBusinessEvent(new LoanBalanceChangedBusinessEvent(loan)); + businessEventNotifierService.notifyPostBusinessEvent(new LoanAdjustTransactionBusinessEvent(eventData)); return new CommandProcessingResultBuilder() // .withCommandId(commandId) // diff --git a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImplTest.java b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImplTest.java index 4b71bb82c..e2fad522e 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImplTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/service/LoanDownPaymentHandlerServiceImplTest.java @@ -198,7 +198,6 @@ public class LoanDownPaymentHandlerServiceImplTest { .notifyPreBusinessEvent(Mockito.any(LoanTransactionDownPaymentPreBusinessEvent.class)); verify(businessEventNotifierService, Mockito.times(1)) .notifyPostBusinessEvent(Mockito.any(LoanTransactionDownPaymentPostBusinessEvent.class)); - verify(businessEventNotifierService, Mockito.times(1)).notifyPostBusinessEvent(Mockito.any(LoanBalanceChangedBusinessEvent.class)); } @Test