| Checkbox | Table bulk selection (BulkAction Print / Export / Delete, all requiresConfirmation()) | select | UI: Print = one PDF/order (so-print.html); Export = async CSV; Delete skips rows with posted movements/MOs | — |
| Created date | TextColumn::date()->sortable() + Filter (date range) | date | stored: sales_orders.created_date; MMDD of the order number matches this date | — |
| Order # | TextColumn::searchable(isIndividual)->url() | string, unique | stored: PREFIX-MMDD + optional "(YYYY)"; prefixes NVMSB, YGMSB, ROYKL, TSLSB (per-entity series) | — |
| Customer | TextColumn::searchable(isIndividual) | string | stored: sales_orders.customer_id, displays customer name | customers.id |
| Total amount | TextColumn::numeric()->summarize(Sum) | money MYR | derived: Σ order line totals; totals row 7,788,071.92 MYR over all 280 | so_lines |
| Tax | TextColumn::numeric()->summarize(Sum) | money MYR | derived from tax rates on order lines; total 407.63 MYR though all visible rows are 0 | — |
| COGS/COSS | TextColumn::numeric()->summarize(Sum) | money MYR | derived by inventory engine at fulfillment: batch / moving-average cost of shipped stock | stock_movements |
| Profit | TextColumn::numeric()->color(fn < 0 ⇒ danger)->summarize(Sum) | money MYR | derived: Total amount − Tax − COGS/COSS (verified per-row and on totals) | — |
| Picked date | TextColumn::date()->sortable() — defaultSort('picked_date','desc') | date | stored: set at fulfillment/pick; default sort column descending | — |
| Invoice | SelectColumn (inline dropdown, badge-styled) | enum: Invoiced / Not invoiced / Not invoiced (1) | derived from linked invoice records; "Not invoiced" chip doubles as create-invoice action | invoices |
| Delivery | TextColumn::badge() (always Delivered on this tab) | enum | stored: fulfillment status — Delivered is the Open/Done bucketing criterion | — |