From 41e8e1f709a61d0e894015d4ac01ea25031c9964 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Tue, 13 Dec 2022 21:53:37 +0100
Subject: [PATCH] #725 - show balance of end of current month as first
 transaction

---
 .../transactions/TransactionService.java      | 15 +++++++++--
 .../budgetmaster/utils/Strings.java           |  1 +
 .../resources/languages/base_de.properties    |  1 +
 .../resources/languages/base_en.properties    |  1 +
 .../unit/TransactionServiceDatabaseTest.java  | 26 +++++++++++++++++++
 5 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java
index beefb2496..7cd4ee799 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java
@@ -78,16 +78,27 @@ public class TransactionService implements Resettable
 	{
 		final List<Transaction> transactions = getTransactionsForMonthAndYearWithoutRest(account, month, year, filterConfiguration);
 
-		final LocalDate endDate = LocalDate.of(year, month, 1).minusMonths(1).with(lastDayOfMonth());
+		final LocalDate endDateLastMonth = LocalDate.of(year, month, 1).minusMonths(1).with(lastDayOfMonth());
 
 		final Transaction transactionBalanceLastMonth = new Transaction();
 		transactionBalanceLastMonth.setCategory(categoryService.findByType(CategoryType.REST));
 		transactionBalanceLastMonth.setName(Localization.getString(Strings.TRANSACTION_BALANCE_LAST_MONTH));
 		transactionBalanceLastMonth.setDate(LocalDate.of(year, month, 1));
-		transactionBalanceLastMonth.setAmount(getRest(account, endDate));
+		transactionBalanceLastMonth.setAmount(getRest(account, endDateLastMonth));
 		transactionBalanceLastMonth.setTags(new ArrayList<>());
 		transactions.add(transactionBalanceLastMonth);
 
+		final LocalDate endDateCurrentMonth = LocalDate.of(year, month, 1).with(lastDayOfMonth());
+
+		final Transaction transactionBalanceCurrentMonth = new Transaction();
+		transactionBalanceCurrentMonth.setCategory(categoryService.findByType(CategoryType.REST));
+		transactionBalanceCurrentMonth.setName(Localization.getString(Strings.TRANSACTION_BALANCE_CURRENT_MONTH));
+		transactionBalanceCurrentMonth.setDate(endDateCurrentMonth);
+		transactionBalanceCurrentMonth.setAmount(getRest(account, endDateCurrentMonth));
+		transactionBalanceCurrentMonth.setTags(new ArrayList<>());
+		// always add as first transaction
+		transactions.add(0, transactionBalanceCurrentMonth);
+
 		return transactions;
 	}
 
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
index a5f1e79ac..565fa16fe 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
@@ -14,6 +14,7 @@ public class Strings
 	public static final String TITLE_CATEGORY_BUDGETS = "title.category.budgets";
 	public static final String TEMPLATE_GROUP_DEFAULT = "template.group.default";
 	public static final String TRANSACTION_BALANCE_LAST_MONTH = "transaction.balance.last.month";
+	public static final String TRANSACTION_BALANCE_CURRENT_MONTH = "transaction.balance.current.month";
 
 	//ACCOUNT
 	public static final String ACCOUNT_DEFAULT_NAME = "account.default.name";
diff --git a/BudgetMasterServer/src/main/resources/languages/base_de.properties b/BudgetMasterServer/src/main/resources/languages/base_de.properties
index 9e1da8f13..5239fc6ec 100644
--- a/BudgetMasterServer/src/main/resources/languages/base_de.properties
+++ b/BudgetMasterServer/src/main/resources/languages/base_de.properties
@@ -85,6 +85,7 @@ transaction.warning.name.keyword.button.cancel=Abbrechen
 transaction.warning.name.keyword.button.edit=Schlüsselwörter editieren
 template.group.default=Ungruppiert
 transaction.balance.last.month=Saldo letzter Monat
+transaction.balance.current.month=Saldo Monatsende
 
 # WEEK DAYS
 monday=Montag
diff --git a/BudgetMasterServer/src/main/resources/languages/base_en.properties b/BudgetMasterServer/src/main/resources/languages/base_en.properties
index d31ceccca..f86c0a251 100644
--- a/BudgetMasterServer/src/main/resources/languages/base_en.properties
+++ b/BudgetMasterServer/src/main/resources/languages/base_en.properties
@@ -86,6 +86,7 @@ transaction.warning.name.keyword.button.cancel=Cancel
 transaction.warning.name.keyword.button.edit=Edit keywords
 template.group.default=Not grouped
 transaction.balance.last.month=Last month balance
+transaction.balance.current.month=Balance at end of month
 
 # WEEK DAYS
 monday=Monday
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionServiceDatabaseTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionServiceDatabaseTest.java
index dc05ab00d..232bc0be9 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionServiceDatabaseTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionServiceDatabaseTest.java
@@ -210,4 +210,30 @@ class TransactionServiceDatabaseTest
 					.isEqualTo(LocalDate.of(2021, 6, 30));
 		}
 	}
+
+	@Test
+	void test_getTransactionsForMonthAndYear_includeAccountBalances()
+	{
+		FilterConfiguration filterConfiguration = new FilterConfiguration(true, true, true, true, true, null, null, "");
+
+		List<Transaction> transactions = transactionService.getTransactionsForMonthAndYear(accountRepository.findByName("Default Account"), 6, 2021, true, filterConfiguration);
+
+		Transaction transactionBalanceLastMonth = new Transaction();
+		transactionBalanceLastMonth.setName("Last month balance");
+		transactionBalanceLastMonth.setAmount(998300);
+		transactionBalanceLastMonth.setDate(LocalDate.of(2021, 6, 1));
+		transactionBalanceLastMonth.setCategory(categoryService.findByType(CategoryType.REST));
+		transactionBalanceLastMonth.setTags(List.of());
+
+		Transaction transactionBalanceCurrentMonth = new Transaction();
+		transactionBalanceCurrentMonth.setName("Balance at end of month");
+		transactionBalanceCurrentMonth.setAmount(998200);
+		transactionBalanceCurrentMonth.setDate(LocalDate.of(2021, 6, 30));
+		transactionBalanceCurrentMonth.setCategory(categoryService.findByType(CategoryType.REST));
+		transactionBalanceCurrentMonth.setTags(List.of());
+
+		assertThat(transactions)
+				.hasSize(3)
+				.containsExactly(transactionBalanceCurrentMonth, transactionLastDayOfJune, transactionBalanceLastMonth);
+	}
 }
-- 
GitLab