BudgetTracker - outra ferramenta de código aberto para contabilidade de finanças pessoais

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?


KDPV

imagem


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:


imagem


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:


imagem


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


imagem


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:
imagem


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


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.
imagem


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ções

Nesse 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.
imagem


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 

Source: https://habr.com/ru/post/pt467427/


All Articles