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

adamsaghy 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 13c99f98ab FINERACT-2210: Fix incorrect accounting of "buyback" for 
charged-off loan with fraud
13c99f98ab is described below

commit 13c99f98abc09d8f634e2768010c7550a626f316
Author: mariiaKraievska <[email protected]>
AuthorDate: Fri Apr 18 15:03:53 2025 +0300

    FINERACT-2210: Fix incorrect accounting of "buyback" for charged-off loan 
with fraud
---
 .../test/factory/LoanProductsRequestFactory.java   |   4 +-
 .../test/resources/features/LoanChargeOff.feature  | 101 ++++++++++++++++++++-
 .../service/InvestorAccountingHelper.java          |   5 +
 .../investor/service/AccountingServiceImpl.java    |  77 +++++++++-------
 4 files changed, 150 insertions(+), 37 deletions(-)

diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanProductsRequestFactory.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanProductsRequestFactory.java
index de7b78f794..f85f1277f3 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanProductsRequestFactory.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanProductsRequestFactory.java
@@ -1274,7 +1274,7 @@ public class LoanProductsRequestFactory {
         final List<PostChargeOffReasonToExpenseAccountMappings> 
chargeOffReasonToExpenseAccountMappings = new ArrayList<>();
         final PostChargeOffReasonToExpenseAccountMappings 
chargeOffDelinquentReason = new PostChargeOffReasonToExpenseAccountMappings();
         
chargeOffDelinquentReason.chargeOffReasonCodeValueId(codeValueResolver.resolve(chargeOffReasonId,
 DefaultCodeValue.DELINQUENT));
-        
chargeOffDelinquentReason.expenseAccountId(accountTypeResolver.resolve(DefaultAccountType.CREDIT_LOSS_BAD_DEBT_FRAUD));
+        
chargeOffDelinquentReason.expenseAccountId(accountTypeResolver.resolve(DefaultAccountType.CREDIT_LOSS_BAD_DEBT));
         chargeOffReasonToExpenseAccountMappings.add(chargeOffDelinquentReason);
 
         return new PostLoanProductsRequest()//
@@ -1369,7 +1369,7 @@ public class LoanProductsRequestFactory {
                 
.incomeFromChargeOffInterestAccountId(accountTypeResolver.resolve(DefaultAccountType.INTEREST_INCOME_CHARGE_OFF))//
                 
.incomeFromChargeOffFeesAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF))//
                 
.chargeOffExpenseAccountId(accountTypeResolver.resolve(DefaultAccountType.CREDIT_LOSS_BAD_DEBT))//
-                
.chargeOffFraudExpenseAccountId(accountTypeResolver.resolve(DefaultAccountType.CREDIT_LOSS_BAD_DEBT))//
+                
.chargeOffFraudExpenseAccountId(accountTypeResolver.resolve(DefaultAccountType.CREDIT_LOSS_BAD_DEBT_FRAUD))//
                 
.chargeOffReasonToExpenseAccountMappings(chargeOffReasonToExpenseAccountMappings)//
                 
.incomeFromChargeOffPenaltyAccountId(accountTypeResolver.resolve(DefaultAccountType.FEE_CHARGE_OFF));//
     }
diff --git 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanChargeOff.feature 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanChargeOff.feature
index ea7a7173d8..cc859aaf13 100644
--- 
a/fineract-e2e-tests-runner/src/test/resources/features/LoanChargeOff.feature
+++ 
b/fineract-e2e-tests-runner/src/test/resources/features/LoanChargeOff.feature
@@ -7647,7 +7647,7 @@ Feature: Charge-off
       | Type    | Account code | Account name               | Debit | Credit |
       | ASSET   | 112601       | Loans Receivable           |       | 100.0  |
       | ASSET   | 112603       | Interest/Fee Receivable    |       | 0.62   |
-      | EXPENSE | 744037       | Credit Loss/Bad Debt-Fraud | 100.0 |        |
+      | EXPENSE | 744007       | Credit Loss/Bad Debt       | 100.0 |        |
       | INCOME  | 404001       | Interest Income Charge Off | 0.62  |        |
     Then Admin does a charge-off undo the loan
     Then Loan Transactions tab has a "CHARGE_OFF" transaction with date "03 
