From 7209937ffaf24171fb418f8fb2112164b300dd3b Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Thu, 28 Jul 2022 22:01:56 +0200
Subject: [PATCH] #703 - do not copy date when creating a transaction from an
 existing one:

- never prefill date
- validate date input is set by user
- ensure initial month and year is correct
---
 .../transactions/TransactionController.java   |  2 +-
 .../resources/languages/base_de.properties    |  3 +-
 .../resources/languages/base_en.properties    |  3 +-
 .../main/resources/static/js/transactions.js  |  7 +-
 .../transactions/newTransactionMacros.ftl     | 11 ++-
 .../helpers/TransactionTestHelper.java        | 16 ++++
 .../NewTransactionFromExistingOneTest.java    | 12 ++-
 .../selenium/NewTransactionNormalTest.java    | 60 +++++++------
 .../selenium/NewTransactionRecurringTest.java | 85 ++++++-------------
 .../selenium/NewTransactionTransferTest.java  | 13 +--
 10 files changed, 112 insertions(+), 100 deletions(-)

diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
index c8f919d1f..9733de836 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
@@ -390,7 +390,7 @@ public class TransactionController extends BaseController
 
 		Transaction newTransaction = new Transaction(existingTransaction);
 		newTransaction.setID(null);
-		newTransaction.setDate(date);
+		newTransaction.setDate(null);
 
 		if(newTransaction.getAccount().getAccountState() != AccountState.FULL_ACCESS)
 		{
diff --git a/BudgetMasterServer/src/main/resources/languages/base_de.properties b/BudgetMasterServer/src/main/resources/languages/base_de.properties
index 32adf22bf..319edb0d8 100644
--- a/BudgetMasterServer/src/main/resources/languages/base_de.properties
+++ b/BudgetMasterServer/src/main/resources/languages/base_de.properties
@@ -230,7 +230,8 @@ warning.settings.password.confirmation.wrong=Passwort und Passwort Wiederholung
 warning.empty.chart.name=Bitte gib einen Namen ein.
 warning.empty.chart.script=Bitte gib ein Script ein.
 warning.duplicate.template.name=Es existiert bereits eine Vorlage mit diesem Namen.
-warning.transaction.date=Das angegebene Datum entspricht nicht dem erlaubten Format. Erwartetes Format: DD.MM.YY, DDMMYY, DD.MM.YYYY, DDMMYYYY.
+warning.transaction.date.simple=Das angegebene Datum entspricht nicht dem erlaubten Format. Erwartetes Format: DD.MM.YY, DDMMYY, DD.MM.YYYY, DDMMYYYY.
+warning.transaction.date=Bitte wähle ein Datum aus.
 warning.empty.git.url=Bitte gib die URL zum git-Server ein.
 warning.empty.git.branch.name=Bitte gib den Namen des git-Branches ein.
 warning.empty.git.user.name=Bitte gib deinen git-Nutzernamen ein.
diff --git a/BudgetMasterServer/src/main/resources/languages/base_en.properties b/BudgetMasterServer/src/main/resources/languages/base_en.properties
index c660b5d9d..752c0c9a0 100644
--- a/BudgetMasterServer/src/main/resources/languages/base_en.properties
+++ b/BudgetMasterServer/src/main/resources/languages/base_en.properties
@@ -231,7 +231,8 @@ warning.settings.password.confirmation.wrong=Password and password confirmation
 warning.empty.chart.name=Please insert a name.
 warning.empty.chart.script=Please insert a script.
 warning.duplicate.template.name=A template with this name is already existing.
-warning.transaction.date=The specified date does not correspond to the allowed format. Expected format: DD.MM.YY, DDMMYY, DD.MM.YYYY, DDMMYYYY.
+warning.transaction.date.simple=The specified date does not correspond to the allowed format. Expected format: DD.MM.YY, DDMMYY, DD.MM.YYYY, DDMMYYYY.
+warning.transaction.date=Please select a date.
 warning.empty.git.url=Please insert the git server's URL.
 warning.empty.git.branch.name=Please insert the git branch name.
 warning.empty.git.user.name=Please insert your git username.
diff --git a/BudgetMasterServer/src/main/resources/static/js/transactions.js b/BudgetMasterServer/src/main/resources/static/js/transactions.js
index e8ffaac88..498265c0b 100644
--- a/BudgetMasterServer/src/main/resources/static/js/transactions.js
+++ b/BudgetMasterServer/src/main/resources/static/js/transactions.js
@@ -1,5 +1,7 @@
 $(document).ready(function()
 {
+    let pickerEndDate;
+
     // open filter modal if corresponding anchor is in url (originating from hotkeys.js)
     if(window.location.href.endsWith('#modalFilter'))
     {
@@ -48,7 +50,6 @@ $(document).ready(function()
             yearRange: 25,
             firstDay: 1,
             showClearBtn: false,
-            setDefaultDate: true,
             defaultDate: startDate,
             autoClose: true,
 
@@ -86,12 +87,14 @@ $(document).ready(function()
         // picker end date
         if(typeof endDate !== "undefined")
         {
-            let pickerEndDate = createDatePickerEnd(pickerStartDate.date, endDate);
+            pickerEndDate = createDatePickerEnd(pickerStartDate.date, endDate);
         }
     }
 
     function createDatePickerEnd(minDate, selectedDate)
     {
+        console.log(minDate, selectedDate);
+
         if(selectedDate < minDate)
         {
             selectedDate = minDate;
diff --git a/BudgetMasterServer/src/main/resources/templates/transactions/newTransactionMacros.ftl b/BudgetMasterServer/src/main/resources/templates/transactions/newTransactionMacros.ftl
index 43aae2ff4..65dc7c6fb 100644
--- a/BudgetMasterServer/src/main/resources/templates/transactions/newTransactionMacros.ftl
+++ b/BudgetMasterServer/src/main/resources/templates/transactions/newTransactionMacros.ftl
@@ -84,7 +84,12 @@
     <script>
         amountValidationMessage = "${locale.getString("warning.transaction.amount")}";
         numberValidationMessage = "${locale.getString("warning.empty.number")}";
-        dateValidationMessage = "${locale.getString("warning.transaction.date")}";
+
+        <#if helpers.isUseSimpleDatepickerForTransactions()>
+            dateValidationMessage = "${locale.getString("warning.transaction.date.simple")}";
+        <#else>
+            dateValidationMessage = "${locale.getString("warning.transaction.date")}";
+        </#if>
     </script>
 </#macro>
 
@@ -93,12 +98,14 @@
         <div class="input-field col s12 m12 l8 offset-l2">
             <#if transaction.getDate?? && transaction.getDate()??>
                 <#assign startDate = dateService.getLongDateString(transaction.getDate())/>
+                <#assign transactionDate = dateService.getLongDateString(transaction.getDate())/>
             <#else>
                 <#assign startDate = dateService.getLongDateString(currentDate)/>
+                <#assign transactionDate = ""/>
             </#if>
 
             <i class="material-icons prefix">event</i>
-            <input id="transaction-datepicker" type="text" class="datepicker<#if helpers.isUseSimpleDatepickerForTransactions()>-simple</#if>" name="date" value="${startDate}">
+            <input id="transaction-datepicker" type="text" class="datepicker<#if helpers.isUseSimpleDatepickerForTransactions()>-simple</#if>" name="date" value="${transactionDate}">
             <label class="input-label" for="transaction-datepicker">${locale.getString("transaction.new.label.date")}</label>
         </div>
     </div>
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/TransactionTestHelper.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/TransactionTestHelper.java
index eeef3ef96..9e489fe65 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/TransactionTestHelper.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/TransactionTestHelper.java
@@ -7,7 +7,9 @@ import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
+import java.text.SimpleDateFormat;
 import java.time.Duration;
+import java.util.Date;
 import java.util.List;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -94,6 +96,20 @@ public class TransactionTestHelper
 				.findFirst().orElseThrow().click();
 	}
 
+	public static void selectDayInTransactionDatePicker(WebDriver driver, int day)
+	{
+		driver.findElement(By.cssSelector(".input-label[for='transaction-datepicker']")).click();
+		WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
+		wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("datepicker-modal")));
+		driver.findElement(By.cssSelector("button[data-day='" + day + "']")).click();
+		wait.until(ExpectedConditions.invisibilityOfElementLocated(By.className("datepicker-modal")));
+	}
+
+	public static String getDateString(int day)
+	{
+		return String.format("%02d.%s", day, new SimpleDateFormat("MM.").format(new Date()));
+	}
+
 	public static void selectGlobalAccountByName(WebDriver driver, String accountName)
 	{
 		final WebElement globalAccountSelect = driver.findElement(By.id("globalAccountSelect"));
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionFromExistingOneTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionFromExistingOneTest.java
index b18fe4a4b..bd9c0ed8d 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionFromExistingOneTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionFromExistingOneTest.java
@@ -58,7 +58,7 @@ class NewTransactionFromExistingOneTest extends SeleniumTestBase
 		assertThat(driver.findElement(By.className("buttonExpenditure")).getAttribute("class")).contains("background-red");
 		assertThat(driver.findElement(By.id("transaction-name")).getAttribute("value")).isEqualTo("Full normal");
 		assertThat(driver.findElement(By.id("transaction-amount")).getAttribute("value")).isEqualTo("12.00");
-		assertThat(driver.findElement(By.id("transaction-datepicker")).getAttribute("value")).isEqualTo("01.10.2021");
+		assertThat(driver.findElement(By.id("transaction-datepicker")).getAttribute("value")).isEmpty();
 		assertThat(driver.findElement(By.id("transaction-description")).getAttribute("value")).isEqualTo("lorem ipsum");
 		assertThat(driver.findElement(By.cssSelector(".category-select-wrapper .custom-select-selected-item .category-circle")).getAttribute("data-value")).isEqualTo("3");
 
@@ -68,6 +68,8 @@ class NewTransactionFromExistingOneTest extends SeleniumTestBase
 
 		assertThat(driver.findElement(By.cssSelector(".account-select-wrapper .custom-select-selected-item .category-circle")).getAttribute("data-value")).isEqualTo("3");
 
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, 20);
+
 		// submit form
 		driver.findElement(By.id("button-save-transaction")).click();
 
@@ -93,7 +95,7 @@ class NewTransactionFromExistingOneTest extends SeleniumTestBase
 		// assert
 		assertThat(driver.findElement(By.id("transaction-name")).getAttribute("value")).isEqualTo("Full transfer");
 		assertThat(driver.findElement(By.id("transaction-amount")).getAttribute("value")).isEqualTo("15.00");
-		assertThat(driver.findElement(By.id("transaction-datepicker")).getAttribute("value")).isEqualTo("01.09.2021");
+		assertThat(driver.findElement(By.id("transaction-datepicker")).getAttribute("value")).isEmpty();
 		assertThat(driver.findElement(By.id("transaction-description")).getAttribute("value")).isEqualTo("dolor sit amet");
 		assertThat(driver.findElement(By.cssSelector(".category-select-wrapper .custom-select-selected-item .category-circle")).getAttribute("data-value")).isEqualTo("3");
 
@@ -104,6 +106,8 @@ class NewTransactionFromExistingOneTest extends SeleniumTestBase
 		assertThat(driver.findElement(By.cssSelector(".account-select-wrapper .custom-select-selected-item .category-circle")).getAttribute("data-value")).isEqualTo("3");
 		assertThat(driver.findElement(By.cssSelector(".transfer-account-select-wrapper .custom-select-selected-item .category-circle")).getAttribute("data-value")).isEqualTo("4");
 
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, 20);
+
 		// submit form
 		driver.findElement(By.id("button-save-transaction")).click();
 
@@ -134,6 +138,8 @@ class NewTransactionFromExistingOneTest extends SeleniumTestBase
 		assertThat(driver.findElement(By.id("repeating-end-after-x-times")).isSelected()).isTrue();
 		assertThat(driver.findElement(By.id("transaction-repeating-end-after-x-times-input")).getAttribute("value")).isEqualTo("1");
 
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, 20);
+
 		// submit form
 		driver.findElement(By.id("button-save-transaction")).click();
 
@@ -166,6 +172,8 @@ class NewTransactionFromExistingOneTest extends SeleniumTestBase
 		// should fall back to default account as the readonly account will not allow new transactions
 		assertThat(driver.findElement(By.cssSelector(".account-select-wrapper .custom-select-selected-item .category-circle")).getAttribute("data-value")).isEqualTo("2");
 
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, 20);
+
 		// submit form
 		driver.findElement(By.id("button-save-transaction")).click();
 
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionNormalTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionNormalTest.java
index c4fe8f7c9..166a67895 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionNormalTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionNormalTest.java
@@ -12,6 +12,7 @@ import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 
 import java.io.File;
+import java.text.MessageFormat;
 import java.text.SimpleDateFormat;
 import java.time.Duration;
 import java.util.Date;
@@ -87,15 +88,17 @@ class NewTransactionNormalTest extends SeleniumTestBase
 
 		openNewTransactionPage();
 
-		String name = "My normal transaction";
-		String amount = "15.00";
-		String description = "Lorem Ipsum dolor sit amet";
-		String categoryName = "sdfdsf";
+		final String name = "My normal transaction";
+		final String amount = "15.00";
+		final String description = "Lorem Ipsum dolor sit amet";
+		final String categoryName = "sdfdsf";
+		final int day = 20;
 
 		// fill form
 		driver.findElement(By.className("buttonIncome")).click();
 		driver.findElement(By.id("transaction-name")).sendKeys(name);
 		driver.findElement(By.id("transaction-amount")).sendKeys(amount);
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, day);
 		driver.findElement(By.id("transaction-description")).sendKeys(description);
 		TransactionTestHelper.selectCategoryByName(driver, categoryName);
 
