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:
parent
c46908b66f
commit
88d3ded083
160
documents/plans/ISSUE44_PLAN.md
Normal file
160
documents/plans/ISSUE44_PLAN.md
Normal 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
|
Loading…
Reference in New Issue
Block a user