| Checkbox / ⓘ | automatic with BulkActions (export / print) | ui | UI-only bulk select; header ⓘ tooltip slot dropped | — |
| Resource | TextColumn::placeholder('—') + SelectFilter | string, nullable | stored: task assignment to a production resource/workstation; unset on every captured row | resources.id |
| MO # | TextColumn::searchable(isIndividual: true)->url() | string | stored: FK parent MO; format 'SO # / line #' — NVMSB-0309 / 2 and / 3 are sibling MOs of one SO | manufacturing_orders.id |
| MO deadline | TextColumn::date()->sortable() (default sort asc) + Filter (date range) | date | derived: parent MO production deadline, repeated on every operation row | manufacturing_orders.id |
| Del. deadline | TextColumn::date() + Filter (date range) | date | derived: linked sales-order delivery deadline; same value across all rows of one MO — Open view only | sales_orders.id |
| Product | TextColumn::searchable(isIndividual: true) | string | derived: parent MO → product variant, 'name / variant' | variants.id |
| Planned qty | TextColumn::numeric()->summarize(Sum) | qty + UoM | derived: MO planned quantity repeated per operation row (total double-counts by design) | — |
| Operation | TextColumn::searchable(isIndividual: true) | string | stored: operation step from the product's routing (BOM recipe) | operations.id |
| Type | TextColumn::badge()->color(Process: blue, Setup: gray) + SelectFilter | enum | stored: operation cost type (Katana: Process vs Setup); every visible row = 'Process' | — |
| Planned time | TextColumn::placeholder('—') | duration, nullable | stored: planned duration from the operation definition; unset in this dataset | — |
| Assigned to | TextColumn::placeholder('Unassigned') + SelectFilter | string, nullable | stored: FK operator/team member; 'Unassigned' on every row | users.id |
| Status | IconColumn (hollow circle = Not started) + SelectFilter | enum | stored: task status; Open/Done view tabs partition on it — all 17 open tasks 'Not started'; Open view only | — |
| Planned/Actual qty (Done) | TextColumn::formatStateUsing('{actual} / {planned} pcs')->summarize(Sum ×2) | qty pair + UoM | stored: tasks.actual_qty captured at completion; planned derived from parent MO — dual Total 65,163 / 68,640 pcs | — |
| Planned/actual time (Done) | TextColumn::placeholder('... / ...') | duration pair, nullable | stored: tasks.actual_time vs planned duration from the operation; both unset on every captured row | — |
| Completed at (Done) | TextColumn::date()->sortable() (default sort desc) + Filter::make('completed_at') date range, default 'Last 7 days' | datetime | stored: tasks.completed_at — set when the task is marked done; the header range control scopes the whole view | — |
| Completed by (Done) | TextColumn::placeholder('Unassigned') | FK, nullable | stored: tasks.completed_by — user who marked the task done; nullable: every captured done row completed unassigned | users.id |