Skip to content

Validaciones

El SDK aplica localmente todas las validaciones listadas en Validaciones y errores del servicio v1.2.2. Esto te permite cazar registros mal formados antes de gastar una llamada SOAP — la AEAT devolvería el mismo diagnóstico, pero en microsegundos.

Llamar al validador

ts
import {
  validateInvoiceForRegister,
  validateInvoiceForCancel,
} from 'verifactu-sdk/validators';

const issues = validateInvoiceForRegister(invoice);
if (issues.some((i) => i.severity === 'rejection')) {
  throw new BusinessValidationError('Factura rechazada', { code: issues[0]!.code });
}

Cada ValidationResult devuelto lleva:

  • code — el código de error de la AEAT más cercano del catálogo.
  • field — ruta con puntos del campo en conflicto (p. ej. breakdown.0.taxRate).
  • severity'rejection' rechaza el registro, 'admissible' lo acepta con advertencia.
  • message — descripción corta en inglés de la incidencia.

VerifactuClient.registerInvoice ejecuta el validador automáticamente y lanza BusinessValidationError en caso de rechazo; sólo llamas al validador directamente cuando quieres inspeccionar todas las incidencias a la vez.

Las 23 reglas

El validador implementa una o más comprobaciones por regla de la AEAT. La correspondencia es:

ReglaGrupo de camposQué compruebaSeveridad
1IDFacturaFormato del NIF, caracteres permitidos en NumSerieFactura, FechaExpedicion ≥ 28-10-2024 y ±20 años respecto a hoy.Rechazo
2RechazoPrevio + SubsanacionSólo combinaciones coherentes (N, S, X).Rechazo
3TipoRectificativaObligatoria sólo si TipoFactura empieza por R.Rechazo
4FacturasRectificadasSólo permitida en facturas tipo R.Rechazo
5FacturasSustituidasSólo permitida en facturas F3.Rechazo
6ImporteRectificacionObligatorio cuando TipoRectificativa = S.Rechazo
7FechaOperacion±20 años respecto a la fecha de expedición, reglas especiales para ClaveRegimen 14/15.Rechazo
8FacturaSimplificadaArt7273Sólo en F1/F3/R1/R2/R3/R4.Rechazo
9FacturaSinIdentifDestinatarioArt61dSólo en F2/R5.Rechazo
10MacrodatoObligatorio si ImporteTotal ≥ 100 000 000 €.Rechazo
11EmitidaPorTerceroODestinatarioCoherencia con Tercero / Destinatarios.Rechazo
12TerceroFormato NIF, distinto del emisor, estructura NIF-IVA por país.Rechazo
13DestinatariosObligatorios para F1/F3/R1/R2/R3/R4; prohibidos para F2/R5; formato NIF; estructura NIF-IVA.Rechazo
14CuponSólo permitido cuando TipoFactura es R1 o R5.Rechazo
15.1Desglose.TipoImpositivoTipo permitido por fecha (según tabla histórica de la AEAT).Rechazo
15.2BaseImponibleACosteSólo cuando ClaveRegimen = 06 o Impuesto en 02/05.Rechazo
15.3TipoRecargoEquivalenciaPareja válida con TipoImpositivo (21/5.2, 10/1.4, …).Rechazo
15.4CalificacionOperacionS1/S2/N1/N2; mutuamente excluyente con OperacionExenta.Rechazo
15.5OperacionExentaE1-E6 (IVA); E7/E8 sólo para IGIC; coherencia con TipoFactura.Rechazo
15.6ClaveRegimen01-21 con sub-reglas para 02/03/04/06/07/08/10/11/14/20/21.Rechazo
15.7CuotaRepercutidabase × tipo con tolerancia ±10 € (≤ 3 000 € para simplificadas).Rechazo
16CuotaTotalSuma de cuotas repercutidas con tolerancia ±10 €.Rechazo
17ImporteTotalSuma de bases + impuesto + recargo con tolerancia ±10 €.Rechazo
18Huella anterior64 caracteres hex en mayúsculas cuando está presente.Admisible (2003)
19SistemaInformaticoSystemId 2 caracteres [A-Z0-9] excluyendo Ñ; coherencia TipoUsoPosibleSoloVerifactu / MultiOT.Rechazo
20FechaHoraHusoGenRegistroISO 8601 válido con offset; no en futuro lejano.Rechazo / Admisible
21NumRegistroAcuerdoFacturacion≤ 15 caracteres, juego de caracteres permitido.Rechazo
22IdAcuerdoSistemaInformatico≤ 16 caracteres, juego de caracteres permitido.Rechazo
23Huella64 caracteres hex en mayúsculas.Admisible (1292)

NIF, NIE, CIF

El validador local cubre las tres formas de identificador español y el dígito de control:

  • DNI: 8 dígitos + letra de control calculada por la tabla mod-23.
  • NIE: prefijo X|Y|Z + 7 dígitos + letra de control, misma tabla.
  • CIF: letra + 7 dígitos + dígito/letra de control (algoritmo mixto mod-10 / mod-11 según la spec AEAT).

NIF-IVA (UE)

El validador cubre los 28 estados miembros históricos de la UE más Irlanda del Norte (GB/XI) con gestión Brexit consciente de fechas. Las estructuras y las reglas por país se cargan desde validators/nifIva.ts. Ejemplos:

PaísCódigoEstructura
AlemaniaDE9 dígitos
FranciaFR11 caracteres (2 alfanuméricos + 9 dígitos)
ItaliaIT11 dígitos
PortugalPT9 dígitos
Países BajosNL12 caracteres
Reino UnidoGB9 / 12 dígitos; válido sólo ≤ 31-12-2020 (post-Brexit, usar XI)
Irlanda del NorteXI9 / 12 dígitos; válido sólo ≥ 01-01-2021

El validador acepta country=ES por completitud, pero los NIF españoles pasan por la ruta local de NIF/CIF.

Severidad

La AEAT distingue tres severidades:

  • envelope — se rechaza el envío completo (códigos 4xxx, los pone el servicio tras parsear el sobre SOAP).
  • record — sólo se rechaza el registro afectado (códigos 1xxx y 3xxx).
  • admissible — el registro se acepta pero se marca para subsanación (códigos 2xxx).

El validador local devuelve los dos primeros como severity: 'rejection' y el tercero como severity: 'admissible'. Los errores de envelope vienen del nivel de cable y nunca aparecen en el resultado local.

Siguiente

Released under the MIT license.