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)

Virman 01-02-2017 13:20:12

Qué faena lo de esperar hasta el día 7 para poder seguir realizando pruebas. He cambiado los webservices a la nueva versión y ahora no puedo hacer envíos.

ex.Message = "Codigo[4100].Error en la cabecera. El contenido de IDVersionSii no es válido."

Buenos, seguiremos probando más adelante.

Saludos.

RafaSerMed 01-02-2017 17:21:32

En mi caso con la versión 0.4, ya lo tengo todo listo. Soy capaz de enviar facturas tanto emitidas como recibidas, con datos de importes exentos o no, y alguna que otra combinación.

Por otro lado, también puedo realizar consultas de facturas y me devuelve los datos de envíos anteriores sin problemas.

Pero todo esto no me funciona con la versión 0.5, porque me da un error 404 en la URL de envío: https://www7.aeat.es/wlpl/SSII-FACT/...iiFactFEV1SOAP, aunque dicha URL si que responde con una llamada normal desde el navegador por ejemplo.

En la web no dice que funcionará a partir del día 7, sino que a partir de ese día "SOLO" se podrá enviar con esta versión. He remitido una pregunta a la AEAT sobre el tema y aun estoy en espera de contestación.

keys 02-02-2017 12:53:03

Convocatoria de las EE.DD. para el proyecto "Suministro Inmediato de Información (SII)" - 15 de febrero de 2017

Se comunica que el próximo día 15 de febrero de 2017 a las 11 h. se celebrará una reunión informativa en el Salón de Actos del Departamento de Informática Tributaria (C/ Santa María Magdalena, 16, 28016 Madrid) sobre el proyecto "Suministro inmediato de información (SII)" y con el siguiente contenido previsto:

11:00 - 11:45 h.: Normativa tributaria sobre el proyecto SII

11:45 - 13:15 h.: Aspectos tecnológicos del proyecto SII

13:15 - 13:45 h.: Ruegos y Preguntas

Si están interesados en asistir, por favor comuniquen nombre, apellidos y NIF de la persona designada al correo electrónico mariablanca.rodriguez@correo.aeat.es incluyendo en el asunto del mensaje el texto "EE.DD. 15/02/2017 y nombre de la empresa asistente".

A efectos de no superar el aforo de la sala, se debe limitar la asistencia a un máximo de una persona por empresa o entidad.

La información ofrecida se difundirá posteriormente en la dirección:

http://www.agenciatributaria.es/AEAT...olladores.html

Muchas gracias por su colaboración.

newtron 02-02-2017 13:27:38

Gracias por la info. ^\||/

apicito 03-02-2017 09:56:41

Como estoy siguiendo y utilizando este hilo para consumir otro webservice de la administración española os aporto una solución para cuando los envios deben firmarse digitalmente, que es mi caso, por si este lo requiere ahora o en el futuro.
Puede utilizarse la aplicación autofirma (https://administracionelectronica.go...s#.WJQ7nH9EKuc) que está ahora en su versión 1.5 y que se puede llamar desde la línea de comandos.
Por ejemplo:
Código:

"C:\Program Files\AutoFirma\AutoFirma\AutoFirma.exe" sign -i c:\Users\juan\proba.xml -o c:\Users\juan\proba-signed.xml -algorithm SHA512withRSA -store windows  -alias le-56772dsd-fc29-b432-f56f-sdfs45sd5456 -format "XAdES Enveloped"
Aún me falta algún detalle que solucionar, pero funciona.
Un saludo.

seccion_31 06-02-2017 09:48:04

Yo sigo esperando al dia 7. A ver que pasa

Ya puedo enviar facturas emitidas, y casi recibidas.

Tengo la consulta de facturas emitidas. Para saber que información tiene la AEAT recogida.

He parado todo el trabajo a esperar el dia 7. Por si acaso.


Ahora bien, tengo la siguientes dudas:

1) ¿alguien ha conseguido enviar mas de 13 facturas en un envio?
2) ¿es mejor enviar en bloques de 1 y obtener un CSV individual para cada factura? (y mas fácil para depurar un re-envio)
3) ¿Qué objetos creáis para enviar facturas de exportación e intracomunitarias?

