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:
@@ -2,7 +2,7 @@
|
||||
<odoo>
|
||||
|
||||
<!-- ============================================================ -->
|
||||
<!-- S19 — Surface Fischerscope thickness PDF on the cert form -->
|
||||
<!-- S19 - Surface Fischerscope thickness PDF on the cert form -->
|
||||
<!-- ============================================================ -->
|
||||
<!-- Without this extension the operator has no way to know, -->
|
||||
<!-- before clicking Issue, whether the QC's Fischerscope PDF -->
|
||||
@@ -44,7 +44,7 @@
|
||||
</button>
|
||||
</xpath>
|
||||
|
||||
<!-- 2. Banner row above the title — explicit, can't miss. -->
|
||||
<!-- 2. Banner row above the title - explicit, can't miss. -->
|
||||
<!-- Three states with distinct alert classes. -->
|
||||
<xpath expr="//sheet/div[@class='oe_title']" position="before">
|
||||
<div class="alert alert-info" role="alert"
|
||||
@@ -61,7 +61,7 @@
|
||||
aria-label="Merged"/>
|
||||
<strong> Fischerscope thickness report merged.</strong>
|
||||
The issued CoC PDF includes the Fischerscope report
|
||||
as page 2 — open the Certificate PDF tab to verify.
|
||||
as page 2 - open the Certificate PDF tab to verify.
|
||||
</div>
|
||||
<div class="alert alert-warning" role="alert"
|
||||
invisible="state != 'draft' or x_fc_thickness_status != 'none' or not partner_id"
|
||||
@@ -76,14 +76,14 @@
|
||||
</div>
|
||||
</xpath>
|
||||
|
||||
<!-- 3. Thickness Report tab — single place to see/edit
|
||||
<!-- 3. Thickness Report tab - single place to see/edit
|
||||
every Fischerscope-related field on the cert.
|
||||
Reorganized 2026-05-21:
|
||||
* Status + linked QC at the top (read-only context)
|
||||
* XDAL 600 metadata (operator/product/etc.) editable
|
||||
so manager can correct OCR mistakes
|
||||
* Microscope image preview (auto-extracted from RTF
|
||||
or manually uploaded — either way editable here)
|
||||
or manually uploaded - either way editable here)
|
||||
* Source files (PDF / non-PDF evidence / source name)
|
||||
* Upload wizard button + help text -->
|
||||
<xpath expr="//notebook/page[@name='pdf']" position="after">
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<field name="inherit_id" ref="fusion_plating.view_fp_job_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//header" position="inside">
|
||||
<!-- Phase 1 — Tablet redesign. Opens the JobWorkspace OWL
|
||||
<!-- Phase 1 - Tablet redesign. Opens the JobWorkspace OWL
|
||||
client action focused on this WO. Primary entry point
|
||||
for techs before the Landing kanban (Phase 3) ships;
|
||||
stays as a back-office shortcut after. -->
|
||||
@@ -79,7 +79,7 @@
|
||||
help="Print Sticker"/>
|
||||
</xpath>
|
||||
|
||||
<!-- Sub 14 — Replace the generic Draft/Confirmed/In Progress/Done
|
||||
<!-- Sub 14 - Replace the generic Draft/Confirmed/In Progress/Done
|
||||
statusbar with the configurable workflow_state_id bar.
|
||||
Operators see meaningful plating milestones (Received,
|
||||
Inspected, Shipped, etc.) instead of generic Odoo states. -->
|
||||
@@ -92,7 +92,7 @@
|
||||
<!-- Surface part / coating / recipe on the header so the
|
||||
floor knows WHAT they're plating without diving into
|
||||
Source. The "Reference Product" line in core is just
|
||||
the FP-SERVICE stub from the SO — relabel it so it
|
||||
the FP-SERVICE stub from the SO - relabel it so it
|
||||
doesn't compete with the real part identification. -->
|
||||
<xpath expr="//field[@name='product_id']" position="attributes">
|
||||
<attribute name="string">Service Product</attribute>
|
||||
@@ -162,7 +162,7 @@
|
||||
title="Finish & Next" icon="fa-check-circle"
|
||||
class="btn-link o_fp_finish_btn"
|
||||
invisible="state != 'in_progress'"/>
|
||||
<!-- Reset / redo — back to Ready so the step can be
|
||||
<!-- Reset / redo - back to Ready so the step can be
|
||||
run again (mistake, accidental skip, customer
|
||||
redo). Clears finish + sign-off stamps; keeps the
|
||||
start audit + moves. Hidden on ready/pending. -->
|
||||
@@ -171,7 +171,7 @@
|
||||
class="btn-link text-warning"
|
||||
invisible="state in ('ready', 'pending')"/>
|
||||
|
||||
<!-- Secondary actions — small icons only. Pause is
|
||||
<!-- Secondary actions - small icons only. Pause is
|
||||
only relevant on a running step; Record Inputs
|
||||
stays available so operators can capture
|
||||
measurements without finishing the step;
|
||||
@@ -205,7 +205,7 @@
|
||||
</xpath>
|
||||
|
||||
<!-- New tabs in the notebook: Move Log + Time Logs.
|
||||
Both read-only — operators write via the wizards;
|
||||
Both read-only - operators write via the wizards;
|
||||
these tabs are the audit window. -->
|
||||
<xpath expr="//page[@name='source']" position="before">
|
||||
<page string="Move Log" name="move_log">
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
Copyright 2026 Nexa Systems Inc.
|
||||
License OPL-1 (Odoo Proprietary License v1.0)
|
||||
|
||||
Sub 12 Phase D — quality smart-button row on fp.job. The quality
|
||||
Sub 12 Phase D - quality smart-button row on fp.job. The quality
|
||||
fields (fp_qc_hold_count, fp_qc_check_count, fp_qc_ncr_count,
|
||||
fp_qc_capa_count, fp_qc_rma_count) are defined in fusion_plating_quality
|
||||
via _inherit on fp.job. The view lives here because the button_box
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
Read-only "Step Details" quick-look modal. Triggered by clicking a
|
||||
step's name in the embedded step list inside fp.job's form. Bound
|
||||
via context="{'form_view_ref': '...'}" on the parent — see
|
||||
via context="{'form_view_ref': '...'}" on the parent - see
|
||||
fp_job_form_inherit.xml. The standalone editable form view stays
|
||||
registered for the Job Steps menu / direct navigation.
|
||||
-->
|
||||
@@ -45,7 +45,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Job context — what job is this step part of, who's
|
||||
<!-- Job context - what job is this step part of, who's
|
||||
the customer, what part, how many. The single most
|
||||
useful thing to surface up top so the operator
|
||||
orients themselves before drilling in. -->
|
||||
@@ -65,10 +65,10 @@
|
||||
</group>
|
||||
</group>
|
||||
|
||||
<!-- Equipment / Schedule — only render when there's
|
||||
<!-- Equipment / Schedule - only render when there's
|
||||
actually something to show. An Inspection step with
|
||||
no tank / bath / time-budget shouldn't display
|
||||
four empty rows of "—" — that's misleading. -->
|
||||
four empty rows of "-" - that's misleading. -->
|
||||
<group invisible="not work_centre_id and not tank_id and not bath_id and not rack_id and not duration_expected and not duration_actual and not assigned_user_id">
|
||||
<group string="Equipment"
|
||||
invisible="not work_centre_id and not tank_id and not bath_id and not rack_id">
|
||||
@@ -98,10 +98,10 @@
|
||||
role="alert"
|
||||
invisible="quick_look_collect_master or not recipe_node_id">
|
||||
<i class="fa fa-exclamation-triangle"/>
|
||||
<strong> Master switch off</strong> — no values will be collected at runtime for this step.
|
||||
<strong> Master switch off</strong> - no values will be collected at runtime for this step.
|
||||
</div>
|
||||
|
||||
<!-- Operator Instructions — hide the whole section when
|
||||
<!-- Operator Instructions - hide the whole section when
|
||||
the recipe author didn't write any. -->
|
||||
<separator string="Operator Instructions"
|
||||
invisible="not quick_look_instructions"/>
|
||||
@@ -110,7 +110,7 @@
|
||||
<field name="quick_look_instructions" nolabel="1" readonly="1"/>
|
||||
</div>
|
||||
|
||||
<!-- Instruction images — visual reference photos /
|
||||
<!-- Instruction images - visual reference photos /
|
||||
screenshots the recipe author attached to the
|
||||
node. Hidden when none. -->
|
||||
<separator string="Reference Images"
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<field name="inherit_id" ref="fusion_plating_receiving.view_fp_receiving_form"/>
|
||||
<field name="arch" type="xml">
|
||||
|
||||
<!-- Work Order header button — only after receiving is
|
||||
<!-- Work Order header button - only after receiving is
|
||||
closed and while at least one job is still open. -->
|
||||
<xpath expr="//header" position="inside">
|
||||
<field name="x_fc_show_work_order_btn" invisible="1"/>
|
||||
@@ -25,17 +25,17 @@
|
||||
class="btn-primary" icon="fa-cogs"
|
||||
invisible="not x_fc_show_work_order_btn"
|
||||
help="Open the Work Order(s) for this receiving. Hidden automatically once every linked WO is marked Done."/>
|
||||
<!-- Print box stickers for this receiving's work order — one
|
||||
<!-- Print box stickers for this receiving's work order - one
|
||||
label per tracked box (external = customer copy, internal
|
||||
= shop copy with internal notes). Shown once a WO exists. -->
|
||||
<button name="action_print_external_sticker"
|
||||
string="External Sticker" type="object" icon="fa-print"
|
||||
invisible="x_fc_fp_job_count == 0"
|
||||
help="Print the customer (external) box sticker(s) — one per box."/>
|
||||
help="Print the customer (external) box sticker(s) - one per box."/>
|
||||
<button name="action_print_internal_sticker"
|
||||
string="Internal Sticker" type="object" icon="fa-print"
|
||||
invisible="x_fc_fp_job_count == 0"
|
||||
help="Print the shop (internal) box sticker(s) — same layout, internal notes."/>
|
||||
help="Print the shop (internal) box sticker(s) - same layout, internal notes."/>
|
||||
</xpath>
|
||||
|
||||
<!-- Work Order smart button on the button_box (mirrors the
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
Copyright 2026 Nexa Systems Inc.
|
||||
License OPL-1 (Odoo Proprietary License v1.0)
|
||||
|
||||
Phase 3 (Sub 11) — native Production Priorities kanban / list on
|
||||
Phase 3 (Sub 11) - native Production Priorities kanban / list on
|
||||
fp.job.step. Replaces the bridge_mrp version that bound to
|
||||
mrp.workorder. Same UX (drag-drop ordering across work centres,
|
||||
list with handle, badges by state).
|
||||
@@ -40,7 +40,7 @@
|
||||
<field name="assigned_user_id"/>
|
||||
</t>
|
||||
<t t-if="record.duration_actual.raw_value">
|
||||
— <field name="duration_actual" widget="float_time"/> elapsed
|
||||
- <field name="duration_actual" widget="float_time"/> elapsed
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<!--
|
||||
Copyright 2026 Nexa Systems Inc.
|
||||
License OPL-1 (Odoo Proprietary License v1.0)
|
||||
Sub 14 — Workflow state catalog UI (admin / Settings).
|
||||
Sub 14 - Workflow state catalog UI (admin / Settings).
|
||||
-->
|
||||
<odoo>
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
<field name="trigger_all_steps_done"/>
|
||||
</group>
|
||||
|
||||
<!-- Help block — full sheet width, alert-info card so
|
||||
<!-- Help block - full sheet width, alert-info card so
|
||||
the explanation is readable instead of squeezed
|
||||
into a 2-column form layout. -->
|
||||
<div class="alert alert-info mt-3" role="alert">
|
||||
@@ -105,7 +105,7 @@
|
||||
<field name="description" nolabel="1"
|
||||
placeholder="What this milestone represents and when it should fire..."/>
|
||||
</sheet>
|
||||
<!-- Chatter — adds activity log + message thread + followers
|
||||
<!-- Chatter - adds activity log + message thread + followers
|
||||
so admins can audit who changed which trigger and when. -->
|
||||
<chatter/>
|
||||
</form>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
Sequences fit between Tablet Station (10) and Bake Windows (20)
|
||||
in shopfloor's existing fp_menu.xml.
|
||||
|
||||
Renamed 2026-05-25 — "All Jobs" → "Work Orders" for consistency
|
||||
Renamed 2026-05-25 - "All Jobs" → "Work Orders" for consistency
|
||||
with the rest of the UI (SO smart button is "WO", tablet cards
|
||||
show "WO # 00001", KPI tile says "Work Orders"). xmlid kept
|
||||
as menu_fp_jobs_all_jobs so bookmarks and inherits don't break.
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
user to the group. -->
|
||||
|
||||
<!-- Reset group_ids on the shopfloor menus that used to be
|
||||
hidden — they are now the canonical UIs and should be visible
|
||||
hidden - they are now the canonical UIs and should be visible
|
||||
to all users (subject to the original groups= attribute on
|
||||
each menuitem in fusion_plating_shopfloor/views/fp_menu.xml). -->
|
||||
<record id="fusion_plating_shopfloor.menu_fp_shopfloor_manager" model="ir.ui.menu">
|
||||
@@ -20,7 +20,7 @@
|
||||
<field name="group_ids" eval="[(6, 0, [])]"/>
|
||||
</record>
|
||||
|
||||
<!-- Phase 3 tablet redesign (2026-05-22) — the standalone Plant
|
||||
<!-- Phase 3 tablet redesign (2026-05-22) - the standalone Plant
|
||||
Overview menu was superseded by the single Workstation entry.
|
||||
The original <delete> directive lived here; it was retired
|
||||
2026-05-25 because the menu row had been gone for weeks and the
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
</button>
|
||||
</xpath>
|
||||
|
||||
<!-- Work Order header action — appears once any linked
|
||||
<!-- Work Order header action - appears once any linked
|
||||
receiving is closed AND at least one WO is still open.
|
||||
Reuses the existing action_view_fp_jobs smart-button
|
||||
target so single-job SOs land on the form directly. -->
|
||||
@@ -53,9 +53,9 @@
|
||||
<!-- Quote ref: small grey "Originally quoted as Q202605-200"
|
||||
line under the SO name (the big SO-30000 heading). Only
|
||||
renders once the SO has been confirmed (quote_ref is set
|
||||
on create, parent_number is set on confirm — both
|
||||
on create, parent_number is set on confirm - both
|
||||
needed for the line to make sense).
|
||||
NB: Odoo 19 forbids t-if in standard form views — using
|
||||
NB: Odoo 19 forbids t-if in standard form views - using
|
||||
`invisible` attribute on the wrapper div instead. -->
|
||||
<xpath expr="//div[hasclass('oe_title')]" position="inside">
|
||||
<field name="x_fc_parent_number" invisible="1"/>
|
||||
|
||||
Reference in New Issue
Block a user