diff --git a/src/pretix/base/models/invoices.py b/src/pretix/base/models/invoices.py index 7312542b08..5013be6251 100644 --- a/src/pretix/base/models/invoices.py +++ b/src/pretix/base/models/invoices.py @@ -175,6 +175,8 @@ class Invoice(models.Model): self.organizer = self.order.event.organizer if not self.prefix: self.prefix = self.event.settings.invoice_numbers_prefix or (self.event.slug.upper() + '-') + if self.is_cancellation: + self.prefix = self.event.settings.invoice_numbers_prefix_cancellations or self.prefix if not self.invoice_no: if self.order.testmode: self.prefix += 'TEST-' diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 30579b5c34..bd901d288c 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -93,6 +93,10 @@ DEFAULTS = { 'default': '', 'type': str, }, + 'invoice_numbers_prefix_cancellations': { + 'default': '', + 'type': str, + }, 'invoice_renderer': { 'default': 'classic', 'type': str, diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index ddc89bb4d6..b1d76c0549 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -787,6 +787,12 @@ class InvoiceSettingsForm(SettingsForm): "used at most once over all of your events. This setting only affects future invoices."), required=False, ) + invoice_numbers_prefix_cancellations = forms.CharField( + label=_("Invoice number prefix for cancellations"), + help_text=_("This will be prepended to invoice numbers of cancellations. If you leave this field empty, " + "the same numbering scheme will be used that you configured for regular invoices."), + required=False, + ) invoice_generate = forms.ChoiceField( label=_("Generate invoices"), required=False, @@ -920,6 +926,10 @@ class InvoiceSettingsForm(SettingsForm): (r.identifier, r.verbose_name) for r in event.get_invoice_renderers().values() ] self.fields['invoice_numbers_prefix'].widget.attrs['placeholder'] = event.slug.upper() + '-' + if event.settings.invoice_numbers_prefix: + self.fields['invoice_numbers_prefix_cancellations'].widget.attrs['placeholder'] = event.settings.invoice_numbers_prefix + else: + self.fields['invoice_numbers_prefix_cancellations'].widget.attrs['placeholder'] = event.slug.upper() + '-' locale_names = dict(settings.LANGUAGES) self.fields['invoice_language'].choices = [('__user__', _('The user\'s language'))] + [(a, locale_names[a]) for a in event.settings.locales] self.fields['invoice_generate_sales_channels'].choices = ( diff --git a/src/pretix/control/templates/pretixcontrol/event/invoicing.html b/src/pretix/control/templates/pretixcontrol/event/invoicing.html index b05f48cfa0..2c4cbb7198 100644 --- a/src/pretix/control/templates/pretixcontrol/event/invoicing.html +++ b/src/pretix/control/templates/pretixcontrol/event/invoicing.html @@ -12,11 +12,11 @@ {% bootstrap_field form.invoice_generate layout="control" %} {% bootstrap_field form.invoice_generate_sales_channels layout="control" %} {% bootstrap_field form.invoice_email_attachment layout="control" %} - {% bootstrap_field form.invoice_numbers_prefix layout="control" %} - {% bootstrap_field form.invoice_numbers_consecutive layout="control" %} {% bootstrap_field form.invoice_language layout="control" %} {% bootstrap_field form.invoice_include_free layout="control" %} - {% bootstrap_field form.invoice_attendee_name layout="control" %} + {% bootstrap_field form.invoice_numbers_consecutive layout="control" %} + {% bootstrap_field form.invoice_numbers_prefix layout="control" %} + {% bootstrap_field form.invoice_numbers_prefix_cancellations layout="control" %}
{% trans "Address form" %} @@ -41,6 +41,7 @@
{% trans "Invoice customization" %} {% bootstrap_field form.invoice_renderer layout="control" %} + {% bootstrap_field form.invoice_attendee_name layout="control" %} {% bootstrap_field form.invoice_introductory_text layout="control" %} {% bootstrap_field form.invoice_additional_text layout="control" %} {% bootstrap_field form.invoice_footer_text layout="control" %} diff --git a/src/tests/base/test_invoices.py b/src/tests/base/test_invoices.py index a15a7e03cd..0bd5dcef22 100644 --- a/src/tests/base/test_invoices.py +++ b/src/tests/base/test_invoices.py @@ -390,6 +390,13 @@ def test_invoice_number_prefixes(env): assert generate_invoice(order).number == 'shared_{}-6'.format(order.code) assert generate_invoice(order2).number == 'shared_{}-6'.format(order2.code) + event2.settings.set('invoice_numbers_prefix', 'inv_') + event2.settings.set('invoice_numbers_prefix_cancellations', 'crd_') + event2.settings.set('invoice_numbers_consecutive', True) + i = generate_invoice(order2) + assert i.number == 'inv_00001' + assert generate_cancellation(i).number == 'crd_00001' + # Test database uniqueness check with pytest.raises(DatabaseError): with transaction.atomic():