Three transaction lifecycles run the business. Sales Order is the customer side — starts with the customer order and ends with fulfillment + invoice + payment + close. Purchase Order is the vendor side — used when we buy product, ingredients, packaging, components, finished goods, or drop-ship items; ends with Item Receipt + vendor bill + vendor payment + PO closure. Work Order is the production side — used when we assemble or build finished goods; ends when the Assembly Build is completed and finished goods land back in inventory. Two cross-lane bridges keep records linked: SO Path 2 creates a WO from the SO (WO.createdfrom = SO.id), and SO Path 3 creates a PO from the SO (PO.createdfrom = SO.id). All three converge at the ★ Finance handoff post-fulfillment / post-receipt. This is the canonical "system of three" view; the per-lane masters and path-detail docs hold the field-level depth.
orders@ / danielle@events.order.closed firesevents.po.closed firesPO.createdfrom = SO.id on Path 1events.wo.closed firesWO.createdfrom = SO.id on Path 1 (customer PO# field TBD)itemfulfillment.status → 'Shipped' → events.so.finance_alert_fireditemreceipt posted → events.po.finance_alert_firedSO → IF → events.so.finance_alert_fired (WO itself doesn't fire; its parent SO does)actual_build != estimated > 5%.| Cross-record linkage | Field | Carries |
|---|---|---|
| SO → WO (Path 2) | WO.createdfrom = SO.id | preserves the SO ↔ WO link |
| SO → PO (Path 3) | PO.createdfrom = SO.id | preserves the SO ↔ PO link |
| SO → Item Fulfillment | IF.createdfrom = SO.id | inherits otherrefnum (customer PO#) |
| PO → Item Receipt | IR.createdfrom = PO.id | inherits memo (customer PO# threads on Path 1) |
| PO → Vendor Bill | VendBill.createdfrom = PO.id · VendBill.lineFields.links[].tranid = PO.tranid | inherits memo, tranid, initialtranid |
| WO → Assembly Build | AsmBuild.createdfrom = WO.id | finished-good production posting linked to its work order; carries item, quantity, custbody_waste (TBD), location |
| WO → Work Order Issue | WkOrdIss.createdfrom = WO.id | per-BOM-component issue rows; one per component decrement on the build; supports reversal if WO cancelled mid-build |
| SO → Customer Invoice | CustInvc.createdfrom = SO.id | inherits otherrefnum (customer PO# thread to invoice) |
| SO → Customer Payment | CustPymt applies against CustInvc via NS standard apply table | closes the SO money loop |
| Customer PO# thread (universal) | otherrefnum (SO, IF, CustInvc) ↔ memo (PO Path 1, VendBill) ↔ memo (WO — TBD pending Mike) | universal trace thread "72622" end-to-end (BOL.shipper_ref also carries on freight side) |
bodyFields.memo, but Mike's review is pending.