forked from CGM_Public/pretix_original
Do not mark orders as paid when changed to free if they require approval
This commit is contained in:
@@ -962,7 +962,7 @@ class OrderChangeManager:
|
|||||||
)
|
)
|
||||||
self.order.save()
|
self.order.save()
|
||||||
elif self.order.status in (Order.STATUS_PENDING, Order.STATUS_EXPIRED) and self._totaldiff < 0:
|
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.status = Order.STATUS_PAID
|
||||||
self.order.save()
|
self.order.save()
|
||||||
elif self.open_payment:
|
elif self.open_payment:
|
||||||
@@ -982,7 +982,7 @@ class OrderChangeManager:
|
|||||||
}, user=self.user, auth=self.auth)
|
}, user=self.user, auth=self.auth)
|
||||||
|
|
||||||
def _check_paid_to_free(self):
|
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
|
# 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)
|
# 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)
|
# or positions got split off to a new order (split_order with positive total)
|
||||||
@@ -997,7 +997,7 @@ class OrderChangeManager:
|
|||||||
except Quota.QuotaExceededException:
|
except Quota.QuotaExceededException:
|
||||||
raise OrderError(self.error_messages['paid_to_free_exceeded'])
|
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(
|
p = self.split_order.payments.create(
|
||||||
state=OrderPayment.PAYMENT_STATE_CREATED,
|
state=OrderPayment.PAYMENT_STATE_CREATED,
|
||||||
provider='free',
|
provider='free',
|
||||||
@@ -1125,6 +1125,7 @@ class OrderChangeManager:
|
|||||||
split_order.code = None
|
split_order.code = None
|
||||||
split_order.datetime = now()
|
split_order.datetime = now()
|
||||||
split_order.secret = generate_secret()
|
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.save()
|
||||||
split_order.log_action('pretix.event.order.changed.split_from', user=self.user, auth=self.auth, data={
|
split_order.log_action('pretix.event.order.changed.split_from', user=self.user, auth=self.auth, data={
|
||||||
'original_order': self.order.code
|
'original_order': self.order.code
|
||||||
|
|||||||
@@ -924,6 +924,17 @@ class OrderChangeManagerTests(TestCase):
|
|||||||
assert self.order.status == Order.STATUS_PAID
|
assert self.order.status == Order.STATUS_PAID
|
||||||
assert self.order.payments.last().provider == 'free'
|
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):
|
def test_change_paid_same_price(self):
|
||||||
self.order.status = Order.STATUS_PAID
|
self.order.status = Order.STATUS_PAID
|
||||||
self.order.save()
|
self.order.save()
|
||||||
@@ -1180,6 +1191,30 @@ class OrderChangeManagerTests(TestCase):
|
|||||||
assert not self.order.invoices.exists()
|
assert not self.order.invoices.exists()
|
||||||
assert not o2.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):
|
def test_split_pending_payment_fees(self):
|
||||||
# Set payment fees
|
# Set payment fees
|
||||||
self.event.settings.set('tax_rate_default', self.tr19.pk)
|
self.event.settings.set('tax_rate_default', self.tr19.pk)
|
||||||
|
|||||||
Reference in New Issue
Block a user