@@ -116,8 +119,7 @@ class NewTransactionNormalTest extends SeleniumTestBase
 		assertThat(columns).hasSize(6);
 
 		// check columns
-		final String dateString = new SimpleDateFormat("dd.MM.").format(new Date());
-		TransactionTestHelper.assertTransactionColumns(columns, dateString, categoryName, "rgb(46, 124, 43)", false, false, name, description, amount);
+		TransactionTestHelper.assertTransactionColumns(columns, TransactionTestHelper.getDateString(day), categoryName, "rgb(46, 124, 43)", false, false, name, description, amount);
 	}
 
 	@Test
@@ -128,15 +130,17 @@ class NewTransactionNormalTest extends SeleniumTestBase
 
 		openNewTransactionPage();
 
-		String name = "My normal transaction";
-		String amount = "15.00";
-		String description = "Lorem Ipsum dolor sit amet";
-		String categoryName = "sdfdsf";
+		final String name = "My normal transaction";
+		final String amount = "15.00";
+		final String description = "Lorem Ipsum dolor sit amet";
+		final String categoryName = "sdfdsf";
+		final int day = 20;
 
 		// fill form
 		driver.findElement(By.className("buttonExpenditure")).click();
 		driver.findElement(By.id("transaction-name")).sendKeys(name);
 		driver.findElement(By.id("transaction-amount")).sendKeys(amount);
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, day);
 		driver.findElement(By.id("transaction-description")).sendKeys(description);
 		TransactionTestHelper.selectCategoryByName(driver, categoryName);
 
