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] 09-10-2020 10:37:06

Gracias.
Luego actualizo los ficheros en el FTP.

keys 09-10-2020 10:53:02

Perdón lo intente con la etiqueta para código en delphi pero no salia bien, no había visto la de php.

:D

keys 13-10-2020 08:33:01

Hola a todos, me imagino que ya os habéis enterado.

Las haciendas de Bizkaia y Gipuzkoa van a empezar un periodo de pruebas. Gipuzkoa hoy día 13 y Bizkaia en breve.

https://www.batuz.eus/es/inicio

https://www.gipuzkoa.eus/es/web/ogas...e-fiscal/t-bai

Un Saludo.

Casimiro Notevi 13-10-2020 11:02:48

Cita:

Empezado por keys (Mensaje 538684)
Perdón lo intente con la etiqueta para código en delphi pero no salia bien, no había visto la de php. :D

Tienes razón, tuve que probar otros para ver cómo se veía y el de php parece que es el más idóneo.
Saludos.

keys 16-10-2020 08:39:04

Hola a todos.

Bizkaia a publicado nuevos ficheros para el envío del 140/240 www.batuz.eus por cierto les he comentado lo del espacio en el xsd que da error al importarlos en el xml databinding y me han dicho que es un error y que lo van a corregir. No se si en lo subido esta corregido ya que sus xsd de envio del 140/240 da el mismo error.

Por otra parte. Al importar los ficheros xsd con el xml databindig y generar los xml con delphi no añade el espacio de nombres. Es decir pone

Código:

<TicketBai xmlns="urn:ticketbai:emision">
y ellos quieren que ponga

Código:

<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 ">
Yo lo que estoy haciendo una vez generado el fichero cambiarlo a pelo. ¿Pero hay alguna forma que la clase IXMLDocument lo genere asi directamente?.

Un Saludo.

elcharlie 16-10-2020 10:59:34

Buenas a todos,
¿Alguien ha podido enviar alguna factura/ticket al servidor de Gipuzkoa? Es que a mi siempre me esta retornando esto:
Código PHP:

<ns2:TicketBaiResponse xmlns:ns2="http://ticketbai.eus">
   <
Salida>
      <
FechaRecepcion>16-10-2020 10:50:32</FechaRecepcion>
      <
Estado>01</Estado>
      <
Descripcion>Rechazado</Descripcion>
      <
Azalpena>Baztertua</Azalpena>
      <
ResultadosValidacion>
         <
Codigo>006</Codigo>
         <
Descripcion>ErrorEl servicio de recepción no está disponibleRepita la operación más tarde</Descripcion>
         <
Azalpena>AkatsaJasotze zerbitzua ez dago erabilgarriEgin berriro eragiketa geroago</Azalpena>
      </
ResultadosValidacion>
   </
Salida>
</
ns2:TicketBaiResponse


elcharlie 16-10-2020 11:02:12

Cita:

Empezado por keys (Mensaje 538739)
Hola a todos.

Bizkaia a publicado nuevos ficheros para el envío del 140/240 www.batuz.eus por cierto les he comentado lo del espacio en el xsd que da error al importarlos en el xml databinding y me han dicho que es un error y que lo van a corregir. No se si en lo subido esta corregido ya que sus xsd de envio del 140/240 da el mismo error.

Por otra parte. Al importar los ficheros xsd con el xml databindig y generar los xml con delphi no añade el espacio de nombres. Es decir pone

Código:

<TicketBai xmlns="urn:ticketbai:emision">
y ellos quieren que ponga

Código:

<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 ">
Yo lo que estoy haciendo una vez generado el fichero cambiarlo a pelo. ¿Pero hay alguna forma que la clase IXMLDocument lo genere asi directamente?.

Un Saludo.

Yo tambien lo estoy cambiando a mano, pero solo estoy añadiendo esto:
Código PHP:

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


keys 16-10-2020 11:56:58

Puede ser que valga solo con eso.
Yo he cogido lo que viene en un fichero de ejemplo de la hacienda de gipuzkoa que me han mandado.

elcharlie 20-10-2020 11:02:35

Hola a todos,
hoy me han mandado esto los de la diputación de Gipuzkoa. Les mandé un email. porque el servicio web siempre me respondía con el mensaje "Error: El servicio de recepción no está disponible. Repita la operación más tarde".
Por si os sirve de ayuda.

Cita:

Buenos días,
Hemos detectado que hay un problema derivado de la comprobación de la política de firma, estamos revisando como está implementada esta comprobación.
Si se envía el fichero sin indicar una política de firma explícita, creemos que funcionará.

Un saludo,

juramisa 20-10-2020 19:36:45

Petición al servicio
 
Buenas tardes,

