# 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