@@ -157,8 +161,7 @@ class NewTransactionNormalTest extends SeleniumTestBase
 		assertThat(columns).hasSize(6);
 
 		// check columns
-		final String dateString = new SimpleDateFormat("dd.MM.").format(new Date());
-		TransactionTestHelper.assertTransactionColumns(columns, dateString, categoryName, "rgb(46, 124, 43)", false, false, name, description, "-" + amount);
+		TransactionTestHelper.assertTransactionColumns(columns, TransactionTestHelper.getDateString(day), categoryName, "rgb(46, 124, 43)", false, false, name, description, "-" + amount);
 	}
 
 	@Test
@@ -185,13 +188,15 @@ class NewTransactionNormalTest extends SeleniumTestBase
 	{
 		openNewTransactionPage();
 
-		String name = "Save and continue transaction";
-		String amount = "15.00";
+		final String name = "Save and continue transaction";
+		final String amount = "15.00";
+		final int day = 20;
 
 		// fill form
 		driver.findElement(By.className("buttonExpenditure")).click();
 		driver.findElement(By.id("transaction-name")).sendKeys(name);
 		driver.findElement(By.id("transaction-amount")).sendKeys(amount);
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, day);
 
 		// submit form
 		driver.findElement(By.id("button-save-transaction-and-continue")).click();
