Contexto
DTE Issuer es un microservicio de emisión de documentos tributarios electrónicos (Boleta 39) para que un POS o ERP — Automotriz, BR Logística, Happy Pet — emita sin conocer el SII. Un proceso, una base, un contrato HTTP.
El SII es un stub: no hay XML firmado ni homologación. El foco está en los invariantes de emisión, no en facturación fiscal real.
Backend
API en Java 21 + Spring Boot con arquitectura hexagonal, Keycloak (JWT con tenant_id) y PostgreSQL con RLS. Se levanta con docker compose up.
- Sin folio no hay DTE: la reserva de folio es una operación del dominio, con bloqueo pesimista por tenant; un IT de concurrencia prueba N POST en paralelo sin huecos ni duplicados.
- Multi-tenant en tres capas: el tenant sale solo del JWT (Alpha no ve los documentos de Beta); Hibernate filtra por
tenant_id; Postgres aplica RLS con roldte_appsinBYPASSRLS. Idempotency-Keyobligatorio: reintento del POS devuelve el mismo DTE; body distinto →409. Tras persistir, outbox en la misma transacción y publicación deDteIssueda Rabbit tras el commit; un IT consume el mensaje.
OpenAPI con JWT, ArchUnit para la frontera hexagonal, CI con Testcontainers y cobertura forzada en dominio y aplicación.
Resultado
Se levanta con un comando: login Keycloak, POST con idempotencia, Alpha emite y Beta obtiene 404. Artefacto de portafolio — no software de producción fiscal.