Checkpoint: Ajout route tRPC invoices.reprocessSelected et bouton Relancer (violet) dans la barre d'outils de Factures BAP

This commit is contained in:
Manus
2026-04-12 14:20:05 -04:00
parent e9c727d679
commit 8acfb4eae1
2 changed files with 133 additions and 1 deletions

View File

@@ -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, ShieldCheck } from "lucide-react";
import { Search, FileText, Download, FileSpreadsheet, Trash2, Edit, Trash, CheckCircle, CheckCircle2, ShieldCheck, RefreshCw } from "lucide-react";
// Helper : télécharge un PDF annoté BAP depuis son URL de stockage
// Nommage : AAAA-MM-JJ - Fournisseur - N°Facture.pdf
@@ -158,6 +158,21 @@ export default function InvoicesBAP() {
},
});
const reprocessMutation = trpc.invoices.reprocessSelected.useMutation({
onSuccess: (data) => {
if (data.errors > 0) {
toast.warning(`${data.processed} facture(s) retraitée(s), ${data.errors} erreur(s).`, { duration: 5000 });
} else {
toast.success(`${data.processed} facture(s) retraitée(s) avec succès !`, { duration: 4000 });
}
setSelectedIds([]);
utils.invoices.list.invalidate();
},
onError: (error) => {
toast.error(error.message || "Erreur lors du retraitement");
},
});
const validateBAPBulkMutation = trpc.invoices.validateBAPBulk.useMutation({
onSuccess: (data) => {
if (data.processed === 0) {
@@ -464,6 +479,23 @@ export default function InvoicesBAP() {
<ShieldCheck className="w-4 h-4 mr-2" />
{validateBAPBulkMutation.isPending ? "Validation en cours..." : "Valider tout en BAP"}
</Button>
<Button
onClick={() => {
if (selectedIds.length === 0) {
toast.error("Veuillez sélectionner au moins une facture");
return;
}
if (confirm(`Relancer l'analyse IA et les automatismes sur ${selectedIds.length} facture(s) sélectionnée(s) ?\nCela peut prendre quelques secondes par facture.`)) {
reprocessMutation.mutate({ invoiceIds: selectedIds });
}
}}
disabled={selectedIds.length === 0 || reprocessMutation.isPending}
variant="outline"
className="border-purple-500 text-purple-600 hover:bg-purple-50"
>
<RefreshCw className={`w-4 h-4 mr-2 ${reprocessMutation.isPending ? 'animate-spin' : ''}`} />
{reprocessMutation.isPending ? `Retraitement...` : `Relancer (${selectedIds.length})`}
</Button>
<Button onClick={() => setLocation("/upload")}>
<FileText className="w-4 h-4 mr-2" />
Importer