@@ -205,6 +210,7 @@ class NewTransactionNormalTest extends SeleniumTestBase
 		assertThat(driver.findElement(By.className("buttonExpenditure")).getAttribute("class")).contains("background-red");
 		assertThat(driver.findElement(By.id("transaction-name")).getAttribute("value")).isEmpty();
 		assertThat(driver.findElement(By.id("transaction-amount")).getAttribute("value")).isEmpty();
+		assertThat(driver.findElement(By.id("transaction-datepicker")).getAttribute("value")).isEmpty();
 	}
 
 	@Test
@@ -214,12 +220,14 @@ class NewTransactionNormalTest extends SeleniumTestBase
 
 		final String name = "special income transaction";
 		final String amount = "15.00";
-		String categoryName = "sdfdsf";
+		final String categoryName = "sdfdsf";
+		final int day = 20;
 
 		// fill form
 		driver.findElement(By.className("buttonExpenditure")).click();
 		driver.findElement(By.id("transaction-name")).sendKeys(name);
 		driver.findElement(By.id("transaction-amount")).sendKeys(amount);
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, day);
 		TransactionTestHelper.selectCategoryByName(driver, categoryName);
 
 		// submit form
@@ -249,12 +257,14 @@ class NewTransactionNormalTest extends SeleniumTestBase
 
 		final String name = "special income transaction";
 		final String amount = "15.00";
