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)

QuiqueSalamanca 07-04-2020 11:51:05

Buenas a todos!!

Ya hace tiempo que andamos a vueltas con el S.I.I. en mi empresa porque han crecido demasiado y ahora deben enviar todo automáticamente.

He implementado todo lo que he leído, (casi 80 páginas y madre mía...) gracias a todos por tanta y tan valiosa información, pero me da un error a la hora de mandar a PRUEBAS una factura emitida, en concreto "Interface not supported".

Las direcciones son estas:

Código:

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

Me estoy volviendo un poco loco, la verdad. ¿Alguna idea?

Neftali [Germán.Estévez] 07-04-2020 13:40:33

Tal vez deberías mostrar qué código estás utilizamdo y dónde te está dando error.

Ese error es muy genérico como para darte una solución que sea algo más concreta que "utilizar correctamente los interfaces".

QuiqueSalamanca 07-04-2020 15:27:52

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 536622)
Tal vez deberías mostrar qué código estás utilizamdo y dónde te está dando error.

Ese error es muy genérico como para darte una solución que sea algo más concreta que "utilizar correctamente los interfaces".


Hola Germán!

Pues estoy utilizando el código del proyecto que subió newtron.

Código:

procedure TfrmAEATSII.sbInformarEmitidasClick(Sender: TObject);
var
  i:LongInt;
  ASuministroLRFacturasEmitidas:SuministroLRFacturasEmitidas;
  ARegistroLRFacturasEmitidas:Array_Of_LRfacturasEmitidasType;
  result:RespuestaLRFacturasEmitidas;

  CERTIFICADO :Pointer;
  IVAS: DesgloseIva2;
  cTotal : Currency;
  j : integer;

  a,mes,d:word;
begin
    if comboBox1.itemindex<0 then exit;



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


  try
    ASuministroLRFacturasEmitidas := SuministroLRFacturasEmitidas.Create;
    ASuministroLRFacturasEmitidas.Cabecera := CabeceraSii.Create;

    // DATOS:
    ASuministroLRFacturasEmitidas.Cabecera.IDVersionSii:=VersionSiiType(1);      // 0.1
    ASuministroLRFacturasEmitidas.Cabecera.titular := PersonaFisicaJuridicaESType.Create;
    ASuministroLRFacturasEmitidas.Cabecera.Titular.NombreRazon:=edEmpresa.Text;          // NOMBRE DEL PRESENTADOR (CUALQUIERA VALE)
    ASuministroLRFacturasEmitidas.Cabecera.Titular.NIF:=BBDD.zSacaNombre('EMPRESAS', 'IDEmpresa=' + Empresa.ToString,
                                                                        'CIF');            // 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);
  ///wlpl/SSII-FACT/ws/fr/SiiFactFRV1SOAP
    //Se crean todas las estructuras de datos de la consulta
    SetLength(ARegistroLRFacturasEmitidas, 1);
    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:=edEjercicio.text;                      //  AÑO
    decodeDate(spEnlaceLoad.FieldByName('FechaDoc').AsDateTime,a,mes,d);

    ARegistroLRFacturasEmitidas[0].PeriodoImpositivo.periodo  :=TipoPeriodoType(mes - 1);          //  PERIODO 01- ENERO ... 12-DICIEMBRE  (0A - ANUAL )


    With ARegistroLRFacturasEmitidas[0].IDFactura do
    begin
      IDEmisorFactura:= IDEmisorFactura3.Create;
      IDEmisorFactura.NIF  :=BBDD.zSacaNombre('EMPRESAS', 'IDEmpresa=' + Empresa.ToString,
                                              'CIF');                        // NUESTRO NIF, COMO EMISOR = TITULAR LIBRO REGISTRO = CERTIFICADO DIGITAL
      NumSerieFacturaEmisor:=spEnlaceLoad.FieldByName('NUMDOC').AsString;  // NUMERO Y SERIE DE LA FACTURA entiendo: 9999999X
      FechaExpedicionFacturaEmisor:=FormatDateTime('dd-mm-yyyy',
                                                    spEnlaceLoad.FieldByName('FechaDoc').AsDateTime);                // 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
    cTotal := spEnlaceLoad.FieldByName('Base').Value  +
              spEnlaceLoad.FieldByName('CuotaIVA').Value +
              spEnlaceLoad.FieldByName('CuotaReq').Value;
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.ImporteTotal:=StringReplace(StringReplace(CurrToStr(cTotal), '.', '', []), ',', '.', []);                      //  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:=spEnlaceLoad.FieldByName('Nombre').Value;          // NOMBRE DEL CLIENTE
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.NIFRepresentante:='';
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.NIF:=spEnlaceLoad.FieldByName('NIF').Value;                      // NIF DEL CLIENTE

