
- Definición de 10 tareas principales - Modelos: lims.test, lims.test.parameter, lims.result - Flujo de validación de dos pasos - Generación de reportes PDF - Sistema de permisos por roles - Integración con órdenes y muestras existentes
8.9 KiB
Plan de Implementación - Issue #8: Gestión de Pruebas y Resultados
Objetivo
Implementar el sistema completo de gestión de pruebas de laboratorio, incluyendo definición de parámetros, entrada de resultados, validación y generación de reportes.
Análisis de Requisitos
Funcionalidad Esperada
- Catálogo de Pruebas con Parámetros: Cada análisis debe tener parámetros configurables con unidades y rangos de referencia
- Entrada de Resultados: Interfaz dinámica para captura de resultados según el tipo de análisis
- Validación de Resultados: Flujo de dos pasos (técnico ingresa, administrador valida)
- Generación de Reportes: PDF con formato profesional y resultados fuera de rango resaltados
- Control de Acceso: Permisos basados en roles para técnicos y administradores
Modelos de Datos Requeridos
- lims.test: Representa una prueba de laboratorio en progreso
- lims.test.parameter: Define parámetros para cada tipo de prueba
- lims.result: Almacena los resultados reales de las pruebas
Tareas de Implementación
1. Crear modelo lims.test.parameter
Archivo: lims_management/models/test_parameter.py
- Definir modelo con campos:
name = fields.Char(string='Parámetro', required=True) product_id = fields.Many2one('product.product', string='Análisis', domain=[('is_analysis', '=', True)]) unit = fields.Char(string='Unidad de Medida') value_type = fields.Selection([ ('numeric', 'Numérico'), ('text', 'Texto'), ('selection', 'Selección'), ('boolean', 'Sí/No') ], string='Tipo de Valor', required=True) normal_min = fields.Float(string='Valor Normal Mínimo') normal_max = fields.Float(string='Valor Normal Máximo') selection_options = fields.Text(string='Opciones (para tipo selección)') sequence = fields.Integer(string='Secuencia', default=10)
- Agregar validaciones y constraints
- Crear vista de configuración
2. Crear modelo lims.test
Archivo: lims_management/models/lims_test.py
- Definir modelo principal:
name = fields.Char(string='Código de Prueba', required=True, readonly=True) sale_order_id = fields.Many2one('sale.order', string='Orden de Laboratorio') order_line_id = fields.Many2one('sale.order.line', string='Línea de Orden') product_id = fields.Many2one('product.product', string='Análisis') patient_id = fields.Many2one('res.partner', string='Paciente') sample_id = fields.Many2one('stock.lot', string='Muestra') state = fields.Selection([ ('pending', 'Pendiente'), ('in_process', 'En Proceso'), ('result_entered', 'Resultado Ingresado'), ('validated', 'Validado'), ('cancelled', 'Cancelado') ], string='Estado', default='pending') technician_id = fields.Many2one('res.users', string='Técnico') validator_id = fields.Many2one('res.users', string='Validador') validation_date = fields.Datetime(string='Fecha de Validación')
- Implementar generación automática de código de prueba
- Agregar métodos de transición de estados
- Implementar creación automática desde orden confirmada
3. Crear modelo lims.result
Archivo: lims_management/models/lims_result.py
- Definir modelo de resultados:
test_id = fields.Many2one('lims.test', string='Prueba', required=True) parameter_id = fields.Many2one('lims.test.parameter', string='Parámetro') value_numeric = fields.Float(string='Valor Numérico') value_text = fields.Text(string='Valor de Texto') value_selection = fields.Char(string='Valor de Selección') value_boolean = fields.Boolean(string='Valor Sí/No') is_normal = fields.Boolean(string='Dentro de Rango Normal', compute='_compute_is_normal') observations = fields.Text(string='Observaciones') attachment_ids = fields.Many2many('ir.attachment', string='Archivos Adjuntos')
- Implementar cálculo automático de is_normal
- Agregar validaciones según tipo de valor
4. Implementar generación automática de pruebas
Archivo: lims_management/models/sale_order.py
(extender)
- Al confirmar orden con análisis, crear registros lims.test
- Vincular con muestras generadas automáticamente
- Notificar en el chatter sobre pruebas creadas
5. Crear vistas de entrada de resultados
Archivo: lims_management/views/lims_test_views.xml
- Vista kanban por estado para gestión de pruebas
- Vista formulario con:
- Información del paciente y muestra (readonly)
- Lista editable de resultados por parámetro
- Destacar valores fuera de rango con color rojo
- Botones de acción según estado
- Vista lista con filtros y agrupaciones
6. Implementar flujo de validación
Archivo: lims_management/models/lims_test.py
(extender)
- Método action_enter_results() - marca como resultado ingresado
- Método action_validate() - valida resultados (solo administradores)
- Método action_request_review() - solicita revisión
- Agregar validaciones de permisos
7. Crear informe PDF de resultados
Archivos:
lims_management/report/test_results_report.xml
lims_management/report/test_results_template.xml
- Diseñar plantilla QWeb con:
- Encabezado con logo del laboratorio
- Información del paciente y orden
- Tabla de resultados con formato: | Parámetro | Resultado | Unidad | Rango de Referencia |
- Resaltar valores anormales
- Sección de observaciones
- Firma del validador
- Configurar paper format A4
8. Implementar seguridad y permisos
Archivos:
lims_management/security/ir.model.access.csv
(actualizar)lims_management/security/security.xml
(actualizar)- Definir grupos:
- Técnico de Laboratorio: crear/editar resultados
- Administrador de Laboratorio: validar resultados
- Crear reglas de registro para cada modelo
- Implementar campo-nivel de seguridad para validación
9. Crear datos de demostración
Archivo: lims_management/demo/test_parameters_demo.xml
- Parámetros para hemograma completo
- Parámetros para química sanguínea
- Parámetros para uroanálisis
- Crear algunas pruebas de ejemplo con resultados
10. Implementar notificaciones
Archivo: lims_management/models/lims_test.py
(extender)
- Email al paciente cuando resultados están validados
- Notificación al médico referente
- Plantillas de email profesionales
Consideraciones Técnicas
Performance
- Usar compute fields con store=True donde sea apropiado
- Índices en campos de búsqueda frecuente (patient_id, state)
- Lazy loading para attachments
Usabilidad
- Interfaz intuitiva para entrada rápida de resultados
- Atajos de teclado para navegación entre campos
- Autocompletado donde sea aplicable
- Vista previa del PDF antes de enviar
Validación de Datos
- Validar rangos numéricos según parámetros
- Prevenir modificación de resultados validados
- Log de auditoría para cambios en resultados
Integración
- API REST para consulta de resultados (futuro)
- Webhook para notificaciones externas
- Exportación de resultados en formato HL7 (opcional)
Flujo de Trabajo
graph TD
A[Orden Confirmada] --> B[Generar Pruebas]
B --> C[Estado: Pendiente]
C --> D[Muestra Recibida]
D --> E[Estado: En Proceso]
E --> F[Técnico Ingresa Resultados]
F --> G[Estado: Resultado Ingresado]
G --> H{Validación por Admin}
H -->|Aprobado| I[Estado: Validado]
H -->|Rechazado| J[Solicitar Corrección]
J --> F
I --> K[Generar PDF]
K --> L[Enviar Notificaciones]
Criterios de Aceptación
- Los análisis tienen parámetros configurables con unidades y rangos
- La entrada de resultados es dinámica según el tipo de análisis
- Los valores fuera de rango se destacan visualmente
- El flujo de validación respeta los permisos por rol
- El PDF generado tiene formato profesional y es descargable
- Las notificaciones se envían automáticamente
- Existe trazabilidad completa de cambios
- La interfaz es intuitiva y eficiente
Estimación de Tiempo
- Tareas 1-3: 3-4 horas (modelos y estructura)
- Tarea 4: 1 hora (integración con órdenes)
- Tarea 5: 2-3 horas (vistas complejas)
- Tarea 6: 2 horas (flujo de validación)
- Tarea 7: 3-4 horas (reporte PDF)
- Tarea 8: 1-2 horas (seguridad)
- Tareas 9-10: 2 horas (demo y notificaciones)
Total estimado: 15-18 horas
Dependencias
- Issue #31: Configuración inicial del módulo ✓
- Issue #32: Generación automática de muestras ✓
- Módulos de Odoo: sale, stock, mail, report
Riesgos y Mitigaciones
-
Riesgo: Complejidad en la entrada dinámica de resultados
- Mitigación: Comenzar con tipos básicos y expandir gradualmente
-
Riesgo: Performance con muchos parámetros por prueba
- Mitigación: Implementar paginación y carga diferida
-
Riesgo: Formato de PDF no cumple expectativas
- Mitigación: Revisar ejemplos tempranos con usuario