From d4d046ca605b976adb5eecc68800bfe0d89bd82f Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 10 Oct 2019 12:19:06 +0200 Subject: [PATCH] Order change manager: Allow to disable invoice issuing --- src/pretix/base/services/orders.py | 5 +++-- src/pretix/control/forms/orders.py | 9 +++++++++ .../control/templates/pretixcontrol/order/change.html | 1 + src/pretix/control/views/orders.py | 3 ++- src/tests/base/test_orders.py | 9 +++++++++ 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 608bb531e5..b711f47060 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -904,12 +904,13 @@ class OrderChangeManager: SplitOperation = namedtuple('SplitOperation', ('position',)) RegenerateSecretOperation = namedtuple('RegenerateSecretOperation', ('position',)) - def __init__(self, order: Order, user=None, auth=None, notify=True): + def __init__(self, order: Order, user=None, auth=None, notify=True, reissue_invoice=True): self.order = order self.user = user self.auth = auth self.event = order.event self.split_order = None + self.reissue_invoice = reissue_invoice self._committed = False self._totaldiff = 0 self._quotadiff = Counter() @@ -1392,7 +1393,7 @@ class OrderChangeManager: def _reissue_invoice(self): i = self.order.invoices.filter(is_cancellation=False).last() - if i and self._invoice_dirty: + if self.reissue_invoice and i and self._invoice_dirty: generate_cancellation(i) generate_invoice(self.order) diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index e4b34340a2..318830f1d1 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -168,6 +168,15 @@ class OtherOperationsForm(forms.Form): 'Use with care and only if you need to. Note that rounding differences might occur in this procedure.' ) ) + reissue_invoice = forms.BooleanField( + label=_('Issue a new invoice if required'), + required=False, + initial=True, + help_text=_( + 'If an invoice exists for this order and this operation would change its contents, the old invoice will ' + 'be cancelled and a new invoice will be issued.' + ) + ) notify = forms.BooleanField( label=_('Notify user'), required=False, diff --git a/src/pretix/control/templates/pretixcontrol/order/change.html b/src/pretix/control/templates/pretixcontrol/order/change.html index a0b02f3a04..6a929d0cb5 100644 --- a/src/pretix/control/templates/pretixcontrol/order/change.html +++ b/src/pretix/control/templates/pretixcontrol/order/change.html @@ -215,6 +215,7 @@ {% endif %} {% bootstrap_field other_form.recalculate_taxes layout="control" %} + {% bootstrap_field other_form.reissue_invoice layout="control" %} {% bootstrap_field other_form.notify layout="control" %} diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index e26868275a..a745471a95 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -1297,7 +1297,8 @@ class OrderChange(OrderView): ocm = OrderChangeManager( self.order, user=self.request.user, - notify=notify + notify=notify, + reissue_invoice=self.other_form.cleaned_data['reissue_invoice'] if self.other_form.is_valid() else True ) form_valid = self._process_add(ocm) and self._process_change(ocm) and self._process_other(ocm) diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 6301c0c266..c9614257d0 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -1219,6 +1219,15 @@ class OrderChangeManagerTests(TestCase): self.ocm.commit() assert self.order.invoices.count() == 3 + @classscope(attr='o') + def test_reissue_invoice_disabled(self): + self.ocm.reissue_invoice = False + generate_invoice(self.order) + assert self.order.invoices.count() == 1 + self.ocm.add_position(self.ticket, None, Decimal('0.00')) + self.ocm.commit() + assert self.order.invoices.count() == 1 + @classscope(attr='o') def test_dont_reissue_invoice_on_free_product_changes(self): self.event.settings.invoice_include_free = False