-		String categoryName = "sdfdsf";
+		final String categoryName = "sdfdsf";
+		final int day = 20;
 
 		// fill form
 		driver.findElement(By.className("buttonExpenditure")).click();
 		driver.findElement(By.id("transaction-name")).sendKeys(name);
 		driver.findElement(By.id("transaction-amount")).sendKeys(amount);
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, day);
 		TransactionTestHelper.selectCategoryByName(driver, categoryName);
 
 		// submit form
@@ -277,26 +287,24 @@ class NewTransactionNormalTest extends SeleniumTestBase
 		assertThat(columns).hasSize(6);
 
 		// check columns
-		final String dateString = new SimpleDateFormat("dd.MM.").format(new Date());
-		TransactionTestHelper.assertTransactionColumns(columns, dateString, categoryName, "rgb(46, 124, 43)", false, false, name, null, "-" + amount);
+		TransactionTestHelper.assertTransactionColumns(columns, TransactionTestHelper.getDateString(day), categoryName, "rgb(46, 124, 43)", false, false, name, null, "-" + amount);
 	}
 
 	@Test
 	void test_newTransaction_keywordInName_clickOnButtonToIgnoreWarning_saveAndContinueClickedBefore()
 	{
-		List<WebElement> transactionsRows = driver.findElements(By.cssSelector(".transaction-container .hide-on-med-and-down.transaction-row-top"));
-		final int numberOfTransactionsBefore = transactionsRows.size();
-
 		openNewTransactionPage();
 
 		final String name = "special income transaction";
 		final String amount = "15.00";
-		String categoryName = "sdfdsf";
+		final String categoryName = "sdfdsf";
+		final int day = 20;
 
 		// fill form
 		driver.findElement(By.className("buttonExpenditure")).click();
 		driver.findElement(By.id("transaction-name")).sendKeys(name);
 		driver.findElement(By.id("transaction-amount")).sendKeys(amount);
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, day);
 		TransactionTestHelper.selectCategoryByName(driver, categoryName);
 
 		// submit form
