diff --git a/nummi/transaction/templates/transaction/transaction_archive_year.html b/nummi/transaction/templates/transaction/transaction_archive_year.html
new file mode 100644
index 0000000..2f0cf71
--- /dev/null
+++ b/nummi/transaction/templates/transaction/transaction_archive_year.html
@@ -0,0 +1,23 @@
+{% extends "transaction/transaction_list.html" %}
+{% load i18n main_extras static category %}
+{% block link %}
+ {{ block.super }}
+ {% css "main/css/plot.css" %}
+{% endblock %}
+{% block h2 %}{{ year|date:"Y" }}{% endblock %}
+{% block table %}
+ {% if history %}
+
+
+ {% translate "History" %}
+
+ {% include "history/plot.html" %}
+
+ {% endif %}
+ {% if not category %}
+
{% translate "Categories" %}
+ {% category_plot transactions month=month %}
+ {% endif %}
+ {% translate "Transactions" %}
+ {{ block.super }}
+{% endblock %}
diff --git a/nummi/transaction/urls.py b/nummi/transaction/urls.py
index cba5e2e..7c62eb8 100644
--- a/nummi/transaction/urls.py
+++ b/nummi/transaction/urls.py
@@ -4,6 +4,11 @@ from . import views
urlpatterns = [
path("list", views.TransactionListView.as_view(), name="transactions"),
+ path(
+ "history/",
+ views.TransactionYearView.as_view(),
+ name="transaction_year",
+ ),
path(
"history//",
views.TransactionMonthView.as_view(),
diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py
index f7464cd..fb1a900 100644
--- a/nummi/transaction/views.py
+++ b/nummi/transaction/views.py
@@ -2,7 +2,8 @@ from account.models import Account
from category.models import Category
from django.shortcuts import get_object_or_404
from django.urls import reverse_lazy
-from django.views.generic.dates import MonthArchiveView
+from django.views.generic.dates import MonthArchiveView, YearArchiveView
+from history.utils import history
from main.views import (
NummiCreateView,
NummiDeleteView,
@@ -138,3 +139,39 @@ class TransactionMonthView(UserMixin, MonthArchiveView):
if "account" in self.kwargs:
return context_data | {"account": self.account}
return context_data
+
+
+class TransactionYearView(UserMixin, YearArchiveView):
+ model = Transaction
+ date_field = "date"
+ context_object_name = "transactions"
+ make_object_list = True
+
+ def get_queryset(self):
+ if "account" in self.kwargs:
+ self.account = get_object_or_404(
+ Account.objects.filter(user=self.request.user),
+ pk=self.kwargs["account"],
+ )
+ return super().get_queryset().filter(account=self.account)
+ if "category" in self.kwargs:
+ self.category = get_object_or_404(
+ Category.objects.filter(user=self.request.user),
+ pk=self.kwargs["category"],
+ )
+ return super().get_queryset().filter(category=self.category)
+
+ return super().get_queryset()
+
+ def get_context_data(self, **kwargs):
+ context_data = super().get_context_data(**kwargs)
+ context_data |= {
+ "history": history(
+ context_data["transactions"].exclude(category__budget=False)
+ ),
+ }
+ if "category" in self.kwargs:
+ return context_data | {"category": self.category}
+ if "account" in self.kwargs:
+ return context_data | {"account": self.account}
+ return context_data