From 66c6dfa228ddc0e5bd848f042f5fb91ca95bc69d Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sun, 2 Aug 2020 22:56:30 +0200 Subject: [PATCH] #535 - added new field "isExpenditure" for Transaction and Template --- .../budgetmaster/templates/Template.java | 39 +++++++++++++------ .../templates/TemplateController.java | 24 ++++++------ .../templates/TemplateService.java | 3 +- .../transactions/Transaction.java | 24 +++++++++++- .../transactions/TransactionBase.java | 4 ++ .../transactions/TransactionController.java | 27 ++++++------- .../transactions/TransactionService.java | 12 ++++-- .../templates/templates/newTemplate.ftl | 2 +- .../transactions/newTransactionMacros.ftl | 11 ++++-- .../transactions/newTransactionNormal.ftl | 2 +- .../transactions/newTransactionRepeating.ftl | 2 +- .../transactions/newTransactionTransfer.ftl | 2 +- 12 files changed, 101 insertions(+), 51 deletions(-) diff --git a/src/main/java/de/deadlocker8/budgetmaster/templates/Template.java b/src/main/java/de/deadlocker8/budgetmaster/templates/Template.java index 74e4478ce..7eaa176fe 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/templates/Template.java +++ b/src/main/java/de/deadlocker8/budgetmaster/templates/Template.java @@ -26,6 +26,9 @@ public class Template implements TransactionBase @Expose private Integer amount; + @Expose + private Boolean isExpenditure; + @ManyToOne @Expose private Account account; @@ -62,6 +65,7 @@ public class Template implements TransactionBase this.ID = template.getID(); this.templateName = template.getTemplateName(); this.amount = template.getAmount(); + this.isExpenditure = template.isExpenditure(); this.account = template.getAccount(); this.category = template.getCategory(); this.name = template.getName(); @@ -74,6 +78,12 @@ public class Template implements TransactionBase { this.templateName = templateName; this.amount = transaction.getAmount(); + this.isExpenditure = transaction.isExpenditure(); + if(this.isExpenditure == null) + { + this.isExpenditure = true; + } + this.account = transaction.getAccount(); this.category = transaction.getCategory(); this.name = transaction.getName(); @@ -119,6 +129,21 @@ public class Template implements TransactionBase this.amount = amount; } + public Boolean isExpenditure() + { + return isExpenditure; + } + + public Boolean getExpenditure() + { + return isExpenditure; + } + + public void setExpenditure(Boolean expenditure) + { + isExpenditure = expenditure; + } + public Account getAccount() { return account; @@ -184,16 +209,6 @@ public class Template implements TransactionBase return transferAccount != null; } - public boolean isPayment() - { - if(this.amount == null) - { - return true; - } - - return this.amount <= 0; - } - @Override public String toString() { @@ -201,6 +216,7 @@ public class Template implements TransactionBase "ID=" + ID + ", templateName='" + templateName + '\'' + ", amount=" + amount + + ", isExpenditure=" + isExpenditure + ", category=" + category + ", name='" + name + '\'' + ", description='" + description + '\'' + @@ -237,6 +253,7 @@ public class Template implements TransactionBase return Objects.equals(ID, template.ID) && Objects.equals(templateName, template.templateName) && Objects.equals(amount, template.amount) && + Objects.equals(isExpenditure, template.isExpenditure) && Objects.equals(account, template.account) && Objects.equals(category, template.category) && Objects.equals(name, template.name) && @@ -248,6 +265,6 @@ public class Template implements TransactionBase @Override public int hashCode() { - return Objects.hash(ID, templateName, amount, account, category, name, description, tags, transferAccount); + return Objects.hash(ID, templateName, amount, isExpenditure, account, category, name, description, tags, transferAccount); } } diff --git a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java index 15a551c5e..972a4e6cc 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java @@ -72,13 +72,12 @@ public class TemplateController extends BaseController @PostMapping(value = "/templates/fromTransaction") public String postFromTransaction(@RequestParam(value = "templateName") String templateName, @ModelAttribute("NewTransaction") Transaction transaction, - @RequestParam(value = "isPayment", required = false) boolean isPayment, @RequestParam(value = "includeCategory") Boolean includeCategory, @RequestParam(value = "includeAccount") Boolean includeAccount) { if(transaction.getAmount() != null) { - transactionService.handleAmount(transaction, isPayment); + transactionService.handleAmount(transaction); } transactionService.handleTags(transaction); @@ -128,14 +127,13 @@ public class TemplateController extends BaseController templateService.prepareTemplateForNewTransaction(template, true); - boolean isPayment = true; - if(template.getAmount() != null) + if(template.getAmount() == null) { - isPayment = template.getAmount() <= 0; + template.setExpenditure(true); } final DateTime date = dateService.getDateTimeFromCookie(cookieDate); - transactionService.prepareModelNewOrEdit(model, false, date, template, isPayment, accountService.getAllAccountsAsc()); + transactionService.prepareModelNewOrEdit(model, false, date, template, accountService.getAllAccountsAsc()); if(template.isTransfer()) { @@ -149,14 +147,13 @@ public class TemplateController extends BaseController { final Template emptyTemplate = new Template(); templateService.prepareTemplateForNewTransaction(emptyTemplate, false); - templateService.prepareModelNewOrEdit(model, false, emptyTemplate, true, accountService.getAllAccountsAsc()); + templateService.prepareModelNewOrEdit(model, false, emptyTemplate, accountService.getAllAccountsAsc()); return "templates/newTemplate"; } @PostMapping(value = "/templates/newTemplate") public String post(Model model, @ModelAttribute("NewTemplate") Template template, BindingResult bindingResult, - @RequestParam(value = "isPayment", required = false) boolean isPayment, @RequestParam(value = "includeAccount", required = false) boolean includeAccount, @RequestParam(value = "includeTransferAccount", required = false) boolean includeTransferAccount) { @@ -176,16 +173,21 @@ public class TemplateController extends BaseController TemplateValidator templateValidator = new TemplateValidator(previousTemplateName, templateService.getExistingTemplateNames()); templateValidator.validate(template, bindingResult); + if(template.isExpenditure() == null) + { + template.setExpenditure(false); + } + if(template.getAmount() != null) { - transactionService.handleAmount(template, isPayment); + transactionService.handleAmount(template); } transactionService.handleTags(template); if(bindingResult.hasErrors()) { model.addAttribute("error", bindingResult); - templateService.prepareModelNewOrEdit(model, template.getID() != null, template, isPayment, accountService.getAllAccountsAsc()); + templateService.prepareModelNewOrEdit(model, template.getID() != null, template, accountService.getAllAccountsAsc()); return "templates/newTemplate"; } @@ -214,7 +216,7 @@ public class TemplateController extends BaseController Template template = templateOptional.get(); templateService.prepareTemplateForNewTransaction(template, false); - templateService.prepareModelNewOrEdit(model, true, template, template.isPayment(), accountService.getAllAccountsAsc()); + templateService.prepareModelNewOrEdit(model, true, template, accountService.getAllAccountsAsc()); return "templates/newTemplate"; } diff --git a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateService.java b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateService.java index a71eb3239..b11fd292d 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateService.java @@ -89,14 +89,13 @@ public class TemplateService implements Resetable } } - public void prepareModelNewOrEdit(Model model, boolean isEdit, TransactionBase item, boolean isPayment, List<Account> accounts) + public void prepareModelNewOrEdit(Model model, boolean isEdit, TransactionBase item, List<Account> accounts) { model.addAttribute("isEdit", isEdit); model.addAttribute("categories", categoryService.getAllCategories()); model.addAttribute("accounts", accounts); model.addAttribute("template", item); model.addAttribute("settings", settingsService.getSettings()); - model.addAttribute("isPayment", isPayment); model.addAttribute("suggestionsJSON", GSON.toJson(new ArrayList<String>())); } diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/Transaction.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/Transaction.java index 12f7dbf54..0c950ba7c 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/transactions/Transaction.java +++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/Transaction.java @@ -20,9 +20,13 @@ public class Transaction implements TransactionBase @GeneratedValue(strategy = GenerationType.IDENTITY) @Expose private Integer ID; + @Expose private Integer amount; + @Expose + private Boolean isExpenditure; + @DateTimeFormat(pattern = "dd.MM.yyyy") @Expose private DateTime date; @@ -66,6 +70,7 @@ public class Transaction implements TransactionBase { this.ID = transaction.getID(); this.amount = transaction.getAmount(); + this.isExpenditure = transaction.isExpenditure(); this.date = transaction.getDate(); this.account = transaction.getAccount(); this.category = transaction.getCategory(); @@ -96,6 +101,21 @@ public class Transaction implements TransactionBase this.amount = amount; } + public Boolean isExpenditure() + { + return isExpenditure; + } + + public Boolean getExpenditure() + { + return isExpenditure; + } + + public void setExpenditure(Boolean expenditure) + { + isExpenditure = expenditure; + } + public DateTime getDate() { return date; @@ -197,6 +217,7 @@ public class Transaction implements TransactionBase String value = "Transaction{" + "ID=" + ID + ", amount=" + amount + + ", isExpenditure=" + isExpenditure + ", date=" + date + ", account=Account[ID=" + account.getID() + ", name=" + account.getName() + "]" + ", category=" + category + @@ -225,6 +246,7 @@ public class Transaction implements TransactionBase Transaction transaction = (Transaction) o; return Objects.equals(ID, transaction.ID) && Objects.equals(amount, transaction.amount) && + Objects.equals(isExpenditure, transaction.isExpenditure) && Objects.equals(date, transaction.date) && Objects.equals(account, transaction.account) && Objects.equals(category, transaction.category) && @@ -238,6 +260,6 @@ public class Transaction implements TransactionBase @Override public int hashCode() { - return Objects.hash(ID, amount, date, account, category, name, description, tags, repeatingOption, transferAccount); + return Objects.hash(ID, amount, isExpenditure, date, account, category, name, description, tags, repeatingOption, transferAccount); } } diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionBase.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionBase.java index 103e3ca0b..06b7bdb74 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionBase.java +++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionBase.java @@ -12,6 +12,10 @@ public interface TransactionBase void setAmount(Integer amount); + Boolean isExpenditure(); + + void setExpenditure(Boolean isExpenditure); + Category getCategory(); List<Tag> getTags(); diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java index bd7fb6366..acb0b578b 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java @@ -107,27 +107,26 @@ public class TransactionController extends BaseController DateTime date = dateService.getDateTimeFromCookie(cookieDate); Transaction emptyTransaction = new Transaction(); emptyTransaction.setCategory(categoryService.getRepository().findByType(CategoryType.NONE)); - transactionService.prepareModelNewOrEdit(model, false, date, emptyTransaction, true, accountService.getAllAccountsAsc()); + transactionService.prepareModelNewOrEdit(model, false, date, emptyTransaction, accountService.getAllAccountsAsc()); return "transactions/newTransaction" + StringUtils.capitalize(type); } @PostMapping(value = "/transactions/newTransaction/normal") public String postNormal(Model model, @CookieValue("currentDate") String cookieDate, - @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult, - @RequestParam(value = "isPayment", required = false) boolean isPayment) + @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult) { DateTime date = dateService.getDateTimeFromCookie(cookieDate); TransactionValidator transactionValidator = new TransactionValidator(); transactionValidator.validate(transaction, bindingResult); - transactionService.handleAmount(transaction, isPayment); + transactionService.handleAmount(transaction); transactionService.handleTags(transaction); transaction.setRepeatingOption(null); - return handleRedirect(model, transaction.getID() != null, transaction, bindingResult, date, "transactions/newTransactionNormal", isPayment); + return handleRedirect(model, transaction.getID() != null, transaction, bindingResult, date, "transactions/newTransactionNormal"); } @SuppressWarnings("ConstantConditions") @@ -135,7 +134,6 @@ public class TransactionController extends BaseController public String postRepeating(Model model, @CookieValue("currentDate") String cookieDate, @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult, @RequestParam(value = "isRepeating", required = false) boolean isRepeating, - @RequestParam(value = "isPayment", required = false) boolean isPayment, @RequestParam(value = "repeatingModifierNumber", required = false) int repeatingModifierNumber, @RequestParam(value = "repeatingModifierType", required = false) String repeatingModifierType, @RequestParam(value = "repeatingEndType", required = false) String repeatingEndType, @@ -152,7 +150,7 @@ public class TransactionController extends BaseController TransactionValidator transactionValidator = new TransactionValidator(); transactionValidator.validate(transaction, bindingResult); - transactionService.handleAmount(transaction, isPayment); + transactionService.handleAmount(transaction); transactionService.handleTags(transaction); RepeatingOption repeatingOption; @@ -178,34 +176,33 @@ public class TransactionController extends BaseController repeatingOption = new RepeatingOption(transaction.getDate(), repeatingModifier, repeatingEnd); transaction.setRepeatingOption(repeatingOption); - return handleRedirect(model, transaction.getID() != null, transaction, bindingResult, date, "transactions/newTransactionRepeating", isPayment); + return handleRedirect(model, transaction.getID() != null, transaction, bindingResult, date, "transactions/newTransactionRepeating"); } @PostMapping(value = "/transactions/newTransaction/transfer") public String postTransfer(Model model, @CookieValue("currentDate") String cookieDate, - @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult, - @RequestParam(value = "isPayment", required = false) boolean isPayment) + @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult) { DateTime date = dateService.getDateTimeFromCookie(cookieDate); TransactionValidator transactionValidator = new TransactionValidator(); transactionValidator.validate(transaction, bindingResult); - transactionService.handleAmount(transaction, isPayment); + transactionService.handleAmount(transaction); transactionService.handleTags(transaction); transaction.setRepeatingOption(null); - return handleRedirect(model, transaction.getID() != null, transaction, bindingResult, date, "transactions/newTransactionTransfer", isPayment); + return handleRedirect(model, transaction.getID() != null, transaction, bindingResult, date, "transactions/newTransactionTransfer"); } - private String handleRedirect(Model model, boolean isEdit, @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult, DateTime date, String url, boolean isPayment) + private String handleRedirect(Model model, boolean isEdit, @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult, DateTime date, String url) { if(bindingResult.hasErrors()) { model.addAttribute("error", bindingResult); - transactionService.prepareModelNewOrEdit(model, isEdit, date, transaction, isPayment, accountService.getAllAccountsAsc()); + transactionService.prepareModelNewOrEdit(model, isEdit, date, transaction, accountService.getAllAccountsAsc()); return url; } @@ -231,7 +228,7 @@ public class TransactionController extends BaseController } DateTime date = dateService.getDateTimeFromCookie(cookieDate); - transactionService.prepareModelNewOrEdit(model, true, date, transaction, transaction.getAmount() <= 0, accountService.getAllAccountsAsc()); + transactionService.prepareModelNewOrEdit(model, true, date, transaction, accountService.getAllAccountsAsc()); if(transaction.isRepeating()) { diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java index 2b9794752..6b4fd35b3 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionService.java @@ -221,14 +221,19 @@ public class TransactionService implements Resetable { } - public void handleAmount(TransactionBase item, boolean isPayment) + public void handleAmount(TransactionBase item) { + if(item.isExpenditure() == null) + { + item.setExpenditure(false); + } + if(item.getAmount() == null) { item.setAmount(0); } - if(isPayment) + if(item.isExpenditure()) { item.setAmount(-Math.abs(item.getAmount())); } @@ -279,7 +284,7 @@ public class TransactionService implements Resetable return item; } - public void prepareModelNewOrEdit(Model model, boolean isEdit, DateTime date, TransactionBase item, boolean isPayment, List<Account> accounts) + public void prepareModelNewOrEdit(Model model, boolean isEdit, DateTime date, TransactionBase item, List<Account> accounts) { model.addAttribute("isEdit", isEdit); model.addAttribute("currentDate", date); @@ -287,7 +292,6 @@ public class TransactionService implements Resetable model.addAttribute("accounts", accounts); model.addAttribute("transaction", item); model.addAttribute("settings", settingsService.getSettings()); - model.addAttribute("isPayment", isPayment); final List<Transaction> allByOrderByDateDesc = getRepository().findAllByOrderByDateDesc(); final List<String> nameSuggestions = allByOrderByDateDesc.stream() diff --git a/src/main/resources/templates/templates/newTemplate.ftl b/src/main/resources/templates/templates/newTemplate.ftl index 9a6f030b9..f26697165 100644 --- a/src/main/resources/templates/templates/newTemplate.ftl +++ b/src/main/resources/templates/templates/newTemplate.ftl @@ -29,7 +29,7 @@ <input type="hidden" name="ID" value="<#if template.getID()??>${template.getID()?c}</#if>"> <#-- isPayment switch --> - <@newTransactionMacros.isExpenditureSwitch template isPayment/> + <@newTransactionMacros.isExpenditureSwitch template/> <#-- template name --> <@templateFunctions.templateNameInput template/> diff --git a/src/main/resources/templates/transactions/newTransactionMacros.ftl b/src/main/resources/templates/transactions/newTransactionMacros.ftl index 0a01dbf27..bc9518ab6 100644 --- a/src/main/resources/templates/transactions/newTransactionMacros.ftl +++ b/src/main/resources/templates/transactions/newTransactionMacros.ftl @@ -1,8 +1,13 @@ <#import "/spring.ftl" as s> <#import "../helpers/validation.ftl" as validation> -<#macro isExpenditureSwitch transaction isPayment> - <#if isPayment> +<#macro isExpenditureSwitch transaction> + <#assign isExpenditure = true/> + <#if transaction.isExpenditure()??> + <#assign isExpenditure=transaction.isExpenditure()/> + </#if> + + <#if isExpenditure> <#assign colorButtonIncome = "budgetmaster-grey budgetmaster-text-isPayment"> <#assign colorButtonExpenditure = "budgetmaster-red"> <#else> @@ -10,7 +15,7 @@ <#assign colorButtonExpenditure = "budgetmaster-grey budgetmaster-text-isPayment"> </#if> - <input type="hidden" name="isPayment" id="input-isPayment" value="${isPayment?c}"> + <input type="hidden" name="isExpenditure" id="input-isPayment" value="${isExpenditure?c}"> <div class="row"> <div class="col s12 center-align"> diff --git a/src/main/resources/templates/transactions/newTransactionNormal.ftl b/src/main/resources/templates/transactions/newTransactionNormal.ftl index 57aac21ec..fc4e34dae 100644 --- a/src/main/resources/templates/transactions/newTransactionNormal.ftl +++ b/src/main/resources/templates/transactions/newTransactionNormal.ftl @@ -31,7 +31,7 @@ <input type="hidden" name="ID" value="<#if transaction.class.simpleName == "Transaction" && transaction.getID()??>${transaction.getID()?c}</#if>"> <#-- isPayment switch --> - <@newTransactionMacros.isExpenditureSwitch transaction isPayment/> + <@newTransactionMacros.isExpenditureSwitch transaction/> <#-- name --> <@newTransactionMacros.transactionName transaction suggestionsJSON/> diff --git a/src/main/resources/templates/transactions/newTransactionRepeating.ftl b/src/main/resources/templates/transactions/newTransactionRepeating.ftl index 1fbd570c8..6c30e5862 100644 --- a/src/main/resources/templates/transactions/newTransactionRepeating.ftl +++ b/src/main/resources/templates/transactions/newTransactionRepeating.ftl @@ -29,7 +29,7 @@ <input type="hidden" name="isRepeating" value="${transaction.isRepeating()?c}"> <#-- isPayment switch --> - <@newTransactionMacros.isExpenditureSwitch transaction isPayment/> + <@newTransactionMacros.isExpenditureSwitch transaction/> <#-- name --> <@newTransactionMacros.transactionName transaction suggestionsJSON/> diff --git a/src/main/resources/templates/transactions/newTransactionTransfer.ftl b/src/main/resources/templates/transactions/newTransactionTransfer.ftl index 66329a093..a4bbc948d 100644 --- a/src/main/resources/templates/transactions/newTransactionTransfer.ftl +++ b/src/main/resources/templates/transactions/newTransactionTransfer.ftl @@ -29,7 +29,7 @@ <!-- only set ID for transactions not templates, otherwise the input is filled with the template ID and saving the transaction may then override an existing transactions if the ID is also already used in transactions table --> <input type="hidden" name="ID" value="<#if transaction.class.simpleName == "Transaction" && transaction.getID()??>${transaction.getID()?c}</#if>"> - <input type="hidden" name="isPayment" value="true"> + <input type="hidden" name="isExpenditure" value="true"> <#-- name --> <@newTransactionMacros.transactionName transaction suggestionsJSON/> -- GitLab