Crear App de finanzas personales

oho

Expando un poco el post anterior:

Idea


  • Practicar bash
  • aprender de finanzas y contabilidad
  • importanción automatica de datos de las cuentas bancarias
  • UI simple y accesible desde pc, teléfono y reloj para seguimiento de informes y avisos y para los registros manuales.

Estado


  • Algunas partes que menciono no las he analizado en profundidad.
  • Llevaré un 30% para terminar una primera versión funcional

Stack de soluciones


ledger-cli

Ofrece un sistema de contabilidad de doble entrada flexible y robusto.

Te recomiendo que estudies empezar con algo así en lugar de picarte todo eso. Esta web recoge herramientas parecidas y complementarias para diferentes tecnologías.

MÁS INFO EN #41

Sincronizar cuentas bancarias

De momento lo que tengo es scraping. Con Cajalnet no he tenido problema con curl y awk. Pero en Cajasur no he podido saltarme el login, tiene un mecanismo ofuscado con un miniteclado numérico para la clave, es un image map html, el jpg se regenera a cada request cambiando aleatoriamente los números y no deja rastro en el código fuente público de la posición de las areas de cada número. Con un miniservicio en node programo una navegación con pupperteer y envío el jpg del teclado a otro servicio python, que con opencv reconoce los números de la imagen y le devuelve a node un array con las posiciones para que efectúe el login.

Así extraigo automáticamente los movimientos, detecto domiciliaciones, suscripciones a tarjetas, mensajes al buzón, saldos, etc.

Después se ordena al sistema, que es una envoltura escrita en bash sobre ledger-cli y un controlador para la api de todoist, para que construya los nuevos ficheros de datos con los cambios. El sistema asigna automáticamente a cada cuenta contable según conceptos y tipos de movimientos, si no lo consigue genera una alerta en todoist para clasificarlo de forma manual.

host y sync

Una Raspberry Pi que tengo en casa conectada 24h hostea el sistema
Con Syncthing que es un software para compartir directorios peer-to-peer sincronizo los ficheros de texto plano entre la raspberry y los dispositvos.

Interacción móvil con todoist

  • API muy completa
  • Widget muy completo
  • Buena app para smartwatchs con wear os

MÁS INFO EN #41

Algunas capturas de la UI con todoist:

Caso 1. formulario alerta para resolver cargo/abono desconocido detectado
Caso2. Formulario para actualizar gastos de efectivo

Sin solución de momento


  • Quería usar alguna api de mis bancos, pero cuando me puse ni siquiera entendía si éstas eran para clientes particulares o solo para negocios con tpv. Llamé a mi sucursal de cajasur y cajalnet y como si les hablase en chino. También me he topado con herramientas que dicen integrar las apis de todos los bancos del universo menos los dos míos. Quiero darle otra oportunidad cuando lo tenga más avanzado.

api-cajalnet Por cierto, ahora parece que está mejor documentada desde la última vez que entré hace 1 año

api-cajasur

  • Me gustaría un sistema de pago con tarjeta que me permita pasarle un metadato o modificar el concepto antes de pagar de forma rápida, para ayudar a ledger a clasificar pagos en cuentas nuevas desde origen y no desde la tarea programada. Por ejemplo voy a un parque de atracciones por primera vez y antes de pagar en el sistema de pago añado un código al concepto que luego me permite asignarlo a la cuenta Gastos/Ocio/ActividadesRecreativa.
1 1 respuesta
hda

#31 Me encanta mucho. La verdad es que todoist esta muy, muy bien, el free tier da muchísimo de sí. Todoist+Obsidian: la verdadera salud.

Al respecto de el escrapeo de la data de tus bancos, ¿no has probado por API? Quizás sea más fácil que reconocer captchas y tal, aunque he de decir que es mucho más techi de tu modo (y en bash).

La verdad es que debo releerme tu post porque hay mucha idea chula. ¡Buen trabajo!

