diff --git a/src/pretix/base/models/vouchers.py b/src/pretix/base/models/vouchers.py index 1b5855aff2..1ce7d2e17b 100644 --- a/src/pretix/base/models/vouchers.py +++ b/src/pretix/base/models/vouchers.py @@ -251,7 +251,7 @@ class Voucher(LoggedModel): if self.price_mode == 'set': return self.value elif self.price_mode == 'subtract': - return original_price - self.value + return max(original_price - self.value, Decimal('0.00')) elif self.price_mode == 'percent': return round_decimal(original_price * (Decimal('100.00') - self.value) / Decimal('100.00')) return original_price diff --git a/src/tests/presale/test_cart.py b/src/tests/presale/test_cart.py index 2209434b79..ac0ecb3c46 100644 --- a/src/tests/presale/test_cart.py +++ b/src/tests/presale/test_cart.py @@ -944,6 +944,18 @@ class CartTest(CartTestMixin, TestCase): self.assertIsNone(objs[0].variation) self.assertEqual(objs[0].price, Decimal('12.00')) + def test_voucher_price_negative(self): + v = Voucher.objects.create(item=self.ticket, value=Decimal('1337.00'), event=self.event, price_mode='subtract') + self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), { + 'item_%d' % self.ticket.id: '1', + '_voucher_code': v.code, + }, follow=True) + objs = list(CartPosition.objects.filter(cart_id=self.session_key, event=self.event)) + self.assertEqual(len(objs), 1) + self.assertEqual(objs[0].item, self.ticket) + self.assertIsNone(objs[0].variation) + self.assertEqual(objs[0].price, Decimal('0.00')) + def test_voucher_price_percent(self): v = Voucher.objects.create(item=self.ticket, value=Decimal('10.00'), price_mode='percent', event=self.event) self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {