Files
asignacion_automatica_lotes/hana_client.py
T

155 lines
4.5 KiB
Python
Raw Normal View History

2026-05-28 15:08:25 -05:00
from hdbcli import dbapi
from config_loader import CONFIG
###################################################
def get_connection(schema):
"""Crea y retorna una conexión a SAP HANA."""
try:
conn = dbapi.connect(
address=CONFIG.hana.server,
port=CONFIG.hana.port,
user=CONFIG.hana.user,
password=CONFIG.hana.password
)
return conn
except Exception as e:
print(f"❌ Error conectando a HANA para {schema}: {e}")
return None
###################################################
def obtener_registros():
"""
Obtiene los documentos de los ultimos 'days' dias
Args:
company: Objeto con la configuracion de la base de datos
days: Numero de dias a consultar, entero positivo
Returns:
Lista de diccionarios con los documentos encontrados
Raises:
Exception: Si hay un error conectando a la base de datos
Example:
where DocDate >= ADD_DAYS(CURRENT_DATE, -{days})
"""
hana_config = CONFIG.hana
db_name = hana_config.company
conn = get_connection(db_name)
if not conn:
return []
query = f"""
SELECT T0."DocEntry", T0."DocNum", T0."ObjType", T2."USER_CODE" "UserCode"
FROM "{db_name}".ORDR T0
INNER JOIN "{db_name}".OUSR T2 ON T2."USERID" = T0."UserSign"
WHERE T0."CANCELED" = 'N' AND T0."DocStatus" = 'O'
AND T0."DocType" = 'I'
AND IFNULL("U_SIS_IMPAUT",'N') = 'Y'
AND IFNULL("U_SIS_VIGREQ",'') <> ''
AND TO_VARCHAR(T0."CreateDate",'YYYYMMDD') = '20260528'
"""
try:
cursor = conn.cursor()
cursor.execute(query)
# Obtener nombres de columnas
columns = [column[0] for column in cursor.description]
# Convertir resultados a lista de diccionarios
results = []
for row in cursor.fetchall():
results.append(dict(zip(columns, row)))
cursor.close()
conn.close()
print(f"📄 Se encontraron {len(results)} documentos para procesar.")
return results
except Exception as e:
print(f"❌ Error ejecutando la consulta en HANA: {e}")
if 'conn' in locals():
conn.close()
return []
###################################################
def obtener_lotes_disponibles(itemcode:str,whscode:str):
hana_config = CONFIG.hana
db_name = hana_config.company
conn = get_connection(db_name)
if not conn:
return []
query = f"""
SELECT T0."DistNumber", TO_VARCHAR(T0."InDate",'YYYY-MM-DD') "InDate",
TO_VARCHAR(T0."ExpDate",'YYYY-MM-DD') "ExpDate",
T0."AbsEntry", T1."WhsCode", T1."Quantity", T1."CommitQty",
FLOOR(MONTHS_BETWEEN(CURRENT_DATE, T0."ExpDate")) "Months"
FROM "{db_name}".OBTN T0
INNER JOIN "{db_name}".OBTQ T1 ON T1."MdAbsEntry" = T0."AbsEntry"
WHERE T0."ItemCode" = '{itemcode}'
AND T1."WhsCode" = '{whscode}'
AND T1."Quantity" > 0.00
"""
try:
cursor = conn.cursor()
cursor.execute(query)
# Obtener nombres de columnas
columns = [column[0] for column in cursor.description]
# Convertir resultados a lista de diccionarios
results = []
for row in cursor.fetchall():
results.append(dict(zip(columns, row)))
cursor.close()
conn.close()
return results
except Exception as e:
print(f"❌ Error ejecutando la consulta en HANA: {e}")
if 'conn' in locals():
conn.close()
return []
###################################################
def obtener_presentacion_articulo(itemcode):
hana_config = CONFIG.hana
db_name = hana_config.company
conn = get_connection(db_name)
if not conn:
return []
query = f"""
SELECT IFNULL(T0."U_SIS_PRECAJ",'100') "Presentacion"
FROM "{db_name}".OITM T0
WHERE T0."ItemCode" = '{itemcode}'
"""
try:
cursor = conn.cursor()
cursor.execute(query)
presentacion = cursor.fetchone()[0]
cursor.close()
conn.close()
return presentacion
except Exception as e:
print(f"❌ Error ejecutando la consulta en HANA: {e}")
if 'conn' in locals():
conn.close()
return None
###################################################