Pular para o conteúdo principal

Fluxos de Trabalho Scriptáveis com Beancount e Fava

Beancount (uma ferramenta de contabilidade em texto simples com partidas dobradas) e Fava (sua interface web) são altamente extensíveis e scriptáveis. Seu design permite que você automatize tarefas financeiras, gere relatórios personalizados e configure alertas escrevendo scripts Python. Nas palavras de um usuário, “Eu realmente gosto de ter meus dados em um formato tão conveniente e gosto de poder automatizar as coisas à vontade. Não há API como um arquivo no seu disco; é fácil de integrar.” Este guia irá orientá-lo na criação de fluxos de trabalho scriptáveis – desde a automação amigável para iniciantes até plugins Fava avançados.

Primeiros Passos: Executando Beancount como um Script Python

scriptable-workflows

Antes de mergulhar em tarefas específicas, certifique-se de ter o Beancount instalado (por exemplo, via pip install beancount). Como o Beancount é escrito em Python, você pode usá-lo como uma biblioteca em seus próprios scripts. A abordagem geral é:

  • Carregar seu livro-razão Beancount: Use o carregador do Beancount para analisar o arquivo .beancount em objetos Python. Por exemplo:

    from beancount import loader
    entries, errors, options_map = loader.load_file("meu_livro_razao.beancount")
    if errors:
    print("Erros:", errors)

    Isso lhe dá uma lista de entries (transações, saldos, etc.) e um options_map com metadados. Todas as suas contas, transações e saldos agora estão acessíveis no código.

  • Aproveitar a Linguagem de Consulta Beancount (BQL): Em vez de iterar manualmente, você pode executar consultas semelhantes a SQL nos dados. Por exemplo, para obter as despesas totais por mês, você pode usar a API de consulta:

    from beancount.query import query
    q = query.Query(entries, options_map)
    result = q.query("SELECT month, sum(position) WHERE account ~ 'Expenses' GROUP BY month")
    print(result)

    Isso usa o sistema de Consulta do Beancount para agregar dados. (Internamente, isso é semelhante ao que o comando bean-query faz, mas aqui você está usando em um script.) Na verdade, o autor do Beancount observa que você pode carregar o arquivo e chamar run_query() diretamente através da API Python, evitando a necessidade de chamar comandos externos em um loop.

  • Configurar uma estrutura de projeto: Organize seus scripts junto com seu livro-razão. Um layout comum é ter diretórios para importadores (para buscar/analisar dados externos), relatórios ou consultas (para scripts de análise) e documentos (para armazenar extratos baixados). Por exemplo, um usuário mantém:

    • importers/ – scripts de importação Python personalizados (com testes),
    • queries/ – scripts para gerar relatórios (executáveis via python3 queries/...),
    • documents/ – CSVs/PDFs de bancos baixados organizados por conta.

Com esta configuração, você pode executar scripts manualmente (por exemplo, python3 queries/fluxo_de_caixa.py) ou agendá-los (via cron ou um executor de tarefas) para automatizar seu fluxo de trabalho.

Automatizando Tarefas de Conciliação

Conciliação significa garantir que seu livro-razão corresponda a registros externos (extratos bancários, relatórios de cartão de crédito, etc.). O livro-razão em texto simples e a API Python do Beancount tornam possível automatizar grande parte desse processo.

Importando e Combinando Transações (Iniciante)

Para iniciantes, a abordagem recomendada é usar os plugins de importador do Beancount. Você escreve uma pequena classe Python seguindo o protocolo de importador do Beancount para analisar um determinado formato (CSV, OFX, PDF, etc.) e produzir transações. Em seguida, use o comando bean-extract ou um script para aplicar esses importadores:

  • Escreva um importador (uma classe Python com métodos como identify(), extract()) para o formato CSV do seu banco. A documentação do Beancount fornece um guia e exemplos.
  • Use bean-extract em um script ou Makefile (como o exemplo justfile) para analisar novos extratos. Por exemplo, um fluxo de trabalho executa bean-extract em todos os arquivos em ~/Downloads e envia as transações para um arquivo temporário.
  • Revise e copie manualmente as transações do arquivo temporário para o seu livro-razão principal e, em seguida, execute bean-check para garantir que os saldos sejam conciliados.

