Assistant sur nouveau relevé

- Reprise de l'affichage
- Affichage en direct des totaux et erreurs
- Possibilité de ne pas compter la caisse ajoutée (et identifiée par
  `not_count` dans le modèle Statement si tel est le cas)
This commit is contained in:
Aurélien Delobelle 2016-08-23 02:45:49 +02:00
parent f73b25e65f
commit b6c75fd84a
6 changed files with 239 additions and 29 deletions

View file

@ -132,27 +132,48 @@ class CheckoutRestrictForm(CheckoutForm):
class CheckoutStatementCreateForm(forms.ModelForm): class CheckoutStatementCreateForm(forms.ModelForm):
balance_001 = forms.IntegerField(min_value=0, initial=0) balance_001 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_002 = forms.IntegerField(min_value=0, initial=0) balance_002 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_005 = forms.IntegerField(min_value=0, initial=0) balance_005 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_01 = forms.IntegerField(min_value=0, initial=0) balance_01 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_02 = forms.IntegerField(min_value=0, initial=0) balance_02 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_05 = forms.IntegerField(min_value=0, initial=0) balance_05 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_1 = forms.IntegerField(min_value=0, initial=0) balance_1 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_2 = forms.IntegerField(min_value=0, initial=0) balance_2 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_5 = forms.IntegerField(min_value=0, initial=0) balance_5 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_10 = forms.IntegerField(min_value=0, initial=0) balance_10 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_20 = forms.IntegerField(min_value=0, initial=0) balance_20 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_50 = forms.IntegerField(min_value=0, initial=0) balance_50 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_100 = forms.IntegerField(min_value=0, initial=0) balance_100 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_200 = forms.IntegerField(min_value=0, initial=0) balance_200 = forms.IntegerField(min_value=0, initial=0, required=False)
balance_500 = forms.IntegerField(min_value=0, initial=0) balance_500 = forms.IntegerField(min_value=0, initial=0, required=False)
class Meta: class Meta:
model = CheckoutStatement model = CheckoutStatement
exclude = ['by', 'at', 'checkout', 'amount_error', 'amount_taken', exclude = ['by', 'at', 'checkout', 'amount_error', 'amount_taken',
'balance_old', 'balance_new'] 'balance_old', 'balance_new']
def clean(self):
not_count = self.cleaned_data['not_count']
if not not_count and (
self.cleaned_data['balance_001'] is None
or self.cleaned_data['balance_002'] is None
or self.cleaned_data['balance_005'] is None
or self.cleaned_data['balance_01'] is None
or self.cleaned_data['balance_02'] is None
or self.cleaned_data['balance_05'] is None
or self.cleaned_data['balance_1'] is None
or self.cleaned_data['balance_2'] is None
or self.cleaned_data['balance_5'] is None
or self.cleaned_data['balance_10'] is None
or self.cleaned_data['balance_20'] is None
or self.cleaned_data['balance_50'] is None
or self.cleaned_data['balance_100'] is None
or self.cleaned_data['balance_200'] is None
or self.cleaned_data['balance_500'] is None):
raise ValidationError("Y'a un problème. Si tu comptes la caisse, mets au moins des 0 stp (et t'as pas idée de comment c'est long de vérifier que t'as mis des valeurs de partout...)")
super(CheckoutStatementCreateForm, self).clean()
class CheckoutStatementUpdateForm(forms.ModelForm): class CheckoutStatementUpdateForm(forms.ModelForm):
class Meta: class Meta:
model = CheckoutStatement model = CheckoutStatement

View file

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('kfet', '0032_auto_20160822_2350'),
]
operations = [
migrations.AddField(
model_name='checkoutstatement',
name='not_count',
field=models.BooleanField(default=False),
),
]

View file

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('kfet', '0033_checkoutstatement_not_count'),
]
operations = [
migrations.AlterField(
model_name='checkoutstatement',
name='taken_cheque',
field=models.DecimalField(max_digits=6, decimal_places=2, default=0),
),
]

View file

