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

Materials

+ New material
Name Variant code / SKU Category Default supplier Default purchase price Default sales price
Showing 1–18 of 431 (sample rows from Katana snapshot)

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

Materials — field manifest

FieldFilament componentTypeSourceFK target
NameTextColumn::searchable(isIndividual)->url()->sortable()string (material / variant)derived display: '{name} / {variant code | supplier tag}' — keep name and variant code as distinct stored fieldsvariants.id
Variant code / SKUTextColumn::searchable(isIndividual)string, nullablestored per variant, optional (empty on "BBeast Men's Candy Sachet"); can differ from Name suffix (Belgian Dark Cocoa → CBADCP22PLARO91B)
CategoryTextColumn::badge() + SelectFilterstring lookupstored: items.category_id — free-form tag shared across items (13+ values observed)categories.id
Default supplierTextColumn::placeholder('—')string, nullablestored FK — unpopulated across the snapshot despite supplier names embedded in Name stringssuppliers.id
Default purchase priceTextColumn::money('MYR')money MYRstored default unit cost; defaults to 0 MYR when unset (every visible row 0)
Default sales priceTextColumn::money('MYR')->placeholder('')money MYR, nullablestored, optional — populated only on materials also sold directly (2 of 18 sample rows)
Active / Archive tabsTabs (lifecycle filter); Archive view not capturedbool flagstored: items.archived_at
Bulk actionsBulkAction: Bulk edit / Archive / Delete (+ Print, Export header actions)actionKatana toolbar icon cluster (print, edit, export/archive, trash)

Engine notes

  • Header count "431 items" = total materials in Active state, not just rendered rows.
  • Name is a computed display string '{name} / {variant code | supplier tag}' while SKU is stored separately — schema keeps them distinct and derives the label.
  • Default purchase price defaults to 0 MYR when unset — money stored as (amount, currency), account base currency MYR.
  • Default sales price is nullable/blank rather than defaulted to 0 — only materials flagged sellable get a value.
  • No stock quantities, committed/available, or cost columns here — inventory figures live in the Stock module; this screen is pure item master data.
  • "Import done." toast in capture — materials support bulk CSV import with completion notification. Imported unit codes pass through the units alias map (psc→pcs, KG→kg, gg→g) — variants.uom_id is FK → the admin-locked units table; staff never type units, conversion factors (kg→mg) are hard-coded.
  • No totals/footer row; list sorted ascending by Name.
  • Bulk actions: BulkAction::make('bulkEdit')->form(...) (category / purchase price / batch tracking); ->archive() sets items.archived_at; ExportAction runs via the Filament export job (async notification, same pipeline as the import toast); DeleteBulkAction is policy-guarded — deletable only when no stock_movements rows reference the variant, so items with ledger history are skipped (archive instead — GMP immutability). Toolbar Export CSV icon runs the same export over the filtered set when nothing is selected.