# 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` - [x] 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 ) ``` - [x] Override del método `action_confirm()` para interceptar la confirmación - [x] Implementar método `_generate_lab_samples()` con la lógica principal - [x] 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` - [x] 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 ``` - [x] Crear método para generar muestras por grupo - [x] Implementar logging para trazabilidad ### 3. Generación de códigos de barras ✅ **Archivo:** `lims_management/models/stock_lot.py` - [x] Mejorar el método `_compute_barcode()` para asegurar unicidad - [x] Agregar validación de duplicados - [x] Considerar prefijos por tipo de muestra ### 4. Actualizar vistas de sale.order ✅ **Archivo:** `lims_management/views/sale_order_views.xml` - [x] Agregar pestaña "Muestras Generadas" en formulario de orden - [x] Mostrar campo `generated_sample_ids` con vista de lista embebida - [x] Agregar botón para regenerar muestras (si es necesario) - [x] 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` - [x] Implementar sistema de notificaciones: - Análisis sin tipo de muestra definido - Muestras generadas exitosamente - Errores en la generación - [x] Usar el sistema de mensajería de Odoo (`mail.thread`) ### 7. Pruebas y validación ✅ **Archivo:** `verify_automatic_sample_generation.py` - [x] 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` - [x] 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. [x] Al confirmar una orden de laboratorio, se generan automáticamente las muestras necesarias 2. [x] Los análisis que requieren el mismo tipo de muestra se agrupan en un solo contenedor 3. [x] Cada muestra tiene un código de barras único 4. [x] Se muestra claramente qué muestras fueron generadas para cada orden 5. [x] Se manejan adecuadamente los análisis sin tipo de muestra definido 6. [x] El sistema registra un log de la generación para auditoría 7. [ ] La funcionalidad se puede deshabilitar si es necesario (opcional - no implementado) 8. [x] 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