You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by ma...@apache.org on 2022/07/22 19:37:47 UTC

[fineract] branch develop updated: Fineract-1646 (#2440)

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 <10...@users.noreply.github.com>
AuthorDate: Sat Jul 23 01:07:42 2022 +0530

    Fineract-1646 (#2440)
    
    * FINERACT 1646
    
    * updated the order of import
    
    Co-authored-by: Manoj <56...@users.noreply.github.com>
---
 .../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