import { useState } from "react"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { useAuthUnified } from "@/hooks/useAuthUnified"; import { useToast } from "@/hooks/use-toast"; import { apiRequest } from "@/lib/queryClient"; import { isUnauthorizedError } from "@/lib/authUtils"; import { safeFormat } from "@/lib/dateUtils"; import EditOrderModal from "./EditOrderModal"; import EditDeliveryModal from "./EditDeliveryModal"; import ValidateDeliveryModal from "./ValidateDeliveryModal"; import { Package, Truck, Edit, Trash2, Check, X, CheckCircle } from "lucide-react"; interface OrderDetailModalProps { isOpen: boolean; onClose: () => void; item: any; } export default function OrderDetailModal({ isOpen, onClose, item, }: OrderDetailModalProps) { const { user } = useAuthUnified(); const { toast } = useToast(); const queryClient = useQueryClient(); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const [showEditModal, setShowEditModal] = useState(false); const isOrder = item?.type === 'order'; const isDelivery = item?.type === 'delivery'; const validateOrderMutation = useMutation({ mutationFn: async (orderId: number) => { await apiRequest(`/api/orders/${orderId}`, "PUT", { status: 'delivered' }); }, onSuccess: () => { toast({ title: "Succès", description: "Commande validée avec succès", }); queryClient.invalidateQueries({ queryKey: ['/api/orders'] }); queryClient.invalidateQueries({ queryKey: ['/api/deliveries'] }); onClose(); }, onError: (error) => { if (isUnauthorizedError(error)) { toast({ title: "Non autorisé", description: "Vous êtes déconnecté. Reconnexion...", variant: "destructive", }); setTimeout(() => { window.location.href = "/api/login"; }, 500); return; } toast({ title: "Erreur", description: "Impossible de valider la commande", variant: "destructive", }); }, }); const validateDeliveryMutation = useMutation({ mutationFn: async (data: { id: number; blNumber: string; blAmount: number }) => { await apiRequest(`/api/deliveries/${data.id}/validate`, "POST", data); }, onSuccess: () => { toast({ title: "Succès", description: "Livraison validée avec succès", }); queryClient.invalidateQueries({ queryKey: ['/api/deliveries'] }); queryClient.invalidateQueries({ queryKey: ['/api/orders'] }); onClose(); }, onError: (error) => { if (isUnauthorizedError(error)) { toast({ title: "Non autorisé", description: "Vous êtes déconnecté. Reconnexion...", variant: "destructive", }); setTimeout(() => { window.location.href = "/api/login"; }, 500); return; } toast({ title: "Erreur", description: "Impossible de valider la livraison", variant: "destructive", }); }, }); const deleteMutation = useMutation({ mutationFn: async (id: number) => { const endpoint = isOrder ? `/api/orders/${id}` : `/api/deliveries/${id}`; console.log(`🗑️ Deleting ${isOrder ? 'order' : 'delivery'}:`, id); await apiRequest(endpoint, "DELETE"); }, onSuccess: () => { console.log(`✅ ${isOrder ? 'Order' : 'Delivery'} deleted successfully, clearing cache...`); toast({ title: "Succès", description: `${isOrder ? 'Commande' : 'Livraison'} supprimée avec succès`, }); // SOLUTION PRODUCTION : Cache clearing radical pour éviter incohérences storeId console.log('🗑️ Cache cleared, forcing page reload to maintain storeId consistency...'); // SOLUTION HYBRIDE : Invalidation sélective pour éviter perte storeId console.log('🧹 Using selective invalidation to preserve storeId context...'); // Invalidation ciblée sans clear() pour préserver le contexte queryClient.invalidateQueries({ predicate: (query) => { const key = query.queryKey[0]?.toString() || ''; return key.includes('/api/orders') || key.includes('/api/deliveries'); } }); // Force refetch pour garantir synchronisation immédiate queryClient.refetchQueries({ predicate: (query) => { const key = query.queryKey[0]?.toString() || ''; return key.includes('/api/orders') || key.includes('/api/deliveries'); } }); onClose(); }, onError: (error) => { if (isUnauthorizedError(error)) { toast({ title: "Non autorisé", description: "Vous êtes déconnecté. Reconnexion...", variant: "destructive", }); setTimeout(() => { window.location.href = "/api/login"; }, 500); return; } toast({ title: "Erreur", description: `Impossible de supprimer la ${isOrder ? 'commande' : 'livraison'}`, variant: "destructive", }); }, }); const [showValidateModal, setShowValidateModal] = useState(false); const handleValidateDelivery = () => { setShowValidateModal(true); }; const handleDelete = () => { if (item.id) { deleteMutation.mutate(item.id); } }; const handleEdit = () => { setShowEditModal(true); }; const canEdit = permissions.canEdit(isOrder ? 'orders' : 'deliveries'); const canDelete = permissions.canDelete(isOrder ? 'orders' : 'deliveries'); const canValidate = (user?.role === 'admin' || user?.role === 'directeur' || user?.role === 'manager') && isDelivery && item.status !== 'delivered'; const getStatusBadge = (status: string) => { switch (status) { case 'pending': return En attente; case 'planned': return Planifié; case 'delivered': return Livré; default: return {status}; } }; const formatQuantity = (quantity: number, unit: string) => { return `${quantity} ${unit === 'palettes' ? 'Palettes' : 'Colis'}`; }; if (!item) return null; return ( <> {/* Header */}
{isOrder ? ( ) : ( )}
Détails de la {isOrder ? 'Commande' : 'Livraison'}

#{isOrder ? 'CMD' : 'LIV'}-{item.id}

Affichage détaillé de {isOrder ? 'la commande' : 'la livraison'} avec options de gestion

{/* Content */}
{/* Status */}
{getStatusBadge(item.status)}
{/* Information Grid */}
{/* Left Column */}

{item.supplier?.name}

{safeFormat(isDelivery ? item.scheduledDate : item.plannedDate, 'dd MMMM yyyy')}

{/* Afficher la quantité seulement pour les livraisons */} {isDelivery && (
{formatQuantity(item.quantity, item.unit)}
)}
{/* Right Column */}
{item.group?.name}
{item.deliveredDate && (

{safeFormat(item.deliveredDate, 'dd MMMM yyyy, HH:mm')}

)}

{item.creator?.firstName} {item.creator?.lastName}

{/* Comments */} {item.notes && (

{item.notes}

)} {/* Linked Items */} {isOrder && item.deliveries && item.deliveries.length > 0 && (
{item.deliveries.map((delivery: any) => (

#LIV-{delivery.id}

{delivery.status === 'delivered' && delivery.deliveredDate ? `Livré le ${safeFormat(delivery.deliveredDate, 'dd MMMM yyyy')}` : delivery.scheduledDate ? `Prévu le ${safeFormat(delivery.scheduledDate, 'dd MMMM yyyy')}` : 'Date non disponible' }

{getStatusBadge(delivery.status)}
))}
)} {isDelivery && item.order && (

#CMD-{item.order.id}

{safeFormat(item.order.plannedDate, 'dd MMMM yyyy')}

{getStatusBadge(item.order.status)}
)}
{/* Actions */}
{canDelete && ( )}
{canEdit && ( )} {/* Bouton de validation pour les commandes (admin seulement) */} {isOrder && user?.role === 'admin' && item?.status !== 'delivered' && ( )} {canValidate && ( )}
{/* Delete Confirmation */} {showDeleteConfirm && (

Confirmer la suppression

Êtes-vous sûr de vouloir supprimer cette {isOrder ? 'commande' : 'livraison'} ? Cette action est irréversible.

)}
{/* Edit Modals */} {showEditModal && isOrder && ( setShowEditModal(false)} order={item} /> )} {showEditModal && isDelivery && ( setShowEditModal(false)} delivery={item} /> )} {/* Validate Delivery Modal */} {showValidateModal && isDelivery && ( setShowValidateModal(false)} delivery={item} onValidated={onClose} // Fermer le modal de détail après validation /> )} ); }