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

Sistel 17-12-2019 12:11:25

Cita:

Empezado por pablog2k (Mensaje 534816)
la url es esta pero no se como hacer para que ya se vea en el foro
https://subefotos.com/ver/?188fc3b19...70360aa94o.jpg

El foro tiene opción para poner imágenes adjuntas.
Pero a mí no me deja mayores de 40 KB.
Supongo que por mi nivel de usuario.

Sistel 17-12-2019 12:16:15

Cita:

Empezado por pablog2k (Mensaje 534808)
gracias Sistel. Me quedo a la espera de la imagen que vas a subir
Saludos

Hola pablog2k,

¿Te queda más claro el proceso con el gráfico?

Lo que aún no han dicho es qué plazo habrá para el envío de las facturas XML firmadas a Hacienda.
Para el SII son 4 días naturales desde la expedición de la factura.
Me imagino que para Ticketbai pondrán un plazo similar (espero).

Saludos

pablog2k 17-12-2019 13:39:48

hola,si si, muchas gracias.
ahora estoy yo(y supongo que todos) a la espera que manden los WSDL definitivos y aclaren un poco el tema de los certificados....

keys 18-12-2019 11:06:49

Hola a todos. Ayer salío la noticia sobre ticketBai en varios medios de comunicación del pais vasco.

Os pongo algunos enlaces.

https://www.deia.eus/2019/12/18/bizk...sas-desde-2021

La adaptación al sistema supondrá un desembolso económico para los contribuyentes, ya que en algunos casos tendrán que adquirir el software -que no superará los 150 euros, según los cálculos de la Diputación-

El software se podrá adquirir en el mercado, al igual que cualquier otro programa de facturación o contabilidad. Según informó el director de Hacienda, Iñaki Alonso, entre abril y noviembre, 131 empresas y desarrolladores de software trabajaron en una prueba piloto para desarrollar los procesos informáticos necesarios. En la web foral se publicará un listado de todos los desarrolladores que adecuarán su software a los requisitos del sistema, que tendrán que registrarse en Hacienda.

QUE MAJOS YA SABEN LO QUE VAMOS A COBRAR.

https://www.cope.es/emisoras/pais-va...0191217_576069

pablog2k 18-12-2019 11:19:56

yo también he flipado con la noticia :eek:
"no superará los 150€"
buenos cálculos ha hecho la diputación :confused:
en fin me río por no llorar

Neftali [Germán.Estévez] 18-12-2019 17:22:19

Cita:

Empezado por keys (Mensaje 534838)
ya que en algunos casos tendrán que adquirir el software -que no superará los 150 euros, según los cálculos de la Diputación-


Habría que ver quien a hecho ese cálculo :D:D:D:D:D:D
150€¿?¿?¿?¿?¿
Chupatintas claramente.

Sistel 18-12-2019 19:48:40

Hola,

Tenéis el resumen de la presentación que hicieron, ayer, el Diputado Foral de Hacienda y el Director de Hacienda de Bizkaia, a la prensa, en http://web.bizkaia.eus/es/web/area-d...tailView/20665
También tenéis el video completo de la presentación (42 minutos) en http://web.bizkaia.eus/es/web/area-d...tailView/20662

Me han parecido muy curiosos algunos aspectos:
- El precio que evalúan que puede costar a un comercio la implantación de Ticketbai
- El precio que piensan que vale un TPV o una impresora de tickets
- Las fuertes sanciones que se impondrán a las empresas de software que implanten software que permita la doble contabilidad.
- El nuevo registro de empresas informáticas autorizadas para implantar Ticketbai
- El nuevo modelo 240
- ...

Saludos

keys 19-12-2019 13:38:51

Acaban de enviar la información definitiva de Ticket Bai.

La hacienda de Gupizkoa ya lo tiene puesto en su pagina web.


https://www.gipuzkoa.eus/es/web/ogas...generated-id-2

Los plazos se alargan.

pablog2k 19-12-2019 13:52:29

gracias keys, vamos a echarle un vistazo

"En el caso de los/las contribuyentes guipuzcoanos/as, tan pronto se emita la factura, el programa remitirá el archivo XML-TBAI a la Hacienda Foral de Gipuzkoa, es decir, la remisión será online.
Ello conllevará que debe tenerse acceso a internet."

esto quiere decir que no se pueden enviar después? como se había planteado por aquí.
me parece un poco fuerte....

Neftali [Germán.Estévez] 19-12-2019 15:25:13

Tal como comenta [keys] han enviado la información definitiva.
Os adjunto a este mensaje los documentos definitivos y las nuevas direcciones de contacto segun las diferenyes administraciones.También enlazaré a esta información desde el hilo principal.

