# 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 Tubo de Suero (Tapa Roja) True consu ``` - [ ] 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