At a Glance
Route:/dashboard/po· For: Purchaser · Procurement Manager · Receiver · Status: Mock-data today; live wiring pending

Purchaser's cockpit. Answers "which POs are in flight, which are slipping, and where am I exposed?"
Layout: Six-tile pipeline strip (top) → action tables Pending PRs / Overdue Deliveries (left) + KPI gauges + spend visualisations (right) → full-width Over-Received POs table (bottom).
Two semicircular gauges call out the watched purchasing metrics: On-Time Delivery % and Order Completeness %.
Audience
| Tile | What it shows | Drill-down (when live) |
|---|---|---|
| PO Pipeline | 6 stages: Not Sent / Sent / Partial / Closed / Completed / Rejected — count + progress bar | → purchase-order filtered by status |
| Pending PRs for PO Creation | PR ID, Requester, Dept, Date Approved, badge (Pending PO / Hold for Info / Overdue Follow-up) |
→ purchase-request |
| Overdue Deliveries | PO ID, Vendor, Dept, Due Date, "N days overdue" (destructive colour) | → purchase-order |
| On-Time Delivery | Semicircle gauge, percent (warning colour) | — |
| Order Completeness | Semicircle gauge, percent (success colour) | — |
| Category Spend (Cur Mo vs YTD) | Donut + legend with two amounts per row | — |
| Top 5 Vendors by Spend | Horizontal bar + amount labels | → vendor-pricelist |
| Delivery Schedule | 3 stat cards: Today / This Week / Next Week counts | → good-receive-note today's expected |
| Over-Received POs | PO #, Material, Code, Vendor, Ordered, Received, Variance +N, "Variance Flagged" badge |
→ good-receive-note |
Currency renders as $ in the mock — production should localise to BU base currency.
| Question | Answer |
|---|---|
| Why are the gauges static? | Mock-data today — On-Time / Completeness will resolve to query-dataset reports from reporting-audit. |
| Which PRs surface in "Pending PRs for PO Creation"? | purchase-request where workflow_current_stage = "approved" AND po_id IS NULL. SLA threshold drives the badge variant. |
| What flags a PO as "Overdue"? | expected_delivery_date < CURRENT_DATE AND not fully received against good-receive-note. |
| Where does Over-Received variance get reconciled? | Join PO line → committed GRN line where received_qty > ordered_qty; see costing for variance posting. |
Why is $ showing not ฿? |
Mock fixture quirk; production localises to BU base currency. |
| Symptom | Cause | Action |
|---|---|---|
| Gauges show identical % for every BU | Mock fixture seeds the same poKpi.onTimeDelivery / orderCompleteness everywhere |
Inspect mock/po.ts — values are static |
| Delivery Schedule "Today" empty on a known delivery day | Mock has no today-aware filter | Live wiring filters on expected_delivery_date against CURRENT_DATE |
| Over-Received row disappeared after page reload | Mock arrays are re-imported per render — stable today; not stable when live | Verify against good-receive-note commit log once wired |
| Top Vendors bar shows duplicate vendor names | Mock fixture quirk — vendor_id not de-duped |
Live query groups by vendor_id and joins vendor-pricelist |
status → 6 PoPipelineKey valuesworkflow_current_stage = "approved" AND po_id IS NULL; SLA-based badge (Pending PO < N days, Overdue Follow-up ≥ N days)expected_delivery_date < CURRENT_DATE AND not fully received against good-receive-notevendor_id, top 5expected_delivery_date falls in today / this week / next weekreceived_qty > ordered_qtyStatic mock today. Live wiring inherits CACHE_DYNAMIC (1-min stale) from proxy hooks. Overdue Deliveries and Over-Received are time-sensitive — testers should verify recompute on tab focus once wired.
../carmen-inventory-frontend/app/(root)/dashboard/po/page.tsx../carmen-inventory-frontend/app/(root)/dashboard/_components/dashboard-po.tsx../carmen-inventory-frontend/app/(root)/dashboard/mock/po.tsmessages/en.json → dashboard.po.title = "Purchase Order Dashboard"