NOTA: Adjunto las versiones en Euskera (que no se diga)... ;);)

bilbur 23-12-2019 17:29:13

CRC8 conforme a las nuevas especificaciones técnicas de TBAI
 
Para su implementación en PHP


la función ( algoritmo o clase) para calcular el código CRC8 de comprobación está publicado en JAVA en la nueva documentación técnica de TBAI


Al intentar adaptarlo a PHP, no me devuelve los mismos códigos que en los ejemplos.


Tras investigar (google, foros PHP, etc) tengo un algoritmo que parace que funciona:


Sería este:


function crc8($data)
{

$crc8_table = array(
0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d,
0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65, 0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d,
0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd,
0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd,
0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2, 0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea,
0xb7, 0xb0, 0xb9, 0xbe, 0xab, 0xac, 0xa5, 0xa2, 0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a,
0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32, 0x1f, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0d, 0x0a,
0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42, 0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a,
0x89, 0x8e, 0x87, 0x80, 0x95, 0x92, 0x9b, 0x9c, 0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4,
0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec, 0xc1, 0xc6, 0xcf, 0xc8, 0xdd, 0xda, 0xd3, 0xd4,
0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c, 0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44,
0x19, 0x1e, 0x17, 0x10, 0x05, 0x02, 0x0b, 0x0c, 0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34,
0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b, 0x76, 0x71, 0x78, 0x7f, 0x6a, 0x6d, 0x64, 0x63,
0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b, 0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13,
0xae, 0xa9, 0xa0, 0xa7, 0xb2, 0xb5, 0xbc, 0xbb, 0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83,
0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb, 0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3);

$data = unpack("C*",$data);
$crc = 0x0;
foreach ($data as $d)
$crc = $crc8_table[$d ^ $crc];
$crc = $crc ^ 0x0;
return str_pad(($crc & 0xff),3,"0",STR_PAD_LEFT);
}



Invocado con los dos ejemplos

$TBAIID ='TBAI-00000006Y-251019-btFpwP8dcLGAF-';
$TBAIID = utf8_encode($TBAIID);
echo $TBAIID.'<br>';
echo 'debe ser 237 y es '.crc8($TBAIID).'<br>';

Resultado = 237


$TBAIID = '--batuz.eus/QRTBAI/?id=TBAI-00000006Y-251019-btFpwP8dcLGAF-237&s=T&nf=27174&i=4.70';
$TBAIID = utf8_encode($TBAIID);
echo $TBAIID.'<br>';
echo 'debe ser 007 y es '.crc8($TBAIID).'<br>';

Resultado = 007

Espero que a alguien le sirva


Un saludo

Sistel 23-12-2019 22:46:43

Cita:

Empezado por bilbur (Mensaje 534948)
Para su implementación en PHP
la función ( algoritmo o clase) para calcular el código CRC8 de comprobación está publicado en JAVA en la nueva documentación técnica de TBAI
Al intentar adaptarlo a PHP, no me devuelve los mismos códigos que en los ejemplos.
Tras investigar (google, foros PHP, etc) tengo un algoritmo que parace que funciona:
Sería este:
...

¡¡¡ Genial !!!

Muchas gracias, me viene de perlas.

keys 24-12-2019 10:31:19

Hola a todos. Buscando por internet y haciendo pruebas pongo el código para Delphi. Para los dos ejemplos funciona.

Código Delphi [-]
 function crc8(Buffer:String;Polynom,Initial:Cardinal):Cardinal;
var
  i,j : Integer;
begin

 Result:=Initial;
 for i:=1 to Length(Buffer) do begin
   Result:=Result xor ord(buffer[i]);
   for j:=0 to 7 do begin
     if (Result and $80)<>0 then Result:=(Result shl 1) xor Polynom
     else Result:=Result shl 1;
     end;
   end;
 Result:=Result and $ff;
end;

 Crc8('TBAI-00000006Y-251019-btFpwP8dcLGAF-', $07, 0); = '237'
 Crc8('https://batuz.eus/QRTBAI/?id=TBAI-00000006Y-251019-btFpwP8dcLGAF-237&s=T&nf=27174&i=4.70', $07, 0); = '007'

elcharlie 26-12-2019 10:13:38

