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 %}