fix(plating): CoC signer follows Settings "Certificate Owner" (no stale freeze)

Changing Settings -> Certificate Owner didn't move existing certs: the signer
was snapshotted from the company owner at cert-creation time, and the CoC
prefers that snapshot over the live owner.

- _fp_create_certificates no longer freezes the company owner into
  certified_by_id; it snapshots ONLY a deliberate per-spec signer. Empty
  certified_by_id then resolves the LIVE company owner in the CoC report.
- action_issue lazy-fill made robust: resolves the company via the SO /
  env.company (fp.certificate has no company_id) so it fills the CURRENT
  owner at issue and the "Certified By" gate still passes.
- Settings help text corrected: signature comes from the user's Plating
  Signature (Preferences -> My Profile), not "HR Employee".
- Data fix on entech: cleared certified_by_id on 5 stale draft CoCs with no
  per-spec signer so they follow the current owner.

Bump certificates 19.0.9.3.0, jobs 19.0.11.4.0. Verified: CoC-30058 resolves
signer = Garry Singh (has Plating Signature), renders clean.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-05-28 23:20:38 -04:00
parent cd0c08f348
commit 64eb34cdff
5 changed files with 37 additions and 19 deletions

View File

@@ -5,7 +5,7 @@
{
'name': 'Fusion Plating — Certificates',
'version': '19.0.9.2.0',
'version': '19.0.9.3.0',
'category': 'Manufacturing/Plating',
'summary': 'Certificate registry for CoC, thickness reports, and quality documents.',
'description': """

View File

@@ -485,17 +485,28 @@ class FpCertificate(models.Model):
rec.contact_partner_id = (
rec.partner_id.x_fc_default_coc_contact_id
)
# Guard with field-existence check — fp.certificate doesn't
# declare company_id directly; production picks it up from
# auto-creation context but tests can build a cert without
# one. Without the guard, AttributeError on the .company_id
# access bubbles up as a test error.
if (not rec.certified_by_id
and 'company_id' in rec._fields
and rec.company_id
and 'x_fc_owner_user_id' in rec.company_id._fields
and rec.company_id.x_fc_owner_user_id):
rec.certified_by_id = rec.company_id.x_fc_owner_user_id
# Lazy-fill the signer from the LIVE company owner (Settings
# "Certificate Owner") when no per-cert / per-spec signer was
# chosen. As of 2026-05-28 the cert no longer freezes the
# company owner at creation, so certified_by_id is empty in
# the common case and this fill is what locks the signer at
# issue. fp.certificate doesn't declare company_id directly,
# so resolve the company from the SO (then env.company) the
# same way the CoC report does — otherwise this fill is
# skipped and the "Certified By is not set" gate below would
# block issuance.
if not rec.certified_by_id:
company = (
(rec.company_id
if 'company_id' in rec._fields and rec.company_id
else False)
or (rec.sale_order_id.company_id
if rec.sale_order_id else False)
or rec.env.company
)
if (company and 'x_fc_owner_user_id' in company._fields
and company.x_fc_owner_user_id):
rec.certified_by_id = company.x_fc_owner_user_id
# Spec Reference is OPTIONAL (client request 2026-05-28).
# The customer-facing description now serves as the cert's
# spec / certificate information (see

View File

@@ -18,7 +18,7 @@
help="Branding, accreditation logos, and default signer for Certificates of Conformance.">
<setting id="fp_coc_owner"
string="Certificate Owner (Default Signer)"
help="Their HR Employee signature appears on issued certificates by default.">
help="Signs every CoC that has no per-spec or per-cert signer. Their Plating Signature (Preferences → My Profile) is printed. Changing this flows through to draft certificates.">
<field name="x_fc_owner_user_id"
options="{'no_create': True, 'no_open': True}"/>
</setting>