diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApprovedAmountWritePlatformServiceImpl.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApprovedAmountWritePlatformServiceImpl.java index 13a096cb54b..88d57eb31be 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApprovedAmountWritePlatformServiceImpl.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApprovedAmountWritePlatformServiceImpl.java @@ -27,6 +27,7 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.event.business.domain.loan.LoanApprovedAmountChangedBusinessEvent; import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService; +import org.apache.fineract.portfolio.common.service.Validator; import org.apache.fineract.portfolio.loanaccount.api.LoanApiConstants; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanApprovedAmountHistory; @@ -39,6 +40,8 @@ @RequiredArgsConstructor public class LoanApprovedAmountWritePlatformServiceImpl implements LoanApprovedAmountWritePlatformService { + private static final String ERROR_CODE_MUST_BE_DIFFERENT_FROM_CURRENT_APPROVED_AMOUNT = "must.be.different.from.current.approved.amount"; + private final LoanAssembler loanAssembler; private final LoanApprovedAmountValidator loanApprovedAmountValidator; private final LoanApprovedAmountHistoryRepository loanApprovedAmountHistoryRepository; @@ -58,6 +61,8 @@ public CommandProcessingResult modifyLoanApprovedAmount(final Long loanId, final BigDecimal newApprovedAmount = command.bigDecimalValueOfParameterNamed(LoanApiConstants.amountParameterName); + validateNewApprovedAmountDiffersFromCurrent(loan, newApprovedAmount); + LoanApprovedAmountHistory loanApprovedAmountHistory = new LoanApprovedAmountHistory(loan.getId(), newApprovedAmount, loan.getApprovedPrincipal()); @@ -99,6 +104,8 @@ public CommandProcessingResult modifyLoanAvailableDisbursementAmount(Long loanId .add(newAvailableDisbursementAmount); changes.put("newApprovedAmount", newApprovedAmount); + validateNewApprovedAmountDiffersFromCurrent(loan, newApprovedAmount); + LoanApprovedAmountHistory loanApprovedAmountHistory = new LoanApprovedAmountHistory(loan.getId(), newApprovedAmount, loan.getApprovedPrincipal()); @@ -115,4 +122,12 @@ public CommandProcessingResult modifyLoanAvailableDisbursementAmount(Long loanId .with(changes) // .build(); } + + private static void validateNewApprovedAmountDiffersFromCurrent(final Loan loan, final BigDecimal newApprovedAmount) { + if (newApprovedAmount.compareTo(loan.getApprovedPrincipal()) == 0) { + Validator.validateOrThrowDomainViolation("loan.approved.amount", + baseDataValidator -> baseDataValidator.reset().parameter(LoanApiConstants.amountParameterName).value(newApprovedAmount) + .failWithCode(ERROR_CODE_MUST_BE_DIFFERENT_FROM_CURRENT_APPROVED_AMOUNT)); + } + } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanModifyApprovedAmountTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanModifyApprovedAmountTest.java index 554518e308b..def3f092378 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanModifyApprovedAmountTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanModifyApprovedAmountTest.java @@ -127,6 +127,30 @@ public void testValidLoanApprovedAmountModificationInvalidLoanStatus() { }); } + @Test + public void testShouldFailWhenApprovedAmountIsSame() { + + final PostClientsResponse client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()); + final PostLoanProductsResponse loanProductsResponse = loanProductHelper.createLoanProduct(create4IProgressive()); + + runAt("1 January 2024", () -> { + Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), loanProductsResponse.getResourceId(), "1 January 2024", + 1000.0, 10.0, 4, null); + + disburseLoan(loanId, BigDecimal.valueOf(100), "1 January 2024"); + + GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId); + BigDecimal sameApprovedAmount = loanDetails.getApprovedPrincipal(); + + CallFailedRuntimeException exception = assertThrows(CallFailedRuntimeException.class, + () -> modifyLoanApprovedAmount(loanId, sameApprovedAmount)); + + assertEquals(403, exception.getResponse().code()); + assertTrue(exception.getMessage() + .contains("validation.msg.loan.approved.amount.amount.must.be.different.from.current.approved.amount")); + }); + } + @Test public void testModifyLoanApprovedAmountTooHigh() { BigDecimal twoThousand = BigDecimal.valueOf(2000.0);