From 12a8b805fa2ad564f17ddeb3024c32e724bd3804 Mon Sep 17 00:00:00 2001 From: MK13 Date: Sun, 5 May 2019 02:03:02 +0200 Subject: [PATCH] Stuff all over the place --- .../de/financer/config/FinancerConfig.java | 9 + .../controller/AccountController.java | 41 ++++- .../RecurringTransactionController.java | 162 +++++++++++++++--- .../controller/TransactionController.java | 60 ++++++- .../RecurringToTransactionWithAmountForm.java | 31 ++++ .../de/financer/util/ControllerUtils.java | 5 + .../de/financer/util/TransactionUtils.java | 64 +++++++ .../TransactionByDateComparator.java | 12 ++ .../resources/config/application.properties | 2 +- src/main/resources/i18n/message.properties | 7 +- .../resources/i18n/message_de_DE.properties | 11 +- src/main/resources/static/css/main.css | 19 +- .../templates/account/accountDetails.html | 7 +- .../templates/account/accountOverview.html | 1 + .../templates/account/newAccount.html | 3 +- .../resources/templates/includes/footer.html | 4 + .../newRecurringTransaction.html | 3 +- .../recurringToTransactionWithAmount.html | 22 +++ .../recurringTransactionList.html | 14 +- .../templates/transaction/newTransaction.html | 2 +- 20 files changed, 422 insertions(+), 57 deletions(-) create mode 100644 src/main/java/de/financer/form/RecurringToTransactionWithAmountForm.java create mode 100644 src/main/java/de/financer/util/TransactionUtils.java create mode 100644 src/main/java/de/financer/util/comparator/TransactionByDateComparator.java create mode 100644 src/main/resources/templates/includes/footer.html create mode 100644 src/main/resources/templates/recurringTransaction/recurringToTransactionWithAmount.html diff --git a/src/main/java/de/financer/config/FinancerConfig.java b/src/main/java/de/financer/config/FinancerConfig.java index 91a368d..26438a0 100644 --- a/src/main/java/de/financer/config/FinancerConfig.java +++ b/src/main/java/de/financer/config/FinancerConfig.java @@ -12,6 +12,7 @@ public class FinancerConfig { private String serverUrl; private String dateFormat; + private String version; public String getServerUrl() { return serverUrl; @@ -28,4 +29,12 @@ public class FinancerConfig { public void setDateFormat(String dateFormat) { this.dateFormat = dateFormat; } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } } diff --git a/src/main/java/de/financer/controller/AccountController.java b/src/main/java/de/financer/controller/AccountController.java index 9fa2b36..c17a11f 100644 --- a/src/main/java/de/financer/controller/AccountController.java +++ b/src/main/java/de/financer/controller/AccountController.java @@ -6,6 +6,8 @@ import de.financer.controller.template.*; import de.financer.form.NewAccountForm; import de.financer.model.*; import de.financer.util.ControllerUtils; +import de.financer.util.TransactionUtils; +import de.financer.util.comparator.TransactionByDateComparator; import org.apache.commons.collections4.IterableUtils; import org.apache.commons.lang3.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -16,6 +18,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.util.UriComponentsBuilder; +import java.util.List; + @Controller public class AccountController { @Autowired @@ -34,6 +38,7 @@ public class AccountController { model.addAttribute("rtDueTodayCount", IterableUtils.size(rtDtRes.getBody())); model.addAttribute("rtAllActiveCount", IterableUtils.size(rtAllActRes.getBody())); model.addAttribute("showClosed", showClosedBoolean); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "account/accountOverview"; } @@ -41,25 +46,27 @@ public class AccountController { @GetMapping("/newAccount") public String newAccount(Model model) { model.addAttribute("accounttypes", AccountType.valueList()); - model.addAttribute("newAccountForm", new NewAccountForm()); + model.addAttribute("form", new NewAccountForm()); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "account/newAccount"; } @PostMapping("/saveAccount") - public String saveAccont(NewAccountForm newAccountForm, Model model) { + public String saveAccont(NewAccountForm form, Model model) { final UriComponentsBuilder builder = UriComponentsBuilder .fromHttpUrl(ControllerUtils.buildUrl(this.financerConfig, Function.ACC_CREATE_ACCOUNT)) - .queryParam("key", newAccountForm.getKey()) - .queryParam("type", newAccountForm.getType()); + .queryParam("key", form.getKey()) + .queryParam("type", form.getType()); final ResponseEntity response = new StringTemplate().exchange(builder); final ResponseReason responseReason = ResponseReason.fromResponseEntity(response); if (!ResponseReason.OK.equals(responseReason)) { - model.addAttribute("form", newAccountForm); + model.addAttribute("form", form); model.addAttribute("accounttypes", AccountType.valueList()); model.addAttribute("errorMessage", responseReason.name()); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "account/newAccount"; } @@ -74,9 +81,15 @@ public class AccountController { final ResponseEntity> transactionResponse = new GetAllTransactionsForAccountTemplate() .exchange(this.financerConfig, account.getKey()); + List transactions = IterableUtils.toList(transactionResponse.getBody()); + + transactions.sort(new TransactionByDateComparator()); + transactions.stream().forEach((t) -> TransactionUtils.adjustAmount(t, account)); + model.addAttribute("account", account); - model.addAttribute("transactions", IterableUtils.toList(transactionResponse.getBody())); + model.addAttribute("transactions", transactions); model.addAttribute("isClosed", AccountStatus.CLOSED.equals(account.getStatus())); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "account/accountDetails"; } @@ -97,10 +110,16 @@ public class AccountController { final ResponseEntity> transactionResponse = new GetAllTransactionsForAccountTemplate() .exchange(this.financerConfig, account.getKey()); + List transactions = IterableUtils.toList(transactionResponse.getBody()); + + transactions.sort(new TransactionByDateComparator()); + transactions.stream().forEach((t) -> TransactionUtils.adjustAmount(t, account)); + model.addAttribute("account", account); - model.addAttribute("transactions", IterableUtils.toList(transactionResponse.getBody())); + model.addAttribute("transactions", transactions); model.addAttribute("isClosed", AccountStatus.CLOSED.equals(account.getStatus())); model.addAttribute("errorMessage", responseReason.name()); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "account/accountDetails"; } @@ -124,10 +143,16 @@ public class AccountController { final ResponseEntity> transactionResponse = new GetAllTransactionsForAccountTemplate() .exchange(this.financerConfig, account.getKey()); + List transactions = IterableUtils.toList(transactionResponse.getBody()); + + transactions.sort(new TransactionByDateComparator()); + transactions.stream().forEach((t) -> TransactionUtils.adjustAmount(t, account)); + model.addAttribute("account", account); - model.addAttribute("transactions", IterableUtils.toList(transactionResponse.getBody())); + model.addAttribute("transactions", transactions); model.addAttribute("isClosed", AccountStatus.CLOSED.equals(account.getStatus())); model.addAttribute("errorMessage", responseReason.name()); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "account/accountDetails"; } diff --git a/src/main/java/de/financer/controller/RecurringTransactionController.java b/src/main/java/de/financer/controller/RecurringTransactionController.java index 397efc1..68417ba 100644 --- a/src/main/java/de/financer/controller/RecurringTransactionController.java +++ b/src/main/java/de/financer/controller/RecurringTransactionController.java @@ -4,6 +4,7 @@ import de.financer.ResponseReason; import de.financer.config.FinancerConfig; import de.financer.controller.template.*; import de.financer.form.NewRecurringTransactionForm; +import de.financer.form.RecurringToTransactionWithAmountForm; import de.financer.model.Account; import de.financer.model.HolidayWeekendType; import de.financer.model.IntervalType; @@ -17,6 +18,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.util.UriComponentsBuilder; +import java.util.ArrayList; + @Controller public class RecurringTransactionController { @@ -30,33 +33,24 @@ public class RecurringTransactionController { model.addAttribute("accounts", ControllerUtils.filterAndSortAccounts(response.getBody())); model.addAttribute("intervalTypes", IntervalType.valueList()); model.addAttribute("holidayWeekendTypes", HolidayWeekendType.valueList()); - model.addAttribute("newRecurringTransactionForm", new NewRecurringTransactionForm()); + model.addAttribute("form", new NewRecurringTransactionForm()); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "recurringTransaction/newRecurringTransaction"; } @PostMapping("/saveRecurringTransaction") - public String saveRecurringTransaction(NewRecurringTransactionForm newRecurringTransactionForm, Model model) { + public String saveRecurringTransaction(NewRecurringTransactionForm form, Model model) { final UriComponentsBuilder builder = UriComponentsBuilder .fromHttpUrl(ControllerUtils.buildUrl(this.financerConfig, Function.RT_CREATE_RECURRING_TRANSACTION)) - .queryParam("fromAccountKey", newRecurringTransactionForm - .getFromAccountKey()) - .queryParam("toAccountKey", newRecurringTransactionForm - .getToAccountKey()) - .queryParam("amount", newRecurringTransactionForm - .getAmount()) - .queryParam("firstOccurrence", ControllerUtils - .formatDate(this.financerConfig, newRecurringTransactionForm - .getFirstOccurrence())) - .queryParam("lastOccurrence", ControllerUtils - .formatDate(this.financerConfig, newRecurringTransactionForm - .getLastOccurrence())) - .queryParam("holidayWeekendType", newRecurringTransactionForm - .getHolidayWeekendType()) - .queryParam("intervalType", newRecurringTransactionForm - .getIntervalType()) - .queryParam("description", newRecurringTransactionForm - .getDescription()); + .queryParam("fromAccountKey", form.getFromAccountKey()) + .queryParam("toAccountKey", form.getToAccountKey()) + .queryParam("amount", form.getAmount()) + .queryParam("firstOccurrence", ControllerUtils.formatDate(this.financerConfig, form.getFirstOccurrence())) + .queryParam("lastOccurrence", ControllerUtils.formatDate(this.financerConfig, form.getLastOccurrence())) + .queryParam("holidayWeekendType", form.getHolidayWeekendType()) + .queryParam("intervalType", form.getIntervalType()) + .queryParam("description", form.getDescription()); final ResponseEntity response = new StringTemplate().exchange(builder); @@ -69,8 +63,9 @@ public class RecurringTransactionController { model.addAttribute("accounts", ControllerUtils.filterAndSortAccounts(getAllResponse.getBody())); model.addAttribute("intervalTypes", IntervalType.valueList()); model.addAttribute("holidayWeekendTypes", HolidayWeekendType.valueList()); - model.addAttribute("form", newRecurringTransactionForm); + model.addAttribute("form", form); model.addAttribute("errorMessage", responseReason.name()); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "recurringTransaction/newRecurringTransaction"; } @@ -85,6 +80,7 @@ public class RecurringTransactionController { model.addAttribute("recurringTransactions", response.getBody()); model.addAttribute("subTitle", "dueToday"); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "recurringTransaction/recurringTransactionList"; } @@ -96,6 +92,7 @@ public class RecurringTransactionController { model.addAttribute("recurringTransactions", response.getBody()); model.addAttribute("subTitle", "active"); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "recurringTransaction/recurringTransactionList"; } @@ -107,7 +104,130 @@ public class RecurringTransactionController { model.addAttribute("recurringTransactions", response.getBody()); model.addAttribute("subTitle", "all"); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "recurringTransaction/recurringTransactionList"; } + + @GetMapping("/deleteRecurringTransaction") + public String deleteRecurringTransaction(String recurringTransactionId, Model model) { + final UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(ControllerUtils.buildUrl(this.financerConfig, Function.RT_DELETE_RECURRING_TRANSACTION)) + .queryParam("recurringTransactionId", recurringTransactionId); + + final ResponseEntity response = new StringTemplate().exchange(builder); + final ResponseReason responseReason = ResponseReason.fromResponseEntity(response); + final ResponseEntity> allResponse = new GetAllRecurringTransactionsTemplate() + .exchange(this.financerConfig); + + model.addAttribute("recurringTransactions", allResponse.getBody()); + model.addAttribute("subTitle", "all"); + ControllerUtils.addVersionAttribute(model, this.financerConfig); + + if (!ResponseReason.OK.equals(responseReason)) { + model.addAttribute("errorMessage", responseReason.name()); + + return "recurringTransaction/recurringTransactionList"; + } + + return "recurringTransaction/recurringTransactionList"; + } + + @GetMapping("/recurringToTransaction") + public String recurringToTransaction(String recurringTransactionId, String sub, Model model) { + final UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(ControllerUtils.buildUrl(this.financerConfig, Function.RT_CREATE_TRANSACTION)) + .queryParam("recurringTransactionId", recurringTransactionId); + + final ResponseEntity response = new StringTemplate().exchange(builder); + final ResponseReason responseReason = ResponseReason.fromResponseEntity(response); + + if (!ResponseReason.OK.equals(responseReason)) { + model.addAttribute("errorMessage", responseReason.name()); + model.addAttribute("subTitle", sub); + ControllerUtils.addVersionAttribute(model, this.financerConfig); + + Iterable recurringTransactions; + + switch (sub) { + case "all": + recurringTransactions = new GetAllRecurringTransactionsTemplate() + .exchange(this.financerConfig).getBody(); + break; + case "active": + recurringTransactions = new GetAllRecurringTransactionsTemplate() + .exchange(this.financerConfig).getBody(); + break; + case "dueToday": + recurringTransactions = new GetAllRecurringTransactionsDueTodayTemplate() + .exchange(this.financerConfig).getBody(); + break; + default: + recurringTransactions = new ArrayList<>(); + } + + model.addAttribute("recurringTransactions", recurringTransactions); + + return "recurringTransaction/recurringTransactionList"; + } + + return "redirect:/accountOverview"; + } + + @GetMapping("/recurringToTransactionWithAmount") + public String recurringToTransactionWithAmount(String recurringTransactionId, String sub, Model model) { + ControllerUtils.addVersionAttribute(model, this.financerConfig); + + RecurringToTransactionWithAmountForm form = new RecurringToTransactionWithAmountForm(); + + form.setRecurringTransactionId(recurringTransactionId); + form.setSubTitle(sub); + + model.addAttribute("form", form); + + return "recurringTransaction/recurringToTransactionWithAmount"; + } + + @PostMapping("/createTransactionWithAmount") + public String createTransactionWithAmount(RecurringToTransactionWithAmountForm form, Model model) { + final UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(ControllerUtils.buildUrl(this.financerConfig, Function.RT_CREATE_TRANSACTION)) + .queryParam("recurringTransactionId", form.getRecurringTransactionId()) + .queryParam("amount", form.getAmount()); + + final ResponseEntity response = new StringTemplate().exchange(builder); + final ResponseReason responseReason = ResponseReason.fromResponseEntity(response); + + if (!ResponseReason.OK.equals(responseReason)) { + model.addAttribute("errorMessage", responseReason.name()); + model.addAttribute("subTitle", form.getSubTitle()); + ControllerUtils.addVersionAttribute(model, this.financerConfig); + + Iterable recurringTransactions; + + switch (form.getSubTitle()) { + case "all": + recurringTransactions = new GetAllRecurringTransactionsTemplate() + .exchange(this.financerConfig).getBody(); + break; + case "active": + recurringTransactions = new GetAllRecurringTransactionsTemplate() + .exchange(this.financerConfig).getBody(); + break; + case "dueToday": + recurringTransactions = new GetAllRecurringTransactionsDueTodayTemplate() + .exchange(this.financerConfig).getBody(); + break; + default: + recurringTransactions = new ArrayList<>(); + } + + model.addAttribute("recurringTransactions", recurringTransactions); + + return "recurringTransaction/recurringTransactionList"; + } + + return "redirect:/accountOverview"; + } + } diff --git a/src/main/java/de/financer/controller/TransactionController.java b/src/main/java/de/financer/controller/TransactionController.java index 6eeec4c..edce268 100644 --- a/src/main/java/de/financer/controller/TransactionController.java +++ b/src/main/java/de/financer/controller/TransactionController.java @@ -2,11 +2,18 @@ package de.financer.controller; import de.financer.ResponseReason; import de.financer.config.FinancerConfig; +import de.financer.controller.template.GetAccountByKeyTemplate; import de.financer.controller.template.GetAllAccountsTemplate; +import de.financer.controller.template.GetAllTransactionsForAccountTemplate; import de.financer.controller.template.StringTemplate; import de.financer.form.NewTransactionForm; import de.financer.model.Account; +import de.financer.model.AccountStatus; +import de.financer.model.Transaction; import de.financer.util.ControllerUtils; +import de.financer.util.TransactionUtils; +import de.financer.util.comparator.TransactionByDateComparator; +import org.apache.commons.collections4.IterableUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; @@ -15,6 +22,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.util.UriComponentsBuilder; +import java.util.List; + @Controller public class TransactionController { @@ -26,20 +35,21 @@ public class TransactionController { final ResponseEntity> response = new GetAllAccountsTemplate().exchange(this.financerConfig); model.addAttribute("accounts", ControllerUtils.filterAndSortAccounts(response.getBody())); - model.addAttribute("newTransactionForm", new NewTransactionForm()); + model.addAttribute("form", new NewTransactionForm()); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "transaction/newTransaction"; } @PostMapping("/saveTransaction") - public String saveTransaction(NewTransactionForm newTransactionForm, Model model) { + public String saveTransaction(NewTransactionForm form, Model model) { final UriComponentsBuilder builder = UriComponentsBuilder .fromHttpUrl(ControllerUtils.buildUrl(this.financerConfig, Function.TR_CREATE_TRANSACTION)) - .queryParam("fromAccountKey", newTransactionForm.getFromAccountKey()) - .queryParam("toAccountKey", newTransactionForm.getToAccountKey()) - .queryParam("amount", newTransactionForm.getAmount()) - .queryParam("date", ControllerUtils.formatDate(this.financerConfig, newTransactionForm.getDate())) - .queryParam("description", newTransactionForm.getDescription()); + .queryParam("fromAccountKey", form.getFromAccountKey()) + .queryParam("toAccountKey", form.getToAccountKey()) + .queryParam("amount", form.getAmount()) + .queryParam("date", ControllerUtils.formatDate(this.financerConfig, form.getDate())) + .queryParam("description", form.getDescription()); final ResponseEntity response = new StringTemplate().exchange(builder); final ResponseReason responseReason = ResponseReason.fromResponseEntity(response); @@ -48,12 +58,46 @@ public class TransactionController { final ResponseEntity> accRes = new GetAllAccountsTemplate().exchange(this.financerConfig); model.addAttribute("accounts", ControllerUtils.filterAndSortAccounts(accRes.getBody())); - model.addAttribute("form", newTransactionForm); + model.addAttribute("form", form); model.addAttribute("errorMessage", responseReason.name()); + ControllerUtils.addVersionAttribute(model, this.financerConfig); return "transaction/newTransaction"; } return "redirect:/accountOverview"; } + + @GetMapping("/deleteTransaction") + public String deleteTransaction(String transactionId, String accountKey, Model model) { + final UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(ControllerUtils.buildUrl(this.financerConfig, Function.TR_DELETE_TRANSACTION)) + .queryParam("transactionId", transactionId); + + final ResponseEntity response = new StringTemplate().exchange(builder); + final ResponseReason responseReason = ResponseReason.fromResponseEntity(response); + + final ResponseEntity accountResponse = new GetAccountByKeyTemplate().exchange(this.financerConfig, accountKey); + final Account account = accountResponse.getBody(); + final ResponseEntity> transactionResponse = new GetAllTransactionsForAccountTemplate() + .exchange(this.financerConfig, account.getKey()); + + List transactions = IterableUtils.toList(transactionResponse.getBody()); + + transactions.sort(new TransactionByDateComparator()); + transactions.stream().forEach((t) -> TransactionUtils.adjustAmount(t, account)); + + model.addAttribute("account", account); + model.addAttribute("transactions", transactions); + model.addAttribute("isClosed", AccountStatus.CLOSED.equals(account.getStatus())); + ControllerUtils.addVersionAttribute(model, this.financerConfig); + + if (!ResponseReason.OK.equals(responseReason)) { + model.addAttribute("errorMessage", responseReason.name()); + + return "account/accountDetails"; + } + + return "account/accountDetails"; + } } diff --git a/src/main/java/de/financer/form/RecurringToTransactionWithAmountForm.java b/src/main/java/de/financer/form/RecurringToTransactionWithAmountForm.java new file mode 100644 index 0000000..44c3e79 --- /dev/null +++ b/src/main/java/de/financer/form/RecurringToTransactionWithAmountForm.java @@ -0,0 +1,31 @@ +package de.financer.form; + +public class RecurringToTransactionWithAmountForm { + private String recurringTransactionId; + private String amount; + private String subTitle; + + public String getRecurringTransactionId() { + return recurringTransactionId; + } + + public void setRecurringTransactionId(String recurringTransactionId) { + this.recurringTransactionId = recurringTransactionId; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public String getSubTitle() { + return subTitle; + } + + public void setSubTitle(String subTitle) { + this.subTitle = subTitle; + } +} diff --git a/src/main/java/de/financer/util/ControllerUtils.java b/src/main/java/de/financer/util/ControllerUtils.java index b9debf2..64ce300 100644 --- a/src/main/java/de/financer/util/ControllerUtils.java +++ b/src/main/java/de/financer/util/ControllerUtils.java @@ -8,6 +8,7 @@ import de.financer.model.RecurringTransaction; import de.financer.util.comparator.AccountByTypeComparator; import org.apache.commons.collections4.IterableUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.ui.Model; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -47,4 +48,8 @@ public class ControllerUtils { .filter((rt) -> rt.getFromAccount() != null && rt.getToAccount() != null) .collect(Collectors.toList()); } + + public static void addVersionAttribute(Model model, FinancerConfig financerConfig) { + model.addAttribute("financerVersion", financerConfig.getVersion()); + } } diff --git a/src/main/java/de/financer/util/TransactionUtils.java b/src/main/java/de/financer/util/TransactionUtils.java new file mode 100644 index 0000000..444d3d0 --- /dev/null +++ b/src/main/java/de/financer/util/TransactionUtils.java @@ -0,0 +1,64 @@ +package de.financer.util; + +import de.financer.model.Account; +import de.financer.model.AccountType; +import de.financer.model.Transaction; + +import static de.financer.model.AccountType.*; + +public class TransactionUtils { + public static final void adjustAmount(Transaction t, Account account) { + boolean isFrom = t.getFromAccount().getKey().equals(account.getKey()); + + if (AccountType.START.equals(t.getFromAccount().getType()) && AccountType.LIABILITY.equals(t.getToAccount().getType())) { + return; + } + + if (isFrom) { + t.setAmount(t.getAmount() * TransactionUtils.getMultiplierFromAccount(account)); + } + else { + t.setAmount(t.getAmount() * TransactionUtils.getMultiplierToAccount(account)); + } + } + + public static long getMultiplierFromAccount(Account fromAccount) { + // There is no multiplier if the from account is an EXPENSE account because + // it's not a valid from account type + + final AccountType accountType = fromAccount.getType(); + + if (INCOME.equals(accountType)) { + return 1L; + } else if (BANK.equals(accountType)) { + return -1L; + } else if (CASH.equals(accountType)) { + return -1L; + } else if (LIABILITY.equals(accountType)) { + return 1L; + } else if (START.equals(accountType)) { + return 1L; + } + + return 1L; + } + + public static long getMultiplierToAccount(Account toAccount) { + // There are no multipliers for INCOME and START accounts + // because they are not valid to account types + + final AccountType accountType = toAccount.getType(); + + if (BANK.equals(accountType)) { + return 1L; + } else if (CASH.equals(accountType)) { + return 1L; + } else if (LIABILITY.equals(accountType)) { + return -1L; + } else if (EXPENSE.equals(accountType)) { + return 1L; + } + + return -1L; + } +} diff --git a/src/main/java/de/financer/util/comparator/TransactionByDateComparator.java b/src/main/java/de/financer/util/comparator/TransactionByDateComparator.java new file mode 100644 index 0000000..c445fc8 --- /dev/null +++ b/src/main/java/de/financer/util/comparator/TransactionByDateComparator.java @@ -0,0 +1,12 @@ +package de.financer.util.comparator; + +import de.financer.model.Transaction; + +import java.util.Comparator; + +public class TransactionByDateComparator implements Comparator { + @Override + public int compare(Transaction o1, Transaction o2) { + return o1.getDate().compareTo(o2.getDate()) * -1; + } +} diff --git a/src/main/resources/config/application.properties b/src/main/resources/config/application.properties index 3da6796..38f476d 100644 --- a/src/main/resources/config/application.properties +++ b/src/main/resources/config/application.properties @@ -19,7 +19,7 @@ logging.file=financer-web-client.log # The date format of the client-supplied date string, used to parse the string into a proper object financer.dateFormat=dd.MM.yyyy - +financer.version=@project.version@ financer.serverUrl=http://localhost:8089/financer-server/ spring.messages.basename=i18n/message \ No newline at end of file diff --git a/src/main/resources/i18n/message.properties b/src/main/resources/i18n/message.properties index b2adb1f..51565ac 100644 --- a/src/main/resources/i18n/message.properties +++ b/src/main/resources/i18n/message.properties @@ -73,6 +73,7 @@ financer.account-details.title=financer\: account details financer.account-details.available-actions=Available actions\: financer.account-details.available-actions.close-account=Close account financer.account-details.available-actions.open-account=Open account +financer.account-details.available-actions.back-to-overview=Back to overview financer.account-details.table-header.id=ID financer.account-details.table-header.fromAccount=From account financer.account-details.table-header.toAccount=To account @@ -83,9 +84,12 @@ financer.account-details.table-header.byRecurring=Recurring? financer.account-details.details.type=Type\: financer.account-details.details.balance=Current Balance\: financer.account-details.table-header.actions=Actions -financer.account-details.table.actions.editTransaction=Edit financer.account-details.table.actions.deleteTransaction=Delete +financer.recurring-to-transaction-with-amount.title=financer\: create transaction from recurring with amount +financer.recurring-to-transaction-with-amount.label.amount=Amount\: +financer.recurring-to-transaction-with-amount.submit=Create + financer.interval-type.DAILY=Daily financer.interval-type.WEEKLY=Weekly financer.interval-type.MONTHLY=Monthly @@ -114,6 +118,7 @@ financer.heading.account-details=financer\: account details for {0} financer.heading.recurring-transaction-list.dueToday=financer\: recurring transactions due today financer.heading.recurring-transaction-list.active=financer\: active recurring transactions financer.heading.recurring-transaction-list.all=financer\: all recurring transaction +financer.heading.recurring-to-transaction-with-amount=financer\: create transaction from recurring with amount financer.error-message.UNKNOWN_ERROR=An unknown error occurred! financer.error-message.INVALID_ACCOUNT_TYPE=The selected account type is not valid! diff --git a/src/main/resources/i18n/message_de_DE.properties b/src/main/resources/i18n/message_de_DE.properties index 045cf67..7c99954 100644 --- a/src/main/resources/i18n/message_de_DE.properties +++ b/src/main/resources/i18n/message_de_DE.properties @@ -73,6 +73,7 @@ financer.account-details.title=financer\: Kontodetails financer.account-details.available-actions=Verf\u00FCgbare Aktionen\: financer.account-details.available-actions.close-account=Konto schlie\u00DFen financer.account-details.available-actions.open-account=Konto \u00F6ffnen +financer.account-details.available-actions.back-to-overview=Zur\u00FCck zur \u00DCbersicht financer.account-details.table-header.id=ID financer.account-details.table-header.fromAccount=Von Konto financer.account-details.table-header.toAccount=An Konto @@ -83,8 +84,11 @@ financer.account-details.table-header.byRecurring=Wiederkehrend? financer.account-details.details.type=Typ\: financer.account-details.details.balance=Kontostand\: financer.account-details.table-header.actions=Aktionen -financer.account-details.table.actions.editTransaction=Bearbeiten -financer.account-details.table.actions.deleteTransaction=Löschen +financer.account-details.table.actions.deleteTransaction=L\u00F6schen + +financer.recurring-to-transaction-with-amount.title=financer\: Buchung mit Betrag aus wiederkehrender Buchung erstellen +financer.recurring-to-transaction-with-amount.label.amount=Betrag\: +financer.recurring-to-transaction-with-amount.submit=Erstellen financer.interval-type.DAILY=T\u00E4glich financer.interval-type.WEEKLY=W\u00F6chentlich @@ -113,4 +117,5 @@ financer.heading.account-overview=financer\: \u00DCbersicht financer.heading.account-details=financer\: Kontodetails f\u00FCr {0} financer.heading.recurring-transaction-list.dueToday=financer\: wiederkehrende Buchungen heute f\u00E4llig financer.heading.recurring-transaction-list.active=financer\: aktive wiederkehrende Buchungen -financer.heading.recurring-transaction-list.all=financer\: alle wiederkehrende Buchungen \ No newline at end of file +financer.heading.recurring-transaction-list.all=financer\: alle wiederkehrende Buchungen +financer.heading.recurring-to-transaction-with-amount=financer\: Buchung mit Betrag aus wiederkehrender Buchung erstellen \ No newline at end of file diff --git a/src/main/resources/static/css/main.css b/src/main/resources/static/css/main.css index eb6b2d9..d3ef84a 100644 --- a/src/main/resources/static/css/main.css +++ b/src/main/resources/static/css/main.css @@ -55,13 +55,28 @@ tr:hover { #new-account-form *, #new-transaction-form *, -#new-recurring-transaction-form * { +#new-recurring-transaction-form *, +#recurring-to-transaction-with-amount-form * { display: block; margin-top: 1em; width: 20em; box-sizing: border-box; } +#footer-container * { + display: block; +} + +#footer-container > hr { + width: 100%; +} + +#footer-container > span { + text-align: center; + font-size: 0.9em; +} + .errorMessage { - color: #ff6666 + color: #ff6666; + display: block; } \ No newline at end of file diff --git a/src/main/resources/templates/account/accountDetails.html b/src/main/resources/templates/account/accountDetails.html index e721517..73cf347 100644 --- a/src/main/resources/templates/account/accountDetails.html +++ b/src/main/resources/templates/account/accountDetails.html @@ -25,6 +25,8 @@ th:text="#{financer.account-details.available-actions.close-account}"/> + @@ -47,13 +49,12 @@
+
\ No newline at end of file diff --git a/src/main/resources/templates/account/accountOverview.html b/src/main/resources/templates/account/accountOverview.html index 559e24d..cb63874 100644 --- a/src/main/resources/templates/account/accountOverview.html +++ b/src/main/resources/templates/account/accountOverview.html @@ -50,5 +50,6 @@ +
\ No newline at end of file diff --git a/src/main/resources/templates/account/newAccount.html b/src/main/resources/templates/account/newAccount.html index c046626..6534c6c 100644 --- a/src/main/resources/templates/account/newAccount.html +++ b/src/main/resources/templates/account/newAccount.html @@ -9,7 +9,7 @@

-
+