chore(plating): de-dash shipped code + intake-neutral customer emails

Replace em-dashes and en-dashes with hyphens across 789 shipped source
files (py/xml/js/scss) so the delivered module reads as human-written;
em-dashes had become a recognizable AI-generated tell. Internal .md dev
notes are excluded. The WO-sticker mojibake strippers keep their dash
search targets (now written — / –). No logic changes: comments
and display strings only; validated with py_compile + lxml parse.

Rewrite the 7 customer notification emails to be intake-neutral
(ship-in / drop-off / pickup) and repair-aware, and fix the Shipped
email documents line (packing slip vs bill of lading; certificate only
when issued). Subjects use a hyphen separator.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-06-05 00:16:19 -04:00
parent c9eb61ee0c
commit 8c76a16366
789 changed files with 4692 additions and 4692 deletions

View File

@@ -4,14 +4,14 @@
# Part of the Fusion Plating product family.
{
'name': 'Fusion Plating Aerospace (AS9100 + Nadcap)',
'name': 'Fusion Plating - Aerospace (AS9100 + Nadcap)',
'version': '19.0.1.1.2',
'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)
Fusion Plating - Aerospace (AS9100 + Nadcap AC7108)
====================================================
Part of the Fusion Plating product family by Nexa Systems Inc.
@@ -24,7 +24,7 @@ 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)
clauses 4 through 10 plus the aerospace-critical 8.1.1-8.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)

View File

@@ -5,7 +5,7 @@
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
(4-10) 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">
@@ -115,7 +115,7 @@
<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>
<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">

View File

@@ -11,7 +11,7 @@
-->
<odoo noupdate="1">
<!-- ===== AMS 2404 Electroless Nickel Plating ===== -->
<!-- ===== 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>
@@ -26,7 +26,7 @@
])]"/>
</record>
<!-- ===== ASTM B733 Autocatalytic (Electroless) Nickel-Phosphorus Coatings ===== -->
<!-- ===== 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>
@@ -40,7 +40,7 @@
])]"/>
</record>
<!-- ===== MIL-C-26074 Electroless Nickel Coatings ===== -->
<!-- ===== 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>
@@ -54,7 +54,7 @@
])]"/>
</record>
<!-- ===== MIL-A-8625 Anodic Coatings for Aluminum ===== -->
<!-- ===== 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>
@@ -70,7 +70,7 @@
])]"/>
</record>
<!-- ===== QQ-C-320 Chromium Plating (Electrodeposited) ===== -->
<!-- ===== 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>
@@ -84,7 +84,7 @@
])]"/>
</record>
<!-- ===== MIL-DTL-13924 Black Oxide Coating on Ferrous Metals ===== -->
<!-- ===== 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>
@@ -97,7 +97,7 @@
])]"/>
</record>
<!-- ===== AMS 2700 Passivation of Corrosion-Resistant Steels ===== -->
<!-- ===== 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>
@@ -105,7 +105,7 @@
<field name="x_fc_is_aerospace" eval="True"/>
</record>
<!-- ===== AMS 2759/9 Hydrogen Embrittlement Relief Bake ===== -->
<!-- ===== 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>
@@ -113,7 +113,7 @@
<field name="x_fc_is_aerospace" eval="True"/>
</record>
<!-- ===== AMS-QQ-P-416 Cadmium Plating (Electrodeposited) ===== -->
<!-- ===== 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>
@@ -123,10 +123,10 @@
<field name="x_fc_requires_first_article" eval="True"/>
</record>
<!-- ===== BAC 5709 Boeing Electroless Nickel Plating ===== -->
<!-- ===== 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="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"/>
@@ -138,7 +138,7 @@
])]"/>
</record>
<!-- ===== PRI AS7108 Nadcap Chemical Processing Accreditation ===== -->
<!-- ===== 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>

View File

