GiftCard: Add more information to transactions (#3308)

This commit is contained in:
Raphael Michel
2023-05-12 09:38:35 +02:00
committed by GitHub
parent 916ee0697f
commit c0419518c3
19 changed files with 247 additions and 85 deletions

View File

@@ -33,7 +33,7 @@ from pretix.base.models import GiftCard, Order, Organizer
@pytest.fixture
def giftcard(organizer, event):
gc = organizer.issued_gift_cards.create(secret="ABCDEF", currency="EUR")
gc.transactions.create(value=Decimal('23.00'))
gc.transactions.create(value=Decimal('23.00'), acceptor=organizer)
return gc
@@ -53,6 +53,7 @@ TEST_GC_RES = {
"expires": None,
"conditions": None,
"currency": "EUR",
"issuer": "dummy",
"owner_ticket": None
}
@@ -264,7 +265,8 @@ def test_giftcard_transact(token_client, organizer, event, giftcard):
'/api/v1/organizers/{}/giftcards/{}/transact/'.format(organizer.slug, giftcard.pk),
{
'value': '10.00',
'text': 'bla'
'text': 'bla',
'info': {"a": "b"}
},
format='json'
)
@@ -272,6 +274,23 @@ def test_giftcard_transact(token_client, organizer, event, giftcard):
giftcard.refresh_from_db()
assert giftcard.value == Decimal('43.00')
assert giftcard.transactions.last().text == 'bla'
assert giftcard.transactions.last().info == {"a": "b"}
assert giftcard.transactions.last().acceptor == organizer
@pytest.mark.django_db
def test_giftcard_transact_cross_organizer(token_client, organizer, event, other_giftcard):
resp = token_client.post(
'/api/v1/organizers/{}/giftcards/{}/transact/?include_accepted=true'.format(organizer.slug, other_giftcard.pk),
{
'value': '10.00',
},
format='json'
)
assert resp.status_code == 200
other_giftcard.refresh_from_db()
assert other_giftcard.value == Decimal('10.00')
assert other_giftcard.transactions.last().acceptor == organizer
@pytest.mark.django_db
@@ -314,7 +333,9 @@ def test_giftcard_transactions(token_client, organizer, giftcard):
"value": "23.00",
"event": None,
"order": None,
"text": None
"text": None,
"info": None,
"acceptor": organizer.slug
}
]
}

View File

@@ -32,7 +32,7 @@ from pretix.base.models import Order, Organizer, ReusableMedium
@pytest.fixture
def giftcard(organizer):
gc = organizer.issued_gift_cards.create(secret="ABCDEF", currency="EUR")
gc.transactions.create(value=Decimal('23.00'))
gc.transactions.create(value=Decimal('23.00'), acceptor=organizer)
return gc
@@ -50,7 +50,7 @@ def organizer2():
@pytest.fixture
def giftcard2(organizer2):
gc = organizer2.issued_gift_cards.create(secret="ABCDEF", currency="EUR")
gc.transactions.create(value=Decimal('23.00'))
gc.transactions.create(value=Decimal('23.00'), acceptor=organizer2)
return gc
@@ -190,6 +190,7 @@ def test_medium_detail(token_client, organizer, event, medium, giftcard, custome
"expires": None,
"conditions": None,
"owner_ticket": resp.data["linked_orderposition"],
"issuer": "dummy",
}

View File

