Documentación técnica

API de VeriFactu: cómo se integra de verdad

Todo lo que necesita un equipo de desarrollo para conectar un sistema de facturación con la AEAT: ciclo completo del registro de facturación, campos del registro de alta según la Orden HAC/1177/2024, anulaciones, rectificativas, diferencias reales entre las dos modalidades y cómo se expone el flujo dentro de ERPNext.

VeriFactu se integra por servicio web SOAP con certificado electrónico, no por API REST. Por cada factura, tu sistema genera un registro de facturación de alta, lo encadena con la huella SHA-256 del registro anterior, imprime el QR en el documento y lo remite en lotes de hasta 1.000 registros respetando el tiempo de espera que devuelve la propia Agencia en cada respuesta.

— El ciclo completo

De la factura al acuse de la AEAT, paso a paso

Conviene tener el ciclo entero en la cabeza antes de escribir la primera línea, porque la mitad de los problemas de integración vienen de haber colocado un paso en el sitio equivocado. Este es el orden real, tal y como lo describen el RD 1007/2023 y los esquemas publicados por la Agencia.

  1. 01

    Se cierra la factura en el sistema emisor

    El reglamento exige que el registro de facturación se genere en el momento de expedir la factura, no en un proceso posterior. Si tu arquitectura contempla un job nocturno que recorre lo facturado durante el día, ya estás fuera de la norma aunque el XML sea impecable.

  2. 02

    Se rellenan los datos identificativos

    IDVersion, el bloque IDFactura con NIF del emisor, serie y fecha de expedición, el nombre o razón social del emisor, el tipo de factura y una descripción de la operación que no puede quedarse vacía.

  3. 03

    Se construye el desglose fiscal

    Hasta doce líneas, cada una con impuesto, clave de régimen y calificación de la operación o causa de exención, más base, tipo y cuota. Es el punto donde se traduce la configuración de impuestos de tu ERP a los códigos de la Agencia, y donde más tiempo se va en un proyecto real.

  4. 04

    Se cierra el encadenamiento

    O el registro es el primero de la cadena, y entonces se marca como tal, o incorpora el emisor, la serie, la fecha y la huella del registro inmediatamente anterior. El orden lo marca la generación del registro, no el número de factura.

  5. 05

    Se identifica el sistema informático

    Un bloque completo con el productor del software, el nombre y la versión del sistema, el número de instalación y tres indicadores sobre si puede operar en modo multiobligado. Va en cada registro, no en la cabecera.

  6. 06

    Se sella la fecha y hora de generación

    En ISO-8601 con huso horario explícito. Es un campo con peso jurídico: fija el momento en que el registro existió y ordena la cadena.

  7. 07

    Se calcula la huella

    SHA-256 sobre la cadena de campos concatenados en un orden estricto, con TipoHuella a 01. El detalle del algoritmo, con la cadena previa y un ejemplo completo, está en nuestra guía específica del hash.

  8. 08

    Se firma, sólo si operas en NO VERI*FACTU

    La firma electrónica XAdES del registro es la contrapartida a no enviar nada a la Agencia. En modalidad VERI*FACTU el propio envío hace de anclaje temporal y la firma no se exige.

  9. 09

    Se imprime el QR en la factura

    Obligatorio en las dos modalidades y en todas las facturas expedidas por un sistema informático de facturación, incluidas las simplificadas.

  10. 10

    Se remite el lote a la AEAT

    Mensaje RegFactuSistemaFacturacion con una cabecera que identifica al obligado tributario y hasta 1.000 registros de alta o de anulación mezclados. Transporte SOAP sobre HTTPS con TLS mutuo.

  11. 11

    Se procesa la respuesta línea a línea

    La Agencia devuelve un CSV de presentación, un estado global del envío y un estado por cada registro. Un envío puede volver como ParcialmenteCorrecto: hay que leer las líneas, no sólo la cabecera.

  12. 12

    Se respeta el control de flujo

    Cada respuesta trae el tiempo que hay que esperar antes del siguiente envío. Ignorarlo es la forma más rápida de que la Agencia empiece a rechazarte peticiones.

