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,109 @@
<?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_chemical_list" model="ir.ui.view">
<field name="name">fp.chemical.list</field>
<field name="model">fusion.plating.chemical</field>
<field name="arch" type="xml">
<list string="Chemicals" decoration-warning="needs_reorder">
<field name="name"/>
<field name="sds_id"/>
<field name="facility_id"/>
<field name="location"/>
<field name="container_size"/>
<field name="container_uom"/>
<field name="quantity_on_hand"/>
<field name="reorder_point"/>
<field name="needs_reorder"/>
<field name="active" widget="boolean_toggle"/>
</list>
</field>
</record>
<record id="view_fp_chemical_form" model="ir.ui.view">
<field name="name">fp.chemical.form</field>
<field name="model">fusion.plating.chemical</field>
<field name="arch" type="xml">
<form string="Chemical">
<sheet>
<widget name="web_ribbon" title="Reorder" bg_color="text-bg-warning" invisible="not needs_reorder"/>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. 50% Sodium Hydroxide"/></h1>
</div>
<group>
<group>
<field name="sds_id"/>
<field name="product_id"/>
<field name="facility_id"/>
<field name="location" placeholder="Acid Cabinet 2"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="active" widget="boolean_toggle"/>
</group>
<group>
<field name="container_size"/>
<field name="container_uom" placeholder="L"/>
<field name="quantity_on_hand"/>
<field name="reorder_point"/>
<field name="needs_reorder"/>
</group>
</group>
<notebook>
<page string="Incompatibilities">
<field name="incompatible_with_ids" widget="many2many_tags"/>
<p class="text-muted mt-2">
Chemicals that must not be stored next to this one
(e.g. acids vs bases, oxidizers vs flammables).
</p>
</page>
<page string="Notes">
<field name="notes"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_chemical_search" model="ir.ui.view">
<field name="name">fp.chemical.search</field>
<field name="model">fusion.plating.chemical</field>
<field name="arch" type="xml">
<search string="Chemicals">
<field name="name"/>
<field name="sds_id"/>
<field name="facility_id"/>
<field name="location"/>
<filter string="Needs Reorder" name="filter_reorder" domain="[('needs_reorder', '=', True)]"/>
<filter string="Archived" name="filter_inactive" domain="[('active', '=', False)]"/>
<group>
<filter string="Facility" name="group_facility" context="{'group_by': 'facility_id'}"/>
<filter string="Location" name="group_location" context="{'group_by': 'location'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_chemical" model="ir.actions.act_window">
<field name="name">Chemicals</field>
<field name="res_model">fusion.plating.chemical</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_chemical_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Add a chemical
</p>
<p>
Track the physical chemicals stored on site, who supplies them,
where they live, and when they need to be reordered.
</p>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,109 @@
<?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_exposure_monitoring_list" model="ir.ui.view">
<field name="name">fp.exposure.monitoring.list</field>
<field name="model">fusion.plating.exposure.monitoring</field>
<field name="arch" type="xml">
<list string="Exposure Monitoring" decoration-danger="result == 'exceed'" decoration-warning="result == 'approaching'">
<field name="name"/>
<field name="sample_date"/>
<field name="employee_id"/>
<field name="facility_id"/>
<field name="sample_type"/>
<field name="substance"/>
<field name="concentration"/>
<field name="uom"/>
<field name="oel_limit"/>
<field name="percent_of_oel"/>
<field name="result"/>
</list>
</field>
</record>
<record id="view_fp_exposure_monitoring_form" model="ir.ui.view">
<field name="name">fp.exposure.monitoring.form</field>
<field name="model">fusion.plating.exposure.monitoring</field>
<field name="arch" type="xml">
<form string="Exposure Sample">
<header>
<field name="result" widget="statusbar" statusbar_visible="below,approaching,exceed"/>
</header>
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name"/></h1>
</div>
<group>
<group string="Sample">
<field name="sample_date"/>
<field name="sample_type"/>
<field name="employee_id"/>
<field name="facility_id"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
<group string="Result">
<field name="substance"/>
<field name="concentration"/>
<field name="uom" placeholder="mg/m3"/>
<field name="oel_reference" placeholder="Ontario Reg. 833 TWA"/>
<field name="oel_limit"/>
<field name="percent_of_oel"/>
</group>
</group>
<notebook>
<page string="Notes">
<field name="notes"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_exposure_monitoring_search" model="ir.ui.view">
<field name="name">fp.exposure.monitoring.search</field>
<field name="model">fusion.plating.exposure.monitoring</field>
<field name="arch" type="xml">
<search string="Exposure Samples">
<field name="name"/>
<field name="employee_id"/>
<field name="facility_id"/>
<field name="substance"/>
<filter string="Below" name="filter_below" domain="[('result', '=', 'below')]"/>
<filter string="Approaching" name="filter_approaching" domain="[('result', '=', 'approaching')]"/>
<filter string="Exceeds" name="filter_exceed" domain="[('result', '=', 'exceed')]"/>
<group>
<filter string="Sample Type" name="group_sample_type" context="{'group_by': 'sample_type'}"/>
<filter string="Substance" name="group_substance" context="{'group_by': 'substance'}"/>
<filter string="Employee" name="group_employee" context="{'group_by': 'employee_id'}"/>
<filter string="Result" name="group_result" context="{'group_by': 'result'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_exposure_monitoring" model="ir.actions.act_window">
<field name="name">Exposure Monitoring</field>
<field name="res_model">fusion.plating.exposure.monitoring</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_exposure_monitoring_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Log an exposure sample
</p>
<p>
Capture air, biological, noise and vibration sampling results
and compare them automatically against the applicable
Occupational Exposure Limit.
</p>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,161 @@
<?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_incident_list" model="ir.ui.view">
<field name="name">fp.incident.list</field>
<field name="model">fusion.plating.incident</field>
<field name="arch" type="xml">
<list string="Incident Register" decoration-danger="incident_type in ('injury', 'lost_time', 'medical')" decoration-warning="incident_type == 'first_aid'">
<field name="name"/>
<field name="incident_date"/>
<field name="incident_type"/>
<field name="facility_id"/>
<field name="employee_id"/>
<field name="location"/>
<field name="lost_time_days"/>
<field name="wsib_reportable"/>
<field name="state"/>
</list>
</field>
</record>
<record id="view_fp_incident_form" model="ir.ui.view">
<field name="name">fp.incident.form</field>
<field name="model">fusion.plating.incident</field>
<field name="arch" type="xml">
<form string="Incident">
<header>
<button name="action_start_investigation" type="object" string="Start Investigation" invisible="state != 'draft'"/>
<button name="action_close" type="object" string="Close" invisible="state != 'investigation'"/>
<button name="action_reopen" type="object" string="Reopen" invisible="state != 'closed'"/>
<field name="state" widget="statusbar" statusbar_visible="draft,investigation,closed"/>
</header>
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name"/></h1>
</div>
<group>
<group string="Incident">
<field name="incident_date"/>
<field name="incident_type"/>
<field name="facility_id"/>
<field name="location"/>
<field name="employee_id"/>
<field name="reported_by_id"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
<group string="WSIB / Outcome">
<field name="wsib_reportable"/>
<field name="wsib_form_7_submitted" invisible="not wsib_reportable"/>
<field name="lost_time_days"/>
</group>
</group>
<notebook>
<page string="Description">
<field name="description"/>
</page>
<page string="Immediate Action">
<field name="immediate_action"/>
</page>
<page string="Investigation">
<field name="investigation"/>
</page>
<page string="Root Cause">
<field name="root_cause"/>
</page>
<page string="Corrective Action">
<field name="corrective_action"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_incident_kanban" model="ir.ui.view">
<field name="name">fp.incident.kanban</field>
<field name="model">fusion.plating.incident</field>
<field name="arch" type="xml">
<kanban class="o_fp_incident_kanban">
<field name="id"/>
<field name="name"/>
<field name="incident_type"/>
<field name="incident_date"/>
<field name="facility_id"/>
<field name="employee_id"/>
<field name="state"/>
<templates>
<t t-name="card">
<div class="o_fp_card o_fp_incident_card" t-att-data-type="record.incident_type.raw_value" 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="name"/></strong>
<div class="text-muted small"><field name="incident_type"/></div>
</div>
<i class="fa fa-exclamation-triangle text-muted" aria-hidden="true"/>
</div>
<div class="mt-2 small">
<div><field name="incident_date"/></div>
<div><field name="facility_id"/></div>
<div><field name="employee_id"/></div>
<span class="o_fp_badge mt-2 d-inline-block" t-att-data-state="record.state.raw_value">
<field name="state"/>
</span>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="view_fp_incident_search" model="ir.ui.view">
<field name="name">fp.incident.search</field>
<field name="model">fusion.plating.incident</field>
<field name="arch" type="xml">
<search string="Incidents">
<field name="name"/>
<field name="employee_id"/>
<field name="facility_id"/>
<field name="location"/>
<filter string="Draft" name="filter_draft" domain="[('state', '=', 'draft')]"/>
<filter string="Investigation" name="filter_investigation" domain="[('state', '=', 'investigation')]"/>
<filter string="Closed" name="filter_closed" domain="[('state', '=', 'closed')]"/>
<separator/>
<filter string="WSIB Reportable" name="filter_wsib" domain="[('wsib_reportable', '=', True)]"/>
<filter string="Lost-Time" name="filter_lost_time" domain="[('incident_type', '=', 'lost_time')]"/>
<filter string="Near Miss" name="filter_near_miss" domain="[('incident_type', '=', 'near_miss')]"/>
<group>
<filter string="Type" name="group_type" context="{'group_by': 'incident_type'}"/>
<filter string="Facility" name="group_facility" context="{'group_by': 'facility_id'}"/>
<filter string="Status" name="group_state" context="{'group_by': 'state'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_incident" model="ir.actions.act_window">
<field name="name">Incident Register</field>
<field name="res_model">fusion.plating.incident</field>
<field name="view_mode">kanban,list,form</field>
<field name="search_view_id" ref="view_fp_incident_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Log an incident, near-miss or first-aid event
</p>
<p>
Capture every safety event — even close calls — and walk it
through investigation to closure with a documented root
cause and corrective action.
</p>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,186 @@
<?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>
<!-- ===================================================================== -->
<!-- JHSC -->
<!-- ===================================================================== -->
<record id="view_fp_jhsc_list" model="ir.ui.view">
<field name="name">fp.jhsc.list</field>
<field name="model">fusion.plating.jhsc</field>
<field name="arch" type="xml">
<list string="JHSC">
<field name="name"/>
<field name="facility_id"/>
<field name="member_count"/>
<field name="meeting_count"/>
<field name="active" widget="boolean_toggle"/>
</list>
</field>
</record>
<record id="view_fp_jhsc_form" model="ir.ui.view">
<field name="name">fp.jhsc.form</field>
<field name="model">fusion.plating.jhsc</field>
<field name="arch" type="xml">
<form string="JHSC">
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. Site A JHSC"/></h1>
</div>
<group>
<group>
<field name="facility_id"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="active" widget="boolean_toggle"/>
</group>
<group>
<field name="member_count"/>
<field name="meeting_count"/>
</group>
</group>
<notebook>
<page string="Members">
<field name="member_ids" widget="many2many_tags"/>
</page>
<page string="Worker Representatives">
<field name="worker_rep_ids" widget="many2many_tags"/>
</page>
<page string="Management Representatives">
<field name="mgmt_rep_ids" widget="many2many_tags"/>
</page>
<page string="Meetings">
<field name="meeting_ids">
<list>
<field name="meeting_date"/>
<field name="name"/>
<field name="state"/>
</list>
</field>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_jhsc_search" model="ir.ui.view">
<field name="name">fp.jhsc.search</field>
<field name="model">fusion.plating.jhsc</field>
<field name="arch" type="xml">
<search string="JHSC">
<field name="name"/>
<field name="facility_id"/>
<filter string="Archived" name="filter_inactive" domain="[('active', '=', False)]"/>
<group>
<filter string="Facility" name="group_facility" context="{'group_by': 'facility_id'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_jhsc" model="ir.actions.act_window">
<field name="name">JHSC</field>
<field name="res_model">fusion.plating.jhsc</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_jhsc_search"/>
</record>
<!-- ===================================================================== -->
<!-- JHSC Meetings -->
<!-- ===================================================================== -->
<record id="view_fp_jhsc_meeting_list" model="ir.ui.view">
<field name="name">fp.jhsc.meeting.list</field>
<field name="model">fusion.plating.jhsc.meeting</field>
<field name="arch" type="xml">
<list string="JHSC Meetings">
<field name="meeting_date"/>
<field name="name"/>
<field name="jhsc_id"/>
<field name="facility_id"/>
<field name="state"/>
</list>
</field>
</record>
<record id="view_fp_jhsc_meeting_form" model="ir.ui.view">
<field name="name">fp.jhsc.meeting.form</field>
<field name="model">fusion.plating.jhsc.meeting</field>
<field name="arch" type="xml">
<form string="JHSC Meeting">
<header>
<button name="action_mark_held" type="object" string="Mark Held" invisible="state != 'planned'"/>
<button name="action_post_minutes" type="object" string="Post Minutes" invisible="state not in ('held',)"/>
<button name="action_close" type="object" string="Close" invisible="state not in ('minutes_ready',)"/>
<field name="state" widget="statusbar" statusbar_visible="planned,held,minutes_ready,closed"/>
</header>
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. Q1 2026 JHSC Meeting"/></h1>
</div>
<group>
<group>
<field name="jhsc_id"/>
<field name="meeting_date"/>
<field name="facility_id"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</group>
<notebook>
<page string="Attendees">
<field name="attendee_ids" widget="many2many_tags"/>
</page>
<page string="Agenda">
<field name="agenda"/>
</page>
<page string="Minutes">
<field name="minutes"/>
</page>
<page string="Action Items">
<field name="action_items"/>
</page>
<page string="Attachments">
<field name="attachment_ids" widget="many2many_binary"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_jhsc_meeting_search" model="ir.ui.view">
<field name="name">fp.jhsc.meeting.search</field>
<field name="model">fusion.plating.jhsc.meeting</field>
<field name="arch" type="xml">
<search string="JHSC Meetings">
<field name="name"/>
<field name="jhsc_id"/>
<field name="facility_id"/>
<filter string="Planned" name="filter_planned" domain="[('state', '=', 'planned')]"/>
<filter string="Held" name="filter_held" domain="[('state', '=', 'held')]"/>
<filter string="Minutes Ready" name="filter_minutes" domain="[('state', '=', 'minutes_ready')]"/>
<filter string="Closed" name="filter_closed" domain="[('state', '=', 'closed')]"/>
<group>
<filter string="Committee" name="group_jhsc" context="{'group_by': 'jhsc_id'}"/>
<filter string="Status" name="group_state" context="{'group_by': 'state'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_jhsc_meeting" model="ir.actions.act_window">
<field name="name">JHSC Meetings</field>
<field name="res_model">fusion.plating.jhsc.meeting</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_jhsc_meeting_search"/>
</record>
</odoo>

