Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Bibliotecas de código fuente
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-01-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.776
Poder: 8
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
AFIP Argentina: Consultas al padron de contribuyentes

Hola

Como se puede ver en este post, existe un WebService de la AFIP que permite, entre otras cosas, realizar consultas por Numero de CUIT/DNI/etc para obtener datos de los contribuyentes registrados

Se trata de un servidor REST, asi que es bastante sencillo implementar las operaciones GET

Lo que quiza es medio "engorroso", es convertir el JSON y meterlo dentro de clases Delphi

Esta tarde me dedique a esto. Lamentablemente lo hice con Delphi 10 Seattle, porque queria probar los nuevos componentes TNetHttpClient y la biblioteca System.JSON; creo que ambos estan disponibles a partir de XE8, sino 10 Seattle

Aun asi, el codigo es facilmente adaptable (creo) para usarlo con Indy y alguna otra biblioteca Json (incluso las que venian con Delphi antes, creo que la unidad era Rest.Json)

Pueden obtener el codigo en mi repositorio o seguir directamente este enlace

Tambien subí la documentacion

Implemente solo 3 metodos, hay algunos mas que quiza implemente mas adelante (lo mismo que una version compatible con los Delphi anteriores basada en Indy)

Código Delphi [-]
ConsultaNroDocumento(NroDocumento: string)

Devuelve todos los CUIT, CUIL, etc asociados a NroDocumento (DNI). La AFIP llama a estos numeros los "Id" de las personas

Código Delphi [-]
ObtenerConstancia(Cuit/Cuil/Cdi: string/Int64)

Curioso metodo. Devuelve un archivo en formato PDF con la Constancia de Inscripción emitida por AFIP o con un texto indicando motivo por el cual esa constancia no pudo ser emitida.


Código Delphi [-]
ConsultaPersona(const Cuit/Cuil/Cdi: string)

Este metodo devuelve una interface con una numerosa cantidad de campos, por ejemplo, razon social o nombre, domicilio fiscal, fecha inscripcion, estado inscripcion (activa, inactiva), si es persona fisica o juridica, etc


Saludos
Responder Con Cita
  #2  
Antiguo 22-01-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 27.304
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Responder Con Cita
  #3  
Antiguo 22-01-2016
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 977
Poder: 12
ElKurgan Va por buen camino
Thumbs up

Gracias por el aporte
Responder Con Cita
  #4  
Antiguo 25-01-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.776
Poder: 8
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Hola de nuevo

He implementado los metodos que faltaban, los que segun la documentacion son del sistema "parametros", podria decirse que son "tablas auxiliares", o "tablas lookup"

- Impuestos
- Conceptos
- Caracterizaciones
- Etc

Tambien dado que alguna de estas consultas "demoran" un poquito porque devuelven mas informacion (actividades creo que devuelve unas 2500 tuplas) agregue una pequeña capa de persistencia

En realidad es una sencilla interface que cada desarrollador puede implementar como mas le guste y luego inyectarla en el constructor de la clase

Hay una implementacion de la interface a modo de ejemplo que utiliza colecciones (diccionarios) para almacenar la informacion en memoria

En el demo se puede ver que listar las 2500 tuplas en el memo, si hago la consulta a traves del web service, tarda unos 2,5 - 3 segundos, pero usando la info de la cache tarda 600 mseg

Luego tambien esta la posibilidad de aun asi "forzar" a que traiga los datos frescos del web services (los metodos tienen el parametro GetFromPersistent, por defecto a True) que indica si quiero traer los datos desde la clase de persistencia (true) o del webservice (false)

Lo que son consultas de datos de las personas no lo meti nada en la capa de persistencia porque es bastante rapido, es mucha menos la informacion que viene asi que no tiene sentido


Saludos
Responder Con Cita
  #5  
Antiguo 25-01-2016
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.478
Poder: 22
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Parece muy buen trabajo, Agustín. Estoy seguro de que será de gran utilidad.
__________________
Twitter
Código
Blog
Móvil y WhatsApp: +52 1 2711260117
Responder Con Cita
  #6  
Antiguo 04-03-2016
cmschneider cmschneider is offline
Registrado
 
