Files
descarga_factura_transporte/hana_manager.py
T

121 lines
3.9 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
import os
import sys
import json
from datetime import datetime, date
from hdbcli import dbapi
from dotenv import load_dotenv
# ============================================================================
# CONFIGURACIÓN
# ============================================================================
# Cargar variables de entorno desde .env
load_dotenv(dotenv_path=".env")
# Configuración de la API
HANA_HOST = os.getenv("HANA_SERVER", "")
HANA_PORT = int(os.getenv("HANA_PORT", 30015))
HANA_USER = os.getenv("HANA_USER", "")
HANA_PASSWORD = os.getenv("HANA_PASSWORD", "")
HANA_SCHEMA = os.getenv("HANA_SCHEMA", "")
# ============================================================================
def get_connection():
"""Crea y retorna una conexión a SAP HANA."""
try:
conn = dbapi.connect(
address=HANA_HOST,
port=HANA_PORT,
user=HANA_USER,
password=HANA_PASSWORD
)
return conn
except Exception as e:
print(f" ❌ Error conectando a HANA: {e}")
return None
# ============================================================================
def get_delivery(tipo: str, serie: str, numero: str) -> list:
"""
Consulta la tabla ODLN en SAP HANA para obtener DeliveryNotes.
Args:
tipo: Código de serie/documento (U_BPP_MDSD).
serie: Serie del documento (U_BPP_MDTD).
numero: Número del documento (se busca con LIKE).
Returns:
list[dict] — Lista con DocEntry, DocNum, CardCode, CardName.
"""
schema = HANA_SCHEMA
query = f'''SELECT "DocEntry", "DocNum", "CardCode", "CardName"
FROM "{schema}"."ODLN"
WHERE "CANCELED" = 'N'
AND "U_BPP_MDSD" = ?
AND "U_BPP_MDTD" = ?
AND "U_BPP_MDCD" LIKE ?'''
pattern = f"%{numero}%"
connection = get_connection()
if not connection:
return []
cursor = connection.cursor()
try:
cursor.execute(query, (tipo, serie, pattern))
columns = [column[0] for column in cursor.description]
results = []
for row in cursor.fetchall():
results.append(dict(zip(columns, row)))
return results
except Exception as e:
print(f" ❌ Error en consulta HANA get_delivery: {e}")
return []
finally:
if cursor:
cursor.close()
if connection:
connection.close()
# ============================================================================
def obtener_valor_referencial(serie: str, numero: str) -> float:
"""
Ejecuta el stored procedure Sp_ObtenerValorReferencial en SAP HANA para
obtener el valor referencial de una guía de remisión (tipo 09).
Args:
serie: Serie de la guía de remisión (ej. "T001").
numero: Número de la guía de remisión (ej. "132800").
Returns:
float — Columna ``ValorReferencial`` del primer registro devuelto
por el SP, o 0.0 si no hay resultados o si ocurre un error.
"""
schema = HANA_SCHEMA
query = f'CALL "{schema}"."Sp_ObtenerValorReferencial"(?, ?)'
connection = get_connection()
if not connection:
return 0.0
cursor = connection.cursor()
try:
cursor.execute(query, (serie, numero))
columns = [column[0] for column in cursor.description]
row = cursor.fetchone()
if not row:
return 0.0
valor = dict(zip(columns, row)).get("ValorReferencial")
return float(valor) if valor is not None else 0.0
except Exception as e:
print(f" ❌ Error en consulta HANA obtener_valor_referencial: {e}")
return 0.0
finally:
if cursor:
cursor.close()
if connection:
connection.close()
# ============================================================================