Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice (https://www.clubdelphi.com/foros/showthread.php?t=91252)

Nasca 21-03-2017 10:26:51

Pues tampoco sabría decirte.
Creo recordar que anteriormente anulé alguna y ya no aparece, pero sin embargo ahora tengo otra anulada desde 13 y sigue apareciendo.

jonortsal 21-03-2017 10:46:29

Cita:

Empezado por jlegido (Mensaje 514238)
Hola angelhorse,

Estoy siguiendo un metodo parecido al tuyo, es decir lo hago en VB.Net, pero generando el archivo xml de forma manual (es decir son uso objetos generados al importa la referencia al servicio web).
Bueno el tema es que creo tener todo bien pero estoy en un atasco del que no puedo salir y ando ya desesperado, creo que tu me puedes echar un cable.
Tengo el archivo xml correcto y bien formado y con datos reales
Tengo un certificado (en archivo .pfx) correcto y verificado (he hecho envios de otra forma y funciona)
Al final la empresa ha decidido hacerlo todo sin usar los objetos generados al importar la referencia al servicio web, es decir que no tengo un objeto de tipo SuministroLRFacturasEmitidas con el que hacer las usuales lineas:
Código:

    Dim resul As RespuestaLRFEmitidasType
        resul = proxy.SuministroLRFacturasEmitidas(testC)

lo que uso es un objeto System.Net.HttpWebRequest, con el siguiente codigo

Código:

  Dim req As System.Net.HttpWebRequest
      Dim url As String = "*://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
      'inicializar propiedades request--------------------------------
      req = HttpWebRequest.Create(url)
      req.Headers.Add("SOAP:Action")
      req.ContentType = "text/xml;charset=""utf-8"""
      req.Accept = "text/xml"
      req.Method = "POST"
      Dim soapEnvelopeXml As XmlDocument = New XmlDocument()
      'cargar xml desde archivo
      Dim filename As String = "h:\facturaEmitidaMODEL1_1_1.xml"
      soapEnvelopeXml.Load(filename)

      'certificado---------------------------------------------------
      Dim cert As System.Security.Cryptography.X509Certificates.X509Certificate2
      Dim sRutaCert As String = "H:\Certificado.pfx"
      Dim sClaveCert As String = "xy123"
      cert = New System.Security.Cryptography.X509Certificates.X509Certificate2(sRutaCert, sClaveCert)
      req.ClientCertificates.Add(cert)

      'recoger respuesta 1-----------------------------------------
      Dim resp As WebResponse = req.GetResponse()
      Dim reader As StreamReader = New StreamReader(resp.GetResponseStream())
      Dim soapResult As String = reader.ReadToEnd()

Y aqui es donde me quedo totalmente atascado, me da un mensaje super largo, del cual solo posteo lo inicial, que es:

Código:

<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="*://schemas.xmlsoap.org/soap/envelope/"><env:Body><env:Fault><faultcode>env:Client</faultcode><faultstring>Codigo[1304].Fin prematuro del archivo. (-1,-1)</faultstring><detail><callstack>XML no válido o mal formado
Pero por mas que repaso y repaso no veo que el xml no sea valido o este mal formado y sobre el “Fin prematuro de archivo” no he encontrado nada de anda en internet.
¿Qué codigo usas tu para enviarlo?

Muchas gracias por tu ayuda
Saludos

P.D. donde pongo * me refiero a una enlace (No me deja copiarlos tal cual) xD

[/quote]

Yo he conseguido que funciones con tu código, pero me gustaría capturar el SOAP REQUEST y el SOAP RESPONSE. ¿Qué modificación tendría que hacer en el código?

jmlazaro 21-03-2017 16:15:40

Error en respuesta ws.SuministroLRFacturasEmitidas
 
Buenas tardes.
Hoy estoy recibiendo este error en la respuesta al enviar facturas, ayer me funcionaba correctamente.
Estoy mosqueado, ¿puede ser un error mío o es de la AEAT?

Muchas gracias a todos.

'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "*://*.w3.org/TR/html4/strict.dtd">
<html lang="es-ES">
<head>
<title>Agencia Tributaria - Se ha producido un error</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="*://*.agenciatributaria.gob.es/static_files/common/css/xzhtcs04.css" rel="stylesheet" type="text/css">
<script type="text/javascript">
function toggle()
{
var o=document.getElementById("AEAT_errores_tecnicos");
o.style.display=(o.style.display=='' || o.style.display=='none')?'block':'none';
}
</script>
</head>

javgarma 21-03-2017 17:31:09

Hola, no utilizo Delphi, utilizo un entorno cliente servidor y estoy realizando el envío de ficheros XML perfectamente con el comando curl.
Básicamente generas un fichero XML desde la aplicación con el formato que marca la AEAT y se envía con curl indicando el certificado y el password del mismo. La AEAT responde con otro XML indicado en la línea de comando.
Adjunto el comando por si alguien quiere utilizarlo. curl --connect-timeout 300 -d "@Facturas.xml" -o "Resultado.xml" -E certificado.pem:password https://www7.aeat.es/wlpl/SSII-FACT/...iiFactFEV1SOAP

Nasca 21-03-2017 17:50:14

Cita:

Empezado por javgarma (Mensaje 514541)
Hola, no utilizo Delphi, utilizo un entorno cliente servidor y estoy realizando el envío de ficheros XML perfectamente con el comando curl.
Básicamente generas un fichero XML desde la aplicación con el formato que marca la AEAT y se envía con curl indicando el certificado y el password del mismo. La AEAT responde con otro XML indicado en la línea de comando.
Adjunto el comando por si alguien quiere utilizarlo. curl --connect-timeout 300 -d "@Facturas.xml" -o "Resultado.xml" -E certificado.pem:password https://www7.aeat.es/wlpl/SSII-FACT/...iiFactFEV1SOAP

Una solución muy ingeniosa :)

