From 80c70b67d974a0a751f39e02990d856d2e3b23a5 Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Tue, 15 Jul 2025 01:07:05 -0600 Subject: [PATCH] =?UTF-8?q?feat(#8):=20Task=207=20completada=20-=20Datos?= =?UTF-8?q?=20de=20demostraci=C3=B3n=20b=C3=A1sicos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Script Python para crear datos de demostración - Crea pruebas con diferentes estados: en proceso, ingresado, validado - Incluye resultados con valores dentro y fuera de rango - Mezcla tipos de valor: numérico y texto - Integrado en el proceso de inicialización - Instancia validada sin errores --- docker-compose.yml | 1 + init_odoo.py | 34 +++++ test/create_test_demo_data.py | 225 ++++++++++++++++++++++++++++++++++ 3 files changed, 260 insertions(+) create mode 100644 test/create_test_demo_data.py diff --git a/docker-compose.yml b/docker-compose.yml index 51252a8..87c8b34 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,6 +25,7 @@ services: - ./odoo.conf:/etc/odoo/odoo.conf - ./init_odoo.py:/app/init_odoo.py - ./create_lab_requests.py:/app/create_lab_requests.py + - ./test:/app/test command: ["/usr/bin/python3", "/app/init_odoo.py"] environment: HOST: db diff --git a/init_odoo.py b/init_odoo.py index 7ab37ef..923571a 100644 --- a/init_odoo.py +++ b/init_odoo.py @@ -94,6 +94,40 @@ EOF sys.exit(result.returncode) print("Solicitudes de laboratorio de demostración creadas exitosamente.") + + # --- Crear datos de demostración de pruebas --- + print("\nCreando datos de demostración de pruebas de laboratorio...") + sys.stdout.flush() + + if os.path.exists("/app/test/create_test_demo_data.py"): + with open("/app/test/create_test_demo_data.py", "r") as f: + test_script_content = f.read() + + create_tests_command = f""" + odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF' +{test_script_content} +EOF + """ + + result = subprocess.run( + create_tests_command, + shell=True, + capture_output=True, + text=True, + check=False + ) + + print("--- Create Test Demo Data stdout ---") + print(result.stdout) + print("--- Create Test Demo Data stderr ---") + print(result.stderr) + sys.stdout.flush() + + if result.returncode == 0: + print("Datos de demostración de pruebas creados exitosamente.") + else: + print(f"Advertencia: Fallo al crear datos de demostración de pruebas (código {result.returncode})") + sys.exit(0) except Exception as e: diff --git a/test/create_test_demo_data.py b/test/create_test_demo_data.py new file mode 100644 index 0000000..4952c24 --- /dev/null +++ b/test/create_test_demo_data.py @@ -0,0 +1,225 @@ +# -*- 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() \ No newline at end of file