This commit is contained in:
gsinghpal
2026-04-12 09:09:50 -04:00
parent d07159b9b5
commit be611876ad
470 changed files with 41761 additions and 51 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,77 @@
<?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="10"/>
<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,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>