Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   TICKET BAI (TicketBAI); Nuevo sistema de la Agencia Tributaria del Pais Vasco (https://www.clubdelphi.com/foros/showthread.php?t=94264)

Neftali [Germán.Estévez] 04-12-2019 08:39:16

Gracias por la info.
A mi todavía nop me ha llegado. Toca esperar a ver qué han decidido sobre la implantación final.
Actualizado el mensaje 1 con el calendario.

elcharlie 04-12-2019 08:47:32

A mi me acaba de llegar el EMail, haber que sorpresas nos regalan los de Lantik. Por cierto me ha llegado un comentario de que al final en Navarra no van a implementar, de momento, el TicketBai, o como se fuera a llamar en la comunidad Foral. ¿alguien sabe algo al respecto?

elcharlie 04-12-2019 10:25:34

Hola a todos, haber si alguien me puede echar una mano con la firma del XML, os pongo el código fuente que yo uso, pero por lo visto esta mal, al enviarlos me da error "Ticketbai exige que la firma sea Xades/Epes.

Código Delphi [-]
rocedure TFrmMain.ButtonFirmarXMLClick(Sender: TObject);
var
  ArchivoDestino: String;
  ArchivoDestinoBase64: String;
  F : TFileStream;
  Out_Stream: TFileStream;
  Out_Stream_64: TStringList;
  TempFile: TStreamWriter;
  MS: TMemoryStream;

  XML_Doc : ElXMLDOMDocument;
  XML_Refs : TElXMLReferenceList;
  XML_RefDocu : TElXMLReference;

  XML_Signer : TElXMLSigner;
  XML_XAdES : TElXAdESSigner;
  XML_KeyData : TElXMLKeyInfoX509Data;

  Cert : TElX509Certificate;
  XML_Nodo : TElXMLDOMNode;
  XML_Doc_Base64: String;
  Encoder : TIdEncoderMime;
  
  Buf: ByteArray;
const
  SHA256 = 'http://www.w3.org/2001/04/xmlenc#sha256';
  POLITICA_PDF = 'oid:/1.2.4.0.9.4.5';
  POLITICA_FIRMA = 'Policy description';
  REF_DOCU_ID = 'xmldsig-c8adb119-5083-474b-becb-995f4e506e82-ref0';
begin
  try

    ArchivoDestino := ExtractFilePath(EdtRutaFicheroXML.Text) + StringReplace(ExtractFileName(EdtRutaFicheroXML.Text), ExtractFileExt(EdtRutaFicheroXML.Text), '', [rfReplaceAll, rfIgnoreCase])
      + 'Signed' + ExtractFileExt(EdtRutaFicheroXML.Text);

    ArchivoDestinoBase64 := ExtractFilePath(EdtRutaFicheroXML.Text) + StringReplace(ExtractFileName(EdtRutaFicheroXML.Text), ExtractFileExt(EdtRutaFicheroXML.Text), '', [rfReplaceAll, rfIgnoreCase])
      + 'Base64' + ExtractFileExt(EdtRutaFicheroXML.Text);

    if (Trim(ArchivoDestino) = EmptyStr) or (FileExists(EdtRutaFicheroXML.Text) = False) then
      raise Exception.Create('Error Inicializar');

    F := TFileStream.Create(EdtRutaFicheroXML.Text, fmOpenRead or fmShareDenyWrite);
    XML_Doc := ElXMLDOMDocument.Create;
    XML_Refs := TElXMLReferenceList.Create;
    XML_RefDocu := TElXMLReference.create;

    XML_Signer := TElXMLSigner.Create(nil);
    XML_XAdES :=   TElXAdESSigner.Create(nil);
    XML_KeyData:= TElXMLKeyInfoX509Data.create(false);

    XML_Doc.LoadFromStream(F,'', True);
    if not XML_Doc.Loaded then
      raise Exception.create('Firma XML: No se pudo cargar el documento XML.');


    XML_Signer.References := XML_Refs;
    XML_Signer.SignatureMethodType := SBXMLSec.xmtSig;
    XML_Signer.SignatureType := SBXMLSec.xstEnveloped;
    XML_Signer.CanonicalizationMethod := SBXMLDefs.xcmCanon;
    XML_Signer.SignatureMethod := SBXMLSec.xsmRSA_SHA256;

    XML_Signer.IncludeKey := True;
    XML_Signer.XAdESProcessor := XML_XAdES;
    XML_Signer.XAdESProcessor.XAdESVersion := SBXMLAdES.XAdES_v1_4_1;
    XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.Identifier := POLITICA_PDF;

    if (Length(POLITICA_PDF) > 0) then
    begin
      if (LowerCase(Copy(POLITICA_PDF,0,4)) = 'urn:') then
        XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtOIDAsURN
      else
        XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtOIDAsURI;
    end
    else
      XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtNone;

    XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.Description := POLITICA_FIRMA;
    XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestMethod := SBXMLSec.DigestMethodToURI(xdmSHA256);


    XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestMethod := DigestMethodToURI(xdmSHA256);
    XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestValue := ConvertFromBase64String('eTt00qpcKGu3EVLFt2kjJFaczEmo3EOWnh6udzUnnEk=');
    //XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestValue := CalculateDigest(@Buf[0], Length(Buf), xdmSHA1);


    XML_Signer.XAdESProcessor.SigningTime := UtcNow;
    XML_Signer.XAdESProcessor.Generate();

    XML_Signer.XAdESProcessor.QualifyingProperties.XAdESPrefix := 'xades';

    XML_Signer.UpdateReferencesDigest();

    XML_KeyData.IncludeKeyValue := False;
    Cert := ListaCertificados[ComboBoxCertificados.ItemIndex];
    XML_KeyData.Certificate := Cert;

    XML_Signer.KeyData := XML_KeyData;
    XML_RefDocu.DigestMethod := SBXMLSec.xdmSHA256;
    XML_RefDocu.URINode := XML_Doc.DocumentElement;

    XML_RefDocu.ID := REF_DOCU_ID;
    XML_RefDocu.URI := '';
    XML_RefDocu.TransformChain.Add(TElXMLEnvelopedSignatureTransform.Create);
    XML_Refs.Add(XML_RefDocu);
    XML_Signer.UpdateReferencesDigest();


    XML_Signer.Sign();

    XML_Signer.Signature.SignedInfo.SigPropRef.DigestMethod := xdmSHA256;
    XML_Signer.Signature.SignedInfo.SigPropRef.TransformChain.Add(TElXMLC14NTransform.Create);


    XML_Nodo := XML_Doc.DocumentElement;
    XML_Signer.Save(XML_Nodo);
    F.Position := 0;
    XML_Doc.SaveToStream(F);



    Out_Stream:= TFileStream.create(ArchivoDestino, fmCreate);
    XML_Doc.SaveToStream(Out_Stream);
    FreeAndNil(Out_Stream);


    FreeAndNil(F);
    XML_Doc.free;
    XML_Refs.free;
    XML_Signer.free;
    XML_XAdES.free;
    XML_KeyData.Free;
  
    ShowMessage('Fichero Firmado');
  except on E: Exception do
    begin
      ShowMessage(e.ToString);
    end;
  end;
end;

La verdad es que no sé donde puede estar el fallo, paso el fichero firmado por un validador y me indica que está correcto. Estoy perdido

elcharlie 04-12-2019 12:03:00

Esto si que es raro, si lo firmo como la facturaE, no me da ningun tipo de error, pero su ejemplo es completamente distinto. No sé. Os pongo el código que he usado y que si me funciona, pero no tengo claro que vaya a ser así en un futuro
Código Delphi [-]
procedure TFrmMain.Button1Click(Sender: TObject);
var
  ArchivoDestino: String;
  F : TFileStream;
  Out_Stream: TFileStream;
  XML_Doc : ElXMLDOMDocument;
  XML_Refs : TElXMLReferenceList;
  XML_RefDocu : TElXMLReference;
  XML_RefCert : TElXMLReference;
  XML_Signer : TElXMLSigner;
  XML_XAdES : TElXAdESSigner;
  XML_KeyData : TElXMLKeyInfoX509Data;
  XML_Digest: String;
  XML_Buf: ByteArray;
  j, i, k1, k2: Integer;
  Cert : TElX509Certificate;
  XML_Nodo : TElXMLDOMNode;
const
  SHA256 = 'http://www.w3.org/2001/04/xmlenc#sha256';
  POLITICA_PDF = 'http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf';
  POLITICA_FIRMA = 'Política de firma electrónica para facturación electrónica con formato Facturae';
  HASH_POLITICA = '3A18B197ABA90FA6AFF0DEE912F0C006110BEA13';
begin
  try
    ArchivoDestino := ExtractFilePath(EdtRutaFicheroXML.Text) + StringReplace(ExtractFileName(EdtRutaFicheroXML.Text), ExtractFileExt(EdtRutaFicheroXML.Text), '', [rfReplaceAll, rfIgnoreCase])
      + 'Signed' + ExtractFileExt(EdtRutaFicheroXML.Text);


    if (Trim(ArchivoDestino) = EmptyStr) or (FileExists(EdtRutaFicheroXML.Text) = False) then
      raise Exception.Create('Error Inicializar');


    F := TFileStream.Create(EdtRutaFicheroXML.Text, fmOpenRead or fmShareDenyWrite);
    XML_Doc := ElXMLDOMDocument.Create;
    XML_Refs := TElXMLReferenceList.Create;
    XML_RefDocu := TElXMLReference.create;
    XML_RefCert := TElXMLReference.create;
    XML_Signer := TElXMLSigner.Create(nil);
    XML_XAdES :=   TElXAdESSigner.Create(nil);
    XML_KeyData:= TElXMLKeyInfoX509Data.create(false);

    XML_Doc.LoadFromStream(F,'', True);
    if not XML_Doc.Loaded then
      raise Exception.create('Firma XML: No se pudo cargar el documento XML.');

    XML_Signer.References := XML_Refs;
    XML_Signer.SignatureMethodType := SBXMLSec.xmtSig;
    XML_Signer.SignatureType := SBXMLSec.xstEnveloped;
    XML_Signer.CanonicalizationMethod := SBXMLDefs.xcmCanon;
    XML_Signer.SignatureMethod := SBXMLSec.xsmRSA_SHA256;
    XML_Signer.IncludeKey := True;

    XML_Signer.XAdESProcessor := XML_XAdES;
    XML_Signer.XAdESProcessor.XAdESVersion := SBXMLAdES.XAdES_v1_4_1;

    XML_Signer.XAdESProcessor.Included := [SBXMLAdESIntf.xipSignerRole];
    XML_Signer.XAdESProcessor.SignerRole.ClaimedRoles.AddText(XML_Signer.XAdESProcessor.XAdESVersion, XML_Doc, 'supplier');
    XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.Identifier := POLITICA_PDF;

    if (Length(POLITICA_PDF) > 0) then
    begin
      if (LowerCase(Copy(POLITICA_PDF,0,4)) = 'urn:') then
        XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtOIDAsURN
      else
        XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtOIDAsURI;
    end
    else
      XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtNone;

    XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.Description := POLITICA_FIRMA;
    XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestMethod := SHA256;

    XML_Digest:= LowerCase(HASH_POLITICA);

    SetLength(XML_Buf, Length(XML_Digest) div 2);
    for j:= 0 to Length(XML_Buf)-1 do
    begin
      k1:= SBMath.HexToDecDigit(XML_Digest[j*2 + 1]);
      k2:= SBMath.HexToDecDigit(XML_Digest[j*2 + 2]);
      if (k1<0) or (k2<0) then
        raise Exception.Create('Firma XML: Error convirtiendo digest de política de firmado a Base64.');
      XML_Buf[j]:= k1 shl 4 + k2;
    end;

    XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestValue := XML_Buf;

    XML_Signer.XAdESProcessor.SigningTime := UtcNow;
    XML_Signer.XAdESProcessor.Generate();
    XML_Signer.UpdateReferencesDigest();

    XML_KeyData.IncludeKeyValue := true;
    Cert := ListaCertificados[ComboBoxCertificados.ItemIndex];
    XML_KeyData.Certificate := Cert;

    XML_Signer.KeyData := XML_KeyData;
    XML_RefDocu.DigestMethod := SBXMLSec.xdmSHA256;
    XML_RefDocu.URINode := XML_Doc.DocumentElement;
    XML_RefDocu.URI := '';
    XML_RefDocu.TransformChain.Add(TElXMLEnvelopedSignatureTransform.Create);
    XML_Refs.Add(XML_RefDocu);
    XML_Signer.UpdateReferencesDigest();

    XML_RefCert.URI := '#Certificate1';
    XML_RefCert.DigestMethod := SBXMLSec.xdmSHA256;
    XML_Refs.Add(XML_RefCert);

    XML_Signer.Sign();
    XML_Signer.Signature.KeyInfo.ID := 'Certificate1';

    XML_Nodo := XML_Doc.DocumentElement;
    XML_Signer.Save(XML_Nodo);

    F.Position := 0;
    XML_Doc.SaveToStream(F);

    Out_Stream:= TFileStream.create(ArchivoDestino, fmCreate);
    XML_Doc.SaveToStream(Out_Stream);
    FreeAndNil(Out_Stream);

    FreeAndNil(F);
    XML_Doc.free;
    XML_Refs.free;
    XML_Signer.free;
    XML_XAdES.free;
    XML_KeyData.Free;
    ShowMessage('Fichero Firmado');
  except on E: Exception do
    begin
      ShowMessage(e.ToString);


      if Assigned(XML_Doc) then
        XML_Doc.free;

      if Assigned(XML_Refs) then
        XML_Refs.free;

      if Assigned(XML_Signer) then
        XML_Signer.free;
    end;
  end;
end;

Sistel 16-12-2019 09:36:02

Hola,

Ya me han contestado de FNMT:

... De los 3 certificados del proyecto ticketBAI, no tenemos en la actualidad el de dispositivo, ni tenemos intención de incluirlo en nuestra planificación de corto plazo. El de aplicaciones informáticas estaría cubierto por nuestro sello de entidad y el de firma digital de personas tanto por el de representante como por el de ciudadanos...

Así que parece que, por el momento y que se sepa, sólo IZENPE podrá suministrar certificados de dispositivo.
Como certificado de aplicación informática, podría emplearse el de Sello de Entidad de FNMT
Precio: 360 € al año
Y entiendo que un solo certificado serviría para firmar todas la aplicaciones informáticas que se quieran.

Lástima no poder contar con certificados de dispositivos alternativos al de IZENPE porque se necesitará un certificado de ese tipo para cada máquina que genere facturas.

Saludos
PD: Iba a poner los enlaces a la información sobre certificados de sello de entidad de FNMT, pero el foro no me deja por ser aún muy novato.

Casimiro Notevi 16-12-2019 09:47:45

Cita:

Empezado por Sistel (Mensaje 534790)
PD: Iba a poner los enlaces a la información sobre certificados de sello de entidad de FNMT, pero el foro no me deja por ser aún muy novato.

Puedes ponerlo, por ejemplo: htp:/loqusea.com y un moderador lo ajustará, o cualquier otro: htttp, ttp, gttp, lo que se te ocurra.

Sistel 16-12-2019 10:42:10

Cita:

Empezado por Casimiro Notevi (Mensaje 534792)
Puedes ponerlo, por ejemplo: htp:/loqusea.com y un moderador lo ajustará, o cualquier otro: htttp, ttp, gttp, lo que se te ocurra.

OK
Aquí van los enlaces que quería poner (no puedo modificar el mensaje original)
https://www.cert.fnmt.es/catalogo-de.../sello-entidad
https://www.cert.fnmt.es/documents/1...omponentes.pdf
https://www.cert.fnmt.es/documents/1...ente_v1.04.pdf
Gracias

NOTA: Ya están añadidos aquí (por si se pierden los links) y al mensaje original

pablog2k 16-12-2019 17:43:47

buenas tardes, otro más por aquí que le toca lo del TICKETBAI....

dos dudas tontas :confused: :
1-el identificativo TBAI y el codigo QR,lo generamos nosotros verdad?es decir, el software que emite la factura (yo pensaba que hacías una petición a la hacienda vasca y te contestaba con ese código...)
2-el mismo certificado para firmar la factura, sirve para luego enviarla? porque ya me he hecho un lío entre el certificado de dispositivo,de firmar y de enviar...
muchas gracias

Sistel 16-12-2019 18:10:37

Cita:

Empezado por pablog2k (Mensaje 534802)
buenas tardes, otro más por aquí que le toca lo del TICKETBAI....

dos dudas tontas :confused: :
1-el identificativo TBAI y el codigo QR,lo generamos nosotros verdad?es decir, el software que emite la factura (yo pensaba que hacías una petición a la hacienda vasca y te contestaba con ese código...)
2-el mismo certificado para firmar la factura, sirve para luego enviarla? porque ya me he hecho un lío entre el certificado de dispositivo,de firmar y de enviar...
muchas gracias

Sí. Los pasos son:
1- Antes de generar la nueva factura obtienes los datos que tienes para generarla y la firma de la última factura emitida
2- Con esos datos creas el XML de la nueva factura
3.- Firmas ese XML con el certificado para firma digital que tienes instalado en la máquina
4.- Creas el código TBAI y la imagen QR
5.- Insertas en la nueva factura sus datos, el código TBAI y el QR
6.- La imprimes y entregas o envías al cliente
7.- Posteriormente (aún no se sabe el plazo de tiempo), envías el XML firmado a Hacienda Foral

Saludos

Sistel 16-12-2019 20:15:41

Hola,

Como soy novato en el foro, aún no me deja subir imágenes.
Si algún moderador se ofrece para ello, puedo enviarle un gráfico que ilustra los procesos de TicketBai para que lo suba a este hilo del foro.

Saludos

Casimiro Notevi 16-12-2019 21:16:19

Pon el enlace a la foto donde la hayas subido, por ejemplo, si está en http://www.subefotos.com/foto1.png
Pon aquí el enlace sin la h inicial: ttp://www.subefotos.com/foto1.png
Y algún moderador lo editará.

pablog2k 17-12-2019 08:07:16

gracias Sistel. Me quedo a la espera de la imagen que vas a subir
Saludos

AlvaroDaron 17-12-2019 09:31:46

WSDL definitivas
 
Buenos días, somos una empresa que esta empezando con el ticket bai, nos hemos leido la documentación existente hasta el momento y nos quedamos con la sensación de que quedan muchas cosas en el aire, hemos visto que dicen que la documentación final se publicará a mediados del mes de diciembre. Alguien sabe si ya esta disponible y como acceder a ella? también preguntar si alguien dispone de los wsdl o si están publicados en algún sitio. Muchas gracias de antemano. Saludos

keys 17-12-2019 09:39:24

El tema esta muy verde. Ahora han pasado la pelota a las haciendas, pero de momento no han enviado nada.

Sistel 17-12-2019 09:47:30

Cita:

Empezado por Casimiro Notevi (Mensaje 534805)
Pon el enlace a la foto donde la hayas subido, por ejemplo, si está en ...
Pon aquí el enlace sin la ...
Y algún moderador lo editará.

Dejo el enlace provisional a la imagen:
https://drive.google.com/file/d/1buI...EQ8su1ft5/view


Casimiro Notevi 17-12-2019 10:28:09

Cita:

Empezado por Sistel (Mensaje 534811)
Dejo el enlace provisional a la imagen:
https://drive.google.com/file/d/1buI...EQ8su1ft5/view
Ruego que algún moderador inserte la imagen en el hilo.
Gracias

No se puede insertar la imagen porque no es un enlace a la misma, sino a una dirección que la carga.
Si puedes obtener la ruta completa a la misma, htt....loquesea.jpg o htt.....lafoto.png entonces sí podríamos ponerla.

Sistel 17-12-2019 11:04:10

Cita:

Empezado por Casimiro Notevi (Mensaje 534813)
No se puede insertar la imagen porque no es un enlace a la misma, sino a una dirección que la carga.
Si puedes obtener la ruta completa a la misma, htt....loquesea.jpg o htt.....lafoto.png entonces sí podríamos ponerla.

Hola,

Lo que solicitaba es que algún moderador descargase la imagen que hay en ese enlace y la subiese al hilo del foro.
No que se pusiese un enlace a la imagen, ya que está ahí sólo provisionalmente.

Gracias

Casimiro Notevi 17-12-2019 11:50:30

Cita:

Empezado por Sistel (Mensaje 534814)
Hola,
Lo que solicitaba es que algún moderador descargase la imagen que hay en ese enlace y la subiese al hilo del foro.
No que se pusiese un enlace a la imagen, ya que está ahí sólo provisionalmente.
Gracias

Pues eso te decía, que la descargues, la subas a un sitio como subefotos.com y pongas el enlace. Un moderador editará el enlace si es necesario.
Además, ya tienes más de 10 mensajes, por lo que puedes poner enlaces.

pablog2k 17-12-2019 11:58:07

la url es esta pero no se como hacer para que ya se vea en el foro

Sistel 17-12-2019 12:09:12

Cita:

Empezado por Casimiro Notevi (Mensaje 534815)
Pues eso te decía, que la descargues, la subas a un sitio como subefotos.com y pongas el enlace. Un moderador editará el enlace si es necesario.
Además, ya tienes más de 10 mensajes, por lo que puedes poner enlaces.

OK.
Pongo el enlace provisional a la imagen:

(No me gusta subefotos.com porque te llena de publicidad)

Como el enlace es provisional, y a mí no me deja insertar imágenes en el foro, de un tamaño como ésta, si un moderador puede descargar la foto y ponerla dentro del foro, mejor.

Gracias


La franja horaria es GMT +2. Ahora son las 20:28:54.

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