
- Cambiar sintaxis de % a t-attf-src para mejor compatibilidad - Agregar el número del código debajo de la imagen - Verificado que las muestras tienen barcode en BD - Simplificar la lógica del template Co-Authored-By: Claude <noreply@anthropic.com>
128 lines
4.0 KiB
Python
128 lines
4.0 KiB
Python
#!/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") |