FINERACT-2330: Buy-Down fees Accounting for non merchant product

This commit is contained in:
Jose Alberto Hernandez
2025-08-15 22:54:36 +02:00
committed by Arnold Gálovics
parent 125c8b4db2
commit 6bbc4bd3f3
32 changed files with 233 additions and 65 deletions
@@ -256,7 +256,7 @@ public class LoanProductToGLAccountMappingHelper extends ProductToGLAccountMappi
*/
public void handleChangesToLoanProductToGLAccountMappings(final Long loanProductId, final Map<String, Object> changes,
final JsonElement element, final AccountingRuleType accountingRuleType, final boolean enableIncomeCapitalization,
final boolean enableBuyDownFee) {
final boolean enableBuyDownFee, final boolean merchantBuyDownFee) {
switch (accountingRuleType) {
case NONE:
break;
@@ -399,9 +399,11 @@ public class LoanProductToGLAccountMappingHelper extends ProductToGLAccountMappi
deleteProductToGLAccountMapping(loanProductId, PortfolioProductType.LOAN,
AccrualAccountsForLoan.BUY_DOWN_EXPENSE.getValue());
} else {
mergeLoanToExpenseAccountMappingChanges(element, LoanProductAccountingParams.BUY_DOWN_EXPENSE.getValue(), loanProductId,
AccrualAccountsForLoan.BUY_DOWN_EXPENSE.getValue(), AccrualAccountsForLoan.BUY_DOWN_EXPENSE.toString(),
changes);
if (merchantBuyDownFee) {
mergeLoanToExpenseAccountMappingChanges(element, LoanProductAccountingParams.BUY_DOWN_EXPENSE.getValue(),
loanProductId, AccrualAccountsForLoan.BUY_DOWN_EXPENSE.getValue(),
AccrualAccountsForLoan.BUY_DOWN_EXPENSE.toString(), changes);
}
}
// liabilities
@@ -46,5 +46,6 @@ public class AccountingBridgeDataDTO {
private Long chargeOffReasonCodeValue;
private boolean isWrittenOff;
private List<AccountingBridgeLoanTransactionDTO> newLoanTransactions = new ArrayList<>();
private boolean merchantBuyDownFee;
}
@@ -288,6 +288,7 @@ public class LoanAccountData {
private StringEnumOptionData buyDownFeeCalculationType;
private StringEnumOptionData buyDownFeeStrategy;
private StringEnumOptionData buyDownFeeIncomeType;
private Boolean merchantBuyDownFee;
public static LoanAccountData importInstanceIndividual(EnumOptionData loanTypeEnumOption, Long clientId, Long productId,
Long loanOfficerId, LocalDate submittedOnDate, Long fundId, BigDecimal principal, Integer numberOfRepayments,
@@ -483,7 +484,8 @@ public class LoanAccountData {
final boolean enableIncomeCapitalization, final StringEnumOptionData capitalizedIncomeCalculationType,
final StringEnumOptionData capitalizedIncomeStrategy, StringEnumOptionData capitalizedIncomeType,
final boolean enableBuyDownFee, final StringEnumOptionData buyDownFeeCalculationType,
final StringEnumOptionData buyDownFeeStrategy, final StringEnumOptionData buyDownFeeIncomeType) {
final StringEnumOptionData buyDownFeeStrategy, final StringEnumOptionData buyDownFeeIncomeType,
final boolean merchantBuyDownFee) {
final CollectionData delinquent = CollectionData.template();
@@ -533,7 +535,8 @@ public class LoanAccountData {
.setCapitalizedIncomeCalculationType(capitalizedIncomeCalculationType)
.setCapitalizedIncomeStrategy(capitalizedIncomeStrategy).setCapitalizedIncomeType(capitalizedIncomeType)
.setEnableBuyDownFee(enableBuyDownFee).setBuyDownFeeCalculationType(buyDownFeeCalculationType)
.setBuyDownFeeStrategy(buyDownFeeStrategy).setBuyDownFeeIncomeType(buyDownFeeIncomeType);
.setBuyDownFeeStrategy(buyDownFeeStrategy).setBuyDownFeeIncomeType(buyDownFeeIncomeType)
.setMerchantBuyDownFee(merchantBuyDownFee);
}
/*
@@ -246,6 +246,7 @@ public final class LoanApplicationTerms {
private LoanBuyDownFeeCalculationType buyDownFeeCalculationType;
private LoanBuyDownFeeStrategy buyDownFeeStrategy;
private LoanBuyDownFeeIncomeType buyDownFeeIncomeType;
private boolean merchantBuyDownFee;
private LoanApplicationTerms(Builder builder) {
this.currency = builder.currency;
@@ -290,6 +291,7 @@ public final class LoanApplicationTerms {
this.buyDownFeeCalculationType = builder.buyDownFeeCalculationType;
this.buyDownFeeStrategy = builder.buyDownFeeStrategy;
this.buyDownFeeIncomeType = builder.buyDownFeeIncomeType;
this.merchantBuyDownFee = builder.merchantBuyDownFee;
this.interestMethod = builder.interestMethod;
this.allowPartialPeriodInterestCalcualtion = builder.allowPartialPeriodInterestCalculation;
}
@@ -330,6 +332,7 @@ public final class LoanApplicationTerms {
private LoanBuyDownFeeCalculationType buyDownFeeCalculationType;
private LoanBuyDownFeeStrategy buyDownFeeStrategy;
private LoanBuyDownFeeIncomeType buyDownFeeIncomeType;
private boolean merchantBuyDownFee;
private boolean allowPartialPeriodInterestCalculation;
public Builder interestMethod(InterestMethod interestMethod) {
@@ -492,6 +495,11 @@ public final class LoanApplicationTerms {
return this;
}
public Builder merchantBuyDownFee(boolean value) {
this.merchantBuyDownFee = value;
return this;
}
public LoanApplicationTerms build() {
return new LoanApplicationTerms(this);
}
@@ -570,7 +578,8 @@ public final class LoanApplicationTerms {
final LoanCapitalizedIncomeCalculationType capitalizedIncomeCalculationType,
final LoanCapitalizedIncomeStrategy capitalizedIncomeStrategy, final LoanCapitalizedIncomeType capitalizedIncomeType,
final boolean enableBuyDownFee, final LoanBuyDownFeeCalculationType buyDownFeeCalculationType,
final LoanBuyDownFeeStrategy buyDownFeeStrategy, final LoanBuyDownFeeIncomeType buyDownFeeIncomeType) {
final LoanBuyDownFeeStrategy buyDownFeeStrategy, final LoanBuyDownFeeIncomeType buyDownFeeIncomeType,
final boolean merchantBuyDownFee) {
final LoanRescheduleStrategyMethod rescheduleStrategyMethod = null;
final CalendarHistoryDataWrapper calendarHistoryDataWrapper = null;
@@ -592,7 +601,7 @@ public final class LoanApplicationTerms {
fixedLength, enableAccrualActivityPosting, supportedInterestRefundTypes, chargeOffBehaviour,
interestRecognitionOnDisbursementDate, daysInYearCustomStrategy, enableIncomeCapitalization,
capitalizedIncomeCalculationType, capitalizedIncomeStrategy, capitalizedIncomeType, enableBuyDownFee,
buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType);
buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType, merchantBuyDownFee);
}
@@ -670,7 +679,8 @@ public final class LoanApplicationTerms {
loanProductRelatedDetail.isEnableIncomeCapitalization(), loanProductRelatedDetail.getCapitalizedIncomeCalculationType(),
loanProductRelatedDetail.getCapitalizedIncomeStrategy(), loanProductRelatedDetail.getCapitalizedIncomeType(),
loanProductRelatedDetail.isEnableBuyDownFee(), loanProductRelatedDetail.getBuyDownFeeCalculationType(),
loanProductRelatedDetail.getBuyDownFeeStrategy(), loanProductRelatedDetail.getBuyDownFeeIncomeType());
loanProductRelatedDetail.getBuyDownFeeStrategy(), loanProductRelatedDetail.getBuyDownFeeIncomeType(),
loanProductRelatedDetail.isMerchantBuyDownFee());
}
private LoanApplicationTerms(final CurrencyData currency, final Integer loanTermFrequency,
@@ -705,7 +715,8 @@ public final class LoanApplicationTerms {
final boolean enableIncomeCapitalization, final LoanCapitalizedIncomeCalculationType capitalizedIncomeCalculationType,
final LoanCapitalizedIncomeStrategy capitalizedIncomeStrategy, final LoanCapitalizedIncomeType capitalizedIncomeType,
final boolean enableBuyDownFee, final LoanBuyDownFeeCalculationType buyDownFeeCalculationType,
final LoanBuyDownFeeStrategy buyDownFeeStrategy, final LoanBuyDownFeeIncomeType buyDownFeeIncomeType) {
final LoanBuyDownFeeStrategy buyDownFeeStrategy, final LoanBuyDownFeeIncomeType buyDownFeeIncomeType,
final boolean merchantBuyDownFee) {
this.currency = currency;
this.loanTermFrequency = loanTermFrequency;
@@ -815,6 +826,7 @@ public final class LoanApplicationTerms {
this.buyDownFeeCalculationType = buyDownFeeCalculationType;
this.buyDownFeeStrategy = buyDownFeeStrategy;
this.buyDownFeeIncomeType = buyDownFeeIncomeType;
this.merchantBuyDownFee = merchantBuyDownFee;
}
public Money adjustPrincipalIfLastRepaymentPeriod(final Money principalForPeriod, final Money totalCumulativePrincipalToDate,
@@ -1679,7 +1691,7 @@ public final class LoanApplicationTerms {
this.chargeOffBehaviour, this.interestRecognitionOnDisbursementDate, this.daysInYearCustomStrategy,
this.enableIncomeCapitalization, this.capitalizedIncomeCalculationType, this.capitalizedIncomeStrategy,
this.capitalizedIncomeType, this.installmentAmountInMultiplesOf, this.enableBuyDownFee, this.buyDownFeeCalculationType,
this.buyDownFeeStrategy, this.buyDownFeeIncomeType);
this.buyDownFeeStrategy, this.buyDownFeeIncomeType, this.merchantBuyDownFee);
}
public LoanProductMinimumRepaymentScheduleRelatedDetail toLoanProductRelatedDetailMinimumData() {
@@ -59,13 +59,13 @@ public class LoanAccountingBridgeMapper {
currencyCode, loan.getSummary().getTotalInterestCharged(), loan.isCashBasedAccountingEnabledOnLoanProduct(),
loan.isUpfrontAccrualAccountingEnabledOnLoanProduct(), loan.isPeriodicAccrualAccountingEnabledOnLoanProduct(),
isAccountTransfer, false, loan.isFraud(), loan.fetchChargeOffReasonId(), loan.isClosedWrittenOff(),
newLoanTransactionsBeforeChargeOff);
newLoanTransactionsBeforeChargeOff, loan.getLoanProductRelatedDetail().isMerchantBuyDownFee());
AccountingBridgeDataDTO afterChargeOff = new AccountingBridgeDataDTO(loan.getId(), loan.productId(), loan.getOfficeId(),
currencyCode, loan.getSummary().getTotalInterestCharged(), loan.isCashBasedAccountingEnabledOnLoanProduct(),
loan.isUpfrontAccrualAccountingEnabledOnLoanProduct(), loan.isPeriodicAccrualAccountingEnabledOnLoanProduct(),
isAccountTransfer, true, loan.isFraud(), loan.fetchChargeOffReasonId(), loan.isClosedWrittenOff(),
newLoanTransactionsAfterChargeOff);
newLoanTransactionsAfterChargeOff, loan.getLoanProductRelatedDetail().isMerchantBuyDownFee());
List<AccountingBridgeDataDTO> result = new ArrayList<>();
result.add(beforeChargeOff);
@@ -86,7 +86,7 @@ public class LoanAccountingBridgeMapper {
loan.getSummary().getTotalInterestCharged(), loan.isCashBasedAccountingEnabledOnLoanProduct(),
loan.isUpfrontAccrualAccountingEnabledOnLoanProduct(), loan.isPeriodicAccrualAccountingEnabledOnLoanProduct(),
isAccountTransfer, loan.isChargedOff(), loan.isFraud(), loan.fetchChargeOffReasonId(), loan.isClosedWrittenOff(),
newLoanTransactions);
newLoanTransactions, loan.getLoanProductRelatedDetail().isMerchantBuyDownFee());
}
public AccountingBridgeLoanTransactionDTO mapToLoanTransactionData(final LoanTransaction transaction, final String currencyCode) {
@@ -183,4 +183,5 @@ public interface LoanProductConstants {
String BUY_DOWN_FEE_CALCULATION_TYPE_PARAM_NAME = "buyDownFeeCalculationType";
String BUY_DOWN_FEE_STRATEGY_PARAM_NAME = "buyDownFeeStrategy";
String BUY_DOWN_FEE_INCOME_TYPE_PARAM_NAME = "buyDownFeeIncomeType";
String MERCHANT_BUY_DOWN_FEE_PARAM_NAME = "merchantBuyDownFee";
}
@@ -213,6 +213,8 @@ public final class LoanProductsApiResourceSwagger {
public String buyDownFeeStrategy;
@Schema(example = "FEE", allowableValues = { "FEE", "INTEREST" })
public String buyDownFeeIncomeType;
@Schema(example = "false")
public Boolean merchantBuyDownFee;
// Interest Recalculation
@Schema(example = "false")
@@ -693,6 +695,8 @@ public final class LoanProductsApiResourceSwagger {
public StringEnumOptionData buyDownFeeStrategy;
@Schema(example = "FEE")
public StringEnumOptionData buyDownFeeIncomeType;
@Schema(example = "false")
public Boolean merchantBuyDownFee;
}
@Schema(description = "GetLoanProductsTemplateResponse")
@@ -1157,6 +1161,8 @@ public final class LoanProductsApiResourceSwagger {
public StringEnumOptionData buyDownFeeCalculationType;
@Schema(example = "EQUAL_AMORTIZATION")
public StringEnumOptionData buyDownFeeStrategy;
@Schema(example = "false")
public Boolean merchantBuyDownFee;
@Schema(example = "FEE")
public StringEnumOptionData buyDownFeeIncomeType;
public List<StringEnumOptionData> buyDownFeeCalculationTypeOptions;
@@ -1505,6 +1511,8 @@ public final class LoanProductsApiResourceSwagger {
public StringEnumOptionData buyDownFeeStrategy;
@Schema(example = "FEE")
public StringEnumOptionData buyDownFeeIncomeType;
@Schema(example = "false")
public Boolean merchantBuyDownFee;
public List<StringEnumOptionData> buyDownFeeCalculationTypeOptions;
public List<StringEnumOptionData> buyDownFeeStrategyOptions;
public List<StringEnumOptionData> buyDownFeeIncomeTypeOptions;
@@ -1787,6 +1795,8 @@ public final class LoanProductsApiResourceSwagger {
public String buyDownFeeStrategy;
@Schema(example = "FEE", allowableValues = { "FEE", "INTEREST" })
public String buyDownFeeIncomeType;
@Schema(example = "false")
public Boolean merchantBuyDownFee;
}
public static final class AdvancedPaymentData {
@@ -256,6 +256,7 @@ public class LoanProductData implements Serializable {
private StringEnumOptionData buyDownFeeCalculationType;
private StringEnumOptionData buyDownFeeStrategy;
private StringEnumOptionData buyDownFeeIncomeType;
private boolean merchantBuyDownFee;
private List<StringEnumOptionData> buyDownFeeCalculationTypeOptions;
private List<StringEnumOptionData> buyDownFeeStrategyOptions;
private List<StringEnumOptionData> buyDownFeeIncomeTypeOptions;
@@ -371,6 +372,7 @@ public class LoanProductData implements Serializable {
final StringEnumOptionData buyDownFeeCalculationType = null;
final StringEnumOptionData buyDownFeeStrategy = null;
final StringEnumOptionData buyDownFeeIncomeType = null;
final boolean merchantBuyDownFee = false;
return new LoanProductData(id, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, tolerance,
numberOfRepayments, minNumberOfRepayments, maxNumberOfRepayments, repaymentEvery, interestRatePerPeriod,
@@ -394,7 +396,7 @@ public class LoanProductData implements Serializable {
loanScheduleProcessingType, fixedLength, enableAccrualActivityPosting, supportedInterestRefundTypes, chargeOffBehaviour,
interestRecognitionOnDisbursementDate, daysInYearTypeCustomStrategy, enableIncomeCapitalization,
capitalizedIncomeCalculationType, capitalizedIncomeStrategy, capitalizedIncomeType, enableBuyDownFee,
buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType);
buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType, merchantBuyDownFee);
}
@@ -507,6 +509,7 @@ public class LoanProductData implements Serializable {
final StringEnumOptionData buyDownFeeCalculationType = null;
final StringEnumOptionData buyDownFeeStrategy = null;
final StringEnumOptionData buyDownFeeIncomeType = null;
final boolean merchantBuyDownFee = false;
return new LoanProductData(id, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, tolerance,
numberOfRepayments, minNumberOfRepayments, maxNumberOfRepayments, repaymentEvery, interestRatePerPeriod,
@@ -530,7 +533,7 @@ public class LoanProductData implements Serializable {
loanScheduleProcessingType, fixedLength, enableAccrualActivityPosting, supportedInterestRefundTypes, chargeOffBehaviour,
interestRecognitionOnDisbursementDate, daysInYearTypeCustomStrategy, enableIncomeCapitalization,
capitalizedIncomeCalculationType, capitalizedIncomeStrategy, capitalizedIncomeType, enableBuyDownFee,
buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType);
buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType, merchantBuyDownFee);
}
@@ -650,6 +653,7 @@ public class LoanProductData implements Serializable {
final StringEnumOptionData buyDownFeeCalculationType = null;
final StringEnumOptionData buyDownFeeStrategy = null;
final StringEnumOptionData buyDownFeeIncomeType = null;
final boolean merchantBuyDownFee = false;
return new LoanProductData(id, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, tolerance,
numberOfRepayments, minNumberOfRepayments, maxNumberOfRepayments, repaymentEvery, interestRatePerPeriod,
@@ -673,7 +677,7 @@ public class LoanProductData implements Serializable {
loanScheduleProcessingType, fixedLength, enableAccrualActivityPosting, supportedInterestRefundTypes, chargeOffBehaviour,
interestRecognitionOnDisbursementDate, daysInYearTypeCustomStrategy, enableIncomeCapitalization,
capitalizedIncomeCalculationType, capitalizedIncomeStrategy, capitalizedIncomeType, enableBuyDownFee,
buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType);
buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType, merchantBuyDownFee);
}
@@ -787,6 +791,7 @@ public class LoanProductData implements Serializable {
final StringEnumOptionData buyDownFeeCalculationType = null;
final StringEnumOptionData buyDownFeeStrategy = null;
final StringEnumOptionData buyDownFeeIncomeType = null;
final boolean merchantBuyDownFee = false;
return new LoanProductData(id, name, shortName, description, currency, principal, minPrincipal, maxPrincipal, tolerance,
numberOfRepayments, minNumberOfRepayments, maxNumberOfRepayments, repaymentEvery, interestRatePerPeriod,
@@ -810,7 +815,7 @@ public class LoanProductData implements Serializable {
loanScheduleProcessingType, fixedLength, enableAccrualActivityPosting, supportedInterestRefundTypes, chargeOffBehaviour,
interestRecognitionOnDisbursementDate, daysInYearTypeCustomStrategy, enableIncomeCapitalization,
capitalizedIncomeCalculationType, capitalizedIncomeStrategy, capitalizedIncomeType, enableBuyDownFee,
buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType);
buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType, merchantBuyDownFee);
}
public static LoanProductData withAccountingDetails(final LoanProductData productData, final Map<String, Object> accountingMappings,
@@ -869,7 +874,7 @@ public class LoanProductData implements Serializable {
final StringEnumOptionData capitalizedIncomeCalculationType, final StringEnumOptionData capitalizedIncomeStrategy,
final StringEnumOptionData capitalizedIncomeType, final boolean enableBuyDownFee,
final StringEnumOptionData buyDownFeeCalculationType, final StringEnumOptionData buyDownFeeStrategy,
final StringEnumOptionData buyDownFeeIncomeType) {
final StringEnumOptionData buyDownFeeIncomeType, final boolean merchantBuyDownFee) {
this.id = id;
this.name = name;
this.shortName = shortName;
@@ -934,6 +939,7 @@ public class LoanProductData implements Serializable {
this.buyDownFeeCalculationType = buyDownFeeCalculationType;
this.buyDownFeeStrategy = buyDownFeeStrategy;
this.buyDownFeeIncomeType = buyDownFeeIncomeType;
this.merchantBuyDownFee = merchantBuyDownFee;
this.chargeOptions = null;
this.penaltyOptions = null;
@@ -1238,6 +1244,8 @@ public class LoanProductData implements Serializable {
this.buyDownFeeCalculationTypeOptions = buyDownFeeCalculationTypeOptions;
this.buyDownFeeStrategyOptions = buyDownFeeStrategyOptions;
this.buyDownFeeIncomeTypeOptions = buyDownFeeIncomeTypeOptions;
this.merchantBuyDownFee = productData.isMerchantBuyDownFee();
}
private Collection<ChargeData> nullIfEmpty(final Collection<ChargeData> charges) {
@@ -287,7 +287,8 @@ public class LoanProduct extends AbstractPersistableCustom<Long> {
final LoanCapitalizedIncomeCalculationType capitalizedIncomeCalculationType,
final LoanCapitalizedIncomeStrategy capitalizedIncomeStrategy, final LoanCapitalizedIncomeType capitalizedIncomeType,
final boolean enableBuyDownFee, final LoanBuyDownFeeCalculationType buyDownFeeCalculationType,
final LoanBuyDownFeeStrategy buyDownFeeStrategy, final LoanBuyDownFeeIncomeType buyDownFeeIncomeType) {
final LoanBuyDownFeeStrategy buyDownFeeStrategy, final LoanBuyDownFeeIncomeType buyDownFeeIncomeType,
final boolean merchantBuyDownFee) {
this.fund = fund;
this.transactionProcessingStrategyCode = transactionProcessingStrategyCode;
@@ -339,7 +340,8 @@ public class LoanProduct extends AbstractPersistableCustom<Long> {
enableAutoRepaymentForDownPayment, loanScheduleType, loanScheduleProcessingType, fixedLength, enableAccrualActivityPosting,
supportedInterestRefundTypes, chargeOffBehaviour, isInterestRecognitionOnDisbursementDate, daysInYearCustomStrategy,
enableIncomeCapitalization, capitalizedIncomeCalculationType, capitalizedIncomeStrategy, capitalizedIncomeType,
installmentAmountInMultiplesOf, enableBuyDownFee, buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType);
installmentAmountInMultiplesOf, enableBuyDownFee, buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType,
merchantBuyDownFee);
this.loanProductMinMaxConstraints = new LoanProductMinMaxConstraints(defaultMinPrincipal, defaultMaxPrincipal,
defaultMinNominalInterestRatePerPeriod, defaultMaxNominalInterestRatePerPeriod, defaultMinNumberOfInstallments,
@@ -204,6 +204,9 @@ public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentSche
@Column(name = "buy_down_fee_income_type")
private LoanBuyDownFeeIncomeType buyDownFeeIncomeType;
@Column(name = "is_merchant_buy_down_fee")
private boolean merchantBuyDownFee = true;
@Column(name = "installment_amount_in_multiples_of")
private Integer installmentAmountInMultiplesOf;
@@ -226,7 +229,7 @@ public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentSche
final LoanCapitalizedIncomeStrategy capitalizedIncomeStrategy, final LoanCapitalizedIncomeType capitalizedIncomeType,
final Integer installmentAmountInMultiplesOf, final boolean enableBuyDownFee,
final LoanBuyDownFeeCalculationType buyDownFeeCalculationType, final LoanBuyDownFeeStrategy buyDownFeeStrategy,
final LoanBuyDownFeeIncomeType buyDownFeeIncomeType) {
final LoanBuyDownFeeIncomeType buyDownFeeIncomeType, final boolean merchantBuyDownFee) {
final MonetaryCurrency currency = MonetaryCurrency.fromCurrencyData(currencyData);
return new LoanProductRelatedDetail(currency, principal, nominalInterestRatePerPeriod, interestRatePeriodFrequencyType,
@@ -238,7 +241,7 @@ public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentSche
loanScheduleType, loanScheduleProcessingType, fixedLength, enableAccrualActivityPosting, supportedInterestRefundTypes,
chargeOffBehaviour, interestRecognitionOnDisbursementDate, daysInYearCustomStrategy, enableIncomeCapitalization,
capitalizedIncomeCalculationType, capitalizedIncomeStrategy, capitalizedIncomeType, installmentAmountInMultiplesOf,
enableBuyDownFee, buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType);
enableBuyDownFee, buyDownFeeCalculationType, buyDownFeeStrategy, buyDownFeeIncomeType, merchantBuyDownFee);
}
protected LoanProductRelatedDetail() {
@@ -264,7 +267,7 @@ public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentSche
final LoanCapitalizedIncomeStrategy capitalizedIncomeStrategy, final LoanCapitalizedIncomeType capitalizedIncomeType,
final Integer installmentAmountInMultiplesOf, final boolean enableBuyDownFee,
final LoanBuyDownFeeCalculationType buyDownFeeCalculationType, final LoanBuyDownFeeStrategy buyDownFeeStrategy,
final LoanBuyDownFeeIncomeType buyDownFeeIncomeType) {
final LoanBuyDownFeeIncomeType buyDownFeeIncomeType, final boolean merchantBuyDownFee) {
this.currency = currency;
this.principal = defaultPrincipal;
this.nominalInterestRatePerPeriod = defaultNominalInterestRatePerPeriod;
@@ -311,6 +314,7 @@ public class LoanProductRelatedDetail implements LoanProductMinimumRepaymentSche
this.buyDownFeeCalculationType = buyDownFeeCalculationType;
this.buyDownFeeStrategy = buyDownFeeStrategy;
this.buyDownFeeIncomeType = buyDownFeeIncomeType;
this.merchantBuyDownFee = merchantBuyDownFee;
}
private Integer defaultToNullIfZero(final Integer value) {
@@ -53,4 +53,5 @@
<include relativeToChangelogFile="true" file="parts/1028_remove_suboptimal_indexes.xml"/>
<include relativeToChangelogFile="true" file="parts/1029_add_installment_amount_in_multiples_of_to_loan.xml"/>
<include relativeToChangelogFile="true" file="parts/1030_add_loan_undo_contract_termination_event.xml"/>
<include relativeToChangelogFile="true" file="parts/1031_loan_merchant_buy_down_fee.xml"/>
</databaseChangeLog>
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd">
<changeSet author="fineract" id="1">
<addColumn tableName="m_loan">
<column name="is_merchant_buy_down_fee" type="boolean" defaultValueBoolean="true">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="m_product_loan">
<column name="is_merchant_buy_down_fee" type="boolean" defaultValueBoolean="true">
<constraints nullable="false"/>
</column>
</addColumn>
</changeSet>
</databaseChangeLog>