fix: autoriser le reimport apres suppression

This commit is contained in:
Manus
2026-10-02 21:15:28 +00:00
parent 1617267128
commit f9434d3a79
4 changed files with 28 additions and 31 deletions

View File

@@ -307,7 +307,7 @@ async function startServer() {
return; 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); const source = await getWebImportSourceByToken(apiToken);
if (!source) { if (!source) {
res.status(401).json({ error: "Token invalide" }); res.status(401).json({ error: "Token invalide" });
@@ -362,8 +362,6 @@ async function startServer() {
let imported = 0; let imported = 0;
let duplicates = 0; let duplicates = 0;
for (const inv of extractResult.invoices || []) { 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); const dup = await findDuplicateInvoice(inv.invoiceNumber || null, String(inv.totalAmount ?? ''), source.userId);
if (dup) { duplicates++; continue; } if (dup) { duplicates++; continue; }
const invoiceWithQuality = withCalculatedInvoiceQuality(inv, qualityFieldsConfig); const invoiceWithQuality = withCalculatedInvoiceQuality(inv, qualityFieldsConfig);

View File

@@ -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");
}
});
});

View File

@@ -8,7 +8,6 @@ import {
getLlmFieldsConfigByUser, getLlmFieldsConfigByUser,
getSourceFileByContentHash, getSourceFileByContentHash,
findDuplicateInvoice, findDuplicateInvoice,
isInvoiceBlacklisted,
createInvoice, createInvoice,
createImportLog, createImportLog,
} from "./db"; } from "./db";
@@ -259,19 +258,6 @@ async function processEmailAttachment(
processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`, 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) // Check for duplicates (numéro de facture + montant)
const duplicate = await findDuplicateInvoice( const duplicate = await findDuplicateInvoice(
invoiceData.invoiceNumber, invoiceData.invoiceNumber,

View File

@@ -40,7 +40,6 @@ import {
toggleUserActive, toggleUserActive,
deleteUser, deleteUser,
findDuplicateInvoice, findDuplicateInvoice,
isInvoiceBlacklisted,
getAllInvoices, getAllInvoices,
getAllImportLogs, getAllImportLogs,
getAllImportLogsWithDetails, getAllImportLogsWithDetails,
@@ -324,19 +323,6 @@ export const appRouter = router({
processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`, 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) // Check for duplicates (numéro de facture + montant)
const duplicate = await findDuplicateInvoice( const duplicate = await findDuplicateInvoice(
invoiceData.invoiceNumber, invoiceData.invoiceNumber,