diff --git a/fusion_plating/fusion_plating_certificates/__manifest__.py b/fusion_plating/fusion_plating_certificates/__manifest__.py index d9f2ca1a..19257427 100644 --- a/fusion_plating/fusion_plating_certificates/__manifest__.py +++ b/fusion_plating/fusion_plating_certificates/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating — Certificates', - 'version': '19.0.9.1.0', + 'version': '19.0.9.2.0', 'category': 'Manufacturing/Plating', 'summary': 'Certificate registry for CoC, thickness reports, and quality documents.', 'description': """ diff --git a/fusion_plating/fusion_plating_certificates/models/fp_certificate.py b/fusion_plating/fusion_plating_certificates/models/fp_certificate.py index 2fa39b86..9d7e2447 100644 --- a/fusion_plating/fusion_plating_certificates/models/fp_certificate.py +++ b/fusion_plating/fusion_plating_certificates/models/fp_certificate.py @@ -777,6 +777,49 @@ class FpCertificate(models.Model): desc = line.name return (desc or '').strip() + def _fp_resolve_part_identity(self): + """Return (part_number, part_name, serials) for the CoC line-item + cell's three lines (client request 2026-05-28). + + - part_number: the cert's own field, falling back to the job's + part_catalog part_number. + - part_name: the job's part_catalog.name. + - serials: the matching SO line's x_fc_serial_ids names, + comma-joined. + + All cross-module access is guarded so the method stays safe even + if the jobs / configurator layers aren't installed (returns '' + for the unresolved pieces). + """ + self.ensure_one() + job = self.x_fc_job_id if 'x_fc_job_id' in self._fields else False + part = (job.part_catalog_id + if job and 'part_catalog_id' in job._fields else False) + part_number = ( + self.part_number + or (part.part_number + if part and 'part_number' in part._fields else '') + or '' + ) + part_name = (part.name if part and 'name' in part._fields else '') or '' + serials = '' + so = self.sale_order_id or ( + job.sale_order_id + if job and 'sale_order_id' in job._fields else False + ) + if so: + lines = so.order_line.filtered(lambda l: not l.display_type) + line = self.env['sale.order.line'] + if part and lines and 'x_fc_part_catalog_id' in lines._fields: + line = lines.filtered( + lambda l: l.x_fc_part_catalog_id == part + )[:1] + if not line: + line = lines[:1] + if line and 'x_fc_serial_ids' in line._fields and line.x_fc_serial_ids: + serials = ', '.join(line.x_fc_serial_ids.mapped('name')) + return (part_number, part_name, serials) + def _fp_render_and_attach_pdf(self): """Render the CoC PDF via the bound report action, OPTIONALLY merge the Fischerscope thickness report PDF (uploaded by the diff --git a/fusion_plating/fusion_plating_reports/__manifest__.py b/fusion_plating/fusion_plating_reports/__manifest__.py index 5c27ac36..f631362a 100644 --- a/fusion_plating/fusion_plating_reports/__manifest__.py +++ b/fusion_plating/fusion_plating_reports/__manifest__.py @@ -3,7 +3,7 @@ # License OPL-1 (Odoo Proprietary License v1.0) { 'name': 'Fusion Plating — Reports', - 'version': '19.0.11.30.0', + 'version': '19.0.11.31.0', 'category': 'Manufacturing/Plating', 'summary': 'PDF reports for Fusion Plating: quote, SO, WO, packing, BoL, CoC, invoice, receipt, quality + compliance.', 'depends': [ diff --git a/fusion_plating/fusion_plating_reports/report/report_coc.xml b/fusion_plating/fusion_plating_reports/report/report_coc.xml index 777c1645..cb991024 100644 --- a/fusion_plating/fusion_plating_reports/report/report_coc.xml +++ b/fusion_plating/fusion_plating_reports/report/report_coc.xml @@ -239,16 +239,13 @@ - Date of Certification - Date du certificat + Date of Certification/Date du certificat - Generated By - Créé par + Generated By/Créé par - Work Order # - Bon de travail + Work Order #/Bon de travail @@ -276,39 +273,36 @@ page-break-inside: avoid;"> - - Part Number / Line Item - No. de pièce / Ligne - Description - Description - Serial Number - Numéro de série + +
Part Number/No. de pièce
+
Description/Description
+
Serial Number/Numéro de série
- Process - Procédé + Process/Procédé - Customer PO - Bon de commande + Customer PO/Bon de commande - Shipped - Expédié + Shipped/Expédié - NC Qty - Qté NC + NC Qty/Qté NC - Customer Job No. - Bon de travail client + Customer Job No./Bon de travail client - + + +
+
+
+