From d8ec489b13b9bdf4603aad708027774552a4a59a Mon Sep 17 00:00:00 2001 From: luelista Date: Mon, 31 Mar 2025 12:27:45 +0200 Subject: [PATCH] OrderChangeManager: Fix for change_tax_rule and recalculate_taxes in same transaction (Z#23187299) (#4964) * Add test case * Do not overwrite tax_rule in PriceOperation --- src/pretix/base/services/orders.py | 2 +- src/tests/base/test_orders.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 4fc0ae1506..197ee22407 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -2309,7 +2309,7 @@ class OrderChangeManager: op.position.tax_rate = op.price.rate op.position.tax_value = op.price.tax op.position.tax_code = op.price.code - op.position.save() + op.position.save(update_fields=['price', 'tax_rate', 'tax_value', 'tax_code']) elif isinstance(op, self.TaxRuleOperation): if isinstance(op.position, OrderPosition): self.order.log_action('pretix.event.order.changed.tax_rule', user=self.user, auth=self.auth, data={ diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 689832907c..7be563b7c3 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -3243,6 +3243,18 @@ class OrderChangeManagerTests(TestCase): assert nop.tax_rate == Decimal('0.00') assert nop.tax_value == Decimal('0.00') + @classscope(attr='o') + def test_change_taxrate_and_keep_net(self): + self.ocm.change_tax_rule(self.op1, self.tr19) + self.ocm.recalculate_taxes(keep='net') + self.ocm.commit() + self.order.refresh_from_db() + nop = self.order.positions.first() + assert nop.price == Decimal('25.59') + assert nop.tax_rule == self.tr19 + assert nop.tax_rate == Decimal('19.00') + assert nop.tax_value == Decimal('4.09') + @classscope(attr='o') def test_change_taxrate_to_country_specific(self): self.tr19.eu_reverse_charge = True