diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/LoanProductConstants.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/LoanProductConstants.java index d18c5da69d3..f5cb23a0a33 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/LoanProductConstants.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/LoanProductConstants.java @@ -163,4 +163,6 @@ public interface LoanProductConstants { String ADVANCED_PAYMENT_ALLOCATION_STRATEGY = "advanced-payment-allocation-strategy"; String FIXED_LENGTH = "fixedLength"; + + String USE_DUE_REPAYMENT_GLOBAL_CONFIGS = "useDueRepaymentGlobalConfigs"; } diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResourceSwagger.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResourceSwagger.java index c96e00148be..2bf80548e09 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResourceSwagger.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResourceSwagger.java @@ -157,6 +157,8 @@ private PostLoanProductsRequest() {} public Long delinquencyBucketId; @Schema(example = "false") public Boolean enableInstallmentLevelDelinquency; + @Schema(example = "false") + public Boolean useDueRepaymentGlobalConfigs; @Schema(example = "3") public Integer dueDaysForRepaymentEvent; @Schema(example = "3") @@ -1260,6 +1262,8 @@ private GetLoanCharge() {} public Boolean enableInstallmentLevelDelinquency; @Schema(example = "true") public Boolean disallowExpectedDisbursements; + @Schema(example = "false") + public Boolean useDueRepaymentGlobalConfigs; @Schema(example = "3") public Integer dueDaysForRepaymentEvent; @Schema(example = "3") @@ -1402,6 +1406,8 @@ private PutLoanProductsProductIdRequest() {} public Long delinquencyBucketId; @Schema(example = "false") public Boolean enableInstallmentLevelDelinquency; + @Schema(example = "false") + public Boolean useDueRepaymentGlobalConfigs; @Schema(example = "3") public Integer dueDaysForRepaymentEvent; @Schema(example = "3") diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java index 7403e82e447..85a227070d0 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/LoanProductData.java @@ -212,6 +212,7 @@ public class LoanProductData implements Serializable { private final Collection delinquencyBucketOptions; private final DelinquencyBucketData delinquencyBucket; + private final boolean useDueRepaymentGlobalConfigs; private final Integer dueDaysForRepaymentEvent; private final Integer overDueDaysForRepaymentEvent; @@ -310,6 +311,7 @@ public static LoanProductData lookup(final Long id, final String name, final Boo final boolean isRatesEnabled = false; final Collection delinquencyBucketOptions = null; final DelinquencyBucketData delinquencyBucket = null; + final boolean useDueRepaymentGlobalConfigs = false; final Integer dueDaysForRepaymentEvent = null; final Integer overDueDaysForRepaymentEvent = null; final boolean enableDownPayment = false; @@ -343,7 +345,7 @@ public static LoanProductData lookup(final Long id, final String name, final Boo fixedPrincipalPercentagePerInstallment, delinquencyBucketOptions, delinquencyBucket, dueDaysForRepaymentEvent, overDueDaysForRepaymentEvent, enableDownPayment, disbursedAmountPercentageDownPayment, enableAutoRepaymentForDownPayment, paymentAllocation, creditAllocation, repaymentStartDateType, enableInstallmentLevelDelinquency, loanScheduleType, - loanScheduleProcessingType, fixedLength); + loanScheduleProcessingType, fixedLength, useDueRepaymentGlobalConfigs); } @@ -432,6 +434,7 @@ public static LoanProductData lookupWithCurrency(final Long id, final String nam final boolean isRatesEnabled = false; final Collection delinquencyBucketOptions = null; final DelinquencyBucketData delinquencyBucket = null; + final boolean useDueRepaymentGlobalConfigs = false; final Integer dueDaysForRepaymentEvent = null; final Integer overDueDaysForRepaymentEvent = null; final boolean enableDownPayment = false; @@ -463,7 +466,7 @@ public static LoanProductData lookupWithCurrency(final Long id, final String nam fixedPrincipalPercentagePerInstallment, delinquencyBucketOptions, delinquencyBucket, dueDaysForRepaymentEvent, overDueDaysForRepaymentEvent, enableDownPayment, disbursedAmountPercentageDownPayment, enableAutoRepaymentForDownPayment, paymentAllocation, creditAllocation, repaymentStartDateType, enableInstallmentLevelDelinquency, loanScheduleType, - loanScheduleProcessingType, fixedLength); + loanScheduleProcessingType, fixedLength, useDueRepaymentGlobalConfigs); } @@ -559,6 +562,7 @@ public static LoanProductData sensibleDefaultsForNewLoanProductCreation() { final boolean isRatesEnabled = false; final Collection delinquencyBucketOptions = null; final DelinquencyBucketData delinquencyBucket = null; + final boolean useDueRepaymentGlobalConfigs = false; final Integer dueDaysForRepaymentEvent = null; final Integer overDueDaysForRepaymentEvent = null; final boolean enableDownPayment = false; @@ -590,7 +594,7 @@ public static LoanProductData sensibleDefaultsForNewLoanProductCreation() { fixedPrincipalPercentagePerInstallment, delinquencyBucketOptions, delinquencyBucket, dueDaysForRepaymentEvent, overDueDaysForRepaymentEvent, enableDownPayment, disbursedAmountPercentageDownPayment, enableAutoRepaymentForDownPayment, paymentAllocation, creditAllocation, repaymentStartDateType, enableInstallmentLevelDelinquency, loanScheduleType, - loanScheduleProcessingType, fixedLength); + loanScheduleProcessingType, fixedLength, useDueRepaymentGlobalConfigs); } @@ -680,6 +684,7 @@ public static LoanProductData loanProductWithFloatingRates(final Long id, final final boolean isRatesEnabled = false; final Collection delinquencyBucketOptions = null; final DelinquencyBucketData delinquencyBucket = null; + final boolean useDueRepaymentGlobalConfigs = false; final Integer dueDaysForRepaymentEvent = null; final Integer overDueDaysForRepaymentEvent = null; final boolean enableDownPayment = false; @@ -711,7 +716,7 @@ public static LoanProductData loanProductWithFloatingRates(final Long id, final fixedPrincipalPercentagePerInstallment, delinquencyBucketOptions, delinquencyBucket, dueDaysForRepaymentEvent, overDueDaysForRepaymentEvent, enableDownPayment, disbursedAmountPercentageDownPayment, enableAutoRepaymentForDownPayment, paymentAllocation, creditAllocationData, repaymentStartDateType, enableInstallmentLevelDelinquency, loanScheduleType, - loanScheduleProcessingType, fixedLength); + loanScheduleProcessingType, fixedLength, useDueRepaymentGlobalConfigs); } public static LoanProductData withAccountingDetails(final LoanProductData productData, final Map accountingMappings, @@ -761,7 +766,8 @@ public LoanProductData(final Long id, final String name, final String shortName, final BigDecimal disbursedAmountPercentageForDownPayment, final boolean enableAutoRepaymentForDownPayment, final Collection paymentAllocation, final Collection creditAllocation, final EnumOptionData repaymentStartDateType, final boolean enableInstallmentLevelDelinquency, - final EnumOptionData loanScheduleType, final EnumOptionData loanScheduleProcessingType, final Integer fixedLength) { + final EnumOptionData loanScheduleType, final EnumOptionData loanScheduleProcessingType, final Integer fixedLength, + final boolean useDueRepaymentGlobalConfigs) { this.id = id; this.name = name; this.shortName = shortName; @@ -878,6 +884,7 @@ public LoanProductData(final Long id, final String name, final String shortName, this.isEqualAmortization = isEqualAmortization; this.delinquencyBucketOptions = delinquencyBucketOptions; this.delinquencyBucket = delinquencyBucket; + this.useDueRepaymentGlobalConfigs = useDueRepaymentGlobalConfigs; this.dueDaysForRepaymentEvent = dueDaysForRepaymentEvent; this.overDueDaysForRepaymentEvent = overDueDaysForRepaymentEvent; this.enableDownPayment = enableDownPayment; @@ -1053,6 +1060,7 @@ public LoanProductData(final LoanProductData productData, final Collection { @Column(name = "repayment_start_date_type_enum", nullable = false) private RepaymentStartDateType repaymentStartDateType; + @Column(name = "use_due_repayment_global_configs", nullable = false) + private boolean useDueRepaymentGlobalConfigs = false; + public static LoanProduct assembleFromJson(final Fund fund, final String loanTransactionProcessingStrategy, final List productCharges, final JsonCommand command, final AprCalculator aprCalculator, FloatingRate floatingRate, final List productRates, List loanProductPaymentAllocationRules, @@ -439,6 +442,9 @@ public static LoanProduct assembleFromJson(final Fund fund, final String loanTra final Integer fixedLength = command.integerValueOfParameterNamed(LoanProductConstants.FIXED_LENGTH); + final boolean useDueRepaymentGlobalConfigs = command + .booleanPrimitiveValueOfParameterNamed(LoanProductConstants.USE_DUE_REPAYMENT_GLOBAL_CONFIGS); + return new LoanProduct(fund, loanTransactionProcessingStrategy, loanProductPaymentAllocationRules, loanProductCreditAllocationRules, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, interestRatePerPeriod, minInterestRatePerPeriod, maxInterestRatePerPeriod, interestFrequencyType, annualInterestRate, interestMethod, @@ -457,7 +463,8 @@ public static LoanProduct assembleFromJson(final Fund fund, final String loanTra isEqualAmortization, productRates, fixedPrincipalPercentagePerInstallment, disallowExpectedDisbursements, allowApprovedDisbursedAmountsOverApplied, overAppliedCalculationType, overAppliedNumber, dueDaysForRepaymentEvent, overDueDaysForRepaymentEvent, enableDownPayment, disbursedAmountPercentageDownPayment, enableAutoRepaymentForDownPayment, - repaymentStartDateType, enableInstallmentLevelDelinquency, loanScheduleType, loanScheduleProcessingType, fixedLength); + repaymentStartDateType, enableInstallmentLevelDelinquency, loanScheduleType, loanScheduleProcessingType, fixedLength, + useDueRepaymentGlobalConfigs); } @@ -674,7 +681,8 @@ public LoanProduct(final Fund fund, final String transactionProcessingStrategyCo final boolean enableDownPayment, final BigDecimal disbursedAmountPercentageForDownPayment, final boolean enableAutoRepaymentForDownPayment, final RepaymentStartDateType repaymentStartDateType, final boolean enableInstallmentLevelDelinquency, final LoanScheduleType loanScheduleType, - final LoanScheduleProcessingType loanScheduleProcessingType, final Integer fixedLength) { + final LoanScheduleProcessingType loanScheduleProcessingType, final Integer fixedLength, + final boolean useDueRepaymentGlobalConfigs) { this.fund = fund; this.transactionProcessingStrategyCode = transactionProcessingStrategyCode; @@ -771,6 +779,7 @@ public LoanProduct(final Fund fund, final String transactionProcessingStrategyCo this.rates = rates; } + this.useDueRepaymentGlobalConfigs = useDueRepaymentGlobalConfigs; this.dueDaysForRepaymentEvent = dueDaysForRepaymentEvent; this.overDueDaysForRepaymentEvent = overDueDaysForRepaymentEvent; this.repaymentStartDateType = repaymentStartDateType; @@ -1277,6 +1286,13 @@ public Map update(final JsonCommand command, final AprCalculator this.overAppliedNumber = newValue; } + if (command.isChangeInBooleanParameterNamed(LoanProductConstants.USE_DUE_REPAYMENT_GLOBAL_CONFIGS, + this.useDueRepaymentGlobalConfigs)) { + final boolean newValue = command.booleanPrimitiveValueOfParameterNamed(LoanProductConstants.USE_DUE_REPAYMENT_GLOBAL_CONFIGS); + actualChanges.put(LoanProductConstants.USE_DUE_REPAYMENT_GLOBAL_CONFIGS, newValue); + this.useDueRepaymentGlobalConfigs = newValue; + } + if (command.isChangeInIntegerParameterNamed(LoanProductConstants.DUE_DAYS_FOR_REPAYMENT_EVENT, this.dueDaysForRepaymentEvent)) { final Integer newValue = command.integerValueOfParameterNamed(LoanProductConstants.DUE_DAYS_FOR_REPAYMENT_EVENT); actualChanges.put(LoanProductConstants.DUE_DAYS_FOR_REPAYMENT_EVENT, newValue); diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/handler/CreateLoanProductCommandHandler.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/handler/CreateLoanProductCommandHandler.java index 72d6dbd174f..66f5e2bfd35 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/handler/CreateLoanProductCommandHandler.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/handler/CreateLoanProductCommandHandler.java @@ -18,26 +18,22 @@ */ package org.apache.fineract.portfolio.loanproduct.handler; +import lombok.RequiredArgsConstructor; import org.apache.fineract.commands.annotation.CommandType; import org.apache.fineract.commands.handler.NewCommandSourceHandler; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.portfolio.loanproduct.service.LoanProductWritePlatformService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @CommandType(entity = "LOANPRODUCT", action = "CREATE") +@RequiredArgsConstructor public class CreateLoanProductCommandHandler implements NewCommandSourceHandler { private final LoanProductWritePlatformService writePlatformService; - @Autowired - public CreateLoanProductCommandHandler(final LoanProductWritePlatformService writePlatformService) { - this.writePlatformService = writePlatformService; - } - @Transactional @Override public CommandProcessingResult processCommand(final JsonCommand command) { diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/handler/UpdateLoanProductCommandHandler.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/handler/UpdateLoanProductCommandHandler.java index 3f7a39c28f4..7548300f90c 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/handler/UpdateLoanProductCommandHandler.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/handler/UpdateLoanProductCommandHandler.java @@ -18,26 +18,22 @@ */ package org.apache.fineract.portfolio.loanproduct.handler; +import lombok.RequiredArgsConstructor; import org.apache.fineract.commands.annotation.CommandType; import org.apache.fineract.commands.handler.NewCommandSourceHandler; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.portfolio.loanproduct.service.LoanProductWritePlatformService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @CommandType(entity = "LOANPRODUCT", action = "UPDATE") +@RequiredArgsConstructor public class UpdateLoanProductCommandHandler implements NewCommandSourceHandler { private final LoanProductWritePlatformService writePlatformService; - @Autowired - public UpdateLoanProductCommandHandler(final LoanProductWritePlatformService writePlatformService) { - this.writePlatformService = writePlatformService; - } - @Transactional @Override public CommandProcessingResult processCommand(final JsonCommand command) { diff --git a/fineract-loan/src/main/resources/db/changelog/tenant/module/loan/module-changelog-master.xml b/fineract-loan/src/main/resources/db/changelog/tenant/module/loan/module-changelog-master.xml index 4fffd9b3e2c..2aa8a93cbfb 100644 --- a/fineract-loan/src/main/resources/db/changelog/tenant/module/loan/module-changelog-master.xml +++ b/fineract-loan/src/main/resources/db/changelog/tenant/module/loan/module-changelog-master.xml @@ -44,4 +44,5 @@ + diff --git a/fineract-loan/src/main/resources/db/changelog/tenant/module/loan/parts/1022_add_use_due_repayment_global_configs_to_product.xml b/fineract-loan/src/main/resources/db/changelog/tenant/module/loan/parts/1022_add_use_due_repayment_global_configs_to_product.xml new file mode 100644 index 00000000000..bf6c7103d37 --- /dev/null +++ b/fineract-loan/src/main/resources/db/changelog/tenant/module/loan/parts/1022_add_use_due_repayment_global_configs_to_product.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/serialization/LoanProductDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/serialization/LoanProductDataValidator.java index e35499b2bbb..2b76ce5f629 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/serialization/LoanProductDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/serialization/LoanProductDataValidator.java @@ -172,7 +172,8 @@ public final class LoanProductDataValidator { LoanProductConstants.ENABLE_DOWN_PAYMENT, LoanProductConstants.DISBURSED_AMOUNT_PERCENTAGE_DOWN_PAYMENT, LoanProductConstants.ENABLE_AUTO_REPAYMENT_DOWN_PAYMENT, LoanProductConstants.REPAYMENT_START_DATE_TYPE, LoanProductConstants.ENABLE_INSTALLMENT_LEVEL_DELINQUENCY, LoanProductConstants.LOAN_SCHEDULE_TYPE, - LoanProductConstants.LOAN_SCHEDULE_PROCESSING_TYPE, LoanProductConstants.FIXED_LENGTH)); + LoanProductConstants.LOAN_SCHEDULE_PROCESSING_TYPE, LoanProductConstants.FIXED_LENGTH, + LoanProductConstants.USE_DUE_REPAYMENT_GLOBAL_CONFIGS)); private static final String[] SUPPORTED_LOAN_CONFIGURABLE_ATTRIBUTES = { LoanProductConstants.amortizationTypeParamName, LoanProductConstants.interestTypeParamName, LoanProductConstants.transactionProcessingStrategyCodeParamName, @@ -568,7 +569,6 @@ public void validateForCreate(final JsonCommand command) { } // Fixed Length validation - fixedLengthValidations(transactionProcessingStrategyCode, isInterestBearing, numberOfRepayments, repaymentEvery, element, baseDataValidator); @@ -757,6 +757,13 @@ public void validateForCreate(final JsonCommand command) { baseDataValidator.reset().parameter(LoanProductConstants.CAN_USE_FOR_TOPUP).value(canUseForTopup).validateForBooleanValue(); } + if (this.fromApiJsonHelper.parameterExists(LoanProductConstants.USE_DUE_REPAYMENT_GLOBAL_CONFIGS, element)) { + final Boolean useDueRepaymentGlobalConfig = this.fromApiJsonHelper + .extractBooleanNamed(LoanProductConstants.USE_DUE_REPAYMENT_GLOBAL_CONFIGS, element); + baseDataValidator.reset().parameter(LoanProductConstants.USE_DUE_REPAYMENT_GLOBAL_CONFIGS).value(useDueRepaymentGlobalConfig) + .validateForBooleanValue(); + } + final Integer dueDaysForRepaymentEvent = this.fromApiJsonHelper .extractIntegerWithLocaleNamed(LoanProductConstants.DUE_DAYS_FOR_REPAYMENT_EVENT, element); baseDataValidator.reset().parameter(LoanProductConstants.DUE_DAYS_FOR_REPAYMENT_EVENT).value(dueDaysForRepaymentEvent) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java index 31b7761634e..b6cbfe1c9e9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java @@ -242,7 +242,7 @@ public String loanProductSchema() { + "lp.allow_multiple_disbursals as multiDisburseLoan, lp.max_disbursals as maxTrancheCount, lp.max_outstanding_loan_balance as outstandingLoanBalance, " + "lp.disallow_expected_disbursements as disallowExpectedDisbursements, lp.allow_approved_disbursed_amounts_over_applied as allowApprovedDisbursedAmountsOverApplied, lp.over_applied_calculation_type as overAppliedCalculationType, over_applied_number as overAppliedNumber, " + "lp.days_in_month_enum as daysInMonth, lp.days_in_year_enum as daysInYear, lp.interest_recalculation_enabled as isInterestRecalculationEnabled, " - + "lp.can_define_fixed_emi_amount as canDefineInstallmentAmount, lp.instalment_amount_in_multiples_of as installmentAmountInMultiplesOf, " + + "lp.can_define_fixed_emi_amount as canDefineInstallmentAmount, lp.instalment_amount_in_multiples_of as installmentAmountInMultiplesOf, lp.use_due_repayment_global_configs as useDueRepaymentGlobalConfigs, " + "lp.due_days_for_repayment_event as dueDaysForRepaymentEvent, lp.overdue_days_for_repayment_event as overDueDaysForRepaymentEvent, lp.enable_down_payment as enableDownPayment, lp.disbursed_amount_percentage_for_down_payment as disbursedAmountPercentageForDownPayment, lp.enable_auto_repayment_for_down_payment as enableAutoRepaymentForDownPayment, lp.repayment_start_date_type_enum as repaymentStartDateType, " + "lp.enable_installment_level_delinquency as enableInstallmentLevelDelinquency, " + "lpr.pre_close_interest_calculation_strategy as preCloseInterestCalculationStrategy, " @@ -525,6 +525,7 @@ public LoanProductData mapRow(@NotNull final ResultSet rs, @SuppressWarnings("un final LoanScheduleType loanScheduleType = LoanScheduleType.valueOf(loanScheduleTypeStr); final String loanScheduleProcessingTypeStr = rs.getString("loanScheduleProcessingType"); final LoanScheduleProcessingType loanScheduleProcessingType = LoanScheduleProcessingType.valueOf(loanScheduleProcessingTypeStr); + final boolean useDueRepaymentGlobalConfigs = rs.getBoolean("useDueRepaymentGlobalConfigs"); return new LoanProductData(id, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, tolerance, numberOfRepayments, minNumberOfRepayments, maxNumberOfRepayments, repaymentEvery, interestRatePerPeriod, @@ -547,7 +548,7 @@ public LoanProductData mapRow(@NotNull final ResultSet rs, @SuppressWarnings("un dueDaysForRepaymentEvent, overDueDaysForRepaymentEvent, enableDownPayment, disbursedAmountPercentageForDownPayment, enableAutoRepaymentForDownPayment, advancedPaymentData, creditAllocationData, repaymentStartDateType, enableInstallmentLevelDelinquency, loanScheduleType.asEnumOptionData(), loanScheduleProcessingType.asEnumOptionData(), - fixedLength); + fixedLength, useDueRepaymentGlobalConfigs); } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductWithRepaymentDueEventConfigurationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductWithRepaymentDueEventConfigurationTest.java index 54b3c08aca5..2cb9b534b16 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductWithRepaymentDueEventConfigurationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductWithRepaymentDueEventConfigurationTest.java @@ -68,6 +68,7 @@ public void loanProductCreationWithDueDaysConfigurationForRepaymentEventTest() { delinquencyBucketId); // event days configuration + boolean useDueRepaymentGlobalConfigs = true; Integer dueDaysForRepaymentEvent = 1; Integer overDueDaysForRepaymentEvent = 2; @@ -75,13 +76,15 @@ public void loanProductCreationWithDueDaysConfigurationForRepaymentEventTest() { final Integer clientId = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId().intValue(); Integer loanProductId = createLoanProductWithDueDaysForRepaymentEvent(loanTransactionHelper, delinquencyBucketId, - dueDaysForRepaymentEvent, overDueDaysForRepaymentEvent); + dueDaysForRepaymentEvent, overDueDaysForRepaymentEvent, useDueRepaymentGlobalConfigs); final GetLoanProductsProductIdResponse getLoanProductsProductResponse = loanTransactionHelper.getLoanProduct(loanProductId); assertNotNull(getLoanProductsProductResponse); assertNotNull(getLoanProductsProductResponse.getDueDaysForRepaymentEvent()); assertNotNull(getLoanProductsProductResponse.getOverDueDaysForRepaymentEvent()); assertEquals(getLoanProductsProductResponse.getDueDaysForRepaymentEvent(), dueDaysForRepaymentEvent); assertEquals(getLoanProductsProductResponse.getOverDueDaysForRepaymentEvent(), overDueDaysForRepaymentEvent); + assertNotNull(getLoanProductsProductResponse.getUseDueRepaymentGlobalConfigs()); + assertEquals(useDueRepaymentGlobalConfigs, getLoanProductsProductResponse.getUseDueRepaymentGlobalConfigs()); } @Test @@ -99,21 +102,25 @@ public void loanProductUpdateWithDueDaysConfigurationForRepaymentEventTest() { final Integer clientId = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId().intValue(); final GetLoanProductsProductIdResponse getLoanProductsProductResponse = createLoanProduct(loanTransactionHelper, delinquencyBucketId); + final Long loanProductId = getLoanProductsProductResponse.getId(); assertNotNull(getLoanProductsProductResponse); // Modify Loan Product - PutLoanProductsProductIdResponse loanProductModifyResponse = updateLoanProduct(loanTransactionHelper, - getLoanProductsProductResponse.getId()); + PutLoanProductsProductIdResponse loanProductModifyResponse = updateLoanProduct(loanTransactionHelper, loanProductId); assertNotNull(loanProductModifyResponse); + final GetLoanProductsProductIdResponse getloanProductsResponse = loanTransactionHelper.getLoanProduct(loanProductId.intValue()); + assertEquals(true, getloanProductsResponse.getUseDueRepaymentGlobalConfigs()); } private PutLoanProductsProductIdResponse updateLoanProduct(LoanTransactionHelper loanTransactionHelper, Long id) { // event days configuration + boolean useGlobalConfigs = true; Integer dueDaysForRepaymentEvent = 1; Integer overDueDaysForRepaymentEvent = 2; final PutLoanProductsProductIdRequest requestModifyLoan = new PutLoanProductsProductIdRequest() - .dueDaysForRepaymentEvent(dueDaysForRepaymentEvent).overDueDaysForRepaymentEvent(overDueDaysForRepaymentEvent).locale("en"); + .dueDaysForRepaymentEvent(dueDaysForRepaymentEvent).overDueDaysForRepaymentEvent(overDueDaysForRepaymentEvent) + .useDueRepaymentGlobalConfigs(useGlobalConfigs).locale("en"); return loanTransactionHelper.updateLoanProduct(id, requestModifyLoan); } @@ -125,9 +132,11 @@ private GetLoanProductsProductIdResponse createLoanProduct(final LoanTransaction } private Integer createLoanProductWithDueDaysForRepaymentEvent(final LoanTransactionHelper loanTransactionHelper, - final Integer delinquencyBucketId, Integer dueDaysForRepaymentEvent, Integer overDueDaysForRepaymentEvent) { - final HashMap loanProductMap = new LoanProductTestBuilder().withDueDaysForRepaymentEvent(dueDaysForRepaymentEvent) - .withOverDueDaysForRepaymentEvent(overDueDaysForRepaymentEvent).build(null, delinquencyBucketId); + final Integer delinquencyBucketId, Integer dueDaysForRepaymentEvent, Integer overDueDaysForRepaymentEvent, + boolean useGlobalConfigs) { + final HashMap loanProductMap = new LoanProductTestBuilder().withUseDueRepaymentGlobalConfigs(useGlobalConfigs) + .withDueDaysForRepaymentEvent(dueDaysForRepaymentEvent).withOverDueDaysForRepaymentEvent(overDueDaysForRepaymentEvent) + .build(null, delinquencyBucketId); final Integer loanProductId = loanTransactionHelper.getLoanProductId(Utils.convertToJson(loanProductMap)); return loanProductId; } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanProductTestBuilder.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanProductTestBuilder.java index 7fd2529f4f5..8b9f0be1469 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanProductTestBuilder.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanProductTestBuilder.java @@ -151,6 +151,7 @@ public class LoanProductTestBuilder { private String installmentAmountInMultiplesOf; private boolean canDefineInstallmentAmount; private Integer delinquencyBucketId; + private boolean useDueRepaymentGlobalConfigs = false; private Integer dueDaysForRepaymentEvent = null; private Integer overDueDaysForRepaymentEvent = null; private boolean enableDownPayment = false; @@ -302,6 +303,7 @@ public HashMap build(final String chargeId, final Integer delinq map.put("penaltyToIncomeAccountMappings", this.penaltyToIncomeAccountMappings); } + map.put("useDueRepaymentGlobalConfigs", this.useDueRepaymentGlobalConfigs); if (this.dueDaysForRepaymentEvent != null) { map.put("dueDaysForRepaymentEvent", this.dueDaysForRepaymentEvent); } @@ -727,6 +729,11 @@ public LoanProductTestBuilder withFeeAndPenaltyAssetAccount(final Account accoun return this; } + public LoanProductTestBuilder withUseDueRepaymentGlobalConfigs(final boolean useGlobalConfigs) { + this.useDueRepaymentGlobalConfigs = useGlobalConfigs; + return this; + } + public LoanProductTestBuilder withDueDaysForRepaymentEvent(final Integer dueDaysForRepaymentEvent) { this.dueDaysForRepaymentEvent = dueDaysForRepaymentEvent; return this;