将自定义字段从 MO BoM 行发送到 Odoo 中的 PO 订单行

Sending custom fields from MO BoM lines to PO order lines in Odoo

我正在尝试修改 BoM 行以添加两个自定义字段:measureunit 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.linepurchase.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 模型中添加了两个自定义字段,并且这些字段的值以最少的必要代码从一个模型传输到另一个模型,并且尽可能少地干预系统流程。