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 returns

Same GMP rule as OEM, retail flavor: every accepted return lands in the Quarantine bin with its lot number first — and opened consumables are NEVER restocked; Destroy is the default disposition for opened supplements. Money side is cash refund or exchange (no QBO credit note per sale) — refunds are logged as adjustments against the month-end consolidation.
5 returns · July cash refunds 16.80 MYR → deducted from July consolidated summary
Return # Date Customer Sale Items · lot Reason Resolution Disposition Status
Mostly Destroy — that's expected for opened retail supplements. Aunty Mei's seal-defect pieces are held in Quarantine so QA can check lot DRC-2605-12 for a batch-wide problem (same lot seen in OEM return RET-26-007).

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

Return

RRET-26-015 — Aunty Mei

Not saved
Receipt posts a return_receipt movement into Quarantine — never sellable stock. Lot capture is mandatory on every line; returns feed batch-trace (mock recall covers returned goods).

Nullable — a walk-in with no receipt can still be Rejected without a stock receipt.

MYR

Deducted from the month-end consolidated e-invoice — no per-sale QBO credit note.

Goods refused at the counter — skips the stock receipt and lot requirement, closes immediately.

No stock receipt — goods are refused at the counter, so no lines or lots are captured.
Received into: Quarantine bin — CYTO-11 (locked)
Disposition: — QA decides Restock / Destroy after inspection

Opened consumables are NEVER restocked — Destroy is the default disposition (QA still confirms).

Retail returns — field manifest

FieldFilament componentTypeSourceFK target
Return #TextColumn (series RRET-{yy}-{seq})stringstored: retail_returns.code — retail series, mirrors OEM returns (RET-)
Customer / SaleTextColumn::url()FKstored: retail_returns.customer_id (ONE customers table, channel enum oem/retail/both), .retail_sale_id nullable — walk-in without receipt has no sale linkcustomers / retail_sales
Items · lotRepeater linesrelationstored: retail_return_lines (variant_id, qty, batch_id REQUIRED on receipt) — Rejected rows never post lines because nothing enters stockvariants / batches
ReasonSelect + free textenum + textstored: retail_returns.reason — opened / damaged / wrong_item / expired_short
ResolutionBadge + Actionenum + decimalstored: .resolution — refund_cash / exchange / rejected; refund_cash stores .refund_amount and REDUCES the month's consolidation total (adjustment line, no per-sale QBO credit note)consolidation_runs
DispositionBadge + QA Action per lineenummirrors OEM returns: Quarantine (default on receipt) → Restock / Destroy, QA role decides — retail policy: opened consumables always Destroy, Restock only for unopened QA-passed outers
StatusBadgeenumReceived → Inspecting → Closed; Rejected returns close immediately with no stock receipt

Engine notes

  • Quarantine-first is identical to OEM: acceptance posts a return_receipt movement into the Quarantine bin — never sellable stock. Destroy posts a write-off; Restock (rare here) posts a bin transfer after QA.
  • Money side differs from OEM: cash refund or exchange instead of a QBO credit note. Each refund is logged against the open month and deducted from the consolidated B2C e-invoice total (July: 1,337.40 − 16.80). A B2B-flagged sale (e.g. Herbs & Health PJ) would flip to a per-sale QBO CN like OEM.
  • Exchange posts the return receipt PLUS a zero-value replacement shipment movement, FEFO-picked and linked to the original sale — lot in and lot out are both traced.
  • Lot capture on every accepted line feeds the same batch-trace screen — a mock recall on DRC-2605-12 pulls retail and OEM returns together.
  • 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 (RRET-/RS- vs RET-/SO-), CRM shape, e-invoicing path (consolidated vs per-order).