From 2d2d62045a4af390f253d1edbb1c70be0ae7d76d Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 14 Feb 2019 18:38:33 +0100 Subject: [PATCH] Do not mark orders as paid when changed to free if they require approval --- src/pretix/base/services/orders.py | 7 +++--- src/tests/base/test_orders.py | 35 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 4ed89e9583..cc71c2f03c 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -962,7 +962,7 @@ class OrderChangeManager: ) self.order.save() elif self.order.status in (Order.STATUS_PENDING, Order.STATUS_EXPIRED) and self._totaldiff < 0: - if self.order.pending_sum <= Decimal('0.00'): + if self.order.pending_sum <= Decimal('0.00') and not self.order.require_approval: self.order.status = Order.STATUS_PAID self.order.save() elif self.open_payment: @@ -982,7 +982,7 @@ class OrderChangeManager: }, user=self.user, auth=self.auth) def _check_paid_to_free(self): - if self.order.total == 0 and (self._totaldiff < 0 or (self.split_order and self.split_order.total > 0)): + if self.order.total == 0 and (self._totaldiff < 0 or (self.split_order and self.split_order.total > 0)) and not self.order.require_approval: # if the order becomes free, mark it paid using the 'free' provider # this could happen if positions have been made cheaper or removed (_totaldiff < 0) # or positions got split off to a new order (split_order with positive total) @@ -997,7 +997,7 @@ class OrderChangeManager: except Quota.QuotaExceededException: raise OrderError(self.error_messages['paid_to_free_exceeded']) - if self.split_order and self.split_order.total == 0: + if self.split_order and self.split_order.total == 0 and not self.split_order.require_approval: p = self.split_order.payments.create( state=OrderPayment.PAYMENT_STATE_CREATED, provider='free', @@ -1125,6 +1125,7 @@ class OrderChangeManager: split_order.code = None split_order.datetime = now() split_order.secret = generate_secret() + split_order.require_approval = self.order.require_approval and any(p.item.require_approval for p in split_positions) split_order.save() split_order.log_action('pretix.event.order.changed.split_from', user=self.user, auth=self.auth, data={ 'original_order': self.order.code diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 901b8427ea..77b8548168 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -924,6 +924,17 @@ class OrderChangeManagerTests(TestCase): assert self.order.status == Order.STATUS_PAID assert self.order.payments.last().provider == 'free' + def test_change_price_to_free_require_approval(self): + self.order.require_approval = True + self.order.save() + self.ocm = OrderChangeManager(self.order, None) + self.ocm.change_price(self.op1, Decimal('0.00')) + self.ocm.change_price(self.op2, Decimal('0.00')) + self.ocm.commit() + self.order.refresh_from_db() + assert self.order.total == 0 + assert self.order.status == Order.STATUS_PENDING + def test_change_paid_same_price(self): self.order.status = Order.STATUS_PAID self.order.save() @@ -1180,6 +1191,30 @@ class OrderChangeManagerTests(TestCase): assert not self.order.invoices.exists() assert not o2.invoices.exists() + def test_split_require_approval(self): + self.op2.item.require_approval = True + self.op2.item.save() + self.order.require_approval = True + self.order.save() + old_secret = self.op2.secret + self.ocm.split(self.op2) + self.ocm.commit() + self.order.refresh_from_db() + self.op2.refresh_from_db() + assert self.order.total == Decimal('23.00') + assert self.order.positions.count() == 1 + assert self.op2.order != self.order + assert self.op2.order.require_approval + o2 = self.op2.order + assert o2.total == Decimal('23.00') + assert o2.positions.count() == 1 + assert o2.code != self.order.code + assert o2.secret != self.order.secret + assert o2.datetime > self.order.datetime + assert self.op2.secret != old_secret + assert not self.order.invoices.exists() + assert not o2.invoices.exists() + def test_split_pending_payment_fees(self): # Set payment fees self.event.settings.set('tax_rate_default', self.tr19.pk)