From 074c1737534ecffef4ef80f46ccdf1497e794446 Mon Sep 17 00:00:00 2001 From: Sergi Almacellas Abellana Date: Sat, 7 Sep 2024 11:27:39 +0200 Subject: [PATCH] Set routing on production request supplied on sale Closes #13295 --- modules/sale_supply_production/__init__.py | 4 + modules/sale_supply_production/sale.py | 12 +++ modules/sale_supply_production/setup.py | 5 +- ...cenario_sale_supply_production_routing.rst | 84 +++++++++++++++++++ 4 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 modules/sale_supply_production/tests/scenario_sale_supply_production_routing.rst diff --git a/modules/sale_supply_production/__init__.py b/modules/sale_supply_production/__init__.py index f2fd74d908..bdc0c92436 100644 --- a/modules/sale_supply_production/__init__.py +++ b/modules/sale_supply_production/__init__.py @@ -20,3 +20,7 @@ def register(): module='sale_supply_production', type_='wizard') Pool.register( module='sale_supply_production', type_='report') + Pool.register( + sale.Line_Routing, + module='sale_supply_production', type_='model', + depends=['production_routing']) diff --git a/modules/sale_supply_production/sale.py b/modules/sale_supply_production/sale.py index 8fb3104ebf..f2d3003eff 100644 --- a/modules/sale_supply_production/sale.py +++ b/modules/sale_supply_production/sale.py @@ -112,3 +112,15 @@ class Line(metaclass=PoolMeta): state='request', origin=self, ) + + +class Line_Routing(metaclass=PoolMeta): + __name__ = 'sale.line' + + def get_production(self, product_quantities, bom_pattern=None): + production = super().get_production( + product_quantities, bom_pattern=bom_pattern) + if production and production.product: + if pbom := production.product.get_bom(bom_pattern): + production.routing = pbom.routing + return production diff --git a/modules/sale_supply_production/setup.py b/modules/sale_supply_production/setup.py index eec66ba559..b803c870ed 100755 --- a/modules/sale_supply_production/setup.py +++ b/modules/sale_supply_production/setup.py @@ -50,7 +50,10 @@ for dep in info.get('depends', []): requires.append(get_require_version('trytond_%s' % dep)) requires.append(get_require_version('trytond')) -tests_require = [get_require_version('proteus')] +tests_require = [ + get_require_version('proteus'), + get_require_version('trytond_production_routing'), + ] setup(name=name, version=version, diff --git a/modules/sale_supply_production/tests/scenario_sale_supply_production_routing.rst b/modules/sale_supply_production/tests/scenario_sale_supply_production_routing.rst new file mode 100644 index 0000000000..ca908644e2 --- /dev/null +++ b/modules/sale_supply_production/tests/scenario_sale_supply_production_routing.rst @@ -0,0 +1,84 @@ +======================================= +Sale Supply Production Routing Scenario +======================================= + +Imports:: + + >>> from decimal import Decimal + + >>> from proteus import Model + >>> from trytond.modules.company.tests.tools import create_company + >>> from trytond.tests.tools import activate_modules, assertEqual + +Activate modules:: + + >>> config = activate_modules(['sale_supply_production', 'production_routing']) + + >>> BoM = Model.get('production.bom') + >>> Party = Model.get('party.party') + >>> ProductTemplate = Model.get('product.template') + >>> ProductUom = Model.get('product.uom') + >>> Production = Model.get('production') + >>> Routing = Model.get('production.routing') + >>> Sale = Model.get('sale.sale') + +Create company:: + + >>> _ = create_company() + +Create parties:: + + >>> Party = Model.get('party.party') + >>> customer = Party(name="Customer") + >>> customer.save() + +Create product:: + + >>> unit, = ProductUom.find([('name', '=', "Unit")]) + + >>> template = ProductTemplate() + >>> template.name = "Product" + >>> template.default_uom = unit + >>> template.type = 'goods' + >>> template.producible = True + >>> template.salable = True + >>> template.supply_on_sale = 'always' + >>> template.list_price = Decimal(30) + >>> product, = template.products + >>> product.cost_price = Decimal(20) + >>> template.save() + >>> product, = template.products + +Create a Bill of Material with routing:: + + >>> bom = BoM(name="product") + >>> _ = bom.outputs.new(product=product, quantity=1) + >>> bom.save() + >>> routing = Routing(name="product") + >>> routing.boms.append(BoM(bom.id)) + >>> routing.save() + + >>> _ = product.boms.new(bom=bom, routing=routing) + >>> product.save() + +Sale 10 products:: + + >>> sale = Sale() + >>> sale.party = customer + >>> sale.invoice_method = 'manual' + >>> line = sale.lines.new() + >>> line.product = product + >>> line.quantity = 10 + >>> sale.click('quote') + >>> sale.click('confirm') + >>> sale.state + 'processing' + +Check the production:: + + >>> production, = Production.find([]) + >>> production.state + 'request' + >>> assertEqual(production.product, product) + >>> assertEqual(production.bom, bom) + >>> assertEqual(production.routing, routing)