import { useState } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { useToast } from "@/hooks/use-toast"; import { apiRequest } from "@/lib/queryClient"; import { isUnauthorizedError } from "@/lib/authUtils"; import { Check, X, AlertTriangle } from "lucide-react"; const validateDeliverySchema = z.object({ blNumber: z.string().min(1, "Le numéro de bon de livraison est obligatoire"), }); type ValidateDeliveryForm = z.infer; interface ValidateDeliveryModalProps { isOpen: boolean; onClose: () => void; delivery: any; onValidated?: () => void; // Callback pour fermer le modal parent } export default function ValidateDeliveryModal({ isOpen, onClose, delivery, onValidated, }: ValidateDeliveryModalProps) { const { toast } = useToast(); const queryClient = useQueryClient(); const form = useForm({ resolver: zodResolver(validateDeliverySchema), defaultValues: { blNumber: "", }, }); const validateDeliveryMutation = useMutation({ mutationFn: async (data: ValidateDeliveryForm) => { const payload = { blNumber: data.blNumber.trim() }; await apiRequest(`/api/deliveries/${delivery.id}/validate`, "POST", payload); }, onSuccess: () => { toast({ title: "Succès", description: "Livraison validée avec succès", }); // Invalider tous les caches liés aux livraisons et les caches BL/Rapprochement // avec toutes les variations de clés, en un seul appel (un second appel sur // ['/api/deliveries'] relançait le chargement des listes affichées) queryClient.invalidateQueries({ predicate: (query) => query.queryKey[0] === '/api/deliveries/bl' || query.queryKey[0] === '/api/deliveries' }); queryClient.invalidateQueries({ queryKey: ['/api/orders'] }); queryClient.invalidateQueries({ queryKey: ['/api/stats/monthly'] }); form.reset(); onClose(); // Fermer aussi le modal parent si fourni if (onValidated) { onValidated(); } }, 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 onSubmit = (data: ValidateDeliveryForm) => { validateDeliveryMutation.mutate(data); }; if (!delivery) return null; return ( Valider la livraison

Saisir les informations du bon de livraison

{/* Alerte si le fournisseur nécessite un contrôle */} {delivery.supplier?.requiresControl && (

⚠️ Contrôle à effectuer sur cette livraison

Ce fournisseur nécessite un contrôle qualité lors de la réception de la livraison.

)}
{/* Informations de la livraison */}

Détails de la livraison

Fournisseur: {delivery.supplier?.name}

Magasin: {delivery.group?.name}

Quantité: {delivery.quantity} {delivery.unit === 'palettes' ? 'Palettes' : 'Colis'}

{/* Numéro de BL */} ( N° Bon de Livraison * )} /> {/* Actions */}
); }