155 lines
4.5 KiB
Python
155 lines
4.5 KiB
Python
|
|||
|
|
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
|
||
|
|
|
||
|
|
###################################################
|