#!/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: # Los parámetros están en product.template, no en product.product template = line.product_id.product_tmpl_id params = template.parameter_ids print(f" Parámetros configurados: {len(params)}") # Ver detalles de parámetros con tipo selección selection_params = params.filtered(lambda p: p.parameter_value_type == 'selection') if selection_params: print(f" ⚠️ Parámetros de selección encontrados: {len(selection_params)}") for param_config in selection_params: param = param_config.parameter_id print(f" - {param.name} (código: {param.code})") print(f" Opciones: {param.selection_options}") # Verificar rangos y valores predeterminados cr.execute(""" SELECT id, age_min, age_max, gender, default_value_selection FROM lims_parameter_range WHERE parameter_id = %s ORDER BY age_min, gender """, (param.id,)) ranges = cr.fetchall() print(f" Rangos definidos: {len(ranges)}") # Verificar si hay múltiples valores por defecto para el mismo grupo default_selections = [r[4] for r in ranges if r[4]] if len(default_selections) > 1: print(f" ⚠️ PROBLEMA: {len(default_selections)} valores predeterminados encontrados") for r in ranges: if r[4]: print(f" - Rango ID {r[0]}: edad {r[1]}-{r[2]}, género {r[3]}, default: '{r[4]}'") # Información del paciente para determinar qué rangos aplicarían print(f"\n👤 Información del paciente:") print(f" Nombre: {order.partner_id.name}") print(f" Género: {order.partner_id.gender}") print(f" Fecha nacimiento: {order.partner_id.birthdate_date}") if order.partner_id.birthdate_date: from datetime import date today = date.today() age = today.year - order.partner_id.birthdate_date.year if today.month < order.partner_id.birthdate_date.month or \ (today.month == order.partner_id.birthdate_date.month and today.day < order.partner_id.birthdate_date.day): age -= 1 print(f" Edad: {age} años") # 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 de parámetros de selección if "parámetros de selección" in str(e): print("\n🔍 Analizando el problema de parámetros de selección...") # Buscar específicamente parámetros problemáticos para este paciente patient_age = None if order.partner_id.birthdate_date: from datetime import date today = date.today() patient_age = today.year - order.partner_id.birthdate_date.year if today.month < order.partner_id.birthdate_date.month or \ (today.month == order.partner_id.birthdate_date.month and today.day < order.partner_id.birthdate_date.day): patient_age -= 1 patient_gender = order.partner_id.gender or 'other' print(f"\n Buscando rangos aplicables para:") print(f" - Edad: {patient_age}") print(f" - Género: {patient_gender}") # Verificar cada análisis de la orden for line in order.order_line: if line.product_id.is_analysis: template = line.product_id.product_tmpl_id for param_config in template.parameter_ids: if param_config.parameter_value_type == 'selection': param = param_config.parameter_id # Buscar rangos aplicables query = """ SELECT id, age_min, age_max, gender, default_value_selection FROM lims_parameter_range WHERE parameter_id = %s AND (age_min IS NULL OR age_min <= %s) AND (age_max IS NULL OR age_max >= %s) AND (gender IS NULL OR gender = %s OR gender = 'other') AND default_value_selection IS NOT NULL """ cr.execute(query, (param.id, patient_age or 0, patient_age or 999, patient_gender)) applicable_ranges = cr.fetchall() if len(applicable_ranges) > 1: print(f"\n ⚠️ CONFLICTO en {param.name}:") print(f" {len(applicable_ranges)} rangos con valores por defecto aplicables:") for r in applicable_ranges: print(f" - Rango ID {r[0]}: edad {r[1]}-{r[2]}, género {r[3]}, default: '{r[4]}'") return order if __name__ == '__main__': db_name = 'lims_demo' try: registry = odoo.modules.registry.Registry(db_name) with registry.cursor() as cr: investigate_order(cr) except Exception as e: print(f"Error general: {e}") traceback.print_exc()