This is an automated email from the ASF dual-hosted git repository.
bagrijp pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git
The following commit(s) were added to refs/heads/develop by this push:
new b01ccc461 FINERACT-2042 Configurable Allocation Rules for Chargeback
Transaction. PR 1 of 3 - Persistence Layer
b01ccc461 is described below
commit b01ccc461986fa9cc78152f4eb6c8bea3c2db304
Author: Peter Bagrij <[email protected]>
AuthorDate: Thu Jan 25 12:18:00 2024 +0100
FINERACT-2042 Configurable Allocation Rules for Chargeback Transaction. PR
1 of 3 - Persistence Layer
---
.../portfolio/loanaccount/domain/Loan.java | 11 ++
...tionRule.java => LoanCreditAllocationRule.java} | 18 ++-
.../domain/LoanPaymentAllocationRule.java | 4 +-
.../domain/AllocationTypeListConverter.java | 6 +-
...r.java => CreditAllocationTransactionType.java} | 27 +++--
.../portfolio/loanproduct/domain/LoanProduct.java | 47 +++----
...e.java => LoanProductCreditAllocationRule.java} | 13 +-
.../domain/LoanProductPaymentAllocationRule.java | 2 +-
...ava => PaymentAllocationTypeListConverter.java} | 4 +-
.../tenant/module/loan/module-changelog-master.xml | 1 +
.../loan/parts/1016_add_credit_allocation_rule.xml | 135 +++++++++++++++++++++
...oductWritePlatformServiceJpaRepositoryImpl.java | 8 +-
.../src/main/resources/jpa/persistence.xml | 4 +
13 files changed, 218 insertions(+), 62 deletions(-)
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
index 0235c8b6b..3e1ab126f 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java
@@ -243,6 +243,9 @@ public class Loan extends
AbstractAuditableWithUTCDateTimeCustom {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval =
true, fetch = FetchType.LAZY)
private List<LoanPaymentAllocationRule> paymentAllocationRules = new
ArrayList<>();
+ @OneToMany(cascade = CascadeType.ALL, mappedBy = "loan", orphanRemoval =
true, fetch = FetchType.LAZY)
+ private List<LoanCreditAllocationRule> creditAllocationRules = new
ArrayList<>();
+
@Embedded
private LoanProductRelatedDetail loanRepaymentScheduleDetail;
@@ -7183,6 +7186,14 @@ public class Loan extends
AbstractAuditableWithUTCDateTimeCustom {
this.paymentAllocationRules = loanPaymentAllocationRules;
}
+ public List<LoanCreditAllocationRule> getCreditAllocationRules() {
+ return creditAllocationRules;
+ }
+
+ public void setCreditAllocationRules(List<LoanCreditAllocationRule>
loanCreditAllocationRules) {
+ this.creditAllocationRules = loanCreditAllocationRules;
+ }
+
public String getTransactionProcessingStrategyCode() {
return transactionProcessingStrategyCode;
}
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanPaymentAllocationRule.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCreditAllocationRule.java
similarity index 72%
copy from
fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanPaymentAllocationRule.java
copy to
fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCreditAllocationRule.java
index ce1bc7486..490dacadf 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanPaymentAllocationRule.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCreditAllocationRule.java
@@ -34,19 +34,18 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import
org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom;
+import org.apache.fineract.portfolio.loanproduct.domain.AllocationType;
import
org.apache.fineract.portfolio.loanproduct.domain.AllocationTypeListConverter;
-import
org.apache.fineract.portfolio.loanproduct.domain.FutureInstallmentAllocationRule;
-import
org.apache.fineract.portfolio.loanproduct.domain.PaymentAllocationTransactionType;
-import org.apache.fineract.portfolio.loanproduct.domain.PaymentAllocationType;
+import
org.apache.fineract.portfolio.loanproduct.domain.CreditAllocationTransactionType;
@Getter
@Setter
@Entity
-@Table(name = "m_loan_payment_allocation_rule", uniqueConstraints = {
- @UniqueConstraint(columnNames = { "loan_id", "transaction_type" },
name = "uq_m_loan_payment_allocation_rule") })
+@Table(name = "m_loan_credit_allocation_rule", uniqueConstraints = {
+ @UniqueConstraint(columnNames = { "loan_id", "transaction_type" },
name = "uq_m_loan_credit_allocation_rule") })
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
-public class LoanPaymentAllocationRule extends
AbstractAuditableWithUTCDateTimeCustom {
+public class LoanCreditAllocationRule extends
AbstractAuditableWithUTCDateTimeCustom {
@ManyToOne
@JoinColumn(name = "loan_id", nullable = false)
@@ -54,13 +53,10 @@ public class LoanPaymentAllocationRule extends
AbstractAuditableWithUTCDateTimeC
@Column(name = "transaction_type", nullable = false)
@Enumerated(EnumType.STRING)
- private PaymentAllocationTransactionType transactionType;
+ private CreditAllocationTransactionType transactionType;
@Convert(converter = AllocationTypeListConverter.class)
@Column(name = "allocation_types", nullable = false)
- private List<PaymentAllocationType> allocationTypes;
+ private List<AllocationType> allocationTypes;
- @Column(name = "future_installment_allocation_rule", nullable = false)
- @Enumerated(EnumType.STRING)
- private FutureInstallmentAllocationRule futureInstallmentAllocationRule;
}
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanPaymentAllocationRule.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanPaymentAllocationRule.java
index ce1bc7486..8304b5019 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanPaymentAllocationRule.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanPaymentAllocationRule.java
@@ -34,10 +34,10 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import
org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom;
-import
org.apache.fineract.portfolio.loanproduct.domain.AllocationTypeListConverter;
import
org.apache.fineract.portfolio.loanproduct.domain.FutureInstallmentAllocationRule;
import
org.apache.fineract.portfolio.loanproduct.domain.PaymentAllocationTransactionType;
import org.apache.fineract.portfolio.loanproduct.domain.PaymentAllocationType;
+import
org.apache.fineract.portfolio.loanproduct.domain.PaymentAllocationTypeListConverter;
@Getter
@Setter
@@ -56,7 +56,7 @@ public class LoanPaymentAllocationRule extends
AbstractAuditableWithUTCDateTimeC
@Enumerated(EnumType.STRING)
private PaymentAllocationTransactionType transactionType;
- @Convert(converter = AllocationTypeListConverter.class)
+ @Convert(converter = PaymentAllocationTypeListConverter.class)
@Column(name = "allocation_types", nullable = false)
private List<PaymentAllocationType> allocationTypes;
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AllocationTypeListConverter.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AllocationTypeListConverter.java
index a6643017c..7659ea36d 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AllocationTypeListConverter.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AllocationTypeListConverter.java
@@ -24,8 +24,8 @@ import java.util.List;
import org.apache.fineract.infrastructure.core.data.GenericEnumListConverter;
@Converter(autoApply = true)
-public class AllocationTypeListConverter extends
GenericEnumListConverter<PaymentAllocationType>
- implements AttributeConverter<List<PaymentAllocationType>, String> {
+public class AllocationTypeListConverter extends
GenericEnumListConverter<AllocationType>
+ implements AttributeConverter<List<AllocationType>, String> {
@Override
public boolean isUnique() {
@@ -33,7 +33,7 @@ public class AllocationTypeListConverter extends
GenericEnumListConverter<Paymen
}
public AllocationTypeListConverter() {
- super(PaymentAllocationType.class);
+ super(AllocationType.class);
}
}
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AllocationTypeListConverter.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/CreditAllocationTransactionType.java
similarity index 56%
copy from
fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AllocationTypeListConverter.java
copy to
fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/CreditAllocationTransactionType.java
index a6643017c..ce0aa2df5 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AllocationTypeListConverter.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/CreditAllocationTransactionType.java
@@ -18,22 +18,23 @@
*/
package org.apache.fineract.portfolio.loanproduct.domain;
-import jakarta.persistence.AttributeConverter;
-import jakarta.persistence.Converter;
+import java.util.Arrays;
import java.util.List;
-import org.apache.fineract.infrastructure.core.data.GenericEnumListConverter;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType;
-@Converter(autoApply = true)
-public class AllocationTypeListConverter extends
GenericEnumListConverter<PaymentAllocationType>
- implements AttributeConverter<List<PaymentAllocationType>, String> {
+@Getter
+@RequiredArgsConstructor
+public enum CreditAllocationTransactionType {
- @Override
- public boolean isUnique() {
- return true;
- }
+ CHARGEBACK(LoanTransactionType.CHARGEBACK, "Chargeback");
- public AllocationTypeListConverter() {
- super(PaymentAllocationType.class);
- }
+ private final LoanTransactionType loanTransactionType;
+ private final String humanReadableName;
+ public static List<EnumOptionData> getValuesAsEnumOptionDataList() {
+ return Arrays.stream(values()).map(v -> new EnumOptionData((long)
(v.ordinal() + 1), v.name(), v.getHumanReadableName())).toList();
+ }
}
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
index ad7864172..8bf064ae5 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java
@@ -95,6 +95,9 @@ public class LoanProduct extends AbstractPersistableCustom {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "loanProduct",
orphanRemoval = true, fetch = FetchType.EAGER)
private List<LoanProductPaymentAllocationRule> paymentAllocationRules =
new ArrayList<>();
+ @OneToMany(cascade = CascadeType.ALL, mappedBy = "loanProduct",
orphanRemoval = true, fetch = FetchType.EAGER)
+ private List<LoanProductCreditAllocationRule> creditAllocationRules = new
ArrayList<>();
+
@Column(name = "name", nullable = false, unique = true)
private String name;
@@ -223,7 +226,8 @@ public class LoanProduct extends AbstractPersistableCustom {
public static LoanProduct assembleFromJson(final Fund fund, final String
loanTransactionProcessingStrategy,
final List<Charge> productCharges, final JsonCommand command,
final AprCalculator aprCalculator, FloatingRate floatingRate,
- final List<Rate> productRates,
List<LoanProductPaymentAllocationRule> loanProductPaymentAllocationRules) {
+ final List<Rate> productRates,
List<LoanProductPaymentAllocationRule> loanProductPaymentAllocationRules,
+ List<LoanProductCreditAllocationRule>
loanProductCreditAllocationRules) {
final String name = command.stringValueOfParameterNamed("name");
final String shortName =
command.stringValueOfParameterNamed(LoanProductConstants.SHORT_NAME);
@@ -425,25 +429,25 @@ public class LoanProduct extends
AbstractPersistableCustom {
final boolean enableInstallmentLevelDelinquency = command
.booleanPrimitiveValueOfParameterNamed(LoanProductConstants.ENABLE_INSTALLMENT_LEVEL_DELINQUENCY);
- return new LoanProduct(fund, loanTransactionProcessingStrategy,
loanProductPaymentAllocationRules, name, shortName, description,
- currency, principal, minPrincipal, maxPrincipal,
interestRatePerPeriod, minInterestRatePerPeriod, maxInterestRatePerPeriod,
- interestFrequencyType, annualInterestRate, interestMethod,
interestCalculationPeriodMethod,
- allowPartialPeriodInterestCalcualtion, repaymentEvery,
repaymentFrequencyType, numberOfRepayments, minNumberOfRepayments,
- maxNumberOfRepayments, graceOnPrincipalPayment,
recurringMoratoriumOnPrincipalPeriods, graceOnInterestPayment,
- graceOnInterestCharged, amortizationMethod,
inArrearsTolerance, productCharges, accountingRuleType, includeInBorrowerCycle,
- startDate, closeDate, externalId, useBorrowerCycle,
loanProductBorrowerCycleVariations, multiDisburseLoan, maxTrancheCount,
- outstandingLoanBalance, graceOnArrearsAgeing,
overdueDaysForNPA, daysInMonthType, daysInYearType,
- isInterestRecalculationEnabled, interestRecalculationSettings,
minimumDaysBetweenDisbursalAndFirstRepayment,
- holdGuarantorFunds, loanProductGuaranteeDetails,
principalThresholdForLastInstallment,
- accountMovesOutOfNPAOnlyOnArrearsCompletion,
canDefineEmiAmount, installmentAmountInMultiplesOf, loanConfigurableAttributes,
- isLinkedToFloatingInterestRates, floatingRate,
interestRateDifferential, minDifferentialLendingRate,
- maxDifferentialLendingRate, defaultDifferentialLendingRate,
isFloatingInterestRateCalculationAllowed,
- isVariableInstallmentsAllowed, minimumGapBetweenInstallments,
maximumGapBetweenInstallments,
- syncExpectedWithDisbursementDate, canUseForTopup,
isEqualAmortization, productRates, fixedPrincipalPercentagePerInstallment,
- disallowExpectedDisbursements,
allowApprovedDisbursedAmountsOverApplied, overAppliedCalculationType,
overAppliedNumber,
- dueDaysForRepaymentEvent, overDueDaysForRepaymentEvent,
enableDownPayment, disbursedAmountPercentageDownPayment,
- enableAutoRepaymentForDownPayment, repaymentStartDateType,
enableInstallmentLevelDelinquency, loanScheduleType,
- loanScheduleProcessingType);
+ return new LoanProduct(fund, loanTransactionProcessingStrategy,
loanProductPaymentAllocationRules, loanProductCreditAllocationRules,
+ name, shortName, description, currency, principal,
minPrincipal, maxPrincipal, interestRatePerPeriod,
+ minInterestRatePerPeriod, maxInterestRatePerPeriod,
interestFrequencyType, annualInterestRate, interestMethod,
+ interestCalculationPeriodMethod,
allowPartialPeriodInterestCalcualtion, repaymentEvery, repaymentFrequencyType,
+ numberOfRepayments, minNumberOfRepayments,
maxNumberOfRepayments, graceOnPrincipalPayment,
+ recurringMoratoriumOnPrincipalPeriods, graceOnInterestPayment,
graceOnInterestCharged, amortizationMethod,
+ inArrearsTolerance, productCharges, accountingRuleType,
includeInBorrowerCycle, startDate, closeDate, externalId,
+ useBorrowerCycle, loanProductBorrowerCycleVariations,
multiDisburseLoan, maxTrancheCount, outstandingLoanBalance,
+ graceOnArrearsAgeing, overdueDaysForNPA, daysInMonthType,
daysInYearType, isInterestRecalculationEnabled,
+ interestRecalculationSettings,
minimumDaysBetweenDisbursalAndFirstRepayment, holdGuarantorFunds,
+ loanProductGuaranteeDetails,
principalThresholdForLastInstallment,
accountMovesOutOfNPAOnlyOnArrearsCompletion,
+ canDefineEmiAmount, installmentAmountInMultiplesOf,
loanConfigurableAttributes, isLinkedToFloatingInterestRates,
+ floatingRate, interestRateDifferential,
minDifferentialLendingRate, maxDifferentialLendingRate,
+ defaultDifferentialLendingRate,
isFloatingInterestRateCalculationAllowed, isVariableInstallmentsAllowed,
+ minimumGapBetweenInstallments, maximumGapBetweenInstallments,
syncExpectedWithDisbursementDate, canUseForTopup,
+ isEqualAmortization, productRates,
fixedPrincipalPercentagePerInstallment, disallowExpectedDisbursements,
+ allowApprovedDisbursedAmountsOverApplied,
overAppliedCalculationType, overAppliedNumber, dueDaysForRepaymentEvent,
+ overDueDaysForRepaymentEvent, enableDownPayment,
disbursedAmountPercentageDownPayment, enableAutoRepaymentForDownPayment,
+ repaymentStartDateType, enableInstallmentLevelDelinquency,
loanScheduleType, loanScheduleProcessingType);
}
@@ -626,7 +630,8 @@ public class LoanProduct extends AbstractPersistableCustom {
}
public LoanProduct(final Fund fund, final String
transactionProcessingStrategyCode,
- final List<LoanProductPaymentAllocationRule>
paymentAllocationRules, final String name, final String shortName,
+ final List<LoanProductPaymentAllocationRule>
paymentAllocationRules,
+ final List<LoanProductCreditAllocationRule> creditAllocationRules,
final String name, final String shortName,
final String description, final MonetaryCurrency currency, final
BigDecimal defaultPrincipal,
final BigDecimal defaultMinPrincipal, final BigDecimal
defaultMaxPrincipal,
final BigDecimal defaultNominalInterestRatePerPeriod, final
BigDecimal defaultMinNominalInterestRatePerPeriod,
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductPaymentAllocationRule.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductCreditAllocationRule.java
similarity index 77%
copy from
fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductPaymentAllocationRule.java
copy to
fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductCreditAllocationRule.java
index a1953c060..76001ba95 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductPaymentAllocationRule.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductCreditAllocationRule.java
@@ -38,11 +38,11 @@ import
org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDa
@Getter
@Setter
@Entity
-@Table(name = "m_loan_product_payment_allocation_rule", uniqueConstraints = {
- @UniqueConstraint(columnNames = { "loan_product_id",
"transaction_type" }, name = "uq_m_loan_product_payment_allocation_rule") })
+@Table(name = "m_loan_product_credit_allocation_rule", uniqueConstraints = {
+ @UniqueConstraint(columnNames = { "loan_product_id",
"transaction_type" }, name = "uq_m_loan_product_credit_allocation_rule") })
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
-public class LoanProductPaymentAllocationRule extends
AbstractAuditableWithUTCDateTimeCustom {
+public class LoanProductCreditAllocationRule extends
AbstractAuditableWithUTCDateTimeCustom {
@ManyToOne
@JoinColumn(name = "loan_product_id", nullable = false)
@@ -50,13 +50,10 @@ public class LoanProductPaymentAllocationRule extends
AbstractAuditableWithUTCDa
@Column(name = "transaction_type", nullable = false)
@Enumerated(EnumType.STRING)
- private PaymentAllocationTransactionType transactionType;
+ private CreditAllocationTransactionType transactionType;
@Convert(converter = AllocationTypeListConverter.class)
@Column(name = "allocation_types", nullable = false)
- private List<PaymentAllocationType> allocationTypes;
+ private List<AllocationType> allocationTypes;
- @Enumerated(EnumType.STRING)
- @Column(name = "future_installment_allocation_rule", nullable = false)
- private FutureInstallmentAllocationRule futureInstallmentAllocationRule;
}
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductPaymentAllocationRule.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductPaymentAllocationRule.java
index a1953c060..fbf4055b9 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductPaymentAllocationRule.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductPaymentAllocationRule.java
@@ -52,7 +52,7 @@ public class LoanProductPaymentAllocationRule extends
AbstractAuditableWithUTCDa
@Enumerated(EnumType.STRING)
private PaymentAllocationTransactionType transactionType;
- @Convert(converter = AllocationTypeListConverter.class)
+ @Convert(converter = PaymentAllocationTypeListConverter.class)
@Column(name = "allocation_types", nullable = false)
private List<PaymentAllocationType> allocationTypes;
diff --git
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AllocationTypeListConverter.java
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/PaymentAllocationTypeListConverter.java
similarity index 89%
copy from
fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AllocationTypeListConverter.java
copy to
fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/PaymentAllocationTypeListConverter.java
index a6643017c..82e9dc42a 100644
---
a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AllocationTypeListConverter.java
+++
b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/PaymentAllocationTypeListConverter.java
@@ -24,7 +24,7 @@ import java.util.List;
import org.apache.fineract.infrastructure.core.data.GenericEnumListConverter;
@Converter(autoApply = true)
-public class AllocationTypeListConverter extends
GenericEnumListConverter<PaymentAllocationType>
+public class PaymentAllocationTypeListConverter extends
GenericEnumListConverter<PaymentAllocationType>
implements AttributeConverter<List<PaymentAllocationType>, String> {
@Override
@@ -32,7 +32,7 @@ public class AllocationTypeListConverter extends
GenericEnumListConverter<Paymen
return true;
}
- public AllocationTypeListConverter() {
+ public PaymentAllocationTypeListConverter() {
super(PaymentAllocationType.class);
}
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 22bc477ab..16760fc8b 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
@@ -38,4 +38,5 @@
<include relativeToChangelogFile="true"
file="parts/1013_add_loan_account_delinquency_pause_changed_event.xml"/>
<include relativeToChangelogFile="true"
file="parts/1014_add_loan_account_custom_snapshot_event.xml"/>
<include relativeToChangelogFile="true"
file="parts/1015_remove_disable_schedule_extension_column.xml"/>
+ <include relativeToChangelogFile="true"
file="parts/1016_add_credit_allocation_rule.xml"/>
</databaseChangeLog>
diff --git
a/fineract-loan/src/main/resources/db/changelog/tenant/module/loan/parts/1016_add_credit_allocation_rule.xml
b/fineract-loan/src/main/resources/db/changelog/tenant/module/loan/parts/1016_add_credit_allocation_rule.xml
new file mode 100644
index 000000000..bbcb64553
--- /dev/null
+++
b/fineract-loan/src/main/resources/db/changelog/tenant/module/loan/parts/1016_add_credit_allocation_rule.xml
@@ -0,0 +1,135 @@
+<?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="1016-1">
+ <createTable tableName="m_loan_product_credit_allocation_rule">
+ <column autoIncrement="true" name="id" type="BIGINT">
+ <constraints nullable="false" primaryKey="true"/>
+ </column>
+ <column name="loan_product_id" type="BIGINT">
+ <constraints nullable="false"
foreignKeyName="m_loan_product_credit_allocation_rule_fk"
referencedTableName="m_product_loan" referencedColumnNames="id"/>
+ </column>
+ <column name="transaction_type" type="VARCHAR(255)">
+ <constraints nullable="false"/>
+ </column>
+ <column name="allocation_types" type="TEXT">
+ <constraints nullable="false"/>
+ </column>
+ <column name="created_by" type="BIGINT">
+ <constraints nullable="false"/>
+ </column>
+ <column name="last_modified_by" type="BIGINT">
+ <constraints nullable="false"/>
+ </column>
+ </createTable>
+ <createTable tableName="m_loan_credit_allocation_rule">
+ <column autoIncrement="true" name="id" type="BIGINT">
+ <constraints nullable="false" primaryKey="true"/>
+ </column>
+ <column name="loan_id" type="BIGINT">
+ <constraints nullable="false"
foreignKeyName="m_loan_credit_allocation_rule_fk" referencedTableName="m_loan"
referencedColumnNames="id"/>
+ </column>
+ <column name="transaction_type" type="VARCHAR(255)">
+ <constraints nullable="false"/>
+ </column>
+ <column name="allocation_types" type="TEXT">
+ <constraints nullable="false"/>
+ </column>
+ <column name="created_by" type="BIGINT">
+ <constraints nullable="false"/>
+ </column>
+ <column name="last_modified_by" type="BIGINT">
+ <constraints nullable="false"/>
+ </column>
+ </createTable>
+ </changeSet>
+ <changeSet author="fineract" id="1016-2" context="mysql">
+ <addColumn tableName="m_loan_product_credit_allocation_rule">
+ <column name="created_on_utc" type="DATETIME(6)">
+ <constraints nullable="false"/>
+ </column>
+ <column name="last_modified_on_utc" type="DATETIME(6)">
+ <constraints nullable="false"/>
+ </column>
+ </addColumn>
+ <addColumn tableName="m_loan_credit_allocation_rule">
+ <column name="created_on_utc" type="DATETIME(6)">
+ <constraints nullable="false"/>
+ </column>
+ <column name="last_modified_on_utc" type="DATETIME(6)">
+ <constraints nullable="false"/>
+ </column>
+ </addColumn>
+ </changeSet>
+ <changeSet author="fineract" id="1016-2" context="postgresql">
+ <addColumn tableName="m_loan_product_credit_allocation_rule">
+ <column name="created_on_utc" type="TIMESTAMP WITH TIME ZONE">
+ <constraints nullable="false"/>
+ </column>
+ <column name="last_modified_on_utc" type="TIMESTAMP WITH TIME
ZONE">
+ <constraints nullable="false"/>
+ </column>
+ </addColumn>
+ <addColumn tableName="m_loan_credit_allocation_rule">
+ <column name="created_on_utc" type="TIMESTAMP WITH TIME ZONE">
+ <constraints nullable="false"/>
+ </column>
+ <column name="last_modified_on_utc" type="TIMESTAMP WITH TIME
ZONE">
+ <constraints nullable="false"/>
+ </column>
+ </addColumn>
+ </changeSet>
+ <changeSet author="fineract" id="1016-3">
+ <addUniqueConstraint tableName="m_loan_product_credit_allocation_rule"
columnNames="loan_product_id,transaction_type"
constraintName="uq_m_loan_product_credit_allocation_rule"/>
+ <addUniqueConstraint tableName="m_loan_credit_allocation_rule"
columnNames="loan_id,transaction_type"
constraintName="uq_m_loan_credit_allocation_rule"/>
+ </changeSet>
+ <changeSet author="fineract" id="1016-4">
+ <addForeignKeyConstraint baseColumnNames="created_by"
baseTableName="m_loan_product_credit_allocation_rule"
+
constraintName="FK_loan_product_credit_allocation_rule_created_by"
deferrable="false" initiallyDeferred="false"
+ onDelete="RESTRICT" onUpdate="RESTRICT"
referencedColumnNames="id"
+ referencedTableName="m_appuser"
validate="true"/>
+ <addForeignKeyConstraint baseColumnNames="last_modified_by"
baseTableName="m_loan_product_credit_allocation_rule"
+
constraintName="FK_loan_product_credit_allocation_rule_last_modified_by"
deferrable="false"
+ initiallyDeferred="false"
+ onDelete="RESTRICT" onUpdate="RESTRICT"
referencedColumnNames="id"
+ referencedTableName="m_appuser"
validate="true"/>
+ <addForeignKeyConstraint baseColumnNames="created_by"
baseTableName="m_loan_credit_allocation_rule"
+
constraintName="FK_loan_credit_allocation_rule_created_by" deferrable="false"
initiallyDeferred="false"
+ onDelete="RESTRICT" onUpdate="RESTRICT"
referencedColumnNames="id"
+ referencedTableName="m_appuser"
validate="true"/>
+ <addForeignKeyConstraint baseColumnNames="last_modified_by"
baseTableName="m_loan_credit_allocation_rule"
+
constraintName="FK_loan_credit_allocation_rule_last_modified_by"
deferrable="false"
+ initiallyDeferred="false"
+ onDelete="RESTRICT" onUpdate="RESTRICT"
referencedColumnNames="id"
+ referencedTableName="m_appuser"
validate="true"/>
+ </changeSet>
+ <changeSet id="fineract" author="1016-5">
+ <createIndex tableName="m_loan_product_credit_allocation_rule"
indexName="IND_loan_product_credit_allocation_rule_loan_product_id">
+ <column name="loan_product_id"/>
+ </createIndex>
+ <createIndex tableName="m_loan_credit_allocation_rule"
indexName="IND_loan_credit_allocation_rule_loan_id">
+ <column name="loan_id"/>
+ </createIndex>
+ </changeSet>
+</databaseChangeLog>
diff --git
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
index a47fe5e0c..6f94cbda3 100644
---
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
+++
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductWritePlatformServiceJpaRepositoryImpl.java
@@ -55,6 +55,7 @@ import
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.AprCalculat
import org.apache.fineract.portfolio.loanproduct.LoanProductConstants;
import
org.apache.fineract.portfolio.loanproduct.domain.AdvancedPaymentAllocationsJsonParser;
import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct;
+import
org.apache.fineract.portfolio.loanproduct.domain.LoanProductCreditAllocationRule;
import
org.apache.fineract.portfolio.loanproduct.domain.LoanProductPaymentAllocationRule;
import org.apache.fineract.portfolio.loanproduct.domain.LoanProductRepository;
import
org.apache.fineract.portfolio.loanproduct.exception.InvalidCurrencyException;
@@ -109,13 +110,18 @@ public class
LoanProductWritePlatformServiceJpaRepositoryImpl implements LoanPro
final List<Rate> rates = assembleListOfProductRates(command);
final List<LoanProductPaymentAllocationRule>
loanProductPaymentAllocationRules = advancedPaymentJsonParser
.assembleLoanProductPaymentAllocationRules(command,
loanTransactionProcessingStrategyCode);
+ List<LoanProductCreditAllocationRule>
loanProductCreditAllocationRules = new ArrayList<>(); // TODO: this
+
// shall be
+
// parsed from
+
// the json
+
// command
FloatingRate floatingRate = null;
if (command.parameterExists("floatingRatesId")) {
floatingRate = this.floatingRateRepository
.findOneWithNotFoundDetection(command.longValueOfParameterNamed("floatingRatesId"));
}
final LoanProduct loanProduct = LoanProduct.assembleFromJson(fund,
loanTransactionProcessingStrategyCode, charges, command,
- this.aprCalculator, floatingRate, rates,
loanProductPaymentAllocationRules);
+ this.aprCalculator, floatingRate, rates,
loanProductPaymentAllocationRules, loanProductCreditAllocationRules);
loanProduct.updateLoanProductInRelatedClasses();
loanProduct.setTransactionProcessingStrategyName(
loanRepaymentScheduleTransactionProcessorFactory.determineProcessor(loanTransactionProcessingStrategyCode).getName());
diff --git a/fineract-provider/src/main/resources/jpa/persistence.xml
b/fineract-provider/src/main/resources/jpa/persistence.xml
index b1fba72c9..a402cf603 100644
--- a/fineract-provider/src/main/resources/jpa/persistence.xml
+++ b/fineract-provider/src/main/resources/jpa/persistence.xml
@@ -114,6 +114,10 @@
<class>org.apache.fineract.portfolio.loanproduct.domain.AllocationTypeListConverter</class>
<class>org.apache.fineract.portfolio.loanproduct.domain.LoanProductPaymentAllocationRule</class>
<class>org.apache.fineract.portfolio.loanaccount.domain.LoanPaymentAllocationRule</class>
+
<class>org.apache.fineract.portfolio.loanproduct.domain.LoanProductCreditAllocationRule</class>
+
<class>org.apache.fineract.portfolio.loanaccount.domain.LoanCreditAllocationRule</class>
+
<class>org.apache.fineract.portfolio.loanproduct.domain.CreditAllocationTransactionType</class>
+
<class>org.apache.fineract.portfolio.loanproduct.domain.PaymentAllocationTypeListConverter</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.weaving" value="static" />