This is an automated email from the ASF dual-hosted git repository.

adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new 496e37e3d4 FINERACT-2181: Accruals on accounts where charge 
adjustments and refunds are done on the same day causing duplicate journal 
entries
496e37e3d4 is described below

commit 496e37e3d4f30c8fe547ffdb7b6991df4d52a11b
Author: mariiaKraievska <[email protected]>
AuthorDate: Wed Jun 4 16:53:39 2025 +0300

    FINERACT-2181: Accruals on accounts where charge adjustments and refunds 
are done on the same day causing duplicate journal entries
---
 .../test/stepdef/common/JournalEntriesStepDef.java |   4 +
 .../src/test/resources/features/Loan.feature       |   8 -
 .../features/LoanAccrualTransaction.feature        |  26 ++-
 .../src/test/resources/features/LoanCBR.feature    |   6 +-
 .../src/test/resources/features/LoanCharge.feature | 209 ++++++++-------------
 .../features/LoanInterestPaymentWaiver.feature     |   2 -
 ...talizedIncomeAmortizationProcessingService.java |   4 +-
 .../service/LoanDownPaymentHandlerServiceImpl.java |   2 -
 .../CapitalizedIncomeAmortizationBusinessStep.java |   2 +-
 .../domain/LoanAccountDomainServiceJpa.java        |  23 ++-
 .../service/LoanAccrualEventService.java           |  14 +-
 ...nCapitalizedIncomeAmortizationEventService.java |   6 +-
 ...zedIncomeAmortizationProcessingServiceImpl.java |  21 ++-
 .../LoanChargeWritePlatformServiceImpl.java        |   2 +-
 .../LoanWritePlatformServiceJpaRepositoryImpl.java |  24 ++-
 .../adjustment/LoanAdjustmentServiceImpl.java      |   4 +-
 .../LoanDownPaymentHandlerServiceImplTest.java     |   1 -
 17 files changed, 160 insertions(+), 198 deletions(-)

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 74fefcae01..b1b2e09419 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<List<String>> 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<List<List<String>>> possibleActualValuesList = new 
ArrayList<>();
             List<String> 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 e9d1532c91..82866bd59b 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 a174cb11c2..5afc0213e8 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 a342edd509..e3f83fc1dc 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 cede9f5a44..911a0a9d68 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 995a7310e7..5c97d2a418 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 9b763a437d..84ac57ab48 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 fb4b8d80f2..dfc76a4557 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 09b639935c..2e7be7055c 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 3390ab4703..8cf7b662e4 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 c48dd9f089..80f446f8f1 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 5307983e7e..0036e1ba83 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 a8d53148ec..17f0cf5343 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<Long> existingTransactionIds = Collections.emptyList();
+        List<Long> existingReversedTransactionIds = Collections.emptyList();
+        if (addJournal) {
+            existingTransactionIds = 
loanTransactionRepository.findTransactionIdsByLoan(loan);
+            existingReversedTransactionIds = 
loanTransactionRepository.findReversedTransactionIdsByLoan(loan);
+        }
+
         final LocalDate transactionDate = 
getFinalCapitalizedIncomeAmortizationTransactionDate(loan);
         final Optional<LoanTransaction> 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<Long> existingTransactionIds = 
loanTransactionRepository.findTransactionIdsByLoan(loan);
         final List<Long> 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 7f6721f3d0..db4058b691 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 0c7fbfe50d..1ce81ca005 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 1c7ff1b59e..91ea260e90 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 4b71bb82c0..e2fad522ee 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

Reply via email to