PepCat 21-03-2017 18:44:11

Cita:

Empezado por seccion_31 (Mensaje 513425)
keys ...
Código:

procedure TfEmitidas.emitidasHTTPWebNode1BeforePost(
  const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
    Store : IStore;
    Certs : ICertificates;
    Cert : ICertificate2;
    CertContext : ICertContext;
    PCertContext : PCCERT_CONTEXT;
    V : OleVariant;
 const
    INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84;
 begin

    V:='  ***  EL NOMBRE DE TU CERTIFICADO ***';

    Store := CoStore.Create;
    Store.Open(CAPICOM_CURRENT_USER_STORE, 'MY',CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED );
    Certs:=Store.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,V,False ); { Buscar certificado por nombre }
    if Certs.Count > 0 then
    begin
        Cert:=IInterface(Certs.Item[1]) as ICertificate2;
        CertContext:=Cert as ICertContext;
        CertContext.Get_CertContext(Integer(PCertContext));
        if InternetSetOption(Data,INTERNET_OPTION_CLIENT_CERT_CONTEXT,PCertContext,Sizeof(CERT_CONTEXT)) = False then
        begin
            ShowMessage( 'Internet SSL certificate. Something went wrong' );
        end;
    end;
 end;



A parte de poder buscar el certificado en el store como en el ejemplo anterior, que funciona perfectamente (muchas gracias por el post!)
también he visto que hay la opción de poder leer el certificado desde un fichero:


Código Delphi [-]

procedure SetCertificate(const FileName, Password: string; var Data: Pointer);
var
  Cert : ICertificate2;
  CertContext : ICertContext;
  PCertContext : PCCERT_CONTEXT;
begin
  try
    Cert := CoCertificate.Create;
  except
    on E: EOleSysError  do
      raise Exception.Create('CAPICOM.DLL is not registered')
  end;

  Cert.Load(FileName, Password, CAPICOM_KEY_STORAGE_EXPORTABLE, CAPICOM_LOCAL_MACHINE_KEY);
  CertContext := Cert as ICertContext;
  CertContext.Get_CertContext(Integer(PCertContext));
  if InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, PCertContext, Sizeof(CERT_CONTEXT)) = False then
    raise Exception.Create ( 'Error setting "' + FileName + '" certificate in web service' )
