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,46 @@
# Fusion Plating — Aerospace (AS9100 + Nadcap AC7108)
Part of the Fusion Plating product family by Nexa Systems Inc.
Industry pack that adds the aerospace-specific records a plating shop needs
to support AS9100 Rev D certification and Nadcap AC7108 chemical-processing
accreditation on top of the Fusion Plating QMS module.
## What this module adds
- **AS9100 Rev D clause catalog** — hierarchical, seeded with the main
clauses 4 through 10 and the aerospace-critical 8.1.1 through 8.1.4
family (Operational Risk Management, Configuration Management, Product
Safety, Counterfeit Parts Prevention).
- **Nadcap AC7108 audit records** — PRI-assigned auditor flag, merit and
NCR counts, accreditation start/end dates, checklist selection covering
AC7108 base and slash sheets 10/11/12/13/14.
- **Counterfeit parts prevention log** — supports the AS9100 §8.1.4
requirement and GIDEP reporting.
- **Configuration management baseline** — records and tracks change
history for configuration items (AS9100 §8.1.2).
- **Risk register** — likelihood × impact scoring with automatic risk
level classification (AS9100 §8.1.1).
- **FAIR extension** — adds AS9102 form 1/2/3 attachments, drawing
revision, and customer approval signature/date.
- **Customer specification extension** — aerospace flag, AS9100 clause
mapping, Nadcap requirement flag, PRI file code, customer approval
requirement flag.
## Seed data
- ~25 AS9100 Rev D clauses.
- Industry specs loaded with process-pack links: AMS 2404, ASTM B733,
MIL-C-26074, MIL-A-8625, QQ-C-320, MIL-DTL-13924, AMS 2700, AMS 2759/9,
AMS-QQ-P-416, BAC 5709, PRI AS7108.
## Dependencies
Requires all four process packs (EN, chrome, anodize, black oxide) plus
`fusion_plating_quality`. The process-pack dependency guarantees the
seeded customer-spec process-type references always resolve.
## License
OPL-1 (Odoo Proprietary License v1.0). Copyright (c) 2026 Nexa Systems
Inc. All rights reserved.

View File

@@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Plating product family.
from . import models

View File

@@ -0,0 +1,93 @@
# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Plating product family.
{
'name': 'Fusion Plating — Aerospace (AS9100 + Nadcap)',
'version': '19.0.1.0.0',
'category': 'Manufacturing/Plating',
'summary': 'Aerospace industry pack: AS9100 Rev D clause library, Nadcap AC7108 '
'audits, counterfeit parts prevention, config management, risk register, '
'FAIR/AS9102 extensions, industry spec library (AMS, ASTM, MIL, BAC).',
'description': """
Fusion Plating — Aerospace (AS9100 + Nadcap AC7108)
====================================================
Part of the Fusion Plating product family by Nexa Systems Inc.
This industry pack layers aerospace-specific records, workflows and seed
data on top of the Fusion Plating quality module (QMS). It is the
baseline every AS9100-certified plating / metal finishing shop needs on
top of the generic QMS.
Records added
-------------
* AS9100 Rev D clause catalog (hierarchical, seeded with the main
clauses 4 through 10 plus the aerospace-critical 8.1.18.1.4 family)
* Nadcap AC7108 audit records (PRI-assigned auditors, merit/NCR counts,
accreditation start/end, checklist selection covering AC7108 base and
slash sheets 10/11/12/13/14)
* Counterfeit parts prevention log (AS9100 §8.1.4, GIDEP reporting)
* Configuration management baseline (AS9100 §8.1.2)
* Risk register with likelihood × impact scoring (AS9100 §8.1.1)
* FAIR extension for AS9102 forms 1/2/3 and customer approval
* Customer specification extension for aerospace flags, AS9100 clause
mapping, Nadcap flag and PRI file code
Seed data
---------
* ~25 AS9100 Rev D clauses with a nested parent/child structure
* Industry specs: AMS 2404, ASTM B733, MIL-C-26074, MIL-A-8625,
QQ-C-320, MIL-DTL-13924, AMS 2700, AMS 2759/9, AMS-QQ-P-416,
BAC 5709, PRI AS7108
Dependencies
------------
Depends on all four process packs (EN, chrome, anodize, black oxide)
plus the quality QMS module, so the seeded customer-spec ↔ process-type
relationships always resolve.
Copyright (c) 2026 Nexa Systems Inc. All rights reserved.
""",
'author': 'Nexa Systems Inc.',
'website': 'https://www.nexasystems.ca',
'maintainer': 'Nexa Systems Inc.',
'support': 'support@nexasystems.ca',
'license': 'OPL-1',
'price': 0.00,
'currency': 'CAD',
'depends': [
'fusion_plating_quality',
'fusion_plating_process_en',
'fusion_plating_process_chrome',
'fusion_plating_process_anodize',
'fusion_plating_process_black_oxide',
],
'data': [
'security/fp_aerospace_security.xml',
'security/ir.model.access.csv',
'data/fp_sequence_data.xml',
'data/fp_as9100_clause_data.xml',
'data/fp_customer_spec_data.xml',
'views/fp_as9100_clause_views.xml',
'views/fp_nadcap_audit_views.xml',
'views/fp_counterfeit_views.xml',
'views/fp_config_item_views.xml',
'views/fp_risk_views.xml',
'views/fp_customer_spec_views.xml',
'views/fp_fair_views.xml',
'views/fp_menu.xml',
],
'demo': [
'data/fp_demo_aerospace_data.xml',
],
'assets': {
'web.assets_backend': [
'fusion_plating_aerospace/static/src/scss/fusion_plating_aerospace.scss',
],
},
'installable': True,
'application': False,
'auto_install': False,
}

View File

@@ -0,0 +1,230 @@
<?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.
Seed AS9100 Rev D clause hierarchy. Only the main top-level clauses
(410) and the aerospace-critical 8.1.x family are included — a shop
can extend this with the finer-grained sub-clauses via user data.
-->
<odoo noupdate="1">
<!-- ===== 4. CONTEXT OF THE ORGANIZATION ===== -->
<record id="as9100_clause_4" model="fusion.plating.as9100.clause">
<field name="name">Context of the organization</field>
<field name="code">4</field>
<field name="standard">as9100d</field>
<field name="category">leadership</field>
<field name="description" type="html"><p>Understanding the organization and its context, interested parties, scope of the quality management system, and the QMS and its processes.</p></field>
</record>
<!-- ===== 5. LEADERSHIP ===== -->
<record id="as9100_clause_5" model="fusion.plating.as9100.clause">
<field name="name">Leadership</field>
<field name="code">5</field>
<field name="standard">as9100d</field>
<field name="category">leadership</field>
<field name="description" type="html"><p>Top-management leadership and commitment, quality policy, and organizational roles, responsibilities and authorities.</p></field>
</record>
<!-- ===== 6. PLANNING ===== -->
<record id="as9100_clause_6" model="fusion.plating.as9100.clause">
<field name="name">Planning</field>
<field name="code">6</field>
<field name="standard">as9100d</field>
<field name="category">planning</field>
<field name="description" type="html"><p>Actions to address risks and opportunities, quality objectives, and planning of changes.</p></field>
</record>
<!-- ===== 7. SUPPORT ===== -->
<record id="as9100_clause_7" model="fusion.plating.as9100.clause">
<field name="name">Support</field>
<field name="code">7</field>
<field name="standard">as9100d</field>
<field name="category">support</field>
<field name="description" type="html"><p>Resources, competence, awareness, communication, and documented information.</p></field>
</record>
<!-- ===== 8. OPERATION ===== -->
<record id="as9100_clause_8" model="fusion.plating.as9100.clause">
<field name="name">Operation</field>
<field name="code">8</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="description" type="html"><p>Operational planning and control of products and services, including design, external provision, production, release and nonconforming-output control.</p></field>
</record>
<record id="as9100_clause_8_1" model="fusion.plating.as9100.clause">
<field name="name">Operational planning and control</field>
<field name="code">8.1</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8"/>
<field name="description" type="html"><p>Planning, implementation and control of the processes needed to meet the requirements for the provision of products and services.</p></field>
</record>
<record id="as9100_clause_8_1_1" model="fusion.plating.as9100.clause">
<field name="name">Operational risk management</field>
<field name="code">8.1.1</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8_1"/>
<field name="description" type="html"><p>Establish, implement, and maintain a process for managing operational risks to the achievement of applicable requirements that includes assignment of responsibilities, definition of risk criteria, identification and assessment of risks, mitigation actions, and acceptance of residual risk.</p></field>
</record>
<record id="as9100_clause_8_1_2" model="fusion.plating.as9100.clause">
<field name="name">Configuration management</field>
<field name="code">8.1.2</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8_1"/>
<field name="description" type="html"><p>Establish a configuration-management process appropriate to the product with planning, identification, change control, status accounting and audits to ensure consistent product identification, traceability and control of physical and functional characteristics throughout the product life cycle.</p></field>
</record>
<record id="as9100_clause_8_1_3" model="fusion.plating.as9100.clause">
<field name="name">Product safety</field>
<field name="code">8.1.3</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8_1"/>
<field name="description" type="html"><p>Plan, implement and control the processes needed to assure product safety during the entire product life cycle, including hazard identification, risk assessment, management of identified risks, communication of risks to affected parties, and reporting and lessons learned.</p></field>
</record>
<record id="as9100_clause_8_1_4" model="fusion.plating.as9100.clause">
<field name="name">Prevention of counterfeit parts</field>
<field name="code">8.1.4</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8_1"/>
<field name="description" type="html"><p>Plan, implement and control processes, appropriate to the organization and the product, for the prevention of counterfeit or suspect-counterfeit part use and their inclusion in products delivered to the customer. Includes training, source controls, material and part verification, in-process control, quarantine, and reporting.</p></field>
</record>
<record id="as9100_clause_8_2" model="fusion.plating.as9100.clause">
<field name="name">Requirements for products and services</field>
<field name="code">8.2</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8"/>
<field name="description" type="html"><p>Customer communication, determination and review of requirements, and changes to requirements for products and services.</p></field>
</record>
<record id="as9100_clause_8_2_3_1" model="fusion.plating.as9100.clause">
<field name="name">Customer communication</field>
<field name="code">8.2.3.1</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8_2"/>
<field name="description" type="html"><p>Review of requirements for products and services — ensuring the organization's ability to meet requirements before committing to supply. Handling of enquiries, contracts or order handling, customer feedback including complaints, and specific requirements for contingency actions.</p></field>
</record>
<record id="as9100_clause_8_3" model="fusion.plating.as9100.clause">
<field name="name">Design and development of products and services</field>
<field name="code">8.3</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8"/>
<field name="description" type="html"><p>Design and development planning, inputs, controls, outputs and changes.</p></field>
</record>
<record id="as9100_clause_8_4" model="fusion.plating.as9100.clause">
<field name="name">Control of externally provided processes, products and services</field>
<field name="code">8.4</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8"/>
<field name="description" type="html"><p>Evaluation, selection, monitoring, and re-evaluation of external providers; type and extent of control; information for external providers.</p></field>
</record>
<record id="as9100_clause_8_5" model="fusion.plating.as9100.clause">
<field name="name">Production and service provision</field>
<field name="code">8.5</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8"/>
<field name="description" type="html"><p>Control of production and service provision, identification and traceability, property belonging to customers or external providers, preservation, post-delivery activities and control of changes.</p></field>
</record>
<record id="as9100_clause_8_5_1_3" model="fusion.plating.as9100.clause">
<field name="name">Post-delivery support</field>
<field name="code">8.5.1.3</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8_5"/>
<field name="description" type="html"><p>Determine and meet requirements for post-delivery activities associated with products and services, including collection and analysis of in-service data, actions to be taken as a result of product problems, control and updating of technical documentation, approval and control of repairs, and controls required for off-site work.</p></field>
</record>
<record id="as9100_clause_8_6" model="fusion.plating.as9100.clause">
<field name="name">Release of products and services</field>
<field name="code">8.6</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8"/>
<field name="description" type="html"><p>Implement planned arrangements, at appropriate stages, to verify that product and service requirements have been met, including First Article Inspection requirements.</p></field>
</record>
<record id="as9100_clause_8_7" model="fusion.plating.as9100.clause">
<field name="name">Control of nonconforming outputs</field>
<field name="code">8.7</field>
<field name="standard">as9100d</field>
<field name="category">operation</field>
<field name="parent_id" ref="as9100_clause_8"/>
<field name="description" type="html"><p>Ensure that nonconforming outputs are identified and controlled to prevent unintended use or delivery. Includes segregation, authority for disposition, and use of concessions.</p></field>
</record>
<!-- ===== 9. PERFORMANCE EVALUATION ===== -->
<record id="as9100_clause_9" model="fusion.plating.as9100.clause">
<field name="name">Performance evaluation</field>
<field name="code">9</field>
<field name="standard">as9100d</field>
<field name="category">performance</field>
<field name="description" type="html"><p>Monitoring, measurement, analysis and evaluation; internal audit; management review.</p></field>
</record>
<record id="as9100_clause_9_2" model="fusion.plating.as9100.clause">
<field name="name">Internal audit</field>
<field name="code">9.2</field>
<field name="standard">as9100d</field>
<field name="category">performance</field>
<field name="parent_id" ref="as9100_clause_9"/>
<field name="description" type="html"><p>Conduct internal audits at planned intervals to provide information on whether the QMS conforms to the organization's own requirements, the requirements of AS9100, and is effectively implemented and maintained.</p></field>
</record>
<record id="as9100_clause_9_3" model="fusion.plating.as9100.clause">
<field name="name">Management review</field>
<field name="code">9.3</field>
<field name="standard">as9100d</field>
<field name="category">performance</field>
<field name="parent_id" ref="as9100_clause_9"/>
<field name="description" type="html"><p>Top management reviews the organization's QMS at planned intervals to ensure its continuing suitability, adequacy, effectiveness and alignment with the strategic direction of the organization.</p></field>
</record>
<!-- ===== 10. IMPROVEMENT ===== -->
<record id="as9100_clause_10" model="fusion.plating.as9100.clause">
<field name="name">Improvement</field>
<field name="code">10</field>
<field name="standard">as9100d</field>
<field name="category">improvement</field>
<field name="description" type="html"><p>General; nonconformity and corrective action; continual improvement.</p></field>
</record>
<record id="as9100_clause_10_2" model="fusion.plating.as9100.clause">
<field name="name">Nonconformity and corrective action</field>
<field name="code">10.2</field>
<field name="standard">as9100d</field>
<field name="category">improvement</field>
<field name="parent_id" ref="as9100_clause_10"/>
<field name="description" type="html"><p>React to nonconformities, evaluate the need for action to eliminate the causes, implement any action needed, review the effectiveness of any corrective action taken, update risks and opportunities, and make changes to the QMS if necessary.</p></field>
</record>
<record id="as9100_clause_10_3" model="fusion.plating.as9100.clause">
<field name="name">Continual improvement</field>
<field name="code">10.3</field>
<field name="standard">as9100d</field>
<field name="category">improvement</field>
<field name="parent_id" ref="as9100_clause_10"/>
<field name="description" type="html"><p>Continually improve the suitability, adequacy, and effectiveness of the QMS, including considering outputs of analysis and evaluation, and management review.</p></field>
</record>
</odoo>

View File