Os pido ayuda para el envío del fichero LROE, siempre me da error desconocido.
Estoy usando los componente TNetHTTPRequest y TNetHTTPClient, pero si alguien me da otra opción más sencilla y que funcione, estoy dispuesto a cambiar.

Os expongo el código a ver si alguien puede ayudarme, que hago mal.

en TNetHTTPClient cargo el cerificado:

Código Delphi [-]
procedure TfrmEnvelm.NetHTTPClient1NeedClientCertificate(const Sender: TObject; const ARequest: TURLRequest; const ACertificateList: TCertificateList; var AnIndex: Integer);
var
  i: Integer;
begin
  for i := 0 to ACertificateList.Count - 1 do
  begin

    if SameText(ACertificateList[i].Subject, mi_certificado.Caption) then
    begin
      AnIndex := i;
      break;
    end;
  end;
end;

Genero el fichero XML y lo comprimo en formato gzip.

Código Delphi [-]
    

function TfrmEnvelm.f_cabecera_LROE(mi_con, mi_apa, mi_nif, mi_nrs, mi_ap1, mi_ap2, mi_mode, mi_eje : string): string;
begin
  result := Format('{"con": "%s", "apa": "%s", "inte": {"nif": "%s","nrs": "%s","ap1": "%s","ap2": "%s"},"drs": {"mode": "%s","ejer": "%s"}}', [mi_con, mi_apa, mi_nif, mi_nrs, mi_ap1, mi_ap2, mi_mode, mi_eje]);
end;


var
  Src, Dst: TFileStream;
  ResponseContent: TMemoryStream;
  Encoding: TEncoding;
  ss: TStringStream;
....
    SaveAsUTF8(DMBatu.CDSEnvc.FieldByName('EN050').AsString, el_xml.XML);
    Src := TFileStream.Create(DMBatu.CDSEnvc.FieldByName('EN050').AsString, fmOpenRead);
    try
      Dst := TFileStream.Create(DMBatu.CDSEnvc.FieldByName('EN050').AsString + '.gz', fmCreate);
      try
        MakeGZ(Src, Dst);
      finally
        Dst.Free;
      end;
    finally
      Src.Free;
    end;

Cargo cabecera y cuerpo de https, y realizo la llamada.

Código Delphi [-]
   
      if FileExists(DMBatu.CDSEnvc.FieldByName('EN050').AsString + '.gz') then
      begin
        NetHTTPRequest1.CustomHeaders['Accept-Encoding'] := el_accept_Encoding;
        NetHTTPRequest1.CustomHeaders['Content-Encoding'] := el_Content_Encoding;
        NetHTTPRequest1.CustomHeaders['Content-Type'] := el_Content_Type;
        NetHTTPRequest1.CustomHeaders['eus-bizkaia-n3-version'] := el_eus_bizkaia_n3_version;
        NetHTTPRequest1.CustomHeaders['eus-bizkaia-n3-content-type'] := el_eus_bizkaia_n3_content_type;
        el_eus_bizkaia_n3_data :=  f_cabecera_LROE(el_concepto,
                                                   el_subcapitulo,
                                                   DMBatu.CDSPres.FieldByName('PR020').AsString,
                                                   DMBatu.CDSPres.FieldByName('PR040').AsString,
                                                   DMBatu.CDSPres.FieldByName('PR090').AsString,
                                                   DMBatu.CDSPres.FieldByName('PR100').AsString,
                                                   DMBatu.CDSPres.FieldByName('PR080').AsString,
                                                   txtEjer.Text);
        NetHTTPRequest1.CustomHeaders['eus-bizkaia-n3-data'] := el_eus_bizkaia_n3_data;
        ss := TStringStream.Create('', TEncoding.UTF8);
        ss.Position := 0;
        ss.LoadFromFile(DMBatu.CDSEnvc.FieldByName('EN050').AsString + '.gz');

        NetHTTPRequest1.MethodString := 'POST';
        Memo1.Text := NetHTTPClient1.Post(la_url, ss).ContentAsString(tencoding.UTF8);

Las variables siguientes, se leen de un fichero de configuración:

Código Delphi [-]
    la_url := 'https://sarrerak.bizkaia.eus/aurkezpena';
    el_accept_Encoding := 'gzip';
    el_Content_Encoding := 'gzip';
    el_Content_Type := 'application/octet-stream';
    el_eus_bizkaia_n3_version := '1.0';
    el_eus_bizkaia_n3_content_type := 'application/xml';
    el_Concepto := 'LROE';
   el_subcapitulo := '1.1';
Tengo dudas si el cuerpo debe de estar en hexadecimal.

Estoy abierto a todo, ya no se por donde seguir,
Gracias

