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)

espinete 25-01-2021 13:02:11

¿Alguien ha conseguido importar los esquemas XSD para poder generar el "cuerpo" de la petición con los TicketBAI a enviar?

Estoy intentando importar por ejemplo el "LROE_PF_140_1_1_Ingresos_ConfacturaConSG_AltaPeticion_V1_0_1.xsd" pero Delphi Sydney me devuelve el error:

Archivo Adjunto 3885

Solo para confirmar:
Entiendo que los ficheros TicketBAI generados no se envían directamente, sino que se debe crear un XML que contiene como máximo 1000 TicketBAI, codificarlo en Base64, comprimirlo y añadirlo en el cuerpo de la petición/envío, junto con un json como cabecera de la petición y otros requisitos en el header.

El problema es que no puedo usar el XML Data Binding para generar ese XML que contiene los TicketBAI por culpa de ese error.

Entiendo también que cada tipo de TicketBAI usa un esquema XSD diferente según el caso, y que cada petición/envío solo puede contener TicketBAI del mismo tipo/esquema.

¿Soy el único al que le parece todo esto bastante engorroso, o es que he empezado tarde y fue demasiada información de golpe?

Emiliopm 26-01-2021 09:27:51

Buenas compañeros, hemos creado un curso relacionado con TicketBAI en nuestra plataforma abatic . net

Así pues, si estáis interesados en TicketBAI, esta es una buena forma de comenzar.

Durante el curso crearemos una anulación de factura, la firmaremos y la enviaremos a TicketBAI. Todo ello durante 12 horas repartidas en 2 semanas en directo.

Un saludo.

keys 26-01-2021 10:45:31

Cita:

Empezado por espinete (Mensaje 539761)
¿Alguien ha conseguido importar los esquemas XSD para poder generar el "cuerpo" de la petición con los TicketBAI a enviar?

Estoy intentando importar por ejemplo el "LROE_PF_140_1_1_Ingresos_ConfacturaConSG_AltaPeticion_V1_0_1.xsd" pero Delphi Sydney me devuelve el error:

Archivo Adjunto 3885

Solo para confirmar:
Entiendo que los ficheros TicketBAI generados no se envían directamente, sino que se debe crear un XML que contiene como máximo 1000 TicketBAI, codificarlo en Base64, comprimirlo y añadirlo en el cuerpo de la petición/envío, junto con un json como cabecera de la petición y otros requisitos en el header.

El problema es que no puedo usar el XML Data Binding para generar ese XML que contiene los TicketBAI por culpa de ese error.

Entiendo también que cada tipo de TicketBAI usa un esquema XSD diferente según el caso, y que cada petición/envío solo puede contener TicketBAI del mismo tipo/esquema.

¿Soy el único al que le parece todo esto bastante engorroso, o es que he empezado tarde y fue demasiada información de golpe?

Hola.

Yo trabajo con delphi Tokio y no he tenido ningún problema al importar los xsd. ¿Has metido todos los ficheros a descargar dentro de la misma carpeta?. Te adjunto los ficheros importados por si te sirve de algo.

En Bizkaia los ficheros no se envían directamente, sino que van dentro de un modelo de hacienda 140/240. El fichero de ticketbai es el mismo para los dos modelos pero se envían de diferente forma.En Gipuzkoa si se envían directamente y en alava ¿?. La estructura del fichero ticketBAi es la misma para las tres haciendas.

Igual si es un poco engorroso al princio, pero una vez que lo consigues entender es siempre igual.

Animo Compañero.

espinete 26-01-2021 11:48:01

Muchas gracias, keys.

Fallo mío. No descomprimí *todos* los archivos del ZIP, sino únicamente el .xsd que quería importar. Por eso Delphi daba el error, porque necesitaba el resto de archivos. Disculpa, no tenía experiencia usando el XML Data Binding.

Usé un "XML importer" online y ahí sí obtuve un mensaje de error más descriptivo que hacía referencia a que faltaba un archivo, y eso me dio la pista.

A ver si por fin consigo cumplir todos los requisitos para generar una simple petición de envío. Por cierto, hoy martes el entorno de pruebas no estará operativo, según me dicen de Bizkaia.

espinete 26-01-2021 14:05:44

Resumen para envíos a Bizkaia
 
Iba a crear un post-resumen de todo el proceso, al menos de lo que ya tengo, pero creo que ahora mismo no soy el que más experiencia tiene con TicketBAI. De hecho empecé a elaborar el post y son tantos pasos que cuesta explicarlo, así que por ahora lo dejo hasta que esté familiarizado con todo esto.

Ya he conseguido crear el XML final (el LROE), que contiene los TicketBAI firmados a enviar, en Base64 y comprimirlo en ZIP, pero al realizar un envío usando NetHTTPClient solo obtengo Bad Request, así que no sé cual de las 1000 cosas que hay que hacer previamente es la que está mal.

Primero genero el xml del LROE, a partir de uno de los esquemas XSD, concretamente el del envío de "ingresos con factura con software garante". Como son datos de prueba no sé si es que falta (o sobra) algún dato.
Obviamente el fichero "firmado.xml" es el TicketBAI firmado con certificado digital.

Código Delphi [-]
    
    f := NewLROEPF140IngresosConFacturaConSGAltaPeticion;

    f.Cabecera.Modelo:='140';
    f.Cabecera.Ejercicio:=2021;
    f.Cabecera.Capitulo:='';
    f.Cabecera.SubCapitulo:='1.1';
    f.Cabecera.Operacion:='A00';  //A00 = Alta / M00 = Modificación
    f.Cabecera.Version:='';

    f.Cabecera.ObligadoTributario.NIF:='XXXXXXX';
    f.Cabecera.ObligadoTributario.ApellidosNombreRazonSocial:='XXXXXXXXXXXX';

    with f.Ingresos.Add do
    begin
        TicketBai := EncodeFileToBase64('firmado.xml');

        with Renta.Add do
        begin
            Epigrafe:='';
            ImporteIngresoIRPF:='121';
            IngresoAComputarIRPFDiferenteBaseImpoIVA:='121';
            CriterioCobros:='';
        end;
    end;

    XMLDocument2.XML.Text:=f.XML;
    xmldocument2.Active:=True;
    xmldocument2.SaveToFile('lroe.xml');

Tengo dudas con la compresión de dicho XML en gzip. He usado System.ZLib para comprimir el lroe.xml con la siguiente función, pero no estoy seguro de que sea la forma correcta.

Código Delphi [-]
procedure comprimir(origen,destino:string);
var LInput, LOutput: TFileStream;
    LZip: TZCompressionStream;
