diff --git a/src/pretix/base/payment.py b/src/pretix/base/payment.py index 093fc7094..00deae46e 100644 --- a/src/pretix/base/payment.py +++ b/src/pretix/base/payment.py @@ -1134,7 +1134,7 @@ class GiftCardPayment(BasePaymentProvider): cart['raw'] ) total += sum([f.value for f in fees]) - remainder = total - gc.value + remainder = total if remainder > Decimal('0.00'): del cs['payment'] messages.success(request, _("Your gift card has been applied, but {} still need to be paid. Please select a payment method.").format( diff --git a/src/pretix/base/services/cart.py b/src/pretix/base/services/cart.py index 1324609c0..f3d842db6 100644 --- a/src/pretix/base/services/cart.py +++ b/src/pretix/base/services/cart.py @@ -1085,16 +1085,14 @@ def get_fees(event, request, total, invoice_address, provider, positions): if cs.get('gift_cards'): gcs = cs['gift_cards'] gc_qs = event.organizer.accepted_gift_cards.filter(pk__in=cs.get('gift_cards'), currency=event.currency) - summed = 0 for gc in gc_qs: if gc.testmode != event.testmode: gcs.remove(gc.pk) continue fval = Decimal(gc.value) # TODO: don't require an extra query - fval = min(fval, total - summed) + fval = min(fval, total) if fval > 0: total -= fval - summed += fval fees.append(OrderFee( fee_type=OrderFee.FEE_TYPE_GIFTCARD, internal_type='giftcard', diff --git a/src/tests/presale/test_checkout.py b/src/tests/presale/test_checkout.py index 6fe5da711..4d2f98bfb 100644 --- a/src/tests/presale/test_checkout.py +++ b/src/tests/presale/test_checkout.py @@ -1009,6 +1009,46 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): assert '-€20.00' in response.rendered_content assert '3.00' in response.rendered_content + def test_giftcard_full_with_multiple(self): + gc = self.orga.issued_gift_cards.create(currency="EUR") + gc.transactions.create(value=20) + gc2 = self.orga.issued_gift_cards.create(currency="EUR") + gc2.transactions.create(value=20) + self.event.settings.set('payment_stripe__enabled', True) + self.event.settings.set('payment_banktransfer__enabled', True) + with scopes_disabled(): + CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.ticket, + price=23, expires=now() + timedelta(minutes=10) + ) + response = self.client.get('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), follow=True) + doc = BeautifulSoup(response.rendered_content, "lxml") + self.assertEqual(len(doc.select('input[name="payment"]')), 3) + response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), { + 'payment': 'giftcard', + 'giftcard': gc.secret + }, follow=True) + self.assertRedirects(response, '/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), + target_status_code=200) + assert '-€20.00' in response.rendered_content + assert '3.00' in response.rendered_content + assert 'alert-success' in response.rendered_content + + response = self.client.post('/%s/%s/checkout/payment/' % (self.orga.slug, self.event.slug), { + 'payment': 'giftcard', + 'giftcard': gc2.secret + }, follow=True) + self.assertRedirects(response, '/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), + target_status_code=200) + + response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True) + doc = BeautifulSoup(response.rendered_content, "lxml") + self.assertEqual(len(doc.select(".thank-you")), 1) + with scopes_disabled(): + o = Order.objects.last() + assert o.payments.get(provider='giftcard', amount=Decimal('20.00')) + assert o.payments.get(provider='giftcard', amount=Decimal('20.00')) + def test_giftcard_full(self): gc = self.orga.issued_gift_cards.create(currency="EUR") gc.transactions.create(value=30)