feat(plating): CoC spec-optional + SO-style header + thickness for any cert

- Drop the hard spec_reference gate on fp.certificate.action_issue. The
  customer-facing description (_fp_resolve_customer_facing_description,
  walks job -> SO line, reuses fp_customer_description) now drives the CoC
  Process column; spec_reference prints only when an estimator fills it.
- CoC EN/FR reports swap web.external_layout for fp_external_layout_clean +
  paperformat_fp_a4_portrait. New shared coc_header (company logo + address
  left, Nadcap logo centre, title + Code128 barcode right) mirrors the Sale
  Order header. Removed the 3-logo Nadcap/AS9100/CGP accreditation strip and
  the body H1s; padding-top 0 on both body wrappers.
- Un-gate the Issue Certs wizard thickness upload (was invisible unless the
  customer was thickness-flagged) so a Fischerscope report can be attached to
  ANY cert; merge (page 2) + inline readings already render unconditionally.
- Update issue-gate tests, bump versions (certificates 19.0.9.1.0,
  reports 19.0.11.27.0, jobs 19.0.11.2.0), record CLAUDE.md rule 14c.

Deployed + render-verified on entech (CoC-30065, 223KB PDF, no QWeb errors).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-05-28 21:17:09 -04:00
parent fecd2415f6
commit 307afbf3c0
10 changed files with 209 additions and 110 deletions

View File

@@ -3,7 +3,7 @@
# License OPL-1 (Odoo Proprietary License v1.0)
{
'name': 'Fusion Plating — Native Jobs',
'version': '19.0.11.1.0',
'version': '19.0.11.2.0',
'category': 'Manufacturing/Plating',
'summary': 'Native plating job model — replaces mrp.production / mrp.workorder bridge.',
'author': 'Nexa Systems Inc.',

View File

@@ -48,20 +48,22 @@
<field name="needs_thickness" readonly="1"
widget="boolean_toggle"
string="Needs Thickness"/>
<!-- Upload column. Visible/required only when
the cert needs thickness data. Triggers
the @onchange-driven .docx parser. -->
<!-- Upload column. Available on EVERY cert so a
thickness report can be attached to any CoC
and pulled onto the printed cert (client
request 2026-05-28). needs_thickness still
drives the "Needs Thickness" badge + the
is_ready blocking gate below. Triggers the
@onchange-driven .docx/RTF parser. -->
<field name="fischer_filename" column_invisible="1"/>
<field name="fischer_file"
filename="fischer_filename"
widget="binary"
string="Fischerscope File (PDF or .docx)"
invisible="not needs_thickness"
readonly="not needs_thickness"/>
string="Fischerscope File (PDF or .docx)"/>
<field name="parsed_summary" readonly="1"
string="Parsed"
optional="show"
invisible="not needs_thickness or not parsed_summary"/>
invisible="not parsed_summary"/>
<field name="is_ready" widget="boolean_toggle"
readonly="1"
string="Ready"
@@ -86,15 +88,13 @@
widget="boolean_toggle"/>
</group>
</group>
<group string="Fischerscope File"
invisible="not needs_thickness">
<group string="Fischerscope File">
<field name="fischer_file"
filename="fischer_filename"/>
<field name="fischer_filename"
invisible="1"/>
</group>
<group string="Measurement Image (Optional)"
invisible="not needs_thickness">
<group string="Measurement Image (Optional)">
<field name="fischer_image_file"
filename="fischer_image_filename"
widget="image"
@@ -112,20 +112,17 @@
</group>
<div class="alert alert-info"
role="alert"
invisible="not needs_thickness or not parsed_summary">
invisible="not parsed_summary">
<i class="fa fa-check-circle me-1"/>
<field name="parsed_summary"
readonly="1" nolabel="1"/>
</div>
<separator string="Thickness Readings"
invisible="not needs_thickness"/>
<p class="text-muted small"
invisible="not needs_thickness">
<separator string="Thickness Readings"/>
<p class="text-muted small">
Auto-filled from the .docx upload above.
Edit/add rows manually as needed.
</p>
<field name="reading_line_ids"
invisible="not needs_thickness">
<field name="reading_line_ids">
<list editable="bottom">
<field name="sequence" widget="handle"/>
<field name="nip_mils"/>