se divide pipeline.py en módulos (adjuntos, documentos, persistencia, draft_sap, notificaciones)
Las funciones anidadas de _procesar_un_correo pasan a funciones de módulo con parámetros explícitos; pipeline.py queda solo como orquestador. copiar_a_red lee las variables de entorno al ejecutarse. Se actualizan docs. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ee64e5f773
commit
7d2f3212c0
9 files changed
+1309
-1228
No files matched your search
+81
@@ -0,0 +1,81 @@
|
||||
"""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
|
||||
Reference in new issue
Block a user