Four fixes shipped together — all surfaced during tablet UX walkthrough on entech. 1. sale.order ACL on step completion Technicians hit "Access Denied... sale.order" when starting/finishing any step. _fp_check_receiving_gate + the serial-promotion helpers + _fp_resolve_contract_review_part read step.job_id.sale_order_id (and sale_order_line_ids) without sudo. Per Rule 13m, denormalized cross- module reads in tablet controllers must sudo() the source recordset. 2. Workspace stuck on "Loading Job Workspace…" after Hand Off + relogin Action params aren't URL-encoded, so the workspace remounts with jobId=null. refresh() exited early, state.data stayed null, "Loading" shown indefinitely. onMounted now redirects to the plant kanban when jobId is null or the initial load returns no data. 3. 4-hour timer offset on active steps workspace_controller used fp_format() to serialize date_started — which converts naive UTC to user tz wall time first. JS then appended 'Z' and parsed as UTC, so timer was offset by the user's tz (4h on EDT). Switched to fp_isoformat_utc() (proper +00:00 ISO) and dropped the Z-append in formatActiveStepElapsed + isActiveStepOvertime. 4. Lock-screen clock follows FP regional setting tablet_lock.js used d.getHours() / d.toLocaleDateString() — browser tz. Now /fp/tablet/tiles returns tz_name (fp_user_tz resolution: user.tz → company.x_fc_default_tz → UTC) and the formatters use Intl.DateTimeFormat with the explicit timeZone option. plant_overview now consumes server_time (already fp_format'd) instead of toLocaleTime String. Same chain Odoo backend uses, so PDF / view / tablet all agree on what time it is. Versions: fusion_plating_jobs 19.0.10.30.0, fusion_plating_shopfloor 19.0.33.1.12. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fusion Plating — Shop Floor
Tablet / operator ergonomics layer for the fusion_plating core.
Part of the Fusion Plating product family by Nexa Systems Inc. Copyright (c) 2026 Nexa Systems Inc. All rights reserved. Licensed under OPL-1 (Odoo Proprietary License v1.0).
What this module adds
| Feature | Model |
|---|---|
| Tablet station registration | fusion.plating.shopfloor.station |
| Bake oven master + chart recorder ref | fusion.plating.bake.oven |
| Hydrogen embrittlement bake-window enforcer | fusion.plating.bake.window |
| First-piece inspection gate | fusion.plating.first.piece.gate |
| Operator next-up queue (transient) | fusion.plating.operator.queue |
Bake-window enforcer
When a high-strength-steel part exits the plating tank, a clock starts. Customer specification dictates the window (typically 1-4 hours) inside which the relief bake must begin. Missing the window requires scrap or rework — there is no retroactive fix.
The module models this as a first-class entity with:
plate_exit_time— clock startwindow_hours— customer specbake_required_by— computed deadlinestate—awaiting_bake -> bake_in_progress -> baked, withmissed_window/scrappedexit paths- A 5-minute cron that flips records past their deadline to
missed_windowautomatically - A kanban board grouped by state with theme-aware status colours
Tablet client
A backend OWL component (Odoo 19 conventions) registered as the
fp_shopfloor_tablet client action. It hosts:
- QR scan input (wedge scanner or on-screen keyboard friendly)
- Live tank / bath / job preview cards
- One-tap Start Bake / End Bake buttons
- Live operator next-up queue
JSON-RPC endpoints (Odoo 19 type='jsonrpc'):
POST /fp/shopfloor/scanPOST /fp/shopfloor/log_chemistryPOST /fp/shopfloor/start_bakePOST /fp/shopfloor/end_bakePOST /fp/shopfloor/queue
QR code conventions
| Prefix | Resolves to |
|---|---|
FP-TANK:<code> |
fusion.plating.tank |
FP-BATH:<name> |
fusion.plating.bath |
FP-STATION:<code> |
fusion.plating.shopfloor.station |
FP-JOB:<name> |
fusion.plating.bake.window |
FP-OVEN:<code> |
fusion.plating.bake.oven |
Security
Reuses the four core Fusion Plating groups (operator, supervisor, manager,
admin) defined in fusion_plating. No new groups, no new privilege block.
ACLs are graded operator (read/write logs), supervisor (create), manager
(full).
Theme
All styling is theme-aware: CSS custom properties + color-mix() against
Bootstrap / Odoo tokens. No hex codes, no media queries — works in light
and dark mode out of the box.
Install / update
docker exec odoo-dev-app odoo -d fusion-dev -u fusion_plating_shopfloor --stop-after-init