#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Script para verificar los códigos de barras de las muestras en la orden S00025 """ import odoo import json from datetime import datetime def check_order_samples(cr, order_name='S00025'): """Verificar las muestras y sus códigos de barras para una orden específica""" # Buscar la orden cr.execute(""" SELECT id, name, state, is_lab_request FROM sale_order WHERE name = %s """, (order_name,)) order = cr.fetchone() if not order: print(f"❌ No se encontró la orden {order_name}") return print(f"✅ Orden encontrada: {order[1]}") print(f" - ID: {order[0]}") print(f" - Estado: {order[2]}") print(f" - Es orden de lab: {order[3]}") print("") # Buscar las muestras asociadas a la orden cr.execute(""" SELECT sl.id, sl.name, sl.barcode, sl.is_lab_sample, sl.patient_id, sl.collection_date, sl.state, sl.sample_type_product_id, rp.name as patient_name FROM stock_lot sl LEFT JOIN res_partner rp ON sl.patient_id = rp.id WHERE sl.id IN ( SELECT lot_id FROM sale_order_stock_lot_rel WHERE order_id = %s ) """, (order[0],)) samples = cr.fetchall() if not samples: print(f"❌ No se encontraron muestras para la orden {order_name}") # Verificar si hay relación en la tabla intermedia cr.execute(""" SELECT COUNT(*) FROM sale_order_stock_lot_rel WHERE order_id = %s """, (order[0],)) count = cr.fetchone()[0] print(f" Registros en sale_order_stock_lot_rel: {count}") return print(f"📋 Muestras encontradas: {len(samples)}") print("-" * 80) for sample in samples: print(f"Muestra ID: {sample[0]}") print(f" - Nombre: {sample[1]}") print(f" - Código de barras: {sample[2] or '❌ VACÍO'}") print(f" - Es muestra de lab: {sample[3]}") print(f" - Paciente: {sample[8]} (ID: {sample[4]})") print(f" - Fecha recolección: {sample[5]}") print(f" - Estado: {sample[6]}") print(f" - Tipo muestra ID: {sample[7]}") # Si no tiene código de barras, generar uno de ejemplo if not sample[2]: print(f" ⚠️ FALTA CÓDIGO DE BARRAS - Ejemplo generado: {datetime.now().strftime('%y%m%d')}000001") print("-" * 40) # Verificar el campo generated_sample_ids cr.execute(""" SELECT COUNT(*) FROM sale_order_stock_lot_rel WHERE order_id = %s """, (order[0],)) rel_count = cr.fetchone()[0] print(f"\n📊 Resumen:") print(f" - Total muestras en relación: {rel_count}") print(f" - Muestras sin código de barras: {sum(1 for s in samples if not s[2])}") # Verificar si el campo barcode es calculado o almacenado cr.execute(""" SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_name = 'stock_lot' AND column_name = 'barcode' """) col_info = cr.fetchone() if col_info: print(f"\n🔍 Información del campo 'barcode':") print(f" - Tipo de dato: {col_info[1]}") print(f" - Permite NULL: {col_info[2]}") print(f" - Valor por defecto: {col_info[3]}") if __name__ == '__main__': print("🔍 Verificando códigos de barras para orden S00025...") print("=" * 80) db_name = 'lims_demo' try: registry = odoo.registry(db_name) with registry.cursor() as cr: check_order_samples(cr, 'S00025') except Exception as e: print(f"❌ Error: {str(e)}") print(" Asegúrate de ejecutar este script dentro del contenedor de Odoo")