Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Proyecto SIF/Veri*Factu/Ley Antifraude > Envío de registros y sus respuestas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-05-2025
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 266
Poder: 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
  #2  
Antiguo 24-05-2025
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 266
Poder: 20
Galahad Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
AEAT envio de datos vía Webservice problemas con WSDL CelsoO Internet 11 09-10-2019 20:03:41
WSDL webservice con SSL agustibaldo Delphi para la web 1 27-06-2018 19:34:53
No se actualiza el WSDL en Delphi 7 vfogliatti Delphi para la web 2 31-01-2015 01:57:02
Access Violation WSDL FerPetrei Internet 1 20-02-2008 13:41:40
WSDL y php halizia PHP 4 03-08-2007 12:18:12


La franja horaria es GMT +2. Ahora son las 14:07:16.


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
Copyright 1996-2007 Club Delphi