[{"data":1,"prerenderedAt":372},["ShallowReactive",2],{"switcher-blog-pareja":3,"art-verifactu-tres-errores-aeat-es":6},{"es":4,"en":5},"\u002Fes\u002Fblog\u002Fverifactu-tres-errores-aeat\u002F","\u002Fen\u002Fblog\u002Fverifactu-three-aeat-errors\u002F",{"id":7,"title":8,"author":9,"body":10,"date":355,"description":356,"extension":357,"image":358,"meta":359,"navigation":360,"pareja":361,"path":362,"seo":363,"sin_cta":364,"stem":365,"tags":366,"__hash__":371},"blogEs\u002Fes\u002Fblog\u002Fverifactu-tres-errores-aeat.md","VeriFactu contra la AEAT: los tres errores que nos frenaron y cómo se arreglan","Paco Cubel",{"type":11,"value":12,"toc":344},"minimark",[13,18,27,30,37,41,44,93,96,100,103,114,124,128,131,142,158,161,170,174,177,192,195,228,233,237,240,303,307,310,330,341],[14,15,17],"h2",{"id":16},"por-qué-escribimos-esto","Por qué escribimos esto",[19,20,21,22,26],"p",{},"VeriFactu se puede resumir en una frase: cada factura que emites deja una ",[23,24,25],"strong",{},"huella SHA-256\nencadenada con la anterior",", y el sistema que la emite tiene que identificarse ante la\nAgencia Tributaria. Suena sencillo. La documentación oficial son varios PDF y un catálogo\nde validaciones, y el camino habitual es descubrir las reglas de una en una, a base de que\nte rechacen el envío.",[19,28,29],{},"Nosotros lo hemos implementado desde cero para nuestro ERP, en Dart, y lo hemos enviado a\nla preproducción de la AEAT. Este artículo es la lista de lo que nos frenó, con el número\nde error delante, porque es lo que nos habría ahorrado tiempo encontrar escrito en algún\nsitio.",[19,31,32,33,36],{},"Aviso de honestidad: ",[23,34,35],{},"preproducción no es producción",". Es el entorno de pruebas de la\nAEAT, sin efectos fiscales. Todo lo que sigue está comprobado ahí.",[14,38,40],{"id":39},"el-montaje-en-cuatro-piezas","El montaje, en cuatro piezas",[19,42,43],{},"Antes de los errores, lo que hay que tener montado:",[45,46,47,59,73,87],"ol",{},[48,49,50,53,54,58],"li",{},[23,51,52],{},"El registro"," (",[55,56,57],"code",{},"RegistroAlta","): la factura en XML, con su desglose de IVA.",[48,60,61,64,65,68,69,72],{},[23,62,63],{},"La huella",": SHA-256 en 64 caracteres hexadecimales ",[23,66,67],{},"en mayúsculas",", calculada\nsobre unos campos concretos en un orden concreto, y ",[23,70,71],{},"encadenada"," con la huella de la\nfactura anterior. Esto es lo que hace que no puedas borrar una factura del medio sin\nque se note.",[48,74,75,78,79,82,83,86],{},[23,76,77],{},"El envío",": SOAP sobre ",[23,80,81],{},"mTLS",". El certificado no es solo para cifrar: es tu\nidentificación. En modo VeriFactu ",[23,84,85],{},"no hay firma XAdES","; la autenticación es el\ncertificado del envío y la integridad la da la cadena de huellas.",[48,88,89,92],{},[23,90,91],{},"El QR de cotejo",": el cuadradito que va impreso en el ticket y que permite a\ncualquiera comprobar la factura contra la AEAT.",[19,94,95],{},"La huella es la parte que más miedo da y la que menos problemas nos dio: se puede validar\nen local contra vectores de prueba conocidos antes de hablar con nadie. Recomendación:\nhacedlo. Llegar a la AEAT con la huella ya validada te quita una variable de encima cuando\nempiecen los rechazos.",[14,97,99],{"id":98},"error-4104-nif-de-obligadoemisión-no-identificado","Error 4104 — «NIF de ObligadoEmisión no identificado»",[19,101,102],{},"El primero, y el más desconcertante, porque el NIF estaba bien.",[19,104,105,106,109,110,113],{},"La regla es que el NIF del obligado a emitir tiene que estar ",[23,107,108],{},"identificado en el censo de\nla AEAT",", y la identificación ",[23,111,112],{},"va con el nombre",": no basta con mandar el número\ncorrecto, tiene que cuadrar con la razón social que Hacienda tiene registrada para ese NIF.",[19,115,116,119,120,123],{},[23,117,118],{},"Qué lo arregló:"," usar como ",[55,121,122],{},"NombreRazonEmisor"," exactamente el nombre que figura en el\ncertificado. El certificado ya lleva dentro el par NIF + nombre tal y como la AEAT lo\nconoce; cualquier variación tuya —una S.L. abreviada, un acento de más— y no cuadra.",[14,125,127],{"id":126},"error-1189-faltan-destinatarios","Error 1189 — «Faltan Destinatarios»",[19,129,130],{},"Este es de reglas cruzadas, y es el típico que te hace perder una tarde.",[19,132,133,134,137,138,141],{},"El bloque ",[55,135,136],{},"Destinatarios"," ",[23,139,140],{},"no es opcional a tu gusto",": depende del tipo de factura.",[143,144,145,152],"ul",{},[48,146,147,148,151],{},"Las ",[23,149,150],{},"F1, F3 y las rectificativas R1–R4"," exigen al menos un destinatario.",[48,153,147,154,157],{},[23,155,156],{},"F2 (simplificada) y R5"," no pueden llevarlo. Si lo mandas, te rechaza.",[19,159,160],{},"O sea que el mismo campo es obligatorio o está prohibido según una letra que va tres\nniveles más arriba en el XML.",[19,162,163,165,166,169],{},[23,164,118],{}," para la prueba, emitir como ",[23,167,168],{},"F2",", la simplificada, que es el ticket\nde toda la vida y no lleva destinatario. Para las facturas nominativas hay que mandar el\nbloque, y ahí aparece el siguiente escalón: según la clave de régimen, el NIF del cliente\ntambién tiene que estar identificado en el censo. Es decir, el problema del 4104 otra vez,\npero ahora con el NIF de tu cliente, que tú no controlas.",[14,171,173],{"id":172},"error-1110-nif-de-sistemainformatico-no-identificado","Error 1110 — «NIF de SistemaInformatico no identificado»",[19,175,176],{},"El más fácil de entender mal, y por eso el que merece el artículo entero.",[19,178,179,180,183,184,187,188,191],{},"En el registro hay un bloque ",[55,181,182],{},"SistemaInformatico"," que ",[23,185,186],{},"no habla de tu empresa ni de la de\ntu cliente: habla del programa",". Quién lo fabrica. Si tú vendes software de facturación,\nese bloque lleva ",[23,189,190],{},"tu"," NIF como productor, no el del comercio que está emitiendo la\nfactura.",[19,193,194],{},"Y lleva unos cuantos campos obligatorios que es fácil dejarse:",[143,196,197,210,215,225],{},[48,198,199,202,203,137,206,209],{},[55,200,201],{},"IdSistemaInformatico",": exactamente ",[23,204,205],{},"2 caracteres",[55,207,208],{},"[A-Z0-9]",".",[48,211,212,209],{},[55,213,214],{},"NombreSistemaInformatico",[48,216,217,220,221,224],{},[55,218,219],{},"TipoUsoPosibleSoloVerifactu"," y ",[55,222,223],{},"TipoUsoPosibleMultiOT",": los dos obligatorios.",[48,226,227],{},"El NIF del productor, identificado en censo — con su nombre, igual que en el 4104.",[19,229,230,232],{},[23,231,118],{}," lo mismo que el 4104. El nombre, tal y como está en el certificado.",[14,234,236],{"id":235},"las-reglas-que-sí-conviene-leerse-antes","Las reglas que sí conviene leerse antes",[19,238,239],{},"Después del tercer rechazo dejamos de ir a ciegas y nos leímos el catálogo oficial de\nvalidaciones de la AEAT entero. Fue la decisión más rentable de todo el proceso: a partir\nde ahí, la factura pasó todas las validaciones aplicables a la primera. Las que más fácil\nes incumplir sin enterarte:",[143,241,242,251,272,281,287,293],{},[48,243,244,247,248,209],{},[23,245,246],{},"Fecha de expedición",": no puede ser futura ni ",[23,249,250],{},"anterior al 28\u002F10\u002F2024",[48,252,253,256,257,137,260,137,263,137,266,137,269,209],{},[23,254,255],{},"Número de serie",": ASCII 32–126, y prohibidos los caracteres ",[55,258,259],{},"\"",[55,261,262],{},"'",[55,264,265],{},"\u003C",[55,267,268],{},">",[55,270,271],{},"=",[48,273,274,277,278,209],{},[23,275,276],{},"F2 simplificada",": la suma de base + cuota no puede pasar de ",[23,279,280],{},"3.000 €",[48,282,283,286],{},[23,284,285],{},"Tipo impositivo",": solo se aceptan los del catálogo (0, 2, 4, 5, 7,5, 10 y 21).",[48,288,289,292],{},[23,290,291],{},"Cuadres",": la cuota repercutida tiene que ser base × tipo, la cuota total la suma de\nlas repercutidas y el importe total la suma de todo. Con margen de céntimos, pero se\ncomprueba.",[48,294,295,298,299,302],{},[23,296,297],{},"Fecha y hora de generación del registro",": si se te va al futuro respecto al reloj de\nla AEAT es ",[23,300,301],{},"aviso",", no rechazo. Conviene saber cuáles son avisos y cuáles te tumban el\nenvío.",[14,304,306],{"id":305},"lo-que-nos-llevamos","Lo que nos llevamos",[19,308,309],{},"Tres conclusiones, por si os sirven:",[45,311,312,318,324],{},[48,313,314,317],{},[23,315,316],{},"Casi todos los rechazos iniciales son de identidad, no de contenido."," El XML estaba\nbien; lo que fallaba era quién decía ser cada uno. Empezad por ahí.",[48,319,320,323],{},[23,321,322],{},"Validad la huella en local antes de enviar nada."," Es la única parte que podéis dar\npor buena sin depender de la AEAT.",[48,325,326,329],{},[23,327,328],{},"Leed el catálogo de validaciones antes de la cuarta ronda, no después."," Ir corrigiendo\nerror por error es lento y encima te da una falsa sensación de avance.",[19,331,332,333,340],{},"Todo esto lo hemos hecho para llevarlo a ",[334,335,339],"a",{"href":336,"rel":337},"https:\u002F\u002Fatellum.com",[338],"nofollow","Atellum",", nuestro programa de\ngestión para tiendas y talleres pequeños: la idea es que quien lo use no tenga que saber\nnada de lo anterior, que es exactamente el motivo por el que nos hemos comido nosotros los\ntres errores.",[19,342,343],{},"Si estáis con la misma pelea y os atascáis en un código concreto, escribidnos y os decimos\nqué era en nuestro caso.",{"title":345,"searchDepth":346,"depth":346,"links":347},"",2,[348,349,350,351,352,353,354],{"id":16,"depth":346,"text":17},{"id":39,"depth":346,"text":40},{"id":98,"depth":346,"text":99},{"id":126,"depth":346,"text":127},{"id":172,"depth":346,"text":173},{"id":235,"depth":346,"text":236},{"id":305,"depth":346,"text":306},"2026-08-04","Implementamos VeriFactu desde cero para nuestro ERP y lo enviamos a preproducción de la AEAT. Nos comimos los errores 4104, 1189 y 1110 uno detrás de otro. Aquí está qué significa cada uno y qué había que cambiar.","md","\u002Fog\u002Fog-default.png",{},true,"verifactu-three-aeat-errors","\u002Fes\u002Fblog\u002Fverifactu-tres-errores-aeat",{"title":8,"description":356},false,"es\u002Fblog\u002Fverifactu-tres-errores-aeat",[367,368,369,370],"VeriFactu","AEAT","Facturación","Dart","La9nw15Boilr4Y2h57WZ59uBgAK3KhNltq4sxNlHly4",1787312492447]