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 %} +
+ {% endif %} {% endif %} {% if forloop.revcounter0 > 0 %}[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())