forked from CGM_Public/pretix_original
Fix redemption of multiple gift cards
This commit is contained in:
@@ -1134,7 +1134,7 @@ class GiftCardPayment(BasePaymentProvider):
|
|||||||
cart['raw']
|
cart['raw']
|
||||||
)
|
)
|
||||||
total += sum([f.value for f in fees])
|
total += sum([f.value for f in fees])
|
||||||
remainder = total - gc.value
|
remainder = total
|
||||||
if remainder > Decimal('0.00'):
|
if remainder > Decimal('0.00'):
|
||||||
del cs['payment']
|
del cs['payment']
|
||||||
messages.success(request, _("Your gift card has been applied, but {} still need to be paid. Please select a payment method.").format(
|
messages.success(request, _("Your gift card has been applied, but {} still need to be paid. Please select a payment method.").format(
|
||||||
|
|||||||
@@ -1085,16 +1085,14 @@ def get_fees(event, request, total, invoice_address, provider, positions):
|
|||||||
if cs.get('gift_cards'):
|
if cs.get('gift_cards'):
|
||||||
gcs = cs['gift_cards']
|
gcs = cs['gift_cards']
|
||||||
gc_qs = event.organizer.accepted_gift_cards.filter(pk__in=cs.get('gift_cards'), currency=event.currency)
|
gc_qs = event.organizer.accepted_gift_cards.filter(pk__in=cs.get('gift_cards'), currency=event.currency)
|
||||||
summed = 0
|
|
||||||
for gc in gc_qs:
|
for gc in gc_qs:
|
||||||
if gc.testmode != event.testmode:
|
if gc.testmode != event.testmode:
|
||||||
gcs.remove(gc.pk)
|
gcs.remove(gc.pk)
|
||||||
continue
|
continue
|
||||||
fval = Decimal(gc.value) # TODO: don't require an extra query
|
fval = Decimal(gc.value) # TODO: don't require an extra query
|
||||||
fval = min(fval, total - summed)
|
fval = min(fval, total)
|
||||||
if fval > 0:
|
if fval > 0:
|
||||||
total -= fval
|
total -= fval
|
||||||
summed += fval
|
|
||||||
fees.append(OrderFee(
|
fees.append(OrderFee(
|
||||||
fee_type=OrderFee.FEE_TYPE_GIFTCARD,
|
fee_type=OrderFee.FEE_TYPE_GIFTCARD,
|
||||||
internal_type='giftcard',
|
internal_type='giftcard',
|
||||||
|
|||||||
@@ -1009,6 +1009,46 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
|
|||||||
assert '-€20.00' in response.rendered_content
|
assert '-€20.00' in response.rendered_content
|
||||||
assert '3.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):
|
def test_giftcard_full(self):
|
||||||
gc = self.orga.issued_gift_cards.create(currency="EUR")
|
gc = self.orga.issued_gift_cards.create(currency="EUR")
|
||||||
gc.transactions.create(value=30)
|
gc.transactions.create(value=30)
|
||||||
|
|||||||
Reference in New Issue
Block a user