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 } from "lucide-react"; const validateDeliverySchema = z.object({ blNumber: z.string().min(1, "Le numéro de BL est obligatoire"), blAmount: z.string().optional(), }); 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: "", blAmount: "", }, }); const validateDeliveryMutation = useMutation({ mutationFn: async (data: ValidateDeliveryForm) => { const payload: any = { blNumber: data.blNumber, }; if (data.blAmount && data.blAmount.trim() !== '') { payload.blAmount = parseFloat(data.blAmount); } 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 queryClient.invalidateQueries({ queryKey: ['/api/deliveries'] }); // Invalider tous les caches BL/Rapprochement avec toutes les variations de clés 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

{/* 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 * )} /> {/* Montant BL */} ( Montant BL (€) - Optionnel )} /> {/* Actions */}
); }