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.

josecr 23-03-2017 10:29:50

Cita:

Empezado por keys (Mensaje 514605)
Segun creo toda facura tiene que tener un documento un identificador, ya sea nif, pasporte, etc. En las facturas recibidas es obligatorio rellenarlo.

Muchas Gracias, (en el libro de IVA actual , indicas tipo 06(otro) y no es necesario mas)

y nos llegan facturas que no tienen nada, por q en USA no debe ser obligado, en cualquier caso tampoco lo van a poder contrastar :D

Saludos.

APO 23-03-2017 11:07:07

Buenos días!!!
Antes de nada, muchas gracias a todos los foreros que estáis aportando toda vuestra inestimable ayuda con todo este tema de la AEAT, que en menudo jaleo nos ha metido a algunos como yo, porque hasta ahora había utilizado nada de Webservices.

Bueno, al grano, os quería comentar que llevo ya leídos y releídos los 22 posts de este tema, y aún sigo sin poder enviar una triste factura al entorno de pruebas (increíble!!!). En principio pensé que era error de certificado, pero no, los verifiqué, fecha de caducidad, etc... y todo correcto. También me he descargado la última versión del WSDL por si habían modificado algo, y modifiqué las líneas:

Código Delphi [-]
  
defWSDL = '...aeat/ssii/fact/ws/SuministroInmediatoInfo.wsdl';
  defSvc  = 'siiService';
  defPrt  = 'SuministroFacturasPruebas';

Pero nada, seguía igual. Entonces, me pareció interesante lo que comentaba el forero NASCAR, que en vez de utilizar los objetos y clases del Webservice para enviar los datos, sería mejor crear uno mismo el xml y luego enviarlo. Pero no sé exactamente cómo enviar el xml, porque antes la línea que se enviaba en el ejemplo era esta:

Código Delphi [-]
result := GetsiiSOAP(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);

Pero aquí no se puede enviar un xml. Supongo que se hará de otra manera, no??? Seguramente habré dicho alguna barbaridad porque como comentaba antes, ni idea de webservices.

Entonces, resumiendo, ¿sería alguien tan amable de adjuntar un ejemplo completo en Delphi de cómo enviar el xml? No hace falta poner la parte de construcción del xml (ya me buscaré la vida para montar el xml, aunque si se pone mejor jejejeje), pero sí de la conexión con el WebService y todo lo demás.

Muchas gracias!!!!!!

newtron 23-03-2017 13:11:44

Cita:

Empezado por APO (Mensaje 514607)
Buenos días!!!
Antes de nada, muchas gracias a todos los foreros que estáis aportando toda vuestra inestimable ayuda con todo este tema de la AEAT, que en menudo jaleo nos ha metido a algunos como yo, porque hasta ahora había utilizado nada de Webservices.

Bueno, al grano, os quería comentar que llevo ya leídos y releídos los 22 posts de este tema, y aún sigo sin poder enviar una triste factura al entorno de pruebas (increíble!!!). En principio pensé que era error de certificado, pero no, los verifiqué, fecha de caducidad, etc... y todo correcto. También me he descargado la última versión del WSDL por si habían modificado algo, y modifiqué las líneas:

Código Delphi [-] defWSDL = '...aeat/ssii/fact/ws/SuministroInmediatoInfo.wsdl'; defSvc = 'siiService'; defPrt = 'SuministroFacturasPruebas';


Pero nada, seguía igual. Entonces, me pareció interesante lo que comentaba el forero NASCAR, que en vez de utilizar los objetos y clases del Webservice para enviar los datos, sería mejor crear uno mismo el xml y luego enviarlo. Pero no sé exactamente cómo enviar el xml, porque antes la línea que se enviaba en el ejemplo era esta:

Código Delphi [-]result := GetsiiSOAP(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);


Pero aquí no se puede enviar un xml. Supongo que se hará de otra manera, no??? Seguramente habré dicho alguna barbaridad porque como comentaba antes, ni idea de webservices.

