From cd7304bdcb4ad02202c8eab9784e08e36f76529a Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 19 Jan 2019 20:30:20 +0100
Subject: [PATCH] #268 - persist report settings in database; refactoring

---
 .../budgetmaster/authentication/User.java     |  2 +-
 .../controller/AccountController.java         |  5 +-
 .../controller/CategoryController.java        |  4 +-
 .../controller/ReportController.java          | 25 ++++--
 .../controller/SettingsController.java        |  2 +-
 .../budgetmaster/database/Database.java       |  4 +-
 .../budgetmaster/database/DatabaseParser.java |  2 +-
 .../database/DatabaseParser_v3.java           |  2 +
 .../database/accountmatches/AccountMatch.java |  2 +-
 .../database/legacy/LegacyParser.java         |  4 +
 .../budgetmaster/entities/AccountType.java    |  7 --
 .../budgetmaster/entities/CategoryType.java   |  7 --
 .../budgetmaster/entities/Transaction.java    |  2 +
 .../entities/{ => account}/Account.java       |  3 +-
 .../entities/account/AccountType.java         |  7 ++
 .../entities/{ => category}/Category.java     |  3 +-
 .../entities/category/CategoryType.java       |  7 ++
 .../entities/report/ReportColumn.java         | 81 +++++++++++++++++++
 .../report}/ReportSettings.java               | 58 +++++++------
 .../budgetmaster/reports/ReportColumn.java    | 36 ---------
 .../budgetmaster/reports/ReportItem.java      |  2 +-
 .../repositories/AccountRepository.java       |  4 +-
 .../repositories/CategoryRepository.java      |  4 +-
 .../repositories/TransactionRepository.java   |  2 +-
 .../report/ReportColumnRepository.java        | 16 ++++
 .../report/ReportSettingsRepository.java      |  9 +++
 .../budgetmaster/services/AccountService.java |  4 +-
 .../services/CategoryService.java             |  4 +-
 .../services/DatabaseService.java             |  4 +-
 .../budgetmaster/services/HelpersService.java |  3 +
 .../budgetmaster/services/ImportService.java  |  4 +-
 .../services/SettingsService.java             |  2 +-
 .../services/TransactionService.java          |  6 +-
 .../services/report/ReportColumnService.java  | 54 +++++++++++++
 .../report/ReportSettingsService.java         | 52 ++++++++++++
 .../validators/AccountValidator.java          |  2 +-
 .../validators/CategoryValidator.java         |  2 +-
 src/main/resources/static/js/reports.js       |  2 +-
 .../resources/templates/reports/reports.ftl   | 13 +--
 .../database/DatabaseImportTest.java          |  4 +
 .../database/DatabaseParser_v3Test.java       |  4 +
 .../database/LegacyParserTest.java            |  4 +
 42 files changed, 344 insertions(+), 120 deletions(-)
 delete mode 100644 src/main/java/de/deadlocker8/budgetmaster/entities/AccountType.java
 delete mode 100644 src/main/java/de/deadlocker8/budgetmaster/entities/CategoryType.java
 rename src/main/java/de/deadlocker8/budgetmaster/entities/{ => account}/Account.java (94%)
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/entities/account/AccountType.java
 rename src/main/java/de/deadlocker8/budgetmaster/entities/{ => category}/Category.java (95%)
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/entities/category/CategoryType.java
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/entities/report/ReportColumn.java
 rename src/main/java/de/deadlocker8/budgetmaster/{reports => entities/report}/ReportSettings.java (57%)
 delete mode 100644 src/main/java/de/deadlocker8/budgetmaster/reports/ReportColumn.java
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/repositories/report/ReportColumnRepository.java
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/repositories/report/ReportSettingsRepository.java
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/services/report/ReportColumnService.java
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/services/report/ReportSettingsService.java

diff --git a/src/main/java/de/deadlocker8/budgetmaster/authentication/User.java b/src/main/java/de/deadlocker8/budgetmaster/authentication/User.java
index fe6df24d6..0781ae4ab 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/authentication/User.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/authentication/User.java
@@ -1,6 +1,6 @@
 package de.deadlocker8.budgetmaster.authentication;
 
-import de.deadlocker8.budgetmaster.entities.Account;
+import de.deadlocker8.budgetmaster.entities.account.Account;
 
 import javax.persistence.*;
 import javax.validation.constraints.NotNull;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/AccountController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/AccountController.java
index 373701e24..cf8d42317 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/controller/AccountController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/controller/AccountController.java
@@ -1,7 +1,7 @@
 package de.deadlocker8.budgetmaster.controller;
 
-import de.deadlocker8.budgetmaster.entities.Account;
-import de.deadlocker8.budgetmaster.entities.AccountType;
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.account.AccountType;
 import de.deadlocker8.budgetmaster.repositories.AccountRepository;
 import de.deadlocker8.budgetmaster.services.AccountService;
 import de.deadlocker8.budgetmaster.utils.ResourceNotFoundException;
