diff --git a/src/pretix/base/services/cart.py b/src/pretix/base/services/cart.py index eb8d964432..c0f6177c73 100644 --- a/src/pretix/base/services/cart.py +++ b/src/pretix/base/services/cart.py @@ -1430,11 +1430,12 @@ class CartManager: ) for cp, (new_price, discount) in zip(positions, discount_results): - if cp.price != new_price or cp.discount_id != (discount.pk if discount else None): - diff += new_price - cp.price + if (cp.price - cp.price_includes_rounding_correction) != new_price or cp.discount_id != (discount.pk if discount else None): + diff += new_price - (cp.price - cp.price_includes_rounding_correction) cp.price = new_price + cp.price_includes_rounding_correction = Decimal("0.00") cp.discount = discount - cp.save(update_fields=['price', 'discount']) + cp.save(update_fields=['price', 'price_includes_rounding_correction', 'discount']) return diff diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index d27f5c7d22..d8b195859e 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -910,10 +910,11 @@ def _check_positions(event: Event, now_dt: datetime, time_machine_now_dt: dateti ] ) for cp, (new_price, discount) in zip(sorted_positions, discount_results): - if cp.price != new_price or cp.discount_id != (discount.pk if discount else None): + if cp.price - cp.price_includes_rounding_correction != new_price or cp.discount_id != (discount.pk if discount else None): cp.price = new_price + cp.price_includes_rounding_correction = Decimal("0.00") cp.discount = discount - cp.save(update_fields=['price', 'discount']) + cp.save(update_fields=['price', 'price_includes_rounding_correction', 'discount']) # After applying discounts, add-on positions might still have a reference to the *old* version of the # parent position, which can screw up ordering later since the system sees inconsistent data.