Formulations
Project Gaia — static mockup in Filament v3 idiom. No backend. Key materials reference real raw materials from the shared inventory pool; formulations/costs are illustrative.
Switch factory
CYTO-11 — Balakong Jaya CTSB CYTO-29 CTSB CYTOWELL-54 — Taming Jaya PIC/S CTWSB CYTOCNGZ-602 — Guangzhou CTCNGZOnly factories you are granted appear here (Filament tenant menu).
Project Gaia — static mockup in Filament v3 idiom. No backend. Key materials reference real raw materials from the shared inventory pool; formulations/costs are illustrative.
Formulation
Series F-{seq} — next after F-0013.
Every edit after the first trial creates a new version (GMP traceability).
FK items.id, nullable until the product exists.
Units locked to the admin units list — staff never type units; conversions hard-coded.
Confirmed request + Approved formulation = Promote to BOM.
Workflow: Draft → Lab trial → Stability → Approved → Promoted to BOM / Archived.
| # | Material same variants pool as production BOMs | Qty per serving | UoM | Avg cost MYR / uom · read-only | Cost per serving | |
|---|---|---|---|---|---|---|
free text — not in item master yet |
MYR |
Est. cost / serving: MYR
Creates formulations + formulation_versions v1 + formulation_lines. No stock impact — costing rides the live moving-average.
| Field | Filament component | Type | Source | FK target |
|---|---|---|---|---|
| Code | TextColumn (series F-{seq}) | string | stored: formulations.code | — |
| Formulation / Ver | TextColumn; versions as related rows | string + int | stored: formulations.name, formulation_versions.version — every edit after first trial creates a new version (GMP traceability) | formulation_versions |
| Target product | SelectColumn → items | FK nullable | stored: formulations.target_item_id | items.id |
| Key materials | TextColumn (derived from lines) | relation | stored: formulation_lines (variant_id, qty_per_serving, uom) — SAME variants table as production BOMs | variants.id |
| Est. cost/serving | TextColumn::numeric() | money | derived: Σ line qty × current moving-average cost — live from the inventory engine | — |
| Trials | TextColumn::counts() → trials list | int | derived: lab_trials where formulation_version_id | lab_trials |
| Status | TextColumn badge + workflow Actions | enum | stored: Draft → Lab trial → Stability → Approved → Promoted to BOM / Archived | — |
| Create formulation (slide-over) | CreateAction::slideOver() | action | stored: formulations (code, name, target_item_id nullable, serving_qty, serving_uom, owner_user_id, rnd_request_id nullable, status enum default Draft) + formulation_versions (version=1) + formulation_lines (variant_id nullable / free_text, qty_per_serving, uom FK → admin-locked units list) | items.id · rnd_requests.id · variants.id · units |