(*
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro:=IDOtroType.Create;          // identifiacion del nif.
  //ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro.CodigoPais:=countryType2(10);  // EN CASO DE ESPAÑA NO ES NECESARIO
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro.IDType:=PersonaFisicaJuridicaIDTypeType(0);  // 2-NIF / 3-PASAPORTE / 4- DOCUMENTO OFICIAL IDENT. PAIS RESIDENCIA
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.Contraparte.IDotro.ID:='';        // EN CASO DE 3 Ó 4 INDICAR EL ID.
*)

  // EMPEZAMOS CON LOS DESGLOSES (IVAs)
    ARegistroLRFacturasEmitidas[0].FacturaExpedida.TipoDesglose:= TipoDesglose.create;      // ATENCION: TipoDesglose2 (facturas)  TipoDesglose (inmuebles)
    BBDD.zSetSQL( zDataSet2, 'SELECT * FROM T_FACTURASVENTA_IMP WHERE ID=' + spEnlaceLoad.FieldByName('IDDOC').AsString);
    BBDD.zExec( zDataSet2 );
    setLength(IVAS, zDataSet2.RecordCount);  // numeros de iVAs en factura
    j := 0;


    zDataSet2.First;
    while not zDataSet2.Eof do
    begin
      IVAS[j]:=DetalleIVA2.create;            // CREAR primer IVA
      IVAS[j].BaseImponible:= StringReplace(StringReplace(zDataSet2.FieldByName('Base').AsString,
                                            '.', '', []), ',', '.', []);            // BASE IMPONIBLE
      IVAS[j].TipoImpositivo:=StringReplace(StringReplace(zDataSet2.FieldByName('PORCIVA').AsString,
                                            '.', '', []), ',', '.', []);            // IVA %
      IVAS[j].CuotaRepercutida:=StringReplace(StringReplace(zDataSet2.FieldByName('CUOTA').AsString,
                                            '.', '', []), ',', '.', []);          // IMPORTE IVA
      IVAS[j].TipoRecargoEquivalencia:='0';    // REQ %
      IVAS[j].CuotaRecargoEquivalencia:='0';  // IMPORTE RECARGO
      zDataSet2.Next;
      Inc(j);
    end;

    //  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;
                                        // documento pais residencia (extranjero)
    //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(true,'',HTTPRIO1).SuministroLRFacturasEmitidas(ASuministroLRFacturasEmitidas); //<-- Puñetero error Interface not supported

      //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;

          Memo1.Visible := True;
        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;
  //https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/ssii/fact/ws/SuministroInmediatoInfo.wsdl
end;

Y la función GetsiiSOAP es:

Código:

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';
  defWSDL = 'https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP';
  defURL  = 'http://schemas.xmlsoap.org/wsdl/';
  defSvc  = 'siiService';
  //defPrt  = 'SuministroFacturasPruebas';
  defPrt  = 'SuministroFactEmitidasPruebas';


var
  RIO: THTTPRIO;
begin
UseWSDL:=True;
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as siiSOAP);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;

Básicamente he cogido el código, y para probar si me funcionaba con una sola factura.

Tengo un TADOStoredProcedure que me devuelve las facturas del Libro de IVA y es con lo que relleno los campos que se envían. Hay también funciones que devuelven datos de la BBDD que, depurando, devuelven los valores correctos.

El error es en el envío.

Gracias!

newtron 07-04-2020 18:37:18

Hola.


Desde que se puso ese código los wsdl han cambiado. Tendrás que importar los nuevos, los puedes sacar de la web de hacienda.


Saludos

nincillo 27-04-2020 09:55:10

Operación exenta de IVA de acuerdo con el artículo 8 del RD-ley 15/2020, de 21 de abr
 
¿Alguien ha enviado ya alguna factura "contamplando" esta novedad que se han sacado de la manga?

¿Podría alguien adjuntar un xml de ejemplo?

Gracias.

Cita:

