Skip to content

Commit 6371d6b

Browse files
Prevent no-op updates for approved amount modification and add integration test (FINERACT-2541)
1 parent 6bf0dee commit 6371d6b

2 files changed

Lines changed: 37 additions & 0 deletions

File tree

fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApprovedAmountWritePlatformServiceImpl.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder;
2828
import org.apache.fineract.infrastructure.event.business.domain.loan.LoanApprovedAmountChangedBusinessEvent;
2929
import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService;
30+
import org.apache.fineract.portfolio.common.service.Validator;
3031
import org.apache.fineract.portfolio.loanaccount.api.LoanApiConstants;
3132
import org.apache.fineract.portfolio.loanaccount.domain.Loan;
3233
import org.apache.fineract.portfolio.loanaccount.domain.LoanApprovedAmountHistory;
@@ -58,6 +59,12 @@ public CommandProcessingResult modifyLoanApprovedAmount(final Long loanId, final
5859

5960
BigDecimal newApprovedAmount = command.bigDecimalValueOfParameterNamed(LoanApiConstants.amountParameterName);
6061

62+
if (newApprovedAmount.compareTo(loan.getApprovedPrincipal()) == 0) {
63+
Validator.validateOrThrowDomainViolation("loan.approved.amount",
64+
baseDataValidator -> baseDataValidator.reset().parameter(LoanApiConstants.amountParameterName).value(newApprovedAmount)
65+
.failWithCode("must.be.different.from.current.approved.amount"));
66+
}
67+
6168
LoanApprovedAmountHistory loanApprovedAmountHistory = new LoanApprovedAmountHistory(loan.getId(), newApprovedAmount,
6269
loan.getApprovedPrincipal());
6370

@@ -99,6 +106,12 @@ public CommandProcessingResult modifyLoanAvailableDisbursementAmount(Long loanId
99106
.add(newAvailableDisbursementAmount);
100107
changes.put("newApprovedAmount", newApprovedAmount);
101108

109+
if (newApprovedAmount.compareTo(loan.getApprovedPrincipal()) == 0) {
110+
Validator.validateOrThrowDomainViolation("loan.approved.amount",
111+
baseDataValidator -> baseDataValidator.reset().parameter(LoanApiConstants.amountParameterName).value(newApprovedAmount)
112+
.failWithCode("must.be.different.from.current.approved.amount"));
113+
}
114+
102115
LoanApprovedAmountHistory loanApprovedAmountHistory = new LoanApprovedAmountHistory(loan.getId(), newApprovedAmount,
103116
loan.getApprovedPrincipal());
104117

integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanModifyApprovedAmountTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,30 @@ public void testValidLoanApprovedAmountModificationInvalidLoanStatus() {
127127
});
128128
}
129129

130+
@Test
131+
public void testShouldFailWhenApprovedAmountIsSame() {
132+
133+
final PostClientsResponse client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest());
134+
final PostLoanProductsResponse loanProductsResponse = loanProductHelper.createLoanProduct(create4IProgressive());
135+
136+
runAt("1 January 2024", () -> {
137+
Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), loanProductsResponse.getResourceId(), "1 January 2024",
138+
1000.0, 10.0, 4, null);
139+
140+
disburseLoan(loanId, BigDecimal.valueOf(100), "1 January 2024");
141+
142+
GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
143+
BigDecimal sameApprovedAmount = loanDetails.getApprovedPrincipal();
144+
145+
CallFailedRuntimeException exception = assertThrows(CallFailedRuntimeException.class,
146+
() -> modifyLoanApprovedAmount(loanId, sameApprovedAmount));
147+
148+
assertEquals(403, exception.getResponse().code());
149+
assertTrue(exception.getMessage()
150+
.contains("validation.msg.loan.approved.amount.amount.must.be.different.from.current.approved.amount"));
151+
});
152+
}
153+
130154
@Test
131155
public void testModifyLoanApprovedAmountTooHigh() {
132156
BigDecimal twoThousand = BigDecimal.valueOf(2000.0);

0 commit comments

Comments
 (0)