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)

seccion_31 25-01-2017 08:28:16

buenos días a todos !

Soy Jesús (alias Seccion31 alias seccion_31) menciono dos alias porque me ha sido imposible recuperar mi registro de 2004...

En fin... agradecer a todos los que estais en el foro vuestra importante labor, y comentar que SI, que yo también soy uno de los afectados de la SII.

Estoy absolutamente perdido con el SOAP... y tengo un monton de dudas.

Querria compartir con vosotros alguna de ellas:

¿ Solo hay que enviar facturas emitdas / recibidas?

¿Es posible enviar los registros de facturas emitidas / recibidas en formato Excel (ó XML) desde la web de la AEAT?

¿Sabeis si es posible hacer pruebas?

He preguntado a hacienda via email, pero todavía no me han dicho nada.

En fin...

vamos a empezar con este tema, y lo que vaya experimentando os lo comunicare.

Saludos cordiales

Jesús

keys 25-01-2017 09:17:00

Hola

¿ Solo hay que enviar facturas emitdas / recibidas?
En prinicipio hay que enviar cuatro libros
Libro registro de Facturas Expedidas.
Libro registro de Facturas Recibidas.
Libro registro de Bienes de Inversión.
Libro registro de Determinadas Operaciones Intracomunitarias.

Es una especie de modelo 340.


¿Es posible enviar los registros de facturas emitidas / recibidas en formato Excel (ó XML) desde la web de la AEAT?
No. Solo se pueden enviar mediante un fichero xml con la estructura definida por la aeat.

¿Sabeis si es posible hacer pruebas?
Se supone que si se pueden hacer pruebas pero yo por lo menos no he llegado a ese punto, estoy en el paso de generar lo xml.

En la página de la AEAT tienes mas información sobre el modelo y las especificaciones técnicas. Te pongo el enlace.

http://www.agenciatributaria.es/AEAT...VA__SII_.shtml

newtron 25-01-2017 09:32:39

Cita:

Empezado por keys (Mensaje 512601)
¿Sabeis si es posible hacer pruebas?
Se supone que si se pueden hacer pruebas pero yo por lo menos no he llegado a ese punto, estoy en el paso de generar lo xml.

Según he podido ver se puede definir en el "port" del componente HTTPRIO un puerto para pruebas llamado 'SuministroFacturasPruebas'. Esto se cambia al principio de la función GetiiSOAP:

Código Delphi [-]
function GetsiiSOAP(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): siiSOAP;
const
  defWSDL = 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInmediatoInfo.wsdl';
  defURL  = 'http://schemas.xmlsoap.org/wsdl/';
  defSvc  = 'siiService';
  defPrt  = 'SuministroFacturasPruebas';
.....

Saludos

seccion_31 25-01-2017 10:26:06

hola !

si es posible hacer pruebas....

he puesto en marcha el excelente ejemplo que habéis posteado. Lo he modificado levemente para encontrar los certificados digitales instalados. y SI: hay un puerto para hacer pruebas, que es el que estoy usando...

pero me devuelve este error:

código 102. Server returned wrong cipher suite for sesión ...

y ahí estamos.

y ahora sin tocar nada, me da este error:

El titular en la cabecera NO esta identificado... NIF tu NIF ... etc...

lo cual es una buena señal.


Pienso (pero no tengo mucha ida) que una vez establecida la conexión con el servidor (es decir, que el ejemplo funcione y responda algo lo que sea....) lo mas simple seria buscar la función (si es que existe) que envía el XML y esperar el resultado.

Edito de nuevo:

Visto lo visto básicamente el problema esta en saber que datos hay que enviar y donde localizarlos en el array: ARegistroLRFacturasEmitidas
Con lo que no haría falta el XML y aunque parezca mentira yo creo que seria mas cómodo... (creo).

keys 25-01-2017 13:40:56

Hola. Ya he llegado al punto de poder enviar el fichero, he seguido el ejemplo que han subido pero a la hora de hacer llamar a la función de envío me sale este error.

'Received content of invalid Content-Type setting: text/html - SOAP expects "text/xml"

Me pasa tanto en mi proyecto como en el de ejemplo. No se por que puede ser, alguien me puede ayudar.

He probado con los datos que vienen en el ejemplo y con estos, pero en los dos casos me devuelve el mismo error.