Saludos !

keys 06-02-2017 16:00:22

Cita:

Empezado por seccion_31 (Mensaje 512960)
Yo sigo esperando al dia 7. A ver que pasa

Ahora bien, tengo la siguientes dudas:

1) ¿alguien ha conseguido enviar mas de 13 facturas en un envio?
2) ¿es mejor enviar en bloques de 1 y obtener un CSV individual para cada factura? (y mas fácil para depurar un re-envio)
3) ¿Qué objetos creáis para enviar facturas de exportación e intracomunitarias?

Saludos !

1) Estoy en tu mismo caso no puedo enviar mas de 13. Pregunte a hacienda pero no me han contestado nada. Estoy esperando a el día 7 para ver que pasa.

2) En principio creo que da igual siempre que este bien gestionado. Me imagino que el enviar de factura en factura hará que el proceso sea más lento. Al final lo importante es el id de respuesta si esta aceptado y la causa por la cual no te aceptan una factura.

3) Te pongo un ejemplo para cada una. En cuanto a las de exportación estan para la version actual, cuando cambie a la 5 en el campo ClaveRegimenEspecialOTrascendencia hay que poner un 2 y no un 15.
la intracomunitaria es de entrega de bienes y esta no va a cambiar para la siguiente version. En cuanto a las intracomunitarias de prestación hay que meterlas como inversión sujeto pasivo. No pongo ejemplo por que eso si cambia en la siguente version.

Un Saludo

seccion_31 06-02-2017 16:55:15

gracias keys

mañana lo miro.

en la aeat están empezando a responder... a ver que nos dicen.

cuidado con guardar el CSV

y tengo ya completos el tema de interrogar a la aeat de las facturas que ya hemos pasado. si quereis puedo colgar un trozo de ejemplo, pero hasta que no funcione todo con el cambio del dia 7, como que...

en fin...

seccion_31 07-02-2017 07:59:34

buenos días a todos !

Nos estamos superando:

Usando la 0.1 (que hasta ayer iba bien)
Codigo[3501].Error técnico de BBDD: java.sql.SQLException: TABLA MAESTRA ORA-00904: "LFE_IMP_NOSUJETA_PRES": identificador no válido

Usando la 0.5 (que hoy debería funcionar)
Not Found (404) - 'https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP'


¿Qué tal os va?

(ya les he escrito de nuevo)

Virman 07-02-2017 08:17:45

Error IDVersionSII
 
A mi al tratar de enviar una factura emitida, recibida o bien de inversión, me aparece el error:

ex.Message = "Codigo[4100].Error en la cabecera. El contenido de IDVersionSii no es válido."

Aún cuando la IDVersión es: VersionSiiType.Item05

Sin embargo la intracomunitaria si me ha dejado, alguna sugerencia?

Un saludo.

RafaSerMed 07-02-2017 09:27:28

Cita:

Empezado por Virman (Mensaje 512989)
A mi al tratar de enviar una factura emitida, recibida o bien de inversión, me aparece el error:

ex.Message = "Codigo[4100].Error en la cabecera. El contenido de IDVersionSii no es válido."

Aún cuando la IDVersión es: VersionSiiType.Item05

Sin embargo la intracomunitaria si me ha dejado, alguna sugerencia?

Un saludo.

En mi caso me ha dejado perfectamente. Eso sí, volviendo a generar la unidad a partir del WSDL, ya que ha cambiado con respecto al que estaba disponible previamente (no se para que le ponen disponible si luego cambia cuando realmente se puede usar).

El valor de IDVersionSii es VersionSiiType._0_5 con este nuevo WSDL.

seccion_31 07-02-2017 10:06:29

a esta hora y reimportando los wdsl y tal... ya puedo enviar facturas emitidas, recibidas, y consultar.

sigue dando el error:

