class OrderChangeManagerTests(TestCase): def setUp(self): super().setUp() o = Organizer.objects.create(name='Dummy', slug='dummy') self.event = Event.objects.create( organizer=o, name='Dummy', slug='dummy', date_from=now(), plugins='pretix.plugins.banktransfer') self.order = Order.objects.create(code='FOO', event=self.event, email='*****@*****.**', status=Order.STATUS_PENDING, locale='en', datetime=now(), expires=now() + timedelta(days=10), total=Decimal('46.00'), payment_provider='banktransfer') self.tr7 = self.event.tax_rules.create(rate=Decimal('7.00')) self.tr19 = self.event.tax_rules.create(rate=Decimal('19.00')) self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket', tax_rule=self.tr7, default_price=Decimal('23.00'), admission=True) self.ticket2 = Item.objects.create(event=self.event, name='Other ticket', tax_rule=self.tr7, default_price=Decimal('23.00'), admission=True) self.shirt = Item.objects.create(event=self.event, name='T-Shirt', tax_rule=self.tr19, default_price=Decimal('12.00')) self.op1 = OrderPosition.objects.create(order=self.order, item=self.ticket, variation=None, price=Decimal("23.00"), attendee_name="Peter", positionid=1) self.op2 = OrderPosition.objects.create(order=self.order, item=self.ticket, variation=None, price=Decimal("23.00"), attendee_name="Dieter", positionid=2) self.ocm = OrderChangeManager(self.order, None) self.quota = self.event.quotas.create(name='Test', size=None) self.quota.items.add(self.ticket) self.quota.items.add(self.ticket2) self.quota.items.add(self.shirt) def _enable_reverse_charge(self): self.tr7.eu_reverse_charge = True self.tr7.home_country = Country('DE') self.tr7.save() self.tr19.eu_reverse_charge = True self.tr19.home_country = Country('DE') self.tr19.save() return InvoiceAddress.objects.create(order=self.order, is_business=True, vat_id='ATU1234567', vat_id_validated=True, country=Country('AT')) def test_change_subevent_quota_required(self): self.event.has_subevents = True self.event.save() se1 = self.event.subevents.create(name="Foo", date_from=now()) se2 = self.event.subevents.create(name="Bar", date_from=now()) self.op1.subevent = se1 self.op1.save() self.quota.subevent = se1 self.quota.save() with self.assertRaises(OrderError): self.ocm.change_subevent(self.op1, se2) def test_change_subevent_success(self): self.event.has_subevents = True self.event.save() se1 = self.event.subevents.create(name="Foo", date_from=now()) se2 = self.event.subevents.create(name="Bar", date_from=now()) SubEventItem.objects.create(subevent=se2, item=self.ticket, price=12) self.op1.subevent = se1 self.op1.save() self.quota.subevent = se2 self.quota.save() self.ocm.change_subevent(self.op1, se2) self.ocm.commit() self.op1.refresh_from_db() self.order.refresh_from_db() assert self.op1.subevent == se2 assert self.op1.price == 12 assert self.order.total == self.op1.price + self.op2.price def test_change_subevent_reverse_charge(self): self._enable_reverse_charge() self.event.has_subevents = True self.event.save() se1 = self.event.subevents.create(name="Foo", date_from=now()) se2 = self.event.subevents.create(name="Bar", date_from=now()) SubEventItem.objects.create(subevent=se2, item=self.ticket, price=10.7) self.op1.subevent = se1 self.op1.save() self.quota.subevent = se2 self.quota.save() self.ocm.change_subevent(self.op1, se2) self.ocm.commit() self.op1.refresh_from_db() self.order.refresh_from_db() assert self.op1.subevent == se2 assert self.op1.price == Decimal('10.00') assert self.op1.tax_value == Decimal('0.00') assert self.order.total == self.op1.price + self.op2.price def test_change_subevent_net_price(self): self.event.has_subevents = True self.event.save() se1 = self.event.subevents.create(name="Foo", date_from=now()) se2 = self.event.subevents.create(name="Bar", date_from=now()) self.tr7.price_includes_tax = False self.tr7.save() SubEventItem.objects.create(subevent=se2, item=self.ticket, price=10) self.op1.subevent = se1 self.op1.save() self.quota.subevent = se2 self.quota.save() self.ocm.change_subevent(self.op1, se2) self.ocm.commit() self.op1.refresh_from_db() self.order.refresh_from_db() assert self.op1.subevent == se2 assert self.op1.price == Decimal('10.70') assert self.order.total == self.op1.price + self.op2.price def test_change_subevent_sold_out(self): self.event.has_subevents = True self.event.save() se1 = self.event.subevents.create(name="Foo", date_from=now()) se2 = self.event.subevents.create(name="Bar", date_from=now()) self.op1.subevent = se1 self.op1.save() self.quota.subevent = se2 self.quota.size = 0 self.quota.save() self.ocm.change_subevent(self.op1, se2) with self.assertRaises(OrderError): self.ocm.commit() self.op1.refresh_from_db() assert self.op1.subevent == se1 def test_change_item_quota_required(self): self.quota.delete() with self.assertRaises(OrderError): self.ocm.change_item(self.op1, self.shirt, None) def test_change_item_success(self): self.ocm.change_item(self.op1, self.shirt, None) self.ocm.commit() self.op1.refresh_from_db() self.order.refresh_from_db() assert self.op1.item == self.shirt assert self.op1.price == self.shirt.default_price assert self.op1.tax_rate == self.shirt.tax_rule.rate assert round_decimal(self.op1.price * (1 - 100 / (100 + self.op1.tax_rate))) == self.op1.tax_value assert self.order.total == self.op1.price + self.op2.price def test_change_item_net_price_success(self): self.tr19.price_includes_tax = False self.tr19.save() self.ocm.change_item(self.op1, self.shirt, None) self.ocm.commit() self.op1.refresh_from_db() self.order.refresh_from_db() assert self.op1.item == self.shirt assert self.op1.price == Decimal('14.28') assert self.op1.tax_rate == self.shirt.tax_rule.rate assert round_decimal(self.op1.price * (1 - 100 / (100 + self.op1.tax_rate))) == self.op1.tax_value assert self.order.total == self.op1.price + self.op2.price def test_change_item_reverse_charge(self): self._enable_reverse_charge() self.ocm.change_item(self.op1, self.shirt, None) self.ocm.commit() self.op1.refresh_from_db() self.order.refresh_from_db() assert self.op1.item == self.shirt assert self.op1.price == Decimal('10.08') assert self.op1.tax_rate == Decimal('0.00') assert self.op1.tax_value == Decimal('0.00') assert self.order.total == self.op1.price + self.op2.price def test_change_price_success(self): self.ocm.change_price(self.op1, Decimal('24.00')) self.ocm.commit() self.op1.refresh_from_db() self.order.refresh_from_db() assert self.op1.item == self.ticket assert self.op1.price == Decimal('24.00') assert round_decimal(self.op1.price * (1 - 100 / (100 + self.op1.tax_rate))) == self.op1.tax_value assert self.order.total == self.op1.price + self.op2.price def test_change_price_net_success(self): self.tr7.price_includes_tax = False self.tr7.save() self.ocm.change_price(self.op1, Decimal('10.00')) self.ocm.commit() self.op1.refresh_from_db() self.order.refresh_from_db() assert self.op1.item == self.ticket assert self.op1.price == Decimal('10.70') assert round_decimal(self.op1.price * (1 - 100 / (100 + self.op1.tax_rate))) == self.op1.tax_value assert self.order.total == self.op1.price + self.op2.price def test_cancel_success(self): self.ocm.cancel(self.op1) self.ocm.commit() self.order.refresh_from_db() assert self.order.positions.count() == 1 assert self.order.total == self.op2.price def test_free_to_paid(self): self.op1.price = Decimal('0.00') self.op1.save() self.op2.delete() self.order.total = Decimal('0.00') self.order.save() self.ocm.change_price(self.op1, Decimal('24.00')) with self.assertRaises(OrderError): self.ocm.commit() self.op1.refresh_from_db() assert self.op1.price == Decimal('0.00') def test_cancel_all_in_order(self): self.ocm.cancel(self.op1) self.ocm.cancel(self.op2) with self.assertRaises(OrderError): self.ocm.commit() assert self.order.positions.count() == 2 def test_empty(self): self.ocm.commit() def test_quota_unlimited(self): q = self.event.quotas.create(name='Test', size=None) q.items.add(self.shirt) self.ocm.change_item(self.op1, self.shirt, None) self.ocm.commit() self.op1.refresh_from_db() assert self.op1.item == self.shirt def test_quota_full(self): q = self.event.quotas.create(name='Test', size=0) q.items.add(self.shirt) self.ocm.change_item(self.op1, self.shirt, None) with self.assertRaises(OrderError): self.ocm.commit() self.op1.refresh_from_db() assert self.op1.item == self.ticket def test_quota_full_but_in_same(self): q = self.event.quotas.create(name='Test', size=0) q.items.add(self.shirt) q.items.add(self.ticket) self.ocm.change_item(self.op1, self.shirt, None) self.ocm.commit() self.op1.refresh_from_db() assert self.op1.item == self.shirt def test_multiple_quotas_shared_full(self): q1 = self.event.quotas.create(name='Test', size=0) q2 = self.event.quotas.create(name='Test', size=2) q1.items.add(self.shirt) q1.items.add(self.ticket) q2.items.add(self.shirt) self.ocm.change_item(self.op1, self.shirt, None) self.ocm.commit() self.op1.refresh_from_db() assert self.op1.item == self.shirt def test_multiple_quotas_unshared_full(self): q1 = self.event.quotas.create(name='Test', size=2) q2 = self.event.quotas.create(name='Test', size=0) q1.items.add(self.shirt) q1.items.add(self.ticket) q2.items.add(self.shirt) self.ocm.change_item(self.op1, self.shirt, None) with self.assertRaises(OrderError): self.ocm.commit() self.op1.refresh_from_db() assert self.op1.item == self.ticket def test_multiple_items_success(self): q1 = self.event.quotas.create(name='Test', size=2) q1.items.add(self.shirt) self.ocm.change_item(self.op1, self.shirt, None) self.ocm.change_item(self.op2, self.shirt, None) self.ocm.commit() self.op1.refresh_from_db() self.op2.refresh_from_db() assert self.op1.item == self.shirt assert self.op2.item == self.shirt def test_multiple_items_quotas_partially_full(self): q1 = self.event.quotas.create(name='Test', size=1) q1.items.add(self.shirt) self.ocm.change_item(self.op1, self.shirt, None) self.ocm.change_item(self.op2, self.shirt, None) with self.assertRaises(OrderError): self.ocm.commit() self.op1.refresh_from_db() self.op2.refresh_from_db() assert self.op1.item == self.ticket assert self.op2.item == self.ticket def test_payment_fee_calculation(self): self.event.settings.set('tax_rate_default', self.tr19.pk) prov = self.ocm._get_payment_provider() prov.settings.set('_fee_abs', Decimal('0.30')) self.ocm.change_price(self.op1, Decimal('24.00')) self.ocm.commit() self.order.refresh_from_db() assert self.order.total == Decimal('47.30') fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT) assert fee.value == prov.calculate_fee(self.order.total) assert fee.tax_rate == Decimal('19.00') assert round_decimal(fee.value * (1 - 100 / (100 + fee.tax_rate))) == fee.tax_value def test_require_pending(self): self.order.status = Order.STATUS_PAID self.order.save() self.ocm.change_item(self.op1, self.shirt, None) with self.assertRaises(OrderError): self.ocm.commit() self.op1.refresh_from_db() assert self.op1.item == self.ticket def test_change_price_to_free_marked_as_paid(self): 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_PAID assert self.order.payment_provider == 'free' def test_change_paid_same_price(self): self.order.status = Order.STATUS_PAID self.order.save() self.ocm.change_item(self.op1, self.ticket2, None) self.ocm.commit() self.order.refresh_from_db() assert self.order.total == 46 assert self.order.status == Order.STATUS_PAID def test_change_paid_different_price(self): self.order.status = Order.STATUS_PAID self.order.save() self.ocm.change_price(self.op1, Decimal('5.00')) with self.assertRaises(OrderError): self.ocm.commit() self.order.refresh_from_db() assert self.order.total == 46 assert self.order.status == Order.STATUS_PAID def test_add_item_quota_required(self): self.quota.delete() with self.assertRaises(OrderError): self.ocm.add_position(self.shirt, None, None, None) def test_add_item_success(self): self.ocm.add_position(self.shirt, None, None, None) self.ocm.commit() self.order.refresh_from_db() assert self.order.positions.count() == 3 nop = self.order.positions.last() assert nop.item == self.shirt assert nop.price == self.shirt.default_price assert nop.tax_rate == self.shirt.tax_rule.rate assert round_decimal( nop.price * (1 - 100 / (100 + self.shirt.tax_rule.rate))) == nop.tax_value assert self.order.total == self.op1.price + self.op2.price + nop.price assert nop.positionid == 3 def test_add_item_net_price_success(self): self.tr19.price_includes_tax = False self.tr19.save() self.ocm.add_position(self.shirt, None, None, None) self.ocm.commit() self.order.refresh_from_db() assert self.order.positions.count() == 3 nop = self.order.positions.last() assert nop.item == self.shirt assert nop.price == Decimal('14.28') assert nop.tax_rate == self.shirt.tax_rule.rate assert round_decimal( nop.price * (1 - 100 / (100 + self.shirt.tax_rule.rate))) == nop.tax_value assert self.order.total == self.op1.price + self.op2.price + nop.price assert nop.positionid == 3 def test_add_item_reverse_charge(self): self._enable_reverse_charge() self.ocm.add_position(self.shirt, None, None, None) self.ocm.commit() self.order.refresh_from_db() assert self.order.positions.count() == 3 nop = self.order.positions.last() assert nop.item == self.shirt assert nop.price == Decimal('10.08') assert nop.tax_rate == Decimal('0.00') assert nop.tax_value == Decimal('0.00') assert self.order.total == self.op1.price + self.op2.price + nop.price assert nop.positionid == 3 def test_add_item_custom_price(self): self.ocm.add_position(self.shirt, None, Decimal('13.00'), None) self.ocm.commit() self.order.refresh_from_db() assert self.order.positions.count() == 3 nop = self.order.positions.last() assert nop.item == self.shirt assert nop.price == Decimal('13.00') assert nop.tax_rate == self.shirt.tax_rule.rate assert round_decimal( nop.price * (1 - 100 / (100 + self.shirt.tax_rule.rate))) == nop.tax_value assert self.order.total == self.op1.price + self.op2.price + nop.price def test_add_item_custom_price_tax_always_included(self): self.tr19.price_includes_tax = False self.tr19.save() self.ocm.add_position(self.shirt, None, Decimal('11.90'), None) self.ocm.commit() self.order.refresh_from_db() assert self.order.positions.count() == 3 nop = self.order.positions.last() assert nop.item == self.shirt assert nop.price == Decimal('11.90') assert nop.tax_rate == self.shirt.tax_rule.rate assert round_decimal( nop.price * (1 - 100 / (100 + self.shirt.tax_rule.rate))) == nop.tax_value assert self.order.total == self.op1.price + self.op2.price + nop.price def test_add_item_quota_full(self): q1 = self.event.quotas.create(name='Test', size=0) q1.items.add(self.shirt) self.ocm.add_position(self.shirt, None, None, None) with self.assertRaises(OrderError): self.ocm.commit() assert self.order.positions.count() == 2 def test_add_item_addon(self): self.shirt.category = self.event.categories.create(name='Add-ons', is_addon=True) self.ticket.addons.create(addon_category=self.shirt.category) self.ocm.add_position(self.shirt, None, Decimal('13.00'), self.op1) self.ocm.commit() self.order.refresh_from_db() assert self.order.positions.count() == 3 nop = self.order.positions.last() assert nop.item == self.shirt assert nop.addon_to == self.op1 def test_add_item_addon_invalid(self): with self.assertRaises(OrderError): self.ocm.add_position(self.shirt, None, Decimal('13.00'), self.op1) self.shirt.category = self.event.categories.create(name='Add-ons', is_addon=True) with self.assertRaises(OrderError): self.ocm.add_position(self.shirt, None, Decimal('13.00'), None) def test_add_item_subevent_required(self): self.event.has_subevents = True self.event.save() with self.assertRaises(OrderError): self.ocm.add_position(self.ticket, None, None, None) def test_add_item_subevent_price(self): self.event.has_subevents = True self.event.save() se1 = self.event.subevents.create(name="Foo", date_from=now()) SubEventItem.objects.create(subevent=se1, item=self.ticket, price=12) self.quota.subevent = se1 self.quota.save() self.ocm.add_position(self.ticket, None, None, subevent=se1) self.ocm.commit() self.order.refresh_from_db() assert self.order.positions.count() == 3 nop = self.order.positions.last() assert nop.item == self.ticket assert nop.price == Decimal('12.00') assert nop.subevent == se1 def test_reissue_invoice(self): generate_invoice(self.order) assert self.order.invoices.count() == 1 self.ocm.add_position(self.ticket, None, Decimal('0.00')) self.ocm.commit() assert self.order.invoices.count() == 3 def test_dont_reissue_invoice_on_free_product_changes(self): self.event.settings.invoice_include_free = False generate_invoice(self.order) assert self.order.invoices.count() == 1 self.ocm.add_position(self.ticket, None, Decimal('0.00')) self.ocm.commit() assert self.order.invoices.count() == 1 def test_recalculate_reverse_charge(self): self.event.settings.set('tax_rate_default', self.tr19.pk) prov = self.ocm._get_payment_provider() prov.settings.set('_fee_abs', Decimal('0.30')) self.ocm._recalculate_total_and_payment_fee() assert self.order.total == Decimal('46.30') fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT) assert fee.value == prov.calculate_fee(self.order.total) assert fee.tax_rate == Decimal('19.00') assert fee.tax_value == Decimal('0.05') ia = self._enable_reverse_charge() self.ocm.recalculate_taxes() self.ocm.commit() ops = list(self.order.positions.all()) for op in ops: assert op.price == Decimal('21.50') assert op.tax_value == Decimal('0.00') assert op.tax_rate == Decimal('0.00') assert self.order.total == Decimal('43.30') fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT) assert fee.value == prov.calculate_fee(self.order.total) assert fee.tax_rate == Decimal('0.00') assert fee.tax_value == Decimal('0.00') ia.vat_id_validated = False ia.save() self.ocm.recalculate_taxes() self.ocm.commit() ops = list(self.order.positions.all()) for op in ops: assert op.price == Decimal( '23.01') # sic. we can't really avoid it. assert op.tax_value == Decimal('1.51') assert op.tax_rate == Decimal('7.00') assert self.order.total == Decimal('46.32') fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT) assert fee.value == prov.calculate_fee(self.order.total) assert fee.tax_rate == Decimal('19.00') assert fee.tax_value == Decimal('0.05')
class OrderChangeManagerTests(TestCase): def setUp(self): super().setUp() o = Organizer.objects.create(name='Dummy', slug='dummy') self.event = Event.objects.create(organizer=o, name='Dummy', slug='dummy', date_from=now(), plugins='pretix.plugins.banktransfer') self.order = Order.objects.create( code='FOO', event=self.event, email='*****@*****.**', status=Order.STATUS_PENDING, datetime=now(), expires=now() + timedelta(days=10), total=Decimal('46.00'), payment_provider='banktransfer' ) self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket', tax_rate=Decimal('7.00'), default_price=Decimal('23.00'), admission=True) self.ticket2 = Item.objects.create(event=self.event, name='Other ticket', tax_rate=Decimal('7.00'), default_price=Decimal('23.00'), admission=True) self.shirt = Item.objects.create(event=self.event, name='T-Shirt', tax_rate=Decimal('19.00'), default_price=Decimal('12.00')) self.op1 = OrderPosition.objects.create( order=self.order, item=self.ticket, variation=None, price=Decimal("23.00"), attendee_name="Peter", positionid=1 ) self.op2 = OrderPosition.objects.create( order=self.order, item=self.ticket, variation=None, price=Decimal("23.00"), attendee_name="Dieter", positionid=2 ) self.ocm = OrderChangeManager(self.order, None) def test_change_item_success(self): self.ocm.change_item(self.op1, self.shirt, None) self.ocm.commit() self.op1.refresh_from_db() self.order.refresh_from_db() assert self.op1.item == self.shirt assert self.op1.price == self.shirt.default_price assert self.op1.tax_rate == self.shirt.tax_rate assert round_decimal(self.op1.price * (1 - 100 / (100 + self.op1.tax_rate))) == self.op1.tax_value assert self.order.total == self.op1.price + self.op2.price def test_change_price_success(self): self.ocm.change_price(self.op1, Decimal('24.00')) self.ocm.commit() self.op1.refresh_from_db() self.order.refresh_from_db() assert self.op1.item == self.ticket assert self.op1.price == Decimal('24.00') assert round_decimal(self.op1.price * (1 - 100 / (100 + self.op1.tax_rate))) == self.op1.tax_value assert self.order.total == self.op1.price + self.op2.price def test_cancel_success(self): self.ocm.cancel(self.op1) self.ocm.commit() self.order.refresh_from_db() assert self.order.positions.count() == 1 assert self.order.total == self.op2.price def test_free_to_paid(self): self.op1.price = Decimal('0.00') self.op1.save() self.op2.delete() self.order.total = Decimal('0.00') self.order.save() self.ocm.change_price(self.op1, Decimal('24.00')) with self.assertRaises(OrderError): self.ocm.commit() self.op1.refresh_from_db() assert self.op1.price == Decimal('0.00') def test_cancel_all_in_order(self): self.ocm.cancel(self.op1) self.ocm.cancel(self.op2) with self.assertRaises(OrderError): self.ocm.commit() assert self.order.positions.count() == 2 def test_empty(self): self.ocm.commit() def test_quota_unlimited(self): q = self.event.quotas.create(name='Test', size=None) q.items.add(self.shirt) self.ocm.change_item(self.op1, self.shirt, None) self.ocm.commit() self.op1.refresh_from_db() assert self.op1.item == self.shirt def test_quota_full(self): q = self.event.quotas.create(name='Test', size=0) q.items.add(self.shirt) self.ocm.change_item(self.op1, self.shirt, None) with self.assertRaises(OrderError): self.ocm.commit() self.op1.refresh_from_db() assert self.op1.item == self.ticket def test_quota_full_but_in_same(self): q = self.event.quotas.create(name='Test', size=0) q.items.add(self.shirt) q.items.add(self.ticket) self.ocm.change_item(self.op1, self.shirt, None) self.ocm.commit() self.op1.refresh_from_db() assert self.op1.item == self.shirt def test_multiple_quotas_shared_full(self): q1 = self.event.quotas.create(name='Test', size=0) q2 = self.event.quotas.create(name='Test', size=2) q1.items.add(self.shirt) q1.items.add(self.ticket) q2.items.add(self.shirt) self.ocm.change_item(self.op1, self.shirt, None) self.ocm.commit() self.op1.refresh_from_db() assert self.op1.item == self.shirt def test_multiple_quotas_unshared_full(self): q1 = self.event.quotas.create(name='Test', size=2) q2 = self.event.quotas.create(name='Test', size=0) q1.items.add(self.shirt) q1.items.add(self.ticket) q2.items.add(self.shirt) self.ocm.change_item(self.op1, self.shirt, None) with self.assertRaises(OrderError): self.ocm.commit() self.op1.refresh_from_db() assert self.op1.item == self.ticket def test_multiple_items_success(self): q1 = self.event.quotas.create(name='Test', size=2) q1.items.add(self.shirt) self.ocm.change_item(self.op1, self.shirt, None) self.ocm.change_item(self.op2, self.shirt, None) self.ocm.commit() self.op1.refresh_from_db() self.op2.refresh_from_db() assert self.op1.item == self.shirt assert self.op2.item == self.shirt def test_multiple_items_quotas_partially_full(self): q1 = self.event.quotas.create(name='Test', size=1) q1.items.add(self.shirt) self.ocm.change_item(self.op1, self.shirt, None) self.ocm.change_item(self.op2, self.shirt, None) with self.assertRaises(OrderError): self.ocm.commit() self.op1.refresh_from_db() self.op2.refresh_from_db() assert self.op1.item == self.ticket assert self.op2.item == self.ticket def test_payment_fee_calculation(self): self.event.settings.set('tax_rate_default', Decimal('19.00')) prov = self.ocm._get_payment_provider() prov.settings.set('_fee_abs', Decimal('0.30')) self.ocm.change_price(self.op1, Decimal('24.00')) self.ocm.commit() self.order.refresh_from_db() assert self.order.total == Decimal('47.30') assert self.order.payment_fee == prov.calculate_fee(self.order.total) assert self.order.payment_fee_tax_rate == Decimal('19.00') assert round_decimal(self.order.payment_fee * (1 - 100 / (100 + self.order.payment_fee_tax_rate))) == self.order.payment_fee_tax_value def test_require_pending(self): self.order.status = Order.STATUS_PAID self.order.save() self.ocm.change_item(self.op1, self.shirt, None) with self.assertRaises(OrderError): self.ocm.commit() self.op1.refresh_from_db() assert self.op1.item == self.ticket def test_change_price_to_free_marked_as_paid(self): 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_PAID assert self.order.payment_provider == 'free' def test_change_paid_same_price(self): self.order.status = Order.STATUS_PAID self.order.save() self.ocm.change_item(self.op1, self.ticket2, None) self.ocm.commit() self.order.refresh_from_db() assert self.order.total == 46 assert self.order.status == Order.STATUS_PAID def test_change_paid_different_price(self): self.order.status = Order.STATUS_PAID self.order.save() self.ocm.change_price(self.op1, Decimal('5.00')) with self.assertRaises(OrderError): self.ocm.commit() self.order.refresh_from_db() assert self.order.total == 46 assert self.order.status == Order.STATUS_PAID def test_add_item_success(self): self.ocm.add_position(self.shirt, None, None, None) self.ocm.commit() self.order.refresh_from_db() assert self.order.positions.count() == 3 nop = self.order.positions.last() assert nop.item == self.shirt assert nop.price == self.shirt.default_price assert nop.tax_rate == self.shirt.tax_rate assert round_decimal(nop.price * (1 - 100 / (100 + self.shirt.tax_rate))) == nop.tax_value assert self.order.total == self.op1.price + self.op2.price + nop.price assert nop.positionid == 3 def test_add_item_custom_price(self): self.ocm.add_position(self.shirt, None, Decimal('13.00'), None) self.ocm.commit() self.order.refresh_from_db() assert self.order.positions.count() == 3 nop = self.order.positions.last() assert nop.item == self.shirt assert nop.price == Decimal('13.00') assert nop.tax_rate == self.shirt.tax_rate assert round_decimal(nop.price * (1 - 100 / (100 + self.shirt.tax_rate))) == nop.tax_value assert self.order.total == self.op1.price + self.op2.price + nop.price def test_add_item_quota_full(self): q1 = self.event.quotas.create(name='Test', size=0) q1.items.add(self.shirt) self.ocm.add_position(self.shirt, None, None, None) with self.assertRaises(OrderError): self.ocm.commit() assert self.order.positions.count() == 2 def test_add_item_addon(self): self.shirt.category = self.event.categories.create(name='Add-ons', is_addon=True) self.ticket.addons.create(addon_category=self.shirt.category) self.ocm.add_position(self.shirt, None, Decimal('13.00'), self.op1) self.ocm.commit() self.order.refresh_from_db() assert self.order.positions.count() == 3 nop = self.order.positions.last() assert nop.item == self.shirt assert nop.addon_to == self.op1 def test_add_item_addon_invalid(self): with self.assertRaises(OrderError): self.ocm.add_position(self.shirt, None, Decimal('13.00'), self.op1) self.shirt.category = self.event.categories.create(name='Add-ons', is_addon=True) with self.assertRaises(OrderError): self.ocm.add_position(self.shirt, None, Decimal('13.00'), None)