diff --git a/src/pretix/api/serializers/order.py b/src/pretix/api/serializers/order.py
index 3be4acf29e..6f5e995e02 100644
--- a/src/pretix/api/serializers/order.py
+++ b/src/pretix/api/serializers/order.py
@@ -191,7 +191,7 @@ class InvoiceAddressSerializer(I18nAwareModelSerializer):
{"transmission_info": {r: "This field is required for the selected type of invoice transmission."}}
)
break # do not call else branch of for loop
- elif t.exclusive:
+ elif t.is_exclusive(self.context["request"].event, data.get("country"), data.get("is_business")):
if t.is_available(self.context["request"].event, data.get("country"), data.get("is_business")):
raise ValidationError({
"transmission_type": "The transmission type '%s' must be used for this country or address type." % (
diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py
index e991084e04..165c1c92ec 100644
--- a/src/pretix/base/forms/questions.py
+++ b/src/pretix/base/forms/questions.py
@@ -1417,7 +1417,7 @@ class BaseInvoiceAddressForm(forms.ModelForm):
self.instance.transmission_type = transmission_type.identifier
self.instance.transmission_info = transmission_type.form_data_to_transmission_info(data)
- elif transmission_type.exclusive:
+ elif transmission_type.is_exclusive(self.event, data.get("country"), data.get("is_business")):
if transmission_type.is_available(self.event, data.get("country"), data.get("is_business")):
raise ValidationError({
"transmission_type": "The transmission type '%s' must be used for this country or address type." % (
diff --git a/src/pretix/base/invoicing/national.py b/src/pretix/base/invoicing/national.py
index 47601145f4..3b53dc23a8 100644
--- a/src/pretix/base/invoicing/national.py
+++ b/src/pretix/base/invoicing/national.py
@@ -36,9 +36,11 @@ class ItalianSdITransmissionType(TransmissionType):
identifier = "it_sdi"
verbose_name = pgettext_lazy("italian_invoice", "Italian Exchange System (SdI)")
public_name = pgettext_lazy("italian_invoice", "Exchange System (SdI)")
- exclusive = True
enforce_transmission = True
+ def is_exclusive(self, event, country: Country, is_business: bool) -> bool:
+ return str(country) == "IT"
+
def is_available(self, event, country: Country, is_business: bool):
return str(country) == "IT" and super().is_available(event, country, is_business)
diff --git a/src/pretix/base/invoicing/peppol.py b/src/pretix/base/invoicing/peppol.py
index ef5d0ecf65..194bf195ea 100644
--- a/src/pretix/base/invoicing/peppol.py
+++ b/src/pretix/base/invoicing/peppol.py
@@ -179,6 +179,12 @@ class PeppolTransmissionType(TransmissionType):
def is_available(self, event, country: Country, is_business: bool):
return is_business and super().is_available(event, country, is_business)
+ def is_exclusive(self, event, country: Country, is_business: bool) -> bool:
+ if is_business and str(country) == "BE" and event and event.settings.invoice_address_from_country == "BE":
+ # Peppol is required to be used for intra-Belgian B2B invoices
+ return True
+ return False
+
@property
def invoice_address_form_fields(self) -> dict:
return {
diff --git a/src/pretix/base/invoicing/transmission.py b/src/pretix/base/invoicing/transmission.py
index 6b7d39831d..e04c02e615 100644
--- a/src/pretix/base/invoicing/transmission.py
+++ b/src/pretix/base/invoicing/transmission.py
@@ -58,15 +58,6 @@ class TransmissionType:
"""
return 100
- @property
- def exclusive(self) -> bool:
- """
- If a transmission type is exclusive, no other type can be chosen if this type is
- available. Use e.g. if a certain transmission type is legally required in a certain
- jurisdiction.
- """
- return False
-
@property
def enforce_transmission(self) -> bool:
"""
@@ -82,6 +73,15 @@ class TransmissionType:
for provider, _ in providers
)
+ def is_exclusive(self, event, country: Country, is_business: bool) -> bool:
+ """
+ If a transmission type is exclusive, no other type can be chosen if this type is
+ available. Use e.g. if a certain transmission type is legally required in a certain
+ jurisdiction. Event can be None in organizer-level contexts. Exclusiveness has no effect if
+ the type is not available.
+ """
+ return False
+
def invoice_address_form_fields_required(self, country: Country, is_business: bool):
return set()
diff --git a/src/pretix/base/views/js_helpers.py b/src/pretix/base/views/js_helpers.py
index e137778161..b3cd198d5e 100644
--- a/src/pretix/base/views/js_helpers.py
+++ b/src/pretix/base/views/js_helpers.py
@@ -109,7 +109,7 @@ def address_form(request):
for t in get_transmission_types():
if t.is_available(event=event, country=country, is_business=is_business):
result = {"name": str(t.public_name), "code": t.identifier}
- if t.exclusive:
+ if t.is_exclusive(event=event, country=country, is_business=is_business):
info["transmission_types"] = [result]
break
else:
diff --git a/src/pretix/control/templates/pretixcontrol/event/invoicing.html b/src/pretix/control/templates/pretixcontrol/event/invoicing.html
index 6f42727bc4..c2fe36d82a 100644
--- a/src/pretix/control/templates/pretixcontrol/event/invoicing.html
+++ b/src/pretix/control/templates/pretixcontrol/event/invoicing.html
@@ -111,11 +111,6 @@
{% trans "Available" %}
- {% if t.exclusive %}
-
- {% trans "(exclusive)" %}
-
- {% endif %}
{% else %}