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
← Purchase orders / PO-459

PO-459

Purchase order · Open
Delivery Partially received Billing Partially billed (3) ›
Print PO
Currency
MYR
Order date
2025-08-12
Expected arrival
2026-03-16
Location
CTSB · 11, Balakong Jaya
Created by
Priya Nair (Purchasing)

Lines

5 lines · purchase UoM kg, stock UoM mg
# Material Ordered Received Outstanding Unit price Tax Line total Expected arrival Status
1 Altilix (Artichoke Extract) / ITS Nutriscience Branded Actives 25 kg 25 kg 0 kg 1,800.00 MYR/kg 5% - Sales Tax 45,000.00 MYR 2025-09-01 Received
2 Apple Fiber / ITS-Sanacel Soluble Fiber 200 kg 100 kg 100 kg 21.50 MYR/kg 5% - Sales Tax 4,300.00 MYR 2026-03-16 Partial
3 Ascorbic Acid / ITS-Luwei Vitamins & Minerals 250 kg 0 kg 250 kg 19.50 MYR/kg 5% - Sales Tax 4,875.00 MYR 2026-03-16 Open
4 Apple Powder / ITS-Italy-Iprona-IPOFL-70020018 Fruit Powder 50 kg 0 kg 50 kg 142.00 MYR/kg 5% - Sales Tax 7,100.00 MYR 2026-03-16 Open
5 Blackcurrant Flavor / ITS-56488/SDH Flavor 25 kg 0 kg 25 kg 115.10 MYR/kg 5% - Sales Tax 2,877.50 MYR 2026-03-16 Open
6 Apple Fiber / ITS-Sanacel Soluble Fiber 100 kg 0 kg 100 kg 21.50 MYR/kg 5% - Sales Tax 2,150.00 MYR 2026-04-26 Open
Total units 550 kg
Subtotal (tax excluded) 64,152.50 MYR = snapshot total (Sum summarizer)
Plus tax (5% - Sales Tax) 3,207.63 MYR
Total 67,360.13 MYR = subtotal + 5% SST

Receive items — GMP receipt

outstanding lines prefilled · one batch record per receipt line
Material Qty received UoM conversion Batch / lot no * Expiry date * CoA received Bin
Apple Fiber / ITS-Sanacel kg 100 kg → 100,000,000 mg (stock UoM)
Ascorbic Acid / ITS-Luwei kg 250 kg → 250,000,000 mg (stock UoM)
Apple Powder / ITS-Italy-Iprona-IPOFL-70020018 kg 50 kg → 50,000,000 mg (stock UoM)
Blackcurrant Flavor / ITS-56488/SDH kg 25 kg → 25,000,000 mg (stock UoM)

On post: receipt posts po_receipt stock movements at landed cost and creates one batch record per line — expiry mandatory for batch-tracked materials; CoA checkbox files against the batch (unchecked ⇒ batch held in Quarantine until QC release).

Conversions are built-in — staff never type units: qty is keyed in the purchase UoM (kg) and posts to stock in mg via the hard-coded factor (1 kg = 1,000,000 mg); the UoM conversion column is display-only.

Previous receipts: PR-459-1 · 2025-09-02 · Altilix 25 kg · batch A2508-1141 exp 2027-08-31 — PR-459-2 · 2025-11-14 · Apple Fiber 50 kg · batch G04112399 exp 2027-10-08 — PR-459-3 · 2026-01-20 · Apple Fiber 50 kg · batch G05120033 exp 2028-01-05. All posted by Priya Nair.

Landed cost

additional costs on this receipt
Cost Amount Allocation
Sea freight — Genoa → Port Klang 850.00 MYR by line value
Customs & clearance agent 420.00 MYR by line value
Fumigation & pallet treatment 180.00 MYR by line value
Total to allocate 1,270.00 MYR
Allocation preview (receipt value 17,002.50 MYR) Line value Allocated Landed unit cost
Apple Fiber 100 kg2,150.00160.5923.11 MYR/kg
Ascorbic Acid 250 kg4,875.00364.1420.96 MYR/kg
Apple Powder 50 kg7,100.00530.33152.61 MYR/kg
Blackcurrant Flavor 25 kg2,877.50214.94123.70 MYR/kg
Moving average: unit_cost_landed = unit price + allocation ÷ qty — this landed cost (not the bill amount) enters the per-location moving average at receipt time.

Bills

