From 1447d7b173fa608512b4a843cf378888ec33050b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Wed, 11 Apr 2018 19:53:54 +0000 Subject: [PATCH] Added choice for multiple articles in new PDF invoice --- cotisations/forms.py | 8 -- .../templates/cotisations/control.html | 8 +- .../templates/cotisations/facture.html | 97 +++++++++++++++++++ .../templates/cotisations/factures.tex | 2 +- cotisations/views.py | 51 +++++++--- 5 files changed, 141 insertions(+), 25 deletions(-) diff --git a/cotisations/forms.py b/cotisations/forms.py index 554e402e..524e878f 100644 --- a/cotisations/forms.py +++ b/cotisations/forms.py @@ -145,14 +145,6 @@ class NewFactureFormPdf(Form): """ Form used to create a custom PDF invoice. """ - article = forms.ModelMultipleChoiceField( - queryset=Article.objects.all(), - label=_l("Article") - ) - number = forms.IntegerField( - label=_l("Quantity"), - validators=[MinValueValidator(1)] - ) paid = forms.BooleanField(label=_l("Paid"), required=False) # TODO : change dest field to recipient dest = forms.CharField(required=True, max_length=255, label=_l("Recipient")) diff --git a/cotisations/templates/cotisations/control.html b/cotisations/templates/cotisations/control.html index cdd212e3..bb3a06b6 100644 --- a/cotisations/templates/cotisations/control.html +++ b/cotisations/templates/cotisations/control.html @@ -65,12 +65,12 @@ with this program; if not, write to the Free Software Foundation, Inc., {% trans "Date" as tr_date %} - {% include 'buttons/sort.html' with prefix='control' col='date' text=tr_date %}< - /th> + {% include 'buttons/sort.html' with prefix='control' col='date' text=tr_date %}i + {% trans "Validated" as tr_validated %} - {% include 'buttons/sort.html' with prefix='control' col='valid' text=tr_validated %}< - /th> + {% include 'buttons/sort.html' with prefix='control' col='valid' text=tr_validated %} + {% trans "Controlled" as tr_controlled %} {% include 'buttons/sort.html' with prefix='control' col='control' text=tr_controlled %} diff --git a/cotisations/templates/cotisations/facture.html b/cotisations/templates/cotisations/facture.html index 2b0cd456..d708b407 100644 --- a/cotisations/templates/cotisations/facture.html +++ b/cotisations/templates/cotisations/facture.html @@ -34,8 +34,105 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% csrf_token %} +

{% trans "Invoice's articles" %}

+
+ {{ articlesformset.management_form }} + {% for articlesform in articlesformset.forms %} +
+ {% trans "Article" %} :   + {% bootstrap_form articlesform label_class='sr-only' %} +   + +
+ {% endfor %} +
+ +

+ {% blocktrans %} + Total price : 0,00 € + {% endblocktrans %} +

{% bootstrap_form factureform %} {% bootstrap_button action_name button_type='submit' icon='star' %}
+ + + + {% endblock %} diff --git a/cotisations/templates/cotisations/factures.tex b/cotisations/templates/cotisations/factures.tex index 1f1fe0cf..3f2ebedc 100644 --- a/cotisations/templates/cotisations/factures.tex +++ b/cotisations/templates/cotisations/factures.tex @@ -92,7 +92,7 @@ \doublehline {% for a in article %} - {{a.0.name}} & {{a.0.prix}} \euro & {{a.1}} & {{a.2}} \euro\\ + {{a.name}} & {{a.price}} \euro & {{a.quantity}} & {{a.total_price}} \euro\\ \hline {% endfor %} diff --git a/cotisations/views.py b/cotisations/views.py index 5ac27fae..b946c3d6 100644 --- a/cotisations/views.py +++ b/cotisations/views.py @@ -198,22 +198,40 @@ def new_facture_pdf(request): get invoices that are not taken into account, for the administrative point of view. """ + # The template needs the list of articles (for the JS part) + articles = Article.objects.filter( + Q(type_user='All') | Q(type_user=request.user.class_name) + ) + # Building the invocie form and the article formset invoice_form = NewFactureFormPdf(request.POST or None) - if invoice_form.is_valid(): - tbl = [] - article = invoice_form.cleaned_data['article'] - quantity = invoice_form.cleaned_data['number'] + if request.user.is_class_club: + articles_formset = formset_factory(SelectClubArticleForm)(request.POST or None) + else: + articles_formset = formset_factory(SelectUserArticleForm)(request.POST or None) + if invoice_form.is_valid() and articles_formset.is_valid(): + # Get the article list and build an list out of it + # contiaining (article_name, article_price, quantity, total_price) + articles_info = [] + for articles_form in articles_formset: + if articles_form.cleaned_data: + article = articles_form.cleaned_data['article'] + quantity = articles_form.cleaned_data['quantity'] + articles_info.append({ + 'name': article.name, + 'price': article.prix, + 'quantity': quantity, + 'total_price': article.prix * quantity + }) paid = invoice_form.cleaned_data['paid'] recipient = invoice_form.cleaned_data['dest'] address = invoice_form.cleaned_data['chambre'] - for art in article: - tbl.append([art, quantity, art.prix * quantity]) - total_price = sum(a[2] for a in tbl) + total_price = sum(a['total_price'] for a in articles_info) + return render_invoice(request, { 'DATE': timezone.now(), 'recipient_name': recipient, 'address': address, - 'article': tbl, + 'article': articles_info, 'total': total_price, 'paid': paid, 'asso_name': AssoOption.get_cached_value('name'), @@ -226,7 +244,9 @@ def new_facture_pdf(request): }) return form({ 'factureform': invoice_form, - 'action_name': _("Edit") + 'action_name': _("Create"), + 'articlesformset': articles_formset, + 'articles': articles }, 'cotisations/facture.html', request) @@ -242,9 +262,16 @@ def facture_pdf(request, facture, factureid): """ # TODO : change vente to purchase purchases_objects = Vente.objects.all().filter(facture=facture) - purchases = [] + # Get the article list and build an list out of it + # contiaining (article_name, article_price, quantity, total_price) + purchases_info = [] for purchase in purchases_objects: - purchases.append([purchase, purchase.number, purchase.prix_total]) + purchases_info.append({ + 'name': purchase.name, + 'price': purchase.prix, + 'quantity': purchase.number, + 'total_price': purchase.prix_total + }) return render_invoice(request, { 'paid': True, 'fid': facture.id, @@ -254,7 +281,7 @@ def facture_pdf(request, facture, factureid): facture.user.surname ), 'address': facture.user.room, - 'article': purchases, + 'article': purchases_info, 'total': facture.prix_total(), 'asso_name': AssoOption.get_cached_value('name'), 'line1': AssoOption.get_cached_value('adresse1'),