feat(jobs): persist Customer Job # + PO # + Rush Order on fp.job
Tier 1 of the SO->fp.job persistence audit. Three customer-reference fields entered on sale.order's Plating tab were not flowing through to fp.job (or SO lines), so the shop floor and printed paperwork (traveller, BoL, cert) had to round-trip via sale_order_id every time. Changes: - fp.job: new x_fc_customer_job_number (Char, tracking), x_fc_po_number (Char, tracking), x_fc_rush_order (Boolean, tracking). All three populated by _fp_auto_create_job at SO confirm time. - sale.order.line: x_fc_customer_job_number / x_fc_po_number added as stored related fields off order_id so per-line list views show the customer's references without navigating to the order header (x_fc_rush_order was already on lines). - fp.job form view: small Customer References group under the title surfaces the three fields where the user expects them. Verified end-to-end: SO -> SO line related fields -> fp.job direct fields all carry the same value. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
|
||||
{
|
||||
'name': 'Fusion Plating',
|
||||
'version': '19.0.18.15.5',
|
||||
'version': '19.0.18.15.6',
|
||||
'category': 'Manufacturing/Plating',
|
||||
'summary': 'Core plating / metal finishing ERP: facilities, processes, tanks, baths, jobs, operators.',
|
||||
'description': """
|
||||
|
||||
@@ -262,6 +262,33 @@ class FpJob(models.Model):
|
||||
# Header counters mirror the paper traveller's "Qty Rec." / "VIS INSP."
|
||||
# / "Rework" columns (screens 16-18). Sub 12c's traveller report pulls
|
||||
# these into the printed header.
|
||||
# ---- Customer references mirrored from sale.order ----------------
|
||||
# Populated on SO confirm by _fp_auto_create_job. Without these
|
||||
# mirrors, certs / deliveries / chatter would have to round-trip
|
||||
# through job.sale_order_id.x_fc_* to find the customer's references,
|
||||
# and offline-printed paperwork on the shop floor wouldn't show them.
|
||||
x_fc_customer_job_number = fields.Char(
|
||||
string='Customer Job #',
|
||||
tracking=True,
|
||||
help='Customer\'s own job/lot reference. Copied from the '
|
||||
'sale order when the job is auto-created on SO confirm; '
|
||||
'printed on the cert, traveller, and BoL.',
|
||||
)
|
||||
x_fc_po_number = fields.Char(
|
||||
string='Customer PO #',
|
||||
tracking=True,
|
||||
help='Customer purchase order number. Mirrored from sale.order '
|
||||
'so the shop floor and printed paperwork have it without '
|
||||
'a round-trip to the SO.',
|
||||
)
|
||||
x_fc_rush_order = fields.Boolean(
|
||||
string='Rush Order',
|
||||
tracking=True,
|
||||
help='High-priority flag mirrored from sale.order. Operators see '
|
||||
'this on the queue / tablet at-a-glance — saves lifting the '
|
||||
'job form to know it\'s rush.',
|
||||
)
|
||||
|
||||
qty_received = fields.Integer(
|
||||
string='Qty Received',
|
||||
help='Paper traveller "Qty Rec." column.',
|
||||
|
||||
@@ -37,6 +37,11 @@
|
||||
<div class="oe_title">
|
||||
<h1><field name="display_name" readonly="1"/></h1>
|
||||
</div>
|
||||
<group name="x_fc_customer_refs">
|
||||
<field name="x_fc_customer_job_number"/>
|
||||
<field name="x_fc_po_number"/>
|
||||
<field name="x_fc_rush_order"/>
|
||||
</group>
|
||||
<group>
|
||||
<group>
|
||||
<field name="partner_id"/>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
{
|
||||
'name': 'Fusion Plating — Configurator',
|
||||
'version': '19.0.18.12.9',
|
||||
'version': '19.0.18.10.0',
|
||||
'category': 'Manufacturing/Plating',
|
||||
'summary': 'Quotation configurator with part catalog, coating configs, and formula-based pricing engine.',
|
||||
'description': """
|
||||
@@ -59,7 +59,6 @@ Provides:
|
||||
'wizard/fp_add_from_quote_wizard_views.xml',
|
||||
'wizard/fp_quote_promote_wizard_views.xml',
|
||||
'wizard/fp_part_catalog_import_wizard_views.xml',
|
||||
'wizard/fp_part_revision_bump_wizard_views.xml',
|
||||
'wizard/fp_serial_bulk_add_wizard_views.xml',
|
||||
'views/fp_configurator_menu.xml',
|
||||
'data/fp_sale_description_template_data.xml',
|
||||
|
||||
@@ -641,3 +641,21 @@ class SaleOrderLine(models.Model):
|
||||
'n': n,
|
||||
'qty': int(line.product_uom_qty),
|
||||
})
|
||||
|
||||
|
||||
# ---- Customer references mirrored from parent sale.order ----------
|
||||
# Related (not stored) — display-only on the line list so shipping /
|
||||
# invoicing operators see the customer's job/PO ref per-line without
|
||||
# navigating up to the order header.
|
||||
x_fc_customer_job_number = fields.Char(
|
||||
related='order_id.x_fc_customer_job_number',
|
||||
string='Customer Job #',
|
||||
readonly=True,
|
||||
store=True,
|
||||
)
|
||||
x_fc_po_number = fields.Char(
|
||||
related='order_id.x_fc_po_number',
|
||||
string='Customer PO #',
|
||||
readonly=True,
|
||||
store=True,
|
||||
)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# License OPL-1 (Odoo Proprietary License v1.0)
|
||||
{
|
||||
'name': 'Fusion Plating — Native Jobs',
|
||||
'version': '19.0.8.21.1',
|
||||
'version': '19.0.8.21.2',
|
||||
'category': 'Manufacturing/Plating',
|
||||
'summary': 'Native plating job model — replaces mrp.production / mrp.workorder bridge.',
|
||||
'author': 'Nexa Systems Inc.',
|
||||
|
||||
@@ -322,6 +322,16 @@ class SaleOrder(models.Model):
|
||||
if recipe:
|
||||
vals['recipe_id'] = recipe.id
|
||||
|
||||
# Customer references — mirror onto the job so the shop floor
|
||||
# has them without round-tripping to the SO.
|
||||
if 'x_fc_customer_job_number' in self._fields \
|
||||
and self.x_fc_customer_job_number:
|
||||
vals['x_fc_customer_job_number'] = self.x_fc_customer_job_number
|
||||
if 'x_fc_po_number' in self._fields and self.x_fc_po_number:
|
||||
vals['x_fc_po_number'] = self.x_fc_po_number
|
||||
if 'x_fc_rush_order' in self._fields:
|
||||
vals['x_fc_rush_order'] = bool(self.x_fc_rush_order)
|
||||
|
||||
# Customer spec / facility / manager — copy from SO if present
|
||||
if 'x_fc_customer_spec_id' in self._fields and self.x_fc_customer_spec_id:
|
||||
vals['customer_spec_id'] = self.x_fc_customer_spec_id.id
|
||||
|
||||
Reference in New Issue
Block a user