30 lines
2.3 KiB
Markdown
30 lines
2.3 KiB
Markdown
# Módulos
|
|||
|
|
|
||
|
|
| Archivo | Función |
|
||
|
|
|---|---|
|
||
|
|
| `main.py` | Daemon orquestador. Bucle infinito con horarios configurables, obtiene token, consulta HANA, procesa pendientes (nuevos + reintentos). |
|
||
|
|
| `get_token_headless.py` | Login headless via Chrome real (`channel="chrome"`). Sin ventana visible. |
|
||
|
|
| `get_token.py` | Login SOL via Playwright (headless=False). Navega menú → extrae JWT de `sessionStorage['SUNAT.token']`. |
|
||
|
|
| `consulta_cpe.py` | Consulta API REST `api-cpe.sunat.gob.pe`. Retorna `(data, status_code)`. Lanza `TokenExpiredError` en 401. |
|
||
|
|
| `hana_manager.py` | Conexión HANA vía `hdbcli`. Consulta pendientes en `OPCH`, actualiza flags de descarga. |
|
||
|
|
| `gestor_fallas.py` | SQLite `fallas_descarga.db`. Registro de fallas con conteo de intentos y backoff progresivo (0min → 5min → 15min → ... → 12h, máx 20). |
|
||
|
|
| `smb_manager.py` | Monta recurso SMB (`mount_smbfs`/`mount.cifs`/`net use`) y sincroniza PDF/XML al NAS. Limpia JSON/ZIP temporales. |
|
||
|
|
| `login_api.py` | Intento de `password_grant()` / `authorization_code` directo a SUNAT (sin navegador, generalmente ya no funciona). Se mantiene como referencia. |
|
||
|
|
| `logger_utilities.py` | Redirige stdout/stderr a `logs/YYYY-MM-DD.log` + terminal. Rotación diaria. |
|
||
|
|
| `reporte_fallas.py` | Genera resumen textual + 3 gráficos PNG desde `fallas_descarga.db`. |
|
||
|
|
| `token.json` | Token JWT auto-generado con expiración. |
|
||
|
|
| `.env` | Credenciales HANA y SUNAT. |
|
||
|
|
|
||
|
|
## Flujo
|
||
|
|
|
||
|
|
1. `main.py` verifica día/horario → renueva token si expiró (get_token_headless → get_token.py headless=False)
|
||
|
|
2. `obtener_pendientes()` trae todos los documentos de OPCH donde `tienePDF='N'` o `tieneXML='N'`
|
||
|
|
3. Separa en **nuevos** (no están en fallas DB) y **reintentos** (fallas pendientes con backoff cumplido)
|
||
|
|
4. Por cada doc:
|
||
|
|
- `consultar_cpe()` → si 401, renueva token y reintenta
|
||
|
|
- Si falla (500/404/etc) → `registrar_falla()` con backoff progresivo
|
||
|
|
- Si OK → `descargar_archivo()` (XML + PDF + CDR)
|
||
|
|
- `marcar_pdf_descargado()` / `marcar_xml_descargado()` actualizan HANA
|
||
|
|
- Si era reintento exitoso → `eliminar_falla()`
|
||
|
|
5. `sincronizar_a_smb()` monta NAS (si no está montado), copia PDF/XML via rsync (Mac/Linux) o shutil.move (Windows), y elimina JSON/ZIP temporales de `descargas/`
|
||
|
|
6. Espera intervalo configurado (5 min modo rápido, 1 h modo full) y repite
|