
- Cambiar view_mode de 'tree' a 'list' en menus.xml para action_lims_test - Cambiar mode='tree' a 'list' en lims_test_views.xml para campo result_ids - Corregir script create_demo_data.py: * Comentar campo inexistente 'lab_request_priority' * Cambiar 'observations' por 'note' (campo estándar) * Cambiar 'lab_sample_ids' por 'generated_sample_ids' * Ajustar índices de pacientes para usar María González (femenina) para embarazo - Mejorar validación en lims_result.py: * Considerar False y 0.0 como equivalentes para campos numéricos * Solo requerir valores cuando la prueba no esté en estado 'draft' Resuelve el error "View types not defined tree found in act_window action 457" y permite confirmar órdenes con pruebas de selección correctamente. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
133 lines
5.4 KiB
Python
133 lines
5.4 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Script para investigar y confirmar la orden S00029
|
|
Error: "Para parámetros de selección solo se debe elegir una opción"
|
|
"""
|
|
|
|
import odoo
|
|
import sys
|
|
import json
|
|
import traceback
|
|
|
|
def investigate_order(cr):
|
|
"""Investigar la orden S00029 y sus detalles"""
|
|
env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {})
|
|
|
|
# Buscar la orden S00029
|
|
order = env['sale.order'].search([('name', '=', 'S00029')], limit=1)
|
|
if not order:
|
|
print("❌ No se encontró la orden S00029")
|
|
return
|
|
|
|
print(f"✓ Orden encontrada: {order.name}")
|
|
print(f" Cliente: {order.partner_id.name}")
|
|
print(f" Estado: {order.state}")
|
|
print(f" Es solicitud de lab: {order.is_lab_request}")
|
|
print(f" Doctor: {order.doctor_id.name if order.doctor_id else 'N/A'}")
|
|
print(f" Líneas de orden: {len(order.order_line)}")
|
|
|
|
# Revisar las líneas de la orden
|
|
print("\n📋 Líneas de orden:")
|
|
for i, line in enumerate(order.order_line, 1):
|
|
print(f"\n Línea {i}:")
|
|
print(f" Producto: {line.product_id.name}")
|
|
print(f" Es análisis: {line.product_id.is_analysis}")
|
|
print(f" Cantidad: {line.product_uom_qty}")
|
|
|
|
# Verificar parámetros del análisis
|
|
if line.product_id.is_analysis:
|
|
params = line.product_id.parameter_ids
|
|
print(f" Parámetros: {len(params)}")
|
|
|
|
# Ver detalles de parámetros con tipo selección
|
|
selection_params = params.filtered(lambda p: p.value_type == 'selection')
|
|
if selection_params:
|
|
print(f" ⚠️ Parámetros de selección encontrados: {len(selection_params)}")
|
|
for param in selection_params:
|
|
print(f" - {param.name} (código: {param.code})")
|
|
print(f" Opciones: {param.selection_options}")
|
|
# Verificar si hay valores predeterminados múltiples
|
|
cr.execute("""
|
|
SELECT COUNT(*)
|
|
FROM lims_parameter_range
|
|
WHERE parameter_id = %s
|
|
AND default_value_selection IS NOT NULL
|
|
""", (param.id,))
|
|
default_count = cr.fetchone()[0]
|
|
if default_count > 1:
|
|
print(f" ⚠️ PROBLEMA: {default_count} valores predeterminados para este parámetro")
|
|
|
|
# Intentar confirmar la orden
|
|
print("\n🔄 Intentando confirmar la orden...")
|
|
try:
|
|
# Primero, verificar si hay muestras generadas
|
|
print(f" Muestras generadas antes: {len(order.generated_sample_ids)}")
|
|
|
|
# Intentar confirmar
|
|
order.action_confirm()
|
|
print("✅ Orden confirmada exitosamente!")
|
|
print(f" Nuevo estado: {order.state}")
|
|
print(f" Muestras generadas después: {len(order.generated_sample_ids)}")
|
|
|
|
except Exception as e:
|
|
print(f"❌ Error al confirmar: {str(e)}")
|
|
print("\n📊 Traceback completo:")
|
|
traceback.print_exc()
|
|
|
|
# Investigar más a fondo el error
|
|
if "parámetros de selección" in str(e):
|
|
print("\n🔍 Investigando parámetros de selección...")
|
|
|
|
# Buscar todos los parámetros de selección en la base
|
|
cr.execute("""
|
|
SELECT
|
|
lap.id,
|
|
lap.name,
|
|
lap.code,
|
|
lap.selection_options,
|
|
COUNT(lpr.id) as range_count,
|
|
COUNT(lpr.default_value_selection) as default_count
|
|
FROM lims_analysis_parameter lap
|
|
LEFT JOIN lims_parameter_range lpr ON lpr.parameter_id = lap.id
|
|
WHERE lap.value_type = 'selection'
|
|
GROUP BY lap.id, lap.name, lap.code, lap.selection_options
|
|
HAVING COUNT(lpr.default_value_selection) > 1
|
|
""")
|
|
|
|
problematic_params = cr.fetchall()
|
|
if problematic_params:
|
|
print("\n⚠️ Parámetros problemáticos encontrados:")
|
|
for param in problematic_params:
|
|
print(f" - {param[1]} (código: {param[2]})")
|
|
print(f" Opciones: {param[3]}")
|
|
print(f" Rangos totales: {param[4]}")
|
|
print(f" Valores predeterminados: {param[5]}")
|
|
|
|
# Ver los valores predeterminados
|
|
cr.execute("""
|
|
SELECT
|
|
default_value_selection,
|
|
age_min,
|
|
age_max,
|
|
gender
|
|
FROM lims_parameter_range
|
|
WHERE parameter_id = %s
|
|
AND default_value_selection IS NOT NULL
|
|
""", (param[0],))
|
|
defaults = cr.fetchall()
|
|
print(" Valores predeterminados por rango:")
|
|
for default in defaults:
|
|
print(f" - '{default[0]}' para edad {default[1]}-{default[2]}, género: {default[3]}")
|
|
|
|
return order
|
|
|
|
if __name__ == '__main__':
|
|
db_name = 'lims_demo'
|
|
try:
|
|
registry = odoo.registry(db_name)
|
|
with registry.cursor() as cr:
|
|
investigate_order(cr)
|
|
except Exception as e:
|
|
print(f"Error general: {e}")
|
|
traceback.print_exc() |