Porque
Há alguns anos, fiquei interessado em obter renda passiva e decidi tentar investir usando plataformas p2b. Depois de algum tempo, percebeu-se que os fundos estavam muito fragmentados por sites, bancos, dívidas e isso dificultou o entendimento da situação. Não pude responder às duas perguntas mais importantes:
Quanto dinheiro eu tenho?
Qual é a tendência? Estou ficando mais rico ou mais pobre?
Era necessário, de alguma forma, reunir informações e mantê-las atualizadas.
As soluções para o problema foram as seguintes:
Tabela no Planilhas Google
Vantagens: feito de forma rápida, flexível e gratuita
Desvantagens: a necessidade de atualizar dados manualmente
No começo, usei essa opção, mas o trabalho constante para mantê-la era cansativo: tive que ir a muitas contas pessoais e reescrever os dados a partir daí. Além disso, alguns ativos apresentaram alta volatilidade, portanto a irregularidade dos dados afetou a qualidade da tomada de decisão.
Soluções Especializadas
Na maioria dos casos, essas são as mesmas tabelas, apenas com uma interface agradável / conveniente.
Em casos raros, há integração com vários bancos, mas em todos os casos que tentei - era instável e não confiável. Também assustou a necessidade de fornecer seu nome de usuário / senha do Internet banking e a falta de integração com fontes de dados não padrão.
Tornou-se óbvio que você precisaria escrever um serviço adequado - essa é a única maneira de automatizar totalmente o recebimento de dados financeiros e, ao mesmo tempo, não se preocupar em transferir detalhes para terceiros. Além disso, permitiria implementar qualquer interface desejada. Assim começou o projeto BudgetTracker, que uso com sucesso há dois anos. Ele pode ser baixado como fonte e / ou instalado em seu próprio servidor como um contêiner de docker pronto.
Ideia principal
Existem dois lados diferentes de como você vê as finanças. Por um lado, existe o estado atual (condicionalmente - agora há "Y" de dinheiro na conta "X"), por outro lado, há transações (condicionalmente - a compra de "XX" por dinheiro "UUU" no momento T).
Esses dois lados das finanças são praticamente independentes um do outro, mas são necessários para entender a tendência geral. Um exemplo simples é que temos um ativo semelhante a um depósito (por exemplo, títulos), que compramos periodicamente.
Para criar um gráfico da mudança no valor de um ativo (e previsão), é importante não levar em consideração a compra.
Fontes de dados
Existem diferentes provedores - fontes de dados, por exemplo, coletando dados de um banco do cliente.
Lista de fornecedores suportados- FX - taxas de câmbio: EUR, USD
- LiveCoin - troca de criptomoedas
- Penenza
- AlfaBank
- Alfa Capital
- Alpha Direct
- Alpha Stream
- ModuleBank
- ModuleMoney
- Raiffeisen
- Dívidas e empréstimos (para dívidas inseridas manualmente)
- POST-api para receber dados arbitrários de sistemas externos
Como alguns provedores exigem autenticação por SMS, também há integração com o SMS via IFTTT (apenas para telefones Android).
Todos os dias, o provedor coleta o status de cada uma das contas e uma lista de todas as transações e as salva no banco de dados. Para isso, o Chrome inicia e, com a ajuda do Selenium, os dados necessários são extraídos dos bancos online.
Contas
Os estados de cada conta formam uma tabela do formulário:

Isso possibilita ver os detalhes e as condições de cada uma das contas, mas não ajuda a entender o cenário geral e não dá uma resposta à pergunta simples "quanto dinheiro eu tenho?".
Para responder a essa pergunta, foi adicionado suporte para "colunas calculadas", nas quais você pode especificar uma fórmula, por exemplo:

Mas, além do valor específico, também quero ver a tendência, emissões, previsões - em outras palavras, ver a dinâmica desse valor (e às vezes não apenas um).
Para fazer isso, existe o conceito de "página principal" onde você pode configurar widgets individuais para se concentrar em colunas / tendências específicas.
Widgets

Existem vários tipos de widgets:
- Donut com despesas (de transações)
- "Último valor" é um gráfico de linhas para colunas arbitrárias, mostrando a alteração projetada em anual (%) e a real do último dia (%). Isso também acontece no modo "compacto", quando mostra apenas o (atual) valor atual.
- "Delta" - mostra as alterações de coluna nos números nas últimas 24h, 48h, 1 semana e 1 mês
- "Rosquinha" - para colunas calculadas
- "Gráfico" - para colunas calculadas
Cada tipo de widget tem seu próprio tamanho e pode ser movido em relação um ao outro usando as "setas". Por padrão, eles estão ocultos e aparecem quando você clica no botão "olho" na parte superior da página:

Além disso, ao criar ou editar um widget, é possível alterar qualquer uma de suas configurações:

Transações
Para trabalhar com transações, ou DDS , há uma página separada onde você pode ver todas as transações agrupadas por categoria.

Cada transação possui um "tipo" de transação - é "receita", "despesa" ou "transferência". A tradução é definida manualmente para excluir traduções dos gráficos da página principal.
Pode ser conveniente suavizar a programação de ativos de provedores que não possuem transações. Por exemplo, o mercado de ações. Você pode comprar ações, e elas também podem crescer em preço; no gráfico, muitas vezes você deseja ver apenas o segundo tipo de evento.
Se o provedor de dados não tiver suporte para transaçõesNesse caso, é conveniente adicionar transações geradas automaticamente nas propriedades da coluna e, no momento da compra, editar a transação na qual as ações foram compradas e definir o tipo para "transferir".
Categorias e tipos podem ser definidos manualmente (você precisa obtê-los primeiro) e com base em regras. Ao definir uma categoria para uma transação, ele se instala automaticamente em todas as outras transações com a mesma descrição (e também será aplicado a transações semelhantes no futuro). Além de definir manualmente a categoria para uma transação, você pode adicionar uma regra na forma de uma expressão regular ou de uma substring para definir automaticamente a categoria para todas as transações adequadas.
Há também uma seção separada "Dívidas", onde você pode fazer dívidas manualmente. Para cada dívida, você também pode definir um modelo para a transação, para que, quando novos DDS relacionados a essa dívida, o valor restante seja atualizado.

Pilha tecnológica
Atualmente, o back-end é executado no .NET Core 3, o front-end no Svelte 3.
ObjectRepository + LiteDB é usado para armazenar dados.
Para integração com fontes de dados, o pacote Selenium + Chrome é usado.
Inicialmente, tudo foi escrito inteiramente no .NET Core, mas há algum tempo o frontend foi reescrito no Svelte.
Devido a essa herança, a comunicação com o servidor não foi feita de maneira ideal e há planos de reescrever essa parte do projeto em um modelo reativo.
Como tentar
O arquivo docker-compose.yml no repositório ajudará:
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