folder rename

This commit is contained in:
gsinghpal
2026-04-16 20:53:53 -04:00
parent 3f3ddcbab4
commit 7c7ef06057
634 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,127 @@
<?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>
<record id="view_fp_bath_log_list" model="ir.ui.view">
<field name="name">fp.bath.log.list</field>
<field name="model">fusion.plating.bath.log</field>
<field name="arch" type="xml">
<list string="Bath Logs"
decoration-success="status == 'ok'"
decoration-warning="status == 'warning'"
decoration-danger="status == 'out_of_spec'">
<field name="name"/>
<field name="log_date"/>
<field name="bath_id"/>
<field name="tank_id" optional="show"/>
<field name="process_type_id" optional="show"/>
<field name="operator_id"/>
<field name="shift" optional="hide"/>
<field name="status" widget="badge"
decoration-success="status == 'ok'"
decoration-warning="status == 'warning'"
decoration-danger="status == 'out_of_spec'"/>
</list>
</field>
</record>
<record id="view_fp_bath_log_form" model="ir.ui.view">
<field name="name">fp.bath.log.form</field>
<field name="model">fusion.plating.bath.log</field>
<field name="arch" type="xml">
<form string="Bath Log">
<sheet>
<div class="oe_title">
<h1><field name="name" readonly="1"/></h1>
</div>
<group>
<group>
<field name="bath_id"/>
<field name="tank_id" readonly="1"/>
<field name="process_type_id" readonly="1"/>
<field name="facility_id" readonly="1" groups="base.group_multi_company"/>
</group>
<group>
<field name="log_date"/>
<field name="operator_id"/>
<field name="shift"/>
<field name="status" readonly="1" widget="badge"
decoration-success="status == 'ok'"
decoration-warning="status == 'warning'"
decoration-danger="status == 'out_of_spec'"/>
</group>
</group>
<notebook>
<page string="Readings">
<field name="line_ids">
<list editable="bottom"
decoration-success="status == 'ok'"
decoration-warning="status == 'warning'"
decoration-danger="status == 'out_of_spec'">
<field name="sequence" widget="handle"/>
<field name="parameter_id"/>
<field name="value"/>
<field name="uom"/>
<field name="target_min"/>
<field name="target_max"/>
<field name="status" widget="badge"
decoration-success="status == 'ok'"
decoration-warning="status == 'warning'"
decoration-danger="status == 'out_of_spec'"/>
<field name="notes"/>
</list>
</field>
</page>
<page string="Notes">
<field name="notes"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_bath_log_search" model="ir.ui.view">
<field name="name">fp.bath.log.search</field>
<field name="model">fusion.plating.bath.log</field>
<field name="arch" type="xml">
<search string="Bath Logs">
<field name="name"/>
<field name="bath_id"/>
<field name="tank_id"/>
<field name="process_type_id"/>
<field name="operator_id"/>
<separator/>
<filter string="OK" name="ok" domain="[('status','=','ok')]"/>
<filter string="Warning" name="warn" domain="[('status','=','warning')]"/>
<filter string="Out of Spec" name="oos" domain="[('status','=','out_of_spec')]"/>
<separator/>
<filter string="Today" name="today"
domain="[('log_date','&gt;=', context_today().strftime('%Y-%m-%d'))]"/>
<filter string="This Week" name="week"
domain="[('log_date','&gt;=', (context_today() - relativedelta(days=7)).strftime('%Y-%m-%d'))]"/>
<group>
<filter string="Bath" name="group_bath" context="{'group_by':'bath_id'}"/>
<filter string="Tank" name="group_tank" context="{'group_by':'tank_id'}"/>
<filter string="Process" name="group_process" context="{'group_by':'process_type_id'}"/>
<filter string="Operator" name="group_op" context="{'group_by':'operator_id'}"/>
<filter string="Status" name="group_status" context="{'group_by':'status'}"/>
<filter string="Day" name="group_day" context="{'group_by':'log_date:day'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_bath_log" model="ir.actions.act_window">
<field name="name">Bath Logs</field>
<field name="res_model">fusion.plating.bath.log</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_bath_log_search"/>
</record>
</odoo>

