From 01c3991988598a7bf12dc2ecb272b2f792ad46e7 Mon Sep 17 00:00:00 2001 From: Skia Date: Fri, 26 Aug 2016 20:57:04 +0200 Subject: [PATCH] Add cash register summaries --- counter/admin.py | 1 + counter/models.py | 36 +- .../counter/cash_register_summary.jinja | 27 ++ counter/templates/counter/counter_click.jinja | 12 +- counter/templates/counter/counter_edit.jinja | 19 - counter/templates/counter/counter_main.jinja | 7 +- counter/urls.py | 1 + counter/views.py | 93 ++++ locale/fr/LC_MESSAGES/django.mo | Bin 30657 -> 31900 bytes locale/fr/LC_MESSAGES/django.po | 398 +++++++++++------- migrate.py | 1 + 11 files changed, 424 insertions(+), 171 deletions(-) create mode 100644 counter/templates/counter/cash_register_summary.jinja delete mode 100644 counter/templates/counter/counter_edit.jinja diff --git a/counter/admin.py b/counter/admin.py index 84c4a6d7..7361dc6f 100644 --- a/counter/admin.py +++ b/counter/admin.py @@ -10,4 +10,5 @@ admin.site.register(Counter) admin.site.register(Refilling) admin.site.register(Selling) admin.site.register(Permanency) +admin.site.register(CashRegisterSummary) diff --git a/counter/models.py b/counter/models.py index f8248a44..9a454b07 100644 --- a/counter/models.py +++ b/counter/models.py @@ -287,7 +287,39 @@ class Permanency(models.Model): verbose_name = _("permanency") def __str__(self): - return "%s in %s from %s to %s" % (self.user, self.counter, - self.start.strftime("%Y-%m-%d %H:%M:%S"), self.end.strftime("%Y-%m-%d %H:%M:%S")) + return "%s in %s from %s" % (self.user, self.counter, + self.start.strftime("%Y-%m-%d %H:%M:%S")) +class CashRegisterSummary(models.Model): + user = models.ForeignKey(User, related_name="cash_summaries", verbose_name=_("user")) + counter = models.ForeignKey(Counter, related_name="cash_summaries", verbose_name=_("counter")) + date = models.DateTimeField(_('date')) + comment = models.TextField(_('comment'), null=True, blank=True) + emptied = models.BooleanField(_('emptied'), default=False) + + class Meta: + verbose_name = _("cash register summary") + + def __str__(self): + return "At %s by %s - Total: %s €" % (self.counter, self.user, self.get_total()) + + def get_total(self): + t = 0 + for it in self.items.all(): + t += it.quantity * it.value + return t + + def save(self, *args, **kwargs): + if not self.id: + self.date = timezone.now() + return super(CashRegisterSummary, self).save(*args, **kwargs) + +class CashRegisterSummaryItem(models.Model): + cash_summary = models.ForeignKey(CashRegisterSummary, related_name="items", verbose_name=_("cash summary")) + value = CurrencyField(_("value")) + quantity = models.IntegerField(_('quantity'), default=0) + check = models.BooleanField(_('check'), default=False) + + class Meta: + verbose_name = _("cash register summary item") diff --git a/counter/templates/counter/cash_register_summary.jinja b/counter/templates/counter/cash_register_summary.jinja new file mode 100644 index 00000000..122dc381 --- /dev/null +++ b/counter/templates/counter/cash_register_summary.jinja @@ -0,0 +1,27 @@ +{% extends "core/base.jinja" %} + +{% block title %} +{% trans obj=object %}Edit {{ obj }}{% endtrans %} +{% endblock %} + +{% block content %} +

{% trans %}Make a cash register summary{% endtrans %}

+
+ {% csrf_token %} + {% for field in form %} +

+ {% if field.name[:5] == "check" and field.name[8:] == "value" %} + {% set name = field.name[:7] + "_quantity" %} + {{ field.errors }} {{ field }} + {{ form[name].errors }} {{ form[name] }} + {% elif field.name[:5] != "check" %} + {{ field.errors }} {{ field }} + {% endif %} +

+ {% endfor %} +

