From 0d65592d757d472eff3c42f8398e40f540c2b0d7 Mon Sep 17 00:00:00 2001 From: Manus Date: Wed, 30 Sep 2026 14:40:01 +0000 Subject: [PATCH] feat: lancer manuellement les imports SFR --- Dockerfile | 1 + client/src/pages/WebImportSources.tsx | 53 ++++++++++- package.json | 1 + pnpm-lock.yaml | 10 ++ server/manualWebImport.test.ts | 28 ++++++ server/manualWebImport.ts | 129 ++++++++++++++++++++++++++ server/routers.ts | 64 ++++++++++++- 7 files changed, 280 insertions(+), 6 deletions(-) create mode 100644 server/manualWebImport.test.ts create mode 100644 server/manualWebImport.ts diff --git a/Dockerfile b/Dockerfile index af31c49..4529523 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,6 +43,7 @@ RUN apt-get update && apt-get install -y \ poppler-utils \ libvips42 \ curl \ + chromium \ && rm -rf /var/lib/apt/lists/* WORKDIR /app diff --git a/client/src/pages/WebImportSources.tsx b/client/src/pages/WebImportSources.tsx index 6245ead..9845a72 100644 --- a/client/src/pages/WebImportSources.tsx +++ b/client/src/pages/WebImportSources.tsx @@ -25,7 +25,7 @@ import { AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; -import { Globe, Plus, Pencil, Trash2, Key, CheckCircle, XCircle, Clock, RefreshCw } from "lucide-react"; +import { Globe, Plus, Pencil, Trash2, Key, CheckCircle, XCircle, Clock, RefreshCw, Play } from "lucide-react"; import { toast } from "sonner"; const CONNECTOR_TYPES = [ @@ -85,6 +85,7 @@ export default function WebImportSources() { const [showForm, setShowForm] = useState(false); const [editSource, setEditSource] = useState(null); const [deleteId, setDeleteId] = useState(null); + const [manualImportId, setManualImportId] = useState(null); const [showToken, setShowToken] = useState(null); const [form, setForm] = useState(emptyForm); @@ -124,6 +125,21 @@ export default function WebImportSources() { onError: (e) => toast.error("Erreur", { description: e.message }), }); + const runManualMutation = trpc.webImportSources.runManual.useMutation({ + onSuccess: (result) => { + toast.success("Import manuel terminé", { + description: `${result.imported} facture(s) importée(s), ${result.duplicates} doublon(s) ignoré(s).`, + }); + setManualImportId(null); + refetch(); + }, + onError: (e) => { + toast.error("Import manuel en erreur", { description: e.message }); + setManualImportId(null); + refetch(); + }, + }); + function openCreate() { setForm(emptyForm); setEditSource(null); @@ -253,6 +269,21 @@ export default function WebImportSources() {
+