import React, { useState, useEffect } 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 { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import { useToast } from "@/hooks/use-toast"; import { apiRequest } from "@/lib/queryClient"; import { safeFormat } from "@/lib/dateUtils"; import { FileText, Settings, Check, X } from "lucide-react"; interface ReconciliationModalProps { isOpen: boolean; onClose: () => void; delivery: any; onSave?: () => void; } export default function ReconciliationModal({ isOpen, onClose, delivery, onSave }: ReconciliationModalProps) { const { toast } = useToast(); const queryClient = useQueryClient(); const [formData, setFormData] = useState({ blNumber: "", invoiceReference: "", invoiceAmount: "", reconciled: false, }); // Initialiser le formulaire avec les données de la livraison useEffect(() => { if (delivery) { setFormData({ blNumber: delivery.blNumber || "", invoiceReference: delivery.invoiceReference || "", invoiceAmount: delivery.invoiceAmount || "", reconciled: delivery.reconciled || false, }); } }, [delivery]); const updateDeliveryMutation = useMutation({ mutationFn: async (data: any) => { console.log('Sending update for delivery:', delivery?.id, 'with data:', data); const response = await apiRequest(`/api/deliveries/${delivery?.id}`, "PUT", data); console.log('Update response:', response); return response; }, onSuccess: () => { toast({ title: "Succès", description: "Données de rapprochement mises à jour avec succès", }); queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); queryClient.invalidateQueries({ queryKey: ['/api/deliveries'] }); if (onSave) onSave(); onClose(); }, onError: (error: any) => { console.error('Update error:', error); toast({ title: "Erreur", description: `Impossible de mettre à jour les données: ${error?.message || 'Erreur inconnue'}`, variant: "destructive", }); } }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); updateDeliveryMutation.mutate({ blNumber: formData.blNumber.trim() || null, invoiceReference: formData.invoiceReference.trim() || null, invoiceAmount: formData.invoiceAmount ? formData.invoiceAmount.toString() : null, }); }; const isAutomaticMode = delivery?.supplier?.automaticReconciliation; return ( {isAutomaticMode ? ( ) : ( )} Rapprochement {isAutomaticMode ? 'Automatique' : 'Manuel'} {isAutomaticMode ? "AUTO" : "MANUEL"}
{/* Informations de la livraison */}

Informations de la livraison

Fournisseur :
{delivery?.supplier?.name}
Date prévue :
{safeFormat(delivery?.scheduledDate, 'dd/MM/yyyy')}
Magasin :
{delivery?.group?.name}
Statut : {delivery?.reconciled ? "Rapproché" : "En attente"}
{/* Formulaire de rapprochement */}
{/* Données BL */}

Bon de Livraison (BL)

setFormData(prev => ({ ...prev, blNumber: e.target.value }))} placeholder="Ex: BL-2025-001 (optionnel)" />
{/* Données Facture */}

Facture

setFormData(prev => ({ ...prev, invoiceReference: e.target.value }))} placeholder="Ex: FAC-2025-001" />
setFormData(prev => ({ ...prev, invoiceAmount: e.target.value }))} placeholder="0.00" />
{/* Actions */}
{/* Note d'aide */}
Note : Tous les champs sont optionnels. Les données BL et facture sont recommandées pour un suivi précis mais pas obligatoires.
); }