From 76554214b2925f4f9b01904ea2755be92d73f3db Mon Sep 17 00:00:00 2001 From: Manus Date: Sun, 12 Apr 2026 09:40:33 -0400 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Ajout=20du=20bouton=20"Valider=20?= =?UTF-8?q?tout=20en=20BAP"=20sur=20la=20fen=C3=AAtre=20Factures=20BAP=20:?= =?UTF-8?q?=20route=20validateBAPBulk=20c=C3=B4t=C3=A9=20serveur=20(traite?= =?UTF-8?q?ment=20de=20toutes=20les=20factures=20=C3=A9ligibles=20en=20une?= =?UTF-8?q?=20passe),=20mutation=20c=C3=B4t=C3=A9=20client=20avec=20ouvert?= =?UTF-8?q?ure=20des=20PDFs=20g=C3=A9n=C3=A9r=C3=A9s,=20bouton=20vert=20da?= =?UTF-8?q?ns=20le=20header=20de=20la=20page.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pages/InvoicesBAP.tsx | 32 +++++- server/routers.ts | 171 ++++++++++++++++++++++++++++++- todo.md | 14 +++ 3 files changed, 211 insertions(+), 6 deletions(-) diff --git a/client/src/pages/InvoicesBAP.tsx b/client/src/pages/InvoicesBAP.tsx index 3a28b67..2370756 100644 --- a/client/src/pages/InvoicesBAP.tsx +++ b/client/src/pages/InvoicesBAP.tsx @@ -32,7 +32,7 @@ import { TableRow, } from "@/components/ui/table"; import { trpc } from "@/lib/trpc"; -import { Search, FileText, Download, FileSpreadsheet, Trash2, Edit, Trash, CheckCircle, CheckCircle2 } from "lucide-react"; +import { Search, FileText, Download, FileSpreadsheet, Trash2, Edit, Trash, CheckCircle, CheckCircle2, ShieldCheck } from "lucide-react"; import * as XLSX from 'xlsx'; import { toast } from "sonner"; import { useLocation } from "wouter"; @@ -131,6 +131,24 @@ export default function InvoicesBAP() { }, }); + const validateBAPBulkMutation = trpc.invoices.validateBAPBulk.useMutation({ + onSuccess: (data) => { + if (data.processed === 0) { + toast.info("Aucune facture éligible à valider en BAP."); + } else { + toast.success(`${data.processed} facture(s) validée(s) BAP avec succès !`, { duration: 4000 }); + const pdfUrls = (data.results as any[]).filter(r => r.pdfUrl).map(r => r.pdfUrl as string); + if (pdfUrls.length > 0) { + pdfUrls.forEach(url => window.open(url, '_blank')); + } + } + utils.invoices.list.invalidate(); + }, + onError: (error) => { + toast.error(error.message || "Erreur lors de la validation BAP en masse"); + }, + }); + const validateBAPMutation = trpc.invoices.validateBAP.useMutation({ onSuccess: (data) => { if (data.exportMode === 'browser' && data.pdfUrl) { @@ -403,6 +421,18 @@ export default function InvoicesBAP() { Supprimer ({selectedIds.length}) +