#!/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()