Ajout des relevés

This commit is contained in:
Aurélien Delobelle 2016-08-11 15:14:23 +02:00
parent fb8882d06e
commit 996baa944c
9 changed files with 147 additions and 20 deletions

View file

@ -2,7 +2,8 @@ from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.forms import modelformset_factory from django.forms import modelformset_factory
from kfet.models import Account, Checkout, Article, OperationGroup, Operation from kfet.models import (Account, Checkout, Article, OperationGroup, Operation,
CheckoutStatement)
from gestioncof.models import CofProfile from gestioncof.models import CofProfile
# ----- # -----
@ -97,6 +98,11 @@ class CheckoutRestrictForm(CheckoutForm):
class Meta(CheckoutForm.Meta): class Meta(CheckoutForm.Meta):
fields = ['name', 'valid_from', 'valid_to'] fields = ['name', 'valid_from', 'valid_to']
class CheckoutStatementForm(forms.ModelForm):
class Meta:
model = CheckoutStatement
fields = ['balance_new', 'amount_taken']
# ----- # -----
# Article forms # Article forms
# ----- # -----

View file

@ -6,6 +6,7 @@ from django.contrib.auth.models import User
from gestioncof.models import CofProfile from gestioncof.models import CofProfile
from django.utils.six.moves import reduce from django.utils.six.moves import reduce
from django.utils import timezone from django.utils import timezone
from django.db import transaction
from datetime import date, timedelta from datetime import date, timedelta
import re import re
@ -260,6 +261,22 @@ class CheckoutStatement(models.Model):
amount_error = models.DecimalField(max_digits = 6, decimal_places = 2) amount_error = models.DecimalField(max_digits = 6, decimal_places = 2)
at = models.DateTimeField(auto_now_add = True) at = models.DateTimeField(auto_now_add = True)
def __str__(self):
return '%s %s' % (self.checkout, self.at)
def save(self, *args, **kwargs):
if not self.pk:
checkout_id = self.checkout_id
self.balance_old = (Checkout.objects
.values_list('balance', flat=True).get(pk=checkout_id))
self.amount_error = (
self.balance_new + self.amount_taken - self.balance_old)
with transaction.atomic():
Checkout.objects.filter(pk=checkout_id).update(balance=self.balance_new)
super(CheckoutStatement, self).save(*args, **kwargs)
else:
super(CheckoutStatement, self).save(*args, **kwargs)
class ArticleCategory(models.Model): class ArticleCategory(models.Model):
name = models.CharField(max_length = 45) name = models.CharField(max_length = 45)

View file

@ -27,7 +27,7 @@
<p>Statut COF: {{ account.is_cof }}</p> <p>Statut COF: {{ account.is_cof }}</p>
<p>Compte gelé: {{ account.is_frozen }}</p> <p>Compte gelé: {{ account.is_frozen }}</p>
<p>Solde: {{ account.balance }} €</p> <p>Solde: {{ account.balance }} €</p>
{% if account.balance != account.real_balance %} {% if account.negative.balance_offset %}
<p>Solde réel: {{ account.real_balance }} €</p> <p>Solde réel: {{ account.real_balance }} €</p>
{% endif %} {% endif %}
{% if account.negative.authorized_overdraft %} {% if account.negative.authorized_overdraft %}

View file

@ -8,7 +8,7 @@
<ul> <ul>
{% for checkout in checkouts %} {% for checkout in checkouts %}
<li><a href="{% url 'kfet.checkout.update' checkout.pk %}">{{ checkout }}</a></li> <li><a href="{% url 'kfet.checkout.read' checkout.pk %}">{{ checkout }}</a></li>
{% endfor %} {% endfor %}
</ul> </ul>

View file