+
+{% endblock %} + + + diff --git a/counter/templates/counter/counter_click.jinja b/counter/templates/counter/counter_click.jinja index 3a13c531..73b9ecd0 100644 --- a/counter/templates/counter/counter_click.jinja +++ b/counter/templates/counter/counter_click.jinja @@ -2,16 +2,16 @@ {% from "core/macros.jinja" import user_mini_profile %} -{% macro add_product(id, content) %} -
+{% macro add_product(id, content, class="") %} + {% csrf_token %}
{% endmacro %} -{% macro del_product(id, content) %} -
+{% macro del_product(id, content, class="") %} + {% csrf_token %} @@ -53,7 +53,7 @@ {% for id,infos in request.session['basket']|dictsort %} {% set product = counter.products.filter(id=id).first() %} {% set s = infos['qty'] * infos['price'] / 100 %} -
  • {{ del_product(id, '-') }} {{ infos['qty'] + infos['bonus_qty'] }} {{ add_product(id, '+') }} +
  • {{ del_product(id, '-', "inline") }} {{ infos['qty'] + infos['bonus_qty'] }} {{ add_product(id, '+', "inline") }} {{ product.name }}: {{ "%0.2f"|format(s) }} € {% if infos['bonus_qty'] %} P @@ -105,7 +105,7 @@ {% set file = static('core/img/na.gif') %} {% endif %} {% set prod = '%s
    %s €
    %s
    ' % (p.name, file, p.selling_price, p.code) %} - {{ add_product(p.id, prod) }} + {{ add_product(p.id, prod, "form_button") }} {%- endfor %} {%- endif -%} diff --git a/counter/templates/counter/counter_edit.jinja b/counter/templates/counter/counter_edit.jinja deleted file mode 100644 index 0bb689cf..00000000 --- a/counter/templates/counter/counter_edit.jinja +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "core/base.jinja" %} - -{% block title %} -{% trans obj=object %}Edit {{ obj }}{% endtrans %} -{% endblock %} - -{% block content %} -

    {% trans obj=object %}Edit {{ obj }}{% endtrans %}

    - - {% csrf_token %} -

    {{ form.sellers.errors }} {{ form.sellers }}

    -

    -

    {{ form.products.errors }} {{ form.products }}

    -

    -
  • -{% endblock %} - - - diff --git a/counter/templates/counter/counter_main.jinja b/counter/templates/counter/counter_main.jinja index df903fe0..9c6b2fe1 100644 --- a/counter/templates/counter/counter_main.jinja +++ b/counter/templates/counter/counter_main.jinja @@ -39,13 +39,14 @@ {% endif %} {% if counter.type == 'BAR' %} + {% if barmen %} +

    {% trans %}Make a cash register summary{% endtrans %}

    + {% endif %}

    {% trans %}Barman: {% endtrans %}

    -
    {% csrf_token %} {{ login_form.as_p() }} diff --git a/counter/urls.py b/counter/urls.py index f35fa222..5f053f64 100644 --- a/counter/urls.py +++ b/counter/urls.py @@ -5,6 +5,7 @@ from counter.views import * urlpatterns = [ url(r'^(?P[0-9]+)$', CounterMain.as_view(), name='details'), url(r'^(?P[0-9]+)/click/(?P[0-9]+)$', CounterClick.as_view(), name='click'), + url(r'^(?P[0-9]+)/cash_summary$', CounterCashSummaryView.as_view(), name='cash_summary'), url(r'^(?P[0-9]+)/login$', CounterLogin.as_view(), name='login'), url(r'^(?P[0-9]+)/logout$', CounterLogout.as_view(), name='logout'), url(r'^admin/(?P[0-9]+)$', CounterEditView.as_view(), name='admin'), diff --git a/counter/views.py b/counter/views.py index 49087b49..ef727f06 100644 --- a/counter/views.py +++ b/counter/views.py @@ -529,3 +529,96 @@ class SellingDeleteView(CanEditPropMixin, DeleteView): def get_success_url(self): return reverse_lazy('core:user_account', kwargs={'user_id': self.object.customer.user.id}) +# Cash register summaries + +class CashRegisterSummaryForm(forms.Form): + """ + Provide the cash summary form + """ + ten_cents = forms.IntegerField(label=_("10 cents"), required=False) + twenty_cents = forms.IntegerField(label=_("20 cents"), required=False) + fifty_cents = forms.IntegerField(label=_("50 cents"), required=False) + one_euro = forms.IntegerField(label=_("1 euro"), required=False) + two_euros = forms.IntegerField(label=_("2 euros"), required=False) + five_euros = forms.IntegerField(label=_("5 euros"), required=False) + ten_euros = forms.IntegerField(label=_("10 euros"), required=False) + twenty_euros = forms.IntegerField(label=_("20 euros"), required=False) + fifty_euros = forms.IntegerField(label=_("50 euros"), required=False) + hundred_euros = forms.IntegerField(label=_("100 euros"), required=False) + check_1_value = forms.DecimalField(label=_("Check amount"), required=False) + check_1_quantity = forms.IntegerField(label=_("Check quantity"), required=False) + check_2_value = forms.DecimalField(label=_("Check amount"), required=False) + check_2_quantity = forms.IntegerField(label=_("Check quantity"), required=False) + check_3_value = forms.DecimalField(label=_("Check amount"), required=False) + check_3_quantity = forms.IntegerField(label=_("Check quantity"), required=False) + check_4_value = forms.DecimalField(label=_("Check amount"), required=False) + check_4_quantity = forms.IntegerField(label=_("Check quantity"), required=False) + check_5_value = forms.DecimalField(label=_("Check amount"), required=False) + check_5_quantity = forms.IntegerField(label=_("Check quantity"), required=False) + comment = forms.CharField(label=_("Comment"), required=False) + emptied = forms.BooleanField(label=_("Emptied"), required=False) + + def save(self, counter): + cd = self.cleaned_data + summary = CashRegisterSummary( + counter=counter, + user=counter.get_random_barman(), + comment=cd['comment'], + emptied=cd['emptied'], + ) + summary.save() + # Cash + if cd['ten_cents']: CashRegisterSummaryItem(cash_summary=summary, value=0.1, quantity=cd['ten_cents']).save() + if cd['twenty_cents']: CashRegisterSummaryItem(cash_summary=summary, value=0.2, quantity=cd['twenty_cents']).save() + if cd['fifty_cents']: CashRegisterSummaryItem(cash_summary=summary, value=0.5, quantity=cd['fifty_cents']).save() + if cd['one_euro']: CashRegisterSummaryItem(cash_summary=summary, value=1, quantity=cd['one_euro']).save() + if cd['two_euros']: CashRegisterSummaryItem(cash_summary=summary, value=2, quantity=cd['two_euros']).save() + if cd['five_euros']: CashRegisterSummaryItem(cash_summary=summary, value=5, quantity=cd['five_euros']).save() + if cd['ten_euros']: CashRegisterSummaryItem(cash_summary=summary, value=10, quantity=cd['ten_euros']).save() + if cd['twenty_euros']: CashRegisterSummaryItem(cash_summary=summary, value=20, quantity=cd['twenty_euros']).save() + if cd['fifty_euros']: CashRegisterSummaryItem(cash_summary=summary, value=50, quantity=cd['fifty_euros']).save() + if cd['hundred_euros']: CashRegisterSummaryItem(cash_summary=summary, value=100, quantity=cd['hundred_euros']).save() + # Checks + if cd['check_1_quantity']: CashRegisterSummaryItem(cash_summary=summary, value=cd['check_1_value'], quantity=cd['check_1_quantity']).save() + if cd['check_2_quantity']: CashRegisterSummaryItem(cash_summary=summary, value=cd['check_2_value'], quantity=cd['check_2_quantity']).save() + if cd['check_3_quantity']: CashRegisterSummaryItem(cash_summary=summary, value=cd['check_3_value'], quantity=cd['check_3_quantity']).save() + if cd['check_4_quantity']: CashRegisterSummaryItem(cash_summary=summary, value=cd['check_4_value'], quantity=cd['check_4_quantity']).save() + if cd['check_5_quantity']: CashRegisterSummaryItem(cash_summary=summary, value=cd['check_5_value'], quantity=cd['check_5_quantity']).save() + if summary.items.count() < 1: + summary.delete() + +class CounterCashSummaryView(CanViewMixin, DetailView): + """ + Provide the cash summary form + """ + model = Counter + pk_url_kwarg = "counter_id" + template_name = 'counter/cash_register_summary.jinja' + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + if len(self.object.get_barmen_list()) < 1: + return HttpResponseRedirect(reverse_lazy('counter:details', args=self.args, + kwargs={'counter_id': self.object.id})) + self.form = CashRegisterSummaryForm() + return super(CounterCashSummaryView, self).get(request, *args, **kwargs) + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + if len(self.object.get_barmen_list()) < 1: + return HttpResponseRedirect(reverse_lazy('counter:details', args=self.args, + kwargs={'counter_id': self.object.id})) + self.form = CashRegisterSummaryForm(request.POST) + if self.form.is_valid(): + self.form.save(self.object) + return HttpResponseRedirect(self.get_success_url()) + return super(CounterCashSummaryView, self).get(request, *args, **kwargs) + + def get_success_url(self): + return reverse_lazy('counter:details', kwargs={'counter_id': self.object.id}) + + def get_context_data(self, **kwargs): + """ Add form to the context """ + kwargs = super(CounterCashSummaryView, self).get_context_data(**kwargs) + kwargs['form'] = self.form + return kwargs diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo index fd3fa4b000c14926d3ad6ccdad059d8fbb9f9c23..3120bf7e7a8de226c1957dbd871ce149c986ab05 100644 GIT binary patch delta 12385 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\n" "Language-Team: AE info \n" @@ -16,158 +16,186 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: accounting/models.py:34 accounting/models.py:46 accounting/models.py:73 -#: accounting/models.py:123 club/models.py:18 counter/models.py:52 +#: accounting/models.py:36 accounting/models.py:55 accounting/models.py:82 +#: accounting/models.py:132 club/models.py:18 counter/models.py:52 #: counter/models.py:77 counter/models.py:111 launderette/models.py:15 #: launderette/models.py:60 launderette/models.py:85 msgid "name" msgstr "nom" #: accounting/models.py:37 +msgid "street" +msgstr "rue" + +#: accounting/models.py:38 +msgid "city" +msgstr "ville" + +#: accounting/models.py:39 +msgid "postcode" +msgstr "code postal" + +#: accounting/models.py:40 +msgid "country" +msgstr "pays" + +#: accounting/models.py:41 core/models.py:166 +msgid "phone" +msgstr "téléphone" + +#: accounting/models.py:42 +msgid "email" +msgstr "email" + +#: accounting/models.py:43 +msgid "website" +msgstr "site internet" + +#: accounting/models.py:46 msgid "company" msgstr "entreprise" -#: accounting/models.py:47 +#: accounting/models.py:56 msgid "iban" msgstr "IBAN" -#: accounting/models.py:48 +#: accounting/models.py:57 msgid "account number" msgstr "numero de compte" -#: accounting/models.py:49 accounting/models.py:74 club/models.py:146 -#: counter/models.py:86 +#: accounting/models.py:58 accounting/models.py:83 club/models.py:146 +#: counter/models.py:86 counter/models.py:112 msgid "club" msgstr "club" -#: accounting/models.py:52 +#: accounting/models.py:61 msgid "Bank account" msgstr "Compte en banque" -#: accounting/models.py:75 +#: accounting/models.py:84 msgid "bank account" msgstr "compte en banque" -#: accounting/models.py:78 +#: accounting/models.py:87 msgid "Club account" msgstr "Compte club" -#: accounting/models.py:114 +#: accounting/models.py:123 #, python-format msgid "%(club_account)s on %(bank_account)s" msgstr "%(club_account)s sur %(bank_account)s" -#: accounting/models.py:121 club/models.py:147 counter/models.py:297 +#: accounting/models.py:130 club/models.py:147 counter/models.py:282 #: launderette/models.py:122 msgid "start date" msgstr "date de début" -#: accounting/models.py:122 club/models.py:148 counter/models.py:298 +#: accounting/models.py:131 club/models.py:148 counter/models.py:283 msgid "end date" msgstr "date de fin" -#: accounting/models.py:124 +#: accounting/models.py:133 msgid "is closed" msgstr "est fermé" -#: accounting/models.py:125 +#: accounting/models.py:134 msgid "club account" msgstr "compte club" -#: accounting/models.py:126 accounting/models.py:169 counter/models.py:25 -#: counter/models.py:212 +#: accounting/models.py:135 accounting/models.py:178 counter/models.py:25 +#: counter/models.py:197 msgid "amount" msgstr "montant" -#: accounting/models.py:127 +#: accounting/models.py:136 msgid "effective_amount" msgstr "montant effectif" -#: accounting/models.py:130 +#: accounting/models.py:139 msgid "General journal" msgstr "Classeur" -#: accounting/models.py:167 +#: accounting/models.py:176 msgid "number" msgstr "numéro" -#: accounting/models.py:168 +#: accounting/models.py:177 msgid "journal" msgstr "classeur" -#: accounting/models.py:170 core/models.py:437 core/models.py:713 -#: counter/models.py:215 counter/models.py:261 eboutic/models.py:14 -#: eboutic/models.py:47 +#: accounting/models.py:179 core/models.py:437 core/models.py:713 +#: counter/models.py:200 counter/models.py:246 counter/models.py:296 +#: eboutic/models.py:14 eboutic/models.py:47 msgid "date" msgstr "date" -#: accounting/models.py:171 +#: accounting/models.py:180 counter/models.py:297 msgid "comment" msgstr "commentaire" -#: accounting/models.py:172 counter/models.py:216 counter/models.py:262 +#: accounting/models.py:181 counter/models.py:201 counter/models.py:247 #: subscription/models.py:34 msgid "payment method" msgstr "méthode de paiement" -#: accounting/models.py:173 +#: accounting/models.py:182 msgid "cheque number" msgstr "numéro de chèque" -#: accounting/models.py:174 eboutic/models.py:115 +#: accounting/models.py:183 eboutic/models.py:115 msgid "invoice" msgstr "facture" -#: accounting/models.py:175 +#: accounting/models.py:184 msgid "is done" msgstr "est fait" -#: accounting/models.py:177 +#: accounting/models.py:186 msgid "simple type" msgstr "type simplifié" -#: accounting/models.py:179 accounting/models.py:278 +#: accounting/models.py:188 accounting/models.py:287 msgid "accounting type" msgstr "type comptable" -#: accounting/models.py:180 +#: accounting/models.py:189 msgid "target type" msgstr "type de cible" -#: accounting/models.py:181 +#: accounting/models.py:190 #: launderette/templates/launderette/launderette_admin.jinja:44 msgid "User" msgstr "Utilisateur" -#: accounting/models.py:181 club/templates/club/club_detail.jinja:4 +#: accounting/models.py:190 club/templates/club/club_detail.jinja:4 msgid "Club" msgstr "Club" -#: accounting/models.py:181 core/templates/core/user_base.jinja:18 +#: accounting/models.py:190 core/templates/core/user_base.jinja:18 msgid "Account" msgstr "Compte" -#: accounting/models.py:181 +#: accounting/models.py:190 msgid "Company" msgstr "Entreprise" -#: accounting/models.py:181 sith/settings.py:289 sith/settings_sample.py:272 +#: accounting/models.py:190 sith/settings.py:290 sith/settings_sample.py:272 msgid "Other" msgstr "Autre" -#: accounting/models.py:182 +#: accounting/models.py:191 msgid "target id" msgstr "id de la cible" -#: accounting/models.py:183 +#: accounting/models.py:192 msgid "target label" msgstr "nom de la cible" -#: accounting/models.py:184 +#: accounting/models.py:193 msgid "linked operation" msgstr "opération liée" -#: accounting/models.py:200 +#: accounting/models.py:209 #, python-format msgid "" "The date can not be before the start date of the journal, which is\n" @@ -176,16 +204,16 @@ msgstr "" "La date ne peut pas être avant la date de début du journal, qui est\n" "%(start_date)s." -#: accounting/models.py:203 +#: accounting/models.py:212 msgid "Target does not exists" msgstr "La cible n'existe pas." -#: accounting/models.py:205 +#: accounting/models.py:214 msgid "Please add a target label if you set no existing target" msgstr "" "Merci d'ajouter un nom de cible si vous ne spécifiez pas de cible existante" -#: accounting/models.py:207 +#: accounting/models.py:216 msgid "" "You need to provide ether a simplified accounting type or a standard " "accounting type" @@ -193,39 +221,39 @@ msgstr "" "Vous devez fournir soit un type comptable simplifié ou un type comptable " "standard" -#: accounting/models.py:268 counter/models.py:81 +#: accounting/models.py:277 counter/models.py:81 msgid "code" msgstr "code" -#: accounting/models.py:270 +#: accounting/models.py:279 msgid "An accounting type code contains only numbers" msgstr "Un code comptable ne contient que des numéros" -#: accounting/models.py:273 accounting/models.py:299 counter/models.py:253 +#: accounting/models.py:282 accounting/models.py:308 counter/models.py:238 msgid "label" msgstr "intitulé" -#: accounting/models.py:274 +#: accounting/models.py:283 msgid "movement type" msgstr "type de mouvement" -#: accounting/models.py:274 +#: accounting/models.py:283 msgid "Credit" msgstr "Crédit" -#: accounting/models.py:274 +#: accounting/models.py:283 msgid "Debit" msgstr "Débit" -#: accounting/models.py:275 +#: accounting/models.py:284 msgid "Neutral" msgstr "Neutre" -#: accounting/models.py:301 +#: accounting/models.py:310 msgid "simplified accounting types" msgstr "type simplifié" -#: accounting/models.py:304 +#: accounting/models.py:313 msgid "simplified type" msgstr "type simplifié" @@ -264,26 +292,36 @@ msgstr "Il n'y a pas de types comptable dans ce site web." msgid "Bank account: " msgstr "Compte en banque : " -#: accounting/templates/accounting/bank_account_details.jinja:14 +#: accounting/templates/accounting/bank_account_details.jinja:15 +#: accounting/templates/accounting/club_account_details.jinja:16 +#: core/templates/core/file_detail.jinja:43 +#: core/templates/core/group_list.jinja:13 +#: core/templates/core/user_edit.jinja:18 +#: launderette/templates/launderette/launderette_admin.jinja:16 +#: launderette/views.py:146 +msgid "Delete" +msgstr "Supprimer" + +#: accounting/templates/accounting/bank_account_details.jinja:17 #: core/templates/core/user_base.jinja:7 msgid "Infos" msgstr "Infos" -#: accounting/templates/accounting/bank_account_details.jinja:16 +#: accounting/templates/accounting/bank_account_details.jinja:19 msgid "IBAN: " msgstr "IBAN : " -#: accounting/templates/accounting/bank_account_details.jinja:17 +#: accounting/templates/accounting/bank_account_details.jinja:20 msgid "Number: " msgstr "Numéro : " -#: accounting/templates/accounting/bank_account_details.jinja:19 +#: accounting/templates/accounting/bank_account_details.jinja:22 msgid "New club account" msgstr "Nouveau compte club" -#: accounting/templates/accounting/bank_account_details.jinja:23 +#: accounting/templates/accounting/bank_account_details.jinja:26 #: accounting/templates/accounting/bank_account_list.jinja:21 -#: accounting/templates/accounting/club_account_details.jinja:50 +#: accounting/templates/accounting/club_account_details.jinja:53 #: accounting/templates/accounting/journal_details.jinja:66 #: club/templates/club/club_detail.jinja:7 core/templates/core/file.jinja:38 #: core/templates/core/page.jinja:31 core/templates/core/user_base.jinja:10 @@ -293,16 +331,6 @@ msgstr "Nouveau compte club" msgid "Edit" msgstr "Éditer" -#: accounting/templates/accounting/bank_account_details.jinja:25 -#: accounting/templates/accounting/bank_account_list.jinja:23 -#: core/templates/core/file_detail.jinja:43 -#: core/templates/core/group_list.jinja:13 -#: core/templates/core/user_edit.jinja:18 -#: launderette/templates/launderette/launderette_admin.jinja:16 -#: launderette/views.py:146 -msgid "Delete" -msgstr "Supprimer" - #: accounting/templates/accounting/bank_account_list.jinja:4 #: accounting/templates/accounting/bank_account_list.jinja:17 msgid "Bank account list" @@ -320,7 +348,7 @@ msgstr "Gérer les types comptable" msgid "New bank account" msgstr "Nouveau compte en banque" -#: accounting/templates/accounting/bank_account_list.jinja:29 +#: accounting/templates/accounting/bank_account_list.jinja:26 msgid "There is no accounts in this website." msgstr "Il n'y a pas de comptes dans ce site web." @@ -329,58 +357,58 @@ msgstr "Il n'y a pas de comptes dans ce site web." msgid "Club account:" msgstr "Compte club : " -#: accounting/templates/accounting/club_account_details.jinja:16 +#: accounting/templates/accounting/club_account_details.jinja:19 msgid "New journal" msgstr "Nouveau classeur" -#: accounting/templates/accounting/club_account_details.jinja:18 +#: accounting/templates/accounting/club_account_details.jinja:21 msgid "You can not create new journal while you still have one opened" msgstr "Vous ne pouvez pas créer de journal tant qu'il y en a un d'ouvert" -#: accounting/templates/accounting/club_account_details.jinja:23 +#: accounting/templates/accounting/club_account_details.jinja:26 #: launderette/templates/launderette/launderette_admin.jinja:43 msgid "Name" msgstr "Nom" -#: accounting/templates/accounting/club_account_details.jinja:24 +#: accounting/templates/accounting/club_account_details.jinja:27 msgid "Start" msgstr "Début" -#: accounting/templates/accounting/club_account_details.jinja:25 +#: accounting/templates/accounting/club_account_details.jinja:28 msgid "End" msgstr "Fin" -#: accounting/templates/accounting/club_account_details.jinja:26 +#: accounting/templates/accounting/club_account_details.jinja:29 #: accounting/templates/accounting/journal_details.jinja:28 #: core/templates/core/user_account.jinja:19 #: core/templates/core/user_account.jinja:78 msgid "Amount" msgstr "Montant" -#: accounting/templates/accounting/club_account_details.jinja:27 +#: accounting/templates/accounting/club_account_details.jinja:30 msgid "Effective amount" msgstr "Montant effectif" -#: accounting/templates/accounting/club_account_details.jinja:28 +#: accounting/templates/accounting/club_account_details.jinja:31 msgid "Closed" msgstr "Fermé" -#: accounting/templates/accounting/club_account_details.jinja:29 +#: accounting/templates/accounting/club_account_details.jinja:32 #: accounting/templates/accounting/journal_details.jinja:36 msgid "Actions" msgstr "Actions" -#: accounting/templates/accounting/club_account_details.jinja:45 +#: accounting/templates/accounting/club_account_details.jinja:48 #: accounting/templates/accounting/journal_details.jinja:54 msgid "Yes" msgstr "Oui" -#: accounting/templates/accounting/club_account_details.jinja:47 +#: accounting/templates/accounting/club_account_details.jinja:50 #: accounting/templates/accounting/journal_details.jinja:56 msgid "No" msgstr "Non" -#: accounting/templates/accounting/club_account_details.jinja:49 +#: accounting/templates/accounting/club_account_details.jinja:52 #: core/templates/core/file.jinja:36 core/templates/core/page.jinja:28 msgid "View" msgstr "Voir" @@ -440,6 +468,7 @@ msgid "Done" msgstr "Effectué" #: accounting/templates/accounting/journal_details.jinja:34 +#: counter/views.py:558 msgid "Comment" msgstr "Commentaire" @@ -510,8 +539,9 @@ msgstr "Vous ne pouvez pas faire de boucles dans les clubs" msgid "A club with that unix_name already exists" msgstr "Un club avec ce nom UNIX existe déjà." -#: club/models.py:145 eboutic/models.py:13 eboutic/models.py:46 -#: launderette/models.py:89 launderette/models.py:126 +#: club/models.py:145 counter/models.py:280 counter/models.py:294 +#: eboutic/models.py:13 eboutic/models.py:46 launderette/models.py:89 +#: launderette/models.py:126 msgid "user" msgstr "nom d'utilisateur" @@ -860,10 +890,6 @@ msgstr "signature du forum" msgid "second email address" msgstr "adresse email secondaire" -#: core/models.py:166 -msgid "phone" -msgstr "téléphone" - #: core/models.py:167 msgid "parent phone" msgstr "téléphone des parents" @@ -1185,7 +1211,7 @@ msgid "Please login to see this page." msgstr "Merci de vous identifier pour voir cette page." #: core/templates/core/login.jinja:28 -#: counter/templates/counter/counter_main.jinja:52 +#: counter/templates/counter/counter_main.jinja:53 msgid "login" msgstr "login" @@ -1531,7 +1557,7 @@ msgstr "Gestion de Sith" msgid "Subscriptions" msgstr "Cotisations" -#: core/templates/core/user_tools.jinja:22 counter/views.py:470 +#: core/templates/core/user_tools.jinja:22 counter/views.py:473 msgid "Counters" msgstr "Comptoirs" @@ -1661,6 +1687,10 @@ msgstr "groupe d'achat" msgid "product" msgstr "produit" +#: counter/models.py:113 +msgid "products" +msgstr "produits" + #: counter/models.py:114 msgid "counter type" msgstr "type de comptoir" @@ -1677,7 +1707,7 @@ msgstr "Bureau" #: eboutic/templates/eboutic/eboutic_main.jinja:24 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:8 #: eboutic/templates/eboutic/eboutic_payment_result.jinja:4 -#: sith/settings.py:288 sith/settings_sample.py:271 +#: sith/settings.py:289 sith/settings_sample.py:271 msgid "Eboutic" msgstr "Eboutic" @@ -1685,48 +1715,77 @@ msgstr "Eboutic" msgid "sellers" msgstr "vendeurs" -#: counter/models.py:123 launderette/models.py:16 +#: counter/models.py:122 counter/models.py:281 counter/models.py:295 +#: launderette/models.py:16 msgid "counter" msgstr "comptoir" -#: counter/models.py:218 +#: counter/models.py:203 msgid "bank" msgstr "banque" -#: counter/models.py:220 counter/models.py:264 +#: counter/models.py:205 counter/models.py:249 msgid "is validated" msgstr "est validé" -#: counter/models.py:223 +#: counter/models.py:208 msgid "refilling" msgstr "rechargement" -#: counter/models.py:257 eboutic/models.py:102 +#: counter/models.py:242 eboutic/models.py:102 msgid "unit price" msgstr "prix unitaire" -#: counter/models.py:258 eboutic/models.py:103 +#: counter/models.py:243 counter/models.py:320 eboutic/models.py:103 msgid "quantity" msgstr "quantité" -#: counter/models.py:263 +#: counter/models.py:248 msgid "Sith account" msgstr "Compte utilisateur" -#: counter/models.py:263 sith/settings.py:281 sith/settings.py:286 -#: sith/settings.py:307 sith/settings_sample.py:264 +#: counter/models.py:248 sith/settings.py:282 sith/settings.py:287 +#: sith/settings.py:308 sith/settings_sample.py:264 #: sith/settings_sample.py:269 sith/settings_sample.py:290 msgid "Credit card" msgstr "Carte banquaire" -#: counter/models.py:267 +#: counter/models.py:252 msgid "selling" msgstr "vente" -#: counter/models.py:301 +#: counter/models.py:284 +msgid "last activity date" +msgstr "dernière activité" + +#: counter/models.py:287 msgid "permanency" msgstr "permanence" +#: counter/models.py:298 +msgid "emptied" +msgstr "coffre vidée" + +#: counter/models.py:301 +msgid "cash register summary" +msgstr "relevé de caisse" + +#: counter/models.py:318 +msgid "cash summary" +msgstr "relevé" + +#: counter/models.py:319 +msgid "value" +msgstr "valeur" + +#: counter/models.py:321 +msgid "check" +msgstr "chèque" + +#: counter/models.py:324 +msgid "cash register summary item" +msgstr "élément de relevé de caisse" + #: counter/templates/counter/counter_click.jinja:29 msgid "Customer" msgstr "Client" @@ -1824,6 +1883,10 @@ msgid "Please, login" msgstr "Merci de vous identifier" #: counter/templates/counter/counter_main.jinja:43 +msgid "Make a cash register summary" +msgstr "Faire un relevé de caisse" + +#: counter/templates/counter/counter_main.jinja:46 msgid "Barman: " msgstr "Barman : " @@ -1853,42 +1916,96 @@ msgstr "Nouveau type de produit" msgid "There is no product types in this website." msgstr "Il n'y a pas de types de produit dans ce site web." -#: counter/views.py:35 +#: counter/views.py:36 msgid "Select user" msgstr "Choisir un utilisateur" -#: counter/views.py:51 +#: counter/views.py:52 msgid "User not found" msgstr "Utilisateur non trouvé" -#: counter/views.py:83 +#: counter/views.py:84 msgid "Bad credentials" msgstr "Mauvais identifiants" -#: counter/views.py:85 +#: counter/views.py:86 msgid "User is not subscriber" msgstr "L'utilisateur n'est pas cotisant." -#: counter/views.py:257 +#: counter/views.py:258 msgid "END" msgstr "FIN" -#: counter/views.py:259 +#: counter/views.py:260 msgid "CAN" msgstr "ANN" -#: counter/views.py:289 +#: counter/views.py:290 msgid "You have not enough money to buy all the basket" msgstr "Vous n'avez pas assez d'argent pour acheter le panier" -#: counter/views.py:467 +#: counter/views.py:470 msgid "Parent product" msgstr "Produit parent" -#: counter/views.py:468 +#: counter/views.py:471 msgid "Buying groups" msgstr "Groupes d'achat" +#: counter/views.py:538 +msgid "10 cents" +msgstr "10 centimes" + +#: counter/views.py:539 +msgid "20 cents" +msgstr "20 centimes" + +#: counter/views.py:540 +msgid "50 cents" +msgstr "50 centimes" + +#: counter/views.py:541 +msgid "1 euro" +msgstr "1 €" + +#: counter/views.py:542 +msgid "2 euros" +msgstr "2 €" + +#: counter/views.py:543 +msgid "5 euros" +msgstr "5 €" + +#: counter/views.py:544 +msgid "10 euros" +msgstr "10 €" + +#: counter/views.py:545 +msgid "20 euros" +msgstr "20 €" + +#: counter/views.py:546 +msgid "50 euros" +msgstr "50 €" + +#: counter/views.py:547 +msgid "100 euros" +msgstr "100 €" + +#: counter/views.py:548 counter/views.py:550 counter/views.py:552 +#: counter/views.py:554 counter/views.py:556 +msgid "Check amount" +msgstr "Montant du chèque" + +#: counter/views.py:549 counter/views.py:551 counter/views.py:553 +#: counter/views.py:555 counter/views.py:557 +msgid "Check quantity" +msgstr "Nombre de chèque" + +#: counter/views.py:559 +msgid "Emptied" +msgstr "Coffre vidé" + #: eboutic/models.py:48 msgid "validated" msgstr "validé" @@ -2037,12 +2154,12 @@ msgid "Washing and drying" msgstr "Lavage et séchage" #: launderette/templates/launderette/launderette_book.jinja:26 -#: sith/settings.py:417 sith/settings_sample.py:400 +#: sith/settings.py:418 sith/settings_sample.py:400 msgid "Washing" msgstr "Lavage" #: launderette/templates/launderette/launderette_book.jinja:30 -#: sith/settings.py:417 sith/settings_sample.py:400 +#: sith/settings.py:418 sith/settings_sample.py:400 msgid "Drying" msgstr "Séchage" @@ -2097,116 +2214,116 @@ msgstr "L'utilisateur n'a pas réservé de créneau" msgid "Token not found" msgstr "Jeton non trouvé" -#: sith/settings.py:172 sith/settings_sample.py:160 +#: sith/settings.py:173 sith/settings_sample.py:160 msgid "English" msgstr "Anglais" -#: sith/settings.py:173 sith/settings_sample.py:161 +#: sith/settings.py:174 sith/settings_sample.py:161 msgid "French" msgstr "Français" -#: sith/settings.py:278 sith/settings.py:285 sith/settings.py:305 +#: sith/settings.py:279 sith/settings.py:286 sith/settings.py:306 #: sith/settings_sample.py:261 sith/settings_sample.py:268 #: sith/settings_sample.py:288 msgid "Check" msgstr "Chèque" -#: sith/settings.py:279 sith/settings.py:287 sith/settings.py:306 +#: sith/settings.py:280 sith/settings.py:288 sith/settings.py:307 #: sith/settings_sample.py:262 sith/settings_sample.py:270 #: sith/settings_sample.py:289 msgid "Cash" msgstr "Espèces" -#: sith/settings.py:280 sith/settings_sample.py:263 +#: sith/settings.py:281 sith/settings_sample.py:263 msgid "Transfert" msgstr "Virement" -#: sith/settings.py:293 sith/settings_sample.py:276 +#: sith/settings.py:294 sith/settings_sample.py:276 msgid "Belfort" msgstr "Belfort" -#: sith/settings.py:294 sith/settings_sample.py:277 +#: sith/settings.py:295 sith/settings_sample.py:277 msgid "Sevenans" msgstr "Sevenans" -#: sith/settings.py:295 sith/settings_sample.py:278 +#: sith/settings.py:296 sith/settings_sample.py:278 msgid "Montbéliard" msgstr "Montbéliard" -#: sith/settings.py:330 sith/settings_sample.py:313 +#: sith/settings.py:331 sith/settings_sample.py:313 msgid "One semester" msgstr "Un semestre" -#: sith/settings.py:335 sith/settings_sample.py:318 +#: sith/settings.py:336 sith/settings_sample.py:318 msgid "Two semesters" msgstr "Deux semestres" -#: sith/settings.py:340 sith/settings_sample.py:323 +#: sith/settings.py:341 sith/settings_sample.py:323 msgid "Common core cursus" msgstr "Cursus tronc commun" -#: sith/settings.py:345 sith/settings.py:350 sith/settings_sample.py:328 +#: sith/settings.py:346 sith/settings.py:351 sith/settings_sample.py:328 #: sith/settings_sample.py:333 msgid "Branch cursus" msgstr "Cursus branche" -#: sith/settings.py:355 sith/settings_sample.py:338 +#: sith/settings.py:356 sith/settings_sample.py:338 msgid "Honorary member" msgstr "Membre honoraire" -#: sith/settings.py:360 sith/settings_sample.py:343 +#: sith/settings.py:361 sith/settings_sample.py:343 msgid "Assidu member" msgstr "Membre d'Assidu" -#: sith/settings.py:365 sith/settings_sample.py:348 +#: sith/settings.py:366 sith/settings_sample.py:348 msgid "Amicale/DOCEO member" msgstr "Membre de l'Amicale/DOCEO" -#: sith/settings.py:370 sith/settings_sample.py:353 +#: sith/settings.py:371 sith/settings_sample.py:353 msgid "UT network member" msgstr "Cotisant du réseau UT" -#: sith/settings.py:375 sith/settings_sample.py:358 +#: sith/settings.py:376 sith/settings_sample.py:358 msgid "CROUS member" msgstr "Membres du CROUS" -#: sith/settings.py:380 sith/settings_sample.py:363 +#: sith/settings.py:381 sith/settings_sample.py:363 msgid "Sbarro/ESTA member" msgstr "Membre de Sbarro ou de l'ESTA" -#: sith/settings.py:388 sith/settings_sample.py:371 +#: sith/settings.py:389 sith/settings_sample.py:371 msgid "President" msgstr "Président" -#: sith/settings.py:389 sith/settings_sample.py:372 +#: sith/settings.py:390 sith/settings_sample.py:372 msgid "Vice-President" msgstr "Vice-Président" -#: sith/settings.py:390 sith/settings_sample.py:373 +#: sith/settings.py:391 sith/settings_sample.py:373 msgid "Treasurer" msgstr "Trésorier" -#: sith/settings.py:391 sith/settings_sample.py:374 +#: sith/settings.py:392 sith/settings_sample.py:374 msgid "Communication supervisor" msgstr "Responsable com" -#: sith/settings.py:392 sith/settings_sample.py:375 +#: sith/settings.py:393 sith/settings_sample.py:375 msgid "Secretary" msgstr "Secrétaire" -#: sith/settings.py:393 sith/settings_sample.py:376 +#: sith/settings.py:394 sith/settings_sample.py:376 msgid "IT supervisor" msgstr "Responsable info" -#: sith/settings.py:394 sith/settings_sample.py:377 +#: sith/settings.py:395 sith/settings_sample.py:377 msgid "Board member" msgstr "Membre du bureau" -#: sith/settings.py:395 sith/settings_sample.py:378 +#: sith/settings.py:396 sith/settings_sample.py:378 msgid "Active member" msgstr "Membre actif" -#: sith/settings.py:396 sith/settings_sample.py:379 +#: sith/settings.py:397 sith/settings_sample.py:379 msgid "Curious" msgstr "Curieux" @@ -2250,4 +2367,3 @@ msgstr "Un utilisateur avec cette adresse email existe déjà" msgid "You must either choose an existing user or create a new one properly" msgstr "" "Vous devez soit choisir un utilisateur existant, ou en créer un proprement." - diff --git a/migrate.py b/migrate.py index bdbd2798..16ff37e6 100644 --- a/migrate.py +++ b/migrate.py @@ -636,6 +636,7 @@ def migrate_counter(): user=user, counter=counter, start=r['logged_time'].replace(tzinfo=timezone('Europe/Paris')), + activity=r['logged_time'].replace(tzinfo=timezone('Europe/Paris')), end=r['closed_time'].replace(tzinfo=timezone('Europe/Paris')), ) new.save()