Automatizacion: Bancos

Lecherito

Bueeeeno se;ores!!! Pues ya esta todo hecho!!! A falta de pulir algunas de las cosas ya tengo el proceso que capta todas las transacciones de los bancos que tengo en este momento (Revolut y Caixa, pronto voy a a;adir el Santander), que felicidad joder. Toda la mierda que he hecho desde el principio como el plugin para gradle para las dependencias, mejorar ocean y el workspace (aunque luego me fui DEMASIADO por las ramas y empece a aprender Rust), toda la investigacion sobre los providers, Tink etc... ha dado por fin su fruto.

Tengo un container de docker con una JVM que rula 2 tareas cada 3 horas:

  1. BankingDataFetcherProcess: Llama a Tink con todos los bancos configurados y usa los credenciales que obtiene el otro proceso. Esto se hace cada 3 horas. Con cada transaccion llama al BankerService que es el que se encarga de almacenar las cosas en la base de datos. Y tambien maneja el no insertar transacciones que ya esten en la base de datos!
  2. OpenBankingCredentialsProcess: Se encarga de actualizar los credenciales que va a usar el Fetcher, cada 3 horas. Los credenciales que te dan tienen una duracion de 24 horas, asi que tendria que fallar 8 veces para quedarme sin credenciales (espero que esto no pase lmao)

Como prueba, aunque los logs siguen siendo una mierda:

2020-10-18 18:41:44.897 [DefaultQuartzScheduler_Worker-2] INFO  io.ktor.client.HttpClient - BODY Content-Type: application/json
2020-10-18 18:41:44.897 [DefaultQuartzScheduler_Worker-2] INFO  io.ktor.client.HttpClient - BODY START
2020-10-18 18:41:45.088 [DefaultQuartzScheduler_Worker-1] INFO  io.ktor.client.HttpClient - RESPONSE: 200 OK
2020-10-18 18:41:45.090 [DefaultQuartzScheduler_Worker-1] INFO  io.ktor.client.HttpClient - METHOD: HttpMethod(value=POST)
2020-10-18 18:41:45.090 [DefaultQuartzScheduler_Worker-1] INFO  io.ktor.client.HttpClient - FROM: https://api.tink.com/api/v1/oauth/token
2020-10-18 18:41:45.091 [DefaultQuartzScheduler_Worker-1] INFO  io.ktor.client.HttpClient - COMMON HEADERS
2020-10-18 18:41:45.091 [DefaultQuartzScheduler_Worker-1] INFO  io.ktor.client.HttpClient - -> date: Sun, 18 Oct 2020 18:41:45 GMT
2020-10-18 18:41:45.091 [DefaultQuartzScheduler_Worker-1] INFO  io.ktor.client.HttpClient - -> content-type: application/json
...
Sending transaction 0a2fe138d8f241c28f4e8dda4xxxxxxxx
Sending transaction 09c48535da2a4afdb6058333xxxxxxxx
Sending transaction 0663f04f8c854fa7a3e69857xxxxxxxx
Sending transaction 01253daf2a574f709e96f4ecxxxxxxxxx
2020-10-18 18:42:30.263 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers
select bank, date from banker.transactions

Caixa,2020-04-30
Caixa,2020-05-01
Revolut,2020-05-01
Revolut,2020-05-03
Revolut,2020-05-07

Quedan 3 cositas por pulir:

  1. Logs, he de pulir un poquito los logs y no hacer print de absolutamente todo lol (aunque no creo que se generen mas de 15-20k diarios, asi qe no me voy a quedar sin espacio)
  2. Por ahora hace fetch de todas las transacciones desde una fecha X (que es cuando hice el dump de todos los bancos e inserte transacciones a mano)
  3. El deployment todavia falla si esta el contenedor corriendo, pero es algo menor no creo que haga muchos deploys de esto.

Lo siguiente es Grafana para la visualizacion de los datos y para predicciones y ver que los datos en la bbdd sean los correctos. Pero esto creo que va a tener que esperar un poco, que he tenido demasiado este finde, con esto y el Two Point Hospital xDDD

7
7 días después
Lecherito

Pues ya he arreglado:

  1. Logs, ahora salen logs mas normales. Y solo la informacion que a mi me interesa, nada de megas random
  2. Este he visto que no es para tanto, pillo unas 250 transacciones y eso no es practicamente nada
  3. Para esto he hecho algo rudimentario que es parar el contenedor, renombrarlo y up del nuevo, si algo falla arrancando el nuevo, se hace rollback.

