Por qué
Hace unos años, me interesé en obtener ingresos pasivos y decidí intentar invertir usando plataformas p2b. Después de un tiempo, se hizo evidente que los fondos estaban muy fragmentados por sitios, bancos, deudas, y esto dificultaba la comprensión de la situación. No pude responder las dos preguntas más importantes:
¿Cuánto dinero tengo?
Cual es la tendencia? ¿Me estoy haciendo más rico o más pobre?
Era necesario reunir información de alguna manera y mantenerla actualizada.
Las soluciones al problema fueron las siguientes:
Tabla en Hojas de cálculo de Google
Ventajas: se realiza de forma rápida, flexible y gratuita
Desventajas: la necesidad de actualizar los datos manualmente
Al principio, usé esta opción, pero el trabajo constante para mantenerla fue agotador: tuve que ir a muchas cuentas personales y reescribir los datos desde allí. Además, algunos activos tenían una alta volatilidad, por lo que la irregularidad de los datos afectó la calidad de la toma de decisiones.
Soluciones Especializadas
En la mayoría de los casos, estas son las mismas tablas, solo que con una interfaz agradable / conveniente.
En casos raros, hay integración con varios bancos, pero en todos los casos que intenté, fue inestable y poco confiable. También teme la necesidad de dar su nombre de usuario / contraseña de la banca por Internet y la falta de integración con fuentes de datos no estándar.
Se hizo evidente que tendría que escribir un servicio adecuado usted mismo: esta es la única forma de automatizar completamente la recepción de datos financieros y, al mismo tiempo, no preocuparse por transferir detalles a un tercero. Además, permitiría implementar cualquier interfaz deseada. Así comenzó el proyecto BudgetTracker, que he estado usando con éxito durante dos años. Se puede descargar como fuente y / o instalarse en su propio servidor como un contenedor acoplado listo para usar.
Idea principal
Hay dos lados diferentes en la forma de ver las finanzas. Por un lado, está el estado actual (condicionalmente, ahora hay "Y" de dinero en la cuenta "X"), por otro lado, hay transacciones (condicionalmente: la compra de "XX" por dinero "UUU" en el momento T).
Estos dos lados de las finanzas son prácticamente independientes entre sí, pero son necesarios para comprender la tendencia general. Un ejemplo simple es que tenemos un activo similar a un depósito (por ejemplo, bonos), que compramos periódicamente.
Para construir un gráfico del cambio en el valor de dicho activo (y pronóstico), es importante no tener en cuenta la compra.
Fuentes de datos
Existen diferentes proveedores: fuentes de datos, por ejemplo, recolectando datos de un banco cliente.
Lista de proveedores admitidos- FX - tipos de cambio: EUR, USD
- LiveCoin - intercambio de criptomonedas
- Penenza
- AlfaBank
- Alfa Capital
- Alpha Direct
- Alpha Stream
- ModuleBank
- Módulo Dinero
- Raiffeisen
- Deudas y préstamos (para deudas ingresadas manualmente)
- POST-api para recibir datos arbitrarios de sistemas externos
Dado que algunos proveedores requieren autenticación por SMS, también hay integración con SMS a través de IFTTT (solo para teléfonos Android).
Todos los días, el proveedor recopila el estado de cada una de las cuentas y una lista de todas las transacciones y las guarda en la base de datos. Para hacer esto, Chrome comienza, y con la ayuda de Selenium, los datos necesarios se extraen de los bancos en línea.
Cuentas
Los estados de cada una de las cuentas forman una tabla del formulario:

Esto hace posible ver los detalles y el estado de cada una de las cuentas, pero no ayuda a ver el panorama general y no responde a la simple pregunta "¿cuánto dinero tengo?".
Para responder a esta pregunta, se agregó soporte para "columnas calculadas", en el que puede especificar una fórmula, por ejemplo:

Pero además del valor específico, también quiero ver la tendencia, las emisiones, los pronósticos; en otras palabras, ver la dinámica de este valor (y a veces no solo uno).
Para hacer esto, existe el concepto de la "página principal" donde puede configurar widgets individuales para enfocarse en columnas / tendencias específicas.
Widgets

Existen varios tipos de widgets:
- Donut con gastos (de transacciones)
- El "último valor" es un gráfico de líneas para columnas arbitrarias, que muestra el cambio proyectado en anual (%) y el real para el último día (%). También ocurre en el modo "compacto", cuando muestra solo el valor actual (último).
- "Delta": muestra los cambios de columna en los números de las últimas 24h, 48h, 1 semana y 1 mes
- "Donut" - para columnas calculadas
- "Gráfico" - para columnas calculadas
Cada tipo de widget tiene su propio tamaño, y se pueden mover uno con respecto al otro utilizando las "flechas". Por defecto, están ocultos y aparecen cuando haces clic en el botón "ojo" en la parte superior de la página:

Además, al crear o editar un widget, es posible cambiar cualquiera de sus configuraciones:

Transacciones
Para trabajar con transacciones, o DDS , hay una página separada donde puede ver todas las transacciones agrupadas por categoría.

Cada transacción tiene un "tipo" de transacción: es "ingreso", "gasto" o "transferencia". La traducción se configura manualmente para excluir las traducciones de los gráficos de la página principal.
Puede ser conveniente suavizar la programación de los activos de los proveedores que no tienen transacciones. Por ejemplo, el mercado de valores. Puede comprar acciones, y también pueden crecer en precio, y en el gráfico a menudo desea ver solo el segundo tipo de eventos.
Si el proveedor de datos no tiene soporte de transaccionesEn este caso, es conveniente agregar transacciones generadas automáticamente en las propiedades de la columna y, en el momento de la compra, editar la transacción en la que se compraron las acciones y establecer el tipo de "transferencia".
Las categorías y los tipos se pueden configurar manualmente (debe obtenerlos primero) y según las reglas. Al establecer una categoría en una transacción, se instala automáticamente en todas las demás transacciones con la misma descripción (y también se aplicará a transacciones similares en el futuro). Además de establecer manualmente la categoría en una transacción, puede agregar una regla en forma de una expresión regular o una subcadena para establecer automáticamente la categoría en todas las transacciones adecuadas.
También hay una sección separada "Deudas", donde puede hacer deudas manualmente. Para cada deuda, también puede establecer una plantilla para la transacción, de modo que cuando aparezcan nuevos DDS relacionados con esta deuda, se actualice el monto restante.

Pila tecnológica
Actualmente, el backend se ejecuta en .NET Core 3, la interfaz en Svelte 3.
ObjectRepository + LiteDB se usa para almacenar datos.
Para la integración con fuentes de datos, se utiliza el paquete Selenium + Chrome.
Inicialmente, todo estaba escrito completamente en .NET Core, pero hace algún tiempo la interfaz se reescribió en Svelte.
Debido a esta herencia, la comunicación con el servidor no se realizó de manera óptima y hay planes para reescribir esta parte del proyecto a un modelo reactivo.
Como intentar
El archivo docker-compose.yml en el repositorio ayudará a:
version: "3.3" services: budgettracker: image: diverofdark/budgettracker:master restart: unless-stopped environment: Properties__IsProduction: 'true' # true . ConnectionStrings__LiteDb: '/data/budgettracker.db' volumes: - /dev/shm:/dev/shm # Google Chrome - /root/bt:/data ports: - "80:80" networks: public: {} networks: public: driver: bridge