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 129748e30 FINERACT-2040: CBR GL accounts match with Chargeoff GL 
accounts only after reversal
129748e30 is described below

commit 129748e30d0a80b74bb0e7730e0d5830357bcc85
Author: taskain7 <[email protected]>
AuthorDate: Wed Jan 31 10:03:27 2024 +0100

    FINERACT-2040: CBR GL accounts match with Chargeoff GL accounts only after 
reversal
---
 .../AccrualBasedAccountingProcessorForLoan.java    | 12 +++---
 .../LoanTransactionReverseReplayTest.java          | 44 +++++++++++++++++-----
 2 files changed, 40 insertions(+), 16 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccrualBasedAccountingProcessorForLoan.java
 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccrualBasedAccountingProcessorForLoan.java
index 6cd56dff8..fba0cbd25 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccrualBasedAccountingProcessorForLoan.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccrualBasedAccountingProcessorForLoan.java
@@ -1100,13 +1100,13 @@ public class AccrualBasedAccountingProcessorForLoan 
implements AccountingProcess
 
         if (principalAmount != null && 
principalAmount.compareTo(BigDecimal.ZERO) > 0) {
             totalAmount = totalAmount.add(principalAmount);
-            journalAmountHolders
-                    .add(new 
JournalAmountHolder(determineAccrualAccount(isMarkedChargeOff, isMarkedFraud, 
false), principalAmount));
+            journalAmountHolders.add(
+                    new 
JournalAmountHolder(determineAccrualAccount(isMarkedChargeOff, isMarkedFraud, 
false, isReversal), principalAmount));
         }
         if (overpaymentAmount != null && 
overpaymentAmount.compareTo(BigDecimal.ZERO) > 0) {
             totalAmount = totalAmount.add(overpaymentAmount);
-            journalAmountHolders
-                    .add(new 
JournalAmountHolder(determineAccrualAccount(isMarkedChargeOff, isMarkedFraud, 
true), overpaymentAmount));
+            journalAmountHolders.add(new 
JournalAmountHolder(determineAccrualAccount(isMarkedChargeOff, isMarkedFraud, 
true, isReversal),
+                    overpaymentAmount));
         }
 
         JournalAmountHolder totalAmountHolder = new 
JournalAmountHolder(AccrualAccountsForLoan.FUND_SOURCE.getValue(), totalAmount);
@@ -1115,8 +1115,8 @@ public class AccrualBasedAccountingProcessorForLoan 
implements AccountingProcess
 
     }
 
