# This file is part of Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. from decimal import Decimal from trytond.pool import Pool, PoolMeta from trytond.model import fields from trytond.modules.product import price_digits, round_price from trytond.exceptions import UserError BOM_CHANGES = ['bom', 'product', 'quantity', 'uom', 'warehouse', 'location', 'company', 'inputs', 'outputs'] class Production(metaclass=PoolMeta): "Production" __name__ = 'production' @fields.depends(*BOM_CHANGES) def explode_bom(self): pool = Pool() Uom = pool.get('product.uom') if not (self.bom and self.product and self.uom): return factor = self.bom.compute_factor(self.product, self.quantity or 0, self.uom) inputs = [] for input_ in self.bom.inputs: if input_.product.producible: for input_ in input_.product.template.boms.inputs: quantity = input_.compute_quantity(factor) move = self._explode_move_values( self.picking_location, self.location, self.company, input_, quantity) if move: inputs.append(move) quantity = Uom.compute_qty(input_.uom, quantity, input_.product.default_uom, round=False) else: quantity = input_.compute_quantity(factor) move = self._explode_move_values( self.picking_location, self.location, self.company, input_, quantity) if move: inputs.append(move) quantity = Uom.compute_qty(input_.uom, quantity, input_.product.default_uom, round=False) self.inputs = inputs outputs = [] for output in self.bom.outputs: quantity = output.compute_quantity(factor) move = self._explode_move_values( self.location, self.output_location, self.company, output, quantity) if move: move.unit_price = Decimal(0) outputs.append(move) self.outputs = outputs