From 47682fd24383158c7523e7a2c33f6df328351c42 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 5 Aug 2016 11:33:28 +0200 Subject: [PATCH] Refs #131 -- Allow manual reissuing of invoices --- src/pretix/control/logdisplay.py | 3 ++ .../templates/pretixcontrol/order/index.html | 11 ++++- src/pretix/control/urls.py | 2 + src/pretix/control/views/orders.py | 42 +++++++++++++++---- src/pretix/presale/views/order.py | 6 ++- 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/pretix/control/logdisplay.py b/src/pretix/control/logdisplay.py index f6b441b99..2addfca5d 100644 --- a/src/pretix/control/logdisplay.py +++ b/src/pretix/control/logdisplay.py @@ -16,6 +16,9 @@ def pretixcontrol_logentry_display(sender, logentry, **kwargs): 'pretix.event.order.refunded': _('The order has been refunded.'), 'pretix.event.order.cancelled': _('The order has been cancelled.'), 'pretix.event.order.placed': _('The order has been created.'), + 'pretix.event.order.invoice.generated': _('The invoice has been generated.'), + 'pretix.event.order.invoice.regenerated': _('The invoice has been regenerated.'), + 'pretix.event.order.invoice.reissued': _('The invoice has been reissued.'), } if logentry.action_type in plains: return plains[logentry.action_type] diff --git a/src/pretix/control/templates/pretixcontrol/order/index.html b/src/pretix/control/templates/pretixcontrol/order/index.html index 3830bfefe..1016cdfa4 100644 --- a/src/pretix/control/templates/pretixcontrol/order/index.html +++ b/src/pretix/control/templates/pretixcontrol/order/index.html @@ -110,9 +110,18 @@ action="{% url "control:event.order.regeninvoice" event=request.event.slug organizer=request.event.organizer.slug code=order.code id=i.pk %}"> {% csrf_token %} + {% if not i.is_cancellation %} +
+ {% csrf_token %} + +
+ {% endif %} {% endif %} {% if forloop.revcounter0 > 0 %}
diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 6205f565c..a7a123670 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -73,6 +73,8 @@ urlpatterns = [ name='event.order.geninvoice'), url(r'^orders/(?P[0-9A-Z]+)/invoices/(?P\d+)/regenerate$', orders.OrderInvoiceRegenerate.as_view(), name='event.order.regeninvoice'), + url(r'^orders/(?P[0-9A-Z]+)/invoices/(?P\d+)/reissue$', orders.OrderInvoiceReissue.as_view(), + name='event.order.reissueinvoice'), url(r'^orders/(?P[0-9A-Z]+)/extend$', orders.OrderExtend.as_view(), name='event.order.extend'), url(r'^orders/(?P[0-9A-Z]+)/$', orders.OrderDetail.as_view(), name='event.order'), diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 53c9acd82..5d41258f9 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -18,7 +18,8 @@ from pretix.base.models import ( from pretix.base.services import tickets from pretix.base.services.export import export from pretix.base.services.invoices import ( - generate_invoice, invoice_pdf, invoice_qualified, regenerate_invoice, + generate_cancellation, generate_invoice, invoice_pdf, invoice_qualified, + regenerate_invoice, ) from pretix.base.services.mail import mail from pretix.base.services.orders import cancel_order, mark_order_paid @@ -229,7 +230,7 @@ class OrderInvoiceCreate(OrderView): messages.error(self.request, _('An invoice for this order already exists.')) else: inv = generate_invoice(self.order) - self.order.log_action('pretix.event.order.invoice.generate', user=self.request.user, data={ + self.order.log_action('pretix.event.order.invoice.generated', user=self.request.user, data={ 'invoice': inv.pk }) messages.success(self.request, _('The invoice has been generated.')) @@ -247,12 +248,39 @@ class OrderInvoiceRegenerate(OrderView): inv = self.order.invoices.get(pk=kwargs.get('id')) except Order.DoesNotExist: messages.error(self.request, _('Unknown invoice.')) + else: + if inv.canceled: + messages.error(self.request, _('The invoice has already been canceled.')) + else: + inv = regenerate_invoice(inv) + self.order.log_action('pretix.event.order.invoice.regenerated', user=self.request.user, data={ + 'invoice': inv.pk + }) + messages.success(self.request, _('The invoice has been regenerated.')) + return redirect(self.get_order_url()) - inv = regenerate_invoice(inv) - self.order.log_action('pretix.event.order.invoice.regenerate', user=self.request.user, data={ - 'invoice': inv.pk - }) - messages.success(self.request, _('The invoice has been regenerated.')) + def get(self, *args, **kwargs): + return HttpResponseNotAllowed(['POST']) + + +class OrderInvoiceReissue(OrderView): + permission = 'can_change_orders' + + def post(self, *args, **kwargs): + try: + inv = self.order.invoices.get(pk=kwargs.get('id')) + except Order.DoesNotExist: + messages.error(self.request, _('Unknown invoice.')) + else: + if inv.canceled: + messages.error(self.request, _('The invoice has already been canceled.')) + else: + generate_cancellation(inv) + inv = generate_invoice(self.order) + self.order.log_action('pretix.event.order.invoice.reissued', user=self.request.user, data={ + 'invoice': inv.pk + }) + messages.success(self.request, _('The invoice has been reissued.')) return redirect(self.get_order_url()) def get(self, *args, **kwargs): diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index 8ea254f0d..91b2a0b2d 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -166,8 +166,10 @@ class OrderInvoiceCreate(EventViewMixin, OrderDetailMixin, View): elif self.order.invoices.exists(): messages.error(self.request, _('An invoice for this order already exists.')) else: - generate_invoice(self.order) - self.order.log_action('pretix.event.order.invoice.generate') + i = generate_invoice(self.order) + self.order.log_action('pretix.event.order.invoice.generated', data={ + 'invoice': i.pk + }) messages.success(self.request, _('The invoice has been generated.')) return redirect(self.get_order_url())