View File

@@ -0,0 +1,71 @@
<?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>
<!-- ===== SAFETY (top-level under Plating) ===== -->
<menuitem id="menu_fp_safety_root"
name="Safety"
parent="fusion_plating.menu_fp_root"
sequence="45"
groups="fusion_plating.group_fusion_plating_operator"/>
<menuitem id="menu_fp_safety_sds"
name="SDS Library"
parent="menu_fp_safety_root"
action="action_fp_sds"
sequence="10"/>
<menuitem id="menu_fp_safety_training"
name="Training Records"
parent="menu_fp_safety_root"
action="action_fp_training_record"
sequence="20"/>
<menuitem id="menu_fp_safety_exposure"
name="Exposure Monitoring"
parent="menu_fp_safety_root"
action="action_fp_exposure_monitoring"
sequence="30"/>
<menuitem id="menu_fp_safety_jhsc"
name="JHSC"
parent="menu_fp_safety_root"
action="action_fp_jhsc"
sequence="40"/>
<menuitem id="menu_fp_safety_jhsc_meetings"
name="JHSC Meetings"
parent="menu_fp_safety_root"
action="action_fp_jhsc_meeting"
sequence="45"/>
<menuitem id="menu_fp_safety_incidents"
name="Incident Register"
parent="menu_fp_safety_root"
action="action_fp_incident"
sequence="50"/>
<menuitem id="menu_fp_safety_ppe"
name="PPE Issuance"
parent="menu_fp_safety_root"
action="action_fp_ppe_issuance"
sequence="60"/>
<!-- ===== Configuration (under existing Plating > Configuration) ===== -->
<menuitem id="menu_fp_safety_training_types"
name="Training Types"
parent="fusion_plating.menu_fp_config"
action="action_fp_training_type"
sequence="60"/>
<menuitem id="menu_fp_safety_chemicals"
name="Chemicals"
parent="fusion_plating.menu_fp_config"
action="action_fp_chemical"
sequence="70"/>
</odoo>

