# Plan de Implementación - Issue #51: Catálogo de Parámetros de Laboratorio

## Objetivo
Implementar un catálogo maestro de parámetros de laboratorio con configuración por análisis y rangos de referencia flexibles basados en edad, sexo y otras condiciones del paciente.

## Arquitectura Propuesta

### Modelos Principales
1. **lims.analysis.parameter** - Catálogo maestro de parámetros
2. **product.template.parameter** - Asociación parámetro-análisis
3. **lims.parameter.range** - Rangos de referencia flexibles
4. **lims.result** (modificado) - Usar parameter_id en lugar de parameter_name

## Fases de Implementación

### Fase 1: Creación de Modelos Base (Tasks 1-4)
**Objetivo**: Establecer la estructura de datos fundamental

#### Task 1: Crear modelo lims.analysis.parameter
- Crear archivo `lims_management/models/analysis_parameter.py`
- Definir campos: name, code, value_type, unit, selection_values, description, active
- Implementar constraints y validaciones
- Crear vistas (list, form) para gestión del catálogo
- Agregar menú de configuración
- Crear permisos de seguridad

#### Task 2: Crear modelo product.template.parameter
- Crear archivo `lims_management/models/product_template_parameter.py`
- Definir relación entre product.template y lims.analysis.parameter
- Implementar campos: sequence, required, instructions
- Agregar constraint de unicidad
- Crear vista embebida en product.template
- Actualizar herencia de product.template

#### Task 3: Crear modelo lims.parameter.range
- Crear archivo `lims_management/models/parameter_range.py`
- Implementar campos de condiciones: gender, age_min, age_max, pregnant
- Implementar campos de valores: normal_min/max, critical_min/max
- Crear método _compute_name()
- Agregar constraint de unicidad
- Crear vistas de configuración

#### Task 4: Agregar método _compute_age() en res.partner
- Extender modelo res.partner
- Implementar cálculo de edad basado en birth_date
- Agregar campo is_pregnant (Boolean)
- Crear tests unitarios para el cálculo

### Fase 2: Migración y Adaptación (Tasks 5-7)
**Objetivo**: Adaptar el sistema existente al nuevo modelo

#### Task 5: Modificar modelo lims.result
- Cambiar parameter_name (Char) a parameter_id (Many2one)
- Mantener parameter_name como campo related (compatibilidad)
- Implementar _compute_applicable_range()
- Actualizar _compute_is_out_of_range() para usar rangos flexibles
- Crear script de migración de datos

#### Task 6: Actualizar generación automática de resultados
- Modificar _generate_test_results() en lims.test
- Generar líneas basadas en product.template.parameter
- Respetar orden (sequence) y obligatoriedad
- Asignar tipos de dato correctos

#### Task 7: Eliminar modelo obsoleto lims.analysis.range
- Remover archivo del modelo
- Eliminar referencias en product.template
- Actualizar vistas que lo referencian
- Limpiar datos de demo
- Actualizar __init__.py y __manifest__.py

### Fase 3: Interfaz de Usuario (Tasks 8-10)
**Objetivo**: Crear interfaces intuitivas para configuración y uso

#### Task 8: Crear vistas de configuración de parámetros
- Vista de catálogo de parámetros (búsqueda, filtros)
- Formulario de parámetro con smart buttons
- Vista de configuración de parámetros por análisis
- Vista de rangos con filtros por parámetro

#### Task 9: Actualizar vistas de ingreso de resultados
- Adaptar formulario de lims.result
- Mostrar tipo de dato esperado
- Validación en tiempo real
- Indicadores visuales de valores fuera de rango
- Mostrar rango aplicable según paciente

#### Task 10: Crear wizards de configuración masiva
- Wizard para copiar configuración entre análisis
- Wizard para importar parámetros desde CSV
- Wizard para aplicar rangos a múltiples parámetros

### Fase 4: Datos y Validación (Tasks 11-13)
**Objetivo**: Poblar el sistema con datos útiles y validar funcionamiento

#### Task 11: Crear datos de demostración
- Parámetros comunes de hematología
- Parámetros de química sanguínea
- Configuración para análisis existentes
- Rangos por edad/sexo realistas
- Casos de prueba especiales

#### Task 12: Desarrollar tests automatizados
- Tests unitarios para modelos
- Tests de integración para flujos
- Tests de validación de rangos
- Tests de migración de datos
- Tests de rendimiento

#### Task 13: Actualizar reportes
- Modificar report_test_result
- Incluir información del catálogo
- Mostrar rangos aplicables
- Resaltar valores anormales
- Agregar interpretación cuando esté disponible

## Consideraciones Técnicas

### Migración de Datos
- Script Python para migrar parameter_name existentes
- Crear parámetros automáticamente desde histórico
- Mantener compatibilidad durante transición
- Backup antes de migración

### Performance
- Índices en campos de búsqueda frecuente
- Cache para rangos aplicables
- Lazy loading en vistas con muchos parámetros

### Seguridad
- Solo administradores pueden crear/modificar catálogo
- Técnicos pueden ver pero no editar parámetros
- Logs de auditoría para cambios en rangos

## Cronograma Estimado

- **Fase 1**: 2-3 días (Modelos base y estructura)
- **Fase 2**: 2 días (Migración y adaptación)
- **Fase 3**: 2 días (Interfaces de usuario)
- **Fase 4**: 1-2 días (Datos y validación)

**Total estimado**: 7-9 días de desarrollo

## Riesgos y Mitigaciones

1. **Riesgo**: Pérdida de datos durante migración
   - **Mitigación**: Scripts de backup y rollback

2. **Riesgo**: Resistencia al cambio de usuarios
   - **Mitigación**: Mantener compatibilidad temporal, capacitación

3. **Riesgo**: Complejidad en rangos múltiples
   - **Mitigación**: UI intuitiva, valores por defecto sensatos

## Criterios de Éxito

- [ ] Todos los tests automatizados pasan
- [ ] Migración sin pérdida de datos
- [ ] Validación automática funcional
- [ ] Reportes muestran información correcta
- [ ] Performance aceptable (< 2s carga de resultados)
- [ ] Documentación actualizada

## Próximos Pasos

1. Revisar y aprobar este plan
2. Comenzar con Task 1: Crear modelo lims.analysis.parameter
3. Seguir el orden de las fases para mantener coherencia
4. Validar cada fase antes de continuar

---

**Nota**: Este plan está sujeto a ajustes según se descubran nuevos requerimientos o complejidades durante la implementación.