
- 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
225 lines
7.2 KiB
Python
225 lines
7.2 KiB
Python
# -*- 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() |