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:
@@ -90,7 +90,7 @@ class FpQcController(http.Controller):
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# GET state — OWL calls this on mount + after every action
|
||||
# GET state - OWL calls this on mount + after every action
|
||||
# ------------------------------------------------------------------
|
||||
@http.route(
|
||||
'/fp/qc/get', type='jsonrpc', auth='user', methods=['POST'],
|
||||
@@ -135,7 +135,7 @@ class FpQcController(http.Controller):
|
||||
if check.state == 'draft':
|
||||
check.action_start()
|
||||
|
||||
# Numeric value handling — write before action to let
|
||||
# Numeric value handling - write before action to let
|
||||
# _compute_value_in_range update the record.
|
||||
vals = {}
|
||||
if value is not None and line.requires_value:
|
||||
|
||||
@@ -22,7 +22,7 @@ from odoo.http import request
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# Canonical section order — drives sections[] in the response.
|
||||
# Canonical section order - drives sections[] in the response.
|
||||
# Sections whose model isn't installed are omitted (no error).
|
||||
SECTION_ORDER = ['cert', 'hold', 'ncr', 'rma', 'capa', 'check']
|
||||
|
||||
@@ -50,7 +50,7 @@ TYPE_CONFIG = {
|
||||
}
|
||||
|
||||
|
||||
# Per-type "overdue" thresholds (reused from the old counts endpoint —
|
||||
# Per-type "overdue" thresholds (reused from the old counts endpoint -
|
||||
# battle-tested). CAPA branches on due_date < today via use_due_date.
|
||||
OVERDUE_THRESHOLDS = {
|
||||
'cert': {'days': 1, 'use_due_date': False,
|
||||
@@ -152,7 +152,7 @@ class FpQualityDashboardSnapshot:
|
||||
Returns list of item dicts in the snapshot shape.
|
||||
"""
|
||||
state_dom = list(OVERDUE_THRESHOLDS[type_code]['state_domain'])
|
||||
# We need urgency labels per record — fetch open set, sort in
|
||||
# We need urgency labels per record - fetch open set, sort in
|
||||
# Python by (overdue_flag, age) so the top-N reflects urgency.
|
||||
recs = Model.search(state_dom, limit=200) # safety cap
|
||||
if not recs:
|
||||
@@ -169,7 +169,7 @@ class FpQualityDashboardSnapshot:
|
||||
for r in top]
|
||||
|
||||
def _overdue_ids(self, type_code, Model):
|
||||
"""IDs of overdue records for the type — reuses _overdue_count
|
||||
"""IDs of overdue records for the type - reuses _overdue_count
|
||||
domain logic."""
|
||||
cfg = OVERDUE_THRESHOLDS[type_code]
|
||||
dom = list(cfg['state_domain'])
|
||||
@@ -184,7 +184,7 @@ class FpQualityDashboardSnapshot:
|
||||
def _build_item(self, type_code, rec, is_overdue):
|
||||
"""Shape one record into the snapshot item dict."""
|
||||
cfg = TYPE_CONFIG[type_code]
|
||||
# Customer name — partner_id direct, OR via job_id for check
|
||||
# Customer name - partner_id direct, OR via job_id for check
|
||||
partner = self._resolve_partner(rec)
|
||||
return {
|
||||
'id': rec.id,
|
||||
@@ -215,7 +215,7 @@ class FpQualityDashboardSnapshot:
|
||||
def _build_subtitle(self, type_code, rec, is_overdue):
|
||||
"""Second-line text per type. Implementation-phase choice
|
||||
per spec open question 1."""
|
||||
# Age in human terms — hours if < 24h, days otherwise
|
||||
# Age in human terms - hours if < 24h, days otherwise
|
||||
if rec.create_date:
|
||||
age = self.now - rec.create_date
|
||||
hours = int(age.total_seconds() / 3600)
|
||||
@@ -232,7 +232,7 @@ class FpQualityDashboardSnapshot:
|
||||
def _fetch_banner_candidates(self, type_code, Model):
|
||||
"""Per-type pull of records that qualify for the banner:
|
||||
(overdue) OR (critical-customer AND state-is-open). Returns
|
||||
list of (rec, urgency, critical_badge) tuples — deduped.
|
||||
list of (rec, urgency, critical_badge) tuples - deduped.
|
||||
"""
|
||||
overdue_ids = set(self._overdue_ids(type_code, Model))
|
||||
critical_ids = set(self._critical_customer_ids(type_code, Model))
|
||||
@@ -281,7 +281,7 @@ class FpQualityDashboardSnapshot:
|
||||
if not critical_partner_ids:
|
||||
return []
|
||||
partner_path = partner_field_map.get(type_code, 'partner_id')
|
||||
# Compose the record-side filter — direct or via dotted path
|
||||
# Compose the record-side filter - direct or via dotted path
|
||||
dom = list(OVERDUE_THRESHOLDS[type_code]['state_domain'])
|
||||
dom.append((partner_path, 'in', critical_partner_ids))
|
||||
try:
|
||||
@@ -303,7 +303,7 @@ class FpQualityDashboardSnapshot:
|
||||
return 'RUSH'
|
||||
if 'x_fc_vip' in partner._fields and getattr(partner, 'x_fc_vip', False):
|
||||
return 'VIP'
|
||||
# Aerospace — check part name OR spec code if reachable
|
||||
# Aerospace - check part name OR spec code if reachable
|
||||
for path in ('part_catalog_id.name', 'customer_spec_id.code'):
|
||||
head, _, attr = path.partition('.')
|
||||
if head in rec._fields and rec[head] \
|
||||
|
||||
Reference in New Issue
Block a user