
- 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>
152 lines
5.6 KiB
Python
152 lines
5.6 KiB
Python
#!/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() |