Fineract-1646 (#2440)
* FINERACT 1646 * updated the order of import Co-authored-by: Manoj <56669674+fynmanoj@users.noreply.github.com>
This commit is contained in:
+37
-15
@@ -21,10 +21,10 @@ package org.apache.fineract.portfolio.savings.service;
|
|||||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.sql.Date;
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@@ -248,8 +248,10 @@ public class SavingsSchedularInterestPoster implements Callable<Void> {
|
|||||||
private void batchUpdate(final List<SavingsAccountData> savingsAccountDataList) throws DataAccessException {
|
private void batchUpdate(final List<SavingsAccountData> savingsAccountDataList) throws DataAccessException {
|
||||||
String queryForSavingsUpdate = batchQueryForSavingsSummaryUpdate();
|
String queryForSavingsUpdate = batchQueryForSavingsSummaryUpdate();
|
||||||
String queryForTransactionInsertion = batchQueryForTransactionInsertion();
|
String queryForTransactionInsertion = batchQueryForTransactionInsertion();
|
||||||
|
String queryForTransactionUpdate = batchQueryForTransactionsUpdate();
|
||||||
List<Object[]> paramsForTransactionInsertion = new ArrayList<>();
|
List<Object[]> paramsForTransactionInsertion = new ArrayList<>();
|
||||||
List<Object[]> paramsForSavingsSummary = new ArrayList<>();
|
List<Object[]> paramsForSavingsSummary = new ArrayList<>();
|
||||||
|
List<Object[]> paramsForTransactionUpdate = new ArrayList<>();
|
||||||
List<String> transRefNo = new ArrayList<>();
|
List<String> transRefNo = new ArrayList<>();
|
||||||
for (SavingsAccountData savingsAccountData : savingsAccountDataList) {
|
for (SavingsAccountData savingsAccountData : savingsAccountDataList) {
|
||||||
SavingsAccountSummaryData savingsAccountSummaryData = savingsAccountData.getSummary();
|
SavingsAccountSummaryData savingsAccountSummaryData = savingsAccountData.getSummary();
|
||||||
@@ -269,22 +271,29 @@ public class SavingsSchedularInterestPoster implements Callable<Void> {
|
|||||||
savingsAccountData.getId() });
|
savingsAccountData.getId() });
|
||||||
List<SavingsAccountTransactionData> savingsAccountTransactionDataList = savingsAccountData.getSavingsAccountTransactionData();
|
List<SavingsAccountTransactionData> savingsAccountTransactionDataList = savingsAccountData.getSavingsAccountTransactionData();
|
||||||
for (SavingsAccountTransactionData savingsAccountTransactionData : savingsAccountTransactionDataList) {
|
for (SavingsAccountTransactionData savingsAccountTransactionData : savingsAccountTransactionDataList) {
|
||||||
|
Date balanceEndDate = null;
|
||||||
|
if (savingsAccountTransactionData.getBalanceEndDate() != null) {
|
||||||
|
balanceEndDate = Date.from(savingsAccountTransactionData.getBalanceEndDate()
|
||||||
|
.atStartOfDay(DateUtils.getDateTimeZoneOfTenant()).toInstant());
|
||||||
|
}
|
||||||
if (savingsAccountTransactionData.getId() == null) {
|
if (savingsAccountTransactionData.getId() == null) {
|
||||||
UUID uuid = UUID.randomUUID();
|
UUID uuid = UUID.randomUUID();
|
||||||
savingsAccountTransactionData.setRefNo(uuid.toString());
|
savingsAccountTransactionData.setRefNo(uuid.toString());
|
||||||
transRefNo.add(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(),
|
paramsForTransactionInsertion.add(new Object[] { savingsAccountData.getId(), savingsAccountData.getOfficeId(),
|
||||||
savingsAccountTransactionData.getTransactionType().getId(), savingsAccountTransactionData.getTransactionDate(),
|
savingsAccountTransactionData.isReversed(), savingsAccountTransactionData.getTransactionType().getId(),
|
||||||
savingsAccountTransactionData.getAmount(), balanceEndDate,
|
savingsAccountTransactionData.getTransactionDate(), savingsAccountTransactionData.getAmount(), balanceEndDate,
|
||||||
savingsAccountTransactionData.getBalanceNumberOfDays(), savingsAccountTransactionData.getRunningBalance(),
|
savingsAccountTransactionData.getBalanceNumberOfDays(), savingsAccountTransactionData.getRunningBalance(),
|
||||||
savingsAccountTransactionData.getCumulativeBalance(), savingsAccountTransactionData.getSubmittedOnDate(),
|
savingsAccountTransactionData.getCumulativeBalance(), savingsAccountTransactionData.getSubmittedOnDate(),
|
||||||
Integer.valueOf(1), savingsAccountTransactionData.isManualTransaction(),
|
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);
|
savingsAccountData.setUpdatedTransactions(savingsAccountTransactionDataList);
|
||||||
@@ -293,6 +302,7 @@ public class SavingsSchedularInterestPoster implements Callable<Void> {
|
|||||||
if (transRefNo.size() > 0) {
|
if (transRefNo.size() > 0) {
|
||||||
this.jdbcTemplate.batchUpdate(queryForSavingsUpdate, paramsForSavingsSummary);
|
this.jdbcTemplate.batchUpdate(queryForSavingsUpdate, paramsForSavingsSummary);
|
||||||
this.jdbcTemplate.batchUpdate(queryForTransactionInsertion, paramsForTransactionInsertion);
|
this.jdbcTemplate.batchUpdate(queryForTransactionInsertion, paramsForTransactionInsertion);
|
||||||
|
this.jdbcTemplate.batchUpdate(queryForTransactionUpdate, paramsForTransactionUpdate);
|
||||||
LOG.info("`Total No Of Interest Posting:` {}", transRefNo.size());
|
LOG.info("`Total No Of Interest Posting:` {}", transRefNo.size());
|
||||||
List<SavingsAccountTransactionData> savingsAccountTransactionDataList = fetchTransactionsFromIds(transRefNo);
|
List<SavingsAccountTransactionData> savingsAccountTransactionDataList = fetchTransactionsFromIds(transRefNo);
|
||||||
if (savingsAccountDataList != null) {
|
if (savingsAccountDataList != null) {
|
||||||
@@ -311,11 +321,12 @@ public class SavingsSchedularInterestPoster implements Callable<Void> {
|
|||||||
|
|
||||||
private String batchQueryForTransactionInsertion() {
|
private String batchQueryForTransactionInsertion() {
|
||||||
StringBuilder query = new StringBuilder(100);
|
StringBuilder query = new StringBuilder(100);
|
||||||
query.append("INSERT INTO m_savings_account_transaction (savings_account_id, office_id, is_reversed,");
|
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("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("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("created_date, appuser_id, is_manual, ref_no, is_reversal, ");
|
||||||
query.append("(?, ?, false, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, false, ?)");
|
query.append("overdraft_amount_derived) VALUES ");
|
||||||
|
query.append("(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||||
return query.toString();
|
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_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("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("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();
|
return query.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+25
@@ -113,6 +113,31 @@ public class SavingsInterestPostingJobIntegrationTest {
|
|||||||
assertEquals(0, journalEntries.size());
|
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
|
@Test
|
||||||
public void testSavingsDailyInterestPostingJob() {
|
public void testSavingsDailyInterestPostingJob() {
|
||||||
// client activation, savings activation and 1st transaction date
|
// client activation, savings activation and 1st transaction date
|
||||||
|
|||||||
Reference in New Issue
Block a user