From 74dbaab169752ec7aa766811ef9003264e8fd5a3 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Tue, 8 Jul 2025 19:20:54 +0000 Subject: [PATCH] Improve transaction deduplication logic Limit deduplication to transactions of the relevant jobs. --- src/components/BatchTransactionForm.tsx | 59 +++++++++---------------- 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/src/components/BatchTransactionForm.tsx b/src/components/BatchTransactionForm.tsx index ad5871a..5e5a3e6 100644 --- a/src/components/BatchTransactionForm.tsx +++ b/src/components/BatchTransactionForm.tsx @@ -68,16 +68,7 @@ const BatchTransactionForm: React.FC = ({ onClose, on parsed.totalAmount.toString(), parsed.buyer, parsed.location - ].join('|'); - console.log('Created key from parsed transaction:', { - key, - date: normalizeDate(parsed.date.toISOString()), - itemName: parsed.itemName, - quantity: parsed.quantity, - totalAmount: parsed.totalAmount, - buyer: parsed.buyer, - location: parsed.location - }); + ].join('|'); return key; }; @@ -90,15 +81,6 @@ const BatchTransactionForm: React.FC = ({ onClose, on tx.buyer, tx.location ].join('|'); - console.log('Created key from existing transaction:', { - key, - date: normalizeDate(tx.date), - itemName: tx.itemName, - quantity: tx.quantity, - totalPrice: tx.totalPrice, - buyer: tx.buyer, - location: tx.location - }); return key; }; @@ -107,19 +89,15 @@ const BatchTransactionForm: React.FC = ({ onClose, on const lines = value.trim().split('\n'); const pasteTransactionMap = new Map(); - console.log('=== STEP 1: Processing pasted lines ==='); // STEP 1: First combine all identical transactions within the pasted data - lines.forEach((line, index) => { + lines.forEach((line) => { const parsed = parseTransactionLine(line); if (parsed) { const transactionKey = createTransactionKey(parsed); - console.log(`Line ${index + 1}: Key = ${transactionKey}`); - // Check if this exact transaction already exists in our paste data if (pasteTransactionMap.has(transactionKey)) { // Merge with existing transaction in paste const existing = pasteTransactionMap.get(transactionKey)!; - console.log(`Merging duplicate: adding ${parsed.quantity} to existing ${existing.quantity}`); existing.quantity += parsed.quantity; existing.totalPrice += Math.abs(parsed.totalAmount); } else { @@ -136,31 +114,36 @@ const BatchTransactionForm: React.FC = ({ onClose, on wallet: parsed.wallet }; pasteTransactionMap.set(transactionKey, newTransaction); - console.log(`Added new transaction: ${parsed.itemName} x${parsed.quantity}`); } } }); - console.log('=== STEP 2: Checking against existing transactions ==='); - // STEP 2: Now check combined transactions against existing job transactions - const existingTransactionKeys = new Set(); - eligibleJobs.forEach(job => { - job.income.forEach(tx => { - const key = createTransactionKeyFromRecord(tx); - existingTransactionKeys.add(key); - console.log(`Existing transaction key: ${key}`); - }); + // STEP 2: Identify which jobs these transactions belong to + const relevantJobIds = new Set(); + pasteTransactionMap.forEach((transaction) => { + const matchingJobId = findMatchingJob(transaction.itemName); + if (matchingJobId) { + relevantJobIds.add(matchingJobId); + } }); + // STEP 3: Only check against transactions from relevant jobs + const existingTransactionKeys = new Set(); + eligibleJobs.forEach(job => { + if (relevantJobIds.has(job.id)) { + job.income.forEach(tx => { + const key = createTransactionKeyFromRecord(tx); + existingTransactionKeys.add(key); + }); + } + }); + + // STEP 4: Mark duplicates and assign jobs let duplicates = 0; - console.log('=== STEP 3: Marking duplicates and assigning jobs ==='); - // Update each combined transaction with duplicate status and job assignment pasteTransactionMap.forEach((transaction, key) => { const isDuplicate = existingTransactionKeys.has(key); transaction.isDuplicate = isDuplicate; - console.log(`Transaction ${transaction.itemName}: isDuplicate = ${isDuplicate}`); - if (isDuplicate) { duplicates++; transaction.assignedJobId = undefined;