feat: détection doublons par numéro+montant dans les 3 points d'import
This commit is contained in:
22
server/db.ts
22
server/db.ts
@@ -414,23 +414,25 @@ export async function getInvoiceStats(userId: number) {
|
||||
}
|
||||
|
||||
export async function findDuplicateInvoice(
|
||||
supplierName: string | null,
|
||||
invoiceNumber: string | null,
|
||||
invoiceDate: Date | null
|
||||
totalAmount: string | null,
|
||||
userId?: number
|
||||
): Promise<Invoice | undefined> {
|
||||
if (!supplierName || !invoiceNumber || !invoiceDate) return undefined;
|
||||
if (!invoiceNumber || !totalAmount) return undefined;
|
||||
|
||||
const db = await getDb();
|
||||
if (!db) return undefined;
|
||||
|
||||
const result = await db.select().from(invoices)
|
||||
.where(
|
||||
and(
|
||||
eq(invoices.supplierName, supplierName),
|
||||
const conditions = [
|
||||
eq(invoices.invoiceNumber, invoiceNumber),
|
||||
eq(invoices.invoiceDate, invoiceDate)
|
||||
)
|
||||
)
|
||||
eq(invoices.totalAmount, totalAmount),
|
||||
];
|
||||
if (userId !== undefined) {
|
||||
conditions.push(eq(invoices.userId, userId));
|
||||
}
|
||||
|
||||
const result = await db.select().from(invoices)
|
||||
.where(and(...conditions))
|
||||
.limit(1);
|
||||
|
||||
return result[0];
|
||||
|
||||
@@ -129,11 +129,11 @@ async function processEmailAttachment(
|
||||
processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`,
|
||||
});
|
||||
|
||||
// Check for duplicates
|
||||
// Check for duplicates (numéro de facture + montant)
|
||||
const duplicate = await findDuplicateInvoice(
|
||||
invoiceData.supplierName,
|
||||
invoiceData.invoiceNumber,
|
||||
invoiceData.invoiceDate
|
||||
invoiceData.totalAmount?.toString() ?? null,
|
||||
userId
|
||||
);
|
||||
|
||||
if (duplicate) {
|
||||
@@ -141,7 +141,7 @@ async function processEmailAttachment(
|
||||
duplicateDetails.push({
|
||||
supplierName: invoiceData.supplierName,
|
||||
invoiceNumber: invoiceData.invoiceNumber,
|
||||
invoiceDate: invoiceData.invoiceDate,
|
||||
totalAmount: invoiceData.totalAmount,
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -115,11 +115,11 @@ async function processFolderFile(
|
||||
processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`,
|
||||
});
|
||||
|
||||
// Check for duplicates
|
||||
// Check for duplicates (numéro de facture + montant)
|
||||
const duplicate = await findDuplicateInvoice(
|
||||
invoiceData.supplierName,
|
||||
invoiceData.invoiceNumber,
|
||||
invoiceData.invoiceDate
|
||||
invoiceData.totalAmount?.toString() ?? null,
|
||||
userId
|
||||
);
|
||||
|
||||
if (duplicate) {
|
||||
@@ -127,7 +127,7 @@ async function processFolderFile(
|
||||
duplicateDetails.push({
|
||||
supplierName: invoiceData.supplierName,
|
||||
invoiceNumber: invoiceData.invoiceNumber,
|
||||
invoiceDate: invoiceData.invoiceDate,
|
||||
totalAmount: invoiceData.totalAmount,
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -252,11 +252,11 @@ export const appRouter = router({
|
||||
processingProgress: `Extraction ${i + 1}/${result.invoiceCount} factures...`,
|
||||
});
|
||||
|
||||
// Check for duplicates
|
||||
// Check for duplicates (numéro de facture + montant)
|
||||
const duplicate = await findDuplicateInvoice(
|
||||
invoiceData.supplierName,
|
||||
invoiceData.invoiceNumber,
|
||||
invoiceData.invoiceDate
|
||||
invoiceData.totalAmount?.toString() ?? null,
|
||||
userId
|
||||
);
|
||||
|
||||
if (duplicate) {
|
||||
@@ -264,7 +264,7 @@ export const appRouter = router({
|
||||
duplicateDetails.push({
|
||||
supplierName: invoiceData.supplierName,
|
||||
invoiceNumber: invoiceData.invoiceNumber,
|
||||
invoiceDate: invoiceData.invoiceDate,
|
||||
totalAmount: invoiceData.totalAmount,
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user