From d285906b7bb5a1ffd54ba22085f4f088167d86cf Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Tue, 15 Jul 2025 00:11:42 -0600 Subject: [PATCH] =?UTF-8?q?docs(#8):=20Crear=20plan=20detallado=20para=20g?= =?UTF-8?q?esti=C3=B3n=20de=20pruebas=20y=20resultados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- documents/plans/ISSUE8_PLAN.md | 225 +++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 documents/plans/ISSUE8_PLAN.md diff --git a/documents/plans/ISSUE8_PLAN.md b/documents/plans/ISSUE8_PLAN.md new file mode 100644 index 0000000..ea1634e --- /dev/null +++ b/documents/plans/ISSUE8_PLAN.md @@ -0,0 +1,225 @@ +# 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 +1. **Catálogo de Pruebas con Parámetros**: Cada análisis debe tener parámetros configurables con unidades y rangos de referencia +2. **Entrada de Resultados**: Interfaz dinámica para captura de resultados según el tipo de análisis +3. **Validación de Resultados**: Flujo de dos pasos (técnico ingresa, administrador valida) +4. **Generación de Reportes**: PDF con formato profesional y resultados fuera de rango resaltados +5. **Control de Acceso**: Permisos basados en roles para técnicos y administradores + +### Modelos de Datos Requeridos +1. **lims.test**: Representa una prueba de laboratorio en progreso +2. **lims.test.parameter**: Define parámetros para cada tipo de prueba +3. **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: + ```python + 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: + ```python + 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: + ```python + 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 + +```mermaid +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 + +1. [ ] Los análisis tienen parámetros configurables con unidades y rangos +2. [ ] La entrada de resultados es dinámica según el tipo de análisis +3. [ ] Los valores fuera de rango se destacan visualmente +4. [ ] El flujo de validación respeta los permisos por rol +5. [ ] El PDF generado tiene formato profesional y es descargable +6. [ ] Las notificaciones se envían automáticamente +7. [ ] Existe trazabilidad completa de cambios +8. [ ] 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 + +1. **Riesgo**: Complejidad en la entrada dinámica de resultados + - **Mitigación**: Comenzar con tipos básicos y expandir gradualmente + +2. **Riesgo**: Performance con muchos parámetros por prueba + - **Mitigación**: Implementar paginación y carga diferida + +3. **Riesgo**: Formato de PDF no cumple expectativas + - **Mitigación**: Revisar ejemplos tempranos con usuario \ No newline at end of file