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

163 lines
6.7 KiB
Markdown

# 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