
- 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
163 lines
6.7 KiB
Markdown
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 |