begin
    { Create the Input, Output, and Compressed streams. }
    LInput := TFileStream.Create(origen, fmOpenRead);
    LOutput := TFileStream.Create(destino, fmCreate);
    LZip := TZCompressionStream.Create(clDefault, LOutput);

    { Compress data. }
    LZip.CopyFrom(LInput, LInput.Size);

    { Free the streams. }
    LZip.Free;
    LInput.Free;
    LOutput.Free;
end;

El envío del LROE lo realizo usando código que encontré en este hilo. No tiene mucha complejidad, pero por si acaso lo pongo:

Código Delphi [-]
    
    NetHTTPRequest1.CustomHeaders['Accept-Encoding'] := 'gzip';
    NetHTTPRequest1.CustomHeaders['Content-Encoding'] := 'gzip';
    NetHTTPRequest1.CustomHeaders['Content-Type'] := 'application/octet-stream';
    NetHTTPRequest1.CustomHeaders['eus-bizkaia-n3-version'] := '1.0';
    NetHTTPRequest1.CustomHeaders['eus-bizkaia-n3-content-type'] := 'application/xml';

    json :=  '{"con": "LROE", "apa": "1.1", "inte": {"nif": "XXXXXXX","nrs": "XXXXXXXXXX","ap1": "","ap2": ""},"drs": {"mode": "140","ejer": "2021"}}';

    NetHTTPRequest1.CustomHeaders['eus-bizkaia-n3-data'] := json;

    ss := TStringStream.Create('', TEncoding.UTF8);
    ss.Position := 0;
    ss.LoadFromFile('archivo.gz');

    NetHTTPRequest1.MethodString := 'POST';
    Memo1.Text := NetHTTPClient1.Post('https://pruesarrerak.bizkaia.eus/N3B4000M/aurkezpena', ss).ContentAsString(tencoding.UTF8);

Pero en el Memo no obtengo nada. Tengo que irme al evento RequestCompleted, y con AResponse.StatusCode y AResponse.StatusText solo obtengo 400 - Bad Request.

Sé que hoy el entorno de pruebas no estará operativo, pero me gustaría saber si lo anterior es correcto o no, porque dudo mucho que las respuestas a las peticiones sean lo suficientemente detalladas como para saber cual es el error exacto en los envíos.

Gracias de antemano. Espero que este post pueda servir también como pequeño resumen del proceso para los que empiecen desde cero, aunque hay muchísimos detalles que faltan.

Dadaista 27-01-2021 08:22:01

Hola buenos dias

Este es mi primer post desde que me di de alta. Despues de leer y releer este Hilo, por fin me atrevo a escribir. Soy un programador independiente con una solucion informatica la cual utilizan en un par de tiendas en vizcaya, entre otras. Es un simple programa de ventas que emite tickets de caja. Realmente yo programo en Java pero me avisaron del tema de ticketbai y despues de dar muchas vueltas por internet, encontré éste foro en el que he podido encontrar bastante información al respecto... para mi, el mejor sitio... despues de lo que he visto que hay por la red.

Lo que os digo anteriormente. Me llamaron desde vizcaya y me dijeron oye!!! ticketbai!!! y encontré este foro. Tengo algunas dudas que no se si alguno de vosotros podria contestarme ya que veo que en el hilo hay personas que saben bastante.

Mi programa es una simulacion de una caja resgistradora que emite tickets de caja desde una computadora con windows 10. Los propietarios de las tiendas pasan la informacion de las ventas a sus asesores/contables y son estos últimos los que se encargan de todo el papeleo con hacienda.

Mi pregunta es, si vosotros veis necesario/obligatorio que yo implemente Ticketbai en mi pequeña aplicación para las personas dueñas de las tiendas donde se utiliza mi aplicacion que se encuentran en Euskadi.

En caso que considereis que es necesario.. los ficheros XML quien los firmaria?... la persona dueña de la tienda o yo?

Perdonad por ser tan extenso y por desviarme un poco del tema central de este hilo pero es que no se me ocurre un sitio mejor donde preguntar. Muchas gracias por leer.

Salu2

keys 27-01-2021 09:34:40

Cita:

Empezado por Dadaista (Mensaje 539779)
Hola buenos dias

Este es mi primer post desde que me di de alta. Despues de leer y releer este Hilo, por fin me atrevo a escribir. Soy un programador independiente con una solucion informatica la cual utilizan en un par de tiendas en vizcaya, entre otras. Es un simple programa de ventas que emite tickets de caja. Realmente yo programo en Java pero me avisaron del tema de ticketbai y despues de dar muchas vueltas por internet, encontré éste foro en el que he podido encontrar bastante información al respecto... para mi, el mejor sitio... despues de lo que he visto que hay por la red.

Lo que os digo anteriormente. Me llamaron desde vizcaya y me dijeron oye!!! ticketbai!!! y encontré este foro. Tengo algunas dudas que no se si alguno de vosotros podria contestarme ya que veo que en el hilo hay personas que saben bastante.

Mi programa es una simulacion de una caja resgistradora que emite tickets de caja desde una computadora con windows 10. Los propietarios de las tiendas pasan la informacion de las ventas a sus asesores/contables y son estos últimos los que se encargan de todo el papeleo con hacienda.

Mi pregunta es, si vosotros veis necesario/obligatorio que yo implemente Ticketbai en mi pequeña aplicación para las personas dueñas de las tiendas donde se utiliza mi aplicacion que se encuentran en Euskadi.

En caso que considereis que es necesario.. los ficheros XML quien los firmaria?... la persona dueña de la tienda o yo?

Perdonad por ser tan extenso y por desviarme un poco del tema central de este hilo pero es que no se me ocurre un sitio mejor donde preguntar. Muchas gracias por leer.

Salu2

Hola.

El envío del fichero va dentro de un modelo de hacienda(140/240) y por lo tanto será tu cliente quien determine si el envío lo va a hacer el o la asesoria. Si tu aplicación emite tickets/facturas tiene que ser tu aplicación el que genere el ficheo TBai si o si, ya que en el ticket tienes que imprimir el código qr y para eso necesitas generar el fichero, y este es el que se tiene que enviar.

Luego el envío lo tendrá que hacer tu aplicación o tendrás que pasar los ficheros xml al asesor para que el realice el envío, siempre y cuando su aplicacion (la del asesor) permita realizar el envio de esos ficheros generados por otra aplicación.

Todo esto sólo en Bizkaia, ya que en Gipuzkoa el envío hay que realizarlo según se genere la factura.

