From 0ad382e1a698de9a23d9572f1f6924cbcb14b5f1 Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Mon, 27 Apr 2026 22:33:37 -0400 Subject: [PATCH] feat(phase1): top-level menu consolidation + landing-page resolver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1 collapses the Plating app's 17 top-level menus down to 6 domains (Sales, Operations, Receiving & Shipping, Quality, Compliance, Configuration) so users no longer scroll a 17-item sidebar to find one thing. Re-parented (no XML id changes — bookmarks still work): - fusion_plating_compliance.menu_fp_compliance_root → menu_fp_compliance_hub (renamed 'General') - fusion_plating_safety.menu_fp_safety_root → menu_fp_compliance_hub (renamed 'Safety / WHMIS') - fusion_plating_aerospace.menu_fp_aerospace → menu_fp_compliance_hub (renamed 'Aerospace (AS9100 / Nadcap)') - fusion_plating_nuclear.menu_fp_nuclear → menu_fp_compliance_hub (renamed 'Nuclear (CSA N299 / CNSC)') - fusion_plating_cgp.menu_fp_cgp → menu_fp_compliance_hub (renamed 'Controlled Goods (CGP)') - fusion_plating_certificates.menu_fp_certificates → menu_fp_quality (Certs are a Quality output, not a separate top-level concern) - fusion_plating_bridge_maintenance.menu_fp_maintenance → menu_fp_operations - fusion_plating.menu_fp_job_step_move (Move Log) → menu_fp_operations - fusion_plating.menu_fp_job_step_timelog (Labor History) → menu_fp_operations The new menu_fp_compliance_hub is supervisor-gated; underlying verticals retain their own group locks (CGP officer, etc.). Settings menu remains manager-gated through inheritance from menu_fp_config (already in place). NEW — Plating landing-page resolver: - ir.actions.act_window.x_fc_pickable_landing (Boolean tag for curated picklist; flagged on Sale Orders, Quotations, Process Recipes for Phase 1; more in Phase 2) - res.company.x_fc_default_landing_action_id (admin sets fallback) - res.users.x_fc_plating_landing_action_id (per-user override) - ir.actions.server action_fp_resolve_plating_landing — picks user → company → Sale Orders fallback at click time - menu_fp_root rewired to call the resolver - User profile + Settings tabs surface the dropdowns Configurator's earlier menu_fp_root override (action_fp_sale_orders direct) removed — core's resolver now owns the routing. Versions bumped: fusion_plating 19.0.11.0.0, configurator 19.0.17.16.0, plus 7 dependent modules patched. Co-Authored-By: Claude Opus 4.7 (1M context) --- fusion_plating/fusion_plating/__manifest__.py | 4 +- .../fusion_plating/data/fp_landing_data.xml | 49 +++++++++++ .../fusion_plating/models/__init__.py | 3 + .../fusion_plating/models/fp_landing.py | 61 ++++++++++++++ .../models/res_config_settings.py | 8 ++ .../views/fp_job_step_move_views.xml | 5 +- .../views/fp_job_step_timelog_views.xml | 5 +- .../fusion_plating/views/fp_landing_views.xml | 82 +++++++++++++++++++ .../fusion_plating/views/fp_menu.xml | 15 +++- .../views/fp_process_node_views.xml | 1 + .../fusion_plating_aerospace/__manifest__.py | 2 +- .../views/fp_menu.xml | 8 +- .../__manifest__.py | 2 +- .../views/fp_maintenance_menu.xml | 7 +- .../__manifest__.py | 2 +- .../views/fp_certificates_menu.xml | 7 +- .../fusion_plating_cgp/__manifest__.py | 2 +- .../fusion_plating_cgp/views/fp_menu.xml | 8 +- .../fusion_plating_compliance/__manifest__.py | 2 +- .../views/fp_menu.xml | 5 +- .../__manifest__.py | 2 +- .../views/fp_configurator_menu.xml | 12 ++- .../views/sale_order_views.xml | 2 + .../fusion_plating_nuclear/__manifest__.py | 2 +- .../fusion_plating_nuclear/views/fp_menu.xml | 8 +- .../fusion_plating_safety/__manifest__.py | 2 +- .../fusion_plating_safety/views/fp_menu.xml | 8 +- 27 files changed, 273 insertions(+), 41 deletions(-) create mode 100644 fusion_plating/fusion_plating/data/fp_landing_data.xml create mode 100644 fusion_plating/fusion_plating/models/fp_landing.py create mode 100644 fusion_plating/fusion_plating/views/fp_landing_views.xml diff --git a/fusion_plating/fusion_plating/__manifest__.py b/fusion_plating/fusion_plating/__manifest__.py index b1d4e54b..2b578a4b 100644 --- a/fusion_plating/fusion_plating/__manifest__.py +++ b/fusion_plating/fusion_plating/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating', - 'version': '19.0.10.4.0', + 'version': '19.0.11.0.0', 'category': 'Manufacturing/Plating', 'summary': 'Core plating / metal finishing ERP: facilities, processes, tanks, baths, jobs, operators.', 'description': """ @@ -81,6 +81,7 @@ Copyright (c) 2026 Nexa Systems Inc. All rights reserved. 'data': [ 'security/fp_security.xml', 'security/ir.model.access.csv', + 'data/fp_landing_data.xml', 'data/fp_sequence_data.xml', 'data/fp_job_sequences.xml', 'data/fp_process_category_data.xml', @@ -99,6 +100,7 @@ Copyright (c) 2026 Nexa Systems Inc. All rights reserved. 'views/fp_bath_replenishment_views.xml', 'views/fp_operator_certification_views.xml', 'views/res_config_settings_views.xml', + 'views/fp_landing_views.xml', 'views/fp_menu.xml', 'views/fp_work_centre_views.xml', 'views/fp_job_views.xml', diff --git a/fusion_plating/fusion_plating/data/fp_landing_data.xml b/fusion_plating/fusion_plating/data/fp_landing_data.xml new file mode 100644 index 00000000..e26af20b --- /dev/null +++ b/fusion_plating/fusion_plating/data/fp_landing_data.xml @@ -0,0 +1,49 @@ + + + + + + Plating — Open Landing Page + + code + + + + diff --git a/fusion_plating/fusion_plating/models/__init__.py b/fusion_plating/fusion_plating/models/__init__.py index d2ef444f..e40391d4 100644 --- a/fusion_plating/fusion_plating/models/__init__.py +++ b/fusion_plating/fusion_plating/models/__init__.py @@ -41,3 +41,6 @@ from . import fp_step_template_transition_input # Sub 12b — Rack-aware moves + persistent labor reconciliation from . import fp_rack_tag from . import fp_job_step_move + +# Phase 1 — Plating landing-page resolver +from . import fp_landing diff --git a/fusion_plating/fusion_plating/models/fp_landing.py b/fusion_plating/fusion_plating/models/fp_landing.py new file mode 100644 index 00000000..ebadf848 --- /dev/null +++ b/fusion_plating/fusion_plating/models/fp_landing.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Nexa Systems Inc. +# License OPL-1 (Odoo Proprietary License v1.0) +# Part of the Fusion Plating product family. +"""Phase 1 — Plating landing-page resolver fields. + +Three pieces: +1. `ir.actions.act_window.x_fc_pickable_landing` — Boolean tag. Mark a + curated set of plating actions (Sale Orders, Plant Overview, + Quotations, Quality Dashboard, Manager Dashboard, Tablet Station, + Labor History) so the landing-page dropdown only offers sensible + options, not all 200 act_window records in the DB. + +2. `res.company.x_fc_default_landing_action_id` — admin sets the + fallback for users who don't pick a preference. + +3. `res.users.x_fc_plating_landing_action_id` — each user's own + override. + +The resolver server action (data/fp_landing_data.xml) reads these. +""" + +from odoo import fields, models + + +class IrActionsActWindow(models.Model): + _inherit = 'ir.actions.act_window' + + x_fc_pickable_landing = fields.Boolean( + string='Pickable as Plating Landing', + default=False, + help='When True, this action appears in the Plating landing-' + 'page dropdown on res.users and res.company. Tag a small ' + 'curated list (Sale Orders, Plant Overview, etc.) to keep ' + 'the picker manageable.', + ) + + +class ResCompany(models.Model): + _inherit = 'res.company' + + x_fc_default_landing_action_id = fields.Many2one( + 'ir.actions.act_window', + string='Default Plating Landing Page', + domain=[('x_fc_pickable_landing', '=', True)], + help='Page that opens when a user clicks the Plating app, ' + 'unless the user has chosen their own override on their ' + 'preferences. Falls back to Sale Orders when blank.', + ) + + +class ResUsers(models.Model): + _inherit = 'res.users' + + x_fc_plating_landing_action_id = fields.Many2one( + 'ir.actions.act_window', + string='My Plating Landing Page', + domain=[('x_fc_pickable_landing', '=', True)], + help='Personal override for the page that opens when you click ' + 'the Plating app. When blank, follows the company default.', + ) diff --git a/fusion_plating/fusion_plating/models/res_config_settings.py b/fusion_plating/fusion_plating/models/res_config_settings.py index c8d18d83..4562a37c 100644 --- a/fusion_plating/fusion_plating/models/res_config_settings.py +++ b/fusion_plating/fusion_plating/models/res_config_settings.py @@ -62,3 +62,11 @@ class ResConfigSettings(models.TransientModel): readonly=False, string='Default Recipe Editor', ) + + # ----- Phase 1 — Plating landing page default ----------------------- + x_fc_default_landing_action_id = fields.Many2one( + 'ir.actions.act_window', + related='company_id.x_fc_default_landing_action_id', + readonly=False, + string='Default Plating Landing Page', + ) diff --git a/fusion_plating/fusion_plating/views/fp_job_step_move_views.xml b/fusion_plating/fusion_plating/views/fp_job_step_move_views.xml index 35e3f790..c64daa9d 100644 --- a/fusion_plating/fusion_plating/views/fp_job_step_move_views.xml +++ b/fusion_plating/fusion_plating/views/fp_job_step_move_views.xml @@ -115,10 +115,11 @@ + + sequence="90"/> diff --git a/fusion_plating/fusion_plating/views/fp_job_step_timelog_views.xml b/fusion_plating/fusion_plating/views/fp_job_step_timelog_views.xml index 213fb4a6..45fd2837 100644 --- a/fusion_plating/fusion_plating/views/fp_job_step_timelog_views.xml +++ b/fusion_plating/fusion_plating/views/fp_job_step_timelog_views.xml @@ -133,10 +133,11 @@ {'search_default_my_timers': 1} + + sequence="95"/> diff --git a/fusion_plating/fusion_plating/views/fp_landing_views.xml b/fusion_plating/fusion_plating/views/fp_landing_views.xml new file mode 100644 index 00000000..adc59f06 --- /dev/null +++ b/fusion_plating/fusion_plating/views/fp_landing_views.xml @@ -0,0 +1,82 @@ + + + + + + + res.users.form.fp.landing + res.users + + + + +

+ Choose which page opens when you click the Plating + app. When blank, you see the company default + (Sale Orders unless an admin has changed it). +

+ + + +
+
+
+
+ + + + res.users.form.simple.fp.landing + res.users + + + + +

+ Page that opens when you click the Plating app. +

+ + + +
+
+
+
+ + + + res.config.settings.form.fp.landing + res.config.settings + + + + + + + + + + + + +
diff --git a/fusion_plating/fusion_plating/views/fp_menu.xml b/fusion_plating/fusion_plating/views/fp_menu.xml index b007f49a..b1f7b4d0 100644 --- a/fusion_plating/fusion_plating/views/fp_menu.xml +++ b/fusion_plating/fusion_plating/views/fp_menu.xml @@ -6,13 +6,26 @@ --> - + + + + [('node_type', '=', 'recipe')]
{'default_node_type': 'recipe', 'search_default_recipes_only': 1} +

Create your first process recipe diff --git a/fusion_plating/fusion_plating_aerospace/__manifest__.py b/fusion_plating/fusion_plating_aerospace/__manifest__.py index fa1e9dcf..d9b262c8 100644 --- a/fusion_plating/fusion_plating_aerospace/__manifest__.py +++ b/fusion_plating/fusion_plating_aerospace/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating — Aerospace (AS9100 + Nadcap)', - 'version': '19.0.1.0.0', + 'version': '19.0.1.1.0', 'category': 'Manufacturing/Plating', 'summary': 'Aerospace industry pack: AS9100 Rev D clause library, Nadcap AC7108 ' 'audits, counterfeit parts prevention, config management, risk register, ' diff --git a/fusion_plating/fusion_plating_aerospace/views/fp_menu.xml b/fusion_plating/fusion_plating_aerospace/views/fp_menu.xml index 684bf1ad..03f3b7c5 100644 --- a/fusion_plating/fusion_plating_aerospace/views/fp_menu.xml +++ b/fusion_plating/fusion_plating_aerospace/views/fp_menu.xml @@ -6,11 +6,11 @@ --> - + - + [('certificate_type', '=', 'thickness_report')] - + - + - + + diff --git a/fusion_plating/fusion_plating_configurator/__manifest__.py b/fusion_plating/fusion_plating_configurator/__manifest__.py index 329bbf31..4dbfaf2f 100644 --- a/fusion_plating/fusion_plating_configurator/__manifest__.py +++ b/fusion_plating/fusion_plating_configurator/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating — Configurator', - 'version': '19.0.17.15.0', + 'version': '19.0.17.16.0', 'category': 'Manufacturing/Plating', 'summary': 'Quotation configurator with part catalog, coating configs, and formula-based pricing engine.', 'description': """ diff --git a/fusion_plating/fusion_plating_configurator/views/fp_configurator_menu.xml b/fusion_plating/fusion_plating_configurator/views/fp_configurator_menu.xml index 0b9db7d1..4563832f 100644 --- a/fusion_plating/fusion_plating_configurator/views/fp_configurator_menu.xml +++ b/fusion_plating/fusion_plating_configurator/views/fp_configurator_menu.xml @@ -15,10 +15,14 @@ {'default_customer_rank': 1} - - + {'default_x_fc_delivery_method': 'shipping_partner'} +

Create a new quotation @@ -482,6 +483,7 @@ [('state', 'in', ('sale', 'done'))] + diff --git a/fusion_plating/fusion_plating_nuclear/__manifest__.py b/fusion_plating/fusion_plating_nuclear/__manifest__.py index caf7e742..08f40147 100644 --- a/fusion_plating/fusion_plating_nuclear/__manifest__.py +++ b/fusion_plating/fusion_plating_nuclear/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating — Nuclear (CSA N299, NQA-1)', - 'version': '19.0.1.0.0', + 'version': '19.0.1.1.0', 'category': 'Manufacturing/Plating', 'summary': 'Nuclear industry pack: CSA N299 Levels 1-4, NQA-1 awareness, ' 'CNSC licence tracking, 10 CFR Part 21 reporting, ITPs, ' diff --git a/fusion_plating/fusion_plating_nuclear/views/fp_menu.xml b/fusion_plating/fusion_plating_nuclear/views/fp_menu.xml index cb86dd19..f98b34c9 100644 --- a/fusion_plating/fusion_plating_nuclear/views/fp_menu.xml +++ b/fusion_plating/fusion_plating_nuclear/views/fp_menu.xml @@ -6,11 +6,11 @@ --> - + - +