From 7d0373fde8225ddd7a4762b5fcecd8f78865c61e Mon Sep 17 00:00:00 2001 From: Raphael Michel <michel@rami.io> Date: Fri, 28 Mar 2025 15:00:46 +0100 Subject: [PATCH] Use new tax default and split function --- pretix_servicefees/signals.py | 42 +++-------------------------------- pretix_servicefees/views.py | 2 +- 2 files changed, 4 insertions(+), 40 deletions(-) diff --git a/pretix_servicefees/signals.py b/pretix_servicefees/signals.py index 6c0cc1f..d971506 100644 --- a/pretix_servicefees/signals.py +++ b/pretix_servicefees/signals.py @@ -8,6 +8,7 @@ from django.utils.translation import gettext, gettext_lazy as _ from pretix.base.decimal import round_decimal from pretix.base.models import CartPosition, Event, TaxRule from pretix.base.models.orders import OrderFee +from pretix.base.services.tax import split_fee_for_taxes from pretix.base.settings import settings_hierarkey from pretix.base.signals import ( event_copy_data, @@ -139,46 +140,9 @@ def get_fees( ) split_taxes = event.settings.get("service_fee_split_taxes", as_type=bool) if split_taxes: - # split taxes based on products ordered - d = defaultdict(lambda: Decimal("0.00")) - trs = {} - for p in positions: - if isinstance(p, CartPosition): - tr = p.item.tax_rule - else: - tr = p.tax_rule - if not tr: - tr = tax_rule_zero - # use tr.pk as key as tax_rule_zero is not hashable - d[tr.pk] += p.price - p.tax_value - trs[tr.pk] = tr - - base_values = sorted([(trs[key], value) for key, value in d.items()], key=lambda t: t[0].rate) - sum_base = sum(value for key, value in base_values) - if sum_base: - fee_values = [ - (key, round_decimal(fee * value / sum_base, event.currency)) - for key, value in base_values - ] - sum_fee = sum(value for key, value in fee_values) - - # If there are rounding differences, we fix them up, but always leaning to the benefit of the tax - # authorities - if sum_fee > fee: - fee_values[0] = ( - fee_values[0][0], - fee_values[0][1] + (fee - sum_fee), - ) - elif sum_fee < fee: - fee_values[-1] = ( - fee_values[-1][0], - fee_values[-1][1] + (fee - sum_fee), - ) - else: - fee_values = [(event.settings.tax_rate_default or tax_rule_zero, fee)] - + fee_values = split_fee_for_taxes(positions, fee, event) else: - fee_values = [(event.settings.tax_rate_default or tax_rule_zero, fee)] + fee_values = [(event.settings.cached_default_tax_rule or tax_rule_zero, fee)] fees = [] for tax_rule, price in fee_values: diff --git a/pretix_servicefees/views.py b/pretix_servicefees/views.py index 8c39cdc..6b2fe6a 100644 --- a/pretix_servicefees/views.py +++ b/pretix_servicefees/views.py @@ -57,7 +57,7 @@ class ServiceFeeSettingsForm(SettingsForm): "Split taxes proportionate to the tax rates and net values of the ordered products." ), help_text=_( - "If not split based on ordered products, the tax rate falls back to the event’s base tax rate or no tax, if none is given." + "If not split based on ordered products, the tax rate falls back to the event’s default tax rate or no tax, if no default tax rate exists." ), required=False, )