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