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

@@ -3,14 +3,14 @@
# License OPL-1 (Odoo Proprietary License v1.0)
# Part of the Fusion Plating product family.
#
# Phase 1 (Sub 11) relocated from fusion_plating_bridge_mrp.
# Phase 1 (Sub 11) - relocated from fusion_plating_bridge_mrp.
# Now binds to fp.job (native) instead of mrp.production.
"""Per-job QC instance.
When a plating job confirms and the customer requires QC, we clone
the active checklist template into a `fusion.plating.quality.check`
with one line per template line. The inspector picks it up on the
tablet, walks the checks, and signs off which unblocks the job's
tablet, walks the checks, and signs off - which unblocks the job's
`button_mark_done`.
The QC also owns the Fischerscope / XDAL 600 thickness report PDF.
@@ -33,7 +33,7 @@ _logger = logging.getLogger(__name__)
class FpQualityCheck(models.Model):
_name = 'fusion.plating.quality.check'
_description = 'Fusion Plating Quality Check'
_description = 'Fusion Plating - Quality Check'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'create_date desc'
@@ -71,7 +71,7 @@ class FpQualityCheck(models.Model):
overall_result = fields.Selection(
[('pass', 'Pass'), ('fail', 'Fail'), ('partial', 'Partial Pass')],
string='Result', tracking=True,
help='Summary outcome set when inspector signs off.',
help='Summary outcome - set when inspector signs off.',
)
line_ids = fields.One2many(
'fusion.plating.quality.check.line', 'check_id',
@@ -207,7 +207,7 @@ class FpQualityCheck(models.Model):
'result': 'pending',
})
job.message_post(
body=_('QC checklist "%s" created %d items to inspect.') % (
body=_('QC checklist "%s" created - %d items to inspect.') % (
template.name, len(template.line_ids),
),
)
@@ -233,16 +233,16 @@ class FpQualityCheck(models.Model):
'inspector_id': self.env.user.id,
})
rec.message_post(body=Markup(
'<b>QC PASSED</b> inspector %s.'
'<b>QC PASSED</b> - inspector %s.'
) % self.env.user.name)
def action_fail(self):
"""Mark QC failed AND auto-spawn a fusion.plating.quality.hold
so the parts have an AS9100 disposition record. Without this
spawning the parts are in limbo operator can't ship and
spawning the parts are in limbo - operator can't ship and
nothing tracks scrap/rework/use-as-is decisions.
v19.0.4.x Hold auto-spawn added per the tablet usability pass.
v19.0.4.x - Hold auto-spawn added per the tablet usability pass.
"""
Hold = self.env.get('fusion.plating.quality.hold')
for rec in self:
@@ -253,7 +253,7 @@ class FpQualityCheck(models.Model):
'inspector_id': self.env.user.id,
})
rec.message_post(body=Markup(
'<b>QC FAILED</b> inspector %s.'
'<b>QC FAILED</b> - inspector %s.'
) % self.env.user.name)
# Auto-spawn the Hold (best-effort; QC failure stands even
# if Hold creation fails for some odd reason).
@@ -342,7 +342,7 @@ class FpQualityCheck(models.Model):
)
if pending:
raise UserError(_(
'Cannot pass QC "%(name)s" %(n)d required check '
'Cannot pass QC "%(name)s" - %(n)d required check '
'item(s) still pending:\n%(items)s'
) % {
'name': rec.name,
@@ -352,7 +352,7 @@ class FpQualityCheck(models.Model):
failed = rec.line_ids.filtered(lambda l: l.result == 'fail')
if failed:
raise UserError(_(
'Cannot pass QC "%(name)s" %(n)d check item(s) '
'Cannot pass QC "%(name)s" - %(n)d check item(s) '
'failed. Fail the QC instead, or reset those '
'items to pass.'
) % {'name': rec.name, 'n': len(failed)})
@@ -418,7 +418,7 @@ class FpQualityCheck(models.Model):
return result.stdout or ''
except FileNotFoundError:
_logger.warning(
'pdftotext not installed cannot auto-extract '
'pdftotext not installed - cannot auto-extract '
'Fischerscope PDF data. Install poppler-utils on '
'the Odoo host.',
)
@@ -493,7 +493,7 @@ class FpQualityCheck(models.Model):
return {
'type': 'ir.actions.client',
'tag': 'fp_qc_checklist',
'name': _('QC %s') % (self.job_id.name or ''),
'name': _('QC - %s') % (self.job_id.name or ''),
'params': {'check_id': self.id},
'target': 'current',
}
@@ -501,7 +501,7 @@ class FpQualityCheck(models.Model):
class FpQualityCheckLine(models.Model):
_name = 'fusion.plating.quality.check.line'
_description = 'Fusion Plating Quality Check Line'
_description = 'Fusion Plating - Quality Check Line'
_order = 'sequence, id'
check_id = fields.Many2one(
@@ -563,8 +563,8 @@ class FpQualityCheckLine(models.Model):
for rec in self:
if rec.requires_value and not rec.value_in_range:
raise UserError(_(
'Cannot pass "%(item)s" value %(val)s is outside '
'the acceptance range (%(min)s %(max)s %(uom)s).'
'Cannot pass "%(item)s" - value %(val)s is outside '
'the acceptance range (%(min)s - %(max)s %(uom)s).'
) % {
'item': rec.name,
'val': rec.value,
@@ -574,7 +574,7 @@ class FpQualityCheckLine(models.Model):
})
if rec.requires_photo and not rec.photo_attachment_id:
raise UserError(_(
'Cannot pass "%(item)s" a photo is required.'
'Cannot pass "%(item)s" - a photo is required.'
) % {'item': rec.name})
rec.write({
'result': 'pass',