|
|
|
@@ -166,6 +166,13 @@ These modules have **source code in this repo** but are **intentionally NOT inst
|
|
|
|
| `fusion_plating_culture` | `state=uninstalled`, dir removed from entech disk | Soft people-ops feature (peer kudos / "Fundamental of the Week"); zero data entered; not a client priority. Top-level "Culture" menu confused operators. | Ask the client whether they want it before reinstalling. If yes: re-sync folder + `-i fusion_plating_culture` + seed a value set. |
|
|
|
|
| `fusion_plating_culture` | `state=uninstalled`, dir removed from entech disk | Soft people-ops feature (peer kudos / "Fundamental of the Week"); zero data entered; not a client priority. Top-level "Culture" menu confused operators. | Ask the client whether they want it before reinstalling. If yes: re-sync folder + `-i fusion_plating_culture` + seed a value set. |
|
|
|
|
| `fusion_plating_sensors` | deleted entirely (not in repo anymore) | Duplicated `fusion_plating_iot`'s scope but with no working alerting logic. Its valuables (sensor_type taxonomy, dashboard, location flexibility) were ported into `fusion_iot/fusion_plating_iot/`. | N/A — gone. Any new sensor work goes in `fusion_iot/fusion_plating_iot/`. |
|
|
|
|
| `fusion_plating_sensors` | deleted entirely (not in repo anymore) | Duplicated `fusion_plating_iot`'s scope but with no working alerting logic. Its valuables (sensor_type taxonomy, dashboard, location flexibility) were ported into `fusion_iot/fusion_plating_iot/`. | N/A — gone. Any new sensor work goes in `fusion_iot/fusion_plating_iot/`. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Odoo 19 ir.cron — `numbercall` and `doall` are gone
|
|
|
|
|
|
|
|
The legacy `numbercall=-1` (run-forever) and `doall=False` (catch-up-missed) fields were removed from `ir.cron` in Odoo 19. Including them in `<record model="ir.cron">` data XML produces:
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
ValueError: Invalid field 'numbercall' in 'ir.cron'
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
Use only: `name`, `model_id`, `state`, `code` (or `function`/`model`), `interval_number`, `interval_type`, `active`. Caught during the 2026-05-22 entech deploy of the auto-pause cron.
|
|
|
|
|
|
|
|
|
|
|
|
## Critical Rules — Odoo 19
|
|
|
|
## Critical Rules — Odoo 19
|
|
|
|
1. **NEVER code from memory** — Read reference files from the server first.
|
|
|
|
1. **NEVER code from memory** — Read reference files from the server first.
|
|
|
|
2. **Backend OWL**: `static template`, `static props = ["*"]`, standalone `rpc()` from `@web/core/network/rpc`. NOT `useService("rpc")`.
|
|
|
|
2. **Backend OWL**: `static template`, `static props = ["*"]`, standalone `rpc()` from `@web/core/network/rpc`. NOT `useService("rpc")`.
|
|
|
|
@@ -339,13 +346,57 @@ POST /fp/recipe/duplicate — deep-copy recipe
|
|
|
|
### Client Recipes Created
|
|
|
|
### Client Recipes Created
|
|
|
|
- `ENP-ALUM-BASIC` — Electroless Nickel Plating Aluminium Basic (9 operations, 15 steps). Data file: `fusion_plating/data/fp_recipe_enp_alum_basic.xml`
|
|
|
|
- `ENP-ALUM-BASIC` — Electroless Nickel Plating Aluminium Basic (9 operations, 15 steps). Data file: `fusion_plating/data/fp_recipe_enp_alum_basic.xml`
|
|
|
|
|
|
|
|
|
|
|
|
## Plant Overview Dashboard
|
|
|
|
## Shop Floor Architecture (2026-05-22 tablet redesign — Phases 1-4)
|
|
|
|
- OWL client action: `fp_plant_overview` in `fusion_plating_shopfloor`
|
|
|
|
|
|
|
|
- Kanban columns = work centres, cards = active `mrp.workorder` records
|
|
|
|
Spec: [docs/superpowers/specs/2026-05-22-shopfloor-tablet-redesign-design.md](docs/superpowers/specs/2026-05-22-shopfloor-tablet-redesign-design.md)
|
|
|
|
- Drag & drop between columns (writes `workcenter_id` on the work order)
|
|
|
|
Plan: [docs/superpowers/plans/2026-05-22-shopfloor-tablet-redesign-plan.md](docs/superpowers/plans/2026-05-22-shopfloor-tablet-redesign-plan.md)
|
|
|
|
- Endpoint: `POST /fp/shopfloor/plant_overview`
|
|
|
|
|
|
|
|
- Move endpoint: `POST /fp/shopfloor/plant_overview/move_card`
|
|
|
|
**Three OWL client actions** (registered under `registry.category("actions")`):
|
|
|
|
- Auto-refreshes every 30s
|
|
|
|
- `fp_shopfloor_landing` — Workstation kanban entry. Station-scoped or All-Plant mode toggle. Tap a card → JobWorkspace. Replaces the legacy `fp_shopfloor_tablet` and folds in `fp_plant_overview`.
|
|
|
|
|
|
|
|
- `fp_job_workspace` — Full-screen single-WO surface. Sticky header (WO #, customer, qty, workflow chip), sticky 9-stage workflow bar, step list with GateViz blockers, side panel (spec/attachments/chatter), sticky action rail (Hold/Note/Milestone). Opens from kanban tap, smart button, QR scan, or manager card tap.
|
|
|
|
|
|
|
|
- `fp_manager_dashboard` — Manager Desk with 4 sibling tabs: **Workflow Funnel** (default), **Approval Inbox**, **Plant Board** (existing 3-column), **At-Risk** (trending late + hold reasons + bottleneck heatmap).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**Five shared OWL services** in `fusion_plating_shopfloor/static/src/js/components/`:
|
|
|
|
|
|
|
|
- `WorkflowChip` — workflow.state pill + optional next-action hint
|
|
|
|
|
|
|
|
- `GateViz` — "Can't start because…" explainer (reads `fp.job.step.blocker_kind`/`reason`)
|
|
|
|
|
|
|
|
- `FpSignaturePad` — Dialog canvas signature capture
|
|
|
|
|
|
|
|
- `FpHoldComposer` — Dialog hold-create form with reason picker + qty + photo
|
|
|
|
|
|
|
|
- `FpKanbanCard` — standard WO/step card with embedded WorkflowChip + blocker badge
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**Backend endpoints (Phase 1-4):**
|
|
|
|
|
|
|
|
- Workspace: `/fp/workspace/{load,hold,sign_off,advance_milestone}`
|
|
|
|
|
|
|
|
- Landing: `/fp/landing/kanban` (mode=station|all_plant)
|
|
|
|
|
|
|
|
- Manager: `/fp/manager/{overview,funnel,approval_inbox,at_risk}`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**Auto-pause cron — fixes 411-hour ghost timers:**
|
|
|
|
|
|
|
|
- `_cron_autopause_stale_steps()` runs every 30 min
|
|
|
|
|
|
|
|
- Threshold from `ir.config_parameter` **`fp.shopfloor.autopause_threshold_hours`** (default 8.0)
|
|
|
|
|
|
|
|
- Recipe nodes opt out via `fusion.plating.process.node.long_running=True` for 24h bakes etc.
|
|
|
|
|
|
|
|
- Flips `state=in_progress` idle > threshold to `paused` with chatter audit
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**Key model fields added (Phase 1-4):**
|
|
|
|
|
|
|
|
- `fp.job.display_wo_name` — "WO # 00001" formatter for tablet/dashboard (model `name` field stays `WH/JOB/…`; system-wide sequence rename deferred)
|
|
|
|
|
|
|
|
- `fp.job.late_risk_ratio` — stored Float (remaining_planned / minutes_to_deadline) driving At-Risk view
|
|
|
|
|
|
|
|
- `fp.job.active_step_id` — computed M2o to currently in_progress step
|
|
|
|
|
|
|
|
- `fp.job.step.blocker_kind` / `blocker_reason` / `blocker_jump_target_*` — drives GateViz
|
|
|
|
|
|
|
|
- `fp.work.centre.bottleneck_score` / `avg_wait_minutes` — drives At-Risk bottleneck heatmap
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**Operator ACL lift (per "techs wear multiple hats" rule):**
|
|
|
|
|
|
|
|
- `fp.certificate` — operator gained write (flip draft → issued from tablet)
|
|
|
|
|
|
|
|
- `fp.thickness.reading` — operator gained create+write (Fischerscope capture from tablet)
|
|
|
|
|
|
|
|
- `fp.job.node.override` — operator gained read (see opt-out badges on steps)
|
|
|
|
|
|
|
|
- Supervisor-only ops (step Skip, hold Release) enforced in `workspace_controller.py`, not ACL
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**Deprecated but still live** (cleanup is Phase 5):
|
|
|
|
|
|
|
|
- OWL components: `fp_shopfloor_tablet`, `fp_plant_overview` — registered but no menu points at them
|
|
|
|
|
|
|
|
- Endpoints: `/fp/shopfloor/tablet_overview`, `plant_overview`, `queue` — marked DEPRECATED with INFO log lines, bodies intact for back-compat
|
|
|
|
|
|
|
|
- `/fp/shopfloor/plant_overview/move_card` is **NOT** deprecated — the new Landing component uses it for drag-and-drop
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**Old patterns to avoid:**
|
|
|
|
|
|
|
|
- Don't read `fp.job.name` for display — use `display_wo_name` everywhere on tablet/dashboard
|
|
|
|
|
|
|
|
- Don't add SCSS that uses raw hex without an `@if $o-webclient-color-scheme == dark` branch (dark mode breaks otherwise; see existing `_workflow_chip.scss` as the template)
|
|
|
|
|
|
|
|
- Don't add `web.assets_web_dark` entries to the manifest — Odoo 19 auto-compiles `web.assets_backend` SCSS into both bundles
|
|
|
|
|
|
|
|
- Don't bypass `_fp_should_block_predecessors()` when computing step blockers — keep `blocker_kind=predecessor` logic in sync with `can_start`
|
|
|
|
|
|
|
|
|
|
|
|
## Deployment
|
|
|
|
## Deployment
|
|
|
|
|
|
|
|
|
|
|
|
|