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:
@@ -2,7 +2,7 @@
|
||||
# Copyright 2026 Nexa Systems Inc.
|
||||
# License OPL-1 (Odoo Proprietary License v1.0)
|
||||
# Part of the Fusion Plating product family.
|
||||
"""Operator proficiency tracker — counts successful WO completions per
|
||||
"""Operator proficiency tracker - counts successful WO completions per
|
||||
(employee, role) pair and auto-promotes the employee once the role's
|
||||
mastery threshold is crossed.
|
||||
|
||||
@@ -20,7 +20,7 @@ from odoo import _, api, fields, models
|
||||
|
||||
class FpOperatorProficiency(models.Model):
|
||||
_name = 'fp.operator.proficiency'
|
||||
_description = 'Fusion Plating — Operator Task Proficiency'
|
||||
_description = 'Fusion Plating - Operator Task Proficiency'
|
||||
_rec_name = 'display_name'
|
||||
_order = 'employee_id, role_id'
|
||||
|
||||
@@ -52,7 +52,7 @@ class FpOperatorProficiency(models.Model):
|
||||
index=True,
|
||||
help='True once the role has been added to the operator\'s Shop '
|
||||
'Roles automatically. Stays True even if a manager removes '
|
||||
'the role afterwards — the count and promotion history are '
|
||||
'the role afterwards - the count and promotion history are '
|
||||
'preserved as a training record.',
|
||||
)
|
||||
promoted_at = fields.Datetime(
|
||||
@@ -80,7 +80,7 @@ class FpOperatorProficiency(models.Model):
|
||||
def _compute_display_name(self):
|
||||
for rec in self:
|
||||
rec.display_name = (
|
||||
f'{rec.employee_id.name or "?"} — {rec.role_id.name or "?"}'
|
||||
f'{rec.employee_id.name or "?"} - {rec.role_id.name or "?"}'
|
||||
)
|
||||
|
||||
@api.depends('completed_count', 'role_id.mastery_required')
|
||||
@@ -99,7 +99,7 @@ class FpOperatorProficiency(models.Model):
|
||||
def _record_completion(self, employee, role):
|
||||
"""Increment the (employee, role) tally and promote if at threshold.
|
||||
|
||||
Idempotent for the (employee, role) pair — if no record exists,
|
||||
Idempotent for the (employee, role) pair - if no record exists,
|
||||
we create one. Always uses sudo() because the worker may not
|
||||
have write access to their own profile.
|
||||
"""
|
||||
@@ -163,7 +163,7 @@ class FpOperatorProficiency(models.Model):
|
||||
})
|
||||
employee.message_post(
|
||||
body=Markup(_(
|
||||
'🎉 <b>%(name)s promoted</b> — qualified for '
|
||||
'🎉 <b>%(name)s promoted</b> - qualified for '
|
||||
'<b>%(role)s</b> after %(count)s successful '
|
||||
'completions.'
|
||||
)) % {
|
||||
|
||||
Reference in New Issue
Block a user