Los pasos 07 y 09 están documentados aparte con el nivel de detalle que piden: el algoritmo de la huella y el encadenamiento, en cómo se calcula el hash SHA-256 de cada registro; la especificación del código de barras bidimensional, en qué contiene exactamente el QR y cómo se imprime.

— Registro de alta

Los campos del registro de facturación de alta

El contenido del registro lo fija el RD 1007/2023 y lo desarrolla la Orden HAC/1177/2024; la forma exacta, orden incluido, la fija el esquema SuministroInformacion.xsd que publica la Agencia. Esta tabla sigue ese orden. El XSD es la referencia buena: cuando una documentación de terceros y el esquema no coincidan, manda el esquema.

CampoTipo / valoresOblig.Notas de implementación
IDVersionEnumeradoVersión del formato de registro que publica la AEAT. Viaja en todos los registros y permite versionar el esquema sin romper integraciones antiguas.
IDFacturaBloqueContiene IDEmisorFactura (NIF de 9 caracteres), NumSerieFactura (hasta 60 caracteres) y FechaExpedicionFactura en formato dd-mm-yyyy. Es la clave funcional del registro.
RefExternaTexto (60)NoReferencia libre del emisor. El sitio natural para meter tu identificador interno y poder casar la respuesta de la AEAT con tu propia tabla.
NombreRazonEmisorTexto (120)Nombre o razón social de quien expide la factura.
SubsanacionS / NNoSe marca con S cuando el registro corrige a otro que ya se remitió. No sustituye al anterior: se añade a la cadena.
RechazoPrevioN / S / XNoIndica si el registro que se subsana fue rechazado previamente y por quién. Va de la mano de Subsanacion.
TipoFacturaF1, F2, F3, R1-R5F1 factura completa, F2 simplificada, F3 sustitutiva de simplificadas y R1 a R5 las rectificativas. Determina qué otros campos pasan a ser obligatorios.
TipoRectificativaS / INoS para rectificativa por sustitución, I para rectificativa por diferencias (incremental). Obligatorio en cuanto TipoFactura es R1-R5.
FacturasRectificadasLista (máx. 1.000)NoIdentificación de las facturas que se rectifican, con emisor, serie y fecha de expedición de cada una.
FacturasSustituidasLista (máx. 1.000)NoIdentificación de las facturas simplificadas que sustituye una F3.
ImporteRectificacionBloqueNoImportes rectificados: base, cuota y recargo. Tiene sentido cuando la rectificativa es por sustitución.
FechaOperacionFechaNoFecha de la operación cuando difiere de la de expedición.
DescripcionOperacionTexto (500)Descripción funcional de la operación. Es obligatorio y no admite quedarse vacío, así que conviene mapearlo a algo con sentido y no a una constante.
FacturaSimplificadaArt7273S / NNoMarca la factura simplificada cualificada de los artículos 7.2 y 7.3 del Reglamento de facturación.
FacturaSinIdentifDestinatarioArt61dS / NNoMarca la factura completa emitida sin identificar al destinatario al amparo del artículo 6.1.d.
MacrodatoS / NNoMarca el registro cuando el importe total supera el umbral de gran cuantía que fija la AEAT.
EmitidaPorTerceroODestinatarioD / TNoD cuando la expide el destinatario (autofacturación), T cuando la expide un tercero.
TerceroBloqueNoNombre o razón social y NIF (o identificador extranjero) del tercero que expide.
DestinatariosLista (máx. 1.000)NoCada destinatario con nombre o razón social y NIF, o bien un identificador de otro país. Las validaciones de la AEAT lo exigen en la práctica para las facturas completas.
CuponS / NNoIndica que la operación incorpora un cupón.
DesgloseBloque (máx. 12 líneas)Hasta doce líneas DetalleDesglose. Es la parte que más trabajo da al mapear desde un ERP, porque hay que traducir tu configuración de impuestos a los códigos de la AEAT.
CuotaTotalImporte 12,2Suma de cuotas repercutidas. Tiene que cuadrar con el desglose o el registro se rechaza.
ImporteTotalImporte 12,2Importe total de la factura, con signo.
EncadenamientoBloqueO bien PrimerRegistro con valor S, o bien RegistroAnterior con el emisor, la serie, la fecha de expedición y la huella del registro precedente.
SistemaInformaticoBloqueIdentifica al productor del software y a la instalación concreta. Ver detalle más abajo.
FechaHoraHusoGenRegistrodateTime ISO-8601Momento de generación del registro con huso horario explícito. Es el campo por el que se ordena la cadena.
NumRegistroAcuerdoFacturacionTexto (15)NoNúmero del acuerdo de facturación por el destinatario o por terceros autorizado por la AEAT.
IdAcuerdoSistemaInformaticoTexto (16)NoIdentificador del acuerdo sobre el sistema informático, cuando exista.
TipoHuella0101 identifica SHA-256, el único algoritmo previsto por ahora.
HuellaTexto (64)Hash hexadecimal del registro. Cómo se construye la cadena previa está detallado en la guía del algoritmo.
SignatureXAdESNo en el esquemaOpcional en el XSD, pero obligatorio de hecho para quien opera en modalidad NO VERI*FACTU.

Fuentes: esquemas XSD de la AEAT, diseños de registro y Orden HAC/1177/2024. Longitudes y cardinalidades verificadas contra los XSD publicados en julio de 2026; revisa siempre la versión vigente antes de un despliegue.

El bloque SistemaInformatico, campo a campo

Es el bloque que más se subestima. No describe la factura: describe quién hizo el programa y qué instalación concreta lo está ejecutando. Si desarrollas software para clientes, aquí es donde te identificas ante la Agencia en cada registro que emiten ellos.

ElementoQué lleva
NombreRazonNombre o razón social del productor del software (hasta 120 caracteres).
NIF o IDOtroNIF español del productor o identificador equivalente si es extranjero.
NombreSistemaInformaticoNombre comercial del sistema (hasta 30 caracteres).
IdSistemaInformaticoCódigo de dos caracteres que el propio productor asigna a cada uno de sus sistemas.
VersionVersión del sistema (hasta 50 caracteres).
NumeroInstalacionIdentificador de la instalación concreta (hasta 100 caracteres). Distingue una implantación de otra.
TipoUsoPosibleSoloVerifactuS si el sistema únicamente puede operar en modalidad VERI*FACTU.
TipoUsoPosibleMultiOTS si el sistema puede dar servicio a varios obligados tributarios.
IndicadorMultiplesOTS si en esa instalación concreta está dando servicio a varios obligados.

Esqueleto del mensaje de envío

Reducido a lo esencial para que se vea la estructura: una cabecera con el obligado tributario y la lista de registros. Los prefijos de espacio de nombres y el detalle completo salen del WSDL y de los XSD oficiales.

<RegFactuSistemaFacturacion>
  <Cabecera>
    <ObligadoEmision>
      <NombreRazon>DISTRIBUCIONES LOPEZ SL</NombreRazon>
      <NIF>B12345678</NIF>
    </ObligadoEmision>
    <RemisionVoluntaria>
      <FechaFinVeriFactu>31-12-2027</FechaFinVeriFactu>
    </RemisionVoluntaria>
  </Cabecera>
  <RegistroFactura>
    <RegistroAlta>
      <IDVersion>...</IDVersion>
      <IDFactura>
        <IDEmisorFactura>B12345678</IDEmisorFactura>
        <NumSerieFactura>2027-A/000145</NumSerieFactura>
        <FechaExpedicionFactura>15-01-2027</FechaExpedicionFactura>
      </IDFactura>
      <NombreRazonEmisor>DISTRIBUCIONES LOPEZ SL</NombreRazonEmisor>
      <TipoFactura>F1</TipoFactura>
      <DescripcionOperacion>Suministro de material de oficina</DescripcionOperacion>
      <Destinatarios>...</Destinatarios>
      <Desglose>...</Desglose>
      <CuotaTotal>210.00</CuotaTotal>
      <ImporteTotal>1210.00</ImporteTotal>
      <Encadenamiento>
        <RegistroAnterior>...</RegistroAnterior>
      </Encadenamiento>
      <SistemaInformatico>...</SistemaInformatico>
      <FechaHoraHusoGenRegistro>2027-01-15T10:42:11+01:00</FechaHoraHusoGenRegistro>
      <TipoHuella>01</TipoHuella>
      <Huella>...</Huella>
    </RegistroAlta>
  </RegistroFactura>
</RegFactuSistemaFacturacion>

Esqueleto simplificado con fines ilustrativos: faltan espacios de nombres y campos opcionales. No lo copies a producción sin validarlo contra los XSD vigentes.

— Corregir sin borrar

Anulaciones, rectificativas y subsanaciones

Hay tres formas distintas de arreglar algo y se confunden con muchísima frecuencia. Ninguna de las tres borra nada: las tres añaden registros a la cadena. Si tu modelo de datos permite un DELETE sobre la tabla de registros, el diseño está mal desde el principio.

SituaciónQué se generaCampos que entran en juego
La factura deja de existirRegistro de facturación de anulaciónIDVersion, IDFactura, SinRegistroPrevio, RechazoPrevio, GeneradoPor y Generador, Encadenamiento, SistemaInformatico, FechaHoraHusoGenRegistro, TipoHuella y Huella
La factura se corrige con otra facturaNuevo registro de alta de tipo R1 a R5TipoRectificativa (S o I), FacturasRectificadas y, en las rectificativas por sustitución, ImporteRectificacion
Varias simplificadas se sustituyen por una completaNuevo registro de alta de tipo F3FacturasSustituidas
El registro remitido tenía un error, la factura noNuevo registro de alta con SubsanacionSubsanacion a S y, si la AEAT lo había rechazado, RechazoPrevio

El registro de anulación es notablemente más corto que el de alta: no lleva desglose, ni importes, ni destinatarios. Sólo identifica la factura que se anula, dice quién genera el registro y cierra con encadenamiento, sistema informático, fecha y huella. Eso sí, entra en la misma cadena que las altas y se envía en el mismo mensaje: un lote puede mezclar altas y anulaciones sin problema.

Sobre los tipos de rectificativa, la clasificación es la misma que ya se usa en el suministro inmediato de información: R1 para el error fundado en derecho y los supuestos del artículo 80, apartados uno, dos y seis de la Ley del IVA; R2 para el artículo 80.tres, concurso de acreedores; R3 para el artículo 80.cuatro, créditos incobrables; R4 para el resto; R5 para las rectificativas de facturas simplificadas. Y la distinción entre sustitutiva e incremental no es cosmética: la sustitutiva reemplaza el contenido y obliga a informar los importes que se rectifican; la incremental sólo declara la diferencia.

Un detalle que vale oro en producción: el campo SinRegistroPrevio del registro de anulación existe para el caso en que se anula una factura cuyo registro de alta nunca llegó a remitirse. Ocurre, y tenerlo previsto en el código evita un atasco incómodo en el cierre de un ejercicio.

— Las dos modalidades

VERI*FACTU frente a NO VERI*FACTU: qué cambia en el código

Se explica siempre como «enviar o no enviar», y esa simplificación despista a quien tiene que estimar el trabajo. La generación del registro es idéntica en las dos: mismos campos, misma huella, mismo encadenamiento, mismo QR. Lo que cambia es todo lo que rodea al registro una vez creado.

AspectoVERI*FACTUNO VERI*FACTU
Remisión a la AEATContinua y automática, con control de flujoNinguna de forma rutinaria; sólo ante requerimiento
Firma electrónica del registroNo exigida: el envío actúa de anclajeObligatoria, formato XAdES
Registro de eventos del sistemaNo exigidoObligatorio: arranques, paradas, anomalías, exportaciones
ConservaciónLa Agencia guarda copia de lo remitidoÍntegra a cargo del obligado, con capacidad de exportación
Certificado electrónicoNecesario para el canal SOAPNecesario para firmar cada registro
Leyenda en la facturaMenciona que es una factura verificable en la sede de la AEATSin esa mención
Trabajo de integraciónCliente SOAP, cola, reintentos, respuestas por líneaFirma, eventos, conservación, exportación y respuesta a requerimientos

La cabecera del mensaje refleja esta decisión de forma explícita: el bloque RemisionVoluntaria incluye una FechaFinVeriFactu, que existe precisamente porque quien empieza a remitir de forma voluntaria queda vinculado a esa modalidad hasta el final del año natural. No es un interruptor que se pueda accionar cada semana.

Nuestra recomendación técnica, después de mirarlo con calma, es VERI*FACTU para la mayoría de negocios. No por comodidad: porque desplaza la carga de la prueba. Con los registros ya en la Agencia, tu obligación de conservación y de demostrar integridad se reduce muchísimo. La modalidad sin envío suena más cómoda y sale más cara de construir y de mantener.

— Integración en ERPNext

Cómo se expone todo esto dentro de ERPNext

ERPNext corre sobre Frappe Framework, donde cada entidad de negocio es un DocType y cada DocType trae su API REST generada sola en /api/resource/{DocType}. Eso ya está cubierto en la guía de la API REST y los webhooks de ERPNext. Lo que interesa aquí es dónde encaja el ciclo de VeriFactu sin tocar el núcleo del producto.

La respuesta corta: en una app propia de Frappe, con tres piezas. Un DocType que hace de libro de registros de facturación, unos hooks que lo alimentan desde el ciclo de vida de la factura y un trabajador en segundo plano que se encarga del envío y de las respuestas.

1. Los hooks sobre el ciclo de vida de la factura

En Frappe, los eventos de documento se declaran en hooks.py. El registro de alta se genera cuando la factura se valida y el de anulación cuando se cancela, que es exactamente la semántica que pide el reglamento.

# hooks.py de tu app
doc_events = {
    "Sales Invoice": {
        "on_submit": "mi_app.verifactu.registro.generar_alta",
        "on_cancel": "mi_app.verifactu.registro.generar_anulacion",
    },
}

2. El envío, siempre fuera de la petición del usuario

Nadie debería quedarse mirando una rueda girando mientras se negocia un TLS con la AEAT. El registro se persiste de forma síncrona, porque tiene que existir en el mismo momento de expedir; el envío se encola y lo procesa un worker, que es lo que permite agrupar hasta 1.000 registros, respetar el tiempo de espera y reintentar sin efectos secundarios.

frappe.enqueue(
    "mi_app.verifactu.envio.enviar_lote",
    queue="short",
    job_name="verifactu-envio",
    enqueue_after_commit=True,
)

3. Qué queda expuesto hacia fuera

  • API REST del libro de registros. Al ser un DocType, el registro de facturación queda consultable en /api/resource/ con los filtros y la paginación estándar de Frappe. Auditoría y conciliación sin escribir un endpoint.
  • Métodos propios. Cualquier función Python decorada con @frappe.whitelist() se publica en /api/method/{ruta.a.la.funcion}: reenviar un lote, forzar una subsanación o exportar la cadena de un ejercicio.
  • Webhooks. El DocType Webhook de Frappe dispara un POST a un sistema externo cuando cambia el estado de un registro, sin necesidad de que nadie haga polling contra el ERP.
  • Trazas. Los fallos de envío quedan en el Error Log de Frappe y los disparos de webhook en su propio registro de peticiones, con el código de respuesta de cada destino.

Qué hace nuestro módulo sobre esa base

El módulo VeriFactu que hemos escrito para ERPNext sigue exactamente ese patrón: genera el registro dentro del ciclo de vida de la factura, calcula la huella y el encadenamiento, imprime el QR en la plantilla del documento, añade la leyenda obligatoria y remite a la Agencia en las dos modalidades previstas por el reglamento. Funciona sobre ERPNext v14, v15 y v16, y la declaración responsable de conformidad la firmamos nosotros como productores del software.

Los nombres exactos de los DocTypes y de los métodos publicados van en la documentación de instalación que entregamos con el módulo, porque cambian entre versiones y no queremos que alguien integre contra un nombre que aquí se quede desactualizado.

Si lo que necesitas es integrar VeriFactu en un sistema que no es ERPNext, el patrón sirve igual y el trabajo se concentra en tres sitios: el mapeo de tus impuestos al desglose, la serialización determinista de la cadena que se hashea y el control de flujo del envío. Ahí es donde entra nuestro equipo de desarrollo a medida sobre Frappe.

— Errores frecuentes

Ocho formas de romper la integración sin darte cuenta

  1. 01

    Normalizar los valores antes de hashear

    La huella se calcula sobre una cadena literal. Si en un sitio formateas el importe con dos decimales y en otro el redondeo cae distinto, o si cambias el formato de la fecha entre el cálculo y el envío, el hash deja de reproducirse y la cadena no se puede verificar. Serializa una sola vez, guarda la cadena previa y hashea siempre desde ahí.

  2. 02

    Encadenar por número de factura

    El orden de la cadena lo marca la fecha y hora de generación del registro, no la numeración de las series. Un sistema con varias series concurrentes que intente encadenar por número acaba con cadenas cruzadas imposibles de reparar.

  3. 03

    Generar el registro en un proceso posterior

    El clásico job nocturno que recorre las facturas del día. El XML puede ser perfecto y aun así el sistema no es conforme, porque el registro tiene que nacer con la factura.

  4. 04

    No serializar el acceso a la última huella

    Dos procesos que piden a la vez cuál fue el último registro y encadenan los dos sobre la misma huella. Es la condición de carrera más habitual y sólo aparece con concurrencia real, casi nunca en pruebas. Hace falta un bloqueo explícito o una secuencia serializada por obligado tributario.

  5. 05

    Tratar AceptadoConErrores como un rechazo

    El registro está admitido. Reenviarlo genera un duplicado; lo que toca es subsanar con un registro nuevo. El error contrario también existe: dar por bueno un envío mirando sólo el estado global sin recorrer las líneas.

  6. 06

    Ignorar el tiempo de espera entre envíos

    Reintentar en bucle contra la AEAT no acelera nada y sí te expone a que empiece a rechazarte. La respuesta te dice cuánto esperar; el cliente tiene que obedecer, y esa lógica vive en el worker, no en el hilo del usuario.

  7. 07

    Un desglose que no cuadra con los totales

    Las validaciones de la Agencia comprueban la coherencia entre las líneas del desglose y los importes de cabecera. Los descuentos a nivel de documento, los redondeos de línea y el recargo de equivalencia son la fuente clásica de descuadres de céntimos que tumban el registro entero.

  8. 08

    Probar en preproducción con un certificado que no es el de producción

    La Agencia segrega el punto de entrada según el tipo de certificado. Validar con uno y salir a producción con otro deja la sorpresa para el peor día posible. Y conviene desconfiar de cualquier proveedor que hable de estar &laquo;homologado por Hacienda&raquo;: esa lista no existe.

Sobre el último punto lo contamos entero en por qué no existe software homologado por la AEAT, y sobre lo que cuesta equivocarse, en el régimen sancionador del artículo 201 bis, que alcanza también al fabricante del programa.

— FAQ

Preguntas frecuentes sobre la integración con VeriFactu

Las dudas que salen siempre en la primera reunión técnica: canal, límites, certificados, respuestas de la Agencia y encaje en ERPNext.

Ver todas las preguntas
¿VeriFactu tiene API REST con JSON?+
No. El canal de remisión que publica la AEAT es un servicio web SOAP sobre HTTPS con autenticación por certificado electrónico. La operación de envío se llama RegFactuSistemaFacturacion y el contrato está en el WSDL SistemaFacturacion.wsdl junto con los esquemas SuministroLR.xsd, SuministroInformacion.xsd y RespuestaSuministro.xsd. No existe un endpoint REST/JSON oficial: las APIs REST que se anuncian en el mercado son capas de terceros que por debajo hablan SOAP con la Agencia. Eso no es un problema técnico, pero sí una decisión de arquitectura: si usas un intermediario, tu trazabilidad depende de él.
¿Cuántos registros caben en un envío y con qué frecuencia hay que enviar?+
El esquema SuministroLR.xsd admite hasta 1.000 elementos RegistroFactura por cada mensaje RegFactuSistemaFacturacion, además de la cabecera. La frecuencia la marca la propia AEAT: cada respuesta incluye el campo TiempoEsperaEnvio, cuyo valor de partida documentado son 60 segundos y que la Agencia puede ajustar según su carga. Tu sistema debe respetar ese tiempo antes del siguiente envío, o adelantarlo si se acumulan 1.000 registros pendientes. Dicho de otra forma: no es tiempo real factura a factura, es una cola con control de flujo.
¿Qué certificado hace falta y contra qué endpoint se envía?+
Se usa certificado electrónico en TLS mutuo. Sirve tanto un certificado de representante de la entidad como un certificado de sello de entidad, pero la AEAT segrega el punto de entrada según cuál uses. En el entorno de pruebas los endpoints publicados son https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP y https://prewww10.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP, este último para sello de entidad. Antes de pasar a producción conviene confirmar la URL vigente en el WSDL oficial, porque es el único sitio donde la Agencia la mantiene actualizada.
¿Qué significa que la AEAT responda AceptadoConErrores?+
Que el registro ha entrado. EstadoRegistro admite tres valores: Correcto, AceptadoConErrores e Incorrecto. AceptadoConErrores quiere decir que la Agencia ha detectado un defecto pero ha admitido el registro, así que reenviar el mismo XML sólo genera un duplicado. Lo correcto es emitir un registro nuevo con Subsanacion a S, que se encadena como cualquier otro. Incorrecto sí es un rechazo: ese registro no consta y hay que corregir y volver a enviarlo. A nivel de envío completo, EstadoEnvio devuelve Correcto, ParcialmenteCorrecto o Incorrecto.
¿Se puede borrar un registro ya enviado?+
No, y ese es justamente el punto del sistema. Un error se arregla añadiendo registros, nunca quitándolos. Si la factura deja de existir, se genera un registro de anulación encadenado. Si la factura sigue viva pero cambian importes o datos fiscales, se emite una factura rectificativa con su propio registro de alta de tipo R1 a R5. Y si lo que estaba mal era el registro y no la factura, se manda otro con Subsanacion. Tu modelo de datos tiene que ser append-only en la tabla de registros aunque el ERP permita cancelar documentos.
¿Qué cambia en el código entre modalidad VERI*FACTU y NO VERI*FACTU?+
Cambia bastante más que un flag. En VERI*FACTU necesitas cliente SOAP, gestión de certificados, cola de pendientes, control de flujo con TiempoEsperaEnvio, reintentos idempotentes y tratamiento de las respuestas por línea. En NO VERI*FACTU no envías nada de forma rutinaria, pero necesitas firma electrónica XAdES de cada registro, un registro de eventos del sistema, conservación local durante el plazo legal y capacidad de exportar y responder a un requerimiento de la Agencia. La huella SHA-256, el encadenamiento y el QR son idénticos en las dos.
¿Cómo se engancha todo esto a ERPNext sin tocar el core?+
Con una app propia de Frappe. El registro se genera desde doc_events en hooks.py, colgando de on_submit de Sales Invoice para el alta y de on_cancel para la anulación, y se persiste en un DocType propio que actúa de libro de registros. El envío no va en el hilo de la petición: se encola con frappe.enqueue y lo procesa un worker, que es lo que permite respetar el tiempo de espera y reintentar sin bloquear al usuario. Hacia fuera, cada DocType expone su API REST en /api/resource y puedes publicar lógica propia con @frappe.whitelist(). Nada de esto exige parchear ERPNext.
— Seguir leyendo

El resto del cluster técnico de VeriFactu

Empezar · Respuesta en 24h

¿Te toca construir esta integración?

Llevamos desde 2014 implantando ERPNext y hemos escrito el módulo VeriFactu completo, del cálculo de la huella al control de flujo del envío. Cuéntanos qué sistema tienes que adaptar y te decimos qué trabajo hay por delante, sin humo.

Demo personalizada
Sin compromiso
Equipo en España