@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2026 Nexa Systems Inc. Demo data for Fusion Plating Aerospace -->
<!-- Copyright 2026 Nexa Systems Inc. - Demo data for Fusion Plating Aerospace -->
<odoo noupdate="1">
<!-- ════════════════════════════════════════════════════════════════
Nadcap AC7108 Audits
════════════════════════════════════════════════════════════════ -->
<!-- 1. Scheduled audit electroless nickel checklist -->
<!-- 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')"/>
@@ -17,7 +17,7 @@
<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 -->
<!-- 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')"/>
@@ -28,7 +28,7 @@
<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 -->
<!-- 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')"/>
@@ -48,11 +48,11 @@
Risk Register Entries
════════════════════════════════════════════════════════════════ -->
<!-- 1. Operational risk identified -->
<!-- 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="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>
@@ -60,7 +60,7 @@
<field name="review_date" eval="(DateTime.today() + timedelta(days=30)).strftime('%Y-%m-%d')"/>
</record>
<!-- 2. Supply chain risk assessed -->
<!-- 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>
@@ -73,7 +73,7 @@
<field name="review_date" eval="(DateTime.today() + timedelta(days=60)).strftime('%Y-%m-%d')"/>
</record>
<!-- 3. Quality risk treated -->
<!-- 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>
@@ -86,7 +86,7 @@
<field name="review_date" eval="(DateTime.today() + timedelta(days=14)).strftime('%Y-%m-%d')"/>
</record>
<!-- 4. Customer risk monitored -->
<!-- 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>
@@ -111,9 +111,9 @@
<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>
<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>
@@ -126,8 +126,8 @@
<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>
<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>

View File

