docs(#32): Add detailed implementation plan for automatic sample generation

This commit is contained in:
Luis Ernesto Portillo Zaldivar 2025-07-14 22:18:48 -06:00
parent 9241cbad79
commit cb0cabf2d2

View File

@ -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