Self-service cancellation: Do not allow to adjust fee on free orders

This commit is contained in:
Raphael Michel
2021-08-16 14:40:06 +02:00
parent bb7fd9423b
commit e191988b81
3 changed files with 33 additions and 3 deletions

View File

@@ -21,7 +21,7 @@
action="{% eventurl request.event "presale:event.order.cancel.do" secret=order.secret order=order.code %}" action="{% eventurl request.event "presale:event.order.cancel.do" secret=order.secret order=order.code %}"
data-asynctask data-asynctask
class=""> 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 %}
<p> <p>
{% blocktrans trimmed %} {% blocktrans trimmed %}
You can request the cancellation of your order on this page. The event organizer will then decide You can request the cancellation of your order on this page. The event organizer will then decide
@@ -37,7 +37,7 @@
</p> </p>
{% endif %} {% 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 %}
<p> <p>
{% if cancel_fee %} {% if cancel_fee %}
{% blocktrans trimmed with fee=order.user_cancel_fee|money:request.event.currency %} {% blocktrans trimmed with fee=order.user_cancel_fee|money:request.event.currency %}

View File

@@ -878,7 +878,9 @@ class OrderCancelDo(EventViewMixin, OrderDetailMixin, AsyncAction, View):
require_approval = self.request.event.settings.cancel_allow_user_paid_require_approval require_approval = self.request.event.settings.cancel_allow_user_paid_require_approval
fee = self.order.user_cancel_fee fee = self.order.user_cancel_fee
auto_refund = True 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 = fee or Decimal('0.00')
fee_in = re.sub('[^0-9.,]', '', request.POST.get('cancel_fee')) fee_in = re.sub('[^0-9.,]', '', request.POST.get('cancel_fee'))
try: try:

View File

@@ -511,6 +511,34 @@ class OrdersTest(BaseOrdersTest):
assert not self.order.refunds.exists() assert not self.order.refunds.exists()
assert not self.order.cancellation_requests.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): def test_orders_cancel_paid_fee_autorefund_gift_card_optional(self):
self.order.status = Order.STATUS_PAID self.order.status = Order.STATUS_PAID
self.order.save() self.order.save()