Files
descarga_xml_sunat/hana_manager.py
T

136 lines
4.2 KiB
Python

import os
import json
from pathlib import Path
from dotenv import load_dotenv
# ============================================================================
load_dotenv()
HANA_HOST = os.getenv("HANA_HOST", "")
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", "")
_conn = None
# ============================================================================
def get_connection():
global _conn
if _conn is None:
try:
from hdbcli import dbapi
_conn = dbapi.connect(
address=HANA_HOST,
port=HANA_PORT,
user=HANA_USER,
password=HANA_PASSWORD
)
except Exception as e:
print(f" ❌ Error conectando a HANA: {e}")
return None
return _conn
# ============================================================================
def obtener_pendientes() -> list[dict]:
conn = get_connection()
if not conn:
return []
try:
query = f"""
SELECT
"DocEntry",
"DocNum",
"DocDate",
EXTRACT(MONTH FROM "DocDate") "Mes",
"Indicator",
"LicTradNum",
"FolioPref",
"FolioNum",
"U_PGX_REPIMP" "urlPDF",
"U_PGX_PDF" "tienePDF",
"U_PGX_REPIMPXML" "urlXML",
"U_PGX_XML" "tieneXML"
FROM "{HANA_SCHEMA}".OPCH
WHERE ("U_PGX_PDF" = 'N' OR "U_PGX_XML" = 'N')
AND EXTRACT(YEAR FROM "DocDate") = 2026
AND "Indicator" IN ('01', '02','08')
AND "CANCELED" = 'N'
ORDER BY EXTRACT(MONTH FROM "DocDate") DESC
"""
cursor = conn.cursor()
cursor.execute(query)
columns = [desc[0] for desc in cursor.description]
rows = cursor.fetchall()
cursor.close()
result = [dict(zip(columns, row)) for row in rows]
return result
except Exception as e:
print(f" ❌ Error en query HANA: {e}")
return []
# ============================================================================
def marcar_pdf_descargado(docentry: int, url: str, ruta: str):
conn = get_connection()
if not conn:
return False
try:
cursor = conn.cursor()
cursor.execute(f"""
UPDATE "{HANA_SCHEMA}".OPCH
SET "U_PGX_PDF" = 'Y'
WHERE "DocEntry" = ?
""", (docentry))
conn.commit()
cursor.close()
return True
except Exception as e:
print(f" ❌ Error actualizando PDF HANA: {e}")
return False
# ============================================================================
def marcar_xml_descargado(docentry: int, url: str, ruta: str):
conn = get_connection()
if not conn:
return False
try:
cursor = conn.cursor()
cursor.execute(f"""
UPDATE "{HANA_SCHEMA}".OPCH
SET "U_PGX_XML" = 'Y'
WHERE "DocEntry" = ?
""", (docentry))
conn.commit()
cursor.close()
return True
except Exception as e:
print(f" ❌ Error actualizando XML HANA: {e}")
return False
# ============================================================================
def cerrar_conexion():
global _conn
if _conn:
try:
_conn.close()
except:
pass
_conn = None
# ============================================================================
if __name__ == "__main__":
print("=" * 60)
print("📋 HANA MANAGER - Prueba")
print("=" * 60)
docs = obtener_pendientes()
print(f"\n📄 Documentos pendientes: {len(docs)}")
for d in docs[:5]:
print(f" DocEntry={d['DocEntry']} DocNum={d['DocNum']} "
f"DocDate={d['DocDate']} Indicator={d['Indicator']} "
f"Folio={d['FolioPref']}-{d['FolioNum']} "
f"PDF={d['tienePDF']} XML={d['tieneXML']}")
if len(docs) > 5:
print(f" ... y {len(docs) - 5} más")
# ============================================================================