From 5f6d54e72c902981c8c0e9d4ddac111ada837a38 Mon Sep 17 00:00:00 2001 From: Adam Pitel Date: Fri, 3 Apr 2026 13:40:19 -0400 Subject: [PATCH] Fix Critical Parts qty_available to show actual QOH from MPE warehouse Join directly to itemsite (warehouse 35/MPE) and call qtynetable() per part instead of using MAX from shortage lines, which was NULL for MTO parts. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../queries/critical_parts/critical_parts.txt | 28 +++++++++---------- .../queries/critical_parts/metadata.json | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pages/Operations - WO Shortages/queries/critical_parts/critical_parts.txt b/pages/Operations - WO Shortages/queries/critical_parts/critical_parts.txt index 93e137d..b2d75c5 100644 --- a/pages/Operations - WO Shortages/queries/critical_parts/critical_parts.txt +++ b/pages/Operations - WO Shortages/queries/critical_parts/critical_parts.txt @@ -17,9 +17,8 @@ WITH fa_wos AS ( ), mts_shorts AS ( SELECT fw.wo_id AS top_wo_id, - mi.item_number, mi.item_descrip1, 'MTS'::text AS shortage_type, - (wm.womatl_qtyreq - wm.womatl_qtyiss) AS qty_needed, - qtynetable(mis.itemsite_id, true) AS qty_onhand + mi.item_number, mi.item_descrip1, mi.item_id, 'MTS'::text AS shortage_type, + (wm.womatl_qtyreq - wm.womatl_qtyiss) AS qty_needed FROM fa_wos fw JOIN mpe.wogrpext wwg ON fw.wo_id = wwg.wogrpext_wo_id JOIN mpe.wogrpext rwg ON wwg.wogrpext_root_wo_id = rwg.wogrpext_root_wo_id @@ -32,9 +31,8 @@ mts_shorts AS ( ), mto_shorts AS ( SELECT fw.wo_id AS top_wo_id, - mi.item_number, mi.item_descrip1, 'MTO'::text AS shortage_type, - (sub_wo.wo_qtyord - sub_wo.wo_qtyrcv) AS qty_needed, - NULL::numeric AS qty_onhand + mi.item_number, mi.item_descrip1, mi.item_id, 'MTO'::text AS shortage_type, + (sub_wo.wo_qtyord - sub_wo.wo_qtyrcv) AS qty_needed FROM fa_wos fw JOIN mpe.wogrpext wwg ON fw.wo_id = wwg.wogrpext_wo_id JOIN mpe.wogrpext rwg ON wwg.wogrpext_root_wo_id = rwg.wogrpext_root_wo_id @@ -54,12 +52,14 @@ all_shorts AS ( UNION ALL SELECT * FROM mto_shorts ) -SELECT item_number AS part_number, - item_descrip1 AS part_description, - shortage_type, - COUNT(DISTINCT top_wo_id) AS wos_blocked, - SUM(qty_needed) AS total_qty_needed, - MAX(qty_onhand) AS qty_available -FROM all_shorts -GROUP BY item_number, item_descrip1, shortage_type +SELECT s.item_number AS part_number, + s.item_descrip1 AS part_description, + s.shortage_type, + COUNT(DISTINCT s.top_wo_id) AS wos_blocked, + SUM(s.qty_needed) AS total_qty_needed, + qtynetable(isite.itemsite_id, true) AS qty_available +FROM all_shorts s +JOIN itemsite isite ON isite.itemsite_item_id = s.item_id + AND isite.itemsite_warehous_id = 35 +GROUP BY s.item_number, s.item_descrip1, s.shortage_type, isite.itemsite_id ORDER BY wos_blocked DESC, total_qty_needed DESC; \ No newline at end of file diff --git a/pages/Operations - WO Shortages/queries/critical_parts/metadata.json b/pages/Operations - WO Shortages/queries/critical_parts/metadata.json index 2cd383b..c6c802d 100644 --- a/pages/Operations - WO Shortages/queries/critical_parts/metadata.json +++ b/pages/Operations - WO Shortages/queries/critical_parts/metadata.json @@ -5,7 +5,7 @@ "pluginType": "DB", "unpublishedAction": { "actionConfiguration": { - "body": "WITH fa_wos AS (\n SELECT w.wo_id, w.wo_duedate\n FROM wo w\n JOIN itemsite isite ON w.wo_itemsite_id = isite.itemsite_id\n JOIN item i ON isite.itemsite_item_id = i.item_id\n WHERE w.wo_status IN ('R','E','I')\n AND w.wo_ordtype != 'W'\n AND EXISTS (\n SELECT 1 FROM mpe.itematmdept\n WHERE itematmdept_item_id = i.item_id\n AND 'FA' = ANY(itematmdept_departments)\n )\n AND i.item_id NOT IN (\n SELECT itemgrpitem_item_id FROM itemgrpitem WHERE itemgrpitem_itemgrp_id = 97\n )\n AND w.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '11 days')\n),\nmts_shorts AS (\n SELECT fw.wo_id AS top_wo_id,\n mi.item_number, mi.item_descrip1, 'MTS'::text AS shortage_type,\n (wm.womatl_qtyreq - wm.womatl_qtyiss) AS qty_needed,\n qtynetable(mis.itemsite_id, true) AS qty_onhand\n FROM fa_wos fw\n JOIN mpe.wogrpext wwg ON fw.wo_id = wwg.wogrpext_wo_id\n JOIN mpe.wogrpext rwg ON wwg.wogrpext_root_wo_id = rwg.wogrpext_root_wo_id\n JOIN wo sub_wo ON rwg.wogrpext_wo_id = sub_wo.wo_id\n JOIN womatl wm ON sub_wo.wo_id = wm.womatl_wo_id\n JOIN itemsite mis ON wm.womatl_itemsite_id = mis.itemsite_id\n JOIN item mi ON mis.itemsite_item_id = mi.item_id\n WHERE sub_wo.wo_status IN ('R','I')\n AND wm.womatl_picklist AND wm.womatl_qtyreq > wm.womatl_qtyiss\n),\nmto_shorts AS (\n SELECT fw.wo_id AS top_wo_id,\n mi.item_number, mi.item_descrip1, 'MTO'::text AS shortage_type,\n (sub_wo.wo_qtyord - sub_wo.wo_qtyrcv) AS qty_needed,\n NULL::numeric AS qty_onhand\n FROM fa_wos fw\n JOIN mpe.wogrpext wwg ON fw.wo_id = wwg.wogrpext_wo_id\n JOIN mpe.wogrpext rwg ON wwg.wogrpext_root_wo_id = rwg.wogrpext_root_wo_id\n JOIN wo sub_wo ON rwg.wogrpext_wo_id = sub_wo.wo_id\n JOIN itemsite mis ON sub_wo.wo_itemsite_id = mis.itemsite_id\n JOIN item mi ON mis.itemsite_item_id = mi.item_id\n WHERE sub_wo.wo_qtyord > sub_wo.wo_qtyrcv\n AND sub_wo.wo_status IN ('R','I')\n AND mi.item_id IN (\n SELECT DISTINCT itemgrpitem_item_id FROM itemgrpitem\n JOIN itemgrp ON itemgrpitem_itemgrp_id = itemgrp_id\n WHERE itemgrp_name IN ('MAGNETIC-TRANSFORMER','MAGNETIC-PLUMBING','SUB-ASSEMBLY','PCB GROUP-WORK','INPUT-BD')\n )\n),\nall_shorts AS (\n SELECT * FROM mts_shorts\n UNION ALL\n SELECT * FROM mto_shorts\n)\nSELECT item_number AS part_number,\n item_descrip1 AS part_description,\n shortage_type,\n COUNT(DISTINCT top_wo_id) AS wos_blocked,\n SUM(qty_needed) AS total_qty_needed,\n MAX(qty_onhand) AS qty_available\nFROM all_shorts\nGROUP BY item_number, item_descrip1, shortage_type\nORDER BY wos_blocked DESC, total_qty_needed DESC;", + "body": "WITH fa_wos AS (\n SELECT w.wo_id, w.wo_duedate\n FROM wo w\n JOIN itemsite isite ON w.wo_itemsite_id = isite.itemsite_id\n JOIN item i ON isite.itemsite_item_id = i.item_id\n WHERE w.wo_status IN ('R','E','I')\n AND w.wo_ordtype != 'W'\n AND EXISTS (\n SELECT 1 FROM mpe.itematmdept\n WHERE itematmdept_item_id = i.item_id\n AND 'FA' = ANY(itematmdept_departments)\n )\n AND i.item_id NOT IN (\n SELECT itemgrpitem_item_id FROM itemgrpitem WHERE itemgrpitem_itemgrp_id = 97\n )\n AND w.wo_duedate <= (date_trunc('week', CURRENT_DATE) + interval '11 days')\n),\nmts_shorts AS (\n SELECT fw.wo_id AS top_wo_id,\n mi.item_number, mi.item_descrip1, mi.item_id, 'MTS'::text AS shortage_type,\n (wm.womatl_qtyreq - wm.womatl_qtyiss) AS qty_needed\n FROM fa_wos fw\n JOIN mpe.wogrpext wwg ON fw.wo_id = wwg.wogrpext_wo_id\n JOIN mpe.wogrpext rwg ON wwg.wogrpext_root_wo_id = rwg.wogrpext_root_wo_id\n JOIN wo sub_wo ON rwg.wogrpext_wo_id = sub_wo.wo_id\n JOIN womatl wm ON sub_wo.wo_id = wm.womatl_wo_id\n JOIN itemsite mis ON wm.womatl_itemsite_id = mis.itemsite_id\n JOIN item mi ON mis.itemsite_item_id = mi.item_id\n WHERE sub_wo.wo_status IN ('R','I')\n AND wm.womatl_picklist AND wm.womatl_qtyreq > wm.womatl_qtyiss\n),\nmto_shorts AS (\n SELECT fw.wo_id AS top_wo_id,\n mi.item_number, mi.item_descrip1, mi.item_id, 'MTO'::text AS shortage_type,\n (sub_wo.wo_qtyord - sub_wo.wo_qtyrcv) AS qty_needed\n FROM fa_wos fw\n JOIN mpe.wogrpext wwg ON fw.wo_id = wwg.wogrpext_wo_id\n JOIN mpe.wogrpext rwg ON wwg.wogrpext_root_wo_id = rwg.wogrpext_root_wo_id\n JOIN wo sub_wo ON rwg.wogrpext_wo_id = sub_wo.wo_id\n JOIN itemsite mis ON sub_wo.wo_itemsite_id = mis.itemsite_id\n JOIN item mi ON mis.itemsite_item_id = mi.item_id\n WHERE sub_wo.wo_qtyord > sub_wo.wo_qtyrcv\n AND sub_wo.wo_status IN ('R','I')\n AND mi.item_id IN (\n SELECT DISTINCT itemgrpitem_item_id FROM itemgrpitem\n JOIN itemgrp ON itemgrpitem_itemgrp_id = itemgrp_id\n WHERE itemgrp_name IN ('MAGNETIC-TRANSFORMER','MAGNETIC-PLUMBING','SUB-ASSEMBLY','PCB GROUP-WORK','INPUT-BD')\n )\n),\nall_shorts AS (\n SELECT * FROM mts_shorts\n UNION ALL\n SELECT * FROM mto_shorts\n)\nSELECT s.item_number AS part_number,\n s.item_descrip1 AS part_description,\n s.shortage_type,\n COUNT(DISTINCT s.top_wo_id) AS wos_blocked,\n SUM(s.qty_needed) AS total_qty_needed,\n qtynetable(isite.itemsite_id, true) AS qty_available\nFROM all_shorts s\nJOIN itemsite isite ON isite.itemsite_item_id = s.item_id\n AND isite.itemsite_warehous_id = 35\nGROUP BY s.item_number, s.item_descrip1, s.shortage_type, isite.itemsite_id\nORDER BY wos_blocked DESC, total_qty_needed DESC;", "encodeParamsToggle": true, "paginationType": "NONE", "pluginSpecifiedTemplates": [