Imprimir página | Cerrar ventana

Veri*Factu Capítulo 2...

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86929
Fecha de impresión: 26/Marzo/2026 a las 13:27


Tema: Veri*Factu Capítulo 2...
Publicado por: Al_loro
Asunto: Veri*Factu Capítulo 2...
Fecha de publicación: 22/Mayo/2024 a las 13:18
Buenos días a todos, ya tenemos el borrador de como va a ser este servicio OBLIGATORIO para cualquiera de los que emitimos facturas, es decir, cualquier negocio.

Por si os vale de algo os adjunto el enlace de la descarga del PDF en el que muestran el borrador.

Yo sigo sin saber como se usa un servicio web con certificado digital desde VBA. si alguien sabe como se usa, se agradece la ayuda.

https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Factu_Descripcion_ServicioWeb_v0.3.0.pdf

Gracias a todos.


-------------
Gracias a todos los usuarios de este foro



Respuestas:
Publicado por: Guiri
Fecha de publicación: 06/Noviembre/2024 a las 18:58
No he visto que estuviese cerrado y no me gusta revivir conversaciones antiguas, pero como no tenia contestación y estoy buscado esa misma información, os voy a incluir unas funciones para este tema y firmar con autofirma que debe estar instalado.

Hay que tener en cuenta, (TipoFactura) lo siguiente:

Tipos de Factura Comunes

  1. F1 - Factura ordinaria

    • Factura estándar para operaciones habituales.
  2. F2 - Factura simplificada

    • Utilizada en operaciones donde no es obligatorio detallar toda la información del cliente.
  3. F3 - Factura rectificativa

    • Emitida para corregir errores o modificaciones en una factura anterior.
  4. F4 - Factura recapitulativa

    • Agrupa varias operaciones en un solo documento.

Tipos de Factura Especiales

  1. R1 - Factura rectificativa ordinaria

    • Corrige errores de facturas ordinarias.
  2. R2 - Factura rectificativa simplificada

    • Corrige facturas simplificadas.
  3. R3 - Factura rectificativa recapitulativa

    • Corrige facturas recapitulativas.

Cómo elegir el tipo de factura:

  • Factura ordinaria (F1): La más común, utilizada para ventas regulares.
  • Factura rectificativa (F3): Cuando necesitas corregir un error o ajustar un importe.
  • Factura simplificada (F2): Para operaciones menores o cuando la normativa lo permite.
CuotaTotal  es el importe total de IVA separador decimal el punto.
ImporteTotal es el importe total de la factura IVA incluido.

La funcion que genera el xml contempla si va a ser Alta, Modificación o Evento (TipoRegistro)


Option Compare Database
Option Explicit

' Tipo de datos personalizado para almacenar la información del registro
Type RegistroAlta
    IDEmisorFactura As String
    NumSerieFactura As String
    FechaExpedicionFactura As String
    TipoFactura As String
    CuotaTotal As String
    ImporteTotal As String
    Huella As String
    FechaHoraHusoGenRegistro As String
End Type

Function CalcularHuella(Registro As RegistroAlta, TipoRegistro As String) As String
    Dim DataToHash As String
    Dim oSHA256 As Object
    Dim HashBytes() As Byte
    Dim HashString As String
    Dim i As Integer

    Select Case LCase(TipoRegistro)
        Case "alta"
            DataToHash = "IDEmisorFactura=" & Registro.IDEmisorFactura & _
                         "&NumSerieFactura=" & Registro.NumSerieFactura & _
                         "&FechaExpedicionFactura=" & Registro.FechaExpedicionFactura & _
                         "&TipoFactura=" & Registro.TipoFactura & _
                         "&CuotaTotal=" & Registro.CuotaTotal & _
                         "&ImporteTotal=" & Registro.ImporteTotal & _
                         "&Huella=" & Registro.Huella & _
                         "&FechaHoraHusoGenRegistro=" & Registro.FechaHoraHusoGenRegistro

        Case "modificacion"
            DataToHash = "IDEmisorFactura=" & Registro.IDEmisorFactura & _
                         "&NumSerieFactura=" & Registro.NumSerieFactura & _
                         "&FechaExpedicionFactura=" & Registro.FechaExpedicionFactura & _
                         "&Huella=" & Registro.Huella & _
                         "&FechaHoraHusoGenRegistro=" & Registro.FechaHoraHusoGenRegistro

        Case "evento"
            DataToHash = "NIF=" & Registro.IDEmisorFactura & _
                         "&IdSistemaInformatico=SYS001&TipoEvento=" & Registro.TipoFactura & _
                         "&HuellaEvento=" & Registro.Huella & _
                         "&FechaHoraHusoGenEvento=" & Registro.FechaHoraHusoGenRegistro

        Case Else
            MsgBox "Tipo de registro no reconocido para cálculo de huella."
            Exit Function
    End Select

    ' Calcular hash SHA-256
    Set oSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")
    HashBytes = oSHA256.ComputeHash_2(StrConv(DataToHash, vbFromUnicode))

    ' Convertir a hexadecimal
    For i = LBound(HashBytes) To UBound(HashBytes)
        HashString = HashString & LCase(Right("00" & Hex(HashBytes(i)), 2))
    Next i

    CalcularHuella = UCase(HashString)
End Function


Function GenerarXML(Registro As RegistroAlta, TipoRegistro As String) As String
    Dim XMLString As String
    
    Select Case LCase(TipoRegistro)
        Case "alta"
            ' XML para Registro de Alta
            XMLString = "<RegistroAlta>" & vbCrLf & _
                        "    <IDFactura>" & vbCrLf & _
                        "        <IDEmisorFactura>" & Registro.IDEmisorFactura & "</IDEmisorFactura>" & vbCrLf & _
                        "        <NumSerieFactura>" & Registro.NumSerieFactura & "</NumSerieFactura>" & vbCrLf & _
                        "        <FechaExpedicionFactura>" & Registro.FechaExpedicionFactura & "</FechaExpedicionFactura>" & vbCrLf & _
                        "    </IDFactura>" & vbCrLf & _
                        "    <TipoFactura>" & Registro.TipoFactura & "</TipoFactura>" & vbCrLf & _
                        "    <CuotaTotal>" & Registro.CuotaTotal & "</CuotaTotal>" & vbCrLf & _
                        "    <ImporteTotal>" & Registro.ImporteTotal & "</ImporteTotal>" & vbCrLf & _
                        "    <Encadenamiento>" & vbCrLf & _
                        "        <RegistroAnterior>" & vbCrLf & _
                        "            <Huella>" & Registro.Huella & "</Huella>" & vbCrLf & _
                        "        </RegistroAnterior>" & vbCrLf & _
                        "    </Encadenamiento>" & vbCrLf & _
                        "    <FechaHoraHusoGenRegistro>" & Registro.FechaHoraHusoGenRegistro & "</FechaHoraHusoGenRegistro>" & vbCrLf & _
                        "</RegistroAlta>"
        
        Case "modificacion"
            ' XML para Registro de Modificación
            XMLString = "<RegistroModificacion>" & vbCrLf & _
                        "    <IDFactura>" & vbCrLf & _
                        "        <IDEmisorFactura>" & Registro.IDEmisorFactura & "</IDEmisorFactura>" & vbCrLf & _
                        "        <NumSerieFactura>" & Registro.NumSerieFactura & "</NumSerieFactura>" & vbCrLf & _
                        "        <FechaExpedicionFactura>" & Registro.FechaExpedicionFactura & "</FechaExpedicionFactura>" & vbCrLf & _
                        "    </IDFactura>" & vbCrLf & _
                        "    <Encadenamiento>" & vbCrLf & _
                        "        <RegistroAnterior>" & vbCrLf & _
                        "            <Huella>" & Registro.Huella & "</Huella>" & vbCrLf & _
                        "        </RegistroAnterior>" & vbCrLf & _
                        "    </Encadenamiento>" & vbCrLf & _
                        "    <FechaHoraHusoGenRegistro>" & Registro.FechaHoraHusoGenRegistro & "</FechaHoraHusoGenRegistro>" & vbCrLf & _
                        "</RegistroModificacion>"
        
        Case "evento"
            ' XML para Registro de Evento
            XMLString = "<RegistroEvento>" & vbCrLf & _
                        "    <SistemaInformatico>" & vbCrLf & _
                        "        <NIF>" & Registro.IDEmisorFactura & "</NIF>" & vbCrLf & _
                        "        <NumSerie>" & Registro.NumSerieFactura & "</NumSerie>" & vbCrLf & _
                        "        <Version>1.0</Version>" & vbCrLf & _
                        "    </SistemaInformatico>" & vbCrLf & _
                        "    <TipoEvento>" & Registro.TipoFactura & "</TipoEvento>" & vbCrLf & _
                        "    <Encadenamiento>" & vbCrLf & _
                        "        <HuellaEvento>" & Registro.Huella & "</HuellaEvento>" & vbCrLf & _
                        "    </Encadenamiento>" & vbCrLf & _
                        "    <FechaHoraHusoGenEvento>" & Registro.FechaHoraHusoGenRegistro & "</FechaHoraHusoGenEvento>" & vbCrLf & _
                        "</RegistroEvento>"
        
        Case Else
            XMLString = "Error: Tipo de Registro no reconocido."
    End Select
    
    GenerarXML = XMLString
End Function

Sub FirmarXMLConAutoFirma()
    Dim ShellCommand As String
    Dim AutoFirmaPath As String
    Dim InputXML As String
    Dim OutputXML As String
    
    ' Ruta al ejecutable de AutoFirma
    AutoFirmaPath = "C:\Program Files\AutoFirma\AutoFirma.jar"
    
    ' Archivos de entrada y salida
    InputXML = "C:\Ruta\RegistroAlta.xml"
    OutputXML = "C:\Ruta\RegistroAltaFirmado.xml"
    
    ' Comando para firmar el XML
    ShellCommand = "java -jar """ & AutoFirmaPath & """ sign -i """ & InputXML & """ -o """ & OutputXML & """ -format XAdES"
    
    ' Ejecutar el comando
    Shell ShellCommand, vbNormalFocus
    
    MsgBox "Firma completada. Archivo firmado en: " & OutputXML
End Sub






Publicado por: Guiri
Fecha de publicación: 06/Noviembre/2024 a las 19:03
Se me ha olvidado, FechaHoraHusoGenRegistro es en formato ISO aaaa-mm-dd y FechaExpedicionFactura es en formato dd-mm-aaaa

Un Saludo


Publicado por: Al_loro
Fecha de publicación: 06/Noviembre/2024 a las 19:11
Pues que menos que darte las gracias.
Yo sigo trabajando en ello

-------------
Gracias a todos los usuarios de este foro


Publicado por: Guiri
Fecha de publicación: 06/Noviembre/2024 a las 19:21
Estoy buscando todos los campos de los registros para poder acabar de crear el xml, si alguien los tiene me los puede pasar. siento escribir tantos mensajes sin respuestas, pero segun ordeno las ideas escribo.


Publicado por: Al_loro
Fecha de publicación: 06/Noviembre/2024 a las 19:25
Los tengo todos.
Te los paso mañana. Te paso el XLSX con todos los datos solicitados . Si usas Soapui y le pones la dirección del servicio te dará todos los campos necesarios pare el envío y en la Excel ves los datos solicitados

-------------
Gracias a todos los usuarios de este foro


Publicado por: Al_loro
Fecha de publicación: 07/Noviembre/2024 a las 09:41
Buenos días, lo prometido es deuda.

Todos los campos necesarios y toda la información para crear la factura con VERI*FACTU, los tienes disponibles en la web
 
https://www.agenciatributaria.es/AEAT.desarrolladores/Desarrolladores/_menu_/Documentacion/Sistemas_Informaticos_de_Facturacion_y_Sistemas_VERI_FACTU/Sistemas_Informaticos_de_Facturacion_y_Sistemas_VERI_FACTU.html

Mira el formato exacto de este:

https://www.agenciatributaria.es/AEAT.desarrolladores/Desarrolladores/_menu_/Documentacion/Sistemas_Informaticos_de_Facturacion_y_Sistemas_VERI_FACTU/Documento_Diseno_de_registro_de_facturacion/Documento_Diseno_de_registro_de_facturacion.html" rel="nofollow - https://www.agenciatributaria.es/AEAT.desarrolladores/Desarrolladores/_menu_/Documentacion/Sistemas_Informaticos_de_Facturacion_y_Sistemas_VERI_FACTU/Documento_Diseno_de_registro_de_facturacion/Documento_Diseno_de_registro_de_facturacion.html


-------------
Gracias a todos los usuarios de este foro


Publicado por: Guiri
Fecha de publicación: 07/Noviembre/2024 a las 11:08
Gracias por la información. Ahora queda lo del tema de comunicación, que estoy un poco pez. Me instalalare lo del soapui.

Un saludo



Publicado por: Al_loro
Fecha de publicación: 07/Noviembre/2024 a las 11:42
Esa es la parte compleja.

En la comunicación te devuelve, primer el qr que tienes que poner en la factura y el csv y la validación de la misma.
Todo está informado en esa plataforma. Mira bien lo de la huella, tendrás que pasar la huella de la anterior  factura en caso de no ser la primera.

Por cierto, ese código que has escrito, ¿en qué versión de VBA lo has hecho?
Saludos.


-------------
Gracias a todos los usuarios de este foro


Publicado por: Guiri
Fecha de publicación: 07/Noviembre/2024 a las 15:11
No programo en mi día a día. Pero me gusta estar al día y como hace tiempo me hice un pequeño programa para gestión de servicios enlazandondo con Factusol para el tema de la facturación, tenia curiosidad de como se haría lo del tema de veri*factu y me puse a mirar y probar.

   Pues uso access 2016 32 bits en un ordenador en otro access 2019 64 bits y los dos con MZTOOLS 8.0.3.3934.


Publicado por: pascual14
Fecha de publicación: 10/Noviembre/2024 a las 19:06
uff menudo lio ahora...y al final hay que tener todo para el día 1 de julio de 2025? 


Publicado por: Mihura
Fecha de publicación: 10/Noviembre/2024 a las 19:44
Cualquiera sabe ... han vuelto a retrasarlo, hablan del 26, incluso he leído 1-ene-27



-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: pascual14
Fecha de publicación: 12/Noviembre/2024 a las 18:21
Madre mía!! nos vuelven locos. Gracias Mihura!


Publicado por: Chavalote
Fecha de publicación: 19/Noviembre/2024 a las 00:38
Hola que tal, soy nuevo en el foro, aunque llevo ya tiempo diseñando Veri*Factu (con envío inmediato). Desde que sacaron la ley antifraude sospeché que iba a ser casi igual que ticketbai, así que me empape de ticketbai y aproveche las webs de pruebas y para pillar conocimientos sobre esto de formar los xmls, enviarlos, generar el qr, el pdf, los tipos de facturas, etc..
Pero tengo un par de dudas.
Aunque, según la orden Ministerial los que envían no tendrán que firmas los xmls, he visto un punto en la OM que no está claro sobre ese tema, ya que las incidencias en los envios hay que guardarlas de alguna forma que aún no han dejado claro, así que no me fio y quiero meterme en las firmas.
Quería saber si has calculado cuanto tiempo tarda en ejecutar el jar de autofirma y si lo has probafo en un SO eindows XP, ya que tengo varios clientes aun con ese SO:
Comando para firmar el XML
    ShellCommand = "java -jar """ & AutoFirmaPath & """ sign -i """ & InputXML & """ -o """ & OutputXML & """ -format XAdES"
Por cierto las firmas no.llevan también unos parámetros que han dado ellos?, lo miraré.
Ya os iré diciendo también como he hecho el resto si tenéis alguna duda y puedo echar una mano, no solo en la parte de programación, ya me he empapado también la parte fiscal, pero claro, solo de la parte que me interesa: facturas simplificadas, sustitutivas, facturas ordinarias, rectificativas y las subsanacioneaz que es otro cantar. Como estaréis viendo el tema es un poco lioso, no solo es hacer el xml y enviarlo, hay que tener en cuenta mil historias. Enfin, no me enorrlo más que os lo voy a contar todo en un solo post.
Saludos y adelante que se puede, aunque no dejéis pasar un minuto que esto no se hace en 2 meses, esto tiene muuuucha faena y os la jugáis, aquí equivocarse en el desarrollo te puede traer problemas gordos.


Publicado por: Al_loro
Fecha de publicación: 10/Diciembre/2024 a las 16:54
Buenas tardes a todos.

Las fechas oficiales PUBLICADAS son:

01/01/2026 sujetos pasivos contribuyentes del Impuesto sobre Sociedades),
01/07/2026 para el resto.

La publicación se puede ver en el Colegio de Economistas, en esta URL tan larga tenéis el pdf.

https://reaf.economistas-desarrollo.es/?mailpoet_router&endpoint=track&action=click&data=WyIxNjQyMCIsIjRjNzAxZDJjZjZjYjQ2YTYzYjdhNjc5ZTJkY2JhMjFiIiwiNDAwIiwiNmUyOTdhZDU5ZGJlIixmYWxzZV0

Saludos.


-------------
Gracias a todos los usuarios de este foro


Publicado por: ninja
Fecha de publicación: 11/Diciembre/2024 a las 10:23
Muchas gracias por el código. Estoy probandolo y me da error de automatización en :
Set oSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")


Publicado por: pascual14
Fecha de publicación: 16/Diciembre/2024 a las 19:05
Gracias Mihura por la info. Es decir que el 1 de enero de 2026 para sociedades y el 1 de julio de 2026 para el resto? ya me imaginaba que en el 2025 no pueden poner esto en marcha. Y cómo lo tenemos en access para conectarnos con el servicio, recibir el código de verificación e imprimirlo en un qr?
Tengo un cliente que me está machacando con que tengo que certificar el software con hacienda y he leido que va a ser obligatorio para los desarrolladores ¿qué hay que hacer aqui? Gracias 


Publicado por: Mihura
Fecha de publicación: 16/Diciembre/2024 a las 19:22
Ni se te ocurra certificarlo, hacienda te va a brear a inspecciones y multas (dicho por un técnico de la misma AEAT).

Cuando esté desarrollado le pones poder subir datos a Verifactu y que sea él el responsable.

Yo estoy a ver si desarrollo una aplicación (un complemento para Access / Excel ...) para poder subir facturas y obtener los QR, pero todavía no me he puesto, será cuando alguien me contrate :-P.

Un saludo.




-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: MBIN1965
Fecha de publicación: 04/Enero/2025 a las 13:44
Pongo aquí mis pequeñas aportaciones al tema.
En primer lugar, para la generación de los códigos QR utilizo un programa gratuito que se llama SimpleCodeGenerator que funciona perfectamente y se le puede llamar desde línea de comandos. El código QR lo puede dejar en el portapapeles, así luego lo podemos pegar en el campo gráfico de nuestra tabla de facturas o en otra tabla que los guarde con la asociación de la factura a la que corresponde.

Así que desde mi programa hecho en Omnis, genero un archivo .bat, al que luego llamo para que me genere el QR.

El archivo bat contiene una única línea:

con('SimpleCodeGenerator.exe /Clipboard "',EMP_VF_URLCOTEJO,'nif=',EMP_CIF,'&','numserie=',CAF_NUMERO,'&','fecha=',jst(dtd(CAF_FECHA),'-2NP0'),'-',jst(dtm(CAF_FECHA),'-2NP0'),'-',jst(dtcy(CAF_FECHA),'-4NP0'),'&','importe=',jst(CAF_TOTALFAC,'N2'),'"','  3')

Con esa instrucción, se genera el QR para una factura con los siguientes datos:
EMP_VF_URLCOTEJO: que es un campo que almacena la url donde se podrá comprobar el QR
EMP_CIF: CIF de la empresa que emite la factura
CAF_NUMERO: número de la factura
CAF_FECHA: fecha la factura
CAF_TOTALFAC: total de la factura.

Para el cálculo de la huella lo hago con otro archivo bat:

set archivo=%~dp0texto_huella.txt
echo El archivo a procesar es: %archivo%
powershell -Command "$hash = (Get-FileHash '%archivo%' -Algorithm SHA256).Hash; $hash | Set-Clipboard"

Los datos que se han de tener en cuenta para generar la huella se guardan previamente en el archivo texto_huella.txt.
El resultado de la huella queda también en el portapapeles, con lo cual se pega después en el campo que habilitemos para ello.


Publicado por: Al_loro
Fecha de publicación: 04/Febrero/2025 a las 12:42
Muchas gracias MBIN1965. supongo que el SimpleCodeGenerator.exe es el de nirsoft.net.
He usado algunas utilidades de ellos y funcionan bastante bien en general.

Gracias por la aportación y perdona la tardanza en contestar, pero es que no me da la vida para más.


-------------
Gracias a todos los usuarios de este foro


Publicado por: Guiri
Fecha de publicación: 20/Febrero/2025 a las 22:48
Te lo estoy diciendo sin mirar mucho pero se necesita tener alguna de estas referencias activas:
Visual Basic for Applications
Microsoft Access 16.0 Object library
ole Automation
Microsoft Office 16.0 Access database engine Object Library
Microsoft Office 16.0 Object Library
Microsoft XML, V6.0
Microsoft Scripting Runtime

me parece que xml v6. pero también tengo declarados en el modulo donde tengo las funciones esto
llevo unos meses con muy poco tiempo para dedicar.
espero te sirva.

' -----------------------------------------------------------------------------------------------------------
'  OJO la Funcion CalcularHuella utilizará la biblioteca Microsoft XML (MSXML2) para el algoritmo SHA-256.
' -----------------------------------------------------------------------------------------------------------
Private Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" _
    (phProv As Long, ByVal pszContainer As String, ByVal pszProvider As String, _
     ByVal dwProvType As Long, ByVal dwFlags As Long) As Long

Private Declare Function CryptCreateHash Lib "advapi32.dll" _
    (ByVal hProv As Long, ByVal Algid As Long, ByVal hKey As Long, _
     ByVal dwFlags As Long, phHash As Long) As Long

Private Declare Function CryptHashData Lib "advapi32.dll" _
    (ByVal hHash As Long, pbData As Any, ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long

Private Declare Function CryptGetHashParam Lib "advapi32.dll" _
    (ByVal hHash As Long, ByVal dwParam As Long, pbData As Any, pdwDataLen As Long, _
     ByVal dwFlags As Long) As Long

Private Declare Function CryptDestroyHash Lib "advapi32.dll" (ByVal hHash As Long) As Long
Private Declare Function CryptReleaseContext Lib "advapi32.dll" (ByVal hProv As Long, ByVal dwFlags As Long) As Long

Const PROV_RSA_FULL = 1
Const CRYPT_VERIFYCONTEXT = &HF0000000
Const CALG_SHA_256 = &H800C
Const HP_HASHVAL = &H2

No he podido contestar antes


Publicado por: Guiri
Fecha de publicación: 20/Febrero/2025 a las 22:52
La contestación era para Ninja


Publicado por: PGyO
Fecha de publicación: 22/Febrero/2025 a las 11:08
Por si ayuda, despues de googlear mucho a mi me funciona lo siguiente (a modo de ejemplo):

1) he instalado .net 3,5 para que no falle
Set oSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")
y he reiniciado el PC.
2)No he añadido ninguna referencia al proyecto, mas alla de las estandar.
3) he modificado el modulo verifactu de la forma que pongo a continuación, mezclando dos proyectos que funcionaban, y que a mi me fallaban.

4) he probado con el ejemplo que da la AEAT .... y funciona


mi  modulo verifactu:

'Hay que tener en cuenta, (TipoFactura) lo siguiente:
'Tipos de Factura Comunes
'F1 - Factura ordinaria

'Factura estándar para operaciones habituales.
'F2 - Factura simplificada

'Utilizada en operaciones donde no es obligatorio detallar toda la información del cliente.
'F3 - Factura rectificativa

'Emitida para corregir errores o modificaciones en una factura anterior.
'F4 - Factura recapitulativa

'Agrupa varias operaciones en un solo documento.
'Tipos de Factura Especiales
'R1 - Factura rectificativa ordinaria

'Corrige errores de facturas ordinarias.
'R2 - Factura rectificativa simplificada

'Corrige facturas simplificadas.
'R3 - Factura rectificativa recapitulativa

'Corrige facturas recapitulativas.
'Cómo elegir el tipo de factura:
'Factura ordinaria (F1): La más común, utilizada para ventas regulares.
'Factura rectificativa (F3): Cuando necesitas corregir un error o ajustar un importe.
'Factura simplificada (F2): Para operaciones menores o cuando la normativa lo permite.
'CuotaTotal  es el importe total de IVA separador decimal el punto.
'ImporteTotal es el importe total de la factura IVA incluido.

'La funcion que genera el xml contempla si va a ser Alta, Modificación o Evento (TipoRegistro)


Option Compare Database
Option Explicit

' Tipo de datos personalizado para almacenar la información del registro
Type RegistroAlta
    IDEmisorFactura As String
    NumSerieFactura As String
    FechaExpedicionFactura As String
    TipoFactura As String
    CuotaTotal As String
    ImporteTotal As String
    Huella As String
    FechaHoraHusoGenRegistro As String
End Type

Sub Test()
    Dim sIn As String, sOut As String
    Dim sH As String, sSecret As String
    Dim aIn As RegistroAlta
    
    'insert the text to hash within the sIn quotes
    'and for selected procedures a string for the secret key
    sIn = ""
    sIn = "IDEmisorFactura=89890001K&NumSerieFactura=12345678/G33&FechaExpedicionFactura=01-01-2024&TipoFactura=F1&CuotaTotal=12.35&ImporteTotal=123.45&Huella=&FechaHoraHusoGenRegistro=2024-01-01T19:20:30+01:00”"
    aIn.IDEmisorFactura = "89890001K"
    aIn.NumSerieFactura = "12345678/G33"
    aIn.FechaExpedicionFactura = "01-01-2024"
    aIn.TipoFactura = "F1"
    aIn.CuotaTotal = "12.35"
    aIn.ImporteTotal = "123.45"
    aIn.Huella = ""
    aIn.FechaHoraHusoGenRegistro = "2024-01-01T19:20:30+01:00"

    
    sH = CalcularHuella(aIn, "alta")
    Debug.Print sH & vbNewLine & Len(sH) & " characters in length"
    MsgBox sH & vbNewLine & Len(sH) & " characters in length"
End Sub

Function CalcularHuella(Registro As RegistroAlta, TipoRegistro As String) As String
    Dim DataToHash As String
    Dim oT As Object, oSHA256 As Object
    Dim HashBytes(), TextToHash() As Byte
    Dim HashString As String
    Dim i As Integer

    Select Case LCase(TipoRegistro)
        Case "alta"
            DataToHash = "IDEmisorFactura=" & Registro.IDEmisorFactura & _
                         "&NumSerieFactura=" & Registro.NumSerieFactura & _
                         "&FechaExpedicionFactura=" & Registro.FechaExpedicionFactura & _
                         "&TipoFactura=" & Registro.TipoFactura & _
                         "&CuotaTotal=" & Registro.CuotaTotal & _
                         "&ImporteTotal=" & Registro.ImporteTotal & _
                         "&Huella=" & Registro.Huella & _
                         "&FechaHoraHusoGenRegistro=" & Registro.FechaHoraHusoGenRegistro

        Case "modificacion"
            DataToHash = "IDEmisorFactura=" & Registro.IDEmisorFactura & _
                         "&NumSerieFactura=" & Registro.NumSerieFactura & _
                         "&FechaExpedicionFactura=" & Registro.FechaExpedicionFactura & _
                         "&Huella=" & Registro.Huella & _
                         "&FechaHoraHusoGenRegistro=" & Registro.FechaHoraHusoGenRegistro

        Case "evento"
            DataToHash = "NIF=" & Registro.IDEmisorFactura & _
                         "&IdSistemaInformatico=SYS001&TipoEvento=" & Registro.TipoFactura & _
                         "&HuellaEvento=" & Registro.Huella & _
                         "&FechaHoraHusoGenEvento=" & Registro.FechaHoraHusoGenRegistro

        Case Else
            MsgBox "Tipo de registro no reconocido para cálculo de huella."
            Exit Function
    End Select
    HashString = SHA_256(DataToHash)
    ' Calcular hash SHA-256
    'Set oSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")
    'HashBytes = oSHA256.ComputeHash_2(StrConv(DataToHash, vbFromUnicode))
    
    ' Convertir a hexadecimal
    'For i = LBound(HashBytes) To UBound(HashBytes)
    '    HashString = HashString & LCase(Right("00" & Hex(HashBytes(i)), 2))
    'Next i

    CalcularHuella = UCase(HashString)
End Function

Function SHA_256(sIn As String, Optional bB64 As Boolean = 0) As String
    'Set a reference to mscorlib 4.0 64-bit ¿? ->NO
    'Check that Net Framework 3.5 (includes .Net 2 and .Net 3 is installed in windows
    'and not just Net Advanced Services
    
    'Test with empty string input:
    '64 Hex:   e3b0c44298f...etc
    '44 Base-64:   47DEQpj8HBSa+/...etc
    
    Dim oT As Object, oSHA256 As Object
    Dim TextToHash() As Byte, bytes() As Byte
    
    Set oT = CreateObject("System.Text.UTF8Encoding")
    Set oSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")
    
    TextToHash = oT.GetBytes_4(sIn)
    bytes = oSHA256.ComputeHash_2((TextToHash))
    
    If bB64 = True Then
       SHA_256 = ConvToBase64String(bytes)
    Else
       SHA_256 = ConvToHexString(bytes)
    End If
    
    Set oT = Nothing
    Set oSHA256 = Nothing
    
End Function

Private Function ConvToBase64String(vIn As Variant) As Variant
    'Check that Net Framework 3.5 (includes .Net 2 and .Net 3 is installed in windows
    'and not just Net Advanced Services
   
   Dim oD As Object
      
    Set oD = CreateObject("MSXML2.DOMDocument")
      With oD
        .LoadXML "<root />"
        .DocumentElement.DataType = "bin.base64"
        .DocumentElement.nodeTypedValue = vIn
      End With
    ConvToBase64String = Replace(oD.DocumentElement.Text, vbLf, "")
    
    Set oD = Nothing

End Function

Private Function ConvToHexString(vIn As Variant) As Variant
    'Check that Net Framework 3.5 (includes .Net 2 and .Net 3 is installed in windows
    'and not just Net Advanced Services
    
    Dim oD As Object
      
    Set oD = CreateObject("MSXML2.DOMDocument")
      
      With oD
        .LoadXML "<root />"
        .DocumentElement.DataType = "bin.Hex"
        .DocumentElement.nodeTypedValue = vIn
      End With
    ConvToHexString = Replace(oD.DocumentElement.Text, vbLf, "")
    
    Set oD = Nothing

End Function


Function GenerarXML(Registro As RegistroAlta, TipoRegistro As String) As String
    Dim XMLString As String
    
    Select Case LCase(TipoRegistro)
        Case "alta"
            ' XML para Registro de Alta
            XMLString = "<RegistroAlta>" & vbCrLf & _
                        "    <IDFactura>" & vbCrLf & _
                        "        <IDEmisorFactura>" & Registro.IDEmisorFactura & "</IDEmisorFactura>" & vbCrLf & _
                        "        <NumSerieFactura>" & Registro.NumSerieFactura & "</NumSerieFactura>" & vbCrLf & _
                        "        <FechaExpedicionFactura>" & Registro.FechaExpedicionFactura & "</FechaExpedicionFactura>" & vbCrLf & _
                        "    </IDFactura>" & vbCrLf & _
                        "    <TipoFactura>" & Registro.TipoFactura & "</TipoFactura>" & vbCrLf & _
                        "    <CuotaTotal>" & Registro.CuotaTotal & "</CuotaTotal>" & vbCrLf & _
                        "    <ImporteTotal>" & Registro.ImporteTotal & "</ImporteTotal>" & vbCrLf & _
                        "    <Encadenamiento>" & vbCrLf & _
                        "        <RegistroAnterior>" & vbCrLf & _
                        "            <Huella>" & Registro.Huella & "</Huella>" & vbCrLf & _
                        "        </RegistroAnterior>" & vbCrLf & _
                        "    </Encadenamiento>" & vbCrLf & _
                        "    <FechaHoraHusoGenRegistro>" & Registro.FechaHoraHusoGenRegistro & "</FechaHoraHusoGenRegistro>" & vbCrLf & _
                        "</RegistroAlta>"
        
        Case "modificacion"
            ' XML para Registro de Modificación
            XMLString = "<RegistroModificacion>" & vbCrLf & _
                        "    <IDFactura>" & vbCrLf & _
                        "        <IDEmisorFactura>" & Registro.IDEmisorFactura & "</IDEmisorFactura>" & vbCrLf & _
                        "        <NumSerieFactura>" & Registro.NumSerieFactura & "</NumSerieFactura>" & vbCrLf & _
                        "        <FechaExpedicionFactura>" & Registro.FechaExpedicionFactura & "</FechaExpedicionFactura>" & vbCrLf & _
                        "    </IDFactura>" & vbCrLf & _
                        "    <Encadenamiento>" & vbCrLf & _
                        "        <RegistroAnterior>" & vbCrLf & _
                        "            <Huella>" & Registro.Huella & "</Huella>" & vbCrLf & _
                        "        </RegistroAnterior>" & vbCrLf & _
                        "    </Encadenamiento>" & vbCrLf & _
                        "    <FechaHoraHusoGenRegistro>" & Registro.FechaHoraHusoGenRegistro & "</FechaHoraHusoGenRegistro>" & vbCrLf & _
                        "</RegistroModificacion>"
        
        Case "evento"
            ' XML para Registro de Evento
            XMLString = "<RegistroEvento>" & vbCrLf & _
                        "    <SistemaInformatico>" & vbCrLf & _
                        "        <NIF>" & Registro.IDEmisorFactura & "</NIF>" & vbCrLf & _
                        "        <NumSerie>" & Registro.NumSerieFactura & "</NumSerie>" & vbCrLf & _
                        "        <Version>1.0</Version>" & vbCrLf & _
                        "    </SistemaInformatico>" & vbCrLf & _
                        "    <TipoEvento>" & Registro.TipoFactura & "</TipoEvento>" & vbCrLf & _
                        "    <Encadenamiento>" & vbCrLf & _
                        "        <HuellaEvento>" & Registro.Huella & "</HuellaEvento>" & vbCrLf & _
                        "    </Encadenamiento>" & vbCrLf & _
                        "    <FechaHoraHusoGenEvento>" & Registro.FechaHoraHusoGenRegistro & "</FechaHoraHusoGenEvento>" & vbCrLf & _
                        "</RegistroEvento>"
        
        Case Else
            XMLString = "Error: Tipo de Registro no reconocido."
    End Select
    
    GenerarXML = XMLString
End Function

Sub FirmarXMLConAutoFirma()
    Dim ShellCommand As String
    Dim AutoFirmaPath As String
    Dim InputXML As String
    Dim OutputXML As String
    
    ' Ruta al ejecutable de AutoFirma
    AutoFirmaPath = "C:\Program Files\AutoFirma\AutoFirma.jar"
    
    ' Archivos de entrada y salida
    InputXML = "C:\Ruta\RegistroAlta.xml"
    OutputXML = "C:\Ruta\RegistroAltaFirmado.xml"
    
    ' Comando para firmar el XML
    ShellCommand = "java -jar """ & AutoFirmaPath & """ sign -i """ & InputXML & """ -o """ & OutputXML & """ -format XAdES"
    
    ' Ejecutar el comando
    Shell ShellCommand, vbNormalFocus
    
    MsgBox "Firma completada. Archivo firmado en: " & OutputXML
End Sub



-------------
Compartir conocimiento nos hace crecer a todos


Publicado por: PGyO
Fecha de publicación: 22/Febrero/2025 a las 11:25
Respecto al código QR he seguido el proyecto de Github:
VbQRCodegen-master
con cuidado porque hay una modificación del modulo .bas que hace que funcione (tiene una funcion de conversion adicional QRCodegenConvertToData) y es facil descargar la desactualizada sin querer.

simplemente con poner en el informe un objeto picture y cambiar su propiedad PictureData tenemos el código QR en la factura:
    ImgQR.PictureData = QRCodegenConvertToData(QRCodegenBarcode(TextoQR, , , , QRCodegenEcc_MEDIUM))




-------------
Compartir conocimiento nos hace crecer a todos


Publicado por: Al_loro
Fecha de publicación: 17/Marzo/2025 a las 11:12
Buenos días a todos, en especia a Miura al que va este comentario.

Si no me equivoco, en cada factura que emitas y pases por verifactu, hay que identificar a la empresa programadora, programa, versión del programa, etc. Se indica en las claves que van en el xml que subes a hacienda, así que no nos libramos de las inspecciones y posibles sanciones.

Estas son las claves obligatorias en CADA factura emitida y subida con nuestros sistemas informáticos, con lo que estamos pillados. No puedes poner los datos del cliente porque no es una empresa de programación, a no ser que ellos accedan a ello y decir que son ellos los únicos responsables de esa instalación. Otro marrón....


<SistemaInformatico>
    <NombreRazon> </NombreRazon>
    <NIF></NIF>
    <NombreSistemaInformatico></NombreSistemaInformatico>
    <IdSistemaInformatico></IdSistemaInformatico>
    <Version></Version>"
    <NumeroInstalacion></NumeroInstalacion>
     <TipoUsoPosibleSoloVerifactu></TipoUsoPosibleSoloVerifactu>    
    <TipoUsoPosibleMultiOT>N</TipoUsoPosibleMultiOT>
    <IndicadorMultiplesOT>N</IndicadorMultiplesOT>
</SistemaInformatico>


Gracias a todos por las colaboraciones. Ya veremos quien queda vivo tras esta "criba".



-------------
Gracias a todos los usuarios de este foro


Publicado por: Mihura
Fecha de publicación: 17/Marzo/2025 a las 11:19
Una cosa es que emitas las facturas y otra que las 'subas' (puede que ni siquiera tenga un programa de facturación).

Pero como dijo un ciego, ya veremos.




-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Al_loro
Fecha de publicación: 17/Marzo/2025 a las 12:23
Bueno, a estas alturas he asistido a tantos seminarios como para escribir la biblia del veri*factu.

Si haces facturas, estás obligado a verifactu. Incluso si las haces en Word o en Excel. Hay una respuesta vinculante al respecto de la inspección de AEAT. Sólo estarán exentos los que están en el SII, que ya lo hacen cada 3 días (realmente lo hacen a diario, porque hoy haces lo de hace 3 días, mañana lo de hace 2... ) y los de módulos, así como algunas actividades como alquileres y poco más. Es decir, el 90 % de la gente lo tenemos que hacer. Hacer facturas obliga a verifactu. Te puedes librar si haces la facturas "a mano", vamos a boli como se hacían antiguamente, con un taco de facturas de imprenta, pero tampoco tengo claro como se declará eso en hacienda.

Vamos que si emites facturas, aunque no tengas programa de facturación, a no ser que las hagas a boli, estás obligado a verifactu. Y nosotros, como desarrolladores, obligados a decir que somos los desarrolladores.... Jodidos estamos....


-------------
Gracias a todos los usuarios de este foro


Publicado por: pascual14
Fecha de publicación: 18/Marzo/2025 a las 09:27
Acabo de leer esta noticia, aunque ya lo comentó Mihura y Al_loro. Nos están complicando la vida. esa certificación propia ¿es complicada? es mejor no hacerla por lo que me dicen, pero si no la haces...Esto va a hacer que muchos dejemos de hacer programas de facturación a medida.


https://www.autonomosyemprendedor.es/articulo/hacienda/hacienda-tiene-listos-certificados-nuevos-programas-facturacion-autonomos-sanciones-tenerlos/20250313160028041492.html



Ed. Cambio el link al artículo enlazado


Publicado por: Al_loro
Fecha de publicación: 18/Marzo/2025 a las 14:32
La certificación es obligatoria y es muy sencilla. Simplemente haces una declaración responsable en la que firmas de tu programa hace lo que hace y lo hace bien.
El formato estará en la web de hacienda, supuestamente antes de Julio de 2025, pero tendremos tiempo hasta 2026 para firmarla.

Viene una nueva "criba" para las empresas que hacen pequeños programa de facturación a medida. O tienes volumen, o te sales. Wolters Kluwer ha sacado ya una aplicación por 9.99 al mes y en la nube para hacer el verifactu y "BARRER" el mercado. La está lanzando a través de sus partners y de las asesorías que tienen su aplicación, o sea, más de media España.

Tal vez se acabe un negocio y empiece otro, pero desde luego esto marca un antes y un después.

En fin.....


-------------
Gracias a todos los usuarios de este foro


Publicado por: pascual14
Fecha de publicación: 18/Marzo/2025 a las 17:10
Pero, si yo certifico mi software con lo que pide hacienda (no dejar modificar facturas y todo eso que nos piden) y un día mi cliente modifica una factura de alguna manera, por ejemplo accediendo a la base de datos ¿la multa me viene a mi? mi software no tiene nada para defraudar pero los clientes a veces hacen cosas que ni sabemos. El problema que seguro tenemos muchos es que nuestro software a medida está adaptado al cliente para su uso y necesidades y es complicado decirles que te tienes que ir a aplicación vertical tipo A3, factusol o similar porque seguro que no le dan las cosas que él necesita. Gracias.


Publicado por: Mihura
Fecha de publicación: 19/Marzo/2025 a las 10:28
Vamos con las excepciones:

https://www.eleconomista.es/legal/amp/13273092/bares-restaurantes-o-peluquerias-se-libran-de-la-factura-electronica-para-ventas-inferiores-a-3000-euros

Ya veremos en que queda la cosa esta, menudo culebrón nos espera.


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: pascual14
Fecha de publicación: 19/Marzo/2025 a las 11:11
Uff que locura, no se aclaran y nos están volviendo locos a todos. No sé yo si esto lo ponen en marcha en 2026...


Publicado por: Al_loro
Fecha de publicación: 24/Marzo/2025 a las 14:15
Tienes que tener el control de los datos del programa (es casi imposible).  Ahora bien, yo recomiendo firmar un contrato con el cliente para que no se tan incauto de tocarlos y provocar una sanción, por lo menos reclinas responsabilidades.

Como en las cartas de cuando jugamos a la brisca, "factura (carta) en la mesa queda presa".

Espero haber ayudado. Ojo a mi respuesta siguiente Miura..

Gracias a todos por este foro


-------------
Gracias a todos los usuarios de este foro


Publicado por: Al_loro
Fecha de publicación: 24/Marzo/2025 a las 14:24
Buenos días a todos...
Acabo de leerte Miura, y en mi opinión, que no crea sentencia, creo que estás confundiendo términos.

En dicho artículo mezcla los conceptos de la Ley Crea y Crece, con el tema de la la factura electrónica y otra bien distinta es el Verifactu. Verifactu es OBLIGATORIO para casi todas las empresas, también hay excepciones (módulos, algunas empresas patrimoniales y poco más), pero nada que ver con eso que nos dicen en ese artículo, en el que hablan de la factura electrónica.

Todo está perfectamente informado por la Agencia y además han puesto un buzón de preguntas y respuestas, así como un documento informativo en el que nos dan una guía bastante detallada.

Así que siento ser aguafiestas pero NADA que ver la Factura Electrónica con Verifactu.

Por cierto, si no me equivoco tampoco está desarrollado el reglamento de la factura electrónica, aunque se espera que sea un XML parecido al que llevamos haciendo hace 10 años con las administraciones públicas, el FACTURAE VERSIÓN XX.XX



-------------
Gracias a todos los usuarios de este foro


Publicado por: pascual14
Fecha de publicación: 24/Marzo/2025 a las 19:46
Hola, Al-Loro y donde está ese buzón de preguntas y respuestas de hacienda? Gracias


Publicado por: PGyO
Fecha de publicación: 24/Marzo/2025 a las 20:24
Publicado originalmente por pascual14 pascual14 escribió:

Pero, si yo certifico mi software con lo que pide hacienda (no dejar modificar facturas y todo eso que nos piden) y un día mi cliente modifica una factura de alguna manera, por ejemplo accediendo a la base de datos ¿la multa me viene a mi? mi software no tiene nada para defraudar pero los clientes a veces hacen cosas que ni sabemos. El problema que seguro tenemos muchos es que nuestro software a medida está adaptado al cliente para su uso y necesidades y es complicado decirles que te tienes que ir a aplicación vertical tipo A3, factusol o similar porque seguro que no le dan las cosas que él necesita. Gracias.

Perdonar si estoy equivocado, pero por lo que he leido hay dos situaciones posibles:
1) que el software se encargue de la seguridad, cosa que complica la vida muchisimo y efectivamente tiene repercusiones de responsabilidades.
2) que nada mas emitir la factura se envie a verifactu. 
En este caso, el cliente puede hacer a posteriori lo que quiera con su factura, pero la versión oficial esta en verifactu y es verifactu quien se encarga de la seguridad. en este caso será problema del cliente si altera su facturación/contabilidad y no coincide con lo emitido en su dia.
No afecta a los desarrollos locales tanto como parece. Solo hay que desarrollar la parte de transmisión y el QR de la factura (que basicamente en este hilo ya los expuse hace un mes a modo de ejemplo).
por cierto, doy las gracias por su aportación a los autores de los modulos que modifique e hice funcionar


-------------
Compartir conocimiento nos hace crecer a todos


Publicado por: PGyO
Fecha de publicación: 24/Marzo/2025 a las 20:44
https://sede.agenciatributaria.gob.es/Sede/iva/sistemas-informaticos-facturacion-verifactu.html

y en la parte de información tecnica está todo lo necesario para el desarrollo de verifactu.
en la parte 10 de presentaciones explica bien lo que un software debe cumplir dependiendo de si envia o no los datoos nada mas emitirse.


-------------
Compartir conocimiento nos hace crecer a todos


Publicado por: Al_loro
Fecha de publicación: 25/Marzo/2025 a las 17:36
Pues aquí tienes una buena base para aclararte...

https://sede.agenciatributaria.gob.es/Sede/iva/sistemas-informaticos-facturacion-verifactu/preguntas-frecuentes/sistemas-verifactu.html

hay preguntas para calentarse la cabeza de verdad.... Léelas atentamente y a ver si te aclara las ideas, a mi me resultó muy bien la lectura de este enlace.

Espero haber sido útil.



-------------
Gracias a todos los usuarios de este foro


Publicado por: pascual14
Fecha de publicación: 27/Marzo/2025 a las 12:27
Gracias a todos


Publicado por: sanzlcr
Fecha de publicación: 21/Agosto/2025 a las 16:39
Buenas,

Aunque este hilo tiene unos meses, tengo esperanzas en que me podais ayudar....

Tengo desarrollado un programa de facturacion para unos clientes y quiero adaptarlo para Verifactu, el tema es que tengo desarrollado la genearacion del fichero el envio, basicamente todo. Pero tengo el siguiente problema, cuando subo el fichero xml me da la respuesta que es correcto, si lo busco mendiante el csv que he recibido lo encuentro sin problemas, pero si quiero buscarlo con las webs de validacion:

https://prewww2.aeat.es/wlpl/TIKE-CONT/ValidarQR?nif=XXXXXXXXY&numserie=YYYY...YYYY&fecha=DD-MM-AAAA&importe=NNNNNNNNN.DD (para pruebas) o

https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=XXXXXXXXY&numserie=YYYY...YYYY&fecha=DD-MM-AAAA&importe=NNNNNNNNN.DD (produccion)

No encuentra la factura, sin embargo si la busco con el link de Sistema que emite facturas no verificables

https://prewww2.aeat.es/wlpl/TIKE-CONT/ValidarQRNoVerifactu?nif=XXXXXXXXX&numserie=YYYYYYYY&fecha=DD-MM-AAAA&importe=NNNNNNNN.DD (pruebas) o

https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQRNoVerifactu?nif=XXXXXXXXX&numserie=YYYYYYYY&fecha=DD-MM-AAAA&importe=NNNNNNNN.DD (produccion)

la encuentra pero indica :

Factura no verificable

Esta factura ha sido expedida por un sistema informático de facturación que emite facturas no verificables (es decir, que no envía información automáticamente a la Agencia Tributaria), por lo que no se puede verificar, pero puede servir de ayuda a la Agencia Tributaria en el desempeño de sus tareas de control tributario y lucha contra el fraude fiscal.

No estaba firmando el fichero xml, he probado a firmarlo con autofirma y subirlo pero me da error en la subida: Codigo[1207].Error interno en el servidor

Alguien puede ayudarme?





Publicado por: main
Fecha de publicación: 26/Agosto/2025 a las 14:34

Hay en el foro algún alma caritativa que nos proporicione un fichero, ficticio, que haya sido validado por la AEAT. Al menos de una factura de Alta.?


Publicado por: Annie
Fecha de publicación: 01/Septiembre/2025 a las 12:56
Hola a todos. 
Ya se que voy muy tarde, pero acabo de despertar con el tem VERI*FACTU. 
Soy autónoma y me hice un pequeño programa en access para generar mis facturas. Ahora, con la aplicación de la nueva norma voy muy perdida. Podríais echarme un cable?? Es que la verdad, no sé ni por donde empezar!!!
Gracias por vuestra comprensión!!


Publicado por: sanzlcr
Fecha de publicación: 02/Octubre/2025 a las 20:50
como haces el envió del registro de facturación a hacienda?


Publicado por: OmniPresente
Fecha de publicación: 14/Noviembre/2025 a las 13:52
No es obligatorio enviarlo a Hacienda; sólo generar un XML y poner el QR en la factura. Y los XMLs hay que guardarlos por si Hacienda los pidiese. Yo lo estoy haciendo así con mis aplicaciones de facturación.


Publicado por: Mihura
Fecha de publicación: 14/Noviembre/2025 a las 14:36
Pues no vas a ganar para requerimientos ... y que no derive en inspección (dicho por los técnicos de la AEAT).

-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: VMT
Fecha de publicación: 18/Noviembre/2025 a las 11:38
Hola,
la verdad que la implementación de VERI*FACTU y NO VERI*FACTU es una locura. Llevo meses en contacto con el dpto. de informática de la AEAT, a 2 correos diarios de consultas y es una locura. Ya tengo todo montado a falta de enviar el fichero, que no hay manera de enviarlo pues no coge la huella del certificado digital. Uso esta función por si alguno le ocurre lo mismo y sabe

COMO ENVIAR LOS XML con la huella... Gracias de antemano

Private Function PostSoapConCert0( _
    ByVal xmlEnvelope As String, _
    ByVal url As String, _
    ByVal soapAction As String, _
    ByVal certRef As String) As String

    On Error GoTo EH

    Dim req As Object ' WinHttp.WinHttpRequest.5.1
    Set req = CreateObject("WinHttp.WinHttpRequest.5.1")
    
    'Fuerza el uso de TLS 1.2 si no estuviera activado
    req.Option(9) = "0x00000800"
    req.setTimeouts 10000, 10000, 30000, 30000
    req.Open "POST", url, False
    
    
    ' Seleccionad el certificado del almacen CURRENT USER (mTLS)
    ' Formato: CURRENT_USER\MY\THUMBPRINT  o  LOCAL_MACHINE\MY\THUMBPRINT
    If Len(certRef) > 0 Then
        req.SetClientCertificate certRef
    End If
    
    req.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
    If Len(soapAction) > 0 Then
        req.setRequestHeader "SOAPAction", """" & soapAction & """"
    End If
        
    req.Send xmlEnvelope

    Dim st As Long
    st = req.Status
    If st < 200 Or st >= 300 Then
        Err.Raise vbObjectError + 13001, , _
            "HTTP " & st & " - " & req.statusText & vbCrLf & req.responseText
    End If

    PostSoapConCert = req.responseText
    Exit Function
EH:
    Err.Raise Err.Number, "PostSoapConCert", Err.description
End Function


Publicado por: Mihura
Fecha de publicación: 18/Noviembre/2025 a las 11:50
Joer, que liao veo yo eso ....

Un proceso típico sería:

    Const SXH_OPTION_SELECT_CLIENT_SSL_CERT = 3
    Dim objHttp As Object, XMLDoc As Object

    Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")
    objHttp.Open "POST", sURL, False
    objHttp.setRequestHeader "Content-Type", "text/xml;charset=UTF-8"
    objHttp.SetOption SXH_OPTION_SELECT_CLIENT_SSL_CERT, CertificadoNombre
    objHttp.send XmlMensajeEnvio
        
    'bucle hasta que esté completa la transacción
    Do Until objHttp.ReadyState = 4
        DoEvents
    Loop
    Set XMLDoc = objHttp.responseXML


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: VMT
Fecha de publicación: 18/Noviembre/2025 a las 12:48
Gracias Mihura, pero no funciona...


Se requiere de un certificado para completar la autenticación de cliente.

Desde VB no pilla el certificado se lo pases por CN, por Huella... si lo lanzas por PowerShell, 

$xml = Get-Content "C:\ruta\NOVERIFACTU-Fra-2510029-251118-102045-Firmada.xml" -Raw
Invoke-WebRequest -Uri "https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/ValRegistroNoVF" `
  -Method Post -Body "C:\ruta\NOVERIFACTU-Fra-2510029-251118-102045-Firmada.xml"  -ContentType "text/xml; charset=utf-8" `
  -Headers @{ SOAPAction = "https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/RequerimientoSOAP" } `
  -CertificateThumbprint "h u e l l a"

Entonces da un 0K 200, y lanzar un Power desde VB como que no mola mucho... ¿Existe algun modo de lanzarlo desde VB con el algún método?


Publicado por: Mihura
Fecha de publicación: 18/Noviembre/2025 a las 13:01
Publicado originalmente por VMT VMT escribió:

Se requiere de un certificado para completar la autenticación de cliente.

Obviamente, sin certificado la AEAT no te va a admitir el envío.



No conozco VB, pero básicamente VB y VBA son iguales y con este tipo de objetos más.

Estaría por jurar que sin cambiar nada lo que te he posteado furula en VB.




-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: ninja
Fecha de publicación: 18/Noviembre/2025 a las 19:22
Prueba así, funciona.

  strCertificaatNaam = NOMBRECERTIFICADO
  If UCase(strCertificaatNaam) <> "" And UCase(strCertificaatNaam) <> "[SKIP]" Then
     objWinHttp.SetOption 3, strCertificaatNaam
  End If

  objWinHttp.Send objRequestXML


Publicado por: VMT
Fecha de publicación: 19/Noviembre/2025 a las 10:15
Gracias.... pero no... no funciona. Es un problema del objeto y no del certificado, que cuenta con la clave privada, de la FNMT etc etc etc. Un problemon la verdad!

Como lo estoy haciendo y no me gusta... desde PowerShell generado un ps1 y luego ejecutándolo...


Public Function VF_PostSoap( _
    ByVal xmlOrPath As String, _
    ByVal endpoint As String, _
    ByVal soapAction As String, _
    ByVal thumbprint As String, _
    Optional ByVal hasEnvelope As Boolean = True _
) As String
    Dim xmlBody As String
    xmlBody = IIf(FileExists(xmlOrPath), ReadAllText(xmlOrPath), xmlOrPath)

    Dim payload As String
    If hasEnvelope Then
        payload = xmlBody
    Else
        payload = BuildEnvelope(xmlBody)
    End If

    Dim tp As String
    tp = NormalizeThumb(thumbprint)

    ' 1) MSXML2.ServerXMLHTTP.6.0
    On Error GoTo try_powershell
    VF_PostSoap = Send_MSXML(endpoint, soapAction, payload, tp)
    Exit Function

try_winhttp:
    ' 2) WinHTTP
    On Error GoTo try_powershell
    VF_PostSoap = Send_WinHTTP(endpoint, soapAction, payload, tp)
    Exit Function

try_powershell:
    ' 3) Fallback PowerShell (comprobado que te da 200 OK)
    On Error GoTo fail_all
    VF_PostSoap = Send_PowerShell(endpoint, soapAction, payload, tp)
    Exit Function

fail_all:
    Err.Raise vbObjectError + 53001, "VF_PostSoap", _
        "Fallo en los 3 métodos (MSXML, WinHTTP y PowerShell):" & vbCrLf & _
        " - " & Err.Number & " / " & Err.description
End Function


UNA FRICADA DE LA OS...

Private Function Send_PowerShell(ByVal url As String, ByVal soapAction As String, _
                                 ByVal soapEnvelope As String, ByVal thumb As String) As String
    Dim tempDir As String
    tempDir = Environ$("TEMP")

    Dim fBody As String, fOut As String, fPs As String
    fBody = tempDir & "\vf_body_" & Replace(CStr(Timer), ".", "") & ".xml"
    fOut = tempDir & "\vf_resp_" & Replace(CStr(Timer), ".", "") & ".txt"
    fPs = tempDir & "\vf_send_" & Replace(CStr(Timer), ".", "") & ".ps1"

    WriteAllText fBody, soapEnvelope

    Dim ps As String
    ps = ""
    ps = ps & "$ErrorActionPreference='Stop'" & vbCrLf
    ps = ps & "$thumb='" & thumb & "'" & vbCrLf
    ps = ps & "$endpoint='" & url & "'" & vbCrLf
    ps = ps & "$soapAction='" & soapAction & "'" & vbCrLf
    ps = ps & "$body=[IO.File]::ReadAllText('" & fBody & "')" & vbCrLf
    ps = ps & "$resp=Invoke-WebRequest -Uri $endpoint -Method Post -Body $body -ContentType 'text/xml; charset=utf-8' -Headers @{SOAPAction=$soapAction} -CertificateThumbprint $thumb -UseBasicParsing" & vbCrLf
    ps = ps & "[IO.File]::WriteAllText('" & fOut & "',$resp.Content,[Text.Encoding]::UTF8)" & vbCrLf

    WriteAllText fPs, ps

    Dim cmd As String
    cmd = "powershell.exe -NoProfile -ExecutionPolicy Bypass -File " & Quote(fPs)
    
    Set cb = New MSForms.DataObject
    cb.SetText cmd
    cb.PutInClipboard
    Set cb = Nothing

    Dim sh As Object: Set sh = CreateObject("WScript.Shell")
    Dim rc As Long
    rc = sh.Run(cmd, 0, True)
    If rc <> 0 Then
        Err.Raise vbObjectError + 53031, "Send_PowerShell", "PowerShell devolvió código " & rc & " " & Err.description
    End If

    Send_PowerShell = ReadAllText(fOut)
    On Error Resume Next
    Kill fBody: Kill fOut: Kill fPs
End Function


ALGUNA SUGUERENCIA DE ALGUIEN? Como gestionáis los errores que os devuelve el ENPOINT de la AEAT, porque devuelve un XML...?


Publicado por: Mihura
Fecha de publicación: 19/Noviembre/2025 a las 10:35
Publicado originalmente por VMT VMT escribió:

ALGUNA SUGUERENCIA DE ALGUIEN? Como gestionáis los errores que os devuelve el ENPOINT de la AEAT, porque devuelve un XML...?

https://accessaplicaciones.com/ejemplos.html#m12" rel="nofollow - Tratar Xml con DOM


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: main
Fecha de publicación: 01/Diciembre/2025 a las 10:41
Los errores se tratan en funcion de una tabla de codigos de error: Este error viene en el .xml de respuesta(<tikR:CodigoErrorRegistro>2004</tikR:CodigoErrorRegistro>? incluyendo ademas una breve descripción de su estado(<tikR:EstadoRegistro>AceptadoConErrores</tikR:EstadoReg). Tambien devuelve el CSV (Codigo seguro de verificacion) <tikR:CSV>
Saludos:


Publicado por: VMT
Fecha de publicación: 01/Diciembre/2025 a las 20:01
Gracias, sí ya lo tengo solucionado. 

Empiezo a ver la luz, envío en modo VERI*FACTU y NO VERI*FACTU bajo requerimiento y leo respuesta. 

He tenido que montar una cola de envío con un límite de 240 segundos como indica la AEAT. Sigo pensando que es muy precaria la forma de comunicarse...

Ya veremos si el día 1 no se caen los servidores de la AEAT.

Un saludo y gracias



Publicado por: main
Fecha de publicación: 01/Diciembre/2025 a las 20:15
Te recomiendo que la cola de envio sea de 60 segundos como se recomienda, y en funcion del tamaño del fichero enviado no tendras problemas. Si solo mandas un documento por envio, quiza no te de problemas pero si el envio contiene varias facturas empiezan los probemas.
Lo que no te comprendi es lo de enviar documento NO VERIFACTU, hasta donde se estos no se envian,
Saludos al grupo.


Publicado por: main
Fecha de publicación: 02/Diciembre/2025 a las 13:12
APLAZAMIENTO VERIFACTU A ENERO 2027


Publicado por: OmniPresente
Fecha de publicación: 02/Diciembre/2025 a las 13:13
Estaba claro... pero es que ni ellos mismos lo tenían resuelto a nivel técnico...


Publicado por: Mihura
Fecha de publicación: 02/Diciembre/2025 a las 13:28
¿Cómo que no estaba resuelto?

La web de AEAT funciona 100%  ... no he tenido parones ni errores de comunicación / validación.

Esto nos da un margen para avanzar sin sobresaltos, pero no hay que pararse, porque si no, en diciembre del año que viene estaremos igual.




-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: OmniPresente
Fecha de publicación: 10/Diciembre/2025 a las 18:24
Bueno; a mí me pasó que, a medida que iba haciendo implantaciones, cambiaba el esquema XML. No sé ser más específico, porque no recuerdo los detalles, pero de repente me encontraba con bloques que primero no eran obligatorios y luego sí.

Por no hablar, fuera ya del nivel técnico, de lo ambigua que es la AEAT sobre quién está obligado y quién no. Quien haga sus facturas con Excel o Word, está exento de la norma. Pues nada, yo, que envío mis facturas en PDF por e-mail; si alguna vez me requieren el registro Verifactu, digo que no uso un programa SIF; que las hago todas individualmente con Word y las exporto a PDF y listos.



Imprimir página | Cerrar ventana