Ver Mensaje Individual
  #406  
Antiguo 26-01-2021
espinete espinete is offline
Miembro
 
Registrado: mar 2009
Posts: 233
Reputación: 16
espinete Va camino a la fama
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.
Responder Con Cita