Pero me ha salido uno nuevo, cuando esta rulando unos dias, la configuracion de los credenciales se queda obsoleta, estos se siguen actualizando pero los clientes siguen usando los viejos :( me voy a poner con testo ahora mismo a ver si lo arreglo de una vez.

Sobre grafana ya tengo algunos graficos, esta quedando guay aunque he de ver como se pueden hacer predicciones.

Por ultimo, aunque Tink te ponga premium tambien tiene que activar (supuestamente a mano) la sincronizacion de las transacciones con los bancos para que tu puedas hacer queries y estas esten actualizadas, esto me fallaba pero ya lo han arreglado asi que la proxima vez que arranque todo ira bien.

Lecherito

Arreglado lo de los credenciales, y ya tengo lo de la sincronizacion, asi que esta todo a full.

Dare por concluido este desarrollo! Ha sido un placer amigos. He de buscar otro proyectito ahora

Acquired 138 from Revolut
Sending 7, the rest were already inserted.
Sending transaction e1ca7867c7234b26b4d1dcdxxxxxxxxx (1/7)
Sending transaction dc1b200e6d3145c69b590bxxxxxxxxx (2/7)
Sending transaction 69529ace1eef47899b7371xxxxxxxxx (3/7)
Sending transaction 57ad12d687d94d348cc220xxxxxxxxx (4/7)
Sending transaction 456e972da6f74cb098d92exxxxxxxxx (5/7)
Sending transaction 3bc867d25d9a4a46961a7a4xxxxxxxxx (6/7)
Sending transaction 37750b764d9248a2b4e9e01xxxxxxxxx (7/7)
Acquired 71 from Caixa
Sending 2, the rest were already inserted.
Sending transaction a584cc48bd2e4e6dadf25cxxxxxxxxx (1/2)
Sending transaction 26b0efda7a8c4641af1d564xxxxxxxxx (2/2)
squ4r3

estuve hace unos meses intentando hacer algo parecido porque obtener acceso PSD2 para ING era imposible si no eras una empresa dedicada a eso

#21 ING por lo que vi si quieres salirte del sandbox y utilizar datos reales necesitas ser una empresa autorizada para usar PSD2. Imposible, vamos.

#35 gracias, ahora me estoy leyendo todo el hilo y lo de tink tiene buena pinta, parece que es justo lo que me hacía falta para montar lo que yo quería, una entidad autorizada para usar PSD2 y en la que agregar los datos de todos los bancos.

1 respuesta
Lecherito

#34 Puedes usar un agregador, en la primera pagina hablo de ellos

1 respuesta
squ4r3

#35 estoy viendo que tiene compatibilidad con muchas entidades europeas pero... por casualidad sabes si hay algún sistema similar que sea compatible EU/USA? Yo necesito agregar varias cuentas europeas y americanas y es un chocho. Todo lo que está disponible en USA no está en EU y al revés... tema de regulaciones, supongo.

1 respuesta
Lecherito

#36 Tambien incluso dentro de Europa hay cosas muy diferentes, yo lo que he hecho ha sido agregar varios en mi propia base de datos para yo poder hacer las agregaciones que a mi me hicieran falta. Ademas de que los bancos Europeos solo te dan hasta 2-3 a;os de datos y algunas cosas las tendras que hacer medianamente manuales como he comentado mas o menos por el hilo.

No conozco ninguna de EU/USA ya que no tengo esa necesidad y no he investigado demasiado pero con una base de datos propia lo puedes hacer de puta madre.

Lecherito

Dije que lo tenia finiquitado pero hoy me he dedicado a actualizar dashboards con todos los datos nuevos y me he puesto algunas alertas para cuando hay transacciones grandes (fuera de la fraja de -200, 200 euros). Asi que me manda una notificacion al telegram cuando pasa algo. Es solamente una prueba mientras moneaba con grafana pero bastante curioso.

He visto algunas cosas que me gustaria cambiar, como crear una view que quite algunas transacciones que son innecesarias (como de Caixa a Revolut) ya que eso infla algunas cosas como estadisticas de ingresos/gastos (una transaccion de 100 euros de un banco a otro, seria 100 euros en gastos y 100 en ingresos) pero bueno, es algo muy menor que tampoco me interesa demasiado ya que los ahorros son calculados correctamente (-100 + 100 = 0)

1
Wei-Yu

Bueno pues aprovechando que vivo en una de las CCAA guays que movió el festivo de todos los santos al lunes me he puesto a pegarle patadas a esto (también usando el mismo provider que #1 , Tink ). Ya tenía un esqueleto un poco pocho de cacharrear con el fw de turno para el bot de telegram (más unos mocks en un postgres), pero para seguir en mi línea decidí borrarlo todo, empezar de cero y encima tirando por otro lado distinto.

Por ahora sólo tengo un endpoint donde cae el redirect del link oauth que tienen de ejemplo cuando te creas un proyecto. Una vez tengo las creds hago una llamada a para sacar transacciones de los datos de testing que tienen y lo vomito de vuelta a pelo. A ver si me animo y le sigo dando caña estos días para poder tirarle un par de requests y operar sobre los datos de test con un mínimo de funcionalidad.

Sobre Tink tengo una duda y es qué cosas útiles puedo sacar de él? (cc @lecherito ; qué jugo le estás sacando?) Por ahora me veo sólo haciendo una query para sacar transacciones para distitnas tarjetas o cuentas. En última instancia quería tener un categorizador yo pero eso ya sé de antemano que es un follón de la hostia. Aunque haciendolo manual a través de botones con el bot de telegram+lo que me venga de tink supongo que algo rápido se podrá apañar. La pena es que lo de tink parece que no puede modificarse porque es del plan enterprise

Lo estoy haciendo con C#. Por si alguien tiene curiosidad dejo por aquí el repo. Que tampoco es que tenga gran cosa, pero con suerte me ayuda a echarle alguna horilla más xd

1 respuesta
Lecherito

#39 Si, todo es plan enterprise de ahi que me hiciera yo mi propio backend donde vomito las cosas que vienen de Tink modificadas a mi gusto. Ademas de que las apis de los bancos solo te dan hasta 2-3 a;os de datos, si tienes algo mas antiguo pues te va a tocar tirar de dumps.

Yo por ahora lo unico que estoy haciendo es lo de las transacciones (todavia no tengo hecho lo de las categorias) y la visualizacion con grafana. De visualizaciones tengo gastos mensuales (creo que ya puse una foto en algun hilo de automatizacion), y con los graficos pues se puede incluso ver diario pero la cosa es que quiero ver esas cosas para saber mis ahorros etc. Aqui creo que estoy un poco falto de ideas pero bueno, poco a poco que Roma no se construyo en dos dias.

Sobre el link oauth, la verdad es que estoy usando el oauth de su Tink console ya que me lo da todo hecho y me da el token directamente. Aunque sea manual, he de meter mis credenciales para sacar el token y es cada 6 meses asi que es un mal menor.

8 días después
Lecherito

El otro dia se me ocurrio otra cosa que hacer respecto a esto, y es a;adirle transacciones de cryptos a esta base de datos (que luego incluso se podria usar para la declaracion de hacienda) pero la cosa es que me gustaria saber en agrupacion como van las cryptos que tengo (aunque este jugando a largo plazo, sigo queriendo saber esta informacion).

Asi que quiza es ese el siguiente mini proyecto que hago. Creare un hilo aparte de todas maneras pero lo comento por aqui por si alguien estaria interesado en tener un diario mas o menos como este.

1 mes después
Lecherito

Si estais usando Tink, tened cuidado que han cambiado las IDs de las transacciones (sin avisar) y me he encontrado con transacciones duplicadas xDD. Menos mal que como lo tengo montado simplemente he tenido que borrar todo y reiniciar el proceso.

1
8 meses después
Lecherito

Me ha pasado de nuevo y esta vez si que me han explicado que es lo que pasa.

Basicamente, los bancos no te dan una ID, y ellos la generan como pueden (credit, day, etc), pero si una transaccion no es final, puede ser que cambie. Lo unico que he tenido que hacer es filtrar por transacciones finales (por ejemplo las tarjeta de credito) ya que de esa manera no van a cambiar en el banco.

1 año después
Zoko

#1 por curiosidad, que DB usaste y puedes compartir un poco una transaccion de ejemplo de dicha DB? Por curiosidad que estoy construyendome algo similar.

1 respuesta
Lecherito

#44 tengo una postgres random, aunque creo que si lo hiciera de nuevo lo meteria en un SQLite porque no necesito performance ni nada, necesitaba algo y creo que algo mas sencillo iria mejor.

Los datos son de este estilo

{"pk":1,"id":"asdfasdfasdf","amount":"1000.00","currency":"EUR","bank":"Revolut","description":"Buying something","date":"2022-12-28","category":"General"}
1 1 respuesta
Zoko

#45

De lujo, algo asi estaba pensando. La categorización la haces tu en base al texto de la transacción? Porque mi banco es lo unico que me da y me da a mi que voy a tener que meter un switch case en base a ciertas palabras clave, no veo otra manera.

1 respuesta
Lecherito

#46 Pues depende, en el banco te hacen una categorizacion, yo que tengo N bancos, hay N categorizaciones pero Tink tambien te da otra categorizacion (ahora estoy mirando SaltEdge para cambiarlo) y Firefly iii.

Asi que como tampoco miro demasiado las categorias las dejo que vengan un poco como quieran, pero si veo algo raro en los bancos las suelo cambiar ahi y luego esas van a Tink.

1 1 respuesta
Zoko

#47

Podrias compartir un poco mas de como has montado el tema de visualizacion con Grafana? Yo nunca lo he usado y estoy planteandomelo ahora que ya tengo todas las transacciones. Estoy acostumbrado a usar Metabase y la verdad es que no se si Grafana me va a cubrir los mismos usos!

1 respuesta
Lecherito

#48 es una query normal, por ejemplo el del salary (que en verdad son todos los movimientos positivos)

SELECT
  date AS "time",
  amount as euros
FROM (SELECT * from banker.view_transactions) as transactions
WHERE
  $__timeFilter(date)
  AND amount > 0
ORDER BY 1

El timeFilter te hace lo que necesite sin ningun problema, y siempre puedes filtrar mas mierdas por si te haces tu transferencias entre bancos.