end;

procedure TfEmitidas.emitidasHTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
begin
  SetCertificate('', '', Data);
end;


P.D. Muchas gracias a todos los que colaboráis en este forum, que me habéis ayudado muchísimo en afrontar este tema.
^\||/

inyu 21-03-2017 19:04:12

Buenas tardes. Al fin he logrado establecer comunicación con el WS, pero me da un error muy simple (campo obligatorio NIF no informado).

¿ Se rellena en algún otro sitio el NIF que no me lo esté cogiendo a parte de estos 2 ?

_RegistroLRFacturasEmitidas(i).IDFactura.IDEmisorFactura.NIF = "B17654XXX"
_RegistroLRFacturasEmitidas(i).FacturaExpedida.Contraparte.NIFRepresentante = "A17135XXX"

Gracias.

bartag 21-03-2017 20:44:09

Cita:

Empezado por inyu (Mensaje 514508)
Hola bartag. Gracias por tus aportaciones, me han aclarado bastante el tema.
Estoy intentando usar tu código pero tengo un problema cuando hago el Deserialize sobre el XML modelo que has adjuntado. Me da un error "There is an error in XML document (2, 2)", ¿sabes a qué puede ser debido?

Gracias.

Perdón por no responder antes (estoy bastante atareado). Ten en cuenta que lo que indicaba funcionaba con la versión 0.5. El pasado día 15 incorporaron la versión 0.6 y es posible que hayan realizado modificaciones.

No obstante, comprueba por favor que el "App.config" está debidamente cumplimentado como comentaba y que el certificado carga correctamente. También que el archivo xml que intentas subir es el que puse, ya que si por ejemplo le estás intentando meter uno con namespaces, te va a dar el error que indicas.

bartag 21-03-2017 20:49:49

Cita:

Empezado por inyu (Mensaje 514550)
Buenas tardes. Al fin he logrado establecer comunicación con el WS, pero me da un error muy simple (campo obligatorio NIF no informado).

¿ Se rellena en algún otro sitio el NIF que no me lo esté cogiendo a parte de estos 2 ?

_RegistroLRFacturasEmitidas(i).IDFactura.IDEmisorFactura.NIF = "B17654XXX"
_RegistroLRFacturasEmitidas(i).FacturaExpedida.Contraparte.NIFRepresentante = "A17135XXX"

Gracias.

Creo que te falta el NIF de la contraparte. Éste se suministra a través del .Contraparte.Item:

_SuministroLRFacturasEmitidas.RegistroLRFacturasEmitidas(0).FacturaExpedida.Contraparte.Item = Trim(TextBoxNIF.Text)

Además está el que ya tienes asignado (IDEmisorFactura.NIF):

_SuministroLRFacturasEmitidas.RegistroLRFacturasEmitidas(0).IDFactura.IDEmisorFactura.NIF = Trim(TextBoxNIFEmisor.Text)

inyu 22-03-2017 09:09:35

Cita:

Empezado por bartag (Mensaje 514560)
Creo que te falta el NIF de la contraparte. Éste se suministra a través del .Contraparte.Item:

_SuministroLRFacturasEmitidas.RegistroLRFacturasEmitidas(0).FacturaExpedida.Contraparte.Item = Trim(TextBoxNIF.Text)

Además está el que ya tienes asignado (IDEmisorFactura.NIF):

_SuministroLRFacturasEmitidas.RegistroLRFacturasEmitidas(0).IDFactura.IDEmisorFactura.NIF = Trim(TextBoxNIFEmisor.Text)

Tienes razón, me faltaba el .Item, es algo que me lia, no entiendo porqué a veces existe la propiedad con un nombre inteligible (como .NIFRepresentante) y a veces sólo aparece "item".

