From ba977de675efe7c36e393add1295c2f62f7de176 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 23 Jun 2024 22:49:30 +0200
Subject: [PATCH] #764 - include new property "endDate" in backup and restore

---
 .../model/converter/AccountConverter.java     | 25 +++++++++++++++++++
 .../database/model/v11/BackupAccount_v11.java | 25 ++++++++++++++++---
 .../database/model/v7/BackupAccount_v7.java   |  2 +-
 .../unit/database/DatabaseExportTest.java     |  2 +-
 .../unit/database/DatabaseParser_v11Test.java |  3 ++-
 .../unit/database/ImportServiceTest.java      |  2 +-
 .../resources/DatabaseParser_v11Test.json     |  3 ++-
 .../src/test/resources/ImportServiceTest.json |  3 ++-
 8 files changed, 56 insertions(+), 9 deletions(-)

diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/AccountConverter.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/AccountConverter.java
index 3f7cfc674..82404a5c6 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/AccountConverter.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/AccountConverter.java
@@ -5,6 +5,8 @@ import de.deadlocker8.budgetmaster.database.model.Converter;
 import de.deadlocker8.budgetmaster.database.model.v11.BackupAccount_v11;
 import de.deadlocker8.budgetmaster.icon.Icon;
 
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 public class AccountConverter implements Converter<Account, BackupAccount_v11>
@@ -32,6 +34,18 @@ public class AccountConverter implements Converter<Account, BackupAccount_v11>
 		account.setAccountState(backupAccount.getAccountState());
 		account.setType(backupAccount.getType());
 		account.setIconReference(getItemById(availableIcons, backupAccount.getIconReferenceID()));
+
+		final String endDateString = backupAccount.getEndDate();
+		if(endDateString == null)
+		{
+			account.setEndDate(null);
+		}
+		else
+		{
+			final LocalDate date = LocalDate.parse(endDateString, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+			account.setEndDate(date);
+		}
+
 		return account;
 	}
 
@@ -50,6 +64,17 @@ public class AccountConverter implements Converter<Account, BackupAccount_v11>
 		account.setAccountState(internalAccount.getAccountState());
 		account.setType(internalAccount.getType());
 
+		final LocalDate endDate = internalAccount.getEndDate();
+		if(endDate == null)
+		{
+			account.setEndDate(null);
+		}
+		else
+		{
+			account.setEndDate(internalAccount.getEndDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+
+		}
+
 		final Icon icon = internalAccount.getIconReference();
 		if(icon != null)
 		{
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/model/v11/BackupAccount_v11.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/model/v11/BackupAccount_v11.java
index 6ca6a2b13..37669f7a6 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/model/v11/BackupAccount_v11.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/model/v11/BackupAccount_v11.java
@@ -13,13 +13,14 @@ public class BackupAccount_v11
 	private AccountState accountState;
 	private AccountType type;
 	private Integer iconReferenceID;
+	private String endDate;
 
 	public BackupAccount_v11()
 	{
 		// for GSON
 	}
 
-	public BackupAccount_v11(Integer ID, String name, String description, AccountState accountState, AccountType type, Integer iconReferenceID)
+	public BackupAccount_v11(Integer ID, String name, String description, AccountState accountState, AccountType type, Integer iconReferenceID, String endDate)
 	{
 		this.ID = ID;
 		this.name = name;
@@ -27,6 +28,7 @@ public class BackupAccount_v11
 		this.accountState = accountState;
 		this.type = type;
 		this.iconReferenceID = iconReferenceID;
+		this.endDate = endDate;
 	}
 
 	public Integer getID()
@@ -89,19 +91,35 @@ public class BackupAccount_v11
 		this.iconReferenceID = iconReferenceID;
 	}
 
+	public String getEndDate()
+	{
+		return endDate;
+	}
+
+	public void setEndDate(String endDate)
+	{
+		this.endDate = endDate;
+	}
+
 	@Override
 	public boolean equals(Object o)
 	{
 		if(this == o) return true;
 		if(o == null || getClass() != o.getClass()) return false;
 		BackupAccount_v11 that = (BackupAccount_v11) o;
-		return Objects.equals(ID, that.ID) && Objects.equals(name, that.name) && Objects.equals(description, that.description) &&accountState == that.accountState && type == that.type && Objects.equals(iconReferenceID, that.iconReferenceID);
+		return Objects.equals(ID, that.ID) &&
+				Objects.equals(name, that.name) &&
+				Objects.equals(description, that.description) &&
+				accountState == that.accountState &&
+				type == that.type &&
+				Objects.equals(iconReferenceID, that.iconReferenceID) &&
+				Objects.equals(endDate, that.endDate);
 	}
 
 	@Override
 	public int hashCode()
 	{
-		return Objects.hash(ID, name, description, accountState, type, iconReferenceID);
+		return Objects.hash(ID, name, description, accountState, type, iconReferenceID, endDate);
 	}
 
 	@Override
@@ -114,6 +132,7 @@ public class BackupAccount_v11
 				", accountState=" + accountState +
 				", type=" + type +
 				", iconReferenceID=" + iconReferenceID +
+				", endDate=" + endDate +
 				'}';
 	}
 }
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/model/v7/BackupAccount_v7.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/model/v7/BackupAccount_v7.java
index 445a1158a..ddd9c705c 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/model/v7/BackupAccount_v7.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/database/model/v7/BackupAccount_v7.java
@@ -111,6 +111,6 @@ public class BackupAccount_v7 implements Upgradeable<BackupAccount_v11>
 	@Override
 	public BackupAccount_v11 upgrade(List<BackupInfo> backupInfoItems)
 	{
-		return new BackupAccount_v11(ID, name, "", accountState, type, iconReferenceID);
+		return new BackupAccount_v11(ID, name, "", accountState, type, iconReferenceID, null);
 	}
 }
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java
index 1dd44679b..e1a2083b0 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java
@@ -206,7 +206,7 @@ class DatabaseExportTest
 		Mockito.when(categoryService.getAllEntitiesAsc()).thenReturn(List.of(categoryNone, categoryCustom));
 
 		// accounts