Embora esse processo ainda envolva uma etapa de revisão, grande parte do trabalho árduo de analisar e formatar as entradas é automatizado. Os scripts do importador também podem atribuir automaticamente categorias e até mesmo definir asserções de saldo (declarações de saldos esperados) para detectar discrepâncias. Por exemplo, após a importação, você pode ter uma linha como 2025-04-30 balance Ativos:Banco:ContaCorrente 1234.56 USD que afirma o saldo final. Quando você executa bean-check, o Beancount verifica se todas essas asserções de saldo estão corretas e sinaliza quaisquer erros se as transações estiverem faltando ou duplicadas. Esta é uma melhor prática: gere automaticamente asserções de saldo para cada período de extrato para permitir que o computador identifique diferenças não reconciliadas para você.

Scripts de Conciliação Personalizados (Intermediário)

Para mais controle, você pode escrever um script Python personalizado para comparar a lista de transações de um banco (CSV ou via API) com as entradas do seu livro-razão:

  1. Ler os dados externos: Analise o arquivo CSV do banco usando o módulo csv do Python (ou Pandas). Normalize os dados em uma lista de transações, por exemplo, cada uma com uma data, valor e descrição.
  2. Carregar as transações do livro-razão: Use loader.load_file como mostrado anteriormente para obter todas as entradas do livro-razão. Filtre esta lista para a conta de interesse (por exemplo, sua conta corrente) e talvez o período do extrato.
  3. Comparar e encontrar incompatibilidades:
  • Para cada transação externa, verifique se existe uma entrada idêntica no livro-razão (corresponda por data e valor, talvez descrição). Se não for encontrada, marque-a como "nova" e possivelmente imprima-a como uma transação formatada em Beancount para você revisar.
  • Por outro lado, identifique quaisquer entradas de livro-razão nessa conta que não apareçam na fonte externa – estes podem ser erros de entrada de dados ou transações que não foram compensadas pelo banco.
  1. Imprimir resultados: Imprima um relatório ou crie um novo trecho .beancount com as transações ausentes.

Como exemplo, um script da comunidade chamado reconcile.py faz exatamente isso: dado um arquivo Beancount e um CSV de entrada, ele imprime uma lista de novas transações que devem ser importadas, bem como quaisquer lançamentos de livro-razão existentes que não estão na entrada (potencialmente um sinal de classificação incorreta). Com tal script, a conciliação mensal pode ser tão simples quanto executá-lo e, em seguida, anexar as transações sugeridas ao seu livro-razão. Um usuário do Beancount observa que “faz um processo de conciliação em todas as contas a cada mês” e usa uma coleção crescente de código Python para eliminar grande parte do trabalho manual na importação e conciliação de dados.

Dica: Durante a conciliação, aproveite as ferramentas do Beancount para precisão:

  • Use asserções de saldo como mencionado, para ter verificações automatizadas nos saldos das contas.
  • Use a diretiva pad se desejar, que pode inserir automaticamente entradas de balanceamento para pequenas diferenças de arredondamento (use com cautela).
  • Escreva testes de unidade para sua lógica de importador ou conciliação (o Beancount fornece helpers de teste). Por exemplo, um fluxo de trabalho envolveu pegar um CSV de amostra, escrever testes com falha com as transações esperadas e, em seguida, implementar o importador até que todos os testes fossem aprovados. Isso garante que seu script de importação funcione corretamente para vários casos.

Gerando Relatórios e Resumos Personalizados

Embora o Fava forneça muitos relatórios padrão (Demonstração do Resultado, Balanço Patrimonial, etc.), você pode criar relatórios personalizados usando scripts. Estes podem variar de saídas de console simples a arquivos ou gráficos formatados ricos.

Consultando Dados para Relatórios (Iniciante)

Em um nível básico, você pode usar a Linguagem de Consulta Beancount (BQL) para obter dados resumidos e imprimir ou salvá-los. Por exemplo:

  • Resumo do Fluxo de Caixa: Use uma consulta para calcular o fluxo de caixa líquido. "Fluxo de caixa" pode ser definido como a variação no saldo de determinadas contas durante um período. Usando BQL, você pode fazer:

    SELECT year, month, sum(amount)
    WHERE account LIKE 'Receitas:%' OR account LIKE 'Despesas:%'
    GROUP BY year, month

    Isso irá compensar todos os lançamentos de receita e despesa por mês. Você pode executar isso através da CLI bean-query ou via API Python (query.Query como mostrado anteriormente) e, em seguida, formatar o resultado.

  • Relatório de Gastos por Categoria: Consulte as despesas totais por categoria:

    SELECT account, round(sum(position), 2)
    WHERE account ~ 'Despesas'
    GROUP BY account
    ORDER BY sum(position) ASC

    Isso produz uma tabela de despesas por categoria. Você pode executar várias consultas em um script e imprimir os resultados como texto, CSV ou até mesmo JSON para processamento posterior.

Um usuário achou “trivial” analisar dados financeiros com Fava ou com scripts, citando que eles usam um script Python para extrair dados do Beancount via Linguagem de Consulta e, em seguida, colocá-los em um DataFrame Pandas para preparar um relatório personalizado. Por exemplo, você pode buscar totais mensais com uma consulta e, em seguida, usar Pandas/Matplotlib para traçar um gráfico de fluxo de caixa ao longo do tempo. A combinação de BQL e bibliotecas de ciência de dados permite que você crie relatórios além do que o Fava oferece por padrão.

Relatórios Avançados (Gráficos, Desempenho, etc.)

Para necessidades mais avançadas, seus scripts podem calcular métricas como desempenho de investimento ou criar saídas visuais:

  • Desempenho de Investimento (IRR/XIRR): Como seu livro-razão contém todos os fluxos de caixa (compras, vendas, dividendos), você pode calcular as taxas de retorno do portfólio. Por exemplo, você pode escrever um script que filtre as transações de suas contas de investimento e, em seguida, calcule a Taxa Interna de Retorno. Existem bibliotecas (ou fórmulas) para calcular o IRR, dados os dados de fluxo de caixa. Algumas extensões Fava desenvolvidas pela comunidade (como PortfolioSummary ou fava_investor) fazem exatamente isso, calculando o IRR e outras métricas para portfólios de investimento. Como um script, você pode usar uma função IRR (de NumPy ou sua própria) na série de contribuições/retiradas mais o valor final.

  • Métricas Multi-período ou Personalizadas: Deseja um relatório da sua taxa de poupança (razão entre poupança e receita) a cada mês? Um script Python pode carregar o livro-razão, somar todas as contas de Receita e todas as contas de Despesa, então calcular poupança = receita - despesas e a porcentagem. Isso poderia imprimir uma tabela agradável ou até mesmo gerar um relatório HTML/Markdown para seus registros.

  • Visualização: Você pode gerar gráficos fora do Fava. Por exemplo, use matplotlib ou altair em um script para criar um gráfico de patrimônio líquido ao longo do tempo, usando dados do livro-razão. Como o livro-razão tem todos os saldos históricos (ou você pode acumulá-los iterando pelas entradas), você pode produzir gráficos de séries temporais. Salve esses gráficos como imagens ou HTML interativo. (Se você preferir visuais no aplicativo, consulte a seção de extensão Fava abaixo para adicionar gráficos dentro do Fava.)

Opções de Saída: Decida como entregar o relatório:

  • Para análise única, imprimir na tela ou salvar em um arquivo CSV/Excel pode ser suficiente.
  • Para painéis, considere gerar um arquivo HTML com os dados (possivelmente usando uma biblioteca de modelo como Jinja2 ou até mesmo apenas escrevendo Markdown) que você pode abrir em um navegador.
  • Você também pode integrar com Jupyter Notebooks para um ambiente de relatório interativo, embora isso seja mais para exploração do que automação.

Acionando Alertas do Seu Livro-Razão

Outro uso poderoso de fluxos de trabalho scriptáveis é configurar alertas com base em condições em seus dados financeiros. Como seu livro-razão é atualizado regularmente (e pode incluir itens com data futura, como contas ou orçamentos futuros), você pode escaneá-lo com um script e ser notificado sobre eventos importantes.

Avisos de Saldo de Conta Baixo

