Repository navigation
Multi Tenant SaaS
Si tu backend es un SaaS que gestiona la facturación de varios obligados tributarios distintos (o de un mismo obligado con varias "facturaciones" independientes) bajo la misma instalación del sistema informático, hay dos niveles a configurar:
Se declara una sola vez, a nivel de VeriFactuConfig, y describe si el software puede llevar la facturación de más de un obligado:
config.setMultiObligatedCapable("S"); // el SIF puede llevar la facturación de varios OTPor defecto es "N" (pensado para integraciones de un solo cliente/tenant).
⚠️ Según las reglas de la AEAT, este indicador debe calcularse automáticamente por cliente en cada envío. Nunca debe ser un valor fijo elegido por el desarrollador o el usuario final.
Si tu backend gestiona varios obligados tributarios, calcula tú mismo el valor para ese cliente concreto y pásalo por factura:
boolean esteClienteTieneMasDeUnaFacturacionEnElSaaS = /* tu lógica de negocio */ true;
invoice.setMultipleObligatedIndicator(esteClienteTieneMasDeUnaFacturacionEnElSaaS);Si no informas multipleObligatedIndicator en la factura (lo dejas null, valor por defecto), AeatClient.buildSystemInfo() usa como respaldo VeriFactuConfig.getHasMultipleObligated() — pensado para integraciones de un solo cliente donde este valor no cambia nunca.
// AeatClient.buildSystemInfo() — lógica real:
Boolean perInvoiceIndicator = invoice.getMultipleObligatedIndicator();
String indicadorMultiplesOT = perInvoiceIndicator != null
? (perInvoiceIndicator ? "S" : "N")
: config.getHasMultipleObligated();Cabecera.ObligadoEmision (el NIF/nombre que efectivamente ve la AEAT) sale de VeriFactuConfig.issuerName/issuerVat, que se fijan en el constructor y no cambian después. Esto significa que, si gestionas varios obligados tributarios distintos en tu SaaS, necesitas:
- Un
VeriFactuConfig(con su propioissuerName/issuerVat) por cada obligado, no un único config compartido con el NIF cambiando "sobre la marcha" por factura. - Puedes reutilizar la misma instancia de
AeatClientsi el certificado y el modo (producción/VeriFactu) son iguales para todos, pero normalmente conviene encapsular(config, client)juntos por tenant en tu capa de servicio.
Estos tres mecanismos son independientes y pueden combinarse: por ejemplo, un SaaS como el de Odei que remite ficheros en nombre de sus clientes (Representante) y además gestiona múltiples obligados (IndicadorMultiplesOT dinámico) por cliente. Ver Representación de terceros para el detalle de cada mecanismo.
Ejemplo completo: ThirdPartyRepresentationExample.multiTenantSaaS().