FINERACT-2232: Capitalized income config backend validation

This commit is contained in:
adam.magyari
2025-04-22 17:11:54 +02:00
committed by Adam Saghy
parent a11c567413
commit 07e64da523
2 changed files with 128 additions and 96 deletions
@@ -2692,6 +2692,18 @@ public final class LoanProductDataValidator {
.extractBooleanNamed(LoanProductConstants.ENABLE_INCOME_CAPITALIZATION_PARAM_NAME, element); .extractBooleanNamed(LoanProductConstants.ENABLE_INCOME_CAPITALIZATION_PARAM_NAME, element);
baseDataValidator.reset().parameter(LoanProductConstants.ENABLE_INCOME_CAPITALIZATION_PARAM_NAME) baseDataValidator.reset().parameter(LoanProductConstants.ENABLE_INCOME_CAPITALIZATION_PARAM_NAME)
.value(enableIncomeCapitalization).ignoreIfNull().validateForBooleanValue(); .value(enableIncomeCapitalization).ignoreIfNull().validateForBooleanValue();
if (enableIncomeCapitalization) {
final String capitalizedIncomeCalculationType = this.fromApiJsonHelper
.extractStringNamed(LoanProductConstants.CAPITALIZED_INCOME_CALCULATION_TYPE_PARAM_NAME, element);
baseDataValidator.reset().parameter(LoanProductConstants.CAPITALIZED_INCOME_CALCULATION_TYPE_PARAM_NAME)
.value(capitalizedIncomeCalculationType).isOneOfEnumValues(LoanCapitalizedIncomeCalculationType.class)
.cantBeBlankWhenParameterProvidedIs(LoanProductConstants.ENABLE_INCOME_CAPITALIZATION_PARAM_NAME, true);
final String capitalizedIncomeStrategy = this.fromApiJsonHelper
.extractStringNamed(LoanProductConstants.CAPITALIZED_INCOME_STRATEGY_PARAM_NAME, element);
baseDataValidator.reset().parameter(LoanProductConstants.CAPITALIZED_INCOME_STRATEGY_PARAM_NAME)
.value(capitalizedIncomeStrategy).isOneOfEnumValues(LoanCapitalizedIncomeStrategy.class)
.cantBeBlankWhenParameterProvidedIs(LoanProductConstants.ENABLE_INCOME_CAPITALIZATION_PARAM_NAME, true);
}
} else if (this.fromApiJsonHelper.parameterExists(LoanProductConstants.ENABLE_INCOME_CAPITALIZATION_PARAM_NAME, element)) { } else if (this.fromApiJsonHelper.parameterExists(LoanProductConstants.ENABLE_INCOME_CAPITALIZATION_PARAM_NAME, element)) {
Boolean enableIncomeCapitalization = this.fromApiJsonHelper Boolean enableIncomeCapitalization = this.fromApiJsonHelper
.extractBooleanNamed(LoanProductConstants.ENABLE_INCOME_CAPITALIZATION_PARAM_NAME, element); .extractBooleanNamed(LoanProductConstants.ENABLE_INCOME_CAPITALIZATION_PARAM_NAME, element);
@@ -29,119 +29,139 @@ import org.apache.fineract.integrationtests.common.ClientHelper;
import org.apache.fineract.portfolio.loanaccount.domain.LoanCapitalizedIncomeCalculationType; import org.apache.fineract.portfolio.loanaccount.domain.LoanCapitalizedIncomeCalculationType;
import org.apache.fineract.portfolio.loanaccount.domain.LoanCapitalizedIncomeStrategy; import org.apache.fineract.portfolio.loanaccount.domain.LoanCapitalizedIncomeStrategy;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
public class LoanProductTest extends BaseLoanIntegrationTest { public class LoanProductTest extends BaseLoanIntegrationTest {
@Test @Nested
public void testIncomeCapitalizationEnabled() { public class IncomeCapitalizationTest {
final PostClientsResponse client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest());
final PostLoanProductsResponse loanProductsResponse = loanProductHelper @Test
.createLoanProduct(create4IProgressive().enableIncomeCapitalization(true) public void testIncomeCapitalizationEnabled() {
.capitalizedIncomeCalculationType(PostLoanProductsRequest.CapitalizedIncomeCalculationTypeEnum.FLAT) final PostClientsResponse client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest());
.capitalizedIncomeStrategy(PostLoanProductsRequest.CapitalizedIncomeStrategyEnum.EQUAL_AMORTIZATION));
final GetLoanProductsProductIdResponse loanProductsProductIdResponse = loanProductHelper final PostLoanProductsResponse loanProductsResponse = loanProductHelper
.retrieveLoanProductById(loanProductsResponse.getResourceId()); .createLoanProduct(create4IProgressive().enableIncomeCapitalization(true)
Assertions.assertEquals(Boolean.TRUE, loanProductsProductIdResponse.getEnableIncomeCapitalization()); .capitalizedIncomeCalculationType(PostLoanProductsRequest.CapitalizedIncomeCalculationTypeEnum.FLAT)
Assertions.assertNotNull(loanProductsProductIdResponse.getCapitalizedIncomeCalculationType()); .capitalizedIncomeStrategy(PostLoanProductsRequest.CapitalizedIncomeStrategyEnum.EQUAL_AMORTIZATION));
Assertions.assertEquals(LoanCapitalizedIncomeCalculationType.FLAT.getCode(),
loanProductsProductIdResponse.getCapitalizedIncomeCalculationType().getCode());
Assertions.assertNotNull(loanProductsProductIdResponse.getCapitalizedIncomeStrategy());
Assertions.assertEquals(LoanCapitalizedIncomeStrategy.EQUAL_AMORTIZATION.getCode(),
loanProductsProductIdResponse.getCapitalizedIncomeStrategy().getCode());
runAt("20 December 2024", () -> { final GetLoanProductsProductIdResponse loanProductsProductIdResponse = loanProductHelper
Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), loanProductsResponse.getResourceId(), "20 December 2024", .retrieveLoanProductById(loanProductsResponse.getResourceId());
430.0, 7.0, 6, null); Assertions.assertEquals(Boolean.TRUE, loanProductsProductIdResponse.getEnableIncomeCapitalization());
Assertions.assertNotNull(loanProductsProductIdResponse.getCapitalizedIncomeCalculationType());
final GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
Assertions.assertEquals(Boolean.TRUE, loanDetails.getEnableIncomeCapitalization());
Assertions.assertNotNull(loanDetails.getCapitalizedIncomeCalculationType());
Assertions.assertEquals(LoanCapitalizedIncomeCalculationType.FLAT.getCode(), Assertions.assertEquals(LoanCapitalizedIncomeCalculationType.FLAT.getCode(),
loanDetails.getCapitalizedIncomeCalculationType().getCode()); loanProductsProductIdResponse.getCapitalizedIncomeCalculationType().getCode());
Assertions.assertNotNull(loanDetails.getCapitalizedIncomeStrategy()); Assertions.assertNotNull(loanProductsProductIdResponse.getCapitalizedIncomeStrategy());
Assertions.assertEquals(LoanCapitalizedIncomeStrategy.EQUAL_AMORTIZATION.getCode(), Assertions.assertEquals(LoanCapitalizedIncomeStrategy.EQUAL_AMORTIZATION.getCode(),
loanDetails.getCapitalizedIncomeStrategy().getCode()); loanProductsProductIdResponse.getCapitalizedIncomeStrategy().getCode());
Assertions.assertDoesNotThrow(() -> disburseLoan(loanId, BigDecimal.valueOf(430), "20 December 2024")); runAt("20 December 2024", () -> {
}); Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), loanProductsResponse.getResourceId(), "20 December 2024",
} 430.0, 7.0, 6, null);
@Test final GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
public void testIncomeCapitalizationDisabled() { Assertions.assertEquals(Boolean.TRUE, loanDetails.getEnableIncomeCapitalization());
final PostClientsResponse client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()); Assertions.assertNotNull(loanDetails.getCapitalizedIncomeCalculationType());
Assertions.assertEquals(LoanCapitalizedIncomeCalculationType.FLAT.getCode(),
loanDetails.getCapitalizedIncomeCalculationType().getCode());
Assertions.assertNotNull(loanDetails.getCapitalizedIncomeStrategy());
Assertions.assertEquals(LoanCapitalizedIncomeStrategy.EQUAL_AMORTIZATION.getCode(),
loanDetails.getCapitalizedIncomeStrategy().getCode());
final PostLoanProductsResponse loanProductsResponse = loanProductHelper Assertions.assertDoesNotThrow(() -> disburseLoan(loanId, BigDecimal.valueOf(430), "20 December 2024"));
.createLoanProduct(create4IProgressive().enableIncomeCapitalization(false) });
.capitalizedIncomeCalculationType(PostLoanProductsRequest.CapitalizedIncomeCalculationTypeEnum.FLAT) }
.capitalizedIncomeStrategy(PostLoanProductsRequest.CapitalizedIncomeStrategyEnum.EQUAL_AMORTIZATION));
final GetLoanProductsProductIdResponse loanProductsProductIdResponse = loanProductHelper @Test
.retrieveLoanProductById(loanProductsResponse.getResourceId()); public void testIncomeCapitalizationDisabled() {
Assertions.assertEquals(Boolean.FALSE, loanProductsProductIdResponse.getEnableIncomeCapitalization()); final PostClientsResponse client = clientHelper.createClient(ClientHelper.defaultClientCreationRequest());
Assertions.assertNotNull(loanProductsProductIdResponse.getCapitalizedIncomeCalculationType());
Assertions.assertEquals(LoanCapitalizedIncomeCalculationType.FLAT.getCode(),
loanProductsProductIdResponse.getCapitalizedIncomeCalculationType().getCode());
Assertions.assertNotNull(loanProductsProductIdResponse.getCapitalizedIncomeStrategy());
Assertions.assertEquals(LoanCapitalizedIncomeStrategy.EQUAL_AMORTIZATION.getCode(),
loanProductsProductIdResponse.getCapitalizedIncomeStrategy().getCode());
runAt("20 December 2024", () -> { final PostLoanProductsResponse loanProductsResponse = loanProductHelper
Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), loanProductsResponse.getResourceId(), "20 December 2024", .createLoanProduct(create4IProgressive().enableIncomeCapitalization(false)
430.0, 7.0, 6, null); .capitalizedIncomeCalculationType(PostLoanProductsRequest.CapitalizedIncomeCalculationTypeEnum.FLAT)
.capitalizedIncomeStrategy(PostLoanProductsRequest.CapitalizedIncomeStrategyEnum.EQUAL_AMORTIZATION));
final GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId); final GetLoanProductsProductIdResponse loanProductsProductIdResponse = loanProductHelper
Assertions.assertEquals(Boolean.FALSE, loanDetails.getEnableIncomeCapitalization()); .retrieveLoanProductById(loanProductsResponse.getResourceId());
Assertions.assertNotNull(loanDetails.getCapitalizedIncomeCalculationType()); Assertions.assertEquals(Boolean.FALSE, loanProductsProductIdResponse.getEnableIncomeCapitalization());
Assertions.assertNotNull(loanProductsProductIdResponse.getCapitalizedIncomeCalculationType());
Assertions.assertEquals(LoanCapitalizedIncomeCalculationType.FLAT.getCode(), Assertions.assertEquals(LoanCapitalizedIncomeCalculationType.FLAT.getCode(),
loanDetails.getCapitalizedIncomeCalculationType().getCode()); loanProductsProductIdResponse.getCapitalizedIncomeCalculationType().getCode());
Assertions.assertNotNull(loanDetails.getCapitalizedIncomeStrategy()); Assertions.assertNotNull(loanProductsProductIdResponse.getCapitalizedIncomeStrategy());
Assertions.assertEquals(LoanCapitalizedIncomeStrategy.EQUAL_AMORTIZATION.getCode(), Assertions.assertEquals(LoanCapitalizedIncomeStrategy.EQUAL_AMORTIZATION.getCode(),
loanDetails.getCapitalizedIncomeStrategy().getCode()); loanProductsProductIdResponse.getCapitalizedIncomeStrategy().getCode());
Assertions.assertDoesNotThrow(() -> disburseLoan(loanId, BigDecimal.valueOf(430), "20 December 2024")); runAt("20 December 2024", () -> {
}); Long loanId = applyAndApproveProgressiveLoan(client.getClientId(), loanProductsResponse.getResourceId(), "20 December 2024",
430.0, 7.0, 6, null);
final GetLoansLoanIdResponse loanDetails = loanTransactionHelper.getLoanDetails(loanId);
Assertions.assertEquals(Boolean.FALSE, loanDetails.getEnableIncomeCapitalization());
Assertions.assertNotNull(loanDetails.getCapitalizedIncomeCalculationType());
Assertions.assertEquals(LoanCapitalizedIncomeCalculationType.FLAT.getCode(),
loanDetails.getCapitalizedIncomeCalculationType().getCode());
Assertions.assertNotNull(loanDetails.getCapitalizedIncomeStrategy());
Assertions.assertEquals(LoanCapitalizedIncomeStrategy.EQUAL_AMORTIZATION.getCode(),
loanDetails.getCapitalizedIncomeStrategy().getCode());
Assertions.assertDoesNotThrow(() -> disburseLoan(loanId, BigDecimal.valueOf(430), "20 December 2024"));
});
}
@Test
public void testIncomeCapitalizationUpdateProduct() {
final PostLoanProductsResponse loanProductsResponse = loanProductHelper
.createLoanProduct(create4IProgressive().enableIncomeCapitalization(true)
.capitalizedIncomeCalculationType(PostLoanProductsRequest.CapitalizedIncomeCalculationTypeEnum.FLAT)
.capitalizedIncomeStrategy(PostLoanProductsRequest.CapitalizedIncomeStrategyEnum.EQUAL_AMORTIZATION));
final GetLoanProductsProductIdResponse loanProductsProductIdResponse = loanProductHelper
.retrieveLoanProductById(loanProductsResponse.getResourceId());
Assertions.assertEquals(Boolean.TRUE, loanProductsProductIdResponse.getEnableIncomeCapitalization());
Assertions.assertNotNull(loanProductsProductIdResponse.getCapitalizedIncomeCalculationType());
Assertions.assertEquals(LoanCapitalizedIncomeCalculationType.FLAT.getCode(),
loanProductsProductIdResponse.getCapitalizedIncomeCalculationType().getCode());
Assertions.assertNotNull(loanProductsProductIdResponse.getCapitalizedIncomeStrategy());
Assertions.assertEquals(LoanCapitalizedIncomeStrategy.EQUAL_AMORTIZATION.getCode(),
loanProductsProductIdResponse.getCapitalizedIncomeStrategy().getCode());
loanProductHelper.updateLoanProductById(loanProductsResponse.getResourceId(),
new PutLoanProductsProductIdRequest().enableIncomeCapitalization(false));
final GetLoanProductsProductIdResponse updatedLoanProductsProductIdResponse = loanProductHelper
.retrieveLoanProductById(loanProductsResponse.getResourceId());
Assertions.assertEquals(Boolean.FALSE, updatedLoanProductsProductIdResponse.getEnableIncomeCapitalization());
Assertions.assertNotNull(updatedLoanProductsProductIdResponse.getCapitalizedIncomeCalculationType());
Assertions.assertEquals(LoanCapitalizedIncomeCalculationType.FLAT.getCode(),
updatedLoanProductsProductIdResponse.getCapitalizedIncomeCalculationType().getCode());
Assertions.assertNotNull(updatedLoanProductsProductIdResponse.getCapitalizedIncomeStrategy());
Assertions.assertEquals(LoanCapitalizedIncomeStrategy.EQUAL_AMORTIZATION.getCode(),
updatedLoanProductsProductIdResponse.getCapitalizedIncomeStrategy().getCode());
}
@Test
public void testIncomeCapitalizationCumulativeNotSupported() {
Assertions
.assertThrows(RuntimeException.class,
() -> loanProductHelper.createLoanProduct(createOnePeriod30DaysPeriodicAccrualProduct(7.0)
.enableIncomeCapitalization(true)
.capitalizedIncomeCalculationType(PostLoanProductsRequest.CapitalizedIncomeCalculationTypeEnum.FLAT)
.capitalizedIncomeStrategy(PostLoanProductsRequest.CapitalizedIncomeStrategyEnum.EQUAL_AMORTIZATION)));
}
@Test
public void testIncomeCapitalizationEnabledCalculationTypeNotProvided() {
Assertions.assertThrows(RuntimeException.class,
() -> loanProductHelper.createLoanProduct(create4IProgressive().enableIncomeCapitalization(true)
.capitalizedIncomeStrategy(PostLoanProductsRequest.CapitalizedIncomeStrategyEnum.EQUAL_AMORTIZATION)));
}
@Test
public void testIncomeCapitalizationEnabledStrategyNotProvided() {
Assertions.assertThrows(RuntimeException.class,
() -> loanProductHelper.createLoanProduct(create4IProgressive().enableIncomeCapitalization(true)
.capitalizedIncomeCalculationType(PostLoanProductsRequest.CapitalizedIncomeCalculationTypeEnum.FLAT)));
}
} }
@Test
public void testIncomeCapitalizationUpdateProduct() {
final PostLoanProductsResponse loanProductsResponse = loanProductHelper
.createLoanProduct(create4IProgressive().enableIncomeCapitalization(true)
.capitalizedIncomeCalculationType(PostLoanProductsRequest.CapitalizedIncomeCalculationTypeEnum.FLAT)
.capitalizedIncomeStrategy(PostLoanProductsRequest.CapitalizedIncomeStrategyEnum.EQUAL_AMORTIZATION));
final GetLoanProductsProductIdResponse loanProductsProductIdResponse = loanProductHelper
.retrieveLoanProductById(loanProductsResponse.getResourceId());
Assertions.assertEquals(Boolean.TRUE, loanProductsProductIdResponse.getEnableIncomeCapitalization());
Assertions.assertNotNull(loanProductsProductIdResponse.getCapitalizedIncomeCalculationType());
Assertions.assertEquals(LoanCapitalizedIncomeCalculationType.FLAT.getCode(),
loanProductsProductIdResponse.getCapitalizedIncomeCalculationType().getCode());
Assertions.assertNotNull(loanProductsProductIdResponse.getCapitalizedIncomeStrategy());
Assertions.assertEquals(LoanCapitalizedIncomeStrategy.EQUAL_AMORTIZATION.getCode(),
loanProductsProductIdResponse.getCapitalizedIncomeStrategy().getCode());
loanProductHelper.updateLoanProductById(loanProductsResponse.getResourceId(),
new PutLoanProductsProductIdRequest().enableIncomeCapitalization(false));
final GetLoanProductsProductIdResponse updatedLoanProductsProductIdResponse = loanProductHelper
.retrieveLoanProductById(loanProductsResponse.getResourceId());
Assertions.assertEquals(Boolean.FALSE, updatedLoanProductsProductIdResponse.getEnableIncomeCapitalization());
Assertions.assertNotNull(updatedLoanProductsProductIdResponse.getCapitalizedIncomeCalculationType());
Assertions.assertEquals(LoanCapitalizedIncomeCalculationType.FLAT.getCode(),
updatedLoanProductsProductIdResponse.getCapitalizedIncomeCalculationType().getCode());
Assertions.assertNotNull(updatedLoanProductsProductIdResponse.getCapitalizedIncomeStrategy());
Assertions.assertEquals(LoanCapitalizedIncomeStrategy.EQUAL_AMORTIZATION.getCode(),
updatedLoanProductsProductIdResponse.getCapitalizedIncomeStrategy().getCode());
}
@Test
public void testIncomeCapitalizationCumulativeNotSupported() {
Assertions.assertThrows(RuntimeException.class,
() -> loanProductHelper.createLoanProduct(createOnePeriod30DaysPeriodicAccrualProduct(7.0).enableIncomeCapitalization(true)
.capitalizedIncomeCalculationType(PostLoanProductsRequest.CapitalizedIncomeCalculationTypeEnum.FLAT)
.capitalizedIncomeStrategy(PostLoanProductsRequest.CapitalizedIncomeStrategyEnum.EQUAL_AMORTIZATION)));
}
} }