fix(jobs): registry load failure after Tier 2/3 persistence patches

Two compounding issues introduced by the persistence audit work:

1. fields.Text mismatch: sale.order.x_fc_internal_note and
   x_fc_external_note are actually fields.Html. I declared the
   sale.order.line related mirrors and the fp.job stored copies as
   fields.Text, so setup_related raised:
     TypeError: Type of related field
     sale.order.line.x_fc_internal_note is inconsistent with
     sale.order.x_fc_internal_note
   Fixed by switching both Note fields on fp.job and sale.order.line
   to fields.Html.

2. Module-load-order: Tier 3 fields (x_fc_delivery_method,
   x_fc_ship_via, x_fc_invoice_strategy) are defined in
   fusion_plating_jobs (related to sale.order via _inherit), but I
   referenced them in fusion_plating core's fp_job_views.xml — which
   loads BEFORE fusion_plating_jobs registers the fields. View
   validator raised "Field x_fc_delivery_method does not exist".
   Fixed by removing those 3 fields from the core view group and
   adding them via xpath in fusion_plating_jobs's fp_job_form_inherit
   (which loads after the fields are registered).

Both fixes deployed and verified — registry loads in 2s, all field
types match, related path resolves correctly. No data loss; the
fp.job rows that already had stored Text content for internal_note /
external_note will carry over into the Html field intact.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-05-12 08:45:59 -04:00
parent cba9a6da6b
commit 2d9779047b
7 changed files with 12 additions and 10 deletions

View File

@@ -5,7 +5,7 @@
{
'name': 'Fusion Plating',
'version': '19.0.18.15.8',
'version': '19.0.18.15.10',
'category': 'Manufacturing/Plating',
'summary': 'Core plating / metal finishing ERP: facilities, processes, tanks, baths, jobs, operators.',
'description': """

View File

@@ -308,12 +308,12 @@ class FpJob(models.Model):
)
# ---- Operational notes mirrored from sale.order ------------------
x_fc_internal_note = fields.Text(
x_fc_internal_note = fields.Html(
string='Internal Note',
tracking=True,
help='Shop-internal notes from the order. Not shown to customer.',
)
x_fc_external_note = fields.Text(
x_fc_external_note = fields.Html(
string='External Note',
tracking=True,
help='Customer-facing notes copied from the sale order. Printed '

View File

@@ -43,9 +43,6 @@
<field name="x_fc_rush_order"/>
<field name="x_fc_planned_start_date"/>
<field name="x_fc_internal_deadline"/>
<field name="x_fc_delivery_method"/>
<field name="x_fc_ship_via"/>
<field name="x_fc_invoice_strategy"/>
</group>
<group name="x_fc_notes" string="Notes">
<field name="x_fc_internal_note" nolabel="1" placeholder="Internal note (not shown to customer)…"/>

View File

@@ -5,7 +5,7 @@
{
'name': 'Fusion Plating — Configurator',
'version': '19.0.18.10.2',
'version': '19.0.18.10.3',
'category': 'Manufacturing/Plating',
'summary': 'Quotation configurator with part catalog, coating configs, and formula-based pricing engine.',
'description': """

View File

@@ -672,13 +672,13 @@ class SaleOrderLine(models.Model):
readonly=True,
store=True,
)
x_fc_internal_note = fields.Text(
x_fc_internal_note = fields.Html(
related='order_id.x_fc_internal_note',
string='Internal Note',
readonly=True,
store=True,
)
x_fc_external_note = fields.Text(
x_fc_external_note = fields.Html(
related='order_id.x_fc_external_note',
string='External Note',
readonly=True,

View File

@@ -3,7 +3,7 @@
# License OPL-1 (Odoo Proprietary License v1.0)
{
'name': 'Fusion Plating — Native Jobs',
'version': '19.0.8.21.4',
'version': '19.0.8.21.5',
'category': 'Manufacturing/Plating',
'summary': 'Native plating job model — replaces mrp.production / mrp.workorder bridge.',
'author': 'Nexa Systems Inc.',

View File

@@ -283,6 +283,11 @@
</button>
</div>
</xpath>
<xpath expr="//group[@name='x_fc_customer_refs']" position="inside">
<field name="x_fc_delivery_method"/>
<field name="x_fc_ship_via"/>
<field name="x_fc_invoice_strategy"/>
</xpath>
</field>
</record>
</odoo>