Add option to exclude Sales Channels from invoice generation

This commit is contained in:
Martin Gross
2019-05-21 14:18:31 +02:00
parent 52d10957a1
commit 3254ac36a2
7 changed files with 62 additions and 10 deletions

View File

@@ -257,7 +257,8 @@ def invoice_pdf_task(invoice: int):
def invoice_qualified(order: Order):
if order.total == Decimal('0.00') or order.require_approval:
if order.total == Decimal('0.00') or order.require_approval or \
order.sales_channel not in order.event.settings.get('invoice_generate_sales_channels'):
return False
return True

View File

@@ -145,6 +145,10 @@ DEFAULTS = {
'default': 'False',
'type': str
},
'invoice_generate_sales_channels': {
'default': json.dumps(['web']),
'type': list
},
'invoice_address_from': {
'default': '',
'type': str

View File

@@ -18,6 +18,7 @@ from i18nfield.forms import (
)
from pytz import common_timezones, timezone
from pretix.base.channels import get_all_sales_channels
from pretix.base.forms import I18nModelForm, PlaceholderValidator, SettingsForm
from pretix.base.models import Event, Organizer, TaxRule
from pretix.base.models.event import EventMetaValue, SubEvent
@@ -664,6 +665,13 @@ class InvoiceSettingsForm(SettingsForm):
),
help_text=_("Invoices will never be automatically generated for free orders.")
)
invoice_generate_sales_channels = forms.MultipleChoiceField(
label=_('Generate invoices for Sales channels'),
choices=[],
widget=forms.CheckboxSelectMultiple,
help_text=_("If you have enabled invoice generation in the previous setting, you can limit it here to specific "
"sales channels.")
)
invoice_attendee_name = forms.BooleanField(
label=_("Show attendee names on invoices"),
required=False
@@ -779,6 +787,9 @@ class InvoiceSettingsForm(SettingsForm):
self.fields['invoice_numbers_prefix'].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 = (
(c.identifier, c.verbose_name) for c in get_all_sales_channels().values()
)
def multimail_validate(val):

View File

@@ -9,6 +9,7 @@
<fieldset>
<legend>{% trans "General settings" %}</legend>
{% 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" %}

View File

@@ -122,10 +122,13 @@ class OrderDetails(EventViewMixin, OrderDetailMixin, CartMixin, TemplateView):
)
ctx['invoices'] = list(self.order.invoices.all())
can_generate_invoice = (
self.request.event.settings.get('invoice_generate') in ('user', 'True')
or (
self.request.event.settings.get('invoice_generate') == 'paid'
and self.order.status == Order.STATUS_PAID
self.order.sales_channel in self.request.event.settings.get('invoice_generate_sales_channels')
and (
self.request.event.settings.get('invoice_generate') in ('user', 'True')
or (
self.request.event.settings.get('invoice_generate') == 'paid'
and self.order.status == Order.STATUS_PAID
)
)
)
ctx['can_generate_invoice'] = invoice_qualified(self.order) and can_generate_invoice
@@ -516,10 +519,13 @@ class OrderInvoiceCreate(EventViewMixin, OrderDetailMixin, View):
def post(self, request, *args, **kwargs):
can_generate_invoice = (
self.request.event.settings.get('invoice_generate') in ('user', 'True')
or (
self.request.event.settings.get('invoice_generate') == 'paid'
and self.order.status == Order.STATUS_PAID
self.order.sales_channel in self.request.event.settings.get('invoice_generate_sales_channels')
and (
self.request.event.settings.get('invoice_generate') in ('user', 'True')
or (
self.request.event.settings.get('invoice_generate') == 'paid'
and self.order.status == Order.STATUS_PAID
)
)
)
if not can_generate_invoice or not invoice_qualified(self.order):