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, + }