diff --git a/src/pretix/helpers/payment.py b/src/pretix/helpers/payment.py
index 9eef529c40..37e0e5f700 100644
--- a/src/pretix/helpers/payment.py
+++ b/src/pretix/helpers/payment.py
@@ -18,86 +18,96 @@ def generate_payment_qr_codes(
amount,
bank_details_sepa_bic,
bank_details_sepa_name,
- bank_details_sepa_iban
+ bank_details_sepa_iban,
):
out = []
- qr_data = swiss_qrbill(
- event,
- code,
- amount,
- bank_details_sepa_bic,
- bank_details_sepa_name,
- bank_details_sepa_iban
- )
- if qr_data:
- out.append({
- "id": "qrbill",
- "label": "QR-bill",
- "html_prefix": mark_safe(''),
- "qr_data": qr_data,
- "css_class": "banktransfer-swiss-cross-overlay",
- })
+ for method in [
+ swiss_qrbill,
+ czech_spayd,
+ euro_epc_qr,
+ euro_bezahlcode,
+ ]:
+ data = method(
+ event,
+ code,
+ amount,
+ bank_details_sepa_bic,
+ bank_details_sepa_name,
+ bank_details_sepa_iban,
+ )
+ if data:
+ out.append(data)
- qr_data = czech_spayd(
- event,
- code,
- amount,
- bank_details_sepa_bic,
- bank_details_sepa_name,
- bank_details_sepa_iban
- )
- if qr_data:
- out.append({
- "id": "spayd",
- "label": "SPAYD",
- "qr_data": qr_data,
- })
-
- if event.currency == 'EUR' and bank_details_sepa_iban:
- out.append({
- "id": "girocode",
- "label": "EPC-QR",
- "qr_data": "\n".join(text_unidecode.unidecode(str(d or '')) for d in [
- "BCD", # Service Tag: ‘BCD’
- "002", # Version: V2
- "2", # Character set: ISO 8859-1
- "SCT", # Identification code: ‘SCT‘
- bank_details_sepa_bic, # AT-23 BIC of the Beneficiary Bank
- bank_details_sepa_name, # AT-21 Name of the Beneficiary
- bank_details_sepa_iban, # AT-20 Account number of the Beneficiary
- f"{event.currency}{dotdecimal(amount)}", # AT-04 Amount of the Credit Transfer in Euro
- "", # AT-44 Purpose of the Credit Transfer
- "", # AT-05 Remittance Information (Structured)
- code, # AT-05 Remittance Information (Unstructured)
- "", # Beneficiary to originator information
- "",
- ]),
- })
-
- qr_data = f"bank://singlepaymentsepa?" + urlencode({
- "name": bank_details_sepa_name,
- "iban":bank_details_sepa_iban,
- "bic": bank_details_sepa_bic,
- "amount": commadecimal(amount),
- "reason": code,
- "currency": event.currency,
- })
- out.append({
- "id": "bezahlcode",
- "label": "BezahlCode",
- "qr_data": mark_safe(qr_data),
- "link": qr_data,
- "link_aria_label": _("Open BezahlCode in your banking app to start the payment process."),
- })
return out
+
+def euro_epc_qr(
+ event,
+ code,
+ amount,
+ bank_details_sepa_bic,
+ bank_details_sepa_name,
+ bank_details_sepa_iban,
+):
+ if event.currency != 'EUR' or not bank_details_sepa_iban:
+ return
+
+ return {
+ "id": "girocode",
+ "label": "EPC-QR",
+ "qr_data": "\n".join(text_unidecode.unidecode(str(d or '')) for d in [
+ "BCD", # Service Tag: ‘BCD’
+ "002", # Version: V2
+ "2", # Character set: ISO 8859-1
+ "SCT", # Identification code: ‘SCT‘
+ bank_details_sepa_bic, # AT-23 BIC of the Beneficiary Bank
+ bank_details_sepa_name, # AT-21 Name of the Beneficiary
+ bank_details_sepa_iban, # AT-20 Account number of the Beneficiary
+ f"{event.currency}{dotdecimal(amount)}", # AT-04 Amount of the Credit Transfer in Euro
+ "", # AT-44 Purpose of the Credit Transfer
+ "", # AT-05 Remittance Information (Structured)
+ code, # AT-05 Remittance Information (Unstructured)
+ "", # Beneficiary to originator information
+ "",
+ ]),
+ }
+
+
+def euro_bezahlcode(
+ event,
+ code,
+ amount,
+ bank_details_sepa_bic,
+ bank_details_sepa_name,
+ bank_details_sepa_iban,
+):
+ if event.currency != 'EUR' or not bank_details_sepa_iban:
+ return
+
+ qr_data = f"bank://singlepaymentsepa?" + urlencode({
+ "name": bank_details_sepa_name,
+ "iban":bank_details_sepa_iban,
+ "bic": bank_details_sepa_bic,
+ "amount": commadecimal(amount),
+ "reason": code,
+ "currency": event.currency,
+ })
+ return {
+ "id": "bezahlcode",
+ "label": "BezahlCode",
+ "qr_data": mark_safe(qr_data),
+ "link": qr_data,
+ "link_aria_label": _("Open BezahlCode in your banking app to start the payment process."),
+ }
+
+
def swiss_qrbill(
event,
code,
amount,
bank_details_sepa_bic,
bank_details_sepa_name,
- bank_details_sepa_iban
+ bank_details_sepa_iban,
):
if not bank_details_sepa_iban or not bank_details_sepa_iban[:2] in ('CH', 'LI'):
return
@@ -141,7 +151,14 @@ def swiss_qrbill(
]
data_fields = [text_unidecode.unidecode(d or '') for d in data_fields]
- return '\r\n'.join(data_fields)
+ qr_data = '\r\n'.join(data_fields)
+ return {
+ "id": "qrbill",
+ "label": "QR-bill",
+ "html_prefix": mark_safe(''),
+ "qr_data": qr_data,
+ "css_class": "banktransfer-swiss-cross-overlay",
+ }
def czech_spayd(
@@ -150,11 +167,16 @@ def czech_spayd(
amount,
bank_details_sepa_bic,
bank_details_sepa_name,
- bank_details_sepa_iban
+ bank_details_sepa_iban,
):
if not bank_details_sepa_iban or not bank_details_sepa_iban[:2] in ('CZ', 'SK'):
return
if event.currency not in ('EUR', 'CZK'):
return
- return f"SPD*1.0*ACC:{bank_details_sepa_iban}*AM:{dotdecimal(amount)}*CC:{event.currency}*MSG:{code}"
+ qr_data = f"SPD*1.0*ACC:{bank_details_sepa_iban}*AM:{dotdecimal(amount)}*CC:{event.currency}*MSG:{code}"
+ return {
+ "id": "spayd",
+ "label": "SPAYD",
+ "qr_data": qr_data,
+ }