@ -12,10 +12,30 @@
</p> </p>
{% endif %} {% endif %}
<p>
<a href="{% url 'kfet.checkoutstatement.create' checkout.pk %}">
Effectuer un relevé
</a>
<p>
<p>Nom: {{ checkout.name }}</p> <p>Nom: {{ checkout.name }}</p>
<p>Valide du {{ checkout.valid_from|date:'l j F Y, G:i' }} au {{ checkout.valid_to|date:'l j F Y, G:i' }}</p> <p>Valide du {{ checkout.valid_from|date:'l j F Y, G:i' }} au {{ checkout.valid_to|date:'l j F Y, G:i' }}</p>
<p>Créée par: {{ checkout.created_by }}</p> <p>Créée par: {{ checkout.created_by }}</p>
<p>Balance: {{ checkout.balance }} €</p> <p>Balance: {{ checkout.balance }} €</p>
<p>Protected: {{ checkout.is_protected }}</p> <p>Protected: {{ checkout.is_protected }}</p>
Relevés:
{% with statements=checkout.statements.all %}
{% if not statements %}
Pas de relevé
{% else %}
<ul>
{% for statement in statements %}
<li>{{ statement }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</ul>
{% endblock %} {% endblock %}

View file

@ -0,0 +1,13 @@
{% extends "kfet/base.html" %}
{% block title %}Relevés{% endblock %}
{% block content %}
<ul>
{% for statement in checkoutstatements %}
<li>{{ statement }}</li>
{% endfor %}
</ul>
{% endblock %}

View file

@ -0,0 +1,15 @@
{% extends "kfet/base.html" %}
{% block title %}Nouveau relevé{% endblock %}
{% block content %}
En caisse : {{ checkout.balance }}
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Enregistrer">
</form>
{% endblock %}

View file

@ -12,29 +12,29 @@ urlpatterns = [
# ----- # -----
# Account - General # Account - General
url(r'^account/$', views.account, url(r'^accounts/$', views.account,
name = 'kfet.account'), name = 'kfet.account'),
url(r'^account/is_validandfree$', views.account_is_validandfree_ajax, url(r'^accounts/is_validandfree$', views.account_is_validandfree_ajax,
name = 'kfet.account.is_validandfree.ajax'), name = 'kfet.account.is_validandfree.ajax'),
# Account - Create # Account - Create
url(r'^account/new$', views.account_create, url(r'^accounts/new$', views.account_create,
name = 'kfet.account.create'), name = 'kfet.account.create'),
url(r'^account/new/user/(?P<username>.+)$', views.account_create_ajax, url(r'^accounts/new/user/(?P<username>.+)$', views.account_create_ajax,
name = 'kfet.account.create.fromuser'), name = 'kfet.account.create.fromuser'),
url(r'^account/new/clipper/(?P<login_clipper>.+)$', views.account_create_ajax, url(r'^accounts/new/clipper/(?P<login_clipper>.+)$', views.account_create_ajax,
name = 'kfet.account.create.fromclipper'), name = 'kfet.account.create.fromclipper'),
url(r'^account/new/empty$', views.account_create_ajax, url(r'^accounts/new/empty$', views.account_create_ajax,
name = 'kfet.account.create.empty'), name = 'kfet.account.create.empty'),
url(r'^autocomplete/account_new$', autocomplete.account_create, url(r'^autocomplete/account_new$', autocomplete.account_create,
name = 'kfet.account.create.autocomplete'), name = 'kfet.account.create.autocomplete'),
# Account - Read # Account - Read
url(r'^account/(?P<trigramme>.{3})$', views.account_read, url(r'^accounts/(?P<trigramme>.{3})$', views.account_read,
name = 'kfet.account.read'), name = 'kfet.account.read'),
# Account - Update # Account - Update
url(r'^account/(?P<trigramme>.{3})/edit$', views.account_update, url(r'^accounts/(?P<trigramme>.{3})/edit$', views.account_update,
name = 'kfet.account.update'), name = 'kfet.account.update'),
# ----- # -----
@ -42,40 +42,51 @@ urlpatterns = [
# ----- # -----
# Checkout - General # Checkout - General
url('^checkout/$', url('^checkouts/$',
permission_required('kfet.is_team')(views.CheckoutList.as_view()), permission_required('kfet.is_team')(views.CheckoutList.as_view()),
name = 'kfet.checkout'), name = 'kfet.checkout'),
# Checkout - Create # Checkout - Create
url('^checkout/new$', url('^checkouts/new$',
permission_required('kfet.is_team')(views.CheckoutCreate.as_view()), permission_required('kfet.is_team')(views.CheckoutCreate.as_view()),
name = 'kfet.checkout.create'), name = 'kfet.checkout.create'),
# Checkout - Read # Checkout - Read
url('^checkout/(?P<pk>\d+)$', url('^checkouts/(?P<pk>\d+)$',
permission_required('kfet.is_team')(views.CheckoutRead.as_view()), permission_required('kfet.is_team')(views.CheckoutRead.as_view()),
name = 'kfet.checkout.read'), name = 'kfet.checkout.read'),
# Checkout - Update # Checkout - Update
url('^checkout/(?P<pk>\d+)/edit$', url('^checkouts/(?P<pk>\d+)/edit$',
permission_required('kfet.is_team')(views.CheckoutUpdate.as_view()), permission_required('kfet.is_team')(views.CheckoutUpdate.as_view()),
name = 'kfet.checkout.update'), name = 'kfet.checkout.update'),
### Checkout Statements urls
# Checkout Statement - General
url('^checkouts/statements/$',
permission_required('kfet.is_team')(views.CheckoutStatementList.as_view()),
name = 'kfet.checkoutstatement'),
# Checkout Statement - Create
url('^checkouts/(?P<pk_checkout>\d+)/statements/add',
permission_required('kfet.is_team')(views.CheckoutStatementCreate.as_view()),
name = 'kfet.checkoutstatement.create'),
# ----- # -----
# Article urls # Article urls
# ----- # -----
# Article - General # Article - General
url('^article/$', url('^articles/$',
permission_required('kfet.is_team')(views.ArticleList.as_view()), permission_required('kfet.is_team')(views.ArticleList.as_view()),
name = 'kfet.article'), name = 'kfet.article'),
# Article - Create # Article - Create
url('^article/new$', url('^articles/new$',
permission_required('kfet.is_team')(views.ArticleCreate.as_view()), permission_required('kfet.is_team')(views.ArticleCreate.as_view()),
name = 'kfet.article.create'), name = 'kfet.article.create'),
# Article - Read # Article - Read
url('^article/(?P<pk>\d+)$', url('^articles/(?P<pk>\d+)$',
permission_required('kfet.is_team')(views.ArticleRead.as_view()), permission_required('kfet.is_team')(views.ArticleRead.as_view()),
name = 'kfet.article.read'), name = 'kfet.article.read'),
# Article - Update # Article - Update
url('^article/(?P<pk>\d+)/edit$', url('^articles/(?P<pk>\d+)/edit$',
permission_required('kfet.is_team')(views.ArticleUpdate.as_view()), permission_required('kfet.is_team')(views.ArticleUpdate.as_view()),
name = 'kfet.article.update'), name = 'kfet.article.update'),

View file

@ -13,7 +13,8 @@ from django.db import IntegrityError, transaction
from django.db.models import F from django.db.models import F
from django.utils import timezone from django.utils import timezone
from gestioncof.models import CofProfile, Clipper from gestioncof.models import CofProfile, Clipper
from kfet.models import Account, Checkout, Article, Settings, AccountNegative from kfet.models import (Account, Checkout, Article, Settings, AccountNegative,
CheckoutStatement)
from kfet.forms import * from kfet.forms import *
from collections import defaultdict from collections import defaultdict
@ -303,6 +304,50 @@ class CheckoutUpdate(SuccessMessageMixin, UpdateView):
# Updating # Updating
return super(CheckoutUpdate, self).form_valid(form) return super(CheckoutUpdate, self).form_valid(form)
# -----
# Checkout Statement views
# -----
# Checkout Statement - General
class CheckoutStatementList(ListView):
model = CheckoutStatement
queryset = CheckoutStatement.objects.order_by('-at')
template_name = 'kfet/checkoutstatement.html'
context_object_name= 'checkoutstatements'
# Checkout Statement - Create
class CheckoutStatementCreate(SuccessMessageMixin, CreateView):
model = CheckoutStatement
template_name = 'kfet/checkoutstatement_create.html'
form_class = CheckoutStatementForm
success_message = 'Nouveau relevé : %(checkout)s - %(at)s'
def get_success_url(self):
return reverse_lazy('kfet.checkout.read', kwargs={'pk':self.kwargs['pk_checkout']})
def get_success_message(self, cleaned_data):
return self.success_message % dict(
cleaned_data,
checkout = self.object.checkout.name,
at = self.object.at)
def get_context_data(self, **kwargs):
context = super(CheckoutStatementCreate, self).get_context_data(**kwargs)
checkout = Checkout.objects.get(pk=self.kwargs['pk_checkout'])
context['checkout'] = checkout
return context
def form_valid(self, form):
# Checking permission
if not self.request.user.has_perm('kfet.add_checkoutstatement'):
raise PermissionDenied
# Creating
form.instance.checkout_id = self.kwargs['pk_checkout']
form.instance.by = self.request.user.profile.account_kfet
return super(CheckoutStatementCreate, self).form_valid(form)
# ----- # -----
# Article views # Article views
# ----- # -----