Ver Mensaje Individual
  #1  
Antiguo 23-05-2025
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 266
Reputación: 20
Galahad Va por buen camino
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..
Responder Con Cita