- Auto-update fiscal data on org creation via updateOrgLegalOnCreate - Add Carta Manifiesto embedded iframe in CSD config page - Fix CSF scraper: 60s timeout + manual RFC fallback when SAT doesn't auto-populate - Fix contribuyenteId propagation in constancia frontend hooks/API - Fix needsInitialSync to check per-contribuyente, not just per-tenant - Fix documento notifications for global_admin using viewingTenantId - Extract CSF manually for Carlos Husberto Torres Romero - Trigger initial SAT sync for Carlos Husberto Torres Romero - Update org legal data in Facturapi for Carlos Husberto (tax_system 612 + address) Files changed: - apps/api/src/controllers/documentos.controller.ts - apps/api/src/jobs/sat-sync.job.ts - apps/api/src/services/constancia.service.ts - apps/api/src/services/contribuyente-facturapi.service.ts - apps/api/src/services/sat/sat-csf-login.ts - apps/web/app/(dashboard)/configuracion/csd/page.tsx - apps/web/lib/api/constancias.ts - apps/web/lib/hooks/use-constancias.ts - docs/sessions/2026-05-17-facturapi-csf-sync-notifications.md
3.9 KiB
Sesión de cambios: 2026-05-17
Resumen
Correcciones y mejoras en onboarding de Facturapi, extracción de CSF, sincronización SAT inicial y notificaciones por email.
1. Facturapi onboarding — Datos fiscales + Carta Manifiesto
Problema
Las organizaciones Facturapi creadas por API quedaban sin datos fiscales (legal) y sin flujo para firmar la Carta Manifiesto (requerimiento SAT/RMF).
Cambios
Backend: apps/api/src/services/contribuyente-facturapi.service.ts
- Extraídos helpers reutilizables:
fetchContribuyenteFiscalData()— consulta RFC, razón social, régimen, CP, domiciliobuildLegalPayload()— construye body paraPUT /legalputOrgLegal()— ejecuta el PUT
- Nuevo
updateOrgLegalOnCreate()— actualiza automáticamente los datos fiscales tras crear/recuperar una org createOrgContribuyente()ahora llamaupdateOrgLegalOnCreate()en los 3 casos (reused, recreated, fresh create)- Refactorizado
ensureOrgLegalForEmit()para usar los mismos helpers (DRY)
Backend: apps/api/src/services/sat/sat-csf-login.ts
loginSatCsf()ahora aceptaknownRfcopcional- Timeout de espera del RFC auto-populado aumentado de 30s a 60s
- Fallback manual: si el SAT no auto-popula el RFC, se llena manualmente con
knownRfc
Backend: apps/api/src/services/constancia.service.ts
- Ambas llamadas a
loginSatCsfahora pasanfiel.rfc
Frontend: apps/web/app/(dashboard)/configuracion/csd/page.tsx
- Nueva sección "Carta Manifiesto" con iframe embebido de Facturapi
- Aparece cuando la org está configurada (
orgStatus?.configured) - URL:
https://www.facturapi.io/embedded/manifiesto?organization={orgId}
Frontend: apps/web/lib/api/constancias.ts
consultarConstancia()ahora aceptacontribuyenteIdopcional
Frontend: apps/web/lib/hooks/use-constancias.ts
useConsultarConstanciaahora pasaselectedContribuyenteIda la API
2. CSF de Carlos Husberto Torres Romero
Problema
La FIEL de Carlos Husberto se subió el 16/05 pero la CSF nunca se extrajo. El scraper falló con page.waitForFunction: Timeout 30000ms exceeded.
Acciones
- Actualizados datos fiscales de la org
6a08b242ec01fdfa232ed5ccen Facturapi:tax_system: 601 → 612- Dirección completa sincronizada desde la CSF
- Extraída CSF manualmente desde el servidor (113 CFDIs insertados)
- Disparado sync inicial SAT para Carlos Husberto (job en progreso)
3. Sync inicial SAT por contribuyente
Problema
needsInitialSync() solo verificaba a nivel tenant. Si un tenant ya había tenido un sync inicial (legacy), los nuevos contribuyentes nunca recibían su extracción histórica.
Cambios
apps/api/src/jobs/sat-sync.job.ts
needsInitialSync()ahora aceptacontribuyenteIdopcional- Si se pasa: busca jobs
initialcompletados para ese contribuyente - Si no: mantiene comportamiento legacy a nivel tenant
- Si se pasa: busca jobs
syncTenant()determinainitialvsdailypor cada contribuyente dentro del loopincrementalSyncTenant()verifica que cada contribuyente tenga suinitialantes de hacer incremental
4. Notificaciones de documentos para admins
Problema
Cuando un global_admin subía una declaración/documento para otro tenant, la notificación buscaba los owners del tenant del admin en lugar del tenant destino.
Cambios
apps/api/src/controllers/documentos.controller.ts
notifyDocumentoSubidoahora usareq.viewingTenantId ?? req.user!.tenantId- Corregido en ambos endpoints: crear declaración y crear documento extra
Archivos modificados
apps/api/src/controllers/documentos.controller.tsapps/api/src/jobs/sat-sync.job.tsapps/api/src/services/constancia.service.tsapps/api/src/services/contribuyente-facturapi.service.tsapps/api/src/services/sat/sat-csf-login.tsapps/web/app/(dashboard)/configuracion/csd/page.tsxapps/web/lib/api/constancias.tsapps/web/lib/hooks/use-constancias.ts