Allow to change fees in existing orders (#1472)

* Allow to change fees in existing orders

* Add tests

* Add special case for payment options

* Fix PK reference in tests
This commit is contained in:
Raphael Michel
2019-10-29 22:04:42 +01:00
committed by GitHub
parent fcf9f0054e
commit 038533ad63
7 changed files with 351 additions and 27 deletions

View File

@@ -1973,6 +1973,115 @@ class OrderChangeManagerTests(TestCase):
with self.assertRaises(OrderError):
self.ocm.add_position(self.ticket, None, price=Decimal('13.00'), subevent=se2, seat=self.seat_a1)
@classscope(attr='o')
def test_fee_change_value(self):
fee = self.order.fees.create(fee_type="shipping", value=Decimal('5.00'))
self.order.total += Decimal('5.00')
self.order.save()
self.ocm.change_fee(fee, Decimal('3.50'))
self.ocm.commit()
self.order.refresh_from_db()
assert self.order.total == Decimal('49.50')
fee.refresh_from_db()
assert fee.value == Decimal('3.50')
@classscope(attr='o')
def test_fee_change_value_tax_rate(self):
fee = self.order.fees.create(fee_type="shipping", value=Decimal('5.00'), tax_rule=self.tr19)
self.order.total += Decimal('5.00')
self.order.save()
self.ocm.change_fee(fee, Decimal('3.50'))
self.ocm.commit()
self.order.refresh_from_db()
assert self.order.total == Decimal('49.50')
fee.refresh_from_db()
assert fee.value == Decimal('3.50')
assert fee.tax_rate == Decimal('19.00')
assert fee.tax_value == Decimal('0.56')
@classscope(attr='o')
def test_fee_cancel(self):
fee = self.order.fees.create(fee_type="shipping", value=Decimal('5.00'))
self.order.total += Decimal('5.00')
self.order.save()
self.ocm.cancel_fee(fee)
self.ocm.commit()
self.order.refresh_from_db()
assert self.order.total == Decimal('46.00')
fee.refresh_from_db()
assert fee.canceled
@classscope(attr='o')
def test_clear_out_order(self):
self.order.status = Order.STATUS_PAID
self.order.save()
self.order.payments.create(amount=self.order.total, state=OrderPayment.PAYMENT_STATE_CONFIRMED, provider='manual')
cancel_order(self.order, cancellation_fee=Decimal('5.00'))
self.order.refresh_from_db()
assert self.order.total == Decimal('5.00')
self.ocm.cancel_fee(self.order.fees.get())
self.ocm.commit()
self.order.refresh_from_db()
assert self.order.total == Decimal('0.00')
assert self.order.status == Order.STATUS_CANCELED
@classscope(attr='o')
def test_auto_change_payment_fee(self):
fee2 = self.order.fees.create(fee_type=OrderFee.FEE_TYPE_SHIPPING, value=Decimal('0.50'))
fee = self.order.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.46'))
self.order.status = Order.STATUS_PAID
self.order.total = Decimal('51.1')
self.order.save()
self.order.payments.create(state=OrderPayment.PAYMENT_STATE_PENDING, amount=Decimal('48.5'), fee=fee, provider="banktransfer")
prov = self.ocm._get_payment_provider()
prov.settings.set('_fee_percent', Decimal('10.00'))
prov.settings.set('_fee_reverse_calc', False)
self.ocm.cancel_fee(fee2)
self.ocm.commit()
assert self.order.total == Decimal('50.6')
fee.refresh_from_db()
assert fee.value == Decimal('4.6')
@classscope(attr='o')
def test_change_payment_fee(self):
fee = self.order.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.46'))
self.order.status = Order.STATUS_PAID
self.order.total = Decimal('50.60')
self.order.save()
self.order.payments.create(state=OrderPayment.PAYMENT_STATE_PENDING, amount=Decimal('48.5'), fee=fee, provider="banktransfer")
prov = self.ocm._get_payment_provider()
prov.settings.set('_fee_percent', Decimal('10.00'))
prov.settings.set('_fee_reverse_calc', False)
self.ocm.change_fee(fee, Decimal('0.2'))
self.ocm.commit()
fee.refresh_from_db()
assert fee.value == Decimal('0.20')
self.order.refresh_from_db()
assert self.order.total == Decimal('46.20')
@classscope(attr='o')
def test_cancel_payment_fee(self):
fee = self.order.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.46'))
self.order.status = Order.STATUS_PAID
self.order.total = Decimal('50.60')
self.order.save()
self.order.payments.create(state=OrderPayment.PAYMENT_STATE_PENDING, amount=Decimal('48.5'), fee=fee, provider="banktransfer")
prov = self.ocm._get_payment_provider()
prov.settings.set('_fee_percent', Decimal('10.00'))
prov.settings.set('_fee_reverse_calc', False)
self.ocm.cancel_fee(fee)
self.ocm.commit()
fee.refresh_from_db()
assert fee.canceled
self.order.refresh_from_db()
assert self.order.total == Decimal('46.00')
@pytest.mark.django_db
def test_autocheckin(clist_autocheckin, event):

View File

@@ -1291,6 +1291,60 @@ class OrderChangeTests(SoupTest):
assert op.tax_value == Decimal('0.00')
assert op.tax_rate == Decimal('0.00')
def test_change_fee_value_success(self):
with scopes_disabled():
fee = self.order.fees.create(fee_type="shipping", value=Decimal('5.00'), tax_rule=self.tr19)
self.order.total += Decimal('5.00')
self.order.save()
self.client.post('/control/event/{}/{}/orders/{}/change'.format(
self.event.organizer.slug, self.event.slug, self.order.code
), {
'add-TOTAL_FORMS': '0',
'add-INITIAL_FORMS': '0',
'add-MIN_NUM_FORMS': '0',
'add-MAX_NUM_FORMS': '100',
'op-{}-price'.format(self.op1.pk): '24.00',
'op-{}-operation'.format(self.op2.pk): '',
'op-{}-itemvar'.format(self.op2.pk): str(self.ticket.pk),
'of-{}-value'.format(fee.pk): '3.50',
})
self.op1.refresh_from_db()
self.order.refresh_from_db()
assert self.op1.item == self.ticket
assert self.op1.price == Decimal('24.00')
fee.refresh_from_db()
self.op1.refresh_from_db()
self.op2.refresh_from_db()
assert self.order.total == self.op1.price + self.op2.price + Decimal('3.50')
assert fee.value == Decimal('3.50')
def test_cancel_fee_success(self):
with scopes_disabled():
fee = self.order.fees.create(fee_type="shipping", value=Decimal('5.00'), tax_rule=self.tr19)
self.order.total += Decimal('5.00')
self.order.save()
self.client.post('/control/event/{}/{}/orders/{}/change'.format(
self.event.organizer.slug, self.event.slug, self.order.code
), {
'add-TOTAL_FORMS': '0',
'add-INITIAL_FORMS': '0',
'add-MIN_NUM_FORMS': '0',
'add-MAX_NUM_FORMS': '100',
'op-{}-operation'.format(self.op1.pk): 'price',
'op-{}-itemvar'.format(self.op1.pk): str(self.ticket.pk),
'op-{}-price'.format(self.op1.pk): '24.00',
'op-{}-operation'.format(self.op2.pk): '',
'op-{}-itemvar'.format(self.op2.pk): str(self.ticket.pk),
'of-{}-value'.format(fee.pk): '5.00',
'of-{}-operation_cancel'.format(fee.pk): 'on',
})
self.order.refresh_from_db()
fee.refresh_from_db()
assert fee.canceled
self.op1.refresh_from_db()
self.op2.refresh_from_db()
assert self.order.total == self.op1.price + self.op2.price
@pytest.mark.django_db
def test_check_vatid(client, env):