-		Account account1 = new Account("Source_Account_1", "awesome description", AccountType.CUSTOM, null);
+		Account account1 = new Account("Source_Account_1", "awesome description", AccountType.CUSTOM, LocalDate.of(2024, 6, 30));
 		account1.setID(2);
 		Account account2 = new Account("Source_Account_2", "", AccountType.CUSTOM, null);
 		account2.setID(3);
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v11Test.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v11Test.java
index c2345dd82..b261949a4 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v11Test.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v11Test.java
@@ -32,6 +32,7 @@ import java.io.IOException;
 import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
@@ -94,7 +95,7 @@ class DatabaseParser_v11Test
 		DatabaseParser_v11 parser = new DatabaseParser_v11(json);
 		BackupDatabase_v11 database = parser.parseDatabaseFromJSON();
 
-		final BackupAccount_v11 account = new BackupAccount_v11(3, "Second Account", "Lorem Ipsum", AccountState.FULL_ACCESS, AccountType.CUSTOM, 1);
+		final BackupAccount_v11 account = new BackupAccount_v11(3, "Second Account", "Lorem Ipsum", AccountState.FULL_ACCESS, AccountType.CUSTOM, 1, "2024-07-02");
 
 		assertThat(database.getAccounts()).hasSize(3)
 				.contains(account);
diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java
index fd37759f2..99adda198 100644
--- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java
+++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/database/ImportServiceTest.java
@@ -219,7 +219,7 @@ class ImportServiceTest
 		final Account accountDefault = createAccount(2, "Default Account", "", AccountType.CUSTOM, AccountState.FULL_ACCESS, iconAccountDefault, true, true, null);
 		final Account accountDefaultNew = createAccount(3, "My Default Account", "", AccountType.CUSTOM, AccountState.FULL_ACCESS, iconAccountDefaultNew, false, false, null);
 		final Account accountReadOnly = createAccount(4, "Read-only account", "", AccountType.CUSTOM, AccountState.READ_ONLY, iconAccountReadOnly, false, false, null);
-		final Account accountSecond = createAccount(5, "Second Account", "Lorem Ipsum", AccountType.CUSTOM, AccountState.FULL_ACCESS, iconAccountSecond, false, false, null);
+		final Account accountSecond = createAccount(5, "Second Account", "Lorem Ipsum", AccountType.CUSTOM, AccountState.FULL_ACCESS, iconAccountSecond, false, false, LocalDate.of(2024,7,2));
 		assertThat(accountRepository.findAll())
 				.hasSize(5)
 				.contains(accountPlaceholder,
diff --git a/BudgetMasterServer/src/test/resources/DatabaseParser_v11Test.json b/BudgetMasterServer/src/test/resources/DatabaseParser_v11Test.json
index 6ceb08eb6..8ab535cc9 100644
--- a/BudgetMasterServer/src/test/resources/DatabaseParser_v11Test.json
+++ b/BudgetMasterServer/src/test/resources/DatabaseParser_v11Test.json
@@ -43,7 +43,8 @@
             "description": "Lorem Ipsum",
             "accountState": "FULL_ACCESS",
             "type": "CUSTOM",
-            "iconReferenceID": 1
+            "iconReferenceID": 1,
+            "endDate": "2024-07-02"
         }
     ],
     "transactions": [
diff --git a/BudgetMasterServer/src/test/resources/ImportServiceTest.json b/BudgetMasterServer/src/test/resources/ImportServiceTest.json
index 2a37961b5..16eedfa9c 100644
--- a/BudgetMasterServer/src/test/resources/ImportServiceTest.json
+++ b/BudgetMasterServer/src/test/resources/ImportServiceTest.json
@@ -62,7 +62,8 @@
             "description": "Lorem Ipsum",
             "accountState": "FULL_ACCESS",
             "type": "CUSTOM",
-            "iconReferenceID": 8
+            "iconReferenceID": 8,
+            "endDate": "2024-07-02"
         }
     ],
     "transactions": [
-- 
GitLab