G Gaia

Switch factory

All sites — consolidated 4 factories CYTO-11 — Balakong Jaya CTSB CYTO-29 CTSB CYTOWELL-54 — Taming Jaya PIC/S CTWSB CYTOCNGZ-602 — Guangzhou CTCNGZ

Only factories you are granted appear here (Filament tenant menu). Owner is granted all; "All sites" is the consolidated owner view.

Leo Lim

leo@navi.my · Owner / Admin

Profile settings Change password

Theme

Sign out
RetailSellR&DMakeBuyStockPlanItemsGMPOpsAdminInsights

Good morning, Leo

Owner · All factories · Tuesday 7 July 2026

Raya holiday production freeze 18–20 Aug — all factories · posted by Leo · 2026-07-08

All lines pause for the holiday window — plan MO releases and shipments around the freeze.

Manage →

527,909 MYR

Open SO value

15 open orders · 527,908.70 exact

907,000 MYR

CRM pipeline

10 deals · TSL follow-up 09 Jul

3,847 MYR

Retail — July

7 sales · consolidation open

506,649 MYR

Stock value on hand

moving-average · all sites

1

Approvals waiting on YOU

1 below-floor price (OEM) · SO draft locked

Needs YOU 1 live approval 1 notification — the approval blocks a locked line until you act; the notification is an after-the-fact retail sale, just acknowledge it
Type What Ask vs limit Requested by Waiting Action
Sold below floor Kedai Pak Din — STC30 · sale already completed, review 2.80 vs floor 3.00 · cost 2.40 Kevin Wong (Sales) 06 Jul · sale confirmed, not blocked Acknowledged ✓
Price below floor Yes Global — AlphaMax V+ OEM · YGMSB draft SO 4.80 vs floor 5.00 · cost 4.10 Kevin Wong (Sales) since 07 Jul · SO draft locked Approved ✓ — line unlocked for Kevin Rejected — sent back
Stock adj > RM 5,000 illustrative SA-540 (draft) — Angelica Sinensis Extract / CK-4548, stocktake variance −6,214.50 MYR write-down · limit 5,000 Sarah Tan (FM CYTO-11) since 05 Jul · SA not applied Approved ✓ — SA-540 applied Rejected — stays draft

The red tile counts only BLOCKING approvals (1 — the OEM Yes Global AlphaMax below-floor request). Retail below-floor no longer blocks the sale: it posts after the fact as a notification (Acknowledge), so it's excluded from this count. The SA row illustrates the > RM 5,000 adjustment threshold rule. Approve/Reject are Filament Actions guarded owner-only; staff see a blocking row as "locked — waiting owner".

Is anything on fire? — one row per site · every non-zero cell links to the screen where it gets fixed
Site MOs late Machines down Maint. overdue Rooms out of range Quarantine items
CYTO-11 — Balakong Jaya CTSB · main 1 1 3 1 0
CYTO-29 CTSB quiet 0 0 0 0 0
CYTOWELL-54 — Taming Jaya PIC/S CTWSB 0 0 1 0 2
CYTOCNGZ-602 — Guangzhou CTCNGZ quiet 0 0 0 0 0

Green row = don't call them. Counts are per-tenant aggregates over the same records the module screens show — MOs past deadline, assets out of service, programs past next-due, today's temp/RH vs room limits, return lots in quarantine.

Demand-chain risk — promises to customers vs when supply actually lands
Order Deadline Supply lands Your move
NVMSB-0309

Double Root 16,800 + JuicyPop 5,917

2026-05-08 2026-05-09

PO-556 arabica · PO-558 hologram pkg

Expedite the POs or renegotiate the deadline — supply lands 1 day late
SHP-26038

TSL Health · Penang · DHL eCom

in transit 2026-07-09 at risk Chase the carrier today, before TSL calls you

Also open: PO-552 Angelica 2,000,000 mg expected 2026-04-25 — overdue supply, already on Priya's purchasing queue.

This week's money movement — display only · QuickBooks stays the ledger
Shipped value this week 41,280 MYR SHP-26041 ETA 08 Jul + SHP-26038 at risk · value illustrative
Retail cash collected 486.00 MYR RS-26-041 cash 240.00 + RS-26-040 transfer 246.00
POs due for payment 12,830 MYR PO-459 ITS · QBO bills ×3, balance due 15 Jul · from QBO refs, illustrative
July consolidation open 1,337.40 MYR 7 retail sales → one consolidated e-invoice at month end

