forked from CGM_Public/pretix_original
Allow separate numbering schemes for invoices and cancellations
This commit is contained in:
@@ -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-'
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 = (
|
||||||
|
|||||||
@@ -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" %}
|
||||||
|
|||||||
@@ -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():
|
||||||
|
|||||||
Reference in New Issue
Block a user