# 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:
  ```python
  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:
  ```python
  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

```mermaid
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