Para evitar descobertas ou manter um saldo mínimo, você pode querer um alerta se qualquer conta (por exemplo, conta corrente ou poupança) cair abaixo de um limite. Veja como você pode implementar isso:

  1. Determinar saldos atuais: Depois de carregar entries através do carregador, calcule o saldo mais recente das contas de interesse. Você pode fazer isso agregando lançamentos ou usando uma consulta. Por exemplo, use uma consulta BQL para o saldo de uma conta específica:

    SELECT sum(position) WHERE account = 'Ativos:Banco:ContaCorrente'

    Isso retorna o saldo atual dessa conta (soma de todos os seus lançamentos). Alternativamente, use as funções internas do Beancount para construir um balanço patrimonial. Por exemplo:

    from beancount.core import realization
    tree = realization.realize(entries, options_map)
    acct = realization.get_or_create(tree, "Ativos:Banco:ContaCorrente")
    balance = acct.balance # um Inventário de commodities

    Em seguida, extraia o valor numérico (por exemplo, balance.get_currency_units('USD') pode dar o Decimal). No entanto, usar a consulta é mais simples na maioria dos casos.

  2. Verificar limite: Compare o saldo com seu limite predefinido. Se estiver abaixo, acione um alerta.

  3. Acionar notificação: Isso pode ser tão simples quanto imprimir um aviso no console, mas para alertas reais, você pode enviar um e-mail ou notificação push. Você pode integrar com e-mail (via smtplib) ou um serviço como IFTTT ou a API webhook do Slack para enviar o alerta. Por exemplo:

    if balance < 1000:
    send_email("Alerta de saldo baixo", f"O saldo da conta XYZ é {balance}")

    (Implemente send_email com os detalhes do seu servidor de e-mail.)

Ao executar este script diariamente (via um cron job ou Agendador de Tarefas do Windows), você receberá avisos proativos. Como está usando o livro-razão, ele pode considerar todas as transações, incluindo as que você acabou de adicionar.

Prazos de Pagamento Próximos

Se você usa o Beancount para rastrear contas ou prazos, pode marcar pagamentos futuros e ter scripts para lembrá-lo. Duas maneiras de representar obrigações futuras no Beancount:

  • Eventos: O Beancount suporta uma diretiva event para notas datadas arbitrárias. Por exemplo:

    2025-05-10 event "VencimentoDaFatura" "Pagamento da hipoteca devido"

    Isso não afeta os saldos, mas registra uma data com um rótulo. Um script pode escanear entries para entradas Event onde Event.type == "VencimentoDaFatura" (ou qualquer tipo personalizado que você escolher) e verificar se a data está dentro, digamos, dos próximos 7 dias a partir de hoje. Se sim, acione um alerta (e-mail, notificação ou até mesmo um popup).

  • Transações Futuras: Algumas pessoas inserem transações com data futura (pós-datadas) para coisas como pagamentos agendados. Estes não aparecerão nos saldos até que a data passe (a menos que você execute relatórios com data futura). Um script pode procurar por transações datadas em um futuro próximo e listá-las.

Usando estes, você pode criar um script "lembrete" que, quando executado, imprime uma lista de tarefas ou contas a vencer em breve. Integre com uma API como o Google Calendar ou um gerenciador de tarefas se quiser criar automaticamente lembretes lá.

Detecção de Anomalias

Além de limites ou datas conhecidos, você pode criar scripts alertas personalizados para padrões incomuns. Por exemplo, se uma despesa normalmente mensal não ocorreu (talvez você tenha esquecido de pagar uma conta), ou se os gastos de uma categoria estão anormalmente altos este mês, seu script pode sinalizá-lo. Isso normalmente envolve consultar dados recentes e comparar com o histórico (o que pode ser um tópico avançado – possivelmente empregando estatísticas ou ML).

Na prática, muitos usuários confiam na conciliação para detectar anomalias (transações inesperadas). Se você receber notificações bancárias (como e-mails para cada transação), poderá analisá-las com um script e adicioná-las automaticamente ao Beancount, ou pelo menos verificar se estão registradas. Um entusiasta até configurou seu banco para enviar e-mails de alerta de transação, com o plano de analisá-los e anexá-los automaticamente ao livro-razão. Esse tipo de alerta orientado a eventos pode garantir que nenhuma transação passe despercebida.

