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 33c1aa787 FINERACT-1724: Creating accrual entry should not be done by 
native queries
33c1aa787 is described below

commit 33c1aa7874d908c6114ecd0d989fe63ac2b84427
Author: abraham.menyhart <[email protected]>
AuthorDate: Thu Aug 3 11:28:00 2023 +0200

    FINERACT-1724: Creating accrual entry should not be done by native queries
---
 .../LoanAccrualWritePlatformServiceImpl.java       | 31 ++++++++++------------
 .../LoanWritePlatformServiceJpaRepositoryImpl.java | 13 ++++-----
 2 files changed, 19 insertions(+), 25 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java
index 8dbefa864..69a843747 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualWritePlatformServiceImpl.java
@@ -18,6 +18,8 @@
  */
 package org.apache.fineract.portfolio.loanaccount.service;
 
+import static 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction.accrueTransaction;
+
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.temporal.ChronoUnit;
@@ -28,7 +30,6 @@ import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService;
 import 
org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService;
@@ -40,12 +41,15 @@ import 
org.apache.fineract.infrastructure.event.business.service.BusinessEventNo
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
 import org.apache.fineract.organisation.monetary.domain.MoneyHelper;
+import org.apache.fineract.organisation.office.domain.Office;
+import org.apache.fineract.organisation.office.domain.OfficeRepository;
 import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData;
 import 
org.apache.fineract.portfolio.loanaccount.data.LoanInstallmentChargeData;
 import org.apache.fineract.portfolio.loanaccount.data.LoanScheduleAccrualData;
 import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData;
 import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionEnumData;
 import org.apache.fineract.portfolio.loanaccount.domain.Loan;
+import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction;
 import 
org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRepository;
@@ -72,6 +76,8 @@ public class LoanAccrualWritePlatformServiceImpl implements 
LoanAccrualWritePlat
     private final JournalEntryWritePlatformService 
journalEntryWritePlatformService;
     private final PlatformSecurityContext context;
     private final LoanRepositoryWrapper loanRepositoryWrapper;
+    private final LoanRepository loanRepository;
+    private final OfficeRepository officeRepository;
     private final BusinessEventNotifierService businessEventNotifierService;
     private final LoanTransactionRepository loanTransactionRepository;
     private final LoanAccrualTransactionBusinessEventService 
loanAccrualTransactionBusinessEventService;
@@ -265,24 +271,20 @@ public class LoanAccrualWritePlatformServiceImpl 
implements LoanAccrualWritePlat
             BigDecimal totalAccInterest, BigDecimal feePortion, BigDecimal 
totalAccFee, BigDecimal penaltyPortion,
             BigDecimal totalAccPenalty, final LocalDate accruedTill) throws 
