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(
|
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];
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user