clinical_laboratory/documents/plans/ISSUE8_PLAN.md
Luis Ernesto Portillo Zaldivar 7e2dfb6465 docs(#8): Actualizar plan para enfocarse en requisitos específicos del issue
- Reducir alcance a lo especificado en Issue #8
- Eliminar funcionalidades de otros issues (PDF, seguridad avanzada)
- Agregar validación opcional configurable
- Actualizar estimación a 9 horas
- 7 tareas principales enfocadas en modelos e interfaz
2025-07-15 00:22:29 -06:00

6.7 KiB

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

Objetivo

Implementar los modelos y la interfaz básica para la gestión de pruebas y resultados de laboratorio, específicamente los modelos lims.test y lims.result con entrada dinámica de resultados.

Análisis de Requisitos

Funcionalidad Esperada (según Issue #8)

  1. Modelo lims.test: Representar la ejecución de un análisis con estados
  2. Modelo lims.result: Almacenar cada valor de resultado con soporte para múltiples tipos
  3. Interfaz de entrada dinámica: Vista formulario con lista editable de resultados
  4. Resaltado visual: Mostrar en rojo los resultados fuera de rango
  5. Validación opcional: Permitir configurar si se requiere validación por administrador

Modelos de Datos Requeridos (según Issue #8)

  1. lims.test: Representa la ejecución de un análisis
  2. lims.result: Almacena cada valor de resultado
  3. lims.test.parameter: Modelo referenciado (asumimos ya existe o se creará)

Tareas de Implementación

1. Crear modelo lims.test

Archivo: lims_management/models/lims_test.py

  • Definir modelo según especificación del issue:
    sale_order_line_id = fields.Many2one('sale.order.line', string='Línea de Orden')
    patient_id = fields.Many2one('res.partner', string='Paciente', 
                                 related='sale_order_line_id.order_id.partner_id')
    product_id = fields.Many2one('product.product', string='Análisis',
                                 related='sale_order_line_id.product_id')
    sample_id = fields.Many2one('stock.lot', string='Muestra')
    state = fields.Selection([
        ('draft', 'Borrador'),
        ('in_process', 'En Proceso'),
        ('result_entered', 'Resultado Ingresado'),
        ('validated', 'Validado'),
        ('cancelled', 'Cancelado')
    ], string='Estado', default='draft')
    validator_id = fields.Many2one('res.users', string='Validador')
    validation_date = fields.Datetime(string='Fecha de Validación')
    require_validation = fields.Boolean(string='Requiere Validación',
                                       compute='_compute_require_validation')
    
  • Implementar _compute_require_validation basado en configuración
  • Agregar métodos de transición de estados

2. Crear modelo lims.result

Archivo: lims_management/models/lims_result.py

  • Definir modelo según especificación:
    test_id = fields.Many2one('lims.test', string='Prueba', required=True, ondelete='cascade')
    parameter_id = fields.Many2one('lims.test.parameter', string='Parámetro')
    value_numeric = fields.Float(string='Valor Numérico')
    value_text = fields.Char(string='Valor de Texto')
    value_selection = fields.Selection([], string='Valor de Selección')
    is_out_of_range = fields.Boolean(string='Fuera de Rango', compute='_compute_is_out_of_range')
    notes = fields.Text(string='Notas del Técnico')
    
  • Implementar _compute_is_out_of_range para detectar valores anormales
  • Agregar validación para asegurar que solo un tipo de valor esté lleno

3. Desarrollar interfaz de ingreso de resultados

Archivo: lims_management/views/lims_test_views.xml

  • Crear vista formulario para lims.test con:
    • Información de cabecera (paciente, análisis, muestra)
    • Lista editable (One2many) de lims.result
    • Campos dinámicos según parámetros del análisis
  • Implementar widget o CSS para resaltar en rojo valores fuera de rango
  • Agregar botones de acción según estado

4. Implementar lógica visual para valores fuera de rango

Archivo: lims_management/static/src/ (CSS/JS)

  • Crear CSS para clase .out-of-range con color rojo
  • Implementar widget o computed field que aplique la clase
  • Asegurar que funcione en vista formulario y lista

5. Agregar configuración de validación opcional

Archivo: lims_management/models/res_config_settings.py

  • Agregar campo booleano lims_require_validation
  • Extender res.config.settings para incluir esta configuración
  • Modificar lims.test para usar esta configuración en flujo de trabajo

6. Crear vistas básicas

Archivo: lims_management/views/lims_test_views.xml

  • Vista lista de pruebas con campos básicos
  • Vista kanban agrupada por estado
  • Menú de acceso en Laboratorio > Pruebas

7. Crear datos de demostración básicos

Archivo: lims_management/demo/lims_test_demo.xml

  • Crear algunos registros lims.test de ejemplo
  • Agregar resultados de demostración
  • Incluir casos con valores dentro y fuera de rango

Consideraciones Técnicas

Performance

  • Usar compute fields con store=True para is_out_of_range
  • Carga eficiente de parámetros relacionados

Usabilidad

  • Interfaz clara para entrada de resultados
  • Feedback visual inmediato para valores fuera de rango
  • Navegación intuitiva entre estados

Validación de Datos

  • Solo un tipo de valor debe estar lleno por resultado
  • Validar que el parámetro corresponda al análisis
  • Estados coherentes con el flujo de trabajo

Flujo de Trabajo

graph TD
    A[Línea de Orden] --> B[Crear lims.test]
    B --> C[Estado: draft]
    C --> D[Estado: in_process]
    D --> E[Técnico Ingresa Resultados]
    E --> F[Estado: result_entered]
    F --> G{¿Requiere Validación?}
    G -->|Sí| H[Esperar Validación]
    G -->|No| I[Proceso Completo]
    H --> J[Estado: validated]

Criterios de Aceptación (según Issue #8)

  1. Modelo lims.test creado con todos los campos especificados
  2. Modelo lims.result creado con soporte para múltiples tipos de valor
  3. Interfaz de formulario con lista editable de resultados
  4. Valores fuera de rango se muestran en rojo
  5. La validación por administrador es configurable
  6. Los campos relacionados (patient_id, product_id) funcionan correctamente

Estimación de Tiempo

  • Tarea 1: 2 horas (modelo lims.test)
  • Tarea 2: 1.5 horas (modelo lims.result)
  • Tarea 3: 2 horas (interfaz de entrada)
  • Tarea 4: 1 hora (lógica visual)
  • Tarea 5: 1 hora (configuración)
  • Tareas 6-7: 1.5 horas (vistas y demo)

Total estimado: 9 horas

Dependencias

  • Issue #31: Configuración inicial del módulo ✓
  • Issue #32: Generación automática de muestras ✓
  • Modelo lims.test.parameter (debe existir o crearse)
  • Módulos de Odoo: sale, stock

Riesgos y Mitigaciones

  1. Riesgo: El modelo lims.test.parameter no está definido

    • Mitigación: Crear modelo básico o usar product.product temporalmente
  2. Riesgo: Complejidad en la detección de valores fuera de rango

    • Mitigación: Implementar lógica simple inicialmente
  3. Riesgo: Integración con flujo existente de órdenes

    • Mitigación: Crear pruebas manualmente en primera versión