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

@@ -31,7 +31,7 @@
sequence="5"
groups="fusion_plating.group_fp_sales_rep"/>
<!-- === New Quote top-of-menu entry point for a fresh quote === -->
<!-- === New Quote - top-of-menu entry point for a fresh quote === -->
<menuitem id="menu_fp_new_quote"
name="New Quote"
parent="menu_fp_sales"

View File

@@ -2,12 +2,12 @@
<odoo>
<!-- ============================================================
Express Orders form view (2026-05-26 rebuild #2)
Express Orders form view (2026-05-26 - rebuild #2)
Uses raw <div> + CSS Grid for the header to match the mockup's
4-column flat grid layout. Odoo's <group col="4"> renders as
an HTML table with broken cells when colspan + nested groups
are involved switching to manual divs.
are involved - switching to manual divs.
Same model (fp.direct.order.wizard) as the legacy view.
============================================================ -->
@@ -67,7 +67,7 @@
</div>
<!-- =========================================================
HEADER GRID pure CSS Grid (4 cols × 4 rows)
HEADER GRID - pure CSS Grid (4 cols × 4 rows)
========================================================= -->
<div class="o_fp_xpr_grid">
@@ -87,12 +87,12 @@
<!-- ============================================================
PO Block fills LEFT half (cols 1-2) across rows 2-7.
RIGHT half (cols 3-4) flows 6 pairs of fields
alongside it Customer Job #/Job Sorting, Material
alongside it - Customer Job #/Job Sorting, Material
Process/Lead Time, Payment Terms/Delivery Method,
Pricelist/Quote Validity, Blanket SO/Invoice Strategy,
Sales Rep/conditional Deposit-or-Progress %.
Net: PO block height matches 6 × ~60px right stack
Net: PO block height matches 6 × ~60px right stack -
no dead air on either side.
============================================================ -->
<div class="o_fp_xpr_cell span-2 row-span-6 o_fp_xpr_po_block">
@@ -221,11 +221,11 @@
</div>
<!-- =========================================================
ORDER LINES spreadsheet
ORDER LINES - spreadsheet
========================================================= -->
<div class="o_fp_xpr_section_title">Order Lines</div>
<!-- Legend bar like the mockup -->
<!-- Legend bar - like the mockup -->
<div class="o_fp_xpr_legend">
<span><strong>Mask ✓</strong> include all masking + de-masking recipe steps</span>
<span><strong>Bake pill</strong> click to type bake instruction (empty = skip bake)</span>
@@ -280,7 +280,7 @@
<field name="thickness_range" string="Thickness" placeholder=".0005-.0010" width="100px"/>
<field name="masking_enabled" string="Mask" widget="boolean_toggle" width="55px"/>
<field name="masking_attachment_ids" column_invisible="1"/>
<!-- Bake pill click to edit -->
<!-- Bake pill - click to edit -->
<field name="bake_instructions"
string="Bake"
widget="fp_express_bake_pill"
@@ -319,7 +319,7 @@
</field>
<!-- =========================================================
FOOTER GRID Notes/Terms left + Totals right
FOOTER GRID - Notes/Terms left + Totals right
========================================================= -->
<div class="o_fp_xpr_footer">
@@ -334,7 +334,7 @@
<div class="o_fp_xpr_card_title">Terms &amp; Conditions
<span class="o_fp_xpr_chip">PRINTS</span>
</div>
<div class="o_fp_xpr_card_sub">Customer-facing prints on quote / SO / invoice.</div>
<div class="o_fp_xpr_card_sub">Customer-facing - prints on quote / SO / invoice.</div>
<field name="terms_and_conditions" nolabel="1"
placeholder="Customer-facing terms..."/>
</div>

View File

@@ -171,7 +171,7 @@
icon="fa-list-alt"
class="btn-info ms-1"
invisible="not default_process_id"
help="Jump straight to the Simple Recipe Editor for the default variant flat 2-pane drag-drop layout."/>
help="Jump straight to the Simple Recipe Editor for the default variant - flat 2-pane drag-drop layout."/>
<button name="action_open_default_tree_editor" type="object"
string="Edit Default (Tree)"
icon="fa-sitemap"
@@ -181,10 +181,10 @@
</div>
<p class="text-muted mt-3">
The <strong>Compose</strong> button opens the Process Composer where you can add
multiple process <em>variants</em> for this part for example "Standard ENP",
multiple process <em>variants</em> for this part - for example "Standard ENP",
"Selective Masking", "Rework". One variant is flagged as default; estimators
may pick a different variant on a per-order basis. Each variant can be edited
in either the <strong>Tree</strong> or <strong>Simple</strong> view same data,
in either the <strong>Tree</strong> or <strong>Simple</strong> view - same data,
two layouts.
</p>
<field name="process_variant_ids" readonly="1">

View File

@@ -37,7 +37,7 @@
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. EN Mid-Phos Aluminium Commercial"/></h1>
<h1><field name="name" placeholder="e.g. EN Mid-Phos Aluminium - Commercial"/></h1>
</div>
<group string="Filters">
<group>

View File

@@ -5,7 +5,7 @@
Part of the Fusion Plating product family.
Separates shared recipe templates from part-scoped clones in the
backend so thousands of part clones don't bury the 510 real
backend so thousands of part clones don't bury the 5-10 real
templates in the main Recipes list.
* Narrow the existing Process Recipes action to templates only
@@ -85,7 +85,7 @@
<field name="context">{'default_node_type': 'recipe', 'search_default_recipes_only': 1, 'search_default_templates_only': 1}</field>
</record>
<!-- ========== NEW action Part Processes ========== -->
<!-- ========== NEW action - Part Processes ========== -->
<record id="action_fp_process_recipe_part_scoped"
model="ir.actions.act_window">
<field name="name">Part Processes</field>

View File

@@ -118,7 +118,7 @@
<!--
Single-column layout. The right-side 3D viewer +
Drawing preview were removed (commit pending) both
Drawing preview were removed (commit pending) - both
live behind the 3D Model / Drawings smart buttons at
the top of the form, plus inline "Preview" links
next to each respective field.
@@ -196,7 +196,7 @@
</group>
<!--
Row 2 Quantity / Options on the LEFT, Auto-from-3D on
Row 2 - Quantity / Options on the LEFT, Auto-from-3D on
the RIGHT (visible only when a part catalog is linked).
Quantity moved out of the RFQ/PO group so the right
column has a peer instead of stretching alone.
@@ -236,7 +236,7 @@
</div>
<!--
Row 3 Geometry on the LEFT, Delivery &amp; Fees on the
Row 3 - Geometry on the LEFT, Delivery &amp; Fees on the
RIGHT. Delivery/Fees used to live in its own row with
an empty right side; pairing it with Geometry keeps
both columns balanced.

View File

@@ -36,7 +36,7 @@
<sheet>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. ENP Standard Aluminium"/></h1>
<h1><field name="name" placeholder="e.g. ENP - Standard Aluminium"/></h1>
</div>
<group>
<group>
@@ -101,7 +101,7 @@
Create your first line description template
</p>
<p>
Save the language you use on repeat orders masking rules,
Save the language you use on repeat orders - masking rules,
spec callouts, packaging notes. The estimator picks one,
tweaks it, and it lands on the order line.
</p>

View File

@@ -4,7 +4,7 @@
License OPL-1 (Odoo Proprietary License v1.0)
Part of the Fusion Plating product family.
Phase 2 (2026-04-28) relocates the fp.serial views from
Phase 2 (2026-04-28) - relocates the fp.serial views from
fusion_plating_bridge_mrp (uninstalled in Sub 11) into configurator
where the model lives. Adds the new state machine to the form +
list with workflow buttons + status badge.

View File

@@ -6,7 +6,7 @@
-->
<odoo>
<!-- ===== Inherit SO Form add Plating tab ===== -->
<!-- ===== Inherit SO Form - add Plating tab ===== -->
<record id="view_sale_order_form_fp" model="ir.ui.view">
<field name="name">sale.order.form.fp.configurator</field>
<field name="model">sale.order</field>
@@ -14,7 +14,7 @@
<field name="arch" type="xml">
<!-- Header buttons: make draft Confirm the primary CTA, demote/rename
Send to "Send Email" (red), and reorder so Confirm sits first.
Phase D5 gate Confirm button to Sales Manager + higher; matches
Phase D5 - gate Confirm button to Sales Manager + higher; matches
the model-level gate from Phase G so Sales Rep sees the SO in
draft but no Confirm button. -->
<xpath expr="//header/button[@name='action_confirm' and not(@id)]" position="attributes">
@@ -78,13 +78,13 @@
</button>
</xpath>
<!-- Sub 11 MRP gone. The "Work Orders" button used to count
<!-- Sub 11 - MRP gone. The "Work Orders" button used to count
mrp.workorder; removed because Plating Jobs (added by
fusion_plating_jobs) now counts the canonical fp.job.step
rows. NCRs surfaces only when there's at least one open;
BOM Items and By Job Group only when the SO is actually
multi-part / tagged (otherwise both render one column with
one card pure noise). Anchored after Transfers; the two
one card - pure noise). Anchored after Transfers; the two
conditional ones go last so the typical clean SO shows
just the meaningful buttons up front. -->
<xpath expr="//button[@name='action_view_pickings']" position="after">
@@ -123,7 +123,7 @@
<!-- Surface Delivery Date (commitment_date) right after Order
Date in the header info group. The standard view only
shows it buried under the Delivery section in the Other
Info tab having it at the top keeps it visible without
Info tab - having it at the top keeps it visible without
scrolling, since most operators are setting it on every
order. The same field is also surfaced lower in our
Plating tab Scheduling group as "Customer Deadline"; both
@@ -133,7 +133,7 @@
readonly="state in ('cancel',)"/>
</xpath>
<!-- Job Sorting sits right under Payment Terms a free-form
<!-- Job Sorting sits right under Payment Terms - a free-form
bucket that groups the SO in the "Sale Orders by Sorting"
list. Quick-create from the dropdown. -->
<xpath expr="//group[@name='order_details']/field[@name='payment_term_id']" position="after">
@@ -150,7 +150,7 @@
without scrolling pricing columns. The pre-Sub-12 SO-
header singletons (x_fc_part_catalog_id /
x_fc_customer_spec_id) only ever populated when the
order was built via the quote configurator they're
order was built via the quote configurator - they're
silent on direct orders, which is why they appeared
empty after confirm. They still exist on the model
(used by configurator/portal) but are no longer the
@@ -174,7 +174,7 @@
string="Job #"/>
</list>
</field>
<!-- Row 1: RFQ/PO (left) + Scheduling (right) pairs the two
<!-- Row 1: RFQ/PO (left) + Scheduling (right) - pairs the two
tallest groups so neither column dangles empty. -->
<group>
<group string="RFQ / PO">
@@ -250,7 +250,7 @@
</group>
</group>
<!-- Row 3: Customer Reference + Margin both short groups, so
<!-- Row 3: Customer Reference + Margin - both short groups, so
pairing them keeps the right column from going blank. -->
<group>
<group string="Customer Reference">
@@ -263,7 +263,7 @@
invisible="x_fc_margin_available"
class="text-muted">
<i class="fa fa-info-circle me-1"/>
Margin n/a coating cost rollup not yet
Margin n/a - coating cost rollup not yet
populated on any line's treatment.
</div>
<field name="x_fc_margin_amount"
@@ -277,7 +277,7 @@
</group>
</group>
<!-- Row 4: Notes two side-by-side textareas instead of the
<!-- Row 4: Notes - two side-by-side textareas instead of the
previous broken separator-in-group layout. -->
<group>
<group string="Internal Notes">
@@ -290,7 +290,7 @@
</group>
</group>
<!-- Legacy configurator block invisible on new SOs (only
<!-- Legacy configurator block - invisible on new SOs (only
the handful that came through the old quote configurator
flow have x_fc_configurator_id set). Kept at the bottom
so it doesn't waste vertical space on the common case. -->
@@ -369,8 +369,8 @@
<field name="x_fc_rush_order" optional="hide"/>
</xpath>
<!-- Phase D5 gate pricing columns/totals to Sales Rep + higher
(defense in depth Technician/Shop Manager don't see pricing
<!-- Phase D5 - gate pricing columns/totals to Sales Rep + higher
(defense in depth - Technician/Shop Manager don't see pricing
even if they navigate to an SO). -->
<xpath expr="//field[@name='order_line']/list/field[@name='price_unit']" position="attributes">
<attribute name="groups">fusion_plating.group_fp_sales_rep</attribute>
@@ -434,7 +434,7 @@
decoration-success="x_fc_deadline_urgency == 'safe'"/>
<field name="x_fc_wo_completion" optional="show"/>
<field name="x_fc_planned_start_date" optional="hide"/>
<!-- "Part" column walks order_line.x_fc_part_catalog_id
<!-- "Part" column - walks order_line.x_fc_part_catalog_id
and shows a compact summary (e.g. "M1234, M5678
(+3 more)"). The header x_fc_part_catalog_id field
is rarely populated in the configurator flow; the
@@ -453,7 +453,7 @@
<field name="x_fc_is_blanket_order" optional="hide"/>
<!-- Single Job Status pill. Renders as HTML with a
per-kind class (.fp-kind-*) so every phase carries
its own distinct tint see
its own distinct tint - see
static/src/scss/fp_job_status_pill.scss. -->
<field name="x_fc_fp_job_status" widget="html"
string="Job Status" optional="show"
@@ -470,7 +470,7 @@
</field>
</record>
<!-- ===== BOM Items view (lines grouped by part) Phase D2 ===== -->
<!-- ===== BOM Items view (lines grouped by part) - Phase D2 ===== -->
<record id="view_sale_order_line_bom_kanban" model="ir.ui.view">
<field name="name">sale.order.line.bom.kanban</field>
<field name="model">sale.order.line</field>
@@ -504,7 +504,7 @@
</field>
</record>
<!-- ===== WO-perspective view: lines grouped by WO tag Phase D10 ===== -->
<!-- ===== WO-perspective view: lines grouped by WO tag - Phase D10 ===== -->
<record id="view_sale_order_line_wo_kanban" model="ir.ui.view">
<field name="name">sale.order.line.wo.kanban</field>
<field name="model">sale.order.line</field>
@@ -635,7 +635,7 @@
</field>
</record>
<!-- ===== Window Action Quotations (for Fusion Plating menu) ===== -->
<!-- ===== Window Action - Quotations (for Fusion Plating menu) ===== -->
<record id="action_fp_quotations" model="ir.actions.act_window">
<field name="name">Quotations</field>
<field name="res_model">sale.order</field>
@@ -653,7 +653,7 @@
</field>
</record>
<!-- ===== Window Action Confirmed Sale Orders =====
<!-- ===== Window Action - Confirmed Sale Orders =====
The kanban view_mode + kanban view_id are appended in
fp_so_job_sort_views.xml after the kanban view is defined, so
we don't hit a missing-ref at module load. -->