FINERACT-2215: Exclude reversed transactions from hasMonetaryActivityAfter check
This commit is contained in:
committed by
Adam Saghy
parent
97515fcba9
commit
be9e44fa44
+2
-1
@@ -3529,7 +3529,8 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom<Long> {
|
|||||||
|
|
||||||
public boolean hasMonetaryActivityAfter(final LocalDate transactionDate) {
|
public boolean hasMonetaryActivityAfter(final LocalDate transactionDate) {
|
||||||
for (LoanTransaction transaction : this.getLoanTransactions()) {
|
for (LoanTransaction transaction : this.getLoanTransactions()) {
|
||||||
if (transaction.getTransactionDate().isAfter(transactionDate) && !transaction.isNonMonetaryTransaction()) {
|
if (transaction.getTransactionDate().isAfter(transactionDate) && transaction.isNotReversed()
|
||||||
|
&& !transaction.isNonMonetaryTransaction()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+62
@@ -120,6 +120,68 @@ public class LoanUndoChargeOffReverseExternalIdTest {
|
|||||||
assertEquals(reverseTransactionExternalId, chargeOffTransactionDetails.getReversalExternalId());
|
assertEquals(reverseTransactionExternalId, chargeOffTransactionDetails.getReversalExternalId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test scenario: - Charge-off is performed. - Charge-off is then undone. - A new charge-off is performed with an
|
||||||
|
* earlier transaction date. This verifies that reversed transactions are properly excluded so that the new
|
||||||
|
* charge-off is allowed.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void loanChargeOffAfterUndoWithEarlierDateTest() {
|
||||||
|
// Loan ExternalId
|
||||||
|
String loanExternalIdStr = UUID.randomUUID().toString();
|
||||||
|
|
||||||
|
final Integer loanProductID = createLoanProductWithPeriodicAccrualAccounting(assetAccount, incomeAccount, expenseAccount,
|
||||||
|
overpaymentAccount);
|
||||||
|
final Integer clientId = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId().intValue();
|
||||||
|
final Integer loanId = createLoanAccount(clientId, loanProductID, loanExternalIdStr);
|
||||||
|
|
||||||
|
// make Repayment
|
||||||
|
final PostLoansLoanIdTransactionsResponse repaymentTransaction = loanTransactionHelper.makeLoanRepayment(loanExternalIdStr,
|
||||||
|
new PostLoansLoanIdTransactionsRequest().dateFormat("dd MMMM yyyy").transactionDate("28 March 2025").locale("en")
|
||||||
|
.transactionAmount(100.0));
|
||||||
|
|
||||||
|
GetLoansLoanIdResponse loanDetails = this.loanTransactionHelper.getLoanDetails((long) loanId);
|
||||||
|
assertTrue(loanDetails.getStatus().getActive());
|
||||||
|
|
||||||
|
// Perform first charge-off with date "29 March 2025"
|
||||||
|
String randomText1 = Utils.randomStringGenerator("en", 5) + Utils.randomNumberGenerator(6) + Utils.randomStringGenerator("is", 5);
|
||||||
|
Integer chargeOffReasonId1 = CodeHelper.createChargeOffCodeValue(requestSpec, responseSpec, randomText1, 1);
|
||||||
|
String transactionExternalId1 = UUID.randomUUID().toString();
|
||||||
|
loanTransactionHelper.chargeOffLoan((long) loanId, new PostLoansLoanIdTransactionsRequest().transactionDate("29 March 2025")
|
||||||
|
.locale("en").dateFormat("dd MMMM yyyy").externalId(transactionExternalId1).chargeOffReasonId((long) chargeOffReasonId1));
|
||||||
|
|
||||||
|
loanDetails = loanTransactionHelper.getLoanDetails((long) loanId);
|
||||||
|
assertTrue(loanDetails.getStatus().getActive());
|
||||||
|
assertTrue(loanDetails.getChargedOff());
|
||||||
|
|
||||||
|
// Undo the charge-off
|
||||||
|
String reverseTransactionExternalId = UUID.randomUUID().toString();
|
||||||
|
PostLoansLoanIdTransactionsResponse undoChargeOffTxResponse = loanTransactionHelper.undoChargeOffLoan((long) loanId,
|
||||||
|
new PostLoansLoanIdTransactionsRequest().reversalExternalId(reverseTransactionExternalId));
|
||||||
|
assertNotNull(undoChargeOffTxResponse);
|
||||||
|
|
||||||
|
loanDetails = loanTransactionHelper.getLoanDetails((long) loanId);
|
||||||
|
assertTrue(loanDetails.getStatus().getActive());
|
||||||
|
assertFalse(loanDetails.getChargedOff());
|
||||||
|
|
||||||
|
// Perform a new charge-off with an earlier date ("28 March 2025") than the first charge-off
|
||||||
|
String randomText2 = Utils.randomStringGenerator("en", 5) + Utils.randomNumberGenerator(6) + Utils.randomStringGenerator("is", 5);
|
||||||
|
Integer chargeOffReasonId2 = CodeHelper.createChargeOffCodeValue(requestSpec, responseSpec, randomText2, 1);
|
||||||
|
String transactionExternalId2 = UUID.randomUUID().toString();
|
||||||
|
loanTransactionHelper.chargeOffLoan((long) loanId, new PostLoansLoanIdTransactionsRequest().transactionDate("28 March 2025")
|
||||||
|
.locale("en").dateFormat("dd MMMM yyyy").externalId(transactionExternalId2).chargeOffReasonId((long) chargeOffReasonId2));
|
||||||
|
|
||||||
|
loanDetails = loanTransactionHelper.getLoanDetails((long) loanId);
|
||||||
|
// After the new charge-off, the loan should be charged off
|
||||||
|
assertTrue(loanDetails.getStatus().getActive());
|
||||||
|
assertTrue(loanDetails.getChargedOff());
|
||||||
|
|
||||||
|
// Verify the new charge-off transaction details
|
||||||
|
GetLoansLoanIdTransactionsTransactionIdResponse newChargeOffTransactionDetails = loanTransactionHelper
|
||||||
|
.getLoanTransactionDetails((long) loanId, transactionExternalId2);
|
||||||
|
assertNotNull(newChargeOffTransactionDetails);
|
||||||
|
}
|
||||||
|
|
||||||
private Integer createLoanAccount(final Integer clientID, final Integer loanProductID, final String externalId) {
|
private Integer createLoanAccount(final Integer clientID, final Integer loanProductID, final String externalId) {
|
||||||
|
|
||||||
String loanApplicationJSON = new LoanApplicationTestBuilder().withPrincipal("1000").withLoanTermFrequency("1")
|
String loanApplicationJSON = new LoanApplicationTestBuilder().withPrincipal("1000").withLoanTermFrequency("1")
|
||||||
|
|||||||
Reference in New Issue
Block a user