Files
Odoo-Modules/fusion_plating/fusion_plating
gsinghpal ac1db177e1 feat(step-kinds): curate to 11 + mandatory + admin-only creation
Operator-reported foot-gun: Step Kind dropdown had 24 options, most
of which were visual-only (cleaning, electroclean, etch, rinse,
strike, dry, wbf_test, hardness_test, adhesion_test, salt_spray,
packaging, etc.) and didn't drive any gate or milestone. Picking the
wrong one meant nothing happened; picking Generic (left default)
meant nothing happened. Authors couldn't tell which choice mattered.

Curation: 24 → 11 active kinds. Each remaining kind has a concrete
downstream behaviour (gate, portal milestone, hardware tie-in, or
"explicitly no behaviour" for Other):

  other            Other (catch-all, default — no special behaviour)
  receiving        Received portal milestone
  contract_review  QA-005 form gate + button_finish lock
  racking          Rack-assignment dialog + button_finish lock
  mask             Visual mask kind (covers Masking + De-Masking)
  wet_process      Visual wet kind (NEW, covers cleaning, rinse,
                   etch, strike, dry, electroclean, wbf_test)
  plate            Plated portal milestone (last plate step closes)
  bake             Bake-window state machine + Baked milestone
  inspect          Intermediate inspection milestone
  final_inspect    Inspected (terminal) portal milestone
  ship             Shipped milestone (back-compat; delivery-state
                   driven is preferred)

Retired kinds (active=False, hidden from dropdown): cleaning,
electroclean, etch, rinse, strike, dry, wbf_test, demask, derack,
replenishment, hardness_test, adhesion_test, salt_spray, packaging,
gating. Kept in DB for audit / history but not selectable.

Mandatory enforcement:
- fp.step.kind_id on fusion.plating.process.node and fp.step.template
  is now required=True with ondelete='restrict' and a default that
  resolves to the 'other' kind. Existing NULL rows are backfilled by
  the pre-migrate before the NOT NULL constraint hits the schema.
- Dropdown no longer offers a blank / "Generic" option. New steps
  land on 'other' instead of NULL.

