Allow separate numbering schemes for invoices and cancellations

This commit is contained in:
Raphael Michel
2019-08-06 14:17:51 +02:00
parent 6dd1c927ef
commit 9a9de523e0
5 changed files with 27 additions and 3 deletions

View File

@@ -175,6 +175,8 @@ class Invoice(models.Model):
self.organizer = self.order.event.organizer self.organizer = self.order.event.organizer
if not self.prefix: if not self.prefix:
self.prefix = self.event.settings.invoice_numbers_prefix or (self.event.slug.upper() + '-') 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 not self.invoice_no:
if self.order.testmode: if self.order.testmode:
self.prefix += 'TEST-' self.prefix += 'TEST-'

View File

@@ -93,6 +93,10 @@ DEFAULTS = {
'default': '', 'default': '',
'type': str, 'type': str,
}, },
'invoice_numbers_prefix_cancellations': {
'default': '',
'type': str,
},
'invoice_renderer': { 'invoice_renderer': {
'default': 'classic', 'default': 'classic',
'type': str, 'type': str,

View File

@@ -787,6 +787,12 @@ class InvoiceSettingsForm(SettingsForm):
"used at most once over all of your events. This setting only affects future invoices."), "used at most once over all of your events. This setting only affects future invoices."),
required=False, 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( invoice_generate = forms.ChoiceField(
label=_("Generate invoices"), label=_("Generate invoices"),
required=False, required=False,
@@ -920,6 +926,10 @@ class InvoiceSettingsForm(SettingsForm):
(r.identifier, r.verbose_name) for r in event.get_invoice_renderers().values() (r.identifier, r.verbose_name) for r in event.get_invoice_renderers().values()
] ]
self.fields['invoice_numbers_prefix'].widget.attrs['placeholder'] = event.slug.upper() + '-' 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) 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_language'].choices = [('__user__', _('The user\'s language'))] + [(a, locale_names[a]) for a in event.settings.locales]
self.fields['invoice_generate_sales_channels'].choices = ( self.fields['invoice_generate_sales_channels'].choices = (

View File

@@ -12,11 +12,11 @@
{% bootstrap_field form.invoice_generate layout="control" %} {% bootstrap_field form.invoice_generate layout="control" %}
{% bootstrap_field form.invoice_generate_sales_channels layout="control" %} {% bootstrap_field form.invoice_generate_sales_channels layout="control" %}
{% bootstrap_field form.invoice_email_attachment 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_language layout="control" %}
{% bootstrap_field form.invoice_include_free 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" %}
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>{% trans "Address form" %}</legend> <legend>{% trans "Address form" %}</legend>
@@ -41,6 +41,7 @@
<fieldset> <fieldset>
<legend>{% trans "Invoice customization" %}</legend> <legend>{% trans "Invoice customization" %}</legend>
{% bootstrap_field form.invoice_renderer layout="control" %} {% 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_introductory_text layout="control" %}
{% bootstrap_field form.invoice_additional_text layout="control" %} {% bootstrap_field form.invoice_additional_text layout="control" %}
{% bootstrap_field form.invoice_footer_text layout="control" %} {% bootstrap_field form.invoice_footer_text layout="control" %}

View File

@@ -390,6 +390,13 @@ def test_invoice_number_prefixes(env):
assert generate_invoice(order).number == 'shared_{}-6'.format(order.code) assert generate_invoice(order).number == 'shared_{}-6'.format(order.code)
assert generate_invoice(order2).number == 'shared_{}-6'.format(order2.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 # Test database uniqueness check
with pytest.raises(DatabaseError): with pytest.raises(DatabaseError):
with transaction.atomic(): with transaction.atomic():