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:
@@ -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"
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 5–10 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>
|
||||
|
||||
@@ -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 & Fees on the
|
||||
Row 3 - Geometry on the LEFT, Delivery & 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.
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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. -->
|
||||
|
||||
Reference in New Issue
Block a user