Neftali [Germán.Estévez] 27-01-2021 12:10:09

Cita:

Empezado por Dadaista (Mensaje 539779)
Los propietarios de las tiendas pasan la informacion de las ventas a sus asesores/contables y son estos últimos los que se encargan de todo el papeleo con hacienda.

No comentas "cómo pasan los propietarios esa información". Si es de forma telemática o más manual. De todas formas, sólo evitarías el paso del envío, pero creo que eso es lo de menos, porque es lo más sencillo, todo el trabajo anterior debe hacerlo tu aplicación.

Cita:

Empezado por Dadaista (Mensaje 539779)
Mi pregunta es, si vosotros veis necesario/obligatorio que yo implemente Ticketbai en mi pequeña aplicación para las personas dueñas de las tiendas donde se utiliza mi aplicacion que se encuentran en Euskadi.

Como han comentado, tu aplicación es la que genera tickets, por lo tanto es tu aplicación es la que al generar el ticket, debe crear el archivo XML y firmarlo. Esa información la necesitas para el siguiente ticket.

También tienes que generar el código QR y añadirlo al ticket que se lleva el cliente.

Supongo que si has revisado el hilo, ya la habrás visto, pero esta imagen es bastante explicativa del proceso.
Pasos al facturar en TicketBAI

Cita:

Empezado por Dadaista (Mensaje 539779)
En caso que considereis que es necesario.. los ficheros XML quien los firmaria?... la persona dueña de la tienda o yo?

Como te hemos comentado los ficheros los debe firmar tu aplicación utilizando un certificado, que lo lógico es que vaya a nombre de la dueña, que es la que está tributando.

espinete 27-01-2021 12:20:35

Buenas...

(Parece ser que ) por fin he conseguido hacer un envío. Al menos ya no obtengo Bad Request. He usado el siguiente código facilitado por keys un par de páginas atrás. La única diferencia que había con el mío era la forma de adjuntar el archivo comprimido en la petición:

Código Delphi [-]
var json : string;
    RequestBody: TFileStream;
    AResponse: IHTTPResponse;
begin
    RequestBody := TFileStream.Create('archivo.gz', fmOpenRead);

    NetHTTPClient1.SecureProtocols := [THTTPSecureProtocol.TLS12];
    NetHTTPClient1.CustomHeaders['Accept-Encoding'] := 'gzip';
    NetHTTPClient1.CustomHeaders['Content-Encoding'] := 'gzip';
    NetHTTPClient1.CustomHeaders['Content-Type'] := 'application/octet-stream';
    NetHTTPClient1.CustomHeaders['eus-bizkaia-n3-version'] := '1.0';
    NetHTTPClient1.CustomHeaders['eus-bizkaia-n3-content-type'] := 'application/xml';

    //Formamos los parametros json de entrada
    json :=  f_cabecera_LROE('LROE', //concepto
             '1.1',  //subcapitulo
             'XXXXXXXXX',  //NIF
             'XXXXXXXXXXXXXXXXX',   //Nombre o Razón Social
             '',   //Primer Apellido
             '',   //Segundo Apellido
             '140',   //140 o 240
             '2021'); //Ejercicio

    NetHTTPClient1.CustomHeaders['eus-bizkaia-n3-data'] := json;
    AResponse := NetHTTPClient1.Post('https://pruesarrerak.bizkaia.eus/N3B4000M/aurkezpena',RequestBody);

    memo2.Lines.Append(inttostr(AResponse.StatusCode)+' '+AResponse.StatusText);

    memo2.Lines.Append(AResponse.ContentAsString());
end;

Ahora obtengo 200 - OK, pero nada más. No sé cómo obtener la respuesta al envío, que por lo que he leído, es un archivo comprimido que contiene un XML.

AResponse.ContentAsString() no contiene nada. Está en blanco.

¿Alguien sabe qué hacer a continuación?

tejano 27-01-2021 12:58:01

Fichero LROE comprimido
 
Buenos días,

Que programa estáis utilizando para generar el archivo gz comprimido.

Saludos

espinete 27-01-2021 14:34:14

5 mensajes más arriba tienes un código para comprimir un archivo en .gz usando la librería ZLib que trae Delphi

Neftali [Germán.Estévez] 27-01-2021 14:40:13

Yo las primeras pruebas las hice directamente con Postman y/o con Imsomnia (similar). En ambos casos se permite instalar un certificado cliente y para probar los envíos y obtener las respuestas son suficientes.

Lo digo porque es una forma de comprobar el fichero, la sintaxis, la codificación,... y dejar de lado la codificación en Delphi.
Una vez que sabemos que el fichero es correcto (o que nos tiene que dar determinado error), podemos empezar a codificar.

De esta forma compartimentamos problemas. Si probamos todo a la vez, no sabemos si es del fichero, del certificado, del firnado, del comprimido, del los parámetros, de la forma de envío,...

espinete 27-01-2021 15:04:44

Acabo de probar con Postman y el envío se realiza. Comparé los headers, etc. de Postman con los míos y una de las diferencias era el UserAgent.

Fui a mi código y añadí UserAgent := 'PostmanRuntime/7.26.10'; y ahora sí obtengo una respuesta (bastante larga).

Así que el UserAgent por defecto (Embarcadero URI Client/1.0) parece ser que no sirve, aunque no entiendo el motivo exacto.

Tanto en Postman como con mi proyecto, obtengo un JSON con developerMessage enorme e inservible y Status 500.

El certificado en Postman parece estar correcto, porque en pruebas anteriores sí obtenía un error que hacía referencia a "password invalid" y en otras pruebas sí recibía errores como "el formato del NIF no es válido", por lo que esta respuesta de error 500 cuando todo parece estar bien no sé a qué puede ser debido.

Dadaista 28-01-2021 09:43:16

Muy agradecido keys y Neftali

elcharlie 28-01-2021 10:47:21

Cita:

Se ha abierto la posibilidad de realizar envíos al entorno de pruebas mediante certificados de dispositivo.

Con carácter previo a la remisión de las anotaciones, se deberán comunicar los datos identificativos de el/los certificados de dispositivo mediante la cumplimentación del formulario electrónico al que se puede acceder en el siguiente enlace: https://www.ebizkaia.eus/es/catalogo...os?procID=1740.



En https://www.batuz.eus/es/documentacion-tecnica dispone de un manual para obtener el número de serie asociado al certificado de dispositivo.



Por otro lado, se ha habilitado igualmente en el entorno de pruebas la anulación de los siguientes subcapítulos:



1.1 - Ingresos con factura con Software garante del LROE de personas físicas y entidades sin personalidad jurídica (modelo 140).
1.1 - Facturas emitidas con Software garante del LROE de personas jurídicas y de contribuyentes no residentes con establecimiento permanente (modelo 240).



Las consultas o incidencias relacionadas con el entorno de pruebas se deben dirigir por escrito a batuz@bizkaia.eus.
Esto han enviado desde Batuz, por si alguien le interesa hacer las pruebas con los certificados de dispositivos.

espinete 28-01-2021 11:26:34

Me respondo a mí mismo...

Las respuestas al envío de la petición REST vienen en el Header de la respuesta. Concretamente en estos valores:

Código Delphi [-]
    if AResponse.ContainsHeader('eus-bizkaia-n3-mensaje-respuesta') then
        memo2.Lines.Append(AResponse.HeaderValue['eus-bizkaia-n3-mensaje-respuesta']);

    if AResponse.ContainsHeader('eus-bizkaia-n3-codigo-respuesta') then
        memo2.Lines.Append(AResponse.HeaderValue['eus-bizkaia-n3-codigo-respuesta']);

    if AResponse.ContainsHeader('eus-bizkaia-n3-tipo-respuesta') then
        memo2.Lines.Append(AResponse.HeaderValue['eus-bizkaia-n3-tipo-respuesta']);

Ahora ya consigo ver los distintos motivos de error en los envíos.

espinete 28-01-2021 12:12:55

Me devuelve "Error al descomprimir el fichero.Not in GZIP format", así que me temo que el algoritmo para comprimir en GZIP no es válido.

Buscando en StackOverflow encontré esta variante que parece que sí funciona:

Código Delphi [-]
procedure comprimir(origen,destino:string);
var LInput, LOutput: TFileStream;
    LZip: TZCompressionStream;
begin
    { Create the Input, Output, and Compressed streams. }
    LInput := TFileStream.Create(origen, fmOpenRead);
    LOutput := TFileStream.Create(destino, fmCreate);
    LZip := TZCompressionStream.Create(LOutput, zcDefault, 15 + 16);

    { Compress data. }
    LZip.CopyFrom(LInput, LInput.Size);

    { Free the streams. }
    LZip.Free;
    LInput.Free;
    LOutput.Free;
end;

espinete 28-01-2021 12:50:34

Después de corregir otros errores en el envío (certificado, modelo, etc.) y de adaptar el envío tanto para el 140 como para el 240, etc. ahora obtengo el siguiente error

El XML no cumple el esquema.[Linea:1 Columna:180] Error:cvc-complex-type.2.4.a: Invalid content was found starting with element '{"https://www.batuz.eus/fitxategiak/batuz/LROE/esquemas/LROE_PJ_240_1_1_FacturasEmitidas_ConSG_AltaPeticion_V1_0_1.xsd":Cabecera}'. One of '{Cabecera}' is expected.

Si comparo los XML generados por mi aplicación, con los XML de ejemplo que proporciona Bizkaia, la única diferencia que veo es que los de Bizkaia empiezan así:

<lrpjfecsgap:LROEPJ240FacturasEmitidasConSGAltaPeticion xmlns:lrpjfecsgap="https://www.batuz.eus/fitxategiak/batuz/LROE/esquemas/LROE_PJ_240_1_1_FacturasEmitidas_ConSG_AltaPeticion_V1_0_1.xsd">
<Cabecera>
<Modelo>240</Modelo>
...

...y el mío empieza así...

<LROEPJ240FacturasEmitidasConSGAltaPeticion xmlns="https://www.batuz.eus/fitxategiak/batuz/LROE/esquemas/LROE_PJ_240_1_1_FacturasEmitidas_ConSG_AltaPeticion_V1_0_1.xsd">
<Cabecera>
<Modelo>240</Modelo>
...

¿Alguien más ha tenido este problema? Si la causa es esa... ¿hay forma de forzar a añadir ese prefijo en los XML o hay que hacerlo manualmente modificando directamente los strings antes de guardar el xml?

elcharlie 28-01-2021 17:04:22

Cita:

Empezado por espinete (Mensaje 539801)
Me devuelve "Error al descomprimir el fichero.Not in GZIP format", así que me temo que el algoritmo para comprimir en GZIP no es válido.

Buscando en StackOverflow encontré esta variante que parece que sí funciona:

Código Delphi [-]
procedure comprimir(origen,destino:string);
var LInput, LOutput: TFileStream;
    LZip: TZCompressionStream;
begin
    { Create the Input, Output, and Compressed streams. }
    LInput := TFileStream.Create(origen, fmOpenRead);
    LOutput := TFileStream.Create(destino, fmCreate);
    LZip := TZCompressionStream.Create(LOutput, zcDefault, 15 + 16);

    { Compress data. }
    LZip.CopyFrom(LInput, LInput.Size);

    { Free the streams. }
    LZip.Free;
    LInput.Free;
    LOutput.Free;
end;

Yo creo que lo estas haciendo bien, asi lo hago yo.

espinete 29-01-2021 11:23:29

Hola, sí, eso ya estaba resuelto. El problema que tengo ahora es el del mensaje posterior:

El XML no cumple el esquema.[Linea:1 Columna:180] Error:cvc-complex-type.2.4.a: Invalid content was found starting with element '{"https://www.batuz.eus/fitxategiak/batuz/LROE/esquemas/LROE_PJ_240_1_1_FacturasEmitidas_ConSG_AltaPeticion_V1_0_1.xsd":Cabecera}'. One of '{Cabecera}' is expected.

No entiendo por qué dice que no tiene Cabecera si el XML es idéntico, salvo que el XML "original" incluye el prefijo "lrpjfecsgap"

keys 29-01-2021 11:36:09

Es por que delphi no genera las cabeceras como tiene que ser o no he encontrado la forma de hacerlo.

Antes de enviar hay que rehacer el fichero.

Código:

Para el 140

FicheroCorregir := TStringList.Create;
      FicheroCorregir.LoadFromFile(FicheroDestino);

      FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '<LROEPF140IngresosConFacturaConSGAltaPeticion xmlns="https://www.batuz.eus/fitxategiak/batuz/LROE/esquemas/LROE_PF_140_1_1_Ingresos_ConfacturaConSG_AltaPeticion_V1_0_1.xsd">', '<lrpficfcsgap:LROEPF140IngresosConFacturaConSGAltaPeticion xmlns:lrpficfcsgap="https://www.batuz.eus/fitxategiak/batuz/LROE/esquemas/LROE_PF_140_1_1_Ingresos_ConfacturaConSG_AltaPeticion_V1_0_1.xsd">');
      FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '</LROEPF140IngresosConFacturaConSGAltaPeticion>', '</lrpficfcsgap:LROEPF140IngresosConFacturaConSGAltaPeticion>');
   
      System.SysUtils.DeleteFile(FicheroDestino);
   
      FicheroCorregir.SaveToFile(FicheroDestino);