@ -259,6 +259,7 @@ class CheckoutStatement(models.Model):
amount_taken = models.DecimalField(max_digits = 6, decimal_places = 2) amount_taken = models.DecimalField(max_digits = 6, decimal_places = 2)
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)
not_count = models.BooleanField(default=False)
taken_001 = models.PositiveSmallIntegerField(default=0) taken_001 = models.PositiveSmallIntegerField(default=0)
taken_002 = models.PositiveSmallIntegerField(default=0) taken_002 = models.PositiveSmallIntegerField(default=0)
@ -275,7 +276,7 @@ class CheckoutStatement(models.Model):
taken_100 = models.PositiveSmallIntegerField(default=0) taken_100 = models.PositiveSmallIntegerField(default=0)
taken_200 = models.PositiveSmallIntegerField(default=0) taken_200 = models.PositiveSmallIntegerField(default=0)
taken_500 = models.PositiveSmallIntegerField(default=0) taken_500 = models.PositiveSmallIntegerField(default=0)
taken_cheque = models.PositiveSmallIntegerField(default=0) taken_cheque = models.DecimalField(default=0, max_digits=6, decimal_places=2)
def __str__(self): def __str__(self):
return '%s %s' % (self.checkout, self.at) return '%s %s' % (self.checkout, self.at)
@ -285,8 +286,10 @@ class CheckoutStatement(models.Model):
checkout_id = self.checkout_id checkout_id = self.checkout_id
self.balance_old = (Checkout.objects self.balance_old = (Checkout.objects
.values_list('balance', flat=True).get(pk=checkout_id)) .values_list('balance', flat=True).get(pk=checkout_id))
if self.not_count:
self.balance_new = self.balance_old - self.amount_taken
self.amount_error = ( self.amount_error = (
self.balance_new + self.amount_taken - self.balance_old) self.balance_new + self.amount_taken - self.balance_old)
with transaction.atomic(): with transaction.atomic():
Checkout.objects.filter(pk=checkout_id).update(balance=self.balance_new) Checkout.objects.filter(pk=checkout_id).update(balance=self.balance_new)
super(CheckoutStatement, self).save(*args, **kwargs) super(CheckoutStatement, self).save(*args, **kwargs)

View file

@ -1,4 +1,5 @@
{% extends "kfet/base.html" %} {% extends "kfet/base.html" %}
{% load l10n %}
{% block title %}Nouveau relevé{% endblock %} {% block title %}Nouveau relevé{% endblock %}
{% block content-header-title %}Caisse {{ checkout.name }} - Nouveau relevé{% endblock %} {% block content-header-title %}Caisse {{ checkout.name }} - Nouveau relevé{% endblock %}
@ -14,18 +15,164 @@
<div class="col-sm-8 col-md-9 col-content-right"> <div class="col-sm-8 col-md-9 col-content-right">
{% include "kfet/base_messages.html" %} {% include "kfet/base_messages.html" %}
<div class="content-right"> <div class="content-right">
<div class="content-right-block"> <form action="" method="post">
<form action="" method="post"> {% csrf_token %}
{% csrf_token %} <div class="content-right-block">
{{ form.as_p }} <h2>Général</h2>
{% if not perms.kfet.add_checkoutstatement %} <div>
<input type="password" name="KFETPASSWORD"> <label>
{% endif %} Ne pas compter la caisse
<input type="submit" value="Enregistrer"> {{ form.not_count }}
</form> </label><br>
</div> Ancienne balance : <span id="balance_old">{{ checkout.balance|unlocalize }}</span><br>
Nouvelle balance : <span id="balance_new">0</span><br>
Pris : <span id="amount_taken">0</span><br>
Erreur : <span id="amount_error">0</span><br>
{% if not perms.kfet.add_checkoutstatement %}
<label for="password">Mot de passe:</label>
<input type="password" id="password" name="KFETPASSWORD">
{% endif %}
<input type="submit" value="Enregistrer">
</div>
</div>
<div class="content-right-block">
<h2>Pris</h2>
<div id="detail_taken">
<table class="table table-bordered">
<tr style="font-weight:bold;">
<td>5€</td>
<td>10€</td>
<td>20€</td>
<td>50€</td>
<td>100€</td>
<td>200€</td>
<td>500€</td>
<tr>
<tr>
<td><input id="id_taken_5" name="taken_5" data-value="5" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_10" name="taken_10" data-value="10" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_20" name="taken_20" data-value="20" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_50" name="taken_50" data-value="50" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_100" name="taken_100" data-value="100" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_200" name="taken_200" data-value="200" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_500" name="taken_500" data-value="500" min="0" value="0" type="number" class="form-control" required></td>
</tr>
</table>
<table class="table table-bordered">
<tr style="font-weight:bold;">
<td>2€</td>
<td>1€</td>
<td>0.50€</td>
<td>0.20€</td>
<td>0.10€</td>
<td>0.05€</td>
<td>0.02€</td>
<td>0.01€</td>
<tr>
<tr>
<td><input id="id_taken_2" name="taken_2" data-value="2" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_1" name="taken_1" data-value="1" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_05" name="taken_05" data-value="0.5" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_02" name="taken_02" data-value="0.2" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_01" name="taken_01" data-value="0.1" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_005" name="taken_005" data-value="0.05" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_002" name="taken_002" data-value="0.02" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_taken_001" name="taken_001" data-value="0.01" min="0" value="0" type="number" class="form-control" required></td>
</tr>
</table>
Chèque: <input id="id_taken_cheque" name="taken_cheque" data-value="1" min="0" step="0.01" value="0" type="number" class="form-control" required>
</div>
</div>
<div class="content-right-block">
<h2>En caisse</h2>
<div id="detail_balance">
<table class="table table-bordered">
<tr style="font-weight:bold;">
<td>5€</td>
<td>10€</td>
<td>20€</td>
<td>50€</td>
<td>100€</td>
<td>200€</td>
<td>500€</td>
<tr>
<tr>
<td><input id="id_balance_5" name="balance_5" data-value="5" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_10" name="balance_10" data-value="10" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_20" name="balance_20" data-value="20" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_50" name="balance_50" data-value="50" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_100" name="balance_100" data-value="100" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_200" name="balance_200" data-value="200" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_500" name="balance_500" data-value="500" min="0" value="0" type="number" class="form-control" required></td>
</tr>
</table>
<table class="table table-bordered">
<tr style="font-weight:bold;">
<td>2€</td>
<td>1€</td>
<td>0.50€</td>
<td>0.20€</td>
<td>0.10€</td>
<td>0.05€</td>
<td>0.02€</td>
<td>0.01€</td>
<tr>
<tr>
<td><input id="id_balance_2" name="balance_2" data-value="2" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_1" name="balance_1" data-value="1" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_05" name="balance_05" data-value="0.5" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_02" name="balance_02" data-value="0.2" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_01" name="balance_01" data-value="0.1" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_005" name="balance_005" data-value="0.05" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_002" name="balance_002" data-value="0.02" min="0" value="0" type="number" class="form-control" required></td>
<td><input id="id_balance_001" name="balance_001" data-value="0.01" min="0" value="0" type="number" class="form-control" required></td>
</tr>
</table>
</div>
</div>
</form>
</div> </div>
</div> </div>
</div> </div>
<script type="text/javascript">
$(document).ready(function() {
$('#id_not_count').on('change', function() {
if ($(this).prop('checked')) {
$('#detail_balance input').prop('disabled', true);
} else {
$('#detail_balance input').prop('disabled', false);
}
updateAmounts();
});
$('#detail_balance input, #detail_taken input').on('input', function() {
updateAmounts();
});
function getTotal(id_container) {
var total = 0;
$('#'+id_container+' input').each(function() {
total += parseFloat($(this).attr('data-value')) * parseFloat($(this).val());
});
return total;
}
function updateAmounts() {
var balance_old = parseFloat($('#balance_old').text());
var taken = getTotal('detail_taken');
if ($('#id_not_count').prop('checked')) {
var error = 0;
var balance_new = balance_old - taken;
} else {
var balance_new = getTotal('detail_balance');
var error = balance_new + taken - balance_old;
}
$('#balance_new').text(balance_new.toFixed(2));
$('#amount_taken').text(taken.toFixed(2));
$('#amount_error').text(error.toFixed(2));
}
});
</script>
{% endblock %} {% endblock %}

