Purchase Orders
A Purchase Order (PO) is a commitment to a vendor for a specific Resource on a specific Lot at a specific price.
At a glance
- POs are the highest-volume table in the system — 2,432,418 rows on Test (2026-06-02).
- Each PO traces back to one
EstimateActivityrow (onlyType='y'activities ever generate POs). - Lifecycle: estimate runs → PO generated → BC creates a real PO → trade sees it in Trade Portal → builder approves → BC turns it into an approved bill → BC pays → payment syncs back.
- “No-dollar” POs (
Lot.AllowNoDollarPOs) get a PO number so the work shows up in the schedule but never become bills. - Set
Lot.RecalcPO = 1to regenerate POs on the next pass — the standard fix when an option or vendor bid changed late.
How a PO is born
Section titled “How a PO is born”The first six steps happen automatically when a lot is set up for production. Each step is essentially a row showing up in a different table.
EstimateActivity + active VendorBid rows.PurchaseOrder with one row per resource per lot.order.aspx, quick-view.aspx).After the PO exists
Section titled “After the PO exists”The remaining steps happen as the build progresses — builder approves work, vendor uploads waiver, BC pays, variance posts if amounts differ.
WorkApproval.aspx → spProcessPaymentReview).TransmissionPaymentStatus.Tables
Section titled “Tables”The PO subsystem is PurchaseOrder in the middle, surrounded by lookup views, transmission queues, and audit logs.
Full PO table reference
| Table | What |
|---|---|
PurchaseOrder | Headers and lines. |
vwLookupPONumber | PO number lookup. |
UnpaidPurchaseOrder, vwUnpaidPurchaseOrder | Open POs (not yet billed/paid). |
vwLoadWorkPOProcess | Used during PO generation. |
TransmissionPOGenerate, TransmissionPOApprove, TransmissionPOCancel | Outbound queues to Business Central. |
vwTransmissionPurchaseOrderError | POs that failed to transmit. |
BuilderPortalWorkOrderApprovalLog | Audit log of every Builder Portal approval. |
vwGroupRecalcPO | Used when bulk-recalculating POs. |
PermanentOrderLog | History of permanent-order overrides. |
”No-dollar” POs
Section titled “”No-dollar” POs”Some POs are issued for activities that have no monetary commitment (e.g. internal QA visits) — controlled by Lot.AllowNoDollarPOs. These still get a PO number so the work appears in the Trade Portal schedule but never become bills.
Where in the apps
Section titled “Where in the apps”| App | Where |
|---|---|
| SMART | Project Management → PO Management |
| SMART 2.0 | production/, accounting/ |
| Builder Portal | PurchaseOrders.aspx, WorkOrders.aspx, WorkApproval.aspx |
| Trade Portal | order.aspx, quick-view.aspx, viewPOfromSchedule.aspx, work-orders.aspx, work-order-search.aspx |
Common queries
Section titled “Common queries”Open POs for a project, by trade
SELECT v.VendorName, COUNT(*) AS OpenPOs, SUM(po.Amount) AS OpenAmountFROM dbo.PurchaseOrder poJOIN dbo.Vendor v ON v.VendorID = po.VendorIDWHERE po.ProjectID = @ProjectID AND po.Status IN ('O','A') -- Open / ApprovedGROUP BY v.VendorNameORDER BY OpenAmount DESC;