Código:

Para el 240
FicheroCorregir := TStringList.Create;
      FicheroCorregir.LoadFromFile(FicheroDestino);
      FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '<LROEPJ240FacturasEmitidasConSGAltaPeticion xmlns="https://www.batuz.eus/fitxategiak/batuz/LROE/esquemas/LROE_PJ_240_1_1_FacturasEmitidas_ConSG_AltaPeticion_V1_0_1.xsd">','<lrpjfecsgap:LROEPJ240FacturasEmitidasConSGAltaPeticion xmlns:lrpjfecsgap="https://www.batuz.eus/fitxategiak/batuz/LROE/esquemas/LROE_PJ_240_1_1_FacturasEmitidas_ConSG_AltaPeticion_V1_0_1.xsd">');
      FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '</LROEPJ240FacturasEmitidasConSGAltaPeticion>','</lrpjfecsgap:LROEPJ240FacturasEmitidasConSGAltaPeticion>');
     
      System.SysUtils.DeleteFile(FicheroDestino);
     
      FicheroCorregir.SaveToFile(FicheroDestino);

Esto antes de comprimir y enviarlo.

espinete 29-01-2021 12:41:35

Gracias,. keys.

Estuve revisando el XML Data Binding a ver si había forma de que fuera automático, pero no. Haciendo el cambio manualmente ya no me da ese error.

Me dio otro error relacionado con el orden en el que van los campos en el XML. Al parecer si no están en el orden esperado (Modelo, Capítulo, Subcapitulo, Operacion...) dice que se ha encontrado un campo pero esperaba otro. Se pone tiquismiquis el señorito, pero bueno.

Después de colocarlo todo en el orden correcto, ahora obtengo un error que me hace mucha menos gracia que todos los anteriores:

B4_1000002 - Todos los registros incluidos en la petición son incorrectos.

Pues menuda gracia.

Me ocurre con el 240 y con el 140. Este es el código que utilizo para generar y firmar el XML:

Código Delphi [-]
    f := NewLROEPJ240FacturasEmitidasConSGAltaPeticion;

    f.Cabecera.Modelo:='240';
    f.Cabecera.Capitulo:='1';
    f.Cabecera.SubCapitulo:='1.1';
    f.Cabecera.Operacion:='A00';  //A00 = Alta / M00 = Modificación
    f.Cabecera.Version:='1.0';
    f.Cabecera.Ejercicio:=2021;

    f.Cabecera.ObligadoTributario.NIF:='XXXXXXXX';
    f.Cabecera.ObligadoTributario.ApellidosNombreRazonSocial:='XXXXXXXXXXXXXXXX';

    with f.FacturasEmitidas.Add do
    begin
        TicketBai := EncodeFileToBase64('firmado.xml');
    end;

    XMLDocument2.XML.Text:=f.XML;
    xmldocument2.Active:=True;
    xmldocument2.SaveToFile('lroe.xml');

    FicheroCorregir := TStringList.Create;
    FicheroCorregir.LoadFromFile('lroe.xml');
    FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '','');
    FicheroCorregir.Text := AnsiReplaceStr(FicheroCorregir.Text, '','');
    FicheroCorregir.SaveToFile('lroe.xml');

    comprimir('lroe.xml','archivo.gz');

Y este el del envío:

Código Delphi [-]
    RequestBody := TFileStream.Create('archivo.gz', fmOpenRead);

    NetHTTPClient1.SecureProtocols := [THTTPSecureProtocol.TLS12];
    NetHTTPClient1.CustomHeaders['Accept-Encoding'] := 'gzip';
    NetHTTPClient1.CustomHeaders['Content-Encoding'] := 'gzip';
    NetHTTPClient1.CustomHeaders['Content-Type'] := 'application/octet-stream';
    NetHTTPClient1.CustomHeaders['eus-bizkaia-n3-version'] := '1.0';
    NetHTTPClient1.CustomHeaders['eus-bizkaia-n3-content-type'] := 'application/xml';

    //Formamos los parametros json de entrada
        json :=  f_cabecera_LROE('LROE', //concepto
                                 '1.1',  //apartado (1.1 = Ingreso con Facturas con Software Garante / 2 = Facturas Recibidas
                                 'XXXXXXXX',  //NIF
                                 'XXXXXXXXXXXXXXXXXX',   //Nombre o Razón Social
                                 '',   //Primer Apellido
                                 '',   //Segundo Apellido
                                 '240',   //140 o 240
                                 '2021'); //Ejercicio

    NetHTTPClient1.CustomHeaders['eus-bizkaia-n3-data'] := json;
    AResponse := NetHTTPClient1.Post('https://pruesarrerak.bizkaia.eus/N3B4000M/aurkezpena',RequestBody);


¿En serio? TODOS los registros incluidos en la petición son incorrectos???!?!?

Obviamente en el xml y en el envío no he puesto XXXXXXXX sino los datos correctos, que coinciden con el del certificado digital que estoy usando.

¿Alguien más ha tenido este problema? ¿A qué campos se refiere exactamente?

juramisa 01-02-2021 09:16:41

Consultas
 
Buenos días

El viernes se publicó nuevas posibilidades de Batuz. Entre ellas las consultas, LROE_PF_140_1_1_Ingresos_ConfacturaConSG_Consulta.
Al generar los esquemas os encontraréis que faltan dos valores:
En batuz_enumerados.xsd

Código:

        <simpleType name="EstadoRegistroConsultaEnum">
                <restriction base="string">
                        <enumeration value="Correcto">
                                <annotation>
                                        <documentation>Correcto</documentation>
                                </annotation>
                        </enumeration>
                        <enumeration value="AceptadoConErrores">
                                <annotation>
                                        <documentation>Aceptado con Errores</documentation>
                                </annotation>
                        </enumeration>
                        <enumeration value="Anulado">
                                <annotation>
                                        <documentation>Anulado</documentation>
                                </annotation>
                        </enumeration>
                        <enumeration value="Incorrecto">
                                <annotation>
                                        <documentation>Incorrecto</documentation>
                                </annotation>
                        </enumeration>
                </restriction>
        </simpleType>

