The simplest of the three paths. Items already on hand at the fulfillment location — no production, no PO. The team reserves qty against the SO, warehouse picks/packs/stages, Item Fulfillment is created carrying createdfrom = so.id, and the customer PO# (otherrefnum on the SO) threads forward to the Item Fulfillment and the Customer Invoice via NS standard linkage. Workflow sub-contract: so_lifecycle_inventory_path (dispatched from sales_order_lifecycle master).
| Step | NS record | Field | Sample value | Status |
|---|---|---|---|---|
| 2 | SalesOrd | bodyFields.tranid | "1217" | REAL |
| 2 | SalesOrd | bodyFields.otherrefnum — customer PO# (thread start) | "72622" | REAL |
| 2 | SalesOrd | bodyFields.entity | 2147 | REAL |
| 2 | SalesOrd | bodyFields.total | 18420.00 | REAL |
| 4–5 | (none) | inventory_balance.reserved_qty += qty | D1 UPDATE | REAL |
| 10 | ItemShip | bodyFields.createdfrom | 1217 (SO id) | REAL |
| 10 | ItemShip | bodyFields.otherrefnum — inherits from SO | "72622" | REAL |
| 10 | ItemShip | bodyFields.status | "Shipped" | REAL |
| 11 | (event) | events.event_type | "so.finance_alert_fired" | STUB (NS workflow pending) |
| 12 | CustInvc | bodyFields.otherrefnum — threads from SO | "72622" | REAL |
| 12 | CustInvc | bodyFields.createdfrom | 1217 (SO id) | REAL |
| 15 | CustPymt | bodyFields.appliedto | "INV-9981" | REAL |
| 16 | SalesOrd | bodyFields.status | "Closed" | REAL |
The customer PO# ("72622" in the running example) is threaded by:
bodyFields.otherrefnum = "72622" — thread originotherrefnum from SO via NS standard linkage; createdfrom = 1217bodyFields.otherrefnum = "72622"; createdfrom = 1217appliedto = "INV-9981" (no direct PO# field; trace via invoice)Single-grep recipe: grep "72622" across transactions.otherrefnum + item_fulfillments.otherrefnum + customer_invoices.otherrefnum lights up every record in this SO chain.
so_lifecycle_inventory_path · risk 2 REALsales_order_lifecycle master when an so_line classifies as inventory_item. Single SO can dispatch multiple sub-contracts if lines differ in type.inventory_balance · item_fulfillments · customer_invoices · invoice_lines · customer_payments · payment_applications · transactions · eventsCustInvc.otherrefnum == SO.otherrefnum (warn in verify_checks)