| Checkbox / ⓘ | automatic with BulkActions (export / print / delete) | ui | UI-only bulk select; header ⓘ tooltip slot dropped | — |
| Order # | TextColumn::searchable(isIndividual: true)->url() | string | stored: MO number '{prefix}-{number} / {sequence}' | manufacturing_orders.id |
| Customer | TextColumn::placeholder('—') | string, nullable | stored: FK customer via linked sales order; blank for make-to-stock MOs (both captured rows empty) | contacts.id |
| Product | TextColumn::searchable(isIndividual: true) | string | derived: product name + ' / ' + variant suffix | variants.id |
| Category | TextColumn (badge-style) + SelectFilter | string | stored: item master product category, read-only here | categories.id |
| Planned / Actual qty | TextColumn::state("{planned} / {actual}")->summarize(Sum) | qty pair + UoM | planned stored on MO; actual written at completion (actual = planned in both sample rows) | — |
| Planned / Actual time | TextColumn::placeholder('… / …') | duration pair, nullable | derived: Σ planned vs tracked operation durations; '… / …' when no operation time exists | — |
| Materials cost | TextColumn::numeric()->summarize(Sum) | money MYR | derived: Σ ingredient qty × moving-average cost at consumption (one MO shows 0.00 legitimately) | — |
| Sub-assemblies cost | TextColumn::numeric()->summarize(Sum) | money MYR | derived: cost of consumed manufactured-ingredient items, split from raw materials | — |
| Operations cost | TextColumn::numeric()->summarize(Sum) | money MYR | derived: Σ operation costs (time × rate or fixed) from MO operation rows | — |
| Total cost | TextColumn::numeric()->summarize(Sum) | money MYR | derived: Materials + Sub-assemblies + Operations (84766.75 + 0 + 0 checks out) | — |
| Done date | TextColumn::date()->sortable() (default sort desc) | date | stored: timestamp set when MO marked Done; drives the 'Done at' range filter | — |
| Production | SelectColumn (inline-editable badge, green) | enum | stored: MO status; reopening moves the MO back to the Open tab | — |