1 respuesta
Boiisxu

¿Qué es lo que no os convence de firefly iii?

https://www.firefly-iii.org/

1 5 respuestas
Tranc0s

Como mola la idea, yo también he pensado muchas veces en hacerme una app adaptada a mis necesidades e incluso lo llegué a intentar, obviamente lo terminé abandonando.

hda

#33 🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐🧐

Nyhz

#33 Tener que hostearlo tu por ej xD

1 respuesta
hda

#36 ¡eso es una ventaja!

1 respuesta
Nyhz

#37 A ver, para algunas personas si.

Por mí bien, pero para el usuario medio esa app es totalmente inviable xDD

1
hda

Tengo un hype en lo alto que no es medio normal. He de ver cómo migrar mi BBDD a esta app. Creo que es justo lo que buscaba.

Me me estoy resistiendo a abrir el docker compose jajaja

Lecherito

#28 Por ahora lo mio es un poco una chapuza, y lo de Tink esta bien pero tiene sus cosas que no me llegan a convencer (como la ID de las transacciones, que no es final). Ademas de tener demasiada mierda interna mia. Si de verdad quereis hacer algo con Tink yo os ayudo con los ejemplos de codigo que haga falta pero ahora mismo no creo que hiciera un fork de eso.

Tengo el wow que lo esto quemando como si no hubiera un ma;ana y el Lunes empiezo a trabajar en un sitio nuevo asi que incluso menos tiempo. De hecho agradezco no tener que hacer nada con ello y que ya funcione solo.

Si de verdad quereis montar algo mas en serio, pues todo seria hablarlo, pero vamos, lo que tengo en verdad se hace en 2 tardes. Es basicamente una tabla en bbdd, un cliente y un cronjob que cada 2 o 3 horas, pilla transacciones nuevas y las manda a la base de datos

1
oho

#33 Utilizo está respuesta para completar #31

No conocía firefly III y parece interesante pero hay algunos puntos que me hacen decantarme por otro tipo de soluciones:

Ledger es una base cruda, robusta y flexible para cualquier sistema contable


  • Programa de linea de comandos sobre el que se puede construir cualquier ecosistema no necesariamente cli.
  • Tiene una de las licencias más permisiva que existen.
  • Ofrece un 25% de posibilidades en comparación con otras herramientas, pero lo que hace, que es llevar un sistema de contabilidad de doble entrada lo hace bastante bien.
  • Es puramente una herramienta para extraer informes de datos de unos ficheros de texto plano pero no los manipula.
  • Absolutamente todos los datos que maneja se escriben en estos ficheros de forma manual e independiente. Muchos prefieren mantener la entrada de datos manual porque te hace más consciente de cómo se mueve tu dinero.
  • Por supuesto es posible automatizar la entrada. Al partir de este enfoque manual se presta a una mayor flexibilidad que permite ajustar ese equilibrio entre entrada manual y automática al gusto de cada uno. Muchas herramientas como Mint, traen infinitas configuraciones para automatizar importaciones y movimientos entre cuentas. Esto suele traer problemas y trabajo de mantenimiento extra por acciones no deseadas que se descubren tarde debido a la compleja representación interna de algunos datos o detalles de implementación, nuevas versiones que rompen con anteriores ya sea de la fuente de datos o del propio sistema, etc. En ledger toda automatización de registro se traduce en construir sencillos ficheros de texto plano.

Texto plano


  • Velocidad. Es capaz de procesar cientos de miles de transacciones en un segundo
  • Memoria. Uso eficiente de memoria RAM, usa poca y sólo durante ese segundo de procesar los datos. No es así con aplicaciones de escritorio o un navegador abierto que mantiene procesos corriendo y consumiendo recursos del sistema.
  • Formato: La sintaxis es muy concisa y acorta la curva de aprendizaje con respecto a otras herramientas. Las reglas de formato son simples haciéndolo muy facil de parsear y construir. Con un Script de pocos comandos puedes tranformar cualquer dataset en json, xml, csv, tsv, etc. al formato requerido por ledger-cli.
  • El texto plano es facil de encriptar, versionar, transferir, automatizar, etc.