Entonces, resumiendo, ¿sería alguien tan amable de adjuntar un ejemplo completo en Delphi de cómo enviar el xml? No hace falta poner la parte de construcción del xml (ya me buscaré la vida para montar el xml, aunque si se pone mejor jejejeje), pero sí de la conexión con el WebService y todo lo demás.

Muchas gracias!!!!!!

Hola.

Yo en particular prefiero hacerlo usando los objetos del webservice, a mi me resulta más cómodo y a la hora de las actualizaciones que están haciendo es más fácil corregir que si generas el xml "a pelo".

¿No has podido poner en marcha ninguno de los ejemplos que se han subido a este hilo?

Saludos

APO 23-03-2017 15:26:44

Cita:

Empezado por newtron (Mensaje 514614)
Hola.

Yo en particular prefiero hacerlo usando los objetos del webservice, a mi me resulta más cómodo y a la hora de las actualizaciones que están haciendo es más fácil corregir que si generas el xml "a pelo".

¿No has podido poner en marcha ninguno de los ejemplos que se han subido a este hilo?

Saludos

Gracias Newtron por responder,
pues no, todavía sigo sin poner en marcha ninguno. Con el que estoy luchando es con el 'Ejemplo Sii.zip' que puso Keys en la página 5 de este hilo. Sin tocar nada de código, compilo, selecciono el certificado, relleno el nif, nombre y demás y al enviar me sale el siguiente error:

'javax.servlet.ServletException'

Entonces, pruebo de importar el nuevo SuministroInmediatoInfo.wsdl

Compilo y en la línea donde pone: IDEmisorFactura:= IDEmisorFactura3.Create; me da el siguiente error:
Incompatible types: 'IDEmisorFactura2' and 'IDEmisorFactura3'

Y aquí sigo estancando...

keys 23-03-2017 15:34:14

Hola. Al importar los ficheros wsdl de nuevo, hay clases que las cambia de nombre. Tienes que cambiar esas lineas a los nombres de las clases nuevas.

Por ejemplo

IDEmisorFactura:= IDEmisorFactura3.Create; tiene que ser IDEmisorFactura:= IDEmisorFactura2.Create; que es el error que te da el compilador.

Por cierto mi ejemplo esta compilado en Delphi 10.1 berlin. No se is en otras versiones anteriores funcionará.

APO 23-03-2017 15:45:58

Cita:

Empezado por keys (Mensaje 514618)
Hola. Al importar los ficheros wsdl de nuevo, hay clases que las cambia de nombre. Tienes que cambiar esas lineas a los nombres de las clases nuevas.

Por ejemplo

IDEmisorFactura:= IDEmisorFactura3.Create; tiene que ser IDEmisorFactura:= IDEmisorFactura2.Create; que es el error que te da el compilador.

Por cierto mi ejemplo esta compilado en Delphi 10.1 berlin. No se is en otras versiones anteriores funcionará.

Ostras!!! Muchas gracias Keys,
Vaya tela con la AEAT, simplificando la cosa... jejeje

Por fin ya he podido compilar, y ahora ya me otro error que tiene más sentido. Creo que ya empiezo a ir por el buen camino. Me dice:

'Error La direccion no se corresponde con el fichero de entrada'

Supongo que esto ya deben ser error de no configurar bien los parámetros de la factura o alguna dirección del WebService, no se... Yo he puesto las de siempre:

defWSDL ='... es/aeat/ssii/fact/ws/SuministroCobrosEmitidas.wsdl';
defURL = 'https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactCOBV1SOAP';
defSvc = 'siiService';
defPrt = 'SuministroCobrosEmitidasPruebas';

keys 23-03-2017 15:48:23

Al cargar los wdsl otra de las cosas que se pierden son las direcciones de las web services.

Para emitidas son

defWSDL = 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroFactEmitidas.wsdl';
defURL = 'https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP';
defSvc = 'siiService';
defPrt = 'SuministroFactEmitidasPruebas';

APO 23-03-2017 16:00:03

Por fin!!!!!!!! Muchas gracias Keys
Ya he podido enviar una factura. Es cierto, tenía que cambiar las direcciones de las web services. Vaya empanada que llevo!

Pues nada, ahora que ya he logrado conectar y enviar una factura, voy a seguir haciendo pruebas y seguro que me surgirán más dudas, que intentaré ir resolviendo.

De nuevo, gracias a todos por vuestra ayuda!!!

CMB 23-03-2017 18:39:39

Baja de una factura
 
Al enviar por webservice la petición de baja de una factura emitida recibo una respuesta que considera la operación como correcta.

Pero al parecer esa operación es irreversible. Pues al dar nuevamente de alta la misma factura (con cambios o sin ellos) el webservice ya no la admite, diciendo "Factura duplicada". Y si intento darla de baja otra vez, dice que la factura no existe.

Por favor, ¿alguien puede confirmar, o desmentir, esa suposición?

Cuando hay que modificar una factura, ¿es imprescindible enviarla como modificaciones en vez de dar de baja y de alta?

Muchas gracias.

Saludos,

newtron 23-03-2017 18:49:32

Cita:

Empezado por CMB (Mensaje 514631)
Al enviar por webservice la petición de baja de una factura emitida recibo una respuesta que considera la operación como correcta.

Pero al parecer esa operación es irreversible. Pues al dar nuevamente de alta la misma factura (con cambios o sin ellos) el webservice ya no la admite, diciendo "Factura duplicada". Y si intento darla de baja otra vez, dice que la factura no existe.

Por favor, ¿alguien puede confirmar, o desmentir, esa suposición?

Cuando hay que modificar una factura, ¿es imprescindible enviarla como modificaciones en vez de dar de baja y de alta?

Muchas gracias.

Saludos,

Cuando das una factura de baja no podrás usar el mismo número ni hacer nada más con ella, la nueva factura tendrá que tener otro número. Si lo que quieres es modificarla tendrás que enviar una factura de rectificación.

Saludos

Nasca 23-03-2017 18:51:48

Cita:

Empezado por CMB (Mensaje 514631)
Al enviar por webservice la petición de baja de una factura emitida recibo una respuesta que considera la operación como correcta.

Pero al parecer esa operación es irreversible. Pues al dar nuevamente de alta la misma factura (con cambios o sin ellos) el webservice ya no la admite, diciendo "Factura duplicada". Y si intento darla de baja otra vez, dice que la factura no existe.

Por favor, ¿alguien puede confirmar, o desmentir, esa suposición?

Cuando hay que modificar una factura, ¿es imprescindible enviarla como modificaciones en vez de dar de baja y de alta?

Las modificaciones siempre como modificaciones. Puedes cambiar cualquier cosa, incluida contraparte en facturas emitidas.
La contraparte en facturas recibidas no tendría mucho sentido, ya que a todos los efectos es una factura totalmente nueva.

La baja anula la factura, y por lo que dices es imposible volver a activar la misma.
No lo he comprobado pero la verdad es que es coherente con la documentación, que dice expresamente que ese número de factura no puede reutilizarse.

Hay que tener presente que la clave primaria de cada registro de facturas está compuesto de: NIF/IDOtro, FechaExpedicion y NumFactura

Cualquier modificación en cualquiera de esos datos supone a todos los efectos una factura nueva.

Entiendo que si te has equivocado en una factura recibida asignando un proveedor incorrecto, lo lógico es como lo establece la AEAT, anular y en un registro totalmente independiente hacer el alta correcta.

En emitidas no se me ocurre ningún caso que no pueda resolverse con una modificación. Si acaso, si has equivocado la fecha.

P.D. Acabo de comprobar que una factura emitida con mismo número y diferente fecha cuela sin problemas. En este caso toca anular una de ellas. Y se puede hacer sin problemas.

CMB 23-03-2017 19:56:12