@@ -0,0 +1,151 @@
<?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.
Seed aerospace industry specifications as fusion.plating.customer.spec
records with spec_type='industry'. All four process packs (EN, chrome,
anodize, black oxide) are listed as hard dependencies in the manifest
so the ``ref()`` calls below always resolve at install time.
-->
<odoo noupdate="1">
<!-- ===== AMS 2404 — Electroless Nickel Plating ===== -->
<record id="spec_ams_2404" model="fusion.plating.customer.spec">
<field name="code">AMS 2404</field>
<field name="name">Electroless Nickel Plating</field>
<field name="spec_type">industry</field>
<field name="x_fc_is_aerospace" eval="True"/>
<field name="x_fc_nadcap_required" eval="True"/>
<field name="x_fc_requires_first_article" eval="True"/>
<field name="process_type_ids" eval="[(6, 0, [
ref('fusion_plating_process_en.ptype_en_lp'),
ref('fusion_plating_process_en.ptype_en_mp'),
ref('fusion_plating_process_en.ptype_en_hp'),
])]"/>
</record>
<!-- ===== ASTM B733 — Autocatalytic (Electroless) Nickel-Phosphorus Coatings ===== -->
<record id="spec_astm_b733" model="fusion.plating.customer.spec">
<field name="code">ASTM B733</field>
<field name="name">Autocatalytic (Electroless) Nickel-Phosphorus Coatings</field>
<field name="spec_type">industry</field>
<field name="x_fc_is_aerospace" eval="True"/>
<field name="x_fc_requires_first_article" eval="True"/>
<field name="process_type_ids" eval="[(6, 0, [
ref('fusion_plating_process_en.ptype_en_lp'),
ref('fusion_plating_process_en.ptype_en_mp'),
ref('fusion_plating_process_en.ptype_en_hp'),
])]"/>
</record>
<!-- ===== MIL-C-26074 — Electroless Nickel Coatings ===== -->
<record id="spec_mil_c_26074" model="fusion.plating.customer.spec">
<field name="code">MIL-C-26074</field>
<field name="name">Electroless Nickel Coatings</field>
<field name="spec_type">industry</field>
<field name="x_fc_is_aerospace" eval="True"/>
<field name="x_fc_requires_first_article" eval="True"/>
<field name="process_type_ids" eval="[(6, 0, [
ref('fusion_plating_process_en.ptype_en_lp'),
ref('fusion_plating_process_en.ptype_en_mp'),
ref('fusion_plating_process_en.ptype_en_hp'),
])]"/>
</record>
<!-- ===== MIL-A-8625 — Anodic Coatings for Aluminum ===== -->
<record id="spec_mil_a_8625" model="fusion.plating.customer.spec">
<field name="code">MIL-A-8625</field>
<field name="name">Anodic Coatings for Aluminum and Aluminum Alloys</field>
<field name="spec_type">industry</field>
<field name="x_fc_is_aerospace" eval="True"/>
<field name="x_fc_nadcap_required" eval="True"/>
<field name="x_fc_requires_first_article" eval="True"/>
<field name="process_type_ids" eval="[(6, 0, [
ref('fusion_plating_process_anodize.ptype_an_type_i'),
ref('fusion_plating_process_anodize.ptype_an_type_ii'),
ref('fusion_plating_process_anodize.ptype_an_type_ii_dye'),
ref('fusion_plating_process_anodize.ptype_an_type_iii'),
])]"/>
</record>
<!-- ===== QQ-C-320 — Chromium Plating (Electrodeposited) ===== -->
<record id="spec_qq_c_320" model="fusion.plating.customer.spec">
<field name="code">QQ-C-320</field>
<field name="name">Chromium Plating (Electrodeposited)</field>
<field name="spec_type">industry</field>
<field name="x_fc_is_aerospace" eval="True"/>
<field name="x_fc_nadcap_required" eval="True"/>
<field name="x_fc_requires_first_article" eval="True"/>
<field name="process_type_ids" eval="[(6, 0, [
ref('fusion_plating_process_chrome.ptype_cr_hard_hex'),
ref('fusion_plating_process_chrome.ptype_cr_dec_hex'),
])]"/>
</record>
<!-- ===== MIL-DTL-13924 — Black Oxide Coating on Ferrous Metals ===== -->
<record id="spec_mil_dtl_13924" model="fusion.plating.customer.spec">
<field name="code">MIL-DTL-13924</field>
<field name="name">Black Oxide Coating on Ferrous Metals</field>
<field name="spec_type">industry</field>
<field name="x_fc_is_aerospace" eval="True"/>
<field name="process_type_ids" eval="[(6, 0, [
ref('fusion_plating_process_black_oxide.ptype_box_hot'),
ref('fusion_plating_process_black_oxide.ptype_box_mid'),
ref('fusion_plating_process_black_oxide.ptype_box_rt'),
])]"/>
</record>
<!-- ===== AMS 2700 — Passivation of Corrosion-Resistant Steels ===== -->
<record id="spec_ams_2700" model="fusion.plating.customer.spec">
<field name="code">AMS 2700</field>
<field name="name">Passivation of Corrosion-Resistant Steels</field>
<field name="spec_type">industry</field>
<field name="x_fc_is_aerospace" eval="True"/>
</record>
<!-- ===== AMS 2759/9 — Hydrogen Embrittlement Relief Bake ===== -->
<record id="spec_ams_2759" model="fusion.plating.customer.spec">
<field name="code">AMS 2759/9</field>
<field name="name">Hydrogen Embrittlement Relief (Baking) of Steel Parts</field>
<field name="spec_type">industry</field>
<field name="x_fc_is_aerospace" eval="True"/>
</record>
<!-- ===== AMS-QQ-P-416 — Cadmium Plating (Electrodeposited) ===== -->
<record id="spec_ams_qq_p_416" model="fusion.plating.customer.spec">
<field name="code">AMS-QQ-P-416</field>
<field name="name">Cadmium Plating (Electrodeposited)</field>
<field name="spec_type">industry</field>
<field name="x_fc_is_aerospace" eval="True"/>
<field name="x_fc_nadcap_required" eval="True"/>
<field name="x_fc_requires_first_article" eval="True"/>
</record>
<!-- ===== BAC 5709 — Boeing Electroless Nickel Plating ===== -->
<record id="spec_bac_5709" model="fusion.plating.customer.spec">
<field name="code">BAC 5709</field>
<field name="name">Boeing — Electroless Nickel Plating</field>
<field name="spec_type">industry</field>
<field name="x_fc_is_aerospace" eval="True"/>
<field name="x_fc_nadcap_required" eval="True"/>
<field name="x_fc_requires_first_article" eval="True"/>
<field name="x_fc_customer_approval_required" eval="True"/>
<field name="process_type_ids" eval="[(6, 0, [
ref('fusion_plating_process_en.ptype_en_mp'),
ref('fusion_plating_process_en.ptype_en_hp'),
])]"/>
</record>
<!-- ===== PRI AS7108 — Nadcap Chemical Processing Accreditation ===== -->
<record id="spec_pri_as7108" model="fusion.plating.customer.spec">
<field name="code">PRI AS7108</field>
<field name="name">Nadcap Chemical Processing Accreditation</field>
<field name="spec_type">industry</field>
<field name="x_fc_is_aerospace" eval="True"/>
<field name="x_fc_nadcap_required" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,150 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2026 Nexa Systems Inc. — Demo data for Fusion Plating Aerospace -->
<odoo noupdate="1">
<!-- ════════════════════════════════════════════════════════════════
Nadcap AC7108 Audits
════════════════════════════════════════════════════════════════ -->
<!-- 1. Scheduled audit — electroless nickel checklist -->
<record id="demo_nadcap_audit_scheduled" model="fusion.plating.nadcap.audit">
<field name="name">NADCAP-DEMO-001</field>
<field name="audit_date" eval="(DateTime.today() + timedelta(days=45)).strftime('%Y-%m-%d')"/>
<field name="auditor_name">R. Patel</field>
<field name="pri_auditor" eval="True"/>
<field name="checklist">ac7108_10_electroless</field>
<field name="state">scheduled</field>
<field name="notes" type="html"><p>Scheduled electroless nickel slash-sheet audit for Q3 cycle.</p></field>
</record>
<!-- 2. In-progress audit — chrome plating checklist -->
<record id="demo_nadcap_audit_in_progress" model="fusion.plating.nadcap.audit">
<field name="name">NADCAP-DEMO-002</field>
<field name="audit_date" eval="(DateTime.today() - timedelta(days=3)).strftime('%Y-%m-%d')"/>
<field name="auditor_name">J. Moreno</field>
<field name="pri_auditor" eval="True"/>
<field name="checklist">ac7108_12_chrome</field>
<field name="state">in_progress</field>
<field name="notes" type="html"><p>Chrome plating audit currently underway. Day 2 of on-site review.</p></field>
</record>
<!-- 3. Closed audit — base checklist, accredited, 2 merits, 0 NCRs -->
<record id="demo_nadcap_audit_closed" model="fusion.plating.nadcap.audit">
<field name="name">NADCAP-DEMO-003</field>
<field name="audit_date" eval="(DateTime.today() - timedelta(days=120)).strftime('%Y-%m-%d')"/>
<field name="auditor_name">S. Whitfield</field>
<field name="pri_auditor" eval="True"/>
<field name="checklist">ac7108_base</field>
<field name="result">accredited</field>
<field name="merit_count">2</field>
<field name="ncr_count">0</field>
<field name="accreditation_start" eval="(DateTime.today() - timedelta(days=90)).strftime('%Y-%m-%d')"/>
<field name="accreditation_end" eval="(DateTime.today() + timedelta(days=640)).strftime('%Y-%m-%d')"/>
<field name="state">closed</field>
<field name="notes" type="html"><p>Base checklist audit completed with full accreditation. Two merit observations noted for SPC controls and operator training programme.</p></field>
</record>
<!-- ════════════════════════════════════════════════════════════════
Risk Register Entries
════════════════════════════════════════════════════════════════ -->
<!-- 1. Operational risk — identified -->
<record id="demo_risk_operational" model="fusion.plating.risk">
<field name="name">RISK-DEMO-001</field>
<field name="title">Tank temperature controller failure</field>
<field name="description" type="html"><p>Single-point failure risk on Line 2 EN tank — temperature controller is end-of-life with no redundancy.</p></field>
<field name="category">operational</field>
<field name="likelihood">3</field>
<field name="impact">4</field>
<field name="state">identified</field>
<field name="review_date" eval="(DateTime.today() + timedelta(days=30)).strftime('%Y-%m-%d')"/>
</record>
<!-- 2. Supply chain risk — assessed -->
<record id="demo_risk_supply_chain" model="fusion.plating.risk">
<field name="name">RISK-DEMO-002</field>
<field name="title">Single-source nickel sulphamate supply</field>
<field name="description" type="html"><p>Only one approved vendor for nickel sulphamate concentrate. Lead time has increased to 12 weeks.</p></field>
<field name="category">supply_chain</field>
<field name="likelihood">2</field>
<field name="impact">5</field>
<field name="state">assessed</field>
<field name="mitigation_plan" type="html"><p>Qualify secondary supplier (Atotech). Target completion by Q4.</p></field>
<field name="review_date" eval="(DateTime.today() + timedelta(days=60)).strftime('%Y-%m-%d')"/>
</record>
<!-- 3. Quality risk — treated -->
<record id="demo_risk_quality" model="fusion.plating.risk">
<field name="name">RISK-DEMO-003</field>
<field name="title">Thickness measurement repeatability</field>
<field name="description" type="html"><p>XRF gauge R&amp;R study showed marginal repeatability on thin deposits (&lt; 5 µm).</p></field>
<field name="category">quality</field>
<field name="likelihood">4</field>
<field name="impact">3</field>
<field name="state">treated</field>
<field name="mitigation_plan" type="html"><p>Calibrated with new certified reference standards. Operator training refresher completed. Re-running R&amp;R study next week.</p></field>
<field name="review_date" eval="(DateTime.today() + timedelta(days=14)).strftime('%Y-%m-%d')"/>
</record>
<!-- 4. Customer risk — monitored -->
<record id="demo_risk_customer" model="fusion.plating.risk">
<field name="name">RISK-DEMO-004</field>
<field name="title">Prime OEM contract renewal uncertainty</field>
<field name="description" type="html"><p>Largest aerospace customer contract expires in 6 months. RFQ response due next quarter.</p></field>
<field name="category">customer</field>
<field name="likelihood">2</field>
<field name="impact">2</field>
<field name="state">monitored</field>
<field name="mitigation_plan" type="html"><p>Account review meetings scheduled monthly. Preparing competitive pricing and capacity expansion proposal.</p></field>
<field name="review_date" eval="(DateTime.today() + timedelta(days=21)).strftime('%Y-%m-%d')"/>
</record>
<!-- ════════════════════════════════════════════════════════════════
Configuration Management Items
════════════════════════════════════════════════════════════════ -->
<!-- 1. EN plating procedure -->
<record id="demo_config_item_en" model="fusion.plating.config.item">
<field name="name">Electroless Nickel Plating Procedure</field>
<field name="code">CFG-EN-001</field>
<field name="baseline_revision">A</field>
<field name="current_revision">C</field>
<field name="approval_date" eval="(DateTime.today() - timedelta(days=60)).strftime('%Y-%m-%d')"/>
<field name="change_history" type="html">
<p><strong>Rev C</strong> — Updated rinse-water conductivity limits per customer spec.<br/>
<strong>Rev B</strong> — Added mid-coat thickness checkpoint.<br/>
<strong>Rev A</strong> — Initial baseline release.</p>
</field>
<field name="notes" type="html"><p>Covers AMS 2404 and MIL-C-26074 requirements for medium-phosphorus EN deposits.</p></field>
</record>
<!-- 2. Chrome plating procedure -->
<record id="demo_config_item_chrome" model="fusion.plating.config.item">
<field name="name">Chrome Plating Procedure</field>
<field name="code">CFG-CR-001</field>
<field name="baseline_revision">A</field>
<field name="current_revision">B</field>
<field name="approval_date" eval="(DateTime.today() - timedelta(days=30)).strftime('%Y-%m-%d')"/>
<field name="change_history" type="html">
<p><strong>Rev B</strong> — Revised current-density parameters for thin hard chrome.<br/>
<strong>Rev A</strong> — Initial baseline release.</p>
</field>
<field name="notes" type="html"><p>Covers QQ-C-320 and AMS 2460 requirements for hard chrome deposits on aerospace components.</p></field>
</record>
<!-- ════════════════════════════════════════════════════════════════
Counterfeit Parts Prevention
════════════════════════════════════════════════════════════════ -->
<record id="demo_counterfeit_investigation" model="fusion.plating.counterfeit.prevention">
<field name="name">CFT-DEMO-001</field>
<field name="incident_date" eval="(DateTime.today() - timedelta(days=10)).strftime('%Y-%m-%d')"/>
<field name="part_number">NAS1149-C0363A</field>
<field name="lot_serial">LOT-2026-04-A</field>
<field name="detection_method">Certificate of conformance discrepancy flagged during receiving inspection</field>
<field name="disposition">investigation</field>
<field name="gidep_reported" eval="False"/>
<field name="notes" type="html"><p>Supplier certificate references an outdated spec revision. Material quarantined pending metallurgical lab verification. GIDEP report to be filed if counterfeit is confirmed.</p></field>
</record>
</odoo>

View File

@@ -0,0 +1,34 @@
<?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 noupdate="1">
<record id="seq_fp_nadcap_audit" model="ir.sequence">
<field name="name">Fusion Plating: Nadcap Audit</field>
<field name="code">fusion.plating.nadcap.audit</field>
<field name="prefix">NADCAP/%(year)s/</field>
<field name="padding">3</field>
<field name="company_id" eval="False"/>
</record>
<record id="seq_fp_counterfeit" model="ir.sequence">
<field name="name">Fusion Plating: Counterfeit Prevention</field>
<field name="code">fusion.plating.counterfeit.prevention</field>
<field name="prefix">CFT/%(year)s/</field>
<field name="padding">4</field>
<field name="company_id" eval="False"/>
</record>
<record id="seq_fp_risk" model="ir.sequence">
<field name="name">Fusion Plating: Risk Register</field>
<field name="code">fusion.plating.risk</field>
<field name="prefix">RISK/%(year)s/</field>
<field name="padding">3</field>
<field name="company_id" eval="False"/>
</record>
</odoo>

View File

@@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Plating product family.
from . import fp_as9100_clause
from . import fp_nadcap_audit
from . import fp_counterfeit_prevention
from . import fp_config_item
from . import fp_risk
from . import fp_customer_spec
from . import fp_fair

View File

@@ -0,0 +1,96 @@
# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Plating product family.
from odoo import api, fields, models
class FpAs9100Clause(models.Model):
"""AS9100 Rev D clause catalog.
A flat catalogue of clauses and sub-clauses from the AS9100 Rev D
standard, plus related standards (ISO 9001:2015, etc.). Used by
customer specifications and audit findings to pin a requirement to
the specific paragraph of the standard it satisfies.
"""
_name = 'fusion.plating.as9100.clause'
_description = 'Fusion Plating — AS9100 Clause'
_order = 'standard, code, id'
_parent_store = True
_rec_name = 'display_name'
name = fields.Char(
string='Name',
required=True,
translate=True,
)
display_name = fields.Char(
compute='_compute_display_name',
store=True,
)
code = fields.Char(
string='Clause Code',
required=True,
help='Clause reference number, e.g. 8.1.2.',
)
parent_id = fields.Many2one(
'fusion.plating.as9100.clause',
string='Parent Clause',
ondelete='cascade',
index=True,
)
parent_path = fields.Char(index=True, unaccent=False)
child_ids = fields.One2many(
'fusion.plating.as9100.clause',
'parent_id',
string='Sub-clauses',
)
description = fields.Html(
string='Description',
translate=True,
)
standard = fields.Selection(
[
('as9100d', 'AS9100 Rev D'),
('iso9001_2015', 'ISO 9001:2015'),
('other', 'Other'),
],
string='Standard',
default='as9100d',
required=True,
)
category = fields.Selection(
[
('leadership', 'Leadership'),
('planning', 'Planning'),
('support', 'Support'),
('operation', 'Operation'),
('performance', 'Performance Evaluation'),
('improvement', 'Improvement'),
],
string='Category',
)
notes = fields.Html(
string='Notes',
translate=True,
)
active = fields.Boolean(default=True)
_sql_constraints = [
(
'fp_as9100_clause_code_std_uniq',
'unique(code, standard)',
'A clause code must be unique per standard.',
),
]
@api.depends('code', 'name')
def _compute_display_name(self):
for rec in self:
parts = []
if rec.code:
parts.append(rec.code)
if rec.name:
parts.append(rec.name)
rec.display_name = ''.join(parts) if parts else ''

View File

@@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Plating product family.
from odoo import fields, models
class FpConfigItem(models.Model):
"""Configuration management baseline item.
Tracks a configuration item (product, process, document, tooling,
etc.) under formal configuration management control per AS9100
§8.1.2. Each item has a baseline revision, the current in-use
revision, and a change history log for traceability.
"""
_name = 'fusion.plating.config.item'
_description = 'Fusion Plating — Configuration Management Item'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'name, id'
name = fields.Char(
string='Name',
required=True,
tracking=True,
)
code = fields.Char(
string='Code',
required=True,
tracking=True,
)
baseline_revision = fields.Char(
string='Baseline Revision',
tracking=True,
help='The frozen baseline revision this item starts from.',
)
current_revision = fields.Char(
string='Current Revision',
tracking=True,
help='The revision currently in effect — usually the most '
'recently approved change.',
)
approved_by_id = fields.Many2one(
'res.users',
string='Approved By',
tracking=True,
)
approval_date = fields.Date(
string='Approval Date',
tracking=True,
)
change_history = fields.Html(
string='Change History',
help='Manual log of baseline changes. Use dated entries to keep '
'full traceability for auditors.',
)
notes = fields.Html(
string='Notes',
)
company_id = fields.Many2one(
'res.company',
string='Company',
default=lambda self: self.env.company,
)
active = fields.Boolean(default=True)
_sql_constraints = [
(
'fp_config_item_code_uniq',
'unique(code, company_id)',
'Configuration item codes must be unique per company.',
),
]

View File

@@ -0,0 +1,87 @@
# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Plating product family.
from odoo import api, fields, models
class FpCounterfeitPrevention(models.Model):
"""Counterfeit parts prevention incident log.
Records an incident where a suspected or confirmed counterfeit /
fraudulent part, material, or raw stock was detected in the supply
chain. Required by AS9100 §8.1.4 Counterfeit Parts Prevention.
"""
_name = 'fusion.plating.counterfeit.prevention'
_description = 'Fusion Plating — Counterfeit Parts Prevention Log'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'incident_date desc, id desc'
name = fields.Char(
string='Reference',
required=True,
copy=False,
readonly=True,
default=lambda self: self._default_name(),
tracking=True,
)
incident_date = fields.Date(
string='Incident Date',
default=lambda self: fields.Date.context_today(self),
tracking=True,
)
supplier_id = fields.Many2one(
'res.partner',
string='Supplier',
tracking=True,
)
part_number = fields.Char(
string='Part Number',
tracking=True,
)
lot_serial = fields.Char(
string='Lot / Serial',
tracking=True,
)
detection_method = fields.Char(
string='Detection Method',
help='How the counterfeit item was detected (receiving inspection, '
'lab test, certificate discrepancy, etc.).',
)
disposition = fields.Selection(
[
('returned', 'Returned to Supplier'),
('destroyed', 'Destroyed / Quarantined'),
('investigation', 'Under Investigation'),
],
string='Disposition',
default='investigation',
tracking=True,
)
gidep_reported = fields.Boolean(
string='GIDEP Reported',
tracking=True,
help='Reported to the Government Industry Data Exchange Program.',
)
notes = fields.Html(
string='Notes',
)
company_id = fields.Many2one(
'res.company',
string='Company',
default=lambda self: self.env.company,
)
active = fields.Boolean(default=True)
@api.model
def _default_name(self):
seq = self.env['ir.sequence'].next_by_code('fusion.plating.counterfeit.prevention')
return seq or '/'
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if not vals.get('name') or vals.get('name') == '/':
vals['name'] = self._default_name()
return super().create(vals_list)

View File

