diff --git a/src/pretix/presale/templates/pretixpresale/event/order_cancel.html b/src/pretix/presale/templates/pretixpresale/event/order_cancel.html index 018d072c76..e2045110ed 100644 --- a/src/pretix/presale/templates/pretixpresale/event/order_cancel.html +++ b/src/pretix/presale/templates/pretixpresale/event/order_cancel.html @@ -21,7 +21,7 @@ action="{% eventurl request.event "presale:event.order.cancel.do" secret=order.secret order=order.code %}" data-asynctask class=""> - {% if request.event.settings.cancel_allow_user_paid_require_approval %} + {% if request.event.settings.cancel_allow_user_paid_require_approval and order.status == "p" and order.total != 0 %}

{% blocktrans trimmed %} You can request the cancellation of your order on this page. The event organizer will then decide @@ -37,7 +37,7 @@

{% endif %} - {% if request.event.settings.cancel_allow_user_paid_adjust_fees %} + {% if request.event.settings.cancel_allow_user_paid_adjust_fees and order.status == "p" and order.total != 0 %}

{% if cancel_fee %} {% blocktrans trimmed with fee=order.user_cancel_fee|money:request.event.currency %} diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index 9d6f8df036..8996e89657 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -878,7 +878,9 @@ class OrderCancelDo(EventViewMixin, OrderDetailMixin, AsyncAction, View): require_approval = self.request.event.settings.cancel_allow_user_paid_require_approval fee = self.order.user_cancel_fee auto_refund = True - if 'cancel_fee' in request.POST and self.request.event.settings.cancel_allow_user_paid_adjust_fees: + if self.order.total == Decimal('0.00'): + fee = Decimal('0.00') + elif 'cancel_fee' in request.POST and self.request.event.settings.cancel_allow_user_paid_adjust_fees: fee = fee or Decimal('0.00') fee_in = re.sub('[^0-9.,]', '', request.POST.get('cancel_fee')) try: diff --git a/src/tests/presale/test_orders.py b/src/tests/presale/test_orders.py index 520956e38b..d2dd88ab09 100644 --- a/src/tests/presale/test_orders.py +++ b/src/tests/presale/test_orders.py @@ -511,6 +511,34 @@ class OrdersTest(BaseOrdersTest): assert not self.order.refunds.exists() assert not self.order.cancellation_requests.exists() + def test_orders_cancel_free_ignore_fixed_fee(self): + self.order.status = Order.STATUS_PAID + self.order.total = Decimal('0.00') + self.order.save() + with scopes_disabled(): + self.order.payments.create(provider='testdummy_partialrefund', amount=self.order.total, state=OrderPayment.PAYMENT_STATE_CONFIRMED) + self.event.settings.cancel_allow_user_paid = True + self.event.settings.cancel_allow_user_paid_keep = Decimal('3.00') + self.event.settings.cancel_allow_user_paid_require_approval = True + self.event.settings.cancel_allow_user_paid_adjust_fees = True + response = self.client.get( + '/%s/%s/order/%s/%s/cancel' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret) + ) + assert response.status_code == 200 + response = self.client.post( + '/%s/%s/order/%s/%s/cancel/do' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret), { + 'cancel_fee': '3.00' + }, follow=True) + self.assertRedirects(response, + '/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code, + self.order.secret), + target_status_code=200) + self.order.refresh_from_db() + assert self.order.status == Order.STATUS_CANCELED + with scopes_disabled(): + assert not self.order.refunds.exists() + assert not self.order.cancellation_requests.exists() + def test_orders_cancel_paid_fee_autorefund_gift_card_optional(self): self.order.status = Order.STATUS_PAID self.order.save()