Retail shipments
deliveries
Project Gaia — static mockup in Filament v3 idiom. No backend. Retail module; customer data shared with OEM underneath (channel-flagged), screens separated.
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. Retail module; customer data shared with OEM underneath (channel-flagged), screens separated.
Retail delivery
Packing posts the retail_sale movement — FEFO picks the lot automatically, no manual lot entry.
| Field | Filament component | Type | Source | FK target |
|---|---|---|---|---|
| Delivery # | TextColumn (series RD-{yy}-{seq}) | string | stored: shipments.code — SAME shipments table as OEM, channel=retail scopes this view; RD- series vs SHP- | — |
| Tabs (In progress / Delivered) | Filament Tabs — mirrors shipments.html | derived filter | In progress = Scheduled/Out for delivery/Failed; Delivered = Delivered. Same split as the OEM Shipments list (Open/Done), applied to shipments.status | — |
| Sale # | TextColumn (link) | FK | stored: shipments.retail_sale_id — the retail_sales row this delivery packs; mirrors the OEM Shipments list's "Sales order" column | retail_sales.id |
| Progress | ViewColumn (3 step dots) — same pattern as shipments.html's Progress column, sized to retail's 3-stage journey instead of OEM's 4-stage freight one | derived | derived from shipments.status: Scheduled → 1 dot, Out for delivery → 2 dots (blue), Delivered → 3 dots (green), Failed → 2 dots (red, same step as Out for delivery — it failed mid-attempt) | — |
| Customer | TextColumn | FK | derived: sale's customer (ONE customers table, channel enum oem/retail/both) | customers.id |
| Items | TextColumn (list) | relation | derived: sale's lines (variant, qty in ctn/box) — STC30 (1 ctn = 24 box) and Double Root Coffee (1 ctn = 30 pcs) only | retail_sale_lines |
| Method | Badge | enum | stored: shipments.method — own_van / grab / lalamove / pickup | — |
| Driver | TextColumn | FK, nullable | stored: shipments.driver_user_id — Ahmad on own_van rows; null ("—") for Grab / Lalamove / Pickup, drivers are users with role Driver, not a separate table | users.id |
| Status | Badge | enum | stored: shipments.status — Scheduled / Out for delivery / Delivered / Failed; a simple status field, no custody-bin tracking | — |
| POD ✓ indicator | IconColumn, derived | bool, derived | derived: media collection 'pod' exists on this shipment — shown on Delivered rows only | — |
| Redelivery chain | Badge, amber (Failed → redelivered) / gray (↺ redelivery) | FK, self | stored: shipments.redelivery_of_id — RD-26-056 (Failed, kedai closed) carries the amber badge; RD-26-060 carries the ↺ chip pointing back to it; nullable, self-referencing shipments.id | shipments.id |
| Date | TextColumn::date() | date | stored: shipments.scheduled_date | — |
shipment movement with FEFO batch pick — FG stock and batch-trace don't know channels exist.redelivery_of_id back to the failed row — see RD-26-056 → RD-26-060.