High-altitude master view of the PO process — the vendor side of the transaction. POs originate in one of two ways: Path 1 connected to a Sales Order (drop ship vendor orders or customer-specific fulfillment), or Path 2 for inventory replenishment, assembly build components, packaging, or general purchasing. Master dispatches into one of two sub-contracts — Path 1 SO-connected (drop ship; carries customer PO# threading from the SO chain via PO.memo and VendBill.memo/tranid/initialtranid) or Path 2 inventory/build (no customer PO# threading; memo carries internal req# or vendor invoice#). After Item Receipt, the universal ★ automation alert fires to Finance — receiving happens at the dock but billing/payment is Finance-owned. Finance reviews PO + Item Receipt + supporting docs before processing the Vendor Bill. PO closes once items received + billed + paid + any shortages/damages/substitutions/pricing resolved. See path detail docs for field-level depth.
items.dropship = true OR items.special_order = truevendors.status = 'active' · terms known · item purchasablememo + createdfrom = so.id.PurchOrdpurchase_orders · purchase_order_lines · transactions (PurchOrd)memo = customer_po_number · createdfrom = so.id · lineFields.links[].tranid = "<so.tranid> / <customer_po>"memo = internal req# / vendor invoice# · createdfrom = NULLcreatedfrom IS NOT NULL AND parent is a Sales Order → po_lifecycle_sales_order_connected_pathpo_lifecycle_inventory_or_build_pathPurchOrd · ItemRcpt · ItemShip · VendBill · VendPymtPO.memo = SO.otherrefnum · VendBill.memo/tranid/initialtranid carry customer PO#PurchOrd · ItemRcpt · VendBill · VendPymtinventory_balance.quantityavailable += received qty at location_idmemo carries internal req# or vendor invoice#ItemRcpt (createdfrom = po.id)item_receipts · inventory_balance (Path 2)events.po.finance_alert_firedVendBill · VendPymtmemo = customer_po · tranid = initialtranid = "<so.tranid> / <customer_po>"memo = internal req# / vendor invoice# (no customer PO#)PurchOrd → 'Closed'events.po.closed| kind | name | purpose |
|---|---|---|
| D1 table | purchase_orders | PO header mirror · createdfrom, memo, entity, status |
| D1 table | purchase_order_lines | PO line-level mirror · item, qty, rate, lineFields.links[].tranid |
| D1 table | item_receipts | vendor receipt closes PO line · createdfrom = po.id |
| D1 table | item_fulfillments | Path 1 sidecar · ships SO line to customer |
| D1 table | vendor_bills | VendBill mirror · Path 1 carries customer PO# on memo/tranid/initialtranid |
| D1 table | vendor_payments | VendPymt mirror · appliedto = vendor_bill.id |
| D1 table | inventory_balance | Path 2 credits qty at location_id on Item Receipt |
| D1 table | transactions | PurchOrd / ItemRcpt / VendBill / VendPymt rows |
| D1 table | events | po.transmitted · po.finance_alert_fired · po.closed |
| Workflow | purchase_order_lifecycle | master dispatcher (risk 2) |
| Workflow | po_lifecycle_sales_order_connected_path | Path 1 sub-contract (risk 3) |
| Workflow | po_lifecycle_inventory_or_build_path | Path 2 sub-contract (risk 2) |
| NS record | PurchOrd · ItemRcpt · VendBill · VendPymt | system-of-record across the 2 paths |
createdfrom. Stable but worth surfacing on intake.events.po.finance_alert_fired. NS workflow trigger config pending Mike's deploy.<so.tranid> / <customer_po>" combo, auto-match against originating PO without manual keying.