feat(#8): Task 7 completada - Datos de demostración básicos

- 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
This commit is contained in:
Luis Ernesto Portillo Zaldivar 2025-07-15 01:07:05 -06:00
parent 619c6a3afa
commit 80c70b67d9
3 changed files with 260 additions and 0 deletions

View File

@ -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

View File

@ -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:

View File

@ -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()