February 2024" which has the following Journal entries:
@@ -7656,8 +7656,8 @@ Feature: Charge-off
       | ASSET   | 112601       | Loans Receivable           | 100.0 |        |
       | ASSET   | 112603       | Interest/Fee Receivable    |       | 0.62   |
       | ASSET   | 112603       | Interest/Fee Receivable    | 0.62  |        |
-      | EXPENSE | 744037       | Credit Loss/Bad Debt-Fraud | 100.0 |        |
-      | EXPENSE | 744037       | Credit Loss/Bad Debt-Fraud |       | 100.0  |
+      | EXPENSE | 744007       | Credit Loss/Bad Debt       | 100.0 |        |
+      | EXPENSE | 744007       | Credit Loss/Bad Debt       |       | 100.0  |
       | INCOME  | 404001       | Interest Income Charge Off | 0.62  |        |
       | INCOME  | 404001       | Interest Income Charge Off |       | 0.62   |
 
@@ -8345,3 +8345,98 @@ Feature: Charge-off
       | 14 April 2025    | Accrual                 | 3.26   | 0.0       | 3.26 
    | 0.0  | 0.0       | 0.0          | false    | false    |
       | 14 April 2025    | Accrual Adjustment      | 0.1    | 0.0       | 0.1  
    | 0.0  | 0.0       | 0.0          | false    | false    |
       | 14 April 2025    | Charge-off              | 0.0    | 0.0       | 0.0  
    | 0.0  | 0.0       | 0.0          | false    | true     |
+
+  @TestRailId:C3618
+  Scenario: Charge-off on a fraud loan respects GL mapping based on charge-off 
reason for buyback
+    When Admin sets the business date to "1 January 2024"
+    And Admin creates a client with random data
+    And Admin creates a fully customized loan with the following data:
+      | LoanProduct                                              | submitted 
on date | with Principal | ANNUAL interest rate % | interest type     | 
interest calculation period | amortization type  | loanTermFrequency | 
loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | 
numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | 
interest free period | Payment strategy            |
+      | LP2_ADV_PYMNT_ZERO_INTEREST_CHARGE_OFF_DELINQUENT_REASON | 01 January 
2024   | 100            | 7                      | DECLINING_BALANCE | 
SAME_AS_REPAYMENT_PERIOD    | EQUAL_INSTALLMENTS | 6                 | MONTHS   
             | 1              | MONTHS                 | 6                  | 0 
                      | 0                      | 0                    | 
ADVANCED_PAYMENT_ALLOCATION |
+    Then Loan Repayment schedule has 6 periods, with the following data for 
periods:
+      | Nr | Days | Date             | Paid date | Balance of loan | Principal 
due | Interest | Fees | Penalties | Due   | Paid | In advance | Late | 
Outstanding |
+      |    |      | 01 January 2024  |           | 100.0           |           
    |          | 0.0  |           | 0.0   |      |            |      | 0.0      
   |
+      | 1  | 31   | 01 February 2024 |           | 83.59           | 16.41     
    | 0.59     | 0.0  | 0.0       | 17.0  | 0.0  | 0.0        | 0.0  | 17.0     
   |
+      | 2  | 29   | 01 March 2024    |           | 67.05           | 16.54     
    | 0.46     | 0.0  | 0.0       | 17.0  | 0.0  | 0.0        | 0.0  | 17.0     
   |
+      | 3  | 31   | 01 April 2024    |           | 50.45           | 16.6      
    | 0.4      | 0.0  | 0.0       | 17.0  | 0.0  | 0.0        | 0.0  | 17.0     
   |
+      | 4  | 30   | 01 May 2024      |           | 33.74           | 16.71     
    | 0.29     | 0.0  | 0.0       | 17.0  | 0.0  | 0.0        | 0.0  | 17.0     
   |
+      | 5  | 31   | 01 June 2024     |           | 16.94           | 16.8      
    | 0.2      | 0.0  | 0.0       | 17.0  | 0.0  | 0.0        | 0.0  | 17.0     
   |
+      | 6  | 30   | 01 July 2024     |           | 0.0             | 16.94     
    | 0.1      | 0.0  | 0.0       | 17.04 | 0.0  | 0.0        | 0.0  | 17.04    
   |
+    Then Loan Repayment schedule has the following data in Total row:
+      | Principal due | Interest | Fees | Penalties | Due    | Paid | In 
advance | Late | Outstanding |
+      | 100           | 2.04     | 0    | 0         | 102.04 | 0    | 0        
  | 0    | 102.04      |
+    And Admin successfully approves the loan on "1 January 2024" with "100" 
amount and expected disbursement date on "1 January 2024"
+    And Admin successfully disburse the loan on "1 January 2024" with "100" 
EUR transaction amount
+    When Admin makes asset externalization request by Loan ID with unique 
ownerExternalId, system-generated transferExternalId and the following data:
+      | Transaction type | settlementDate | purchasePriceRatio |
+      | sale             | 2024-01-21     | 1                  |
+    Then Asset externalization response has the correct Loan ID, 
transferExternalId
+    Then Fetching Asset externalization details by loan id gives 
numberOfElements: 1 with correct ownerExternalId and the following data:
+      | settlementDate | purchasePriceRatio | status  | effectiveFrom | 
effectiveTo | Transaction type |
+      | 2024-01-21     | 1                  | PENDING | 2024-01-01    | 
9999-12-31  | SALE             |
+    When Admin sets the business date to "22 January 2024"
+    When Admin runs inline COB job for Loan
+    Then LoanOwnershipTransferBusinessEvent is created
+    Then LoanAccountSnapshotBusinessEvent is created
+    Then Fetching Asset externalization details by loan id gives 
numberOfElements: 2 with correct ownerExternalId and the following data:
+      | settlementDate | purchasePriceRatio | status  | effectiveFrom | 
effectiveTo | Transaction type |
+      | 2024-01-21     | 1                  | PENDING | 2024-01-01    | 
2024-01-21  | SALE             |
+      | 2024-01-21     | 1                  | ACTIVE  | 2024-01-22    | 
9999-12-31  | SALE             |
+    Then The latest asset externalization transaction with "ACTIVE" status has 
the following TRANSFER Journal entries:
+      | glAccountType | glAccountCode | glAccountName           | entryType | 
amount |
+      | ASSET         | 112601        | Loans Receivable        | CREDIT    | 
100.00 |
+      | ASSET         | 112603        | Interest/Fee Receivable | CREDIT    | 
2.04   |
+      | ASSET         | 146000        | Asset transfer          | DEBIT     | 
102.04 |
+      | ASSET         | 112601        | Loans Receivable        | DEBIT     | 
100.00 |
+      | ASSET         | 112603        | Interest/Fee Receivable | DEBIT     | 
2.04   |
+      | ASSET         | 146000        | Asset transfer          | CREDIT    | 
102.04 |
+    Then The asset external owner has the following OWNER Journal entries:
+      | glAccountType | glAccountCode | glAccountName           | entryType | 
amount |
+      | ASSET         | 112601        | Loans Receivable        | DEBIT     | 
100.00 |
+      | ASSET         | 112603        | Interest/Fee Receivable | DEBIT     | 
2.04   |
+    Then Admin can successfully set Fraud flag to the loan
+    When Admin sets the business date to "03 February 2024"
+    And Admin does charge-off the loan with reason "DELINQUENT" on "03 
February 2024"
+    Then Loan Transactions tab has a "CHARGE_OFF" transaction with date "03 
February 2024" which has the following Journal entries:
+      | Type    | Account code | Account name               | Debit | Credit |
+      | ASSET   | 112601       | Loans Receivable           |       | 100.0  |
+      | ASSET   | 112603       | Interest/Fee Receivable    |       | 0.62   |
+      | EXPENSE | 744007       | Credit Loss/Bad Debt       | 100.0 |        |
+      | INCOME  | 404001       | Interest Income Charge Off | 0.62  |        |
+    When Admin makes asset externalization request by Loan ID with unique 
ownerExternalId, system-generated transferExternalId and the following data:
+      | Transaction type | settlementDate | purchasePriceRatio |
+      | buyback          | 2024-02-03     |                    |
+    Then Fetching Asset externalization details by loan id gives 
numberOfElements: 3 with correct ownerExternalId and the following data:
+      | settlementDate | purchasePriceRatio | status  | effectiveFrom | 
effectiveTo | Transaction type |
+      | 2024-01-21     | 1                  | PENDING | 2024-01-01    | 
2024-01-21  | SALE             |
+      | 2024-01-21     | 1                  | ACTIVE  | 2024-01-22    | 
9999-12-31  | SALE             |
+      | 2024-02-03     | 1                  | BUYBACK | 2024-02-03    | 
9999-12-31  | BUYBACK          |
+    When Admin sets the business date to "04 May 2024"
+    When Admin runs inline COB job for Loan
+    Then LoanOwnershipTransferBusinessEvent is created
+    Then LoanAccountSnapshotBusinessEvent is created
+    Then Fetching Asset externalization details by loan id gives 
numberOfElements: 3 with correct ownerExternalId and the following data:
+      | settlementDate | purchasePriceRatio | status  | effectiveFrom | 
effectiveTo | Transaction type |
+      | 2024-01-21     | 1                  | PENDING | 2024-01-01    | 
2024-01-21  | SALE             |
+      | 2024-01-21     | 1                  | ACTIVE  | 2024-01-22    | 
2024-02-03  | SALE             |
+      | 2024-02-03     | 1                  | BUYBACK | 2024-02-03    | 
2024-02-03  | BUYBACK          |
+    Then The latest asset externalization transaction with "BUYBACK" status 
has the following TRANSFER Journal entries:
+      | glAccountType | glAccountCode | glAccountName              | entryType 
| amount |
+      | EXPENSE       | 744007        | Credit Loss/Bad Debt       | DEBIT     
| 100.00 |
+      | INCOME        | 404001        | Interest Income Charge Off | DEBIT     
| 0.62   |
+      | ASSET         | 146000        | Asset transfer             | CREDIT    
| 100.62 |
+      | EXPENSE       | 744007        | Credit Loss/Bad Debt       | CREDIT    
| 100.00 |
+      | INCOME        | 404001        | Interest Income Charge Off | CREDIT    
| 0.62   |
+      | ASSET         | 146000        | Asset transfer             | DEBIT     
| 100.62 |
+    Then The asset external owner has the following OWNER Journal entries:
+      | glAccountType | glAccountCode | glAccountName              | entryType 
| amount |
+      | ASSET         | 112601        | Loans Receivable           | DEBIT     
| 100.00 |
+      | ASSET         | 112603        | Interest/Fee Receivable    | DEBIT     
| 2.04   |
+      | ASSET         | 112603        | Interest/Fee Receivable    | DEBIT     
| 0.24   |
+      | INCOME        | 404000        | Interest Income            | CREDIT    
| 0.24   |
+      | ASSET         | 112601        | Loans Receivable           | CREDIT    
| 100.00 |
+      | ASSET         | 112603        | Interest/Fee Receivable    | CREDIT    
| 0.62   |
+      | EXPENSE       | 744007        | Credit Loss/Bad Debt       | DEBIT     
| 100.00 |
+      | INCOME        | 404001        | Interest Income Charge Off | DEBIT     
| 0.62   |
+      | EXPENSE       | 744007        | Credit Loss/Bad Debt       | CREDIT    
| 100.00 |
+      | INCOME        | 404001        | Interest Income Charge Off | CREDIT    
| 0.62   |
\ No newline at end of file
diff --git 
a/fineract-investor/src/main/java/org/apache/fineract/investor/accounting/journalentry/service/InvestorAccountingHelper.java
 
