diff --git a/src/pretix/base/migrations/0006_auto_20160211_1630.py b/src/pretix/base/migrations/0006_auto_20160211_1630.py new file mode 100644 index 000000000..bc28f63ab --- /dev/null +++ b/src/pretix/base/migrations/0006_auto_20160211_1630.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2016-02-11 16:30 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0005_auto_20160211_1459'), + ] + + operations = [ + migrations.AddField( + model_name='orderposition', + name='tax_rate', + field=models.DecimalField(decimal_places=2, default=0, max_digits=7, verbose_name='Tax rate'), + preserve_default=False, + ), + migrations.AddField( + model_name='orderposition', + name='tax_value', + field=models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Tax value'), + preserve_default=False, + ), + ] diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 1938424d5..11b383d8a 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -3,11 +3,12 @@ import string from datetime import datetime from decimal import Decimal -from django.db import models, transaction +from django.db import models from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ from typing import List, Union +from ..decimal import round_decimal from .base import CachedFile, LoggedModel from .event import Event from .items import Item, ItemVariation, Question, Quota @@ -361,6 +362,14 @@ class OrderPosition(AbstractPosition): related_name='positions', on_delete=models.PROTECT ) + tax_rate = models.DecimalField( + max_digits=7, decimal_places=2, + verbose_name=_('Tax rate') + ) + tax_value = models.DecimalField( + max_digits=10, decimal_places=2, + verbose_name=_('Tax value') + ) class Meta: verbose_name = _("Order position") @@ -381,6 +390,7 @@ class OrderPosition(AbstractPosition): cartpos.voucher.redeemed = True cartpos.voucher.save() cartpos.delete() + op._calculate_tax() ops.append(op) OrderPosition.objects.bulk_create(ops) return ops @@ -390,6 +400,18 @@ class OrderPosition(AbstractPosition): self.item.id, self.variation.id if self.variation else 0, self.order_id ) + def _calculate_tax(self): + self.tax_rate = self.item.tax_rate + if self.tax_rate: + self.tax_value = round_decimal(self.price * (1 - 100 / (100 + self.item.tax_rate))) + else: + self.tax_value = Decimal('0.00') + + def save(self, *args, **kwargs): + if self.tax_rate is None: + self._calculate_tax() + return super().save(*args, **kwargs) + class CartPosition(AbstractPosition): """ @@ -429,3 +451,13 @@ class CartPosition(AbstractPosition): return '' % ( self.item.id, self.variation.id if self.variation else 0, self.cart_id ) + + @property + def tax_rate(self): + return self.item.tax_rate + + @property + def tax_value(self): + if not self.tax_rate: + return Decimal('0.00') + return round_decimal(self.price * (1 - 100 / (100 + self.item.tax_rate))) diff --git a/src/pretix/control/templates/pretixcontrol/order/index.html b/src/pretix/control/templates/pretixcontrol/order/index.html index 3fd1033b2..716f09bd9 100644 --- a/src/pretix/control/templates/pretixcontrol/order/index.html +++ b/src/pretix/control/templates/pretixcontrol/order/index.html @@ -123,9 +123,9 @@
{{ event.currency }} {{ line.total|floatformat:2 }} - {% if line.item.tax_rate %} + {% if line.tax_rate %}
- {% blocktrans trimmed with rate=line.item.tax_rate %} + {% blocktrans trimmed with rate=line.tax_rate %} incl. {{ rate }}% taxes {% endblocktrans %} {% endif %} diff --git a/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html b/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html index 1b0149f5f..0bcedf690 100644 --- a/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html +++ b/src/pretix/presale/templates/pretixpresale/event/fragment_cart.html @@ -59,8 +59,8 @@
{{ event.currency }} {{ line.total|floatformat:2 }} - {% if line.item.tax_rate %} -
{% blocktrans trimmed with rate=line.item.tax_rate %} + {% if line.tax_rate %} +
{% blocktrans trimmed with rate=line.tax_rate %} incl. {{ rate }}% taxes {% endblocktrans %} {% endif %}