@@ -12,7 +12,6 @@ import org.springframework.ui.Model;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.FieldError;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 import javax.servlet.http.HttpServletRequest;
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/CategoryController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/CategoryController.java
index a4bb5e5df..b9a26510e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/controller/CategoryController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/controller/CategoryController.java
@@ -1,7 +1,7 @@
 package de.deadlocker8.budgetmaster.controller;
 
-import de.deadlocker8.budgetmaster.entities.Category;
-import de.deadlocker8.budgetmaster.entities.CategoryType;
+import de.deadlocker8.budgetmaster.entities.category.Category;
+import de.deadlocker8.budgetmaster.entities.category.CategoryType;
 import de.deadlocker8.budgetmaster.repositories.CategoryRepository;
 import de.deadlocker8.budgetmaster.services.CategoryService;
 import de.deadlocker8.budgetmaster.services.HelpersService;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/ReportController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/ReportController.java
index 5935d9e87..dd4812e61 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/controller/ReportController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/controller/ReportController.java
@@ -1,8 +1,11 @@
 package de.deadlocker8.budgetmaster.controller;
 
-import de.deadlocker8.budgetmaster.reports.ReportSettings;
+import de.deadlocker8.budgetmaster.entities.report.ReportColumn;
+import de.deadlocker8.budgetmaster.entities.report.ReportSettings;
 import de.deadlocker8.budgetmaster.repositories.SettingsRepository;
 import de.deadlocker8.budgetmaster.services.HelpersService;
+import de.deadlocker8.budgetmaster.services.report.ReportColumnService;
+import de.deadlocker8.budgetmaster.services.report.ReportSettingsService;
 import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -20,6 +23,12 @@ public class ReportController extends BaseController
 	@Autowired
 	private SettingsRepository settingsRepository;
 
+	@Autowired
+	private ReportSettingsService reportSettingsService;
+
+	@Autowired
+	private ReportColumnService reportColumnService;
+
 	@Autowired
 	private HelpersService helpers;
 
