"""Descarga y filtrado de adjuntos de un correo.""" import os import outlook_utilities from pipeline_utils import log, ruta_carpeta # ============================================================================ def descargar_adjuntos(email: dict, email_addr: str, token: str, download_folder: str) -> list[str] | None: """ Descarga todos los adjuntos del correo usando Microsoft Graph. Almacena la lista de nombres de archivo en ``email["adjuntos"]``. Returns: Lista de nombres de archivo descargados, o None si no hay adjuntos o hubo un error. Example: Si el correo tiene ``factura.xml`` y ``guia.pdf``:: adjuntos = descargar_adjuntos(email, email_addr, token, download_folder) # → ["factura.xml", "guia.pdf"] # email["adjuntos"] = ["factura.xml", "guia.pdf"] """ try: adjuntos = outlook_utilities.download_attachments( email_addr, email["id"], token, download_folder ) if adjuntos: email["adjuntos"] = adjuntos return adjuntos return None except Exception as ex: log(f"❌ Error descargando adjuntos: {ex}") return None # ============================================================================ def filtrar_y_limpiar(email: dict, download_folder: str) -> bool: """ Filtra los adjuntos conservando solo archivos PDF y XML. - Los archivos que no son PDF ni XML se eliminan del disco. - Si no queda ningún PDF/XML válido, se eliminan todos los archivos descargados y se retorna False. - Actualiza ``email["adjuntos"]`` con la lista filtrada. Returns: True si hay al menos un PDF o XML, False si no queda ninguno. Example: Adjuntos originales: ``[img.png, factura.xml, guia.pdf]``:: ok = filtrar_y_limpiar(email, download_folder) # → img.png eliminado # → ok = True # → email["adjuntos"] = ["factura.xml", "guia.pdf"] """ todos = email.get("adjuntos", []) validos = [a for a in todos if a.lower().endswith((".pdf", ".xml"))] no_validos = [a for a in todos if a not in validos] carpeta = ruta_carpeta(download_folder) if not validos: for a in todos: ruta = os.path.join(carpeta, a) if os.path.exists(ruta): os.remove(ruta) log("🗑️ Correo sin PDF/XML válidos, adjuntos eliminados") return False for a in no_validos: ruta = os.path.join(carpeta, a) if os.path.exists(ruta): os.remove(ruta) email["adjuntos"] = validos return True