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 @@
- | SKU |
- DESCRIPTION |
+ PART |
QTY |
UOM |
UNIT PRICE |
@@ -92,20 +91,15 @@
- |
+ |
- |
+ |
- |
-
-
-
-
-
+
|
@@ -268,12 +262,11 @@
-
+
- | SKU |
- DESCRIPTION |
+ PART |
QTY |
UOM |
UNIT PRICE |
@@ -292,13 +285,8 @@
- |
-
-
-
-
-
+
|
| |