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" />


Reply via email to