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) <noreply@anthropic.com>
250 lines
13 KiB
XML
250 lines
13 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!--
|
|
Copyright 2026 Nexa Systems Inc.
|
|
License OPL-1 (Odoo Proprietary License v1.0)
|
|
Part of the Fusion Plating product family.
|
|
-->
|
|
<odoo>
|
|
|
|
<!-- ===== TREE (LIST) VIEW — Recipes only ===== -->
|
|
<record id="view_fp_process_node_tree" model="ir.ui.view">
|
|
<field name="name">fusion.plating.process.node.tree</field>
|
|
<field name="model">fusion.plating.process.node</field>
|
|
<field name="arch" type="xml">
|
|
<list string="Process Recipes" default_order="sequence, name">
|
|
<field name="sequence" widget="handle"/>
|
|
<field name="code" optional="show"/>
|
|
<field name="name"/>
|
|
<field name="node_type" widget="badge"
|
|
decoration-info="node_type == 'recipe'"
|
|
decoration-success="node_type == 'operation'"
|
|
decoration-warning="node_type == 'sub_process'"
|
|
decoration-muted="node_type == 'step'"/>
|
|
<field name="process_type_id" optional="show"/>
|
|
<field name="work_center_id" optional="show"/>
|
|
<field name="child_count" string="Steps"/>
|
|
<field name="version" optional="hide"/>
|
|
<field name="active" column_invisible="True"/>
|
|
</list>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- ===== FORM VIEW ===== -->
|
|
<record id="view_fp_process_node_form" model="ir.ui.view">
|
|
<field name="name">fusion.plating.process.node.form</field>
|
|
<field name="model">fusion.plating.process.node</field>
|
|
<field name="arch" type="xml">
|
|
<form string="Process Node">
|
|
<header>
|
|
<button name="action_open_tree_editor" type="object"
|
|
string="Open Tree Editor" class="btn-primary"
|
|
icon="fa-sitemap"
|
|
invisible="node_type != 'recipe'"/>
|
|
<button name="action_open_simple_editor" type="object"
|
|
string="Open Simple Editor" class="btn-secondary"
|
|
icon="fa-list-ol"
|
|
invisible="node_type != 'recipe'"/>
|
|
</header>
|
|
<sheet>
|
|
<div class="oe_button_box" name="button_box">
|
|
<button name="action_open_tree_editor" type="object"
|
|
class="oe_stat_button" icon="fa-sitemap"
|
|
invisible="node_type != 'recipe'">
|
|
<field name="child_count" widget="statinfo"
|
|
string="Steps"/>
|
|
</button>
|
|
</div>
|
|
<widget name="web_ribbon" title="Archived"
|
|
bg_color="text-bg-danger"
|
|
invisible="active"/>
|
|
<div class="oe_title">
|
|
<h1>
|
|
<field name="name" placeholder="Node name..."/>
|
|
</h1>
|
|
</div>
|
|
<group>
|
|
<group string="Classification">
|
|
<field name="code"/>
|
|
<field name="node_type"/>
|
|
<field name="process_type_id"/>
|
|
<field name="work_center_id"/>
|
|
<field name="parent_id"/>
|
|
<field name="icon"/>
|
|
</group>
|
|
<group string="Behaviour">
|
|
<field name="sequence"/>
|
|
<field name="estimated_duration"/>
|
|
<field name="auto_complete"/>
|
|
<field name="customer_visible"/>
|
|
<field name="is_manual"/>
|
|
<field name="requires_signoff"/>
|
|
<field name="opt_in_out"/>
|
|
<field name="version"/>
|
|
<field name="active" invisible="True"/>
|
|
</group>
|
|
</group>
|
|
<!-- Recipe-only metadata (lead time, product link,
|
|
contract review approvers). Hidden on
|
|
operation/step nodes since those values are
|
|
only meaningful at the recipe root. -->
|
|
<group string="Recipe Settings"
|
|
invisible="node_type != 'recipe'">
|
|
<group>
|
|
<field name="default_lead_time"
|
|
widget="float_time"/>
|
|
<field name="product_id"
|
|
options="{'no_create': True}"/>
|
|
<field name="preferred_editor"/>
|
|
</group>
|
|
<group>
|
|
<field name="contract_review_user_ids"
|
|
widget="many2many_tags"
|
|
options="{'no_create': True}"/>
|
|
<field name="is_template"
|
|
groups="fusion_plating.group_fusion_plating_supervisor"/>
|
|
</group>
|
|
</group>
|
|
<group>
|
|
<group string="Tracking">
|
|
<field name="create_date" string="Created"/>
|
|
<field name="create_uid" string="Created By"/>
|
|
<field name="write_date" string="Last Updated"/>
|
|
<field name="write_uid" string="Updated By"/>
|
|
</group>
|
|
</group>
|
|
<notebook>
|
|
<page string="Description" name="description">
|
|
<field name="description" widget="html"/>
|
|
</page>
|
|
<page string="Operator Inputs" name="inputs">
|
|
<field name="input_ids">
|
|
<list editable="bottom">
|
|
<field name="sequence" widget="handle"/>
|
|
<field name="name"/>
|
|
<field name="input_type"/>
|
|
<field name="required"/>
|
|
<field name="hint"/>
|
|
<field name="uom"/>
|
|
<field name="selection_options"
|
|
invisible="input_type != 'selection'"/>
|
|
</list>
|
|
</field>
|
|
</page>
|
|
<page string="Child Steps" name="children">
|
|
<field name="child_ids">
|
|
<list default_order="sequence, name">
|
|
<field name="sequence" widget="handle"/>
|
|
<field name="name"/>
|
|
<field name="node_type" widget="badge"/>
|
|
<field name="work_center_id"/>
|
|
<field name="estimated_duration"/>
|
|
<field name="child_count" string="Sub-Steps"/>
|
|
</list>
|
|
</field>
|
|
</page>
|
|
<page string="Step Authoring" name="step_authoring"
|
|
invisible="node_type not in ('step', 'operation')">
|
|
<group>
|
|
<group string="Stations">
|
|
<field name="tank_ids" widget="many2many_tags"/>
|
|
<field name="default_kind"/>
|
|
<field name="material_callout"/>
|
|
</group>
|
|
<group string="Flags">
|
|
<field name="requires_predecessor_done"/>
|
|
<field name="requires_rack_assignment"/>
|
|
<field name="requires_transition_form"/>
|
|
</group>
|
|
</group>
|
|
<group>
|
|
<group string="Time Target">
|
|
<field name="time_min_target"/>
|
|
<field name="time_max_target"/>
|
|
<field name="time_unit"/>
|
|
</group>
|
|
<group string="Temperature Target">
|
|
<field name="temp_min_target"/>
|
|
<field name="temp_max_target"/>
|
|
<field name="temp_unit"/>
|
|
</group>
|
|
</group>
|
|
<group>
|
|
<field name="voltage_target"/>
|
|
<field name="viscosity_target"/>
|
|
<field name="source_template_id" readonly="1"/>
|
|
</group>
|
|
</page>
|
|
<page string="Notes" name="notes">
|
|
<field name="notes" placeholder="Internal notes..."/>
|
|
</page>
|
|
</notebook>
|
|
</sheet>
|
|
<chatter/>
|
|
</form>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- ===== SEARCH VIEW ===== -->
|
|
<record id="view_fp_process_node_search" model="ir.ui.view">
|
|
<field name="name">fusion.plating.process.node.search</field>
|
|
<field name="model">fusion.plating.process.node</field>
|
|
<field name="arch" type="xml">
|
|
<search>
|
|
<field name="name"/>
|
|
<field name="code"/>
|
|
<field name="process_type_id"/>
|
|
<field name="work_center_id"/>
|
|
<filter name="recipes_only" string="Recipes"
|
|
domain="[('node_type', '=', 'recipe')]"/>
|
|
<filter name="sub_processes" string="Sub-Processes"
|
|
domain="[('node_type', '=', 'sub_process')]"/>
|
|
<filter name="operations" string="Operations"
|
|
domain="[('node_type', '=', 'operation')]"/>
|
|
<separator/>
|
|
<filter name="archived" string="Archived"
|
|
domain="[('active', '=', False)]"/>
|
|
<filter name="group_type" string="Type"
|
|
context="{'group_by': 'node_type'}"/>
|
|
<filter name="group_process" string="Process Type"
|
|
context="{'group_by': 'process_type_id'}"/>
|
|
<filter name="group_wc" string="Work Centre"
|
|
context="{'group_by': 'work_center_id'}"/>
|
|
<!-- Part-scoped filters live in fusion_plating_configurator;
|
|
the part_catalog_id field is declared there (core
|
|
can't see it without a circular dep). -->
|
|
</search>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- ===== WINDOW ACTION — Recipe list ===== -->
|
|
<!-- Domain only narrows by node_type in core. The configurator
|
|
module adds the part_catalog_id = False narrowing via a
|
|
view/action inherit (see fusion_plating_configurator). -->
|
|
<record id="action_fp_process_recipe" model="ir.actions.act_window">
|
|
<field name="name">Process Recipes</field>
|
|
<field name="res_model">fusion.plating.process.node</field>
|
|
<field name="view_mode">list,form</field>
|
|
<field name="domain">[('node_type', '=', 'recipe')]</field>
|
|
<field name="context">{'default_node_type': 'recipe', 'search_default_recipes_only': 1}</field>
|
|
<field name="search_view_id" ref="view_fp_process_node_search"/>
|
|
<field name="x_fc_pickable_landing" eval="True"/>
|
|
<field name="help" type="html">
|
|
<p class="o_view_nocontent_smiling_face">
|
|
Create your first process recipe
|
|
</p>
|
|
<p>
|
|
Recipes define the step-by-step process for plating parts.
|
|
Each recipe is a reusable template with nested operations
|
|
and sub-processes.
|
|
</p>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- ===== CLIENT ACTION — OWL Tree Editor ===== -->
|
|
<record id="action_fp_recipe_tree_editor" model="ir.actions.client">
|
|
<field name="name">Recipe Tree Editor</field>
|
|
<field name="tag">fp_recipe_tree_editor</field>
|
|
</record>
|
|
|
|
</odoo>
|