clinical_laboratory/documents/plans/ISSUE32_PLAN.md
Luis Ernesto Portillo Zaldivar 4be56fc9f7 fix(#32): Spanish translations and workflow fixes
- 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
2025-07-14 23:46:31 -06:00

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