diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index bcd5f26c05..2dc80fa858 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -528,6 +528,7 @@ class EventSettingsSerializer(serializers.Serializer): 'invoice_address_vatid', 'invoice_address_company_required', 'invoice_address_beneficiary', + 'invoice_address_custom_field', 'invoice_name_required', 'invoice_address_not_asked_free', 'invoice_show_payments', diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py index f6a0213383..ddec765dea 100644 --- a/src/pretix/base/forms/questions.py +++ b/src/pretix/base/forms/questions.py @@ -457,7 +457,7 @@ class BaseInvoiceAddressForm(forms.ModelForm): class Meta: model = InvoiceAddress fields = ('is_business', 'company', 'name_parts', 'street', 'zipcode', 'city', 'country', 'state', - 'vat_id', 'internal_reference', 'beneficiary') + 'vat_id', 'internal_reference', 'beneficiary', 'custom_field') widgets = { 'is_business': BusinessBooleanRadio, 'street': forms.Textarea(attrs={ @@ -561,6 +561,11 @@ class BaseInvoiceAddressForm(forms.ModelForm): if not event.settings.invoice_address_beneficiary: del self.fields['beneficiary'] + if event.settings.invoice_address_custom_field: + self.fields['custom_field'].label = event.settings.invoice_address_custom_field + else: + del self.fields['custom_field'] + for k, v in self.fields.items(): if v.widget.attrs.get('autocomplete') or k == 'name_parts': v.widget.attrs['autocomplete'] = 'section-invoice billing ' + v.widget.attrs.get('autocomplete', '') diff --git a/src/pretix/base/invoice.py b/src/pretix/base/invoice.py index de6cec8da4..8306f92ea1 100644 --- a/src/pretix/base/invoice.py +++ b/src/pretix/base/invoice.py @@ -459,6 +459,12 @@ class ClassicInvoiceRenderer(BaseReportlabInvoiceRenderer): def _get_intro(self): story = [] + if self.invoice.custom_field: + story.append(Paragraph( + '{}: {}'.format(self.invoice.event.settings.invoice_address_custom_field, self.invoice.custom_field), + self.stylesheet['Normal'] + )) + if self.invoice.internal_reference: story.append(Paragraph( pgettext('invoice', 'Customer reference: {reference}').format(reference=self.invoice.internal_reference), diff --git a/src/pretix/base/migrations/0144_invoiceaddress_custom_field.py b/src/pretix/base/migrations/0144_invoiceaddress_custom_field.py new file mode 100644 index 0000000000..e29b5a9976 --- /dev/null +++ b/src/pretix/base/migrations/0144_invoiceaddress_custom_field.py @@ -0,0 +1,22 @@ +# Generated by Django 2.2.9 on 2020-02-18 08:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('pretixbase', '0143_auto_20200217_1211'), + ] + + operations = [ + migrations.AddField( + model_name='invoiceaddress', + name='custom_field', + field=models.CharField(max_length=255, null=True, blank=True), + ), + migrations.AddField( + model_name='invoice', + name='custom_field', + field=models.CharField(max_length=255, null=True), + ), + ] diff --git a/src/pretix/base/models/invoices.py b/src/pretix/base/models/invoices.py index c49fd79268..ac5679caa8 100644 --- a/src/pretix/base/models/invoices.py +++ b/src/pretix/base/models/invoices.py @@ -111,6 +111,7 @@ class Invoice(models.Model): file = models.FileField(null=True, blank=True, upload_to=invoice_filename, max_length=255) internal_reference = models.TextField(blank=True) + custom_field = models.CharField(max_length=255, null=True) objects = ScopedManager(organizer='event__organizer') diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 8a2b7a1e9a..ec20574467 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -2094,6 +2094,7 @@ class InvoiceAddress(models.Model): vat_id = models.CharField(max_length=255, blank=True, verbose_name=_('VAT ID'), help_text=_('Only for business customers within the EU.')) vat_id_validated = models.BooleanField(default=False) + custom_field = models.CharField(max_length=255, null=True, blank=True) internal_reference = models.TextField( verbose_name=_('Internal reference'), help_text=_('This reference will be printed on your invoice for your convenience.'), diff --git a/src/pretix/base/services/invoices.py b/src/pretix/base/services/invoices.py index 3ca827d388..20cb7e87de 100644 --- a/src/pretix/base/services/invoices.py +++ b/src/pretix/base/services/invoices.py @@ -85,6 +85,7 @@ def build_invoice(invoice: Invoice) -> Invoice: ).split("\n") if a.strip() ) invoice.internal_reference = ia.internal_reference + invoice.custom_field = ia.custom_field invoice.invoice_to_company = ia.company invoice.invoice_to_name = ia.name invoice.invoice_to_street = ia.street diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index f0f6059c3d..79b2142c4d 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -15,7 +15,7 @@ from django.utils.translation import ( ) from django_countries import countries from hierarkey.models import GlobalSettingsBase, Hierarkey -from i18nfield.forms import I18nFormField, I18nTextarea +from i18nfield.forms import I18nFormField, I18nTextarea, I18nTextInput from i18nfield.strings import LazyI18nString from rest_framework import serializers @@ -182,6 +182,20 @@ DEFAULTS = { required=False ) }, + 'invoice_address_custom_field': { + 'default': '', + 'type': LazyI18nString, + 'form_class': I18nFormField, + 'serializer_class': I18nField, + 'form_kwargs': dict( + label=_("Custom address field"), + widget=I18nTextInput, + help_text=_("If you want to add a custom text field, e.g. for a country-specific registration number, to " + "your invoice address form, please fill in the label here. This label will both be used for " + "asking the user to input their details as well as for displaying the value on the invoice. " + "The field will not be required.") + ) + }, 'invoice_address_vatid': { 'default': 'False', 'type': bool, diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 1953d24b13..361de3e505 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -567,6 +567,7 @@ class InvoiceSettingsForm(SettingsForm): 'invoice_address_vatid', 'invoice_address_company_required', 'invoice_address_beneficiary', + 'invoice_address_custom_field', 'invoice_name_required', 'invoice_address_not_asked_free', 'invoice_include_free', diff --git a/src/pretix/control/templates/pretixcontrol/event/invoicing.html b/src/pretix/control/templates/pretixcontrol/event/invoicing.html index 66dbf42c11..ac86284b14 100644 --- a/src/pretix/control/templates/pretixcontrol/event/invoicing.html +++ b/src/pretix/control/templates/pretixcontrol/event/invoicing.html @@ -29,6 +29,7 @@ {% bootstrap_field form.invoice_address_vatid layout="control" %} {% bootstrap_field form.invoice_address_beneficiary layout="control" %} {% bootstrap_field form.invoice_address_not_asked_free layout="control" %} + {% bootstrap_field form.invoice_address_custom_field layout="control" %}
{% trans "Issuer details" %} diff --git a/src/pretix/control/templates/pretixcontrol/order/index.html b/src/pretix/control/templates/pretixcontrol/order/index.html index 2ca5501b91..f68dd56d37 100644 --- a/src/pretix/control/templates/pretixcontrol/order/index.html +++ b/src/pretix/control/templates/pretixcontrol/order/index.html @@ -734,6 +734,10 @@ {% endif %} {% endif %} + {% if request.event.settings.invoice_address_custom_field and order.invoice_address.custom_field %} +
{{ request.event.settings.invoice_address_custom_field }}
+
{{ order.invoice_address.custom_field }}
+ {% endif %}
{% trans "Internal reference" %}
{{ order.invoice_address.internal_reference }}
diff --git a/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html b/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html index b926de218f..75b32691b5 100644 --- a/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html +++ b/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html @@ -108,6 +108,10 @@
{% trans "VAT ID" %}
{{ addr.vat_id }}
{% endif %} + {% if request.event.settings.invoice_address_custom_field and addr.custom_field %} +
{{ request.event.settings.invoice_address_custom_field }}
+
{{ addr.custom_field }}
+ {% endif %}
{% trans "Internal reference" %}
{{ addr.internal_reference }}
diff --git a/src/pretix/presale/templates/pretixpresale/event/order.html b/src/pretix/presale/templates/pretixpresale/event/order.html index badf793f2c..cab26564ff 100644 --- a/src/pretix/presale/templates/pretixpresale/event/order.html +++ b/src/pretix/presale/templates/pretixpresale/event/order.html @@ -247,6 +247,10 @@
{% trans "VAT ID" %}
{{ order.invoice_address.vat_id }}
{% endif %} + {% if request.event.settings.invoice_address_custom_field and order.invoice_address.custom_field %} +
{{ request.event.settings.invoice_address_custom_field }}
+
{{ order.invoice_address.custom_field }}
+ {% endif %}
{% trans "Internal Reference" %}
{{ order.invoice_address.internal_reference }}
{% endif %}