UI como un mando de control con displays más que una web.


Otro punto que veo mejorable es la UI de ese tipo de herramientas. El único camino en mi caso con el que puedo lograr mantener un sistema contable de este tipo es con:

  1. Máxima automatización, las entradas manuales deben ser mínimas. (¿1-2 al día? )
  2. La UI para visualizar los datos y registrar estas entradas me debe estar tan accesible que quiero tropezar con ella en mi rutina diaria.
    • Ya uso todoist para mi agenda diaria y control de tareas.
    • El widget me permite hacer toda la interacción con 5 toques sin abrir la app o desde el reloj.
  3. todoist permite montar una IU muy simple y poderosa basada en un tree data de tareas y subtareas:
    • Programar notificaciones de movimientos, alertas, informes, balances u otra información de interés de forma fija, eventual o periodica.
    • Proveer de pequeños formularios para ordenarle las actualizaciones al sistema contable.
    • Y todo esto integrado perfectamente en mi workflow y a la vista solo con desbloquear el teléfono o mirar la agenda.

Todavía no se lo he visto hacer a nadie, pero quiero utilizar la funcionalidad de este árbol de tareas y subtareas enriquecido como si fuesen componentes de un formulario HTML: inputs, selects o multiselects anidados. De forma que sea fácil construir una lógica que genere estos formularios de componentes dinámicamente usando la api de todoist, un controlador que genere formularios para diferentes propositos incluso fuera de este proyecto.

El principal beneficio de trackear tu dinero para una economia doméstica es conocer lo que tengo en las cuentas, lo que debo y lo que puedo gastar en cualquier momento. Y con menos frecuencia consultar lo que tuve y en qué lo gasté. No quiero toparme con un dashboard cada vez que necesito registrar algo. Quizá el estado de las cuentas bancarias una vez al día, presupuestos y cuentas contables una vez a la semana y patrimonio, balance y otros datos ¿una vez al mes? Puedo programar estos informes para que llegen como tareas periodicas y no tropezarme con ellos a cada paso.

También basado en texto plano existen buenas herramientas parecidas a firefly III. Por ejemplo beancount+fava.

Pero esto es mi decisión, al final cada uno se siente más comodo con según qué herramientas.

#32

Gracias, he actualizado este parrafo explicando lo de la api. Cuando me puse me estaba entreteniendo más de la cuente y me decanté por un scraping provisional. Me quiero leer toda la info que habla de apis en ambos bancos a ver si saco algo en claro.

api-cajalnet Por cierto, ahora parece que está mejor documentada desde la última vez que entré hace 1 año

api-cajasur

Quería usar alguna api de mis bancos, pero cuando me puse ni siquiera entendía si éstas eran para clientes particulares o solo para negocios con tpv. Llamé a mi sucursal de cajasur y cajalnet y como si les hablase en chino. También me he topado con herramientas que dicen integrar las apis de todos los bancos del universo menos los dos míos. Quiero darle otra oportunidad cuando lo tenga más avanzado.

2 respuestas
TheBrotha

Este mes trabajo casí 13 horas por día, así que imposible, pero cualquier cosa que necesiteis si finalmente optais por React Native pegadme un toque

1 respuesta
vago_21

El buen crunch

Fyn4r

#42 que sí abb.. digo brotha, que sí, que ganas mucho dinero que si

1 1 respuesta
TheBrotha

#44 Pero si tengo que trabajar 13 horas para pagarme los teclados que voy a cobrar ;-;

Lecherito

#41 no te metas con PSD2 porque es imposible, busca servicios que tengan la licencia PSD2 y tu los usas.

2 1 respuesta
hda

#41 #46

https://nordigen.com/en/coverage/