Hola a todos, pues yo también os dejo el código de la función de crc8 en delphi. He intentendo hacerlo lo más parecido al jemplo de Java. Espero que os sirva. Un saludo y Feliz Navidad.
Código Delphi [-]
const
  CRC8_Table: array[0..255] of Byte = (
    $00, $07, $0E, $09, $1C, $1B, $12, $15,
    $38, $3F, $36, $31, $24, $23, $2A, $2D,
    $70, $77, $7E, $79, $6C, $6B, $62, $65,
    $48, $4F, $46, $41, $54, $53, $5A, $5D,
    $E0, $E7, $EE, $E9, $FC, $FB, $F2, $F5,
    $D8, $DF, $D6, $D1, $C4, $C3, $CA, $CD,
    $90, $97, $9E, $99, $8C, $8B, $82, $85,
    $A8, $AF, $A6, $A1, $B4, $B3, $BA, $BD,
    $C7, $C0, $C9, $CE, $DB, $DC, $D5, $D2,
    $FF, $F8, $F1, $F6, $E3, $E4, $ED, $EA,
    $B7, $B0, $B9, $BE, $AB, $AC, $A5, $A2,
    $8F, $88, $81, $86, $93, $94, $9D, $9A,
    $27, $20, $29, $2E, $3B, $3C, $35, $32,
    $1F, $18, $11, $16, $03, $04, $0D, $0A,
    $57, $50, $59, $5E, $4B, $4C, $45, $42,
    $6F, $68, $61, $66, $73, $74, $7D, $7A,
    $89, $8E, $87, $80, $95, $92, $9B, $9C,
    $B1, $B6, $BF, $B8, $AD, $AA, $A3, $A4,
    $F9, $FE, $F7, $F0, $E5, $E2, $EB, $EC,
    $C1, $C6, $CF, $C8, $DD, $DA, $D3, $D4,
    $69, $6E, $67, $60, $75, $72, $7B, $7C,
    $51, $56, $5F, $58, $4D, $4A, $43, $44,
    $19, $1E, $17, $10, $05, $02, $0B, $0C,
    $21, $26, $2F, $28, $3D, $3A, $33, $34,
    $4E, $49, $40, $47, $52, $55, $5C, $5B,
    $76, $71, $78, $7F, $6A, $6D, $64, $63,
    $3E, $39, $30, $37, $22, $25, $2C, $2B,
    $06, $01, $08, $0F, $1A, $1D, $14, $13,
    $AE, $A9, $A0, $A7, $B2, $B5, $BC, $BB,
    $96, $91, $98, $9F, $8A, $8D, $84, $83,
    $DE, $D9, $D0, $D7, $C2, $C5, $CC, $CB,
    $E6, $E1, $E8, $EF, $FA, $FD, $F4, $F3);


function Calculate_CRC8(Cadena: String):String;
var
  data: TArray;
  len, i: Integer;
  crc: byte;
begin
  data := TEncoding.UTF8.GetBytes(Cadena);
  len := Length(data);
  crc := 0;

  for i := 0 to len-1 do
    crc := CRC8_Table[(crc xor data[i]) and $FF];

  Result := Format('%.*d', [3, (crc and $FF)]);
end;

Neftali [Germán.Estévez] 30-12-2019 15:54:10

Cita:

Empezado por keys (Mensaje 534962)
Hola a todos. Buscando por internet y haciendo pruebas pongo el código para Delphi. Para los dos ejemplos funciona.

Cita:

Empezado por elcharlie (Mensaje 534982)
Hola a todos, pues yo también os dejo el código de la función de crc8 en delphi. He intentendo hacerlo lo más parecido al jemplo de Java. Espero que os sirva. Un saludo y Feliz Navidad.


^\||/^\||/^\||/^\||/^\||/
Muchas gracias a ambos.

NOTA: Actualizado el mensaje original con los links a los códigos (PHP y Delphi).

bilbur 30-12-2019 20:28:01

Dispositivo de facturación
 
De la documentación técnica:


Dispositivo de facturación: dispositivo desde el que se accede a la aplicación de facturación, independientemente de que dicho dispositivo acceda a un servidor remoto para el funcionamiento de la aplicación. Por ejemplo: en una aplicación web, el número de serie será el del dispositivo que tiene instalado el navegador. No será, por tanto, el servidor remoto al que accede.


En mi caso la aplicación de facturación accede a un servidor remoto (mediante navegador).
Puede acceder al servidor una cantidad importante de dispositivos.

Mediante programación puedo acceder a la siguiente información del cliente que se conecta:
  • Serie del disco duro (problema, puede tener varios discos duros o particiones)
  • Serie de la BIOS (me sale una cadena en blanco, vacia)
  • Serie del procesador (parece correcto)
  • La IP del cliente (IP interna fija o IP por VPN también fija)
  • La MAC del cliente
No puedo acceder al ID de dispositivo del cliente (en win10 es algo así : 1055263D-F231-43D3-9DB4-D62D3D9629E0)


