FINERACT-2040: CBR GL accounts match with Charge off GL accounts if loan is not overpaid
This commit is contained in:
+13
-13
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
+34
-15
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user