From 153e221f11200878492f90d43e28b61ca64ce0d8 Mon Sep 17 00:00:00 2001 From: MK13 Date: Thu, 19 May 2022 10:56:05 +0200 Subject: [PATCH] #29 Projected cash flow --- .../financer/controller/ReportController.java | 30 ++++---- ...ctedCashFlowForPeriodTransactionsForm.java | 68 ++++++++++++++----- ...rojectedCashFlowForPeriodTransactions.html | 56 +++++++++------ 3 files changed, 103 insertions(+), 51 deletions(-) diff --git a/financer-web-client/src/main/java/de/financer/controller/ReportController.java b/financer-web-client/src/main/java/de/financer/controller/ReportController.java index 7cfb6cc..0f529d2 100644 --- a/financer-web-client/src/main/java/de/financer/controller/ReportController.java +++ b/financer-web-client/src/main/java/de/financer/controller/ReportController.java @@ -150,27 +150,25 @@ public class ReportController { new ParameterizedTypeReference>() { }); - final List incomeTransactions = new ArrayList<>(); - final List expenseTransactions = new ArrayList<>(); + final ConfigProjectedCashFlowForPeriodTransactionsForm formTransactions = + new ConfigProjectedCashFlowForPeriodTransactionsForm( + ControllerUtils.parseDate(this.financerConfig, form.getFromDate()), + ControllerUtils.parseDate(this.financerConfig, form.getToDate())); final EnumMap> bookingRules = new EnumMap<>(AccountType.class); bookingRules.put(BANK, Arrays.asList(BANK, EXPENSE, LIABILITY)); bookingRules.put(CASH, Arrays.asList(EXPENSE, LIABILITY)); IterableUtils.toList(trxs).stream() - .flatMap(dto -> IterableUtils.toList(dto.getRecurringTransactions()).stream()).forEach(rt -> { - if (AccountType.INCOME == rt.getFromAccount().getType()) { - incomeTransactions.add(rt); - } else if (bookingRules.getOrDefault(rt.getFromAccount().getType(), Collections.EMPTY_LIST) - .contains(rt.getToAccount().getType())) { - expenseTransactions.add(rt); - } - }); - - ConfigProjectedCashFlowForPeriodTransactionsForm formTransactions = - new ConfigProjectedCashFlowForPeriodTransactionsForm(incomeTransactions, expenseTransactions, - ControllerUtils.parseDate(this.financerConfig, form.getFromDate()), - ControllerUtils.parseDate(this.financerConfig, form.getToDate())); + .forEach(dto -> IterableUtils.toList(dto.getRecurringTransactions()).stream().forEach(rt -> { + if (AccountType.INCOME == rt.getFromAccount().getType()) { + formTransactions.addIncomeTransaction(dto.getDate(), rt); + } else if (bookingRules.getOrDefault(rt.getFromAccount().getType(), Collections.EMPTY_LIST) + .contains(rt.getToAccount().getType())) { + formTransactions.addExpenseTransaction(dto.getDate(), rt); + } + } + )); final ResponseEntity> response = new GetAllAccountsTemplate().exchange(this.financerConfig); @@ -188,6 +186,8 @@ public class ReportController { return "report/configureProjectedCashFlowForPeriodTransactions"; } catch (FinancerRestException e) { + e.printStackTrace(); + model.addAttribute("errorMessage", e.getResponseReason().name()); model.addAttribute("form", form); ControllerUtils.addVersionAttribute(model, this.financerConfig); diff --git a/financer-web-client/src/main/java/de/financer/form/ConfigProjectedCashFlowForPeriodTransactionsForm.java b/financer-web-client/src/main/java/de/financer/form/ConfigProjectedCashFlowForPeriodTransactionsForm.java index 24ad0e5..725cbe9 100644 --- a/financer-web-client/src/main/java/de/financer/form/ConfigProjectedCashFlowForPeriodTransactionsForm.java +++ b/financer-web-client/src/main/java/de/financer/form/ConfigProjectedCashFlowForPeriodTransactionsForm.java @@ -83,8 +83,38 @@ public class ConfigProjectedCashFlowForPeriodTransactionsForm { } } - private List incomeTransactions; - private List expenseTransactions; + public static class RecurringTransactionContainer { + private RecurringTransaction recurringTransaction; + private LocalDate date; + + public RecurringTransactionContainer() { + + } + + public RecurringTransactionContainer(RecurringTransaction recurringTransaction, LocalDate date) { + this.date = date; + this.recurringTransaction = recurringTransaction; + } + + public RecurringTransaction getRecurringTransaction() { + return recurringTransaction; + } + + public void setRecurringTransaction(RecurringTransaction recurringTransaction) { + this.recurringTransaction = recurringTransaction; + } + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + } + + private List incomeTransactions; + private List expenseTransactions; private List accountGroupAccountContainers; private long incomeSum; private long expenseSum; @@ -99,23 +129,21 @@ public class ConfigProjectedCashFlowForPeriodTransactionsForm { this.accountGroupAccountContainers = new ArrayList<>(); } - public ConfigProjectedCashFlowForPeriodTransactionsForm(List incomeTransactions, - List expenseTransactions, - LocalDate fromDate, LocalDate toDate + public ConfigProjectedCashFlowForPeriodTransactionsForm(LocalDate fromDate, LocalDate toDate ) { - this.incomeTransactions = incomeTransactions; - this.expenseTransactions = expenseTransactions; + this.incomeTransactions = new ArrayList<>(); + this.expenseTransactions = new ArrayList<>(); this.accountGroupAccountContainers = new ArrayList<>(); this.fromDate = fromDate; this.toDate = toDate; - - Collections.sort(this.incomeTransactions, Comparator.comparing(RecurringTransaction::getAmount)); - Collections.sort(this.expenseTransactions, Comparator.comparing(RecurringTransaction::getAmount)); } public void refresh() { - this.incomeSum = incomeTransactions.stream().mapToLong(RecurringTransaction::getAmount).sum(); - this.expenseSum = expenseTransactions.stream().mapToLong(RecurringTransaction::getAmount).sum(); + Collections.sort(this.incomeTransactions, Comparator.comparing(con -> con.getRecurringTransaction().getAmount())); + Collections.sort(this.expenseTransactions, Comparator.comparing(con -> con.getRecurringTransaction().getAmount())); + + this.incomeSum = incomeTransactions.stream().mapToLong(con -> con.getRecurringTransaction().getAmount()).sum(); + this.expenseSum = expenseTransactions.stream().mapToLong(con -> con.getRecurringTransaction().getAmount()).sum(); this.cashFlow = this.incomeSum - this.expenseSum; this.accountSum = this.accountGroupAccountContainers.stream().map(AccountGroupAccountContainer::getAccounts) @@ -125,19 +153,19 @@ public class ConfigProjectedCashFlowForPeriodTransactionsForm { this.cashFlow = this.cashFlow - this.accountSum; } - public List getIncomeTransactions() { + public List getIncomeTransactions() { return incomeTransactions; } - public void setIncomeTransactions(List incomeTransactions) { + public void setIncomeTransactions(List incomeTransactions) { this.incomeTransactions = incomeTransactions; } - public List getExpenseTransactions() { + public List getExpenseTransactions() { return expenseTransactions; } - public void setExpenseTransactions(List expenseTransactions) { + public void setExpenseTransactions(List expenseTransactions) { this.expenseTransactions = expenseTransactions; } @@ -157,6 +185,14 @@ public class ConfigProjectedCashFlowForPeriodTransactionsForm { .collect(Collectors.toList()))); } + public void addIncomeTransaction(LocalDate date, RecurringTransaction recurringTransaction) { + this.incomeTransactions.add(new RecurringTransactionContainer(recurringTransaction, date)); + } + + public void addExpenseTransaction(LocalDate date, RecurringTransaction recurringTransaction) { + this.expenseTransactions.add(new RecurringTransactionContainer(recurringTransaction, date)); + } + public long getIncomeSum() { return incomeSum; } diff --git a/financer-web-client/src/main/resources/templates/report/configureProjectedCashFlowForPeriodTransactions.html b/financer-web-client/src/main/resources/templates/report/configureProjectedCashFlowForPeriodTransactions.html index ff1505c..b7a2d2e 100644 --- a/financer-web-client/src/main/resources/templates/report/configureProjectedCashFlowForPeriodTransactions.html +++ b/financer-web-client/src/main/resources/templates/report/configureProjectedCashFlowForPeriodTransactions.html @@ -12,8 +12,10 @@

- - + +
@@ -24,14 +26,17 @@ @@ -41,14 +46,17 @@ @@ -56,13 +64,14 @@ @@ -98,10 +112,12 @@ + th:value="#{financer.report-config-projected-cashflow-for-period-transactions.label.button.refresh}" + class="noprint"/> + th:value="#{financer.report-config-projected-cashflow-for-period-transactions.label.button.create}" + class="noprint"/> -
+
\ No newline at end of file
- - + + + - + - +
- - + + + - + - +
+ class="report-config-projected-cashflow-for-period-transactions-table-average-spending noprint"/>
- - + + @@ -73,18 +82,23 @@
- + - +