clinical_laboratory/documents/plans/ISSUE44_PLAN.md
Luis Ernesto Portillo Zaldivar f833595e4c feat(#44): Add verification script and complete documentation
- Created verify_sample_relationships.py script to validate implementation
- Updated ISSUE44_PLAN.md marking completed tasks
- Created ISSUE44_IMPLEMENTATION.md with complete summary
- Script verifies:
  - Analyses have sample type assignments
  - Sample types are properly configured
  - Stock.lot samples use new fields correctly
  - Field synchronization works properly

All tasks for Issue #44 completed successfully.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-14 21:09:34 -06:00

6.6 KiB

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:
      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:
      # 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:
      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:
      <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