From 88d3ded083bfd65974e311a22962686ac591b597 Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Mon, 14 Jul 2025 20:28:40 -0600 Subject: [PATCH] docs: Add ISSUE44_PLAN.md for test-sample relationship implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Created detailed implementation plan for adding relationship between analyses and sample types - Includes tasks for model updates, view modifications, data migration, and demo data - Addresses compatibility concerns and preparation for automatic sample generation (Issue #32) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- documents/plans/ISSUE44_PLAN.md | 160 ++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 documents/plans/ISSUE44_PLAN.md diff --git a/documents/plans/ISSUE44_PLAN.md b/documents/plans/ISSUE44_PLAN.md new file mode 100644 index 0000000..b65373c --- /dev/null +++ b/documents/plans/ISSUE44_PLAN.md @@ -0,0 +1,160 @@ +# 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:** + - [ ] 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" + ) + ``` + - [ ] Agregar validación para asegurar que solo se puede asignar a productos con `is_analysis=True` + - [ ] 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 \ No newline at end of file