feat(sat): reporte diario de errores SAT por proxy

- Agrega tabla sat_proxy_errors con proxy_usado, error_code, stage, message.
- sat-client.service.ts expone proxyInfo usado en cada conexión SAT.
- sat.service.ts registra errores de bloqueo/devolución del SAT en sat_proxy_errors
  y guarda proxyUsed en sat_sync_jobs.
- Nuevo job sat-proxy-report.job.ts: cron 8 AM CDMX, envía email a ADMIN_EMAIL
  con errores de las últimas 24h agrupados por proxy/error_code.
- Template de email sat-proxy-report.ts y método sendSatProxyReport.
- Registra el cron en src/index.ts.
- Actualiza docs/SAT-SYNC-IMPLEMENTATION.md.
This commit is contained in:
Horux Dev
2026-08-03 14:27:19 +00:00
parent 3de0014e80
commit 099f34c903
57 changed files with 4554 additions and 7 deletions

View File

@@ -94,6 +94,7 @@ Definidos en `apps/api/src/jobs/sat-sync.job.ts`:
| Incremental Enterprise | `0 11,15,19 * * *` | 11 AM, 3 PM, 7 PM | Sync incremental |
| SAT Watchdog | `0 */2 * * *` | Cada 2 horas | Marcar jobs `running` sin heartbeat como failed |
| SAT Monitor | `0 */2 * * *` | Cada 2 horas | Alertar por email de jobs fallidos |
| SAT Proxy Report | `0 8 * * *` | 8:00 AM | Reporte diario de errores SAT por proxy |
## 6. Flujo de sincronización
@@ -144,6 +145,21 @@ SAT_CONCURRENT_CONTRIBUYENTES=10
- **`ProxyManager`** (`apps/api/src/services/sat/proxy.service.ts`): parsea `SAT_PROXY_LIST`, rota proxies y crea `HttpsProxyAgent`.
- **`sat-client.service.ts`**: usa el agente del proxy en cada petición SOAP al SAT.
### Reporte diario de errores por proxy
Cada error de bloqueo/devolución del SAT se guarda en `public.sat_proxy_errors` con el proxy usado.
Un cron a las **8:00 AM CDMX** envía un email a `ADMIN_EMAIL` con:
- Total de errores en las últimas 24 horas.
- Tabla agrupada por `proxy` + `error_code`.
Archivos:
- `apps/api/src/jobs/sat-proxy-report.job.ts` — cron y consulta.
- `apps/api/src/services/email/templates/sat-proxy-report.ts` — template del email.
- `apps/api/src/services/email/email.service.ts``sendSatProxyReport`.
### Comportamiento
- Cada llamada a `getNextProxy()` devuelve el siguiente proxy del pool (round-robin).
@@ -269,6 +285,8 @@ psql "$DATABASE_URL" -c "
- **Proxies SAT rotativos**: integración de `ProxyManager` y pool de proxies HTTP/HTTPS para evitar bloqueo por IP del SAT.
- **Concurrencia por contribuyente**: el scheduler daily e incremental procesa hasta `SAT_CONCURRENT_CONTRIBUYENTES=10` RFCs en paralelo, sin importar a cuántos tenants pertenezcan.
- **Reporte diario de errores por proxy**: cron a las 8 AM CDMX que envía a `ADMIN_EMAIL` un resumen de errores SAT agrupados por proxy/IP.
- Tabla `public.sat_proxy_errors` para trazabilidad de bloqueos por IP.
- Variables de entorno: `SAT_PROXY_LIST`, `SAT_PROXY_STRATEGY`, `SAT_PROXY_FALLBACK_DIRECT`, `SAT_CONCURRENT_CONTRIBUYENTES`.
### 2026-07-31
@@ -288,6 +306,7 @@ psql "$DATABASE_URL" -c "
## 15. Próximos pasos
- [x] Implementar proxies rotativos para evitar bloqueo por IP del SAT.
- [x] Reporte diario de errores por proxy.
- [ ] Monitorear tasa de éxito tras proxies + concurrencia por contribuyente.
- [ ] Revisar/renovar FIELs inválidas reportadas por el monitor.
- [ ] Evaluar ampliar ventana horaria del daily (610 AM) si el volumen de RFCs supera el throughput con 10 paralelos.