From c52fdc95a76cf76b3ebd3e21937a3ebe221d62aa Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 3 Jul 2020 16:44:26 +0200 Subject: [PATCH] Allow to disable display of foreign currencies on invoices --- src/pretix/api/serializers/event.py | 1 + src/pretix/base/services/invoices.py | 2 +- src/pretix/base/settings.py | 10 +++++++ src/pretix/control/forms/event.py | 2 +- .../pretixcontrol/event/invoicing.html | 1 + src/tests/base/test_invoices.py | 26 +++++++++++++++++++ 6 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index d0491de384..afa46bba85 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -611,6 +611,7 @@ class EventSettingsSerializer(serializers.Serializer): 'invoice_introductory_text', 'invoice_additional_text', 'invoice_footer_text', + 'invoice_eu_currencies', 'cancel_allow_user', 'cancel_allow_user_until', 'cancel_allow_user_paid', diff --git a/src/pretix/base/services/invoices.py b/src/pretix/base/services/invoices.py index 5763d5be7a..38f7dfef7b 100644 --- a/src/pretix/base/services/invoices.py +++ b/src/pretix/base/services/invoices.py @@ -105,7 +105,7 @@ def build_invoice(invoice: Invoice) -> Invoice: cc = str(ia.country) - if cc in EU_CURRENCIES and EU_CURRENCIES[cc] != invoice.event.currency: + if cc in EU_CURRENCIES and EU_CURRENCIES[cc] != invoice.event.currency and invoice.event.settings.invoice_eu_currencies: invoice.foreign_currency_display = EU_CURRENCIES[cc] if settings.FETCH_ECB_RATES: diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 0c9bd79844..fe535662bf 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -198,6 +198,16 @@ DEFAULTS = { label=_("Show attendee names on invoices"), ) }, + 'invoice_eu_currencies': { + 'default': 'True', + 'type': bool, + 'form_class': forms.BooleanField, + 'serializer_class': serializers.BooleanField, + 'form_kwargs': dict( + label=_("On invoices from one EU country into another EU country with a different currency, print the " + "tax amounts in both currencies if possible"), + ) + }, 'invoice_address_required': { 'default': 'False', 'form_class': forms.BooleanField, diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 9018c28954..ad10718e36 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -686,7 +686,7 @@ class InvoiceSettingsForm(SettingsForm): 'invoice_introductory_text', 'invoice_additional_text', 'invoice_footer_text', - + 'invoice_eu_currencies', ] invoice_generate_sales_channels = forms.MultipleChoiceField( diff --git a/src/pretix/control/templates/pretixcontrol/event/invoicing.html b/src/pretix/control/templates/pretixcontrol/event/invoicing.html index ac86284b14..85409aa64c 100644 --- a/src/pretix/control/templates/pretixcontrol/event/invoicing.html +++ b/src/pretix/control/templates/pretixcontrol/event/invoicing.html @@ -51,6 +51,7 @@ {% bootstrap_field form.invoice_footer_text layout="control" %} {% bootstrap_field form.invoice_logo_image layout="control" %} {% bootstrap_field form.invoice_address_explanation_text layout="control" %} + {% bootstrap_field form.invoice_eu_currencies layout="control" %}
diff --git a/src/tests/base/test_invoices.py b/src/tests/base/test_invoices.py index d7b15be0c2..f0d371b192 100644 --- a/src/tests/base/test_invoices.py +++ b/src/tests/base/test_invoices.py @@ -227,6 +227,32 @@ def test_reverse_charge_foreign_currency_data_too_old(env): assert inv.foreign_currency_rate_date is None +@pytest.mark.django_db +def test_reverse_charge_foreign_currency_disabvled(env): + event, order = env + event.settings.invoice_eu_currencies = False + + tr = event.tax_rules.first() + tr.eu_reverse_charge = True + tr.home_country = Country('DE') + tr.save() + + event.settings.set('invoice_language', 'en') + InvoiceAddress.objects.create(company='Acme Company', street='221B Baker Street', zipcode='12345', city='Warsaw', + country=Country('PL'), vat_id='PL123456780', vat_id_validated=True, order=order, + is_business=True) + + ocm = OrderChangeManager(order, None) + ocm.recalculate_taxes() + ocm.commit() + assert not order.positions.filter(tax_value__gt=0).exists() + + inv = generate_invoice(order) + assert "reverse charge" in inv.additional_text.lower() + assert inv.foreign_currency_rate is None + assert inv.foreign_currency_rate_date is None + + @pytest.mark.django_db def test_positions(env): event, order = env