View File

@@ -0,0 +1,75 @@
<?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_ppe_issuance_list" model="ir.ui.view">
<field name="name">fp.ppe.issuance.list</field>
<field name="model">fusion.plating.ppe.issuance</field>
<field name="arch" type="xml">
<list string="PPE Issuance">
<field name="employee_id"/>
<field name="ppe_type"/>
<field name="size"/>
<field name="quantity"/>
<field name="issue_date"/>
<field name="next_replacement"/>
</list>
</field>
</record>
<record id="view_fp_ppe_issuance_form" model="ir.ui.view">
<field name="name">fp.ppe.issuance.form</field>
<field name="model">fusion.plating.ppe.issuance</field>
<field name="arch" type="xml">
<form string="PPE Issuance">
<sheet>
<group>
<group>
<field name="employee_id"/>
<field name="ppe_type"/>
<field name="size"/>
<field name="quantity"/>
</group>
<group>
<field name="issue_date"/>
<field name="next_replacement"/>
</group>
</group>
<notebook>
<page string="Notes">
<field name="notes"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_ppe_issuance_search" model="ir.ui.view">
<field name="name">fp.ppe.issuance.search</field>
<field name="model">fusion.plating.ppe.issuance</field>
<field name="arch" type="xml">
<search string="PPE Issuance">
<field name="employee_id"/>
<field name="ppe_type"/>
<group>
<filter string="Employee" name="group_employee" context="{'group_by': 'employee_id'}"/>
<filter string="PPE Type" name="group_ppe_type" context="{'group_by': 'ppe_type'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_ppe_issuance" model="ir.actions.act_window">
<field name="name">PPE Issuance</field>
<field name="res_model">fusion.plating.ppe.issuance</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_ppe_issuance_search"/>
</record>
</odoo>