Partially billed (3)
Bill ref Date Amount Note
ITS-INV-25089 2025-09-02 45,000.00 MYR Altilix 25 kg
ITS-INV-25411 2025-11-14 1,075.00 MYR Apple Fiber 50 kg
ITS-INV-26033 2026-01-20 1,075.00 MYR Apple Fiber 50 kg
ITS-INV-26102 2026-04-12 5,118.75 MYR Ascorbic Acid 250 kg
Billed to date 47,150.00 MYR of 67,360.13 incl. tax
Reference only: the bill lives in QuickBooks — Gaia stores number, date and amount to derive the billing chip (Not billed → Partially billed (n) → Billed). Billing is independent of receipt. Bill amounts are tax-inclusive and net against the tax-inclusive order total (67,360.13 MYR), so the chip flips to Billed only when the 5% SST is covered too.

Additional info

supplier-facing — printed on the PO PDF

Please ship the remaining lines together where possible and email CoA + halal certificate per batch to qa@navi.my before dispatch. Mark every carton with our PO number and the batch/lot number.

Delivery hours Mon–Fri 9:00–16:30, unloading bay 2 (11, Balakong Jaya). Pallet height max 1.6 m.

Project Gaia — static mockup in Filament v3 table idiom. No backend. Sample data: Katana tenant snapshot 2026-04-12, factory CTSB. PO header, supplier, dates, statuses and 64,152.50 MYR total are real; line-level quantities, prices, receipts, landed costs and bill refs are illustrative, consistent with the captured totals.

Post receipt PR-459-4?

Posts 4 po_receipt stock movements at landed cost (425 kg → CTSB stock) and creates one batch record per line: G05122588 (Apple Fiber, exp 2027-11-30), LW2603-0114 (Ascorbic Acid, exp 2029-02-28), IPR26L0417 (Apple Powder, exp 2027-09-15 — CoA missing ⇒ held in Quarantine until QC release), 56488-2604-08 (Blackcurrant Flavor, exp 2027-04-30). Landed costs of 1,270.00 MYR allocate by line value; landed unit costs enter the per-location moving average. Batch + expiry are mandatory (GMP) — posting is blocked if any batch-tracked line is missing either.

Receipt PR-459-4 posted

4 batches created · 1 held in Quarantine (CoA pending) · delivery status recalculating

Add bill ref

Reference only — the bill document lives in QuickBooks. Amounts are tax-inclusive and net against the 67,360.13 MYR order total.

billed to date 47,150.00 of 67,360.13 — 20,210.13 remaining

Add landed cost

Allocated across the receipt lines — the landed unit cost (price + allocation ÷ qty), not the bill amount, enters the per-location moving average at receipt time.

Add line to PO-459

Adds a po_lines row — no stock effect until Receive items (batch + expiry captured at receipt, per GMP).

Select scoped to purchasable variants; purchase UoM kg from the variant (kg → mg stock factor)

kg

100 kg → 100,000,000 mg (stock UoM)

MYR/kg

autofills from last purchase price on this supplier

defaults from PO header

Purchase order detail — field manifest

Filament PurchaseOrderResource ViewRecord page: Infolist (key facts) + header Actions (Receive items = Action::form modal, mocked open) + RelationManagers: LinesRelationManager (po_lines), ReceiptsRelationManager (po_receipts), LandedCostsRelationManager, BillsRelationManager.

