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
+
+ | 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 / month |
+ irregular expenses / week |
+ 0 |
+
+
+ | irregular expenses / day |
0 |
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)