View File

@@ -0,0 +1,165 @@
<?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_sds_list" model="ir.ui.view">
<field name="name">fp.sds.list</field>
<field name="model">fusion.plating.sds</field>
<field name="arch" type="xml">
<list string="Safety Data Sheets" decoration-danger="state == 'expired'" decoration-warning="state == 'expiring_soon'" decoration-muted="state == 'withdrawn'">
<field name="name"/>
<field name="product_name"/>
<field name="supplier_name"/>
<field name="cas_number"/>
<field name="version"/>
<field name="issue_date"/>
<field name="expiry_date"/>
<field name="hazard_class"/>
<field name="language"/>
<field name="state"/>
</list>
</field>
</record>
<record id="view_fp_sds_form" model="ir.ui.view">
<field name="name">fp.sds.form</field>
<field name="model">fusion.plating.sds</field>
<field name="arch" type="xml">
<form string="Safety Data Sheet">
<header>
<button name="action_mark_withdrawn" type="object" string="Mark Withdrawn" invisible="withdrawn"/>
<button name="action_mark_active" type="object" string="Mark Active" invisible="not withdrawn"/>
<field name="state" widget="statusbar" statusbar_visible="current,expiring_soon,expired,withdrawn"/>
</header>
<sheet>
<widget name="web_ribbon" title="Withdrawn" bg_color="text-bg-secondary" invisible="not withdrawn"/>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. Acme Bright Acid Copper"/></h1>
</div>
<group>
<group string="Product">
<field name="product_name"/>
<field name="cas_number"/>
<field name="hazard_class"/>
<field name="ghs_pictograms" placeholder="GHS01,GHS05,GHS07"/>
<field name="language"/>
</group>
<group string="Supplier &amp; Revision">
<field name="supplier_id"/>
<field name="supplier_name"/>
<field name="version"/>
<field name="issue_date"/>
<field name="expiry_date"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="active" widget="boolean_toggle"/>
</group>
</group>
<notebook>
<page string="Document">
<group>
<field name="attachment_id"/>
</group>
</page>
<page string="Notes">
<field name="notes"/>
</page>
<page string="Linked Chemicals">
<field name="chemical_ids">
<list>
<field name="name"/>
<field name="facility_id"/>
<field name="location"/>
<field name="quantity_on_hand"/>
</list>
</field>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_sds_kanban" model="ir.ui.view">
<field name="name">fp.sds.kanban</field>
<field name="model">fusion.plating.sds</field>
<field name="arch" type="xml">
<kanban class="o_fp_sds_kanban">
<field name="id"/>
<field name="name"/>
<field name="product_name"/>
<field name="supplier_name"/>
<field name="hazard_class"/>
<field name="state"/>
<field name="expiry_date"/>
<templates>
<t t-name="card">
<div class="o_fp_card o_fp_sds_card" t-att-data-hazard="record.hazard_class.raw_value" 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="name"/></strong>
<div class="text-muted small"><field name="product_name"/></div>
</div>
<i class="fa fa-flask text-muted" aria-hidden="true"/>
</div>
<div class="mt-2 small">
<div><field name="supplier_name"/></div>
<div class="text-muted">Expires: <field name="expiry_date"/></div>
<span class="o_fp_badge mt-2 d-inline-block" t-att-data-state="record.state.raw_value">
<field name="state"/>
</span>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="view_fp_sds_search" model="ir.ui.view">
<field name="name">fp.sds.search</field>
<field name="model">fusion.plating.sds</field>
<field name="arch" type="xml">
<search string="Safety Data Sheets">
<field name="name"/>
<field name="product_name"/>
<field name="supplier_name"/>
<field name="cas_number"/>
<filter string="Current" name="filter_current" domain="[('state', '=', 'current')]"/>
<filter string="Expiring Soon" name="filter_expiring" domain="[('state', '=', 'expiring_soon')]"/>
<filter string="Expired" name="filter_expired" domain="[('state', '=', 'expired')]"/>
<filter string="Withdrawn" name="filter_withdrawn" domain="[('state', '=', 'withdrawn')]"/>
<separator/>
<filter string="Archived" name="filter_inactive" domain="[('active', '=', False)]"/>
<group>
<filter string="Hazard Class" name="group_hazard" context="{'group_by': 'hazard_class'}"/>
<filter string="Status" name="group_state" context="{'group_by': 'state'}"/>
<filter string="Supplier" name="group_supplier" context="{'group_by': 'supplier_id'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_sds" model="ir.actions.act_window">
<field name="name">SDS Library</field>
<field name="res_model">fusion.plating.sds</field>
<field name="view_mode">kanban,list,form</field>
<field name="search_view_id" ref="view_fp_sds_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Add a Safety Data Sheet
</p>
<p>
Maintain a current SDS for every hazardous product on site.
Under WHMIS / GHS each SDS is valid for three years from
its issue date — refresh from the supplier before expiry.
</p>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,131 @@
<?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_training_record_list" model="ir.ui.view">
<field name="name">fp.training.record.list</field>
<field name="model">fusion.plating.training.record</field>
<field name="arch" type="xml">
<list string="Training Records" decoration-danger="state == 'expired'" decoration-warning="state == 'expiring_soon'">
<field name="employee_id"/>
<field name="training_type_id"/>
<field name="completion_date"/>
<field name="expiry_date"/>
<field name="trainer"/>
<field name="certificate_ref"/>
<field name="state"/>
</list>
</field>
</record>
<record id="view_fp_training_record_form" model="ir.ui.view">
<field name="name">fp.training.record.form</field>
<field name="model">fusion.plating.training.record</field>
<field name="arch" type="xml">
<form string="Training Record">
<header>
<field name="state" widget="statusbar" statusbar_visible="current,expiring_soon,expired"/>
</header>
<sheet>
<group>
<group>
<field name="employee_id"/>
<field name="training_type_id"/>
<field name="completion_date"/>
<field name="expiry_date"/>
</group>
<group>
<field name="trainer"/>
<field name="certificate_ref"/>
<field name="score"/>
<field name="attachment_id"/>
</group>
</group>
<notebook>
<page string="Notes">
<field name="notes"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_training_record_kanban" model="ir.ui.view">
<field name="name">fp.training.record.kanban</field>
<field name="model">fusion.plating.training.record</field>
<field name="arch" type="xml">
<kanban class="o_fp_training_kanban">
<field name="id"/>
<field name="employee_id"/>
<field name="training_type_id"/>
<field name="completion_date"/>
<field name="expiry_date"/>
<field name="state"/>
<templates>
<t t-name="card">
<div class="o_fp_card o_fp_training_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="employee_id"/></strong>
<div class="text-muted small"><field name="training_type_id"/></div>
</div>
<i class="fa fa-graduation-cap text-muted" aria-hidden="true"/>
</div>
<div class="mt-2 small">
<div>Completed: <field name="completion_date"/></div>
<div>Expires: <field name="expiry_date"/></div>
<span class="o_fp_badge mt-2 d-inline-block" t-att-data-state="record.state.raw_value">
<field name="state"/>
</span>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="view_fp_training_record_search" model="ir.ui.view">
<field name="name">fp.training.record.search</field>
<field name="model">fusion.plating.training.record</field>
<field name="arch" type="xml">
<search string="Training Records">
<field name="employee_id"/>
<field name="training_type_id"/>
<field name="certificate_ref"/>
<filter string="Current" name="filter_current" domain="[('state', '=', 'current')]"/>
<filter string="Expiring Soon" name="filter_expiring" domain="[('state', '=', 'expiring_soon')]"/>
<filter string="Expired" name="filter_expired" domain="[('state', '=', 'expired')]"/>
<group>
<filter string="Employee" name="group_employee" context="{'group_by': 'employee_id'}"/>
<filter string="Training Type" name="group_type" context="{'group_by': 'training_type_id'}"/>
<filter string="Status" name="group_state" context="{'group_by': 'state'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_training_record" model="ir.actions.act_window">
<field name="name">Training Records</field>
<field name="res_model">fusion.plating.training.record</field>
<field name="view_mode">kanban,list,form</field>
<field name="search_view_id" ref="view_fp_training_record_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Log a training completion
</p>
<p>
Build the shop training matrix one completion at a time.
Records expire automatically based on the training type's
validity window.
</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>
<record id="view_fp_training_type_list" model="ir.ui.view">
<field name="name">fp.training.type.list</field>
<field name="model">fusion.plating.training.type</field>
<field name="arch" type="xml">
<list string="Training Types">
<field name="code"/>
<field name="name"/>
<field name="category"/>
<field name="validity_months"/>
<field name="required_for_roles"/>
<field name="active" widget="boolean_toggle"/>
</list>
</field>
</record>
<record id="view_fp_training_type_form" model="ir.ui.view">
<field name="name">fp.training.type.form</field>
<field name="model">fusion.plating.training.type</field>
<field name="arch" type="xml">
<form string="Training Type">
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. WHMIS 2015"/></h1>
<div class="text-muted"><field name="code" placeholder="WHMIS"/></div>
</div>
<group>
<group>
<field name="category"/>
<field name="validity_months"/>
<field name="active" widget="boolean_toggle"/>
</group>
<group>
<field name="required_for_roles"/>
</group>
</group>
<notebook>
<page string="Description">
<field name="description"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="view_fp_training_type_search" model="ir.ui.view">
<field name="name">fp.training.type.search</field>
<field name="model">fusion.plating.training.type</field>
<field name="arch" type="xml">
<search string="Training Types">
<field name="name"/>
<field name="code"/>
<filter string="Archived" name="filter_inactive" domain="[('active', '=', False)]"/>
<group>
<filter string="Category" name="group_category" context="{'group_by': 'category'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_training_type" model="ir.actions.act_window">
<field name="name">Training Types</field>
<field name="res_model">fusion.plating.training.type</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_training_type_search"/>
</record>
</odoo>

