fix(certs): surface Fischerscope upload inline in Issue Certs wizard

Reported 2026-05-20: clicking "Issue Cert" on a job opened the
wizard with a banner saying "Fischerscope file or readings needed
— fill it in below before confirming", but the list view only
showed status toggles (Needs Thickness / Is Ready). No upload
affordance was visible. Operators had to know they could click a
list row to expand into a hidden detail form where the upload
field lived.

The wizard model already had the file field, the .docx parser
(_fp_parse_fischerscope_docx), and the @onchange that prefills
readings — only the view was hiding it.

Fix: promote the file upload into the list as its own editable
binary column, alongside the existing Needs Thickness toggle.
Operator now sees:

  Reference │ Type │ Customer │ Needs Thickness │
  Fischerscope File (PDF or .docx) │ Parsed │ Ready

Drop the file → onchange fires → readings + parsed summary
populate in-row. Click "Confirm & Issue" to commit.

The per-line expanded form is preserved (still accessible via
row click) as a "details" panel for editing individual readings
after upload — but the primary upload action is now in the list
row where the operator's eyes are.

Module: fusion_plating_jobs 19.0.10.15.0 → 19.0.10.16.0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-05-20 08:46:06 -04:00
parent 3d1b6e7ec5
commit 0600b87a29
2 changed files with 41 additions and 6 deletions

View File

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

View File

@@ -24,15 +24,43 @@
(Fischerscope file or readings). Fill it in
below before confirming.
</div>
<!-- 2026-05-20: surface the file upload INLINE in the
list instead of behind a row-click into a sub-form.
Operators kept missing the upload affordance — the
list looked like a status display, not an action
surface. Adding the binary field as a column lets
them drop the Fischerscope file right where they
see "Needs Thickness" turned on. The form behind
the row click stays as a "details" expansion for
per-reading editing after upload. -->
<field name="line_ids" nolabel="1">
<list editable="bottom" create="false" delete="false">
<field name="cert_name" readonly="1"/>
<field name="cert_type" readonly="1"/>
<field name="partner_id" readonly="1"/>
<field name="cert_name" readonly="1"
string="Reference"/>
<field name="cert_type" readonly="1"
string="Type"/>
<field name="partner_id" readonly="1"
string="Customer"/>
<field name="needs_thickness" readonly="1"
widget="boolean_toggle"/>
widget="boolean_toggle"
string="Needs Thickness"/>
<!-- Upload column. Visible/required only when
the cert needs thickness data. Triggers
the @onchange-driven .docx 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"/>
<field name="parsed_summary" readonly="1"
string="Parsed"
optional="show"
invisible="not needs_thickness or not parsed_summary"/>
<field name="is_ready" widget="boolean_toggle"
readonly="1"
string="Ready"
decoration-success="is_ready"
decoration-danger="not is_ready"/>
</list>
@@ -61,13 +89,20 @@
<field name="fischer_filename"
invisible="1"/>
</group>
<div class="text-muted"
<div class="alert alert-info"
role="alert"
invisible="not needs_thickness or 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">
Auto-filled from the .docx upload above.
Edit/add rows manually as needed.
</p>
<field name="reading_line_ids"
invisible="not needs_thickness">
<list editable="bottom">