View File

@@ -0,0 +1,198 @@
<?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>
<record id="view_fp_bath_list" model="ir.ui.view">
<field name="name">fp.bath.list</field>
<field name="model">fusion.plating.bath</field>
<field name="arch" type="xml">
<list string="Baths" decoration-muted="state == 'dumped'"
decoration-warning="last_log_status == 'warning'"
decoration-danger="last_log_status == 'out_of_spec'">
<field name="name"/>
<field name="tank_id"/>
<field name="process_type_id"/>
<field name="facility_id" groups="base.group_multi_company"/>
<field name="state" widget="badge"
decoration-success="state == 'operational'"
decoration-info="state == 'new'"
decoration-warning="state == 'under_review'"
decoration-danger="state == 'dump_scheduled'"
decoration-muted="state == 'dumped'"/>
<field name="mto_count"/>
<field name="last_log_date"/>
<field name="last_log_status" widget="badge"
decoration-success="last_log_status == 'ok'"
decoration-warning="last_log_status == 'warning'"
decoration-danger="last_log_status == 'out_of_spec'"/>
<field name="makeup_date" optional="hide"/>
</list>
</field>
</record>
<record id="view_fp_bath_form" model="ir.ui.view">
<field name="name">fp.bath.form</field>
<field name="model">fusion.plating.bath</field>
<field name="arch" type="xml">
<form string="Bath">
<header>
<button name="action_make_operational" string="Set Operational" type="object"
class="oe_highlight" invisible="state != 'new'"/>
<button name="action_mark_under_review" string="Flag for Review" type="object"
invisible="state not in ('operational',)"/>
<button name="action_schedule_dump" string="Schedule Dump" type="object"
invisible="state not in ('operational','under_review')"/>
<button name="action_dump" string="Dump" type="object"
invisible="state != 'dump_scheduled'"/>
<field name="state" widget="statusbar"
statusbar_visible="new,operational,under_review,dump_scheduled,dumped"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="%(action_fp_bath_log)d" type="action" class="oe_stat_button" icon="fa-flask"
context="{'search_default_bath_id': id}">
<field name="log_count" widget="statinfo" string="Logs"/>
</button>
</div>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" readonly="state != 'new'"/></h1>
</div>
<group>
<group>
<field name="tank_id"/>
<field name="process_type_id"/>
<field name="facility_id" readonly="1"/>
<field name="volume"/>
</group>
<group>
<field name="makeup_date"/>
<field name="makeup_by_id"/>
<field name="mto_count" readonly="1"/>
<field name="last_log_date" readonly="1"/>
<field name="last_log_status" readonly="1" widget="badge"
decoration-success="last_log_status == 'ok'"
decoration-warning="last_log_status == 'warning'"
decoration-danger="last_log_status == 'out_of_spec'"/>
</group>
</group>
<notebook>
<page string="Target Ranges">
<field name="target_line_ids">
<list editable="bottom">
<field name="sequence" widget="handle"/>
<field name="parameter_id"/>
<field name="target_min"/>
<field name="target_max"/>
<field name="uom"/>
</list>
</field>
<p class="text-muted mt-2">
Per-bath target overrides. If empty, the parameter's default range is used.
</p>
</page>
<page string="Chemistry Logs">
<field name="log_ids" readonly="1">
<list decoration-success="status == 'ok'"
decoration-warning="status == 'warning'"
decoration-danger="status == 'out_of_spec'">
<field name="name"/>
<field name="log_date"/>
<field name="operator_id"/>
<field name="shift"/>
<field name="status"/>
</list>
</field>
</page>
<page string="Notes">
<field name="notes"/>
</page>
<page string="Dump" invisible="state not in ('dump_scheduled','dumped')">
<group>
<field name="dump_scheduled_date"/>
<field name="dumped_date"/>
<field name="dump_reason"/>
</group>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_bath_kanban" model="ir.ui.view">
<field name="name">fp.bath.kanban</field>
<field name="model">fusion.plating.bath</field>
<field name="arch" type="xml">
<kanban default_group_by="state" class="o_fp_bath_kanban">
<field name="id"/>
<field name="name"/>
<field name="tank_id"/>
<field name="process_type_id"/>
<field name="state"/>
<field name="last_log_status"/>
<field name="mto_count"/>
<field name="status_color"/>
<templates>
<t t-name="card">
<div class="o_fp_card o_fp_bath_card"
t-att-data-log-status="record.last_log_status.raw_value">
<div class="d-flex justify-content-between align-items-start">
<strong class="o_fp_card_title"><field name="name"/></strong>
<span class="o_fp_health_dot"
t-att-data-status="record.last_log_status.raw_value or 'ok'"/>
</div>
<div class="small text-muted">
<field name="process_type_id"/>
</div>
<div class="small"><i class="fa fa-flask me-1 text-muted"/><field name="tank_id"/></div>
<div class="d-flex justify-content-between mt-2 small">
<span class="text-muted">MTO</span>
<span class="fw-bold"><field name="mto_count"/></span>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="view_fp_bath_search" model="ir.ui.view">
<field name="name">fp.bath.search</field>
<field name="model">fusion.plating.bath</field>
<field name="arch" type="xml">
<search string="Baths">
<field name="name"/>
<field name="tank_id"/>
<field name="process_type_id"/>
<field name="facility_id"/>
<separator/>
<filter string="Operational" name="operational" domain="[('state','=','operational')]"/>
<filter string="Under Review" name="review" domain="[('state','=','under_review')]"/>
<filter string="Out of Spec" name="oos" domain="[('last_log_status','=','out_of_spec')]"/>
<filter string="Warning" name="warn" domain="[('last_log_status','=','warning')]"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group>
<filter string="Facility" name="group_facility" context="{'group_by':'facility_id'}"/>
<filter string="Process" name="group_process" context="{'group_by':'process_type_id'}"/>
<filter string="Tank" name="group_tank" context="{'group_by':'tank_id'}"/>
<filter string="Status" name="group_state" context="{'group_by':'state'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_bath" model="ir.actions.act_window">
<field name="name">Baths</field>
<field name="res_model">fusion.plating.bath</field>
<field name="view_mode">kanban,list,form</field>
<field name="search_view_id" ref="view_fp_bath_search"/>
</record>
</odoo>

