ui(rename): "Plating Job" -> "Work Order" / display "WO # 01368"
Standardise user-facing terminology across 5 modules (27 files):
- display_name compute: 'Work Order # 01368' -> 'WO # 01368'
- _description on 5 models: Plating Job{," Step"," Step Time Log"," Margin Report"," Recipe Node Override"} -> Work Order equivalents
- field labels (string=...) on 13 Many2one / One2many fields
across fp.batch, fp.thickness_reading, fp.quality.hold,
fp.job_consumption, fp.portal.job, fp.certificate, fp.delivery,
fp.quality.check, fp.racking.inspection, res.partner, sale.order
- XML view labels: action names, list/form/search strings,
portal template names, dashboard tile titles
What's deliberately preserved:
- DB model name 'fp.job' (technical identifier — used by
sale_order.x_fc_plating_job_ids and all comodel refs)
- Module name 'fusion_plating_jobs' (directory / import path)
- Settings -> Apps display label 'Fusion Plating Jobs' (module
identity for Odoo's app picker)
- 'Use Native Plating Jobs' migration toggle (internal mechanism
flag, not user-facing terminology)
Verified on entech: WH/JOB/01368 now displays as 'WO # 01368'
everywhere humans look (form header, breadcrumbs, M2O dropdowns,
error messages, smart-button titles).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Fusion Plating',
|
'name': 'Fusion Plating',
|
||||||
'version': '19.0.18.15.4',
|
'version': '19.0.18.15.5',
|
||||||
'category': 'Manufacturing/Plating',
|
'category': 'Manufacturing/Plating',
|
||||||
'summary': 'Core plating / metal finishing ERP: facilities, processes, tanks, baths, jobs, operators.',
|
'summary': 'Core plating / metal finishing ERP: facilities, processes, tanks, baths, jobs, operators.',
|
||||||
'description': """
|
'description': """
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ class FpJob(models.Model):
|
|||||||
if dt.tzinfo is None:
|
if dt.tzinfo is None:
|
||||||
dt = pytz.UTC.localize(dt)
|
dt = pytz.UTC.localize(dt)
|
||||||
return dt.astimezone(tz).strftime(fmt)
|
return dt.astimezone(tz).strftime(fmt)
|
||||||
_description = 'Plating Job'
|
_description = 'Work Order'
|
||||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||||
# Sub 12d — state-aware sort. Active work bubbles to the top
|
# Sub 12d — state-aware sort. Active work bubbles to the top
|
||||||
# (in_progress → confirmed/draft → on_hold → done → cancelled),
|
# (in_progress → confirmed/draft → on_hold → done → cancelled),
|
||||||
@@ -69,7 +69,7 @@ class FpJob(models.Model):
|
|||||||
|
|
||||||
@api.depends('name')
|
@api.depends('name')
|
||||||
def _compute_display_name(self):
|
def _compute_display_name(self):
|
||||||
"""Reformat 'WH/JOB/00011' → 'Work Order # 00011' for every
|
"""Reformat 'WH/JOB/00011' → 'WO # 00011' for every
|
||||||
human-facing surface (form header, breadcrumbs, M2O dropdowns,
|
human-facing surface (form header, breadcrumbs, M2O dropdowns,
|
||||||
smart-button titles, error messages). The DB `name` is
|
smart-button titles, error messages). The DB `name` is
|
||||||
unchanged so existing certs / deliveries / chatter references
|
unchanged so existing certs / deliveries / chatter references
|
||||||
@@ -78,7 +78,7 @@ class FpJob(models.Model):
|
|||||||
for job in self:
|
for job in self:
|
||||||
if job.name and '/' in job.name:
|
if job.name and '/' in job.name:
|
||||||
suffix = job.name.rsplit('/', 1)[-1]
|
suffix = job.name.rsplit('/', 1)[-1]
|
||||||
job.display_name = _('Work Order # %s') % suffix
|
job.display_name = _('WO # %s') % suffix
|
||||||
else:
|
else:
|
||||||
job.display_name = job.name or ''
|
job.display_name = job.name or ''
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ from odoo.exceptions import AccessError, UserError
|
|||||||
|
|
||||||
class FpJobStep(models.Model):
|
class FpJobStep(models.Model):
|
||||||
_name = 'fp.job.step'
|
_name = 'fp.job.step'
|
||||||
_description = 'Plating Job Step'
|
_description = 'Work Order Step'
|
||||||
_inherit = ['mail.thread']
|
_inherit = ['mail.thread']
|
||||||
_order = 'job_id, sequence, id'
|
_order = 'job_id, sequence, id'
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ from odoo.exceptions import AccessError, UserError
|
|||||||
|
|
||||||
class FpJobStepTimeLog(models.Model):
|
class FpJobStepTimeLog(models.Model):
|
||||||
_name = 'fp.job.step.timelog'
|
_name = 'fp.job.step.timelog'
|
||||||
_description = 'Plating Job Step Time Log'
|
_description = 'Work Order Step Time Log'
|
||||||
_inherit = ['mail.thread']
|
_inherit = ['mail.thread']
|
||||||
_order = 'date_started desc'
|
_order = 'date_started desc'
|
||||||
|
|
||||||
|
|||||||
@@ -124,7 +124,7 @@
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="action_fp_job" model="ir.actions.act_window">
|
<record id="action_fp_job" model="ir.actions.act_window">
|
||||||
<field name="name">Plating Jobs</field>
|
<field name="name">Work Orders</field>
|
||||||
<field name="res_model">fp.job</field>
|
<field name="res_model">fp.job</field>
|
||||||
<field name="view_mode">list,form</field>
|
<field name="view_mode">list,form</field>
|
||||||
<field name="search_view_id" ref="view_fp_job_search"/>
|
<field name="search_view_id" ref="view_fp_job_search"/>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
# License OPL-1 (Odoo Proprietary License v1.0)
|
# License OPL-1 (Odoo Proprietary License v1.0)
|
||||||
{
|
{
|
||||||
'name': 'Fusion Plating — Native Jobs',
|
'name': 'Fusion Plating — Native Jobs',
|
||||||
'version': '19.0.8.21.0',
|
'version': '19.0.8.21.1',
|
||||||
'category': 'Manufacturing/Plating',
|
'category': 'Manufacturing/Plating',
|
||||||
'summary': 'Native plating job model — replaces mrp.production / mrp.workorder bridge.',
|
'summary': 'Native plating job model — replaces mrp.production / mrp.workorder bridge.',
|
||||||
'author': 'Nexa Systems Inc.',
|
'author': 'Nexa Systems Inc.',
|
||||||
|
|||||||
@@ -22,5 +22,5 @@ class FusionPlatingBatch(models.Model):
|
|||||||
'fp.job',
|
'fp.job',
|
||||||
related='x_fc_step_id.job_id',
|
related='x_fc_step_id.job_id',
|
||||||
store=True,
|
store=True,
|
||||||
string='Plating Job',
|
string='Work Order',
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class FpCertificate(models.Model):
|
|||||||
|
|
||||||
x_fc_job_id = fields.Many2one(
|
x_fc_job_id = fields.Many2one(
|
||||||
'fp.job',
|
'fp.job',
|
||||||
string='Plating Job',
|
string='Work Order',
|
||||||
index=True,
|
index=True,
|
||||||
help="Native fp.job link. Coexists with bridge_mrp's production_id.",
|
help="Native fp.job link. Coexists with bridge_mrp's production_id.",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class FusionPlatingDelivery(models.Model):
|
|||||||
|
|
||||||
x_fc_job_id = fields.Many2one(
|
x_fc_job_id = fields.Many2one(
|
||||||
'fp.job',
|
'fp.job',
|
||||||
string='Plating Job',
|
string='Work Order',
|
||||||
index=True,
|
index=True,
|
||||||
help='Native fp.job link. Coexists with the legacy job_ref Char.',
|
help='Native fp.job link. Coexists with the legacy job_ref Char.',
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class FpJobConsumption(models.Model):
|
|||||||
_order = 'logged_date desc, id desc'
|
_order = 'logged_date desc, id desc'
|
||||||
|
|
||||||
job_id = fields.Many2one(
|
job_id = fields.Many2one(
|
||||||
'fp.job', string='Plating Job',
|
'fp.job', string='Work Order',
|
||||||
required=True, ondelete='cascade', index=True,
|
required=True, ondelete='cascade', index=True,
|
||||||
)
|
)
|
||||||
step_id = fields.Many2one(
|
step_id = fields.Many2one(
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from odoo import api, fields, models
|
|||||||
|
|
||||||
class FpJobNodeOverride(models.Model):
|
class FpJobNodeOverride(models.Model):
|
||||||
_name = 'fp.job.node.override'
|
_name = 'fp.job.node.override'
|
||||||
_description = 'Plating Job Recipe Node Override'
|
_description = 'Work Order Recipe Node Override'
|
||||||
_order = 'job_id, node_id'
|
_order = 'job_id, node_id'
|
||||||
|
|
||||||
job_id = fields.Many2one(
|
job_id = fields.Many2one(
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class FusionPlatingPortalJob(models.Model):
|
|||||||
|
|
||||||
x_fc_job_id = fields.Many2one(
|
x_fc_job_id = fields.Many2one(
|
||||||
'fp.job',
|
'fp.job',
|
||||||
string='Plating Job',
|
string='Work Order',
|
||||||
index=True,
|
index=True,
|
||||||
help='Native fp.job link. Coexists with x_fc_production_id (legacy '
|
help='Native fp.job link. Coexists with x_fc_production_id (legacy '
|
||||||
'mrp.production link).',
|
'mrp.production link).',
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class FusionPlatingQualityHold(models.Model):
|
|||||||
|
|
||||||
x_fc_job_id = fields.Many2one(
|
x_fc_job_id = fields.Many2one(
|
||||||
'fp.job',
|
'fp.job',
|
||||||
string='Plating Job',
|
string='Work Order',
|
||||||
index=True,
|
index=True,
|
||||||
help="Native fp.job link. Coexists with bridge_mrp's production_id "
|
help="Native fp.job link. Coexists with bridge_mrp's production_id "
|
||||||
"link.",
|
"link.",
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class FpThicknessReading(models.Model):
|
|||||||
|
|
||||||
x_fc_job_id = fields.Many2one(
|
x_fc_job_id = fields.Many2one(
|
||||||
'fp.job',
|
'fp.job',
|
||||||
string='Plating Job',
|
string='Work Order',
|
||||||
index=True,
|
index=True,
|
||||||
)
|
)
|
||||||
x_fc_step_id = fields.Many2one(
|
x_fc_step_id = fields.Many2one(
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ from odoo import api, models
|
|||||||
|
|
||||||
class ReportFpJobMargin(models.AbstractModel):
|
class ReportFpJobMargin(models.AbstractModel):
|
||||||
_name = 'report.fusion_plating_jobs.report_fp_job_margin'
|
_name = 'report.fusion_plating_jobs.report_fp_job_margin'
|
||||||
_description = 'Plating Job Margin Report'
|
_description = 'Work Order Margin Report'
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _get_report_values(self, docids, data=None):
|
def _get_report_values(self, docids, data=None):
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class SaleOrder(models.Model):
|
|||||||
_inherit = 'sale.order'
|
_inherit = 'sale.order'
|
||||||
|
|
||||||
x_fc_fp_job_count = fields.Integer(
|
x_fc_fp_job_count = fields.Integer(
|
||||||
string='Plating Jobs',
|
string='Work Orders',
|
||||||
compute='_compute_fp_job_count',
|
compute='_compute_fp_job_count',
|
||||||
)
|
)
|
||||||
x_fc_fp_certificate_count = fields.Integer(
|
x_fc_fp_certificate_count = fields.Integer(
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
icon="fa-cogs"
|
icon="fa-cogs"
|
||||||
invisible="not x_fc_job_id">
|
invisible="not x_fc_job_id">
|
||||||
<field name="x_fc_job_id" widget="statinfo"
|
<field name="x_fc_job_id" widget="statinfo"
|
||||||
string="Plating Job"/>
|
string="Work Order"/>
|
||||||
</button>
|
</button>
|
||||||
<button name="action_view_thickness_qc"
|
<button name="action_view_thickness_qc"
|
||||||
type="object"
|
type="object"
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Fusion Plating — Customer Portal',
|
'name': 'Fusion Plating — Customer Portal',
|
||||||
'version': '19.0.2.1.0',
|
'version': '19.0.2.1.1',
|
||||||
'category': 'Manufacturing/Plating',
|
'category': 'Manufacturing/Plating',
|
||||||
'summary': 'Customer-facing portal for plating shops: online RFQ, job status, '
|
'summary': 'Customer-facing portal for plating shops: online RFQ, job status, '
|
||||||
'CoC downloads, invoice access.',
|
'CoC downloads, invoice access.',
|
||||||
|
|||||||
@@ -23,14 +23,14 @@ class ResPartner(models.Model):
|
|||||||
x_fc_portal_job_ids = fields.One2many(
|
x_fc_portal_job_ids = fields.One2many(
|
||||||
'fusion.plating.portal.job',
|
'fusion.plating.portal.job',
|
||||||
'partner_id',
|
'partner_id',
|
||||||
string='Plating Jobs',
|
string='Work Orders',
|
||||||
)
|
)
|
||||||
x_fc_quote_request_count = fields.Integer(
|
x_fc_quote_request_count = fields.Integer(
|
||||||
string='Quote Request Count',
|
string='Quote Request Count',
|
||||||
compute='_compute_x_fc_quote_request_count',
|
compute='_compute_x_fc_quote_request_count',
|
||||||
)
|
)
|
||||||
x_fc_portal_job_count = fields.Integer(
|
x_fc_portal_job_count = fields.Integer(
|
||||||
string='Plating Job Count',
|
string='Work Order Count',
|
||||||
compute='_compute_x_fc_portal_job_count',
|
compute='_compute_x_fc_portal_job_count',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -368,7 +368,7 @@
|
|||||||
<t t-set="placeholder_count" t-value="'fp_quote_request_count'"/>
|
<t t-set="placeholder_count" t-value="'fp_quote_request_count'"/>
|
||||||
</t>
|
</t>
|
||||||
<t t-call="portal.portal_docs_entry">
|
<t t-call="portal.portal_docs_entry">
|
||||||
<t t-set="title">Plating Jobs</t>
|
<t t-set="title">Work Orders</t>
|
||||||
<t t-set="url" t-value="'/my/jobs'"/>
|
<t t-set="url" t-value="'/my/jobs'"/>
|
||||||
<t t-set="placeholder_count" t-value="'fp_portal_job_count'"/>
|
<t t-set="placeholder_count" t-value="'fp_portal_job_count'"/>
|
||||||
</t>
|
</t>
|
||||||
|
|||||||
@@ -428,7 +428,7 @@
|
|||||||
<!-- ================================================================== -->
|
<!-- ================================================================== -->
|
||||||
<!-- JOBS — list with segmented progress bars -->
|
<!-- JOBS — list with segmented progress bars -->
|
||||||
<!-- ================================================================== -->
|
<!-- ================================================================== -->
|
||||||
<template id="portal_my_jobs" name="My Plating Jobs">
|
<template id="portal_my_jobs" name="My Work Orders">
|
||||||
<t t-call="portal.portal_layout">
|
<t t-call="portal.portal_layout">
|
||||||
<t t-set="breadcrumbs_searchbar" t-value="True"/>
|
<t t-set="breadcrumbs_searchbar" t-value="True"/>
|
||||||
<t t-call="portal.portal_searchbar">
|
<t t-call="portal.portal_searchbar">
|
||||||
@@ -499,7 +499,7 @@
|
|||||||
<!-- ================================================================== -->
|
<!-- ================================================================== -->
|
||||||
<!-- JOB — detail -->
|
<!-- JOB — detail -->
|
||||||
<!-- ================================================================== -->
|
<!-- ================================================================== -->
|
||||||
<template id="portal_my_job" name="My Plating Job">
|
<template id="portal_my_job" name="My Work Order">
|
||||||
<t t-call="portal.portal_layout">
|
<t t-call="portal.portal_layout">
|
||||||
<div class="row mt-2 mb-4">
|
<div class="row mt-2 mb-4">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
|
|||||||
@@ -188,7 +188,7 @@
|
|||||||
<field name="name">fp.portal.job.list</field>
|
<field name="name">fp.portal.job.list</field>
|
||||||
<field name="model">fusion.plating.portal.job</field>
|
<field name="model">fusion.plating.portal.job</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<list string="Plating Jobs"
|
<list string="Work Orders"
|
||||||
decoration-info="state == 'received'"
|
decoration-info="state == 'received'"
|
||||||
decoration-success="state == 'complete'">
|
decoration-success="state == 'complete'">
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
@@ -213,7 +213,7 @@
|
|||||||
<field name="name">fp.portal.job.form</field>
|
<field name="name">fp.portal.job.form</field>
|
||||||
<field name="model">fusion.plating.portal.job</field>
|
<field name="model">fusion.plating.portal.job</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Plating Job">
|
<form string="Work Order">
|
||||||
<header>
|
<header>
|
||||||
<field name="state" widget="statusbar"
|
<field name="state" widget="statusbar"
|
||||||
statusbar_visible="received,in_progress,quality_check,ready_to_ship,shipped,complete"/>
|
statusbar_visible="received,in_progress,quality_check,ready_to_ship,shipped,complete"/>
|
||||||
@@ -262,7 +262,7 @@
|
|||||||
<field name="name">fp.portal.job.search</field>
|
<field name="name">fp.portal.job.search</field>
|
||||||
<field name="model">fusion.plating.portal.job</field>
|
<field name="model">fusion.plating.portal.job</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<search string="Plating Jobs">
|
<search string="Work Orders">
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
<field name="partner_id"/>
|
<field name="partner_id"/>
|
||||||
<field name="invoice_ref"/>
|
<field name="invoice_ref"/>
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
<!-- Portal Job — action -->
|
<!-- Portal Job — action -->
|
||||||
<!-- ================================================================== -->
|
<!-- ================================================================== -->
|
||||||
<record id="action_fp_portal_job" model="ir.actions.act_window">
|
<record id="action_fp_portal_job" model="ir.actions.act_window">
|
||||||
<field name="name">Plating Jobs</field>
|
<field name="name">Work Orders</field>
|
||||||
<field name="res_model">fusion.plating.portal.job</field>
|
<field name="res_model">fusion.plating.portal.job</field>
|
||||||
<field name="view_mode">list,form</field>
|
<field name="view_mode">list,form</field>
|
||||||
<field name="search_view_id" ref="view_fp_portal_job_search"/>
|
<field name="search_view_id" ref="view_fp_portal_job_search"/>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Fusion Plating — Quality (QMS)',
|
'name': 'Fusion Plating — Quality (QMS)',
|
||||||
'version': '19.0.4.10.0',
|
'version': '19.0.4.12.2',
|
||||||
'category': 'Manufacturing/Plating',
|
'category': 'Manufacturing/Plating',
|
||||||
'summary': 'Native QMS for plating shops: NCR, CAPA, calibration, AVL, FAIR, '
|
'summary': 'Native QMS for plating shops: NCR, CAPA, calibration, AVL, FAIR, '
|
||||||
'internal audits, customer specs, document control. CE + EE compatible.',
|
'internal audits, customer specs, document control. CE + EE compatible.',
|
||||||
@@ -96,6 +96,7 @@ Copyright (c) 2026 Nexa Systems Inc. All rights reserved.
|
|||||||
'views/res_partner_views.xml',
|
'views/res_partner_views.xml',
|
||||||
'views/res_partner_qc_views.xml',
|
'views/res_partner_qc_views.xml',
|
||||||
'views/res_config_settings_views.xml',
|
'views/res_config_settings_views.xml',
|
||||||
|
'wizards/fp_contract_review_client_email_wizard_views.xml',
|
||||||
'views/fp_contract_review_views.xml',
|
'views/fp_contract_review_views.xml',
|
||||||
'views/fp_part_catalog_views.xml',
|
'views/fp_part_catalog_views.xml',
|
||||||
'views/fp_quality_check_views.xml',
|
'views/fp_quality_check_views.xml',
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ class FpQualityCheck(models.Model):
|
|||||||
default=lambda self: self._default_name(), tracking=True,
|
default=lambda self: self._default_name(), tracking=True,
|
||||||
)
|
)
|
||||||
job_id = fields.Many2one(
|
job_id = fields.Many2one(
|
||||||
'fp.job', string='Plating Job',
|
'fp.job', string='Work Order',
|
||||||
required=True, ondelete='cascade', tracking=True,
|
required=True, ondelete='cascade', tracking=True,
|
||||||
index=True,
|
index=True,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ class FpQualityHold(models.Model):
|
|||||||
# The bridge fields stay during the migration window so existing
|
# The bridge fields stay during the migration window so existing
|
||||||
# records keep their FKs; Phase 5 removes bridge_mrp entirely.
|
# records keep their FKs; Phase 5 removes bridge_mrp entirely.
|
||||||
job_id = fields.Many2one(
|
job_id = fields.Many2one(
|
||||||
'fp.job', string='Plating Job',
|
'fp.job', string='Work Order',
|
||||||
index=True, ondelete='set null',
|
index=True, ondelete='set null',
|
||||||
)
|
)
|
||||||
step_id = fields.Many2one(
|
step_id = fields.Many2one(
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Fusion Plating — Receiving & Inspection',
|
'name': 'Fusion Plating — Receiving & Inspection',
|
||||||
'version': '19.0.3.7.1',
|
'version': '19.0.3.7.3',
|
||||||
'category': 'Manufacturing/Plating',
|
'category': 'Manufacturing/Plating',
|
||||||
'summary': 'Parts receiving, inspection, damage logging, and manufacturing gate.',
|
'summary': 'Parts receiving, inspection, damage logging, and manufacturing gate.',
|
||||||
'description': """
|
'description': """
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class FpRackingInspection(models.Model):
|
|||||||
# views can reference it at view-load time; fusion_plating_jobs adds
|
# views can reference it at view-load time; fusion_plating_jobs adds
|
||||||
# the constraints + compute overrides via inheritance.
|
# the constraints + compute overrides via inheritance.
|
||||||
x_fc_job_id = fields.Many2one(
|
x_fc_job_id = fields.Many2one(
|
||||||
'fp.job', string='Plating Job',
|
'fp.job', string='Work Order',
|
||||||
index=True, ondelete='cascade',
|
index=True, ondelete='cascade',
|
||||||
)
|
)
|
||||||
sale_order_id = fields.Many2one(
|
sale_order_id = fields.Many2one(
|
||||||
|
|||||||
Reference in New Issue
Block a user