From 08bf52f5dbb35d9d9ac64f47310a60e0565f158c Mon Sep 17 00:00:00 2001 From: Arnold Moyaux Date: Tue, 12 Dec 2017 17:33:42 +0100 Subject: [PATCH] [FIX] mrp: final lot not passed between workorder Use case to reproduce: - Create a MO with a product tracked and a qty to produce greater than 1. - The Bom should also use a routing with at least 2 operations. - On the first workorder only produce 1 unit and record the production - Go to the next workorder -> The final lot is not set. It happens because the lot for the next workorder is only set if the total quanity for the mo was produced. This commit fixes the bug by removing the code for the workorder lot assignation outside the wrong condition. This commit also update the test test_00b_workorder_process that allows us to find the above bug. --- addons/mrp/models/mrp_workorder.py | 5 ++-- addons/mrp/tests/test_workorder_operation.py | 30 ++++++++++++-------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/addons/mrp/models/mrp_workorder.py b/addons/mrp/models/mrp_workorder.py index 31e23f3b702..7937055a3b9 100644 --- a/addons/mrp/models/mrp_workorder.py +++ b/addons/mrp/models/mrp_workorder.py @@ -382,9 +382,10 @@ class MrpWorkorder(models.Model): self.qty_producing = float_round(self.production_id.product_qty - self.qty_produced, precision_rounding=rounding) self._generate_lot_ids() + if self.next_work_order_id and self.production_id.product_id.tracking != 'none': + self.next_work_order_id._assign_default_final_lot_id() + if float_compare(self.qty_produced, self.production_id.product_qty, precision_rounding=rounding) >= 0: - if self.next_work_order_id and self.production_id.product_id.tracking != 'none': - self.next_work_order_id._assign_default_final_lot_id() self.button_finish() return True diff --git a/addons/mrp/tests/test_workorder_operation.py b/addons/mrp/tests/test_workorder_operation.py index 55edb1ff5da..79121e0468e 100644 --- a/addons/mrp/tests/test_workorder_operation.py +++ b/addons/mrp/tests/test_workorder_operation.py @@ -112,7 +112,6 @@ class TestWorkOrderProcess(common.TransactionCase): self.assertEqual(product_table_leg.qty_available, 19) self.assertEqual(product_table_sheet.qty_available, 19) - @unittest.skip('failing test: is up to date?') def test_00b_workorder_process(self): """ Testing consume quants and produced quants with workorder """ dining_table = self.env.ref("mrp.product_product_computer_desk") @@ -120,11 +119,18 @@ class TestWorkOrderProcess(common.TransactionCase): product_table_leg = self.env.ref('mrp.product_product_computer_desk_leg') product_bolt = self.env.ref('mrp.product_product_computer_desk_bolt') + bom = self.env['mrp.bom'].browse(self.ref("mrp.mrp_bom_desk")) + bom.routing_id = self.ref('mrp.mrp_routing_1') + + bom.bom_line_ids.filtered(lambda p: p.product_id == product_table_sheet).operation_id = bom.routing_id.operation_ids[0] + bom.bom_line_ids.filtered(lambda p: p.product_id == product_table_leg).operation_id = bom.routing_id.operation_ids[1] + bom.bom_line_ids.filtered(lambda p: p.product_id == product_bolt).operation_id = bom.routing_id.operation_ids[2] + production_table = self.env['mrp.production'].create({ 'product_id': dining_table.id, 'product_qty': 2.0, 'product_uom_id': dining_table.uom_id.id, - 'bom_id': self.ref("mrp.mrp_bom_desk") + 'bom_id': bom.id, }) # Set tracking lot on finish and consume products. @@ -185,11 +191,11 @@ class TestWorkOrderProcess(common.TransactionCase): finished_lot = self.env['stock.production.lot'].create({'product_id': production_table.product_id.id}) workorders[0].write({'final_lot_id': finished_lot.id, 'qty_producing': 1.0}) workorders[0].button_start() - workorders[0].active_move_lot_ids[0].write({'lot_id': lot_sheet.id, 'quantity_done': 1}) + workorders[0].active_move_line_ids[0].write({'lot_id': lot_sheet.id, 'qty_done': 1}) self.assertEqual(workorders[0].state, 'progress') workorders[0].record_production() - move_table_sheet = production_table.move_raw_ids.filtered(lambda x : x.product_id == product_table_sheet) + move_table_sheet = production_table.move_raw_ids.filtered(lambda p: p.product_id == product_table_sheet) self.assertEqual(move_table_sheet.quantity_done, 1) # -------------------------------------------------------------- @@ -197,9 +203,9 @@ class TestWorkOrderProcess(common.TransactionCase): # --------------------------------------------------------- workorders[1].button_start() workorders[1].qty_producing = 1.0 - workorders[1].active_move_lot_ids[0].write({'lot_id': lot_leg.id, 'quantity_done': 4}) + workorders[1].active_move_line_ids[0].write({'lot_id': lot_leg.id, 'qty_done': 4}) workorders[1].record_production() - move_leg = production_table.move_raw_ids.filtered(lambda x : x.product_id == product_table_leg) + move_leg = production_table.move_raw_ids.filtered(lambda p: p.product_id == product_table_leg) #self.assertEqual(workorders[1].state, 'done') self.assertEqual(move_leg.quantity_done, 4) @@ -208,9 +214,9 @@ class TestWorkOrderProcess(common.TransactionCase): # --------------------------------------------------------- workorders[2].button_start() workorders[2].qty_producing = 1.0 - move_lot = workorders[2].active_move_lot_ids[0] - move_lot.write({'lot_id': lot_bolt.id, 'quantity_done': 4}) - move_table_bolt = production_table.move_raw_ids.filtered(lambda x : x.product_id.id == product_bolt.id) + move_lot = workorders[2].active_move_line_ids[0] + move_lot.write({'lot_id': lot_bolt.id, 'qty_done': 4}) + move_table_bolt = production_table.move_raw_ids.filtered(lambda p: p.product_id.id == product_bolt.id) workorders[2].record_production() self.assertEqual(move_table_bolt.quantity_done, 4) @@ -222,9 +228,9 @@ class TestWorkOrderProcess(common.TransactionCase): # Check consume quants and produce quants after posting inventory # --------------------------------------------------------------- production_table.post_inventory() - self.assertEqual(sum(move_table_sheet.quant_ids.mapped('qty')), 1, "Wrong quantity of consumed product %s" % move_table_sheet.product_id.name) - self.assertEqual(sum(move_leg.quant_ids.mapped('qty')), 4, "Wrong quantity of consumed product %s" % move_leg.product_id.name) - self.assertEqual(sum(move_table_bolt.quant_ids.mapped('qty')), 4, "Wrong quantity of consumed product %s" % move_table_bolt.product_id.name) + self.assertEqual(sum(move_table_sheet.mapped('quantity_done')), 1, "Wrong quantity of consumed product %s" % move_table_sheet.product_id.name) + self.assertEqual(sum(move_leg.mapped('quantity_done')), 4, "Wrong quantity of consumed product %s" % move_leg.product_id.name) + self.assertEqual(sum(move_table_bolt.mapped('quantity_done')), 4, "Wrong quantity of consumed product %s" % move_table_bolt.product_id.name) def test_01_without_workorder(self): """ Testing consume quants and produced quants without workorder """