diff --git a/core/templates/core/user_account.jinja b/core/templates/core/user_account.jinja
index d36f5432..dfc3cdd8 100644
--- a/core/templates/core/user_account.jinja
+++ b/core/templates/core/user_account.jinja
@@ -1,5 +1,31 @@
{% extends "core/base.jinja" %}
+{% macro monthly(obj) %}
+
+
+
+ {% trans %}Year{% endtrans %} |
+ {% trans %}Month{% endtrans %} |
+ {% trans %}Total{% endtrans %} |
+
+
+
+ {% for array in obj %}
+ {% for tuple in array %}
+ {% if tuple[0] != 0 %}
+ {% set link=url('core:user_account_detail', user_id=profile.id, year=tuple[1].year, month=tuple[1].month) %}
+
+ {{ tuple[1].year }} |
+ {{ tuple[1]|date("E") }} |
+ {{ tuple[0] }} € |
+
+ {% endif %}
+ {% endfor %}
+ {% endfor %}
+
+
+{% endmacro %}
+
{% block title %}
{% trans user_name=profile.get_display_name() %}{{ user_name }}'s account{% endtrans %}
{% endblock %}
@@ -10,114 +36,16 @@
{% trans %}Amount: {% endtrans %}{{ customer.amount }} €
{% if customer.refillings.exists() %}
{% trans %}Refillings{% endtrans %}
-
-
-
- {% trans %}Date{% endtrans %} |
- {% trans %}Counter{% endtrans %} |
- {% trans %}Barman{% endtrans %} |
- {% trans %}Amount{% endtrans %} |
- {% trans %}Payment method{% endtrans %} |
-
-
-
- {% for i in customer.refillings.order_by('-date').all() %}
-
- {{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }} |
- {{ i.counter }} |
- {{ i.operator.get_display_name() }} |
- {{ i.amount }} € |
- {{ i.get_payment_method_display() }} |
- {% if i.is_owned_by(user) %}
- Delete |
- {% endif %}
-
-{% endfor %}
-
-
+ {{ monthly(refilling_month) }}
{% endif %}
{% if customer.buyings.exists() %}
{% trans %}Account buyings{% endtrans %}
-
-
-
- {% trans %}Date{% endtrans %} |
- {% trans %}Counter{% endtrans %} |
- {% trans %}Barman{% endtrans %} |
- {% trans %}Label{% endtrans %} |
- {% trans %}Quantity{% endtrans %} |
- {% trans %}Total{% endtrans %} |
- {% trans %}Payment method{% endtrans %} |
-
-
-
- {% for i in customer.buyings.order_by('-date').all() %}
-
- {{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }} |
- {{ i.counter }} |
- {{ i.seller.get_display_name() }} |
- {{ i.label }} |
- {{ i.quantity }} |
- {{ i.quantity * i.unit_price }} € |
- {{ i.get_payment_method_display() }} |
- {% if i.is_owned_by(user) %}
- Delete |
- {% endif %}
-
-{% endfor %}
-
-
+ {{ monthly(buyings_month) }}
{% endif %}
{% if customer.user.invoices.exists() %}
{% trans %}Eboutic invoices{% endtrans %}
-
-
-
- {% trans %}Date{% endtrans %} |
- {% trans %}Items{% endtrans %} |
- {% trans %}Amount{% endtrans %} |
-
-
-
- {% for i in customer.user.invoices.order_by('-date').all() %}
-
- {{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }} |
-
-
- {% for it in i.items.all() %}
- - {{ it.quantity }} x {{ it.product_name }} - {{ it.product_unit_price }} €
- {% endfor %}
-
- |
- {{ i.get_total() }} € |
-
-{% endfor %}
-
-
+ {{ monthly(invoices_month) }}
{% endif %}
-{% trans %}Account buyings{% endtrans %}
-
-
-
- {% trans %}Year{% endtrans %} |
- {% trans %}Month{% endtrans %} |
- {% trans %}Total{% endtrans %} |
-
-
-
- {% for array in selling_months %}
- {% for tuple in array %}
- {% if tuple[0] != 0 %}
-
- {{ tuple[1].year }} |
- {{ tuple[1]|date("E") }} |
- {{ tuple[0] }} € |
-
- {% endif %}
- {% endfor %}
- {% endfor %}
-
-
{% else %}
{% trans %}User has no account{% endtrans %}
{% endif %}
diff --git a/core/templates/core/user_account_detail.jinja b/core/templates/core/user_account_detail.jinja
new file mode 100644
index 00000000..5c352b3c
--- /dev/null
+++ b/core/templates/core/user_account_detail.jinja
@@ -0,0 +1,102 @@
+{% extends "core/base.jinja" %}
+
+{% block title %}
+{% trans user_name=profile.get_display_name() %}{{ user_name }}'s account{% endtrans %}
+{% endblock %}
+
+{% block content %}
+{% if customer %}
+{% trans %}User account{% endtrans %}
+{% trans %}Amount: {% endtrans %}{{ customer.amount }} €
+{% if customer.refillings.exists() %}
+{% trans %}Refillings{% endtrans %}
+
+
+
+ {% trans %}Date{% endtrans %} |
+ {% trans %}Counter{% endtrans %} |
+ {% trans %}Barman{% endtrans %} |
+ {% trans %}Amount{% endtrans %} |
+ {% trans %}Payment method{% endtrans %} |
+
+
+
+ {% for i in customer.refillings.order_by('-date').all() %}
+
+ {{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }} |
+ {{ i.counter }} |
+ {{ i.operator.get_display_name() }} |
+ {{ i.amount }} € |
+ {{ i.get_payment_method_display() }} |
+ {% if i.is_owned_by(user) %}
+ Delete |
+ {% endif %}
+
+{% endfor %}
+
+
+{% endif %}
+{% if customer.buyings.exists() %}
+{% trans %}Account buyings{% endtrans %}
+
+
+
+ {% trans %}Date{% endtrans %} |
+ {% trans %}Counter{% endtrans %} |
+ {% trans %}Barman{% endtrans %} |
+ {% trans %}Label{% endtrans %} |
+ {% trans %}Quantity{% endtrans %} |
+ {% trans %}Total{% endtrans %} |
+ {% trans %}Payment method{% endtrans %} |
+
+
+
+ {% for i in customer.buyings.order_by('-date').all() %}
+
+ {{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }} |
+ {{ i.counter }} |
+ {{ i.seller.get_display_name() }} |
+ {{ i.label }} |
+ {{ i.quantity }} |
+ {{ i.quantity * i.unit_price }} € |
+ {{ i.get_payment_method_display() }} |
+ {% if i.is_owned_by(user) %}
+ Delete |
+ {% endif %}
+
+{% endfor %}
+
+
+{% endif %}
+{% if customer.user.invoices.exists() %}
+{% trans %}Eboutic invoices{% endtrans %}
+
+
+
+ {% trans %}Date{% endtrans %} |
+ {% trans %}Items{% endtrans %} |
+ {% trans %}Amount{% endtrans %} |
+
+
+
+ {% for i in customer.user.invoices.order_by('-date').all() %}
+
+ {{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }} |
+
+
+ {% for it in i.items.all() %}
+ - {{ it.quantity }} x {{ it.product_name }} - {{ it.product_unit_price }} €
+ {% endfor %}
+
+ |
+ {{ i.get_total() }} € |
+
+{% endfor %}
+
+
+{% endif %}
+{% else %}
+{% trans %}User has no account{% endtrans %}
+{% endif %}
+Retour
+{% endblock %}
diff --git a/core/urls.py b/core/urls.py
index baeae800..94767c20 100644
--- a/core/urls.py
+++ b/core/urls.py
@@ -37,6 +37,7 @@ urlpatterns = [
url(r'^user/(?P[0-9]+)/groups$', UserUpdateGroupView.as_view(), name='user_groups'),
url(r'^user/tools/$', UserToolsView.as_view(), name='user_tools'),
url(r'^user/(?P[0-9]+)/account$', UserAccountView.as_view(), name='user_account'),
+ url(r'^user/(?P[0-9]+)/account/(?P[0-9]+)/(?P[0-9]+)$', UserAccountDetailView.as_view(), name='user_account_detail'),
url(r'^user/(?P[0-9]+)/stats$', UserStatsView.as_view(), name='user_stats'),
# File views
diff --git a/core/views/user.py b/core/views/user.py
index e0b5950d..716a2ffd 100644
--- a/core/views/user.py
+++ b/core/views/user.py
@@ -11,6 +11,7 @@ from django.forms.models import modelform_factory
from django.forms import CheckboxSelectMultiple
from django.template.response import TemplateResponse
from django.conf import settings
+from django.views.generic.dates import YearMixin, MonthMixin
from django.utils import timezone
from datetime import timedelta, datetime, date
@@ -300,24 +301,31 @@ class UserToolsView(UserTabsMixin, TemplateView):
kwargs['object'] = self.request.user
return kwargs
-class UserAccountView(UserTabsMixin, DetailView):
+class UserAccountBase(UserTabsMixin, DetailView):
"""
- Display a user's account
+ Base class for UserAccount
"""
+
model = User
pk_url_kwarg = "user_id"
- template_name = "core/user_account.jinja"
current_tab = "account"
def dispatch(self, request, *arg, **kwargs): # Manually validates the rights
- res = super(UserAccountView, self).dispatch(request, *arg, **kwargs)
+ res = super(UserAccountBase, self).dispatch(request, *arg, **kwargs)
if (self.object == request.user
or request.user.is_in_group(settings.SITH_GROUPS['accounting-admin']['name'])
or request.user.is_root):
return res
raise PermissionDenied
- def expense_by_month(self):
+class UserAccountView(UserAccountBase):
+ """
+ Display a user's account
+ """
+
+ template_name = "core/user_account.jinja"
+
+ def expense_by_month(self, obj, calc):
stats = []
joined = self.object.date_joined.year
@@ -329,13 +337,13 @@ class UserAccountView(UserTabsMixin, DetailView):
for y in years:
stats.append([])
for m in months:
- q = self.object.customer.buyings.filter(
+ q = obj.filter(
date__year=joined + y,
date__month=m,
)
stats[y].append(
(
- sum([p.unit_price * p.quantity for p in q]),
+ sum([calc(p) for p in q]),
date(joined + y, m, 17)
)
)
@@ -343,15 +351,55 @@ class UserAccountView(UserTabsMixin, DetailView):
print(stats)
return stats
+ def buyings_calc(self, query):
+ return query.unit_price * query.quantity
+
+ def invoices_calc(self, query):
+ t = 0
+ for it in query.items.all():
+ t += it.quantity * it.product_unit_price
+ return t
+
+ def refilling_calc(self, query):
+ return query.amount
+
def get_context_data(self, **kwargs):
kwargs = super(UserAccountView, self).get_context_data(**kwargs)
kwargs['profile'] = self.object
try:
kwargs['customer'] = self.object.customer
- kwargs['selling_months'] = self.expense_by_month()
+ kwargs['buyings_month'] = self.expense_by_month(
+ self.object.customer.buyings,
+ self.buyings_calc
+ )
+ kwargs['invoices_month'] = self.expense_by_month(
+ self.object.customer.user.invoices,
+ self.invoices_calc
+ )
+ kwargs['refilling_month'] = self.expense_by_month(
+ self.object.customer.refillings,
+ self.refilling_calc
+ )
except:
pass
# TODO: add list of month where account has activity
return kwargs
+
+class UserAccountDetailView(UserAccountBase, YearMixin, MonthMixin):
+ """
+ Display a user's account for month
+ """
+
+ template_name = "core/user_account_detail.jinja"
+
+ def get_context_data(self, **kwargs):
+ kwargs = super(UserAccountDetailView, self).get_context_data(**kwargs)
+ kwargs['profile'] = self.object
+ try:
+ kwargs['customer'] = self.object.customer
+ except:
+ pass
+ kwargs['tab'] = "account"
+ return kwargs