496 lines
17 KiB
ReStructuredText
496 lines
17 KiB
ReStructuredText
===========================
|
|
Optical Equipment Scenario
|
|
===========================
|
|
Imports::
|
|
>>> from proteus import Model, Wizard
|
|
>>> from trytond.tests.tools import activate_modules, set_user
|
|
>>> from datetime import date, timedelta, datetime
|
|
>>> import xml.etree.ElementTree as ET
|
|
>>> from trytond.modules.company.tests.tools import create_company, get_company
|
|
>>> from trytond.modules.account.tests.tools import (create_chart, create_fiscalyear, create_tax, get_accounts)
|
|
>>> from trytond.modules.account_invoice.tests.tools import (create_payment_term, set_fiscalyear_invoice_sequences)
|
|
>>> from decimal import Decimal
|
|
>>> import datetime
|
|
>>> today = datetime.date.today()
|
|
>>> from trytond.tools import file_open
|
|
|
|
Activate modules::
|
|
>>> config = activate_modules('optical_equipment')
|
|
|
|
Create company::
|
|
>>> _ = create_company()
|
|
>>> company = get_company()
|
|
|
|
Create user admin::
|
|
>>> Group = Model.get("res.group")
|
|
>>> User = Model.get("res.user")
|
|
>>> user = User(config.user)
|
|
>>> user.login = "admin"
|
|
>>> user.save()
|
|
>>> group, = Group().find(["name", "=", "Administration"])
|
|
>>> group
|
|
proteus.Model.get('res.group')(1)
|
|
|
|
>>> group_equipment, = Group().find(["name", "=", "Equipment Administration"])
|
|
>>> group_equipment
|
|
proteus.Model.get('res.group')(18)
|
|
|
|
>>> group.users.append(user)
|
|
>>> group.save()
|
|
>>> group_equipment.users
|
|
[proteus.Model.get('res.user')(1)]
|
|
|
|
Set employee::
|
|
>>> User = Model.get('res.user')
|
|
>>> Party = Model.get('party.party')
|
|
>>> Employee = Model.get('company.employee')
|
|
>>> employee_party = Party(name="Employee")
|
|
>>> employee_party.save()
|
|
>>> employee = Employee(party=employee_party)
|
|
>>> employee.save()
|
|
>>> user = User(config.user)
|
|
>>> user.employees.append(employee)
|
|
>>> user.employee = employee
|
|
>>> user.save()
|
|
>>> set_user(user.id)
|
|
|
|
Create fiscal year::
|
|
>>> fiscalyear = set_fiscalyear_invoice_sequences(create_fiscalyear(company))
|
|
>>> fiscalyear.click('create_period')
|
|
|
|
Create chart of accounts::
|
|
>>> _ = create_chart(company)
|
|
>>> accounts = get_accounts(company)
|
|
>>> accounts
|
|
{'receivable': proteus.Model.get('account.account')(5), 'payable': proteus.Model.get('account.account')(4), 'revenue': proteus.Model.get('account.account')(6), 'expense': proteus.Model.get('account.account')(3), 'cash': proteus.Model.get('account.account')(2), 'tax': proteus.Model.get('account.account')(7)}
|
|
|
|
>>> revenue = accounts['revenue']
|
|
>>> expense = accounts['expense']
|
|
>>> cash = accounts['cash']
|
|
|
|
>>> Journal = Model.get('account.journal')
|
|
>>> PaymentMethod = Model.get('account.invoice.payment.method')
|
|
>>> cash_journal, = Journal.find([('type', '=', 'cash')])
|
|
>>> cash_journal.save()
|
|
>>> payment_method = PaymentMethod()
|
|
>>> payment_method.name = 'Cash'
|
|
>>> payment_method.journal = cash_journal
|
|
>>> payment_method.credit_account = cash
|
|
>>> payment_method.debit_account = cash
|
|
>>> payment_method.save()
|
|
|
|
Create tax::
|
|
>>> tax = create_tax(Decimal('.10'))
|
|
>>> tax.save()
|
|
|
|
Create configuration equipment::
|
|
>>> Config = Model.get("optical_equipment.configuration")
|
|
>>> UOM = Model.get("product.uom")
|
|
>>> celsius = UOM.find([("name", "=", "Celsius")])
|
|
>>> celsius
|
|
[proteus.Model.get('product.uom')(39)]
|
|
|
|
>>> moisture = UOM.find([("name", "=", "Relative Humedity")])
|
|
>>> moisture
|
|
[proteus.Model.get('product.uom')(42)]
|
|
|
|
>>> config = Config().find([])[0]
|
|
>>> equipment_sequence, = Model.get("ir.sequence").find(["name", "=", "Equipment"])
|
|
>>> equipment_sequence
|
|
proteus.Model.get('ir.sequence')(14)
|
|
|
|
>>> config.technician_responsible = employee
|
|
>>> with file_open("optical_equipment/tests/files/signature.png", "rb") as signature:
|
|
... config.technician_signature = signature.read()
|
|
>>> config.invima = "RH-202309-02409"
|
|
>>> config.equipment_sequence = equipment_sequence
|
|
>>> maintenance_sequence, = Model.get("ir.sequence").find(["name", "=", "Maintenance"])
|
|
>>> maintenance_sequence
|
|
proteus.Model.get('ir.sequence')(15)
|
|
|
|
|
|
>>> config.maintenance_sequence = maintenance_sequence
|
|
>>> agended_sequence, = Model.get("ir.sequence").find(["name", "=", "Agended"])
|
|
>>> agended_sequence
|
|
proteus.Model.get('ir.sequence')(13)
|
|
|
|
>>> config.agended_sequence = agended_sequence
|
|
|
|
>>> contract_sequence, = Model.get("ir.sequence").find(["name", "=", "Contract"])
|
|
>>> contract_sequence
|
|
proteus.Model.get('ir.sequence')(12)
|
|
>>> config.contract_sequence = contract_sequence
|
|
|
|
>>> sale_quote_number, = Model.get("ir.sequence").find(["name", "=", "Sale Quote"])
|
|
>>> sale_quote_number
|
|
proteus.Model.get('ir.sequence')(16)
|
|
>>> config.sale_quote_number = sale_quote_number
|
|
|
|
>>> config.temperature_min = 19
|
|
>>> config.temperature_max = 21
|
|
>>> config.temperature_uom = celsius[0]
|
|
|
|
>>> config.moisture_min = 43
|
|
>>> config.moisture_max = 45
|
|
>>> config.moisture_uom = moisture[0]
|
|
>>> config.save()
|
|
|
|
Create supplier::
|
|
>>> Party = Model.get('party.party')
|
|
>>> supplier = Party(name='Supplier')
|
|
>>> supplier.save()
|
|
|
|
|
|
Create customer type optica::
|
|
>>> customer_optica = Party(name='Customer optica', customer_type='optica')
|
|
>>> customer_optica.save()
|
|
>>> customer_optica.customer_type
|
|
'optica'
|
|
|
|
|
|
Create customer type ips::
|
|
>>> customer_ips = Party(name='Customer ips', customer_type='ips')
|
|
>>> customer_ips.save()
|
|
>>> customer_ips.customer_type
|
|
'ips'
|
|
|
|
Creaate contact optica::
|
|
>>> local_phone = customer_optica.contact_mechanisms.new()
|
|
>>> local_phone.type = 'phone'
|
|
>>> local_phone.value = '666666666'
|
|
>>> local_phone.value
|
|
'666666666'
|
|
|
|
Creaate contact ips::
|
|
>>> local_phone = customer_ips.contact_mechanisms.new()
|
|
>>> local_phone.type = 'phone'
|
|
>>> local_phone.value = '666666666'
|
|
>>> local_phone.value
|
|
'666666666'
|
|
|
|
|
|
Create account categories::
|
|
>>> ProductCategory = Model.get('product.category')
|
|
>>> optical_equitment_category = ProductCategory(name="Optical Equipment")
|
|
>>> optical_equitment_category.accounting = True
|
|
>>> optical_equitment_category.account_expense = expense
|
|
>>> optical_equitment_category.account_revenue = revenue
|
|
>>> children_1 = optical_equitment_category.childs.new(name="Optical Mobiliario")
|
|
>>> optical_equitment_category.save()
|
|
>>> len(optical_equitment_category.childs)
|
|
1
|
|
|
|
Create taxes::
|
|
>>> optical_equitment_category_tax, = optical_equitment_category.duplicate()
|
|
>>> optical_equitment_category_tax.customer_taxes.append(tax)
|
|
>>> optical_equitment_category_tax.save()
|
|
|
|
Create mark, model and reference category::
|
|
>>> mark_category = ProductCategory(name="ADLER")
|
|
>>> mark_category.save()
|
|
>>> model_category = ProductCategory(name="ADLER_01", parent=mark_category)
|
|
>>> model_category.save()
|
|
>>> reference_category = ProductCategory(name="ADLER_01", parent=model_category)
|
|
>>> reference_category.save()
|
|
|
|
>>> mark_category.childs
|
|
[proteus.Model.get('product.category')(6)]
|
|
|
|
Create product optical equipment::
|
|
>>> ProductUom = Model.get('product.uom')
|
|
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
|
|
>>> ProductTemplate = Model.get('product.template')
|
|
>>> template = ProductTemplate()
|
|
>>> template.name = 'UNIDAD REFRACCION ESTANDAR'
|
|
>>> template.default_uom = unit
|
|
>>> template.type = 'goods'
|
|
>>> template.salable = True
|
|
>>> template.purchasable = True
|
|
>>> template.equipment = True
|
|
>>> template.list_price = Decimal('10')
|
|
>>> template.account_category = optical_equitment_category_tax
|
|
>>> template.maintenance_required = True
|
|
|
|
Mark Maintenance Activities::
|
|
>>> template.initial_operation = True
|
|
>>> template.check_equipment = True
|
|
>>> template.check_electric_system = True
|
|
>>> template.clean_int_ext = True
|
|
>>> template.preventive_activities = "Se verificaron las condiciones ambientales, se verificó estado físico del equipo, se verificó funcionamiento, se verificó tomas eléctricas y conexiones, se verificó el estado de los pulsadores, se verificó que el motor de la silla suba y baje, se realizó limpieza general, se lubricaron partes que lo requieren, se confirmó nuevamente funcionamiento."
|
|
|
|
Mark Calibration Required::
|
|
>>> template.calibration = True
|
|
>>> template.uncertainy_pattern = 0.1
|
|
>>> template.k_pattern = '-5.00'
|
|
>>> UsePattern = Model.get('optical_equipment.use_pattern')
|
|
>>> schematic_eye, = UsePattern.find([('name_pattern', '=', 'Schematic Eye')])
|
|
>>> template.use_pattern = schematic_eye
|
|
>>> k_pattern = template.k_pattern_list.new(pattern=-5)
|
|
>>> k_pattern.save()
|
|
>>> template.MEP = 0.1
|
|
>>> template.Usubi = 200
|
|
>>> template.resolution_type = 'digital'
|
|
>>> template.d_resolution = 0.25
|
|
>>> template.equipment_type = 'mobiliario_optico'
|
|
>>> template.biomedical_class = 'diagnostico'
|
|
>>> template.main_tecnology = 'electronico'
|
|
>>> template.mark_category = mark_category
|
|
>>> template.model_category = model_category
|
|
>>> template.use = 'medico'
|
|
>>> template.reference_category = reference_category
|
|
>>> template.save()
|
|
>>> len(template.k_pattern_list)
|
|
1
|
|
>>> product, = template.products
|
|
>>> product.name
|
|
'UNIDAD REFRACCION ESTANDAR'
|
|
|
|
Create Product Maintenance Service::
|
|
>>> maintenanceServiceProduct = ProductTemplate()
|
|
>>> maintenanceServiceProduct.name = 'Mantenimiento Correctivo'
|
|
>>> maintenanceServiceProduct.maintenance_activity = True
|
|
>>> maintenanceServiceProduct.default_uom = unit
|
|
>>> maintenanceServiceProduct.type = 'service'
|
|
>>> maintenanceServiceProduct.salable = True
|
|
>>> maintenanceServiceProduct.purchasable = True
|
|
>>> maintenanceServiceProduct.list_price = Decimal('10')
|
|
>>> maintenanceServiceProduct.account_category = optical_equitment_category_tax
|
|
>>> maintenanceServiceProduct.save()
|
|
>>> product1, = maintenanceServiceProduct.products
|
|
>>> product1.name
|
|
'Mantenimiento Correctivo'
|
|
|
|
|
|
Create payment term::
|
|
>>> payment_term = create_payment_term()
|
|
>>> payment_term.save()
|
|
|
|
Purchase 5 products:
|
|
>>> Purchase = Model.get('purchase.purchase')
|
|
>>> PurchaseLine = Model.get('purchase.line')
|
|
>>> purchase = Purchase()
|
|
>>> purchase.party = supplier
|
|
>>> purchase.payment_term = payment_term
|
|
>>> purchase.invoice_method = 'order'
|
|
>>> purchase_line = PurchaseLine()
|
|
>>> purchase.lines.append(purchase_line)
|
|
>>> purchase_line.product = product
|
|
>>> purchase_line.quantity = 2.0
|
|
>>> purchase_line.product_equipment
|
|
True
|
|
>>> purchase_line.unit_price = Decimal('6182237.0000')
|
|
>>> purchase_line.health_register = 'COL123evergreen'
|
|
>>> purchase.click('quote')
|
|
>>> purchase.click('confirm')
|
|
>>> purchase.click('create_equipments')
|
|
>>> Equipment = Model.get('optical_equipment.equipment')
|
|
>>> equipments = Equipment.find()
|
|
>>> equipments
|
|
[proteus.Model.get('optical_equipment.equipment')(1), proteus.Model.get('optical_equipment.equipment')(2)]
|
|
>>> len(equipments)
|
|
2
|
|
>>> purchase.equipment_create
|
|
1
|
|
|
|
Finalize the purchase inventory movements::
|
|
>>> for move in purchase.moves:
|
|
... move.click('do')
|
|
|
|
Registred equipment without serial::
|
|
>>> equipment_1 = equipments[0]
|
|
>>> equipment_2 = equipments[1]
|
|
>>> equipment_1.click('registred') # doctest: +IGNORE_EXCEPTION_DETAIL
|
|
Traceback (most recent call last):
|
|
...
|
|
UserError: ...
|
|
>>> equipment_1.serial = "2020DM-0021167"
|
|
>>> equipment_1.click('registred')
|
|
>>> equipment_2.serial = "2020DM-002119"
|
|
>>> equipment_2.click('registred')
|
|
|
|
First sale::
|
|
>>> Sale = Model.get('sale.sale')
|
|
>>> SaleLine = Model.get('sale.line')
|
|
>>> sale = Sale()
|
|
>>> sale.party = customer_optica
|
|
>>> sale.contact = local_phone
|
|
>>> sale.description = 'El producto se debe entregar el fin de semana'
|
|
>>> sale.sale_date = today
|
|
>>> sale.sale_type = 'equipments'
|
|
>>> sale.payment_term = payment_term
|
|
>>> sale.invoice_method = 'order'
|
|
>>> sale_line = SaleLine()
|
|
>>> sale.lines.append(sale_line)
|
|
>>> sale_line.product = product
|
|
>>> sale_line.quantity = 2.0
|
|
>>> sale_line = SaleLine()
|
|
>>> sale.lines.append(sale_line)
|
|
>>> sale_line.type = 'comment'
|
|
>>> sale_line.description = 'Comment'
|
|
>>> sale_line = SaleLine()
|
|
>>> sale.lines.append(sale_line)
|
|
>>> sale_line.product = product
|
|
>>> sale_line.quantity = 3.0
|
|
>>> sale.click('quote')
|
|
>>> SaleConfirmDate = sale.click('confirm')
|
|
>>> SaleConfirmDate.form.sale_date == today
|
|
True
|
|
>>> SaleConfirmDate.execute('confirm_date')
|
|
>>> sale.state
|
|
'processing'
|
|
>>> sale.shipments
|
|
[proteus.Model.get('stock.shipment.out')(1)]
|
|
|
|
Duplicate Sale::
|
|
>>> sale.duplicate()
|
|
[proteus.Model.get('sale.sale')(2)]
|
|
|
|
Return Sale::
|
|
>>> SaleReturn = Wizard('sale.return_sale', [sale])
|
|
>>> SaleReturn.execute('return_')
|
|
|
|
Verify that the sale state could be returned to the draft state::
|
|
>>> sale.click("draft")
|
|
>>> sale.state
|
|
'draft'
|
|
>>> sale_line = SaleLine()
|
|
>>> sale.lines.append(sale_line)
|
|
>>> sale_line.product = product
|
|
>>> sale_line.quantity = 2.0
|
|
>>> sale.click('quote')
|
|
>>> SaleConfirmDate = sale.click('confirm')
|
|
>>> SaleConfirmDate.execute('confirm_date')
|
|
>>> sale.shipments
|
|
[proteus.Model.get('stock.shipment.out')(1), proteus.Model.get('stock.shipment.out')(2)]
|
|
|
|
Verify that the shipment cannot be assigned if the shipment lines do not have equipment::
|
|
>>> shipment_one = sale.shipments[0]
|
|
>>> shipment_one.click('pick') # doctest: +IGNORE_EXCEPTION_DETAIL
|
|
Traceback (most recent call last):
|
|
...
|
|
ValidationError: ...
|
|
|
|
Restrict assignment when the shipment has no serialized items::
|
|
>>> shipment_one = sale.shipments[0]
|
|
>>> line_one = shipment_one.inventory_moves[0]
|
|
>>> line_one.equipment = equipment_1
|
|
>>> line_one.equipment_serial
|
|
'2020DM-0021167'
|
|
>>> line_two = shipment_one.inventory_moves[1]
|
|
>>> line_two.equipment = equipment_2
|
|
>>> line_two.equipment_serial
|
|
'2020DM-002119'
|
|
>>> shipment_one.click('assign_try')
|
|
>>> shipment_one.click('pick')
|
|
>>> shipment_one.click('pack')
|
|
>>> shipment_one.click('done')
|
|
|
|
Create a new Maintenance Service::
|
|
>>> shipment_one.click('maintenance_initial')
|
|
>>> MantenanceServices = Model.get("optical_equipment_maintenance.service")
|
|
>>> mantenanceServices, = MantenanceServices.find()
|
|
>>> mantenanceServices
|
|
proteus.Model.get('optical_equipment_maintenance.service')(1)
|
|
>>> mantenanceServices.state
|
|
'draft'
|
|
|
|
>>> MaintenanceLines = Model.get("optical_equipment.maintenance")
|
|
>>> maintenanceLines = MaintenanceLines.find()
|
|
>>> maintenanceLines
|
|
[proteus.Model.get('optical_equipment.maintenance')(1), proteus.Model.get('optical_equipment.maintenance')(2)]
|
|
>>> maintenanceLines[0].state
|
|
'draft'
|
|
|
|
>>> maintenance_1 = maintenanceLines[0]
|
|
>>> maintenance_2 = maintenanceLines[1]
|
|
>>> maintenance_1.equipment.state
|
|
'uncontrated'
|
|
>>> maintenance_1.equipment.propietary == customer_optica
|
|
True
|
|
>>> maintenance_1.equipment.propietary_address.street
|
|
|
|
>>> maintenance_2.equipment.state
|
|
'uncontrated'
|
|
>>> maintenance_2.equipment.propietary == customer_optica
|
|
True
|
|
>>> maintenance_2.equipment.propietary_address.street
|
|
|
|
Assing schedule to maintenance service::
|
|
>>> AssingSchedule = Wizard('optical_equipment_maintenance.assing_agended', [mantenanceServices])
|
|
>>> AssingSchedule.form.estimated_agended = datetime.datetime.now()
|
|
>>> AssingSchedule.form.technical = employee
|
|
>>> AssingSchedule.execute('assing_agended')
|
|
|
|
>>> mantenanceServices.state
|
|
'agended'
|
|
|
|
>>> mantenanceServices.click('in_progress')
|
|
>>> mantenanceServices.state
|
|
'in_progress'
|
|
|
|
>>> mantenanceServices.lines
|
|
[proteus.Model.get('optical_equipment.maintenance')(1), proteus.Model.get('optical_equipment.maintenance')(2)]
|
|
|
|
Calibrate Maintenance Lines::
|
|
>>> mantenance_lines = mantenanceServices.lines
|
|
>>> mantenance_line_one = mantenance_lines[0]
|
|
>>> mantenance_line_two = mantenance_lines[1]
|
|
>>> mantenance_line_one.click('samples')
|
|
>>> len(mantenance_line_one.lines_calibration)
|
|
5
|
|
>>> mantenance_line_one.click('calibrate')
|
|
>>> mantenance_line_one.calibration_total
|
|
[proteus.Model.get('optical_equipment.maintenance.calibration')(1)]
|
|
>>> len(mantenance_line_one.graph_calibration)
|
|
14857
|
|
|
|
>>> mantenance_line_one.click('finished')
|
|
>>> mantenance_line_one.state
|
|
'finished'
|
|
|
|
Finished Maintenance Service::
|
|
>>> mantenanceServices.click('finished') # doctest: +IGNORE_EXCEPTION_DETAIL
|
|
Traceback (most recent call last):
|
|
...
|
|
ValidationError: ...
|
|
|
|
>>> mantenance_line_two.click('samples')
|
|
>>> len(mantenance_line_two.lines_calibration)
|
|
5
|
|
>>> mantenance_line_two.click('calibrate')
|
|
>>> mantenance_line_two.calibration_total
|
|
[proteus.Model.get('optical_equipment.maintenance.calibration')(2)]
|
|
>>> len(mantenance_line_two.graph_calibration)
|
|
14857
|
|
>>> mantenance_line_two.click('finished')
|
|
>>> mantenanceServices.click('finished')
|
|
>>> mantenanceServices.state
|
|
'finished'
|
|
|
|
Create a New Contract::
|
|
|
|
|
|
Sale Maintenance Service::
|
|
>>> sale2 = Sale()
|
|
>>> sale2.party = customer_optica
|
|
>>> sale2.contact = local_phone
|
|
>>> sale2.description = 'El producto se debe entregar el fin de semana'
|
|
>>> sale2.sale_date = today
|
|
>>> sale2.sale_type = 'maintenance'
|
|
>>> sale2.maintenance_type = 'corrective'
|
|
>>> sale2.payment_term = payment_term
|
|
>>> sale2.invoice_method = 'order'
|
|
>>> sale_line = SaleLine()
|
|
>>> sale2.lines.append(sale_line)
|
|
>>> sale_line.product = product1
|
|
>>> sale_line.quantity = 1.0
|
|
>>> sale2.click('quote')
|
|
>>> SaleConfirmDate = sale2.click('confirm')
|
|
>>> SaleConfirmDate.form.sale_date == today
|
|
True
|
|
>>> SaleConfirmDate.execute('confirm_date')
|
|
>>> sale2.state
|
|
'processing'
|
|
>>> sale2.shipments
|
|
[]
|