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:
@@ -4,14 +4,14 @@
|
||||
# Part of the Fusion Plating product family.
|
||||
|
||||
{
|
||||
'name': 'Fusion Plating — Nuclear (CSA N299, NQA-1)',
|
||||
'name': 'Fusion Plating - Nuclear (CSA N299, NQA-1)',
|
||||
'version': '19.0.1.2.2',
|
||||
'category': 'Manufacturing/Plating',
|
||||
'summary': 'Nuclear industry pack: CSA N299 Levels 1-4, NQA-1 awareness, '
|
||||
'CNSC licence tracking, 10 CFR Part 21 reporting, ITPs, '
|
||||
'nuclear pedigree traceability, extended retention.',
|
||||
'description': """
|
||||
Fusion Plating — Nuclear (CSA N299, NQA-1)
|
||||
Fusion Plating - Nuclear (CSA N299, NQA-1)
|
||||
===========================================
|
||||
|
||||
Part of the Fusion Plating product family by Nexa Systems Inc.
|
||||
@@ -23,25 +23,25 @@ finishing supplier needs on top of the generic QMS.
|
||||
|
||||
Records added
|
||||
-------------
|
||||
* CSA N299 Level catalog — Levels 1 through 4 with safety classification
|
||||
* CSA N299 Level catalog - Levels 1 through 4 with safety classification
|
||||
and default records-retention periods (40 / 25 / 15 / 7 years).
|
||||
* Nuclear Quality Program per facility — tracks N299 level, NQA-1
|
||||
* Nuclear Quality Program per facility - tracks N299 level, NQA-1
|
||||
applicability, CNSC supplier status, last/next audit dates.
|
||||
* Inspection and Test Plans (ITP) — hold points, witness points, test
|
||||
* Inspection and Test Plans (ITP) - hold points, witness points, test
|
||||
methods, acceptance criteria, customer review and approval workflow.
|
||||
* 10 CFR Part 21 defect evaluation and reporting — 60-day evaluation
|
||||
* 10 CFR Part 21 defect evaluation and reporting - 60-day evaluation
|
||||
clock, reportability determination, customer notification.
|
||||
* Nuclear Pedigree Records — full traceability from raw material heat
|
||||
* Nuclear Pedigree Records - full traceability from raw material heat
|
||||
number through chemistry cert, process trail, test results, ship
|
||||
date, and retention-until date (driven by N299 level).
|
||||
* CNSC Licence tracking — Class II nuclear facility, transport, export
|
||||
* CNSC Licence tracking - Class II nuclear facility, transport, export
|
||||
licences with expiry monitoring.
|
||||
* Customer Specification extension — nuclear flag, N299 level, NQA-1
|
||||
* Customer Specification extension - nuclear flag, N299 level, NQA-1
|
||||
flag, nuclear customer type (OPG, Bruce Power, AECL, CNL, Candu
|
||||
Energy, US utility).
|
||||
* NCR extension — nuclear job flag and 10 CFR Part 21 evaluation link
|
||||
* NCR extension - nuclear job flag and 10 CFR Part 21 evaluation link
|
||||
so any non-conformance on a nuclear job is captured for reportability.
|
||||
* res.company extension — default nuclear records retention (40 years
|
||||
* res.company extension - default nuclear records retention (40 years
|
||||
out of the box, configurable per company).
|
||||
|
||||
Seed data
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2026 Nexa Systems Inc. — DEMO DATA (temporary)
|
||||
Copyright 2026 Nexa Systems Inc. - DEMO DATA (temporary)
|
||||
Remove this file and its manifest entry before production release.
|
||||
-->
|
||||
<odoo noupdate="1">
|
||||
|
||||
<!-- ========== NUCLEAR QUALITY PROGRAM ========== -->
|
||||
<record id="demo_nuclear_program" model="fusion.plating.nuclear.program">
|
||||
<field name="name">Fusion Plating Main — CSA N299 Level 1 Program</field>
|
||||
<field name="name">Fusion Plating Main - CSA N299 Level 1 Program</field>
|
||||
<field name="facility_id" ref="fusion_plating.demo_facility_main"/>
|
||||
<field name="n299_level_id" ref="fusion_plating_nuclear.n299_l1"/>
|
||||
<field name="nqa1_applicable" eval="True"/>
|
||||
<field name="cnsc_licensed_supplier" eval="True"/>
|
||||
<field name="program_manual_rev">Rev D — 2025-09-15</field>
|
||||
<field name="program_manual_rev">Rev D - 2025-09-15</field>
|
||||
<field name="last_audit_date" eval="(DateTime.today() - timedelta(days=120)).strftime('%Y-%m-%d')"/>
|
||||
<field name="next_audit_date" eval="(DateTime.today() + timedelta(days=245)).strftime('%Y-%m-%d')"/>
|
||||
<field name="state">active</field>
|
||||
<field name="notes" type="html"><p>Primary nuclear quality program covering OPG and Bruce Power plating work. NQA-1 awareness maintained for potential US utility contracts. Last customer audit by OPG — zero findings.</p></field>
|
||||
<field name="notes" type="html"><p>Primary nuclear quality program covering OPG and Bruce Power plating work. NQA-1 awareness maintained for potential US utility contracts. Last customer audit by OPG - zero findings.</p></field>
|
||||
</record>
|
||||
|
||||
<!-- ========== NUCLEAR ITPs ========== -->
|
||||
@@ -28,7 +28,7 @@
|
||||
<field name="n299_level_id" ref="fusion_plating_nuclear.n299_l1"/>
|
||||
<field name="state">approved</field>
|
||||
<field name="customer_approval_date" eval="(DateTime.today() - timedelta(days=45)).strftime('%Y-%m-%d')"/>
|
||||
<field name="hold_points" type="html"><p><strong>HP-1:</strong> Pre-plate dimensional verification — customer witness required.<br/><strong>HP-2:</strong> Post-plate thickness measurement — customer hold point, work stops until released.<br/><strong>WP-1:</strong> Bath chemistry verification — customer may witness.</p></field>
|
||||
<field name="hold_points" type="html"><p><strong>HP-1:</strong> Pre-plate dimensional verification - customer witness required.<br/><strong>HP-2:</strong> Post-plate thickness measurement - customer hold point, work stops until released.<br/><strong>WP-1:</strong> Bath chemistry verification - customer may witness.</p></field>
|
||||
<field name="test_methods" type="html"><p>Thickness: XRF per ASTM B568. Adhesion: bend test per ASTM B571. Porosity: ferroxyl test per ASTM B733. Hardness: microhardness per ASTM E384.</p></field>
|
||||
<field name="acceptance_criteria" type="html"><p>EN deposit 0.0010" +/- 0.0002". Hardness 48-52 HRC after heat treat. Zero porosity on ferroxyl. 100% adhesion on bend test.</p></field>
|
||||
</record>
|
||||
@@ -56,7 +56,7 @@
|
||||
<field name="chemistry_cert_refs">CHEM-2026-0091, CHEM-2026-0092</field>
|
||||
<field name="ship_date" eval="(DateTime.today() - timedelta(days=10)).strftime('%Y-%m-%d')"/>
|
||||
<field name="locked" eval="True"/>
|
||||
<field name="test_results" type="html"><p>Thickness: 0.0011" (spec 0.0010" +/- 0.0002") — PASS.<br/>Hardness: 50 HRC (spec 48-52 HRC) — PASS.<br/>Adhesion: No separation on bend test — PASS.<br/>Porosity: No indication on ferroxyl — PASS.</p></field>
|
||||
<field name="test_results" type="html"><p>Thickness: 0.0011" (spec 0.0010" +/- 0.0002") - PASS.<br/>Hardness: 50 HRC (spec 48-52 HRC) - PASS.<br/>Adhesion: No separation on bend test - PASS.<br/>Porosity: No indication on ferroxyl - PASS.</p></field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -7,15 +7,15 @@
|
||||
Seed data for the four CSA N299 quality levels. Retention values
|
||||
reflect typical Canadian nuclear practice:
|
||||
|
||||
Level 1 — 40 years (safety-critical, often life-of-plant)
|
||||
Level 2 — 25 years (safety-related)
|
||||
Level 3 — 15 years (important to safety)
|
||||
Level 4 — 7 years (commercial grade)
|
||||
Level 1 - 40 years (safety-critical, often life-of-plant)
|
||||
Level 2 - 25 years (safety-related)
|
||||
Level 3 - 15 years (important to safety)
|
||||
Level 4 - 7 years (commercial grade)
|
||||
-->
|
||||
<odoo noupdate="1">
|
||||
|
||||
<record id="n299_l1" model="fusion.plating.n299.level">
|
||||
<field name="name">CSA N299 Level 1 — Safety-critical</field>
|
||||
<field name="name">CSA N299 Level 1 - Safety-critical</field>
|
||||
<field name="code">N299_L1</field>
|
||||
<field name="level_number">1</field>
|
||||
<field name="retention_years">40</field>
|
||||
@@ -24,7 +24,7 @@
|
||||
</record>
|
||||
|
||||
<record id="n299_l2" model="fusion.plating.n299.level">
|
||||
<field name="name">CSA N299 Level 2 — Safety-related</field>
|
||||
<field name="name">CSA N299 Level 2 - Safety-related</field>
|
||||
<field name="code">N299_L2</field>
|
||||
<field name="level_number">2</field>
|
||||
<field name="retention_years">25</field>
|
||||
@@ -33,7 +33,7 @@
|
||||
</record>
|
||||
|
||||
<record id="n299_l3" model="fusion.plating.n299.level">
|
||||
<field name="name">CSA N299 Level 3 — Important to safety</field>
|
||||
<field name="name">CSA N299 Level 3 - Important to safety</field>
|
||||
<field name="code">N299_L3</field>
|
||||
<field name="level_number">3</field>
|
||||
<field name="retention_years">15</field>
|
||||
@@ -42,7 +42,7 @@
|
||||
</record>
|
||||
|
||||
<record id="n299_l4" model="fusion.plating.n299.level">
|
||||
<field name="name">CSA N299 Level 4 — Commercial grade</field>
|
||||
<field name="name">CSA N299 Level 4 - Commercial grade</field>
|
||||
<field name="code">N299_L4</field>
|
||||
<field name="level_number">4</field>
|
||||
<field name="retention_years">7</field>
|
||||
|
||||
@@ -7,7 +7,7 @@ from odoo import api, fields, models
|
||||
|
||||
|
||||
class Fp10CFR21Report(models.Model):
|
||||
"""10 CFR Part 21 — Reporting of Defects and Noncompliance.
|
||||
"""10 CFR Part 21 - Reporting of Defects and Noncompliance.
|
||||
|
||||
10 CFR Part 21 is the US Nuclear Regulatory Commission regulation
|
||||
that requires suppliers of basic components to nuclear facilities
|
||||
@@ -16,20 +16,20 @@ class Fp10CFR21Report(models.Model):
|
||||
|
||||
The typical workflow is:
|
||||
|
||||
1. discovery — something is observed that might be a defect
|
||||
2. evaluation — determine whether it rises to the level of a
|
||||
1. discovery - something is observed that might be a defect
|
||||
2. evaluation - determine whether it rises to the level of a
|
||||
"substantial safety hazard" (reportable)
|
||||
3. reportable — yes, it's reportable → file with NRC
|
||||
3. reportable - yes, it's reportable → file with NRC
|
||||
or
|
||||
not_reportable — evaluation closes with a documented basis
|
||||
4. reported — notice filed with NRC and affected customers
|
||||
5. closed — corrective action verified, record sealed
|
||||
not_reportable - evaluation closes with a documented basis
|
||||
4. reported - notice filed with NRC and affected customers
|
||||
5. closed - corrective action verified, record sealed
|
||||
|
||||
The record has a due date that is 60 days after discovery, driven by
|
||||
the `days_since_discovery` computed field.
|
||||
"""
|
||||
_name = 'fusion.plating.10cfr21.report'
|
||||
_description = 'Fusion Plating — 10 CFR Part 21 Defect Report'
|
||||
_description = 'Fusion Plating - 10 CFR Part 21 Defect Report'
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
_order = 'discovery_date desc, id desc'
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ class FpCnscLicence(models.Model):
|
||||
|
||||
The Canadian Nuclear Safety Commission (CNSC) regulates all nuclear
|
||||
activities in Canada. A plating / finishing supplier that works on
|
||||
nuclear items may hold — or be listed under — one or more CNSC
|
||||
nuclear items may hold - or be listed under - one or more CNSC
|
||||
licences:
|
||||
|
||||
* Class II nuclear facility licence (on-site sources,
|
||||
@@ -24,7 +24,7 @@ class FpCnscLicence(models.Model):
|
||||
compliance awareness.
|
||||
"""
|
||||
_name = 'fusion.plating.cnsc.licence'
|
||||
_description = 'Fusion Plating — CNSC Licence'
|
||||
_description = 'Fusion Plating - CNSC Licence'
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
_order = 'expiry_date, name'
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ class FpCustomerSpec(models.Model):
|
||||
)
|
||||
x_fc_nuclear_customer_type = fields.Selection(
|
||||
[
|
||||
('opg', 'OPG — Ontario Power Generation'),
|
||||
('opg', 'OPG - Ontario Power Generation'),
|
||||
('bruce_power', 'Bruce Power'),
|
||||
('aecl', 'AECL / CNL'),
|
||||
('cameco', 'Cameco'),
|
||||
|
||||
@@ -14,17 +14,17 @@ class FpN299Level(models.Model):
|
||||
supplied to nuclear power plants. It defines four levels of quality
|
||||
programs keyed to the safety classification of the supplied item:
|
||||
|
||||
Level 1 — Safety-critical items (highest)
|
||||
Level 2 — Safety-related items
|
||||
Level 3 — Items important to safety
|
||||
Level 4 — Commercial grade (lowest)
|
||||
Level 1 - Safety-critical items (highest)
|
||||
Level 2 - Safety-related items
|
||||
Level 3 - Items important to safety
|
||||
Level 4 - Commercial grade (lowest)
|
||||
|
||||
The level drives how long nuclear quality records must be retained
|
||||
(life-of-plant on the highest levels, commercial norms on the lowest)
|
||||
and how rigorous the supplier's quality program must be.
|
||||
"""
|
||||
_name = 'fusion.plating.n299.level'
|
||||
_description = 'Fusion Plating — CSA N299 Quality Level'
|
||||
_description = 'Fusion Plating - CSA N299 Quality Level'
|
||||
_order = 'level_number, code'
|
||||
|
||||
name = fields.Char(
|
||||
@@ -52,7 +52,7 @@ class FpN299Level(models.Model):
|
||||
default=40,
|
||||
help='Default records-retention period for this level. Canadian nuclear '
|
||||
'quality records are typically retained for 40 years or longer at '
|
||||
'the highest levels — often "life of plant".',
|
||||
'the highest levels - often "life of plant".',
|
||||
)
|
||||
safety_classification = fields.Selection(
|
||||
[
|
||||
|
||||
@@ -22,7 +22,7 @@ class FpNuclearItp(models.Model):
|
||||
approved, any deviation needs a change record.
|
||||
"""
|
||||
_name = 'fusion.plating.nuclear.itp'
|
||||
_description = 'Fusion Plating — Nuclear Inspection and Test Plan'
|
||||
_description = 'Fusion Plating - Nuclear Inspection and Test Plan'
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
_order = 'name desc'
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ class FpNuclearPedigree(models.Model):
|
||||
Nuclear pedigree is the unbroken chain of traceability from the raw
|
||||
material a plated part was made from, through every processing
|
||||
step, to the finished and shipped component. Nuclear operators use
|
||||
pedigree records decades after shipment — long after the original
|
||||
work order has aged out of normal systems — which is why the
|
||||
pedigree records decades after shipment - long after the original
|
||||
work order has aged out of normal systems - which is why the
|
||||
retention clock is driven by the N299 level rather than a generic
|
||||
document-retention rule.
|
||||
|
||||
@@ -24,7 +24,7 @@ class FpNuclearPedigree(models.Model):
|
||||
the normal change-control process.
|
||||
"""
|
||||
_name = 'fusion.plating.nuclear.pedigree'
|
||||
_description = 'Fusion Plating — Nuclear Pedigree Record'
|
||||
_description = 'Fusion Plating - Nuclear Pedigree Record'
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
_order = 'ship_date desc, id desc'
|
||||
|
||||
|
||||
@@ -16,11 +16,11 @@ class FpNuclearProgram(models.Model):
|
||||
revision, the target N299 level, supplier certification status, and
|
||||
the audit cadence (internal, customer, CNSC awareness).
|
||||
|
||||
A facility can have more than one nuclear program — e.g. a Level 3
|
||||
A facility can have more than one nuclear program - e.g. a Level 3
|
||||
program for OPG work and a separate NQA-1 program for a US utility.
|
||||
"""
|
||||
_name = 'fusion.plating.nuclear.program'
|
||||
_description = 'Fusion Plating — Nuclear Quality Program'
|
||||
_description = 'Fusion Plating - Nuclear Quality Program'
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
_order = 'facility_id, name'
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ class ResCompany(models.Model):
|
||||
"""Extend company with a default nuclear records retention policy.
|
||||
|
||||
Nuclear quality records typically have to be retained for 40 years
|
||||
or longer — far beyond the standard document-retention rule of a
|
||||
or longer - far beyond the standard document-retention rule of a
|
||||
commercial shop. This field sets the company-wide default used
|
||||
when a pedigree record has no N299 level linked or when a higher
|
||||
authority needs to be applied.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// =============================================================================
|
||||
// Fusion Plating — Nuclear (CSA N299, NQA-1) backend styles
|
||||
// Fusion Plating - Nuclear (CSA N299, NQA-1) backend styles
|
||||
// Copyright 2026 Nexa Systems Inc.
|
||||
// License OPL-1 (Odoo Proprietary License v1.0)
|
||||
//
|
||||
@@ -23,14 +23,14 @@
|
||||
//
|
||||
// Semantic status tints use `color-mix()` against the Bootstrap theme tokens
|
||||
// so a danger badge is darker on light mode and brighter on dark mode
|
||||
// automatically — one rule, two looks.
|
||||
// automatically - one rule, two looks.
|
||||
//
|
||||
// We never target `.o_dark`, `html.dark`, or `@media (prefers-color-scheme)`.
|
||||
// =============================================================================
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Local helper — semantic tint mixin
|
||||
// Local helper - semantic tint mixin
|
||||
// -----------------------------------------------------------------------------
|
||||
@mixin fp-nuclear-tint($color-var, $amount: 12%) {
|
||||
background-color: color-mix(in srgb, var(#{$color-var}) #{$amount}, transparent);
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// N299 level pill — used anywhere a level is displayed inline
|
||||
// N299 level pill - used anywhere a level is displayed inline
|
||||
// -----------------------------------------------------------------------------
|
||||
.o_fp_nuclear_level {
|
||||
display: inline-block;
|
||||
@@ -60,7 +60,7 @@
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Locked pedigree — visual cue that the record is frozen
|
||||
// Locked pedigree - visual cue that the record is frozen
|
||||
// -----------------------------------------------------------------------------
|
||||
.o_fp_nuclear_locked {
|
||||
// When a pedigree is locked the title picks up a subtle danger tint so
|
||||
|
||||
@@ -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_nuclear"
|
||||
name="Nuclear (CSA N299 / CNSC)"
|
||||
parent="fusion_plating.menu_fp_compliance_hub"
|
||||
|
||||
Reference in New Issue
Block a user