From 2e01887e79cafc8f50d06aa47a2055eea4d9bdfb Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 10 Mar 2026 09:57:44 +0100 Subject: [PATCH] Invoice address: Special validation for Belgium (Z#23224796) (#5970) * Invoice address: Special validation for Belgium (Z#23224796) * Update src/pretix/base/invoicing/peppol.py Co-authored-by: pajowu --------- Co-authored-by: pajowu --- src/pretix/base/forms/questions.py | 1 + src/pretix/base/invoicing/peppol.py | 6 ++++++ src/pretix/base/invoicing/transmission.py | 4 ++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py index 1fd4b8759..ca29fd10a 100644 --- a/src/pretix/base/forms/questions.py +++ b/src/pretix/base/forms/questions.py @@ -1415,6 +1415,7 @@ class BaseInvoiceAddressForm(forms.ModelForm): if not data.get(r): raise ValidationError({r: _("This field is required for the selected type of invoice transmission.")}) + transmission_type.validate_invoice_address_data(data) self.instance.transmission_type = transmission_type.identifier self.instance.transmission_info = transmission_type.form_data_to_transmission_info(data) elif transmission_type.is_exclusive(self.event, data.get("country"), data.get("is_business")): diff --git a/src/pretix/base/invoicing/peppol.py b/src/pretix/base/invoicing/peppol.py index 194bf195e..0a26b6c10 100644 --- a/src/pretix/base/invoicing/peppol.py +++ b/src/pretix/base/invoicing/peppol.py @@ -204,6 +204,12 @@ class PeppolTransmissionType(TransmissionType): } return base | {"transmission_peppol_participant_id"} + def validate_invoice_address_data(self, address_data: dict): + # Special case Belgium: If a Belgian business ID is used as Peppol ID, it should match the VAT ID + if address_data.get("transmission_peppol_participant_id").startswith("0208:") and address_data.get("vat_id"): + if address_data["vat_id"].removeprefix("BE") != address_data["transmission_peppol_participant_id"].removeprefix("0208:"): + raise ValidationError({"transmission_peppol_participant_id": _("The Peppol participant ID does not match your VAT ID.")}) + def pdf_watermark(self) -> str: return pgettext("peppol_invoice", "Visual copy") diff --git a/src/pretix/base/invoicing/transmission.py b/src/pretix/base/invoicing/transmission.py index 9c6899381..a82bef73b 100644 --- a/src/pretix/base/invoicing/transmission.py +++ b/src/pretix/base/invoicing/transmission.py @@ -24,7 +24,7 @@ from typing import Optional from django.utils.translation import gettext_lazy as _ from django_countries.fields import Country -from pretix.base.models import Invoice, InvoiceAddress +from pretix.base.models import Invoice from pretix.base.signals import EventPluginRegistry, Registry @@ -89,7 +89,7 @@ class TransmissionType: def invoice_address_form_fields_visible(self, country: Country, is_business: bool) -> set: return set(self.invoice_address_form_fields.keys()) - def validate_address(self, ia: InvoiceAddress): + def validate_invoice_address_data(self, address_data: dict): pass @property