en este caso yo lo he sesuento copiando directamente los de "EstadoRegistroEnum" sobre "EstadoRegistroConsultaEnum";

y en Batuz_tiposbasicos.xsd

Código:

        <!-- Cadena de 8 caracteres -->
        <simpleType name="TextMax8Type">
                <restriction base="string">
                        <maxLength value="8"/>
                </restriction>
        </simpleType>

Saludos

espinete 01-02-2021 14:36:33

Buenas...

¿Alguien sabe cómo descomprimir la respuesta a la petición (Bizkaia) usando NetHTTPClient y no los componentes de SecureBlackBox?

Con NetHTTPClient consigo hacer el envío de la petición y obtengo los headers, pero no sé cómo acceder a la respuesta en formato gzip y descomprimirla sin usar los componentes de SecureBlackBox.

Con el otro método que usa dichos componentes sí consigo obtener la respuesta y descomprimir el xml que contiene (con el mensaje de error detallado), pero con NetHTTPClient no sé cómo guardar AResponse.ContentStream en un gzip y luego descomprimir su contenido. Lo he intentado de varias maneras y aunque consigo guardar ContentStream como archivo, me falla al descomprimirlo. Ni siquiera puedo abrir el .gz con WinRAR.

Si alguien pudo hacerlo usando NetHTTPClient y las librerías ZLib se lo agradecería.

PD: El error que me devuelve (usando SecureBlackBox) es el siguiente:

El XML del fichero TicketBAI no cumple el esquema.[Linea:1 Columna:52] Error:cvc-complex-type.2.4.a: Invalid content was found starting with element '{"urn:ticketbai:emision":Cabecera}'. One of '{Cabecera}' is expected.

Pero el XML del TicketBAI obviamente sí tiene cabecera, y no hay diferencias con respecto a los ejemplos oficiales de TicketBAI

keys 02-02-2021 08:21:29

Hola.

Para sacar el fichero de respuesta de hacienda yo hago lo siguiente.

Código:

    Comprimido : TFileStream;

    AResponse := EnvioBizkaia.Post('https://pruesarrerak.bizkaia.eus/N3B4000M/aurkezpena',RequestBody);
    Comprimido := TFileStream.Create(NombreFicheroSalida, fmCreate);
    Comprimido.CopyFrom(AResponse.ContentStream, AResponse.ContentStream.Size);
    Comprimido.Destroy;

El fichero luego hay que descomprimirlo dos veces.

Para la generación del fichero de TBAI, en delphi no genera bien las cabeceras. Yo tengo que hacer lo siguiente despues de haber generado el fichero.
Código:

    Fichero := TStringList.Create;
        Fichero.LoadFromFile(ficheroTemporal);       
        Fichero.Text := AnsiReplaceStr(Fichero.Text, '<TicketBai xmlns="urn:ticketbai:emision">','<T:TicketBai xmlns:T="urn:ticketbai:emision" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ticketbai:emision ticketBaiV12.xsd ">');
        Fichero.Text := AnsiReplaceStr(Fichero.Text,'</TicketBai>', '</T:TicketBai>');

        System.SysUtils.DeleteFile(ficheroTemporal);
        Fichero.SaveToFile(ficheroTemporal);
        Fichero.Destroy;

Un Saludo

espinete 03-02-2021 13:08:41

