import { useState, useEffect } from "react"; import { useParams, useLocation } from "wouter"; import DashboardLayout from "@/components/DashboardLayout"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; 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 { trpc } from "@/lib/trpc"; import { ArrowLeft, Save, FileText } from "lucide-react"; import { toast } from "sonner"; export default function InvoiceDetail() { const { id } = useParams<{ id: string }>(); const [, setLocation] = useLocation(); const invoiceId = parseInt(id || "0"); const { data: invoice, isLoading } = trpc.invoices.getById.useQuery({ id: invoiceId }); const { data: departments } = trpc.departments.getByUser.useQuery(); const { data: allocations } = trpc.accountingAllocations.getByUser.useQuery(); const utils = trpc.useUtils(); const [isEditing, setIsEditing] = useState(false); const [formData, setFormData] = useState({ supplierName: "", invoiceNumber: "", invoiceDate: "", deliveryNoteNumber: "", orderNumber: "", totalAmount: "", recipientName: "", serviceConcerne: "", typeAchat: "", ventilationComptable: "", }); // Initialize form data when invoice loads useEffect(() => { if (invoice) { setFormData({ supplierName: invoice.supplierName || "", invoiceNumber: invoice.invoiceNumber || "", invoiceDate: invoice.invoiceDate ? new Date(invoice.invoiceDate).toISOString().split('T')[0] : "", deliveryNoteNumber: invoice.deliveryNoteNumber || "", orderNumber: invoice.orderNumber || "", totalAmount: invoice.totalAmount ? invoice.totalAmount.toString() : "", recipientName: (invoice as any).recipientName || "", serviceConcerne: invoice.serviceConcerne || "", typeAchat: invoice.typeAchat || "", ventilationComptable: invoice.ventilationComptable || "", }); } }, [invoice]); const upsertLearningMutation = trpc.learnings.upsert.useMutation(); const updateMutation = trpc.invoices.update.useMutation({ onSuccess: () => { toast.success("Facture mise à jour avec succès"); setIsEditing(false); utils.invoices.getById.invalidate({ id: invoiceId }); utils.invoices.list.invalidate(); }, onError: (error) => { toast.error(error.message || "Erreur lors de la mise à jour"); }, }); const handleSave = () => { // Calculate new quality score based on filled fields let filledFields = 0; let totalFields = 6; if (formData.supplierName) filledFields++; if (formData.invoiceNumber) filledFields++; if (formData.invoiceDate) filledFields++; if (formData.deliveryNoteNumber) filledFields++; if (formData.orderNumber) filledFields++; if (formData.totalAmount) filledFields++; const newQualityScore = Math.round((filledFields / totalFields) * 100); // Apprentissage : enregistrer les corrections manuelles sur les champs clés // On compare les valeurs actuelles (invoice) avec les nouvelles valeurs (formData) if (invoice && formData.supplierName) { const supplierName = formData.supplierName || invoice.supplierName || ""; if (!supplierName) return; // isSubscription : géré séparément via le toggle dans InvoicesBAP // typeAchat if (formData.typeAchat !== (invoice.typeAchat || "")) { upsertLearningMutation.mutate({ supplierName, fieldName: "typeAchat", originalValue: invoice.typeAchat || undefined, correctedValue: formData.typeAchat, }); } // serviceConcerne if (formData.serviceConcerne !== (invoice.serviceConcerne || "")) { upsertLearningMutation.mutate({ supplierName, fieldName: "serviceConcerne", originalValue: invoice.serviceConcerne || undefined, correctedValue: formData.serviceConcerne, }); } // ventilationComptable if (formData.ventilationComptable !== (invoice.ventilationComptable || "")) { upsertLearningMutation.mutate({ supplierName, fieldName: "ventilationComptable", originalValue: invoice.ventilationComptable || undefined, correctedValue: formData.ventilationComptable, }); } } updateMutation.mutate({ id: invoiceId, data: { supplierName: formData.supplierName || undefined, invoiceNumber: formData.invoiceNumber || undefined, invoiceDate: formData.invoiceDate ? new Date(formData.invoiceDate) : undefined, deliveryNoteNumber: formData.deliveryNoteNumber || undefined, orderNumber: formData.orderNumber || undefined, totalAmount: formData.totalAmount ? formData.totalAmount : undefined, recipientName: formData.recipientName || undefined, serviceConcerne: formData.serviceConcerne || undefined, typeAchat: (formData.typeAchat as "CAPEX" | "OPEX" | "") || undefined, ventilationComptable: formData.ventilationComptable || undefined, }, }); }; const getStatusBadge = (status: string) => { switch (status) { case "exported": return Exporté; case "not_exported": return Non exporté; case "export_error": return Erreur export; default: return {status}; } }; const getQualityBadge = (score: number | null) => { if (score === null) return -; if (score === 100) return {score}%; if (score >= 80) return {score}%; return {score}%; }; if (isLoading) { return (
Chargement...
); } if (!invoice) { return (

Facture introuvable

Cette facture n'existe pas ou a été supprimée

); } return (
{/* Header */}

Détail de la facture

{invoice.supplierName || "Fournisseur inconnu"} • {invoice.invoiceNumber || "N° inconnu"}

{isEditing ? ( <> ) : ( )}
{/* Left column - PDF Viewer */}
Aperçu du document Fichier PDF de la facture