From ea2cfc37c33fe53ac6e4eae6d4f61a656faa1bb9 Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Tue, 21 Apr 2026 22:59:40 -0400 Subject: [PATCH] feat(reports+configurator): invoice PDF uses macro; x_fc_part_catalog_id on account.move.line (Sub 2 Task 19) Invoice PDF (portrait + landscape) now collapses SKU + Description into a single Part column rendered via fusion_plating_reports.customer_line_header, so customer-facing invoices print the customer's part number (with revision) instead of the internal service SKU. To feed the macro on invoice lines, add x_fc_part_catalog_id to account.move.line and override sale.order.line._prepare_invoice_line so the part reference propagates automatically when an SO is invoiced. --- .../models/__init__.py | 1 + .../models/account_move_line.py | 21 +++++++++++++++ .../models/sale_order_line.py | 12 +++++++++ .../report/report_fp_invoice.xml | 26 +++++-------------- 4 files changed, 41 insertions(+), 19 deletions(-) create mode 100644 fusion_plating/fusion_plating_configurator/models/account_move_line.py diff --git a/fusion_plating/fusion_plating_configurator/models/__init__.py b/fusion_plating/fusion_plating_configurator/models/__init__.py index 47e3702d..25c2ab94 100644 --- a/fusion_plating/fusion_plating_configurator/models/__init__.py +++ b/fusion_plating/fusion_plating_configurator/models/__init__.py @@ -13,6 +13,7 @@ from . import fp_sale_description_template from . import fp_quote_configurator from . import sale_order from . import sale_order_line +from . import account_move_line from . import fp_sale_assembly from . import res_partner from . import fp_process_node diff --git a/fusion_plating/fusion_plating_configurator/models/account_move_line.py b/fusion_plating/fusion_plating_configurator/models/account_move_line.py new file mode 100644 index 00000000..6f4ebda0 --- /dev/null +++ b/fusion_plating/fusion_plating_configurator/models/account_move_line.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Nexa Systems Inc. +# License OPL-1 (Odoo Proprietary License v1.0) +# Part of the Fusion Plating product family. +# +# Sub 2 Task 19 — propagate the customer part reference from SO line to +# invoice line so customer-facing invoice PDFs can print the part number +# via the shared fusion_plating_reports.customer_line_header macro. + +from odoo import fields, models + + +class AccountMoveLine(models.Model): + _inherit = 'account.move.line' + + x_fc_part_catalog_id = fields.Many2one( + 'fp.part.catalog', + string='Part', + help="Copied from sale.order.line on invoice creation so customer-" + "facing invoice PDFs can render the customer's part number.", + ) diff --git a/fusion_plating/fusion_plating_configurator/models/sale_order_line.py b/fusion_plating/fusion_plating_configurator/models/sale_order_line.py index 87b19e6b..abf7b309 100644 --- a/fusion_plating/fusion_plating_configurator/models/sale_order_line.py +++ b/fusion_plating/fusion_plating_configurator/models/sale_order_line.py @@ -89,3 +89,15 @@ class SaleOrderLine(models.Model): def action_unarchive_line(self): self.write({'x_fc_archived': False}) return True + + def _prepare_invoice_line(self, **optional_values): + """Carry x_fc_part_catalog_id from SO line to invoice line. + + Sub 2 Task 19 — lets the customer-facing invoice PDF render the + customer's part number via the shared customer_line_header macro + instead of the internal service SKU. + """ + vals = super()._prepare_invoice_line(**optional_values) + if self.x_fc_part_catalog_id: + vals['x_fc_part_catalog_id'] = self.x_fc_part_catalog_id.id + return vals diff --git a/fusion_plating/fusion_plating_reports/report/report_fp_invoice.xml b/fusion_plating/fusion_plating_reports/report/report_fp_invoice.xml index 7e3eaaa2..29965856 100644 --- a/fusion_plating/fusion_plating_reports/report/report_fp_invoice.xml +++ b/fusion_plating/fusion_plating_reports/report/report_fp_invoice.xml @@ -80,8 +80,7 @@ - - + @@ -92,20 +91,15 @@ - + - + -
SKUDESCRIPTIONPART QTY UOM UNIT PRICE
- - - - - + @@ -268,12 +262,11 @@ - + - - + @@ -292,13 +285,8 @@ -
SKUDESCRIPTIONPART QTY UOM UNIT PRICE
- - - - - +