Se requiere un certificado para completar la autenticación de cliente - URL:https://www7.aeat.es/wlpl/SSII-FACT/...iiFactFEV1SOAP - SOAPAction:""

si pasas un monton. No pasa ni una del paquete. (confirmado porque luego consulto).


una pregunta tonta... en el numero de factura pone "numeroserie" si tienes serie en tus facturas entiendo que debería ser 9999999X ¿no?

newtron 07-02-2017 10:13:27

Cita:

Empezado por seccion_31 (Mensaje 512991)
a esta hora y reimportando los wdsl y tal... ya puedo enviar facturas emitidas, recibidas, y consultar.

¿Sería posible un ejemplo operativo? No tengo yo muy claro lo de la consulta.

Cita:

Empezado por seccion_31 (Mensaje 512991)
una pregunta tonta... en el numero de factura pone "numeroserie" si tienes serie en tus facturas entiendo que debería ser 9999999X ¿no?

Yo entiendo también que hay que poner el número de factura completo con su serie.

Saludos

keys 07-02-2017 10:38:19

Cita:

Empezado por seccion_31 (Mensaje 512991)


una pregunta tonta... en el numero de factura pone "numeroserie" si tienes serie en tus facturas entiendo que debería ser 9999999X ¿no?

Yo creo que se refiere al numero identificador unico que tiene esa factura. Es decir si tienes serie la tienes que poner 99999999X o X999999, etc es decir como se identifique esa factura en la empresa.


Una Pregunta. A la hora de añadir los wsdl al proyecto los habeis añadido todos desde la misma carpeta? o habéis añadido cada uno desde una carpeta distinta? es decir las de emitidas por un lado, las recibidas por otro, etc...

A mi tambien me da error si envío muchas facturas.
Un Saludo.

Virman 07-02-2017 11:41:29

He reimportado los wsdl y ahora me dice:

ex.Message = "Debe establecer la propiedad Path para llamar al método Send."

He importado los servicios web de los 7 suministros que hay (SuministroBienesInversion, SuministroCobrosEmitidas, SuministroCobrosMetalico, SuministroFactEmitidas, SuministroFactRecibidas, SuministroOpIntracomunitarias, SuministroPagosRecibidas). Pero esta propiedad Path es la primera vez que la veo, a alguno le ha salido este mensaje de error al intentar enviar?

Un saludo.

Me autorespondo, me faltaba reeditar las referencias de los SiiService de cada suministro.

Virman 07-02-2017 12:43:11

Facturas emitidas consigo enviarlas correctamente, para el resto me devuelve SIEMPRE este error:

Error en comunicación: Codigo[4124].Error La direccion no se corresponde con el fichero de entrada.

Antes de la versión 0.5 conseguía enviar todos los tipos salvo Facturas Recibidas, pero ahora sólo puedo enviar facturas emitidas.

Ese error se lo da a alguien más? No he encontrado mucha información sobre ese error en la red, por lo que no puedo deciros muchos más.

Virman 07-02-2017 13:19:06

Cita:

Empezado por Virman (Mensaje 512995)
Facturas emitidas consigo enviarlas correctamente, para el resto me devuelve SIEMPRE este error:

Error en comunicación: Codigo[4124].Error La direccion no se corresponde con el fichero de entrada.

Antes de la versión 0.5 conseguía enviar todos los tipos salvo Facturas Recibidas, pero ahora sólo puedo enviar facturas emitidas.

Ese error se lo da a alguien más? No he encontrado mucha información sobre ese error en la red, por lo que no puedo deciros muchos más.

Vale, después de buscar he visto que era porque sigue apareciendo en los wsdl la dirección xxxxxxxxxxxx, y aunque la cambié en ellos, en app.config de mi proyecto, no se habían actualizado. Qué ganitas tengo de que pongan una versión estable y sin xxxxxxxxxxxx.

seccion_31 08-02-2017 08:29:43

Este es mi código para consultar facturas emitidas, colocando sus resultados en una base de datos.


Código:

//    memoErrores.lines.Clear;
    if dbRespuesta.active then dbRespuesta.Active:=false;

    dbRespuesta.FieldDefs.Clear;
    dbRespuesta.FieldDefs.Add('numero',ftstring,30,false);
    dbRespuesta.FieldDefs.Add('fecha',ftDate,0,false);
    dbRespuesta.FieldDefs.Add('cliente',ftstring,100,false);
    dbRespuesta.FieldDefs.Add('nif',ftstring,50,false);
    dbRespuesta.FieldDefs.Add('tipo',ftstring,5,false);
    dbRespuesta.FieldDefs.Add('exenta',ftstring,5,false);
    dbRespuesta.FieldDefs.Add('tipostr',ftstring,50,false);
    dbRespuesta.FieldDefs.Add('regimen',ftstring,5,false);
    dbRespuesta.FieldDefs.Add('operacion',ftstring,200,false);
    dbRespuesta.FieldDefs.Add('terceros',ftstring,5,false);
    dbRespuesta.FieldDefs.Add('total',ftfloat,0,false);
    dbRespuesta.FieldDefs.Add('cobros',ftstring,5,false);
    dbRespuesta.FieldDefs.Add('noexenta',ftstring,5,false);
    dbRespuesta.FieldDefs.Add('estado',ftstring,100,false);
    dbRespuesta.FieldDefs.Add('descripcio',ftstring,300,false);
    for h := 0 to 6 do
    begin
        dbRespuesta.FieldDefs.Add('iva'+inttostr(h),ftFloat,0,false);
        dbRespuesta.FieldDefs.Add('impiva'+inttostr(h),ftFloat,0,false);
        dbRespuesta.FieldDefs.Add('baseimp'+inttostr(h),ftFloat,0,false);
    end;
    dbRespuesta.CreateTable;
    dbRespuesta.Active:=true;

    //***CSY
    CERTIFICADO := BUSCAR_CERTIFICADO(comboBox1.text); //<----- SELECCIONAR CERTIFICADO
    if(CERTIFICADO = nil) then begin
      ShowMessage('No encuento el certificado');
      Exit();
    end;

    emitidas.HTTPWebNode.ClientCertificate.SerialNum := Buscar_Certificado_SERIAL(comboBox1.text);
    //****

  try
    /////////////////////////////////////////////////////////////////////////////
    ////  PRESENTADOR OSEA  -> NOSOTROS    //////////////////////////////////////
    //    se crea el objeto que se va a enviar:
    /////////////////////////////////////////////////////////////////////////////
    aConsultaLRFacturasEmitidas := ConsultaLRFacturasEmitidas.Create;
    aConsultaLRFacturasEmitidas.Cabecera:=CabeceraConsultaSii.Create;
    // DATOS:
    aConsultaLRFacturasEmitidas.Cabecera.IDVersionSii:=VersionSiiType(0);      // 0.1
    aConsultaLRFacturasEmitidas.Cabecera.titular := PersonaFisicaJuridicaUnicaESType.Create;
    aConsultaLRFacturasEmitidas.Cabecera.Titular.NombreRazon:=_PRESENTADOR;          // NOMBRE DEL PRESENTADOR (CUALQUIERA VALE)
    aConsultaLRFacturasEmitidas.Cabecera.Titular.NIF:=_NIF_EMISOR;              // CIF del PRESENTADOR (DEBE COINCIDIR CON EL CERTIFICADO SELECCIONADO)

    aConsultaLRFacturasEmitidas.FiltroConsulta:=LRFiltroEmitidasType.Create;
    aConsultaLRFacturasEmitidas.FiltroConsulta.PeriodoImpositivo:=PeriodoImpositivo.Create;
    aConsultaLRFacturasEmitidas.FiltroConsulta.PeriodoImpositivo.Ejercicio:=edit2.text;
    aConsultaLRFacturasEmitidas.FiltroConsulta.PeriodoImpositivo.Periodo:=TipoPeriodoType( comboBox2.itemIndex  );

    try
      // se hace la llamada a la funcion suministrada por el WS
      result := GetsiiSOAP(true,'',emitidas).ConsultaLRFacturasEmitidas(aConsultaLRFacturasEmitidas);
      memoComs.Lines.Add( getEnumName(typeInfo(ResultadoConsultaType), ord(result.resultadoConsulta) ) );

      //mostrar los resultados devueltos por la llamada
      for i := low(result.RegistroRespuestaConsultaLRFacturasEmitidas) to High(result.RegistroRespuestaConsultaLRFacturasEmitidas) do
      begin
          _noexenta:='';
          _numero:='';
          _fechaStr:='';
          _tipo:='';
          _tipoStr:='';
          _regimen:='';
          _operacion:='';
          _exenta:='';
          _terceros:='';
          _cliente:='';
          _nif:='';
          _tipodesglose:='';
          _cobros:='';
          _estado:='';
          _estadoFactura:='';
          _ImporteTotal:=0;
          _descripcion:='';

        with result.RegistroRespuestaConsultaLRFacturasEmitidas[i] do
        begin
            try
                if result.RegistroRespuestaConsultaLRFacturasEmitidas[i].datosfacturaemitida.tipodesglose.desglosetipooperacion<>nil then
                  _exenta:=GetEnumName( TypeInfo(CausaExencionType),ord(DatosFacturaEmitida.TipoDesglose.DesgloseTipoOperacion.Entrega.Sujeta.exenta.CausaExencion));
            except
            end;

            _tipo:=GetEnumName(TypeInfo(clavetipoFacturaType), Ord(DatosFacturaEmitida.TipoFactura));
            _tipoSTR:=tipoSTR( DatosFacturaEmitida.TipoFactura );
            _regimen:=GetEnumName( TypeInfo(IdOperacionesTrascendenciaTributariaType),  Ord(DatosFacturaEmitida.ClaveRegimenEspecialOTrascendencia) );

            _ImporteTotal:=strToFloat( SII_Numero( DatosFacturaEmitida.ImporteTotal ) );

            _operacion:=DatosFacturaEmitida.DescripcionOperacion;
            _terceros:=GetEnumName(typeInfo( EmitidaPorTercerosType ), ord( DatosFacturaEmitida.EmitidaPorTerceros ) );
            _numero:=IDFactura.NumSerieFacturaEmisor;

            try
              if DatosFacturaEmitida.contraparte<>nil then    // POR SI NO LLEVA CONTRAPARTE:
              begin
                _cliente:=DatosFacturaEmitida.contraparte.NombreRazon;
                _NIF:=DatosFacturaEmitida.contraparte.NIF;

                if DatosFacturaEmitida.TipoDesglose.DesgloseFactura<>nil then
                begin
                  _tipodesglose:=GetEnumName( typeInfo(TipoOperacionSujetaNoExentaType), ord(DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.TipoNoExenta) );
                  _noexenta:=getEnumName(typeInfo( TipoOperacionSujetaNoExentaType ) ,  ord(DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.TipoNoExenta ) );
                end;
                if DatosFacturaEmitida.contraparte.IDOtro<>nil then
                begin
                    if _NIF='' then
                        _NIF:=DatosFacturaEmitida.contraparte.IDOtro.ID;
                end;
              end
              else                                        // POSIBLE ERROR:
              BEGIN
                  _cliente:='SIN CLIENTE';
                  MemoComs.lines.add('factura: ' + IDFactura.NumSerieFacturaEmisor + ' SIN CLIENTE');
              end;

              if DatosFacturaEmitida.TipoDesglose.DesgloseFactura<>NIL then
              begin
                for h := low(DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA) to high( DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA) do
                begin
                    with DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA[h] do
                    begin
                          base[h]:= strTofloat( SII_numero( baseImponible ) );
                          tipo[h]:=strTofloat(SII_numero( tipoImpositivo ) );
                          cuota[h]:=strTofloat(SII_numero( cuotarepercutida ) );
                    end;
                end;
              end;
              _cobros:=getEnumName( typeInfo(FacturaARType),  ord(DatosFacturaEmitida.Cobros) );

              _fechaStr:=copy(IDFactura.FechaExpedicionFacturaEmisor,1,10);
              _fechaStr:=stringReplace(_fechaStr,'-','/',[rfReplaceAll]);
              _fecha:=strTodate( _fechaStr );
              _estado:=estadoFactura.EstadoRegistro;
              _descripcion:=DatosFacturaEmitida.DescripcionOperacion;

            MemoComs.lines.add('factura: ' + IDFactura.NumSerieFacturaEmisor + ' ' + IDFactura.NumSerieFacturaEmisorResumenFin + ' ' + IDFactura.FechaExpedicionFacturaEmisor);


            // guardar en la base de datos:
            dbRespuesta.Insert;
            dbRespuesta.fieldbyName('numero').Text:=_numero;
            dbRespuesta.fieldbyName('fecha').asdatetime:=_fecha;
            dbRespuesta.fieldbyName('cliente').Text:=_cliente;
            dbRespuesta.fieldbyName('nif').Text:=_nif;
            dbRespuesta.fieldbyName('tipo').Text:=_tipo;
            dbRespuesta.fieldbyName('tipostr').Text:=_tipostr;
            dbRespuesta.fieldbyName('exenta').Text:=_exenta;
            dbRespuesta.fieldbyName('regimen').Text:=_regimen;
            dbRespuesta.fieldbyName('operacion').Text:=_operacion;
            dbRespuesta.fieldbyName('terceros').Text:=_terceros;
            dbRespuesta.fieldbyName('total').asfloat:=_ImporteTotal;
            dbRespuesta.fieldbyName('cobros').text:=_cobros;
            dbRespuesta.fieldbyName('fecha').asdatetime:=_fecha;
            dbRespuesta.fieldbyName('estado').text:=_estado;
            dbRespuesta.fieldbyName('descripcio').text:=_descripcion;
            dbRespuesta.fieldbyName('Noexenta').text:=_noexenta;

            if DatosFacturaEmitida.TipoDesglose.DesgloseFactura<>NIL then
            begin
              for h := low(DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA) to high( DatosFacturaEmitida.TipoDesglose.DesgloseFactura.Sujeta.NoExenta.DesgloseIVA) do
              begin
                  dbRespuesta.fieldbyName('iva'+inttostr(h)).asfloat:=tipo[h];
                  dbRespuesta.fieldbyName('impiva'+inttostr(h)).asfloat:=cuota[h];
                  dbRespuesta.fieldbyName('baseimp'+inttostr(h)).asfloat:=base[h];
              end;
            end;

            dbRespuesta.Post;
        except
            On E:Exception do
            begin
              MemoErrores.lines.Add(_numero);
              MemoErrores.lines.Add(E.Message);
              MemoErrores.lines.Add('--------------------');
            end;

        end;


        end;
      end;
    except
      On E:Exception do
        //El proceso de envio dio error
        MemoErrores.lines.Add(E.Message);
    end;
  finally
    // se eliminan los objetos creados
    aConsultaLRFacturasEmitidas.Free;
    result.Free;

    dbRespuesta.Active:=true;
  end;
end;

Y Ahora me faltaria:

* Facturas recibidas intracomunitarias y autofactura....
* Factura a Canarias?

Aunque lo estoy mirando ahora, ¿Por favor, podeis postear algún ejemplo? ...

Saludos !

seccion_31 08-02-2017 08:50:22

Esta claro que hay facturas rectificativas por diferencias. Aunque no lo veo muy claro.


Pero ... ¿y los abonos? ¿Cómo se gestionan?

Saludos !

newtron 08-02-2017 09:35:04

Cita:

Empezado por seccion_31 (Mensaje 513031)
Esta claro que hay facturas rectificativas por diferencias. Aunque no lo veo muy claro.


Pero ... ¿y los abonos? ¿Cómo se gestionan?

Saludos !

Yo entiendo que los abonos son facturas emitidas pero en negativo. Yo he probado y se las "traga" sin problemas.

Saludos


La franja horaria es GMT +2. Ahora son las 13:21:55.

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