diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py index b7b339570ca..e45db5f7572 100644 --- a/addons/mrp/models/mrp_production.py +++ b/addons/mrp/models/mrp_production.py @@ -494,7 +494,11 @@ class MrpProduction(models.Model): production.state = 'draft' elif production.state == 'cancel' or (production.move_finished_ids and all(move.state == 'cancel' for move in production.move_finished_ids)): production.state = 'cancel' - elif production.state == 'done' or (production.move_raw_ids and all(move.state in ('cancel', 'done') for move in production.move_raw_ids)): + elif ( + production.state == 'done' + or (production.move_raw_ids and all(move.state in ('cancel', 'done') for move in production.move_raw_ids)) + and all(move.state in ('cancel', 'done') for move in production.move_finished_ids) + ): production.state = 'done' elif production.workorder_ids and all(wo_state in ('done', 'cancel') for wo_state in production.workorder_ids.mapped('state')): production.state = 'to_close' diff --git a/addons/mrp/tests/test_byproduct.py b/addons/mrp/tests/test_byproduct.py index b39f74926e7..9ae0fe84050 100644 --- a/addons/mrp/tests/test_byproduct.py +++ b/addons/mrp/tests/test_byproduct.py @@ -85,6 +85,35 @@ class TestMrpByProduct(common.TransactionCase): # I see that stock moves of External Hard Disk including Headset USB are done now. self.assertFalse(any(move.state != 'done' for move in moves), 'Moves are not done!') + def test_01_mrp_byproduct(self): + self.env["stock.quant"].create({ + "product_id": self.product_c_id, + "location_id": self.warehouse.lot_stock_id.id, + "quantity": 4, + }) + bom_product_a = self.MrpBom.create({ + 'product_tmpl_id': self.product_a.product_tmpl_id.id, + 'product_qty': 1.0, + 'type': 'normal', + 'product_uom_id': self.uom_unit_id, + 'bom_line_ids': [(0, 0, {'product_id': self.product_c_id, 'product_uom_id': self.uom_unit_id, 'product_qty': 2})] + }) + mnf_product_a_form = Form(self.env['mrp.production']) + mnf_product_a_form.product_id = self.product_a + mnf_product_a_form.bom_id = bom_product_a + mnf_product_a_form.product_qty = 2.0 + mnf_product_a = mnf_product_a_form.save() + mnf_product_a.action_confirm() + self.assertEqual(mnf_product_a.state, "confirmed") + mnf_product_a.move_raw_ids._action_assign() + mnf_product_a.move_raw_ids.quantity_done = mnf_product_a.move_raw_ids.product_uom_qty + mnf_product_a.move_raw_ids._action_done() + self.assertEqual(mnf_product_a.state, "progress") + mnf_product_a.qty_producing = 2 + mnf_product_a.button_mark_done() + self.assertTrue(mnf_product_a.move_finished_ids) + self.assertEqual(mnf_product_a.state, "done") + def test_change_product(self): """ Create a production order for a specific product with a BoM. Then change the BoM and the finished product for other ones and check the finished product of the first mo did not became a byproduct of the second one."""