diff --git a/addons/sale_mrp/models/sale.py b/addons/sale_mrp/models/sale.py index 87bf820240a58c1373332700b37842e49da6ca52..0c401ce99b110d52d032a020c1f84cb1bf1d3cac 100644 --- a/addons/sale_mrp/models/sale.py +++ b/addons/sale_mrp/models/sale.py @@ -14,16 +14,21 @@ class SaleOrder(models.Model): @api.depends('procurement_group_id.stock_move_ids.created_production_id.procurement_group_id.mrp_production_ids') def _compute_mrp_production_count(self): - data = self.env['procurement.group'].read_group([('sale_id', 'in', self.ids), ('mrp_production_ids', '!=', False)], ['id'], ['sale_id']) + data = self.env['procurement.group'].read_group([('sale_id', 'in', self.ids)], ['ids:array_agg(id)'], ['sale_id']) mrp_count = dict() for item in data: - mrp_count[item['sale_id'][0]] = item['sale_id_count'] + procurement_groups = self.env['procurement.group'].browse(item['ids']) + mrp_count[item['sale_id'][0]] = len( + set(procurement_groups.stock_move_ids.created_production_id.ids) | + set(procurement_groups.mrp_production_ids.ids)) for sale in self: sale.mrp_production_count = mrp_count.get(sale.id) def action_view_mrp_production(self): self.ensure_one() - mrp_production_ids = self.env['mrp.production'].search([('procurement_group_id.sale_id', '=', self.id)]).ids + procurement_groups = self.env['procurement.group'].search([('sale_id', 'in', self.ids)]) + mrp_production_ids = set(procurement_groups.stock_move_ids.created_production_id.ids) |\ + set(procurement_groups.mrp_production_ids.ids) action = { 'res_model': 'mrp.production', 'type': 'ir.actions.act_window', @@ -31,12 +36,12 @@ class SaleOrder(models.Model): if len(mrp_production_ids) == 1: action.update({ 'view_mode': 'form', - 'res_id': mrp_production_ids[0], + 'res_id': mrp_production_ids.pop(), }) else: action.update({ 'name': _("Manufacturing Orders Generated by %s", self.name), - 'domain': [('id', 'in', mrp_production_ids)], + 'domain': [('id', 'in', list(mrp_production_ids))], 'view_mode': 'tree,form', }) return action diff --git a/addons/sale_mrp/tests/test_multistep_manufacturing.py b/addons/sale_mrp/tests/test_multistep_manufacturing.py index b0ab1d0988e78545bf2d68c675186e3b72bab37c..13b5e43191527d85e2406c7a9ed9c49921feb507 100644 --- a/addons/sale_mrp/tests/test_multistep_manufacturing.py +++ b/addons/sale_mrp/tests/test_multistep_manufacturing.py @@ -82,6 +82,11 @@ class TestMultistepManufacturing(TestMrpCommon): self.sale_order.action_confirm() # Get manufactured procurement mo_procurement = self.MrpProduction.search([('origin', '=', self.sale_order.name)]) + mo = self.env['mrp.production'].search([ + ('origin', '=', self.sale_order.name), + ('product_id', '=', self.product_manu.id), + ]) + self.assertEqual(self.sale_order.action_view_mrp_production()['res_id'], mo.id) self.assertEqual(mo_procurement.location_src_id.id, self.warehouse.pbm_loc_id.id, "Source loction does not match.") self.assertEqual(mo_procurement.location_dest_id.id, self.warehouse.lot_stock_id.id, "Destination location does not match.") diff --git a/addons/sale_mrp/tests/test_sale_mrp_flow.py b/addons/sale_mrp/tests/test_sale_mrp_flow.py index 8787610642ba89c177fa447d1fcf0ea6513013ba..4c9bde734de97dd69851982b186d646d5f2a9dd9 100644 --- a/addons/sale_mrp/tests/test_sale_mrp_flow.py +++ b/addons/sale_mrp/tests/test_sale_mrp_flow.py @@ -295,6 +295,9 @@ class TestSaleMrpFlow(ValuationReconciliationTestCommon): order = order_form.save() order.action_confirm() + # Verify buttons are working as expected + self.assertEqual(order.mrp_production_count, 1, "User should see the closest manufacture order in the smart button") + # =============================================================================== # Sales order of 10 Dozen product A should create production order # like .. diff --git a/addons/sale_mrp/tests/test_sale_mrp_procurement.py b/addons/sale_mrp/tests/test_sale_mrp_procurement.py index 4de6c6d0a4cf19770211b76dc1b0af78891f5bdf..513f581155deba7a9a98bebcebf50f1199aed2b9 100644 --- a/addons/sale_mrp/tests/test_sale_mrp_procurement.py +++ b/addons/sale_mrp/tests/test_sale_mrp_procurement.py @@ -69,6 +69,9 @@ class TestSaleMrpProcurement(TransactionCase): mo = self.env['mrp.production'].search([('origin', 'like', sale_order_so0.name)], limit=1) self.assertTrue(mo, 'Manufacturing order has not been generated') + # Check the mo is displayed on the so + self.assertEqual(mo.id, sale_order_so0.action_view_mrp_production()['res_id']) + def test_sale_mrp_pickings(self): """ Test sale of multiple mrp products in MTO to avoid generating multiple deliveries @@ -162,6 +165,9 @@ class TestSaleMrpProcurement(TransactionCase): sale_order_so0.action_confirm() + # Verify buttons are working as expected + self.assertEqual(sale_order_so0.mrp_production_count, 2, "User should see the correct number of manufacture orders in smart button") + pickings = sale_order_so0.picking_ids # One delivery...