View File

@@ -0,0 +1,82 @@
<?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_hr_employee_form_inherit_fp_safety" model="ir.ui.view">
<field name="name">hr.employee.form.inherit.fp.safety</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page string="Safety" name="fp_safety">
<group>
<group>
<field name="x_fc_training_current"/>
</group>
<group>
<field name="x_fc_training_count"/>
<field name="x_fc_exposure_count"/>
<field name="x_fc_incident_count"/>
<field name="x_fc_ppe_count"/>
</group>
</group>
<notebook>
<page string="Training">
<field name="x_fc_training_ids">
<list>
<field name="training_type_id"/>
<field name="completion_date"/>
<field name="expiry_date"/>
<field name="trainer"/>
<field name="certificate_ref"/>
<field name="state"/>
</list>
</field>
</page>
<page string="Exposure">
<field name="x_fc_exposure_ids">
<list>
<field name="name"/>
<field name="sample_date"/>
<field name="sample_type"/>
<field name="substance"/>
<field name="concentration"/>
<field name="oel_limit"/>
<field name="percent_of_oel"/>
<field name="result"/>
</list>
</field>
</page>
<page string="Incidents">
<field name="x_fc_incident_ids">
<list>
<field name="name"/>
<field name="incident_date"/>
<field name="incident_type"/>
<field name="facility_id"/>
<field name="state"/>
</list>
</field>
</page>
<page string="PPE Issued">
<field name="x_fc_ppe_ids">
<list>
<field name="issue_date"/>
<field name="ppe_type"/>
<field name="size"/>
<field name="quantity"/>
<field name="next_replacement"/>
</list>
</field>
</page>
</notebook>
</page>
</xpath>
</field>
</record>
</odoo>