# Plan de Implementación - Issue #44: Agregar relación entre análisis y tipos de muestra

## Objetivo
Establecer una relación entre los productos tipo análisis (tests) y los tipos de muestra que requieren, para permitir la automatización de generación de muestras al confirmar órdenes de laboratorio.

## Análisis Previo

### Situación Actual
- Los productos tipo análisis (`is_analysis=True`) no tienen campo para indicar qué tipo de muestra requieren
- Los productos tipo muestra (`is_sample_type=True`) existen pero no están relacionados con los análisis
- El modelo `stock.lot` tiene `container_type` como Selection hardcodeado, no como relación con productos

### Impacto
- Sin esta relación, no es posible automatizar la generación de muestras (Issue #32)
- No se puede validar que se use el contenedor correcto para cada análisis
- Dificulta la agrupación de análisis que usan el mismo tipo de muestra

## Tareas de Implementación

### 1. Modificar el modelo ProductTemplate
- **Archivo:** `lims_management/models/product.py`
- **Tareas:**
    - [x] Agregar campo `required_sample_type_id`:
        ```python
        required_sample_type_id = fields.Many2one(
            'product.template',
            string='Tipo de Muestra Requerida',
            domain="[('is_sample_type', '=', True)]",
            help="Tipo de muestra/contenedor requerido para realizar este análisis"
        )
        ```
    - [x] Agregar validación para asegurar que solo se puede asignar a productos con `is_analysis=True`
    - [x] Considerar agregar campo `sample_volume_ml` para indicar volumen requerido

### 2. Actualizar el modelo StockLot
- **Archivo:** `lims_management/models/stock_lot.py`
- **Tareas:**
    - [ ] **Opción A - Migrar container_type a Many2one:**
        ```python
        # Deprecar el campo Selection actual
        container_type_legacy = fields.Selection([...], deprecated=True)
        
        # Nuevo campo relacional
        sample_type_product_id = fields.Many2one(
            'product.template',
            string='Tipo de Muestra',
            domain="[('is_sample_type', '=', True)]"
        )
        ```
    - [ ] **Opción B - Mantener ambos campos:**
        - Mantener `container_type` para compatibilidad
        - Agregar `sample_type_product_id` como campo principal
        - Sincronizar ambos campos con un @api.onchange
    - [ ] Agregar método para obtener el nombre del contenedor desde el producto

### 3. Actualizar las vistas

#### 3.1 Vista de Producto (Análisis)
- **Archivo:** `lims_management/views/product_views.xml`
- **Tareas:**
    - [ ] Agregar campo `required_sample_type_id` en el formulario cuando `is_analysis=True`
    - [ ] Mostrarlo en la pestaña de especificaciones técnicas
    - [ ] Agregar en la vista lista de análisis

#### 3.2 Vista de Stock Lot
- **Archivo:** `lims_management/views/stock_lot_views.xml`
- **Tareas:**
    - [ ] Reemplazar/actualizar el campo `container_type` con `sample_type_product_id`
    - [ ] Actualizar vistas de lista y formulario
    - [ ] Considerar mostrar imagen del contenedor desde el producto

### 4. Migración de datos existentes
- **Archivo:** `lims_management/migrations/18.0.1.1.0/post-migration.py`
- **Tareas:**
    - [ ] Crear script de migración para mapear valores de `container_type` a productos:
        ```python
        mapping = {
            'serum_tube': 'lims_management.sample_type_serum_tube',
            'edta_tube': 'lims_management.sample_type_edta_tube',
            'urine': 'lims_management.sample_type_urine_container',
            # etc...
        }
        ```
    - [ ] Actualizar registros `stock.lot` existentes con el producto correspondiente
    - [ ] Marcar `container_type` como deprecated

### 5. Actualizar datos de demostración
- **Archivos:** 
    - `lims_management/demo/z_analysis_demo.xml`
    - `lims_management/demo/z_sample_demo.xml`
- **Tareas:**
    - [ ] Asignar `required_sample_type_id` a cada análisis de demo:
        - Hemograma → Tubo EDTA
        - Glucosa → Tubo Suero
        - Urocultivo → Contenedor Orina
        - etc.
    - [ ] Verificar que todos los tipos de muestra necesarios estén creados

### 6. Crear datos iniciales de tipos de muestra
- **Archivo:** `lims_management/data/sample_types.xml`
- **Tareas:**
    - [ ] Crear productos para tipos de muestra comunes:
        ```xml
        <record id="sample_type_serum_tube" model="product.template">
            <field name="name">Tubo de Suero (Tapa Roja)</field>
            <field name="is_sample_type">True</field>
            <field name="type">consu</field>
            <field name="categ_id" ref="product_category_sample_containers"/>
        </record>
        ```
    - [ ] Incluir todos los tipos básicos: EDTA, Suero, Orina, Hisopado, etc.

### 7. Documentación y pruebas
- **Tareas:**
    - [ ] Actualizar README o documentación técnica
    - [ ] Crear script de verificación `verify_sample_relationships.py`
    - [ ] Pruebas manuales:
        - Crear nuevo análisis y asignar tipo de muestra
        - Verificar que la relación se guarda correctamente
        - Crear stock.lot y verificar el nuevo campo
        - Probar migración con datos existentes

### 8. Preparación para Issue #32
- **Tareas:**
    - [ ] Documentar cómo usar la nueva relación para automatización
    - [ ] Identificar lógica de agrupación (múltiples análisis → misma muestra)
    - [ ] Considerar reglas de negocio adicionales:
        - ¿Qué pasa si un análisis no tiene tipo de muestra asignado?
        - ¿Se pueden hacer múltiples análisis con la misma muestra física?

## Consideraciones Técnicas

### Compatibilidad hacia atrás
- Mantener el campo `container_type` temporalmente para no romper integraciones existentes
- Usar decorador `@api.depends` para sincronizar valores

### Performance
- Indexar el campo `is_sample_type` si no está indexado
- Considerar vista SQL para reportes que unan análisis con tipos de muestra

### Seguridad
- Solo usuarios con permisos de edición de productos pueden modificar `required_sample_type_id`
- Validar que no se pueda eliminar un tipo de muestra si está siendo usado por algún análisis

## Orden de Ejecución
1. Crear tipos de muestra en data inicial
2. Modificar modelos (product.py, stock_lot.py)
3. Actualizar vistas
4. Actualizar datos demo
5. Crear y ejecutar migración
6. Pruebas exhaustivas
7. Documentación

## Criterios de Aceptación
- [ ] Cada análisis puede tener asignado un tipo de muestra
- [ ] Los stock.lot pueden referenciar productos tipo muestra
- [ ] Migración exitosa de datos existentes
- [ ] Vistas actualizadas y funcionales
- [ ] Sin errores en logs de Odoo
- [ ] Datos demo coherentes y completos