
- 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
7.8 KiB
7.8 KiB
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
- Al confirmar una orden de laboratorio (
sale.order
conis_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
- Agrupación de Análisis: Múltiples análisis que requieran el mismo tipo de muestra deben compartir un único contenedor
- Volumen de Muestra: Sumar los volúmenes requeridos de todos los análisis del grupo
- Identificación: Cada muestra debe tener un código de barras único generado automáticamente
- Trazabilidad: Las muestras deben estar vinculadas a la orden de laboratorio original
- 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:
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:
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
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
- Al confirmar una orden de laboratorio, se generan automáticamente las muestras necesarias
- Los análisis que requieren el mismo tipo de muestra se agrupan en un solo contenedor
- Cada muestra tiene un código de barras único
- Se muestra claramente qué muestras fueron generadas para cada orden
- Se manejan adecuadamente los análisis sin tipo de muestra definido
- El sistema registra un log de la generación para auditoría
- La funcionalidad se puede deshabilitar si es necesario (opcional - no implementado)
- 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 parastock.lot
- Requerido: Librería
python-barcode
para generación de códigos
Riesgos y Mitigaciones
-
Riesgo: Conflictos con otros módulos que modifiquen
sale.order.action_confirm()
- Mitigación: Usar
super()
correctamente y documentar la integración
- Mitigación: Usar
-
Riesgo: Rendimiento con órdenes muy grandes
- Mitigación: Implementar creación en batch y considerar procesamiento asíncrono
-
Riesgo: Duplicación de códigos de barras
- Mitigación: Implementar verificación robusta y regeneración si es necesario