[FIX] mrp: use unit_factor when generating lots in work orders and make sure to generate lots when necessary

When (re)generating the stock.move.lots in the workorder,
it should use the unit_factor on the move like everywhere else.
This makes sure we do well with the explosion of phantom boms too.

It is also important that if there is no operation_id given
explicitly in the "consumed in operation" on the bom line,
that it still generates the necessary stock.move.lots in the last work order.

Also, in the work order it is better to set the quantities done already.
That way we don't forget to consume them.
This commit is contained in:
Josse Colpaert
2016-08-26 11:45:44 +02:00
parent 5cef19c165
commit 4f9af6838f
3 changed files with 13 additions and 11 deletions
+2 -2
View File
@@ -421,8 +421,8 @@ class MrpProduction(models.Model):
# assign moves; last operation receive all unassigned moves (which case ?)
moves_raw = self.move_raw_ids.filtered(lambda move: move.operation_id == operation)
if len(workorders) == len(bom.routing_id.operation_ids):
moves_raw |= self.move_raw_ids.filtered(lambda move: move.operation_id == False)
moves_finished = self.move_finished_ids.filtered(lambda move: move.operation_id == operation)
moves_raw |= self.move_raw_ids.filtered(lambda move: not move.operation_id)
moves_finished = self.move_finished_ids.filtered(lambda move: move.operation_id == operation) #TODO: code does nothing, unless maybe by_products?
moves_raw.mapped('move_lot_ids').write({'workorder_id': workorder.id})
(moves_finished + moves_raw).write({'workorder_id': workorder.id})
+9 -8
View File
@@ -189,25 +189,26 @@ class MrpWorkorder(models.Model):
move_lots = self.active_move_lot_ids.filtered(lambda move_lot: move_lot.move_id == move)
if not move_lots:
continue
new_qty = move.bom_line_id.product_qty * self.qty_producing / move.bom_line_id.bom_id.product_qty
new_qty = move.unit_factor * self.qty_producing
if move.product_id.tracking == 'lot':
move_lots[0].quantity = new_qty
move_lots[0].quantity_done = new_qty
elif move.product_id.tracking == 'serial':
# Create extra pseudo record
qty_todo = new_qty - sum(move_lots.mapped('quantity'))
if qty_todo > 0.0: # TDE: float compare
while qty_todo > 0:
if float_compare(qty_todo, 0.0, precision_rounding=move.product_uom.rounding) > 0:
while float_compare(qty_todo, 0.0, precision_rounding=move.product_uom.rounding) > 0:
self.active_move_lot_ids += self.env['stock.move.lots'].new({
'move_id': move.id,
'product_id': move.product_id.id,
'lot_id': False,
'quantity': min(1.0, qty_todo),
'quantity_done': 0,
'quantity_done': min(1.0, qty_todo),
'workorder_id': self.id,
'done_wo': False
})
qty_todo -= 1
elif qty_todo < 0.0:
elif float_compare(qty_todo, 0.0, precision_rounding=move.product_uom.rounding) < 0:
qty_todo = abs(qty_todo)
for move_lot in move_lots:
if qty_todo <= 0:
@@ -232,13 +233,13 @@ class MrpWorkorder(models.Model):
tracked_moves = self.move_raw_ids.filtered(
lambda move: move.state not in ('done', 'cancel') and move.product_id.tracking != 'none' and move.product_id != self.production_id.product_id)
for move in tracked_moves:
qty = self.qty_producing / move.bom_line_id.bom_id.product_qty * move.bom_line_id.product_qty
qty = move.unit_factor * self.qty_producing
if move.product_id.tracking == 'serial':
while float_compare(qty, 0.0, precision_rounding=move.product_uom.rounding) > 0:
MoveLot.create({
'move_id': move.id,
'quantity': min(1, qty),
'quantity_done': 0,
'quantity_done': min(1, qty),
'production_id': self.production_id.id,
'workorder_id': self.id,
'product_id': move.product_id.id,
@@ -249,7 +250,7 @@ class MrpWorkorder(models.Model):
MoveLot.create({
'move_id': move.id,
'quantity': qty,
'quantity_done': 0,
'quantity_done': qty,
'product_id': move.product_id.id,
'production_id': self.production_id.id,
'workorder_id': self.id,
+2 -1
View File
@@ -187,7 +187,7 @@ class TestMrpOrder(TestMrpCommon):
}).change_product_qty()
(self.product_2 | self.product_4).write({
'tracking': 'lot',
'tracking': 'none',
})
# assign consume material
man_order.action_assign()
@@ -273,6 +273,7 @@ class TestMrpOrder(TestMrpCommon):
'final_lot_id': finished_lot.id,
'qty_producing': 48
})
kit_wo.record_production()
self.assertEqual(kit_wo.state, 'done', "Workorder should be in done state.")