FINERACT-2040: CBR GL accounts match with Charge off GL accounts if loan is not overpaid

This commit is contained in:
taskain7
2024-02-08 14:10:30 +01:00
committed by Adam Saghy
parent 181ec08f90
commit 717eb69425
2 changed files with 47 additions and 28 deletions
@@ -1104,13 +1104,13 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess
if (principalAmount != null && principalAmount.compareTo(BigDecimal.ZERO) > 0) { if (principalAmount != null && principalAmount.compareTo(BigDecimal.ZERO) > 0) {
totalAmount = totalAmount.add(principalAmount); totalAmount = totalAmount.add(principalAmount);
journalAmountHolders.add( journalAmountHolders
new JournalAmountHolder(determineAccrualAccount(isMarkedChargeOff, isMarkedFraud, false, isReversal), principalAmount)); .add(new JournalAmountHolder(determineAccrualAccountForCBR(isMarkedChargeOff, isMarkedFraud, false), principalAmount));
} }
if (overpaymentAmount != null && overpaymentAmount.compareTo(BigDecimal.ZERO) > 0) { if (overpaymentAmount != null && overpaymentAmount.compareTo(BigDecimal.ZERO) > 0) {
totalAmount = totalAmount.add(overpaymentAmount); totalAmount = totalAmount.add(overpaymentAmount);
journalAmountHolders.add(new JournalAmountHolder(determineAccrualAccount(isMarkedChargeOff, isMarkedFraud, true, isReversal), journalAmountHolders
overpaymentAmount)); .add(new JournalAmountHolder(determineAccrualAccountForCBR(isMarkedChargeOff, isMarkedFraud, true), overpaymentAmount));
} }
JournalAmountHolder totalAmountHolder = new JournalAmountHolder(AccrualAccountsForLoan.FUND_SOURCE.getValue(), totalAmount); JournalAmountHolder totalAmountHolder = new JournalAmountHolder(AccrualAccountsForLoan.FUND_SOURCE.getValue(), totalAmount);
@@ -1119,16 +1119,16 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess
} }
private Integer determineAccrualAccount(boolean isMarkedChargeOff, boolean isMarkedFraud, boolean isOverpayment, boolean isReversal) { private Integer determineAccrualAccountForCBR(boolean isMarkedChargeOff, boolean isMarkedFraud, boolean isOverpayment) {
if (isMarkedChargeOff && isReversal) { if (isOverpayment) {
if (isMarkedFraud) { return AccrualAccountsForLoan.OVERPAYMENT.getValue();
return AccrualAccountsForLoan.CHARGE_OFF_FRAUD_EXPENSE.getValue();
} else {
return AccrualAccountsForLoan.CHARGE_OFF_EXPENSE.getValue();
}
} else { } else {
if (isOverpayment) { if (isMarkedChargeOff) {
return AccrualAccountsForLoan.OVERPAYMENT.getValue(); if (isMarkedFraud) {
return AccrualAccountsForLoan.CHARGE_OFF_FRAUD_EXPENSE.getValue();
} else {
return AccrualAccountsForLoan.CHARGE_OFF_EXPENSE.getValue();
}
} else { } else {
return AccrualAccountsForLoan.LOAN_PORTFOLIO.getValue(); return AccrualAccountsForLoan.LOAN_PORTFOLIO.getValue();
} }
@@ -37,6 +37,7 @@ import java.util.UUID;
import org.apache.fineract.client.models.BusinessDateRequest; import org.apache.fineract.client.models.BusinessDateRequest;
import org.apache.fineract.client.models.GetLoanProductsProductIdResponse; import org.apache.fineract.client.models.GetLoanProductsProductIdResponse;
import org.apache.fineract.client.models.GetLoansLoanIdResponse; import org.apache.fineract.client.models.GetLoansLoanIdResponse;
import org.apache.fineract.client.models.GetLoansLoanIdTransactions;
import org.apache.fineract.client.models.PostLoansLoanIdTransactionsRequest; import org.apache.fineract.client.models.PostLoansLoanIdTransactionsRequest;
import org.apache.fineract.client.models.PostLoansLoanIdTransactionsResponse; import org.apache.fineract.client.models.PostLoansLoanIdTransactionsResponse;
import org.apache.fineract.client.models.PostLoansLoanIdTransactionsTransactionIdRequest; import org.apache.fineract.client.models.PostLoansLoanIdTransactionsTransactionIdRequest;
@@ -305,37 +306,55 @@ public class LoanTransactionReverseReplayTest {
new PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate("06 October 2022").locale("en") new PostLoansLoanIdTransactionsTransactionIdRequest().transactionDate("06 October 2022").locale("en")
.dateFormat(DATE_PATTERN).transactionAmount(0.0)); .dateFormat(DATE_PATTERN).transactionAmount(0.0));
// check if the original CBR got reversed
journalEntriesForCBR = journalEntryHelper
.getJournalEntriesByTransactionId("L" + cbrTransactionResponse.getResourceId().toString());
assertNotNull(journalEntriesForCBR);
cbrExpenseJournalEntries = journalEntriesForCBR.stream() //
.filter(journalEntry -> assetAccount.getAccountID().equals(journalEntry.get("glAccountId"))) //
.toList();
cbrAssetJournalEntries = journalEntriesForCBR.stream() //
.filter(journalEntry -> overpaymentAccount.getAccountID().equals(journalEntry.get("glAccountId"))) //
.toList();
assertEquals(2, cbrExpenseJournalEntries.size());
assertEquals(2, cbrAssetJournalEntries.size());
inlineLoanCOBHelper.executeInlineCOB(List.of(loanId.longValue())); inlineLoanCOBHelper.executeInlineCOB(List.of(loanId.longValue()));
loansLoanIdResponse = loanTransactionHelper.getLoanDetails(loanExternalIdStr); loansLoanIdResponse = loanTransactionHelper.getLoanDetails(loanExternalIdStr);
lastTransactionIndex = loansLoanIdResponse.getTransactions().size() - 1; lastTransactionIndex = loansLoanIdResponse.getTransactions().size() - 1;
assertEquals(500.0, loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getAmount()); assertEquals(500.0, loansLoanIdResponse.getTransactions().get(lastTransactionIndex).getAmount());
journalEntriesForCBR = journalEntryHelper // replayed CBR transaction
.getJournalEntriesByTransactionId("L" + cbrTransactionResponse.getResourceId().toString()); GetLoansLoanIdTransactions newCBRTransaction = loansLoanIdResponse.getTransactions().stream()
.filter(transaction -> transaction.getType().getCreditBalanceRefund()).findFirst().orElse(null);
assertNotNull(newCBRTransaction);
Long newCBRTransactionId = newCBRTransaction.getId();
journalEntriesForCBR = journalEntryHelper.getJournalEntriesByTransactionId("L" + newCBRTransactionId);
ArrayList<HashMap> journalEntriesForChargeOff = journalEntryHelper ArrayList<HashMap> journalEntriesForChargeOff = journalEntryHelper
.getJournalEntriesByTransactionId("L" + chargeOffResponse.getResourceId().toString()); .getJournalEntriesByTransactionId("L" + chargeOffResponse.getResourceId().toString());
assertNotNull(journalEntriesForCBR); assertNotNull(journalEntriesForCBR);
assertNotNull(journalEntriesForChargeOff); assertNotNull(journalEntriesForChargeOff);
String expenseGlAccountCodeAfterReversal = (String) journalEntriesForChargeOff.get(0).get("glAccountCode"); String expenseGlAccountCodeForChargeOff = (String) journalEntriesForChargeOff.get(0).get("glAccountCode");
String assetGlAccountCodeAfterReversal = (String) journalEntriesForChargeOff.get(1).get("glAccountCode"); String assetGlAccountCodeForChargeOff = (String) journalEntriesForChargeOff.get(1).get("glAccountCode");
cbrExpenseJournalEntries = journalEntriesForCBR.stream() // cbrExpenseJournalEntries = journalEntriesForCBR.stream() //
.filter(journalEntry -> expenseGlAccountCodeAfterReversal.equals(journalEntry.get("glAccountCode"))) // .filter(journalEntry -> expenseGlAccountCodeForChargeOff.equals(journalEntry.get("glAccountCode"))
.toList();
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"))) // && expenseAccount.getAccountID().equals(journalEntry.get("glAccountId"))) //
.toList(); .toList();
cbrAssetJournalEntries = journalEntriesForCBR.stream() //
.filter(journalEntry -> assetGlAccountCodeForChargeOff.equals(journalEntry.get("glAccountCode"))
&& assetAccount.getAccountID().equals(journalEntry.get("glAccountId"))) //
.toList();
assertEquals(1, cbrExpenseJournalEntries.size()); assertEquals(1, cbrExpenseJournalEntries.size());
assertEquals(1, cbrExpenseJournalEntriesAfterReversal.size()); assertEquals(1, cbrAssetJournalEntries.size());
assertEquals(2, cbrAssetJournalEntries.size());
} finally { } finally {
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE); GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE);
} }