#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Script para diagnosticar y corregir el problema con la orden S00029 """ import odoo import traceback from datetime import date def fix_order(cr): """Diagnosticar y corregir la orden S00029""" env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {}) # Buscar la orden 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" Género: {order.partner_id.gender}") print(f" Fecha nacimiento: {order.partner_id.birthdate_date}") # Calcular edad patient_age = None if order.partner_id.birthdate_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 print(f" Edad: {patient_age} años") # Buscar el parámetro problemático (Prueba de Embarazo) print("\n🔍 Buscando parámetros de selección problemáticos...") # Query directa para encontrar el problema cr.execute(""" SELECT lap.id, lap.name, lap.code, lap.value_type, lap.selection_values, COUNT(DISTINCT lpr.default_value_selection) as unique_defaults, STRING_AGG(DISTINCT lpr.default_value_selection, ', ') as default_values FROM lims_analysis_parameter lap JOIN lims_parameter_range lpr ON lpr.parameter_id = lap.id WHERE lap.value_type = 'selection' AND lpr.default_value_selection IS NOT NULL GROUP BY lap.id, lap.name, lap.code, lap.value_type, lap.selection_values HAVING COUNT(DISTINCT lpr.default_value_selection) > 1 """) problematic = cr.fetchall() if problematic: print("\n⚠️ Parámetros con múltiples valores por defecto:") for p in problematic: print(f" - {p[1]} (código: {p[2]})") print(f" Valores posibles: {p[4]}") print(f" Valores por defecto encontrados: {p[6]}") # Ver específicamente el parámetro HCG (Prueba de Embarazo) cr.execute(""" SELECT lpr.id, lpr.age_min, lpr.age_max, lpr.gender, lpr.default_value_selection, lpr.is_pregnant_specific FROM lims_parameter_range lpr JOIN lims_analysis_parameter lap ON lap.id = lpr.parameter_id WHERE lap.code = 'HCG' ORDER BY lpr.age_min, lpr.gender """) hcg_ranges = cr.fetchall() if hcg_ranges: print("\n📊 Rangos del parámetro HCG (Prueba de Embarazo):") for r in hcg_ranges: print(f" - Rango ID {r[0]}: edad {r[1]}-{r[2]}, género {r[3]}, embarazo: {r[5]}, default: '{r[4]}'") # Intentar arreglar el problema print("\n🔧 Intentando corregir el problema...") # Opción 1: Eliminar valores por defecto conflictivos # Solo dejar el valor por defecto para el caso específico de embarazo cr.execute(""" UPDATE lims_parameter_range SET default_value_selection = NULL WHERE parameter_id IN ( SELECT id FROM lims_analysis_parameter WHERE code = 'HCG' ) AND is_pregnant_specific = false """) print(f"✓ Eliminados valores por defecto de rangos no específicos de embarazo") # Verificar la corrección cr.execute(""" SELECT COUNT(*) FROM lims_parameter_range lpr JOIN lims_analysis_parameter lap ON lap.id = lpr.parameter_id WHERE lap.code = 'HCG' AND lpr.default_value_selection IS NOT NULL """) remaining = cr.fetchone()[0] print(f" Rangos con valor por defecto restantes: {remaining}") # Intentar confirmar la orden nuevamente print("\n🔄 Intentando confirmar la orden después de la corrección...") try: order.action_confirm() print("✅ ¡Orden confirmada exitosamente!") print(f" Nuevo estado: {order.state}") print(f" Muestras generadas: {len(order.generated_sample_ids)}") # Confirmar los cambios cr.commit() print("\n✅ Cambios guardados en la base de datos") except Exception as e: print(f"❌ Error al confirmar: {str(e)}") traceback.print_exc() cr.rollback() print("\n⚠️ Cambios revertidos") # Si sigue fallando, mostrar más información print("\n📋 Información adicional para debugging:") for line in order.order_line: if line.product_id.is_analysis: print(f"\n Análisis: {line.product_id.name}") template = line.product_id.product_tmpl_id for param_config in template.parameter_ids: print(f" - Parámetro: {param_config.parameter_id.name}") print(f" Tipo: {param_config.parameter_value_type}") if param_config.parameter_value_type == 'selection': print(f" ⚠️ Es de tipo selección") if __name__ == '__main__': db_name = 'lims_demo' try: registry = odoo.modules.registry.Registry(db_name) with registry.cursor() as cr: fix_order(cr) except Exception as e: print(f"Error general: {e}") traceback.print_exc()