View file

@ -418,7 +418,7 @@ def getAmountTaken(data):
+ data.taken_5 * 5 + data.taken_10 * 10 + data.taken_5 * 5 + data.taken_10 * 10
+ data.taken_20 * 20 + data.taken_50 * 50 + data.taken_20 * 20 + data.taken_50 * 50
+ data.taken_100 * 100 + data.taken_200 * 200 + data.taken_100 * 100 + data.taken_200 * 200
+ data.taken_500 * 500 + data.taken_cheque) + data.taken_500 * 500 + float(data.taken_cheque))
def getAmountBalance(data): def getAmountBalance(data):
return Decimal(data['balance_001'] * 0.01 + data['balance_002'] * 0.02 return Decimal(data['balance_001'] * 0.01 + data['balance_002'] * 0.02
@ -458,7 +458,8 @@ class CheckoutStatementCreate(SuccessMessageMixin, CreateView):
return self.form_invalid(form) return self.form_invalid(form)
# Creating # Creating
form.instance.amount_taken = getAmountTaken(form.instance) form.instance.amount_taken = getAmountTaken(form.instance)
form.instance.balance_new = getAmountBalance(form.cleaned_data) if not form.instance.not_count:
form.instance.balance_new = getAmountBalance(form.cleaned_data)
form.instance.checkout_id = self.kwargs['pk_checkout'] form.instance.checkout_id = self.kwargs['pk_checkout']
form.instance.by = self.request.user.profile.account_kfet form.instance.by = self.request.user.profile.account_kfet
return super(CheckoutStatementCreate, self).form_valid(form) return super(CheckoutStatementCreate, self).form_valid(form)