Así es, con carácter temporal desde el 23 de abril de 2020 hasta el 31 de julio de 2020 se establece un tipo impositivo del 0% del IVA aplicable a las entregas interiores, importaciones y adquisiciones intracomunitarias del material sanitario relacionado en el anexo del Real Decreto-ley 15/2020 cuyos destinatarios sean entidades de Derecho Público, clínicas o centros hospitalarios, o entidades privadas de carácter social.

Estas operaciones al tipo del 0% de IVA se documentarán en factura como operaciones exentas, es decir, la factura no aplicará IVA alguno sobre la base imponible indicada e incluirá la mención "operación exenta de IVA de acuerdo con el artículo 8 del RD-ley 15/2020, de 21 de abril".

Pero cuidado, las entregas, importaciones y adquisiciones intracomunitarias del material sanitario indicado cuando el destinatario sea un particular, un profesional o un empresario no considerado entidad pública, clínica o centro hospitalario ni entidad de carácter social seguirán estando sujetas al tipo de IVA correspondiente de acuerdo con los artículos 90 y 91 de la Ley 37/1992 del IVA. Solo está exento de IVA si el destinatario en la factura, es unos de los organismo antes dicho.

newtron 27-04-2020 09:59:59

Cita:

Empezado por nincillo (Mensaje 536890)
¿Alguien ha enviado ya alguna factura "contamplando" esta novedad que se han sacado de la manga?

¿Podría alguien adjuntar un xml de ejemplo?

Gracias.


Yo me estoy enterando ahora de ese detalle pero según dice la factura hay que enviarla como cualquier otra exenta de IVA así que no deberías de tener problemas.


Saludos

nincillo 27-04-2020 10:06:56

Cita:

Empezado por newtron (Mensaje 536892)
Yo me estoy enterando ahora de ese detalle pero según dice la factura hay que enviarla como cualquier otra exenta de IVA así que no deberías de tener problemas.


Saludos

¿Y como causa de excención E6?

Cita:

E1 SUJETA EXENTA Art. 20
E2 EXENTA Art. 21
E3 EXENTA Art. 22
E4 EXENTA Art. 23 y 24
E5 EXENTA Art. 25
E6 EXENTA Otros

S1 sin ISP
S2 con ISP
S3 Sin y con ISP

newtron 27-04-2020 11:03:26

Efectivamente yo podría otros.

nincillo 29-04-2020 16:39:34

Cita:

Empezado por newtron (Mensaje 536892)
Yo me estoy enterando ahora de ese detalle pero según dice la factura hay que enviarla como cualquier otra exenta de IVA así que no deberías de tener problemas.


Saludos

¿Tu sabes si en la misma factura se pueden enviar cosas exentas y no exentas?. En caso afirmativo, ¿podrías pegarme un trozo de XML explicando como va la separación entre lo exento y lo no exento?. Gracias.

newtron 29-04-2020 16:45:56

Cita:

Empezado por nincillo (Mensaje 536950)
¿Tu sabes si en la misma factura se pueden enviar cosas exentas y no exentas?. En caso afirmativo, ¿podrías pegarme un trozo de XML explicando como va la separación entre lo exento y lo no exento?. Gracias.


Pues la verdad es que no se me ha planteado esa circunstancia. No sé si algún colega lo habrá previsto.

keys 30-04-2020 08:45:13

1 Archivos Adjunto(s)
Un saludo.

Os pongo un ejemplo de emitidas con iva 21 y exento

nincillo 30-04-2020 09:53:56

Cita:

Empezado por keys (Mensaje 536971)
Un saludo.

Os pongo un ejemplo de emitidas con iva 21 y exento

Las intracomunitarias también las mandas con este "formato" a nivel de <DesgloseFactura>?. Es que yo hasta ahora las estaba mandando con este formato:

Código:

          <sii:TipoDesglose>
            <sii:DesgloseTipoOperacion>
              <sii:Entrega>
                <sii:Sujeta>
                  <sii:Exenta>
                    <sii:DetalleExenta>
                      <sii:CausaExencion>E5</sii:CausaExencion>
                      <sii:BaseImponible>241.38</sii:BaseImponible>
                    </sii:DetalleExenta>
                  </sii:Exenta>
                </sii:Sujeta>
              </sii:Entrega>
            </sii:DesgloseTipoOperacion>
          </sii:TipoDesglose>

Gracias por tu tiempo.

keys 30-04-2020 10:26:49

