This is an automated email from the ASF dual-hosted git repository.
arnold 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 5d71ffd4ea FINERACT-2326: Use exact business date during savings
account accrual tests
5d71ffd4ea is described below
commit 5d71ffd4ea1a5846bdd3a783d8ced334dde6503b
Author: Adam Saghy <[email protected]>
AuthorDate: Sun Aug 24 21:20:38 2025 +0200
FINERACT-2326: Use exact business date during savings account accrual tests
---
.../SavingsAccrualAccountingIntegrationTest.java | 283 +++++++++++----------
.../SavingsAccrualIntegrationTest.java | 128 +++++-----
2 files changed, 213 insertions(+), 198 deletions(-)
diff --git
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsAccrualAccountingIntegrationTest.java
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsAccrualAccountingIntegrationTest.java
index abb74913c5..2ba3dcc25b 100644
---
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsAccrualAccountingIntegrationTest.java
+++
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsAccrualAccountingIntegrationTest.java
@@ -18,6 +18,8 @@
*/
package org.apache.fineract.integrationtests;
+import static
org.apache.fineract.integrationtests.common.BusinessDateHelper.runAt;
+
import io.restassured.builder.RequestSpecBuilder;
import io.restassured.builder.ResponseSpecBuilder;
import io.restassured.http.ContentType;
@@ -72,155 +74,162 @@ public class SavingsAccrualAccountingIntegrationTest {
@Test
public void testPositiveAccrualPostsCorrectJournalEntries() {
- // --- ARRANGE ---
- LOG.info("------------------------- INITIATING POSITIVE ACCRUAL
ACCOUNTING TEST -------------------------");
- final int daysToSubtract = 10;
- final String amount = "10000";
-
- final Account savingsReferenceAccount =
this.accountHelper.createAssetAccount("Savings Reference");
- final Account interestOnSavingsAccount =
this.accountHelper.createExpenseAccount("Interest on Savings (Expense)");
- final Account savingsControlAccount =
this.accountHelper.createLiabilityAccount("Savings Control");
- final Account interestPayableAccount =
this.accountHelper.createLiabilityAccount("Interest Payable (Liability)");
- final Account incomeFromFeesAccount =
this.accountHelper.createIncomeAccount("Income from Fees");
- final Account[] accountList = { savingsReferenceAccount,
savingsControlAccount, interestOnSavingsAccount, interestPayableAccount,
- incomeFromFeesAccount };
-
- final SavingsProductHelper productHelper = new
SavingsProductHelper().withNominalAnnualInterestRate(new BigDecimal("10.0"))
- .withAccountingRuleAsAccrualBased(accountList)
-
.withSavingsReferenceAccountId(savingsReferenceAccount.getAccountID().toString())
-
.withSavingsControlAccountId(savingsControlAccount.getAccountID().toString())
-
.withInterestOnSavingsAccountId(interestOnSavingsAccount.getAccountID().toString())
-
.withInterestPayableAccountId(interestPayableAccount.getAccountID().toString())
-
.withIncomeFromFeeAccountId(incomeFromFeesAccount.getAccountID().toString());
-
- final Integer savingsProductId =
SavingsProductHelper.createSavingsProduct(productHelper.build(),
this.requestSpec,
- this.responseSpec);
- Assertions.assertNotNull(savingsProductId, "Failed to create savings
product.");
-
- final Integer clientId = ClientHelper.createClient(this.requestSpec,
this.responseSpec, "01 January 2020");
- final LocalDate startDate =
LocalDate.now(Utils.getZoneIdOfTenant()).minusDays(daysToSubtract);
- final String startDateString = DateTimeFormatter.ofPattern("dd MMMM
yyyy", Locale.US).format(startDate);
- final Integer savingsAccountId =
this.savingsAccountHelper.applyForSavingsApplicationOnDate(clientId,
savingsProductId,
- SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL, startDateString);
- this.savingsAccountHelper.approveSavingsOnDate(savingsAccountId,
startDateString);
- this.savingsAccountHelper.activateSavings(savingsAccountId,
startDateString);
- this.savingsAccountHelper.depositToSavingsAccount(savingsAccountId,
amount, startDateString, CommonConstants.RESPONSE_RESOURCE_ID);
-
- // --- ACT ---
- schedulerJobHelper.executeAndAwaitJob("Add Accrual Transactions For
Savings");
-
- // --- ASSERT ---
- List<HashMap> accrualTransactions =
getAccrualTransactions(savingsAccountId);
- Assertions.assertFalse(accrualTransactions.isEmpty(), "No accrual
transactions were found.");
-
- Number firstTransactionIdNumber = (Number)
accrualTransactions.get(0).get("id");
- ArrayList<HashMap> journalEntries =
journalEntryHelper.getJournalEntriesByTransactionId("S" +
firstTransactionIdNumber.intValue());
- Assertions.assertFalse(journalEntries.isEmpty(), "No journal entries
found for positive accrual.");
-
- boolean debitFound = false;
- boolean creditFound = false;
- for (Map<String, Object> entry : journalEntries) {
- String entryType = (String) ((HashMap)
entry.get("entryType")).get("value");
- Integer accountId = ((Number) entry.get("glAccountId")).intValue();
- if ("DEBIT".equals(entryType) &&
accountId.equals(interestOnSavingsAccount.getAccountID())) {
- debitFound = true;
- }
- if ("CREDIT".equals(entryType) &&
accountId.equals(interestPayableAccount.getAccountID())) {
- creditFound = true;
+ runAt("12 August 2021", () -> {
+ // --- ARRANGE ---
+ LOG.info("------------------------- INITIATING POSITIVE ACCRUAL
ACCOUNTING TEST -------------------------");
+ final int daysToSubtract = 10;
+ final String amount = "10000";
+
+ final Account savingsReferenceAccount =
this.accountHelper.createAssetAccount("Savings Reference");
+ final Account interestOnSavingsAccount =
this.accountHelper.createExpenseAccount("Interest on Savings (Expense)");
+ final Account savingsControlAccount =
this.accountHelper.createLiabilityAccount("Savings Control");
+ final Account interestPayableAccount =
this.accountHelper.createLiabilityAccount("Interest Payable (Liability)");
+ final Account incomeFromFeesAccount =
this.accountHelper.createIncomeAccount("Income from Fees");
+ final Account[] accountList = { savingsReferenceAccount,
savingsControlAccount, interestOnSavingsAccount,
+ interestPayableAccount, incomeFromFeesAccount };
+
+ final SavingsProductHelper productHelper = new
SavingsProductHelper().withNominalAnnualInterestRate(new BigDecimal("10.0"))
+ .withAccountingRuleAsAccrualBased(accountList)
+
.withSavingsReferenceAccountId(savingsReferenceAccount.getAccountID().toString())
+
.withSavingsControlAccountId(savingsControlAccount.getAccountID().toString())
+
.withInterestOnSavingsAccountId(interestOnSavingsAccount.getAccountID().toString())
+
.withInterestPayableAccountId(interestPayableAccount.getAccountID().toString())
+
.withIncomeFromFeeAccountId(incomeFromFeesAccount.getAccountID().toString());
+
+ final Integer savingsProductId =
SavingsProductHelper.createSavingsProduct(productHelper.build(),
this.requestSpec,
+ this.responseSpec);
+ Assertions.assertNotNull(savingsProductId, "Failed to create
savings product.");
+
+ final Integer clientId =
ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January
2020");
+ final LocalDate startDate = LocalDate.of(2021, 8,
12).minusDays(daysToSubtract);
+ final String startDateString = DateTimeFormatter.ofPattern("dd
MMMM yyyy", Locale.US).format(startDate);
+ final Integer savingsAccountId =
this.savingsAccountHelper.applyForSavingsApplicationOnDate(clientId,
savingsProductId,
+ SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL,
startDateString);
+ this.savingsAccountHelper.approveSavingsOnDate(savingsAccountId,
startDateString);
+ this.savingsAccountHelper.activateSavings(savingsAccountId,
startDateString);
+
this.savingsAccountHelper.depositToSavingsAccount(savingsAccountId, amount,
startDateString,
+ CommonConstants.RESPONSE_RESOURCE_ID);
+
+ // --- ACT ---
+ schedulerJobHelper.executeAndAwaitJob("Add Accrual Transactions
For Savings");
+
+ // --- ASSERT ---
+ List<HashMap> accrualTransactions =
getAccrualTransactions(savingsAccountId);
+ Assertions.assertFalse(accrualTransactions.isEmpty(), "No accrual
transactions were found.");
+
+ Number firstTransactionIdNumber = (Number)
accrualTransactions.get(0).get("id");
+ ArrayList<HashMap> journalEntries = journalEntryHelper
+ .getJournalEntriesByTransactionId("S" +
firstTransactionIdNumber.intValue());
+ Assertions.assertFalse(journalEntries.isEmpty(), "No journal
entries found for positive accrual.");
+
+ boolean debitFound = false;
+ boolean creditFound = false;
+ for (Map<String, Object> entry : journalEntries) {
+ String entryType = (String) ((HashMap)
entry.get("entryType")).get("value");
+ Integer accountId = ((Number)
entry.get("glAccountId")).intValue();
+ if ("DEBIT".equals(entryType) &&
accountId.equals(interestOnSavingsAccount.getAccountID())) {
+ debitFound = true;
+ }
+ if ("CREDIT".equals(entryType) &&
accountId.equals(interestPayableAccount.getAccountID())) {
+ creditFound = true;
+ }
}
- }
- Assertions.assertTrue(debitFound, "DEBIT to Interest on Savings
(Expense) Account not found for positive accrual.");
- Assertions.assertTrue(creditFound, "CREDIT to Interest Payable
(Liability) Account not found for positive accrual.");
+ Assertions.assertTrue(debitFound, "DEBIT to Interest on Savings
(Expense) Account not found for positive accrual.");
+ Assertions.assertTrue(creditFound, "CREDIT to Interest Payable
(Liability) Account not found for positive accrual.");
- BigDecimal interest = getCalculateAccrualsForDay(productHelper,
amount);
-
- for (HashMap accrual : accrualTransactions) {
- BigDecimal amountAccrualTransaccion = BigDecimal.valueOf((Double)
accrual.get("amount"));
- Assertions.assertEquals(interest, amountAccrualTransaccion);
- }
- LOG.info("VALIDATE AMOUNT AND ACCOUNT");
+ BigDecimal interest = getCalculateAccrualsForDay(productHelper,
amount);
+ for (HashMap accrual : accrualTransactions) {
+ BigDecimal amountAccrualTransaccion =
BigDecimal.valueOf((Double) accrual.get("amount"));
+ Assertions.assertEquals(interest, amountAccrualTransaccion);
+ }
+ LOG.info("VALIDATE AMOUNT AND ACCOUNT");
+ });
}
@Test
public void testNegativeAccrualPostsCorrectJournalEntries() {
- // --- ARRANGE ---
- LOG.info("------------------------- INITIATING NEGATIVE ACCRUAL
(OVERDRAFT) ACCOUNTING TEST -------------------------");
- final int daysToSubtract = 10;
- final String amount = "10000";
-
- final Account savingsReferenceAccount =
this.accountHelper.createAssetAccount("Savings Reference");
- final Account overdraftPortfolioControl =
this.accountHelper.createAssetAccount("Overdraft Portfolio");
- final Account interestReceivableAccount =
this.accountHelper.createAssetAccount("Interest Receivable (Asset)");
- final Account savingsControlAccount =
this.accountHelper.createLiabilityAccount("Savings Control");
- final Account interestPayableAccount =
this.accountHelper.createLiabilityAccount("Interest Payable");
- final Account overdraftInterestIncomeAccount =
this.accountHelper.createIncomeAccount("Overdraft Interest Income");
- final Account expenseAccount =
this.accountHelper.createExpenseAccount("Interest on Savings (Expense)");
-
- final Account[] accountList = { savingsReferenceAccount,
savingsControlAccount, expenseAccount, overdraftInterestIncomeAccount };
-
- final String overdraftLimit = "10000";
- final String overdraftInterestRate = "21.0";
- final SavingsProductHelper productHelper = new SavingsProductHelper()
- .withNominalAnnualInterestRate(new
BigDecimal(overdraftInterestRate)).withAccountingRuleAsAccrualBased(accountList)
- .withOverDraftRate(overdraftLimit, overdraftInterestRate)
-
.withSavingsReferenceAccountId(savingsReferenceAccount.getAccountID().toString())
-
.withSavingsControlAccountId(savingsControlAccount.getAccountID().toString())
-
.withInterestReceivableAccountId(interestReceivableAccount.getAccountID().toString())
-
.withIncomeFromInterestId(overdraftInterestIncomeAccount.getAccountID().toString())
-
.withInterestPayableAccountId(interestPayableAccount.getAccountID().toString())
-
.withInterestOnSavingsAccountId(expenseAccount.getAccountID().toString())
-
.withOverdraftPortfolioControlId(overdraftPortfolioControl.getAccountID().toString());
-
- final Integer savingsProductId =
SavingsProductHelper.createSavingsProduct(productHelper.build(),
this.requestSpec,
- this.responseSpec);
- Assertions.assertNotNull(savingsProductId, "Savings product with
overdraft creation failed.");
-
- final Integer clientId = ClientHelper.createClient(this.requestSpec,
this.responseSpec, "01 January 2020");
- final LocalDate startDate =
LocalDate.now(Utils.getZoneIdOfTenant()).minusDays(daysToSubtract);
- final String startDateString = DateTimeFormatter.ofPattern("dd MMMM
yyyy", Locale.US).format(startDate);
- final Integer savingsAccountId =
this.savingsAccountHelper.applyForSavingsApplicationOnDate(clientId,
savingsProductId,
- SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL, startDateString);
- this.savingsAccountHelper.approveSavingsOnDate(savingsAccountId,
startDateString);
- this.savingsAccountHelper.activateSavings(savingsAccountId,
startDateString);
-
this.savingsAccountHelper.withdrawalFromSavingsAccount(savingsAccountId,
"10000", startDateString,
- CommonConstants.RESPONSE_RESOURCE_ID);
-
- // --- ACT ---
- schedulerJobHelper.executeAndAwaitJob("Add Accrual Transactions For
Savings");
-
- // --- ASSERT ---
- List<HashMap> accrualTransactions =
getAccrualTransactions(savingsAccountId);
- Assertions.assertFalse(accrualTransactions.isEmpty(), "No accrual
transactions were found for overdraft.");
-
- Number firstTransactionIdNumber = (Number)
accrualTransactions.get(0).get("id");
- ArrayList<HashMap> journalEntries =
journalEntryHelper.getJournalEntriesByTransactionId("S" +
firstTransactionIdNumber.intValue());
- Assertions.assertFalse(journalEntries.isEmpty(), "No journal entries
found for negative accrual.");
-
- boolean debitFound = false;
- boolean creditFound = false;
- for (Map<String, Object> entry : journalEntries) {
- String entryType = (String) ((HashMap)
entry.get("entryType")).get("value");
- Integer accountId = ((Number) entry.get("glAccountId")).intValue();
- if ("DEBIT".equals(entryType) &&
accountId.equals(interestReceivableAccount.getAccountID())) {
- debitFound = true;
- }
- if ("CREDIT".equals(entryType) &&
accountId.equals(overdraftInterestIncomeAccount.getAccountID())) {
- creditFound = true;
+ runAt("12 August 2021", () -> {
+ // --- ARRANGE ---
+ LOG.info("------------------------- INITIATING NEGATIVE ACCRUAL
(OVERDRAFT) ACCOUNTING TEST -------------------------");
+ final int daysToSubtract = 10;
+ final String amount = "10000";
+
+ final Account savingsReferenceAccount =
this.accountHelper.createAssetAccount("Savings Reference");
+ final Account overdraftPortfolioControl =
this.accountHelper.createAssetAccount("Overdraft Portfolio");
+ final Account interestReceivableAccount =
this.accountHelper.createAssetAccount("Interest Receivable (Asset)");
+ final Account savingsControlAccount =
this.accountHelper.createLiabilityAccount("Savings Control");
+ final Account interestPayableAccount =
this.accountHelper.createLiabilityAccount("Interest Payable");
+ final Account overdraftInterestIncomeAccount =
this.accountHelper.createIncomeAccount("Overdraft Interest Income");
+ final Account expenseAccount =
this.accountHelper.createExpenseAccount("Interest on Savings (Expense)");
+
+ final Account[] accountList = { savingsReferenceAccount,
savingsControlAccount, expenseAccount,
+ overdraftInterestIncomeAccount };
+
+ final String overdraftLimit = "10000";
+ final String overdraftInterestRate = "21.0";
+ final SavingsProductHelper productHelper = new
SavingsProductHelper()
+ .withNominalAnnualInterestRate(new
BigDecimal(overdraftInterestRate)).withAccountingRuleAsAccrualBased(accountList)
+ .withOverDraftRate(overdraftLimit, overdraftInterestRate)
+
.withSavingsReferenceAccountId(savingsReferenceAccount.getAccountID().toString())
+
.withSavingsControlAccountId(savingsControlAccount.getAccountID().toString())
+
.withInterestReceivableAccountId(interestReceivableAccount.getAccountID().toString())
+
.withIncomeFromInterestId(overdraftInterestIncomeAccount.getAccountID().toString())
+
.withInterestPayableAccountId(interestPayableAccount.getAccountID().toString())
+
.withInterestOnSavingsAccountId(expenseAccount.getAccountID().toString())
+
.withOverdraftPortfolioControlId(overdraftPortfolioControl.getAccountID().toString());
+
+ final Integer savingsProductId =
SavingsProductHelper.createSavingsProduct(productHelper.build(),
this.requestSpec,
+ this.responseSpec);
+ Assertions.assertNotNull(savingsProductId, "Savings product with
overdraft creation failed.");
+
+ final Integer clientId =
ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January
2020");
+ final LocalDate startDate = LocalDate.of(2021, 8,
12).minusDays(daysToSubtract);
+ final String startDateString = DateTimeFormatter.ofPattern("dd
MMMM yyyy", Locale.US).format(startDate);
+ final Integer savingsAccountId =
this.savingsAccountHelper.applyForSavingsApplicationOnDate(clientId,
savingsProductId,
+ SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL,
startDateString);
+ this.savingsAccountHelper.approveSavingsOnDate(savingsAccountId,
startDateString);
+ this.savingsAccountHelper.activateSavings(savingsAccountId,
startDateString);
+
this.savingsAccountHelper.withdrawalFromSavingsAccount(savingsAccountId,
"10000", startDateString,
+ CommonConstants.RESPONSE_RESOURCE_ID);
+
+ // --- ACT ---
+ schedulerJobHelper.executeAndAwaitJob("Add Accrual Transactions
For Savings");
+
+ // --- ASSERT ---
+ List<HashMap> accrualTransactions =
getAccrualTransactions(savingsAccountId);
+ Assertions.assertFalse(accrualTransactions.isEmpty(), "No accrual
transactions were found for overdraft.");
+
+ Number firstTransactionIdNumber = (Number)
accrualTransactions.get(0).get("id");
+ ArrayList<HashMap> journalEntries = journalEntryHelper
+ .getJournalEntriesByTransactionId("S" +
firstTransactionIdNumber.intValue());
+ Assertions.assertFalse(journalEntries.isEmpty(), "No journal
entries found for negative accrual.");
+
+ boolean debitFound = false;
+ boolean creditFound = false;
+ for (Map<String, Object> entry : journalEntries) {
+ String entryType = (String) ((HashMap)
entry.get("entryType")).get("value");
+ Integer accountId = ((Number)
entry.get("glAccountId")).intValue();
+ if ("DEBIT".equals(entryType) &&
accountId.equals(interestReceivableAccount.getAccountID())) {
+ debitFound = true;
+ }
+ if ("CREDIT".equals(entryType) &&
accountId.equals(overdraftInterestIncomeAccount.getAccountID())) {
+ creditFound = true;
+ }
}
- }
- Assertions.assertTrue(debitFound, "DEBIT to Interest Receivable
(Asset) Account not found for negative accrual.");
- Assertions.assertTrue(creditFound, "CREDIT to Overdraft Interest
Income Account not found for negative accrual.");
+ Assertions.assertTrue(debitFound, "DEBIT to Interest Receivable
(Asset) Account not found for negative accrual.");
+ Assertions.assertTrue(creditFound, "CREDIT to Overdraft Interest
Income Account not found for negative accrual.");
- BigDecimal interest = getCalculateAccrualsForDay(productHelper,
amount);
+ BigDecimal interest = getCalculateAccrualsForDay(productHelper,
amount);
- for (HashMap accrual : accrualTransactions) {
- BigDecimal amountAccrualTransaccion = BigDecimal.valueOf((Double)
accrual.get("amount"));
- Assertions.assertEquals(interest, amountAccrualTransaccion);
- }
- LOG.info("VALIDATE AMOUNT AND ACCOUNT");
+ for (HashMap accrual : accrualTransactions) {
+ BigDecimal amountAccrualTransaccion =
BigDecimal.valueOf((Double) accrual.get("amount"));
+ Assertions.assertEquals(interest, amountAccrualTransaccion);
+ }
+ LOG.info("VALIDATE AMOUNT AND ACCOUNT");
+ });
}
private List<HashMap> getAccrualTransactions(Integer savingsAccountId) {
diff --git
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsAccrualIntegrationTest.java
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsAccrualIntegrationTest.java
index 6dd1d04ab0..af4ab8ba01 100644
---
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsAccrualIntegrationTest.java
+++
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/SavingsAccrualIntegrationTest.java
@@ -18,6 +18,8 @@
*/
package org.apache.fineract.integrationtests;
+import static
org.apache.fineract.integrationtests.common.BusinessDateHelper.runAt;
+
import io.restassured.builder.RequestSpecBuilder;
import io.restassured.builder.ResponseSpecBuilder;
import io.restassured.http.ContentType;
@@ -73,73 +75,77 @@ public class SavingsAccrualIntegrationTest {
@Test
public void testAccrualsAreGeneratedForTenDayPeriod() {
- // --- ARRANGE ---
-
- final Account assetAccount = this.accountHelper.createAssetAccount();
- final Account liabilityAccount =
this.accountHelper.createLiabilityAccount();
- final Account incomeAccount = this.accountHelper.createIncomeAccount();
- final Account expenseAccount =
this.accountHelper.createExpenseAccount();
- final String interestRate = "10.0";
- final int daysToTest = 10;
-
- final SavingsProductHelper productHelper = new
SavingsProductHelper().withInterestCompoundingPeriodTypeAsDaily()
-
.withInterestPostingPeriodTypeAsMonthly().withInterestCalculationPeriodTypeAsDailyBalance()
- .withNominalAnnualInterestRate(new BigDecimal(interestRate))
- .withAccountingRuleAsAccrualBased(new Account[] {
assetAccount, liabilityAccount, incomeAccount, expenseAccount });
-
- final Integer savingsProductId =
SavingsProductHelper.createSavingsProduct(productHelper.build(),
this.requestSpec,
- this.responseSpec);
- Assertions.assertNotNull(savingsProductId, "Error creating savings
product.");
-
- final Integer clientId = ClientHelper.createClient(this.requestSpec,
this.responseSpec, "01 January 2020");
- Assertions.assertNotNull(clientId, "Error creating client.");
-
- final LocalDate startDate =
LocalDate.now(Utils.getZoneIdOfTenant()).minusDays(daysToTest);
- final String startDateString = DateTimeFormatter.ofPattern("dd MMMM
yyyy", Locale.US).format(startDate);
-
- final Integer savingsAccountId =
this.savingsAccountHelper.applyForSavingsApplicationOnDate(clientId,
savingsProductId,
- SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL, startDateString);
- Assertions.assertNotNull(savingsAccountId, "Error applying for savings
account.");
-
- this.savingsAccountHelper.approveSavingsOnDate(savingsAccountId,
startDateString);
- this.savingsAccountHelper.activateSavings(savingsAccountId,
startDateString);
-
- final HashMap<String, Object> savingsStatus =
SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec,
- savingsAccountId);
- SavingsStatusChecker.verifySavingsIsActive(savingsStatus);
-
- this.savingsAccountHelper.depositToSavingsAccount(savingsAccountId,
"10000", startDateString, CommonConstants.RESPONSE_RESOURCE_ID);
-
- // --- ACT ---
- schedulerJobHelper.executeAndAwaitJob("Add Accrual Transactions For
Savings");
-
- // --- ASSERT ---
- List<HashMap> allTransactions =
savingsAccountHelper.getSavingsTransactions(savingsAccountId);
- List<HashMap> accrualTransactions = new ArrayList<>();
- for (HashMap transaction : allTransactions) {
- Map<String, Object> type = (Map<String, Object>)
transaction.get("transactionType");
- if (type != null && Boolean.TRUE.equals(type.get("accrual"))) {
- accrualTransactions.add(transaction);
+ runAt("12 August 2021", () -> {
+ // --- ARRANGE ---
+
+ final Account assetAccount =
this.accountHelper.createAssetAccount();
+ final Account liabilityAccount =
this.accountHelper.createLiabilityAccount();
+ final Account incomeAccount =
this.accountHelper.createIncomeAccount();
+ final Account expenseAccount =
this.accountHelper.createExpenseAccount();
+ final String interestRate = "10.0";
+ final int daysToTest = 10;
+
+ final SavingsProductHelper productHelper = new
SavingsProductHelper().withInterestCompoundingPeriodTypeAsDaily()
+
.withInterestPostingPeriodTypeAsMonthly().withInterestCalculationPeriodTypeAsDailyBalance()
+ .withNominalAnnualInterestRate(new
BigDecimal(interestRate))
+ .withAccountingRuleAsAccrualBased(new Account[] {
assetAccount, liabilityAccount, incomeAccount, expenseAccount });
+
+ final Integer savingsProductId =
SavingsProductHelper.createSavingsProduct(productHelper.build(),
this.requestSpec,
+ this.responseSpec);
+ Assertions.assertNotNull(savingsProductId, "Error creating savings
product.");
+
+ final Integer clientId =
ClientHelper.createClient(this.requestSpec, this.responseSpec, "01 January
2020");
+ Assertions.assertNotNull(clientId, "Error creating client.");
+
+ final LocalDate startDate = LocalDate.of(2021, 8,
12).minusDays(daysToTest);
+ final String startDateString = DateTimeFormatter.ofPattern("dd
MMMM yyyy", Locale.US).format(startDate);
+
+ final Integer savingsAccountId =
this.savingsAccountHelper.applyForSavingsApplicationOnDate(clientId,
savingsProductId,
+ SavingsAccountHelper.ACCOUNT_TYPE_INDIVIDUAL,
startDateString);
+ Assertions.assertNotNull(savingsAccountId, "Error applying for
savings account.");
+
+ this.savingsAccountHelper.approveSavingsOnDate(savingsAccountId,
startDateString);
+ this.savingsAccountHelper.activateSavings(savingsAccountId,
startDateString);
+
+ final HashMap<String, Object> savingsStatus =
SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec,
+ savingsAccountId);
+ SavingsStatusChecker.verifySavingsIsActive(savingsStatus);
+
+
this.savingsAccountHelper.depositToSavingsAccount(savingsAccountId, "10000",
startDateString,
+ CommonConstants.RESPONSE_RESOURCE_ID);
+
+ // --- ACT ---
+ schedulerJobHelper.executeAndAwaitJob("Add Accrual Transactions
For Savings");
+
+ // --- ASSERT ---
+ List<HashMap> allTransactions =
savingsAccountHelper.getSavingsTransactions(savingsAccountId);
+ List<HashMap> accrualTransactions = new ArrayList<>();
+ for (HashMap transaction : allTransactions) {
+ Map<String, Object> type = (Map<String, Object>)
transaction.get("transactionType");
+ if (type != null && Boolean.TRUE.equals(type.get("accrual"))) {
+ accrualTransactions.add(transaction);
+ }
}
- }
- Assertions.assertFalse(accrualTransactions.isEmpty(), "No accrual
transactions were found.");
+ Assertions.assertFalse(accrualTransactions.isEmpty(), "No accrual
transactions were found.");
- long daysBetween = ChronoUnit.DAYS.between(startDate,
LocalDate.now(Utils.getZoneIdOfTenant()));
- long actualNumberOfTransactions = accrualTransactions.size();
+ long daysBetween = ChronoUnit.DAYS.between(startDate,
LocalDate.of(2021, 8, 12));
+ long actualNumberOfTransactions = accrualTransactions.size();
- Assertions.assertTrue(actualNumberOfTransactions >= daysBetween &&
actualNumberOfTransactions <= daysBetween + 1, "For a period of "
- + daysBetween + " days, a close number of transactions was
expected, but found " + actualNumberOfTransactions);
+ Assertions.assertTrue(actualNumberOfTransactions >= daysBetween &&
actualNumberOfTransactions <= daysBetween + 1,
+ "For a period of " + daysBetween + " days, a close number
of transactions was expected, but found "
+ + actualNumberOfTransactions);
- BigDecimal principal = new BigDecimal("10000");
- BigDecimal rate = new BigDecimal(interestRate).divide(new
BigDecimal(100));
- BigDecimal daysInYear = new BigDecimal("365");
+ BigDecimal principal = new BigDecimal("10000");
+ BigDecimal rate = new BigDecimal(interestRate).divide(new
BigDecimal(100));
+ BigDecimal daysInYear = new BigDecimal("365");
- BigDecimal expectedTotalAccrual =
principal.multiply(rate).divide(daysInYear, 8, RoundingMode.HALF_EVEN)
- .multiply(new
BigDecimal(actualNumberOfTransactions)).setScale(2, RoundingMode.HALF_EVEN);
+ BigDecimal expectedTotalAccrual =
principal.multiply(rate).divide(daysInYear, 8, RoundingMode.HALF_EVEN)
+ .multiply(new
BigDecimal(actualNumberOfTransactions)).setScale(2, RoundingMode.HALF_EVEN);
- BigDecimal actualTotalAccrual =
savingsAccountHelper.getTotalAccrualAmount(savingsAccountId);
+ BigDecimal actualTotalAccrual =
savingsAccountHelper.getTotalAccrualAmount(savingsAccountId);
- Assertions.assertEquals(0,
expectedTotalAccrual.compareTo(actualTotalAccrual),
- "The total accrual (" + actualTotalAccrual + ") does not match
the expected (" + expectedTotalAccrual + ")");
+ Assertions.assertEquals(0,
expectedTotalAccrual.compareTo(actualTotalAccrual),
+ "The total accrual (" + actualTotalAccrual + ") does not
match the expected (" + expectedTotalAccrual + ")");
+ });
}
}