G-Finance
Controle financeiro pessoal que uso todos os dias
O problema
Planilhas não respondiam às perguntas que eu tinha no dia a dia: quanto a fatura do cartão já soma, quanto vai sobrar no fim do mês e como o saldo evolui nos próximos anos. Eu queria lançar um gasto em segundos, de onde estivesse.
O que construí
Lançamentos, categorias e contas, com dashboard e relatórios mensais e anuais. Cartão de crédito com fatura provisória, atualizada a cada compra e fechada automaticamente no dia 1º. Orçamento de alimentação no modelo de envelope, separado dos totais do mês. Previsões de saldo de 1 a 40 anos com inflação, reajuste de renda e rendimento configuráveis, e simulação "e se". Comparação com o mês anterior, proporcional ao dia do mês. App instalável no iPhone (PWA) com notificações push: fatura, saldo de alimentação e resumo semanal. Lançamentos pelo Telegram: um bot recebe mensagens curtas e registra o gasto.
Arquitetura
- Angular PWASignals, tema claro/escuro, service worker
- TraefikHTTPS (Let’s Encrypt)
- API Spring BootJWT, regras de negócio, agendamentos
- PostgreSQL 16Flyway, SQL com MyBatis
O bot do Telegram chega por webhook e usa a mesma camada de serviço da web. As notificações saem por Web Push.
Decisões técnicas
MyBatis com SQL explícito em vez de JPA
Relatórios e agregações ficam legíveis e fáceis de otimizar com índices. Todo SQL é parametrizado.
Cálculos financeiros em um só lugar
Valores em BigDecimal e NUMERIC(14,2), com arredondamento HALF_EVEN centralizado em um FinancialCalculator testado.
Serviço independente do canal
Web e bot do Telegram enviam o mesmo comando de lançamento: as regras são escritas uma vez só.
Sessão curta e renovação segura
JWT de 30 minutos com refresh token rotativo em cookie HttpOnly de 60 dias.
PWA em vez de app de loja
Instalação imediata no iPhone, notificações push e uma única base de código.
Tecnologias
Resultado
Uso o G-Finance todos os dias para controlar as finanças da casa. Cada push na branch principal é testado e publicado automaticamente, com aviso no Telegram.