View File

@@ -0,0 +1,156 @@
<?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>
<record id="view_fp_facility_list" model="ir.ui.view">
<field name="name">fp.facility.list</field>
<field name="model">fusion.plating.facility</field>
<field name="arch" type="xml">
<list string="Facilities">
<field name="sequence" widget="handle"/>
<field name="code"/>
<field name="name"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="work_center_count"/>
<field name="tank_count"/>
<field name="capability_count"/>
<field name="active" widget="boolean_toggle"/>
</list>
</field>
</record>
<record id="view_fp_facility_form" model="ir.ui.view">
<field name="name">fp.facility.form</field>
<field name="model">fusion.plating.facility</field>
<field name="arch" type="xml">
<form string="Facility">
<header/>
<sheet>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
<div class="oe_button_box" name="button_box">
<button name="%(action_fp_tank)d" type="action" class="oe_stat_button" icon="fa-flask"
context="{'search_default_facility_id': id}">
<field name="tank_count" widget="statinfo" string="Tanks"/>
</button>
<button name="%(action_fp_work_center)d" type="action" class="oe_stat_button" icon="fa-cogs"
context="{'search_default_facility_id': id}">
<field name="work_center_count" widget="statinfo" string="Work Centers"/>
</button>
</div>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. Site A — Mississauga"/></h1>
<div class="text-muted">
<field name="code" placeholder="SITE-A"/>
</div>
</div>
<group>
<group>
<field name="company_id" groups="base.group_multi_company"/>
<field name="partner_id"/>
<field name="sequence"/>
</group>
<group>
<field name="active" widget="boolean_toggle"/>
</group>
</group>
<notebook>
<page string="Capabilities">
<field name="capability_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
<p class="text-muted mt-2">
Process types this facility can perform. Install process packs
(EN, chrome, anodize, black oxide) to populate the list.
</p>
</page>
<page string="Work Centers">
<field name="work_center_ids">
<list>
<field name="sequence" widget="handle"/>
<field name="code"/>
<field name="name"/>
<field name="tank_count"/>
<field name="active" widget="boolean_toggle"/>
</list>
</field>
</page>
<page string="Tanks">
<field name="tank_ids">
<list>
<field name="code"/>
<field name="name"/>
<field name="work_center_id"/>
<field name="current_process_id"/>
<field name="state"/>
</list>
</field>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_facility_kanban" model="ir.ui.view">
<field name="name">fp.facility.kanban</field>
<field name="model">fusion.plating.facility</field>
<field name="arch" type="xml">
<kanban class="o_fp_facility_kanban">
<field name="id"/>
<field name="name"/>
<field name="code"/>
<field name="tank_count"/>
<field name="work_center_count"/>
<field name="capability_count"/>
<templates>
<t t-name="card">
<div class="o_fp_card">
<div class="d-flex align-items-start justify-content-between">
<div>
<strong class="o_fp_card_title"><field name="name"/></strong>
<div class="text-muted small"><field name="code"/></div>
</div>
<i class="fa fa-industry text-muted" aria-hidden="true"/>
</div>
<div class="d-flex gap-3 mt-3 o_fp_card_stats">
<div class="text-center">
<div class="fw-bold"><field name="work_center_count"/></div>
<div class="small text-muted">Lines</div>
</div>
<div class="text-center">
<div class="fw-bold"><field name="tank_count"/></div>
<div class="small text-muted">Tanks</div>
</div>
<div class="text-center">
<div class="fw-bold"><field name="capability_count"/></div>
<div class="small text-muted">Processes</div>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="action_fp_facility" model="ir.actions.act_window">
<field name="name">Facilities</field>
<field name="res_model">fusion.plating.facility</field>
<field name="view_mode">kanban,list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create your first facility
</p>
<p>
A facility is a physical site with its own tanks, work centers,
operators, and regulatory profile. A single-site shop has one
facility; a multi-site operator has several.
</p>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,83 @@
<?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>
<!-- ===== ROOT APP MENU ===== -->
<menuitem id="menu_fp_root"
name="Plating"
sequence="46"
web_icon="fusion_plating,static/description/icon.png"
groups="group_fusion_plating_operator"/>
<!-- ===== OPERATIONS ===== -->
<menuitem id="menu_fp_operations"
name="Operations"
parent="menu_fp_root"
sequence="18"/>
<menuitem id="menu_fp_process_recipes"
name="Process Recipes"
parent="menu_fp_operations"
action="action_fp_process_recipe"
sequence="5"/>
<menuitem id="menu_fp_baths"
name="Baths"
parent="menu_fp_operations"
action="action_fp_bath"
sequence="10"/>
<menuitem id="menu_fp_bath_logs"
name="Chemistry Logs"
parent="menu_fp_operations"
action="action_fp_bath_log"
sequence="20"/>
<menuitem id="menu_fp_tanks"
name="Tanks"
parent="menu_fp_operations"
action="action_fp_tank"
sequence="30"/>
<!-- ===== CONFIGURATION ===== -->
<menuitem id="menu_fp_config"
name="Configuration"
parent="menu_fp_root"
sequence="90"
groups="group_fusion_plating_manager"/>
<menuitem id="menu_fp_facilities"
name="Facilities"
parent="menu_fp_config"
action="action_fp_facility"
sequence="10"/>
<menuitem id="menu_fp_work_centers"
name="Work Centers"
parent="menu_fp_config"
action="action_fp_work_center"
sequence="20"/>
<menuitem id="menu_fp_process_categories"
name="Process Categories"
parent="menu_fp_config"
action="action_fp_process_category"
sequence="30"/>
<menuitem id="menu_fp_process_types"
name="Process Types"
parent="menu_fp_config"
action="action_fp_process_type"
sequence="40"/>
<menuitem id="menu_fp_bath_parameters"
name="Bath Parameters"
parent="menu_fp_config"
action="action_fp_bath_parameter"
sequence="50"/>
</odoo>

