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 ###################################################