@@ -0,0 +1,54 @@
# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Plating product family.
from odoo import fields, models
class FpCustomerSpec(models.Model):
"""Aerospace extension to the quality customer-spec model.
Adds the small set of aerospace-specific flags and linkages the
quality module deliberately keeps out of its generic implementation.
"""
_inherit = 'fusion.plating.customer.spec'
x_fc_is_aerospace = fields.Boolean(
string='Aerospace Spec',
tracking=True,
help='Check to mark this specification as aerospace-relevant so '
'it shows up in aerospace filters and dashboards.',
)
x_fc_as9100_clause_ids = fields.Many2many(
'fusion.plating.as9100.clause',
'fp_customer_spec_as9100_clause_rel',
'spec_id',
'clause_id',
string='Related AS9100 Clauses',
help='AS9100 Rev D clauses this specification maps to.',
)
x_fc_nadcap_required = fields.Boolean(
string='Nadcap Required',
tracking=True,
help='This specification can only be satisfied by a Nadcap-accredited '
'supplier.',
)
x_fc_requires_first_article = fields.Boolean(
string='Requires First Article',
tracking=True,
help='Running this specification on a new part number or revision '
'requires a full FAIR on file.',
)
x_fc_pri_file_code = fields.Char(
string='PRI File Code',
tracking=True,
help='Performance Review Institute file code assigned to this '
'specification, when known.',
)
x_fc_customer_approval_required = fields.Boolean(
string='Customer Approval Required',
tracking=True,
help='Each job against this spec requires explicit customer '
'approval before shipping.',
)

View File

@@ -0,0 +1,54 @@
# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Plating product family.
from odoo import fields, models
class FpFair(models.Model):
"""Aerospace extension to the quality FAIR model.
Adds the AS9102 form 1/2/3 attachment slots and the customer-approval
signature block that aerospace customers routinely require on top of
the generic first-article report.
"""
_inherit = 'fusion.plating.fair'
x_fc_as9102_form1 = fields.Binary(
string='AS9102 Form 1 (Part Accountability)',
help='Scanned / generated copy of AS9102 Form 1 — part '
'accountability header.',
)
x_fc_as9102_form1_filename = fields.Char(string='Form 1 Filename')
x_fc_as9102_form2 = fields.Binary(
string='AS9102 Form 2 (Product Accountability)',
help='Scanned / generated copy of AS9102 Form 2 — product '
'accountability, raw material / process / inspection records.',
)
x_fc_as9102_form2_filename = fields.Char(string='Form 2 Filename')
x_fc_as9102_form3 = fields.Binary(
string='AS9102 Form 3 (Characteristic Accountability)',
help='Scanned / generated copy of AS9102 Form 3 — characteristic '
'accountability, verification, and compatibility evaluation.',
)
x_fc_as9102_form3_filename = fields.Char(string='Form 3 Filename')
x_fc_drawing_revision = fields.Char(
string='Drawing Revision',
tracking=True,
help='Customer drawing revision this FAIR is against — must match '
'the revision shipped to the customer.',
)
x_fc_customer_approval_id = fields.Many2one(
'res.users',
string='Customer Approver',
tracking=True,
help='User who recorded the customer-side approval of this FAIR.',
)
x_fc_customer_approval_date = fields.Date(
string='Customer Approval Date',
tracking=True,
)

View File

@@ -0,0 +1,132 @@
# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Plating product family.
from odoo import api, fields, models
class FpNadcapAudit(models.Model):
"""Nadcap AC7108 chemical-processing audit record.
Tracks a single Nadcap audit against AC7108 (base checklist) and its
slash sheets. This is deliberately kept separate from the generic
fusion.plating.audit model in the quality module because Nadcap has
its own accreditation lifecycle, PRI-assigned auditors, and
merit/NCR tracking that don't map cleanly to the generic audit flow.
"""
_name = 'fusion.plating.nadcap.audit'
_description = 'Fusion Plating — Nadcap AC7108 Audit'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'audit_date desc, id desc'
name = fields.Char(
string='Reference',
required=True,
copy=False,
readonly=True,
default=lambda self: self._default_name(),
tracking=True,
)
audit_date = fields.Date(
string='Audit Date',
tracking=True,
)
auditor_name = fields.Char(
string='Auditor',
tracking=True,
help='Name of the individual auditor performing the assessment.',
)
pri_auditor = fields.Boolean(
string='PRI-Assigned Auditor',
tracking=True,
help='Checked when the auditor was assigned by the Performance '
'Review Institute rather than a self-nomination.',
)
checklist = fields.Selection(
[
('ac7108_base', 'AC7108 — Base Checklist'),
('ac7108_10_electroless', 'AC7108/10 — Electroless Nickel'),
('ac7108_11_brush', 'AC7108/11 — Brush Plating'),
('ac7108_12_chrome', 'AC7108/12 — Chromium Plating'),
('ac7108_13_anodize', 'AC7108/13 — Anodize'),
('ac7108_14_conv', 'AC7108/14 — Conversion Coating'),
],
string='Checklist',
default='ac7108_base',
required=True,
tracking=True,
)
result = fields.Selection(
[
('accredited', 'Accredited'),
('conditional', 'Conditional'),
('failed', 'Failed'),
],
string='Result',
tracking=True,
)
merit_count = fields.Integer(
string='Merits',
help='Count of merit-worthy observations recorded during the '
'audit (positive findings).',
)
ncr_count = fields.Integer(
string='NCRs',
help='Non-conformance reports raised during the audit.',
)
audit_report_attachment = fields.Many2one(
'ir.attachment',
string='Audit Report',
help='Final audit report PDF.',
)
accreditation_start = fields.Date(
string='Accreditation Start',
tracking=True,
)
accreditation_end = fields.Date(
string='Accreditation End',
tracking=True,
)
state = fields.Selection(
[
('scheduled', 'Scheduled'),
('in_progress', 'In Progress'),
('report_issued', 'Report Issued'),
('closed', 'Closed'),
],
string='Status',
default='scheduled',
required=True,
tracking=True,
)
notes = fields.Html(
string='Notes',
)
company_id = fields.Many2one(
'res.company',
string='Company',
default=lambda self: self.env.company,
)
active = fields.Boolean(default=True)
@api.model
def _default_name(self):
seq = self.env['ir.sequence'].next_by_code('fusion.plating.nadcap.audit')
return seq or '/'
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if not vals.get('name') or vals.get('name') == '/':
vals['name'] = self._default_name()
return super().create(vals_list)
def action_start(self):
self.write({'state': 'in_progress'})
def action_issue_report(self):
self.write({'state': 'report_issued'})
def action_close(self):
self.write({'state': 'closed'})

View File

@@ -0,0 +1,176 @@
# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Plating product family.
from odoo import api, fields, models
class FpRisk(models.Model):
"""Risk register entry.
Implements the operational risk management requirement from AS9100
Rev D §8.1.1. Each risk gets scored on a 15 likelihood and 15
impact scale; the multiplicative score drives the level classification
(low / medium / high / critical) used for escalation and reporting.
"""
_name = 'fusion.plating.risk'
_description = 'Fusion Plating — Risk Register Entry'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'risk_score desc, id desc'
name = fields.Char(
string='Reference',
required=True,
copy=False,
readonly=True,
default=lambda self: self._default_name(),
tracking=True,
)
title = fields.Char(
string='Title',
required=True,
tracking=True,
)
description = fields.Html(
string='Description',
)
category = fields.Selection(
[
('operational', 'Operational'),
('supply_chain', 'Supply Chain'),
('quality', 'Quality'),
('safety', 'Safety'),
('environmental', 'Environmental'),
('financial', 'Financial'),
('customer', 'Customer'),
('regulatory', 'Regulatory'),
],
string='Category',
default='operational',
required=True,
tracking=True,
)
likelihood = fields.Selection(
[
('1', '1 — Very Low'),
('2', '2 — Low'),
('3', '3 — Medium'),
('4', '4 — High'),
('5', '5 — Very High'),
],
string='Likelihood',
default='3',
required=True,
tracking=True,
)
impact = fields.Selection(
[
('1', '1 — Very Low'),
('2', '2 — Low'),
('3', '3 — Medium'),
('4', '4 — High'),
('5', '5 — Very High'),
],
string='Impact',
default='3',
required=True,
tracking=True,
)
risk_score = fields.Integer(
string='Score',
compute='_compute_risk_score',
store=True,
help='Likelihood × Impact (125).',
)
risk_level = fields.Selection(
[
('low', 'Low'),
('medium', 'Medium'),
('high', 'High'),
('critical', 'Critical'),
],
string='Level',
compute='_compute_risk_level',
store=True,
tracking=True,
)
mitigation_plan = fields.Html(
string='Mitigation Plan',
)
owner_id = fields.Many2one(
'res.users',
string='Owner',
default=lambda self: self.env.user,
tracking=True,
)
review_date = fields.Date(
string='Next Review',
tracking=True,
)
state = fields.Selection(
[
('identified', 'Identified'),
('assessed', 'Assessed'),
('treated', 'Treated'),
('monitored', 'Monitored'),
('closed', 'Closed'),
],
string='Status',
default='identified',
required=True,
tracking=True,
)
company_id = fields.Many2one(
'res.company',
string='Company',
default=lambda self: self.env.company,
)
active = fields.Boolean(default=True)
@api.model
def _default_name(self):
seq = self.env['ir.sequence'].next_by_code('fusion.plating.risk')
return seq or '/'
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if not vals.get('name') or vals.get('name') == '/':
vals['name'] = self._default_name()
return super().create(vals_list)
@api.depends('likelihood', 'impact')
def _compute_risk_score(self):
for rec in self:
try:
likely = int(rec.likelihood or 0)
impact = int(rec.impact or 0)
except (TypeError, ValueError):
likely, impact = 0, 0
rec.risk_score = likely * impact
@api.depends('risk_score')
def _compute_risk_level(self):
for rec in self:
score = rec.risk_score or 0
if score >= 20:
rec.risk_level = 'critical'
elif score >= 12:
rec.risk_level = 'high'
elif score >= 6:
rec.risk_level = 'medium'
else:
rec.risk_level = 'low'
def action_assess(self):
self.write({'state': 'assessed'})
def action_treat(self):
self.write({'state': 'treated'})
def action_monitor(self):
self.write({'state': 'monitored'})
def action_close(self):
self.write({'state': 'closed'})

