103 lines
5.6 KiB
Markdown
103 lines
5.6 KiB
Markdown
# Financeiro Carvalho
|
||
|
||
## O que é
|
||
|
||
Aplicação web de controle financeiro pessoal, construída como produto de uso diário por Manoel — engenheiro de software, diabético tipo 1, velejador amador e entusiasta de jogos de tabuleiro. O objetivo central é simples: saber exatamente quanto dinheiro entra, quanto sai e confirmar que pelo menos 40% da renda está sendo poupada todo mês.
|
||
|
||
## Proposta de valor
|
||
|
||
Manoel não queria um app genérico de finanças cheio de funcionalidades que nunca vai usar. Queria algo seu, que reflita sua vida real — com categorias para insulina, para o veleiro e para jogos de tabuleiro — e que tornasse o hábito de registrar gastos prazeroso, não tedioso.
|
||
|
||
A solução mistura **controle financeiro sério** com **gamificação RPG**: cada ação financeira (importar extrato, categorizar transações, atingir a meta de 40%) rende XP e faz o personagem pixel art evoluir. Quests diárias, semanais e mensais traduzem bons hábitos financeiros em objetivos concretos de jogo.
|
||
|
||
## Funcionalidades
|
||
|
||
### Controle financeiro
|
||
- **Import de extratos** — upload de OFX (formato bancário brasileiro) ou CSV, com prévia antes de confirmar e deduplicação automática na reimportação
|
||
- **Transações manuais** — registro de gastos e receitas avulsos com data, valor, descrição e categoria
|
||
- **Recorrências fixas** — cadastro de custos mensais fixos (plano de saúde, streaming, etc.) com alerta quando não aparecem no mês
|
||
- **Contas bancárias** — CRUD de contas (corrente, poupança, investimento, cartão) com saldo calculado automaticamente pelas transações vinculadas
|
||
- **Categorias personalizadas** — pré-populadas com perfil do Manoel; editáveis e extensíveis
|
||
|
||
### Dashboard
|
||
- Widget de **% poupado no mês** — verde se ≥ 40%, vermelho se abaixo
|
||
- **Gastos por categoria** — barras horizontais com cores por categoria
|
||
- **Evolução mensal** — gráfico de barras dos últimos 6 meses (receitas vs. gastos)
|
||
- **Transações recentes** — últimas 10 movimentações
|
||
- **Patrimônio total** — soma dos saldos de todas as contas cadastradas
|
||
- **Widget do personagem** — prévia do personagem com barra de XP, link para `/personagem`
|
||
- Navegação entre meses
|
||
- Alerta de recorrências sem cobertura
|
||
|
||
### Gamificação RPG
|
||
- **Personagem pixel art** — humanoid SVG com animação idle/celebrate, cores controladas pelos cosméticos equipados
|
||
- **Sistema XP** — cada ação financeira rende pontos (categorizar transação = +10 XP, importar extrato = +50 XP, atingir meta 40% = +200 XP)
|
||
- **Levels** com limiar crescente: level × level × 100 XP (nível 1 → 100 XP, nível 2 → 400, nível 3 → 900...)
|
||
- **Quests** diárias, semanais e mensais com objetivos financeiros reais e recompensa XP
|
||
- **Achievements** — 11 conquistas por milestones (primeira transação, primeiro import, 3 meses acima de 40%, "Veleirista Econômico" com gastos de veleiro abaixo de R$500...)
|
||
- **Cosméticos** desbloqueados automaticamente por nível — cabelo, camisa, calças, sapatos
|
||
- Tela `/personagem` com painel completo: personagem, barra XP, quests ativas, todas as conquistas, cosméticos disponíveis
|
||
|
||
## Stack técnica
|
||
|
||
| Camada | Tecnologia |
|
||
|--------|-----------|
|
||
| Backend | Go 1.23, chi router, pgx/v5 |
|
||
| Frontend | Vue 3, Vite, TypeScript, Pinia, Vue Router |
|
||
| Banco | PostgreSQL 16 |
|
||
| Deploy | Docker multi-stage, binário único ~25 MB com assets Vue embarcados |
|
||
| Infraestrutura | Dokploy (self-hosted) |
|
||
|
||
## Estrutura do projeto
|
||
|
||
```
|
||
financeiro-carvalho/
|
||
├── apps/
|
||
│ ├── api/ # Backend Go
|
||
│ │ ├── cmd/server/ # Entrypoint
|
||
│ │ ├── internal/
|
||
│ │ │ ├── handler/ # HTTP handlers
|
||
│ │ │ ├── service/ # Regras de negócio + testes
|
||
│ │ │ ├── repository/ # Queries SQL
|
||
│ │ │ ├── model/ # Structs compartilhadas
|
||
│ │ │ └── migration/ # 8 migrations SQL idempotentes
|
||
│ │ └── static/ # Vue dist embarcado via //go:embed
|
||
│ └── web/ # Frontend Vue 3
|
||
│ └── src/
|
||
│ ├── views/ # Páginas (Home, Transações, Contas, Personagem...)
|
||
│ ├── stores/ # Pinia (dashboard, game, accounts, transactions...)
|
||
│ └── components/ # CharacterWidget, XPBar
|
||
├── Dockerfile # Multi-stage: Node (Vue build) → Go (binary) → Alpine
|
||
└── docker-compose.yml # app + postgres
|
||
```
|
||
|
||
## Telas
|
||
|
||
| Rota | Descrição |
|
||
|------|-----------|
|
||
| `/` | Dashboard mensal com todos os widgets |
|
||
| `/transacoes` | Lista e CRUD de transações manuais |
|
||
| `/importar` | Upload e revisão de extratos OFX/CSV |
|
||
| `/categorias` | Gerenciamento de categorias |
|
||
| `/recorrencias` | Custos fixos mensais |
|
||
| `/contas` | Contas bancárias e patrimônio |
|
||
| `/personagem` | Painel RPG completo |
|
||
| `/configuracoes` | Configurações gerais |
|
||
|
||
## Rodar localmente
|
||
|
||
```bash
|
||
docker compose up --build
|
||
# Acesse http://localhost:8080
|
||
```
|
||
|
||
Variáveis de ambiente (opcionais, têm defaults para desenvolvimento):
|
||
- `POSTGRES_PASSWORD` — senha do banco (default: `financeiro`)
|
||
- `APP_PORT` — porta exposta (default: `8080`)
|
||
|
||
## Identidade visual e tom
|
||
|
||
O app é pessoal, não corporativo. O personagem pixel art e a gamificação traduzem a ideia de que finanças podem ser um hábito divertido, não uma obrigação ansiosa. As cores do personagem evoluem com o nível — recompensa visual por consistência financeira real.
|
||
|
||
Paleta principal: fundo claro (`#f8fafc`), texto escuro (`#1e293b`), destaque roxo gamificação (`#7c3aed`), verde para metas atingidas (`#059669`), vermelho para gastos/metas não atingidas (`#dc2626`).
|