Add TaxRule selection in OrderPositionChange (#1700)

Co-authored-by: Raphael Michel <mail@raphaelmichel.de>
This commit is contained in:
Martin Gross
2020-06-30 11:13:33 +02:00
committed by GitHub
parent 626e332886
commit 5f50aa95eb
12 changed files with 176 additions and 8 deletions

View File

@@ -20,7 +20,7 @@ from pretix.base.forms.widgets import (
DatePickerWidget, SplitDateTimePickerWidget,
)
from pretix.base.models import (
InvoiceAddress, ItemAddOn, Order, OrderFee, OrderPosition,
InvoiceAddress, ItemAddOn, Order, OrderFee, OrderPosition, TaxRule,
)
from pretix.base.models.event import SubEvent
from pretix.base.services.pricing import get_price
@@ -348,6 +348,11 @@ class OrderPositionChangeForm(forms.Form):
localize=True,
label=_('New price (gross)')
)
tax_rule = forms.ModelChoiceField(
TaxRule.objects.none(),
required=False,
empty_label=_('(Unchanged)')
)
operation_secret = forms.BooleanField(
required=False,
label=_('Generate a new secret')
@@ -361,6 +366,10 @@ class OrderPositionChangeForm(forms.Form):
label=_('Split into new order')
)
@staticmethod
def taxrule_label_from_instance(obj):
return f"{obj.name} ({obj.rate} %)"
def __init__(self, *args, **kwargs):
instance = kwargs.pop('instance')
items = kwargs.pop('items')
@@ -386,6 +395,9 @@ class OrderPositionChangeForm(forms.Form):
else:
del self.fields['subevent']
self.fields['tax_rule'].queryset = instance.event.tax_rules.all()
self.fields['tax_rule'].label_from_instance = self.taxrule_label_from_instance
if not instance.seat:
del self.fields['seat']
@@ -415,6 +427,11 @@ class OrderFeeChangeForm(forms.Form):
localize=True,
label=_('New price (gross)')
)
tax_rule = forms.ModelChoiceField(
TaxRule.objects.none(),
required=False,
empty_label=_('(Unchanged)')
)
operation_cancel = forms.BooleanField(
required=False,
label=_('Remove this fee')
@@ -427,6 +444,7 @@ class OrderFeeChangeForm(forms.Form):
initial['value'] = instance.value
kwargs['initial'] = initial
super().__init__(*args, **kwargs)
self.fields['tax_rule'].queryset = instance.order.event.tax_rules.all()
change_decimal_field(self.fields['value'], instance.order.event.currency)

View File

@@ -15,6 +15,7 @@ from i18nfield.strings import LazyI18nString
from pretix.base.models import (
Checkin, CheckinList, Event, ItemVariation, LogEntry, OrderPosition,
TaxRule,
)
from pretix.base.signals import logentry_display
from pretix.base.templatetags.money import money_filter
@@ -65,6 +66,21 @@ def _display_order_changed(event: Event, logentry: LogEntry):
old_price=money_filter(Decimal(data['old_price']), event.currency),
new_price=money_filter(Decimal(data['new_price']), event.currency),
)
elif logentry.action_type == 'pretix.event.order.changed.tax_rule':
if 'positionid' in data:
return text + ' ' + _('Tax rule of position #{posid} changed from {old_rule} '
'to {new_rule}.').format(
posid=data.get('positionid', '?'),
old_rule=TaxRule.objects.get(pk=data['old_taxrule']),
new_rule=TaxRule.objects.get(pk=data['new_taxrule']),
)
elif 'fee' in data:
return text + ' ' + _('Tax rule of fee #{fee} changed from {old_rule} '
'to {new_rule}.').format(
fee=data.get('fee', '?'),
old_rule=TaxRule.objects.get(pk=data['old_taxrule']),
new_rule=TaxRule.objects.get(pk=data['new_taxrule']),
)
elif logentry.action_type == 'pretix.event.order.changed.addfee':
return text + ' ' + str(_('A fee has been added'))
elif logentry.action_type == 'pretix.event.order.changed.feevalue':

View File

@@ -140,6 +140,18 @@
</div>
</div>
<div class="row">
<div class="col-sm-3">
<strong>{% trans "Tax rule" %}</strong>
</div>
<div class="col-sm-5">
{{ position.tax_rule.name }} ({{ position.tax_rule.rate }} %)
</div>
<div class="col-sm-4 field-container">
{% bootstrap_field position.form.tax_rule layout='inline' %}
</div>
</div>
<div class="row">
<div class="col-sm-3">
<strong>{% trans "Price" %}</strong>
@@ -307,6 +319,7 @@
<div class="col-sm-4 field-container">
{% bootstrap_field fee.form.value addon_after=request.event.currency layout='inline' %}
<small><strong>{% trans "including all taxes" %}</strong></small>
{% bootstrap_field fee.form.tax_rule layout='inline' %}
</div>
</div>

View File

@@ -1476,6 +1476,9 @@ class OrderChange(OrderView):
if f.form.cleaned_data['value'] != f.value:
ocm.change_fee(f, f.form.cleaned_data['value'])
if f.form.cleaned_data['tax_rule'] and f.form.cleaned_data['tax_rule'] != f.tax_rule:
ocm.change_tax_rule(f, f.form.cleaned_data['tax_rule'])
except OrderError as e:
f.custom_error = str(e)
return False
@@ -1523,6 +1526,9 @@ class OrderChange(OrderView):
if p.form.cleaned_data['price'] != p.price:
ocm.change_price(p, p.form.cleaned_data['price'])
if p.form.cleaned_data['tax_rule'] and p.form.cleaned_data['tax_rule'] != p.tax_rule:
ocm.change_tax_rule(p, p.form.cleaned_data['tax_rule'])
if p.form.cleaned_data['operation_split']:
ocm.split(p)