defWSDL = 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInmediatoInfo.wsdl';
defURL = 'https://www1.agenciatributaria.gob.es/wlpl/SSII-FACT/ws/SiiFactV1PSOAP';
defSvc = 'siiService';
defPrt = 'SuministroFacturasPruebas';


Por otra parte el poder generar el xml directamente puede ser una buena opción ya que la AEAT sacará una opción de poder enviar el xml a través de la página web de ellos sin web services ni nada. Será para empresas que tienen poco volumen de facturas.

seccion_31 25-01-2017 14:42:53

¿ seguro que sacara esa opción para enviar el XML (y cuando?) ?

Modificando el ejemplo anterior, estoy a punto de poder completar el envío de una factura.... pero cuando te falta algún campo los errores que saca son imprecisos.

Ahora mismo me dice que me falta la "contraparte" pero la estoy enviando, ya creo tenerlo bastante completo.... en cuanto lo complete os lo posteare, a ver si lo consigo.

En mi caso si voy bien haría las dos cosas...

seccion_31 25-01-2017 14:45:07

Cita:

'Received content of invalid Content-Type setting: text/html - SOAP expects "text/xml"
Ese error creo que te lo saca... (creo) por usar un certificado que no estaba bien. Yo también me lo vi al principio.

soykarloscc 25-01-2017 14:54:10

Cita:

Empezado por seccion_31 (Mensaje 512611)
Ese error creo que te lo saca... (creo) por usar un certificado que no estaba bien. Yo también me lo vi al principio.

Buenas aunque no sea el sitio, ando metido en lo mismo, pero con C#, y fijandome un poco en el ejemplo he conseguido avanzar pero me he quedado en lo mismo.

Received content of invalid Content-Type setting: text/html - SOAP expects "text/xml


Aunque aun no he realizado la llamado con el certificado...

Aun así gracias a todos por la informacion!!

keys 25-01-2017 15:19:49

Tienes razón. Es problema del certificado, estaba seleccionando uno que estaba caducado. Poniendo otro el error que me genera ya es otro. He detectado que si no se hace la parte del certificado, a la hora de hacer la llamada el mismo te muestra una ventana para seleccionar el certificado.

En la documentación de hacienda pone lo siguiente :

Suministro Inmediato de Información: modos de envío
1. Envío inmediato, de forma continua mediante “web service”. Desde el propio sistema de facturación se envía la información (agrupada según sus ciclos de proceso), con un margen de pocos días desde la expedición de la factura. La comunicación es automática “máquina a máquina”

2. Cumplimentación de un “formulario web” para aquellos de un “formulario web” para aquellos sujetos pasivos que realizan muy pocas operaciones.

Ya no se si lo cumpliran o no.

En cuanto la forma de generar el fichero xml, no veo la forma de que el delphi te genere con Xml DataBinding una estructura a través de dos ficheros xsd que es como lo da hacienda.

seccion_31 26-01-2017 08:48:37

Bueno, este es mi código que no funciona:

da error 4102: falta contraparte. Llevo repasándolo bastantes horas y nada. Luego llamo a la AEAT:

Pero... ¿podeis x favor, decirme como haceis para enviar el XML? porque viendo el tiempo que estoy perdiendo con esto, puedo intentar componer el XML.

hay unas pocas constantes que hay que añadir, e iria justo debajo de: setCERTIFICADO(CERTIFICADO);

CONST
_PRESENTADOR='xxxxx';
_NIF_EMISOR='xxxxxxx';

_NIF_CLI='xxxxxx';
_NOMBRE_CLI='xxxxxx';


Código:

try

    /////////////////////////////////////////////////////////////////////////////
    ////  PRESENTADOR OSEA  -> NOSOTROS    //////////////////////////////////////
    //    se crea el objeto que se va a enviar:
    /////////////////////////////////////////////////////////////////////////////
    ASuministroLRFacturasEmitidas := SuministroLRFacturasEmitidas.Create;
    ASuministroLRFacturasEmitidas.Cabecera := CabeceraSii.Create;
    // DATOS:
    ASuministroLRFacturasEmitidas.Cabecera.IDVersionSii:=VersionSiiType(0);      // 0.1
    ASuministroLRFacturasEmitidas.Cabecera.titular := PersonaFisicaJuridicaESType.Create;
    ASuministroLRFacturasEmitidas.Cabecera.Titular.NombreRazon:=_PRESENTADOR;          // NOMBRE DEL PRESENTADOR (CUALQUIERA VALE)
    ASuministroLRFacturasEmitidas.Cabecera.Titular.NIF:=_NIF_EMISOR;              // CIF del PRESENTADOR (DEBE COINCIDIR CON EL CERTIFICADO SELECCIONADO)
    // (0) A0 - ALTA
    // (1) A1-  MODIFICACION
    // (2) A4-  MODIFICACION REGIMEN VIAJEROS
    ASuministroLRFacturasEmitidas.Cabecera.TipoComunicacion:=ClaveTipoComunicacionType(0);

    //se crea un array con el numero de facturas que se van a emitir
    //en este ejemplo solo 1, pero pueden ser mas
    SetLength(ARegistroLRFacturasEmitidas, 1);

    //se introducen los datos de cada una de las facturas