Para newtron y Nasca:

Dos respuestas que aclaran totalmente la cuestión. La verdad es que en la documentación de la AEAT hay algunas cosas ambiguas y otras que difícilmente las encuentras (o entiendes).

¡Muchas gracias a ambos!

keys 24-03-2017 08:17:47

Buenos días. Si el problema es que se ha registrado una factura incorrectamente, por ejemplo te has equivocado en el tipo de operación, importes, etcc, es decir no hay otra factura que rectifique a esta, lo que se puede hacer es mandar un registro de tipo A1 Modificación de facturas/registros (errores registrales). Que sirve para esto.

Un saludo.

CMB 24-03-2017 09:20:42

Modificación de facturas
 
Magníficas respuestas las de newtron, Nasca y keys sobre la modificación de facturas. La curva de aprendizaje es cada vez más horizontal a medida que vas progresando, y en este momento creo que la cosa ya va de bajada para la mayoría de nosotros.

Muchas gracias de nuevo.

Saludos,

Fèlix Ruiz 27-03-2017 11:11:50

1 Archivos Adjunto(s)
Hola.
Estoy desarrollando un módulo para el envio de facturas al SII. La primera fase fue que generase los ficheros XML tal como indica la AEAT en su documentación.
Ahora estoy con la fase de envío con la AEAT, pero llevo varios días intentando enviar una factura y no hay manera. A ver si me pueden ayudar...
Estoy programando en C#, y he probado tanto cargar desde fichero XML como generando la factura directamente contra el servicio web.
En ambos casos, al enviar los datos me retorna un error:
Código:

The content type text/html of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 1024 bytes of the response were: ...
Lo bueno es que usando el portal de pruebas de Hacienda, el fichero XML sí se carga (he de cambiar este a formato a SOAP). Por lo tanto problema del certificado no es.
Os adjunto los ficheros para revisar (el que generé por primera vez y se carga en el portal, el que se crea con Serialize, y el que cargo con Deserialize), e incluso adjunto el código C# usado.
Lo servicios WEB que uso son los proporcionados en el portal de SII: V_06/SuministroFactEmitidas.wsdl
Ya estoy desesperado, no se que hacer... Necesito ayuda.
Gracias.
Menos mal que existe este foro...

CMB 27-03-2017 11:28:12

Cita:

Empezado por Fèlix Ruiz (Mensaje 514726)
Hola.
Estoy desarrollando un módulo para el envio de facturas al SII. La primera fase fue que generase los ficheros XML tal como indica la AEAT en su documentación.
Ahora estoy con la fase de envío con la AEAT, pero llevo varios días intentando enviar una factura y no hay manera. A ver si me pueden ayudar...
Estoy programando en C#, y he probado tanto cargar desde fichero XML como generando la factura directamente contra el servicio web.
En ambos casos, al enviar los datos me retorna un error:
Código:

The content type text/html of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 1024 bytes of the response were: ...
Lo bueno es que usando el portal de pruebas de Hacienda, el fichero XML sí se carga (he de cambiar este a formato a SOAP). Por lo tanto problema del certificado no es.
Os adjunto los ficheros para revisar (el que generé por primera vez y se carga en el portal, el que se crea con Serialize, y el que cargo con Deserialize), e incluso adjunto el código C# usado.
Lo servicios WEB que uso son los proporcionados en el portal de SII: V_06/SuministroFactEmitidas.wsdl
Ya estoy desesperado, no se que hacer... Necesito ayuda.
Gracias.
Menos mal que existe este foro...

Podrían haber más cosas, pero te falta rellenar el Tag <siiDescripcionOperacion>, que es obligatorio.

Fèlix Ruiz 27-03-2017 11:44:20

Cita:

Empezado por CMB (Mensaje 514727)
Podrían haber más cosas, pero te falta rellenar el Tag <siiDescripcionOperacion>, que es obligatorio.

