Skip to content

Multi Tenant SaaS

jcancig edited this page Sep 16, 2026 · 1 revision

Sistemas 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:

1. Capacidad estructural del sistema (TipoUsoPosibleMultiOT)

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 OT

Por defecto es "N" (pensado para integraciones de un solo cliente/tenant).

2. Indicador dinámico por factura (IndicadorMultiplesOT)

⚠️ 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();

Un VeriFactuConfig por obligado, no uno compartido

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 propio issuerName/issuerVat) por cada obligado, no un único config compartido con el NIF cambiando "sobre la marcha" por factura.
  • Puedes reutilizar la misma instancia de AeatClient si 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.

Combinación con representación de terceros

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().

Clone this wiki locally