-    private Integer determineAccrualAccount(boolean isMarkedChargeOff, boolean 
isMarkedFraud, boolean isOverpayment) {
-        if (isMarkedChargeOff) {
+    private Integer determineAccrualAccount(boolean isMarkedChargeOff, boolean 
isMarkedFraud, boolean isOverpayment, boolean isReversal) {
+        if (isMarkedChargeOff && isReversal) {
             if (isMarkedFraud) {
                 return 
AccrualAccountsForLoan.CHARGE_OFF_FRAUD_EXPENSE.getValue();
             } else {
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionReverseReplayTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionReverseReplayTest.java
index cd1236113..734069976 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionReverseReplayTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionReverseReplayTest.java
@@ -280,6 +280,24 @@ public class LoanTransactionReverseReplayTest {
                     new 
PostLoansLoanIdTransactionsRequest().dateFormat(DATE_PATTERN).transactionDate("05
 October 2022").locale("en")
                             .transactionAmount(500.0));
 
+            GetLoansLoanIdResponse loansLoanIdResponse = 
loanTransactionHelper.getLoanDetails(loanExternalIdStr);
+            int lastTransactionIndex = 
loansLoanIdResponse.getTransactions().size() - 1;
+            assertEquals(500.0, 
loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getAmount());
+
+            ArrayList<HashMap> journalEntriesForCBR = journalEntryHelper
+                    .getJournalEntriesByTransactionId("L" + 
cbrTransactionResponse.getResourceId().toString());
+            assertNotNull(journalEntriesForCBR);
+            List<HashMap> cbrExpenseJournalEntries = 
journalEntriesForCBR.stream() //
+                    .filter(journalEntry -> 
assetAccount.getAccountID().equals(journalEntry.get("glAccountId"))) //
+                    .toList();
+
+            List<HashMap> cbrAssetJournalEntries = 
journalEntriesForCBR.stream() //
+                    .filter(journalEntry -> 
overpaymentAccount.getAccountID().equals(journalEntry.get("glAccountId"))) //
+                    .toList();
+
+            assertEquals(1, cbrExpenseJournalEntries.size());
+            assertEquals(1, cbrAssetJournalEntries.size());
+
             businessDateHelper.updateBusinessDate(new 
BusinessDateRequest().type(BusinessDateType.BUSINESS_DATE.getName())
                     .date("06 October 
2022").dateFormat(DATE_PATTERN).locale("en"));
 
@@ -288,29 +306,35 @@ public class LoanTransactionReverseReplayTest {
                             .dateFormat(DATE_PATTERN).transactionAmount(0.0));
 
             inlineLoanCOBHelper.executeInlineCOB(List.of(loanId.longValue()));
-            GetLoansLoanIdResponse loansLoanIdResponse = 
loanTransactionHelper.getLoanDetails(loanExternalIdStr);
-            int lastTransactionIndex = 
loansLoanIdResponse.getTransactions().size() - 1;
+            loansLoanIdResponse = 
loanTransactionHelper.getLoanDetails(loanExternalIdStr);
+            lastTransactionIndex = 
loansLoanIdResponse.getTransactions().size() - 1;
             assertEquals(500.0, 
loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getAmount());
 
-            ArrayList<HashMap> journalEntriesForCBR = journalEntryHelper
+            journalEntriesForCBR = journalEntryHelper
                     .getJournalEntriesByTransactionId("L" + 
cbrTransactionResponse.getResourceId().toString());
             ArrayList<HashMap> journalEntriesForChargeOff = journalEntryHelper
                     .getJournalEntriesByTransactionId("L" + 
chargeOffResponse.getResourceId().toString());
             assertNotNull(journalEntriesForCBR);
             assertNotNull(journalEntriesForChargeOff);
 
-            String expenseGlAccountCode = (String) 
journalEntriesForChargeOff.get(0).get("glAccountCode");
-            String assetGlAccountCode = (String) 
journalEntriesForChargeOff.get(1).get("glAccountCode");
+            String expenseGlAccountCodeAfterReversal = (String) 
journalEntriesForChargeOff.get(0).get("glAccountCode");
+            String assetGlAccountCodeAfterReversal = (String) 
journalEntriesForChargeOff.get(1).get("glAccountCode");
 
-            List<HashMap> cbrExpenseJournalEntries = 
journalEntriesForCBR.stream() //
-                    .filter(journalEntry -> 
expenseGlAccountCode.equals(journalEntry.get("glAccountCode"))) //
+            cbrExpenseJournalEntries = journalEntriesForCBR.stream() //
+                    .filter(journalEntry -> 
expenseGlAccountCodeAfterReversal.equals(journalEntry.get("glAccountCode"))) //
                     .toList();
 
-            List<HashMap> cbrAssetJournalEntries = 
journalEntriesForCBR.stream() //
-                    .filter(journalEntry -> 
assetGlAccountCode.equals(journalEntry.get("glAccountCode"))) //
+            cbrAssetJournalEntries = journalEntriesForCBR.stream() //
+                    .filter(journalEntry -> 
assetGlAccountCodeAfterReversal.equals(journalEntry.get("glAccountCode"))) //
+                    .toList();
+
+            List<HashMap> cbrExpenseJournalEntriesAfterReversal = 
journalEntriesForCBR.stream() //
+                    .filter(journalEntry -> 
expenseGlAccountCodeAfterReversal.equals(journalEntry.get("glAccountCode")) //
+                            && 
expenseAccount.getAccountID().equals(journalEntry.get("glAccountId"))) //
                     .toList();
 
-            assertEquals(2, cbrExpenseJournalEntries.size());
+            assertEquals(1, cbrExpenseJournalEntries.size());
+            assertEquals(1, cbrExpenseJournalEntriesAfterReversal.size());
             assertEquals(2, cbrAssetJournalEntries.size());
         } finally {
             GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, 
responseSpec, Boolean.FALSE);

Reply via email to