From 1fcd308aa6e6aa20697dcedd71ea8cd629152fea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sat, 7 Sep 2024 11:20:52 +0200 Subject: [PATCH] Use MatchMixin to get product bom --- modules/production/bom.py | 11 +++++++---- modules/production/product.py | 9 ++++++++- modules/production_routing/production.py | 7 ++++--- modules/sale_supply_production/sale.py | 5 +++-- modules/stock_supply_production/production.py | 5 +++-- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/modules/production/bom.py b/modules/production/bom.py index 312bf5e438..d3bd6b9b70 100644 --- a/modules/production/bom.py +++ b/modules/production/bom.py @@ -243,9 +243,10 @@ class BOMTree(ModelView): result = [] if bom is None: - if not product.boms: + pbom = product.get_bom() + if pbom is None: return result - bom = product.boms[0].bom + bom = pbom.bom factor = bom.compute_factor(product, quantity, unit) for input_ in bom.inputs: @@ -342,8 +343,10 @@ class OpenBOMTree(Wizard): defaults['product'] = product.id if getattr(self.start, 'bom', None): defaults['bom'] = self.start.bom.id - elif product.boms: - defaults['bom'] = product.boms[0].id + else: + bom = product.get_bom() + if bom: + defaults['bom'] = bom.id defaults['quantity'] = getattr(self.start, 'quantity', None) return defaults diff --git a/modules/production/product.py b/modules/production/product.py index 6f499ab1a0..1e67064975 100644 --- a/modules/production/product.py +++ b/modules/production/product.py @@ -76,8 +76,15 @@ class Product(metaclass=PoolMeta): default.setdefault('production_lead_times', None) return super(Product, cls).copy(products, default=default) + def get_bom(self, pattern=None): + if pattern is None: + pattern = {} + for bom in self.boms: + if bom.match(pattern): + return bom -class ProductBom(sequence_ordered(), ModelSQL, ModelView): + +class ProductBom(sequence_ordered(), MatchMixin, ModelSQL, ModelView): 'Product - BOM' __name__ = 'product.product-production.bom' diff --git a/modules/production_routing/production.py b/modules/production_routing/production.py index ea08162af6..c0ebe8ebec 100644 --- a/modules/production_routing/production.py +++ b/modules/production_routing/production.py @@ -36,9 +36,10 @@ class Production(metaclass=PoolMeta): @classmethod def compute_request( cls, product, warehouse, quantity, date, company, - order_point=None): + order_point=None, bom_pattern=None): production = super(Production, cls).compute_request( product, warehouse, quantity, date, company, - order_point=order_point) - production.routing = product.boms[0].routing if product.boms else None + order_point=order_point, bom_pattern=bom_pattern) + if bom := product.get_bom(bom_pattern): + production.routing = bom.routing return production diff --git a/modules/sale_supply_production/sale.py b/modules/sale_supply_production/sale.py index fed50f95d5..8fb3104ebf 100644 --- a/modules/sale_supply_production/sale.py +++ b/modules/sale_supply_production/sale.py @@ -66,7 +66,7 @@ class Line(metaclass=PoolMeta): default.setdefault('productions', None) return super().copy(lines, default=default) - def get_production(self, product_quantities): + def get_production(self, product_quantities, bom_pattern=None): "Return production for the sale line" pool = Pool() Production = pool.get('production') @@ -99,13 +99,14 @@ class Line(metaclass=PoolMeta): date = today else: date -= dt.timedelta(1) + pbom = product.get_bom(bom_pattern) return Production( planned_date=date, company=self.sale.company, warehouse=self.warehouse, location=self.warehouse.production_location, product=product, - bom=product.boms[0].bom if product.boms else None, + bom=pbom.bom if pbom else None, unit=self.unit, quantity=quantity, state='request', diff --git a/modules/stock_supply_production/production.py b/modules/stock_supply_production/production.py index 321c2f46de..8ef3c42740 100644 --- a/modules/stock_supply_production/production.py +++ b/modules/stock_supply_production/production.py @@ -151,7 +151,7 @@ class Production(metaclass=PoolMeta): @classmethod def compute_request( cls, product, warehouse, quantity, date, company, - order_point=None): + order_point=None, bom_pattern=None): """ Return the value of the production request. """ @@ -169,13 +169,14 @@ class Production(metaclass=PoolMeta): origin = str(order_point) else: origin = 'stock.order_point,-1' + pbom = product.get_bom(bom_pattern) return cls( planned_date=date, company=company, warehouse=warehouse, location=warehouse.production_location, product=product, - bom=product.boms[0].bom if product.boms else None, + bom=pbom.bom if pbom else None, unit=unit, quantity=quantity, state='request',