keys 21-10-2020 08:14:32

Hola a todos.

No te he revisado todo pero vas por buen camino.

El problemaes es que en Bizkaia no han empezado el periodo de prueba de los envíos. Site fijas en la url https://sarrerak.bizkaia.eus/aurkezpena y pinchas te dice que el servidor no esta disponible.

Esa es la dirección de producción, es decir la definitiva. Tienen que publicar la dirección del entorno de pruebas que me imagino que será distinta.

Si tienes que hacer también Gipuzkoa, puedes empezar por ellos que ya tienen el periodo de pruebas de envíos en marcha y es más sencillo.

Un Saludo.

juramisa 21-10-2020 10:20:05

Gracias,

Me quitas un gran peso de encima. Estoy mirando Gipuzkoa, no se me da el caso, y es totalmente distinto. En esta hacienda mandan directamente el XML del ticketbai. De todas formas sabes si Bizkaia, ¿ va a habilitar portal de pruebas?. Si no les pongo una consulta, a ver que responden.

Saludos

keys 21-10-2020 10:43:25

Si van a habilitar entorno de pruebas. Se supone que en unos días.

juramisa 22-10-2020 08:08:50

Buenos días hice la consulta en relación al entorno de pruebas antes de que me respondiera keys, y esta es la respuesta:

Cita:

Kaixo,

A partir de 01/01/2022, las empresas y autónomos sujetos a la normativa de Bizkaia estarán obligadas a la llevanza del libro registro de operaciones económicas (en adelante, LROE) a través de la sede electrónica de la Diputación Foral de Bizkaia, mediante el suministro electrónico de las anotaciones que lo componen.

El suministro electrónico de las anotaciones que componen el LROE se realizará mediante servicios web o, en su caso, a través de los correspondientes formularios electrónicos, todo ello conforme a las especificaciones técnicas y funcionales que se aprueben por Orden Foral del diputado foral de Hacienda y Finanzas.

En el mes de noviembre de 2020 se habilitará el entorno de pruebas de los servicios web del LROE.

Para realizar estas pruebas, no es necesario que la empresa de software se inscriba en el registro de software garante TicketBAI.

Los datos que se reciban dentro de este entorno tendrán exclusivamente el tratamiento de datos de prueba.

El detalle de las condiciones para realizar las pruebas se publicará próximamente en el apartado Documentación técnica de la página web www.batuz.eus.

Les avisaremos de dicha publicación mediante aviso en el apartado Novedades de la página web www.batuz.eus y correo a través de este buzón.

juramisa 04-11-2020 18:27:29

Entorno de pruebas
 
Buenas tardes
Ya se ha puesto en marcha el entorno de pruebas LROE en Bizkaia, estoy probando, y en:

Código Delphi [-]
unit System.Net.HttpClient.Win;

procedure TWinHTTPClient.DoGetClientCertificates(const ARequest: THTTPRequest;
  const ACertificateList: TList);

la aplicación casca, da el terrorífico 'Access violation .....'. Uso uso Delphi 10 Seattle y los componentes TNetHTTPClient y TNetHTTPRequest.
La selección del certificado la realizo en el evento OnNeedClientCertificate,

Código Delphi [-]
procedure Tfrm140CTB.NetHTTPClient1NeedClientCertificate(const Sender: TObject; const ARequest: TURLRequest; const ACertificateList: TCertificateList; var AnIndex: Integer);
var
  i: Integer;
begin
  for i := 0 to ACertificateList.Count - 1 do
  begin

    if  (SameText(ACertificateList[i].Subject, mi_certificado.Caption)) then
    begin
      AnIndex := i;
      break;
    end;
  end;
end;

He puesto una traza al comienzo de este procedimiento, y ni siquiera llega
Si alguien utiliza este sistema, y le funciona, agradecido me eche una mano.

elcharlie 05-11-2020 08:05:30

Cita:

Empezado por juramisa (Mensaje 538960)
Buenas tardes
Ya se ha puesto en marcha el entorno de pruebas LROE en Bizkaia, estoy probando, y en:

Código Delphi [-]
unit System.Net.HttpClient.Win;

procedure TWinHTTPClient.DoGetClientCertificates(const ARequest: THTTPRequest;
  const ACertificateList: TList);

la aplicación casca, da el terrorífico 'Access violation .....'. Uso uso Delphi 10 Seattle y los componentes TNetHTTPClient y TNetHTTPRequest.
La selección del certificado la realizo en el evento OnNeedClientCertificate,

Código Delphi [-]
procedure Tfrm140CTB.NetHTTPClient1NeedClientCertificate(const Sender: TObject; const ARequest: TURLRequest; const ACertificateList: TCertificateList; var AnIndex: Integer);
var
  i: Integer;