//  for i := Low(ARegistroLRFacturasEmitidas) to High(ARegistroLRFacturasEmitidas) do
  // begin

    //Se crean todas las estructuras de datos de la consulta
    ARegistroLRFacturasEmitidas[0]:=LRfacturasEmitidasType.Create;
    ARegistroLRFacturasEmitidas[0].IDFactura:=IDFacturaExpedidaType.create;
    ARegistroLRFacturasEmitidas[0].FacturaExpedida:=FacturaExpedidaType.create;              // <- clase para tipo de factura
    ARegistroLRFacturasEmitidas[0].PeriodoImpositivo:=PeriodoImpositivo.Create;

    ARegistroLRFacturasEmitidas[0].PeriodoImpositivo.Ejercicio:='2016';                      //  AÑO
    ARegistroLRFacturasEmitidas[0].PeriodoImpositivo.periodo  :=TipoPeriodoType(11);          //  PERIODO 01- ENERO ... 12-DICIEMBRE  (0A - ANUAL )


    With ARegistroLRFacturasEmitidas[0].IDFactura do
    begin
      IDEmisorFactura:= IDEmisorFactura3.Create;
      IDEmisorFactura.NIF  :=_NIF_EMISOR;                        // NUESTRO NIF, COMO EMISOR = TITULAR LIBRO REGISTRO = CERTIFICADO DIGITAL
      NumSerieFacturaEmisor:='20169999F';                        // NUMERO Y SERIE DE LA FACTURA entiendo: 9999999X
      FechaExpedicionFacturaEmisor:='15/12/2016';                // FECHA DE EXPEDICION FACTURA    (dd-mm-yyyy)
    end;
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.tipofactura:=ClaveTipoFacturaType(0);      //  F1- FACTURA / F2 TICKET / ...
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.ClaveRegimenEspecialOTrascendencia:=IdOperacionesTrascendenciaTributariaType(0);  // 01-REGIMEN COMUN / 02-BIENES USADOS... 15-EXPORTACION
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.ImporteTotal:='121';                      //  TOTAL (opcional)
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.descripcionOperacion:='Nuestra Factura';  //  DESCRIPCION FACTURA (LIBRE)

    // CONTRAPARTE:
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte:=PersonaFisicaJuridicaType.Create;  // CREAR CLIENTE:
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.NombreRazon:=_NOMBRE_CLI;          // NOMBRE DEL CLIENTE
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.NIFRepresentante:='';
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.NIF:=_NIF_CLI;                      // NIF DEL CLIENTE

    ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro:=IDOtroType.Create;          // identifiacion del nif.
    //ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro.CodigoPais:=countryType2(10);

    ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro.IDType:=PersonaFisicaJuridicaIDTypeType(0);  // 2-NIF / 3-PASAPORTE / 4- DOCUMENTO OFICIAL IDENT. PAIS RESIDENCIA
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro.ID:='';                                      // documento pais residencia (extranjero)


    // EMPEZAMOS CON LOS DESGLOSES (IVAs)
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose:= TipoDesglose.create;      // ATENCION: TipoDesglose2 (facturas)  TipoDesglose (inmuebles)

    setLength(IVAS,1);                      // numeros de iVAs en factura
    IVAS[0]:=DetalleIVA2.create;            // CREAR primer IVA
    IVAS[0].BaseImponible:='100';            // BASE IMPONIBLE
    IVAS[0].TipoImpositivo:='21';            // IVA %
    IVAS[0].CuotaRepercutida:='21';          // IMPORTE IVA
    IVAS[0].TipoRecargoEquivalencia:='0';    // REQ %
    IVAS[0].CuotaRecargoEquivalencia:='0';  // IMPORTE RECARGO

    //  opcion 1
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.desgloseFactura:=TipoSinDesgloseType.create;
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.desgloseFactura.sujeta:=SujetaType.create;
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.desgloseFactura.sujeta.noexenta:=NoExenta.create;
    // ASIGNAR IVAS
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.desglosefactura.sujeta.noexenta.desgloseIVA:=IVAS;



    //  opcion 2 : (nada)