@@ -15,7 +15,7 @@ class FpAs9100Clause(models.Model):
the specific paragraph of the standard it satisfies.
"""
_name = 'fusion.plating.as9100.clause'
_description = 'Fusion Plating AS9100 Clause'
_description = 'Fusion Plating - AS9100 Clause'
_order = 'standard, code, id'
_parent_store = True
_rec_name = 'display_name'
@@ -93,4 +93,4 @@ class FpAs9100Clause(models.Model):
parts.append(rec.code)
if rec.name:
parts.append(rec.name)
rec.display_name = ' '.join(parts) if parts else ''
rec.display_name = ' - '.join(parts) if parts else ''

View File

@@ -15,7 +15,7 @@ class FpConfigItem(models.Model):
revision, and a change history log for traceability.
"""
_name = 'fusion.plating.config.item'
_description = 'Fusion Plating Configuration Management Item'
_description = 'Fusion Plating - Configuration Management Item'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'name, id'
@@ -37,7 +37,7 @@ class FpConfigItem(models.Model):
current_revision = fields.Char(
string='Current Revision',
tracking=True,
help='The revision currently in effect usually the most '
help='The revision currently in effect - usually the most '
'recently approved change.',
)
approved_by_id = fields.Many2one(

View File

@@ -14,7 +14,7 @@ class FpCounterfeitPrevention(models.Model):
chain. Required by AS9100 §8.1.4 Counterfeit Parts Prevention.
"""
_name = 'fusion.plating.counterfeit.prevention'
_description = 'Fusion Plating Counterfeit Parts Prevention Log'
_description = 'Fusion Plating - Counterfeit Parts Prevention Log'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'incident_date desc, id desc'

View File

@@ -17,21 +17,21 @@ class FpFair(models.Model):
x_fc_as9102_form1 = fields.Binary(
string='AS9102 Form 1 (Part Accountability)',
help='Scanned / generated copy of AS9102 Form 1 part '
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 '
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 '
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')
@@ -39,7 +39,7 @@ class FpFair(models.Model):
x_fc_drawing_revision = fields.Char(
string='Drawing Revision',
tracking=True,
help='Customer drawing revision this FAIR is against must match '
help='Customer drawing revision this FAIR is against - must match '
'the revision shipped to the customer.',
)
x_fc_customer_approval_id = fields.Many2one(

View File

@@ -16,7 +16,7 @@ class FpNadcapAudit(models.Model):
merit/NCR tracking that don't map cleanly to the generic audit flow.
"""
_name = 'fusion.plating.nadcap.audit'
_description = 'Fusion Plating Nadcap AC7108 Audit'
_description = 'Fusion Plating - Nadcap AC7108 Audit'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'audit_date desc, id desc'
@@ -45,12 +45,12 @@ class FpNadcapAudit(models.Model):
)
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'),
('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',

View File

@@ -10,12 +10,12 @@ 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
Rev D §8.1.1. Each risk gets scored on a 1-5 likelihood and 1-5
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'
_description = 'Fusion Plating - Risk Register Entry'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'risk_score desc, id desc'
@@ -53,11 +53,11 @@ class FpRisk(models.Model):
)
likelihood = fields.Selection(
[
('1', '1 Very Low'),
('2', '2 Low'),
('3', '3 Medium'),
('4', '4 High'),
('5', '5 Very High'),
('1', '1 - Very Low'),
('2', '2 - Low'),
('3', '3 - Medium'),
('4', '4 - High'),
('5', '5 - Very High'),
],
string='Likelihood',
default='3',
@@ -66,11 +66,11 @@ class FpRisk(models.Model):
)
impact = fields.Selection(
[
('1', '1 Very Low'),
('2', '2 Low'),
('3', '3 Medium'),
('4', '4 High'),
('5', '5 Very High'),
('1', '1 - Very Low'),
('2', '2 - Low'),
('3', '3 - Medium'),
('4', '4 - High'),
('5', '5 - Very High'),
],
string='Impact',
default='3',
@@ -81,7 +81,7 @@ class FpRisk(models.Model):
string='Score',
compute='_compute_risk_score',
store=True,
help='Likelihood × Impact (125).',
help='Likelihood × Impact (1-25).',
)
risk_level = fields.Selection(
[

View File

@@ -1,5 +1,5 @@
// =============================================================================
// Fusion Plating Aerospace pack styles
// Fusion Plating - Aerospace pack styles
// Copyright 2026 Nexa Systems Inc.
// License OPL-1 (Odoo Proprietary License v1.0)
//
@@ -21,7 +21,7 @@
// -----------------------------------------------------------------------------
// Local helper tint a semantic colour against the surface.
// 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);
@@ -31,7 +31,7 @@
// -----------------------------------------------------------------------------
// Risk register card severity-tinted callout on the risk form
// 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));
@@ -67,7 +67,7 @@
// -----------------------------------------------------------------------------
// Nadcap badge compact accreditation indicator on the audit form header
// Nadcap badge - compact accreditation indicator on the audit form header
// -----------------------------------------------------------------------------
.o_fp_nadcap_badge {
display: inline-block;
@@ -82,7 +82,7 @@
// -----------------------------------------------------------------------------
// AS9100 clause tree subtle hierarchy cueing for nested clause codes
// AS9100 clause tree - subtle hierarchy cueing for nested clause codes
// -----------------------------------------------------------------------------
.o_fp_as9100_tree {
.o_data_row {
@@ -102,7 +102,7 @@
color: var(--bs-body-color);
}
// Muted parent column it's context, not the focus.
// Muted parent column - it's context, not the focus.
td[name="parent_id"] {
color: var(--bs-secondary-color);
}

View File

@@ -19,19 +19,19 @@
<xpath expr="//notebook" position="inside">
<page string="AS9102 Forms" name="as9102_forms">
<group>
<group string="Form 1 Part Accountability">
<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">
<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">
<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"/>

View File

@@ -6,8 +6,8 @@
-->
<odoo>
<!-- Phase 1 re-parented under Plating → Compliance hub. -->
<!-- Phase D (perms v2) QM-only under compliance hub. -->
<!-- Phase 1 - re-parented under Plating → Compliance hub. -->
<!-- Phase D (perms v2) - QM-only under compliance hub. -->
<menuitem id="menu_fp_aerospace"
name="Aerospace (AS9100 / Nadcap)"
parent="fusion_plating.menu_fp_compliance_hub"