=========================== 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 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 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 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)] 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): ... Exception: ... >>> 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'