From cb0cabf2d294f204f9de6d63adc23d0380255fc3 Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Mon, 14 Jul 2025 22:18:48 -0600 Subject: [PATCH] docs(#32): Add detailed implementation plan for automatic sample generation --- documents/plans/ISSUE32_PLAN.md | 191 ++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 documents/plans/ISSUE32_PLAN.md diff --git a/documents/plans/ISSUE32_PLAN.md b/documents/plans/ISSUE32_PLAN.md new file mode 100644 index 0000000..acf276e --- /dev/null +++ b/documents/plans/ISSUE32_PLAN.md @@ -0,0 +1,191 @@ +# Plan de Implementación - Issue #32: Generación Automática de Muestras + +## Objetivo +Automatizar la generación de muestras cuando se confirman órdenes de laboratorio, basándose en las relaciones test-muestra establecidas en Issue #44. + +## Análisis de Requisitos + +### Funcionalidad Esperada +1. Al confirmar una orden de laboratorio (`sale.order` con `is_lab_request=True`): + - Analizar todos los análisis incluidos en las líneas de orden + - Agrupar análisis por tipo de muestra requerida + - Generar automáticamente registros `stock.lot` (muestras) para cada grupo + - Asignar códigos de barras únicos a cada muestra + - Establecer el estado inicial como 'pending_collection' + +### Reglas de Negocio +1. **Agrupación de Análisis**: Múltiples análisis que requieran el mismo tipo de muestra deben compartir un único contenedor +2. **Volumen de Muestra**: Sumar los volúmenes requeridos de todos los análisis del grupo +3. **Identificación**: Cada muestra debe tener un código de barras único generado automáticamente +4. **Trazabilidad**: Las muestras deben estar vinculadas a la orden de laboratorio original +5. **Manejo de Errores**: Si un análisis no tiene tipo de muestra definido, generar advertencia pero continuar con los demás + +## Tareas de Implementación + +### 1. Extender el modelo sale.order +**Archivo:** `lims_management/models/sale_order.py` +- [ ] Agregar campo Many2many para referenciar las muestras generadas: + ```python + generated_sample_ids = fields.Many2many( + 'stock.lot', + 'sale_order_stock_lot_rel', + 'order_id', + 'lot_id', + string='Muestras Generadas', + domain="[('is_lab_sample', '=', True)]", + readonly=True + ) + ``` +- [ ] Override del método `action_confirm()` para interceptar la confirmación +- [ ] Implementar método `_generate_lab_samples()` con la lógica principal +- [ ] Agregar método `_group_analyses_by_sample_type()` para agrupar análisis + +### 2. Lógica de generación de muestras +**Archivo:** `lims_management/models/sale_order.py` +- [ ] Implementar algoritmo de agrupación: + ```python + def _group_analyses_by_sample_type(self): + """Agrupa las líneas de orden por tipo de muestra requerida""" + groups = {} + for line in self.order_line: + if line.product_id.is_analysis: + sample_type = line.product_id.required_sample_type_id + if sample_type: + if sample_type.id not in groups: + groups[sample_type.id] = { + 'sample_type': sample_type, + 'lines': [], + 'total_volume': 0.0 + } + groups[sample_type.id]['lines'].append(line) + groups[sample_type.id]['total_volume'] += line.product_id.sample_volume_ml or 0.0 + return groups + ``` +- [ ] Crear método para generar muestras por grupo +- [ ] Implementar logging para trazabilidad + +### 3. Generación de códigos de barras +**Archivo:** `lims_management/models/stock_lot.py` +- [ ] Mejorar el método `_compute_barcode()` para asegurar unicidad +- [ ] Agregar validación de duplicados +- [ ] Considerar prefijos por tipo de muestra + +### 4. Actualizar vistas de sale.order +**Archivo:** `lims_management/views/sale_order_views.xml` +- [ ] Agregar pestaña "Muestras Generadas" en formulario de orden +- [ ] Mostrar campo `generated_sample_ids` con vista de lista embebida +- [ ] Agregar botón para regenerar muestras (si es necesario) +- [ ] Incluir indicadores visuales del estado de generación + +### 5. Crear wizard de configuración (opcional) +**Archivos:** +- `lims_management/wizard/sample_generation_wizard.py` +- `lims_management/wizard/sample_generation_wizard_view.xml` +- [ ] Crear wizard para revisar/modificar la generación antes de confirmar +- [ ] Permitir ajustes manuales de agrupación si es necesario +- [ ] Opción para excluir ciertos análisis de la generación automática + +### 6. Notificaciones y alertas +**Archivo:** `lims_management/models/sale_order.py` +- [ ] Implementar sistema de notificaciones: + - Análisis sin tipo de muestra definido + - Muestras generadas exitosamente + - Errores en la generación +- [ ] Usar el sistema de mensajería de Odoo (`mail.thread`) + +### 7. Pruebas y validación +**Archivo:** `verify_automatic_sample_generation.py` +- [ ] Crear script de verificación que pruebe: + - Generación correcta de muestras + - Agrupación adecuada de análisis + - Cálculo correcto de volúmenes + - Unicidad de códigos de barras + - Manejo de casos edge (análisis sin tipo de muestra) + +### 8. Actualizar datos de demostración +**Archivo:** `lims_management/demo/z_automatic_generation_demo.xml` +- [ ] Crear órdenes de laboratorio de ejemplo que demuestren: + - Orden con múltiples análisis del mismo tipo de muestra + - Orden con análisis de diferentes tipos de muestra + - Orden mixta con algunos análisis sin tipo de muestra + +## Consideraciones Técnicas + +### Performance +- La generación debe ser eficiente incluso con órdenes grandes (20+ análisis) +- Usar creación en batch para múltiples muestras +- Considerar uso de SQL para verificación de unicidad de barcodes + +### Transaccionalidad +- Todo el proceso debe ser atómico: o se generan todas las muestras o ninguna +- Usar `@api.model` con manejo adecuado de excepciones +- Rollback automático en caso de error + +### Configurabilidad +- Considerar agregar configuración a nivel de compañía: + - Habilitar/deshabilitar generación automática + - Formato de código de barras personalizable + - Reglas de agrupación personalizables + +### Compatibilidad +- Mantener compatibilidad con flujo manual existente +- Permitir creación manual de muestras adicionales si es necesario +- No interferir con órdenes de venta regulares (no laboratorio) + +## Flujo de Trabajo + +```mermaid +graph TD + A[Orden de Laboratorio] --> B{¿Confirmar Orden?} + B -->|Sí| C[Analizar Líneas de Orden] + C --> D[Identificar Análisis] + D --> E[Agrupar por Tipo de Muestra] + E --> F{¿Todos tienen tipo de muestra?} + F -->|No| G[Generar Advertencia] + F -->|Sí| H[Continuar] + G --> H + H --> I[Crear Muestras por Grupo] + I --> J[Generar Códigos de Barras] + J --> K[Asociar a la Orden] + K --> L[Confirmar Orden] + L --> M[Notificar Usuario] +``` + +## Criterios de Aceptación + +1. [ ] Al confirmar una orden de laboratorio, se generan automáticamente las muestras necesarias +2. [ ] Los análisis que requieren el mismo tipo de muestra se agrupan en un solo contenedor +3. [ ] Cada muestra tiene un código de barras único +4. [ ] Se muestra claramente qué muestras fueron generadas para cada orden +5. [ ] Se manejan adecuadamente los análisis sin tipo de muestra definido +6. [ ] El sistema registra un log de la generación para auditoría +7. [ ] La funcionalidad se puede deshabilitar si es necesario +8. [ ] No afecta el rendimiento de confirmación de órdenes regulares + +## Estimación de Tiempo + +- Tarea 1-2: 2-3 horas (lógica principal) +- Tarea 3: 1 hora (mejoras barcode) +- Tarea 4: 1 hora (vistas) +- Tarea 5: 2 horas (wizard opcional) +- Tarea 6: 1 hora (notificaciones) +- Tarea 7-8: 1-2 horas (pruebas y demo) + +**Total estimado: 8-10 horas** + +## Dependencias + +- **Completo**: Issue #44 (Relaciones test-muestra) ✓ +- **Requerido**: Módulo `stock` de Odoo para `stock.lot` +- **Requerido**: Librería `python-barcode` para generación de códigos + +## Riesgos y Mitigaciones + +1. **Riesgo**: Conflictos con otros módulos que modifiquen `sale.order.action_confirm()` + - **Mitigación**: Usar `super()` correctamente y documentar la integración + +2. **Riesgo**: Rendimiento con órdenes muy grandes + - **Mitigación**: Implementar creación en batch y considerar procesamiento asíncrono + +3. **Riesgo**: Duplicación de códigos de barras + - **Mitigación**: Implementar verificación robusta y regeneración si es necesario \ No newline at end of file