diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index 883a0784c..2b402610c 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -1594,7 +1594,8 @@ Order refund endpoints "amount": "23.00", "payment": 1, "execution_date": null, - "provider": "manual" + "provider": "manual", + "mark_refunded": false } **Example response**: diff --git a/src/pretix/api/views/order.py b/src/pretix/api/views/order.py index 2454c91bd..d81d6eaa5 100644 --- a/src/pretix/api/views/order.py +++ b/src/pretix/api/views/order.py @@ -617,6 +617,7 @@ class RefundViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet): return ctx def create(self, request, *args, **kwargs): + mark_refunded = request.data.pop('mark_refunded', False) serializer = OrderRefundCreateSerializer(data=request.data, context=self.get_serializer_context()) serializer.is_valid(raise_exception=True) with transaction.atomic(): @@ -632,6 +633,12 @@ class RefundViewSet(CreateModelMixin, viewsets.ReadOnlyModelViewSet): user=request.user if request.user.is_authenticated else None, auth=request.auth ) + if mark_refunded: + mark_order_refunded( + r.order, + user=request.user if request.user.is_authenticated else None, + auth=(request.auth if request.auth else None), + ) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) diff --git a/src/tests/api/test_orders.py b/src/tests/api/test_orders.py index 0bacb78cb..eeee63696 100644 --- a/src/tests/api/test_orders.py +++ b/src/tests/api/test_orders.py @@ -2269,6 +2269,29 @@ def test_refund_create(token_client, organizer, event, order): assert r.source == "admin" assert r.info_data == {"foo": "bar"} assert r.payment.local_id == 2 + order.refresh_from_db() + assert order.status == Order.STATUS_PENDING + + +@pytest.mark.django_db +def test_refund_create_mark_refunded(token_client, organizer, event, order): + res = copy.deepcopy(REFUND_CREATE_PAYLOAD) + res['mark_refunded'] = True + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/orders/{}/refunds/'.format( + organizer.slug, event.slug, order.code + ), format='json', data=res + ) + assert resp.status_code == 201 + r = order.refunds.get(local_id=resp.data['local_id']) + assert r.provider == "manual" + assert r.amount == Decimal("23.00") + assert r.state == "created" + assert r.source == "admin" + assert r.info_data == {"foo": "bar"} + assert r.payment.local_id == 2 + order.refresh_from_db() + assert order.status == Order.STATUS_REFUNDED @pytest.mark.django_db