# -*- coding: utf-8 -*- import odoo from datetime import datetime, timedelta def create_test_demo_data(cr): """Crea datos de demostración para lims.test y lims.result""" env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {}) # Buscar algunos pacientes y análisis existentes patients = env['res.partner'].search([('is_patient', '=', True)], limit=3) if not patients: print("No se encontraron pacientes para crear pruebas de demostración") return # Buscar análisis disponibles hemograma = env.ref('lims_management.analysis_hemograma', raise_if_not_found=False) glucosa = env.ref('lims_management.analysis_glucosa', raise_if_not_found=False) if not hemograma or not glucosa: print("No se encontraron análisis de demostración") return # Buscar o crear una orden de laboratorio simple lab_order = env['sale.order'].search([ ('is_lab_request', '=', True), ('state', '=', 'sale') ], limit=1) if not lab_order: # Crear una orden básica si no existe lab_order = env['sale.order'].create({ 'partner_id': patients[0].id, 'is_lab_request': True, 'order_line': [(0, 0, { 'product_id': hemograma.product_variant_id.id, 'product_uom_qty': 1 }), (0, 0, { 'product_id': glucosa.product_variant_id.id, 'product_uom_qty': 1 })] }) lab_order.action_confirm() # Obtener las líneas de orden order_lines = lab_order.order_line if not order_lines: print("No se encontraron líneas de orden") return # Buscar muestras existentes samples = env['stock.lot'].search([ ('is_lab_sample', '=', True), ('patient_id', '=', lab_order.partner_id.id) ], limit=2) if not samples: print("No se encontraron muestras de laboratorio") return # Crear prueba 1: Hemograma en proceso test1 = env['lims.test'].create({ 'sale_order_line_id': order_lines[0].id, 'sample_id': samples[0].id, 'state': 'draft' }) # Iniciar proceso test1.action_start_process() # Crear resultados para hemograma results_data = [ { 'test_id': test1.id, 'parameter_name': 'Glóbulos Rojos', 'sequence': 10, 'value_numeric': 4.5, 'unit': '10^6/µL', 'normal_min': 4.2, 'normal_max': 5.4 }, { 'test_id': test1.id, 'parameter_name': 'Glóbulos Blancos', 'sequence': 20, 'value_numeric': 12.5, # Fuera de rango 'unit': '10^3/µL', 'normal_min': 4.5, 'normal_max': 11.0, 'notes': 'Valor elevado - posible infección' }, { 'test_id': test1.id, 'parameter_name': 'Hemoglobina', 'sequence': 30, 'value_numeric': 14.2, 'unit': 'g/dL', 'normal_min': 12.0, 'normal_max': 16.0 }, { 'test_id': test1.id, 'parameter_name': 'Plaquetas', 'sequence': 40, 'value_numeric': 250, 'unit': '10^3/µL', 'normal_min': 150, 'normal_max': 400 } ] for result_data in results_data: env['lims.result'].create(result_data) print(f"Creada prueba {test1.name} con 4 resultados") # Crear prueba 2: Glucosa con resultado ingresado if len(order_lines) > 1: test2 = env['lims.test'].create({ 'sale_order_line_id': order_lines[1].id, 'sample_id': samples[0].id, 'state': 'draft' }) test2.action_start_process() # Crear resultado de glucosa env['lims.result'].create({ 'test_id': test2.id, 'parameter_name': 'Glucosa en Ayunas', 'sequence': 10, 'value_numeric': 125, # Fuera de rango 'unit': 'mg/dL', 'normal_min': 70, 'normal_max': 110, 'notes': 'Valor elevado - prediabetes' }) # Marcar resultados como ingresados test2.action_enter_results() print(f"Creada prueba {test2.name} con resultado ingresado") # Crear prueba 3: Uroanálisis con valores mixtos (si hay más pacientes) if len(patients) > 1 and len(samples) > 1: # Crear una orden adicional urine_analysis = env['product.template'].search([ ('is_analysis', '=', True), ('name', 'ilike', 'orina') ], limit=1) if urine_analysis: lab_order2 = env['sale.order'].create({ 'partner_id': patients[1].id, 'is_lab_request': True, 'order_line': [(0, 0, { 'product_id': urine_analysis.product_variant_id.id, 'product_uom_qty': 1 })] }) lab_order2.action_confirm() test3 = env['lims.test'].create({ 'sale_order_line_id': lab_order2.order_line[0].id, 'sample_id': samples[1].id, 'state': 'draft' }) test3.action_start_process() # Crear resultados mixtos urine_results = [ { 'test_id': test3.id, 'parameter_name': 'Color', 'sequence': 10, 'value_text': 'Amarillo claro' }, { 'test_id': test3.id, 'parameter_name': 'pH', 'sequence': 20, 'value_numeric': 6.5, 'normal_min': 4.6, 'normal_max': 8.0 }, { 'test_id': test3.id, 'parameter_name': 'Densidad', 'sequence': 30, 'value_numeric': 1.020, 'normal_min': 1.005, 'normal_max': 1.030 }, { 'test_id': test3.id, 'parameter_name': 'Proteínas', 'sequence': 40, 'value_text': 'Negativo' }, { 'test_id': test3.id, 'parameter_name': 'Glucosa', 'sequence': 50, 'value_text': 'Negativo' } ] for result_data in urine_results: env['lims.result'].create(result_data) # Ingresar y validar resultados test3.action_enter_results() if test3.state == 'result_entered': test3.action_validate() print(f"Creada prueba {test3.name} validada con resultados mixtos") print("\nDatos de demostración de pruebas creados exitosamente") if __name__ == '__main__': db_name = 'lims_demo' registry = odoo.registry(db_name) with registry.cursor() as cr: create_test_demo_data(cr) cr.commit()