@@ -316,6 +324,7 @@ class NewTransactionNormalTest extends SeleniumTestBase
 		assertThat(driver.findElement(By.className("buttonExpenditure")).getAttribute("class")).contains("background-red");
 		assertThat(driver.findElement(By.id("transaction-name")).getAttribute("value")).isEmpty();
 		assertThat(driver.findElement(By.id("transaction-amount")).getAttribute("value")).isEmpty();
+		assertThat(driver.findElement(By.id("transaction-datepicker")).getAttribute("value")).isEmpty();
 	}
 
 	@Test
@@ -328,12 +337,14 @@ class NewTransactionNormalTest extends SeleniumTestBase
 
 		final String name = "special income transaction";
 		final String amount = "15.00";
-		String categoryName = "sdfdsf";
+		final String categoryName = "sdfdsf";
+		final int day = 20;
 
 		// fill form
 		driver.findElement(By.className("buttonIncome")).click();
 		driver.findElement(By.id("transaction-name")).sendKeys(name);
 		driver.findElement(By.id("transaction-amount")).sendKeys(amount);
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, 20);
 		TransactionTestHelper.selectCategoryByName(driver, categoryName);
 
 		// submit form
@@ -352,7 +363,6 @@ class NewTransactionNormalTest extends SeleniumTestBase
 		assertThat(columns).hasSize(6);
 
 		// check columns
-		final String dateString = new SimpleDateFormat("dd.MM.").format(new Date());
-		TransactionTestHelper.assertTransactionColumns(columns, dateString, categoryName, "rgb(46, 124, 43)", false, false, name, null, amount);
+		TransactionTestHelper.assertTransactionColumns(columns, TransactionTestHelper.getDateString(day), categoryName, "rgb(46, 124, 43)", false, false, name, null, amount);
 	}
 }
\ No newline at end of file
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionRecurringTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionRecurringTest.java
index a4eb15f03..f8c293d0e 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionRecurringTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionRecurringTest.java
@@ -93,17 +93,19 @@ class NewTransactionRecurringTest extends SeleniumTestBase
 	@Test
 	void test_newTransaction_income()
 	{
-		String amount = "25.00";
-		String description = "Lorem Ipsum dolor sit amet";
-		String categoryName = "sdfdsf";
-		String repeatingModifier = "1";
-		String repeatingModifierType = "Days";
+		final String amount = "25.00";
+		final String description = "Lorem Ipsum dolor sit amet";
+		final String categoryName = "sdfdsf";
+		final int day = 3;
+		final String repeatingModifier = "1";
+		final String repeatingModifierType = "Days";
 
 		// fill form
 		driver.findElement(By.className("buttonIncome")).click();
 		driver.findElement(By.id("transaction-name")).sendKeys(TRANSACTION_NAME);
 		driver.findElement(By.id("transaction-amount")).sendKeys(amount);
 		driver.findElement(By.id("transaction-description")).sendKeys(description);
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, day);
 		TransactionTestHelper.selectCategoryByName(driver, categoryName);
 
 		driver.findElement(By.id("button-transaction-add-repeating-option")).click();
@@ -114,19 +116,6 @@ class NewTransactionRecurringTest extends SeleniumTestBase
 		driver.findElement(By.id("transaction-repeating-modifier")).sendKeys(repeatingModifier);
 		TransactionTestHelper.selectOptionFromDropdown(driver, By.cssSelector("#transaction-repeating-modifier-row"), repeatingModifierType);
 
-		// fill date
-		driver.findElement(By.id("transaction-datepicker")).click();
-		List<WebElement> datePickerCells = driver.findElements(By.cssSelector(".datepicker-table td"));
-		for(WebElement cell : datePickerCells)
-		{
-			if(cell.getText().equals("3"))
-			{
-				cell.click();
-				driver.findElement(By.cssSelector(".datepicker-done")).click();
-				break;
-			}
-		}
-
 		wait = new WebDriverWait(driver, Duration.ofSeconds(5));
 		wait.until(ExpectedConditions.invisibilityOfAllElements(driver.findElements(By.cssSelector(".modal-overlay"))));
 