Estendendo o Fava com Plugins e Visões Personalizados

O Fava já é scriptável através de seu sistema de extensão. Se você quiser que sua automação ou relatórios sejam integrados diretamente na interface web, pode escrever uma extensão Fava (também chamada de plugin) em Python.

Como as Extensões Fava Funcionam: Uma extensão é um módulo Python que define uma classe herdando de fava.ext.FavaExtensionBase. Você o registra em seu arquivo Beancount através de uma opção personalizada. Por exemplo, se você tiver um arquivo minhaextensao.py com uma classe MeusAlertas(FavaExtensionBase), você pode habilitá-lo adicionando ao seu livro-razão:

1970-01-01 custom "fava-extension" "minhaextensao"

Quando o Fava carrega, ele importará esse módulo e inicializará sua classe MeusAlertas.

As extensões podem fazer várias coisas:

  • Hooks: Eles podem se conectar a eventos no ciclo de vida do Fava. Por exemplo, after_load_file() é chamado depois que o livro-razão é carregado. Você pode usá-lo para executar verificações ou pré-computar dados. Se você quisesse implementar a verificação de saldo baixo dentro do Fava, after_load_file poderia iterar sobre os saldos das contas e talvez armazenar avisos (embora exibi-los na UI possa exigir um pouco mais de trabalho, como gerar um FavaAPIError ou usar Javascript para mostrar uma notificação).
  • Relatórios/Páginas Personalizadas: Se sua classe de extensão definir um atributo report_title, o Fava adicionará uma nova página na barra lateral para ele. Em seguida, você fornece um modelo (HTML/Jinja2) para o conteúdo dessa página. É assim que você cria visualizações totalmente novas, como um painel ou resumo que o Fava não possui por padrão. A extensão pode coletar todos os dados de que precisa (você pode acessar self.ledger que tem todas as entradas, saldos, etc.) e, em seguida, renderizar o modelo.

Por exemplo, a extensão portfolio_list integrada no Fava adiciona uma página listando suas posições de portfólio. As extensões da comunidade vão mais longe:

  • Painéis: O plugin fava-dashboards permite definir gráficos e painéis personalizados (usando bibliotecas como Apache ECharts). Ele lê uma configuração YAML de consultas para executar, as executa via Beancount e gera uma página de painel dinâmico no Fava. Em essência, ele une dados do Beancount e uma biblioteca de gráficos JavaScript para produzir visualizações interativas.
  • Análise de portfólio: A extensão PortfolioSummary (contribuída pelo usuário) calcula resumos de investimento (agrupando contas, calculando IRR, etc.) e os exibe na UI do Fava.
  • Revisão de transações: Outra extensão, fava-review, ajuda a revisar transações ao longo do tempo (por exemplo, para garantir que você não perdeu nenhum recibo).

Para criar uma extensão simples, comece subclassificando FavaExtensionBase. Por exemplo, uma extensão mínima que adiciona uma página pode ser assim:

from fava.ext import FavaExtensionBase

class HelloReport(FavaExtensionBase):
report_title = "Olá Mundo"

def __init__(self, ledger, config):
super().__init__(ledger, config)
# qualquer inicialização, talvez analise a configuração se fornecida

def after_load_file(self):
# (opcional) execute após o livro-razão ser carregado
print("Livro-razão carregado com", len(self.ledger.entries), "entradas")

Se você colocasse isso em ola.py e adicionasse custom "fava-extension" "ola" ao seu livro-razão, o Fava mostraria uma nova página "Olá Mundo" (você também precisaria de um arquivo de modelo HelloReport.html em uma subpasta templates para definir o conteúdo da página, a menos que a extensão use apenas hooks). O modelo pode usar dados que você anexar à classe de extensão. O Fava usa modelos Jinja2, então você pode renderizar seus dados em uma tabela HTML ou gráfico nesse modelo.

Observação: O sistema de extensão do Fava é poderoso, mas considerado "instável" (sujeito a alterações). Ele requer alguma familiaridade com desenvolvimento web (HTML/JS) se você estiver fazendo páginas personalizadas. Se seu objetivo é simplesmente executar scripts ou análises, pode ser mais fácil mantê-los como scripts externos. Use extensões Fava quando você quiser uma experiência no aplicativo personalizada para seu fluxo de trabalho.

