# 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