============================ Production Lot Cost Scenario ============================ ============= General Setup ============= Imports:: >>> import datetime >>> from dateutil.relativedelta import relativedelta >>> from decimal import Decimal >>> from proteus import config, Model, Wizard >>> today = datetime.date.today() Create database:: >>> config = config.set_trytond() >>> config.pool.test = True Install production_lot_cost Module:: >>> Module = Model.get('ir.module.module') >>> modules = Module.find([('name', '=', 'production_lot_cost')]) >>> Module.install([x.id for x in modules], config.context) >>> Wizard('ir.module.module.install_upgrade').execute('upgrade') Create company:: >>> Currency = Model.get('currency.currency') >>> CurrencyRate = Model.get('currency.currency.rate') >>> Company = Model.get('company.company') >>> Party = Model.get('party.party') >>> company_config = Wizard('company.company.config') >>> company_config.execute('company') >>> company = company_config.form >>> party = Party(name='Dunder Mifflin') >>> party.save() >>> company.party = party >>> currencies = Currency.find([('code', '=', 'USD')]) >>> if not currencies: ... currency = Currency(name='Euro', symbol=u'$', code='USD', ... rounding=Decimal('0.01'), mon_grouping='[3, 3, 0]', ... mon_decimal_point=',') ... currency.save() ... CurrencyRate(date=today + relativedelta(month=1, day=1), ... rate=Decimal('1.0'), currency=currency).save() ... else: ... currency, = currencies >>> company.currency = currency >>> company_config.execute('add') >>> company, = Company.find() Reload the context:: >>> User = Model.get('res.user') >>> config._context = User.get_preferences(True, config.context) Configuration production location:: >>> Location = Model.get('stock.location') >>> warehouse, = Location.find([('code', '=', 'WH')]) >>> production_location, = Location.find([('code', '=', 'PROD')]) >>> warehouse.production_location = production_location >>> warehouse.save() Create product:: >>> ProductUom = Model.get('product.uom') >>> unit, = ProductUom.find([('name', '=', 'Unit')]) >>> ProductTemplate = Model.get('product.template') >>> Product = Model.get('product.product') >>> product = Product() >>> template = ProductTemplate() >>> template.name = 'product' >>> template.default_uom = unit >>> template.type = 'goods' >>> template.list_price = Decimal(30) >>> template.cost_price = Decimal(20) >>> template.save() >>> product.template = template >>> product.save() Create Components:: >>> component1 = Product() >>> template1 = ProductTemplate() >>> template1.name = 'component 1' >>> template1.default_uom = unit >>> template1.type = 'goods' >>> template1.list_price = Decimal(5) >>> template1.cost_price = Decimal(1) >>> template1.save() >>> component1.template = template1 >>> component1.save() >>> meter, = ProductUom.find([('name', '=', 'Meter')]) >>> centimeter, = ProductUom.find([('name', '=', 'centimeter')]) >>> component2 = Product() >>> template2 = ProductTemplate() >>> template2.name = 'component 2' >>> template2.default_uom = meter >>> template2.type = 'goods' >>> template2.list_price = Decimal(7) >>> template2.cost_price = Decimal(5) >>> template2.save() >>> component2.template = template2 >>> component2.save() Create Bill of Material:: >>> BOM = Model.get('production.bom') >>> BOMInput = Model.get('production.bom.input') >>> BOMOutput = Model.get('production.bom.output') >>> bom = BOM(name='product') >>> input1 = BOMInput() >>> bom.inputs.append(input1) >>> input1.product = component1 >>> input1.quantity = 5 >>> input2 = BOMInput() >>> bom.inputs.append(input2) >>> input2.product = component2 >>> input2.quantity = 150 >>> input2.uom = centimeter >>> output = BOMOutput() >>> bom.outputs.append(output) >>> output.product = product >>> output.quantity = 1 >>> bom.save() >>> ProductBom = Model.get('product.product-production.bom') >>> product.boms.append(ProductBom(bom=bom)) >>> product.save() Create an Inventory:: >>> Inventory = Model.get('stock.inventory') >>> InventoryLine = Model.get('stock.inventory.line') >>> storage, = Location.find([ ... ('code', '=', 'STO'), ... ]) >>> inventory = Inventory() >>> inventory.location = storage >>> inventory_line1 = InventoryLine() >>> inventory.lines.append(inventory_line1) >>> inventory_line1.product = component1 >>> inventory_line1.quantity = 10 >>> inventory_line2 = InventoryLine() >>> inventory.lines.append(inventory_line2) >>> inventory_line2.product = component2 >>> inventory_line2.quantity = 5 >>> inventory.save() >>> Inventory.confirm([inventory.id], config.context) >>> inventory.state u'done' Create a production of product:: >>> Production = Model.get('production') >>> production = Production() >>> production.product = product >>> production.bom = bom >>> production.quantity = 2 >>> sorted([i.quantity for i in production.inputs]) == [10, 300] True >>> output, = production.outputs >>> output.quantity == 2 True >>> production.cost == Decimal('25') True >>> output.unit_price == Decimal('12.5') True >>> production.save() Create a Lot for the produced product:: >>> output, = production.outputs >>> config._context['from_move'] = output.id >>> Lot = Model.get('stock.lot') >>> lot = Lot(number='1') >>> lot.product = product >>> lot.cost_price >>> lot.save() >>> output.lot = lot >>> output.save() >>> del config._context['from_move'] Make the production:: >>> Production.wait([production.id], config.context) >>> production.state u'waiting' >>> Production.assign_try([production.id], config.context) True >>> production.reload() >>> all(i.state == 'assigned' for i in production.inputs) True >>> Production.run([production.id], config.context) >>> production.reload() >>> all(i.state == 'done' for i in production.inputs) True >>> Production.done([production.id], config.context) >>> production.reload() >>> output, = production.outputs >>> output.state u'done' >>> output.lot.cost_price == Decimal('12.5') True