From f9434d3a79a267698bebb1d18ae1f81a391f0cd2 Mon Sep 17 00:00:00 2001 From: Manus Date: Fri, 2 Oct 2026 21:15:28 +0000 Subject: [PATCH] fix: autoriser le reimport apres suppression --- server/_core/index.ts | 4 +--- server/deletedInvoiceReimport.test.ts | 27 +++++++++++++++++++++++++++ server/emailImportService.ts | 14 -------------- server/routers.ts | 14 -------------- 4 files changed, 28 insertions(+), 31 deletions(-) create mode 100644 server/deletedInvoiceReimport.test.ts diff --git a/server/_core/index.ts b/server/_core/index.ts index 8d7a303..d1b375b 100644 --- a/server/_core/index.ts +++ b/server/_core/index.ts @@ -307,7 +307,7 @@ async function startServer() { return; } - const { getWebImportSourceByToken, createInvoice, findDuplicateInvoice, isInvoiceBlacklisted, updateWebImportSourceStatus, createSourceFile, getSourceFileByContentHash, getLlmFieldsConfigByUser } = await import('../db'); + const { getWebImportSourceByToken, createInvoice, findDuplicateInvoice, updateWebImportSourceStatus, createSourceFile, getSourceFileByContentHash, getLlmFieldsConfigByUser } = await import('../db'); const source = await getWebImportSourceByToken(apiToken); if (!source) { res.status(401).json({ error: "Token invalide" }); @@ -362,8 +362,6 @@ async function startServer() { let imported = 0; let duplicates = 0; for (const inv of extractResult.invoices || []) { - const blacklisted = await isInvoiceBlacklisted(inv.invoiceNumber || null, source.userId); - if (blacklisted) { duplicates++; continue; } const dup = await findDuplicateInvoice(inv.invoiceNumber || null, String(inv.totalAmount ?? ''), source.userId); if (dup) { duplicates++; continue; } const invoiceWithQuality = withCalculatedInvoiceQuality(inv, qualityFieldsConfig); diff --git a/server/deletedInvoiceReimport.test.ts b/server/deletedInvoiceReimport.test.ts new file mode 100644 index 0000000..4bf73fc --- /dev/null +++ b/server/deletedInvoiceReimport.test.ts @@ -0,0 +1,27 @@ +import { readFileSync } from "node:fs"; +import { resolve } from "node:path"; +import { describe, expect, it } from "vitest"; + +const source = (path: string) => readFileSync(resolve(process.cwd(), path), "utf8"); + +describe("réimport d'une facture supprimée", () => { + it("ne traite plus une entrée deletedInvoices comme un doublon", () => { + for (const path of [ + "server/routers.ts", + "server/emailImportService.ts", + "server/_core/index.ts", + ]) { + expect(source(path)).not.toContain("isInvoiceBlacklisted"); + } + }); + + it("conserve uniquement la détection des doublons réellement présents", () => { + for (const path of [ + "server/routers.ts", + "server/emailImportService.ts", + "server/_core/index.ts", + ]) { + expect(source(path)).toContain("findDuplicateInvoice"); + } + }); +}); diff --git a/server/emailImportService.ts b/server/emailImportService.ts index 015535f..0e96f55 100644 --- a/server/emailImportService.ts +++ b/server/emailImportService.ts @@ -8,7 +8,6 @@ import { getLlmFieldsConfigByUser, getSourceFileByContentHash, findDuplicateInvoice, - isInvoiceBlacklisted, createInvoice, createImportLog, } from "./db"; @@ -259,19 +258,6 @@ async function processEmailAttachment( processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`, }); - // Vérifier la blacklist (factures supprimées manuellement) - const blacklisted = await isInvoiceBlacklisted(invoiceData.invoiceNumber, userId); - if (blacklisted) { - duplicatesCount++; - duplicateDetails.push({ - supplierName: invoiceData.supplierName, - invoiceNumber: invoiceData.invoiceNumber, - totalAmount: invoiceData.totalAmount, - reason: 'blacklisted', - }); - continue; - } - // Check for duplicates (numéro de facture + montant) const duplicate = await findDuplicateInvoice( invoiceData.invoiceNumber, diff --git a/server/routers.ts b/server/routers.ts index aaa7658..2139cd9 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -40,7 +40,6 @@ import { toggleUserActive, deleteUser, findDuplicateInvoice, - isInvoiceBlacklisted, getAllInvoices, getAllImportLogs, getAllImportLogsWithDetails, @@ -324,19 +323,6 @@ export const appRouter = router({ processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`, }); - // Vérifier la blacklist (factures supprimées manuellement) - const blacklisted = await isInvoiceBlacklisted(invoiceData.invoiceNumber, userId); - if (blacklisted) { - duplicatesCount++; - duplicateDetails.push({ - supplierName: invoiceData.supplierName, - invoiceNumber: invoiceData.invoiceNumber, - totalAmount: invoiceData.totalAmount, - reason: 'blacklisted', - }); - continue; - } - // Check for duplicates (numéro de facture + montant) const duplicate = await findDuplicateInvoice( invoiceData.invoiceNumber,