FINERACT-2232: Capitalized income config backend validation
This commit is contained in:
+12
@@ -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);
|
||||||
|
|||||||
+116
-96
@@ -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)));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user