(*
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion:=TipoConDesgloseType.create;
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.entrega:=TipoSinDesgloseType.Create;
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.entrega.sujeta:=SujetaType.Create;
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.entrega.sujeta.noexenta:=NoExenta.Create;
    // ASIGNAR IVAS
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose.DesgloseTipoOperacion.entrega.sujeta.noexenta.desgloseIVA:=IVAS;
*)


    //se añade el array de facturas creado anteriormente
    ASuministroLRFacturasEmitidas.RegistroLRFacturasEmitidas:=ARegistroLRFacturasEmitidas;




    try
      // se hace la llamada a la funcion suministrada por el WS
      result := GetsiiSOAP.SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);

      //mostrar los resultados devueltos por la llamada
      for i := low(result.RespuestaLinea) to High(result.RespuestaLinea) do begin
        with result.RespuestaLinea[i] do begin
          Memo1.lines.add('factura: ' + IDFactura.NumSerieFacturaEmisor + ' ' + IDFactura.NumSerieFacturaEmisorResumenFin + ' ' + IDFactura.FechaExpedicionFacturaEmisor);
          //si el estado no es correcto, se muestran los errores
          if EstadoRegistro <> EstadoRegistroType(0) then
          begin
            Memo1.lines.add('Error no.: ' + InttoStr(CodigoErrorRegistro));
            Memo1.lines.add(DescripcionErrorRegistro);
          end;
        end;
      end;
    except
      On E:Exception do
        //El proceso de envio dio error
        MessageDlg(E.Message, mtError, [mbOK], 0);
    end;
  finally
    // se eliminan los objetos creados
    ASuministroLRFacturasEmitidas.Free;
    result.Free;
  end;


CMB 26-01-2017 15:16:40

Cita:

Empezado por seccion_31 (Mensaje 512630)
Bueno, este es mi código que no funciona:

da error 4102: falta contraparte. Llevo repasándolo bastantes horas y nada. Luego llamo a la AEAT:

Pero... ¿podeis x favor, decirme como haceis para enviar el XML? porque viendo el tiempo que estoy perdiendo con esto, puedo intentar componer el XML.

hay unas pocas constantes que hay que añadir, e iria justo debajo de: setCERTIFICADO(CERTIFICADO);

Para "seccion_31"

Saludos a todos. Soy un poco nuevo en este tema, pero estoy viendo que se trata de dos operaciones diferentes:

1. Crear el XML según normas de la AEAT en el documento SII_Descripcion_ServicioWeb.pdf
2. Enviarlo por Webservice

El primer paso no tiene ningún problema. Hay varias maneras de hacerlo. Es muy entretenido pero no es difícil.

Ahora bien, una vez tienes el XML, ¿cuáles son los pasos para enviarlo?

El proceso de Delphi con el "WSDL Importer" funciona perfectamente, incluso en Delphi 7. Te crea el SuministroInmediatoInfo.pas con todas las funciones que puedes llamar. ¡Fantástico! Pero eso no lo soluciona todo.

¿Qué viene después? ¿Hay que usar un componente SOAP de Delphi para el envío o no es necesario?

¿Cómo hay que tratar lo del certificado digital?

¿Y el NIF que tiene que ser validado contra la Base de Datos Centralizada de la AEAT?

¿Habrá alguien por ahí tan generoso que pueda explicarlo paso a paso?

Muchas gracias.

keys 26-01-2017 15:28:22

Hola. En un mensaje anterior de este hilo tienes un ejemplo que te muestra como hacer todo el tema de la conexión de la aeat, asi como lo de los certificados.

Un Saludo

seccion_31 26-01-2017 15:32:04

Hola !

Ya he conseguido enviar el XML no es muy difícil. (pero tela, para el que no sabe)

1) desde el objeto HTTPRIO se puede obtener el código XML resultante que es al final el que se envía, se puede guardar en disco.

2) desde ese mismo objeto se puede "alterar" en el momento del envio el XML que vas a enviar, o guardar el que ya tienes calculado (1)

