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