1 Archivos Adjunto(s)
Claro las intracomunitarias van con desglose de operación. El ejemplo que he puesto era interior. Pongo un ejemplo de intracomunitaria.

Un Saludo

nincillo 02-05-2020 19:50:49

Cita:

Empezado por keys (Mensaje 536973)
Claro las intracomunitarias van con desglose de operación. El ejemplo que he puesto era interior. Pongo un ejemplo de intracomunitaria.

Un Saludo

Muchas gracias, me está sirviendo de mucho tu ayuda.

keys 04-05-2020 11:31:46

1 Archivos Adjunto(s)
Cita:

Empezado por nincillo (Mensaje 537018)
Muchas gracias, me está sirviendo de mucho tu ayuda.

Hola el ejemplo anterior es de una factura intererior para un cliente extranjero. Una factura intracomunitaria de venta, lógicamente es exenta con causa de exencion E5.

Por si acaso.

nincillo 05-05-2020 10:47:16

Cita:

Empezado por keys (Mensaje 537036)
Hola el ejemplo anterior es de una factura intererior para un cliente extranjero. Una factura intracomunitaria de venta, lógicamente es exenta con causa de exencion E5.

Por si acaso.

Me la descargo también y las comparo internamente.

Me ha surgido una duda. ¿Para un cliente cif español que se le vende mercancía con transporte marítimo internacional. El detalle de la exención tiene que ir en DesgloseFactura o en DesgloseTipoOperación?.

Yo hasta ahora lo estaba mandando en DesgloseTipoOperación y con E2 como causa exención. Pero con los cambios que estaba empezando a hacer cara a contemplar las exenciones de los guantes y demás por el estado de alarma, todas las exenciones que fueran de un cif español las iba a meter en DesgloseFactura.

Gracias por tu paciencia.

keys 05-05-2020 11:03:22

Cita:

Empezado por nincillo (Mensaje 537080)
Me la descargo también y las comparo internamente.

Me ha surgido una duda. ¿Para un cliente cif español que se le vende mercancía con transporte marítimo internacional. El detalle de la exención tiene que ir en DesgloseFactura o en DesgloseTipoOperación?.

Yo hasta ahora lo estaba mandando en DesgloseTipoOperación y con E2 como causa exención. Pero con los cambios que estaba empezando a hacer cara a contemplar las exenciones de los guantes y demás por el estado de alarma, todas las exenciones que fueran de un cif español las iba a meter en DesgloseFactura.

Gracias por tu paciencia.

Una factura a un cliente español no tiene por que ir por desglose de operacíon.

Segun la AEAT. "El desglose se hará obligatoriamente a nivel de operación cuando el cliente sea extranjero (tipo "ID Otro", salvo la clave 07, o NIF que empiece por N) y no sea una factura simplificada o un asiento resumen."

Un saludo.

nincillo 05-05-2020 11:15:19

Cita:

Empezado por keys (Mensaje 537081)
Una factura a un cliente español no tiene por que ir por desglose de operacíon.

Segun la AEAT. "El desglose se hará obligatoriamente a nivel de operación cuando el cliente sea extranjero (tipo "ID Otro", salvo la clave 07, o NIF que empiece por N) y no sea una factura simplificada o un asiento resumen."

Un saludo.

Ok. Entonces creo que voy por buen camino en las modificaciones que estoy haciendo

Hablando de Nif que empiece por N. ¿Tienes un ejemplo de XML de ese tipo?, porque me suena que algún cliente tienen de ese tipo.

Muchas gracias.

keys 05-05-2020 12:03:06

Cita:

Empezado por nincillo (Mensaje 537082)
Ok. Entonces creo que voy por buen camino en las modificaciones que estoy haciendo

Hablando de Nif que empiece por N. ¿Tienes un ejemplo de XML de ese tipo?, porque me suena que algún cliente tienen de ese tipo.

Muchas gracias.

No tengo ningun cliente de ese tipo. Pero tiene que desglosar por tipo de operacion igual que las intracomunitarias.

nincillo 05-05-2020 13:32:54

Cita:

Empezado por nincillo (Mensaje 536893)
¿Y como causa de excención E6?

En el 29 de este documento tratan preciosamente de lo que estamos hablando:

https://www.agenciatributaria.es/sta...tos_Censos.pdf


La franja horaria es GMT +2. Ahora son las 05:51:18.

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