diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index 1dabf678f..c78483d50 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -3076,6 +3076,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf final boolean isScheduleRegenerateRequired = loan.isActualDisbursedOnDateEarlierOrLaterThanExpected(actualDisbursementDate); loan.setActualDisbursementDate(null); loan.setDisbursedBy(null); + loan.setLastClosedBusinessDate(null); final boolean isDisbursedAmountChanged = !MathUtil.isEqualTo(loan.getApprovedPrincipal(), loan.getLoanRepaymentScheduleDetail().getPrincipal().getAmount()); loan.getLoanRepaymentScheduleDetail().setPrincipal(loan.getApprovedPrincipal()); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCOBCreateAccrualsTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCOBCreateAccrualsTest.java index fc81ebf76..c22516c13 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCOBCreateAccrualsTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanCOBCreateAccrualsTest.java @@ -18,6 +18,9 @@ */ package org.apache.fineract.integrationtests; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + import java.math.BigDecimal; import java.time.LocalDate; import java.util.ArrayList; @@ -682,6 +685,46 @@ public class LoanCOBCreateAccrualsTest extends BaseLoanIntegrationTest { }); } + @Test + public void testRunCOBJobAfterUndoDisbursement() { + AtomicReference loanIdRef = new AtomicReference<>(); + setup(); + final PostLoanProductsResponse loanProductsResponse = loanProductHelper + .createLoanProduct(create4IProgressive().enableAccrualActivityPosting(true)); + + runAt("1 April 2025", () -> { + Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), loanProductsResponse.getResourceId(), "1 March 2025", 430.0, + 26.0, 6, null); + + loanIdRef.set(loanId); + + disburseLoan(loanId, BigDecimal.valueOf(430), "1 March 2025"); + + executeInlineCOB(loanId); + + GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId); + validateTransactionsExist(loanDetails, // + transaction(9.02, "Accrual", "31 March 2025", 0.0, 0.0, 9.02, 0.0, 0.0, 0.0, 0.0)); + assertEquals(LocalDate.of(2025, 3, 31), loanDetails.getLastClosedBusinessDate()); + + undoDisbursement(loanId.intValue()); + loanDetails = loanTransactionHelper.getLoanDetails(loanId); + assertNull(loanDetails.getLastClosedBusinessDate()); + + disburseLoan(loanIdRef.get(), BigDecimal.valueOf(430), "2 March 2025"); + loanDetails = loanTransactionHelper.getLoanDetails(loanId); + assertNull(loanDetails.getLastClosedBusinessDate()); + }); + + runAt("2 April 2025", () -> { + executeInlineCOB(loanIdRef.get()); + GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanIdRef.get()); + validateTransactionsExist(loanDetails, // + transaction(9.02, "Accrual", "01 April 2025", 0.0, 0.0, 9.02, 0.0, 0.0, 0.0, 0.0)); + assertEquals(LocalDate.of(2025, 4, 1), loanDetails.getLastClosedBusinessDate()); + }); + } + private List chargebackCreditAllocationOrders(List allocationIds) { List creditAllocationOrders = new ArrayList<>(allocationIds.size()); for (int i = 0; i < allocationIds.size(); i++) {