Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Envío de registros y sus respuestas (https://www.clubdelphi.com/foros/forumdisplay.php?f=66)
-   -   Problemas con el wsdl (https://www.clubdelphi.com/foros/showthread.php?t=97477)

Galahad 23-05-2025 14:41:17

Problemas con el wsdl
 
hola, buenas tardes.
He importado el último WSDL desde esta URL:
https://prewww2.aeat.es/static_files...cturacion.wsdl
el problema que tengo es que no consigo que en el array de registros de factura se carguen los objetos de tipo factura. No da ningún error pero el array de facturas está vacio cuando se manda
A ver si alguién ve algo en la estructura que no veo yo....
este el circuito de carga/envio

Código Delphi [-]
procedure TFVeriFactu.bEnviarFacturasClick(Sender: TObject);
var
  veriFactu         : RegFactuSistemaFacturacion;     // Objeto a enviar
  listafacturas     : Array_Of_RegistroFacturaType;   // lista con las facturas verifactu
  res               : RespuestaRegFactuSistemaFacturacionType; // RespuestaBaseType;              // Respuesta tras el envio
  factura, anterior : TRegistroFactura;               // records con los datos de 1 factura   (utiles.pas)  diseño de formato propio
  estado  : string;
  fila    : integer;
  //
  CSeparadorDecimal:char;
  Cabecera: CabeceraType;
begin

      cseparadordecimal := formatSettings.DecimalSeparator;
      FormatSettings.DecimalSeparator  := '.';

      screen.Cursor:=crHourglass;
      // actualizar datos de sistema Informatico:
      SistemaInformatico_razonSocial        :=editRazonSocial.Text;
      SistemaInformatico_nif                :=editNIF.Text;
      SistemaInformatico_Nombre             :=editNombre.Text;
      SistemaInformatico_ID                 :=editID.text;
      SistemaInformatico_Version            :=editVersion.text;
      SistemaInformatico_NumeroInstalacion  :=editInstalacion.text;

      //
      veriFactu:=RegFactuSistemaFacturacion.Create;
      veriFactu.Cabecera                              :=cabeceratype.Create;
      veriFactu.Cabecera.ObligadoEmision              :=PersonaFisicaJuridicaESType.Create;
      veriFactu.Cabecera.ObligadoEmision.NombreRazon  :=editEmisor.Text;
      veriFactu.Cabecera.ObligadoEmision.NIF          :=editNIFEmisor.Text;

      DmVeriFactu.QVf_Registro.First;
      fila := 0;
      while Not DmVeriFactu.QVf_Registro.Eof  do
      begin
          Fila := Fila+1;
          CargarFactura( fila,factura,anterior, SistemaInformatico_Nombre); // carga el record factura
          setLength(listaFacturas,fila);          // +1 factura en el array
          listaFacturas[ fila ]:= Alta_verifactu (  factura, anterior, editEmisor.Text );     // colocar el objeto RegistroFacturacionAltaType devuelto por la funcion en el array
          //
          DmVeriFactu.QVf_Registro.Next;
      end;
   
      //----------------------------------------------------
      veriFactu.RegistroFactura:= listaFacturas;                                // colocar la lista de facturas en el objeto verifactu
      // envío:
      try
            HTTPRIO1.HTTPWebNode.ClientCertificate.SerialNum := Buscar_Certificado_SERIAL( comboCertificados.text );  // coloca el certificado
            //---------------------------------
            Cargar_Entorno_Soap;
            //----------------------------------
            // envio real
            res:=   RespuestaRegFactuSistemaFacturacionType.Create;
            SistemaFacturacion.RespuestaRegFactuSistemaFacturacion(Res) :=
               SistemaFacturacion.GetsfPortTypeVerifactu(false,HTTPRIO1.URL, HTTPRIO1).RegFactuSistemaFacturacion( verifactu );

            // resultado del envio:   (se colocara el csv si la factura ha sido aceptada, en la base de datos facturas.xml)
            procesarEnvio(res);

      except
            on E:Exception do
                  memoRes.text  :=Format('Error al realizar el envío: (%s)-%s',[E.ClassName, E.Message]);
      end;
      screen.Cursor:=crDefault;
      FormatSettings.DecimalSeparator  := cseparadordecimal;
      IF Memores.text > '' then
      begin
         muestraAviso(tInfo,bSi,fSi,'Se Encontraron Errores');
         Pagecontrol2.activepage := TbResultado;
      end else dbgemitidas.setfocus;
end;

y esta es la función donde se registra cada factura:

Código Delphi [-]

function TFVeriFactu.Alta_VeriFactu( var facturaRegistro, registroAnterior:TRegistroFactura ; NombreEmisor:string ): RegistroFacturaType;
var
    Factura             : RegistroFacturaType;
    Destinatario        : PersonaFisicaJuridicaType;
    ListaDestinatarios  : Destinatarios2;
    ListaDesglose       : DesgloseType;
    DetalleDesglose     : DetalleType;
    XSDatetime          : TXSDatetime;
    j:integer;
begin
    Factura := RegistroFacturaType.Create;

    Factura.RegistroAlta                                  := RegistroAlta.Create;
    Factura.RegistroAlta.IDVersion                        := VersionType._1_0;
    Factura.RegistroAlta.IDFactura                        := IDFacturaExpedidaType.Create;
    Factura.RegistroAlta.IDFactura.IDEmisorFactura        := facturaRegistro.nifEmisor;
    Factura.RegistroAlta.IDFactura.NumSerieFactura        := facturaRegistro.numSerieFactura;
    Factura.RegistroAlta.IDFactura.FechaExpedicionFactura := verifactuFecha( facturaRegistro.fechafactura ) ; // (dd-mm-yyyy)

    Factura.RegistroAlta.NombreRazonEmisor                := NombreEmisor;
    Factura.RegistroAlta.TipoFactura                      := ClaveTipoFacturaType.F1;
    Factura.RegistroAlta.DescripcionOperacion             := facturaRegistro.DescripcionOperacion;

    // 1 destinatario (cliente):
    Destinatario                    := PersonaFisicaJuridicaType.Create;
    Destinatario.NombreRazon        := facturaRegistro.cliente;
    Destinatario.NIF                := facturaRegistro.clienteNIF;

    Destinatario.IDOtro             := IDOtroType.Create;
    Destinatario.IDOtro.CodigoPais  := codigoPais( facturaRegistro.clienteCodPais );
    Destinatario.IDOtro.IdType      := tipoNIF( facturaRegistro.clientetipoNIF);
    Destinatario.IDOtro.ID          := facturaRegistro.clienteNIF;


    // El destinatario (cliente) a la lista  (solo 1 cliente x factura)
    ListaDestinatarios:= destinatarios2.Create();
    SetLength(ListaDestinatarios, 1);
    ListaDestinatarios[0]               := Destinatario;
    Factura.RegistroAlta.Destinatarios  := ListaDestinatarios;

    // Desglose de iva:
    ListaDesglose := DesgloseType.Create();
    for j:=low(facturaRegistro.desglose) to length(facturaRegistro.desglose)-1 do
    Begin
          DetalleDesglose := DetalleType.Create;

          DetalleDesglose.ClaveRegimen                  := IdOperacionesTrascendenciaTributariaType._01;
          DetalleDesglose.CalificacionOperacion         := CalificacionOperacionType.S1;

          DetalleDesglose.TipoImpositivo                := FormatFloat('0.00',facturaRegistro.desglose[j].iva);
          DetalleDesglose.BaseImponibleOimporteNoSujeto := FormatFloat('0.00',facturaRegistro.desglose[j].baseImp);
          DetalleDesglose.CuotaRepercutida              := FormatFloat('0.00',facturaRegistro.desglose[j].impiva);

          if facturaRegistro.desglose[j].req<>0 then    // ¿ lleva recargo de equivalencia ?
          begin
              DetalleDesglose.TipoRecargoEquivalencia       := FormatFloat('0.00',facturaRegistro.desglose[j].req);
              DetalleDesglose.CuotaRecargoEquivalencia      := FormatFloat('0.00',facturaRegistro.desglose[j].impreq);
          end;

          // colocar el desglose en la lista
          SetLength(ListaDesglose, j+1 );
          ListaDesglose[j] := DetalleDesglose ;
      end;

      // asignar los desgloses al objeto de factura:
      Factura.RegistroAlta.Desglose:= ListaDesglose;

      Factura.RegistroAlta.CuotaTotal   := FormatFloat('0.00',facturaRegistro.cuotatotal);
      Factura.RegistroAlta.ImporteTotal := FormatFloat('0.00',facturaRegistro.total);

      // Encadenamiento
      Factura.RegistroAlta.Encadenamiento := Encadenamiento3.Create;
      // ¿ es el primer registro ?
      if registroAnterior.numSerieFactura='' then
          Factura.RegistroAlta.Encadenamiento.PrimerRegistro:=PrimerRegistroCadenaType(0) // S
      else
      begin
           Factura.RegistroAlta.Encadenamiento.RegistroAnterior:=EncadenamientoFacturaAnteriorType.Create;

           Factura.RegistroAlta.Encadenamiento.RegistroAnterior.IDEmisorFactura         :=registroAnterior.nifEmisor;
           Factura.RegistroAlta.Encadenamiento.RegistroAnterior.NumSerieFactura         :=registroAnterior.numSerieFactura;
           Factura.RegistroAlta.Encadenamiento.RegistroAnterior.FechaExpedicionFactura  :=registroAnterior.fechaFactura;
           Factura.RegistroAlta.Encadenamiento.RegistroAnterior.Huella                  :=registroAnterior.huella;
      end;

    // sistemaInformatico
    sistemaInformatico( Factura );

    //XSDatetime
    XSDatetime := TXSDatetime.Create;
    XSDatetime.AsDateTime := Now;
    Factura.RegistroAlta.FechaHoraHusoGenRegistro := XSDatetime; // Formato: YYYY-MM-DDThh:mm:ssTZD (ej: 2024-01-01T19:20:30+01:00) (ISO 8601)
    Factura.RegistroAlta.FechaHoraHusoGenRegistro.FractionalSeconds := 0;

    // Huella
    facturaRegistro.Huella  := GenerarHuella_alta_RegistroVerifactu( Factura.RegistroAlta );   // la colocamos en nuestro record

    Factura.RegistroAlta.TipoHuella := TipoHuellaType._01;
    Factura.RegistroAlta.Huella     := facturaRegistro.Huella;                                  // de ahi y la pasamos al objeto factura.alta de verifactu


    // fin, devolver el objeto   registroFacturaType.RegistroAlta  creado desde la informacion contenida en el record TRegistroFactura (ver utiles.pas)
    result:=factura;
end;

el problema es que el array de listafacturas parece estar vacio , si lo analizo con el debugger aparecen los registros del array con nil..
saludos..

Galahad 24-05-2025 18:30:04

Resuelto, problema de arrays
 
disculpad, he encontrado el error..
el problema era el indice del array , hacia esto:
Código Delphi [-]
  fila := 1;
  setlength( listafacturas, fila )
  listafacturas[ fila ] := xxx

y lo correcto era:

Código Delphi [-]
  fila := 0;
  setlength( listafacturas,fila+1);
  listafacturas[ fila ] := xxx

perdón por las molestias


La franja horaria es GMT +2. Ahora son las 14:04:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi