docs: Add ISSUE44_PLAN.md for test-sample relationship implementation

- 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 <noreply@anthropic.com>
This commit is contained in:
Luis Ernesto Portillo Zaldivar 2025-07-14 20:28:40 -06:00
parent c46908b66f
commit 88d3ded083

View File

@ -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
<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