Allow to postpone invoice creation on order changes (#3716)

* Allow to postpone invoice creation on order changes

* Add tests

* isort fix

* Fix failures

* More tests

* Update src/pretix/presale/views/order.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/base/services/orders.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/base/services/orders.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/base/services/orders.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/base/models/orders.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

---------

Co-authored-by: Richard Schreiber <schreiber@rami.io>
This commit is contained in:
Raphael Michel
2023-11-22 15:45:27 +01:00
committed by GitHub
parent 7921b67624
commit 2ef015015a
7 changed files with 318 additions and 11 deletions

View File

@@ -395,6 +395,10 @@ def generate_invoice(order: Order, trigger_pdf=True):
if order.status == Order.STATUS_CANCELED:
generate_cancellation(invoice, trigger_pdf)
if order.invoice_dirty:
order.invoice_dirty = False
order.save(update_fields=['invoice_dirty'])
return invoice

View File

@@ -2619,14 +2619,34 @@ class OrderChangeManager:
def _reissue_invoice(self):
i = self.order.invoices.filter(is_cancellation=False).last()
if self.reissue_invoice and self._invoice_dirty:
if i and not i.refered.exists():
self._invoices.append(generate_cancellation(i))
if invoice_qualified(self.order) and \
(i or
self.event.settings.invoice_generate == 'True' or (
self.open_payment is not None and self.event.settings.invoice_generate == 'paid' and
self.open_payment.payment_provider.requires_invoice_immediately)):
self._invoices.append(generate_invoice(self.order))
order_now_qualified = invoice_qualified(self.order)
invoice_should_be_generated = (
self.event.settings.invoice_generate == "True" or (
self.event.settings.invoice_generate == "paid" and
self.open_payment is not None and
self.open_payment.payment_provider.requires_invoice_immediately
) or (
self.event.settings.invoice_generate == "paid" and
self.order.status == Order.STATUS_PAID
) or (
# Backwards-compatible behaviour
self.event.settings.invoice_generate not in ("True", "paid") and
i and
not i.canceled
)
)
if order_now_qualified:
if invoice_should_be_generated:
if i and not i.canceled:
self._invoices.append(generate_cancellation(i))
self._invoices.append(generate_invoice(self.order))
else:
self.order.invoice_dirty = True
self.order.save(update_fields=["invoice_dirty"])
else:
if i and not i.canceled:
self._invoices.append(generate_cancellation(i))
def _check_complete_cancel(self):
current = self.order.positions.count()