feat: détection doublons par numéro+montant dans les 3 points d'import

This commit is contained in:
Manus
2026-06-15 12:02:24 -04:00
parent 295965fa57
commit a9387eaaea
4 changed files with 24 additions and 22 deletions

View File

@@ -414,23 +414,25 @@ export async function getInvoiceStats(userId: number) {
} }
export async function findDuplicateInvoice( export async function findDuplicateInvoice(
supplierName: string | null,
invoiceNumber: string | null, invoiceNumber: string | null,
invoiceDate: Date | null totalAmount: string | null,
userId?: number
): Promise<Invoice | undefined> { ): Promise<Invoice | undefined> {
if (!supplierName || !invoiceNumber || !invoiceDate) return undefined; if (!invoiceNumber || !totalAmount) return undefined;
const db = await getDb(); const db = await getDb();
if (!db) return undefined; if (!db) return undefined;
const conditions = [
eq(invoices.invoiceNumber, invoiceNumber),
eq(invoices.totalAmount, totalAmount),
];
if (userId !== undefined) {
conditions.push(eq(invoices.userId, userId));
}
const result = await db.select().from(invoices) const result = await db.select().from(invoices)
.where( .where(and(...conditions))
and(
eq(invoices.supplierName, supplierName),
eq(invoices.invoiceNumber, invoiceNumber),
eq(invoices.invoiceDate, invoiceDate)
)
)
.limit(1); .limit(1);
return result[0]; return result[0];

View File

@@ -129,11 +129,11 @@ async function processEmailAttachment(
processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`, processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`,
}); });
// Check for duplicates // Check for duplicates (numéro de facture + montant)
const duplicate = await findDuplicateInvoice( const duplicate = await findDuplicateInvoice(
invoiceData.supplierName,
invoiceData.invoiceNumber, invoiceData.invoiceNumber,
invoiceData.invoiceDate invoiceData.totalAmount?.toString() ?? null,
userId
); );
if (duplicate) { if (duplicate) {
@@ -141,7 +141,7 @@ async function processEmailAttachment(
duplicateDetails.push({ duplicateDetails.push({
supplierName: invoiceData.supplierName, supplierName: invoiceData.supplierName,
invoiceNumber: invoiceData.invoiceNumber, invoiceNumber: invoiceData.invoiceNumber,
invoiceDate: invoiceData.invoiceDate, totalAmount: invoiceData.totalAmount,
}); });
continue; continue;
} }

View File

@@ -115,11 +115,11 @@ async function processFolderFile(
processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`, processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`,
}); });
// Check for duplicates // Check for duplicates (numéro de facture + montant)
const duplicate = await findDuplicateInvoice( const duplicate = await findDuplicateInvoice(
invoiceData.supplierName,
invoiceData.invoiceNumber, invoiceData.invoiceNumber,
invoiceData.invoiceDate invoiceData.totalAmount?.toString() ?? null,
userId
); );
if (duplicate) { if (duplicate) {
@@ -127,7 +127,7 @@ async function processFolderFile(
duplicateDetails.push({ duplicateDetails.push({
supplierName: invoiceData.supplierName, supplierName: invoiceData.supplierName,
invoiceNumber: invoiceData.invoiceNumber, invoiceNumber: invoiceData.invoiceNumber,
invoiceDate: invoiceData.invoiceDate, totalAmount: invoiceData.totalAmount,
}); });
continue; continue;
} }

View File

@@ -252,11 +252,11 @@ export const appRouter = router({
processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`, processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`,
}); });
// Check for duplicates // Check for duplicates (numéro de facture + montant)
const duplicate = await findDuplicateInvoice( const duplicate = await findDuplicateInvoice(
invoiceData.supplierName,
invoiceData.invoiceNumber, invoiceData.invoiceNumber,
invoiceData.invoiceDate invoiceData.totalAmount?.toString() ?? null,
userId
); );
if (duplicate) { if (duplicate) {
@@ -264,7 +264,7 @@ export const appRouter = router({
duplicateDetails.push({ duplicateDetails.push({
supplierName: invoiceData.supplierName, supplierName: invoiceData.supplierName,
invoiceNumber: invoiceData.invoiceNumber, invoiceNumber: invoiceData.invoiceNumber,
invoiceDate: invoiceData.invoiceDate, totalAmount: invoiceData.totalAmount,
}); });
continue; continue;
} }