mirror of
https://github.com/pretix/pretix.git
synced 2026-08-12 11:07:02 +00:00
Fix splitting free orders that require approval
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user