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

@@ -137,7 +137,7 @@
t-if="pager and pager.get('page_count', 0) > 1">
<div class="text-muted small">
Showing
<t t-out="pager['offset'] + 1"/><t t-out="min(pager['offset'] + 10, total)"/>
<t t-out="pager['offset'] + 1"/>-<t t-out="min(pager['offset'] + 10, total)"/>
of <t t-out="total"/>
</div>
<ul class="pagination mb-0">

View File

@@ -108,9 +108,9 @@
</template>
<!-- ================================================================== -->
<!-- STEP 1 Upload Part / Manual Measurements -->
<!-- STEP 1 - Upload Part / Manual Measurements -->
<!-- ================================================================== -->
<template id="portal_configurator_step1" name="Configurator Step 1 Upload Part">
<template id="portal_configurator_step1" name="Configurator Step 1 - Upload Part">
<t t-call="portal.portal_layout">
<div class="o_fp_portal_form mt-3" style="max-width: 720px; margin: 0 auto;">
@@ -156,10 +156,10 @@
</select>
</div>
<!-- File Uploads separate drawing + 3D model.
<!-- File Uploads - separate drawing + 3D model.
Customer can upload either or both. STL gets
trimesh surface-area auto-calc server-side
(not shown to customer backend uses it for
(not shown to customer - backend uses it for
future pricing). -->
<div class="row">
<div class="col-md-6 mb-4">
@@ -181,7 +181,7 @@
<i class="fa fa-cube"/>
<p class="mb-1 fw-semibold">STL / STP / STEP / IGES</p>
<p class="small text-muted mb-2">
Optional speeds up estimation
Optional - speeds up estimation
</p>
<input type="file" name="part_3d_model" id="part_3d_model"
class="form-control"
@@ -191,7 +191,7 @@
</div>
<!-- Manual measurements hidden per customer-feedback 2026-05-17:
backend computes these (or doesn't) not the
backend computes these (or doesn't) - not the
customer's job. Fields kept as hidden inputs at 0
so the controller doesn't error on missing keys. -->
<input type="hidden" name="geometry_source" value="upload"/>
@@ -219,9 +219,9 @@
</template>
<!-- ================================================================== -->
<!-- STEP 2 Select Coating Configuration -->
<!-- STEP 2 - Select Coating Configuration -->
<!-- ================================================================== -->
<template id="portal_configurator_step2" name="Configurator Step 2 Select Coating">
<template id="portal_configurator_step2" name="Configurator Step 2 - Select Coating">
<t t-call="portal.portal_layout">
<div class="o_fp_portal_form mt-3" style="max-width: 900px; margin: 0 auto;">
@@ -319,9 +319,9 @@
</template>
<!-- ================================================================== -->
<!-- STEP 3 Estimate & Submit -->
<!-- STEP 3 - Estimate & Submit -->
<!-- ================================================================== -->
<template id="portal_configurator_step3" name="Configurator Step 3 Estimate &amp; Submit">
<template id="portal_configurator_step3" name="Configurator Step 3 - Estimate &amp; Submit">
<t t-call="portal.portal_layout">
<div class="o_fp_portal_form mt-3" style="max-width: 720px; margin: 0 auto;">
@@ -455,7 +455,7 @@
<!-- ================================================================== -->
<!-- SUCCESS PAGE -->
<!-- ================================================================== -->
<template id="portal_configurator_success" name="Configurator Quote Submitted">
<template id="portal_configurator_success" name="Configurator - Quote Submitted">
<t t-call="portal.portal_layout">
<div class="o_fp_portal_form mt-3" style="max-width: 600px; margin: 0 auto;">
<div class="card text-center py-5">

View File

@@ -7,7 +7,7 @@
<odoo>
<!-- ================================================================== -->
<!-- Portal Home Dashboard jobs-forward layout (v19.0.3.1.0 redesign) -->
<!-- Portal Home Dashboard - jobs-forward layout (v19.0.3.1.0 redesign) -->
<!-- ================================================================== -->
<template id="fp_portal_home_dashboard" name="Plating Portal Dashboard">
<t t-call="portal.portal_layout">

View File

@@ -9,7 +9,7 @@
<odoo>
<!-- ================================================================== -->
<!-- Status badge pass state (string) and label (string) -->
<!-- Status badge - pass state (string) and label (string) -->
<!-- ================================================================== -->
<template id="fp_portal_status_badge" name="Portal: Status Badge">
<span t-attf-class="o_fp_badge o_fp_badge_#{state}">
@@ -19,7 +19,7 @@
</template>
<!-- ================================================================== -->
<!-- Numbered horizontal stepper pass `steps` list of dicts: -->
<!-- Numbered horizontal stepper - pass `steps` list of dicts: -->
<!-- {label, status: 'done'|'active'|'pending', time_label} -->
<!-- active_state: 'normal' (teal) or 'warn' (amber) -->
<!-- ================================================================== -->
@@ -30,7 +30,7 @@
<!-- Unit = circle + its label stacked. Label is absolutely
positioned below the circle (in SCSS) so its horizontal
centre lines up with the circle no matter how wide the
text is fixes the column-vs-edge distribution
text is - fixes the column-vs-edge distribution
mismatch we had with a separate labels row. -->
<div class="o_fp_step_unit">
<div t-attf-class="o_fp_step_circle #{
@@ -61,7 +61,7 @@
</template>
<!-- ================================================================== -->
<!-- Doc chip (compact) pass doc dict {icon, label, url, pending} -->
<!-- Doc chip (compact) - pass doc dict {icon, label, url, pending} -->
<!-- ================================================================== -->
<template id="fp_portal_doc_chip" name="Portal: Doc Chip">
<t t-if="doc.get('pending')">
@@ -79,7 +79,7 @@
</template>
<!-- ================================================================== -->
<!-- Job card shared between /my/home dashboard and /my/jobs list. -->
<!-- Job card - shared between /my/home dashboard and /my/jobs list. -->
<!-- Pass `job` (fusion.plating.portal.job). Renders a wrap div with -->
<!-- inner anchor (whole card click target = detail page) and a sibling -->
<!-- actions footer (doc download chips + Repeat Order form). Forms -->
@@ -228,7 +228,7 @@
</t>
</div>
<!-- Search input real-time client-side filtering, no submit -->
<!-- Search input - real-time client-side filtering, no submit -->
<div class="ms-auto d-flex align-items-center gap-2"
t-att-style="'flex: 1 1 auto; max-width: 360px;' + ('' if filters else 'margin-left: 0 !important')">
<input type="search"
@@ -239,7 +239,7 @@
autocomplete="off"/>
</div>
<!-- Sort dropdown navigates on change (wired by fp_portal_list_search.js) -->
<!-- Sort dropdown - navigates on change (wired by fp_portal_list_search.js) -->
<select class="form-select form-select-sm o_fp_sort_select" style="max-width: 180px" t-if="sorts">
<t t-foreach="sorts" t-as="s">
<option t-att-value="url + '?filter_state=' + (active_filter or 'all') + '&amp;sortby=' + s[0] + (extra_qs or '')"
@@ -250,14 +250,14 @@
</div>
<!-- Clip notice: shown server-side when >500 records were found -->
<div class="o_fp_list_search_meta small text-muted mb-2" t-if="clipped">
Showing latest 500 of <span t-out="result_total"/> refine your filter to narrow further.
Showing latest 500 of <span t-out="result_total"/> - refine your filter to narrow further.
</div>
<!-- Live count: shown by JS while the user is typing in the search box -->
<div class="o_fp_list_search_count small text-muted mb-2 d-none"/>
</template>
<!-- ================================================================== -->
<!-- Doc group (detail page) pass label + docs list of dicts: -->
<!-- Doc group (detail page) - pass label + docs list of dicts: -->
<!-- {label, sub, url, icon_class, pending} -->
<!-- ================================================================== -->
<template id="fp_portal_doc_group" name="Portal: Doc Group">
@@ -271,7 +271,7 @@
<div class="o_fp_doc_name" t-out="doc['label']"/>
<div class="o_fp_doc_sub" t-out="doc.get('sub') or ''"/>
</div>
<span style="color: #cbd5e1; font-size: .72rem"></span>
<span style="color: #cbd5e1; font-size: .72rem">-</span>
</div>
</t>
<t t-else="">

View File

@@ -36,7 +36,7 @@
<!-- Inherit portal.portal_layout to wrap content in sidebar shell -->
<!-- ================================================================== -->
<template id="fp_portal_shell"
name="FP Portal Shell Sidebar Wrap"
name="FP Portal Shell - Sidebar Wrap"
inherit_id="portal.portal_layout"
priority="50">
<!-- Force Odoo's outer breadcrumb container to render even when a page
@@ -72,14 +72,14 @@
<!-- Sidebar navigation component -->
<t t-call="fusion_plating_portal.fp_portal_sidebar"/>
</t>
<!-- Main content area original #wrap re-emitted here via $0 -->
<!-- Main content area - original #wrap re-emitted here via $0 -->
<main class="o_fp_portal_main">$0</main>
</div>
</xpath>
</template>
<!-- ================================================================== -->
<!-- Sidebar template rendered by fp_portal_shell -->
<!-- Sidebar template - rendered by fp_portal_shell -->
<!-- ================================================================== -->
<template id="fp_portal_sidebar" name="FP Portal Sidebar">
<aside class="o_fp_portal_sidebar">

View File

@@ -7,7 +7,7 @@
<odoo>
<!-- ================================================================== -->
<!-- QUOTE REQUESTS list with filter pills + real-time search -->
<!-- QUOTE REQUESTS - list with filter pills + real-time search -->
<!-- ================================================================== -->
<template id="portal_my_quote_requests" name="My Quote Requests">
<t t-call="portal.portal_layout">
@@ -94,7 +94,7 @@
</template>
<!-- ================================================================== -->
<!-- QUOTE REQUEST detail -->
<!-- QUOTE REQUEST - detail -->
<!-- ================================================================== -->
<template id="portal_my_quote_request" name="My Quote Request">
<t t-call="portal.portal_layout">
@@ -250,7 +250,7 @@
</template>
<!-- ================================================================== -->
<!-- QUOTE REQUEST new form (enhanced with multi-part, addresses) -->
<!-- QUOTE REQUEST - new form (enhanced with multi-part, addresses) -->
<!-- ================================================================== -->
<template id="portal_new_quote_request_form" name="New Quote Request">
<t t-call="portal.portal_layout">
@@ -431,7 +431,7 @@
</template>
<!-- ================================================================== -->
<!-- JOBS list with filter pills + real-time search (cards layout) -->
<!-- JOBS - list with filter pills + real-time search (cards layout) -->
<!-- ================================================================== -->
<template id="portal_my_jobs" name="My Work Orders">
<t t-call="portal.portal_layout">
@@ -493,7 +493,7 @@
</template>
<!-- ================================================================== -->
<!-- JOB detail -->
<!-- JOB - detail -->
<!-- ================================================================== -->
<template id="portal_my_job" name="My Work Order">
<t t-call="portal.portal_layout">
@@ -677,7 +677,7 @@
</template>
<!-- ================================================================== -->
<!-- DELIVERIES / PACKING SLIPS list with search + sort -->
<!-- DELIVERIES / PACKING SLIPS - list with search + sort -->
<!-- ================================================================== -->
<template id="portal_my_deliveries" name="My Deliveries">
<t t-call="portal.portal_layout">
@@ -685,7 +685,7 @@
<t t-set="title">Packing Slips / Deliveries</t>
</t>
<!-- Search + sort strip (no filter pills all rows are delivered) -->
<!-- Search + sort strip (no filter pills - all rows are delivered) -->
<t t-call="fusion_plating_portal.fp_portal_list_controls">
<t t-set="filters" t-value="filters"/>
<t t-set="active_filter" t-value="filter_state"/>
@@ -743,7 +743,7 @@
</template>
<!-- ================================================================== -->
<!-- CERTIFICATIONS list with search + sort -->
<!-- CERTIFICATIONS - list with search + sort -->
<!-- ================================================================== -->
<template id="portal_my_certifications" name="My Certifications">
<t t-call="portal.portal_layout">
@@ -751,7 +751,7 @@
<t t-set="title">Certifications &amp; Quality</t>
</t>
<!-- Search + sort strip (no filter pills all certs are terminal) -->
<!-- Search + sort strip (no filter pills - all certs are terminal) -->
<t t-call="fusion_plating_portal.fp_portal_list_controls">
<t t-set="filters" t-value="filters"/>
<t t-set="active_filter" t-value="filter_state"/>

View File

@@ -7,7 +7,7 @@
<odoo>
<!-- ================================================================== -->
<!-- Quote Request list -->
<!-- Quote Request - list -->
<!-- ================================================================== -->
<record id="view_fp_quote_request_list" model="ir.ui.view">
<field name="name">fp.quote.request.list</field>
@@ -39,7 +39,7 @@
</record>
<!-- ================================================================== -->
<!-- Quote Request form -->
<!-- Quote Request - form -->
<!-- ================================================================== -->
<record id="view_fp_quote_request_form" model="ir.ui.view">
<field name="name">fp.quote.request.form</field>
@@ -136,7 +136,7 @@
</record>
<!-- ================================================================== -->
<!-- Quote Request search -->
<!-- Quote Request - search -->
<!-- ================================================================== -->
<record id="view_fp_quote_request_search" model="ir.ui.view">
<field name="name">fp.quote.request.search</field>
@@ -162,7 +162,7 @@
</record>
<!-- ================================================================== -->
<!-- Quote Request action -->
<!-- Quote Request - action -->
<!-- ================================================================== -->
<record id="action_fp_quote_request" model="ir.actions.act_window">
<field name="name">Quote Requests</field>
@@ -182,7 +182,7 @@
</record>
<!-- ================================================================== -->
<!-- Portal Job list -->
<!-- Portal Job - list -->
<!-- ================================================================== -->
<record id="view_fp_portal_job_list" model="ir.ui.view">
<field name="name">fp.portal.job.list</field>
@@ -207,7 +207,7 @@
</record>
<!-- ================================================================== -->
<!-- Portal Job form -->
<!-- Portal Job - form -->
<!-- ================================================================== -->
<record id="view_fp_portal_job_form" model="ir.ui.view">
<field name="name">fp.portal.job.form</field>
@@ -256,7 +256,7 @@
</record>
<!-- ================================================================== -->
<!-- Portal Job search -->
<!-- Portal Job - search -->
<!-- ================================================================== -->
<record id="view_fp_portal_job_search" model="ir.ui.view">
<field name="name">fp.portal.job.search</field>
@@ -283,7 +283,7 @@
</record>
<!-- ================================================================== -->
<!-- Portal Job action -->
<!-- Portal Job - action -->
<!-- ================================================================== -->
<record id="action_fp_portal_job" model="ir.actions.act_window">
<field name="name">Work Orders</field>
@@ -293,7 +293,7 @@
</record>
<!-- ================================================================== -->
<!-- res.partner extend form to surface portal flag + counts -->
<!-- res.partner - extend form to surface portal flag + counts -->
<!-- ================================================================== -->
<record id="view_partner_form_fp_portal" model="ir.ui.view">
<field name="name">res.partner.form.fp.portal</field>

View File

@@ -7,7 +7,7 @@
Adds a leading "Part #" column to the customer portal's Sales Order
products table. Reads sale.order.line.x_fc_part_catalog_id.part_number
(defined in fusion_plating_configurator). The existing second column
keeps line.name the customer-facing description.
keeps line.name - the customer-facing description.
Layout after this inherit:
| Part # | Description | Quantity | Unit Price | [Disc] | [Taxes] | Amount |
@@ -15,7 +15,7 @@
<odoo>
<!-- ================================================================== -->
<!-- /my/orders inject filter strip + data-fp-filterable before the -->
<!-- /my/orders - inject filter strip + data-fp-filterable before the -->
<!-- Odoo portal table so real-time search works client-side. -->
<!-- Sort dropdown reuses Odoo's existing sortby param; filter pills -->
<!-- link to URL params that Odoo's stock route honours natively. -->
@@ -26,7 +26,7 @@
<!-- Inject the controls strip right after the portal_searchbar call
and before the "no orders" alert / portal_table. The anchor is
the <div t-if="not orders"> alert we inject before it. -->
the <div t-if="not orders"> alert - we inject before it. -->
<xpath expr="//div[@t-if='not orders']" position="before">
<t t-call="fusion_plating_portal.fp_portal_list_controls">
<t t-set="filters" t-value="False"/>