View File

@@ -0,0 +1,23 @@
<?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>
<!--
This module reuses the core groups from fusion_plating:
fusion_plating.group_fusion_plating_operator
fusion_plating.group_fusion_plating_supervisor
fusion_plating.group_fusion_plating_manager
fusion_plating.group_fusion_plating_admin
No new res.groups records are introduced here. All access control
is expressed in security/ir.model.access.csv via those existing
groups, so a single user role works across the core, the QMS and
the aerospace pack.
-->
</odoo>

View File

@@ -0,0 +1,16 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_fp_as9100_clause_operator,fp.as9100.clause.operator,model_fusion_plating_as9100_clause,fusion_plating.group_fusion_plating_operator,1,0,0,0
access_fp_as9100_clause_supervisor,fp.as9100.clause.supervisor,model_fusion_plating_as9100_clause,fusion_plating.group_fusion_plating_supervisor,1,0,0,0
access_fp_as9100_clause_manager,fp.as9100.clause.manager,model_fusion_plating_as9100_clause,fusion_plating.group_fusion_plating_manager,1,1,1,1
access_fp_nadcap_audit_operator,fp.nadcap.audit.operator,model_fusion_plating_nadcap_audit,fusion_plating.group_fusion_plating_operator,1,0,0,0
access_fp_nadcap_audit_supervisor,fp.nadcap.audit.supervisor,model_fusion_plating_nadcap_audit,fusion_plating.group_fusion_plating_supervisor,1,1,1,0
access_fp_nadcap_audit_manager,fp.nadcap.audit.manager,model_fusion_plating_nadcap_audit,fusion_plating.group_fusion_plating_manager,1,1,1,1
access_fp_counterfeit_operator,fp.counterfeit.operator,model_fusion_plating_counterfeit_prevention,fusion_plating.group_fusion_plating_operator,1,0,0,0
access_fp_counterfeit_supervisor,fp.counterfeit.supervisor,model_fusion_plating_counterfeit_prevention,fusion_plating.group_fusion_plating_supervisor,1,1,1,0
access_fp_counterfeit_manager,fp.counterfeit.manager,model_fusion_plating_counterfeit_prevention,fusion_plating.group_fusion_plating_manager,1,1,1,1
access_fp_config_item_operator,fp.config.item.operator,model_fusion_plating_config_item,fusion_plating.group_fusion_plating_operator,1,0,0,0
access_fp_config_item_supervisor,fp.config.item.supervisor,model_fusion_plating_config_item,fusion_plating.group_fusion_plating_supervisor,1,1,1,0
access_fp_config_item_manager,fp.config.item.manager,model_fusion_plating_config_item,fusion_plating.group_fusion_plating_manager,1,1,1,1
access_fp_risk_operator,fp.risk.operator,model_fusion_plating_risk,fusion_plating.group_fusion_plating_operator,1,0,0,0
access_fp_risk_supervisor,fp.risk.supervisor,model_fusion_plating_risk,fusion_plating.group_fusion_plating_supervisor,1,1,1,0
access_fp_risk_manager,fp.risk.manager,model_fusion_plating_risk,fusion_plating.group_fusion_plating_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_fp_as9100_clause_operator fp.as9100.clause.operator model_fusion_plating_as9100_clause fusion_plating.group_fusion_plating_operator 1 0 0 0
3 access_fp_as9100_clause_supervisor fp.as9100.clause.supervisor model_fusion_plating_as9100_clause fusion_plating.group_fusion_plating_supervisor 1 0 0 0
4 access_fp_as9100_clause_manager fp.as9100.clause.manager model_fusion_plating_as9100_clause fusion_plating.group_fusion_plating_manager 1 1 1 1
5 access_fp_nadcap_audit_operator fp.nadcap.audit.operator model_fusion_plating_nadcap_audit fusion_plating.group_fusion_plating_operator 1 0 0 0
6 access_fp_nadcap_audit_supervisor fp.nadcap.audit.supervisor model_fusion_plating_nadcap_audit fusion_plating.group_fusion_plating_supervisor 1 1 1 0
7 access_fp_nadcap_audit_manager fp.nadcap.audit.manager model_fusion_plating_nadcap_audit fusion_plating.group_fusion_plating_manager 1 1 1 1
8 access_fp_counterfeit_operator fp.counterfeit.operator model_fusion_plating_counterfeit_prevention fusion_plating.group_fusion_plating_operator 1 0 0 0
9 access_fp_counterfeit_supervisor fp.counterfeit.supervisor model_fusion_plating_counterfeit_prevention fusion_plating.group_fusion_plating_supervisor 1 1 1 0
10 access_fp_counterfeit_manager fp.counterfeit.manager model_fusion_plating_counterfeit_prevention fusion_plating.group_fusion_plating_manager 1 1 1 1
11 access_fp_config_item_operator fp.config.item.operator model_fusion_plating_config_item fusion_plating.group_fusion_plating_operator 1 0 0 0
12 access_fp_config_item_supervisor fp.config.item.supervisor model_fusion_plating_config_item fusion_plating.group_fusion_plating_supervisor 1 1 1 0
13 access_fp_config_item_manager fp.config.item.manager model_fusion_plating_config_item fusion_plating.group_fusion_plating_manager 1 1 1 1
14 access_fp_risk_operator fp.risk.operator model_fusion_plating_risk fusion_plating.group_fusion_plating_operator 1 0 0 0
15 access_fp_risk_supervisor fp.risk.supervisor model_fusion_plating_risk fusion_plating.group_fusion_plating_supervisor 1 1 1 0
16 access_fp_risk_manager fp.risk.manager model_fusion_plating_risk fusion_plating.group_fusion_plating_manager 1 1 1 1

View File

