NS purchase order — Path 2 · inventory or assembly build

Purchasing need → PO entry → transmit → vendor confirms → product arrives → loading dock receives → Item Receipt → inventory + at location → ★ Finance alert → Vendor Bill → pay → close PO

Path 2 is the PO process when triggered by an internal purchasing need — inventory replenishment, assembly build components, packaging supply, or general purchasing. No Sales Order link; no customer PO# threading. Product arrives at the GFS facility, loading dock receives it, Item Receipt is completed in NetSuite, and inventory is credited at the correct location (inventory_balance.quantityavailable += received qty). The universal ★ automation alert then fires to Finance because receiving happens at the dock but billing/payment is Finance-owned. Finance reviews the PO + Item Receipt + supporting docs (packing slip, vendor invoice), processes the Vendor Bill, and pays per vendor terms. PO closes once all items received + billed + paid + any shortages/damages/substitutions/pricing issues resolved. Workflow contract: po_lifecycle_inventory_or_build_path (risk 2). No customer-side cycle on this path — the memo field carries an internal req# or vendor invoice# instead of a customer PO#.

PATH 2 REAL no customer PO# threading · internal req# only ★ Finance alert pending NS automation

Pipeline — Path 2 deep view (purchasing need → receive → Finance)

idle
Path 2 inventory or assembly build — purchasing need to PO to dock receive to Item Receipt to inventory credit to Finance to vendor bill 01 / Purchasing need identified 02 / PO entry in NetSuite (no SO link · memo = internal req# / vendor invoice#) 03 / Transmit · vendor confirms (order / pricing / delivery date) 04 / Product arrives · loading dock receives 05 / Item Receipt in NetSuite · inventory + at location 06 / ★ Finance alert (STUB) 07 / Finance review · Vendor Bill · pay per terms 08 / Resolve issues · close PO INVENTORY REPLENISHMENT. TRIGGER inventory_balance.quantityavailable < reorder_point at location EXAMPLE Item ABC-123 at NJ Heartland: 240 cases below 500 reorder point TABLES read: inventory_balance · items.reorder_point STATUS: REAL inventory replenishment qty < reorder_point at location read: inventory_balance · items DATABASE · reorder signal i ASSEMBLY BUILD COMPONENTS. TRIGGER upcoming assembly build needs BOM components not on hand EXAMPLE Melt Mates™ build run needs 2,400 lbs Bongards barrel cheddar TABLES read: work_orders · assembly_bom · inventory_balance STATUS: REAL assembly build components BOM consume upcoming read: work_orders · assembly_bom MESSAGEBUS · production need i PACKAGING SUPPLY. TRIGGER packaging materials below threshold EXAMPLE cases, labels, freight wrap, slip sheets STATUS: REAL packaging supply cases · labels · freight wrap below threshold CLOUD · supply restock i GENERAL PURCHASING. TRIGGER services, supplies, freight, equipment, contracted goods EXAMPLE freight broker engagement, NS subscription renewal, MRO supplies STATUS: REAL general purchasing services · freight · supplies equipment · contracted goods EXTERNAL · non-inventory i PURCHASE ORDER ENTERED — NS PurchOrd. No SO link on Path 2. NS RECORD: PurchOrd FIELDS WRITTEN bodyFields.tranid = "PO-7910" bodyFields.entity = vendor_id (e.g. 412 Bongards Creameries) bodyFields.memo = internal req# / vendor invoice# / brief reason bodyFields.location = destination location_id (e.g. NJ Heartland) bodyFields.expected_delivery = datetime bodyFields.createdfrom = NULL (no SO link on Path 2) lineFields[].item = item_code lineFields[].quantity = qty lineFields[].rate = vendor cost NO CUSTOMER PO# THREADING memo carries internal req# / vendor invoice# only; no SO.otherrefnum thread STATUS: REAL Purchase Order entered in NetSuite tranid = "PO-7910" · entity = vendor_id memo = internal req# / vendor invoice# createdfrom = NULL · location = NJ Heartland MESSAGEBUS · NS PurchOrd · NO customer PO# thread i D1 MIRROR (2-min hot tier). FIELDS WRITTEN purchase_orders.id, tranid, memo, entity, status, location, expected_delivery purchase_order_lines (per line) EVENT: events.po.created STATUS: REAL D1 mirror (2-min hot tier) purchase_orders + purchase_order_lines memo = internal req# (no PO# thread) event: po.created DATABASE · D1 mirror i TRANSMIT PO TO VENDOR. TODAY: manual (email PDF) FUTURE STUB: EDI 850 outbound EVENT: events.po.transmitted STATUS: REAL (manual) · STUB (auto) transmit PO to vendor manual: email PDF STUB: EDI 850 outbound event: po.transmitted CLOUD · vendor channel i VENDOR CONFIRMS. CAPTURED order accepted vendor cost locked per line expected delivery date TABLES write: purchase_orders.vendor_confirmed = 1 write: purchase_orders.expected_delivery STATUS: REAL vendor confirms order accepted · pricing locked expected delivery date captured purchase_orders.vendor_confirmed = 1 EXTERNAL · vendor reply i PRODUCT ARRIVES AT FACILITY. EXTERNAL vendor truck arrives at GFS receiving dock delivery window vs expected_delivery noted BOL / packing slip handed off STATUS: REAL (external) product arrives at facility vendor truck at GFS dock BOL / packing slip handed off delivery window vs expected EXTERNAL · physical arrival i LOADING DOCK RECEIVES PRODUCT. PHYSICAL ACTIONS unload + count pallets condition check (damages, freezer integrity, lot codes) match BOL + packing slip vs PO lines note any shortages / damages / substitutions TABLES read: purchase_orders · purchase_order_lines STATUS: REAL · warehouse-driven loading dock receives unload + count pallets condition check · lot codes match BOL + packing slip vs PO BACKEND · physical receive i FLAG SHORTAGES / DAMAGES / SUBS. ACTION short-receive line(s) noted damaged stock segregated substitutions flagged for operator review TABLES write: proposed_actions (short_ship_flag, damage_claim_open) STATUS: REAL · HITL on non-clean receive flag issues short-receive · damages substitutions proposed_actions row SECURITY · HITL i ITEM RECEIPT COMPLETED IN NETSUITE. NS RECORD: ItemRcpt FIELDS WRITTEN bodyFields.createdfrom = "PO-7910" (PO id) bodyFields.status = "Received" bodyFields.received_at = datetime bodyFields.location = location_id (e.g. NJ Heartland) lineFields[].item = item_code lineFields[].quantity_received = actual qty STATUS: REAL Item Receipt completed in NetSuite createdfrom = "PO-7910" · status = "Received" BACKEND · ItemRcpt · location captured i INVENTORY CREDITED AT LOCATION. SQL: UPDATE inventory_balance SET quantityavailable = quantityavailable + ? WHERE item_code=? AND location_id=? FIELDS inventory_balance.quantityavailable += received qty inventory_balance.last_received_at = datetime EVENT: events.inventory.credited STATUS: REAL inventory + at correct location inventory_balance.quantityavailable += received qty DATABASE · inventory_balance · event: inventory.credited i ★ FINANCE ALERT (STUB) — universal handoff. TRIGGER: Item Receipt completed EVENT: events.po.finance_alert_fired WHY: receiving at dock, billing at Finance STATUS: STUB until NS workflow build ★ automation alert → Finance events.po.finance_alert_fired · STUB until NS workflow FINANCE · ★ KEY HANDOFF i FINANCE REVIEW. CHECKS received qty matches PO + Item Receipt vendor pricing matches PO rate packing slip / vendor invoice attached any flagged issues (short-ships, damages, subs) TABLES read: purchase_orders · purchase_order_lines · item_receipts · proposed_actions STATUS: REAL · Finance-driven Finance review qty · pricing · docs flagged issues review CLOUD · Finance role i VENDOR BILL ENTERED — Finance processes against the PO. NS RECORD: VendBill FIELDS WRITTEN bodyFields.tranid = "VB-2310" bodyFields.createdfrom = "PO-7910" (PO id) bodyFields.entity = vendor_id bodyFields.memo = internal req# / vendor invoice# bodyFields.amount = vendor invoice amount NO CUSTOMER PO# THREADING on Path 2 — memo carries internal references only. STATUS: REAL Vendor Bill entered createdfrom = "PO-7910" memo = internal req# / vendor invoice# no customer PO# thread MESSAGEBUS · VendBill · no PO# thread i VENDOR BILL PAID per vendor terms. NS RECORD: VendPymt FIELDS bodyFields.appliedto = "VB-2310" bodyFields.amount = vendor cost STATUS: REAL VendBill paid VendPymt appliedto = "VB-2310" DATABASE · VendPymt i VENDOR SIDE COMPLETE. event: vendor_bill.paid STATUS: REAL vendor side complete event: vendor_bill.paid CLOUD · vendor cycle done i RESOLVE OUTSTANDING ISSUES — before close. CHECKS short-ships → vendor credit / rebill damages → claim substitutions → operator approves pricing variance → reconcile vs PO rate STATUS: REAL (HITL) resolve outstanding issues shortages · damages · subs pricing variance reconcile SECURITY · HITL i CLOSE PO. ACTION status: PO → 'Closed' fire: events.po.closed TABLES write: purchase_orders.status='Closed' STATUS: REAL close PO status = 'Closed' event: po.closed BACKEND · PO close i LEGEND Path 2 inventory / build lanes ★ Finance handoff (STUB) HITL / issue resolve

NS records created / updated · field-level detail (Path 2)

StepNS recordFieldSample valueStatus
5PurchOrdbodyFields.tranid"PO-7910"REAL
5PurchOrdbodyFields.entity (vendor)412 (Bongards Creameries)REAL
5PurchOrdbodyFields.memo — internal req# / vendor invoice#"REQ-04472"REAL
5PurchOrdbodyFields.locationNJ HeartlandREAL
5PurchOrdbodyFields.createdfromNULL (no SO link)REAL
5PurchOrdbodyFields.expected_deliverydatetimeREAL
12ItemRcptbodyFields.createdfrom"PO-7910"REAL
12ItemRcptbodyFields.status"Received"REAL
12ItemRcptbodyFields.locationNJ HeartlandREAL
13inventory_balancequantityavailable (D1)+= received qty at locationREAL
14(event)events.event_type"po.finance_alert_fired"STUB
16VendBillbodyFields.tranid"VB-2310"REAL
16VendBillbodyFields.createdfrom"PO-7910"REAL
16VendBillbodyFields.memo — internal req# / vendor invoice#"REQ-04472" (no customer PO#)REAL
16VendBillbodyFields.amountvendor invoice amountREAL
17VendPymtbodyFields.appliedto"VB-2310"REAL
20PurchOrdbodyFields.status"Closed"REAL

Customer PO# threading on Path 2 — not applicable

Path 2 POs have no Sales Order origin, so the customer PO# threading invariant from R592 does not apply. The memo field on PurchOrd and VendBill carries an internal req# or vendor invoice# instead.

Audit recipe to confirm a PO is correctly classified as Path 2: SELECT id, memo, createdfrom FROM purchase_orders WHERE id=? AND createdfrom IS NULL — if createdfrom points at a row in transactions with type='SalesOrd', this should be Path 1 instead.

Sub-contract structured detail

CTR po_lifecycle_inventory_or_build_path · risk 2 REAL

Sub-contract dispatched from the PO master when origin is inventory replenishment, assembly build components, packaging supply, or general purchasing (no SO link). Customer PO# threading is N/A.
Fan-out targets
enter_po · transmit_po · vendor_confirm · product_arrives · dock_receives · item_receipt · inventory_credit · finance_alert · finance_review · vendor_bill_enter · vendor_bill_pay · close_po
Tables touched
purchase_orders · purchase_order_lines · item_receipts · inventory_balance · vendor_bills · vendor_payments · transactions · events · proposed_actions
Inventory effect
inventory_balance.quantityavailable += received qty at location_id on Item Receipt
No-SO-link invariant
purchase_orders.createdfrom IS NULL OR the parent is not a SalesOrd. If parent is an SO, classify as Path 1 instead.