@@ -150,24 +139,25 @@ class NewTransactionRecurringTest extends SeleniumTestBase
 		assertThat(columns).hasSize(6);
 
 		// check columns
-		final String dateString = new SimpleDateFormat("03.MM.").format(new Date());
-		TransactionTestHelper.assertTransactionColumns(columns, dateString, categoryName, "rgb(46, 124, 43)", true, false, TRANSACTION_NAME, description, amount);
+		TransactionTestHelper.assertTransactionColumns(columns, TransactionTestHelper.getDateString(day), categoryName, "rgb(46, 124, 43)", true, false, TRANSACTION_NAME, description, amount);
 	}
 
 	@Test
 	void test_newTransaction_expenditure()
 	{
-		String amount = "15.00";
-		String description = "Lorem Ipsum dolor sit amet";
-		String categoryName = "sdfdsf";
-		String repeatingModifier = "1";
-		String repeatingModifierType = "Days";
+		final String amount = "15.00";
+		final String description = "Lorem Ipsum dolor sit amet";
+		final String categoryName = "sdfdsf";
+		final int day = 3;
+		final String repeatingModifier = "1";
+		final String repeatingModifierType = "Days";
 
 		// fill form
 		driver.findElement(By.className("buttonExpenditure")).click();
 		driver.findElement(By.id("transaction-name")).sendKeys(TRANSACTION_NAME);
 		driver.findElement(By.id("transaction-amount")).sendKeys(amount);
 		driver.findElement(By.id("transaction-description")).sendKeys(description);
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, day);
 		TransactionTestHelper.selectCategoryByName(driver, categoryName);
 
 		driver.findElement(By.id("button-transaction-add-repeating-option")).click();
@@ -179,18 +169,6 @@ class NewTransactionRecurringTest extends SeleniumTestBase
 		TransactionTestHelper.selectOptionFromDropdown(driver, By.cssSelector("#transaction-repeating-modifier-row"), repeatingModifierType);
 
 		// fill date
-		driver.findElement(By.id("transaction-datepicker")).click();
-		List<WebElement> datePickerCells = driver.findElements(By.cssSelector(".datepicker-table td"));
-		for(WebElement cell : datePickerCells)
-		{
-			if(cell.getText().equals("3"))
-			{
-				cell.click();
-				driver.findElement(By.cssSelector(".datepicker-done")).click();
-				break;
-			}
-		}
-
 		wait = new WebDriverWait(driver, Duration.ofSeconds(5));
 		wait.until(ExpectedConditions.invisibilityOfAllElements(driver.findElements(By.cssSelector(".modal-overlay"))));
 
@@ -217,8 +195,7 @@ class NewTransactionRecurringTest extends SeleniumTestBase
 		assertThat(columns).hasSize(6);
 
 		// check columns
-		final String dateString = new SimpleDateFormat("03.MM.").format(new Date());
-		TransactionTestHelper.assertTransactionColumns(columns, dateString, categoryName, "rgb(46, 124, 43)", true, false, TRANSACTION_NAME, description, "-" + amount);
+		TransactionTestHelper.assertTransactionColumns(columns, TransactionTestHelper.getDateString(day), categoryName, "rgb(46, 124, 43)", true, false, TRANSACTION_NAME, description, "-" + amount);
 	}
 
 	@Test
@@ -227,17 +204,19 @@ class NewTransactionRecurringTest extends SeleniumTestBase
 		final String type = "Transfer";
 		openNewTransactionPage(type);
 