@@ -965,7 +965,7 @@ class OrderCancelTests(TestCase):
@classscope(attr='o')
def test_auto_refund_possible_issued_giftcard(self):
gc = self.o.issued_gift_cards.create(currency="EUR", issued_in=self.op1)
gc.transactions.create(value=23)
gc.transactions.create(value=23, acceptor=self.o)
self.order.payments.create(
amount=Decimal('46.00'),
state=OrderPayment.PAYMENT_STATE_CONFIRMED,
@@ -979,7 +979,7 @@ class OrderCancelTests(TestCase):
@classscope(attr='o')
def test_auto_refund_impossible_issued_giftcard_used(self):
gc = self.o.issued_gift_cards.create(currency="EUR", issued_in=self.op1)
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.o)
self.order.payments.create(
amount=Decimal('46.00'),
state=OrderPayment.PAYMENT_STATE_CONFIRMED,
@@ -1397,7 +1397,7 @@ class OrderChangeManagerTests(TestCase):
@classscope(attr='o')
def test_cancel_issued_giftcard(self):
gc = self.o.issued_gift_cards.create(currency="EUR", issued_in=self.op1)
gc.transactions.create(value=23)
gc.transactions.create(value=23, acceptor=self.o)
self.ocm.cancel(self.op1)
self.ocm.commit()
assert gc.value == Decimal('0.00')
@@ -1422,7 +1422,7 @@ class OrderChangeManagerTests(TestCase):
@classscope(attr='o')
def test_cancel_issued_giftcard_used(self):
gc = self.o.issued_gift_cards.create(currency="EUR", issued_in=self.op1)
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.o)
self.ocm.cancel(self.op1)
with self.assertRaises(OrderError):
self.ocm.commit()
@@ -1430,7 +1430,7 @@ class OrderChangeManagerTests(TestCase):
@classscope(attr='o')
def test_change_price_issued_giftcard_used(self):
gc = self.o.issued_gift_cards.create(currency="EUR", issued_in=self.op1)
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.o)
with self.assertRaises(OrderError):
self.ocm.change_price(self.op1, 25)
@@ -3181,9 +3181,9 @@ def test_giftcard_multiple(event):
item=ticket, price=23, expires=now() + timedelta(days=1), event=event, cart_id="123"
)
gc1 = event.organizer.issued_gift_cards.create(currency="EUR")
gc1.transactions.create(value=12)
gc1.transactions.create(value=12, acceptor=event.organizer)
gc2 = event.organizer.issued_gift_cards.create(currency="EUR")
gc2.transactions.create(value=12)
gc2.transactions.create(value=12, acceptor=event.organizer)
order = _create_order(
event, email='dummy@example.org', positions=[cp1],
now_dt=now(),
@@ -3233,7 +3233,7 @@ def test_giftcard_partial(event):
item=ticket, price=23, expires=now() + timedelta(days=1), event=event, cart_id="123"
)
gc1 = event.organizer.issued_gift_cards.create(currency="EUR")
gc1.transactions.create(value=12)
gc1.transactions.create(value=12, acceptor=event.organizer)
order = _create_order(
event, email='dummy@example.org', positions=[cp1],
now_dt=now(),
@@ -3280,7 +3280,7 @@ def test_giftcard_payment_fee(event):
item=ticket, price=23, expires=now() + timedelta(days=1), event=event, cart_id="123"
)
gc1 = event.organizer.issued_gift_cards.create(currency="EUR")
gc1.transactions.create(value=12)
gc1.transactions.create(value=12, acceptor=event.organizer)
order = _create_order(
event, email='dummy@example.org', positions=[cp1],
now_dt=now(),
@@ -3326,7 +3326,7 @@ def test_giftcard_invalid_currency(event):
item=ticket, price=23, expires=now() + timedelta(days=1), event=event, cart_id="123"
)
gc1 = event.organizer.issued_gift_cards.create(currency="USD")
gc1.transactions.create(value=12)
gc1.transactions.create(value=12, acceptor=event.organizer)
_create_order(
event, email='dummy@example.org', positions=[cp1],
now_dt=now(),
@@ -3368,7 +3368,7 @@ def test_giftcard_invalid_organizer(event):
)
o2 = Organizer.objects.create(slug="foo", name="bar")
gc1 = o2.issued_gift_cards.create(currency="EUR")
gc1.transactions.create(value=12)
gc1.transactions.create(value=12, acceptor=event.organizer)
_create_order(
event, email='dummy@example.org', positions=[cp1],
now_dt=now(),
@@ -3409,7 +3409,7 @@ def test_giftcard_test_mode_invalid(event):
item=ticket, price=23, expires=now() + timedelta(days=1), event=event, cart_id="123"
)
gc1 = event.organizer.issued_gift_cards.create(currency="EUR", testmode=True)
gc1.transactions.create(value=12)
gc1.transactions.create(value=12, acceptor=event.organizer)
_create_order(
event, email='dummy@example.org', positions=[cp1],
now_dt=now(),
@@ -3452,7 +3452,7 @@ def test_giftcard_test_mode_event(event):
event.testmode = True
event.save()
gc1 = event.organizer.issued_gift_cards.create(currency="EUR", testmode=False)
gc1.transactions.create(value=12)
gc1.transactions.create(value=12, acceptor=event.organizer)
_create_order(
event, email='dummy@example.org', positions=[cp1],
now_dt=now(),
@@ -3493,7 +3493,7 @@ def test_giftcard_swap(event):
item=ticket, price=23, expires=now() + timedelta(days=1), event=event, cart_id="123"
)
gc1 = event.organizer.issued_gift_cards.create(currency="EUR", testmode=False)
gc1.transactions.create(value=12)
gc1.transactions.create(value=12, acceptor=event.organizer)
_create_order(
event, email='dummy@example.org', positions=[cp1],
now_dt=now(),

View File

@@ -44,7 +44,7 @@ def organizer2():
@pytest.fixture
def gift_card(organizer):
gc = organizer.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=42)
gc.transactions.create(value=42, acceptor=organizer)
return gc
@@ -140,7 +140,7 @@ def test_card_detail_view_transact_revert_refund(organizer, admin_user, gift_car
r = o.refunds.create(
amount=o.total, provider='giftcard', state=OrderRefund.REFUND_STATE_DONE
)
t = gift_card.transactions.create(value=14, order=o, refund=r)
t = gift_card.transactions.create(value=14, order=o, refund=r, acceptor=organizer)
client.login(email='dummy@dummy.dummy', password='dummy')
r = client.post('/control/organizer/dummy/giftcard/{}/'.format(gift_card.pk), {

View File

@@ -44,7 +44,7 @@ def medium(organizer):
@pytest.fixture
def gift_card(organizer):
gc = organizer.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=42)
gc.transactions.create(value=42, acceptor=organizer)
return gc

View File

@@ -1440,7 +1440,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
def test_giftcard_partial(self):
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.orga)
self.event.settings.set('payment_stripe__enabled', True)
self.event.settings.set('payment_banktransfer__enabled', True)
with scopes_disabled():
@@ -1483,9 +1483,9 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
def test_giftcard_full_with_multiple(self):
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.orga)
gc2 = self.orga.issued_gift_cards.create(currency="EUR")
gc2.transactions.create(value=20)
gc2.transactions.create(value=20, acceptor=self.orga)
self.event.settings.set('payment_stripe__enabled', True)
self.event.settings.set('payment_banktransfer__enabled', True)
with scopes_disabled():
@@ -1526,7 +1526,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
def test_giftcard_full(self):
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=30)
gc.transactions.create(value=30, acceptor=self.orga)
self.event.settings.set('payment_stripe__enabled', True)
self.event.settings.set('payment_banktransfer__enabled', True)
with scopes_disabled():
@@ -1555,7 +1555,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
def test_giftcard_racecondition(self):
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.orga)
self.event.settings.set('payment_stripe__enabled', True)
self.event.settings.set('payment_banktransfer__enabled', True)
with scopes_disabled():
@@ -1584,7 +1584,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
assert '€20.00' in response.content.decode()
assert '3.00' in response.content.decode()
gc.transactions.create(value=-2)
gc.transactions.create(value=-2, acceptor=self.orga)
response = self.client.post('/%s/%s/checkout/confirm/' % (self.orga.slug, self.event.slug), follow=True)
doc = BeautifulSoup(response.content.decode(), "lxml")
@@ -1601,7 +1601,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
def test_giftcard_expired(self):
gc = self.orga.issued_gift_cards.create(currency="EUR", expires=now() - timedelta(days=1))
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.orga)
self.event.settings.set('payment_banktransfer__enabled', True)
with scopes_disabled():
CartPosition.objects.create(
@@ -1616,7 +1616,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
def test_giftcard_invalid_currency(self):
gc = self.orga.issued_gift_cards.create(currency="USD")
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.orga)
self.event.settings.set('payment_banktransfer__enabled', True)
with scopes_disabled():
CartPosition.objects.create(
@@ -1633,7 +1633,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
self.orga.issued_gift_cards.create(currency="EUR")
orga2 = Organizer.objects.create(slug="foo2", name="foo2")
gc = orga2.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.orga)
self.event.settings.set('payment_banktransfer__enabled', True)
with scopes_disabled():
CartPosition.objects.create(
@@ -1650,7 +1650,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
self.orga.issued_gift_cards.create(currency="EUR")
orga2 = Organizer.objects.create(slug="foo2", name="foo2")
gc = orga2.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=23)
gc.transactions.create(value=23, acceptor=orga2)
self.orga.gift_card_issuer_acceptance.create(issuer=orga2)
self.event.settings.set('payment_banktransfer__enabled', True)
with scopes_disabled():
@@ -1670,11 +1670,15 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
self.assertEqual(len(doc.select(".thank-you")), 1)
with scopes_disabled():
o = Order.objects.last()
assert o.payments.get(provider='giftcard').amount == Decimal('23.00')
p = o.payments.get(provider='giftcard')
assert p.amount == Decimal('23.00')
gc.refresh_from_db()
assert gc.issuer == orga2
assert gc.transactions.last().acceptor == self.orga
def test_giftcard_in_test_mode(self):
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.orga)
self.event.settings.set('payment_banktransfer__enabled', True)
self.event.testmode = True
self.event.save()
@@ -1691,7 +1695,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
def test_giftcard_not_in_test_mode(self):
gc = self.orga.issued_gift_cards.create(currency="EUR", testmode=True)
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.orga)
self.event.settings.set('payment_banktransfer__enabled', True)
with scopes_disabled():
CartPosition.objects.create(
@@ -1720,7 +1724,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
def test_giftcard_twice(self):
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.orga)
self.event.settings.set('payment_banktransfer__enabled', True)
with scopes_disabled():
CartPosition.objects.create(
@@ -1739,7 +1743,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
def test_giftcard_swap(self):
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.orga)
self.event.settings.set('payment_banktransfer__enabled', True)
self.ticket.issue_giftcard = True
self.ticket.save()
@@ -1756,7 +1760,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
def test_giftcard_like_method_with_min_value(self):
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=20)
gc.transactions.create(value=20, acceptor=self.orga)
self.event.settings.set('payment_stripe__enabled', True)
self.event.settings.set('payment_banktransfer__enabled', True)
with scopes_disabled():
@@ -1790,7 +1794,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
# Our built-in gift card payment does not actually support setting a payment fee, but we still want to
# test the core behavior in case a gift-card plugin does
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=27)
gc.transactions.create(value=27, acceptor=self.orga)
self.event.settings.set('payment_giftcard__fee_percent', 10)
self.event.settings.set('payment_giftcard__fee_reverse_calc', False)
with scopes_disabled():
@@ -1829,7 +1833,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase):
# Our built-in gift card payment does not actually support setting a payment fee, but we still want to
# test the core behavior in case a gift-card plugin does
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=23)
gc.transactions.create(value=23, acceptor=self.orga)
self.event.settings.set('payment_banktransfer__enabled', True)
self.event.settings.set('payment_banktransfer__fee_percent', 20)
self.event.settings.set('payment_banktransfer__fee_reverse_calc', False)

