This is an automated email from the ASF dual-hosted git repository.

arnold 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 cabb79c99 Allow accounting mappings for fund source asset or liability
cabb79c99 is described below

commit cabb79c992daed201a07ce990c991c77d5800a65
Author: Jose Alberto Hernandez <[email protected]>
AuthorDate: Mon Aug 1 17:06:47 2022 -0500

    Allow accounting mappings for fund source asset or liability
---
 .../LoanProductToGLAccountMappingHelper.java       | 46 ++++++++++++++++++++--
 .../service/ProductToGLAccountMappingHelper.java   |  2 +
 ...ToGLAccountMappingWritePlatformServiceImpl.java | 11 ++++--
 3 files changed, 51 insertions(+), 8 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/LoanProductToGLAccountMappingHelper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/LoanProductToGLAccountMappingHelper.java
index 82e5c3ef2..e7514deb7 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/LoanProductToGLAccountMappingHelper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/LoanProductToGLAccountMappingHelper.java
@@ -20,16 +20,19 @@ package 
org.apache.fineract.accounting.producttoaccountmapping.service;
 
 import com.google.gson.JsonElement;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import 
org.apache.fineract.accounting.common.AccountingConstants.AccrualAccountsForLoan;
 import 
org.apache.fineract.accounting.common.AccountingConstants.CashAccountsForLoan;
 import 
org.apache.fineract.accounting.common.AccountingConstants.LoanProductAccountingParams;
 import org.apache.fineract.accounting.common.AccountingRuleType;
+import org.apache.fineract.accounting.glaccount.domain.GLAccount;
 import org.apache.fineract.accounting.glaccount.domain.GLAccountRepository;
 import 
org.apache.fineract.accounting.glaccount.domain.GLAccountRepositoryWrapper;
 import org.apache.fineract.accounting.glaccount.domain.GLAccountType;
 import 
org.apache.fineract.accounting.producttoaccountmapping.domain.PortfolioProductType;
 import 
org.apache.fineract.accounting.producttoaccountmapping.domain.ProductToGLAccountMappingRepository;
+import 
org.apache.fineract.accounting.producttoaccountmapping.exception.ProductToGLAccountMappingInvalidException;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
 import org.apache.fineract.portfolio.charge.domain.ChargeRepositoryWrapper;
@@ -56,6 +59,14 @@ public class LoanProductToGLAccountMappingHelper extends 
ProductToGLAccountMappi
         saveProductToAccountMapping(element, paramName, productId, 
placeHolderTypeId, GLAccountType.ASSET, PortfolioProductType.LOAN);
     }
 
+    public void saveLoanToAssetOrLiabilityAccountMapping(final JsonElement 
element, final String paramName, final Long productId,
+            final int placeHolderTypeId) {
+        GLAccountType glAccountType = getGLAccountType(element, paramName, 
ASSET_LIABILITY_TYPES);
+        if (glAccountType != null) {
+            saveProductToAccountMapping(element, paramName, productId, 
placeHolderTypeId, glAccountType, PortfolioProductType.LOAN);
+        }
+    }
+
     public void saveLoanToIncomeAccountMapping(final JsonElement element, 
final String paramName, final Long productId,
             final int placeHolderTypeId) {
         saveProductToAccountMapping(element, paramName, productId, 
placeHolderTypeId, GLAccountType.INCOME, PortfolioProductType.LOAN);
@@ -80,6 +91,15 @@ public class LoanProductToGLAccountMappingHelper extends 
ProductToGLAccountMappi
                 PortfolioProductType.LOAN);
     }
 
