Finish getting POs working

This commit is contained in:
2025-01-26 17:34:46 -05:00
parent 48f09095c4
commit 5cbc2152a1
2 changed files with 73 additions and 47 deletions

View File

@@ -137,6 +137,7 @@ CREATE TABLE purchase_orders (
cost_price DECIMAL(10, 3) NOT NULL, cost_price DECIMAL(10, 3) NOT NULL,
status VARCHAR(20) DEFAULT 'pending' COMMENT 'canceled,created,electronically_ready_send,ordered,preordered,electronically_sent,receiving_started,closed', status VARCHAR(20) DEFAULT 'pending' COMMENT 'canceled,created,electronically_ready_send,ordered,preordered,electronically_sent,receiving_started,closed',
notes TEXT, notes TEXT,
long_note TEXT,
ordered INT NOT NULL, ordered INT NOT NULL,
received INT DEFAULT 0, received INT DEFAULT 0,
received_date DATE, received_date DATE,

View File

@@ -1118,42 +1118,59 @@ async function importPurchaseOrders(prodConnection, localConnection) {
.map((col) => col.COLUMN_NAME) .map((col) => col.COLUMN_NAME)
.filter((name) => name !== "id"); // Skip auto-increment ID .filter((name) => name !== "id"); // Skip auto-increment ID
// Get total count first for progress indication
const [countResult] = await prodConnection.query(`
SELECT COUNT(*) as total
FROM po_products pop
JOIN po ON pop.po_id = po.po_id
WHERE po.date_ordered >= DATE_SUB(CURRENT_DATE, INTERVAL 2 YEAR)
`);
const total = countResult[0].total;
outputProgress({ outputProgress({
operation: "Starting purchase orders import - Fetching POs from production", operation: `Starting purchase orders import - Fetching ${total} PO items from production`,
status: "running", status: "running",
}); });
// Process in batches
const batchSize = 1000;
let processed = 0;
let offset = 0;
while (offset < total) {
const [purchaseOrders] = await prodConnection.query(` const [purchaseOrders] = await prodConnection.query(`
SELECT SELECT
po.po_id as po_number, pop.po_id,
s.companyname as vendor, s.companyname as vendor,
po.date_ordered as date, DATE(po.date_ordered) as date,
po.date_estin as expected_date, DATE(po.date_estin) as expected_date,
pop.pid as product_id, pop.pid,
p.itemnumber as sku, p.itemnumber as sku,
COALESCE(rp.cost_each, pop.cost_each) as cost_price, COALESCE(rp.cost_each, pop.cost_each) as cost_price,
po.status, po.status,
CONCAT(COALESCE(po.short_note, ''), ' ', COALESCE(po.notes, '')) as notes, COALESCE(po.short_note, '') as notes,
COALESCE(po.notes, '') as long_note,
pop.qty_each as ordered, pop.qty_each as ordered,
rp.received_by, COALESCE(rp.qty_each, 0) as received,
rp.received_date DATE(rp.received_date) as received_date,
FROM po CAST(NULLIF(rp.received_by, '') AS SIGNED) as received_by
JOIN po_products pop ON po.po_id = pop.po_id FROM po_products pop
JOIN po ON pop.po_id = po.po_id
JOIN products p ON pop.pid = p.pid JOIN products p ON pop.pid = p.pid
JOIN suppliers s ON po.supplier_id = s.supplierid JOIN suppliers s ON po.supplier_id = s.supplierid
LEFT JOIN receivings r ON po.po_id = r.po_id LEFT JOIN receivings r ON po.po_id = r.po_id
LEFT JOIN receivings_products rp ON r.receiving_id = rp.receiving_id LEFT JOIN receivings_products rp ON r.receiving_id = rp.receiving_id
AND pop.pid = rp.pid AND pop.pid = rp.pid
WHERE po.date_ordered >= DATE_SUB(CURRENT_DATE, INTERVAL 2 YEAR) WHERE po.date_ordered >= DATE_SUB(CURRENT_DATE, INTERVAL 2 YEAR)
ORDER BY po.po_id LIMIT ? OFFSET ?
`); `, [batchSize, offset]);
if (purchaseOrders.length > 0) { if (purchaseOrders.length > 0) {
const placeholders = purchaseOrders const placeholders = purchaseOrders
.map(() => `(${Array(columnNames.length).fill("?").join(",")})`) .map(() => `(${Array(columnNames.length).fill("?").join(",")})`)
.join(","); .join(",");
const updateClauses = columnNames const updateClauses = columnNames
.filter((col) => col !== "po_number") // Don't update primary key .filter((col) => col !== "po_id") // Don't update primary key
.map((col) => `${col} = VALUES(${col})`) .map((col) => `${col} = VALUES(${col})`)
.join(","); .join(",");
@@ -1168,17 +1185,25 @@ async function importPurchaseOrders(prodConnection, localConnection) {
purchaseOrders.flatMap(po => columnNames.map(col => po[col])) purchaseOrders.flatMap(po => columnNames.map(col => po[col]))
); );
outputProgress({ processed += purchaseOrders.length;
operation: `Imported ${purchaseOrders.length} purchase order items`, offset += batchSize;
status: "running",
}); updateProgress(
processed,
total,
"Purchase orders import",
startTime
);
} else {
break;
}
} }
const endTime = Date.now(); const endTime = Date.now();
outputProgress({ outputProgress({
operation: `Purchase orders import complete in ${Math.round( operation: `Purchase orders import complete in ${Math.round(
(endTime - startTime) / 1000 (endTime - startTime) / 1000
)}s - Imported ${purchaseOrders.length} PO items`, )}s - Imported ${processed} PO items`,
status: "complete", status: "complete",
}); });
} catch (error) { } catch (error) {