FieldFilament componentTypeSourceFK target
Order #TextEntry (title)string PO-{seq}stored: purchase_orders.number (Gaia warns on duplicates)
SupplierTextEntry::url()FKstored: purchase_orders.supplier_idsuppliers.id
CurrencyTextEntry / Select on editstringstored: purchase_orders.currency — Select, default base MYR (shown in the key-facts card)
Order date / created byTextEntry::date()date + FKstored: purchase_orders.created_at, created_byusers.id
Expected arrivalTextEntry::date()->color(fn) red when overduedatestored: purchase_orders.expected_arrival; red = past date + not fully received
Location / factoryTextEntryFK (tenant scope)stored: purchase_orders.location_id — factory CTSB tenantlocations.id
Delivery statusTextEntry::badge()derived chipderived: received vs ordered qty across lines (Not received / Partially received / fully → Done tab)po_receipt_lines
Billing statusTextEntry::badge()derived chipderived: Σ bill refs vs order value (Not billed / Partially billed (n) / Billed)po_bills
Line: MaterialTextColumn::url()FKstored: po_lines.variant_idvariants.id
Line: OrderedTextColumn::numeric()qty, purchase UoM (kg)stored: po_lines.quantity + po_lines.purchase_uom_id → admin-locked units list (kg → mg factor hard-coded in units, never keyed)
Line: ReceivedTextColumn::numeric()qtyderived: Σ po_receipt_lines.qty per linepo_receipt_lines
Line: OutstandingTextColumn::numeric()qtyderived: ordered − received
Line: Unit priceTextColumn::numeric()money MYR / purchase UoMstored: po_lines.unit_price
Line: TaxTextColumnFKstored: po_lines.tax_rate_id ('5% - Sales Tax' — same tax_rates table as SO / quotes)tax_rates.id
Line: Line totalTextColumn::numeric()->summarize(Sum)money MYRderived: qty × unit_price (tax excluded); Σ = 64,152.50 subtotal + 3,207.63 tax (5%) = 67,360.13 total
Line: Expected arrivalTextColumn::date()->color(fn)date, per linestored: po_lines.expected_arrival (defaults from header)
Line: StatusTextColumn::badge()derived chipderived: Received (green) / Partial (amber) / Open (gray)
Receipt: Qty + UoM conversionTextInput::numeric() + placeholder textqtystored: po_receipt_lines.qty (purchase UoM) → posted in stock UoM (mg base unit) via the hard-coded kg→mg factor (units table); conversion display-only
Receipt: Batch / lot noTextInput::required() (batch-tracked)stringcreates: batches.batch_number — po_receipt_lines.batch_id FKbatches.id
Receipt: Expiry dateDatePicker::required() (batch-tracked)datestored: batches.expiry_date — mandatory for batch-tracked materials (GMP)
Receipt: CoA receivedCheckboxboolstored: batches.coa_received — unchecked ⇒ batch status Quarantine until QC release (new in Gaia)
Receipt: BinSelect::options()FKstored: po_receipt_lines.bin_id (Raw Mat Room 1 / 2)storage_bins.id
Receipt: unit_cost_landedTextColumn::numeric() (read-only)decimal(20,10)derived: unit price + landed-cost allocation ÷ qty; posted on po_receipt movementstock_movements
Landed cost rowsLandedCostsRelationManager (type, amount)money MYRstored: landed_costs.po_receipt_id — allocated across receipt lines by line valuepo_receipts.id
Bill refsBillsRelationManager (number, date, amount)string/date/moneystored: po_bills — reference only, bill document lives in QuickBooks; amounts net against the tax-inclusive total
Additional infoTextarea / RichEditor (Infolist section)rich text, nullablestored: purchase_orders.additional_info — supplier-facing note, printed on the PO PDF

Engine notes (from buy-list capture)

  • Billing status is computed by netting attached bills against the tax-inclusive order total (Subtotal 64,152.50 + 5% Sales Tax 3,207.63 = 67,360.13): none → Not billed, some → Partially billed (n) where n = number of bills, fully covered → Billed. Billing is independent of receipt.
  • Delivery status is computed from received vs ordered quantities: Not received / Partially received; fully received orders move to the Done tab.
  • Overdue logic: expected arrival renders red when the date has passed and the order is not fully received.
  • Receipt posts po_receipt movements at landed cost — the landed unit cost (price + allocated freight/customs) enters the per-location moving average at receipt time.
  • Batch record per receipt line: batch number + expiry are mandatory for batch-tracked materials; CoA flag gates QC release (GMP addition in Gaia, not in Katana).
  • 0 MYR POs exist for customer-supplied packaging (all "NatusVincere Marketing Sdn Bhd (Supplier)"); status chips on the list are inline receive/bill entry points.
  • Post receipt = Action::requiresConfirmation(): validates batch/expiry present on every batch-tracked line before posting; posting flips line statuses, recomputes the Delivery chip and (when all lines complete) moves the PO to Done.
  • Add bill ref = Action::form modal on BillsRelationManager — po_bills(number, date, amount, note); chip recomputes on save; flips to Billed only when Σ bills ≥ 67,360.13 (tax-inclusive).
  • Add cost = CreateAction on LandedCostsRelationManager (landed_costs.po_receipt_id); allocation recomputes the preview live before the receipt posts.
  • Add line = CreateAction on LinesRelationManager; header + list totals are Sum summarizers so they recompute; new lines default expected arrival from the header and start at status Open.