View File

@@ -1276,7 +1276,7 @@ class OrdersTest(BaseOrdersTest):
amount=Decimal('10.00'),
)
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=10)
gc.transactions.create(value=10, acceptor=self.orga)
response = self.client.get(
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
)
@@ -1315,7 +1315,7 @@ class OrdersTest(BaseOrdersTest):
amount=Decimal('10.00'),
)
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=10)
gc.transactions.create(value=10, acceptor=self.orga)
self.ticket.issue_giftcard = True
self.ticket.save()
response = self.client.post(
@@ -1330,7 +1330,7 @@ class OrdersTest(BaseOrdersTest):
def test_change_paymentmethod_giftcard_wrong_currency(self):
with scopes_disabled():
gc = self.orga.issued_gift_cards.create(currency="USD")
gc.transactions.create(value=10)
gc.transactions.create(value=10, acceptor=self.orga)
response = self.client.post(
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
@@ -1345,7 +1345,7 @@ class OrdersTest(BaseOrdersTest):
self.order.testmode = True
self.order.save()
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=10)
gc.transactions.create(value=10, acceptor=self.orga)
response = self.client.post(
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
@@ -1358,7 +1358,7 @@ class OrdersTest(BaseOrdersTest):
def test_change_paymentmethod_giftcard_not_in_test_mode(self):
with scopes_disabled():
gc = self.orga.issued_gift_cards.create(currency="EUR", testmode=True)
gc.transactions.create(value=10)
gc.transactions.create(value=10, acceptor=self.orga)
response = self.client.post(
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
@@ -1385,7 +1385,7 @@ class OrdersTest(BaseOrdersTest):
o = Organizer.objects.create(slug='Foo', name='bar')
self.orga.issued_gift_cards.create(currency="EUR")
gc = o.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=10)
gc.transactions.create(value=10, acceptor=self.orga)
response = self.client.post(
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
@@ -1403,7 +1403,7 @@ class OrdersTest(BaseOrdersTest):
amount=Decimal('10.00'),
)
gc = self.orga.issued_gift_cards.create(currency="EUR")
gc.transactions.create(value=100)
gc.transactions.create(value=100, acceptor=self.orga)
response = self.client.get(
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
)