mirror of
https://github.com/ae-utbm/sith.git
synced 2024-11-26 02:54:20 +00:00
Monthly user account
This commit is contained in:
parent
78bf4b7b84
commit
a64b10776e
@ -1,5 +1,31 @@
|
|||||||
{% extends "core/base.jinja" %}
|
{% extends "core/base.jinja" %}
|
||||||
|
|
||||||
|
{% macro monthly(obj) %}
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td>{% trans %}Year{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Month{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Total{% endtrans %}</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% 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) %}
|
||||||
|
<tr>
|
||||||
|
<td><a href="{{ link }}">{{ tuple[1].year }}</a></td>
|
||||||
|
<td><a href="{{ link }}">{{ tuple[1]|date("E") }}</a></td>
|
||||||
|
<td><a href="{{ link }}">{{ tuple[0] }} €</a></td>
|
||||||
|
</tr>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{% trans user_name=profile.get_display_name() %}{{ user_name }}'s account{% endtrans %}
|
{% trans user_name=profile.get_display_name() %}{{ user_name }}'s account{% endtrans %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -10,114 +36,16 @@
|
|||||||
<p>{% trans %}Amount: {% endtrans %}{{ customer.amount }} €</p>
|
<p>{% trans %}Amount: {% endtrans %}{{ customer.amount }} €</p>
|
||||||
{% if customer.refillings.exists() %}
|
{% if customer.refillings.exists() %}
|
||||||
<h4>{% trans %}Refillings{% endtrans %}</h4>
|
<h4>{% trans %}Refillings{% endtrans %}</h4>
|
||||||
<table>
|
{{ monthly(refilling_month) }}
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<td>{% trans %}Date{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Counter{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Barman{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Amount{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Payment method{% endtrans %}</td>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for i in customer.refillings.order_by('-date').all() %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td>
|
|
||||||
<td>{{ i.counter }}</td>
|
|
||||||
<td><a href="{{ i.operator.get_absolute_url() }}">{{ i.operator.get_display_name() }}</a></td>
|
|
||||||
<td>{{ i.amount }} €</td>
|
|
||||||
<td>{{ i.get_payment_method_display() }}</td>
|
|
||||||
{% if i.is_owned_by(user) %}
|
|
||||||
<td><a href="{{ url('counter:refilling_delete', refilling_id=i.id) }}">Delete</a></td>
|
|
||||||
{% endif %}
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if customer.buyings.exists() %}
|
{% if customer.buyings.exists() %}
|
||||||
<h4>{% trans %}Account buyings{% endtrans %}</h4>
|
<h4>{% trans %}Account buyings{% endtrans %}</h4>
|
||||||
<table>
|
{{ monthly(buyings_month) }}
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<td>{% trans %}Date{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Counter{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Barman{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Label{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Quantity{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Total{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Payment method{% endtrans %}</td>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for i in customer.buyings.order_by('-date').all() %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td>
|
|
||||||
<td>{{ i.counter }}</td>
|
|
||||||
<td><a href="{{ i.seller.get_absolute_url() }}">{{ i.seller.get_display_name() }}</a></td>
|
|
||||||
<td>{{ i.label }}</td>
|
|
||||||
<td>{{ i.quantity }}</td>
|
|
||||||
<td>{{ i.quantity * i.unit_price }} €</td>
|
|
||||||
<td>{{ i.get_payment_method_display() }}</td>
|
|
||||||
{% if i.is_owned_by(user) %}
|
|
||||||
<td><a href="{{ url('counter:selling_delete', selling_id=i.id) }}">Delete</a></td>
|
|
||||||
{% endif %}
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if customer.user.invoices.exists() %}
|
{% if customer.user.invoices.exists() %}
|
||||||
<h4>{% trans %}Eboutic invoices{% endtrans %}</h4>
|
<h4>{% trans %}Eboutic invoices{% endtrans %}</h4>
|
||||||
<table>
|
{{ monthly(invoices_month) }}
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<td>{% trans %}Date{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Items{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Amount{% endtrans %}</td>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for i in customer.user.invoices.order_by('-date').all() %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td>
|
|
||||||
<td>
|
|
||||||
<ul>
|
|
||||||
{% for it in i.items.all() %}
|
|
||||||
<li>{{ it.quantity }} x {{ it.product_name }} - {{ it.product_unit_price }} €</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</td>
|
|
||||||
<td>{{ i.get_total() }} €</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<h4>{% trans %}Account buyings{% endtrans %}</h4>
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<td>{% trans %}Year{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Month{% endtrans %}</td>
|
|
||||||
<td>{% trans %}Total{% endtrans %}</td>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for array in selling_months %}
|
|
||||||
{% for tuple in array %}
|
|
||||||
{% if tuple[0] != 0 %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ tuple[1].year }}</td>
|
|
||||||
<td>{{ tuple[1]|date("E") }}</td>
|
|
||||||
<td>{{ tuple[0] }} €</td>
|
|
||||||
</tr>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<p>{% trans %}User has no account{% endtrans %}</p>
|
<p>{% trans %}User has no account{% endtrans %}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
102
core/templates/core/user_account_detail.jinja
Normal file
102
core/templates/core/user_account_detail.jinja
Normal file
@ -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 %}
|
||||||
|
<h3>{% trans %}User account{% endtrans %}</h3>
|
||||||
|
<p>{% trans %}Amount: {% endtrans %}{{ customer.amount }} €</p>
|
||||||
|
{% if customer.refillings.exists() %}
|
||||||
|
<h4>{% trans %}Refillings{% endtrans %}</h4>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td>{% trans %}Date{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Counter{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Barman{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Amount{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Payment method{% endtrans %}</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for i in customer.refillings.order_by('-date').all() %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td>
|
||||||
|
<td>{{ i.counter }}</td>
|
||||||
|
<td><a href="{{ i.operator.get_absolute_url() }}">{{ i.operator.get_display_name() }}</a></td>
|
||||||
|
<td>{{ i.amount }} €</td>
|
||||||
|
<td>{{ i.get_payment_method_display() }}</td>
|
||||||
|
{% if i.is_owned_by(user) %}
|
||||||
|
<td><a href="{{ url('counter:refilling_delete', refilling_id=i.id) }}">Delete</a></td>
|
||||||
|
{% endif %}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endif %}
|
||||||
|
{% if customer.buyings.exists() %}
|
||||||
|
<h4>{% trans %}Account buyings{% endtrans %}</h4>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td>{% trans %}Date{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Counter{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Barman{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Label{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Quantity{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Total{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Payment method{% endtrans %}</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for i in customer.buyings.order_by('-date').all() %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td>
|
||||||
|
<td>{{ i.counter }}</td>
|
||||||
|
<td><a href="{{ i.seller.get_absolute_url() }}">{{ i.seller.get_display_name() }}</a></td>
|
||||||
|
<td>{{ i.label }}</td>
|
||||||
|
<td>{{ i.quantity }}</td>
|
||||||
|
<td>{{ i.quantity * i.unit_price }} €</td>
|
||||||
|
<td>{{ i.get_payment_method_display() }}</td>
|
||||||
|
{% if i.is_owned_by(user) %}
|
||||||
|
<td><a href="{{ url('counter:selling_delete', selling_id=i.id) }}">Delete</a></td>
|
||||||
|
{% endif %}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endif %}
|
||||||
|
{% if customer.user.invoices.exists() %}
|
||||||
|
<h4>{% trans %}Eboutic invoices{% endtrans %}</h4>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td>{% trans %}Date{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Items{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Amount{% endtrans %}</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for i in customer.user.invoices.order_by('-date').all() %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td>
|
||||||
|
<td>
|
||||||
|
<ul>
|
||||||
|
{% for it in i.items.all() %}
|
||||||
|
<li>{{ it.quantity }} x {{ it.product_name }} - {{ it.product_unit_price }} €</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
<td>{{ i.get_total() }} €</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
<p>{% trans %}User has no account{% endtrans %}</p>
|
||||||
|
{% endif %}
|
||||||
|
<p><a href="{{ url('core:user_account', user_id=profile.id) }}">Retour</a></p>
|
||||||
|
{% endblock %}
|
@ -37,6 +37,7 @@ urlpatterns = [
|
|||||||
url(r'^user/(?P<user_id>[0-9]+)/groups$', UserUpdateGroupView.as_view(), name='user_groups'),
|
url(r'^user/(?P<user_id>[0-9]+)/groups$', UserUpdateGroupView.as_view(), name='user_groups'),
|
||||||
url(r'^user/tools/$', UserToolsView.as_view(), name='user_tools'),
|
url(r'^user/tools/$', UserToolsView.as_view(), name='user_tools'),
|
||||||
url(r'^user/(?P<user_id>[0-9]+)/account$', UserAccountView.as_view(), name='user_account'),
|
url(r'^user/(?P<user_id>[0-9]+)/account$', UserAccountView.as_view(), name='user_account'),
|
||||||
|
url(r'^user/(?P<user_id>[0-9]+)/account/(?P<year>[0-9]+)/(?P<month>[0-9]+)$', UserAccountDetailView.as_view(), name='user_account_detail'),
|
||||||
url(r'^user/(?P<user_id>[0-9]+)/stats$', UserStatsView.as_view(), name='user_stats'),
|
url(r'^user/(?P<user_id>[0-9]+)/stats$', UserStatsView.as_view(), name='user_stats'),
|
||||||
|
|
||||||
# File views
|
# File views
|
||||||
|
@ -11,6 +11,7 @@ from django.forms.models import modelform_factory
|
|||||||
from django.forms import CheckboxSelectMultiple
|
from django.forms import CheckboxSelectMultiple
|
||||||
from django.template.response import TemplateResponse
|
from django.template.response import TemplateResponse
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.views.generic.dates import YearMixin, MonthMixin
|
||||||
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from datetime import timedelta, datetime, date
|
from datetime import timedelta, datetime, date
|
||||||
@ -300,24 +301,31 @@ class UserToolsView(UserTabsMixin, TemplateView):
|
|||||||
kwargs['object'] = self.request.user
|
kwargs['object'] = self.request.user
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
class UserAccountView(UserTabsMixin, DetailView):
|
class UserAccountBase(UserTabsMixin, DetailView):
|
||||||
"""
|
"""
|
||||||
Display a user's account
|
Base class for UserAccount
|
||||||
"""
|
"""
|
||||||
|
|
||||||
model = User
|
model = User
|
||||||
pk_url_kwarg = "user_id"
|
pk_url_kwarg = "user_id"
|
||||||
template_name = "core/user_account.jinja"
|
|
||||||
current_tab = "account"
|
current_tab = "account"
|
||||||
|
|
||||||
def dispatch(self, request, *arg, **kwargs): # Manually validates the rights
|
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
|
if (self.object == request.user
|
||||||
or request.user.is_in_group(settings.SITH_GROUPS['accounting-admin']['name'])
|
or request.user.is_in_group(settings.SITH_GROUPS['accounting-admin']['name'])
|
||||||
or request.user.is_root):
|
or request.user.is_root):
|
||||||
return res
|
return res
|
||||||
raise PermissionDenied
|
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 = []
|
stats = []
|
||||||
joined = self.object.date_joined.year
|
joined = self.object.date_joined.year
|
||||||
|
|
||||||
@ -329,13 +337,13 @@ class UserAccountView(UserTabsMixin, DetailView):
|
|||||||
for y in years:
|
for y in years:
|
||||||
stats.append([])
|
stats.append([])
|
||||||
for m in months:
|
for m in months:
|
||||||
q = self.object.customer.buyings.filter(
|
q = obj.filter(
|
||||||
date__year=joined + y,
|
date__year=joined + y,
|
||||||
date__month=m,
|
date__month=m,
|
||||||
)
|
)
|
||||||
stats[y].append(
|
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)
|
date(joined + y, m, 17)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -343,15 +351,55 @@ class UserAccountView(UserTabsMixin, DetailView):
|
|||||||
print(stats)
|
print(stats)
|
||||||
return 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):
|
def get_context_data(self, **kwargs):
|
||||||
kwargs = super(UserAccountView, self).get_context_data(**kwargs)
|
kwargs = super(UserAccountView, self).get_context_data(**kwargs)
|
||||||
kwargs['profile'] = self.object
|
kwargs['profile'] = self.object
|
||||||
try:
|
try:
|
||||||
kwargs['customer'] = self.object.customer
|
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:
|
except:
|
||||||
pass
|
pass
|
||||||
# TODO: add list of month where account has activity
|
# TODO: add list of month where account has activity
|
||||||
return kwargs
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user