
- Agregar QWeb template para generar PDF profesional con: - Encabezado con datos del laboratorio y logo - Información completa del paciente y orden - Tabla de resultados con indicadores visuales para valores fuera de rango - Sección de observaciones y notas - Información del validador y fecha de validación - Agregar campo computado reference_text en parameter_range para mostrar rangos formateados - Agregar botón "Imprimir Informe de Resultados" en vista de órdenes (solo visible cuando hay pruebas validadas) - Agregar campo lab_notes en sale.order para observaciones generales - Reorganizar vista de lims.test con pestañas para mejor UX - Corregir manejo de employee_ids en el reporte para casos donde no existe el módulo HR - Incluir scripts de prueba para generar datos de demostración El informe resalta valores críticos y fuera de rango con colores distintivos, facilitando la interpretación rápida de los resultados por parte del médico. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
127 lines
5.0 KiB
Python
127 lines
5.0 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Script para agregar resultados a las pruebas ya validadas
|
|
"""
|
|
|
|
import odoo
|
|
import logging
|
|
import random
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
def add_results_to_validated_tests(env):
|
|
"""Agregar resultados a pruebas ya validadas"""
|
|
|
|
# Buscar las órdenes S00029 y S00030
|
|
orders = env['sale.order'].search([('name', 'in', ['S00029', 'S00030'])], order='name')
|
|
|
|
if not orders:
|
|
print("No se encontraron las órdenes S00029 o S00030")
|
|
return
|
|
|
|
for order in orders:
|
|
print(f"\n=== Procesando orden {order.name} ===")
|
|
|
|
for test in order.lab_test_ids:
|
|
print(f"\nPrueba: {test.product_id.name}")
|
|
|
|
# Cambiar temporalmente a estado draft para poder modificar
|
|
test.sudo().write({'state': 'draft'})
|
|
|
|
# Generar resultados si no existen
|
|
if not test.result_ids:
|
|
test.sudo()._generate_test_results()
|
|
print(f" Generados {len(test.result_ids)} resultados")
|
|
|
|
# Asignar valores a los resultados
|
|
for result in test.result_ids:
|
|
parameter = result.parameter_id
|
|
vals = {}
|
|
|
|
if parameter.value_type == 'numeric':
|
|
# Valores específicos por código
|
|
if parameter.code == 'HGB': # Hemoglobina
|
|
vals['value_numeric'] = random.uniform(12.0, 16.0)
|
|
elif parameter.code == 'HCT': # Hematocrito
|
|
vals['value_numeric'] = random.uniform(36.0, 46.0)
|
|
elif parameter.code == 'WBC': # Leucocitos
|
|
vals['value_numeric'] = random.uniform(4.5, 10.0)
|
|
elif parameter.code == 'PLT': # Plaquetas
|
|
vals['value_numeric'] = random.uniform(150, 400)
|
|
elif parameter.code == 'RBC': # Eritrocitos
|
|
vals['value_numeric'] = random.uniform(4.0, 5.5)
|
|
elif parameter.code == 'GLU': # Glucosa
|
|
vals['value_numeric'] = random.uniform(70, 110)
|
|
elif parameter.code == 'CHOL': # Colesterol
|
|
vals['value_numeric'] = random.uniform(160, 220)
|
|
elif parameter.code == 'TRIG': # Triglicéridos
|
|
vals['value_numeric'] = random.uniform(50, 150)
|
|
elif parameter.code == 'HDL': # HDL
|
|
vals['value_numeric'] = random.uniform(40, 60)
|
|
elif parameter.code == 'LDL': # LDL
|
|
vals['value_numeric'] = random.uniform(80, 130)
|
|
else:
|
|
# Valor genérico
|
|
vals['value_numeric'] = random.uniform(10, 100)
|
|
|
|
print(f" - {parameter.name}: {vals['value_numeric']:.2f}")
|
|
|
|
elif parameter.value_type == 'text':
|
|
vals['value_text'] = "Normal"
|
|
elif parameter.value_type == 'selection':
|
|
vals['value_selection'] = "normal"
|
|
elif parameter.value_type == 'boolean':
|
|
vals['value_boolean'] = False
|
|
|
|
# Escribir con sudo para evitar restricciones
|
|
result.sudo().write(vals)
|
|
|
|
# Volver a estado validated
|
|
test.sudo().write({
|
|
'state': 'validated',
|
|
'validator_id': env.ref('base.user_admin').id,
|
|
'validation_date': fields.Datetime.now()
|
|
})
|
|
|
|
# Agregar notas a algunas pruebas
|
|
if 'Hemograma' in test.product_id.name:
|
|
test.sudo().write({'notes': 'Todos los parámetros dentro de rangos normales.'})
|
|
elif 'Lipídico' in test.product_id.name:
|
|
test.sudo().write({'notes': 'Perfil lipídico normal. Se recomienda mantener dieta balanceada.'})
|
|
|
|
print("\n✅ Resultados agregados exitosamente a todas las pruebas")
|
|
return orders
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# Importar fields después de configurar Odoo
|
|
from odoo import fields
|
|
|
|
# Configuración
|
|
db_name = 'lims_demo'
|
|
|
|
# Conectar a Odoo
|
|
odoo.tools.config.parse_config(['--database', db_name])
|
|
|
|
# Obtener el registro de la base de datos
|
|
registry = odoo.registry(db_name)
|
|
|
|
# Crear cursor y environment
|
|
with registry.cursor() as cr:
|
|
env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {})
|
|
|
|
try:
|
|
# Agregar resultados a las pruebas
|
|
orders = add_results_to_validated_tests(env)
|
|
|
|
# Confirmar cambios
|
|
cr.commit()
|
|
|
|
print("\n📋 Ahora puedes probar el botón 'Imprimir Informe de Resultados' en las órdenes S00029 y S00030.")
|
|
|
|
except Exception as e:
|
|
cr.rollback()
|
|
print(f"\n❌ Error: {str(e)}")
|
|
_logger.error(f"Error agregando resultados: {str(e)}", exc_info=True) |