clinical_laboratory/documents/plans/ISSUE8_PLAN.md
Luis Ernesto Portillo Zaldivar d285906b7b docs(#8): Crear plan detallado para gestión de pruebas y resultados
- Definición de 10 tareas principales
- Modelos: lims.test, lims.test.parameter, lims.result
- Flujo de validación de dos pasos
- Generación de reportes PDF
- Sistema de permisos por roles
- Integración con órdenes y muestras existentes
2025-07-15 00:11:42 -06:00

8.9 KiB

Plan de Implementación - Issue #8: Gestión de Pruebas y Resultados

Objetivo

Implementar el sistema completo de gestión de pruebas de laboratorio, incluyendo definición de parámetros, entrada de resultados, validación y generación de reportes.

Análisis de Requisitos

Funcionalidad Esperada

  1. Catálogo de Pruebas con Parámetros: Cada análisis debe tener parámetros configurables con unidades y rangos de referencia
  2. Entrada de Resultados: Interfaz dinámica para captura de resultados según el tipo de análisis
  3. Validación de Resultados: Flujo de dos pasos (técnico ingresa, administrador valida)
  4. Generación de Reportes: PDF con formato profesional y resultados fuera de rango resaltados
  5. Control de Acceso: Permisos basados en roles para técnicos y administradores

Modelos de Datos Requeridos

  1. lims.test: Representa una prueba de laboratorio en progreso
  2. lims.test.parameter: Define parámetros para cada tipo de prueba
  3. lims.result: Almacena los resultados reales de las pruebas

Tareas de Implementación

1. Crear modelo lims.test.parameter

Archivo: lims_management/models/test_parameter.py

  • Definir modelo con campos:
    name = fields.Char(string='Parámetro', required=True)
    product_id = fields.Many2one('product.product', string='Análisis', 
                                  domain=[('is_analysis', '=', True)])
    unit = fields.Char(string='Unidad de Medida')
    value_type = fields.Selection([
        ('numeric', 'Numérico'),
        ('text', 'Texto'),
        ('selection', 'Selección'),
        ('boolean', 'Sí/No')
    ], string='Tipo de Valor', required=True)
    normal_min = fields.Float(string='Valor Normal Mínimo')
    normal_max = fields.Float(string='Valor Normal Máximo')
    selection_options = fields.Text(string='Opciones (para tipo selección)')
    sequence = fields.Integer(string='Secuencia', default=10)
    
  • Agregar validaciones y constraints
  • Crear vista de configuración

2. Crear modelo lims.test

Archivo: lims_management/models/lims_test.py

  • Definir modelo principal:
    name = fields.Char(string='Código de Prueba', required=True, readonly=True)
    sale_order_id = fields.Many2one('sale.order', string='Orden de Laboratorio')
    order_line_id = fields.Many2one('sale.order.line', string='Línea de Orden')
    product_id = fields.Many2one('product.product', string='Análisis')
    patient_id = fields.Many2one('res.partner', string='Paciente')
    sample_id = fields.Many2one('stock.lot', string='Muestra')
    state = fields.Selection([
        ('pending', 'Pendiente'),
        ('in_process', 'En Proceso'),
        ('result_entered', 'Resultado Ingresado'),
        ('validated', 'Validado'),
        ('cancelled', 'Cancelado')
    ], string='Estado', default='pending')
    technician_id = fields.Many2one('res.users', string='Técnico')
    validator_id = fields.Many2one('res.users', string='Validador')
    validation_date = fields.Datetime(string='Fecha de Validación')
    
  • Implementar generación automática de código de prueba
  • Agregar métodos de transición de estados
  • Implementar creación automática desde orden confirmada

3. Crear modelo lims.result

Archivo: lims_management/models/lims_result.py

  • Definir modelo de resultados:
    test_id = fields.Many2one('lims.test', string='Prueba', required=True)
    parameter_id = fields.Many2one('lims.test.parameter', string='Parámetro')
    value_numeric = fields.Float(string='Valor Numérico')
    value_text = fields.Text(string='Valor de Texto')
    value_selection = fields.Char(string='Valor de Selección')
    value_boolean = fields.Boolean(string='Valor Sí/No')
    is_normal = fields.Boolean(string='Dentro de Rango Normal', compute='_compute_is_normal')
    observations = fields.Text(string='Observaciones')
    attachment_ids = fields.Many2many('ir.attachment', string='Archivos Adjuntos')
    
  • Implementar cálculo automático de is_normal
  • Agregar validaciones según tipo de valor

4. Implementar generación automática de pruebas

Archivo: lims_management/models/sale_order.py (extender)

  • Al confirmar orden con análisis, crear registros lims.test
  • Vincular con muestras generadas automáticamente
  • Notificar en el chatter sobre pruebas creadas

5. Crear vistas de entrada de resultados

Archivo: lims_management/views/lims_test_views.xml

  • Vista kanban por estado para gestión de pruebas
  • Vista formulario con:
    • Información del paciente y muestra (readonly)
    • Lista editable de resultados por parámetro
    • Destacar valores fuera de rango con color rojo
    • Botones de acción según estado
  • Vista lista con filtros y agrupaciones

6. Implementar flujo de validación

Archivo: lims_management/models/lims_test.py (extender)

  • Método action_enter_results() - marca como resultado ingresado
  • Método action_validate() - valida resultados (solo administradores)
  • Método action_request_review() - solicita revisión
  • Agregar validaciones de permisos

7. Crear informe PDF de resultados

Archivos:

  • lims_management/report/test_results_report.xml
  • lims_management/report/test_results_template.xml
  • Diseñar plantilla QWeb con:
    • Encabezado con logo del laboratorio
    • Información del paciente y orden
    • Tabla de resultados con formato: | Parámetro | Resultado | Unidad | Rango de Referencia |
    • Resaltar valores anormales
    • Sección de observaciones
    • Firma del validador
  • Configurar paper format A4

8. Implementar seguridad y permisos

Archivos:

  • lims_management/security/ir.model.access.csv (actualizar)
  • lims_management/security/security.xml (actualizar)
  • Definir grupos:
    • Técnico de Laboratorio: crear/editar resultados
    • Administrador de Laboratorio: validar resultados
  • Crear reglas de registro para cada modelo
  • Implementar campo-nivel de seguridad para validación

9. Crear datos de demostración

Archivo: lims_management/demo/test_parameters_demo.xml

  • Parámetros para hemograma completo
  • Parámetros para química sanguínea
  • Parámetros para uroanálisis
  • Crear algunas pruebas de ejemplo con resultados

10. Implementar notificaciones

Archivo: lims_management/models/lims_test.py (extender)

  • Email al paciente cuando resultados están validados
  • Notificación al médico referente
  • Plantillas de email profesionales

Consideraciones Técnicas

Performance

  • Usar compute fields con store=True donde sea apropiado
  • Índices en campos de búsqueda frecuente (patient_id, state)
  • Lazy loading para attachments

Usabilidad

  • Interfaz intuitiva para entrada rápida de resultados
  • Atajos de teclado para navegación entre campos
  • Autocompletado donde sea aplicable
  • Vista previa del PDF antes de enviar

Validación de Datos

  • Validar rangos numéricos según parámetros
  • Prevenir modificación de resultados validados
  • Log de auditoría para cambios en resultados

Integración

  • API REST para consulta de resultados (futuro)
  • Webhook para notificaciones externas
  • Exportación de resultados en formato HL7 (opcional)

Flujo de Trabajo

graph TD
    A[Orden Confirmada] --> B[Generar Pruebas]
    B --> C[Estado: Pendiente]
    C --> D[Muestra Recibida]
    D --> E[Estado: En Proceso]
    E --> F[Técnico Ingresa Resultados]
    F --> G[Estado: Resultado Ingresado]
    G --> H{Validación por Admin}
    H -->|Aprobado| I[Estado: Validado]
    H -->|Rechazado| J[Solicitar Corrección]
    J --> F
    I --> K[Generar PDF]
    K --> L[Enviar Notificaciones]

Criterios de Aceptación

  1. Los análisis tienen parámetros configurables con unidades y rangos
  2. La entrada de resultados es dinámica según el tipo de análisis
  3. Los valores fuera de rango se destacan visualmente
  4. El flujo de validación respeta los permisos por rol
  5. El PDF generado tiene formato profesional y es descargable
  6. Las notificaciones se envían automáticamente
  7. Existe trazabilidad completa de cambios
  8. La interfaz es intuitiva y eficiente

Estimación de Tiempo

  • Tareas 1-3: 3-4 horas (modelos y estructura)
  • Tarea 4: 1 hora (integración con órdenes)
  • Tarea 5: 2-3 horas (vistas complejas)
  • Tarea 6: 2 horas (flujo de validación)
  • Tarea 7: 3-4 horas (reporte PDF)
  • Tarea 8: 1-2 horas (seguridad)
  • Tareas 9-10: 2 horas (demo y notificaciones)

Total estimado: 15-18 horas

Dependencias

  • Issue #31: Configuración inicial del módulo ✓
  • Issue #32: Generación automática de muestras ✓
  • Módulos de Odoo: sale, stock, mail, report

Riesgos y Mitigaciones

  1. Riesgo: Complejidad en la entrada dinámica de resultados

    • Mitigación: Comenzar con tipos básicos y expandir gradualmente
  2. Riesgo: Performance con muchos parámetros por prueba

    • Mitigación: Implementar paginación y carga diferida
  3. Riesgo: Formato de PDF no cumple expectativas

    • Mitigación: Revisar ejemplos tempranos con usuario