Gracias, keys. Iba por buen camino, pero solo estaba añadiendo la T: antes de TicketBAI y no en el "xmlns:T=" de después. Ni lo había visto :(

Qué curioso que haya que descomprimir el gzip dos veces. Por cierto, para descomprimirlo usando las librerías de Delphi yo uso este código:

Código Delphi [-]
procedure descomprimir(origen,destino:string);
var LInput, LOutput: TFileStream;
    DecompressionStream: TDecompressionStream;
begin
    LInput := TFileStream.Create(origen, fmOpenRead);
    LOutput := TFileStream.Create(destino, fmCreate);

    //Primera descompresión
    DecompressionStream := TDecompressionStream.Create(LInput, 15 + 16);  // 31 bit wide window = gzip only mode
    LOutput.CopyFrom(DecompressionStream, DecompressionStream.size);

    LOutput.Free;
    LInput.Free;
end;

Como hay que descomprimir dos veces, lo hago así:

Código Delphi [-]
        
    descomprimir('respuesta.gz','respuesta2.gz');
    descomprimir('respuesta2.gz','respuesta.xml');

Y ya luego borro los archivos temporales sobrantes.

Estoy intentando cargar la respuesta XML en el "IXMLLROEPJ240FacturasEmitidasConSGAltaRespuesta" importado, para trabajar "mejor" con las respuestas, pero no lo consigo:

Código Delphi [-]
var Alta240Respuesta : IXMLLROEPJ240FacturasEmitidasConSGAltaRespuesta;
    i : integer;
begin
        Alta240Respuesta := LROE_PJ_240_1_1_FacturasEmitidas_ConSG_AltaRespuesta_V1_0_1.LoadLROEPJ240FacturasEmitidasConSGAltaRe  spuesta('respuesta.xml');
        for i:=0 to Alta240Respuesta.Registros.Count-1 do
        begin
            with Alta240Respuesta.Registros.Registro[i] do
            begin
                memo2.Lines.Append(SituacionRegistro.EstadoRegistro);
                memo2.Lines.Append(SituacionRegistro.CodigoErrorRegistro);
                memo2.Lines.Append(SituacionRegistro.DescripcionErrorRegistro);
                memo2.Lines.Append('');
            end;
        end;
end;

El XML se carga en Alta240Respuesta, porque Alta240Respuesta.XML devuelve el contenido del XML, pero luego no puedo acceder a los valores. No encuentra nada.

No me preocupa mucho porque puedo simplemente cargar el XML en un XMLDocument y trabajar con eso, pero creo que sería más cómodo aprovechar el XML Data Binding, no?

Un saludo y gracias nuevamente. Ahora ya puedo obtener los errores detallados en las respuestas, así que a partir de ahora todo debería ser más sencillo.

espinete 03-02-2021 15:12:57

Problemas con la firma del TicketBAI
 
Hola de nuevo. Después de corregir algunos errores en el XML del TicketBAI, en la petición, formato del gzip, etc. ahora me devuelve este otro error:

FirmaElectronica: La firma no cumple los requisitos de la polÃ*tica de firma TicketBAI.(EPES: S ALGORITMO: rsa-sha256:2048 POLITICA: N CERTIFICADO_ADMITIDO: S )

He usado el código para firma que encontré en el foro, el que usa los componentes de SecureBlackBox 2020. (He suprimido la parte del código que uso para cargar el certificado):

Código Delphi [-]
procedure FirmarXML(archivo : string);
var
  CertificateStorage: TsbxCertificateStorage; 
  CertificateManager: TsbxCertificateManager;
  sbxXAdESSigner1 : TsbxXAdESSigner; 
  cert : TsbxCertificate;
  i : Integer;
begin
  sbxXAdESSigner1 := TsbxXAdESSigner.Create(nil);
  sbxXAdESSigner1.InputFile := archivo;
  sbxXAdESSigner1.OutputFile := 'firmado.xml';

  {.....}

  sbxXAdESSigner1.SignatureType := cxstEnveloped;
  sbxXAdESSigner1.CanonicalizationMethod := cxcmCanon;
  sbxXAdESSigner1.HashAlgorithm := 'SHA256';
  sbxXAdESSigner1.XMLElement := '';  // Todo el documento
  sbxXAdESSigner1.EnableXAdES := True;
  sbxXAdESSigner1.XAdESVersion := xav132;
  sbxXAdESSigner1.XAdESForm := xafEPES;
  sbxXAdESSigner1.Config('SigPolicyID=https://ticketbai.eus/politicafirma'); 
  sbxXAdESSigner1.Config('SigPolicyHash=39D59C038EBB3B7DF6C61ED2F740B318F0C50F93ADCD35E26BE8FF8E76D21D  A8');
  sbxXAdESSigner1.Config('SigPolicyHashAlgorithm=SHA256');
  sbxXAdESSigner1.Config('SigPolicyURI=https://ticketbai.eus/politicafirma');

  try
    sbxXAdESSigner1.Sign();
  except
      MessageDlg('Error en el proceso de firma', mtError, [mbOK], 0);
  end;
end;


No sé si las URLs han cambiado y ahora son distintas. En la documentación he encontrado otra URL...

https://www.euskadi.eus/contenidos/i...irma_v_1_0.pdf

...pero incluso añadiendo esa URL y su correspondiente HASH (que he calculado en https://www.fileformat.info/tool/hash.htm), me devuelve el mismo error.

Como los errores que devuelve Bizkaia son muy ambiguos, no sé si el problema es ese o es otro, la verdad.

juramisa 03-02-2021 20:08:31

Hola

Código Delphi [-]
sbxXAdESSigner1.Config('SigPolicyHash=39D59C038EBB3B7DF6C61ED2F740B318F0C50F93ADCD35E26BE8FF8E76D21D A8');
tienes que fijarte en el valor que se publica en https://www.batuz.eus/es/documentacion-tecnica

Cita:

Firma electrónica TicketBAI 1.0.Documento de especificaciones para la firma electrónica de los ficheros del software garante TicketBAI 1.0. El Hash SHA256 de este documento es el siguiente, el cual se deberá incluir obligatoriamente en la firma electrónica de los ficheros de alta y de anulación de operación con software garante TicketBAI: Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es=
Convertimos ese valor // Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es=
de base64 a HEX
// 42ECE7F7CC773CC6D21F06D4CDA8F97F928EA621F4BBC6EF9B06DB6CD90EF44B

Este es el valor actual
Código Delphi [-]
sbxXAdESSigner1.Config('SigPolicyHash=42ECE7F7CC773CC6D21F06D4CDA8F97F928EA621F4BBC6EF9B06DB6CD90EF4  4B');

elcharlie 04-02-2021 10:28:42

Buenos días:
¿Alguien sabe cuando va a publicarse la información de TBai de Araba? Estamos a 4 de Febrero y no encuentro nada, ¿alguien sabe algo?

espinete 04-02-2021 10:50:56

Gracias, juramisa.

Había probado esa cadena pero en minúsculas, supongo que por eso me daba el error.

De Araba no se sabe nada. Yo envié hace un par de semanas un email solicitando información a las tres direcciones de email (una para cada provincia) y solo me han respondido de Bizkaia (responden bastante rápido) y de Gipuzkoa.

naglro 25-02-2021 21:03:03

Hola compañeros,

Os escribo después de leer las 22 páginas del foro porque tengo una herramienta de facturación online que he creado yo mismo y me llevo semanas investigando sobre cómo implementar Ticketbai pero no consigo encauzar el tema. No soy programador y la aplicación la he hecho con herramientas de nocode (no me abucheéis porfa que me encanta la programación pero no consigo aprender :( porque se me hace muy complicada).

A ver si me podéis comentar algo porque estoy buscando la forma de poder firmar las facturas que emito a través de la aplicación y que cumplan el tema de Ticketbai pero me he encontrado con que no sé cómo lanzar algo que firme el XML.

Por lo que he leído, el proceso de creación de factura consiste en crear el fichero XML y luego firmarlo. Ahora, qué librería de firma electrónica puedo utilizar? Podría utilizar algo que ya haga factura-e y adaptarlo?

Mi idea es montar un servidor que cuente con la aplicación que pueda firmar las facturas y que luego me las devuelva a la herramienta a través de una API pero para ello primero entiendo que necesito una librería a la que llamar. He buscado en github pero no encuentro ninguna.

A ver si me podéis comentar algo porque como no soy programador estoy súper perdido aún leyendo todo lo que habéis comentado.

Muchas gracias de antemano y espero que estéis teniendo una buena tarde/noche.

Emiliopm 25-02-2021 21:17:17

Buenas, nosotros tenemos gran parte desarrollada, y al igual el resto de compañeros, así pues, si lo consideras oportuno, podríamos colaborar.

Eso si, estas cosas en github, con la de horas que nos ha llevado a todos, ojalá me equivoque, no se si lo encontraras .

naglro 25-02-2021 22:29:55

Hola Emiliopm,

Sí, la verdad que me gustsaría poder colaborar.

Perdón por el tema de github, pensaba que todo el mundo ponía ahí el código pero acabo de caer que github es para temas open source claro.

Hasta ahora lo único que sé es el esquema de generación que pensaba que había que firmar primero la factura en PDF y no que había que firmar el fichero .xml. Había descubierto una empresa que se llama signaturit y tienen una API pero es mucho dinero al año por el uso de su API.

Cómo podríamos colaborar?

espinete 01-03-2021 11:24:37

A mí también me interesa poder portar el código Delphi a PHP para otra aplicación online que estoy desarrollando, pero me temo que hasta que no termine con el de Delphi, no podré meterme con el otro.

Por cierto, hace unos días Bizcaia anunció (o eso entendí) que ya se podían hacer pruebas de "consulta de facturas". ¿A alguien le funciona? A mí me devuelve "Internal Server Error" -> "No hay definido un servicio al que llamar para el modelo:240, ejercicio:2021, periodo: 02 y apartado: 1.1".

Por lo que no me queda claro si realmente ya se pueden realizar consultas de facturas enviadas o aún no.

Neftali [Germán.Estévez] 01-03-2021 12:44:43

A medida que va avanzando el tema, la documentación y el hilo crecen.

NOTA DEL MODERADOR: La recopilación de código ha pasado a la primera página de este hilo, al mensaje #2, para que esté más accesible.

yaedev 06-03-2021 12:12:32

Cita:

Empezado por naglro (Mensaje 540198)
Hola compañeros,

Os escribo después de leer las 22 páginas del foro porque tengo una herramienta de facturación online que he creado yo mismo y me llevo semanas investigando sobre cómo implementar Ticketbai pero no consigo encauzar el tema. No soy programador y la aplicación la he hecho con herramientas de nocode (no me abucheéis porfa que me encanta la programación pero no consigo aprender :( porque se me hace muy complicada).

A ver si me podéis comentar algo porque estoy buscando la forma de poder firmar las facturas que emito a través de la aplicación y que cumplan el tema de Ticketbai pero me he encontrado con que no sé cómo lanzar algo que firme el XML.

Por lo que he leído, el proceso de creación de factura consiste en crear el fichero XML y luego firmarlo. Ahora, qué librería de firma electrónica puedo utilizar? Podría utilizar algo que ya haga factura-e y adaptarlo?

Mi idea es montar un servidor que cuente con la aplicación que pueda firmar las facturas y que luego me las devuelva a la herramienta a través de una API pero para ello primero entiendo que necesito una librería a la que llamar. He buscado en github pero no encuentro ninguna.

A ver si me podéis comentar algo porque como no soy programador estoy súper perdido aún leyendo todo lo que habéis comentado.

Muchas gracias de antemano y espero que estéis teniendo una buena tarde/noche.

Hola,

Yo también he empezado a buscar si ya hay algo hecho, pero ya doy por sentado que será algo de pago, y es lógico. Pero al menos encontrar algo asequible . En mi caso me pasa que tengo muy pocos clientes que les vaya a afectar el ticket bai, y no me sale a cuenta la inversión de horas con lo que luego voy a facturar. Para las microempresas o autónomos que tenemos muy pocos clientes afectados nos es un problemón gordo.

Por ahora lo único que he visto es que hay alguna que otra empresa desarrolladora que ya está poniendo en su catálogo de productos una solución API para Ticket BAI. Esto está super bien porque da igual el lenguaje de programación que uses. Tu mandas el fichero con los datos de la factura a través de la API, ésta realiza todo el proceso y luego la API te devuelve el QR y otros datos. Evidentemente son de pago, aunque en sus webs no he visto los precios. Por ahora espero a ver que vayan saliendo más empresas que vean filón de negocio en esto, y empiecen a comercializar soluciones y que alguna sea asequible para los que vayamos a manejar pocos usuarios.

Si alguien de aquí ofrece algo de esto sería interesante saber. Ya sean servicios de API, librerías, etc.

Un saludo

Emiliopm 09-03-2021 10:06:06

Buenas, la verdad es que nosotros hicimos el intento de montar algo que pudiéramos utilizar entre muchos, de ahí este curso:
abatic.net /courses/curso-de-ticketbai-con-delphi/

Pero al final no había interés en ello, no conseguimos que se apuntara nadie en él.

Saludos.

Pau Haro 11-03-2021 11:11:56

Problema con atributo Id en firma TicketBAI
 
Buenas,

Soy nuevo en el foro pero llevo ya 1 mes trabajando con TicketBAI, de momento todo ha ido funcionando, pero una vez tengo ya mi documento firmado, lo envio y me da error (Error: Certificado remitente no válido para emisor factura). Asi que me he puesto a buscar diferencias entre mi XML y el que proporcionan de ejemplo y lo unico que me falta son los atributos (Id) que contienen una cadena tipo "Id="xmldsig-bf662545-f093-444e-8a4d-3d0daaa76d6f"". Mi pregunta es, realmente es necessario el Id ya que segun el estandar no lo es y en caso de que sea necessario como debo generar-lo adecuadamente?


Muchas gracias de antemano.

Neftali [Germán.Estévez] 11-03-2021 12:16:42

Cita:

Empezado por Pau Haro (Mensaje 540322)
...pero una vez tengo ya mi documento firmado, lo envio y me da error (Error: Certificado remitente no válido para emisor factura).

Yo creo que el error es claro: "Certificado remitente no válido para emisor factura".

No creo que sea problema del contenido, sino del certificado que estás utilizando.
Hay que decir que ayer "tocaron" algo de las validaciones de certificados, porque yo llevo utilizando uno de pruebas desde hace tiempo, y desde ayer por la mañana me está devolviendo este error:

Cita:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:TicketBaiResponse xmlns:ns2="urn:ticketbai:emision">
<Salida>
<FechaRecepcion>10-03-2021 11:54:35</FechaRecepcion>
<Estado>01</Estado>
<Descripcion>Rechazado</Descripcion>
<Azalpena>Baztertua</Azalpena>
<ResultadosValidacion>
<Codigo>001</Codigo>
<Descripcion>Error: Certificado remitente incorrecto (revocado o no homologado)</Descripcion>
<Azalpena>Akatsa: Bidaltzailearen ziurtagiria okerra (ezeztatua edo ez-homologatua)</Azalpena>
</ResultadosValidacion>
</Salida>
</ns2:TicketBaiResponse>

Yo intentaría probar con otro certificado, sin modificar le fichero.

P.D: No voy a hacer comentarios sobre el que está al otro lado y que parece que si ya no tenemos bastante con lo que tenemos que hacer, para que esté "facilitándonos" el trabajo con estos temas... :mad::mad:
No se están poniendo en el lugar de los desarrolladores y creo que antes o después lo van a pagar. Recordemos que algun "lubreras" dijo que el coste de la solución informática sería de 150€. Quien encuentre una que cueste eso, que nos lo diga a los demás...

"
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,..."

(link a la noticia)

keys 22-03-2021 08:41:02

Hola.

Por si a alguien le interesa el sabado saliio en prensa que Gipuzkoa va a realizar un par de jornadas. Lo raro es que no sale en la página de gipuzkoa y no han avisado los a los desarrolladores, por lo menos a nosotros.

https://www.diariovasco.com/oarsoald...1257-ntvo.html


La franja horaria es GMT +2. Ahora son las 10:42:10.

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