diff --git a/mrp_multi_level/demo/mrp_bom_demo.xml b/mrp_multi_level/demo/mrp_bom_demo.xml index e31a7d9db..21e90a822 100644 --- a/mrp_multi_level/demo/mrp_bom_demo.xml +++ b/mrp_multi_level/demo/mrp_bom_demo.xml @@ -40,6 +40,59 @@ 5 + + + + + 5 + + + + 1 + + 1 + + + + + + 1 + + 2 + + + + + + 1 + + 3 + + + + + + 1 + + 4 + + + diff --git a/mrp_multi_level/demo/product_mrp_area_demo.xml b/mrp_multi_level/demo/product_mrp_area_demo.xml index 9a4a8ea0f..fdb6a264c 100644 --- a/mrp_multi_level/demo/product_mrp_area_demo.xml +++ b/mrp_multi_level/demo/product_mrp_area_demo.xml @@ -8,6 +8,22 @@ + + + + + + + + + + + + + + + + @@ -24,4 +40,20 @@ + + + + + + + + + + + + + + + + diff --git a/mrp_multi_level/demo/product_product_demo.xml b/mrp_multi_level/demo/product_product_demo.xml index 13c635bcf..f99f38e11 100644 --- a/mrp_multi_level/demo/product_product_demo.xml +++ b/mrp_multi_level/demo/product_product_demo.xml @@ -24,6 +24,13 @@ eval="[(6, 0, [ref('mrp.route_warehouse0_manufacture')])]" /> + + + + SF-1 @@ -70,4 +77,48 @@ eval="[(6, 0, [ref('purchase_stock.route_warehouse0_buy')])]" /> + + AV-11 steel + + product + + + + + + AV-12 aluminium + + product + + + + + + AV-21 white + + product + + + + + + AV-22 black + + product + + + + diff --git a/mrp_multi_level/demo/product_supplierinfo_demo.xml b/mrp_multi_level/demo/product_supplierinfo_demo.xml index 03a0fc278..c29460900 100644 --- a/mrp_multi_level/demo/product_supplierinfo_demo.xml +++ b/mrp_multi_level/demo/product_supplierinfo_demo.xml @@ -1,5 +1,33 @@ + + + + 4 + 0 + 100 + + + + + 4 + 0 + 100 + + + + + 4 + 0 + 100 + + + + + 4 + 0 + 100 + diff --git a/mrp_multi_level/tests/common.py b/mrp_multi_level/tests/common.py index 19b8f453a..20482b437 100644 --- a/mrp_multi_level/tests/common.py +++ b/mrp_multi_level/tests/common.py @@ -32,6 +32,11 @@ class TestMrpMultiLevelCommon(SavepointCase): cls.sf_2 = cls.env.ref("mrp_multi_level.product_product_sf_2") cls.pp_1 = cls.env.ref("mrp_multi_level.product_product_pp_1") cls.pp_2 = cls.env.ref("mrp_multi_level.product_product_pp_2") + cls.product_4b = cls.env.ref("product.product_product_4b") + cls.av_11 = cls.env.ref("mrp_multi_level.product_product_av_11") + cls.av_12 = cls.env.ref("mrp_multi_level.product_product_av_12") + cls.av_21 = cls.env.ref("mrp_multi_level.product_product_av_21") + cls.av_22 = cls.env.ref("mrp_multi_level.product_product_av_22") cls.company = cls.env.ref("base.main_company") cls.mrp_area = cls.env.ref("mrp_multi_level.mrp_area_stock_wh0") cls.vendor = cls.env.ref("mrp_multi_level.res_partner_lazer_tech") @@ -201,7 +206,7 @@ class TestMrpMultiLevelCommon(SavepointCase): cls.product_scenario_1, 18, dt_next_group, location=cls.cases_loc ) - # Create test picking for FP-1 and FP-2: + # Create test picking for FP-1, FP-2 and Desk(steel, black): res = cls.calendar.plan_days(7 + 1, datetime.today().replace(hour=0)) date_move = res.date() cls.picking_1 = cls.stock_picking_obj.create( @@ -239,6 +244,20 @@ class TestMrpMultiLevelCommon(SavepointCase): "location_dest_id": cls.customer_location.id, }, ), + ( + 0, + 0, + { + "name": "Test move product-4b", + "product_id": cls.product_4b.id, + "date_expected": date_move, + "date": date_move, + "product_uom": cls.product_4b.uom_id.id, + "product_uom_qty": 150, + "location_id": cls.stock_location.id, + "location_dest_id": cls.customer_location.id, + }, + ), ], } ) diff --git a/mrp_multi_level/tests/test_mrp_multi_level.py b/mrp_multi_level/tests/test_mrp_multi_level.py index 64c61527c..9282ad9a7 100644 --- a/mrp_multi_level/tests/test_mrp_multi_level.py +++ b/mrp_multi_level/tests/test_mrp_multi_level.py @@ -309,3 +309,30 @@ class TestMrpMultiLevel(TestMrpMultiLevelCommon): self.assertEqual(mrp_invs[0].to_procure, 130) # Net needs = 18, available on-hand = 3 -> 15 self.assertEqual(mrp_invs[1].to_procure, 15) + + def test_12_bom_line_attribute_value_skip(self): + """Check for the correct demand on components of a product with + multiple variants""" + product_4b_demand = self.mrp_inventory_obj.search( + [("product_mrp_area_id.product_id", "=", self.product_4b.id)] + ) + self.assertTrue(product_4b_demand) + self.assertTrue(product_4b_demand.to_procure) + # No demand or supply for AV-12 or AV-21 + av_12_supply = self.mrp_inventory_obj.search( + [("product_mrp_area_id.product_id", "=", self.av_12.id)] + ) + self.assertFalse(av_12_supply) + av_21_supply = self.mrp_inventory_obj.search( + [("product_mrp_area_id.product_id", "=", self.av_21.id)] + ) + self.assertFalse(av_21_supply) + # Supply for AV-11 and AV-22 + av_11_supply = self.mrp_inventory_obj.search( + [("product_mrp_area_id.product_id", "=", self.av_11.id)] + ) + self.assertTrue(av_11_supply) + av_22_supply = self.mrp_inventory_obj.search( + [("product_mrp_area_id.product_id", "=", self.av_22.id)] + ) + self.assertTrue(av_22_supply) diff --git a/mrp_multi_level/wizards/mrp_multi_level.py b/mrp_multi_level/wizards/mrp_multi_level.py index ce2f41978..f554cbc30 100644 --- a/mrp_multi_level/wizards/mrp_multi_level.py +++ b/mrp_multi_level/wizards/mrp_multi_level.py @@ -189,6 +189,8 @@ class MultiLevelMrp(models.TransientModel): ): # Stop explosion. continue + if bomline._skip_bom_line(product_mrp_area_id.product_id): + continue # TODO: review: mrp_transit_delay, mrp_inspection_delay mrp_date_demand_2 = mrp_date_demand - timedelta( days=(