Mi idea es crear una tabla manual en el servidor con la MAC del cliente y la id de su dispositivo.


Antes de continuar me gustaría saber cómo solventáis vosotros este tema, no sea que esté haciendo el novato y exista una solución mejor.


Gracias

Sistel 30-12-2019 22:01:02

Cita:

Empezado por bilbur (Mensaje 535017)
De la documentación técnica:

Dispositivo de facturación: dispositivo desde el que se accede a la aplicación de facturación, independientemente de que dicho dispositivo acceda a un servidor remoto para el funcionamiento de la aplicación. Por ejemplo: en una aplicación web, el número de serie será el del dispositivo que tiene instalado el navegador. No será, por tanto, el servidor remoto al que accede.

En mi caso la aplicación de facturación accede a un servidor remoto (mediante navegador).
Puede acceder al servidor una cantidad importante de dispositivos.

Mediante programación puedo acceder a la siguiente información del cliente que se conecta:
  • Serie del disco duro (problema, puede tener varios discos duros o particiones)
  • Serie de la BIOS (me sale una cadena en blanco, vacia)
  • Serie del procesador (parece correcto)
  • La IP del cliente (IP interna fija o IP por VPN también fija)
  • La MAC del cliente
No puedo acceder al ID de dispositivo del cliente (en win10 es algo así : 1055263D-F231-43D3-9DB4-D62D3D9629E0)

Mi idea es crear una tabla manual en el servidor con la MAC del cliente y la id de su dispositivo.

Antes de continuar me gustaría saber cómo solventáis vosotros este tema, no sea que esté haciendo el novato y exista una solución mejor.

Gracias

En mi caso, se puede acceder al programa de facturación desde cualquier ordenador, smartphone o tablet conectado a Internet que se tenga a mano.
Para acceder, se utiliza cualquier navegador web simplemente autenticándose mediante usuario y contraseña.
Y, en el caso de algunos comerciales y transportistas en movilidad, pueden utilizar un PC ajeno (por ejemplo, el ordenador del cliente al que están visitando cuando ellos tienen mala conectividad de datos desde su portátil o smartphone)
Lógicamente, no se puede instalar ningún certificado ni software en los ordenadores ajenos desde los que se accede.
Y, por tanto, no hay forma de tener un certificado de dispositivo ni de obtener desde el servidor de facturación ningún identificativo fijo de dispositivo.

Lo he consultado al buzón de TicketBAI y estoy a la espera de respuesta.

Saludos

Sistel 30-12-2019 22:08:30

Por cierto, en otra consulta anterior a TicketBAI, me respondieron que en la fase piloto se había utilizado, con éxito, en algunos casos, la MAC del dispositivo para utilizarla con identificativo del dispositivo.
Supongo que se le otrogaba un certificado de dispositivo a ese identificativo de MAC.

Pero, en mi caso, no es posible porque puede ser que la conexión sea desde un dispositivo ajeno a la empresa (como he indicado antes).
Y, aparte, tampoco veo la forma de obtener la MAC del dispositivo que se conecta desde el servidor web, remoto, de facturación.

Saludos

Sistel 30-12-2019 22:25:26

En el punto 4.2.2 - Arquitecturas con firma en servidor, del documento de Política de firma, dice:

De forma complementaria, si la emisión de facturas se realiza en procesos desasistidos (batch) se
considera “arquitectura con firma en servidor”.

... En este caso, no se permite la firma con certificado de dispositivo.


El tema ahora es que tampoco se debería exigir certificado de dispositivo, en arquitecturas con firma en servidor (aunque no sean procesos desasistidos), si no es posible identificar el dispositivo desde el que se accede.

Espero respuesta de TicketBAI sobre el tema.
Les he propuesto que se pueda utilizar como identificativo del dispositivo (para la generación del código TBAI) un valor enviado mediante una cookie.

Saludos

xamminf 31-12-2019 12:37:42

Cita:

Empezado por pablog2k (Mensaje 534864)
gracias keys, vamos a echarle un vistazo

"En el caso de los/las contribuyentes guipuzcoanos/as, tan pronto se emita la factura, el programa remitirá el archivo XML-TBAI a la Hacienda Foral de Gipuzkoa, es decir, la remisión será online.
Ello conllevará que debe tenerse acceso a internet."

esto quiere decir que no se pueden enviar después? como se había planteado por aquí.
me parece un poco fuerte....

¿ Y cómo sabrán que no se manda después ? ¿ Lleva datos de stamp impresión el .xml ?


La franja horaria es GMT +2. Ahora son las 18:13:05.

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