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 fd3fa4b0..3120bf7e 100644 Binary files a/locale/fr/LC_MESSAGES/django.mo and b/locale/fr/LC_MESSAGES/django.mo differ diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 4f3a4643..405af61c 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-08-24 21:38+0200\n" +"POT-Creation-Date: 2016-08-26 20:28+0200\n" "PO-Revision-Date: 2016-07-18\n" "Last-Translator: Skia \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()