fix: autoriser le reimport apres suppression
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
27
server/deletedInvoiceReimport.test.ts
Normal file
27
server/deletedInvoiceReimport.test.ts
Normal 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");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user