https://www.saltedge.com/products/account_information/coverage

1
Lecherito

Nordigen parece tener mejor pinta incluso que Tink. No se como sea la API y eso pero a simple vista..., esas creo que no existian hace mas de 2 a;os cuando hice todo esto :(

RaCe

lunchmoney.app se integra con plaid (bastantes bancos españoles) tiene api y se pueden importar csvs

x si quereis echarlo un ojo tb, pero no es opensource

hda

#33 al final me he hecho un repo para realizar ETL con la base de datos de la app de android de la que hablo en #7 . Me he montado un docker con ffiii (y otro con fiyi) y con un poco de paciencia he podido cargar los casi 5000 apuntes manuales que tengo. Estoy bastante contento.

Por lo pronto estoy en desarrollo, a ver si me mola la app y lo monto en producción, que parece que sí. También debo ver si me arreglo con las apps de android (que van contra tu instancia de ffiii). Quiero que sepas que me has dado bastante esperanza. Es justo lo que estaba buscando.

3
oho

Aquí hay un buen ejemplo de los archivos de texto plano que os decía.

Al final es definir tus cuentas en un tree data Activos:Banco:Cajasur//Activos:Banco:Cajalnet//Pasivos:Prestamo:Casa//Gastos:CaffeConLeche... Y de igual forma las monedas, el precio de estas, los asientos contables se pueden ver en el journal_example.ldg, los presupuestos...

https://github.com/yradunchev/ledger/tree/master/data

Si encuentro la manera de hacer una guia amena con gif o en video mostrando la potencia del programa usando estos archivos para extraer informes os lo comparto por aquí. no hay mucho escrito en castellano sobre esto y qué mejor sitio que mv para tenerla.

1
thelegend

¡Buenas!
Ya llegué de vacaciones :/

#33 Esa App, ya la vi, pero me frustre con intentar agregar saltedge o CSV es por eso que lo deje, si alguien puede hacer un RPV de como hacer que funcione lo agradecería xD.(Si hay un manual en la web, pero solo conseguí instalarlo no que funcione)

Mi how to hasta donde llegue:
Fuente:

https://docs.firefly-iii.org/data-importer/install/docker/
Crear docker-compose.yml

version: '3.3'

services:
  app:
    image: fireflyiii/core:latest
    restart: always
    volumes:
      - firefly_iii_upload:/var/www/html/storage/upload
    env_file: .env
    ports:
      - 80:8080
    depends_on:
      - db
  db:
    image: mariadb    
restart: always env_file: .db.env volumes: - firefly_iii_db:/var/lib/mysql fidi: image: fireflyiii/data-importer:latest restart: always env_file: .fidi.env ports: - 8081:8080 depends_on: - app volumes: firefly_iii_upload: firefly_iii_db:

Copiar .env y .fidi.env
en .fidi.env modifique:
FIREFLY_III_URL=http://localhost:8080

FIREFLY_III_ACCESS_TOKEN=POR_EL_TOKEN

SPECTRE_APP_ID=APPID
SPECTRE_SECRET=SECRET

y con:
docker-compose -f docker-compose.yml up -d
Lo arrancas, estando en la carpeta donde estan los archivos.

Si no continuaré haciendo mi App.

1 respuesta
hda

#52 Yo ahora mismo estoy bastante actualizado. La app contempla "Salt Edge's Spectre API" y también csv, vaya. Lo que sucede es que la importación se hace con una app intermedia, Firefly Data Importer (FIYI). Básicamente, te montas otro servicio paralelo que se comunica con ffiii, le das acceso a la api de ffiii. Luego desde FIYI cargas por CSV o por api ( #47 ) los apuntes bancarios que quieras y ya está.

En concreto, yo lo que he hecho ( #50 ) es interpretar y exportar de una forma concreta la base de datos de MyWallet en csv, y luego cargar el CSV en FIYI para que este importase los apuntes en ffiii.

Entiendo que se podrá automatizar la carga de los apuntes por saltedge en FIYI para ffiii. En mi caso era una única importación de mi actual bbdd a ffiii. El resto lo seguiré haciendo a mano (continuar tomando apuntes ahora ya en ffiii), aunque no descarto explorar la opción de automatizar algo a través de FIYI+api en un futuro.

Ahora mismo lo tengo en dev por haber estado trasteando, las opciones de ffiii son todas y cada una de las que necesito. Los informes, las analítias, etc. Es cierto que no sirve para portfolio de criptomonedas, predicción de ahorro, u otras cosas; pero con lo que es, me sobra. Conforme tenga tiempo y lo mande todo a producción, un buen proyecto para Q2 sería crear un plugin que se conecte contra la api de ffiii y permita hacer estadísticas predictivas de ahorro.

Te dejo mi

compose de dev:

Y el

.env:

Obviamente está en dev y es muy sucio. Hay que llevar las cosas a SECRETS, quizás ver si crear una subred para este sistema de apps, configurar los emails salientes y mil cosas más. Por lo pronto lo quería para explorar el concepto, ver si podía hacer ETL para importar mis datos de MyWallet y, en general, ver si me sentía cómodo con esta app. También comprobar que me gustaba la app de móvil.

Nota: Tuve que juguetear con mariadb porque hasta esa versión me daba problemas al montar el dev en WSL2 Ubuntu 22.02. En nativo no debería dar problemas, supongo.

1 respuesta
thelegend

#53 Lo he probado y ahora ya tengo instalado el importer, he tenido que modificar el APP_KEY de .env porque no me iba con la tuya.

Aunque ahora tengo otro problema :/ , cuando accedo a localhost:81 y introduzco los datos de la Firefly III URL y Client ID, en mi caso http://localhost y un número

me da error 500

1 respuesta
hda

#54 jaj, claro, cambié la key jaja. ¡No la iba a poner aquí!

Lo que te sucede es que te tienes que conectar a la máquina vía la intranet de docker. En FIYI, prueba a poner la Firefly III URL como: http://app:8080.

Fíjate en cómo se llama el servicio:

 app:
    image: fireflyiii/core:latest
    hostname: app
    networks:
      - firefly
    restart: always
    volumes:
      - /d/Git/docker-fireflyiii/firefly_iii_upload:/var/www/html/storage/upload
    env_file: .env
    ports:
      - '80:8080'
    depends_on:
      - db

Docker monta el hostname con el nombre del servicio (línea 1), o con el nombre indicado en "hostname" (línea 3), si es que lo estableces. Luego, fíjate en el mapeo de puertos: '80:8080', estás exponiendo el puerto 80 del servicio que corre en el puerto 8080.

Por eso, para conectar los servicios internamente tienes que apuntar a http://app:8080

1 respuesta
thelegend

#55 Ya veo, pero ni poniendo https://app:8080/ en el navegador ,ni agregando esa línea en la app de FIYI me detectan esa url :(, es raro porque es un copy/paste de lo tuyo.

1 respuesta
hda

#56 no va con cert. Usa http.

hda

Vaya trabajazo de estandarización de asientos de mi bbdd pre-ffiii he terminado de hacer.

Por si a alguien le interesa, he tirado del paquete de thefuzz, antiguamente fuzzywuzzy. Es un paquete de python que ayuda a cruzar strings buscando la distancia de Levenshtein. Ocurre que tras tantos años tomando datos manualmente era necesaria una buena estandarización entre emisores y receptores, los cuales era ingresados manualmente. Seguro que aún se me han colado muchísimas incongruencias, pero lo que reste ya lo trataré desde ffiii de forma directa. Lo bueno de ffiii es que crea una entidad para cada emisor o receptor, lo que simplifica muchísimo todo.

Usuarios habituales

  • hda
  • thelegend
  • oho
  • Lecherito
  • TheBrotha
  • vago_21
  • Fascaso