From 604426523d42742bcf242fa4620daee2e916cdce Mon Sep 17 00:00:00 2001 From: Manus Date: Sun, 12 Apr 2026 05:06:06 -0400 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Ajout=20complet=20du=20champ=20"D?= =?UTF-8?q?estinataire"=20(recipientName)=20dans=20toute=20l'application?= =?UTF-8?q?=20:=20sch=C3=A9ma=20DB=20(invoices.recipientName=20+=20userSet?= =?UTF-8?q?tings.recipientKeywords),=20extraction=20IA=20(prompt=20LLM=20+?= =?UTF-8?q?=20interface),=20services=20d'import=20(email,=20dossier,=20upl?= =?UTF-8?q?oad=20manuel),=20interface=20utilisateur=20(liste=20des=20factu?= =?UTF-8?q?res,=20d=C3=A9tail,=20param=C3=A8tres=20mots-cl=C3=A9s),=20r?= =?UTF-8?q?=C3=A8gles=20d'automatisme=20et=20configuration=20des=20champs?= =?UTF-8?q?=20LLM=20obligatoires.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pages/AutomationRules.tsx | 1 + client/src/pages/InvoiceDetail.tsx | 17 + client/src/pages/Invoices.tsx | 13 +- client/src/pages/Settings.tsx | 21 + drizzle/0015_cool_redwing.sql | 2 + drizzle/meta/0015_snapshot.json | 1464 ++++++++++++++++++++++++++ drizzle/meta/_journal.json | 7 + drizzle/schema.ts | 2 + server/db.ts | 1 + server/emailImportService.ts | 2 + server/folderImportService.ts | 2 + server/invoiceExtractor.ts | 8 +- server/routers.ts | 4 + todo.md | 23 +- 14 files changed, 1560 insertions(+), 7 deletions(-) create mode 100644 drizzle/0015_cool_redwing.sql create mode 100644 drizzle/meta/0015_snapshot.json diff --git a/client/src/pages/AutomationRules.tsx b/client/src/pages/AutomationRules.tsx index d923483..4b5d986 100644 --- a/client/src/pages/AutomationRules.tsx +++ b/client/src/pages/AutomationRules.tsx @@ -237,6 +237,7 @@ export default function AutomationRules() { const fieldOptions = [ { value: "supplierName", label: "Fournisseur" }, + { value: "recipientName", label: "Destinataire" }, { value: "invoiceNumber", label: "N° Facture" }, { value: "totalAmount", label: "Montant" }, { value: "invoiceDate", label: "Date facture" }, diff --git a/client/src/pages/InvoiceDetail.tsx b/client/src/pages/InvoiceDetail.tsx index 38fa57c..b858f5c 100644 --- a/client/src/pages/InvoiceDetail.tsx +++ b/client/src/pages/InvoiceDetail.tsx @@ -28,6 +28,7 @@ export default function InvoiceDetail() { deliveryNoteNumber: "", orderNumber: "", totalAmount: "", + recipientName: "", serviceConcerne: "", typeAchat: "", ventilationComptable: "", @@ -45,6 +46,7 @@ export default function InvoiceDetail() { 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 || "", @@ -87,6 +89,7 @@ export default function InvoiceDetail() { 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, @@ -330,6 +333,20 @@ export default function InvoiceDetail() { )} + +
+ + {isEditing ? ( + setFormData({ ...formData, recipientName: e.target.value })} + placeholder="Nom du destinataire" + /> + ) : ( +
{(invoice as any).recipientName || "-"}
+ )} +
diff --git a/client/src/pages/Invoices.tsx b/client/src/pages/Invoices.tsx index bf125f4..df2c169 100644 --- a/client/src/pages/Invoices.tsx +++ b/client/src/pages/Invoices.tsx @@ -60,15 +60,16 @@ export default function Invoices() { // Generate Excel file const worksheet = XLSX.utils.json_to_sheet(data.invoices.map(inv => ({ 'Fournisseur': inv.supplierName, - 'N\u00b0 Facture': inv.invoiceNumber, + 'Destinataire': (inv as any).recipientName, + 'N° Facture': inv.invoiceNumber, 'Date': inv.invoiceDate, - 'N\u00b0 Bon de livraison': inv.deliveryNoteNumber, - 'N\u00b0 Commande': inv.orderNumber, + 'N° Bon de livraison': inv.deliveryNoteNumber, + 'N° Commande': inv.orderNumber, 'Montant': inv.totalAmount, 'Score': inv.qualityScore, 'Statut export': inv.exportStatus, - 'Export\u00e9 le': inv.exportedAt, - 'Cr\u00e9\u00e9 le': inv.createdAt, + 'Exporté le': inv.exportedAt, + 'Créé le': inv.createdAt, }))); const workbook = XLSX.utils.book_new(); @@ -398,6 +399,7 @@ export default function Invoices() { /> Fournisseur + Destinataire N° Facture Date Montant @@ -426,6 +428,7 @@ export default function Invoices() { {invoice.supplierName || "Inconnu"} + {(invoice as any).recipientName || "-"} {invoice.invoiceNumber || "-"} {invoice.invoiceDate diff --git a/client/src/pages/Settings.tsx b/client/src/pages/Settings.tsx index 36c1e10..fc06bcb 100644 --- a/client/src/pages/Settings.tsx +++ b/client/src/pages/Settings.tsx @@ -664,6 +664,7 @@ export default function Settings() { const [supplierKeywords, setSupplierKeywords] = useState(""); const [totalAmountKeywords, setTotalAmountKeywords] = useState(""); const [subscriptionKeywords, setSubscriptionKeywords] = useState(""); + const [recipientKeywords, setRecipientKeywords] = useState(""); const [sftpHost, setSftpHost] = useState(""); const [sftpPort, setSftpPort] = useState(22); const [sftpUsername, setSftpUsername] = useState(""); @@ -681,6 +682,7 @@ export default function Settings() { setSupplierKeywords(settings.supplierKeywords || ""); setTotalAmountKeywords(settings.totalAmountKeywords || ""); setSubscriptionKeywords(settings.subscriptionKeywords || ""); + setRecipientKeywords((settings as any).recipientKeywords || ""); setSftpHost(settings.sftpHost || ""); setSftpPort(settings.sftpPort || 22); setSftpUsername(settings.sftpUsername || ""); @@ -723,6 +725,7 @@ export default function Settings() { supplierKeywords, totalAmountKeywords, subscriptionKeywords, + recipientKeywords, sftpHost, sftpPort, sftpUsername, @@ -986,6 +989,24 @@ export default function Settings() { Les factures contenant ces mots-clés seront automatiquement marquées comme abonnement

+ +
+ +