The WIP Status Report is the single-page snapshot of every batch currently between issued raw-material and posted finished-goods. It is generated on demand, read for the daily production stand-up, and locked into PDF at month-end as the formal WIP-valuation source for finance. The report combines four data slices: per-machine occupancy, in-flight batches, idle BOM templates, and a 4-stage flow strip showing units & rand value at RAW → WIP → FG → DISPATCH.
The PalmStat WIP Report mirrors the Sage X3 "WIP Valuation Report", the Syspro "WIP Report by Job", SAP CO-PC "Order WIP" and NetSuite Manufacturing "WIP by Work Order". A built-in variance flag highlights any IN_PROGRESS batch whose elapsed cycle time exceeds plan by more than 20% — the same threshold used in the Sage X3 efficiency dashboard.
Unlike the other 6 SOPs in this binder, the WIP Report is not signed by the floor team — it is a management read-out. The Production Manager and Operations Director sign the printed copy when it is filed at month-end as the WIP valuation tie-out for the GL.
The WipReport spec (frontend/js/erp-templates/wip-report.js) aggregates four live slices into one document. Every row below is wired to a real query.
| Field on document | API endpoint | DB table.column | Example value |
|---|---|---|---|
| Report Ref No. | generated client-side · buildRefNo() | (stamped on print) | WR-20260508-1442 |
| Report date / period | local time | (stamped on print) | 2026-05-08 (Day of) |
| Prepared by | localStorage user | users.full_name / email | Brent Reddy |
| WIP units (total) | sum across batches | SUM production_batches.planned_qty WHERE status IN (PLANNED, IN_PROGRESS) | 62 480 |
| WIP value (R) | sum × unit cost | SUM(planned_qty × items.std_cost) | R 1 248 700.00 |
| Batches in flight | GET /api/production-batches?status=IN_PROGRESS + PLANNED | COUNT(production_batches) | 14 |
| Machines occupied / total | GET /api/machines | distinct production_batches.machine_id / machines.id | 11 / 18 |
| Avg cycle time | completed batches sample | avg(completed_at − started_at) | 6.8 h |
| Idle BOMs | GET /api/bom?is_active=1 | bom_headers minus active fg_product_id | 22 |
| Per-machine WIP · machine code, dept, current batch | GET /api/machines | machines.code, departments.code, production_batches.batch_ref | RUL_4 / RULING / BATCH-2026-0481 |
| Per-machine WIP · status | derived | RUNNING / QUEUED / IDLE / BREAKDOWN (from machines.status + batch state) | RUNNING |
| Per-machine WIP · hrs running | computed | (now − started_at) / 3600 | 3.6 h |
| In-flight batch · ref, FG, planned, complete % | GET /api/production-batches | production_batches.batch_ref, fg_product_id → products.code, actual_qty/planned_qty | BATCH-0481 · A4_72PG_FM · 5 000 · 62% |
| In-flight batch · operator | via labour | labour_assignments.employee_clock_no | P. Mokoena (1042) |
| In-flight batch · variance flag | derived | elapsed > planned_cycle_hours × 1.2 | OVER (+38%) |
| Idle BOM · ref / FG / last activity | GET /api/bom | bom_headers.id, products.code, bom_headers.updated_at | BOM-A5_48PG_FM · 2026-04-30 |
| Idle BOM · RM stock status | cross-ref to inventory | v_inventory_summary.stock_status | OK / SHORT |
| 4-stage flow · RAW units / value | v_inventory_summary WHERE type=RM | SUM inventory.qty_on_hand × items.std_cost | 180 000 KG · R 3.32m |
| 4-stage flow · WIP units / value | derived (above) | same query, batches in flight | 62 480 · R 1.25m |
| 4-stage flow · FG units / value | v_warehouse_value WHERE type=FG | SUM(qty × std_cost) | 148 200 · R 4.41m |
| 4-stage flow · DISPATCH units | GET /api/sales-orders | sales_order_lines.qty_produced − on-hand | 72 100 · R 2.06m |
/wip-tracking. View hydrates from API.productionBatches.list(), API.machines.list(), API.bom.list() in parallel.production realtime channel (via RT.subscribe) and re-fetches whenever a batch is started, completed or cancelled.WipReport.build(batches, machines, boms, flowSnapshot).print(). ErpDoc.render bakes the spec into a self-contained HTML, browser opens print preview.notifications rows.production_batches detail page (status banner, BOM consumption, machine breakdown links).WipReport.build(…).toEmailHtml() and sends to the production distribution list. Sender mailbox is captured in audit_log.documents.kind=OTHER, retained 7 years).| Action | Admin | Production Mgr | Planner | Supervisor | Finance |
|---|---|---|---|---|---|
| Generate this doc | ✓ | ✓ | ✓ | ✓ | ✓ |
| Approve / sign off (month-end) | ✓ | ✓ | – | – | ✓ |
| Email externally | ✓ | ✓ | – | – | ✓ |
| Reprint historical | ✓ | ✓ | ✓ | ✓ | ✓ |
| Edit the underlying batches | ✓ | – | ✓ | ✓ | – |
| Delete archived report | ✓ (with audit reason) | – | – | – | – |
Reading WIP requires the JWT to carry any role bound to verifyToken on /api/production-batches; printing is purely client-side after data is fetched.
Happy path: 14 batches in flight, no variance flags, 11 of 18 machines occupied. Manager prints, signs, distributes. 5-minute stand-up.
Happy path: Variance banner fires for BATCH-2026-0473 at +38% over plan. Manager drills in, sees a machine_breakdowns row at H+2. Notes the breakdown, confirms remedy, signs report. Lessons-learned posted to maintenance.
Sad path: Variance banner ignored for 3 consecutive days. Customer SO slips. Recovery: implement a daily SLA on variance closure and flag escalation in the notifications queue.
Happy path: 17:00 on month-end, WIP value reads R 1.25m. Manager prints, signs, finance signs. Number is reconciled to GL account "Inventory · WIP" with no variance. Report is scanned, uploaded, retained.
Sad path: Manual GL adjustment of R 80k was made without a corresponding ERP transaction. Report shows R 1.25m, GL shows R 1.33m. Recovery: identify the orphan adjustment, reverse + re-post it through proper ERP transactions before month-end signs off.
Happy path: A fire damages a portion of WIP stock. The most-recent printed WIP Report is provided to the insurer as the inventory-at-risk record at the moment of loss. Each in-flight batch is itemised with rand value.
v_inventory_summary view (drives RAW + FG totals)machine_breakdowns for BREAKDOWN flagsv_warehouse_value for FG totals| Cadence | Trigger | Owner | Distribution |
|---|---|---|---|
| 07:00 daily | Morning stand-up | Production Manager | Floor supervisors + planners |
| 14:00 daily | Cross-shift handover | Day Supervisor | Night Supervisor |
| 17:00 last working day of month | Month-end close | Production Manager + Finance | GL tie-out file (signed PDF) |
| On variance flag fire | Any batch > +20% cycle time | Supervisor | Production Manager · raise investigation |
| On insurance event | Fire / flood / theft | Operations Director | Insurer + finance |
started_at to completed_at for a batch. Plan vs actual feeds the variance flag.