
- Fixed missing action_collect method for pending_collection state - Updated all model field labels to Spanish - Updated view labels and strings to Spanish - Fixed readonly conditions for pending_collection state - Added barcode and new fields to stock.lot views - Updated sale.order embedded view with correct button - Added 5-minute timeout note to CLAUDE.md - Removed problematic demo sale.order XML records - Updated test script location guidance in CLAUDE.md - Marked all acceptance criteria as completed in plan
191 lines
7.8 KiB
Markdown
191 lines
7.8 KiB
Markdown
# 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 |