mirror of
https://github.com/pretix/pretix.git
synced 2025-12-22 16:52:27 +00:00
Move generation of QR code contents out of the HTML template and into Python code, so it can be reused in plugins and tested with unit tests. Add the SPAYD QR code format which is used in Czech Republic and Slovakia [1]. Display BezahlCode QR codes only for German IBANs. [1] https://en.wikipedia.org/wiki/Short_Payment_Descriptor
142 lines
4.3 KiB
Python
142 lines
4.3 KiB
Python
#
|
|
# This file is part of pretix (Community Edition).
|
|
#
|
|
# Copyright (C) 2014-2020 Raphael Michel and contributors
|
|
# Copyright (C) 2020-today pretix GmbH and contributors
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
|
|
# Public License as published by the Free Software Foundation in version 3 of the License.
|
|
#
|
|
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
|
|
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
|
|
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
|
|
# this file, see <https://pretix.eu/about/en/license>.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
# details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
|
# <https://www.gnu.org/licenses/>.
|
|
#
|
|
from datetime import timedelta
|
|
from decimal import Decimal
|
|
|
|
import pytest
|
|
from django.utils.timezone import now
|
|
|
|
from pretix.base.models import Event, Organizer
|
|
from pretix.helpers.payment import generate_payment_qr_codes
|
|
|
|
|
|
@pytest.fixture
|
|
def env():
|
|
o = Organizer.objects.create(name='Verein für Testzwecke e.V.', slug='testverein')
|
|
event = Event.objects.create(
|
|
organizer=o, name='Testveranstaltung', slug='testveranst',
|
|
date_from=now() + timedelta(days=10),
|
|
live=True, is_public=False, currency='EUR',
|
|
)
|
|
event.settings.invoice_address_from = 'Verein für Testzwecke e.V.'
|
|
event.settings.invoice_address_from_zipcode = '1234'
|
|
event.settings.invoice_address_from_city = 'Testhausen'
|
|
event.settings.invoice_address_from_country = 'CH'
|
|
|
|
return o, event
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_payment_qr_codes_euro(env):
|
|
o, event = env
|
|
codes = generate_payment_qr_codes(
|
|
event=event,
|
|
code='TESTVERANST-12345',
|
|
amount=Decimal('123.00'),
|
|
bank_details_sepa_bic='BYLADEM1MIL',
|
|
bank_details_sepa_iban='DE37796500000069799047',
|
|
bank_details_sepa_name='Verein für Testzwecke e.V.',
|
|
)
|
|
assert len(codes) == 2
|
|
assert codes[0]['label'] == 'EPC-QR'
|
|
assert codes[0]['qr_data'] == '''BCD
|
|
002
|
|
2
|
|
SCT
|
|
BYLADEM1MIL
|
|
Verein fur Testzwecke e.V.
|
|
DE37796500000069799047
|
|
EUR123.00
|
|
|
|
|
|
TESTVERANST-12345
|
|
|
|
'''
|
|
|
|
assert codes[1]['label'] == 'BezahlCode'
|
|
assert codes[1]['qr_data'] == ('bank://singlepaymentsepa?name=Verein%20f%C3%BCr%20Testzwecke%20e.V.&iban=DE37796500000069799047'
|
|
'&bic=BYLADEM1MIL&amount=123%2C00&reason=TESTVERANST-12345¤cy=EUR')
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_payment_qr_codes_swiss(env):
|
|
o, event = env
|
|
codes = generate_payment_qr_codes(
|
|
event=event,
|
|
code='TESTVERANST-12345',
|
|
amount=Decimal('123.00'),
|
|
bank_details_sepa_bic='TESTCHXXXXX',
|
|
bank_details_sepa_iban='CH6389144757654882127',
|
|
bank_details_sepa_name='Verein für Testzwecke e.V.',
|
|
)
|
|
assert codes[0]['label'] == 'QR-bill'
|
|
assert codes[0]['qr_data'] == "\r\n".join([
|
|
"SPC",
|
|
"0200",
|
|
"1",
|
|
"CH6389144757654882127",
|
|
"K",
|
|
"Verein fur Testzwecke e.V.",
|
|
"Verein fur Testzwecke e.V.",
|
|
"1234 Testhausen",
|
|
"",
|
|
"",
|
|
"CH",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"123.00",
|
|
"EUR",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
"NON",
|
|
"",
|
|
"TESTVERANST-12345",
|
|
"EPD",
|
|
])
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_payment_qr_codes_spayd(env):
|
|
o, event = env
|
|
codes = generate_payment_qr_codes(
|
|
event=event,
|
|
code='TESTVERANST-12345',
|
|
amount=Decimal('123.00'),
|
|
bank_details_sepa_bic='TESTCZXXXXX',
|
|
bank_details_sepa_iban='CZ7450513769129174398769',
|
|
bank_details_sepa_name='Verein für Testzwecke e.V.',
|
|
)
|
|
assert len(codes) == 2
|
|
assert codes[0]['label'] == 'SPAYD'
|
|
assert codes[0]['qr_data'] == 'SPD*1.0*ACC:CZ7450513769129174398769*AM:123.00*CC:EUR*MSG:TESTVERANST-12345'
|
|
assert codes[1]['label'] == 'EPC-QR'
|