3) hay que alterar la llamada de esta forma:

Código:


....
  try
      // se hace la llamada a la funcion suministrada por el WS
      result := GetsiiSOAP(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas);

4)

Colocar este evento:

Código:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
var
  ss:TFileStream;
begin
    SOAPRequest.Size:=0;
    ss:=TFileStream.Create('C:\1.xml', fmOpenRead);
    SOAPRequest.Position := 0;
    SOAPRequest.CopyFrom( ss, ss.Size);
    ss.Free;

    SOAPRequest.Position := 0;
end;

Y listo.

5) eso sustituirá el XML que iba a enviar por el vuestro.

Pero.... y aquí viene lo gordo:


En mi caso en TODOS LOS ENVIOS ya sean mios o COPIANDO EL EJEMPLO DE LA AEAT (cambiando únicamente el NIF emisor) me sale error en la contraparte.


El colmo es que guarda la factura(s) y a la segunda llamada me dice que la factura esta repetida.

6) Sigo esperando respuesta de la AEAT.

A ver si conseguimos algo, porque veo cosas raras... o me equivoco mucho todo el rato. no se ya....

seccion_31 26-01-2017 15:49:19

vale...

parece ser que ya voy atando cabos.

Acabo de pasar una correcta... (vía XML modificado)


El NIF que envias tiene que estar registrado por la AEAT si no te da error. A ver que me dicen a ese respecto.

Juntando el ejemplo primero (el que va en comprimido en el .rar) y pegándole mis códigos posteriores creo que ya estaría para probar basicamente... por favor, si alguien sabe algo mas seria bueno que lo posteara.

CMB 26-01-2017 20:31:03

Cita:

Empezado por keys (Mensaje 512642)
Hola. En un mensaje anterior de este hilo tienes un ejemplo que te muestra como hacer todo el tema de la conexión de la aeat, asi como lo de los certificados.
Un Saludo

Tienes razón. Tengo que releerlo todo de nuevo. Es bastante liado. Prometo no hacer más preguntas que ya estén contestadas. Leeré y haré pruebas antes de consultar otra vez. Lamento haceros perder el tiempo.

Una única pregunta antes. ¿Alguien ha podido solucionar todo esto con Delphi 7?

Muchas gracias!

Ñuño Martínez 27-01-2017 11:18:10

¿He leído mal, o es cierto que no existe una cuenta o ruta o forma de conectar en "modo prueba" para probar los programas? :confused:

keys 27-01-2017 11:26:00

El ejemplo que te puedes descargar está apuntando a servidor de pruebas. Además si te descargas la información técnica de la aeat tambien lo tienes.

CMB 27-01-2017 11:36:12

Cita:

Empezado por Ñuño Martínez (Mensaje 512661)
¿He leído mal, o es cierto que no existe una cuenta o ruta o forma de conectar en "modo prueba" para probar los programas?

En el documento SuministroInmediatoInfo.wsdl que se puede descargar hay dos líneas que dicen esto:

<wsdl port name="SuministroFacturasPruebas" binding="siiWdsl:siiBinding">
<soap:address location="https://www1.agenciatributaria.gob.es/wlpl/SSII-FACT/ws/SiiFactV1PSOAP"/>

Saludos

CMB 27-01-2017 14:56:55

Errores "Undeclared identifier con SuministroInmediatoInfo.pas"

Cuando añado al proyecto la unit SuministroInmediatoInfo.pas, incluso estando en la cláusula Uses, Delpi me da una lista de 39 errores, como

[Error] SuministroInmediatoInfo.pas(76): Undeclared identifier: 'SuministroLRFacturasEmitidas'
[Error] SuministroInmediatoInfo.pas(76): Undeclared identifier: 'RespuestaLRFacturasEmitidas'
[Error] SuministroInmediatoInfo.pas(77): Undeclared identifier: 'BajaLRFacturasEmitidas'
[Error] SuministroInmediatoInfo.pas(77): Undeclared identifier: 'RespuestaLRBajaFacturasEmitidas'
(...)

(Delphi 7)

¿Cómo lo habéis resuelto?

Por favor, disculpad mi ignorancia. Llevo muchos años con Delphi pero ésta no la sé solucionar. Muchas gracias por adelantado.

Saludos,

keys 27-01-2017 14:59:27

Creo que es por la versión de delphi, yo lo estoy probando en berlin.


La franja horaria es GMT +2. Ahora son las 16:56:27.

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