Integrando APIs e Dados de Terceiros

Uma das vantagens dos fluxos de trabalho scriptáveis é a capacidade de importar dados externos. Aqui estão as integrações comuns:

  • Taxas de Câmbio e Commodities: O Beancount não busca automaticamente os preços por design (para manter os relatórios determinísticos), mas fornece uma diretiva Price para você fornecer as taxas. Você pode automatizar a busca desses preços. Por exemplo, um script pode consultar uma API (Yahoo Finance, Alpha Vantage, etc.) para a taxa de câmbio ou preço de ações mais recente e anexar uma entrada de preço ao seu livro-razão:

    2025-04-30 price BTC 30000 USD
    2025-04-30 price EUR 1.10 USD

    Existem ferramentas como bean-price (agora uma ferramenta externa sob o guarda-chuva do beancount) que buscam cotações diárias e as imprimem no formato Beancount. Você pode agendar bean-price para executar todas as noites para atualizar um arquivo de inclusão prices.beancount. Ou use Python: por exemplo, com a biblioteca requests para chamar uma API. A documentação do Beancount sugere que, para ativos negociados publicamente, você pode "invocar algum código que baixará os preços e escreverá as diretivas para você." Em outras palavras, deixe um script fazer a pesquisa e inserir as linhas price, em vez de você fazer isso manualmente.

  • Dados do Portfólio de Ações: Semelhante às taxas de câmbio, você pode integrar com APIs para buscar dados detalhados de ações ou dividendos. Por exemplo, a API do Yahoo Finance (ou bibliotecas da comunidade como yfinance) pode recuperar dados históricos para um ticker. Um script pode atualizar seu livro-razão com o histórico de preços mensais para cada ação que você possui, permitindo relatórios históricos precisos do valor de mercado. Algumas extensões personalizadas (como fava_investor) até mesmo extraem dados de preços em tempo real para exibição, mas o mais simples é importar regularmente os preços para o livro-razão.

  • APIs Bancárias (Open Banking/Plaid): Em vez de baixar CSVs, você pode usar APIs para buscar transações automaticamente. Serviços como Plaid agregam contas bancárias e permitem acesso programático às transações. Em uma configuração avançada, você pode ter um script Python que usa a API do Plaid para extrair novas transações diariamente e salvá-las em um arquivo (ou importar diretamente para o livro-razão). Um usuário avançado construiu um sistema onde o Plaid alimenta seu pipeline de importação, tornando seus livros quase automáticos. Eles observam que “nada impede você de se inscrever na API do Plaid e fazer o mesmo localmente” – ou seja, você pode escrever um script local para obter dados bancários e, em seguida, usar sua lógica de importador Beancount para analisá-los em entradas de livro-razão. Algumas regiões têm APIs de open banking fornecidas por bancos; estes poderiam ser usados de forma semelhante.

  • Outras APIs: Você pode integrar ferramentas de orçamento (exportando orçamentos planejados para comparar com os reais no Beancount) ou usar uma API OCR para ler recibos e combiná-los automaticamente com transações. Como seus scripts têm acesso total ao ecossistema Python, você pode integrar tudo, desde serviços de e-mail (para enviar alertas) até o Google Sheets (por exemplo, atualizar uma planilha com métricas financeiras mensais) até aplicativos de mensagens (enviar a si mesmo um relatório resumido via bot do Telegram).

Ao usar APIs de terceiros, lembre-se de proteger suas credenciais (use variáveis de ambiente ou arquivos de configuração para chaves de API) e lidar com erros (problemas de rede, tempo de inatividade da API) normalmente em seus scripts. Muitas vezes, é aconselhável armazenar dados em cache (por exemplo, armazenar taxas de câmbio buscadas para que você não solicite a mesma taxa histórica repetidamente).

Melhores Práticas para Scripts Modulares e Manuteníveis

