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 84afccc1f FINERACT-1981: Fix status change after Disbursement
84afccc1f is described below

commit 84afccc1f7badd29cd780bd771ffeb1bc576bf4d
Author: Adam Saghy <[email protected]>
AuthorDate: Thu Feb 29 14:54:53 2024 +0100

    FINERACT-1981: Fix status change after Disbursement
---
 .../domain/DefaultLoanLifecycleStateMachine.java   |  6 ++++-
 .../DefaultLoanLifecycleStateMachineTest.java      | 31 ++++++++++++++++++++--
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/DefaultLoanLifecycleStateMachine.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/DefaultLoanLifecycleStateMachine.java
index bf2e53f49..26eb2980f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/DefaultLoanLifecycleStateMachine.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/DefaultLoanLifecycleStateMachine.java
@@ -85,7 +85,11 @@ public class DefaultLoanLifecycleStateMachine implements 
LoanLifecycleStateMachi
                 if (anyOfAllowedWhenComingFrom(from, LoanStatus.APPROVED, 
LoanStatus.CLOSED_OBLIGATIONS_MET)) {
                     newState = activeTransition();
                 } else if (from.isOverpaid() && 
loan.getTotalOverpaidAsMoney().isZero()) {
-                    newState = activeTransition();
+                    if 
(loan.getLoanSummary().getTotalOutstanding(loan.getCurrency()).isZero()) {
+                        newState = closeObligationsMetTransition();
+                    } else {
+                        newState = activeTransition();
+                    }
                 }
             break;
             case LOAN_APPROVAL_UNDO:
diff --git 
a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/DefaultLoanLifecycleStateMachineTest.java
 
b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/DefaultLoanLifecycleStateMachineTest.java
index c9c5e0c5d..111893c3e 100644
--- 
a/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/DefaultLoanLifecycleStateMachineTest.java
+++ 
b/fineract-provider/src/test/java/org/apache/fineract/portfolio/loanaccount/domain/DefaultLoanLifecycleStateMachineTest.java
@@ -20,6 +20,7 @@ package org.apache.fineract.portfolio.loanaccount.domain;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoInteractions;
 
@@ -133,11 +134,17 @@ class DefaultLoanLifecycleStateMachineTest {
     @Test
     public void 
testTransitionShouldWorkProperlyForLoanDisbursementWhenLoanIsOverpaid() {
         // given
-        Money overpayment = Money.of(new MonetaryCurrency("USD", 2, null), 
BigDecimal.ZERO);
+        MonetaryCurrency currency = new MonetaryCurrency("USD", 2, null);
+        Money zero = Money.of(currency, BigDecimal.ZERO);
+        Money one = Money.of(currency, BigDecimal.ONE);
         Loan loan = Mockito.mock(Loan.class);
+        LoanSummary loanSummary = Mockito.mock(LoanSummary.class);
+        Mockito.when(loan.getCurrency()).thenReturn(currency);
         
Mockito.when(loan.getPlainStatus()).thenReturn(LoanStatus.OVERPAID.getValue());
         Mockito.when(loan.getStatus()).thenReturn(LoanStatus.OVERPAID);
-        Mockito.when(loan.getTotalOverpaidAsMoney()).thenReturn(overpayment);
+        Mockito.when(loan.getTotalOverpaidAsMoney()).thenReturn(zero);
+        Mockito.when(loan.getLoanSummary()).thenReturn(loanSummary);
+        
Mockito.when(loanSummary.getTotalOutstanding(eq(currency))).thenReturn(one);
         // when
         underTest.transition(LoanEvent.LOAN_DISBURSED, loan);
         // then
@@ -145,6 +152,26 @@ class DefaultLoanLifecycleStateMachineTest {
         
verify(businessEventNotifierService).notifyPostBusinessEvent(any(LoanStatusChangedBusinessEvent.class));
     }
 
+    @Test
+    public void 
testTransitionShouldWorkProperlyForLoanDisbursementWhenLoanIsOverpaidAndGotClosed()
 {
+        // given
+        MonetaryCurrency currency = new MonetaryCurrency("USD", 2, null);
+        Money zero = Money.of(currency, BigDecimal.ZERO);
+        Loan loan = Mockito.mock(Loan.class);
+        LoanSummary loanSummary = Mockito.mock(LoanSummary.class);
+        Mockito.when(loan.getCurrency()).thenReturn(currency);
+        
Mockito.when(loan.getPlainStatus()).thenReturn(LoanStatus.OVERPAID.getValue());
+        Mockito.when(loan.getStatus()).thenReturn(LoanStatus.OVERPAID);
+        Mockito.when(loan.getTotalOverpaidAsMoney()).thenReturn(zero);
+        Mockito.when(loan.getLoanSummary()).thenReturn(loanSummary);
+        
Mockito.when(loanSummary.getTotalOutstanding(currency)).thenReturn(zero);
+        // when
+        underTest.transition(LoanEvent.LOAN_DISBURSED, loan);
+        // then
+        verify(loan, 
Mockito.times(1)).setLoanStatus(LoanStatus.CLOSED_OBLIGATIONS_MET.getValue());
+        
verify(businessEventNotifierService).notifyPostBusinessEvent(any(LoanStatusChangedBusinessEvent.class));
+    }
+
     @Test
     public void 
testTransitionShouldWorkProperlyForLoanDisbursementWhenLoanIsOverpaidAndRemainsOverpaid()
 {
         // given

Reply via email to