NS purchase order — Path 1 · connected to a Sales Order

SO entered → PO created FROM SO (preserves link + customer PO# thread) → transmit → vendor confirms → vendor ships → Item Receipt (when applicable) → SO Item Fulfillment → ★ Finance alert → Vendor Bill (thread) → pay → close

Path 1 is the PO process when triggered by a Sales Order — drop ship vendor orders or customer-specific fulfillment. For each dropship_line on the SO, a Purchase Order is created FROM the SO (purchaseorder.createdfrom = so.id), preserving the SO ↔ PO link. The customer PO# threads via PO.bodyFields.memo = SO.otherrefnum (e.g. "72622") and PO.lineFields.links[].tranid = "<so.tranid> / <customer_po>" (e.g. "1217 / 72622"). Vendor ships product (direct to customer for true drop ship, or to GFS for crossdock). Item Receipt closes the PO line (skipped when direct dropship truly bypasses warehouse). After Item Fulfillment ships the SO to the customer, the universal ★ automation alert fires to Finance. Vendor Bill carries the customer PO# thread on three fields: memo, tranid, and initialtranid. Workflow contract: po_lifecycle_sales_order_connected_path (risk 3). The customer-side invoice / dunning / payment cycle runs in parallel on the SO chain — see SO Path 3 dropship for that side.

PATH 1 REAL PO.memo + lineFields.links[].tranid + VendBill threading ★ Finance alert pending NS automation

Pipeline — Path 1 deep view (PO chain + vendor side)

idle
Path 1 SO-connected — PO + vendor side, field-level depth + customer PO# threading 01 / SO origin (otherrefnum = customer PO#) 02 / PO created FROM SO (memo + lineFields.links[].tranid) 03 / Transmit · vendor confirms 04 / Vendor ships · Item Receipt (when applicable) 05 / SO Item Fulfillment to customer 06 / ★ Finance alert (STUB) 07 / Vendor Bill (memo + tranid + initialtranid) · pay 08 / Resolve issues · close PO + SO SALES ORDER (NS SalesOrd) — origin of customer PO# threading. FIELDS WRITTEN bodyFields.tranid = "1217" bodyFields.otherrefnum = "72622" (customer PO#) bodyFields.entity = customer_id SAMPLE: Driscoll SO 1217 with 3 dropship lines via Cardinal Foods (vendor #891) STATUS: REAL Sales Order created in NetSuite otherrefnum = "72622" · tranid = "1217" entity = customer_id · 3 dropship lines D1: transactions + so_lines BACKEND · NS SalesOrd · THREAD START i CLASSIFY — operator identifies dropship line on the SO. LOGIC: items.dropship = true OR items.special_order = true ACTION: trigger PO creation FROM this SO; dispatch po_lifecycle_sales_order_connected_path STATUS: REAL (operator) classify SO line · dropship = true vendor_id = 891 (Cardinal Foods) trigger PO creation FROM SO SECURITY · classifier · sub-contract i VENDOR LOOKUP — confirm vendor is active and purchasable. LOOKUP vendors.status = "active" vendors.terms (e.g. Net 30) vendor capability for the item SAMPLE: Cardinal Foods #891 · Net 30 · drop ship capable STATUS: REAL vendor lookup vendors.status = "active" terms = Net 30 Cardinal Foods #891 EXTERNAL · vendor record i PURCHASE ORDER CREATED FROM SO — preserves SO ↔ PO link + threads customer PO#. NS RECORD: PurchOrd FIELDS WRITTEN bodyFields.tranid = "PO-7833" bodyFields.createdfrom = 1217 (SO id) bodyFields.memo = "72622" (CUSTOMER PO# THREADING) bodyFields.entity = 891 (vendor: Cardinal Foods) bodyFields.expected_delivery = datetime lineFields[].item = item_code lineFields[].quantity = qty lineFields[].rate = vendor cost lineFields[].links[0].tranid = "1217 / 72622" (SO tranid + customer PO# combo) THREADING PO.memo carries customer PO# forward to vendor lineFields.links[].tranid carries the combo string for vendor reference STATUS: REAL Purchase Order created FROM SO createdfrom = 1217 (SO id) · tranid = "PO-7833" bodyFields.memo = "72622" (customer PO# thread) lineFields.links[].tranid = "1217 / 72622" MESSAGEBUS · NS PurchOrd · PO# THREAD → i D1 MIRROR (2-min hot tier). FIELDS WRITTEN purchase_orders.id, tranid, createdfrom, memo, entity, status, expected_delivery purchase_order_lines (per line) EVENT: events.po.created STATUS: REAL D1 mirror (2-min hot tier) purchase_orders + purchase_order_lines createdfrom = 1217 · memo = "72622" event: po.created DATABASE · D1 mirror i TRANSMIT PO TO VENDOR. TODAY: manual (email PDF to Cardinal Foods) FUTURE STUB: auto-transmit (EDI 850 outbound) EVENT: events.po.transmitted STATUS: REAL (manual) · STUB (auto) transmit PO to vendor manual: email PDF to vendor today STUB: EDI 850 outbound event: po.transmitted CLOUD · vendor channel i VENDOR CONFIRMS — order, pricing, expected ship/delivery date. CAPTURED order accepted vendor cost locked per line expected ship date / delivery date any subs / shortages flagged TABLES write: purchase_orders.vendor_confirmed = 1 write: purchase_orders.expected_delivery = datetime STATUS: REAL · operator records vendor confirms order / pricing / delivery order accepted · pricing locked expected ship / delivery date captured purchase_orders.vendor_confirmed = 1 EXTERNAL · vendor reply i VENDOR SHIPS — directly to customer (drop ship) or to GFS crossdock. EXTERNAL ACTION vendor: Cardinal Foods picks + packs + ships carrier: vendor-managed tracking + ETA captured ROUTE direct dropship → customer dock (skip GFS warehouse) crossdock → GFS warehouse (transient) STATUS: REAL (external) vendor ships Cardinal Foods picks + ships direct to customer OR crossdock tracking + ETA captured EXTERNAL · vendor side i ITEM RECEIPT (when applicable) — closes PO line; inherits PO linkage. NS RECORD: ItemRcpt FIELDS WRITTEN bodyFields.createdfrom = "PO-7833" (PO id) bodyFields.status = "Received" bodyFields.received_at = datetime INHERITANCE inherits PO.memo + lineFields.tranid via NS std linkage INVENTORY EFFECT (crossdock case only) inventory_balance.quantityavailable += qty (transient, drops on IF) SKIP CASE Direct dropship may skip warehouse entirely — Item Receipt N/A STATUS: REAL Item Receipt against PO (when applicable) createdfrom = "PO-7833" (PO id) PO.memo "72622" inherits via NS std linkage PO line closes; crossdock transient OR skip on direct BACKEND · ItemRcpt · PO# threads via PO i CLOSE PO LINE. SQL: UPDATE purchase_orders SET status='Received' WHERE id=7833 EVENT: events.po.line_received STATUS: REAL PO line closed UPDATE purchase_orders status = 'Received' event: po.line_received DATABASE · PO close i SO ITEM FULFILLMENT — runs on the SO chain; PO chain side is complete after Item Receipt. NS RECORD: ItemShip FIELDS WRITTEN bodyFields.createdfrom = 1217 (SO id, NOT po.id) bodyFields.otherrefnum = "72622" (inherits from SO) CROSS-LINK See ns-sales-order-path-3-dropship.html for SO chain detail STATUS: REAL SO Item Fulfillment to customer ItemShip: createdfrom = 1217 (SO id) · otherrefnum = "72622" BACKEND · runs on SO chain · cross-link to SO Path 3 i ★ FINANCE ALERT (STUB) — universal handoff. TRIGGER: Item Receipt (or fulfillment on direct dropship) 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 VENDOR BILL ENTERED — Finance posts against the PO. Carries customer PO# on THREE fields. NS RECORD: VendBill FIELDS WRITTEN bodyFields.tranid = "1217 / 72622" bodyFields.initialtranid = "1217 / 72622" bodyFields.memo = "72622" (customer PO# threading) bodyFields.createdfrom = "PO-7833" (PO id) bodyFields.entity = 891 (Cardinal Foods) THREADING (all three fields carry customer PO#) memo = "72622" tranid = "1217 / 72622" initialtranid = "1217 / 72622" STATUS: REAL Vendor Bill entered (Cardinal Foods) bodyFields.memo = "72622" bodyFields.tranid = "1217 / 72622" bodyFields.initialtranid = "1217 / 72622" createdfrom = "PO-7833" MESSAGEBUS · VendBill · CUSTOMER PO# THREAD i VENDOR BILL PAID per vendor terms. NS RECORD: VendPymt FIELDS bodyFields.appliedto = "VB-2244" bodyFields.amount = vendor cost (lower than customer invoice) STATUS: REAL Vendor Bill paid VendPymt · per vendor terms appliedto = "VB-2244" 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 SHORTAGES / DAMAGES / SUBS / PRICING — before close. CHECKS short-ships → vendor credit / rebill damages → claim substitutions → operator approves pricing variance → reconcile vs PO rate STATUS: REAL (HITL) resolve issues shortages · damages · subs pricing variance reconcile SECURITY · HITL i CLOSE PO. ACTION: status: PO → 'Closed'; event po.closed STATUS: REAL close PO status = 'Closed' event: po.closed BACKEND · close i CLOSE SO — once both customer side + vendor side complete. ACTION: status: SO → 'Closed' CROSS-LINK: SO Path 3 dropship for customer-side payment cycle STATUS: REAL close SO (both sides done) status = 'Closed' see SO Path 3 for customer side BACKEND · SO close i SO SIDECAR — customer-side cycle (invoice + dunning + payment apply). DETAIL Customer invoice (CustInvc.otherrefnum = "72622") posted by Finance. Past due → ar_aging_action_plan dunning workflow. Customer payment received + applied. Runs in parallel to vendor-side cycle. SEE: ns-sales-order-path-3-dropship.html STATUS: REAL SO sidecar · customer side CustInvc + dunning + CustPymt parallel cycle on SO chain DATABASE · cross-link to SO Path 3 i LEGEND Path 1 SO-connected lanes ★ Finance handoff (STUB) HITL / issue resolve

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

StepNS recordFieldSample valueStatus
1SalesOrdbodyFields.otherrefnum (thread start)"72622"REAL
1SalesOrdbodyFields.tranid"1217"REAL
4PurchOrdbodyFields.tranid"PO-7833"REAL
4PurchOrdbodyFields.createdfrom1217 (SO id)REAL
4PurchOrdbodyFields.memo — customer PO# threading"72622"REAL
4PurchOrdlineFields.links[].tranid — SO+PO# combo"1217 / 72622"REAL
4PurchOrdbodyFields.entity — vendor891 (Cardinal Foods)REAL
4PurchOrdbodyFields.expected_deliverydatetimeREAL
9ItemRcptbodyFields.createdfrom"PO-7833"REAL
9ItemRcpt(inherits) memo via NS std linkage from PO"72622"REAL
11ItemShipbodyFields.createdfrom1217 (SO id)REAL
11ItemShipbodyFields.otherrefnum"72622"REAL
12(event)events.event_type"po.finance_alert_fired"STUB
13VendBillbodyFields.memo — customer PO# threading"72622"REAL
13VendBillbodyFields.tranid"1217 / 72622"REAL
13VendBillbodyFields.initialtranid"1217 / 72622"REAL
13VendBillbodyFields.createdfrom"PO-7833"REAL
14VendPymtbodyFields.appliedto"VB-2244"REAL
17PurchOrdbodyFields.status"Closed"REAL

Customer PO# threading on Path 1 (PO chain + vendor side)

Path 1 carries the customer PO# ("72622") through the PO chain into the vendor bill. The thread appears in 6+ field positions across 4 NS records on the vendor side alone (and threads into the SO sidecar for customer-side records):

Single-grep recipe across the Path 1 PO chain: grep "72622" across purchase_orders.memo + vendor_bills.memo + vendor_bills.tranid + vendor_bills.initialtranid lights up every record on the vendor side. Combine with transactions.otherrefnum + customer_invoices.otherrefnum for the full end-to-end trace.

Sub-contract structured detail

CTR po_lifecycle_sales_order_connected_path · risk 3 REAL

Sub-contract dispatched from the PO master when the PO origin is a Sales Order requiring drop ship or customer-specific fulfillment. Carries the customer PO# threading from the SO chain into the PO chain and onward into the Vendor Bill.
Fan-out targets
create_po_from_so · transmit_po · vendor_confirm · vendor_ships · item_receipt · so_fulfilled · finance_alert · finance_review · invoice_customer · vendor_bill_enter · vendor_bill_pay · customer_payment_apply · close_po · close_so
Tables touched
purchase_orders · purchase_order_lines · item_receipts · item_fulfillments · customer_invoices · customer_payments · payment_applications · vendor_bills · vendor_payments · transactions · events
Threading verify_check
PO.memo == SO.otherrefnum AND VendBill.memo == PO.memo AND VendBill.tranid LIKE '%' || customer_po_number — enforces customer PO# threading invariant end-to-end
Vendor-side
vendor bill + payment run in parallel to SO customer-side invoice/payment