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&DMakeBuyStockPlanItemsGMPAdminInsights

Customers

Name E-mail address Currency Phone number Reference ID Category Comment
Showing 1–10 of 10 (full customer set from Katana snapshot)

Project Gaia — static mockup in Filament v3 table idiom. No backend. Sample data: Katana tenant snapshot 2026-04-12.

Customers — field manifest

FieldFilament componentTypeSourceFK target
CheckboxTable bulk selection (BulkAction Delete, requiresConfirmation())selectUI: bulk delete is the only lifecycle action; rows referenced by sales orders are protected/skipped
NameTextColumn::searchable(isIndividual)->url()string, REQUIREDstored: customers.display_name — the one required field on the card and what this column shows; links to the customer cardcustomers.id
First / Last / Company nameTextInput ×3 (card only, no table columns)string, nullable eachstored: customers.first_name / last_name / company_name — Katana splits the person from the company; display_name is what every list and SO shows
E-mail addressTextColumn::searchable(isIndividual)string, nullablestored: customers.email — supports multiple comma-separated addresses in one field (6 of 10 rows blank)
CurrencyTextColumn (badge-style); Select on the cardISO 4217 enumstored: customers.currency — defaulted from factory base currency (MYR) on create; card label is "Customer currency" and the base option renders as "MYR (Base)"currencies
Discount %TextInput::numeric()->suffix('%') (card only)decimal, nullablestored: customers.discount_percent — default discount applied to new SO lines for this customer
Price listsSelect::multiple()->relationship() (card only)many-to-manypivot: customer_price_list — helper "Price list price overrides discount %"; precedence: price list price > customer discount %, and the Gaia floor-price check applies after bothprice_lists.id
Phone numberTextColumn::searchable(isIndividual)->toggleable()string, nullablestored: free text — empty for every row in this dataset (card label is "Phone")
Reference IDTextColumn::searchable(isIndividual)->toggleable()string, nullablestored: external/accounting-system identifier for integration matching — empty on all rows
CategoryTextColumn::searchable(isIndividual)->toggleable() + SelectFilter (future)string, nullablestored: free-text or picklist customer grouping tag — empty on all rows
CommentTextColumn::searchable(isIndividual)->toggleable()string, nullablestored: free-text note — only visible in 2560px capture, empty on all rows
Billing addressTextarea (card only)text, nullablestored: customers.billing_address — free-text address block
Default shipping addressTextarea (card only)text, nullablestored: customers.default_shipping_address — NULL means "Same as billing address" (the card's placeholder)

Engine notes

  • Row-count summary above grid: "10 customers" — derived count of filtered rows, no totals/footer row otherwise.
  • Currency auto-defaults to the account base currency (MYR) on creation — rows created with nothing but a name (natus, natusvin, natusvinc, natuvincere) still carry MYR.
  • E-mail field accepts a comma-separated list of multiple addresses stored in a single field (Skin Lovers Sdn Bhd row).
  • "Import done." toast captured at top of DOM — customers support CSV import with async completion notification (Import toolbar button → Filament ImportAction).
  • Customer card (slide-over) uses the Filament explicit Save/Cancel idiom, not Katana's autosave "Not saved" chip; Delete is a header action next to the close button.
  • Pricing precedence on SO lines: price-list price overrides the customer discount %; the Gaia floor-price check runs after both.
  • Red/orange cell outline on the Skin Lovers e-mail cell indicates the grid is inline-editable with per-cell validation/dirty-state highlighting.
  • No pagination controls in Katana — full dataset rendered in one grid; no status/state machine on customers, deletion is the only lifecycle action exposed.

Customer

Not saved

The one required field — what the Customers list and sales orders show.

%

Default discount on new SO lines.

Price list price overrides discount %.

Leave empty to ship to the billing address (stored NULL = same as billing).