b/fineract-investor/src/main/java/org/apache/fineract/investor/accounting/journalentry/service/InvestorAccountingHelper.java
index 33f8c9a6d0..217a2ce7c0 100644
--- 
a/fineract-investor/src/main/java/org/apache/fineract/investor/accounting/journalentry/service/InvestorAccountingHelper.java
+++ 
b/fineract-investor/src/main/java/org/apache/fineract/investor/accounting/journalentry/service/InvestorAccountingHelper.java
@@ -90,6 +90,11 @@ public class InvestorAccountingHelper {
         }
     }
 
+    public ProductToGLAccountMapping getChargeOffMappingByCodeValue(final Long 
loanProductId, final PortfolioProductType productType,
+            final Long chargeOffReasonId) {
+        return 
accountMappingRepository.findChargeOffReasonMapping(loanProductId, 
productType.getValue(), chargeOffReasonId);
+    }
+
     private JournalEntry createCreditJournalEntryForInvestor(final Office 
office, final String currencyCode, final GLAccount account,
             final Long loanId, final Long transactionId, final LocalDate 
transactionDate, final BigDecimal amount) {
         final boolean manualEntry = false;
diff --git 
a/fineract-investor/src/main/java/org/apache/fineract/investor/service/AccountingServiceImpl.java
 
b/fineract-investor/src/main/java/org/apache/fineract/investor/service/AccountingServiceImpl.java
index 2b997c604f..fe72d6182a 100644
--- 
a/fineract-investor/src/main/java/org/apache/fineract/investor/service/AccountingServiceImpl.java
+++ 
b/fineract-investor/src/main/java/org/apache/fineract/investor/service/AccountingServiceImpl.java
@@ -31,6 +31,8 @@ import 
org.apache.fineract.accounting.financialactivityaccount.domain.FinancialA
 import 
org.apache.fineract.accounting.financialactivityaccount.domain.FinancialActivityAccountRepositoryWrapper;
 import org.apache.fineract.accounting.glaccount.domain.GLAccount;
 import org.apache.fineract.accounting.journalentry.domain.JournalEntry;
+import 
org.apache.fineract.accounting.producttoaccountmapping.domain.ProductToGLAccountMapping;
+import org.apache.fineract.infrastructure.core.service.MathUtil;
 import 
org.apache.fineract.investor.accounting.journalentry.service.InvestorAccountingHelper;
 import org.apache.fineract.investor.domain.ExternalAssetOwner;
 import 
org.apache.fineract.investor.domain.ExternalAssetOwnerJournalEntryMapping;
@@ -39,6 +41,7 @@ import 
org.apache.fineract.investor.domain.ExternalAssetOwnerTransfer;
 import 
org.apache.fineract.investor.domain.ExternalAssetOwnerTransferJournalEntryMapping;
 import 
org.apache.fineract.investor.domain.ExternalAssetOwnerTransferJournalEntryMappingRepository;
 import org.apache.fineract.organisation.office.domain.Office;
+import org.apache.fineract.portfolio.PortfolioProductType;
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
 import org.jetbrains.annotations.NotNull;
@@ -94,7 +97,8 @@ public class AccountingServiceImpl implements 
AccountingService {
     }
 
     @NotNull
-    private List<JournalEntry> createJournalEntries(Loan loan, 
ExternalAssetOwnerTransfer transfer, boolean isReversalOrder) {
+    private List<JournalEntry> createJournalEntries(final Loan loan, final 
ExternalAssetOwnerTransfer transfer,
+            final boolean isReversalOrder) {
         this.helper.checkForBranchClosures(loan.getOffice().getId(), 
transfer.getSettlementDate());
         // transaction properties
         final Long transactionId = transfer.getId();
@@ -106,8 +110,8 @@ public class AccountingServiceImpl implements 
AccountingService {
         final BigDecimal overPaymentAmount = loan.getTotalOverpaid();
 
         // Moving money to asset transfer account
-        List<JournalEntry> journalEntryList = createJournalEntries(loan, 
transactionId, transactionDate, principalAmount, interestAmount,
-                feesAmount, penaltiesAmount, overPaymentAmount, 
!isReversalOrder);
+        final List<JournalEntry> journalEntryList = createJournalEntries(loan, 
transactionId, transactionDate, principalAmount,
+                interestAmount, feesAmount, penaltiesAmount, 
overPaymentAmount, !isReversalOrder);
         // Moving money from asset transfer account
         journalEntryList.addAll(createJournalEntries(loan, transactionId, 
transactionDate, principalAmount, interestAmount, feesAmount,
                 penaltiesAmount, overPaymentAmount, isReversalOrder));
@@ -171,82 +175,91 @@ public class AccountingServiceImpl implements 
AccountingService {
         });
     }
 
-    private List<JournalEntry> createJournalEntries(Loan loan, Long 
transactionId, LocalDate transactionDate, BigDecimal principalAmount,
-            BigDecimal interestAmount, BigDecimal feesAmount, BigDecimal 
penaltiesAmount, BigDecimal overPaymentAmount,
-            boolean isReversalOrder) {
-        Long loanProductId = loan.productId();
-        Long loanId = loan.getId();
-        Office office = loan.getOffice();
-        String currencyCode = loan.getCurrencyCode();
-        List<JournalEntry> journalEntryList = new ArrayList<>();
+    private List<JournalEntry> createJournalEntries(final Loan loan, final 
Long transactionId, final LocalDate transactionDate,
+            final BigDecimal principalAmount, final BigDecimal interestAmount, 
final BigDecimal feesAmount,
+            final BigDecimal penaltiesAmount, final BigDecimal 
overPaymentAmount, final boolean isReversalOrder) {
+        final Long loanProductId = loan.productId();
+        final Long loanId = loan.getId();
+        final Office office = loan.getOffice();
+        final String currencyCode = loan.getCurrencyCode();
+        final List<JournalEntry> journalEntryList = new ArrayList<>();
         BigDecimal totalDebitAmount = BigDecimal.ZERO;
-        Map<GLAccount, BigDecimal> accountMap = new LinkedHashMap<>();
+        final Map<GLAccount, BigDecimal> accountMap = new LinkedHashMap<>();
         // principal entry
-        if (principalAmount != null && 
principalAmount.compareTo(BigDecimal.ZERO) > 0) {
-            AccountingConstants.AccrualAccountsForLoan accrualAccount = 
AccountingConstants.AccrualAccountsForLoan.LOAN_PORTFOLIO;
+        if (MathUtil.isGreaterThanZero(principalAmount)) {
+            totalDebitAmount = totalDebitAmount.add(principalAmount);
+            GLAccount account;
             if (loan.isChargedOff()) {
-                if (loan.isFraud()) {
-                    accrualAccount = 
AccountingConstants.AccrualAccountsForLoan.CHARGE_OFF_FRAUD_EXPENSE;
+                final Long chargeOffReasonId = loan.fetchChargeOffReasonId();
+                final ProductToGLAccountMapping mapping = chargeOffReasonId != 
null
+                        ? helper.getChargeOffMappingByCodeValue(loanProductId, 
PortfolioProductType.LOAN, chargeOffReasonId)
+                        : null;
+                if (mapping != null) {
+                    account = mapping.getGlAccount();
                 } else {
-                    accrualAccount = 
AccountingConstants.AccrualAccountsForLoan.CHARGE_OFF_EXPENSE;
+                    final AccountingConstants.AccrualAccountsForLoan 
accrualAccount = loan.isFraud()
+                            ? 
AccountingConstants.AccrualAccountsForLoan.CHARGE_OFF_FRAUD_EXPENSE
+                            : 
AccountingConstants.AccrualAccountsForLoan.CHARGE_OFF_EXPENSE;
+                    account = 
helper.getLinkedGLAccountForLoanProduct(loanProductId, 
accrualAccount.getValue());
                 }
+            } else {
+                account = 
helper.getLinkedGLAccountForLoanProduct(loanProductId,
+                        
AccountingConstants.AccrualAccountsForLoan.LOAN_PORTFOLIO.getValue());
             }
-            totalDebitAmount = totalDebitAmount.add(principalAmount);
-            GLAccount account = 
this.helper.getLinkedGLAccountForLoanProduct(loanProductId, 
accrualAccount.getValue());
             accountMap.put(account, principalAmount);
         }
         // interest entry
-        if (interestAmount != null && 
interestAmount.compareTo(BigDecimal.ZERO) > 0) {
+        if (MathUtil.isGreaterThanZero(interestAmount)) {
             AccountingConstants.AccrualAccountsForLoan accrualAccount = 
AccountingConstants.AccrualAccountsForLoan.INTEREST_RECEIVABLE;
             if (loan.isChargedOff()) {
                 accrualAccount = 
AccountingConstants.AccrualAccountsForLoan.INCOME_FROM_CHARGE_OFF_INTEREST;
             }
             totalDebitAmount = totalDebitAmount.add(interestAmount);
-            GLAccount account = 
this.helper.getLinkedGLAccountForLoanProduct(loanProductId, 
accrualAccount.getValue());
+            final GLAccount account = 
this.helper.getLinkedGLAccountForLoanProduct(loanProductId, 
accrualAccount.getValue());
             if (accountMap.containsKey(account)) {
-                BigDecimal amount = 
accountMap.get(account).add(interestAmount);
+                final BigDecimal amount = 
accountMap.get(account).add(interestAmount);
                 accountMap.put(account, amount);
             } else {
                 accountMap.put(account, interestAmount);
             }
         }
         // fee entry
-        if (feesAmount != null && feesAmount.compareTo(BigDecimal.ZERO) > 0) {
+        if (MathUtil.isGreaterThanZero(feesAmount)) {
             AccountingConstants.AccrualAccountsForLoan accrualAccount = 
AccountingConstants.AccrualAccountsForLoan.FEES_RECEIVABLE;
             if (loan.isChargedOff()) {
                 accrualAccount = 
AccountingConstants.AccrualAccountsForLoan.INCOME_FROM_CHARGE_OFF_FEES;
             }
             totalDebitAmount = totalDebitAmount.add(feesAmount);
-            GLAccount account = 
this.helper.getLinkedGLAccountForLoanProduct(loanProductId, 
accrualAccount.getValue());
+            final GLAccount account = 
this.helper.getLinkedGLAccountForLoanProduct(loanProductId, 
accrualAccount.getValue());
             if (accountMap.containsKey(account)) {
-                BigDecimal amount = accountMap.get(account).add(feesAmount);
+                final BigDecimal amount = 
accountMap.get(account).add(feesAmount);
                 accountMap.put(account, amount);
             } else {
                 accountMap.put(account, feesAmount);
             }
         }
         // penalty entry
-        if (penaltiesAmount != null && 
penaltiesAmount.compareTo(BigDecimal.ZERO) > 0) {
+        if (MathUtil.isGreaterThanZero(penaltiesAmount)) {
             AccountingConstants.AccrualAccountsForLoan accrualAccount = 
AccountingConstants.AccrualAccountsForLoan.PENALTIES_RECEIVABLE;
             if (loan.isChargedOff()) {
                 accrualAccount = 
AccountingConstants.AccrualAccountsForLoan.INCOME_FROM_CHARGE_OFF_PENALTY;
             }
             totalDebitAmount = totalDebitAmount.add(penaltiesAmount);
-            GLAccount account = 
this.helper.getLinkedGLAccountForLoanProduct(loanProductId, 
accrualAccount.getValue());
+            final GLAccount account = 
this.helper.getLinkedGLAccountForLoanProduct(loanProductId, 
accrualAccount.getValue());
             if (accountMap.containsKey(account)) {
-                BigDecimal amount = 
accountMap.get(account).add(penaltiesAmount);
+                final BigDecimal amount = 
accountMap.get(account).add(penaltiesAmount);
                 accountMap.put(account, amount);
             } else {
                 accountMap.put(account, penaltiesAmount);
             }
         }
         // overpaid entry
-        if (overPaymentAmount != null && 
overPaymentAmount.compareTo(BigDecimal.ZERO) > 0) {
+        if (MathUtil.isGreaterThanZero(overPaymentAmount)) {
             totalDebitAmount = totalDebitAmount.add(overPaymentAmount);
-            GLAccount account = 
this.helper.getLinkedGLAccountForLoanProduct(loanProductId,
+            final GLAccount account = 
this.helper.getLinkedGLAccountForLoanProduct(loanProductId,
                     
AccountingConstants.AccrualAccountsForLoan.OVERPAYMENT.getValue());
             if (accountMap.containsKey(account)) {
-                BigDecimal amount = 
accountMap.get(account).add(overPaymentAmount);
+                final BigDecimal amount = 
accountMap.get(account).add(overPaymentAmount);
                 accountMap.put(account, amount);
             } else {
                 accountMap.put(account, overPaymentAmount);
@@ -257,7 +270,7 @@ public class AccountingServiceImpl implements 
AccountingService {
             
journalEntryList.add(this.helper.createCreditJournalEntryOrReversalForInvestor(office,
 currencyCode, loanId, transactionId,
                     transactionDate, entry.getValue(), isReversalOrder, 
entry.getKey()));
         }
-        if (totalDebitAmount.compareTo(BigDecimal.ZERO) > 0) {
+        if (MathUtil.isGreaterThanZero(totalDebitAmount)) {
             
journalEntryList.add(this.helper.createDebitJournalEntryOrReversalForInvestor(office,
 currencyCode,
                     
AccountingConstants.FinancialActivity.ASSET_TRANSFER.getValue(), loanProductId, 
loanId, transactionId, transactionDate,
                     totalDebitAmount, isReversalOrder));

Reply via email to