From a9df49cf6dc7ae3b60fc9f9d562f3c5fdea171e3 Mon Sep 17 00:00:00 2001 From: Florian Hartmann Date: Wed, 26 Feb 2020 18:31:07 +0100 Subject: [PATCH] partly calculate analysis and improve amount formatting --- .../templates/financeplanner/index.html | 14 ++++++++++- financeplanner/templatetags/custom_tags.py | 4 +++- financeplanner/utils.py | 2 +- financeplanner/views.py | 23 +++++++++++++++++++ 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/financeplanner/templates/financeplanner/index.html b/financeplanner/templates/financeplanner/index.html index 1845cbe..0391a30 100644 --- a/financeplanner/templates/financeplanner/index.html +++ b/financeplanner/templates/financeplanner/index.html @@ -49,12 +49,24 @@

Analysis

+ + + + + + + + - + + + + + diff --git a/financeplanner/templatetags/custom_tags.py b/financeplanner/templatetags/custom_tags.py index 0e81e83..9200e44 100644 --- a/financeplanner/templatetags/custom_tags.py +++ b/financeplanner/templatetags/custom_tags.py @@ -2,10 +2,12 @@ from decimal import Decimal from django import template +from financeplanner.utils import format_price + register = template.Library() @register.filter(name="euro") def euro(value): assert isinstance(value, Decimal) - return str(value) + "€" + return format_price(value) or "-" diff --git a/financeplanner/utils.py b/financeplanner/utils.py index d6e7606..7404a6a 100644 --- a/financeplanner/utils.py +++ b/financeplanner/utils.py @@ -18,7 +18,7 @@ def round_with_dec_places(number, places): def format_price(number): if number is None: return None - return f"{round_with_dec_places(number, 2)}€" + return f"{round_with_dec_places(number, 2)} €" def _count_rates(start, end, months_delta): diff --git a/financeplanner/views.py b/financeplanner/views.py index a0cae42..5d53edd 100644 --- a/financeplanner/views.py +++ b/financeplanner/views.py @@ -176,6 +176,27 @@ def _build_graph_data(range_start, range_end, calculation_start, balance_list, a return stats +def _calculate_analysis(user): + result = {} + + today = datetime.now().date() + booked = Q(booking_date__lte=today) + outgoing = Q(amount__gt=0) + incoming = Q(amount__lt=0) + recurring = Q(recurring_months__isnull=False) & ( + Q(not_recurring_after__isnull=True) | Q(not_recurring_after__gte=today)) + + out_trans = user.transactions.filter(booked & outgoing & recurring) + out_trans_per_month = [t.amount / t.recurring_months for t in out_trans] + result["avg_monthly_out"] = sum(out_trans_per_month) + + in_trans = user.transactions.filter(booked & incoming & recurring) + in_trans_per_month = [t.amount / t.recurring_months for t in in_trans] + result["avg_monthly_in"] = -sum(in_trans_per_month) + + return result + + @login_required def index(request): user = request.user @@ -190,6 +211,7 @@ def index(request): graph_data = _build_graph_data(range_start, range_end, calculation_start, balance_list, actual_transactions) else: graph_data = None + analysis = _calculate_analysis(user) context = { "range_start": range_start, "range_end": range_end, @@ -198,5 +220,6 @@ def index(request): "transaction_list": transaction_list, "actual_transactions": sorted(actual_transactions, key=lambda t: t[0]), "graph_data": graph_data, + "analysis": analysis, } return render(request, "financeplanner/index.html", context)
avg outgoing transactions / month{{ analysis.avg_monthly_out|euro }}
avg incoming transactions / month{{ analysis.avg_monthly_in|euro }}
irregular expenses / month 0
avg outgoing transactions / monthirregular expenses / week0
irregular expenses / day 0