+    public void mergeLoanToAssetOrLiabilityAccountMappingChanges(final 
JsonElement element, final String paramName, final Long productId,
+            final int accountTypeId, final String accountTypeName, final 
Map<String, Object> changes) {
+        GLAccountType glAccountType = getGLAccountType(element, paramName, 
ASSET_LIABILITY_TYPES);
+        if (glAccountType != null) {
+            mergeProductToAccountMappingChanges(element, paramName, productId, 
accountTypeId, accountTypeName, changes, glAccountType,
+                    PortfolioProductType.LOAN);
+        }
+    }
+
     public void mergeLoanToIncomeAccountMappingChanges(final JsonElement 
element, final String paramName, final Long productId,
             final int accountTypeId, final String accountTypeName, final 
Map<String, Object> changes) {
         mergeProductToAccountMappingChanges(element, paramName, productId, 
accountTypeId, accountTypeName, changes, GLAccountType.INCOME,
@@ -223,9 +243,11 @@ public class LoanProductToGLAccountMappingHelper extends 
ProductToGLAccountMappi
             case NONE:
             break;
             case CASH_BASED:
-                // asset
-                mergeLoanToAssetAccountMappingChanges(element, 
LoanProductAccountingParams.FUND_SOURCE.getValue(), loanProductId,
+                // asset or liabilities
+                mergeLoanToAssetOrLiabilityAccountMappingChanges(element, 
LoanProductAccountingParams.FUND_SOURCE.getValue(), loanProductId,
                         CashAccountsForLoan.FUND_SOURCE.getValue(), 
CashAccountsForLoan.FUND_SOURCE.toString(), changes);
+
+                // asset
                 mergeLoanToAssetAccountMappingChanges(element, 
LoanProductAccountingParams.LOAN_PORTFOLIO.getValue(), loanProductId,
                         CashAccountsForLoan.LOAN_PORTFOLIO.getValue(), 
CashAccountsForLoan.LOAN_PORTFOLIO.toString(), changes);
                 mergeLoanToAssetAccountMappingChanges(element, 
LoanProductAccountingParams.TRANSFERS_SUSPENSE.getValue(), loanProductId,
@@ -255,9 +277,11 @@ public class LoanProductToGLAccountMappingHelper extends 
ProductToGLAccountMappi
             case ACCRUAL_UPFRONT:
                 // fall through to periodic accrual
             case ACCRUAL_PERIODIC:
+                // asset or liabilities
+                mergeLoanToAssetOrLiabilityAccountMappingChanges(element, 
LoanProductAccountingParams.FUND_SOURCE.getValue(), loanProductId,
+                        CashAccountsForLoan.FUND_SOURCE.getValue(), 
CashAccountsForLoan.FUND_SOURCE.toString(), changes);
+
                 // assets (including receivables)
-                mergeLoanToAssetAccountMappingChanges(element, 
LoanProductAccountingParams.FUND_SOURCE.getValue(), loanProductId,
-                        AccrualAccountsForLoan.FUND_SOURCE.getValue(), 
AccrualAccountsForLoan.FUND_SOURCE.toString(), changes);
                 mergeLoanToAssetAccountMappingChanges(element, 
LoanProductAccountingParams.LOAN_PORTFOLIO.getValue(), loanProductId,
                         AccrualAccountsForLoan.LOAN_PORTFOLIO.getValue(), 
AccrualAccountsForLoan.LOAN_PORTFOLIO.toString(), changes);
                 mergeLoanToAssetAccountMappingChanges(element, 
LoanProductAccountingParams.TRANSFERS_SUSPENSE.getValue(), loanProductId,
@@ -302,4 +326,18 @@ public class LoanProductToGLAccountMappingHelper extends 
ProductToGLAccountMappi
         deleteProductToGLAccountMapping(loanProductId, 
PortfolioProductType.LOAN);
     }
 
+    private GLAccountType getGLAccountType(final JsonElement element, final 
String paramName, final List<GLAccountType> allowedTypes) {
+        GLAccountType gLAccountType = null;
+        final Long accountId = 
this.fromApiJsonHelper.extractLongNamed(paramName, element);
+        if (accountId != null) {
+            final GLAccount glAccount = getAccountById(paramName, accountId);
+            gLAccountType = GLAccountType.fromInt(glAccount.getType());
+            if (!allowedTypes.contains(gLAccountType)) {
+                throw new ProductToGLAccountMappingInvalidException(paramName, 
glAccount.getName(), accountId, gLAccountType.toString(),
+                        GLAccountType.ASSET.getCode() + " or " + 
GLAccountType.LIABILITY.getCode());
+            }
+        }
+        return gLAccountType;
+    }
+
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingHelper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingHelper.java
index 7887156a4..c127be060 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingHelper.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingHelper.java
@@ -51,6 +51,8 @@ import org.springframework.stereotype.Component;
 @RequiredArgsConstructor
 public class ProductToGLAccountMappingHelper {
 
+    protected static final List<GLAccountType> ASSET_LIABILITY_TYPES = 
List.of(GLAccountType.ASSET, GLAccountType.LIABILITY);
+
     protected final GLAccountRepository accountRepository;
     protected final ProductToGLAccountMappingRepository 
accountMappingRepository;
     protected final FromJsonHelper fromApiJsonHelper;
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingWritePlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingWritePlatformServiceImpl.java
index b48dafb27..41d94d28b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingWritePlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/service/ProductToGLAccountMappingWritePlatformServiceImpl.java
@@ -62,9 +62,10 @@ public class 
ProductToGLAccountMappingWritePlatformServiceImpl implements Produc
             case NONE:
             break;
             case CASH_BASED:
-                // asset
-                
this.loanProductToGLAccountMappingHelper.saveLoanToAssetAccountMapping(element,
+                // asset or liability
+                
this.loanProductToGLAccountMappingHelper.saveLoanToAssetOrLiabilityAccountMapping(element,
                         LoanProductAccountingParams.FUND_SOURCE.getValue(), 
loanProductId, CashAccountsForLoan.FUND_SOURCE.getValue());
+                // asset
                 
this.loanProductToGLAccountMappingHelper.saveLoanToAssetAccountMapping(element,
                         LoanProductAccountingParams.LOAN_PORTFOLIO.getValue(), 
loanProductId,
                         CashAccountsForLoan.LOAN_PORTFOLIO.getValue());
@@ -105,9 +106,11 @@ public class 
ProductToGLAccountMappingWritePlatformServiceImpl implements Produc
             case ACCRUAL_UPFRONT:
                 // Fall Through
             case ACCRUAL_PERIODIC:
+                // asset or liability
+                
this.loanProductToGLAccountMappingHelper.saveLoanToAssetOrLiabilityAccountMapping(element,
+                        LoanProductAccountingParams.FUND_SOURCE.getValue(), 
loanProductId, CashAccountsForLoan.FUND_SOURCE.getValue());
+
                 // assets (including receivables)
-                
this.loanProductToGLAccountMappingHelper.saveLoanToAssetAccountMapping(element,
-                        LoanProductAccountingParams.FUND_SOURCE.getValue(), 
loanProductId, AccrualAccountsForLoan.FUND_SOURCE.getValue());
                 
this.loanProductToGLAccountMappingHelper.saveLoanToAssetAccountMapping(element,
                         LoanProductAccountingParams.LOAN_PORTFOLIO.getValue(), 
loanProductId,
                         AccrualAccountsForLoan.LOAN_PORTFOLIO.getValue());

Reply via email to