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 + ")");
+        });
     }
 }

Reply via email to