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