Me ocurre por ejemplo con _RegistroLRFacturasEmitidas.FacturaExpedida.TipoDesglose, TipoDesglose según algunos ejemplos deberia proponerme DesgloseTipoOperacion, en cambio sólo me aparece .Item y no se cómo asignarle el resto de propiedades del desglose. Además según la documentación tendria que haber 2 tipos de desgloses (TipoDesglose2 (facturas), TipoDesglose (inmuebles)) pero a mi el Intellisense sólo me propone 1 tipo "FacturaExpedidaTypeTipoDesglose", no veo el TipoDesglose2 por ningún sitio... con lo cuál ahora no puedo validar nada porqué se queja de que me falta el campo obligatorio TipoDesglose.

mpino 22-03-2017 09:27:46

Cita:

Empezado por jmlazaro (Mensaje 514537)
Buenas tardes.
Hoy estoy recibiendo este error en la respuesta al enviar facturas, ayer me funcionaba correctamente.
Estoy mosqueado, ¿puede ser un error mío o es de la AEAT?

Muchas gracias a todos.

'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "*://*.w3.org/TR/html4/strict.dtd">
<html lang="es-ES">
<head>
<title>Agencia Tributaria - Se ha producido un error</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="*://*.agenciatributaria.gob.es/static_files/common/css/xzhtcs04.css" rel="stylesheet" type="text/css">
<script type="text/javascript">
function toggle()
{
var o=document.getElementById("AEAT_errores_tecnicos");
o.style.display=(o.style.display=='' || o.style.display=='none')?'block':'none';
}
</script>
</head>

Este es el mismo error que recibo yo.

inyu 22-03-2017 09:46:30

Cita:

Empezado por mpino (Mensaje 514568)
Este es el mismo error que recibo yo.

A mi ese error me salía ayer cuando actualicé el WS a la versión 0.6 (yo hago la comunicación via service reference) y fué porque al actualizar se cargó una línea del App.Config dónde tenia puesto el certificado en el binding. En lugar de:

Código:

<bindings>
        <basicHttpBinding>
          <binding name="siiBinding">
            <security mode="Transport">
              <transport clientCredentialType="Certificate" />
            </security>
          </binding>
        </basicHttpBinding>
      </bindings>

Se habia cambiado sólo a :

Código:

<bindings>
        <basicHttpBinding>
          <binding name="siiBinding">
            <security mode="Transport">         
            </security>
          </binding>
        </basicHttpBinding>
      </bindings>

Mirad que no sea lo mismo.

mpino 22-03-2017 12:02:50

Cita:

Empezado por inyu (Mensaje 514569)
A mi ese error me salía ayer cuando actualicé el WS a la versión 0.6 (yo hago la comunicación via service reference) y fué porque al actualizar se cargó una línea del App.Config dónde tenia puesto el certificado en el binding. En lugar de:

Código:

<bindings>
        <basicHttpBinding>
          <binding name="siiBinding">
            <security mode="Transport">
              <transport clientCredentialType="Certificate" />
            </security>
          </binding>
        </basicHttpBinding>
      </bindings>

Se habia cambiado sólo a :

Código:

<bindings>
        <basicHttpBinding>
          <binding name="siiBinding">
            <security mode="Transport">         
            </security>
          </binding>
        </basicHttpBinding>
      </bindings>

Mirad que no sea lo mismo.

Muchisimas gracias por la pista. Efectivamente le falta el certificado en el transporte. Ahora funciona todo perfectamente.

Un saludo
mpino

dimony 22-03-2017 16:21:49

Resultado consulta facturas expedidas
 
Hola a tod@s, estoy intentando hacer la parte referente a la consulta de fras. expedidas y este es mi código:

Código Delphi [-]
function suministra_informacion: string;
var
  v_register: integer;

  certificado:String;

  // Libro registro de facturas emitidas //
  AConsultaLRFacturasEmitidas:ConsultaLRFacturasEmitidas;
  ARespuestaConsultaLRFacturasEmitidas:RespuestaConsultaLRFacturasEmitidas;
  AResultadoConsulta:ResultadoConsultaType;
  a :string;
  i:LongInt;

begin

  if main.lista_certificados.itemindex<0 then
    begin
    exit;
    end;

  certificado := numero_certificado(main.lista_certificados.text);
  if(certificado = '') then
    begin
    ShowMessage('No encuento el certificado');
    Exit;
    end;



  datos.Data.LibrosRegistros.First;
  v_register := 1;
  while v_register <= datos.Data.LibrosRegistros.RecordCount do
    begin

    //Si quitamos esta linea nos pedira el certificado a la hora de enviar la factura.
    Data.HTTPRIO1.HTTPWebNode.ClientCertificate.SerialNum := certificado;

    try

      AConsultaLRFacturasEmitidas := ConsultaLRFacturasEmitidas.Create;

      AConsultaLRFacturasEmitidas.Cabecera := CabeceraConsultaSii.Create;
      AConsultaLRFacturasEmitidas.Cabecera.IDVersionSii:=VersionSiiType(0);
      AConsultaLRFacturasEmitidas.Cabecera.titular := PersonaFisicaJuridicaUnicaESType.Create;
      AConsultaLRFacturasEmitidas.Cabecera.Titular.NombreRazon:= main.g_name;  // NOMBRE DEL PRESENTADOR (CUALQUIERA VALE)
      AConsultaLRFacturasEmitidas.Cabecera.Titular.NIF:= main.g_nif;     // CIF del PRESENTADOR (DEBE COINCIDIR CON EL CERTIFICADO SELECCIONADO)

      AConsultaLRFacturasEmitidas.FiltroConsulta := LRFiltroEmitidasType.Create;
      AConsultaLRFacturasEmitidas.FiltroConsulta.PeriodoImpositivo := PeriodoImpositivo.Create;
      AConsultaLRFacturasEmitidas.FiltroConsulta.PeriodoImpositivo.Ejercicio := formatdatetime('yyyy',data.LibrosRegistros.FieldByName('FechaExpedicionFacturaEmisor').AsDateTime);
      AConsultaLRFacturasEmitidas.FiltroConsulta.PeriodoImpositivo.Periodo := TipoPeriodoType(1);

      AConsultaLRFacturasEmitidas.FiltroConsulta.ClavePaginacion := IDFacturaExpedidaBCType.Create;
      AConsultaLRFacturasEmitidas.FiltroConsulta.ClavePaginacion.IDEmisorFactura := IDEmisorFactura3.Create;
      AConsultaLRFacturasEmitidas.FiltroConsulta.ClavePaginacion.IDEmisorFactura.NIF := main.g_nif;
      AConsultaLRFacturasEmitidas.FiltroConsulta.ClavePaginacion.NumSerieFacturaEmisor := data.LibrosRegistros.FieldByName('NumeroFacturaEmisor').AsString;
      AConsultaLRFacturasEmitidas.FiltroConsulta.ClavePaginacion.FechaExpedicionFacturaEmisor := data.LibrosRegistros.FieldByName('FechaExpedicionFacturaEmisor').asstring;

      try
        ARespuestaConsultaLRFacturasEmitidas := GetsiiSOAP(true,'',data.HTTPRIO1).ConsultaLRFacturasEmitidas(AConsultaLRFacturasEmitidas);

        for i := low(ARespuestaConsultaLRFacturasEmitidas.RegistroRespuestaConsultaLRFacturasEmitidas) to High(ARespuestaConsultaLRFacturasEmitidas.RegistroRespuestaConsultaLRFacturasEmitidas) do
          begin
          with ARespuestaConsultaLRFacturasEmitidas.RegistroRespuestaConsultaLRFacturasEmitidas[i] do
            begin
            AResultadoConsulta := ARespuestaConsultaLRFacturasEmitidas.ResultadoConsulta;

            if aresultadoconsulta = ResultadoConsultaType(1) then
              showmessage('hola')
            else
              showmessage('adios')
            end;
          end;
      except
        On E:Exception do
          //El proceso de envio dio error
          MessageDlg(E.Message, mtError, [mbOK], 0);
      end;
    finally
      AConsultaLRFacturasEmitidas.Free;
      ARespuestaConsultaLRFacturasEmitidas.Free;
    end;


    datos.Data.LibrosRegistros.Next;
    v_register := v_register + 1;
  end;