View File

@@ -0,0 +1,184 @@
<?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'"/>
</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>
<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="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')]"/>
<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'}"/>
</search>
</field>
</record>
<!-- ===== WINDOW ACTION — Recipe list ===== -->
<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="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>

View File

@@ -0,0 +1,240 @@
<?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>
<!-- ===== Process Category ===== -->
<record id="view_fp_process_category_list" model="ir.ui.view">
<field name="name">fp.process.category.list</field>
<field name="model">fusion.plating.process.category</field>
<field name="arch" type="xml">
<list string="Process Categories">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="code"/>
<field name="process_type_count"/>
<field name="active" widget="boolean_toggle"/>
</list>
</field>
</record>
<record id="view_fp_process_category_form" model="ir.ui.view">
<field name="name">fp.process.category.form</field>
<field name="model">fusion.plating.process.category</field>
<field name="arch" type="xml">
<form string="Process Category">
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. Plating"/></h1>
</div>
<group>
<group>
<field name="code"/>
<field name="sequence"/>
</group>
<group>
<field name="active" widget="boolean_toggle"/>
</group>
</group>
<notebook>
<page string="Description">
<field name="description" placeholder="What this category represents..."/>
</page>
<page string="Process Types">
<field name="process_type_ids">
<list>
<field name="sequence" widget="handle"/>
<field name="code"/>
<field name="name"/>
<field name="active" widget="boolean_toggle"/>
</list>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="action_fp_process_category" model="ir.actions.act_window">
<field name="name">Process Categories</field>
<field name="res_model">fusion.plating.process.category</field>
<field name="view_mode">list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Define process categories
</p>
<p>
Categories group related finishing processes (plating, anodizing,
conversion coatings, etc.). Process packs reference these categories
when they load specific process types.
</p>
</field>
</record>
<!-- ===== Process Type ===== -->
<record id="view_fp_process_type_list" model="ir.ui.view">
<field name="name">fp.process.type.list</field>
<field name="model">fusion.plating.process.type</field>
<field name="arch" type="xml">
<list string="Process Types">
<field name="sequence" widget="handle"/>
<field name="code"/>
<field name="name"/>
<field name="category_id"/>
<field name="icon" optional="hide"/>
<field name="active" widget="boolean_toggle"/>
</list>
</field>
</record>
<record id="view_fp_process_type_form" model="ir.ui.view">
<field name="name">fp.process.type.form</field>
<field name="model">fusion.plating.process.type</field>
<field name="arch" type="xml">
<form string="Process Type">
<sheet>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. Electroless Nickel — Mid Phosphorus"/></h1>
<div class="text-muted">
<field name="code" placeholder="EN_MID"/>
</div>
</div>
<group>
<group>
<field name="category_id"/>
<field name="sequence"/>
<field name="icon"/>
</group>
<group>
<field name="color" widget="color_picker"/>
<field name="active" widget="boolean_toggle"/>
</group>
</group>
<notebook>
<page string="Description">
<field name="description" placeholder="Short description of the process..."/>
</page>
<page string="Bath Parameters">
<field name="parameter_ids">
<list>
<field name="sequence" widget="handle"/>
<field name="code"/>
<field name="name"/>
<field name="parameter_type"/>
<field name="uom"/>
<field name="target_min"/>
<field name="target_max"/>
</list>
</field>
</page>
<page string="Hazard Notes">
<field name="hazard_notes"
placeholder="Process-level hazard awareness (e.g. Cr(VI) carcinogen, hypophosphite reducer)..."/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="view_fp_process_type_search" model="ir.ui.view">
<field name="name">fp.process.type.search</field>
<field name="model">fusion.plating.process.type</field>
<field name="arch" type="xml">
<search string="Process Types">
<field name="name"/>
<field name="code"/>
<field name="category_id"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group>
<filter string="Category" name="group_category" context="{'group_by':'category_id'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_process_type" model="ir.actions.act_window">
<field name="name">Process Types</field>
<field name="res_model">fusion.plating.process.type</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_process_type_search"/>
<field name="context">{'search_default_group_category': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No process types yet
</p>
<p>
Install a process pack (EN, Chrome, Anodize, Black Oxide) to load
pre-configured process types, or create your own.
</p>
</field>
</record>
<!-- ===== Bath Parameter ===== -->
<record id="view_fp_bath_parameter_list" model="ir.ui.view">
<field name="name">fp.bath.parameter.list</field>
<field name="model">fusion.plating.bath.parameter</field>
<field name="arch" type="xml">
<list string="Bath Parameters">
<field name="sequence" widget="handle"/>
<field name="code"/>
<field name="name"/>
<field name="parameter_type"/>
<field name="uom"/>
<field name="target_min"/>
<field name="target_max"/>
<field name="warning_tolerance"/>
<field name="active" widget="boolean_toggle"/>
</list>
</field>
</record>
<record id="view_fp_bath_parameter_form" model="ir.ui.view">
<field name="name">fp.bath.parameter.form</field>
<field name="model">fusion.plating.bath.parameter</field>
<field name="arch" type="xml">
<form string="Bath Parameter">
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. Nickel Concentration"/></h1>
<div class="text-muted">
<field name="code" placeholder="Ni"/>
</div>
</div>
<group>
<group>
<field name="parameter_type"/>
<field name="uom"/>
<field name="decimals"/>
</group>
<group>
<field name="target_min"/>
<field name="target_max"/>
<field name="warning_tolerance"/>
<field name="active" widget="boolean_toggle"/>
</group>
</group>
<group string="Description">
<field name="description" nolabel="1"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_fp_bath_parameter" model="ir.actions.act_window">
<field name="name">Bath Parameters</field>
<field name="res_model">fusion.plating.bath.parameter</field>
<field name="view_mode">list,form</field>
</record>
</odoo>

View File

@@ -0,0 +1,168 @@
<?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>
<record id="view_fp_tank_list" model="ir.ui.view">
<field name="name">fp.tank.list</field>
<field name="model">fusion.plating.tank</field>
<field name="arch" type="xml">
<list string="Tanks">
<field name="facility_id"/>
<field name="work_center_id"/>
<field name="code"/>
<field name="name"/>
<field name="current_process_id"/>
<field name="state" widget="badge"
decoration-success="state == 'in_use'"
decoration-info="state == 'filled'"
decoration-warning="state in ('draining', 'maintenance')"
decoration-muted="state in ('empty', 'out_of_service')"/>
<field name="material" optional="hide"/>
<field name="volume" optional="show"/>
<field name="volume_uom" optional="show"/>
<field name="active" widget="boolean_toggle" optional="hide"/>
</list>
</field>
</record>
<record id="view_fp_tank_form" model="ir.ui.view">
<field name="name">fp.tank.form</field>
<field name="model">fusion.plating.tank</field>
<field name="arch" type="xml">
<form string="Tank">
<header>
<field name="state" widget="statusbar"
statusbar_visible="empty,filled,in_use,draining,maintenance"/>
</header>
<sheet>
<widget name="web_ribbon" title="Out of Service" bg_color="text-bg-danger"
invisible="state != 'out_of_service'"/>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. EN Plating Tank A1"/></h1>
<div class="text-muted">
<field name="code" placeholder="T-01"/>
</div>
</div>
<group>
<group string="Location">
<field name="facility_id"/>
<field name="work_center_id"/>
<field name="sequence"/>
</group>
<group string="Current Bath">
<field name="current_bath_id" readonly="1"/>
<field name="current_process_id" readonly="1"/>
<field name="qr_code"/>
</group>
</group>
<notebook>
<page string="Physical">
<group>
<group>
<field name="volume"/>
<field name="volume_uom"/>
<field name="material"/>
</group>
<group>
<field name="heating_type"/>
<field name="has_filtration"/>
<field name="has_rectifier"/>
</group>
</group>
</page>
<page string="Bath History">
<field name="bath_ids">
<list decoration-muted="state == 'dumped'">
<field name="name"/>
<field name="process_type_id"/>
<field name="state"/>
<field name="makeup_date"/>
<field name="mto_count"/>
<field name="last_log_date"/>
</list>
</field>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_tank_kanban" model="ir.ui.view">
<field name="name">fp.tank.kanban</field>
<field name="model">fusion.plating.tank</field>
<field name="arch" type="xml">
<kanban class="o_fp_tank_kanban">
<field name="id"/>
<field name="code"/>
<field name="name"/>
<field name="state"/>
<field name="current_bath_id"/>
<field name="current_process_id"/>
<field name="facility_id"/>
<field name="work_center_id"/>
<templates>
<t t-name="card">
<div class="o_fp_card o_fp_tank_card" t-att-data-state="record.state.raw_value">
<div class="d-flex align-items-start justify-content-between">
<div>
<strong class="o_fp_card_title"><field name="code"/></strong>
<div class="small text-muted"><field name="name"/></div>
</div>
<span class="badge o_fp_badge" t-att-data-state="record.state.raw_value">
<field name="state"/>
</span>
</div>
<div class="mt-2 small">
<div><i class="fa fa-flask me-1 text-muted"/><field name="current_process_id"/></div>
<div class="text-muted"><field name="work_center_id"/></div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="view_fp_tank_search" model="ir.ui.view">
<field name="name">fp.tank.search</field>
<field name="model">fusion.plating.tank</field>
<field name="arch" type="xml">
<search string="Tanks">
<field name="name"/>
<field name="code"/>
<field name="qr_code"/>
<field name="facility_id"/>
<field name="work_center_id"/>
<field name="current_process_id"/>
<separator/>
<filter string="In Use" name="in_use" domain="[('state','=','in_use')]"/>
<filter string="Filled" name="filled" domain="[('state','=','filled')]"/>
<filter string="Maintenance" name="maintenance" domain="[('state','=','maintenance')]"/>
<filter string="Out of Service" name="out" domain="[('state','=','out_of_service')]"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group>
<filter string="Facility" name="group_facility" context="{'group_by':'facility_id'}"/>
<filter string="Work Center" name="group_wc" context="{'group_by':'work_center_id'}"/>
<filter string="Process" name="group_process" context="{'group_by':'current_process_id'}"/>
<filter string="Status" name="group_state" context="{'group_by':'state'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_tank" model="ir.actions.act_window">
<field name="name">Tanks</field>
<field name="res_model">fusion.plating.tank</field>
<field name="view_mode">kanban,list,form</field>
<field name="search_view_id" ref="view_fp_tank_search"/>
</record>
</odoo>

View File

@@ -0,0 +1,92 @@
<?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>
<record id="view_fp_work_center_list" model="ir.ui.view">
<field name="name">fp.work.center.list</field>
<field name="model">fusion.plating.work.center</field>
<field name="arch" type="xml">
<list string="Work Centers">
<field name="facility_id"/>
<field name="sequence" widget="handle"/>
<field name="code"/>
<field name="name"/>
<field name="tank_count"/>
<field name="capacity_per_day"/>
<field name="active" widget="boolean_toggle"/>
</list>
</field>
</record>
<record id="view_fp_work_center_form" model="ir.ui.view">
<field name="name">fp.work.center.form</field>
<field name="model">fusion.plating.work.center</field>
<field name="arch" type="xml">
<form string="Work Center">
<sheet>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. Line 1 — EN Plating"/></h1>
<div class="text-muted">
<field name="code" placeholder="LINE-1"/>
</div>
</div>
<group>
<group>
<field name="facility_id"/>
<field name="sequence"/>
</group>
<group>
<field name="capacity_per_day"/>
<field name="active" widget="boolean_toggle"/>
</group>
</group>
<notebook>
<page string="Supported Processes">
<field name="supported_process_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
</page>
<page string="Tanks">
<field name="tank_ids">
<list>
<field name="code"/>
<field name="name"/>
<field name="current_process_id"/>
<field name="state"/>
</list>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="view_fp_work_center_search" model="ir.ui.view">
<field name="name">fp.work.center.search</field>
<field name="model">fusion.plating.work.center</field>
<field name="arch" type="xml">
<search string="Work Centers">
<field name="name"/>
<field name="code"/>
<field name="facility_id"/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group>
<filter string="Facility" name="group_facility" context="{'group_by':'facility_id'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_work_center" model="ir.actions.act_window">
<field name="name">Work Centers</field>
<field name="res_model">fusion.plating.work.center</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_work_center_search"/>
</record>
</odoo>