Files
descarga_factura_transporte/email_utilities.py
T

94 lines
3.5 KiB
Python

import os
import zipfile
import database_utilities
# ============================================================================
def quitar_correos_ya_registrados_en_base_de_datos(emails: list[dict]) -> list[dict]:
"""
Verifica cuáles correos son nuevos (no están en la BD), los guarda
y retorna la lista filtrada de los que tienen adjuntos.
"""
if not emails:
return []
# 1. Verificar cuáles ya existen en la BD
ids = [e['id'] for e in emails]
existentes = database_utilities.get_existing_ids(ids)
# Solo nos quedamos con los que NO están en la BD
correos_no_registrados = [e for e in emails if e['id'] not in existentes]
print(f"Correos nuevos detectados: {len(correos_no_registrados)}")
if correos_no_registrados:
print("Guardando nuevos correos en la base de datos...")
database_utilities.save_emails(correos_no_registrados)
return correos_no_registrados
# ============================================================================
def descomprimir_adjuntos(emails: list[dict], ruta: str) -> list[dict]:
"""
Busca adjuntos ZIP, los descomprime y agrega los archivos
extraídos a la lista de adjuntos del correo.
"""
try:
for email in emails:
nuevos_adjuntos = []
for adjunto in list(email["adjuntos"]):
if not adjunto.lower().endswith(".zip"):
continue
ruta_zip = os.path.join(ruta, adjunto)
if not os.path.exists(ruta_zip):
print(f"⚠️ No existe: {ruta_zip}")
continue
try:
with zipfile.ZipFile(ruta_zip, "r") as zip_ref:
nombres_extraidos = [
nombre
for nombre in zip_ref.namelist()
if not nombre.endswith("/")
]
zip_ref.extractall(ruta)
nuevos_adjuntos.extend(nombres_extraidos)
print(
f"📦 {adjunto}: {len(nombres_extraidos)} archivos extraídos"
)
except Exception as e:
print(f"⚠️ Error descomprimiendo {adjunto}: {e}")
email["adjuntos"].extend(nuevos_adjuntos)
return emails
except Exception as ex:
print(f"❌ Error general: {ex}")
return emails
# ============================================================================
def filtrar_archivos_validos(archivos: list[str]) -> list[str]:
"""
Retorna una lista solo con archivos .pdf y .xml (ignora mayúsculas/minúsculas).
"""
extensiones_validas = ('.pdf', '.xml')
return [a for a in archivos if a.lower().endswith(extensiones_validas)]
# ============================================================================
def procesar_adjuntos_email(e: dict, archivos: list[str], ruta_descarga: str) -> list[str]:
"""
Descomprime y filtra los archivos de un correo.
Retorna la lista de archivos válidos si existen, de lo contrario lista vacía.
"""
# 1. Descomprimir archivos ZIP si existen
archivos_procesados = descomprimir_adjuntos(archivos, ruta_descarga)
# 2. Filtrar solo PDF y XML
archivos_validos = filtrar_archivos_validos(archivos_procesados)
if archivos_validos:
e['archivos'] = archivos_validos
return archivos_validos
return []
# ============================================================================