From a394d39332abe4c8798a1bf6b80717145ea77313 Mon Sep 17 00:00:00 2001 From: William Henrotin Date: Thu, 21 Dec 2023 13:50:35 +0100 Subject: [PATCH] [FIX] mrp: compute lead days in multi warehouse flow Since 461d311b7357d, the manufacture rule lead time is taken into account in the date computation for the procurement. The issue comes from the fact we assume there is only one warehouse related to the stock rules chain. closes odoo/odoo#147261 Signed-off-by: William Henrotin (whe) --- addons/mrp/models/stock_rule.py | 20 +++++++------- addons/mrp/tests/test_stock.py | 46 +++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/addons/mrp/models/stock_rule.py b/addons/mrp/models/stock_rule.py index fca88c6bdf1..1397f3f21e2 100644 --- a/addons/mrp/models/stock_rule.py +++ b/addons/mrp/models/stock_rule.py @@ -210,16 +210,18 @@ class StockRule(models.Model): if bom.type == 'normal': # pre-production rules warehouse = self.location_dest_id.warehouse_id - if warehouse.manufacture_steps != 'mrp_one_step': - wh_manufacture_rules = product._get_rules_from_location(product.property_stock_production, route_ids=warehouse.pbm_route_id) - extra_delays, extra_delay_description = (wh_manufacture_rules - self)._get_lead_days(product, **values) - for key, value in extra_delays.items(): - delays[key] += value - delay_description += extra_delay_description + for wh in warehouse: + if wh.manufacture_steps != 'mrp_one_step': + wh_manufacture_rules = product._get_rules_from_location(product.property_stock_production, route_ids=wh.pbm_route_id) + extra_delays, extra_delay_description = (wh_manufacture_rules - self)._get_lead_days(product, **values) + for key, value in extra_delays.items(): + delays[key] += value + delay_description += extra_delay_description # manufacturing security lead time - security_delay = self.picking_type_id.company_id.manufacturing_lead - delays['total_delay'] += security_delay - delays['security_lead_days'] += security_delay + for comp in self.picking_type_id.company_id: + security_delay = comp.manufacturing_lead + delays['total_delay'] += security_delay + delays['security_lead_days'] += security_delay if not bypass_delay_description: delay_description.append((_('Manufacture Security Lead Time'), _('+ %d day(s)', security_delay))) days_to_order = values.get('days_to_order', bom.days_to_prepare_mo) diff --git a/addons/mrp/tests/test_stock.py b/addons/mrp/tests/test_stock.py index 546fb223ec5..21704709731 100644 --- a/addons/mrp/tests/test_stock.py +++ b/addons/mrp/tests/test_stock.py @@ -82,6 +82,52 @@ class TestWarehouseMrp(common.TestMrpCommon): self.assertTrue(self.warehouse_1.manu_type_id.active) self.assertIn(manu_route, warehouse_1_stock_manager._get_all_routes()) + def test_multi_warehouse_resupply(self): + """ test a multi warehouse flow give a correct date delay + product_6 is sold from warehouse_1, its component (product_4) is + resupplied from warehouse_2 and manufactured in warehouse_2. + Everything in mto """ + + mto = self.env.ref('stock.route_warehouse0_mto') + mto.active = True + warehouse_2 = self.env['stock.warehouse'].create({ + 'name': 'Warehouse 2', + 'code': 'WH2', + }) + # product 4 can only be manufacture in WH2 + self.bom_1.picking_type_id = warehouse_2.manu_type_id + + self.warehouse_1.manufacture_steps = "pbm" + self.warehouse_1.resupply_wh_ids = [(6, 0, [warehouse_2.id])] + self.product_6.route_ids = [(6, 0, [ + self.env.ref('mrp.route_warehouse0_manufacture').id, + mto.id, + ])] + self.product_4.route_ids = [(6, 0, [ + self.warehouse_1.resupply_route_ids.id, + self.env.ref('stock.route_warehouse0_mto').id, + mto.id, + ])] + warehouse_2.resupply_route_ids.rule_ids.procure_method = 'make_to_order' + customer_location = self.env.ref('stock.stock_location_customers') + pg = self.env['procurement.group'].create({'name': 'Test-pg-mtso-mto'}) + + self.env['procurement.group'].run([ + pg.Procurement( + self.product_6, + 5.0, + self.product_6.uom_id, + customer_location, + 'test_ressuply', + 'test_ressuply', + self.warehouse_1.company_id, + { + 'warehouse_id': self.warehouse_1, + 'group_id': pg, + }, + ), + ]) + def test_manufacturing_scrap(self): """ Testing to do a scrap of consumed material.