Ver Mensaje Individual
  #3083  
Antiguo 07-04-2020
QuiqueSalamanca QuiqueSalamanca is offline
Miembro
 
Registrado: mar 2014
Posts: 35
Reputación: 0
QuiqueSalamanca Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
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!
Responder Con Cita