Мы должны взять эти значения из запаса движения из заданного 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, и, наконец, мы проверяем, совпадает ли единица измерения меры.Именно так.
Таким образом, мы добавили два пользовательских поля в модель Bom Line, и значения этих полей переносятся из одной модели в другую с минимально необходимым кодом и минимальным вмешательством всистемный поток.