Fix PO import not removing products from edited POs

This commit is contained in:
2025-04-14 14:31:03 -04:00
parent d05d27494d
commit 4cb41a7e4c

View File

@@ -46,8 +46,10 @@ async function importPurchaseOrders(prodConnection, localConnection, incremental
const startTime = Date.now(); const startTime = Date.now();
let poRecordsAdded = 0; let poRecordsAdded = 0;
let poRecordsUpdated = 0; let poRecordsUpdated = 0;
let poRecordsDeleted = 0;
let receivingRecordsAdded = 0; let receivingRecordsAdded = 0;
let receivingRecordsUpdated = 0; let receivingRecordsUpdated = 0;
let receivingRecordsDeleted = 0;
let totalProcessed = 0; let totalProcessed = 0;
// Batch size constants // Batch size constants
@@ -257,6 +259,10 @@ async function importPurchaseOrders(prodConnection, localConnection, incremental
const totalPOs = poCount[0].total; const totalPOs = poCount[0].total;
console.log(`Found ${totalPOs} relevant purchase orders`); console.log(`Found ${totalPOs} relevant purchase orders`);
// Skip processing if no POs to process
if (totalPOs === 0) {
console.log('No purchase orders to process, skipping PO import step');
} else {
// Fetch and process POs in batches // Fetch and process POs in batches
let offset = 0; let offset = 0;
let allPOsProcessed = false; let allPOsProcessed = false;
@@ -401,6 +407,7 @@ async function importPurchaseOrders(prodConnection, localConnection, incremental
allPOsProcessed = true; allPOsProcessed = true;
} }
} }
}
// 2. Next, fetch all relevant receivings // 2. Next, fetch all relevant receivings
outputProgress({ outputProgress({
@@ -424,6 +431,10 @@ async function importPurchaseOrders(prodConnection, localConnection, incremental
const totalReceivings = receivingCount[0].total; const totalReceivings = receivingCount[0].total;
console.log(`Found ${totalReceivings} relevant receivings`); console.log(`Found ${totalReceivings} relevant receivings`);
// Skip processing if no receivings to process
if (totalReceivings === 0) {
console.log('No receivings to process, skipping receivings import step');
} else {
// Fetch and process receivings in batches // Fetch and process receivings in batches
offset = 0; // Reset offset for receivings offset = 0; // Reset offset for receivings
let allReceivingsProcessed = false; let allReceivingsProcessed = false;
@@ -603,6 +614,7 @@ async function importPurchaseOrders(prodConnection, localConnection, incremental
allReceivingsProcessed = true; allReceivingsProcessed = true;
} }
} }
}
// Add this section to filter out invalid PIDs before final import // Add this section to filter out invalid PIDs before final import
outputProgress({ outputProgress({
@@ -655,6 +667,31 @@ async function importPurchaseOrders(prodConnection, localConnection, incremental
message: "Inserting final purchase order records" message: "Inserting final purchase order records"
}); });
// Create a temp table to track PO IDs being processed
await localConnection.query(`
DROP TABLE IF EXISTS processed_po_ids;
CREATE TEMP TABLE processed_po_ids AS (
SELECT DISTINCT po_id FROM temp_purchase_orders
);
`);
// Delete products that were removed from POs and count them
const [poDeletedResult] = await localConnection.query(`
WITH deleted AS (
DELETE FROM purchase_orders
WHERE po_id IN (SELECT po_id FROM processed_po_ids)
AND NOT EXISTS (
SELECT 1 FROM temp_purchase_orders tp
WHERE purchase_orders.po_id = tp.po_id AND purchase_orders.pid = tp.pid
)
RETURNING po_id, pid
)
SELECT COUNT(*) as count FROM deleted
`);
poRecordsDeleted = poDeletedResult.rows[0]?.count || 0;
console.log(`Deleted ${poRecordsDeleted} products that were removed from purchase orders`);
const [poResult] = await localConnection.query(` const [poResult] = await localConnection.query(`
INSERT INTO purchase_orders ( INSERT INTO purchase_orders (
po_id, vendor, date, expected_date, pid, sku, name, po_id, vendor, date, expected_date, pid, sku, name,
@@ -706,6 +743,31 @@ async function importPurchaseOrders(prodConnection, localConnection, incremental
message: "Inserting final receiving records" message: "Inserting final receiving records"
}); });
// Create a temp table to track receiving IDs being processed
await localConnection.query(`
DROP TABLE IF EXISTS processed_receiving_ids;
CREATE TEMP TABLE processed_receiving_ids AS (
SELECT DISTINCT receiving_id FROM temp_receivings
);
`);
// Delete products that were removed from receivings and count them
const [receivingDeletedResult] = await localConnection.query(`
WITH deleted AS (
DELETE FROM receivings
WHERE receiving_id IN (SELECT receiving_id FROM processed_receiving_ids)
AND NOT EXISTS (
SELECT 1 FROM temp_receivings tr
WHERE receivings.receiving_id = tr.receiving_id AND receivings.pid = tr.pid
)
RETURNING receiving_id, pid
)
SELECT COUNT(*) as count FROM deleted
`);
receivingRecordsDeleted = receivingDeletedResult.rows[0]?.count || 0;
console.log(`Deleted ${receivingRecordsDeleted} products that were removed from receivings`);
const [receivingsResult] = await localConnection.query(` const [receivingsResult] = await localConnection.query(`
INSERT INTO receivings ( INSERT INTO receivings (
receiving_id, pid, sku, name, vendor, qty_each, qty_each_orig, receiving_id, pid, sku, name, vendor, qty_each, qty_each_orig,
@@ -765,6 +827,8 @@ async function importPurchaseOrders(prodConnection, localConnection, incremental
DROP TABLE IF EXISTS employee_names; DROP TABLE IF EXISTS employee_names;
DROP TABLE IF EXISTS temp_supplier_names; DROP TABLE IF EXISTS temp_supplier_names;
DROP TABLE IF EXISTS temp_invalid_pids; DROP TABLE IF EXISTS temp_invalid_pids;
DROP TABLE IF EXISTS processed_po_ids;
DROP TABLE IF EXISTS processed_receiving_ids;
`); `);
// Commit transaction // Commit transaction
@@ -774,10 +838,13 @@ async function importPurchaseOrders(prodConnection, localConnection, incremental
status: "complete", status: "complete",
recordsAdded: poRecordsAdded + receivingRecordsAdded, recordsAdded: poRecordsAdded + receivingRecordsAdded,
recordsUpdated: poRecordsUpdated + receivingRecordsUpdated, recordsUpdated: poRecordsUpdated + receivingRecordsUpdated,
recordsDeleted: poRecordsDeleted + receivingRecordsDeleted,
poRecordsAdded, poRecordsAdded,
poRecordsUpdated, poRecordsUpdated,
poRecordsDeleted,
receivingRecordsAdded, receivingRecordsAdded,
receivingRecordsUpdated, receivingRecordsUpdated,
receivingRecordsDeleted,
totalRecords: totalProcessed totalRecords: totalProcessed
}; };
} catch (error) { } catch (error) {
@@ -795,6 +862,7 @@ async function importPurchaseOrders(prodConnection, localConnection, incremental
error: error.message, error: error.message,
recordsAdded: 0, recordsAdded: 0,
recordsUpdated: 0, recordsUpdated: 0,
recordsDeleted: 0,
totalRecords: 0 totalRecords: 0
}; };
} }