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

Products

+ New product
Name Variant code / SKU Category Default sales price Cost Profit Margin
Showing 1–18 of 333 (sample rows from Katana snapshot)

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

Products — field manifest

FieldFilament componentTypeSourceFK target
NameTextColumn::searchable(isIndividual)->url()->sortable()string (product / variant)derived: product.name + ' / ' + variant option values; one grid row per variantvariants.id
Variant code / SKUTextColumn::searchable(isIndividual)string, nullablestored: variants.sku — separate field, not derived (BBeast rows show variant in Name but empty SKU)
CategoryTextColumn::badge() + SelectFilterstring lookupstored: items.category_id (End Product, Tea Powder observed)categories.id
Default sales priceTextColumn::money('MYR')money MYR, nullablestored per variant; 0 on most rows, blank (never set) on 2 rows in sample
CostTextColumn::money('MYR') (not filterable)money MYRderived: inventory engine cost — moving average / BOM + operations roll-up
ProfitTextColumn::money('MYR')->color(fn) red when negativemoney MYRderived: default sales price − cost (verified on every dump row)
MarginTextColumn::state(fn) — blank when price 0percent, nullable renderderived: profit ÷ default sales price; engine suppresses divide-by-zero (blank on all sample rows)
Prod. time— (dropped: empty across entire snapshot)durationderived: total production time rolled up from recipe/operations rows
Active / Archive tabsTabs (lifecycle filter); Archive view not capturedbool flagstored: items.archived_at
Bulk actionsBulkAction: Bulk edit / Archive / Delete / ExportactionKatana toolbar icon cluster (download, print, edit, archive, delete)

Engine notes

  • Profit = Default sales price − Cost, computed per row (all dump rows verify exactly).
  • Margin = Profit ÷ Default sales price, rendered blank when sales price is 0 — engine suppresses divide-by-zero instead of showing 0% or infinity.
  • Cost is engine-computed (moving average / BOM roll-up) — non-filterable column with 2-decimal values on items whose sales price was never set.
  • One grid row per variant, not per product: "Double Root Coffee" appears 3× with variant codes 2023-01 / 2024-01 / 2024-02; Name concatenates product name + ' / ' + variant option values.
  • Item count "333 items" is the total across pagination/virtual scroll, not the rendered rows.
  • "Import done." toast in capture — products support async CSV import with completion notification.
  • No totals/footer row on this grid — no tfoot summarizer.
  • Money always suffixed "MYR"; Katana shows negatives with plain minus — mockup upgrades negatives to Filament red per idiom.
  • Bulk actions: BulkAction::make('bulkEdit')->form(...) (category / 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.