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