From d9019ae735a9e86c59d9d37323338273cbc66abf Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 15 Mar 2024 11:37:27 +0100 Subject: [PATCH] Fix splitting free orders that require approval --- src/pretix/base/services/orders.py | 4 ++-- src/tests/base/test_orders.py | 33 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index cb3dfc54a6..a1c49cd39d 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -220,7 +220,7 @@ def reactivate_order(order: Order, force: bool=False, user: User=None, auth=None is_available = order._is_still_available(now(), count_waitinglist=False, check_voucher_usage=True, check_memberships=True, lock=True, force=force) if is_available is True: - if order.payment_refund_sum >= order.total: + if order.payment_refund_sum >= order.total and not order.require_approval: order.status = Order.STATUS_PAID else: order.status = Order.STATUS_PENDING @@ -2500,7 +2500,7 @@ class OrderChangeManager: remaining_total = sum([p.price for p in self.order.positions.all()]) + sum([f.value for f in self.order.fees.all()]) offset_amount = min(max(0, self.completed_payment_sum - remaining_total), split_order.total) - if offset_amount >= split_order.total: + if offset_amount >= split_order.total and not split_order.require_approval: split_order.status = Order.STATUS_PAID else: split_order.status = Order.STATUS_PENDING diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 93565535ca..cbd0e0771f 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -2330,6 +2330,39 @@ class OrderChangeManagerTests(TestCase): assert not self.order.invoices.exists() assert not o2.invoices.exists() + @classscope(attr='o') + def test_split_require_approval_all_free(self): + self.op1.price = Decimal("0.00") + self.op1.save() + self.op2.price = Decimal("0.00") + self.op1.save() + self.order.total = Decimal("0.00") + self.order.payments.all().delete() + 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.status == Order.STATUS_PENDING + assert self.order.total == Decimal('0.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('0.00') + assert o2.status == Order.STATUS_PENDING + 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() + @classscope(attr='o') def test_split_pending_payment_fees(self): # Set payment fees