docs: expandir documentação do README e adicionar importação em massa de lançamentos

- Expande README.md com estatísticas detalhadas do projeto (200 componentes, 15+ tabelas, 20+ widgets)
  - Adiciona descrição completa da stack técnica e versões
  - Documenta estrutura de diretórios de forma abrangente
  - Inclui diagramas de schema de banco de dados e fluxos de dados
  - Adiciona seção de destaques e funcionalidades recentes
  - Implementa diálogo de importação em massa de lançamentos (bulk-import-dialog.tsx)
  - Adiciona fontes AISans (Regular e Semibold) ao projeto
  - Remove classe bg-muted das páginas de autenticação
  - Adiciona /docs ao .gitignore
  - Limpa código não utilizado em componentes de lançamentos e páginas do dashboard
  - Atualiza dependências no package.json
This commit is contained in:
Felipe Coutinho
2026-01-05 13:01:18 +00:00
parent 4237062bde
commit 901e423959
24 changed files with 1342 additions and 199 deletions

View File

@@ -2,7 +2,7 @@ import { LoginForm } from "@/components/auth/login-form";
export default function LoginPage() {
return (
<div className="bg-muted flex min-h-svh flex-col items-center justify-center p-6 md:p-10">
<div className="flex min-h-svh flex-col items-center justify-center p-6 md:p-10">
<div className="w-full max-w-sm md:max-w-4xl">
<LoginForm />
</div>

View File

@@ -2,7 +2,7 @@ import { SignupForm } from "@/components/auth/signup-form";
export default function Page() {
return (
<div className="bg-muted flex min-h-svh flex-col items-center justify-center p-6 md:p-10">
<div className="flex min-h-svh flex-col items-center justify-center p-6 md:p-10">
<div className="w-full max-w-sm md:max-w-4xl">
<SignupForm />
</div>

View File

@@ -183,6 +183,7 @@ export default async function Page({ params, searchParams }: PageProps) {
<section className="flex flex-col gap-4">
<LancamentosSection
currentUserId={userId}
lancamentos={lancamentosData}
pagadorOptions={pagadorOptions}
splitPagadorOptions={splitPagadorOptions}

View File

@@ -79,6 +79,7 @@ export default async function Page({ params, searchParams }: PageProps) {
transactionCount={detail.transactions.length}
/>
<LancamentosPage
currentUserId={userId}
lancamentos={detail.transactions}
pagadorOptions={pagadorOptions}
splitPagadorOptions={splitPagadorOptions}

View File

@@ -161,6 +161,7 @@ export default async function Page({ params, searchParams }: PageProps) {
<section className="flex flex-col gap-4">
<LancamentosSection
currentUserId={userId}
lancamentos={lancamentosData}
pagadorOptions={pagadorOptions}
splitPagadorOptions={splitPagadorOptions}

View File

@@ -67,6 +67,7 @@ export default async function Page({ searchParams }: PageProps) {
<main className="flex flex-col gap-6">
<MonthNavigation />
<LancamentosPage
currentUserId={userId}
lancamentos={lancamentosData}
pagadorOptions={pagadorOptions}
splitPagadorOptions={splitPagadorOptions}

View File

@@ -99,6 +99,9 @@ export default async function Page({ params, searchParams }: PageProps) {
let filterSources: Awaited<
ReturnType<typeof fetchLancamentoFilterSources>
> | null = null;
let loggedUserFilterSources: Awaited<
ReturnType<typeof fetchLancamentoFilterSources>
> | null = null;
let sluggedFilters: SluggedFilters;
let slugMaps: SlugMaps;
@@ -107,6 +110,8 @@ export default async function Page({ params, searchParams }: PageProps) {
sluggedFilters = buildSluggedFilters(filterSources);
slugMaps = buildSlugMaps(sluggedFilters);
} else {
// Buscar opções do usuário logado para usar ao importar
loggedUserFilterSources = await fetchLancamentoFilterSources(userId);
sluggedFilters = {
pagadorFiltersRaw: [],
categoriaFiltersRaw: [],
@@ -170,6 +175,7 @@ export default async function Page({ params, searchParams }: PageProps) {
const pagadorSharesData = shareRows;
let optionSets: OptionSet;
let loggedUserOptionSets: OptionSet | null = null;
let effectiveSluggedFilters = sluggedFilters;
if (canEdit && filterSources) {
@@ -192,6 +198,15 @@ export default async function Page({ params, searchParams }: PageProps) {
cartaoFiltersRaw: [],
};
optionSets = buildReadOnlyOptionSets(lancamentosData, pagador);
// Construir opções do usuário logado para usar ao importar
if (loggedUserFilterSources) {
const loggedUserSluggedFilters = buildSluggedFilters(loggedUserFilterSources);
loggedUserOptionSets = buildOptionSets({
...loggedUserSluggedFilters,
pagadorRows: loggedUserFilterSources.pagadorRows,
});
}
}
const pagadorSlug =
@@ -286,6 +301,7 @@ export default async function Page({ params, searchParams }: PageProps) {
<TabsContent value="lancamentos">
<section className="flex flex-col gap-4">
<LancamentosSection
currentUserId={userId}
lancamentos={lancamentosData}
pagadorOptions={optionSets.pagadorOptions}
splitPagadorOptions={optionSets.splitPagadorOptions}
@@ -299,6 +315,12 @@ export default async function Page({ params, searchParams }: PageProps) {
selectedPeriod={selectedPeriod}
estabelecimentos={estabelecimentos}
allowCreate={canEdit}
importPagadorOptions={loggedUserOptionSets?.pagadorOptions}
importSplitPagadorOptions={loggedUserOptionSets?.splitPagadorOptions}
importDefaultPagadorId={loggedUserOptionSets?.defaultPagadorId}
importContaOptions={loggedUserOptionSets?.contaOptions}
importCartaoOptions={loggedUserOptionSets?.cartaoOptions}
importCategoriaOptions={loggedUserOptionSets?.categoriaOptions}
/>
</section>
</TabsContent>

View File

@@ -20,6 +20,13 @@ import {
RiShieldCheckLine,
RiTimeLine,
RiWalletLine,
RiRobot2Line,
RiTeamLine,
RiFileTextLine,
RiDownloadCloudLine,
RiEyeOffLine,
RiFlashlightLine,
RiPercentLine,
} from "@remixicon/react";
import Image from "next/image";
import Link from "next/link";
@@ -209,7 +216,47 @@ export default async function Page() {
<p className="text-sm text-muted-foreground">
Registre suas contas bancárias, cartões e dinheiro.
Adicione receitas, despesas e transferências. Organize
por categorias.
por categorias. Extratos detalhados por conta.
</p>
</div>
</div>
</CardContent>
</Card>
<Card className="border hover:border-primary/50 transition-colors">
<CardContent className="pt-6">
<div className="flex flex-col gap-4">
<div className="flex h-12 w-12 items-center justify-center rounded-lg bg-primary/10">
<RiPercentLine size={24} className="text-primary" />
</div>
<div>
<h3 className="font-semibold text-lg mb-2">
Parcelamentos avançados
</h3>
<p className="text-sm text-muted-foreground">
Controle completo de compras parceladas. Antecipe parcelas
com cálculo automático de desconto. Veja análise
consolidada de todas as parcelas em aberto.
</p>
</div>
</div>
</CardContent>
</Card>
<Card className="border hover:border-primary/50 transition-colors">
<CardContent className="pt-6">
<div className="flex flex-col gap-4">
<div className="flex h-12 w-12 items-center justify-center rounded-lg bg-primary/10">
<RiRobot2Line size={24} className="text-primary" />
</div>
<div>
<h3 className="font-semibold text-lg mb-2">
Insights com IA
</h3>
<p className="text-sm text-muted-foreground">
Análises financeiras geradas por IA (Claude, GPT, Gemini).
Insights personalizados sobre seus padrões de gastos e
recomendações inteligentes.
</p>
</div>
</div>
@@ -227,8 +274,9 @@ export default async function Page() {
Relatórios e gráficos
</h3>
<p className="text-sm text-muted-foreground">
Dashboard com resumo mensal. Gráficos de evolução do
patrimônio. Entenda pra onde seu dinheiro está indo.
Dashboard com 20+ widgets interativos. Relatórios
detalhados por categoria. Gráficos de evolução e
comparativos. Exportação em PDF e Excel.
</p>
</div>
</div>
@@ -246,8 +294,29 @@ export default async function Page() {
Faturas de cartão
</h3>
<p className="text-sm text-muted-foreground">
Cadastre seus cartões e acompanhe as faturas. Veja o que
ainda não foi fechado. Controle limites e vencimentos.
Cadastre seus cartões e acompanhe as faturas por período.
Veja o que ainda não foi fechado. Controle limites,
vencimentos e fechamentos.
</p>
</div>
</div>
</CardContent>
</Card>
<Card className="border hover:border-primary/50 transition-colors">
<CardContent className="pt-6">
<div className="flex flex-col gap-4">
<div className="flex h-12 w-12 items-center justify-center rounded-lg bg-primary/10">
<RiTeamLine size={24} className="text-primary" />
</div>
<div>
<h3 className="font-semibold text-lg mb-2">
Gestão colaborativa
</h3>
<p className="text-sm text-muted-foreground">
Compartilhe pagadores com permissões granulares (admin/
viewer). Notificações automáticas por e-mail. Colabore em
lançamentos compartilhados.
</p>
</div>
</div>
@@ -262,12 +331,12 @@ export default async function Page() {
</div>
<div>
<h3 className="font-semibold text-lg mb-2">
Categorias personalizadas
Categorias e orçamentos
</h3>
<p className="text-sm text-muted-foreground">
Crie e organize suas próprias categorias. Moradia,
alimentação, transporte, ou o que fizer sentido pra
você.
Crie categorias personalizadas. Defina orçamentos mensais
e acompanhe o quanto gastou vs. planejado com indicadores
visuais.
</p>
</div>
</div>
@@ -278,16 +347,16 @@ export default async function Page() {
<CardContent className="pt-6">
<div className="flex flex-col gap-4">
<div className="flex h-12 w-12 items-center justify-center rounded-lg bg-primary/10">
<RiMoneyDollarCircleLine
size={24}
className="text-primary"
/>
<RiFileTextLine size={24} className="text-primary" />
</div>
<div>
<h3 className="font-semibold text-lg mb-2">Orçamentos</h3>
<h3 className="font-semibold text-lg mb-2">
Anotações e tarefas
</h3>
<p className="text-sm text-muted-foreground">
Defina quanto quer gastar por categoria no s.
Acompanhe se está dentro do planejado.
Crie notas de texto e listas de tarefas com checkboxes.
Sistema de arquivamento para manter histórico. Organize
seus planejamentos financeiros.
</p>
</div>
</div>
@@ -305,8 +374,69 @@ export default async function Page() {
Calendário financeiro
</h3>
<p className="text-sm text-muted-foreground">
Visualize suas transações em calendário mensal. Nunca
perca prazos importantes.
Visualize todas as transações em calendário mensal.
Navegação intuitiva por data. Nunca perca prazos de
pagamentos importantes.
</p>
</div>
</div>
</CardContent>
</Card>
<Card className="border hover:border-primary/50 transition-colors">
<CardContent className="pt-6">
<div className="flex flex-col gap-4">
<div className="flex h-12 w-12 items-center justify-center rounded-lg bg-primary/10">
<RiDownloadCloudLine size={24} className="text-primary" />
</div>
<div>
<h3 className="font-semibold text-lg mb-2">
Importação em massa
</h3>
<p className="text-sm text-muted-foreground">
Cole múltiplos lançamentos de uma vez. Economize tempo ao
registrar várias transações. Formatação inteligente para
facilitar a entrada de dados.
</p>
</div>
</div>
</CardContent>
</Card>
<Card className="border hover:border-primary/50 transition-colors">
<CardContent className="pt-6">
<div className="flex flex-col gap-4">
<div className="flex h-12 w-12 items-center justify-center rounded-lg bg-primary/10">
<RiEyeOffLine size={24} className="text-primary" />
</div>
<div>
<h3 className="font-semibold text-lg mb-2">
Modo privacidade
</h3>
<p className="text-sm text-muted-foreground">
Oculte valores sensíveis com um clique. Tema dark/light
adaptável. Preferências personalizáveis. Calculadora
integrada para planejamento.
</p>
</div>
</div>
</CardContent>
</Card>
<Card className="border hover:border-primary/50 transition-colors">
<CardContent className="pt-6">
<div className="flex flex-col gap-4">
<div className="flex h-12 w-12 items-center justify-center rounded-lg bg-primary/10">
<RiFlashlightLine size={24} className="text-primary" />
</div>
<div>
<h3 className="font-semibold text-lg mb-2">
Performance otimizada
</h3>
<p className="text-sm text-muted-foreground">
Dashboard carrega em ~200-500ms com 18+ queries paralelas.
Índices otimizados. Type-safe em toda codebase. Isolamento
completo de dados por usuário.
</p>
</div>
</div>