diff --git a/client/src/pages/BapHistory.tsx b/client/src/pages/BapHistory.tsx index 9556686..28d663d 100644 --- a/client/src/pages/BapHistory.tsx +++ b/client/src/pages/BapHistory.tsx @@ -19,8 +19,21 @@ import { Building2, User, FileText, + Download, } from "lucide-react"; +// Helper : télécharge un PDF annoté BAP depuis son URL de stockage +function downloadBapPdf(pdfUrl: string, supplierName?: string | null) { + const filename = pdfUrl.split('/').pop() || 'BAP.pdf'; + const downloadUrl = `/api/download-bap/${filename}`; + const a = document.createElement('a'); + a.href = downloadUrl; + a.download = supplierName ? `BAP_${supplierName.replace(/[^a-zA-Z0-9]/g, '_')}.pdf` : filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); +} + export default function BapHistory() { const { data: entries, isLoading, refetch } = trpc.bapHistory.getAll.useQuery(); const deleteMutation = trpc.bapHistory.delete.useMutation(); @@ -236,15 +249,27 @@ export default function BapHistory() { {entry.exportMode === "browser" && entry.pdfUrl ? ( - +
+ + +
) : entry.exportMode === "folder" && entry.exportPath ? (
diff --git a/client/src/pages/InvoicesBAP.tsx b/client/src/pages/InvoicesBAP.tsx index 2370756..8038ade 100644 --- a/client/src/pages/InvoicesBAP.tsx +++ b/client/src/pages/InvoicesBAP.tsx @@ -33,6 +33,18 @@ import { } from "@/components/ui/table"; import { trpc } from "@/lib/trpc"; import { Search, FileText, Download, FileSpreadsheet, Trash2, Edit, Trash, CheckCircle, CheckCircle2, ShieldCheck } from "lucide-react"; + +// Helper : télécharge un PDF annoté BAP depuis son URL de stockage +function downloadBapPdf(pdfUrl: string, supplierName?: string) { + const filename = pdfUrl.split('/').pop() || 'BAP.pdf'; + const downloadUrl = `/api/download-bap/${filename}`; + const a = document.createElement('a'); + a.href = downloadUrl; + a.download = supplierName ? `BAP_${supplierName.replace(/[^a-zA-Z0-9]/g, '_')}.pdf` : filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); +} import * as XLSX from 'xlsx'; import { toast } from "sonner"; import { useLocation } from "wouter"; @@ -65,6 +77,8 @@ export default function InvoicesBAP() { const [addDialogType, setAddDialogType] = useState<"service" | "ventilation" | null>(null); const [newItemName, setNewItemName] = useState(""); const [pendingInvoiceId, setPendingInvoiceId] = useState(null); + // Map invoiceId -> pdfUrl après validation BAP (pour bouton téléchargement) + const [bapPdfUrls, setBapPdfUrls] = useState>({}); const [textDialogOpen, setTextDialogOpen] = useState(false); const [selectedInvoiceText, setSelectedInvoiceText] = useState(null); const { data: allInvoices, isLoading } = trpc.invoices.list.useQuery(); @@ -151,6 +165,10 @@ export default function InvoicesBAP() { const validateBAPMutation = trpc.invoices.validateBAP.useMutation({ onSuccess: (data) => { + // Stocker le pdfUrl pour le bouton téléchargement + if (data.invoiceId && data.pdfUrl) { + setBapPdfUrls(prev => ({ ...prev, [data.invoiceId as number]: data.pdfUrl as string })); + } if (data.exportMode === 'browser' && data.pdfUrl) { toast.success("Facture validée BAP ! Ouverture du PDF annoté...", { duration: 3000 }); window.open(data.pdfUrl, '_blank'); @@ -679,12 +697,25 @@ export default function InvoicesBAP() { {invoice.bapValidated === 1 ? ( -
- - Validé +
+
+ + Validé +
+ {bapPdfUrls[invoice.id] && ( + + )}
) : (