2026-07-17 12:21:31 -05:00
|
|
|
```mermaid
|
|
|
|
|
flowchart TD
|
|
|
|
|
subgraph Daemon["🚀 Daemon (main.py)"]
|
|
|
|
|
A["Inicio"] --> B{"Día activo y<br>en horario?"}
|
|
|
|
|
B -->|No| C["Esperar"]
|
|
|
|
|
C --> B
|
|
|
|
|
B -->|Sí| D["Token válido?"]
|
2026-08-04 10:51:15 -05:00
|
|
|
D -->|No| E["get_token_headless()<br>headless=True<br>→ get_token.py headless=False"]
|
2026-07-17 12:21:31 -05:00
|
|
|
E --> F["token.json"]
|
|
|
|
|
D -->|Sí| F
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
subgraph HANA["📊 Obtener pendientes"]
|
|
|
|
|
F --> G["Consultar HANA<br>obtener_pendientes()"]
|
|
|
|
|
G --> H["542 documentos<br>en OPCH"]
|
|
|
|
|
H --> I["Filtrar contra<br>fallas_descarga.db"]
|
|
|
|
|
I --> J["🆕 Nuevos<br>(sin falla previa)"]
|
|
|
|
|
I --> K["🔄 Reintentos<br>(fallas pendientes)"]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
subgraph Nuevos["📄 Procesar nuevos"]
|
|
|
|
|
L["Por cada nuevo:"] --> M["consultar_cpe()<br>GET api-cpe.sunat.gob.pe<br>/v1/.../{ruc}-{tipo}-{serie}-{num}-2"]
|
|
|
|
|
M --> N{"Status?"}
|
|
|
|
|
N -->|200| O["descargar_archivo()<br>XML (02) / PDF (01) / CDR (03)"]
|
|
|
|
|
O --> P["ZIP → extraer en<br>descargas/"]
|
|
|
|
|
P --> Q["marcar_pdf/xml_descargado()<br>UPDATE HANA OPCH"]
|
|
|
|
|
Q --> R["✅ OK"]
|
|
|
|
|
N -->|401| S["⚠️ TokenExpiredError"]
|
|
|
|
|
S --> T["Renovar token"]
|
|
|
|
|
T --> M
|
|
|
|
|
N -->|500/404/otros| U["registrar_falla()<br>→ SQLite con backoff"]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
subgraph Reintentos["🔄 Procesar reintentos"]
|
|
|
|
|
V["Por cada reintento<br>(backoff cumplido):"] --> W["consultar_cpe()"]
|
|
|
|
|
W --> X{"Status?"}
|
|
|
|
|
X -->|200| Y["descargar_archivo()"]
|
|
|
|
|
Y --> Z["marcar_pdf/xml_descargado()"]
|
|
|
|
|
Z --> AA["eliminar_falla()<br>DELETE FROM fallas"]
|
|
|
|
|
AA --> AB["✅ OK + 🗑️ quitado de SQLite"]
|
|
|
|
|
X -->|401| AC["Renovar token → reintentar"]
|
|
|
|
|
X -->|500/404/otros| AD["actualizar_falla()<br>incrementar intento<br>→ próximo backoff"]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
AD --> AF["sincronizar_a_smb()<br>montar SMB<br>rsync PDF/XML → NAS<br>limpiar JSON/ZIP"]
|
|
|
|
|
|
|
|
|
|
AF --> AE["Esperar intervalo<br>→ próximo ciclo"]
|
|
|
|
|
R --> AF
|
|
|
|
|
U --> AD
|
|
|
|
|
AB --> AF
|
|
|
|
|
|
|
|
|
|
style A fill:#1a1a2e,stroke:#e94560,color:#fff
|
|
|
|
|
style E fill:#16213e,stroke:#0f3460,color:#fff
|
|
|
|
|
style G fill:#0f3460,stroke:#e94560,color:#fff
|
|
|
|
|
style M fill:#533483,stroke:#e94560,color:#fff
|
|
|
|
|
style O fill:#1a1a2e,stroke:#e94560,color:#fff
|
|
|
|
|
style P fill:#16213e,stroke:#0f3460,color:#fff
|
|
|
|
|
style Q fill:#0f3460,stroke:#e94560,color:#fff
|
|
|
|
|
style U fill:#3d0000,stroke:#ff4444,color:#fff
|
|
|
|
|
style AA fill:#003300,stroke:#44ff44,color:#fff
|
|
|
|
|
style AD fill:#3d0000,stroke:#ff4444,color:#fff
|
|
|
|
|
```
|