将自定义字段从 MO BoM 行发送到 Odoo 中的 PO 订单行
Sending custom fields from MO BoM lines to PO order lines in Odoo
我正在尝试修改 BoM 行以添加两个自定义字段:measure 和 unit of measure ,像这样:
我为 PO 添加了相同的内容:
这是简单的部分,但是,如您所见,PO 订单不采用 measure 和 计量单位 来自 BoM 行的值。
我们需要从 BoM 中获取这些值,并按度量拆分每个项目,不仅按变体,还按度量,因为我们的供应商使用此。
我们如何创建这种行为?哪些函数处理这个?
我们必须从给定的 values
.
中获取股票移动的值
首先,我们将在各自的模型中添加这两个值:
class MrpBomLine(models.Model):
_inherit = 'mrp.bom.line'
item_num = fields.Integer(_('CAD Item Position'), help=_(
"This is the item reference position into the CAD document that declares this BoM."))
measure = fields.Char(_('Measure'))
measure_uom_id = fields.Many2one(
'product.uom',
'Unit of Measure',
help="Unit of Measure (Unit of Measure) is the unit of measurement for the products measure")
class PurchaseOrderLine(models.Model):
_inherit = 'purchase.order.line'
measure = fields.Char(_('Measure'))
measure_uom_id = fields.Many2one(
'product.uom',
'Unit of Measure',
help="Unit of Measure (Unit of Measure) is the unit of measurement for the products measure"
)
我们不需要在 mrp
模型中添加任何其他东西。
其次,我们需要覆盖准备采购订单行的方法,它在采购规则中。所以,我们继承采购规则的模型:
class ProcurementRule(models.Model):
_inherit = 'procurement.rule'
我们继续准备功能:
@api.multi
def _prepare_purchase_order_line(
self, product_id, product_qty, product_uom, values, po, supplier
):
result = super(ProcurementRule, self)._prepare_purchase_order_line(
product_id, product_qty, product_uom, values, po, supplier
)
if values.get('move_dest_ids', False):
result['measure'] = values['move_dest_ids'].bom_line_id.measure
result['measure_uom_id'] = values['move_dest_ids'].bom_line_id.measure_uom_id.id
return result
我们不需要将自定义字段添加到股票移动或其他功能,这是因为 Odoo
使用数据字典处理创建,在本例中,它是 values
,在这个值中我们可以找到所有相关的变量和字段,bom.line
变量也包括自定义字段。
至此,我们解决了从bom.line
到purchase.order
的取信息问题。
现在,我们需要避免采购订单重复,为此我们将修改_run_buy
函数:
# Create Line
po_line = False
for line in po.order_line:
if line.product_id == product_id and \
line.product_uom == product_id.uom_po_id and \
values.get('move_dest_ids', False) and \
line.measure == values['move_dest_ids'].bom_line_id.measure and \
line.measure_uom_id.id == values['move_dest_ids'].bom_line_id.measure_uom_id.id:
if line._merge_in_existing_line(
product_id, product_qty, product_uom,
location_id, name, origin, values
):
vals = self._update_purchase_order_line(
product_id, product_qty, product_uom,
values, line, partner
)
po_line = line.write(vals)
break
我们首先检查move_dest_ids
键是否存在;之后,我们检查订单行中的产品与物料清单行中的产品具有相同的度量,最后我们检查度量的度量单位是否相同。就是这样。
通过这种方式,我们在 Bom Line 模型中添加了两个自定义字段,并且这些字段的值以最少的必要代码从一个模型传输到另一个模型,并且尽可能少地干预系统流程。
我正在尝试修改 BoM 行以添加两个自定义字段:measure 和 unit of measure ,像这样:
我为 PO 添加了相同的内容:
这是简单的部分,但是,如您所见,PO 订单不采用 measure 和 计量单位 来自 BoM 行的值。
我们需要从 BoM 中获取这些值,并按度量拆分每个项目,不仅按变体,还按度量,因为我们的供应商使用此。
我们如何创建这种行为?哪些函数处理这个?
我们必须从给定的 values
.
首先,我们将在各自的模型中添加这两个值:
class MrpBomLine(models.Model):
_inherit = 'mrp.bom.line'
item_num = fields.Integer(_('CAD Item Position'), help=_(
"This is the item reference position into the CAD document that declares this BoM."))
measure = fields.Char(_('Measure'))
measure_uom_id = fields.Many2one(
'product.uom',
'Unit of Measure',
help="Unit of Measure (Unit of Measure) is the unit of measurement for the products measure")
class PurchaseOrderLine(models.Model):
_inherit = 'purchase.order.line'
measure = fields.Char(_('Measure'))
measure_uom_id = fields.Many2one(
'product.uom',
'Unit of Measure',
help="Unit of Measure (Unit of Measure) is the unit of measurement for the products measure"
)
我们不需要在 mrp
模型中添加任何其他东西。
其次,我们需要覆盖准备采购订单行的方法,它在采购规则中。所以,我们继承采购规则的模型:
class ProcurementRule(models.Model):
_inherit = 'procurement.rule'
我们继续准备功能:
@api.multi
def _prepare_purchase_order_line(
self, product_id, product_qty, product_uom, values, po, supplier
):
result = super(ProcurementRule, self)._prepare_purchase_order_line(
product_id, product_qty, product_uom, values, po, supplier
)
if values.get('move_dest_ids', False):
result['measure'] = values['move_dest_ids'].bom_line_id.measure
result['measure_uom_id'] = values['move_dest_ids'].bom_line_id.measure_uom_id.id
return result
我们不需要将自定义字段添加到股票移动或其他功能,这是因为 Odoo
使用数据字典处理创建,在本例中,它是 values
,在这个值中我们可以找到所有相关的变量和字段,bom.line
变量也包括自定义字段。
至此,我们解决了从bom.line
到purchase.order
的取信息问题。
现在,我们需要避免采购订单重复,为此我们将修改_run_buy
函数:
# Create Line
po_line = False
for line in po.order_line:
if line.product_id == product_id and \
line.product_uom == product_id.uom_po_id and \
values.get('move_dest_ids', False) and \
line.measure == values['move_dest_ids'].bom_line_id.measure and \
line.measure_uom_id.id == values['move_dest_ids'].bom_line_id.measure_uom_id.id:
if line._merge_in_existing_line(
product_id, product_qty, product_uom,
location_id, name, origin, values
):
vals = self._update_purchase_order_line(
product_id, product_qty, product_uom,
values, line, partner
)
po_line = line.write(vals)
break
我们首先检查move_dest_ids
键是否存在;之后,我们检查订单行中的产品与物料清单行中的产品具有相同的度量,最后我们检查度量的度量单位是否相同。就是这样。
通过这种方式,我们在 Bom Line 模型中添加了两个自定义字段,并且这些字段的值以最少的必要代码从一个模型传输到另一个模型,并且尽可能少地干预系统流程。