Registrado: oct 2006
Posts: 6
Poder: 0
cmschneider Va por buen camino
Hola Agustín: aprovecho que realizaste este excelente trabajo para consultarte si pudiste hacer algo similar con Indy. He intentado de todo con el componente IdHTTP (ya que tengo Delphi XE8, y no poseo las librerías que utilizaste), para la consulta de CUIT en AFIP (https://soa.afip.gob.ar/sr-padron/v2...na/33709585229) y por más pruebas que hago no puede obtener como resultado la cadena json, sino un documento en blanco. Desde ya cualquier dato, sugerencia o, código se agradece.
Responder Con Cita
  #7  
Antiguo 04-03-2016
cmschneider cmschneider is offline
Registrado
 
Registrado: oct 2006
Posts: 6
Poder: 0
cmschneider Va por buen camino
Voy a ampliar y aclarar mi consulta anterior.
Ocurre que deseo consultar los datos del padrón AFIP de Argentina, desde Delphi XE8, utilizando Indy.
Cuando pego la siguiente dirección en un navegador: https://soa.afip.gob.ar/sr-padron/v2...na/33709585229
obtengo: {"success":true,"data":{"idPersona":33709585229,"tipoPersona":"JURIDICA","tipoClave":"CUIT","estadoC lave":"ACTIVO","nombre":"GOOGLE ARGENTINA S.R.L.","domicilioFiscal":{"direccion":"MOREAU DE JUSTO A.AV 350 Piso:2","codPostal":"1107","idProvincia":0},"idDependencia":10,"mesCierre":12,"fechaInscripcion":"20 06-04-07","fechaContratoSocial":"2006-03-29","impuestos":[10,25,30,103,211,217,218,301,353],"actividades":[731009,620900,711003],"caracterizaciones":[68,72,255]}}

Bien, intento desde Delphi, utilizando IdHttp

Código Delphi [-]
procedure TForm1.BitBtn5Click(Sender: TObject);
var
  lHTTP: TIdHTTP;
  resp: String;
begin
  lHTTP := TIdHTTP.Create(nil);
  try
    resp := lHTTP.Get('https://soa.afip.gob.ar/sr-padron/v2/persona/33709585229');
    Memo1.Lines.Add(Resp);
  finally
    lHTTP.Free;
  end;

end;

y que obtengo?: <html><head></head><body><br><br></body></html>

He probado otras variantes, pero siempre llego al mismo resultado. ¿Alguna idea?
Responder Con Cita
  #8  
Antiguo 05-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.776
Poder: 8
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Hola cmschneider

La verdad he usado poco y nada los componentes Indy,

En esta ocasion hice las pruebas con Delphi 2010; la version de los componentes Indy es la 10.5.5

Copie el codigo tal cual lo pusiste y obtengo una excepcion de tipo EIdIOHandlerPropInvalid con el mensaje

Cita:
IOHandler value is not valid
Seguire investigando
Responder Con Cita
  #9  
Antiguo 05-03-2016
cmschneider cmschneider is offline
Registrado
 
Registrado: oct 2006
Posts: 6
Poder: 0
cmschneider Va por buen camino
Hola Agustín: ante todo muchas gracias por tu tiempo. Luego de muchos intentar, me dí cuenta que las librerías que me faltaban para hacer funcionar tu proyecto son las encargadas de parsear los Json devueltos (System.Json.Types, System.Json.Readers). Así que modifiqué la unit Afip.PublicAPI.Parsers para hacerla funcionar con las herramientas que tengo en XE8 y funcionó!
Nuevamente gracias; me será de mucha utilidad.
Responder Con Cita
  #10  
Antiguo 05-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.776
Poder: 8
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
En realidad es un error de mi parte haberlo implementado de esa forma, ya que se generan dependencias con otras bibliotecas y no existe la posibilidad de cambiar eso sin trocear el código

Por cierto no pude lograr obtener una respuesta con Indy, y eso que he agregado el componente interceptor para OpenSSL

En ese caso obtengo una excepción socket timeout
Responder Con Cita
  #11  
Antiguo 26-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.776
Poder: 8
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Saludos,

Me termine dando por vencido con Indy (he probado con las diferentes versiones, la 9, la 10, buscado en internet y no hay caso )

He decidido darle una oportunidad a la biblioteca Synapse que es OpenSource. Con esta biblioteca no he tenido ningun problema para realizar las invocaciones GET

El siguiente paso fue eliminar las dependencias con los componentes NetHttpClient

He declarado una interface en la unidad Afip.PublicAPI.HttpClient y delegado la implementacion al usuario:

Código Delphi [-]
  IHttpClient = interface
    ['{AFA99837-6CBB-4111-A268-D8AB8E4CD8DD}']
    function HttpGetText(const AUrl: string): string;
    function HttpGetBinary(const AUrl: string): TStream;
  end;

Cualquier clase que implemente IHttpClient le sirve a mi clase TAfipQuery para comunicarse con el servidor REST

Se proveen dos implementaciones:

- La que ya teniamos hasta ahora, usando los components NetHttpClient

Esa implementacion la he movido a la unidad Afip.PublicAPI.NetHttpClient; esta encapsulado dentro de la clase TNativeHttpClient

- La nueva implementacion usando la biblioteca Synapse, en la unidad Afip.PublicAPI.SynapseHttpClient

He incluido tambien en el repo la propia biblioteca Synapse, con solo agregar la ruta en Delphi, ya esta listo para funcionar

Cita:
... \AFIP\Third-Party\Synapse

El constructor de TAfipQuery ahora requiere una referencia a una interface de este tipo (dependency injection)

Código Delphi [-]
  constructor Create(const AHttpClient: IHttpClient; const APersister: IPersister_Afip = NIL);

Y eleva una excepcion si le pasamos NIL...

Código Delphi [-]
constructor TAfipQuery.Create(const AHttpClient: IHttpClient; const APersister: IPersister_Afip = NIL);
begin
  if AHttpClient = NIL then
    raise Exception.CreateFmt('%s.Create :: AHttpClient is NIL', [ClassName]);

He eliminado las funciones que operaban (por asi llamarlo de una manera) "al estilo static", o de funcion de clase (class function) porque ahora no tengo mas el constructor por defecto y no quiero seguir acoplando dependencias

Por ultimo he actualizado el demo para que cumpla con esta refactorizacion; tambien he incluido la posibilidad de usar una u otra biblioteca en tiempo de ejecucion (Synapse o NetHttp)

La biblioteca Synapse deberia funcionar con versiones mas antiguas de Delphi e incluso FPC (Lazarus)
Responder Con Cita
  #12  
Antiguo 29-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.776
Poder: 8
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Saludos,

He terminado por desacoplar completamente el diseño

He implementado el parser usando la biblioteca lkJSON

El código ya está publicado, ahora tenemos dos clases que implementan las interfaces parser, usando dos bibliotecas distintas para tratar con JSON: la biblioteca System.Json de Delphi y la lkJSON

De este modo se amplia la compatiblidad con versiones de Delphi mas antiguas

He incluido algunas reformas, por ejemplo ahora el constructor va a tambien requerir las interfaces parser. De este modo el usuario puede incluir su implementacion si asi lo quiere
Responder Con Cita
  #13  
Antiguo 29-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.776
Poder: 8
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Aca se puede ver el demo en ejecucion, compilado con Delphi 2010

Ya he solucionado los problemas de compilación (record helper, namespaces de las unidades, TFormatSettings)

Responder Con Cita
  #14  
Antiguo 30-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.776
Poder: 8
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Hola nuevamente

He creado un port para FreePascal de esta biblioteca

Hay algunas pequeñas diferencias con la version para Delphi (mas que nada las dependencias, tuve que tocar bastante la biblioteca lkJSON)

Pueden obtenerlo acá

Saludos
Responder Con Cita
  #15  
Antiguo 04-08-2016
fcios fcios is offline
Miembro
 
Registrado: jul 2003
Posts: 98
Poder: 15
fcios Va por buen camino
Hola yo lo hice con 2 componentes de las ICS

TSslHttpCli y TSslContext;

// Consulta a Padrón Nivel 3 WSPN3

Código Delphi [-]
unit Unit1;
// usa los ICS de OverbyteIcsV7Gold
// http://www.overbyte.be/frame_index.h...ducts/ics.html

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OverbyteIcsWSocket, OverbyteIcsWndControl, OverbyteIcsHttpProt,
  StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    SslHttpCli1: TSslHttpCli;
    SslContext1: TSslContext;
    Label5: TLabel;
    ConsultarCuitBB: TBitBtn;
    ICSMemo1M: TMemo;
    Memo1: TMemo;
    SalirBB: TBitBtn;
    ConsultarCuitE: TEdit;
    procedure SslHttpCli1RequestDone(Sender: TObject; RqType: THttpRequest;
      ErrCode: Word);
    procedure ConsultarCuitBBClick(Sender: TObject);
    procedure SalirBBClick(Sender: TObject);
  private
    { Private declarations }
    sAux : string;
    function  BuscoValorDelNodo1(const sTexto:{wide}String; const sNodoABuscar:string; var sRespuesta:{wide}string):boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses StrUtils{PosEx};

const
  myEOL        = #13+#10; // simula enter o fin de linea

{$R *.dfm}

procedure TForm1.ConsultarCuitBBClick(Sender: TObject);
var
  nCantErrores :byte;
  sCuit : string;
  sRespu :string;
const nMAX_ERRORES = 2; // PORQUE LA PRIMERA VEZ QUE SE CONECTA ES POSIBLE QUE DE ERROR

begin
  ConsultarCuitBB.Enabled := False;
  ConsultarCuitBB.Update;        

  ConsultarCuitE.Text := StringReplace(ConsultarcuitE.Text,'-','',[rfReplaceAll]);
  sCuit := ConsultarCuitE.Text;

  SslHttpCli1.URL := 'https://soa.afip.gob.ar/sr-padron/v2/persona/'+
    sCuit;

  SslHttpCli1.RcvdStream := TMemoryStream.Create;

  nCantErrores :=0;
  while True do begin
    try
      IcSMemo1M.Lines.Clear;
      SslHttpCli1.Get;
    except
      on E: Exception do begin
        if e.Message = 'Connection aborted on request' then begin
          ICSMemo1M.Lines.Append('Error al conectar, verifique tener libeay32.dll y ssleay32.dll'+myeol+
                              e.Message {+' '+e.ClassName});
          ConsultarCuitBB.Enabled := True;
          Exit;
        end;
        ICSMemo1M.Lines.Append(myEOL+'Error al conectar '+myeol+e.Message {+' '+e.ClassName});
        ConsultarCuitBB.Enabled := True;
        exit;
      end;
    end;        // 123,34,115,117, = {"su

//  if SslHttpCli1.RcvdStream = nil then begin
    if SslHttpCli1.RcvdCount = 0 then begin
        Inc(nCantErrores);
        sAux := DateTimeToStr(Now) + ' ERROR DE CONEXION, RX, ' +
          ' INTENTO ' + IntToStr(nCantErrores) +myeol+ 'VERIFIQUE QUE EXISTE LIBEAY32.DLL Y SSLEAY32.DLL' ;
          // myEOL+ e.ClassName + myEOL + e.Message;
        //  GraboErrorLog(sSistema+myEOL+sAux,not bMostrarError);
        ICSMemo1M.Lines.Append(sAux);
        if nCantErrores <= nMAX_ERRORES then begin
          // MuestroErrorArba(False,True,sAux);
          ICSMemo1M.Lines.Append('Intento '+intToStr(nCantErrores));
        end else
        begin
          //MuestroErrorArba(False,True,sAux,5);
          ICSMemo1M.Lines.Append(sAux);
          Break;
        end;
      Continue;
    end;

    Break;
  end;
  SslHttpCli1.RcvdStream.Free;
  SslHttpCli1.RcvdStream := nil;

  if BuscoValorDelNodo1(ICSMemo1M.Text,'success', sRespu) = True then begin
    Memo1.Lines.Append('success='+sRespu);
  end else begin
    memo1.Lines.Append('No se encuentra cuit ' + sCuit + myeol+
      ICSMemo1m.Text);
  end;

  if BuscoValorDelNodo1(ICSMemo1M.Text,'idPersona', sRespu) = True then begin
    Memo1.Lines.Append('idPersona='+sRespu);
  end else begin
    memo1.Lines.Append('No se encuentra cuit ' + sCuit + myeol+
      ICSMemo1m.Text);
  end;

  if BuscoValorDelNodo1(ICSMemo1M.Text,'tipoPersona', sRespu) = True then begin
    Memo1.Lines.Append('tipoPersona='+ sRespu);
  end else begin
    memo1.Lines.Append('No se encuentra tipoPersona para ' + sCuit + myeol+
      ICSMemo1m.Text);
  end;


  //
  ConsultarCuitBB.Enabled := True;
end;

function  TForm1.BuscoValorDelNodo1(const sTexto:{wide}String; const sNodoABuscar:string; var sRespuesta:{wide}string):boolean;
// usada para AFIP
// si no encontró el sNodoABuscar retorna False y limpia sRespuesta
// sTexto : texto donde buscar el sNodoABuscar
// sNodoABuscar es el string a buscar ej. 'direccion'
//
var n,n2,nLongNodo:integer;
begin
  n:=Pos('"' + sNodoABuscar + '":',sTexto);
  if n = 0 then begin // si no lo encuentra retorna FALSE
    Result := False;
  sRespuesta := '';
    Exit;
  end;
  Result := True;
  nLongNodo := Length(sNodoABuscar) + 3;

  // busco donde empieza el nodo
  if sTexto[n + nLongNodo ] = '[' then begin // si es array
    n2 := PosEx(']',sTexto,n) +1 ;
  end
  else
    n2 := PosEx(',',sTexto,n);

  if sTexto[n2-1] = '}' then // saco el cierre } de por ejemplo idProvincia
    Dec(n2);


//  if n2 = 0 then
//    MuestroError(True,'NO SE ENCUENTRA FIN DE NODO' + sNodoABuscar,LogSL,True);
//sRespuesta := MidStr(sTexto,n+nLongNodo,n2{-n-nLongNodo});
  sRespuesta := copy(sTexto,n+nLongNodo,n2-n-nLongNodo);
end;


procedure TForm1.SslHttpCli1RequestDone(Sender: TObject;
  RqType: THttpRequest; ErrCode: Word);
var
  Data : String;
begin
    SslHttpCli1.SendStream.Free;
    SslHttpCli1.SendStream := nil;

    if ErrCode <> 0 then begin
        ICSMemo1M{ICSErrorM}.Lines.Append('Post error #' + IntToStr(ErrCode));
        SslHttpCli1.RcvdStream.Free;
        SslHttpCli1.RcvdStream := nil;
        Exit;
    end;
    if SslHttpCli1.StatusCode <> 200 then begin
        ICSMemo1M{ICSErrorM}.Lines.Append('Post error: ' + IntToStr(SslHttpCli1.StatusCode) +
                SslHttpCli1.ReasonPhrase);
        SslHttpCli1.RcvdStream.Free;
        SslHttpCli1.RcvdStream := nil;
        Exit;
    end;
//  Memo1.Lines.Append('Post was OK. Response was:');
    SslHttpCli1.RcvdStream.Seek(0, 0);
    SetLength(Data, SslHttpCli1.RcvdStream.Size);
    SslHttpCli1.RcvdStream.Read(Data[1], Length(Data));
    ICSMemo1M.Lines.Append(Data);
  // grabo log
//  ArbaLogSL.Append(FormatDateTime('dd-mm-yyyy hh:nn:ss ',now)+ UltimaActualizacionL.Caption+
//    ' TX '+ArbaDatosSL[ccDESCRIPCION]+
//    myEOL + ArbaSL.Text +myEOL+
//   'RX'+ myEOL + SslHttpCli1.RcvdHeader.Text +myEOL+ Data +myEOL);

//  ArbaLogSL.SaveToFile(sArbaArchivoLog);
end;

procedure TForm1.SalirBBClick(Sender: TObject);
begin
  Close;
end;

end.

Última edición por fcios fecha: 04-08-2016 a las 01:50:38.
Responder Con Cita
  #16  
Antiguo 27-06-2017
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 201
Poder: 14
elrayo76 Va por buen camino
He visto el código y esta todo muy bueno.

El problema es que necesitamos entre todos buscar alguna solución para poder usar tu código con las librerías que trae Delphi XE8. Es que intento por mi parte usar lo menos posible componentes de terceros, ya que en ocaciones me ha pasado que al cambiar de versión de Delphi no hay actualización de los mismos y es engorroso ponerce a tocarlos para hacerlos compatibles.

Saludos,
El Rayo
Responder Con Cita
  #17  
Antiguo 27-06-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.776
Poder: 8
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Yo utilizo ese codigo con Delphi 2010. Compila sin ningun problema. Eso si, necesitas la biblioteca Synapse para la parte de HTTP, ya que con Indy he tenido problemas; y alguna otra biblioteca para tratar con JSON, yo he usado lkJson

De hecho, el mismo codigo lo he traducido a FreePascal (hay algunas cuestiones menores relacionadas con el soporte a genericos y ayudantes, pero es en esencia el mismo codigo)

Si queres usar otras bibliotecas simplemente tenes que implementar un par de interfaces:

Las que convierten JSON a objetos de negocio, definidas en Afip.PublicAPI.Parsers.pas

Código PHP:
  IAfip_PersonParser = interface
    [
'{3A2CC23D-B463-45C8-B3BA-8546DBF21A62}']
    function 
JsonToPerson(const AJsonstring): IPersona_Afip;
    function 
JsonToDocumentos(const AJsonstring): TArray<string>;
  
end;

  
IAfip_ItemParser = interface
    [
'{0EF21EDC-EFE9-4600-8732-1BBE3A7B136C}']
    function 
JsonToItems(const AJsonstring): TArray<TItem_Afip>;
    function 
JsonToDependencies(const AJsonstring): TArray<TDependencia_Afip>;
  
end
Y un cliente HTTP, esta interfaz esta definida en Afip.PublicAPI.HttpClient.pas

Código PHP:
  /// <summary>
  ///  Esta interface define los dos metodos basicos que tienen que implementar los clientes HTTP
  ///  Segun la documentacion de la AFIP el encoding del response es UTF-8
  /// </summary>
  
IHttpClient = interface
    [
'{AFA99837-6CBB-4111-A268-D8AB8E4CD8DD}']
    function 
HttpGetText(const AUrlstring): string;
    function 
HttpGetBinary(const AUrlstring): TStream;
  
end
Despues conectas todo, creando una instancia de la clase TAfipQuery. El constructor te va a indicar que objetos necesitas suministrar:


Código Delphi [-]
var
  API_AFIP: IApi_Afip;
  HttpClient: IHttpClient;
  PersonParser: IAfip_PersonParser;
  ItemsParser: IAfip_ItemParser;
begin
  HttpClient := // crear http client
  PersonParser := // crear parser json
  ItemsParser:= // crear parser json
  API_AFIP:= TAfipQuery.Create(HttpClient, PersonParser, ItemsParser);
  // usar API

Última edición por AgustinOrtu fecha: 27-06-2017 a las 05:15:12.
Responder Con Cita
  #18  
Antiguo 28-06-2017
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 201
Poder: 14
elrayo76 Va por buen camino
Perdón que mi mensaje anterior salió dos veces. Dío error al enviarlo la primera vez y cuando lo mande la segunda no me dicuenta que ya se había grabado la primera

Saludos
Responder Con Cita
  #19  
Antiguo 28-06-2017
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 201
Poder: 14
elrayo76 Va por buen camino
Parece que para poder usar tu código en Delphi XE8 no me va a quedar otra que usar clases de terceros para la parte de JSON. El tema es que quería evitar eso para no tener muchas cosas de terceros que luego complican la migración a otras versiones

Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Factura Electronica - Afip Argentina Joe_Balda Varios 13 19-05-2017 21:03:40
Factura Electrónica AFIP Argentina SergioFrey Noticias 2 19-05-2017 21:02:03
Como informar Factura Electrionica 'B' AFIP ARGENTINA adripugliesso Varios 1 24-08-2015 14:14:28
Ayuda Web Service AFIP Argentina patriciojgf Delphi para la web 1 04-11-2014 17:46:34
Padrón telefónico rruffino SQL 2 09-08-2008 16:27:02


La franja horaria es GMT +2. Ahora son las 05:39:19.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi