Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Ley antifraude 2021 (VERIFACTU) - Programas informáticos (https://www.clubdelphi.com/foros/showthread.php?t=95235)

ermendalenda 29-05-2024 17:10:33

Hola, he leído en Linkedin un mensaje de que ha habido una ponencia de Javier Hurtado que habla de algo de que están estudiando que los del SII yengan obligación de verifactu o que los de autofacturas sii hagan verifactu.como no se entendía muy bien el mensaje, os pregunto si alguno tenéis noticia de ese congreso/ponencia.
Gracias

novatico 30-05-2024 09:33:27

Cita:

Empezado por ermendalenda (Mensaje 555817)
Hola, he leído en Linkedin un mensaje de que ha habido una ponencia de Javier Hurtado que habla de algo de que están estudiando que los del SII yengan obligación de verifactu o que los de autofacturas sii hagan verifactu.como no se entendía muy bien el mensaje, os pregunto si alguno tenéis noticia de ese congreso/ponencia.
Gracias

Acabo de hacer un búsqueda de "Javier Hurtado Puerta" que era (sí digo "era") Director del Departamento de Inspección Financiera y Tributaria de la AEAT, y me aparece una publicación en el BOE de 1 de Febrero de 2024, en la que se comunica su cese en dicho cargo. Yo he presenciado varios webinars de él junto con José Borja, Director Informático de la Agencia Estatal de Administración Tributaria, en los que detallaban diferentes aspectos de la Ley Antifraude y Verifactu. No sé si este cese puede tener que ver con los retrasos en la publicación de la OM.

https://www.boe.es/diario_boe/txt.ph...OE-A-2024-2097

keys 30-05-2024 09:54:31

Yo creo que no https://theobjective.com/economia/20...nchez-montero/:eek:

D. E. P.

ermendalenda 30-05-2024 11:04:45

Madre mía.
No creo que siga dando ponencias de verifactu
Aunque todo es posible

Franche 30-05-2024 11:08:21

Posiblemente ahora si tendrá mucho más tiempo para hacer ponencias, de hecho, las está haciendo, creo que he visto una con Wolter Kluvers y fue hace un mes, creo recordar, osea, después de su despido.

Casimiro Notevi 30-05-2024 11:20:06

El tipo ese es un vendido a los "fachas".

Delphier 30-05-2024 20:47:09

Firma Digital por DLL y XML schema binding de facturae
 
Hola

OS dejo mi planteamiento sobre la generación de XML y Firma por si le sirve a alguien para algo o le sirve de idea.
La idea es aplicar el sistema de Firma por DLL para Verifactu y para facturae.


1-Guardar el certificado digital y la contraseña encriptada en la base de datos

Código:


        FileStream := TMemoryStream.Create;
        FileStream.LoadFromFile(Filename); // Fichero del certificado

        TempStream := TMemoryStream.Create;
        TempStream := EncriptarStream(FileStream);

        TBlobField(Dataset.FieldByName('CertFirmaDigital')).LoadFromStream(TempStream);

2-Para firmar XML facturae y "Verifactu (Cuando se publique si es válida) "

Me acordé que hace unos años compré xmlblackbox para Delphi XE3 y no lo había usado nunca.
Se me ocurrió que para no andar comprando librerias constantemente , se podía hacer una DLL con Delphi XE3 para firmar y poder usarla con mis aplicaciones de Delphi 11, etc...

Código de la DLL con la funcion de firma en la carpeta DLLFirma y también las DLL compiladas por si sacan a alguien del paso, dejo el enlace para la descarga porque es demasiado grande para adjuntar con las DLL compiladas


h t t p s : // drive.google.com/file/d/1vrtpSGHje-l-3XW6peIGqYxHkH0g9aYx/view?usp=drive_link


Código:


// Para comprobar si un certificvado es Valido , pasando un IStream
function StreamCertificadoValido(CertStream : IStream ; Password : Pchar) : Boolean;  StdCall;

// Para comprobar si un certificvado es Valido , pasando un String con la ubicación del fichero
function FicheroCertificadoValido(Filename,Password : Pchar) : Boolean;  StdCall;

// Para firmar el XML , devuelve el XML Firmado
function FirmaFacturae(CertStream,XMLFacturae : IStream ; Password : Pchar): Pchar; StdCall;

// Para obtener cierta información del certificado (La idea final es devolver un XML con todo, pero...)
function DatoCertificado(CertStream : IStream ; Password,Dato : Pchar) : Pchar;  StdCall;

Código:

  // Ejemplos LLamada a las funciones de la DLL desde la Aplicacion 

  //Definir las funciones
  function FirmaFacturae(CertStream,XMLFacturae : IStream ; Password : Pchar): Pchar;  StdCall; external 'DLLFirmaCrt.x32.dll';
  function FicheroCertificadoValido(Filename,Password : Pchar) : Boolean;  StdCall; external 'DLLFirmaCrt.x32.dll' name 'FicheroCertificadoValido';
  function StreamCertificadoValido(CertStream : IStream ; Password : Pchar) : Boolean;  StdCall; external 'DLLFirmaCrt.x32.dll' name 'StreamCertificadoValido';
  function DatoCertificado(CertStream : IStream ; Password,Dato : Pchar) : Pchar; StdCall; external 'DLLFirmaCrt.x32.dll' name 'DatoCertificado';


// Firmar XML facturae con la DLL
procedure TFr_user.ButtonClick(Sender: TObject);
var Fichero,XMLString,ResultadoXML : String;
var XSendCertificadoFirma,SendXMLStream : IStream;
var XMLFileStream : TStringStream;
var TempStream : TMemoryStream;
begin


    { Fichero := 'nombre del fichero xml o directamente usar XMLString' }

    XMLString := TFile.ReadAllText(Fichero,TEncoding.Unicode);

      // Test de firma

      // El certificado
      TBlobField(Dataset.FieldByName('CertFirmaDigital')).SaveToStream(TempStream);

      // Lo desencriptamos
      XCertificadoFirma := DesencriptarStream(TempStream);

      XCertificadoFirma.Seek(0,soFromBeginning);
      XSendCertificadoFirma := TStreamAdapter.Create(XCertificadoFirma, soReference); //soOwned

    //El XMl A firmar
    XMLFileStream := TStringStream.Create(XMLString,TEncoding.Unicode);
    SendXMLStream := TStreamAdapter.Create(XMLFileStream, soReference); // Adap`tamos a IStream

    if XSendCertificadoFirma <> nil then
    Begin

      ResultadoXML := FirmaFacturae(XSendCertificadoFirma,SendXMLStream,Pchar(XCertificadoPass));

      // SI ho hay error , guardamos el fichero
      if Copy(ResultadoXML,1,7) <> '<Error>' then
      Begin
      TFile.WriteAllText(FicheroFirmado,ResultadoXML,TEncoding.Unicode);
      End
      else
      Begin
        // Error
        f_control(nil,'M',f_frase('NO SE HA PODIDO FIRMAR DIGITALMENTE LA FACTURA.',0),ResultadoXML,'');
      End;

    End
    else
    Begin
      //Showmessage('No hay certificado');
    End;


      XMLFileStream.Free;
      SendXMLStream := nil;


end;




3- Mi planteamiento de como generar el XML verifactu ya corre por este hilo.


4- Para generar el XML facturae.

Usar el esquema que proporciona la AEAT y con XML Schema Binding generar el Pas "SistemaFacturaev3_2_2.pas" , lo adjunto en la carpetas Facturae.
UFacturaE.pas es un ejemplo no terminado 100% de como se genera facilmente el XML Facturae, funciona , pero añadir cosas, solo es un ejemplo de como usar SistemaFacturaev3_2_2.pas

Saludos

---------------------------------------------------------------------------------------------------------------

NOTA DEL MODERADOR: Añado los ficheros al FTP del club (junto a la documentación), con un pequeño fichero de texto en la misma ubicación con una explicación. Y actualizo el mensaje #2 del hilo, que es el que recopila códigos.

newtron 31-05-2024 09:16:14

^\||/ Gracias por tu aporte compañero.

keys 31-05-2024 09:18:26

Ayer sacaron información nueva.

https://www.agenciatributaria.es/AEA...ERI_FACTU.html

Se ha incorporado nueva documentación técnica asociada a los sistemas VERI*FACTU y no VERI*FACTU , concretamente un nuevo documento donde se detalla las especificaciones técnicas para la generación de la huella o hash de los registros de facturación y de eventos, en su versión 0.1.0 y con carácter de borrador, hasta la publicación de la Orden Ministerial definitiva.

También se ha actualizado la Documentación de descripción de servicios web en su versión 0.3.1.

NOTA DEL MODERADOR: Gracias. Actualizo el mensaje número #1 con la recopilación de información y añado el fichero al FTP del club.

ermendalenda 31-05-2024 12:56:49

Cita:

Empezado por keys (Mensaje 555856)
Ayer sacaron información nueva.

https://www.agenciatributaria.es/AEA...ERI_FACTU.html

Se ha incorporado nueva documentación técnica asociada a los sistemas VERI*FACTU y no VERI*FACTU , concretamente un nuevo documento donde se detalla las especificaciones técnicas para la generación de la huella o hash de los registros de facturación y de eventos, en su versión 0.1.0 y con carácter de borrador, hasta la publicación de la Orden Ministerial definitiva.

También se ha actualizado la Documentación de descripción de servicios web en su versión 0.3.1.

NOTA DEL MODERADOR: Gracias. Actualizo el mensaje número #1 con la recopilación de información y añado el fichero al FTP del club.


Perfecto. Gracias
Un pasito más.

xevi 31-05-2024 13:14:11

Acabo de leer ese artículo y me he puesto a provar de generar el hash como dicen en el ejemplo, mi lenguaje de programación es Harbour y disponemos de la función HB_SHA256 para ese menester.
Así que lo he probado de esa manera como el Pdf para comprovar hash de ejemplos...

LogDebug( Upper(HB_SHA256( "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" )) )

LogDebug( Upper(HB_SHA256( "IDEmisorFactura=89890001K&NumSerieFactura=12345679/G34&FechaExpedicionFactura=01-01-2024&TipoFactura=F1&CuotaTotal=12.35&ImporteTotal=123.45&Huella=3C464DAF61ACB827C65FDA19F352A4E3BDC2 C640E9E9FC4CC058073F38F12F60&FechaHoraHusoGenRegistro=2024-01-01T19:20:35+01:00" )) )

Resultados:
3C464DAF61ACB827C65FDA19F352A4E3BDC2C640E9E9FC4CC058073F38F12F60
F7B94CFD8924EDFF273501B01EE5153E4CE8F259766F88CF6ACB8935802A2B97

Correcto!!!

Así pues, a pensar en como voy a implementarlo en mi aplicación...

ermendalenda 31-05-2024 15:41:12

Cita:

Empezado por xevi (Mensaje 555861)
Acabo de leer ese artículo y me he puesto a provar de generar el hash como dicen en el ejemplo, mi lenguaje de programación es Harbour y disponemos de la función HB_SHA256 para ese menester.
Así que lo he probado de esa manera como el Pdf para comprovar hash de ejemplos...

LogDebug( Upper(HB_SHA256( "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" )) )

LogDebug( Upper(HB_SHA256( "IDEmisorFactura=89890001K&NumSerieFactura=12345679/G34&FechaExpedicionFactura=01-01-2024&TipoFactura=F1&CuotaTotal=12.35&ImporteTotal=123.45&Huella=3C464DAF61ACB827C65FDA19F352A4E3BDC2 C640E9E9FC4CC058073F38F12F60&FechaHoraHusoGenRegistro=2024-01-01T19:20:35+01:00" )) )

Resultados:
3C464DAF61ACB827C65FDA19F352A4E3BDC2C640E9E9FC4CC058073F38F12F60
F7B94CFD8924EDFF273501B01EE5153E4CE8F259766F88CF6ACB8935802A2B97

Correcto!!!

Así pues, a pensar en como voy a implementarlo en mi aplicación...


aqui tienes tb una de las webs para comprobar los textos a sha256 para comprobar lo que generes.
https://www.convertstring.com/es/Hash/SHA256

ermendalenda 31-05-2024 16:31:05

Tiene pinta de que la cadena sobre la que se calcula el hash va a ser parte del QR(por la configuracio tipo parámetros dirección web), similar a ticketbai.
Con lo cual, tenedlo en cuenta para no usar caracteres extraños en la separación de número serie/numero se factura que os puedan dar conflictos con ma codificación URI para llamadas a webs. O tendréis que pasar a Uri(hexa) los caracteres que puedan dar conflictos para generar el QR
Ejemplo caracteres conflictivos:
/+:;,*<>[]\
En el caso de que lo queráis usar, simplemente es pasarlo a hexa por ejemplo el espacio es %20.., aunque el espacio no lo permiten
Pero la reprentaciob escrita(para la factura electrónica, no hay que convertirlo)
Es una pequeña traba más.

xevi 31-05-2024 16:39:55

aún así, NO entiendo lo de generar la huella si mi SIF SOLAMENTE funciona en modo VERI*FACTU.
¿No es la propia hacienda la que va a hacer la custodia, trazabilidad, inalterabilidad... de los registros que enviemos a su servidor???

De ser así, no entiendo el porque debemos de hacer nuestra "trazabilidad" cuando la trazabilidad corresponde a quien custodie y tenga TODA la información de los registros enviados. No se, no veo la utilidad de nuestro SIF.

Yo tengo entendido que debemos generar el registro, transmitir a hacienda e imprimir documento (factura). El SIF VERI*FACTU le corresponde esa tarea, que para lo demás, por eso remitimos los registros generados a hacienda, para quitarnos esa tarea y responsabilidad de guarda-custodia, trazabilidad...

¿Soy yo que lo tengo mal entendido???

ermendalenda 31-05-2024 17:01:47

Cita:

Empezado por xevi (Mensaje 555869)
aún así, NO entiendo lo de generar la huella si mi SIF SOLAMENTE funciona en modo VERI*FACTU.
¿No es la propia hacienda la que va a hacer la custodia, trazabilidad, inalterabilidad... de los registros que enviemos a su servidor???

De ser así, no entiendo el porque debemos de hacer nuestra "trazabilidad" cuando la trazabilidad corresponde a quien custodie y tenga TODA la información de los registros enviados. No se, no veo la utilidad de nuestro SIF.

Yo tengo entendido que debemos generar el registro, transmitir a hacienda e imprimir documento (factura). El SIF VERI*FACTU le corresponde esa tarea, que para lo demás, por eso remitimos los registros generados a hacienda, para quitarnos esa tarea y responsabilidad de guarda-custodia, trazabilidad...

¿Soy yo que lo tengo mal entendido???

Efectivamente, este blockchain no tiene mucho sentido. Por eso lo han puesto como error leve si está mal calculado. Pero es parte de la politica de los encadenamientos de bloques por varias razones y también garantiza que los datos no se han corrompido entre la generación y la recepcion.
Imagina que usas una dll o una api de un tercero, para el envio, que destroza el xml y por ejemplo quita los puntos decimales.
Todos los datos serios suelen tener un check de comprobación.
Ejemplos: EAN, QR, que además sirve para el que lea el dato se asegure qur lo ha leído correctamente.
El encadenamiento además garantiza una trazabilidad cronológica en un solo sentido.

Delphier 31-05-2024 21:03:59

Actualizo los fichero con la generación facturae ya entera y validado con el portal FACE

h t t p s://drive.google.com/file/d/1vrtpSGHje-l-3XW6peIGqYxHkH0g9aYx/view?usp=drive_link

Ficheros actulizados:
SistemaFacturaev3_2_2.pas
UFacturaE.pas

ermendalenda 02-06-2024 12:24:44

Cita:

Empezado por Delphier (Mensaje 555876)
Actualizo los fichero con la generación facturae ya entera y validado con el portal FACE

h t t p s://drive.google.com/file/d/1vrtpSGHje-l-3XW6peIGqYxHkH0g9aYx/view?usp=drive_link

Ficheros actulizados:
SistemaFacturaev3_2_2.pas
UFacturaE.pas


Hola Delphier, cuidado con las Validacionea son solo estructurales. Me ha pasado que ya me había confiado y he enviado un par de facturas por face y me la han rechazado por no coincidir importes, tenía errores de algún campo con impuesto en vez de sin impuesto...

Delphier 02-06-2024 19:18:16

Cita:

Empezado por ermendalenda (Mensaje 555889)
Hola Delphier, cuidado con las Validacionea son solo estructurales. Me ha pasado que ya me había confiado y he enviado un par de facturas por face y me la han rechazado por no coincidir importes, tenía errores de algún campo con impuesto en vez de sin impuesto...

Claro , hace años que generamos facturae , solo que hacía el XML a pelo , con la película de verifactu he aprovechado para cambiar la generación a "pelo" por la del esquema con XML schema binding , simplemente comparto el código de como se hace por si a alguno le interesa.

Saludos

Delphier 03-06-2024 11:15:24

Calcular Huella
 
Delphi 11.3

Código:

Uses System.hash

CadenaVerifactu :=
'IDEmisorFactura=89890001K&'+
'NumSerieFactura=12345679/G34&'+
'FechaExpedicionFactura=01-01-2024&'+
'TipoFactura=F1&CuotaTotal=12.35&'+
'ImporteTotal=123.45&'+
'Huella=3C464DAF61ACB827C65FDA19F352A4E3BDC2C640E9E9FC4CC058073F38F12F60&'+
'FechaHoraHusoGenRegistro=2024-01-01T19:20:35+01:00';


 Result := THashSHA2.GetHashString(CadenaVerifactu,THashSHA2.TSHA2Version.SHA256).ToUpper;

Resultado es = F7B94CFD8924EDFF273501B01EE5153E4CE8F259766F88CF6ACB8935802A2B97


ermendalenda 03-06-2024 15:19:59

duda Nodo
 
Buenas tardes, me podrias indicar donde van los siguientes CIERRES de NODOS segun sea una anulacion o alta.
</RegistroAnulacion>
</RegistroAlta>


Va antes de <TipoHuella>01</TipoHuella>

o despues de <Huella>DEFHG...234234G</Huella>


gracias


La franja horaria es GMT +2. Ahora son las 12:05:29.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi