Skip to content

Commit feb2d8c

Browse files
FINERACT-2556: Prevent no-op updates for approved amount modification and add integration test
1 parent 6bf0dee commit feb2d8c

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

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;
@@ -39,6 +40,8 @@
3940
@RequiredArgsConstructor
4041
public class LoanApprovedAmountWritePlatformServiceImpl implements LoanApprovedAmountWritePlatformService {
4142

43+
private static final String ERROR_CODE_MUST_BE_DIFFERENT_FROM_CURRENT_APPROVED_AMOUNT = "must.be.different.from.current.approved.amount";
44+
4245
private final LoanAssembler loanAssembler;
4346
private final LoanApprovedAmountValidator loanApprovedAmountValidator;
4447
private final LoanApprovedAmountHistoryRepository loanApprovedAmountHistoryRepository;
@@ -58,6 +61,8 @@ public CommandProcessingResult modifyLoanApprovedAmount(final Long loanId, final
5861

5962
BigDecimal newApprovedAmount = command.bigDecimalValueOfParameterNamed(LoanApiConstants.amountParameterName);
6063

64+
validateNewApprovedAmountDiffersFromCurrent(loan, newApprovedAmount);
65+
6166
LoanApprovedAmountHistory loanApprovedAmountHistory = new LoanApprovedAmountHistory(loan.getId(), newApprovedAmount,
6267
loan.getApprovedPrincipal());
6368

@@ -115,4 +120,12 @@ public CommandProcessingResult modifyLoanAvailableDisbursementAmount(Long loanId
115120
.with(changes) //
116121
.build();
117122
}
123+
124+
private static void validateNewApprovedAmountDiffersFromCurrent(final Loan loan, final BigDecimal newApprovedAmount) {
125+
if (newApprovedAmount.compareTo(loan.getApprovedPrincipal()) == 0) {
126+
Validator.validateOrThrowDomainViolation("loan.approved.amount",
127+
baseDataValidator -> baseDataValidator.reset().parameter(LoanApiConstants.amountParameterName).value(newApprovedAmount)
128+
.failWithCode(ERROR_CODE_MUST_BE_DIFFERENT_FROM_CURRENT_APPROVED_AMOUNT));
129+
}
130+
}
118131
}

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)