Skip to content

Validacion de Facturas

Jacobo Cantorna Cigarrán edited this page Oct 11, 2026 · 3 revisions

Validación local

InvoiceValidator valida antes de enviar lo que la AEAT rechaza, con mensajes legibles. Es un buen filtro para no gastar una llamada SOAP real con un registro que sabemos que fallará, y AeatClient lo ejecuta automáticamente antes de firmar y enviar.

Uso

Todos los métodos son estáticos — no se instancia InvoiceValidator:

ValidationResult result = InvoiceValidator.validate(invoice, config);   // factura, con el emisor de la configuración
InvoiceValidator.validate(annulment, config);                           // anulación
InvoiceValidator.validate(config);                                      // emisor, representante y sistema informático
InvoiceValidator.validate(invoice);                                     // el emisor se toma de Invoice#getIssuerTaxId

if (!result.isValid()) {
    System.out.println(result.getErrorMessage()); // lista formateada
    for (String error : result.getErrors()) { ... }
    result.getErrorSummary();                     // todos en una línea (logs, respuestas)
}
for (String warning : result.getWarnings()) { ... }

ValidationResult expone isValid(), getErrors(), getWarnings(), getErrorMessage(), getErrorSummary() y toString(). Las listas son inmutables.

  • Errores: la AEAT rechazará el registro o el SDK no puede representarlo. El resultado no es válido.
  • Avisos: datos sospechosos que la AEAT podría rechazar según el caso. No invalidan.

Qué ocurre al enviar

AeatClient.sendInvoice y sendAnnulment ejecutan esta validación. Con errores no se firma, no se encadena y no se envía nada, y la respuesta es:

status            = "error"
message           = "Validacion local: <errores separados por ;>"
validation_errors = [ "<error 1>", "<error 2>", ... ]

Ver Respuesta de la AEAT.

Qué valida

El validador aplica las validaciones de negocio que la AEAT publica en el documento Validaciones y errores (v1.2.2). Los errores son los que provocan el rechazo del registro; los avisos son los que la AEAT acepta con errores.

Facturas — errores (rechazo)

  1. Obligatorios y longitudes: número (máx. 60), fecha, tipo, razón social y NIF del emisor (máx. 120).
  2. Número de factura: solo caracteres ASCII imprimibles (32 a 126) y sin ", ', <, > ni =.
  3. Fecha de expedición: no posterior a hoy (Europe/Madrid) ni anterior al 28/10/2024.
  4. NIF/CIF/NIE del emisor, destinatarios, tercero y referencias: formato y dígito de control (los NIF especiales K, L y M se aceptan por formato).
  5. Tipo de factura admitido por el esquema: F1, F2, F3, R1-R5 (F4 no).
  6. Destinatarios: obligatorios en F1, F3 y R1-R4; no admitidos en F2 y R5. Razón social, NIF válido o IDOtro correcto (país ISO, tipo 02-07, reglas de ES, 07 y NIF-IVA).
  7. Desglose: de 1 a 12 líneas; cada una con exactamente una de CalificacionOperacion o OperacionExenta; ClaveRegimen obligatoria y de la lista del impuesto (L8A para IVA, que no incluye la 21; L8B más 20 y 21 para IGIC; 01, 08, 11, 18, 19 y 20 para IPSI, donde el error solo avisa hasta el 31/12/2026) y sus reglas (02 solo exentas, 03 solo S1, 04 S2 o exentas, 06 con BaseImponibleACoste, 07, 08 N2, 10 N1/F1/NIF, 11 solo 21 %, 14 con fecha de operación y NIF P/Q/S/V).
  8. Tipos de IVA (S1): 0, 4, 10 y 21; 5 % entre 01/07/2022 y 30/09/2024; 2 % y 7,5 % entre 01/10/2024 y 31/12/2024. Cuota repercutida = base × tipo con un margen de 10 € y mismo signo (no se comprueba en rectificativas por diferencias ni R2/R3). Recargo de equivalencia según el tipo.
  9. S2 (inversión del sujeto pasivo): solo F1, F3 y R1-R4, con tipo y cuota 0. Exentas y no sujetas no llevan tipo, cuota ni recargo.
  10. F2: base + cuota no puede superar 3.000 € (margen 10 €), salvo con la marca del art. 6.1.d.
  11. Rectificativas: tipo de rectificación obligatorio solo en R1-R5; por sustitución, importes corregidos. Facturas rectificadas solo en R1-R5; sustituidas solo en F3.
  12. Fechas de operación: entre hace 20 años y el año siguiente; posterior a hoy solo con las claves 14 y 15.
  13. Cupon solo en R1 y R5; FacturaSinIdentifDestinatarioArt61d solo en F2 y R5; FacturaSimplificadaArt7273 solo en F1, F3 y R1-R4; RechazoPrevio X o S solo con Subsanacion = S; tercero con NIF distinto del emisor; referencia externa (máx. 60) y huella anterior (64 hexadecimales).

Facturas — avisos (la AEAT acepta con errores)

  • Importe total y cuota total que no cuadran con el desglose más de 10 € (Σ base + Σ cuota + Σ recargo y Σ cuota + Σ recargo). No se comprueba con las claves de régimen 03, 05, 06, 08 y 09.
  • Huella anterior en minúsculas; NIF destinatario como no censado (07); rectificativa sin factura rectificada indicada; importe negativo en una factura que no es rectificativa.

Anulaciones: número y fecha, fecha no futura, NIF emisor, huella anterior, GeneradoPor (con nombre y NIF del generador, distinto del emisor).

Configuración: emisor, representante (nombre y NIF a la vez), desarrollador, y los límites del sistema informático (nombre máx. 30, identificador exactamente dos posiciones de letra mayúscula sin Ñ o dígito, versión máx. 50, instalación máx. 100, indicadores S/N).

Esta validación comprueba formato, límites y coherencia. No comprueba que el NIF esté censado en la AEAT ni que el obligado haya otorgado representación al titular del certificado: eso solo lo sabe la AEAT.

Validación de NIF / NIE / CIF

NifValidator valida formato y dígito de control de identificadores fiscales españoles:

boolean isValid = NifValidator.isValid("B72877814");
String idType = NifValidator.getIdType("B72877814"); // "NIF", "NIE", "CIF" o "UNKNOWN"

Soporta NIF (8 dígitos + letra), NIE (X/Y/Z + 7 dígitos + letra) y CIF (letra de organización + 7 dígitos + dígito o letra de control). Ambos métodos son estáticos.

Ejemplo completo: ValidationExample.java.

Clone this wiki locally