Roadmap de activación SII y facturación electrónica
Objetivo y estado
Habilitar la emisión de DTE desde Sapira, primero en certificación (maullin.sii.cl) y luego en producción (palena.sii.cl), manteniendo a api-factura como único motor tributario.
Leyenda: [x] implementado en código; [~] parcialmente implementado o pendiente de validación integrada; [ ] pendiente.
La validación operacional paso a paso está en la Guía de pruebas de certificación y facturación.
Arquitectura objetivo
flowchart LR
Usuario[UsuarioSapira] --> Front[front-sapira]
Front --> BFF["BFF /api/factura"]
BFF --> Factura[api-factura]
Factura --> SII["SII maullin o palena"]
Factura --> Mongo[(MongoDB)]
api-facturacustodia certificados, CAF, folios, DTE firmados, envíos y estados SII.- La empresa efectiva se obtiene de
request.user.empresaIden el JWT deapi-factura; no debe provenir del body ni de headers controlados por el cliente. - La provisión de una empresa Sapira se realiza mediante
POST /empresas/provision, protegido conx-service-authySERVICE_AUTH_TOKEN. - Las rutas HTTP de
api-facturano tienen prefijo global: por ejemplo,POST http://localhost:9005/dte/createDte. La referencia Swagger está en/api.
Fase 1: motor SII
[x] Ambiente SII por empresa
- Implementación:
CertificationProfile.environmentseleccionacertificacionoproduccion;DteService.getSiiBaseUrl()resuelve Maullín o Palena. - API:
GET|PATCH /sii/certification-profile. - Verificación: configurar
environment: "certificacion"y confirmar que la obtención de token se dirige a Maullín. Probar producción solo con una empresa autorizada.
[x] Token SII, SetDTE y firma
- Implementación:
SiiAuthServiceobtiene semilla, firma la solicitud con el certificado de la empresa, obtiene/reutiliza el token y lo persiste con expiración. - API:
GET /sii/auth/token,/sii/auth/valid-token,/sii/auth/validate-tokeny/sii/auth/regenerate-token. - Envío:
DteService.getSetDTE()arma carátula y subtotales con DTEs firmados de la empresa. - Verificación:
GET /sii/auth/valid-tokendevuelve un token válido después de cargar un certificado válido.
[x] Envío y consulta de estado
- Implementación:
POST /dte/sendDtegeneraEnvioDTE, publica enDTEUpload, persistetrackIdy dejaestadoSii: ENVIADO.GET /dte/:id/estadoconsultaQueryEstUpy persiste estado, glosa y fecha. - Verificación: enviar un DTE de certificación, confirmar
trackIdy consultar hasta obtener el estado informado por SII.
[x] Foliación segura y aislamiento por empresa
- Implementación:
FolioService.reserveNextAvailable()reserva atómicamente el menor folio disponible y lo libera ante error. DTE, CAF y folios se filtran porempresaId. - API:
POST /caf/upload,GET /caf,GET /folios,POST /dte/createDteyGET /dte. - Verificación: cargar CAF, emitir un DTE y corroborar que el folio pasa de
availableaused; verificar que otra empresa no accede a sus recursos.
[~] Validación automatizada integrada
- Hecho: validación XML/XSD y pruebas unitarias de reserva atómica y selección de ambiente.
- Pendiente: pruebas de integración con dobles de SII para semilla, token,
DTEUploadyQueryEstUp, incluidos errores, reintentos y aislamiento entre empresas. - Criterio de salida: la suite cubre éxito y error de autenticación, CAF, foliación, creación, envío y consulta sin depender del SII real.
Salida: un DTE de prueba obtiene TrackId y estado reales en maullin.
Fase 2: Sapira
[x] Bridge de identidad y provisión
Empresamantiene solo datos tributarios;IntegratorLinkregistra opcionalmente la referencia externa.POST /empresas/provisiones idempotente por(integratorSlug, externalCompanyId)y evita cambiar el tenant vinculado.- Verificación: provisionar dos veces la misma empresa Sapira y confirmar que retorna el mismo
_iddeapi-factura.
[x] Experiencia de configuración
- Selector persistente de empresa y wizard de seis pasos: empresa, datos tributarios, ambiente, certificado, CAF y verificación.
- Formularios para perfil de certificación, PFX/P12, CAF, folios, DTE, envío y consulta.
- Verificación: recorrer el onboarding con una empresa de prueba y completar cada paso con resultados reales de API.
[~] Contrato BFF con api-factura
Antes de declarar esta fase terminada se deben conciliar estos contratos:
[ ]El BFF usa rutas/companiesy/companies/:id/onboarding, mientras el controlador real expone/empresas; adaptar a un contrato único.[x]El BFF usa OAuth2client_credentialsde corta duración yapi-facturaautoriza llamadas de servicio por scopes.[x]GET /api/factura/dte/:id/estadoreenvía identidad de empresa.[ ]Retirar o corregirPOST /dte/addInvoice: su contrato de archivo no coincide consendDTE, que esperadteIdodteIds.
Salida: un usuario autenticado completa el onboarding y opera el flujo de certificación sin exponer la API SII al navegador.
Fase 3: certificación formal
[ ] Ejecutar el set de pruebas
- Configurar datos del contribuyente y tipos de DTE autorizados.
- Crear payloads reproducibles por caso y registrar XML, TrackId, estado y evidencia SII.
- Ejecutar los casos aplicables de ventas y compras: afectos, exentos, notas de crédito y notas de débito.
[ ] Volumen, intercambio y evidencia
- Automatizar simulaciones de 10, 50 y 100 documentos según exija SII.
- Implementar recepción de DTE, acuse de recibo y aceptación/rechazo.
- Generar muestras impresas con PDF417 y validar su contenido contra el XML.
- Preparar declaración del representante legal y paquete de evidencias.
Fase 4: producción
[ ] Habilitación controlada
- Confirmar autorización formal de la empresa.
- Cambiar solo su perfil a
environment: "produccion"y validar token contra Palena. - Cargar CAF de producción sin mezclarlo con folios de certificación.
- Ejecutar una emisión controlada y cuadrar resultado SII con el registro local.
[ ] Resiliencia y operación
- Implementar reintentos idempotentes para autenticación, envío y consulta, con backoff y trazabilidad.
- Definir contingencia cuando SII no responda: cola, reintento y comunicación operacional.
- Implementar cuadratura diaria de DTE, folios, estados SII y XML.
- Mantener respaldos, retención, custodia cifrada y auditoría de accesos.
- Alertar vencimiento de certificado, agotamiento de CAF, errores de envío y DTE pendientes.
[ ] Hardening de certificados digitales (custodia y upload PFX)
Estado actual (2026-03): los certificados se procesan con OpenSSL y se persisten en filesystem local (certificates/{RUT}/); no se usa Azure Blob Storage en el código vigente, aunque la dependencia esté instalada.
Objetivo: custodia apta para producción multi-tenant.
[ ]Fase A — Hardening mínimo: eliminarshell.exec, sanitizar filenames, rollback en error, endurecer cifrado, tests de upload.[ ]Fase B — Key Vault: importar PFX a Azure Key Vault; Mongo solo metadata (thumbprint, versión); firma vía KV; eliminar PEM/PFX en disco del pod.[ ]Fase C — Operación: auditoría de subidas, rotación, alertas de vencimiento integradas.
Documentos de referencia:
- Auditoría QA/seguridad — certificados digitales
- Plan de implementación Key Vault + Blob ← ejecutar por sprints
Nota Blob vs Key Vault: Blob Storage (cifrado con CMK) es adecuado para CAF/XML/PDF; el material de firma (clave privada) debe vivir en Key Vault o HSM, no en blob en claro.
Checklist de salida SII
- Certificado tributario vigente y firmante autorizado.
- CAF válido y folios disponibles.
- DTE validado, timbrado y firmado.
- Envío recibido por SII y seguimiento por TrackId.
- Conservación de XML y estados por empresa.
Matriz de control
| Ítem | API o componente | Estado | Cómo verificar |
|---|---|---|---|
| Perfil y ambiente | PATCH /sii/certification-profile | [x] | Paso 3 de la guía |
| Certificado | POST /certificates/upload | [x] | Paso 4 |
| CAF y folios | POST /caf/upload, GET /folios | [x] | Paso 5 |
| Token SII | GET /sii/auth/valid-token | [x] | Paso 6 |
| DTE firmado | POST /dte/createDte | [x] | Paso 7 |
| Envío y TrackId | POST /dte/sendDte | [x] | Paso 8 |
| Estado SII | GET /dte/:id/estado | [x] | Paso 9 |
| Bridge BFF | front-sapira → api-factura | [~] | Apéndice B de la guía |
| Set formal SII | Casos de certificación | [ ] | Apéndice C de la guía |
| Producción | Palena y operación | [ ] | Fase 4 |