À medida que você desenvolve fluxos de trabalho scriptáveis, mantenha seu código organizado e robusto:

  • Modularidade: Divida diferentes preocupações em diferentes scripts ou módulos. Por exemplo, tenha scripts separados para "importação/conciliação de dados" vs. "geração de relatórios" vs. "alertas". Você pode até criar um pequeno pacote Python para seu livro-razão com módulos como importar_livro_razao.py, relatorios_livro_razao.py, etc. Isso torna cada parte mais fácil de entender e testar.

  • Configuração: Evite codificar valores. Use um arquivo de configuração ou variáveis no topo do script para coisas como nomes de contas, limites, chaves de API, intervalos de datas, etc. Isso facilita o ajuste sem editar o código profundamente. Por exemplo, defina LIMITES_DE_SALDO_BAIXO = {"Ativos:Banco:ContaCorrente": 500, "Ativos:Poupanca": 1000} na parte superior e seu script de alerta pode percorrer este dict.

  • Teste: Trate sua automação financeira como código de missão crítica – porque é! Escreva testes para lógica complexa. O Beancount fornece alguns helpers de teste (usados internamente para teste de importador) que você pode aproveitar para simular entradas de livro-razão. Mesmo sem estruturas sofisticadas, você pode ter um CSV fictício e transações de saída esperadas e afirmar que seu script de importação produz as entradas corretas. Se você usa pytest, você pode integrar esses testes facilmente (como Alex Watt fez através de um comando just test envolvendo o pytest).

  • Controle de Versão: Mantenha seu livro-razão e scripts sob controle de versão (git). Isso não apenas fornece backups e histórico, mas incentiva você a fazer alterações de forma controlada. Você pode marcar lançamentos de seus "scripts financeiros" ou revisar as diferenças ao depurar um problema. Alguns usuários até rastreiam seus registros financeiros no Git para ver as mudanças ao longo do tempo. Apenas tenha cuidado para ignorar dados confidenciais (como arquivos de extrato brutos ou chaves de API) em seu repositório.

  • Documentação: Documente seus fluxos de trabalho personalizados para você no futuro. Um README em seu repositório explicando como configurar o ambiente, como executar cada script e o que cada um faz será inestimável depois que meses tiverem passado. Também comente seu código, especialmente qualquer lógica de contabilidade não óbvia ou interação com a API.

  • Manutenção de Plugins Fava: Se você escrever uma extensão Fava, mantenha-a simples. O Fava pode mudar, então extensões menores com funcionalidade direcionada são mais fáceis de atualizar. Evite duplicar muita lógica – use o mecanismo de consulta do Beancount ou as funções auxiliares existentes sempre que possível, em vez de codificar cálculos que possam ser sensíveis a alterações no livro-razão.

  • Segurança: Como seus scripts podem lidar com dados confidenciais e se conectar a serviços externos, trate-os com cuidado. Não exponha chaves de API e considere executar sua automação em uma máquina segura. Se você usar uma solução hospedada ou nuvem (como agendar Ações do GitHub ou um servidor para executar o Fava), certifique-se de que seus dados de livro-razão sejam criptografados em repouso e que você esteja confortável com as implicações de privacidade.

Seguindo estas práticas, você garante que seu fluxo de trabalho permaneça confiável, mesmo quando suas finanças (e as próprias ferramentas) evoluem. Você quer scripts que possa reutilizar ano após ano, com ajustes mínimos.

Conclusão

Beancount e Fava fornecem uma plataforma poderosa e flexível para usuários com conhecimento de tecnologia personalizarem completamente seu rastreamento de finanças pessoais. Ao escrever scripts Python, você pode automatizar tarefas tediosas como conciliar extratos, produzir relatórios ricos adaptados às suas necessidades e ficar por dentro de suas finanças com alertas oportunos. Cobrimos uma variedade de exemplos, do básico ao avançado – começando com consultas simples e importações de CSV e passando para plugins Fava completos e integrações de API externas. Ao implementar estes, comece simples e construa gradualmente. Mesmo alguns pequenos scripts de automação podem economizar horas de trabalho e melhorar muito a precisão. E lembre-se, como tudo é texto simples e Python, você está no controle total – seu sistema financeiro cresce com você, adaptando-se às suas necessidades específicas. Boa programação!

Fontes: As técnicas acima são extraídas da documentação do Beancount e das experiências da comunidade. Para mais informações, consulte os documentos oficiais do Beancount, guias e blogs da comunidade e o repositório Awesome Beancount para links para plugins e ferramentas úteis.