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

Retail shipments

Today's van route — Tue 7 Jul driver: Azman · van CYTO-11 · derived: own-van deliveries dated today, drag to reorder Print run sheet
1

Aunty Mei · Balakong

RD-26-058 · RS-26-041

COD 192.00 MYR

2

Kedai Pak Din · Seri Kembangan

RD-26-059 · RS-26-040

No COD — paid by transfer

3

Herbs & Health PJ · Petaling Jaya

RD-26-060 · RS-26-038

No COD — B2B invoice 14d

Route COD: 192.00 MYR · collected 192.00 — driver returns cash to counter float, logged against RS-26-041.
deliveries · 3 on today's van route · COD with courier: 134.40 MYR
Delivery # Sale Customer Method Area Status COD Date Note

Project Gaia — static mockup in Filament v3 idiom. No backend. Retail module; customer data shared with OEM underneath (channel-flagged), screens separated.

Retail delivery

RD-26-061

Not saved

Customer: Kedai Pak Din · Area: Seri Kembangan · FEFO will pick lot KCA-2603-04 — packing posts the retail_sale movement and moves custody FG → Van/Transit (no user lot entry: FEFO decides, GMP trace intact).

Joins the van-route widget on the scheduled day · drag to reorder (shipments.route_seq).

Courier COD stays pending until remit confirmed (like RD-26-054 — 134.40 MYR expected Fri).

Counter — CYTO-11

Auto-fills the sale total when the sale is unpaid/cash-on-delivery; collecting settles the sale as Cash and posts to the counter cash-float log.

Retail shipments — field manifest

FieldFilament componentTypeSourceFK target
Delivery #TextColumn (series RD-{yy}-{seq})stringstored: shipments.code — SAME shipments table as OEM, channel=retail scopes this view; RD- series vs SHP-
SaleTextColumn::url()FKstored: shipments.retail_sale_id (OEM rows use sales_order_id — one engine, two doc FKs)retail_sales.id
Customer / AreaTextColumnFK + stringderived: sale's customer (ONE customers table, channel enum oem/retail/both); stored: shipments.ship_to short area labelcustomers.id
MethodBadgeenumstored: shipments.method — own_van / lalamove / grab / pickup / courier (J&T etc); courier rows still set carrier_id + tracking_nocarriers.id
StatusBadge + Action "Advance"enumScheduled → In delivery → Delivered / Failed; every change appends shipment_events (status, at, by, note) — same event log as OEMshipment_events
CODTextColumn + Badge; Action "Mark collected"decimal + boolstored: shipments.cod_amount, .cod_collected, .cod_collected_at — collecting settles the retail sale as Cash and posts to the counter cash-float log; courier COD stays "pending" until remit confirmedretail_sales.id
DateTextColumn::date()datestored: shipments.scheduled_date, .delivered_at
Today's van routeWidget over same tablederivedderived ordering: method=own_van AND scheduled_date=today, ordered by shipments.route_seq (drag to reorder); driver check-off = Advance status per stop

Engine notes

  • Stock movement is IDENTICAL to an OEM shipment: confirming a delivery posts a shipment movement with FEFO batch pick — FG stock and batch-trace don't know channels exist.
  • Failed delivery: goods stay in the Van/Transit custody bin (no silent restock); a redelivery row is created with redelivery_of_id linking back (here RD-26-056 → RD-26-060). Stock returns to FG only via an explicit un-pick.
  • Different carrier profile from OEM by data, not by schema: OEM rows are GDEX/DHL/Kerry pallets with tracking numbers; retail rows are own-van routes, Lalamove/Grab same-day, counter pickup, J&T COD parcels.
  • Shared-data doctrine: customers is ONE table (channel enum oem/retail/both) and variant_prices is ONE table (floor enforcement identical); stock movements, batches and the shipments engine are shared. What separates: screens, numbering series (RD-/RS- vs SHP-/SO-), CRM shape, e-invoicing path (consolidated vs per-order).