@@ -28,22 +37,22 @@ public class ReportController extends BaseController
 	{
 		DateTime date = helpers.getDateTimeFromCookie(cookieDate);
 
-		ReportSettings reportSettings = new ReportSettings();
-
-		model.addAttribute("reportSettings", reportSettings);
+		model.addAttribute("reportSettings", reportSettingsService.getReportSettings());
 		model.addAttribute("currentDate", date);
 		return "reports/reports";
 	}
 
 	@RequestMapping(value = "/reports/generate", method = RequestMethod.POST)
 	public String post(Model model,
-					   @CookieValue(value = "currentDate", required = false) String cookieDate,
 					   @ModelAttribute("NewReportSettings") ReportSettings reportSettings,
 					   BindingResult bindingResult)
 	{
-		DateTime date = helpers.getDateTimeFromCookie(cookieDate);
-
-		System.out.println(reportSettings);
+		reportSettingsService.getRepository().delete(0);
+		for(ReportColumn reportColumn : reportSettings.getColumns())
+		{
+			reportColumnService.getRepository().save(reportColumn);
+		}
+		reportSettingsService.getRepository().save(reportSettings);
 
 		return "redirect:/reports";
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java
index e515416b1..587b9c289 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/controller/SettingsController.java
@@ -6,7 +6,7 @@ import de.deadlocker8.budgetmaster.authentication.UserRepository;
 import de.deadlocker8.budgetmaster.database.Database;
 import de.deadlocker8.budgetmaster.database.DatabaseParser;
 import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatchList;
-import de.deadlocker8.budgetmaster.entities.CategoryType;
+import de.deadlocker8.budgetmaster.entities.category.CategoryType;
 import de.deadlocker8.budgetmaster.entities.Settings;
 import de.deadlocker8.budgetmaster.repositories.SettingsRepository;
 import de.deadlocker8.budgetmaster.services.*;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/Database.java b/src/main/java/de/deadlocker8/budgetmaster/database/Database.java
index bf590ae49..6b5f9bb87 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/Database.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/Database.java
@@ -1,8 +1,8 @@
 package de.deadlocker8.budgetmaster.database;
 
 import com.google.gson.annotations.Expose;
-import de.deadlocker8.budgetmaster.entities.Account;
-import de.deadlocker8.budgetmaster.entities.Category;
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.deadlocker8.budgetmaster.entities.Transaction;
 
 import java.util.List;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java
index 627edfd51..71032960b 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser.java
@@ -3,7 +3,7 @@ package de.deadlocker8.budgetmaster.database;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import de.deadlocker8.budgetmaster.database.legacy.LegacyParser;
-import de.deadlocker8.budgetmaster.entities.Category;
+import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.thecodelabs.utils.util.Localization;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java
index b59c0b81e..2cf160d5e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java
@@ -2,6 +2,8 @@ package de.deadlocker8.budgetmaster.database;
 
 import com.google.gson.*;
 import de.deadlocker8.budgetmaster.entities.*;
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import de.deadlocker8.budgetmaster.repeating.endoption.*;
 import de.deadlocker8.budgetmaster.repeating.modifier.*;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/accountmatches/AccountMatch.java b/src/main/java/de/deadlocker8/budgetmaster/database/accountmatches/AccountMatch.java
index 2cc9da1bc..a3c7a937d 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/accountmatches/AccountMatch.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/accountmatches/AccountMatch.java
@@ -1,6 +1,6 @@
 package de.deadlocker8.budgetmaster.database.accountmatches;
 
-import de.deadlocker8.budgetmaster.entities.Account;
+import de.deadlocker8.budgetmaster.entities.account.Account;
 
 public class AccountMatch
 {
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java b/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java
index 1ac87533b..6b5d17209 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java
@@ -6,6 +6,10 @@ import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import de.deadlocker8.budgetmaster.database.Database;
 import de.deadlocker8.budgetmaster.entities.*;
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.account.AccountType;
+import de.deadlocker8.budgetmaster.entities.category.Category;
+import de.deadlocker8.budgetmaster.entities.category.CategoryType;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndDate;
 import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndNever;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/AccountType.java b/src/main/java/de/deadlocker8/budgetmaster/entities/AccountType.java
deleted file mode 100644
index 5accc8789..000000000
--- a/src/main/java/de/deadlocker8/budgetmaster/entities/AccountType.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package de.deadlocker8.budgetmaster.entities;
-
-
-public enum AccountType
-{
-	ALL, CUSTOM
-}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/CategoryType.java b/src/main/java/de/deadlocker8/budgetmaster/entities/CategoryType.java
deleted file mode 100644
index f8a89f210..000000000
--- a/src/main/java/de/deadlocker8/budgetmaster/entities/CategoryType.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package de.deadlocker8.budgetmaster.entities;
-
-
-public enum CategoryType
-{
-	NONE, REST, CUSTOM
-}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/Transaction.java b/src/main/java/de/deadlocker8/budgetmaster/entities/Transaction.java
index 935e46c40..a29cb8562 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/entities/Transaction.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/entities/Transaction.java
@@ -1,6 +1,8 @@
 package de.deadlocker8.budgetmaster.entities;
 
 import com.google.gson.annotations.Expose;
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import org.joda.time.DateTime;
 import org.springframework.format.annotation.DateTimeFormat;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/Account.java b/src/main/java/de/deadlocker8/budgetmaster/entities/account/Account.java
similarity index 94%
rename from src/main/java/de/deadlocker8/budgetmaster/entities/Account.java
rename to src/main/java/de/deadlocker8/budgetmaster/entities/account/Account.java
index b028964c9..b21929d90 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/entities/Account.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/entities/account/Account.java
@@ -1,6 +1,7 @@
-package de.deadlocker8.budgetmaster.entities;
+package de.deadlocker8.budgetmaster.entities.account;
 
 import com.google.gson.annotations.Expose;
+import de.deadlocker8.budgetmaster.entities.Transaction;
 
 import javax.persistence.*;
 import javax.validation.constraints.NotNull;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/account/AccountType.java b/src/main/java/de/deadlocker8/budgetmaster/entities/account/AccountType.java
new file mode 100644
index 000000000..b2bc80771
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/entities/account/AccountType.java
@@ -0,0 +1,7 @@
+package de.deadlocker8.budgetmaster.entities.account;
+
+
+public enum AccountType
+{
+	ALL, CUSTOM
+}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/Category.java b/src/main/java/de/deadlocker8/budgetmaster/entities/category/Category.java
similarity index 95%
rename from src/main/java/de/deadlocker8/budgetmaster/entities/Category.java
rename to src/main/java/de/deadlocker8/budgetmaster/entities/category/Category.java
index e5901de2f..c12c235c9 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/entities/Category.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/entities/category/Category.java
@@ -1,6 +1,7 @@
-package de.deadlocker8.budgetmaster.entities;
+package de.deadlocker8.budgetmaster.entities.category;
 
 import com.google.gson.annotations.Expose;
+import de.deadlocker8.budgetmaster.entities.Transaction;
 import de.thecodelabs.utils.util.ColorUtils;
 import javafx.scene.paint.Color;
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/category/CategoryType.java b/src/main/java/de/deadlocker8/budgetmaster/entities/category/CategoryType.java
new file mode 100644
index 000000000..b484e7fb3
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/entities/category/CategoryType.java
@@ -0,0 +1,7 @@
+package de.deadlocker8.budgetmaster.entities.category;
+
+
+public enum CategoryType
+{
+	NONE, REST, CUSTOM
+}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/report/ReportColumn.java b/src/main/java/de/deadlocker8/budgetmaster/entities/report/ReportColumn.java
new file mode 100644
index 000000000..fe89566c4
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/entities/report/ReportColumn.java
@@ -0,0 +1,81 @@
+package de.deadlocker8.budgetmaster.entities.report;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+public class ReportColumn
+{
+	@Id
+	@GeneratedValue(strategy = GenerationType.AUTO)
+	private Integer ID;
+
+	private String key;
+	private boolean activated;
+	private int position;
+
+	@OneToMany(mappedBy = "columns", fetch = FetchType.LAZY)
+	private transient List<ReportSettings> referringSettings;
+
+	public ReportColumn(String key, int position)
+	{
+		this.key = key;
+		this.activated = true;
+		this.position = position;
+	}
+
+	public ReportColumn()
+	{
+	}
+
+	public Integer getID()
+	{
+		return ID;
+	}
+
+	public void setID(Integer ID)
+	{
+		this.ID = ID;
+	}
+
+	public String getKey()
+	{
+		return key;
+	}
+
+	public void setKey(String key)
+	{
+		this.key = key;
+	}
+
+	public boolean isActivated()
+	{
+		return activated;
+	}
+
+	public void setActivated(boolean activated)
+	{
+		this.activated = activated;
+	}
+
+	public int getPosition()
+	{
+		return position;
+	}
+
+	public void setPosition(int position)
+	{
+		this.position = position;
+	}
+
+	@Override
+	public String toString()
+	{
+		return "ReportColumn{" +
+				"ID=" + ID +
+				", key='" + key + '\'' +
+				", activated=" + activated +
+				", position=" + position +
+				'}';
+	}
+}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/reports/ReportSettings.java b/src/main/java/de/deadlocker8/budgetmaster/entities/report/ReportSettings.java
similarity index 57%
rename from src/main/java/de/deadlocker8/budgetmaster/reports/ReportSettings.java
rename to src/main/java/de/deadlocker8/budgetmaster/entities/report/ReportSettings.java
index d6cab259e..7ddead4f0 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/reports/ReportSettings.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/entities/report/ReportSettings.java
@@ -1,51 +1,57 @@
-package de.deadlocker8.budgetmaster.reports;
+package de.deadlocker8.budgetmaster.entities.report;
 
 import org.joda.time.DateTime;
 import org.springframework.format.annotation.DateTimeFormat;
 
-import java.util.HashMap;
-import java.util.Map;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
 
+@Entity
 public class ReportSettings
 {
+	@Id
+	private Integer ID;
+
 	@DateTimeFormat(pattern = "dd.MM.yyyy")
 	private DateTime date;
+
 	private boolean includeBudget;
 	private boolean splitTables;
 	private boolean includeCategoryBudgets;
 
-	private Map<String, ReportColumn> columns;
+	@OneToMany
+	private List<ReportColumn> columns;
 
+	public static ReportSettings getDefault()
+	{
+		return new ReportSettings(DateTime.now(), true, true, true);
+	}
 
-	public ReportSettings(DateTime date, boolean includeBudget, boolean splitTables, boolean includeCategoryBudgets)
+	private ReportSettings(DateTime date, boolean includeBudget, boolean splitTables, boolean includeCategoryBudgets)
 	{
 		this.date = date;
 		this.includeBudget = includeBudget;
 		this.splitTables = splitTables;
 		this.includeCategoryBudgets = includeCategoryBudgets;
-
-		initColumns();
+		this.columns = new ArrayList<>();
 	}
 
 	public ReportSettings()
 	{
-		initColumns();
 	}
 
-	private void initColumns()
+	public Integer getID()
 	{
-		this.columns = new HashMap<>();
+		return ID;
+	}
 
-		this.columns.put("report.position", new ReportColumn());
-		this.columns.put("report.date", new ReportColumn());
-		this.columns.put("report.repeating", new ReportColumn());
-		this.columns.put("report.name", new ReportColumn());
-		this.columns.put("report.category", new ReportColumn());
-		this.columns.put("report.description", new ReportColumn());
-		this.columns.put("report.tags", new ReportColumn());
-		this.columns.put("report.account", new ReportColumn());
-		this.columns.put("report.rating", new ReportColumn());
-		this.columns.put("report.amount", new ReportColumn());
+	public void setID(Integer ID)
+	{
+		this.ID = ID;
 	}
 
 	public DateTime getDate()
@@ -88,12 +94,18 @@ public class ReportSettings
 		this.includeCategoryBudgets = includeCategoryBudgets;
 	}
 
-	public Map<String, ReportColumn> getColumns()
+	public List<ReportColumn> getColumnsSorted()
+	{
+		columns.sort(Comparator.comparing(ReportColumn::getPosition));
+		return columns;
+	}
+
+	public List<ReportColumn> getColumns()
 	{
-		return this.columns;
+		return columns;
 	}
 
-	public void setColumns(Map<String, ReportColumn> columns)
+	public void setColumns(List<ReportColumn> columns)
 	{
 		this.columns = columns;
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/reports/ReportColumn.java b/src/main/java/de/deadlocker8/budgetmaster/reports/ReportColumn.java
deleted file mode 100644
index 55cb04713..000000000
--- a/src/main/java/de/deadlocker8/budgetmaster/reports/ReportColumn.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package de.deadlocker8.budgetmaster.reports;
-
-public class ReportColumn
-{
-	private boolean activated;
-	private int position;
-
-	public boolean isActivated()
-	{
-		return activated;
-	}
-
-	public void setActivated(boolean activated)
-	{
-		this.activated = activated;
-	}
-
-	public int getPosition()
-	{
-		return position;
-	}
-
-	public void setPosition(int position)
-	{
-		this.position = position;
-	}
-
-	@Override
-	public String toString()
-	{
-		return "ReportColumn{" +
-				"activated=" + activated +
-				", position=" + position +
-				'}';
-	}
-}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/reports/ReportItem.java b/src/main/java/de/deadlocker8/budgetmaster/reports/ReportItem.java
index 08ced7b10..3223635cc 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/reports/ReportItem.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/reports/ReportItem.java
@@ -1,7 +1,7 @@
 package de.deadlocker8.budgetmaster.reports;
 
 
-import de.deadlocker8.budgetmaster.entities.Category;
+import de.deadlocker8.budgetmaster.entities.category.Category;
 
 public class ReportItem
 {
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repositories/AccountRepository.java b/src/main/java/de/deadlocker8/budgetmaster/repositories/AccountRepository.java
index 9cea8a0b7..ffd550e3c 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repositories/AccountRepository.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repositories/AccountRepository.java
@@ -1,7 +1,7 @@
 package de.deadlocker8.budgetmaster.repositories;
 
-import de.deadlocker8.budgetmaster.entities.Account;
-import de.deadlocker8.budgetmaster.entities.AccountType;
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.account.AccountType;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 import java.util.List;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repositories/CategoryRepository.java b/src/main/java/de/deadlocker8/budgetmaster/repositories/CategoryRepository.java
index 6374a1a3e..2e39888b5 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repositories/CategoryRepository.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repositories/CategoryRepository.java
@@ -1,7 +1,7 @@
 package de.deadlocker8.budgetmaster.repositories;
 
-import de.deadlocker8.budgetmaster.entities.Category;
-import de.deadlocker8.budgetmaster.entities.CategoryType;
+import de.deadlocker8.budgetmaster.entities.category.Category;
+import de.deadlocker8.budgetmaster.entities.category.CategoryType;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 import java.util.List;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repositories/TransactionRepository.java b/src/main/java/de/deadlocker8/budgetmaster/repositories/TransactionRepository.java
index b5adae450..068cda13f 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repositories/TransactionRepository.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repositories/TransactionRepository.java
@@ -1,6 +1,6 @@
 package de.deadlocker8.budgetmaster.repositories;
 
-import de.deadlocker8.budgetmaster.entities.Account;
+import de.deadlocker8.budgetmaster.entities.account.Account;
 import de.deadlocker8.budgetmaster.entities.Transaction;
 import org.joda.time.DateTime;
 import org.springframework.data.jpa.repository.JpaRepository;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repositories/report/ReportColumnRepository.java b/src/main/java/de/deadlocker8/budgetmaster/repositories/report/ReportColumnRepository.java
new file mode 100644
index 000000000..cbc6e3930
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/repositories/report/ReportColumnRepository.java
@@ -0,0 +1,16 @@
+package de.deadlocker8.budgetmaster.repositories.report;
+
+import de.deadlocker8.budgetmaster.entities.report.ReportColumn;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+
+public interface ReportColumnRepository extends JpaRepository<ReportColumn, Integer>
+{
+	List<ReportColumn> findAllByOrderByPositionAsc();
+
+	ReportColumn findByKey(String key);
+
+	ReportColumn findByPosition(int position);
+}
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repositories/report/ReportSettingsRepository.java b/src/main/java/de/deadlocker8/budgetmaster/repositories/report/ReportSettingsRepository.java
new file mode 100644
index 000000000..965ef7d61
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/repositories/report/ReportSettingsRepository.java
@@ -0,0 +1,9 @@
+package de.deadlocker8.budgetmaster.repositories.report;
+
+import de.deadlocker8.budgetmaster.entities.report.ReportSettings;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+
+public interface ReportSettingsRepository extends JpaRepository<ReportSettings, Integer>
+{
+}
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/AccountService.java b/src/main/java/de/deadlocker8/budgetmaster/services/AccountService.java
index 119454e30..2a0556977 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/AccountService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/AccountService.java
@@ -2,8 +2,8 @@ package de.deadlocker8.budgetmaster.services;
 
 import de.deadlocker8.budgetmaster.authentication.User;
 import de.deadlocker8.budgetmaster.authentication.UserRepository;
-import de.deadlocker8.budgetmaster.entities.Account;
-import de.deadlocker8.budgetmaster.entities.AccountType;
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.account.AccountType;
 import de.deadlocker8.budgetmaster.repositories.AccountRepository;
 import de.deadlocker8.budgetmaster.repositories.TransactionRepository;
 import de.deadlocker8.budgetmaster.utils.Strings;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/CategoryService.java b/src/main/java/de/deadlocker8/budgetmaster/services/CategoryService.java
index 9edc8f174..e92da3ae7 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/CategoryService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/CategoryService.java
@@ -1,7 +1,7 @@
 package de.deadlocker8.budgetmaster.services;
 
-import de.deadlocker8.budgetmaster.entities.Category;
-import de.deadlocker8.budgetmaster.entities.CategoryType;
+import de.deadlocker8.budgetmaster.entities.category.Category;
+import de.deadlocker8.budgetmaster.entities.category.CategoryType;
 import de.deadlocker8.budgetmaster.entities.Transaction;
 import de.deadlocker8.budgetmaster.repositories.CategoryRepository;
 import de.deadlocker8.budgetmaster.utils.Strings;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/DatabaseService.java b/src/main/java/de/deadlocker8/budgetmaster/services/DatabaseService.java
index 33cc5b282..2f957ed20 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/DatabaseService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/DatabaseService.java
@@ -2,8 +2,8 @@ package de.deadlocker8.budgetmaster.services;
 
 import com.google.gson.*;
 import de.deadlocker8.budgetmaster.database.Database;
-import de.deadlocker8.budgetmaster.entities.Account;
-import de.deadlocker8.budgetmaster.entities.Category;
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.deadlocker8.budgetmaster.entities.Transaction;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import org.joda.time.DateTime;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
index af45e2880..32ce882fd 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
@@ -1,5 +1,8 @@
 package de.deadlocker8.budgetmaster.services;
 
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.account.AccountType;
+import de.deadlocker8.budgetmaster.entities.category.CategoryType;
 import de.deadlocker8.budgetmaster.update.BudgetMasterUpdateService;
 import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatch;
 import de.deadlocker8.budgetmaster.entities.*;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java b/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java
index dd6534588..7bca23a74 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java
@@ -3,8 +3,8 @@ package de.deadlocker8.budgetmaster.services;
 import de.deadlocker8.budgetmaster.database.Database;
 import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatch;
 import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatchList;
-import de.deadlocker8.budgetmaster.entities.Category;
-import de.deadlocker8.budgetmaster.entities.CategoryType;
+import de.deadlocker8.budgetmaster.entities.category.Category;
+import de.deadlocker8.budgetmaster.entities.category.CategoryType;
 import de.deadlocker8.budgetmaster.entities.Tag;
 import de.deadlocker8.budgetmaster.entities.Transaction;
 import de.deadlocker8.budgetmaster.repositories.CategoryRepository;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/SettingsService.java b/src/main/java/de/deadlocker8/budgetmaster/services/SettingsService.java
index 9addb0d6d..43599d987 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/SettingsService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/SettingsService.java
@@ -20,7 +20,7 @@ public class SettingsService
 		createDefaultSettingsIfNotExists();
 	}
 
-	public void createDefaultSettingsIfNotExists()
+	private void createDefaultSettingsIfNotExists()
 	{
 		if(settingsRepository.findOne(0) == null)
 		{
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/TransactionService.java b/src/main/java/de/deadlocker8/budgetmaster/services/TransactionService.java
index f65eb4169..37a21a99c 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/TransactionService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/TransactionService.java
@@ -1,8 +1,8 @@
 package de.deadlocker8.budgetmaster.services;
 
-import de.deadlocker8.budgetmaster.entities.Account;
-import de.deadlocker8.budgetmaster.entities.AccountType;
-import de.deadlocker8.budgetmaster.entities.CategoryType;
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.account.AccountType;
+import de.deadlocker8.budgetmaster.entities.category.CategoryType;
 import de.deadlocker8.budgetmaster.entities.Transaction;
 import de.deadlocker8.budgetmaster.repositories.CategoryRepository;
 import de.deadlocker8.budgetmaster.repositories.RepeatingOptionRepository;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportColumnService.java b/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportColumnService.java
new file mode 100644
index 000000000..6d08a02f4
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportColumnService.java
@@ -0,0 +1,54 @@
+package de.deadlocker8.budgetmaster.services.report;
+
+import de.deadlocker8.budgetmaster.entities.report.ReportColumn;
+import de.deadlocker8.budgetmaster.repositories.report.ReportColumnRepository;
+import de.deadlocker8.budgetmaster.services.Resetable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ReportColumnService implements Resetable
+{
+	private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
+	private ReportColumnRepository reportColumnRepository;
+
+	@Autowired
+	public ReportColumnService(ReportColumnRepository reportColumnRepository)
+	{
+		this.reportColumnRepository = reportColumnRepository;
+
+		createDefaults();
+	}
+
+	public ReportColumnRepository getRepository()
+	{
+		return reportColumnRepository;
+	}
+
+	@Override
+	public void deleteAll()
+	{
+	}
+
+	@Override
+	public void createDefaults()
+	{
+		if(reportColumnRepository.findAllByOrderByPositionAsc().size() == 0)
+		{
+			reportColumnRepository.save(new ReportColumn("report.position", 0));
+			reportColumnRepository.save(new ReportColumn("report.date", 1));
+			reportColumnRepository.save(new ReportColumn("report.repeating", 2));
+			reportColumnRepository.save(new ReportColumn("report.name", 3));
+			reportColumnRepository.save(new ReportColumn("report.category", 4));
+			reportColumnRepository.save(new ReportColumn("report.description", 5));
+			reportColumnRepository.save(new ReportColumn("report.tags", 6));
+			reportColumnRepository.save(new ReportColumn("report.account", 7));
+			reportColumnRepository.save(new ReportColumn("report.rating", 8));
+			reportColumnRepository.save(new ReportColumn("report.amount", 9));
+
+			LOGGER.debug("Created default report columns");
+		}
+	}
+}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportSettingsService.java b/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportSettingsService.java
new file mode 100644
index 000000000..4df313a15
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportSettingsService.java
@@ -0,0 +1,52 @@
+package de.deadlocker8.budgetmaster.services.report;
+
+import de.deadlocker8.budgetmaster.entities.report.ReportColumn;
+import de.deadlocker8.budgetmaster.entities.report.ReportSettings;
+import de.deadlocker8.budgetmaster.repositories.report.ReportColumnRepository;
+import de.deadlocker8.budgetmaster.repositories.report.ReportSettingsRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ReportSettingsService
+{
+	private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
+	private ReportSettingsRepository reportSettingsRepository;
+	private ReportColumnService reportColumnService;
+
+	@Autowired
+	public ReportSettingsService(ReportSettingsRepository reportSettingsRepository, ReportColumnService reportColumnService)
+	{
+		this.reportSettingsRepository = reportSettingsRepository;
+		this.reportColumnService = reportColumnService;
+		createDefaultReportSettingsIfNotExists();
+	}
+
+	public ReportSettingsRepository getRepository()
+	{
+		return reportSettingsRepository;
+	}
+
+	private void createDefaultReportSettingsIfNotExists()
+	{
+		if(reportSettingsRepository.findOne(0) == null)
+		{
+			ReportSettings reportSettings = ReportSettings.getDefault();
+			reportSettings.setID(0);
+			for(ReportColumn reportColumn : reportColumnService.getRepository().findAllByOrderByPositionAsc())
+			{
+				reportSettings.getColumns().add(reportColumn);
+			}
+
+			reportSettingsRepository.save(reportSettings);
+			LOGGER.debug("Created default report settings");
+		}
+	}
+
+	public ReportSettings getReportSettings()
+	{
+		return reportSettingsRepository.findOne(0);
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/validators/AccountValidator.java b/src/main/java/de/deadlocker8/budgetmaster/validators/AccountValidator.java
index 0cff68a91..24d7c03dd 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/validators/AccountValidator.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/validators/AccountValidator.java
@@ -1,6 +1,6 @@
 package de.deadlocker8.budgetmaster.validators;
 
-import de.deadlocker8.budgetmaster.entities.Category;
+import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.deadlocker8.budgetmaster.utils.Strings;
 import org.springframework.validation.Errors;
 import org.springframework.validation.ValidationUtils;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/validators/CategoryValidator.java b/src/main/java/de/deadlocker8/budgetmaster/validators/CategoryValidator.java
index a7272ae90..b32c6582e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/validators/CategoryValidator.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/validators/CategoryValidator.java
@@ -1,6 +1,6 @@
 package de.deadlocker8.budgetmaster.validators;
 
-import de.deadlocker8.budgetmaster.entities.Category;
+import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.deadlocker8.budgetmaster.utils.Strings;
 import org.springframework.validation.Errors;
 import org.springframework.validation.ValidationUtils;
diff --git a/src/main/resources/static/js/reports.js b/src/main/resources/static/js/reports.js
index e2d91c7f6..45d83cf24 100644
--- a/src/main/resources/static/js/reports.js
+++ b/src/main/resources/static/js/reports.js
@@ -29,7 +29,7 @@ function updateRow(item)
 function validateForm()
 {
     $('.columnName-checkbox').each(function (i, obj) {
-        var positionInput = document.getElementsByName("columns['" + obj.dataset.key + "'].position")[0];
+        var positionInput = document.getElementsByName("columns['" + obj.dataset.index + "'].position")[0];
         positionInput.value = i;
     });
 
diff --git a/src/main/resources/templates/reports/reports.ftl b/src/main/resources/templates/reports/reports.ftl
index 36a200d2e..771028bc1 100644
--- a/src/main/resources/templates/reports/reports.ftl
+++ b/src/main/resources/templates/reports/reports.ftl
@@ -19,6 +19,7 @@
                 <div class="container">
                     <form name="NewReportSettings" action="<@s.url '/reports/generate'/>" method="post" onsubmit="return validateForm()">
                         <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
+                        <input type="hidden" name="ID" value="${reportSettings.getID()?c}"/>
                         <input type="hidden" name="date" value="${helpers.getLongDateString(currentDate)}"/>
 
                         <#-- settings -->
@@ -43,7 +44,7 @@
                                 </div>
                                 <div class="report-checkbox-container">
                                     <label>
-                                        <input type="checkbox" name="includeCategorybudgets" <#if reportSettings.includeCategoryBudgets>checked="checked"</#if>/>
+                                        <input type="checkbox" name="includeCategoryBudgets" <#if reportSettings.includeCategoryBudgets>checked="checked"</#if>/>
                                         <span class="columnName-label">${locale.getString('report.checkbox.inclue.categorybudgets')}</span>
                                     </label>
                                 </div>
@@ -66,13 +67,15 @@
                         <div class="row">
                             <div class="col s12 m8 offset-m2">
                                 <div id="columnNames">
-                                    <#list reportSettings.columns as key, value>
+                                    <#list reportSettings.getColumnsSorted() as column>
                                         <div class="columnName">
                                             <label>
-                                                <input type="checkbox" class="columnName-checkbox" data-key="${key}" name="columns['${key}'].activated"/>
-                                                <span class="columnName-label">${locale.getString(key)}</span>
+                                                <input type="checkbox" class="columnName-checkbox" data-index="${column?index}" name="columns['${column?index}'].activated" <#if column.isActivated()>checked="checked"</#if>/>
+                                                <span class="columnName-label">${locale.getString(column.getKey())}</span>
                                             </label>
-                                            <input type="hidden" name="columns['${key}'].position" value=""/>
+                                            <input type="hidden" name="columns['${column?index}'].ID" value="${column.getID()}"/>
+                                            <input type="hidden" name="columns['${column?index}'].key" value="${column.getKey()}"/>
+                                            <input type="hidden" name="columns['${column?index}'].position" value=""/>
                                         </div>
                                     </#list>
                                 </div>
diff --git a/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseImportTest.java b/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseImportTest.java
index 9fabfb28e..ee8e6fa5f 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseImportTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseImportTest.java
@@ -1,6 +1,10 @@
 package de.deadlocker8.budgetmaster.database;
 
 import de.deadlocker8.budgetmaster.entities.*;
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.account.AccountType;
+import de.deadlocker8.budgetmaster.entities.category.Category;
+import de.deadlocker8.budgetmaster.entities.category.CategoryType;
 import de.deadlocker8.budgetmaster.repositories.CategoryRepository;
 import de.deadlocker8.budgetmaster.repositories.TagRepository;
 import de.deadlocker8.budgetmaster.repositories.TransactionRepository;
diff --git a/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3Test.java b/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3Test.java
index 5cf846011..c1d8004ee 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3Test.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3Test.java
@@ -1,6 +1,10 @@
 package de.deadlocker8.budgetmaster.database;
 
 import de.deadlocker8.budgetmaster.entities.*;
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.account.AccountType;
+import de.deadlocker8.budgetmaster.entities.category.Category;
+import de.deadlocker8.budgetmaster.entities.category.CategoryType;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndAfterXTimes;
 import de.deadlocker8.budgetmaster.repeating.modifier.RepeatingModifierDays;
diff --git a/src/test/java/de/deadlocker8/budgetmaster/database/LegacyParserTest.java b/src/test/java/de/deadlocker8/budgetmaster/database/LegacyParserTest.java
index 019d7d669..7cbba4534 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/database/LegacyParserTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/database/LegacyParserTest.java
@@ -2,6 +2,10 @@ package de.deadlocker8.budgetmaster.database;
 
 import de.deadlocker8.budgetmaster.database.legacy.LegacyParser;
 import de.deadlocker8.budgetmaster.entities.*;
+import de.deadlocker8.budgetmaster.entities.account.Account;
+import de.deadlocker8.budgetmaster.entities.account.AccountType;
+import de.deadlocker8.budgetmaster.entities.category.Category;
+import de.deadlocker8.budgetmaster.entities.category.CategoryType;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndDate;
 import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndNever;
-- 
GitLab