El problema

Un POS o ERP — Automotriz, BR Logística, Happy Pet — no debería hablar con el SII. Folio numerado, reintento del POS y aislamiento entre negocios son problemas de emisión, no de la pantalla de venta. El SII queda fuera a propósito: no hay XML firmado ni homologación. El foco son los invariantes, no la boleta real.

Qué construí

Un microservicio de Boleta 39: un proceso, una base, un contrato HTTP. Código completo (no sample). Se levanta con docker compose up.

Decisiones técnicas

Arquitectura hexagonal para que un SII real pueda entrar después sin reescribir el dominio. Multi-tenant en tres capas: el tenant sale solo del JWT (Keycloak), Hibernate filtra por tenant_id y PostgreSQL aplica RLS. Outbox en la misma transacción; DteIssued a RabbitMQ tras el commit.

El problema difícil

Sin folio no hay DTE. La reserva va con bloqueo pesimista por tenant: N POST en paralelo, sin huecos ni duplicados. Idempotency-Key obligatorio: el reintento del POS devuelve el mismo documento; body distinto → 409.

El resultado

Login Keycloak, POST idempotente, Alpha emite y Beta obtiene 404. Artefacto de portafolio — no software de producción fiscal.