From c65992fef00925b36da42d85bc12f014ddc72f3e Mon Sep 17 00:00:00 2001
From: Richard Schreiber <wiffbi@gmail.com>
Date: Tue, 4 Mar 2025 09:58:02 +0100
Subject: [PATCH 1/4] fix fee_calc splitting with None tax-rules

---
 pretix_servicefees/signals.py | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/pretix_servicefees/signals.py b/pretix_servicefees/signals.py
index 884cb83..032cea7 100644
--- a/pretix_servicefees/signals.py
+++ b/pretix_servicefees/signals.py
@@ -141,14 +141,19 @@ def get_fees(
         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
-                d[tr] += p.price - p.tax_value
+                if not tr:
+                    tr = tax_rule_zero
+                key = (tr.rate, tr.code)
+                d[key] += p.price - p.tax_value
+                trs[key] = tr
 
-            base_values = sorted([tuple(t) for t in d.items()], key=lambda t: t[0].rate)
+            base_values = sorted([(trs[t[0]], t[1]) for t in d.items()], key=lambda t: t[0].rate)
             sum_base = sum(t[1] for t in base_values)
             if sum_base:
                 fee_values = [

From 18b02c7f636e4057dcdcceb4887c6d908d4f4d06 Mon Sep 17 00:00:00 2001
From: Richard Schreiber <schreiber@rami.io>
Date: Tue, 11 Mar 2025 16:35:04 +0100
Subject: [PATCH 2/4] Apply suggestions from code review

Co-authored-by: Mira <mira@teamwiki.de>
---
 pretix_servicefees/signals.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pretix_servicefees/signals.py b/pretix_servicefees/signals.py
index 032cea7..ee7c3da 100644
--- a/pretix_servicefees/signals.py
+++ b/pretix_servicefees/signals.py
@@ -153,8 +153,8 @@ def get_fees(
                 d[key] += p.price - p.tax_value
                 trs[key] = tr
 
-            base_values = sorted([(trs[t[0]], t[1]) for t in d.items()], key=lambda t: t[0].rate)
-            sum_base = sum(t[1] for t in base_values)
+            base_values = sorted([(trs[key], value) for key, value in d.items()], key=lambda t: t[0].rate)
+            sum_base = sum(value for rule, value in base_values)
             if sum_base:
                 fee_values = [
                     (t[0], round_decimal(fee * t[1] / sum_base, event.currency))

From 6a7594af236b41a82f76c7c75bab743a07413b8c Mon Sep 17 00:00:00 2001
From: Richard Schreiber <wiffbi@gmail.com>
Date: Tue, 11 Mar 2025 16:40:05 +0100
Subject: [PATCH 3/4] improve readability suggested from code review

---
 pretix_servicefees/signals.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/pretix_servicefees/signals.py b/pretix_servicefees/signals.py
index ee7c3da..25a6f62 100644
--- a/pretix_servicefees/signals.py
+++ b/pretix_servicefees/signals.py
@@ -154,13 +154,13 @@ def get_fees(
                 trs[key] = tr
 
             base_values = sorted([(trs[key], value) for key, value in d.items()], key=lambda t: t[0].rate)
-            sum_base = sum(value for rule, value in base_values)
+            sum_base = sum(value for key, value in base_values)
             if sum_base:
                 fee_values = [
-                    (t[0], round_decimal(fee * t[1] / sum_base, event.currency))
-                    for t in base_values
+                    (key, round_decimal(fee * value / sum_base, event.currency))
+                    for key, value in base_values
                 ]
-                sum_fee = sum(t[1] for t in fee_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

From 3b42a29dfe931a52427e59894c10997e0c01b07e Mon Sep 17 00:00:00 2001
From: Richard Schreiber <wiffbi@gmail.com>
Date: Tue, 11 Mar 2025 16:40:31 +0100
Subject: [PATCH 4/4] use tax-rule pk as key instead of (rate, code)

---
 pretix_servicefees/signals.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/pretix_servicefees/signals.py b/pretix_servicefees/signals.py
index 25a6f62..6c0cc1f 100644
--- a/pretix_servicefees/signals.py
+++ b/pretix_servicefees/signals.py
@@ -149,9 +149,9 @@ def get_fees(
                     tr = p.tax_rule
                 if not tr:
                     tr = tax_rule_zero
-                key = (tr.rate, tr.code)
-                d[key] += p.price - p.tax_value
-                trs[key] = tr
+                # 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)