O Finanpy é um sistema de gestão de finanças pessoais desenvolvido com Python e Django, focado em simplicidade e eficiência. O projeto adota uma abordagem full-stack utilizando Django Template Language com TailwindCSS para o frontend, proporcionando uma experiência moderna e responsiva sem over-engineering.
O Finanpy é uma aplicação web que permite aos usuários gerenciar suas finanças pessoais de forma intuitiva e organizada. O sistema oferece controle de contas bancárias, categorização de transações, visualização de entradas e saídas, e um dashboard centralizado para análise financeira. Com design moderno em tema escuro e gradientes harmônicos, o produto equilibra funcionalidade e estética.
Fornecer uma ferramenta simples, eficiente e acessível para que pessoas possam organizar suas finanças pessoais, acompanhar receitas e despesas, categorizar transações e tomar decisões financeiras mais conscientes através de visualizações claras e objetivas.
- Perfil Primário: Adultos entre 25-45 anos que buscam organizar suas finanças pessoais
- Perfil Secundário: Jovens profissionais iniciando sua independência financeira
- Características Comuns:
- Possuem múltiplas contas bancárias
- Necessitam controlar gastos mensais
- Buscam simplicidade e praticidade
- Têm acesso regular à internet
- Preferem soluções diretas sem complexidade excessiva
- Criar uma ferramenta MVP funcional de gestão financeira pessoal
- Estabelecer base de usuários engajados
- Demonstrar viabilidade técnica da solução
- Permitir cadastro e autenticação segura de usuários
- Possibilitar gerenciamento de múltiplas contas bancárias
- Facilitar registro e categorização de transações financeiras
- Fornecer visualização clara do panorama financeiro através de dashboard
- Ter visão consolidada de todas as contas em um único lugar
- Categorizar e entender para onde o dinheiro está indo
- Controlar entradas e saídas de forma simples
- Acessar informações financeiras de forma rápida e intuitiva
- RF001: Sistema deve permitir cadastro de novos usuários com email e senha
- RF002: Sistema deve permitir login de usuários através do email
- RF003: Sistema deve permitir logout de usuários
- RF004: Sistema deve validar formato de email e força de senha
- RF005: Sistema deve impedir cadastro de emails duplicados
- RF006: Sistema deve criar perfil automaticamente ao cadastrar usuário
- RF007: Sistema deve permitir visualização de dados do perfil
- RF008: Sistema deve permitir edição de informações do perfil
- RF009: Sistema deve permitir cadastro de contas bancárias
- RF010: Sistema deve permitir listagem de todas as contas do usuário
- RF011: Sistema deve permitir edição de dados de contas
- RF012: Sistema deve permitir exclusão de contas
- RF013: Sistema deve exibir saldo atual de cada conta
- RF014: Sistema deve associar contas ao usuário logado
- RF015: Sistema deve permitir cadastro de categorias de transações
- RF016: Sistema deve permitir listagem de categorias do usuário
- RF017: Sistema deve permitir edição de categorias
- RF018: Sistema deve permitir exclusão de categorias
- RF019: Sistema deve diferenciar categorias de entrada e saída
- RF020: Sistema deve permitir registro de transações de entrada
- RF021: Sistema deve permitir registro de transações de saída
- RF022: Sistema deve associar transação a uma conta bancária
- RF023: Sistema deve associar transação a uma categoria
- RF024: Sistema deve registrar data da transação
- RF025: Sistema deve permitir adicionar descrição à transação
- RF026: Sistema deve permitir listagem de transações do usuário
- RF027: Sistema deve permitir filtrar transações por período
- RF028: Sistema deve permitir filtrar transações por conta
- RF029: Sistema deve permitir filtrar transações por categoria
- RF030: Sistema deve permitir edição de transações
- RF031: Sistema deve permitir exclusão de transações
- RF032: Sistema deve exibir saldo total consolidado de todas as contas
- RF033: Sistema deve exibir total de entradas do período atual
- RF034: Sistema deve exibir total de saídas do período atual
- RF035: Sistema deve exibir balanço (entradas - saídas) do período
- RF036: Sistema deve exibir lista de transações recentes
- RF037: Sistema deve exibir resumo por categorias
- RF038: Sistema deve ter página inicial pública de apresentação
- RF039: Página inicial deve ter botão de cadastro
- RF040: Página inicial deve ter botão de login
- RF041: Usuários não autenticados devem ser redirecionados ao site público
- RF042: Usuários autenticados devem ser redirecionados ao dashboard
flowchart TD
Start([Usuário acessa site]) --> CheckAuth{Usuário<br/>autenticado?}
CheckAuth -->|Não| PublicHome[Página Inicial Pública]
CheckAuth -->|Sim| Dashboard[Dashboard]
PublicHome --> ActionChoice{Escolhe ação}
ActionChoice -->|Cadastrar| RegisterForm[Formulário de Cadastro]
ActionChoice -->|Login| LoginForm[Formulário de Login]
RegisterForm --> ValidateReg{Dados<br/>válidos?}
ValidateReg -->|Não| RegisterForm
ValidateReg -->|Sim| CreateUser[Criar Usuário e Perfil]
CreateUser --> AutoLogin[Login Automático]
AutoLogin --> Dashboard
LoginForm --> ValidateLogin{Credenciais<br/>válidas?}
ValidateLogin -->|Não| LoginForm
ValidateLogin -->|Sim| Dashboard
Dashboard --> DashActions{Ação no Dashboard}
DashActions -->|Gerenciar Contas| AccountsList[Lista de Contas]
AccountsList --> AccActions{Ação}
AccActions -->|Criar| CreateAccount[Criar Conta]
AccActions -->|Editar| EditAccount[Editar Conta]
AccActions -->|Excluir| DeleteAccount[Excluir Conta]
AccActions -->|Voltar| Dashboard
CreateAccount --> AccountsList
EditAccount --> AccountsList
DeleteAccount --> AccountsList
DashActions -->|Gerenciar Categorias| CategoriesList[Lista de Categorias]
CategoriesList --> CatActions{Ação}
CatActions -->|Criar| CreateCategory[Criar Categoria]
CatActions -->|Editar| EditCategory[Editar Categoria]
CatActions -->|Excluir| DeleteCategory[Excluir Categoria]
CatActions -->|Voltar| Dashboard
CreateCategory --> CategoriesList
EditCategory --> CategoriesList
DeleteCategory --> CategoriesList
DashActions -->|Gerenciar Transações| TransactionsList[Lista de Transações]
TransactionsList --> TransActions{Ação}
TransActions -->|Criar| CreateTransaction[Criar Transação]
TransActions -->|Editar| EditTransaction[Editar Transação]
TransActions -->|Excluir| DeleteTransaction[Excluir Transação]
TransActions -->|Filtrar| FilterTransactions[Filtrar Transações]
TransActions -->|Voltar| Dashboard
CreateTransaction --> TransactionsList
EditTransaction --> TransactionsList
DeleteTransaction --> TransactionsList
FilterTransactions --> TransactionsList
DashActions -->|Ver Perfil| ProfileView[Visualizar Perfil]
ProfileView --> ProfileActions{Ação}
ProfileActions -->|Editar| EditProfile[Editar Perfil]
ProfileActions -->|Voltar| Dashboard
EditProfile --> ProfileView
DashActions -->|Logout| Logout[Fazer Logout]
Logout --> PublicHome
style Dashboard fill:#2d5a3d
style PublicHome fill:#1e3a5f
style CreateUser fill:#4a5d23
style AutoLogin fill:#4a5d23
- RNF001: Páginas devem carregar em menos de 2 segundos
- RNF002: Dashboard deve consolidar dados em tempo aceitável (<1s)
- RNF003: Sistema deve suportar pelo menos 100 usuários simultâneos
- RNF004: Senhas devem ser armazenadas com hash seguro (Django padrão)
- RNF005: Sistema deve proteger rotas autenticadas
- RNF006: Dados de um usuário não devem ser acessíveis por outros
- RNF007: Sessões devem expirar após período de inatividade
- RNF008: Interface deve ser responsiva para desktop, tablet e mobile
- RNF009: Design deve seguir padrões de acessibilidade básicos
- RNF010: Mensagens de erro devem ser claras e em português
- RNF011: Interface deve ter feedback visual para ações do usuário
- RNF012: Código deve seguir PEP 8
- RNF013: Código deve usar aspas simples
- RNF014: Código deve ser escrito em inglês
- RNF015: Apps devem ter responsabilidades bem definidas
- RNF016: Models devem ter campos created_at e updated_at
- RNF017: Sistema deve funcionar nos principais navegadores (Chrome, Firefox, Safari, Edge)
- RNF018: Interface deve ser responsiva para resoluções a partir de 320px
- RNF019: Arquitetura deve permitir migração futura para PostgreSQL
- RNF020: Estrutura deve facilitar adição de novos módulos
- Linguagem: Python 3.13+
- Framework: Django 5+
- Banco de Dados: SQLite3 (padrão Django)
- Autenticação: Django Auth (nativo)
- Template Engine: Django Template Language
- CSS Framework: TailwindCSS
- JavaScript: Vanilla JS (mínimo necessário)
- Servidor Web: Django Development Server (desenvolvimento)
- Ambiente Virtual: venv
- Gerenciador de Pacotes: pip
erDiagram
USER ||--o| PROFILE : has
USER ||--o{ ACCOUNT : owns
USER ||--o{ CATEGORY : creates
ACCOUNT ||--o{ TRANSACTION : contains
CATEGORY ||--o{ TRANSACTION : classifies
USER {
int id PK
string email UK
string password
boolean is_active
datetime date_joined
datetime last_login
}
PROFILE {
int id PK
int user_id FK
string full_name
string phone
datetime created_at
datetime updated_at
}
ACCOUNT {
int id PK
int user_id FK
string name
string bank_name
string account_type
decimal balance
boolean is_active
datetime created_at
datetime updated_at
}
CATEGORY {
int id PK
int user_id FK
string name
string category_type
string color
datetime created_at
datetime updated_at
}
TRANSACTION {
int id PK
int account_id FK
int category_id FK
string transaction_type
decimal amount
date transaction_date
string description
datetime created_at
datetime updated_at
}
finanpy/
├── core/ # Configurações globais e URLs principais
├── users/ # Extensão do User model do Django
├── profiles/ # Perfis de usuários
├── accounts/ # Contas bancárias
├── categories/ # Categorias de transações
├── transactions/ # Transações financeiras
└── static/ # Arquivos estáticos (CSS, JS, imagens)
/* Gradiente Principal */
primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%)
/* Cores Sólidas */
primary-500: #667eea
primary-600: #5568d3
primary-700: #4453bd
accent-500: #764ba2
accent-600: #63418a
accent-700: #503672/* Tema Escuro */
bg-primary: #0f172a /* Fundo principal */
bg-secondary: #1e293b /* Fundo de cards */
bg-tertiary: #334155 /* Fundo de hover */
/* Cores de Texto */
text-primary: #f1f5f9 /* Texto principal */
text-secondary: #cbd5e1 /* Texto secundário */
text-muted: #64748b /* Texto menos importante */success: #10b981 /* Verde para entradas/sucesso */
error: #ef4444 /* Vermelho para saídas/erros */
warning: #f59e0b /* Amarelo para avisos */
info: #3b82f6 /* Azul para informações *//* Fonte Principal */
font-family: 'Inter', system-ui, -apple-system, sans-serif
/* Tamanhos */
text-xs: 0.75rem /* 12px */
text-sm: 0.875rem /* 14px */
text-base: 1rem /* 16px */
text-lg: 1.125rem /* 18px */
text-xl: 1.25rem /* 20px */
text-2xl: 1.5rem /* 24px */
text-3xl: 1.875rem /* 30px */
text-4xl: 2.25rem /* 36px */
/* Pesos */
font-normal: 400
font-medium: 500
font-semibold: 600
font-bold: 700<!-- Botão Primário -->
<button class="px-6 py-3 bg-gradient-to-r from-primary-500 to-accent-500 text-white rounded-lg font-medium hover:from-primary-600 hover:to-accent-600 transition-all duration-200 shadow-lg hover:shadow-xl">
Texto do Botão
</button>
<!-- Botão Secundário -->
<button class="px-6 py-3 bg-bg-secondary text-text-primary rounded-lg font-medium hover:bg-bg-tertiary transition-all duration-200 border border-bg-tertiary">
Texto do Botão
</button>
<!-- Botão de Sucesso -->
<button class="px-6 py-3 bg-success text-white rounded-lg font-medium hover:bg-green-600 transition-all duration-200">
Salvar
</button>
<!-- Botão de Erro -->
<button class="px-6 py-3 bg-error text-white rounded-lg font-medium hover:bg-red-600 transition-all duration-200">
Excluir
</button>
<!-- Botão Pequeno -->
<button class="px-4 py-2 text-sm bg-gradient-to-r from-primary-500 to-accent-500 text-white rounded-md font-medium hover:from-primary-600 hover:to-accent-600 transition-all duration-200">
Ação
</button><!-- Input Padrão -->
<div class="mb-4">
<label class="block text-text-secondary text-sm font-medium mb-2">
Label do Campo
</label>
<input type="text" class="w-full px-4 py-3 bg-bg-secondary border border-bg-tertiary rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-all duration-200" placeholder="Digite aqui...">
</div>
<!-- Select -->
<div class="mb-4">
<label class="block text-text-secondary text-sm font-medium mb-2">
Selecione uma opção
</label>
<select class="w-full px-4 py-3 bg-bg-secondary border border-bg-tertiary rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-all duration-200">
<option>Opção 1</option>
<option>Opção 2</option>
</select>
</div>
<!-- Textarea -->
<div class="mb-4">
<label class="block text-text-secondary text-sm font-medium mb-2">
Descrição
</label>
<textarea rows="4" class="w-full px-4 py-3 bg-bg-secondary border border-bg-tertiary rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-all duration-200" placeholder="Digite aqui..."></textarea>
</div><!-- Card Padrão -->
<div class="bg-bg-secondary rounded-xl p-6 shadow-lg border border-bg-tertiary">
<h3 class="text-xl font-semibold text-text-primary mb-4">Título do Card</h3>
<p class="text-text-secondary">Conteúdo do card aqui...</p>
</div>
<!-- Card com Gradiente -->
<div class="bg-gradient-to-br from-primary-500 to-accent-500 rounded-xl p-6 shadow-xl">
<h3 class="text-xl font-semibold text-white mb-2">Saldo Total</h3>
<p class="text-3xl font-bold text-white">R$ 10.500,00</p>
</div>
<!-- Card de Estatística -->
<div class="bg-bg-secondary rounded-xl p-6 shadow-lg border border-bg-tertiary hover:border-primary-500 transition-all duration-200">
<div class="flex items-center justify-between mb-2">
<span class="text-text-secondary text-sm font-medium">Entradas</span>
<span class="text-success text-sm">↑</span>
</div>
<p class="text-2xl font-bold text-text-primary">R$ 5.200,00</p>
<p class="text-text-muted text-xs mt-1">+12% vs mês anterior</p>
</div><div class="bg-bg-secondary rounded-xl shadow-lg border border-bg-tertiary overflow-hidden">
<table class="w-full">
<thead>
<tr class="bg-bg-tertiary">
<th class="px-6 py-4 text-left text-text-secondary text-sm font-semibold">Coluna 1</th>
<th class="px-6 py-4 text-left text-text-secondary text-sm font-semibold">Coluna 2</th>
<th class="px-6 py-4 text-left text-text-secondary text-sm font-semibold">Ações</th>
</tr>
</thead>
<tbody>
<tr class="border-t border-bg-tertiary hover:bg-bg-tertiary transition-all duration-150">
<td class="px-6 py-4 text-text-primary">Dado 1</td>
<td class="px-6 py-4 text-text-primary">Dado 2</td>
<td class="px-6 py-4">
<button class="text-primary-500 hover:text-primary-400 text-sm font-medium">Editar</button>
</td>
</tr>
</tbody>
</table>
</div><!-- Navbar -->
<nav class="bg-bg-secondary border-b border-bg-tertiary shadow-lg">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between h-16">
<div class="flex items-center">
<span class="text-2xl font-bold bg-gradient-to-r from-primary-500 to-accent-500 bg-clip-text text-transparent">
Finanpy
</span>
</div>
<div class="flex items-center space-x-4">
<a href="#" class="text-text-secondary hover:text-text-primary transition-colors duration-200">Dashboard</a>
<a href="#" class="text-text-secondary hover:text-text-primary transition-colors duration-200">Contas</a>
<a href="#" class="text-text-secondary hover:text-text-primary transition-colors duration-200">Transações</a>
<button class="px-4 py-2 bg-error text-white rounded-lg text-sm font-medium hover:bg-red-600 transition-all duration-200">
Sair
</button>
</div>
</div>
</div>
</nav>
<!-- Sidebar (opcional) -->
<aside class="w-64 bg-bg-secondary h-screen fixed left-0 top-0 border-r border-bg-tertiary p-6">
<div class="mb-8">
<span class="text-2xl font-bold bg-gradient-to-r from-primary-500 to-accent-500 bg-clip-text text-transparent">
Finanpy
</span>
</div>
<nav class="space-y-2">
<a href="#" class="flex items-center px-4 py-3 text-text-primary bg-bg-tertiary rounded-lg font-medium">
Dashboard
</a>
<a href="#" class="flex items-center px-4 py-3 text-text-secondary hover:text-text-primary hover:bg-bg-tertiary rounded-lg transition-all duration-200">
Contas
</a>
<a href="#" class="flex items-center px-4 py-3 text-text-secondary hover:text-text-primary hover:bg-bg-tertiary rounded-lg transition-all duration-200">
Categorias
</a>
<a href="#" class="flex items-center px-4 py-3 text-text-secondary hover:text-text-primary hover:bg-bg-tertiary rounded-lg transition-all duration-200">
Transações
</a>
</nav>
</aside><!-- Sucesso -->
<div class="bg-success/10 border border-success/20 rounded-lg p-4 mb-4">
<p class="text-success font-medium">Operação realizada com sucesso!</p>
</div>
<!-- Erro -->
<div class="bg-error/10 border border-error/20 rounded-lg p-4 mb-4">
<p class="text-error font-medium">Ocorreu um erro. Tente novamente.</p>
</div>
<!-- Aviso -->
<div class="bg-warning/10 border border-warning/20 rounded-lg p-4 mb-4">
<p class="text-warning font-medium">Atenção: verifique os dados informados.</p>
</div>
<!-- Informação -->
<div class="bg-info/10 border border-info/20 rounded-lg p-4 mb-4">
<p class="text-info font-medium">Informação importante sobre o sistema.</p>
</div><!-- Container Principal -->
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
<!-- Conteúdo -->
</div>
<!-- Grid 2 Colunas -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>Coluna 1</div>
<div>Coluna 2</div>
</div>
<!-- Grid 3 Colunas -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<div>Coluna 1</div>
<div>Coluna 2</div>
<div>Coluna 3</div>
</div>
<!-- Grid 4 Colunas -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
<div>Coluna 1</div>
<div>Coluna 2</div>
<div>Coluna 3</div>
<div>Coluna 4</div>
</div>/* Padding e Margin */
spacing-1: 0.25rem /* 4px */
spacing-2: 0.5rem /* 8px */
spacing-3: 0.75rem /* 12px */
spacing-4: 1rem /* 16px */
spacing-6: 1.5rem /* 24px */
spacing-8: 2rem /* 32px */
spacing-12: 3rem /* 48px */
spacing-16: 4rem /* 64px */
/* Bordas Arredondadas */
rounded-md: 0.375rem /* 6px */
rounded-lg: 0.5rem /* 8px */
rounded-xl: 0.75rem /* 12px */
rounded-2xl: 1rem /* 16px */Como visitante
Quero criar uma conta no sistema
Para começar a gerenciar minhas finanças pessoais
Critérios de Aceite:
- Formulário de cadastro deve solicitar email e senha
- Email deve ser validado quanto ao formato
- Senha deve ter no mínimo 8 caracteres
- Sistema deve impedir cadastro com email já existente
- Perfil deve ser criado automaticamente após cadastro
- Usuário deve ser redirecionado ao dashboard após cadastro
- Mensagem de sucesso deve ser exibida
Como usuário cadastrado
Quero fazer login no sistema com meu email
Para acessar minhas informações financeiras
Critérios de Aceite:
- Formulário deve aceitar email e senha
- Sistema deve validar credenciais
- Mensagem de erro clara deve ser exibida para credenciais inválidas
- Usuário deve ser redirecionado ao dashboard após login bem-sucedido
- Sessão deve ser mantida até logout ou timeout
Como usuário logado
Quero sair do sistema
Para proteger minhas informações
Critérios de Aceite:
- Botão de logout deve estar visível em todas as páginas
- Sessão deve ser encerrada ao clicar em logout
- Usuário deve ser redirecionado à página inicial pública
- Confirmação de logout não é necessária
Como usuário logado
Quero visualizar os dados do meu perfil
Para confirmar minhas informações cadastradas
Critérios de Aceite:
- Página deve exibir nome completo
- Página deve exibir telefone
- Página deve exibir email (não editável)
- Página deve ter botão para editar perfil
Como usuário logado
Quero editar os dados do meu perfil
Para manter minhas informações atualizadas
Critérios de Aceite:
- Formulário deve permitir edição de nome completo
- Formulário deve permitir edição de telefone
- Validações devem ser aplicadas aos campos
- Mensagem de sucesso deve ser exibida após salvar
- Dados devem ser atualizados no banco de dados
Como usuário logado
Quero cadastrar uma nova conta bancária
Para registrar transações nesta conta
Critérios de Aceite:
- Formulário deve solicitar nome da conta
- Formulário deve solicitar nome do banco
- Formulário deve solicitar tipo de conta (corrente, poupança, carteira)
- Formulário deve solicitar saldo inicial
- Conta deve ser associada ao usuário logado
- Conta deve ser criada como ativa por padrão
- Mensagem de sucesso deve ser exibida
Como usuário logado
Quero ver todas as minhas contas cadastradas
Para ter visão geral das minhas contas
Critérios de Aceite:
- Lista deve exibir nome da conta
- Lista deve exibir nome do banco
- Lista deve exibir tipo de conta
- Lista deve exibir saldo atual
- Lista deve exibir apenas contas do usuário logado
- Deve haver botão para cadastrar nova conta
- Cada item deve ter opções de editar e excluir
Como usuário logado
Quero editar dados de uma conta
Para corrigir ou atualizar informações
Critérios de Aceite:
- Formulário deve vir preenchido com dados atuais
- Todos os campos devem ser editáveis
- Validações devem ser aplicadas
- Mensagem de sucesso deve ser exibida após salvar
Como usuário logado
Quero excluir uma conta
Para remover contas que não uso mais
Critérios de Aceite:
- Sistema deve solicitar confirmação antes de excluir
- Conta deve ser excluída permanentemente (ou desativada)
- Mensagem de sucesso deve ser exibida
- Transações da conta devem ser tratadas (manter registro histórico)
Como usuário logado
Quero criar categorias personalizadas
Para organizar minhas transações
Critérios de Aceite:
- Formulário deve solicitar nome da categoria
- Formulário deve solicitar tipo (entrada ou saída)
- Formulário deve permitir escolher cor
- Categoria deve ser associada ao usuário
- Mensagem de sucesso deve ser exibida
Como usuário logado
Quero ver todas as minhas categorias
Para gerenciar como organizo minhas transações
Critérios de Aceite:
- Lista deve exibir nome da categoria
- Lista deve indicar se é entrada ou saída
- Lista deve mostrar cor associada
- Lista deve exibir apenas categorias do usuário
- Deve haver botão para criar nova categoria
- Cada item deve ter opções de editar e excluir
Como usuário logado
Quero editar uma categoria
Para ajustar nome, tipo ou cor
Critérios de Aceite:
- Formulário deve vir preenchido
- Todos os campos devem ser editáveis
- Mensagem de sucesso deve ser exibida
Como usuário logado
Quero excluir categorias não utilizadas
Para manter apenas categorias relevantes
Critérios de Aceite:
- Sistema deve solicitar confirmação
- Categoria deve ser excluída
- Transações com esta categoria devem ser tratadas
- Mensagem de sucesso deve ser exibida
Como usuário logado
Quero registrar uma entrada de dinheiro
Para controlar minhas receitas
Critérios de Aceite:
- Formulário deve solicitar conta
- Formulário deve solicitar categoria
- Formulário deve solicitar valor
- Formulário deve solicitar data
- Formulário deve solicitar descrição (opcional)
- Tipo deve ser definido como "entrada"
- Saldo da conta deve ser atualizado
- Mensagem de sucesso deve ser exibida
Como usuário logado
Quero registrar uma saída de dinheiro
Para controlar minhas despesas
Critérios de Aceite:
- Formulário deve solicitar conta
- Formulário deve solicitar categoria
- Formulário deve solicitar valor
- Formulário deve solicitar data
- Formulário deve solicitar descrição (opcional)
- Tipo deve ser definido como "saída"
- Saldo da conta deve ser atualizado
- Mensagem de sucesso deve ser exibida
Como usuário logado
Quero ver todas as minhas transações
Para acompanhar meu histórico financeiro
Critérios de Aceite:
- Lista deve exibir data da transação
- Lista deve exibir descrição
- Lista deve exibir conta
- Lista deve exibir categoria
- Lista deve exibir valor
- Lista deve indicar se é entrada ou saída (cores diferentes)
- Lista deve ser ordenada por data (mais recente primeiro)
- Deve haver botão para registrar nova transação
- Cada item deve ter opções de editar e excluir
Como usuário logado
Quero filtrar transações por período, conta ou categoria
Para analisar movimentações específicas
Critérios de Aceite:
- Deve haver filtro por período (data inicial e final)
- Deve haver filtro por conta
- Deve haver filtro por categoria
- Filtros devem poder ser combinados
- Deve haver botão para limpar filtros
- Resultados devem atualizar ao aplicar filtros
Como usuário logado
Quero editar uma transação
Para corrigir informações registradas incorretamente
Critérios de Aceite:
- Formulário deve vir preenchido
- Todos os campos devem ser editáveis
- Saldo das contas deve ser recalculado
- Mensagem de sucesso deve ser exibida
Como usuário logado
Quero excluir uma transação
Para remover lançamentos duplicados ou incorretos
Critérios de Aceite:
- Sistema deve solicitar confirmação
- Transação deve ser excluída
- Saldo da conta deve ser recalculado
- Mensagem de sucesso deve ser exibida
Como usuário logado
Quero ver um resumo das minhas finanças
Para ter visão geral da minha situação financeira
Critérios de Aceite:
- Dashboard deve exibir saldo total consolidado
- Dashboard deve exibir total de entradas do mês
- Dashboard deve exibir total de saídas do mês
- Dashboard deve exibir balanço do mês (entradas - saídas)
- Dashboard deve exibir lista das últimas transações
- Dashboard deve exibir resumo por categorias
- Valores devem ser formatados em reais (R$)
- Entradas devem ter cor verde
- Saídas devem ter cor vermelha
Como usuário logado
Quero acessar rapidamente as principais funcionalidades
Para navegar eficientemente pelo sistema
Critérios de Aceite:
- Dashboard deve ter botões de acesso rápido
- Deve haver botão para nova transação
- Deve haver botão para nova conta
- Deve haver botão para nova categoria
- Menu de navegação deve estar sempre visível
Como visitante
Quero ver informações sobre o sistema
Para decidir se quero me cadastrar
Critérios de Aceite:
- Página deve apresentar o Finanpy
- Página deve listar principais funcionalidades
- Página deve ter design atrativo e moderno
- Deve haver botão de cadastro destacado
- Deve haver botão de login
- Usuários autenticados devem ser redirecionados ao dashboard
- Taxa de Conversão de Cadastro: % de visitantes que completam cadastro
- Meta: > 15%
- Usuários Ativos Diários (DAU): Usuários que acessam o sistema por dia
- Meta: > 60% dos usuários cadastrados
- Usuários Ativos Mensais (MAU): Usuários que acessam o sistema por mês
- Meta: > 80% dos usuários cadastrados
- Taxa de Retenção: % de usuários que retornam após primeiro acesso
- Meta: > 70% em 30 dias
- Média de Transações por Usuário: Número de transações registradas por usuário
- Meta: > 15 transações/mês
- Tempo Médio de Sessão: Tempo que usuário passa no sistema
- Meta: > 5 minutos
- Frequência de Acesso: Quantas vezes o usuário acessa por semana
- Meta: > 3 acessos/semana
- Tempo de Carregamento de Páginas: Tempo para página carregar completamente
- Meta: < 2 segundos
- Taxa de Erro: % de requisições que resultam em erro
- Meta: < 1%
- Disponibilidade do Sistema: % de tempo que sistema está disponível
- Meta: > 99%
- Net Promoter Score (NPS): Probabilidade de recomendar o sistema
- Meta: > 50
- Taxa de Abandono: % de usuários que param de usar o sistema
- Meta: < 20% ao mês
- Feedback Positivo: % de avaliações positivas
- Meta: > 80%
- Contas por Usuário: Número médio de contas cadastradas
- Meta: > 2 contas
- Categorias por Usuário: Número médio de categorias criadas
- Meta: > 5 categorias
- Completude de Perfil: % de usuários com perfil completo
- Meta: > 90%
- Taxa de Crescimento de Usuários: % de aumento de usuários por mês
- Meta: > 20% ao mês
- Custo de Aquisição de Cliente (CAC): Custo para adquirir novo usuário
- Meta: Minimizar (MVP sem custos de marketing)
- Lifetime Value (LTV): Valor gerado por usuário ao longo do tempo
- Meta: A definir em versões futuras monetizadas
- Tempo de Resolução de Bugs: Tempo médio para corrigir problemas
- Meta: < 48 horas para bugs críticos
- Taxa de Sucesso de Deploy: % de deploys sem rollback
- Meta: > 95%
Probabilidade: Média
Impacto: Alto
Descrição: SQLite pode ter limitações de performance com múltiplos usuários simultâneos ou grande volume de transações.
Mitigação:
- Implementar índices adequados nas tabelas
- Monitorar performance desde o início
- Planejar migração para PostgreSQL em versões futuras
- Limitar número de usuários na fase MVP
- Implementar cache quando necessário
Probabilidade: Baixa
Impacto: Crítico
Descrição: Vazamento ou acesso não autorizado a dados financeiros sensíveis.
Mitigação:
- Usar sistema de autenticação nativo do Django (testado e seguro)
- Implementar validações de permissão em todas as views
- Usar HTTPS em produção
- Implementar rate limiting para prevenir ataques
- Realizar code review focado em segurança
- Sanitizar inputs do usuário
Probabilidade: Média
Impacto: Alto
Descrição: Erros no cálculo de saldos ao criar, editar ou excluir transações.
Mitigação:
- Implementar lógica de atualização de saldo em signals
- Criar métodos centralizados para cálculo de saldos
- Implementar testes unitários para operações financeiras (sprint final)
- Adicionar validações de integridade
- Implementar sistema de auditoria de transações
Probabilidade: Média
Impacto: Médio
Descrição: Interface pode não funcionar bem em dispositivos móveis menores.
Mitigação:
- Usar TailwindCSS com classes responsivas desde o início
- Testar em múltiplos tamanhos de tela durante desenvolvimento
- Priorizar mobile-first design
- Implementar gestures e interações touch-friendly
Probabilidade: Média
Impacto: Alto
Descrição: Usuários podem não ver valor suficiente no MVP.
Mitigação:
- Focar em funcionalidades essenciais bem executadas
- Coletar feedback de usuários beta
- Iterar rapidamente baseado em feedback
- Simplificar ao máximo o processo de cadastro e primeiro uso
- Criar tutoriais e documentação clara
Probabilidade: Baixa
Impacto: Médio
Descrição: Sistema pode ser percebido como complicado para usuários não técnicos.
Mitigação:
- Manter interface simples e intuitiva
- Usar linguagem clara em português
- Implementar tooltips e mensagens de ajuda
- Realizar testes de usabilidade
- Fornecer exemplos e valores default quando possível
Probabilidade: Alta
Impacto: Médio
Descrição: Existem muitas soluções similares no mercado.
Mitigação:
- Focar em simplicidade como diferencial
- Implementar funcionalidades únicas em versões futuras
- Manter design moderno e atrativo
- Oferecer gratuitamente no MVP para ganhar tração
- Coletar feedback para identificar necessidades não atendidas
Probabilidade: Alta
Impacto: Médio
Descrição: Tarefas podem levar mais tempo que o estimado.
Mitigação:
- Quebrar tarefas em subtarefas menores e específicas
- Adicionar buffer de tempo em cada sprint
- Priorizar funcionalidades críticas
- Remover funcionalidades nice-to-have se necessário
- Revisão semanal do progresso
Probabilidade: Média
Impacto: Médio
Descrição: Problemas técnicos inesperados podem bloquear desenvolvimento.
Mitigação:
- Pesquisar soluções antes de implementar
- Manter documentação de decisões técnicas
- Ter planos alternativos para implementações críticas
- Buscar ajuda da comunidade Django quando necessário
Probabilidade: Baixa
Impacto: Alto
Descrição: Código mal estruturado pode dificultar manutenção futura.
Mitigação:
- Seguir PEP 8 rigorosamente
- Manter apps com responsabilidades bem definidas
- Documentar decisões arquiteturais importantes
- Realizar code review periódico
- Refatorar quando necessário
- Usar convenções do Django
Probabilidade: Alta
Impacto: Médio
Descrição: Ausência de testes pode causar regressões.
Mitigação:
- Planejar implementação de testes em sprint final
- Documentar casos de uso críticos para futuros testes
- Testar manualmente funcionalidades críticas
- Priorizar testes de operações financeiras quando implementar
Este PRD fornece uma estrutura completa e detalhada para o desenvolvimento do Finanpy. As sprints estão organizadas de forma lógica, começando pela infraestrutura básica e autenticação, passando pelas funcionalidades core (contas, categorias, transações), e finalizando com dashboard, refinamentos e preparação para produção.
Cada tarefa está quebrada em subtarefas específicas e granulares, facilitando o acompanhamento do progresso e a implementação incremental do sistema. A arquitetura proposta é simples, mantém as responsabilidades bem separadas, e segue as melhores práticas do Django.
O design system com TailwindCSS garante uma interface moderna, responsiva e consistente em todo o sistema, enquanto o foco em simplicidade evita over-engineering e mantém o código manutenível.