Files
Odoo-Modules/fusion_plating/fusion_plating_shopfloor
gsinghpal 8e3169e49b fix(shopfloor): jsQR loop — full-res frame + canvas blank-pixel check + last-result trace
271 attempts at 720x1280 with no detection means either downsampling
killed the finder patterns or drawImage is silently painting blank
pixels (a known iOS WebKit failure mode for some video-stream sources).

- Drop the 600px scaling cap. Feed the full native video frame to
  jsQR. Per-frame cost goes up but is still fine; the win is jsQR
  sees finder patterns at full sharpness.
- Add a one-time sanity check that walks the first ImageData buffer
  looking for a non-zero pixel. If everything is 0,0,0 the canvas is
  blank (drawImage failed) and we surface that as 'px:BLANK' in the
  status line — telling us instantly to switch decoder strategies
  rather than chasing tuning.
- Status line now also shows the last jsQR call outcome:
    r:found / r:no_code / r:empty / r:error: ...
  So we can confirm whether jsQR is even being invoked successfully.

Status format compacted to fit one line on phone:
  jsqr · f1234 a567 720x1280 rs4 px:ok r:no_code

Version: shopfloor 19.0.20 -> 19.0.21.
2026-04-25 13:46:47 -04:00
..
2026-04-16 20:53:53 -04:00
2026-04-16 20:53:53 -04:00
2026-04-16 20:53:53 -04:00
2026-04-16 20:53:53 -04:00

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 start
  • window_hours — customer spec
  • bake_required_by — computed deadline
  • stateawaiting_bake -> bake_in_progress -> baked, with missed_window / scrapped exit paths
  • A 5-minute cron that flips records past their deadline to missed_window automatically
  • 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/scan
  • POST /fp/shopfloor/log_chemistry
  • POST /fp/shopfloor/start_bake
  • POST /fp/shopfloor/end_bake
  • POST /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