Plus receivable to watch: Herbs & Health PJ B2B invoice due 17 Jul. Bill amounts read from QBO refs — Gaia never posts accounting entries.

Project Gaia — static mockup in Filament v3 idiom. No backend. Role dashboard; data continuous with the other screens.

Owner dashboard — field manifest

WidgetFilament classQuery (in words)Why the owner sees it
Announcement bannerCustom Widget (dismissible)announcements where active (starts_at/ends_at window) and audience matches the viewer's role ∩ factories (null = all), pinned rows first, one banner shown at a timeOwner/Admin authored, everyone reads own-audience only; "Manage →" opens admin-announcements.html (owner/admin only — staff dashboards link "All announcements →" to notifications.html instead). Dismiss ✕ is decorative here — it writes announcement_reads.read_at for the viewer so the banner won't resurface; publishing already fanned out one bell notification per matched audience member (D46).
Stat tiles ×5StatsOverviewWidgetSums across ALL tenants the user is granted (owner = all 4): open sales_orders total; CRM deals in open stages; retail_sales month-to-date; stock valuation at moving-average cost; count of approval_requests pending with approver_role=ownerOwner sees consolidated money everywhere. Every other role's dashboard is tenant-scoped and hides pipeline, margins and valuation.
Needs YOUTableWidget + Actionsapproval_requests where status=pending and approver_role=owner; kinds: price_below_floor (OEM Sell line lock ONLY — retail below-floor is soft, never creates one), stock_adjustment_over_threshold (SA draft value > RM 5,000); UNION ONE notifications row (category=sell) surfaced inline for the retail below-floor saleApprove/Reject are Filament Actions guarded by an owner-only policy — they never render for other roles; approving writes the price exception / applies the SA. Staff must NOT see the buttons, only "locked — waiting owner". The retail notification's Acknowledge just sets notifications.read_at — the sale already confirmed, nothing to unlock.
Fire matrixTableWidget (one row per factory)Per-tenant aggregate counts: MOs with deadline < today and not done; assets status=Out of Service; maintenance programs next_due < today; today's temp/RH records outside room limits; return lots in Quarantine. Each count deep-links to the module screenThe "which site do I call" view — only the owner spans tenants. FMs get the same counts but for their own site only.
Demand-chain riskTableWidgetOpen SOs where the latest expected date of covering POs > the SO delivery deadline (join via MO shortages), union shipments flagged at-risk on ETACross-module join (Sell × Buy × Ship) that no single role owns end-to-end; the owner is the one who can expedite or renegotiate.
Money movementTableWidget (4 fixed rows)Shipments shipped this week joined to SO line value; retail payments this week; open QBO bill refs due ≤ 14 d (display-only strings stored on the PO); retail consolidation open balance for the monthCash direction at a glance. Read-side only — QuickBooks stays the ledger, Gaia never posts accounting entries. Accountant role gets the detailed version.

Engine notes

  • A dashboard is a to-do list, not a report: the only actions on this page are the owner approval and the notification acknowledge; every other cell is a link into the module where the work happens.
  • Nothing here is a new table — all five widgets are derived queries over existing module records (MOs, assets, maintenance programs, temp/RH logs, returns, SOs, POs, shipments, retail sales, approval requests, notifications).
  • The factory switcher gains an "All sites — consolidated" entry for users granted every tenant; picking a single site re-scopes the same widgets to that tenant.
  • Illustrative rows are labelled: SA-540 (the > RM 5,000 adjustment threshold), shipped-value and QBO bill amounts. All other figures match the module screens exactly (527,908.70 / 907,000 / 3,846.50 / 506,649.33 / 1,337.40).
  • Approve/Reject open Filament Action modals (OEM price + SA only): price approval writes a one-time price exception (Approve once — floor unchanged); SA approval applies the adjustment and posts the movement; rejects require a reason and notify the requester. Retail below-floor sales confirm immediately and fan out a notifications row instead — Acknowledge only sets read_at, no lock/unlock semantics apply.