diff --git a/src/pretix/presale/templates/pretixpresale/event/order.html b/src/pretix/presale/templates/pretixpresale/event/order.html index da576a3c47..eef533ae83 100644 --- a/src/pretix/presale/templates/pretixpresale/event/order.html +++ b/src/pretix/presale/templates/pretixpresale/event/order.html @@ -182,13 +182,19 @@
-
- {% csrf_token %} - -
+ {% if generate_invoice_requires == "payment" %} +
+ {% trans "You need to select a payment method above before you can request an invoice." %} +
+ {% else %} +
+ {% csrf_token %} + +
+ {% endif %}
diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index f0719acc33..8ff78dbeae 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -187,6 +187,11 @@ class OrderDetails(EventViewMixin, OrderDetailMixin, CartMixin, TicketPageMixin, ) ) ctx['can_generate_invoice'] = invoice_qualified(self.order) and can_generate_invoice + if ctx['can_generate_invoice']: + if not self.order.payments.exclude( + state__in=[OrderPayment.PAYMENT_STATE_CANCELED, OrderPayment.PAYMENT_STATE_FAILED] + ).exists() and self.order.status == Order.STATUS_PENDING: + ctx['generate_invoice_requires'] = 'payment' ctx['url'] = build_absolute_uri( self.request.event, 'presale:event.order', kwargs={ 'order': self.order.code, @@ -603,6 +608,10 @@ class OrderInvoiceCreate(EventViewMixin, OrderDetailMixin, View): self.request.event.settings.get('invoice_generate') == 'paid' and self.order.status == Order.STATUS_PAID ) + ) and not ( + not self.order.payments.exclude( + state__in=[OrderPayment.PAYMENT_STATE_CANCELED, OrderPayment.PAYMENT_STATE_FAILED] + ).exists() and self.order.status == Order.STATUS_PENDING ) ) if not can_generate_invoice or not invoice_qualified(self.order): diff --git a/src/tests/presale/test_orders.py b/src/tests/presale/test_orders.py index 1ca0be0cc1..8eac5382d8 100644 --- a/src/tests/presale/test_orders.py +++ b/src/tests/presale/test_orders.py @@ -446,8 +446,20 @@ class OrdersTest(BaseOrdersTest): {}) assert 404 == response.status_code + def test_invoice_create_require_payment(self): + self.event.settings.set('invoice_generate', 'user') + response = self.client.post( + '/%s/%s/order/%s/%s/invoice' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), + {}, follow=True) + assert 'alert-danger' in response.rendered_content + with scopes_disabled(): + assert not self.order.invoices.exists() + def test_invoice_create_ok(self): self.event.settings.set('invoice_generate', 'user') + with scopes_disabled(): + self.order.payments.create(provider='banktransfer', state=OrderPayment.PAYMENT_STATE_CONFIRMED, + amount=self.order.total) response = self.client.post( '/%s/%s/order/%s/%s/invoice' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), {}, follow=True)