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

Receiver's operations board. Answers "what's hitting the dock today, what's late, and where are receipts disagreeing with the order?"
Layout: 4 KPI cards (top: Receiving Now / Received Today / MTD / YTD) → 2×2 grid of tables (Pending PO by day-band, Overdue PO, Incomplete GRNs, Over-Received GRNs) → 2 YTD spend charts (bottom).
The Pending PO block is interactive — a 3-button tab strip (TODAY / THIS WEEK / NEXT WEEK) swaps the table client-side without navigation.
Audience
| Tile | What it shows | Drill-down (when live) |
|---|---|---|
| Receiving Now | Integer count, arrow icon (primary colour) | → good-receive-note in-progress |
| Received Today | Integer count, check icon (success colour) | → good-receive-note today |
| GRN Total (MTD) | Integer count, calendar icon | → good-receive-note month-to-date |
| GRN Total (YTD) | Formatted number, package icon | → good-receive-note year-to-date |
| Pending Purchase Orders | Tabs Today / This Week / Next Week — PO, Supplier, Expected Date, Items, Total, Priority (High / Medium / Low) |
→ purchase-order |
| Overdue Purchase Orders | PO, Supplier, Original Due Date, Days Overdue (red OVERDUE badge if ≥ 10 days), Items |
→ purchase-order |
| Incomplete GRNs (Partial Receipts) | GRN, PO, Supplier, Qty Ordered, Qty Received, Variance %, "Partially Received" badge | → good-receive-note |
| Over-Received GRNs (Excess Receipts) | GRN (AlertTriangle), PO, Supplier, PO Amount, GRN Amount, Excess, Variance % | → good-receive-note |
| Top 5 Vendors by Purchase YTD | Horizontal bar with $NM value labels |
→ vendor-pricelist |
| Purchasing Spend by Category | Grouped vertical bar: Cur Month vs YTD per category | — |
The 10-day threshold (OVERDUE_THRESHOLD) is hard-coded in dashboard-grn.tsx — production should source from a configurable SLA setting.
| Question | Answer |
|---|---|
| Why doesn't "Received Today" tick up after I commit a GRN? | Mock-data today — counts come from mock/grn.ts. Live wiring uses CACHE_DYNAMIC (1-min stale) with refetch-on-focus. |
| What classifies a PO as "Overdue" vs "Critical OVERDUE"? | Overdue = expected_delivery_date < CURRENT_DATE AND not fully received. Critical badge fires when days-overdue ≥ OVERDUE_THRESHOLD = 10 (currently hard-coded). |
| How is Variance % computed for partial / over receipts? | Frontend computes from received_qty vs ordered_qty on each row joined back to its purchase-order line. |
| Where do day-band tabs (Today / This Week / Next Week) get their lists? | purchase-order lines grouped by expected_delivery_date bucket where no good-receive-note line has been committed. |
| Why do YTD totals show in USD millions? | Mock fixture uses $M; production localises to BU base currency from master-data/exchange-rate. |
| Symptom | Cause | Action |
|---|---|---|
| Receiving Now badge stuck on same number all day | Mock has no real-time tick | Live wiring should refetch on focus and on commit-event hook |
| Overdue threshold not matching SLA policy | OVERDUE_THRESHOLD = 10 hard-coded in component |
File enhancement ticket to source from system-config/workflow config |
| Incomplete vs Over-Received GRN both show same row | Mock fixture seeded inconsistently | Live query is mutually exclusive: received_qty < ordered_qty vs received_qty > ordered_qty |
| Tab switch (Today/This Week/Next Week) doesn't change data | Mock arrays differ but state-binding may regress | Inspect pendingPoToday / pendingPoThisWeek / pendingPoNextWeek |
status (in progress for Receiving Now, commit_date = today for Received Today, etc.)expected_delivery_date bucket where no good-receive-note line committedexpected_delivery_date < CURRENT_DATE AND not fully received; days overdue = CURRENT_DATE - expected_delivery_datereceived_qty < ordered_qty, over received_qty > ordered_qty; Variance % computed frontendvendor_id, top 5Static mock today. Once wired: KPI cards and Receiving Now should refetch frequently (dock activity is real-time-ish) — CACHE_DYNAMIC (1-min stale) minimum. Top Vendors YTD can use CACHE_NORMAL (5-min) since YTD totals change slowly.
../carmen-inventory-frontend/app/(root)/dashboard/grn/page.tsx../carmen-inventory-frontend/app/(root)/dashboard/_components/dashboard-grn.tsx../carmen-inventory-frontend/app/(root)/dashboard/mock/grn.tsmessages/en.json → dashboard.grn.title = "Goods Receive Note Dashboard"