-		String amount = "30.00";
-		String description = "sit amet";
-		String categoryName = "sdfdsf";
-		String repeatingModifier = "1";
-		String repeatingModifierType = "Days";
-		String transferAccountName = "sfsdf";
+		final String amount = "30.00";
+		final String description = "sit amet";
+		final String categoryName = "sdfdsf";
+		final int day = 3;
+		final String repeatingModifier = "1";
+		final String repeatingModifierType = "Days";
+		final String transferAccountName = "sfsdf";
 
 		// fill form
 		driver.findElement(By.id("transaction-name")).sendKeys(TRANSACTION_NAME);
 		driver.findElement(By.id("transaction-amount")).sendKeys(amount);
 		driver.findElement(By.id("transaction-description")).sendKeys(description);
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, day);
 		TransactionTestHelper.selectCategoryByName(driver, categoryName);
 		TransactionTestHelper.selectTransferAccountByName(driver, transferAccountName);
 
@@ -249,19 +228,6 @@ class NewTransactionRecurringTest extends SeleniumTestBase
 		driver.findElement(By.id("transaction-repeating-modifier")).sendKeys(repeatingModifier);
 		TransactionTestHelper.selectOptionFromDropdown(driver, By.cssSelector("#transaction-repeating-modifier-row"), repeatingModifierType);
 
-		// fill date
-		driver.findElement(By.id("transaction-datepicker")).click();
-		List<WebElement> datePickerCells = driver.findElements(By.cssSelector(".datepicker-table td"));
-		for(WebElement cell : datePickerCells)
-		{
-			if(cell.getText().equals("3"))
-			{
-				cell.click();
-				driver.findElement(By.cssSelector(".datepicker-done")).click();
-				break;
-			}
-		}
-
 		wait = new WebDriverWait(driver, Duration.ofSeconds(5));
 		wait.until(ExpectedConditions.invisibilityOfAllElements(driver.findElements(By.cssSelector(".modal-overlay"))));
 
@@ -285,8 +251,7 @@ class NewTransactionRecurringTest extends SeleniumTestBase
 		assertThat(columns).hasSize(6);
 
 		// check columns
-		final String dateString = new SimpleDateFormat("03.MM.").format(new Date());
-		TransactionTestHelper.assertTransactionColumns(columns, dateString, categoryName, "rgb(46, 124, 43)", true, true, TRANSACTION_NAME, description, amount);
+		TransactionTestHelper.assertTransactionColumns(columns, TransactionTestHelper.getDateString(day), categoryName, "rgb(46, 124, 43)", true, true, TRANSACTION_NAME, description, amount);
 
 		// open transaction in edit view again
 		columns.get(5).findElement(By.cssSelector("a")).click();
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionTransferTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionTransferTest.java
index c343f65a8..9fcddb36a 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionTransferTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/integration/selenium/NewTransactionTransferTest.java
@@ -90,15 +90,17 @@ class NewTransactionTransferTest extends SeleniumTestBase
 	{
 		openNewTransactionPage();
 
-		String name = "My transfer transaction";
-		String amount = "15.00";
-		String description = "Lorem Ipsum dolor sit amet";
-		String categoryName = "sdfdsf";
+		final String name = "My transfer transaction";
+		final String amount = "15.00";
+		final String description = "Lorem Ipsum dolor sit amet";
+		final String categoryName = "sdfdsf";
+		final int day = 20;
 
 		// fill form
 		driver.findElement(By.id("transaction-name")).sendKeys(name);
 		driver.findElement(By.id("transaction-amount")).sendKeys(amount);
 		driver.findElement(By.id("transaction-description")).sendKeys(description);
+		TransactionTestHelper.selectDayInTransactionDatePicker(driver, day);
 		TransactionTestHelper.selectCategoryByName(driver, categoryName);
 
 		// submit form
@@ -118,8 +120,7 @@ class NewTransactionTransferTest extends SeleniumTestBase
 		assertThat(columns).hasSize(6);
 
 		// check columns
-		final String dateString = new SimpleDateFormat("dd.MM.").format(new Date());
-		TransactionTestHelper.assertTransactionColumns(columns, dateString, categoryName, "rgb(46, 124, 43)", false, true, name, description, amount);
+		TransactionTestHelper.assertTransactionColumns(columns, TransactionTestHelper.getDateString(day), categoryName, "rgb(46, 124, 43)", false, true, name, description, amount);
 	}
 
 	@Test
-- 
GitLab