FINERACT-2050: Fix client transfer loan status staying in TRANSFER_IN_PROGRESS
This commit is contained in:
+12
@@ -202,6 +202,18 @@ public class DefaultLoanLifecycleStateMachine implements LoanLifecycleStateMachi
|
|||||||
newState = activeTransition();
|
newState = activeTransition();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case LOAN_COMPLETE_TRANSFER:
|
||||||
|
if (anyOfAllowedWhenComingFrom(from, LoanStatus.TRANSFER_IN_PROGRESS)) {
|
||||||
|
boolean isOverpaid = loan.getTotalOverpaid() != null && loan.getTotalOverpaid().compareTo(BigDecimal.ZERO) > 0;
|
||||||
|
if (isOverpaid) {
|
||||||
|
newState = overpaidTransition();
|
||||||
|
} else if (loan.getSummary().isRepaidInFull(loan.getCurrency())) {
|
||||||
|
newState = closeObligationsMetTransition();
|
||||||
|
} else {
|
||||||
|
newState = activeTransition();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
case WRITE_OFF_OUTSTANDING_UNDO:
|
case WRITE_OFF_OUTSTANDING_UNDO:
|
||||||
if (anyOfAllowedWhenComingFrom(from, LoanStatus.CLOSED_WRITTEN_OFF)) {
|
if (anyOfAllowedWhenComingFrom(from, LoanStatus.CLOSED_WRITTEN_OFF)) {
|
||||||
newState = activeTransition();
|
newState = activeTransition();
|
||||||
|
|||||||
+1
@@ -48,6 +48,7 @@ public enum LoanEvent {
|
|||||||
LOAN_INITIATE_TRANSFER, //
|
LOAN_INITIATE_TRANSFER, //
|
||||||
LOAN_REJECT_TRANSFER, //
|
LOAN_REJECT_TRANSFER, //
|
||||||
LOAN_WITHDRAW_TRANSFER, //
|
LOAN_WITHDRAW_TRANSFER, //
|
||||||
|
LOAN_COMPLETE_TRANSFER, //
|
||||||
LOAN_CREDIT_BALANCE_REFUND, //
|
LOAN_CREDIT_BALANCE_REFUND, //
|
||||||
LOAN_CHARGEBACK, //
|
LOAN_CHARGEBACK, //
|
||||||
LOAN_CHARGE_ADDED, //
|
LOAN_CHARGE_ADDED, //
|
||||||
|
|||||||
+1
-5
@@ -1731,11 +1731,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
|
|||||||
final LoanTransaction newTransferAcceptanceTransaction = LoanTransaction.approveTransfer(acceptedInOffice, loan, transferDate,
|
final LoanTransaction newTransferAcceptanceTransaction = LoanTransaction.approveTransfer(acceptedInOffice, loan, transferDate,
|
||||||
externalId);
|
externalId);
|
||||||
loan.addLoanTransaction(newTransferAcceptanceTransaction);
|
loan.addLoanTransaction(newTransferAcceptanceTransaction);
|
||||||
if (loan.getTotalOverpaid() != null) {
|
loanLifecycleStateMachine.transition(LoanEvent.LOAN_COMPLETE_TRANSFER, loan);
|
||||||
loanLifecycleStateMachine.transition(LoanEvent.LOAN_OVERPAYMENT, loan);
|
|
||||||
} else {
|
|
||||||
loanLifecycleStateMachine.transition(LoanEvent.LOAN_REPAYMENT_OR_WAIVER, loan);
|
|
||||||
}
|
|
||||||
if (loanOfficer != null) {
|
if (loanOfficer != null) {
|
||||||
loanOfficerService.reassignLoanOfficer(loan, loanOfficer, transferDate);
|
loanOfficerService.reassignLoanOfficer(loan, loanOfficer, transferDate);
|
||||||
}
|
}
|
||||||
|
|||||||
+49
@@ -421,6 +421,55 @@ class DefaultLoanLifecycleStateMachineTest {
|
|||||||
verify(businessEventNotifierService).notifyPostBusinessEvent(any(LoanStatusChangedBusinessEvent.class));
|
verify(businessEventNotifierService).notifyPostBusinessEvent(any(LoanStatusChangedBusinessEvent.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTransitionShouldWorkProperlyForLoanCompleteTransferWhenTransferInProgress() {
|
||||||
|
// given
|
||||||
|
MonetaryCurrency currency = new MonetaryCurrency("USD", 2, null);
|
||||||
|
Loan loan = Mockito.mock(Loan.class);
|
||||||
|
LoanSummary loanSummary = Mockito.mock(LoanSummary.class);
|
||||||
|
Mockito.when(loan.getStatus()).thenReturn(LoanStatus.TRANSFER_IN_PROGRESS);
|
||||||
|
Mockito.when(loan.getTotalOverpaid()).thenReturn(null);
|
||||||
|
Mockito.when(loan.getSummary()).thenReturn(loanSummary);
|
||||||
|
Mockito.when(loan.getCurrency()).thenReturn(currency);
|
||||||
|
Mockito.when(loanSummary.isRepaidInFull(currency)).thenReturn(false);
|
||||||
|
// when
|
||||||
|
underTest.transition(LoanEvent.LOAN_COMPLETE_TRANSFER, loan);
|
||||||
|
// then
|
||||||
|
verify(loan).setLoanStatus(LoanStatus.ACTIVE);
|
||||||
|
verify(businessEventNotifierService).notifyPostBusinessEvent(any(LoanStatusChangedBusinessEvent.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTransitionShouldWorkProperlyForLoanCompleteTransferWhenTransferInProgressAndOverpaid() {
|
||||||
|
// given
|
||||||
|
Loan loan = Mockito.mock(Loan.class);
|
||||||
|
Mockito.when(loan.getStatus()).thenReturn(LoanStatus.TRANSFER_IN_PROGRESS);
|
||||||
|
Mockito.when(loan.getTotalOverpaid()).thenReturn(BigDecimal.ONE);
|
||||||
|
// when
|
||||||
|
underTest.transition(LoanEvent.LOAN_COMPLETE_TRANSFER, loan);
|
||||||
|
// then
|
||||||
|
verify(loan).setLoanStatus(LoanStatus.OVERPAID);
|
||||||
|
verify(businessEventNotifierService).notifyPostBusinessEvent(any(LoanStatusChangedBusinessEvent.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTransitionShouldWorkProperlyForLoanCompleteTransferWhenTransferInProgressAndFullyPaid() {
|
||||||
|
// given
|
||||||
|
MonetaryCurrency currency = new MonetaryCurrency("USD", 2, null);
|
||||||
|
Loan loan = Mockito.mock(Loan.class);
|
||||||
|
LoanSummary loanSummary = Mockito.mock(LoanSummary.class);
|
||||||
|
Mockito.when(loan.getStatus()).thenReturn(LoanStatus.TRANSFER_IN_PROGRESS);
|
||||||
|
Mockito.when(loan.getTotalOverpaid()).thenReturn(null);
|
||||||
|
Mockito.when(loan.getSummary()).thenReturn(loanSummary);
|
||||||
|
Mockito.when(loan.getCurrency()).thenReturn(currency);
|
||||||
|
Mockito.when(loanSummary.isRepaidInFull(currency)).thenReturn(true);
|
||||||
|
// when
|
||||||
|
underTest.transition(LoanEvent.LOAN_COMPLETE_TRANSFER, loan);
|
||||||
|
// then
|
||||||
|
verify(loan).setLoanStatus(LoanStatus.CLOSED_OBLIGATIONS_MET);
|
||||||
|
verify(businessEventNotifierService).notifyPostBusinessEvent(any(LoanStatusChangedBusinessEvent.class));
|
||||||
|
}
|
||||||
|
|
||||||
private Loan createLoanWithStatus(LoanStatus status) {
|
private Loan createLoanWithStatus(LoanStatus status) {
|
||||||
Loan result = new Loan();
|
Loan result = new Loan();
|
||||||
result.setLoanStatus(status);
|
result.setLoanStatus(status);
|
||||||
|
|||||||
Reference in New Issue
Block a user