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:
@@ -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">
|
||||
|
||||
@@ -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 & Submit">
|
||||
<template id="portal_configurator_step3" name="Configurator Step 3 - Estimate & 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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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') + '&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="">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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 & 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"/>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
Reference in New Issue
Block a user