# Diagrama de Flujo - Descarga Adjuntos Correos CPE
```mermaid
graph TD
Start((INICIO
main.py)) --> Init[setup_logger + limpiar_logs_antiguos
init_db SQLite]
Init --> Loop{while _running}
Loop --> RotarLog[rotar_log - rotacion diaria]
RotarLog --> CheckDay{Dia activo?
weekdays 0-4}
CheckDay -->|No| SleepDay[Esperar hasta
proximo dia activo]
SleepDay --> Loop
CheckDay -->|Si| CheckTime{Dentro de
horario?}
CheckTime -->|No| SleepTime[Esperar hasta
06:30]
SleepTime --> Loop
CheckTime -->|Si| Token[obtener_token
MSAL - renueva cada 50min]
Token --> LoopAccounts
subgraph LoopAccounts [Bucle por cada Cuenta de Correo - config.mails]
direction TB
Process[procesar_cuenta]
Process --> GetEmails[get_emails
Graph API]
GetEmails --> FilterNew[filtrar_correos_nuevos
SQLite - IDs ya procesados]
FilterNew --> HasNew{Hay correos
nuevos?}
HasNew -->|No| Skip[Sin correos nuevos]
HasNew -->|Si| EmailLoop
subgraph EmailLoop [Bucle por cada Correo Nuevo con Adjuntos]
direction TB
Download[download_attachments
Graph API]
Download --> Unzip[procesar_adjuntos_email
Descomprimir ZIP + filtrar PDF/XML]
Unzip --> ExtractMeta[procesar_adjuntos_enriquecidos
obtener_datos_xml + extraer_texto_pdf]
ExtractMeta --> Classify{Clasificar
metadatos}
Classify -->|Completos| Rename[renombrar_archivos_por_metadata
F001.xml -> RUC-01-F001.xml]
Classify -->|Parciales| Evaluar[mover_a_evaluar
revision manual]
Classify -->|Vacios| Delete[limpiar_carpeta_descarga]
Rename --> MoveResult[mover_validos_a_resultado
a /resultado/empresa]
MoveResult --> Cleanup[limpiar_carpeta_descarga]
end
Skip --> SMBSync
EmailLoop --> SMBSync[sincronizar_a_smb
rsync a carpeta compartida]
end
LoopAccounts --> ExportJSON[guardar_json
/output_json/timestamp.json]
ExportJSON --> Sleep[Esperar intervalo
segundos - 5min o 1hr]
Sleep --> Loop
Loop -->|senal SIGTERM/SIGINT| Stop((FIN))
style Start fill:#f9f,stroke:#333,stroke-width:2px
style Stop fill:#f9f,stroke:#333,stroke-width:2px
style Loop fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
style LoopAccounts fill:#e1f5fe,stroke:#01579b,stroke-dasharray: 5 5
style EmailLoop fill:#fff3e0,stroke:#e65100
style SMBSync fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px
style Classify fill:#fce4ec,stroke:#c62828
```
## Flujo resumido
1. **Inicio**: Configura logger con rotacion diaria, limpia logs viejos (>30 dias), inicializa SQLite
2. **Loop principal**: Verifica dia activo y horario antes de procesar
3. **Token**: Obtiene/renueva token OAuth de Microsoft Graph (valido 60 min)
4. **Por cada cuenta de correo**:
- Consulta correos via Graph API
- Filtra los ya procesados (SQLite)
- Descarga adjuntos, descomprime ZIPs
- Extrae metadata de XML y PDF (con fallback a LLM/Ollama)
- Clasifica: completos (renombrar+mover), parciales (evaluar/), vacios (eliminar)
5. **SMB**: Sincroniza archivos procesados a carpeta compartida via rsync
6. **Exporta**: Guarda resultados en JSON con timestamp
7. **Duerme**: Espera el intervalo configurado (5min rapido / 1hr full)