Files

217 lines
7.4 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import datetime as dt
import random
from decimal import Decimal
from dateutil.relativedelta import relativedelta
from proteus import Model
def setup(config, activated, company):
BOM = Model.get('production.bom')
Production = Model.get('production')
ProductTemplate = Model.get('product.template')
Category = Model.get('product.category')
Uom = Model.get('product.uom')
unit, = Uom.find([('name', '=', 'Unit')])
if 'account_product' in activated:
Account = Model.get('account.account')
expense, = Account.find([
('company', '=', company.id),
('code', '=', '5.1.1'),
])
revenue, = Account.find([
('company', '=', company.id),
('code', '=', '4.1.1'),
])
account_category = Category(name="Computers", accounting=True)
account_category.account_expense = expense
account_category.account_revenue = revenue
account_category.save()
def create_product(name, list_price, cost_price):
template = ProductTemplate(name=name)
template.default_uom = unit
template.type = 'goods'
template.list_price = list_price
template.cost_price = cost_price
if 'account_product' in activated:
template.account_category = account_category
template.save()
return template.products[0]
bom = BOM(name='Computer rev1')
input_ = bom.inputs.new()
tower = create_product('Tower', Decimal(400), Decimal(250))
input_.product = tower
input_.quantity = 1
input_ = bom.inputs.new()
input_.product = create_product('Keyboard', Decimal(30), Decimal(10))
input_.quantity = 1
input_ = bom.inputs.new()
input_.product = create_product('Mouse', Decimal(10), Decimal(5))
input_.quantity = 1
input_ = bom.inputs.new()
input_.product = create_product('Screen', Decimal(300), Decimal(200))
input_.quantity = 1
output = bom.outputs.new()
computer = create_product('Computer', Decimal(750), Decimal(465))
computer.template.producible = True
computer.template.save()
output.product = computer
output.quantity = 1
bom.save()
computer.boms.new(bom=bom)
computer.save()
if 'production_routing' in activated:
setup_routing(config, activated, company)
if 'production_work' in activated:
WorkCenter = Model.get('production.work.center')
WorkCycle = Model.get('production.work.cycle')
setup_production_work(config, activated, company)
work_centers = WorkCenter.find([('parent', '=', None)])
today = dt.date.today()
production_date = today + relativedelta(months=-1)
while production_date <= today + relativedelta(days=20):
for _ in range(random.randint(0, 3)):
production = Production()
production.effective_date = production_date
production.product = computer
production.quantity = random.randint(1, 40)
production.bom = computer.boms[0].bom
if 'production_routing' in activated:
production.routing = computer.boms[0].routing
if 'production_work' in activated:
production.work_center = random.choice(work_centers)
production.save()
if (production_date < today) or (random.random() <= 1. / 3.):
production.click('wait')
if production_date < today:
production.click('assign_force')
production.click('run')
if random.random() <= 2. / 3.:
if 'production_work' in activated:
for work in production.works:
for _ in range(0, random.randint(1, 2)):
cycle = WorkCycle(
work=work,
duration=dt.timedelta(
seconds=random.randint(60, 3600)),
)
cycle.save()
cycle.click('run')
cycle.click('do')
output, = production.outputs
output.unit_price = (production.cost
/ Decimal(production.quantity)
).quantize(Decimal('0.0001'))
production.click('do')
production_date += relativedelta(days=random.randint(1, 3))
def setup_routing(config, activated, company):
Routing = Model.get('production.routing')
Operation = Model.get('production.routing.operation')
Product = Model.get('product.product')
routing = Routing(name='Computer routing rev1')
operation1 = Operation(name='Assemble pieces')
operation1.save()
step1 = routing.steps.new()
step1.operation = operation1
operation2 = Operation(name='Install software')
operation2.save()
step2 = routing.steps.new()
step2.operation = operation2
operation3 = Operation(name='Test')
operation3.save()
step3 = routing.steps.new()
step3.operation = operation3
operation4 = Operation(name='Package')
operation4.save()
step4 = routing.steps.new()
step4.operation = operation4
routing.boms.extend(routing.boms.find([('name', '=', 'Computer rev1')]))
routing.save()
computer, = Product.find([('name', '=', 'Computer')])
bom, = computer.boms
bom.routing = routing
bom.save()
def setup_production_work(config, activated, company):
WorkCenterCategory = Model.get('production.work.center.category')
WorkCenter = Model.get('production.work.center')
Operation = Model.get('production.routing.operation')
assembly = WorkCenterCategory(name='Assembly')
assembly.save()
operation, = Operation.find([('name', '=', 'Assemble pieces')])
operation.work_center_category = assembly
operation.save()
installation = WorkCenterCategory(name='Installation')
installation.save()
operations = Operation.find([
('name', 'in', ['Install software', 'Test']),
])
for operation in operations:
operation.work_center_category = installation
Operation.save(operations)
packaging = WorkCenterCategory(name='Packaging')
packaging.save()
operation, = Operation.find([('name', '=', 'Package')])
operation.work_center_category = packaging
operation.save()
lines = []
for i in range(1, 4):
line = WorkCenter(name='Line %i' % i)
assembly_line = line.children.new()
assembly_line.name = 'Assembly Line %i' % i
assembly_line.category = assembly
assembly_line.cost_method = 'cycle'
assembly_line.cost_price = Decimal(20)
installation_line = line.children.new()
installation_line.name = 'Installation Line %i' % i
installation_line.category = installation
installation_line.cost_method = 'hour'
installation_line.cost_price = Decimal(15)
packaging_line = line.children.new()
packaging_line.name = 'Packaging Line %i' % i
packaging_line.category = packaging
packaging_line.cost_method = 'hour'
packaging_line.cost_price = Decimal(10)
lines.append(line)
WorkCenter.save(lines)