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

manojvm 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 019cdab43 Fineract-1646 (#2440)
019cdab43 is described below

commit 019cdab4349b75981752f0af93fbb188cbe2801e
Author: Apurb Rajdhan <[email protected]>
AuthorDate: Sat Jul 23 01:07:42 2022 +0530

    Fineract-1646 (#2440)
    
    * FINERACT 1646
    
    * updated the order of import
    
    Co-authored-by: Manoj <[email protected]>
---
 .../service/SavingsSchedularInterestPoster.java    | 52 +++++++++++++++-------
 .../SavingsInterestPostingJobIntegrationTest.java  | 25 +++++++++++
 2 files changed, 62 insertions(+), 15 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularInterestPoster.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularInterestPoster.java
index 57c6797d6..79d5e012a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularInterestPoster.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsSchedularInterestPoster.java
@@ -21,10 +21,10 @@ package org.apache.fineract.portfolio.savings.service;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.math.BigDecimal;
 import java.security.SecureRandom;
-import java.sql.Date;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.UUID;
@@ -248,8 +248,10 @@ public class SavingsSchedularInterestPoster implements 
Callable<Void> {
     private void batchUpdate(final List<SavingsAccountData> 
savingsAccountDataList) throws DataAccessException {
         String queryForSavingsUpdate = batchQueryForSavingsSummaryUpdate();
         String queryForTransactionInsertion = 
batchQueryForTransactionInsertion();
+        String queryForTransactionUpdate = batchQueryForTransactionsUpdate();
         List<Object[]> paramsForTransactionInsertion = new ArrayList<>();
         List<Object[]> paramsForSavingsSummary = new ArrayList<>();
+        List<Object[]> paramsForTransactionUpdate = new ArrayList<>();
         List<String> transRefNo = new ArrayList<>();
         for (SavingsAccountData savingsAccountData : savingsAccountDataList) {
             SavingsAccountSummaryData savingsAccountSummaryData = 
savingsAccountData.getSummary();
@@ -269,22 +271,29 @@ public class SavingsSchedularInterestPoster implements 
Callable<Void> {
                     savingsAccountData.getId() });
             List<SavingsAccountTransactionData> 
savingsAccountTransactionDataList = 
savingsAccountData.getSavingsAccountTransactionData();
             for (SavingsAccountTransactionData savingsAccountTransactionData : 
savingsAccountTransactionDataList) {
+                Date balanceEndDate = null;
+                if (savingsAccountTransactionData.getBalanceEndDate() != null) 
{
+                    balanceEndDate = 
Date.from(savingsAccountTransactionData.getBalanceEndDate()
+                            
.atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant());
+                }
                 if (savingsAccountTransactionData.getId() == null) {
                     UUID uuid = UUID.randomUUID();
                     savingsAccountTransactionData.setRefNo(uuid.toString());
                     transRefNo.add(uuid.toString());
-                    java.util.Date balanceEndDate = null;
-                    if (savingsAccountTransactionData.getBalanceEndDate() != 
null) {
-                        balanceEndDate = 
Date.from(savingsAccountTransactionData.getBalanceEndDate()
-                                
.atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant());
-                    }
                     paramsForTransactionInsertion.add(new Object[] { 
savingsAccountData.getId(), savingsAccountData.getOfficeId(),
-                            
savingsAccountTransactionData.getTransactionType().getId(), 
savingsAccountTransactionData.getTransactionDate(),
-                            savingsAccountTransactionData.getAmount(), 
balanceEndDate,
+                            savingsAccountTransactionData.isReversed(), 
savingsAccountTransactionData.getTransactionType().getId(),
+                            
savingsAccountTransactionData.getTransactionDate(), 
savingsAccountTransactionData.getAmount(), balanceEndDate,
                             
savingsAccountTransactionData.getBalanceNumberOfDays(), 
savingsAccountTransactionData.getRunningBalance(),
                             
savingsAccountTransactionData.getCumulativeBalance(), 
savingsAccountTransactionData.getSubmittedOnDate(),
                             Integer.valueOf(1), 
savingsAccountTransactionData.isManualTransaction(),
-                            savingsAccountTransactionData.getRefNo() });
+                            savingsAccountTransactionData.getRefNo(), 
savingsAccountTransactionData.isReversalTransaction(),
+                            
savingsAccountTransactionData.getOverdraftAmount(), });
+                } else {
+                    paramsForTransactionUpdate.add(new Object[] { 
savingsAccountTransactionData.isReversed(),
+                            savingsAccountTransactionData.getAmount(), 
savingsAccountTransactionData.getOverdraftAmount(), balanceEndDate,
+                            
savingsAccountTransactionData.getBalanceNumberOfDays(), 
savingsAccountTransactionData.getRunningBalance(),
+                            
savingsAccountTransactionData.getCumulativeBalance(), 
savingsAccountTransactionData.isReversalTransaction(),
+                            savingsAccountTransactionData.getId() });
                 }
             }
             
savingsAccountData.setUpdatedTransactions(savingsAccountTransactionDataList);
@@ -293,6 +302,7 @@ public class SavingsSchedularInterestPoster implements 
Callable<Void> {
         if (transRefNo.size() > 0) {
             this.jdbcTemplate.batchUpdate(queryForSavingsUpdate, 
paramsForSavingsSummary);
             this.jdbcTemplate.batchUpdate(queryForTransactionInsertion, 
paramsForTransactionInsertion);
+            this.jdbcTemplate.batchUpdate(queryForTransactionUpdate, 
paramsForTransactionUpdate);
             LOG.info("`Total No Of Interest Posting:` {}", transRefNo.size());
             List<SavingsAccountTransactionData> 
savingsAccountTransactionDataList = fetchTransactionsFromIds(transRefNo);
             if (savingsAccountDataList != null) {
@@ -311,11 +321,12 @@ public class SavingsSchedularInterestPoster implements 
Callable<Void> {
 
     private String batchQueryForTransactionInsertion() {
         StringBuilder query = new StringBuilder(100);
-        query.append("INSERT INTO m_savings_account_transaction 
(savings_account_id, office_id, is_reversed,");
-        query.append("transaction_type_enum, transaction_date, amount, 
balance_end_date_derived,");
-        query.append("balance_number_of_days_derived, running_balance_derived, 
cumulative_balance_derived,");
-        query.append("created_date, appuser_id, is_manual, 
is_loan_disbursement, ref_no) VALUES ");
-        query.append("(?, ?, false, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, false, ?)");
+        query.append("INSERT INTO m_savings_account_transaction 
(savings_account_id, office_id, is_reversed, ");
+        query.append("transaction_type_enum, transaction_date, amount, 
balance_end_date_derived, ");
+        query.append("balance_number_of_days_derived, running_balance_derived, 
cumulative_balance_derived, ");
+        query.append("created_date, appuser_id, is_manual, ref_no, 
is_reversal, ");
+        query.append("overdraft_amount_derived) VALUES ");
+        query.append("(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
         return query.toString();
 
     }
@@ -326,7 +337,18 @@ public class SavingsSchedularInterestPoster implements 
Callable<Void> {
         query.append("total_interest_earned_derived=?, 
total_interest_posted_derived=?, total_withdrawal_fees_derived=?, ");
         query.append("total_fees_charge_derived=?, 
total_penalty_charge_derived=?, total_annual_fees_derived=?, ");
         query.append("account_balance_derived=?, 
total_overdraft_interest_derived=?, total_withhold_tax_derived=?, ");
-        query.append("last_interest_calculation_date=?, 
interest_posted_till_date=? where id=?");
+        query.append("last_interest_calculation_date=?, 
interest_posted_till_date=? where id=? ");
+        return query.toString();
+    }
+
+    private String batchQueryForTransactionsUpdate() {
+        StringBuilder query = new StringBuilder(100);
+        query.append("UPDATE m_savings_account_transaction ");
+        query.append("SET is_reversed=?, ");
+        query.append("amount=?, overdraft_amount_derived=?, 
balance_end_date_derived=?, ");
+        query.append("balance_number_of_days_derived=?, 
running_balance_derived=?, cumulative_balance_derived=?, ");
+        query.append("is_reversal=? ");
+        query.append("WHERE id=?");
         return query.toString();
     }
 }
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsInterestPostingJobIntegrationTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsInterestPostingJobIntegrationTest.java
index a5667f19f..3bd89a308 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsInterestPostingJobIntegrationTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsInterestPostingJobIntegrationTest.java
@@ -113,6 +113,31 @@ public class SavingsInterestPostingJobIntegrationTest {
         assertEquals(0, journalEntries.size());
     }
 
+    @Test
+    public void testDuplicateOverdraftInterestPostingJob() {
+        // client activation, savings activation and 1st transaction date
+        final String startDate = "01 July 2022";
+        final String jobName = "Post Interest For Savings";
+        final Integer clientID = ClientHelper.createClient(this.requestSpec, 
this.responseSpec, startDate);
+        Assertions.assertNotNull(clientID);
+
+        final Integer savingsId = 
createSavingsAccountDailyPostingOverdraft(clientID, startDate);
+
+        this.savingsAccountHelper.withdrawalFromSavingsAccount(savingsId, 
"1000", startDate, CommonConstants.RESPONSE_RESOURCE_ID);
+
+        this.scheduleJobHelper.executeAndAwaitJob(jobName);
+        this.savingsAccountHelper.withdrawalFromSavingsAccount(savingsId, 
"1000", startDate, CommonConstants.RESPONSE_RESOURCE_ID);
+        Object transactionObj = 
this.savingsAccountHelper.getSavingsDetails(savingsId, "transactions");
+        ArrayList<HashMap<String, Object>> transactions = 
(ArrayList<HashMap<String, Object>>) transactionObj;
+        Integer dateCount = 0;
+        for (HashMap<String, Object> transaction : transactions) {
+            if (transaction.get("date").toString().equals("[2022, 7, 10]") && 
transaction.get("reversed").toString().equals("false")) {
+                dateCount++;
+            }
+        }
+        assertEquals(1, dateCount, "No Duplicate Overdraft Interest Posting");
+    }
+
     @Test
     public void testSavingsDailyInterestPostingJob() {
         // client activation, savings activation and 1st transaction date

Reply via email to