G Gaia

Switch factory

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).

Leo Lim

leo@navi.my · Owner / Admin

Profile settings Change password

Theme

Sign out
RetailSellR&DMakeBuyStockPlanItemsGMPOpsAdminInsights

CRM — deals pipeline

10 deals · pipeline value 907,000 MYR
Flag Company Contact Deal Source Producing entity Stage Est. value People (PIC) Next action Last activity

Weekly review

week of 2026-07-06 · snapshot 2026-07-09

Moved this week 2

Gone quiet 2

no contact > 7 days

Flagged 2

Stuck too long 2

days in current stage

Won / Lost this week

Objections breakdown

Lost-reason counts · last 90 days · 7 lost deals

Lead time3
Price2
Went with competitor1
Ghosted1

From deals.lost_reason on Lost deals — captured on the deal detail page.

No kanban — list view + this weekly-review panel per the house UX rule. Sections derive from deal stage-change history, the append-only activity diary (last-contact), the flag toggle, and lost-reasons.

Project Gaia — static mockup in Filament v3 idiom. No backend. Companies echo the real customer prefixes in the Katana data (YGMSB, ROYKL, TSLSB…); deals are illustrative.

CRM — field manifest

FieldFilament componentTypeSourceFK target
FlagIconColumn (toggle) ★boolstored: deals.flag — clickable per row; surfaces the deal in the weekly-review "Flagged" section
Company / ContactTextColumn::url() / TextColumn; row → detailFK + stringstored: deals.customer_id (nullable pre-conversion), deals.contact_name. Row links to crm-deal-detail.htmlcustomers.id
DealTextColumnstringstored: deals.title
SourceTextColumn badge; SelectFilterenumstored: deals.source — Alibaba / Referral / Exhibition / Website / WhatsApp-social
Producing entityTextColumn badgeFKstored: deals.factory_id — CRM is visible to sales across granted factories, deals pin the producer earlyfactories.id
StageSelectColumn badge; tab filterenumstored: lead → quoted → sampling → ready_to_convert → won / lost. Sampling mirrors the linked rnd_request 5-status; Won gets "Create SO" prefilled
Trial # chipBadge beside the Stage badge (Sampling rows only)DERIVEDDERIVED — no new column: max(trial_no) on rnd_progress_log via the deal's linked rnd_request; amber at 3–4 trials, red at 5+rnd_progress_log
Est. valueTextColumn::numeric()->summarize(Sum)moneystored: deals.est_value
People (PIC)Chips (primary + collaborators)pivotstored: deal_pics (deal_id, user_id, is_primary) — one is_primary owner (shown in list) + N collaboratorsusers.id
Next action / Last activityTextColumn; diary relation manager on detailstring + date / relationstored: deals.next_action, deals.next_action_date; last activity derived from deal_activities (append-only)deal_activities
Lost reasonSelect + Textarea (on detail, stage=lost)enum + textstored: deals.lost_reason (Price / Lead time / MOQ too high / Went with competitor / No budget-timing / Ghosted / Spec mismatch), deals.lost_note — feeds the Objections breakdown
Activity diaryRelationManager (append-only) on detailchild tablestored: deal_activities (type enum Call / WhatsApp / Meeting / Email / Quote sent / Sample sent / Note, note, at, by_user_id, next_follow_up_date) — insert-onlydeals.id / users.id
Weekly reviewWidget / panel below the listderivedderived: Moved this week / Gone quiet (no diary contact >7d) / Flagged (deals.flag) / Stuck too long (days-in-stage) / Won-Lost this week + Objections breakdown over deals.lost_reasondeals / deal_activities
New deal (CreateAction slideOver)Filament CreateAction, slideOverform → insertcreate writes deals(customer_id nullable, contact_name, title, factory_id, stage default lead, est_value, source) + deal_pics rows (primary + collaborators) + first deal_activities note row in one transactiondeals / deal_pics / deal_activities

Engine notes

  • Deliberately simplified: one deals table + a deal_pics pivot + an append-only deal_activities diary. No email sync, no scoring, no kanban — list view + weekly-review panel per the house UX rule.
  • The activity diary is append-only — rows are never edited or deleted; corrections are new Note entries. It lives on crm-deal-detail.html (the slide-over is create-only).
  • Multiple PICs: deal_pics pivot with one is_primary owner + collaborators; the list shows the primary chip, collaborators get the deal's notifications.
  • Sampling (R&D) stage links to R&D: sample requests reference a formulation/trial and the request's own 5-status drives the sampling sub-state, so lab work and deals stay connected. ready_to_convert is the pre-Won holding stage (quote accepted / sample approved, awaiting PO).
  • Won → "Create SO" action jumps into the factory tenant's SO form with customer + entity prefilled (the existing NaVi flow, one click shorter) → so-new.html prefilled.
  • + Deal opens the CreateAction slide-over: creating a deal inserts a deals row (customer_id nullable until Won) + deal_pics + its first deal_activities note row in one transaction, then opens the deal detail page.

Deal

New deal

Not saved

deals.customer_id nullable pre-conversion — converts on Won.

deals pin the producer early.

MYR

deals.source — how the lead reached us.

Kevin Wong primary Jason Teh R&D

One primary owner + collaborators (deal_pics pivot). The primary shows in the list.

Posts a deal_activities row (type=note) alongside the new deal.