begin
  for i := 0 to ACertificateList.Count - 1 do
  begin

    if  (SameText(ACertificateList[i].Subject, mi_certificado.Caption)) then
    begin
      AnIndex := i;
      break;
    end;
  end;
end;

He puesto una traza al comienzo de este procedimiento, y ni siquiera llega
Si alguien utiliza este sistema, y le funciona, agradecido me eche una mano.


Buenos dias!
yo lo hago mas o menos así, y de momento, ningún problema. No sé cual será tu problema, eso sí, lo estoy haciendo con Delphi 10.3 Rio. Pero yo creo que el problema no está en ese evento, tiene que ser en otra parte

juramisa 05-11-2020 08:36:19

Gracias elcharlie,
El error se da en el siguiente procedimiento de la unit System.Net.HttpClient.Win, marco la instrucción en rojo;

Código Delphi [-]
procedure TWinHTTPClient.DoGetClientCertificates(const ARequest: THTTPRequest;
  const ACertificateList: TList);
var
  LRequest: TWinHTTPRequest;
  LStore: HCERTSTORE;
  LIssuerList: PSecPkgContext_IssuerListInfoEx;
  LClientCert: PCCERT_CONTEXT;
  LSearchCriteria: CERT_CHAIN_FIND_BY_ISSUER_PARA;
  LIssuerListSize: DWORD;
  LPrevChainContext, LClientCertChain: PCCERT_CHAIN_CONTEXT;
  LCertificate: TCertificate;
begin
  inherited;

  if FWinCertList.Count = 0 then
  begin
    LRequest := TWinHTTPRequest(ARequest);

    LIssuerList := nil;
    LIssuerListSize := SizeOf(LIssuerList);

    if WinHttpQueryOption(LRequest.FWRequest, WINHTTP_OPTION_CLIENT_CERT_ISSUER_LIST, LIssuerList, LIssuerListSize) = TRUE then
    begin
      FillChar(LSearchCriteria, SizeOf(LSearchCriteria), 0);
      LSearchCriteria.cbSize := SizeOf(LSearchCriteria);
      LSearchCriteria.cIssuer := LIssuerList.cIssuers;
      LSearchCriteria.rgIssuer := LIssuerList.aIssuers;

      LStore := TCertificateStore.Store;
      if LStore <> nil then
      begin
        LPrevChainContext := nil;
        while True do
        begin
          LClientCertChain := CertFindChainInStore(LStore, X509_ASN_ENCODING,
            CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG or CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG,
            CERT_CHAIN_FIND_BY_ISSUER, @LSearchCriteria, LPrevChainContext);

          if LClientCertChain <> nil then
          begin
            LPrevChainContext := LClientCertChain;
            LClientCert := LClientCertChain.rgpChain^.rgpElement^.pCertContext;
            CertDuplicateCertificateContext(LClientCert); // Need to be released (CertFreeCertificateContext)
            CryptCertToTCertificate(LClientCert, LCertificate);
            FCertificateList.Add(LCertificate);
            FWinCertList.Add(LClientCert);
          end
          else
            Break;
        end;
      end;
      GlobalFree(HGLOBAL(LIssuerList));
    end;
  end;
  ACertificateList.Clear;
  ACertificateList.AddRange(FCertificateList);
end;

¿Serías tan amable de mandarme ese procedimiento en la versión Rio?. Viéndolo, parece que es un problema al cargar la lista de los certificados presentes en el ordenador.
¿Tal vez hay una orden previa para la carga de los certificados y que yo no la esté realizando?

Gracias.

keys 05-11-2020 08:40:02

Hola a todos.

En el componente TNetHttpClient tienes un evento OnRequestError, intenta capturar el error que te da.

Un Saludo

juramisa 05-11-2020 09:16:49

Hola
keys, da lo siguiente, yo la verdad con esos errores nunca he podido saber nada, y da como he dicho al cargar la lista de certificados. Vosotros cargáis dicha lista antes, o le dices como cargarla antes de ejecutar
Código Delphi [-]
NetHTTPClient1.Post(la_url, ss).ContentAsString(tencoding.UTF8);
Código Delphi [-]
---------------------------
BATUZ
---------------------------
Access violation at address 00B19045 in module 'BATUZ.exe'. Read of address 00000004
---------------------------
OK   
---------------------------

Gracias

keys 05-11-2020 09:20:34

Prueba primero a poner un certificado sin hacer nada en ese evento.

AnIndex := 0; //o el que tu tengas.

Yo tampoco creo que sea del certificado. ¿No te pasa por el evento OnRequestError que te he comentado ?


La franja horaria es GMT +2. Ahora son las 19:06:50.

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