FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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)
Devuelve todos los CUIT, CUIL, etc asociados a NroDocumento (DNI). La AFIP llama a estos numeros los "Id" de las personas
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.
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 |
#2
|
||||
|
||||
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#3
|
||||
|
||||
Gracias por el aporte
|
#4
|
||||
|
||||
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 |
#5
|
||||
|
||||
Parece muy buen trabajo, Agustín. Estoy seguro de que será de gran utilidad.
|
#6
|
|||
|
|||
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.
|
#7
|
|||
|
|||
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
y que obtengo?: <html><head></head><body><br><br></body></html> He probado otras variantes, pero siempre llego al mismo resultado. ¿Alguna idea? |
#8
|
||||
|
||||
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:
|
#9
|
|||
|
|||
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. |
#10
|
||||
|
||||
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 |
#11
|
||||
|
||||
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:
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:
El constructor de TAfipQuery ahora requiere una referencia a una interface de este tipo (dependency injection)
Y eleva una excepcion si le pasamos NIL...
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) |
#12
|
||||
|
||||
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 |
#13
|
||||
|
||||
#14
|
||||
|
||||
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 |
#15
|
|||
|
|||
Hola yo lo hice con 2 componentes de las ICS
TSslHttpCli y TSslContext; // Consulta a Padrón Nivel 3 WSPN3
Última edición por fcios fecha: 04-08-2016 a las 02:50:38. |
#16
|
|||
|
|||
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
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno |
#17
|
||||
|
||||
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:
Código PHP:
Última edición por AgustinOrtu fecha: 27-06-2017 a las 06:15:12. |
#18
|
|||
|
|||
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
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno |
#19
|
|||
|
|||
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
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Factura Electronica - Afip Argentina | Joe_Balda | Varios | 30 | 30-01-2021 05:10:34 |
Factura Electrónica AFIP Argentina | SergioFrey | Noticias | 2 | 19-05-2017 22:02:03 |
Como informar Factura Electrionica 'B' AFIP ARGENTINA | adripugliesso | Varios | 1 | 24-08-2015 15:14:28 |
Ayuda Web Service AFIP Argentina | patriciojgf | Delphi para la web | 1 | 04-11-2014 18:46:34 |
Padrón telefónico | rruffino | SQL | 2 | 09-08-2008 17:27:02 |
|