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
@@ -429,8 +433,6 @@ def check_permissions(self, request):
429
433
status = request .data .get ('status' )
430
434
user = request .user
431
435
432
- print (status , 'status' )
433
-
434
436
permission_map = {
435
437
OrderStatus .CANCELLED : PermissionsEnum .CAN_CANCEL_ORDER ,
436
438
OrderStatus .SHIPPED : PermissionsEnum .CAN_SHIP_ORDER ,
@@ -440,14 +442,42 @@ def check_permissions(self, request):
440
442
}
441
443
442
444
required_permission = permission_map .get (status )
443
- print (required_permission , 'required_permission' )
444
445
if required_permission and not has_required_perm (user , required_permission , Order ):
445
446
self .permission_denied (
446
447
request ,
447
448
message = _ ("You do not have permission to perform this action." ),
448
449
code = 'permission_denied'
449
450
)
450
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
+
451
481
class OrderPaymentTermUpdateAPIView (generics .UpdateAPIView ):
452
482
model = Order
453
483
permission_classes = (GranularPermission , )
0 commit comments