end;


El xml se envia correctamente y devuelve respuesta correctamente (SINDATOS), pero a la hora de gestionarlo a través de la variable AResultadoConsulta, no se gestionarlo.
Quiero decir como controlo con AresultadoConsulta si devuelve CONDATOS o SINDATOS. No logro hacerlo.
Gracias.

Virman 22-03-2017 16:31:08

Saludos! Alguno sabe donde se almacena la información de cuadre? En la página de hacienda aparece, pero en el objeto devuelto por el WS, de tipo RespuestaLRFEmitidasType, no encuentro esta información. Alguno sabe si se puede obtener esa información de cuadre?

Otra consulta, acabo de enviar una factura de importe total 1,importe exenta 1, base imponible 9, cuota repercutida 21 y tipo impositivo 21% y la ha aceptado, será que ahora con la nueva versión del WS no hace cálculos de las cantidades?

Gracias!

Nasca 22-03-2017 16:36:33

Cita:

Empezado por Virman (Mensaje 514581)
Otra consulta, acabo de enviar una factura de importe total 1,importe exenta 1, base imponible 9, cuota repercutida 21 y tipo impositivo 21% y la ha aceptado, será que ahora con la nueva versión del WS no hace cálculos de las cantidades?

A mi me ha pasado lo mismo. Por error remití datos incorrectos y se los tragó.
Yo creo que por ahora no valida la mayoría de los campos. Aunque ten en cuenta que la responsabilidad de enviar los datos correctos siempre será del comunicador. Lo que supone que por flexibilidad no validen datos.
Y en este caso tendrían que devolver un tipo "Aceptado con avisos" y no creo que lo implementen.

Virman 22-03-2017 16:50:13

Cita:

Empezado por Nasca (Mensaje 514582)
A mi me ha pasado lo mismo. Por error remití datos incorrectos y se los tragó.
Yo creo que por ahora no valida la mayoría de los campos. Aunque ten en cuenta que la responsabilidad de enviar los datos correctos siempre será del comunicador. Lo que supone que por flexibilidad no validen datos.
Y en este caso tendrían que devolver un tipo "Aceptado con avisos" y no creo que lo implementen.

El caso es que con el antiguo WS si recibí errores de Base Imponible Incorrecta. Yo creo que dentro de unos días tendremos un bonito WS nuevo.

newtron 22-03-2017 17:08:12

Cita:

Empezado por Virman (Mensaje 514585)
El caso es que con el antiguo WS si recibí errores de Base Imponible Incorrecta. Yo creo que dentro de unos días tendremos un bonito WS nuevo.

Lo dudo, si mal no recuerdo el campo del total de la factura ahora no es obligatorio informarlo.

josecr 23-03-2017 10:21:25

Facturas Recibidas Proveedores Extranjeros Cif?
 
Buenas a todos.
Otro mas en el lio!!

La duda que tengo es que hacer con las facturas recibidas de proveedores extranjeros que NO DISPONEN DE CIF/VAT (como en USA)

Indico en la factura el tipo 06 "Otro" como haciamos hasta ahora y me exige un ID siempre

ALguien sabe como se tiene que enviar??

Muchas Gracias a todos!!

keys 23-03-2017 10:25:29

Segun creo toda facura tiene que tener un documento un identificador, ya sea nif, pasporte, etc. En las facturas recibidas es obligatorio rellenarlo.


La franja horaria es GMT +2. Ahora son las 04:50:58.

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