docs(#32): Add detailed implementation plan for automatic sample generation
This commit is contained in:
parent
9241cbad79
commit
cb0cabf2d2
191
documents/plans/ISSUE32_PLAN.md
Normal file
191
documents/plans/ISSUE32_PLAN.md
Normal 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
|
Loading…
Reference in New Issue
Block a user