@@ -0,0 +1,109 @@
// =============================================================================
// Fusion Plating — Aerospace pack styles
// Copyright 2026 Nexa Systems Inc.
// License OPL-1 (Odoo Proprietary License v1.0)
//
// THEME AWARENESS
// ---------------
// This file uses ONLY Bootstrap / Odoo CSS custom properties so it renders
// correctly in both light and dark mode:
//
// background: var(--bs-body-bg)
// surface: var(--o-view-background-color)
// foreground: var(--bs-body-color)
// muted text: var(--bs-secondary-color)
// border: var(--bs-border-color)
// brand: var(--o-action)
//
// Semantic status colours are tinted via `color-mix()` against the Bootstrap
// theme tokens so a green badge adapts automatically between light and dark.
// =============================================================================
// -----------------------------------------------------------------------------
// Local helper — tint a semantic colour against the surface.
// -----------------------------------------------------------------------------
@mixin fp-aero-tint($color-var, $amount: 12%) {
background-color: color-mix(in srgb, var(#{$color-var}) #{$amount}, transparent);
color: var(#{$color-var});
border: 1px solid color-mix(in srgb, var(#{$color-var}) 35%, transparent);
}
// -----------------------------------------------------------------------------
// Risk register card — severity-tinted callout on the risk form
// -----------------------------------------------------------------------------
.o_fp_risk_card {
background-color: var(--o-view-background-color, var(--bs-body-bg));
color: var(--bs-body-color);
border: 1px solid var(--bs-border-color);
border-left-width: 4px;
border-radius: 8px;
padding: 12px 14px;
margin-bottom: 12px;
transition: border-color 120ms ease, box-shadow 120ms ease;
&[data-level="low"] {
border-left-color: var(--bs-success);
background-color: color-mix(in srgb, var(--bs-success) 6%, transparent);
}
&[data-level="medium"] {
border-left-color: var(--bs-info, var(--o-action));
background-color: color-mix(in srgb, var(--bs-info, var(--o-action)) 6%, transparent);
}
&[data-level="high"] {
border-left-color: var(--bs-warning);
background-color: color-mix(in srgb, var(--bs-warning) 8%, transparent);
}
&[data-level="critical"] {
border-left-color: var(--bs-danger);
background-color: color-mix(in srgb, var(--bs-danger) 10%, transparent);
box-shadow: 0 0 0 1px color-mix(in srgb, var(--bs-danger) 20%, transparent);
}
}
// -----------------------------------------------------------------------------
// Nadcap badge — compact accreditation indicator on the audit form header
// -----------------------------------------------------------------------------
.o_fp_nadcap_badge {
display: inline-block;
padding: 3px 10px;
font-size: 0.72rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.03em;
border-radius: 999px;
@include fp-aero-tint(--o-action);
}
// -----------------------------------------------------------------------------
// AS9100 clause tree — subtle hierarchy cueing for nested clause codes
// -----------------------------------------------------------------------------
.o_fp_as9100_tree {
.o_data_row {
// Tighten row padding a touch so long clause names stay legible
// without dominating the screen.
--fp-aero-row-pad: 6px;
> td {
padding-top: var(--fp-aero-row-pad);
padding-bottom: var(--fp-aero-row-pad);
}
}
// Monospace the clause code column for easy scanning of 8.1.2.3 style ids.
td[name="code"] {
font-family: var(--bs-font-monospace, monospace);
color: var(--bs-body-color);
}
// Muted parent column — it's context, not the focus.
td[name="parent_id"] {
color: var(--bs-secondary-color);
}
}

View File

@@ -0,0 +1,93 @@
<?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_as9100_clause_list" model="ir.ui.view">
<field name="name">fp.as9100.clause.list</field>
<field name="model">fusion.plating.as9100.clause</field>
<field name="arch" type="xml">
<list string="AS9100 Clauses" class="o_fp_as9100_tree">
<field name="code"/>
<field name="name"/>
<field name="standard" widget="badge"/>
<field name="category"/>
<field name="parent_id"/>
</list>
</field>
</record>
<record id="view_fp_as9100_clause_form" model="ir.ui.view">
<field name="name">fp.as9100.clause.form</field>
<field name="model">fusion.plating.as9100.clause</field>
<field name="arch" type="xml">
<form string="AS9100 Clause">
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name"/></h1>
</div>
<group>
<group>
<field name="code"/>
<field name="standard"/>
<field name="category"/>
</group>
<group>
<field name="parent_id"/>
<field name="active"/>
</group>
</group>
<notebook>
<page string="Description">
<field name="description"/>
</page>
<page string="Sub-clauses">
<field name="child_ids">
<list>
<field name="code"/>
<field name="name"/>
</list>
</field>
</page>
<page string="Notes">
<field name="notes"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="view_fp_as9100_clause_search" model="ir.ui.view">
<field name="name">fp.as9100.clause.search</field>
<field name="model">fusion.plating.as9100.clause</field>
<field name="arch" type="xml">
<search string="AS9100 Clauses">
<field name="code"/>
<field name="name"/>
<separator/>
<filter string="AS9100D" name="as9100d" domain="[('standard','=','as9100d')]"/>
<filter string="ISO 9001:2015" name="iso9001" domain="[('standard','=','iso9001_2015')]"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group>
<filter string="Standard" name="group_standard" context="{'group_by':'standard'}"/>
<filter string="Category" name="group_category" context="{'group_by':'category'}"/>
<filter string="Parent" name="group_parent" context="{'group_by':'parent_id'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_as9100_clause" model="ir.actions.act_window">
<field name="name">AS9100 Clauses</field>
<field name="res_model">fusion.plating.as9100.clause</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_as9100_clause_search"/>
</record>
</odoo>

View File

@@ -0,0 +1,84 @@
<?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_config_item_list" model="ir.ui.view">
<field name="name">fp.config.item.list</field>
<field name="model">fusion.plating.config.item</field>
<field name="arch" type="xml">
<list string="Configuration Items">
<field name="code"/>
<field name="name"/>
<field name="baseline_revision"/>
<field name="current_revision"/>
<field name="approved_by_id"/>
<field name="approval_date"/>
</list>
</field>
</record>
<record id="view_fp_config_item_form" model="ir.ui.view">
<field name="name">fp.config.item.form</field>
<field name="model">fusion.plating.config.item</field>
<field name="arch" type="xml">
<form string="Configuration Item">
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name"/></h1>
</div>
<group>
<group>
<field name="code"/>
<field name="baseline_revision"/>
<field name="current_revision"/>
</group>
<group>
<field name="approved_by_id"/>
<field name="approval_date"/>
<field name="active"/>
</group>
</group>
<notebook>
<page string="Change History">
<field name="change_history"/>
</page>
<page string="Notes">
<field name="notes"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_config_item_search" model="ir.ui.view">
<field name="name">fp.config.item.search</field>
<field name="model">fusion.plating.config.item</field>
<field name="arch" type="xml">
<search string="Configuration Items">
<field name="code"/>
<field name="name"/>
<field name="approved_by_id"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group>
<filter string="Approver" name="group_approver" context="{'group_by':'approved_by_id'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_config_item" model="ir.actions.act_window">
<field name="name">Configuration Items</field>
<field name="res_model">fusion.plating.config.item</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_config_item_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_counterfeit_list" model="ir.ui.view">
<field name="name">fp.counterfeit.list</field>
<field name="model">fusion.plating.counterfeit.prevention</field>
<field name="arch" type="xml">
<list string="Counterfeit Parts Log">
<field name="name"/>
<field name="incident_date"/>
<field name="supplier_id"/>
<field name="part_number"/>
<field name="lot_serial"/>
<field name="disposition" widget="badge"
decoration-warning="disposition == 'investigation'"
decoration-danger="disposition == 'destroyed'"
decoration-info="disposition == 'returned'"/>
<field name="gidep_reported" widget="boolean"/>
</list>
</field>
</record>
<record id="view_fp_counterfeit_form" model="ir.ui.view">
<field name="name">fp.counterfeit.form</field>
<field name="model">fusion.plating.counterfeit.prevention</field>
<field name="arch" type="xml">
<form string="Counterfeit Prevention Log">
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" readonly="1"/></h1>
</div>
<group>
<group>
<field name="incident_date"/>
<field name="supplier_id"/>
<field name="part_number"/>
<field name="lot_serial"/>
</group>
<group>
<field name="detection_method"/>
<field name="disposition"/>
<field name="gidep_reported"/>
</group>
</group>
<notebook>
<page string="Notes">
<field name="notes"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_counterfeit_search" model="ir.ui.view">
<field name="name">fp.counterfeit.search</field>
<field name="model">fusion.plating.counterfeit.prevention</field>
<field name="arch" type="xml">
<search string="Counterfeit Incidents">
<field name="name"/>
<field name="supplier_id"/>
<field name="part_number"/>
<separator/>
<filter string="Under Investigation" name="investigation" domain="[('disposition','=','investigation')]"/>
<filter string="Returned" name="returned" domain="[('disposition','=','returned')]"/>
<filter string="Destroyed" name="destroyed" domain="[('disposition','=','destroyed')]"/>
<separator/>
<filter string="GIDEP Reported" name="gidep" domain="[('gidep_reported','=',True)]"/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group>
<filter string="Supplier" name="group_supplier" context="{'group_by':'supplier_id'}"/>
<filter string="Disposition" name="group_disposition" context="{'group_by':'disposition'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_counterfeit" model="ir.actions.act_window">
<field name="name">Counterfeit Parts Log</field>
<field name="res_model">fusion.plating.counterfeit.prevention</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_counterfeit_search"/>
</record>
</odoo>

View File

@@ -0,0 +1,70 @@
<?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>
<!--
Extend the quality customer-spec form with the aerospace flag
block. Sits below the existing "Applicable Processes" group so
aerospace-only users can flip the flag + link clauses without
touching the base metadata.
-->
<record id="view_fp_customer_spec_form_inherit_aerospace" model="ir.ui.view">
<field name="name">fp.customer.spec.form.inherit.aerospace</field>
<field name="model">fusion.plating.customer.spec</field>
<field name="inherit_id" ref="fusion_plating_quality.view_fp_customer_spec_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='applicable_processes']" position="after">
<group string="Aerospace" name="aerospace">
<group>
<field name="x_fc_is_aerospace"/>
<field name="x_fc_nadcap_required"/>
<field name="x_fc_requires_first_article"/>
</group>
<group>
<field name="x_fc_pri_file_code"/>
<field name="x_fc_customer_approval_required"/>
</group>
</group>
<group string="AS9100 Clauses" name="as9100_clauses">
<field name="x_fc_as9100_clause_ids" widget="many2many_tags" nolabel="1"/>
</group>
</xpath>
</field>
</record>
<!-- Extend the list with a tiny aerospace indicator column. -->
<record id="view_fp_customer_spec_list_inherit_aerospace" model="ir.ui.view">
<field name="name">fp.customer.spec.list.inherit.aerospace</field>
<field name="model">fusion.plating.customer.spec</field>
<field name="inherit_id" ref="fusion_plating_quality.view_fp_customer_spec_list"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='spec_type']" position="after">
<field name="x_fc_is_aerospace" string="Aero" optional="show"/>
<field name="x_fc_nadcap_required" string="Nadcap" optional="hide"/>
</xpath>
</field>
</record>
<!-- Add aerospace filters to the spec search view. -->
<record id="view_fp_customer_spec_search_inherit_aerospace" model="ir.ui.view">
<field name="name">fp.customer.spec.search.inherit.aerospace</field>
<field name="model">fusion.plating.customer.spec</field>
<field name="inherit_id" ref="fusion_plating_quality.view_fp_customer_spec_search"/>
<field name="arch" type="xml">
<xpath expr="//filter[@name='internal']" position="after">
<separator/>
<filter string="Aerospace" name="aerospace"
domain="[('x_fc_is_aerospace','=',True)]"/>
<filter string="Nadcap Required" name="nadcap"
domain="[('x_fc_nadcap_required','=',True)]"/>
<filter string="FAI Required" name="fai_required"
domain="[('x_fc_requires_first_article','=',True)]"/>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,62 @@
<?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>
<!--
Extend the quality FAIR form with the AS9102 form attachments
and customer-approval signature block. Added as a notebook page
so the base layout is untouched.
-->
<record id="view_fp_fair_form_inherit_aerospace" model="ir.ui.view">
<field name="name">fp.fair.form.inherit.aerospace</field>
<field name="model">fusion.plating.fair</field>
<field name="inherit_id" ref="fusion_plating_quality.view_fp_fair_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page string="AS9102 Forms" name="as9102_forms">
<group>
<group string="Form 1 — Part Accountability">
<field name="x_fc_as9102_form1"
filename="x_fc_as9102_form1_filename"/>
<field name="x_fc_as9102_form1_filename" invisible="1"/>
</group>
<group string="Form 2 — Product Accountability">
<field name="x_fc_as9102_form2"
filename="x_fc_as9102_form2_filename"/>
<field name="x_fc_as9102_form2_filename" invisible="1"/>
</group>
</group>
<group>
<group string="Form 3 — Characteristic Accountability">
<field name="x_fc_as9102_form3"
filename="x_fc_as9102_form3_filename"/>
<field name="x_fc_as9102_form3_filename" invisible="1"/>
</group>
<group string="Drawing &amp; Customer Approval">
<field name="x_fc_drawing_revision"/>
<field name="x_fc_customer_approval_id"/>
<field name="x_fc_customer_approval_date"/>
</group>
</group>
</page>
</xpath>
</field>
</record>
<!-- Drawing revision column on the list for quick scanning. -->
<record id="view_fp_fair_list_inherit_aerospace" model="ir.ui.view">
<field name="name">fp.fair.list.inherit.aerospace</field>
<field name="model">fusion.plating.fair</field>
<field name="inherit_id" ref="fusion_plating_quality.view_fp_fair_list"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='part_revision']" position="after">
<field name="x_fc_drawing_revision" string="Dwg Rev" optional="show"/>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,46 @@
<?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>
<!-- ===== AEROSPACE (parent submenu under the Plating app) ===== -->
<menuitem id="menu_fp_aerospace"
name="Aerospace"
parent="fusion_plating.menu_fp_root"
sequence="60"
groups="fusion_plating.group_fusion_plating_operator"/>
<menuitem id="menu_fp_aerospace_as9100"
name="AS9100 Clauses"
parent="menu_fp_aerospace"
action="action_fp_as9100_clause"
sequence="10"/>
<menuitem id="menu_fp_aerospace_nadcap"
name="Nadcap Audits"
parent="menu_fp_aerospace"
action="action_fp_nadcap_audit"
sequence="20"/>
<menuitem id="menu_fp_aerospace_counterfeit"
name="Counterfeit Log"
parent="menu_fp_aerospace"
action="action_fp_counterfeit"
sequence="30"/>
<menuitem id="menu_fp_aerospace_config_items"
name="Configuration Items"
parent="menu_fp_aerospace"
action="action_fp_config_item"
sequence="40"/>
<menuitem id="menu_fp_aerospace_risk"
name="Risk Register"
parent="menu_fp_aerospace"
action="action_fp_risk"
sequence="50"/>
</odoo>

View File

@@ -0,0 +1,125 @@
<?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_nadcap_audit_list" model="ir.ui.view">
<field name="name">fp.nadcap.audit.list</field>
<field name="model">fusion.plating.nadcap.audit</field>
<field name="arch" type="xml">
<list string="Nadcap Audits"
decoration-success="result == 'accredited'"
decoration-warning="result == 'conditional'"
decoration-danger="result == 'failed'">
<field name="name"/>
<field name="audit_date"/>
<field name="checklist"/>
<field name="auditor_name"/>
<field name="pri_auditor" widget="boolean"/>
<field name="merit_count"/>
<field name="ncr_count"/>
<field name="accreditation_end"/>
<field name="result" widget="badge"
decoration-success="result == 'accredited'"
decoration-warning="result == 'conditional'"
decoration-danger="result == 'failed'"/>
<field name="state" widget="badge"/>
</list>
</field>
</record>
<record id="view_fp_nadcap_audit_form" model="ir.ui.view">
<field name="name">fp.nadcap.audit.form</field>
<field name="model">fusion.plating.nadcap.audit</field>
<field name="arch" type="xml">
<form string="Nadcap Audit">
<header>
<button name="action_start" string="Start Audit" type="object"
class="oe_highlight" invisible="state != 'scheduled'"/>
<button name="action_issue_report" string="Issue Report" type="object"
class="oe_highlight" invisible="state != 'in_progress'"/>
<button name="action_close" string="Close" type="object"
invisible="state != 'report_issued'"/>
<field name="state" widget="statusbar"
statusbar_visible="scheduled,in_progress,report_issued,closed"/>
</header>
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" readonly="1"/></h1>
</div>
<div class="d-flex gap-2 mb-2" invisible="not checklist">
<span class="o_fp_nadcap_badge">
<field name="checklist"/>
</span>
</div>
<group>
<group>
<field name="audit_date"/>
<field name="auditor_name"/>
<field name="pri_auditor"/>
<field name="checklist"/>
</group>
<group>
<field name="result"/>
<field name="merit_count"/>
<field name="ncr_count"/>
<field name="audit_report_attachment"/>
</group>
</group>
<group string="Accreditation">
<group>
<field name="accreditation_start"/>
</group>
<group>
<field name="accreditation_end"/>
</group>
</group>
<notebook>
<page string="Notes">
<field name="notes"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_nadcap_audit_search" model="ir.ui.view">
<field name="name">fp.nadcap.audit.search</field>
<field name="model">fusion.plating.nadcap.audit</field>
<field name="arch" type="xml">
<search string="Nadcap Audits">
<field name="name"/>
<field name="auditor_name"/>
<separator/>
<filter string="Scheduled" name="scheduled" domain="[('state','=','scheduled')]"/>
<filter string="In Progress" name="in_progress" domain="[('state','=','in_progress')]"/>
<filter string="Closed" name="closed" domain="[('state','=','closed')]"/>
<separator/>
<filter string="Accredited" name="accredited" domain="[('result','=','accredited')]"/>
<filter string="Failed" name="failed" domain="[('result','=','failed')]"/>
<separator/>
<filter string="PRI Auditor" name="pri_auditor" domain="[('pri_auditor','=',True)]"/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group>
<filter string="Status" name="group_state" context="{'group_by':'state'}"/>
<filter string="Checklist" name="group_checklist" context="{'group_by':'checklist'}"/>
<filter string="Result" name="group_result" context="{'group_by':'result'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_nadcap_audit" model="ir.actions.act_window">
<field name="name">Nadcap Audits</field>
<field name="res_model">fusion.plating.nadcap.audit</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_nadcap_audit_search"/>
</record>
</odoo>

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_risk_list" model="ir.ui.view">
<field name="name">fp.risk.list</field>
<field name="model">fusion.plating.risk</field>
<field name="arch" type="xml">
<list string="Risk Register"
decoration-success="risk_level == 'low'"
decoration-info="risk_level == 'medium'"
decoration-warning="risk_level == 'high'"
decoration-danger="risk_level == 'critical'">
<field name="name"/>
<field name="title"/>
<field name="category"/>
<field name="likelihood"/>
<field name="impact"/>
<field name="risk_score"/>
<field name="risk_level" widget="badge"
decoration-success="risk_level == 'low'"
decoration-info="risk_level == 'medium'"
decoration-warning="risk_level == 'high'"
decoration-danger="risk_level == 'critical'"/>
<field name="owner_id"/>
<field name="review_date"/>
<field name="state" widget="badge"/>
</list>
</field>
</record>
<record id="view_fp_risk_form" model="ir.ui.view">
<field name="name">fp.risk.form</field>
<field name="model">fusion.plating.risk</field>
<field name="arch" type="xml">
<form string="Risk">
<header>
<button name="action_assess" string="Assess" type="object"
class="oe_highlight" invisible="state != 'identified'"/>
<button name="action_treat" string="Treat" type="object"
class="oe_highlight" invisible="state != 'assessed'"/>
<button name="action_monitor" string="Monitor" type="object"
invisible="state != 'treated'"/>
<button name="action_close" string="Close" type="object"
invisible="state not in ('monitored','treated')"/>
<field name="state" widget="statusbar"
statusbar_visible="identified,assessed,treated,monitored,closed"/>
</header>
<sheet>
<div class="oe_title">
<label for="title"/>
<h1><field name="title" placeholder="Short risk title..."/></h1>
<div class="text-muted"><field name="name" readonly="1"/></div>
</div>
<div class="o_fp_risk_card">
<group>
<group>
<field name="category"/>
<field name="likelihood"/>
<field name="impact"/>
</group>
<group>
<field name="risk_score"/>
<field name="risk_level" widget="badge"
decoration-success="risk_level == 'low'"
decoration-info="risk_level == 'medium'"
decoration-warning="risk_level == 'high'"
decoration-danger="risk_level == 'critical'"/>
<field name="owner_id"/>
<field name="review_date"/>
</group>
</group>
</div>
<notebook>
<page string="Description">
<field name="description"/>
</page>
<page string="Mitigation Plan">
<field name="mitigation_plan"/>
</page>
</notebook>
</sheet>
<chatter/>
</form>
</field>
</record>
<record id="view_fp_risk_search" model="ir.ui.view">
<field name="name">fp.risk.search</field>
<field name="model">fusion.plating.risk</field>
<field name="arch" type="xml">
<search string="Risks">
<field name="name"/>
<field name="title"/>
<field name="owner_id"/>
<separator/>
<filter string="Critical" name="critical" domain="[('risk_level','=','critical')]"/>
<filter string="High" name="high" domain="[('risk_level','=','high')]"/>
<filter string="Medium" name="medium" domain="[('risk_level','=','medium')]"/>
<filter string="Low" name="low" domain="[('risk_level','=','low')]"/>
<separator/>
<filter string="Open" name="open" domain="[('state','not in',['closed'])]"/>
<filter string="Closed" name="closed" domain="[('state','=','closed')]"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group>
<filter string="Level" name="group_level" context="{'group_by':'risk_level'}"/>
<filter string="Category" name="group_category" context="{'group_by':'category'}"/>
<filter string="Owner" name="group_owner" context="{'group_by':'owner_id'}"/>
<filter string="Status" name="group_state" context="{'group_by':'state'}"/>
</group>
</search>
</field>
</record>
<record id="action_fp_risk" model="ir.actions.act_window">
<field name="name">Risk Register</field>
<field name="res_model">fusion.plating.risk</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_fp_risk_search"/>
</record>
</odoo>