from rest_framework import status from rest_framework.decorators import api_view, permission_classes from rest_framework.response import Response from crm.permissions import IsCRMAdmin from seller_models.models import SupplierProfile, Product from crm.models import AuditLog from crm.serializers import SupplierProfileSerializer, ProductSerializer from crm.services.whatsapp_service import WhatsAppService from django.utils import timezone whatsapp_service = WhatsAppService() def log_action(admin, action, target_id, details): AuditLog.objects.create( admin=admin, action=action, target_type='seller', target_id=target_id, details=details ) @api_view(['GET']) @permission_classes([IsCRMAdmin]) def list_sellers(request): sellers = SupplierProfile.objects.all() status_filter = request.query_params.get('status') if status_filter: sellers = sellers.filter(status=status_filter) serializer = SupplierProfileSerializer(sellers, many=True) return Response(serializer.data) @api_view(['GET']) @permission_classes([IsCRMAdmin]) def get_seller_detail(request, pk): try: seller = SupplierProfile.objects.get(pk=pk) except SupplierProfile.DoesNotExist: return Response({"detail": "Seller not found"}, status=404) serializer = SupplierProfileSerializer(seller) return Response(serializer.data) @api_view(['GET']) @permission_classes([IsCRMAdmin]) def get_seller_documents(request, pk): # Mocking returning presigned document URLs docs = [ {"type": "Aadhar Card", "filename": "aadhar_back_front.pdf", "url": "https://digihox-kyc-bucket.s3.ap-south-2.amazonaws.com/aadhar.pdf?token=presigned123"}, {"type": "PAN Card", "filename": "pan_card_copy.jpg", "url": "https://digihox-kyc-bucket.s3.ap-south-2.amazonaws.com/pan.jpg?token=presigned123"}, {"type": "GSTIN Certificate", "filename": "gst_cert_2026.pdf", "url": "https://digihox-kyc-bucket.s3.ap-south-2.amazonaws.com/gst.pdf?token=presigned123"} ] return Response(docs) @api_view(['POST']) @permission_classes([IsCRMAdmin]) def approve_seller(request, pk): try: seller = SupplierProfile.objects.get(pk=pk) except SupplierProfile.DoesNotExist: return Response({"detail": "Seller not found"}, status=404) old_status = seller.status seller.status = 'approved' seller.save() log_action(request.user, 'approve_seller', seller.id, {"old_status": old_status, "new_status": "approved"}) whatsapp_service.send_template_alert(seller.phone, "seller_approved", {"name": seller.name}) return Response({"message": f"Seller {seller.name} approved successfully"}) @api_view(['POST']) @permission_classes([IsCRMAdmin]) def reject_seller(request, pk): reason = request.data.get('reason', 'Documents validation failed') try: seller = SupplierProfile.objects.get(pk=pk) except SupplierProfile.DoesNotExist: return Response({"detail": "Seller not found"}, status=404) old_status = seller.status seller.status = 'rejected' seller.save() log_action(request.user, 'reject_seller', seller.id, {"old_status": old_status, "new_status": "rejected", "reason": reason}) whatsapp_service.send_template_alert(seller.phone, "seller_rejected", {"name": seller.name, "reason": reason}) return Response({"message": f"Seller {seller.name} rejected successfully"}) @api_view(['POST']) @permission_classes([IsCRMAdmin]) def suspend_seller(request, pk): reason = request.data.get('reason', 'Policy violation') try: seller = SupplierProfile.objects.get(pk=pk) except SupplierProfile.DoesNotExist: return Response({"detail": "Seller not found"}, status=404) old_status = seller.status seller.status = 'suspended' seller.save() log_action(request.user, 'suspend_seller', seller.id, {"old_status": old_status, "new_status": "suspended", "reason": reason}) whatsapp_service.send_template_alert(seller.phone, "seller_suspended", {"name": seller.name, "reason": reason}) return Response({"message": f"Seller {seller.name} suspended successfully"}) @api_view(['POST']) @permission_classes([IsCRMAdmin]) def reinstate_seller(request, pk): try: seller = SupplierProfile.objects.get(pk=pk) except SupplierProfile.DoesNotExist: return Response({"detail": "Seller not found"}, status=404) old_status = seller.status seller.status = 'approved' seller.save() log_action(request.user, 'reinstate_seller', seller.id, {"old_status": old_status, "new_status": "approved"}) whatsapp_service.send_template_alert(seller.phone, "seller_reinstated", {"name": seller.name}) return Response({"message": f"Seller {seller.name} reinstated successfully"}) @api_view(['POST']) @permission_classes([IsCRMAdmin]) def reset_seller_password(request, pk): try: seller = SupplierProfile.objects.get(pk=pk) except SupplierProfile.DoesNotExist: return Response({"detail": "Seller not found"}, status=404) # Trigger password reset flow whatsapp_service.send_otp(seller.phone, otp_type="password_reset") log_action(request.user, 'reset_password', seller.id, {"email": seller.email}) return Response({"message": "Password reset alert successfully dispatched"})