diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 80aa4d5080..8eac8ded08 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -815,12 +815,17 @@ class OrderChangeManager: self.notify = notify self._invoice_dirty = False - def change_item(self, position: OrderPosition, item: Item, variation: Optional[ItemVariation]): + def change_item(self, position: OrderPosition, item: Item, variation: Optional[ItemVariation], keep_price=False): if (not variation and item.has_variations) or (variation and variation.item_id != item.pk): raise OrderError(self.error_messages['product_without_variation']) - price = get_price(item, variation, voucher=position.voucher, subevent=position.subevent, - invoice_address=self._invoice_address) + if keep_price: + price = TaxedPrice(gross=position.price, net=position.price - position.tax_value, + tax=position.tax_value, rate=position.tax_rate, + name=position.tax_rule.name) + else: + price = get_price(item, variation, voucher=position.voucher, subevent=position.subevent, + invoice_address=self._invoice_address) if price is None: # NOQA raise OrderError(self.error_messages['product_invalid']) diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index 1d1fd9cd60..78b441acd9 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -286,6 +286,7 @@ class OrderPositionChangeForm(forms.Form): ('secret', 'Regenerate secret'), ) ) + change_product_keep_price = forms.BooleanField(required=False) def __init__(self, *args, **kwargs): instance = kwargs.pop('instance') diff --git a/src/pretix/control/templates/pretixcontrol/order/change.html b/src/pretix/control/templates/pretixcontrol/order/change.html index 03c0338e69..9958d29c71 100644 --- a/src/pretix/control/templates/pretixcontrol/order/change.html +++ b/src/pretix/control/templates/pretixcontrol/order/change.html @@ -95,6 +95,10 @@ {% trans "Change product to" %} {% bootstrap_field position.form.itemvar layout='inline' %} + {% if request.event.has_subevents %}