From bd14be485a81b6d36d771b1b9bce3a12c1b1cd8e Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 30 Nov 2023 11:51:41 +0100 Subject: [PATCH] Order change: Do not set invoice_dirty if invoicing is disabled --- src/pretix/base/services/orders.py | 9 ++++++--- src/tests/base/test_orders.py | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 50c3258927..4c8e945779 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -2620,7 +2620,7 @@ class OrderChangeManager: i = self.order.invoices.filter(is_cancellation=False).last() if self.reissue_invoice and self._invoice_dirty: order_now_qualified = invoice_qualified(self.order) - invoice_should_be_generated = ( + invoice_should_be_generated_now = ( self.event.settings.invoice_generate == "True" or ( self.event.settings.invoice_generate == "paid" and self.open_payment is not None and @@ -2635,13 +2635,16 @@ class OrderChangeManager: not i.canceled ) ) + invoice_should_be_generated_later = not invoice_should_be_generated_now and ( + self.event.settings.invoice_generate in ("True", "paid") + ) if order_now_qualified: - if invoice_should_be_generated: + if invoice_should_be_generated_now: if i and not i.canceled: self._invoices.append(generate_cancellation(i)) self._invoices.append(generate_invoice(self.order)) - else: + elif invoice_should_be_generated_later: self.order.invoice_dirty = True self.order.save(update_fields=["invoice_dirty"]) else: diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 667ee387b1..3061362379 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -2006,6 +2006,20 @@ class OrderChangeManagerTests(TestCase): ).confirm() assert self.order.invoices.count() == 3 + @classscope(attr='o') + def test_reissue_invoice_paid_only_after_payment_only_if_enabled(self): + self.event.settings.invoice_generate = "False" + assert self.order.invoices.count() == 0 + self.ocm.add_position(self.ticket, None, Decimal('2.00')) + self.ocm.commit() + assert self.order.invoices.count() == 0 + self.order.refresh_from_db() + assert not self.order.invoice_dirty + self.order.payments.create( + provider='manual', amount=self.order.total + ).confirm() + assert self.order.invoices.count() == 0 + @classscope(attr='o') def test_reissue_invoice_paid_stays_paid(self): self.event.settings.invoice_generate = "paid"