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
Layers:
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 WHAT THIS DOES: Inventory at a warehouse location is below the reorder point — we need to buy more. Example: 240 cases of ABC-123 at NJ Heartland is under the 500-case reorder threshold. NS RECORD: InvtryBal TECHNICAL DETAILS: 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 WHAT THIS DOES: An upcoming assembly build needs raw components we don't have on hand. Example: a Melt Mates™ run needs 2,400 lbs of Bongards barrel cheddar. NS RECORD: InvtryBal TECHNICAL DETAILS: 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 WHAT THIS DOES: Packaging materials (cases, labels, freight wrap, slip sheets) have hit a restock threshold and need to be reordered. NS RECORD: n/a TECHNICAL DETAILS: 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 WHAT THIS DOES: General purchasing — services, freight, equipment, MRO supplies, subscription renewals. Not inventory-driven. NS RECORD: n/a TECHNICAL DETAILS: 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 WHAT THIS DOES: The Purchase Order is created in NetSuite. There is NO SO link on Path 2 (createdfrom is NULL). The memo carries an internal req number or the vendor's invoice number — not a customer PO#. NS RECORD: PurchOrd TECHNICAL DETAILS: 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 WHAT THIS DOES: PO mirrors into D1 within 2 minutes. Lets us query and display the PO without round-tripping NetSuite. Event po.created fires. NS RECORD: events TECHNICAL DETAILS: 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 WHAT THIS DOES: PO sent to vendor by email PDF today (EDI 850 outbound is a future stub). NS RECORD: events TECHNICAL DETAILS: 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 WHAT THIS DOES: Vendor confirms acceptance, locked pricing, and expected delivery date. The vendor_confirmed flag is set on the D1 mirror. NS RECORD: n/a TECHNICAL DETAILS: 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 WHAT THIS DOES: The vendor's truck arrives at a GFS receiving dock. BOL and packing slip are handed off. Delivery-window-vs-expected is noted. NS RECORD: n/a TECHNICAL DETAILS: 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 WHAT THIS DOES: Receivers unload, count pallets, check condition (damage, freezer integrity, lot codes), and match the paperwork against PO lines. Anything off-spec gets noted for the next step. NS RECORD: n/a TECHNICAL DETAILS: 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 WHAT THIS DOES: Anything off-spec is flagged — short receives, damaged stock segregated, substitutions sent for operator review. A proposed_actions row is opened so the HITL queue picks it up. NS RECORD: n/a TECHNICAL DETAILS: 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 WHAT THIS DOES: Item Receipt is posted in NetSuite. createdfrom = PO id; received_at, location, and per-line received quantities are written. NS RECORD: ItemRcpt TECHNICAL DETAILS: 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 WHAT THIS DOES: Our D1 mirror increments inventory_balance.quantityavailable at the destination location by the received quantity. Event inventory.credited fires. NS RECORD: InvtryBal TECHNICAL DETAILS: 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 WHAT THIS DOES: Universal handoff — receiving happens at the dock, billing/payment is Finance-owned. The alert tells Finance to review and process the bill. NS RECORD: ItemRcpt TECHNICAL DETAILS: ★ 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 WHAT THIS DOES: Finance verifies received quantity matches PO, vendor pricing matches PO rate, the packing slip / vendor invoice is attached, and any flagged issues are reviewed. NS RECORD: ItemRcpt TECHNICAL DETAILS: 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 WHAT THIS DOES: Finance enters the Vendor Bill in NetSuite linked to the PO. On Path 2 the memo carries the internal req number or the vendor's invoice number — there is NO customer PO# threading. NS RECORD: VendBill TECHNICAL DETAILS: 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 WHAT THIS DOES: Finance pays the vendor according to terms. NetSuite posts a VendPymt record applied to the bill. NS RECORD: VendPymt TECHNICAL DETAILS: 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 WHAT THIS DOES: Vendor side complete — event vendor_bill.paid fires. NS RECORD: n/a TECHNICAL DETAILS: VENDOR SIDE COMPLETE. event: vendor_bill.paid STATUS: REAL vendor side complete event: vendor_bill.paid CLOUD · vendor cycle done i WHAT THIS DOES: Any open issues — short ships, damages, substitutions, pricing variance — must be resolved (vendor credit / rebill, claim, operator approval) before the PO can close. NS RECORD: n/a TECHNICAL DETAILS: 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 WHAT THIS DOES: PO status flips to Closed. Event po.closed logged. NS RECORD: events TECHNICAL DETAILS: 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 replenish need BOM need packaging need general need mirror sync send to vendor confirm reply vendor ships dock unload flag issues post Item Receipt qty received post-receipt alert review docs approve bill pay terms paid event wait for issues approve LEGEND Path 2 inventory / build lanes ★ Finance handoff (STUB) HITL / issue resolve
Diagram glossary · colors, icons, line styles

Color codes (node fill)

Blue / data · D1 + NetSuite records
Green / backend · HITL / processing
Light blue / cloud · external service
Red / decision · classify / HITL gate
Orange / handoff · message bus / bill
Dark blue / Finance · key handoff

Line styles (arrows)

Path 1 (SO-connected) flow
Path 2 (inventory / build) flow
Finance handoff (heavy)
Optional / dashed link

Icons used (Lucide-style)

Database / NS read or write
Cloud / external service
Decision / close gate
Backend processing
Finance handoff / payment
Freight / shipping
Inventory / receipt
Review / VendBill
Read operation
Write / create record
Cross-record linkage
Flag for review
Send / transmit
Branching / dispatch
Vendor-side step

Tip: click a step number in the navigator above to highlight that node. Toggle HITL gates / Edge labels / Escalation paths with the layer buttons. Hover any node's "i" icon for plain-English popover.

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.