End-to-end workflow tightening + the team / skills system. Three
phases bundled because they share the same touchpoints (button_start /
button_finish / Manager Desk dropdown).
PHASE 1 — In-Odoo notifications + timer audit
=============================================
Workers now get a bell-icon notification (Odoo Discuss inbox) the
moment a manager assigns them a WO. No email — operators check Discuss
between jobs, and the customer-facing notification dispatcher stays
out of the worker loop.
- mrp.workorder.write() override fires message_notify(message_type=
'user_notification') only when x_fc_assigned_user_id transitions to
a non-empty value (clearing or no-op writes don't ping)
- 4 new fields on the WO header surface what was previously buried in
time_ids: x_fc_started_by_user_id, x_fc_started_at,
x_fc_finished_by_user_id, x_fc_finished_at
- button_start stamps started_* once (subsequent pause/resume cycles
preserve the original); button_finish stamps finished_* every time
the WO closes
- New "Timer Audit" group on the WO form (Time & Cost tab)
PHASE 2 — Presence-aware Manager Desk
=====================================
Manager Desk now knows who's clocked in. Works with vanilla
hr_attendance and fusion_clock — both expose hr.attendance with an
open record while the operator is on shift.
- bridge_mrp depends on hr_attendance
- hr.employee.x_fc_is_clocked_in computed field (batched query — one
DB hit for the whole employee set, not N+1)
- hr.employee._fp_clocked_in_user_ids() classmethod for the dashboard
- manager_controller sends operators with is_clocked_in / role_ids /
lead_hand_role_ids per worker, plus presence dict {clocked_in: N,
total: M}; each WO carries role_id/role_name so the dropdown can
match qualified operators
Manager Desk OWL:
- Header gets a "Present 7 / 12" pill chip; tap to toggle hideOffShift
(off-shift hidden when active, accent colour when filter is on)
- New operatorsForWO(wo) helper sorts dropdown options into 4 buckets:
qualified+clocked-in → lead-hand+clocked-in → clocked-in untrained
(training mode) → off-shift (greyed; only shown when hideOffShift
is false). Each option carries a ●/○ dot prefix and a soft suffix.
PHASE 3 — Skills, lead-hand-per-role, auto-promotion
====================================================
The team grows organically: managers assign training tasks, operators
finish them, the system auto-promotes after N successful runs.
- fp.work.role.mastery_required (integer, default reads from the
company-level Default Mastery Threshold). Each role can override —
masking might need 1 success, electroless nickel 5.
- res.company.x_fc_default_mastery_threshold + res.config.settings
exposure under "Workforce Settings" in the Fusion Plating settings
block (default 3)
- hr.employee.x_fc_lead_hand_role_ids m2m, separate from
x_fc_work_role_ids — Sarah can be a lead hand for masking + racking
even if those aren't her primary roles. Manager-only group access.
- New fp.operator.proficiency model (one row per employee+role) with
completed_count, first/last_completed_at, promoted, promoted_at,
progress_label compute. SQL-unique on (employee, role).
- mrp.workorder.button_finish increments the (employee, role)
counter, then if count >= role.mastery_required AND not promoted,
adds the role to x_fc_work_role_ids and posts a "🎉 Promoted"
chatter line on the employee record. Wrapped in try/except so a
tracker glitch never blocks production.
- Promotion uses the WO's assigned_user_id, NOT env.user — credit
goes to the operator who was supposed to do it, even if a manager
finished on their behalf.
Employee form gets a "Shop Roles" tab (supervisor+):
- "Tasks This Operator Can Do" m2m
- "Lead Hand For" m2m (manager-only)
- Read-only Task Proficiency list with progress / promotion badges
Verified on odoo-entech: all fields land, default threshold = 3,
asset bundle regenerated as 9f38f05.
Module bumps: fusion_plating 19.0.4.0.0,
fusion_plating_bridge_mrp 19.0.4.0.0,
fusion_plating_shopfloor 19.0.11.0.0.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
118 lines
4.4 KiB
Python
118 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2026 Nexa Systems Inc.
|
|
# License OPL-1 (Odoo Proprietary License v1.0)
|
|
# Part of the Fusion Plating product family.
|
|
|
|
{
|
|
'name': 'Fusion Plating',
|
|
'version': '19.0.4.0.0',
|
|
'category': 'Manufacturing/Plating',
|
|
'summary': 'Core plating / metal finishing ERP: facilities, processes, tanks, baths, jobs, operators.',
|
|
'description': """
|
|
Fusion Plating — Core
|
|
=====================
|
|
|
|
Part of the Fusion Plating product family by Nexa Systems Inc.
|
|
|
|
Fusion Plating is a configurable, multi-tenant capable ERP for plating and metal
|
|
finishing shops. This core module provides the process-agnostic foundation that
|
|
every shop needs regardless of size, process mix, jurisdiction, or industry.
|
|
|
|
The core ships intentionally empty of region-specific or process-specific
|
|
content — that comes from add-on modules:
|
|
|
|
* fusion_plating_process_en — Electroless nickel plating
|
|
* fusion_plating_process_chrome — Chrome coating (hex or trivalent)
|
|
* fusion_plating_process_anodize — Aluminum anodizing (Type II, III)
|
|
* fusion_plating_process_black_oxide — Black oxidizing
|
|
* fusion_plating_quality — QMS (NCR, CAPA, calibration, CoC, doc control)
|
|
* fusion_plating_compliance — Generic compliance framework
|
|
* fusion_plating_compliance_on — Ontario regulatory pack
|
|
* fusion_plating_compliance_tor — Toronto Ch. 681 municipal pack
|
|
* fusion_plating_safety — SDS, WHMIS/TDG training, JHSC, exposure
|
|
* fusion_plating_shopfloor — Tablet operator stations, QR scanning
|
|
* fusion_plating_portal — Customer portal
|
|
* fusion_plating_aerospace — AS9100 + Nadcap AC7108 pack
|
|
* fusion_plating_nuclear — CSA N299, CNSC, NQA-1 pack
|
|
* fusion_plating_cgp — Controlled Goods Program pack
|
|
* fusion_plating_logistics — Pickup & delivery
|
|
* fusion_plating_culture — Values / fundamentals framework
|
|
|
|
Core concepts
|
|
-------------
|
|
* Facility — a physical site with its own tanks, operators, compliance profile
|
|
* Process Type — extensible taxonomy of finishing processes
|
|
* Work Center — production line or station within a facility
|
|
* Tank — physical vessel with QR code and state
|
|
* Bath — the chemistry currently in a tank, with its own lifecycle
|
|
* Bath Log — daily chemistry readings with pass/fail vs target
|
|
* KPI — configurable headline metrics per shop
|
|
* Delegation Inbox — single pane of "things waiting for someone"
|
|
|
|
Design principles
|
|
-----------------
|
|
1. No client-specific strings in core.
|
|
2. No region-specific data in core.
|
|
3. No process-specific chemistry in core.
|
|
4. Works on both Odoo Community and Enterprise editions.
|
|
5. Theme-aware: respects user light/dark mode preference.
|
|
6. Multi-facility, multi-company, multi-currency capable.
|
|
|
|
Copyright (c) 2026 Nexa Systems Inc. All rights reserved.
|
|
""",
|
|
'author': 'Nexa Systems Inc.',
|
|
'website': 'https://www.nexasystems.ca',
|
|
'maintainer': 'Nexa Systems Inc.',
|
|
'support': 'support@nexasystems.ca',
|
|
'license': 'OPL-1',
|
|
'price': 0.00,
|
|
'currency': 'CAD',
|
|
'depends': [
|
|
'base',
|
|
'mail',
|
|
'contacts',
|
|
'product',
|
|
'stock',
|
|
'sale_management',
|
|
'purchase',
|
|
'hr',
|
|
'uom',
|
|
],
|
|
'data': [
|
|
'security/fp_security.xml',
|
|
'security/ir.model.access.csv',
|
|
'data/fp_sequence_data.xml',
|
|
'data/fp_process_category_data.xml',
|
|
'views/fp_process_type_views.xml',
|
|
'views/fp_work_center_views.xml',
|
|
'views/fp_tank_views.xml',
|
|
'views/fp_bath_log_views.xml',
|
|
'views/fp_facility_views.xml',
|
|
'views/fp_bath_views.xml',
|
|
'views/fp_process_node_views.xml',
|
|
'views/fp_rack_views.xml',
|
|
'views/fp_bath_replenishment_views.xml',
|
|
'views/fp_operator_certification_views.xml',
|
|
'views/res_config_settings_views.xml',
|
|
'views/fp_menu.xml',
|
|
'data/fp_recipe_enp_alum_basic.xml',
|
|
],
|
|
'post_init_hook': 'post_init_hook',
|
|
'assets': {
|
|
'web.assets_backend': [
|
|
'fusion_plating/static/src/scss/fusion_plating.scss',
|
|
'fusion_plating/static/src/scss/recipe_tree_editor.scss',
|
|
'fusion_plating/static/src/xml/recipe_tree_editor.xml',
|
|
'fusion_plating/static/src/js/recipe_tree_editor.js',
|
|
],
|
|
},
|
|
'demo': [
|
|
'data/fp_demo_data.xml',
|
|
'data/fp_demo_recipe_data.xml',
|
|
],
|
|
'images': ['static/description/icon.png'],
|
|
'installable': True,
|
|
'auto_install': False,
|
|
'application': True,
|
|
}
|