Admin-only catalog:
- /fp/simple_recipe/kinds/create endpoint now refuses requests from
  non-managers (group_fusion_plating_manager). Returns a clear
  message explaining why ("each kind drives gates / milestones /
  routing — pick Other if none fits, or ask a manager to wire up a
  new kind").
- "+ Add a new kind…" sentinel option in the library form is hidden
  unless state.recipe.user_is_manager. Backend gate is the authority;
  the UI hide is just to stop showing a button that will error.
- The Step Type dropdown in the inline step-edit panel switched from
  a 24-line hard-coded XML option list to a t-foreach over
  state.kindOptions (the same kinds/list endpoint payload). One
  source of truth — retire / add a kind in the catalog and every
  picker reflects the change.

Migration impact (entech): 5 templates + 579 nodes backfilled via
name-match heuristic. 15 kinds flipped to active=False. Distribution
of the 579 backfilled nodes:
  racking 105, other 97, bake 91, wet_process 90, mask 74,
  inspect 44, plate 32, final_inspect 25, receiving 10,
  contract_review 9, ship 2.

Drive-by:
- Migration uses _ensure_kind() that also registers ir.model.data
  for the new xmlids so the subsequent data XML load doesn't create
  duplicate kind records.
- Stored related default_kind on fusion.plating.process.node /
  fp.step.template is written alongside kind_id in every SQL UPDATE
  so legacy `node.default_kind == 'foo'` comparisons stay accurate
  (the ORM doesn't recompute stored related fields after direct
  SQL writes).

Module: fusion_plating 19.0.20.5.0 → 19.0.20.6.0.
15 existing tests still green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 08:08:31 -04:00
..
2026-04-30 00:21:08 -04:00
2026-04-16 20:53:53 -04:00

Fusion Plating

Core module of the Fusion Plating product family. A configurable, multi-tenant capable ERP for plating and metal-finishing shops, built for Odoo 19 Community and Enterprise.

Copyright © 2026 Nexa Systems Inc. License: OPL-1 (Odoo Proprietary License v1.0)


What this module is

fusion_plating is the process-agnostic foundation that every plating or metal-finishing shop needs, regardless of size, jurisdiction, process mix, or industry. It provides:

  • Facility — physical sites with their own tanks, operators, capabilities
  • Process Type — extensible taxonomy (filled in by process packs)
  • Work Center — lines and stations inside a facility
  • Tank — physical vessel with QR code, state, bath history
  • Bath — the chemistry currently in a tank, with its own lifecycle
  • Bath Parameter — schema for chemistry readings
  • Bath Log — daily/per-shift chemistry readings with pass/warn/fail rollup
  • Security — Operator / Supervisor / Manager / Administrator roles
  • Theme-aware UI — respects Odoo light/dark mode with zero duplication

What this module is not

This core intentionally ships with:

  • No process chemistry — install fusion_plating_process_en, _chrome, _anodize, _black_oxide etc. to get actual process types and their bath parameter schemas.
  • No regulatory data — install fusion_plating_compliance_<region> to get jurisdiction-specific limits, forms, and reporting workflows.
  • No industry specialisations — install fusion_plating_aerospace, _nuclear, _cgp etc. for industry-specific QMS overlays.
  • No client-specific strings — everything is data-driven.

Product family

Module Purpose Status
fusion_plating Core (this module) MVP
fusion_plating_quality QMS: NCR, CAPA, doc control, calibration, CoC planned
fusion_plating_compliance Generic compliance framework planned
fusion_plating_compliance_on Ontario regulatory pack planned
fusion_plating_compliance_tor Toronto Ch. 681 municipal pack planned
fusion_plating_safety SDS, WHMIS/TDG, JHSC, exposure planned
fusion_plating_shopfloor Tablet operator stations, QR scanning, bake-window enforcer planned
fusion_plating_portal Customer portal planned
fusion_plating_process_en Electroless nickel — low/mid/high phos planned
fusion_plating_process_chrome Chrome coating (hex & trivalent) planned
fusion_plating_process_anodize Aluminum anodizing (Type II, III) planned
fusion_plating_process_black_oxide Black oxidizing planned
fusion_plating_aerospace AS9100 + Nadcap AC7108 planned
fusion_plating_nuclear CSA N299, CNSC, NQA-1 planned
fusion_plating_cgp Controlled Goods Program planned
fusion_plating_logistics Pickup & delivery routing planned
fusion_plating_culture Values / fundamentals framework planned
fusion_plating_bridge_sign EE bridge: e-sign CoC acceptance planned
fusion_plating_bridge_documents EE bridge: Documents workspace planned
fusion_plating_bridge_quality EE bridge: native quality module planned

Installation

# Development
docker exec odoo-dev-app odoo -d fusion-dev -u fusion_plating --stop-after-init

# Production — after rsync to target server
docker exec <odoo-container> odoo -d <db> -u fusion_plating --stop-after-init

No external Python dependencies. Depends only on standard Odoo 19 Community base modules (base, mail, contacts, product, stock, sale_management, purchase, hr, uom).

Design principles

  1. Works on both Odoo Community and Enterprise. Never depends on quality, documents, sign, studio, or mrp_plm. EE-specific integrations live in separate fusion_plating_bridge_* modules.
  2. No client-specific strings in core. Configuration, not code.
  3. Regions are data, not code. Sewer limits, waste classes, reporting forms come from region packs.
  4. Processes are plug-ins. New process (copper, zinc, tin) = new fusion_plating_process_* module, core untouched.
  5. Dashboards are configured, not coded. Shops pick their own headline KPIs.
  6. Theme-aware. Uses Odoo/Bootstrap CSS variables. One source of truth for colours; Odoo's theme engine decides light vs dark.

Security groups

Group Intended for
Operator Shop-floor staff. Reads reference data, writes chemistry logs.
Supervisor Line supervisors. Manages baths, schedules jobs, reviews logs.
Manager Quality, EHS, plant manager, engineer. Full CRUD on configuration.
Administrator Owner, system admin. All manager rights + system settings.

Field naming convention

  • New models use fusion.plating.* namespace.
  • Fields on our own models use simple names (no prefix).
  • Fields added to base Odoo models (res.company, res.partner, product.template, etc.) use the x_fc_ prefix per the repo convention.

Developer notes

  • All models inheriting from mail.thread use the Odoo 19 chatter pattern.
  • Security follows the Odoo 19 res.groups.privilege pattern (module category → privilege → groups), not the legacy category_id-on-group pattern.
  • Sequence numbers use ir.sequence seeded in data/fp_sequence_data.xml.
  • SCSS uses color-mix() against CSS custom properties — never hardcodes hex values. See static/src/scss/fusion_plating.scss for the theming contract.
  • No group expand="0" in search views (Odoo 19 incompatibility).
  • No category_id or users field on res.groups (Odoo 19 incompatibility).