DataAccessException {
         AppUser user = context.authenticatedUser();
-        String transactionSql = "INSERT INTO m_loan_transaction  
(loan_id,office_id,is_reversed,external_id,transaction_type_enum,transaction_date,amount,interest_portion_derived,"
-                + 
"fee_charges_portion_derived,penalty_charges_portion_derived, 
submitted_on_date, created_by, last_modified_by, created_on_utc, 
last_modified_on_utc) "
-                + "VALUES (?, ?, false, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
-        this.jdbcTemplate.update(transactionSql, 
scheduleAccrualData.getLoanId(), scheduleAccrualData.getOfficeId(),
-                externalIdFactory.create().getValue(), 
LoanTransactionType.ACCRUAL.getValue(), accruedTill, amount, interestPortion,
-                feePortion, penaltyPortion, DateUtils.getBusinessLocalDate(), 
user.getId(), user.getId(),
-                DateUtils.getOffsetDateTimeOfTenantWithMostPrecision(), 
DateUtils.getOffsetDateTimeOfTenantWithMostPrecision());
-        final Long transactionId = this.jdbcTemplate.queryForObject("SELECT " 
+ sqlGenerator.lastInsertId(), Long.class); // NOSONAR
+        Loan loan = 
loanRepository.getReferenceById(scheduleAccrualData.getLoanId());
+        Office office = 
officeRepository.getReferenceById(scheduleAccrualData.getOfficeId());
+        LoanTransaction loanTransaction = 
loanTransactionRepository.saveAndFlush(accrueTransaction(loan, office, 
accruedTill, amount,
+                interestPortion, feePortion, penaltyPortion, 
externalIdFactory.create()));
 
         Map<LoanChargeData, BigDecimal> applicableCharges = 
scheduleAccrualData.getApplicableCharges();
         String chargesPaidSql = "INSERT INTO m_loan_charge_paid_by 
(loan_transaction_id, loan_charge_id, amount,installment_number) VALUES 
(?,?,?,?)";
         for (Map.Entry<LoanChargeData, BigDecimal> entry : 
applicableCharges.entrySet()) {
             LoanChargeData chargeData = entry.getKey();
-            this.jdbcTemplate.update(chargesPaidSql, transactionId, 
chargeData.getId(), entry.getValue(),
+            this.jdbcTemplate.update(chargesPaidSql, loanTransaction.getId(), 
chargeData.getId(), entry.getValue(),
                     scheduleAccrualData.getInstallmentNumber());
         }
 
-        Map<String, Object> transactionMap = toMapData(transactionId, amount, 
interestPortion, feePortion, penaltyPortion,
+        Map<String, Object> transactionMap = 
toMapData(loanTransaction.getId(), amount, interestPortion, feePortion, 
penaltyPortion,
                 scheduleAccrualData, accruedTill);
 
         String repaymentUpdateSql = "UPDATE m_loan_repayment_schedule SET 
accrual_interest_derived=?, accrual_fee_charges_derived=?, "
@@ -294,12 +296,7 @@ public class LoanAccrualWritePlatformServiceImpl 
implements LoanAccrualWritePlat
         this.jdbcTemplate.update(updateLoan, accruedTill, user.getId(), 
DateUtils.getOffsetDateTimeOfTenantWithMostPrecision(),
                 scheduleAccrualData.getLoanId());
 
-        Optional<LoanTransaction> loanAccrualTransaction = 
loanTransactionRepository.findByIdAndLoanId(transactionId,
-                scheduleAccrualData.getLoanId());
-        if (!loanAccrualTransaction.isEmpty()) {
-            businessEventNotifierService
-                    .notifyPostBusinessEvent(new 
LoanAccrualTransactionCreatedBusinessEvent(loanAccrualTransaction.get()));
-        }
+        businessEventNotifierService.notifyPostBusinessEvent(new 
LoanAccrualTransactionCreatedBusinessEvent(loanTransaction));
 
         final Map<String, Object> accountingBridgeData = 
deriveAccountingBridgeData(scheduleAccrualData, transactionMap);
         
this.journalEntryWritePlatformService.createJournalEntriesForLoan(accountingBridgeData);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
index ae2f6c9b7..02d2a833b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
@@ -77,6 +77,7 @@ import 
org.apache.fineract.infrastructure.event.business.domain.loan.LoanUndoDis
 import 
org.apache.fineract.infrastructure.event.business.domain.loan.LoanUndoLastDisbursalBusinessEvent;
 import 
org.apache.fineract.infrastructure.event.business.domain.loan.LoanUpdateDisbursementDataBusinessEvent;
 import 
org.apache.fineract.infrastructure.event.business.domain.loan.LoanWithdrawTransferBusinessEvent;
+import 
org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanAccrualTransactionCreatedBusinessEvent;
 import 
org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanChargeOffPostBusinessEvent;
 import 
org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanChargeOffPreBusinessEvent;
 import 
org.apache.fineract.infrastructure.event.business.domain.loan.transaction.LoanDisbursalTransactionBusinessEvent;
@@ -487,14 +488,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
                 disBuLoanCharges.put(loanCharge.getId(), 
loanCharge.amountOutstanding());
             }
             if (loanCharge.isDisbursementCharge()) {
-                String transactionSql = "INSERT INTO m_loan_transaction  
(loan_id,office_id,is_reversed,external_id,transaction_type_enum,transaction_date,amount,"
-                        + "fee_charges_portion_derived, submitted_on_date, 
created_by, last_modified_by, created_on_utc, last_modified_on_utc) "
-                        + "VALUES (?, ?, false, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
-                AppUser user = context.authenticatedUser();
-                jdbcTemplate.update(transactionSql, loanId, 
loan.getOfficeId(), externalIdFactory.create().getValue(),
-                        LoanTransactionType.ACCRUAL.getValue(), 
actualDisbursementDate, loanCharge.amount(), loanCharge.amount(),
-                        DateUtils.getBusinessLocalDate(), user.getId(), 
user.getId(),
-                        
DateUtils.getOffsetDateTimeOfTenantWithMostPrecision(), 
DateUtils.getOffsetDateTimeOfTenantWithMostPrecision());
+                LoanTransaction loanTransaction = 
LoanTransaction.accrueTransaction(loan, loan.getOffice(), 
actualDisbursementDate,
+                        loanCharge.amount(), null, loanCharge.amount(), null, 
externalIdFactory.create());
+                LoanTransaction savedLoanTransaction = 
loanTransactionRepository.saveAndFlush(loanTransaction);
+                businessEventNotifierService.notifyPostBusinessEvent(new 
LoanAccrualTransactionCreatedBusinessEvent(savedLoanTransaction));
             }
         }
 

Reply via email to