Gracias por responder tan rápido.
En el XML que cargo en el portal está el TAG pero no hay datos. De todas formas este no da problemas, se carga.
El problema es si voy por código, tanto por Serialize o Deserialize, sí que está el TAG y con datos. En estos casos es cuando me da problemas...

Virman 27-03-2017 13:05:04

Saludos! Después de conseguir que me envíe correctamente las facturas emitidas con el nuevo web service, estoy teniendo problemas para rellenar las facturas recibidas.
El problema me surge a la hora de rellenar el Detalle de IVA, pues me devuelve null a la hora de crear la variable de tipo array.
Lo hago de la siguiente forma:
factRecibida.DesgloseFactura = new DesgloseFacturaRecibidasType();
factRecibida.DesgloseFactura.DesgloseIVA = new DetalleIVARecibidaType[1];

Me intenta crear el elemento DesgloseIVA[0], pero es null, por lo que no me deja rellenar el tipo impositivo, base imponible, cuota soportada, etc. Y al ser campos obligatorios no me permite enviar la factura recibida.

Alguna sugerencia? Porque en versiones anteriores del web service si podía crear el detalle de IVA.

Muchas gracias.

keys 27-03-2017 13:57:33

Yo no lo estoy haciendo en VB pero esa propiedad factRecibida.DesgloseFactura.DesgloseIVA es un array y me imagino que primero tendrás que declarar su tamaño.

Te pongo como es en delphi por si te sirve de algo

Código Delphi [-]
           SetLength(DesgloseOp, Tamanio);
           FacturaRecibida.DesgloseFactura.DesgloseIVA := DesgloseOp;

           for z := 0 to Tamanio - 1 do
             begin

                  DesgloseOp[z] := DetalleIVARecibidaType.Create;
                  DesgloseOp[z].TipoImpositivo := TratarCampoImporte(Desglose.TIPOIMPOSITIVO);
                  DesgloseOp[z].BaseImponible := TratarCampoImporte(Desglose.BASEIMPONIBLE);
                  DesgloseOp[z].CuotaSoportada := TratarCampoImporte(Desglose.CUOTAREPERCUTIDA);
                                  
             end;

Virman 27-03-2017 16:00:10

Cita:

Empezado por keys (Mensaje 514737)
Yo no lo estoy haciendo en VB pero esa propiedad factRecibida.DesgloseFactura.DesgloseIVA es un array y me imagino que primero tendrás que declarar su tamaño.

Te pongo como es en delphi por si te sirve de algo

Código Delphi [-]
           SetLength(DesgloseOp, Tamanio);
           FacturaRecibida.DesgloseFactura.DesgloseIVA := DesgloseOp;

           for z := 0 to Tamanio - 1 do
             begin

                  DesgloseOp[z] := DetalleIVARecibidaType.Create;
                  DesgloseOp[z].TipoImpositivo := TratarCampoImporte(Desglose.TIPOIMPOSITIVO);
                  DesgloseOp[z].BaseImponible := TratarCampoImporte(Desglose.BASEIMPONIBLE);
                  DesgloseOp[z].CuotaSoportada := TratarCampoImporte(Desglose.CUOTAREPERCUTIDA);
                                  
             end;

Gracias por la respuesta keys, En esta línea: factRecibida.DesgloseFactura.DesgloseIVA = new DetalleIVARecibidaType[1];
Es dónde le indico el tamaño que tiene que tener el array de DesgloseIVA, lo que pasa que me devuelve esto:
factRecibida.DesgloseFactura.DesgloseIVA[0]=null;
Luego no puedo rellenar las variables que componen esa struct. A alguien más le ha pasado? Gracias.

Edit1: Ya he encontrado mi fallo, que malos son los Lunes, jejejeje.
Me faltaba esta línea: factRecibida.DesgloseFactura.DesgloseIVA[0] = new DetalleIVARecibidaType();

Gracias keys por enseñarme el fallo.


La franja horaria es GMT +2. Ahora son las 16:02:12.

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