|
9 | 9 |
|
10 | 10 | from rest_framework.views import APIView
|
11 | 11 | from django.db.models import Sum, Count, F
|
| 12 | +from django.db import transaction |
12 | 13 | from django.db.models.functions import TruncMonth, TruncDay, TruncWeek, TruncHour
|
13 | 14 |
|
14 | 15 | from django.utils import timezone
|
|
40 | 41 |
|
41 | 42 | from calendar import monthrange, day_name
|
42 | 43 | from nxtbn.warehouse.utils import adjust_stocks_returned_items
|
| 44 | +from nxtbn.warehouse.utils import deduct_reservation_on_packed_for_dispatch, release_stock |
| 45 | +from nxtbn.order import OrderStockReservationStatus, ReturnReceiveStatus |
| 46 | + |
43 | 47 |
|
44 | 48 |
|
45 | 49 |
|
@@ -445,6 +449,35 @@ def check_permissions(self, request):
|
445 | 449 | code='permission_denied'
|
446 | 450 | )
|
447 | 451 |
|
| 452 | +class OrderMarkAsFullfiledAPIView(generics.GenericAPIView): |
| 453 | + queryset = Order.objects.all() |
| 454 | + serializer_class = OrderStatusUpdateSerializer |
| 455 | + permission_classes = (GranularPermission, ) |
| 456 | + required_perm = PermissionsEnum.CAN_FULLFILL_ORDER |
| 457 | + |
| 458 | + def patch(self, request, *args, **kwargs): |
| 459 | + with transaction.atomic(): |
| 460 | + instance = Order.objects.get(alias=kwargs['alias']) |
| 461 | + |
| 462 | + if instance.status == OrderStatus.DELIVERED: |
| 463 | + raise ValidationError("Order is already marked as fulfilled.") |
| 464 | + |
| 465 | + if instance.status == OrderStatus.CANCELLED: |
| 466 | + raise ValidationError("Cannot mark a cancelled order as fulfilled.") |
| 467 | + |
| 468 | + if instance.status == OrderStatus.RETURNED: |
| 469 | + raise ValidationError("Cannot mark a returned order as fulfilled.") |
| 470 | + |
| 471 | + # Now check stock and reservation |
| 472 | + if instance.reservation_status == OrderStockReservationStatus.DISPATCHED: # do nothing if already dispatched |
| 473 | + pass |
| 474 | + else: |
| 475 | + deduct_reservation_on_packed_for_dispatch(instance) |
| 476 | + |
| 477 | + instance.status = OrderStatus.DELIVERED |
| 478 | + instance.save() |
| 479 | + return Response({"message": "Order marked as fulfilled."}, status=status.HTTP_200_OK) |
| 480 | + |
448 | 481 | class OrderPaymentTermUpdateAPIView(generics.UpdateAPIView):
|
449 | 482 | model = Order
|
450 | 483 | permission_classes = (GranularPermission, )
|
|
0 commit comments