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 [] # ============================================================================