Commit Graph

74 Commits

Author SHA1 Message Date
Felipe Coutinho
0e4dbe6a3f feat: amplia opcoes de fontes e normaliza preferencias 2026-03-06 13:59:12 +00:00
Felipe Coutinho
2f781a8dca fix: corrige antecipacao e fechamento de compras no cartao 2026-03-06 13:58:28 +00:00
Felipe Coutinho
137c7b305d feat: reforca o branding das exportacoes 2026-03-06 13:58:07 +00:00
Felipe Coutinho
069d0759c6 refactor: reorganiza componentes compartilhados e caminhos do app 2026-03-06 13:57:40 +00:00
Felipe Coutinho
bff72d0504 chore(cleanup): remove dead code and legacy top-estabelecimentos route 2026-03-02 17:20:46 +00:00
Felipe Coutinho
2a21bef2da feat(dashboard): add quick actions and new overview widgets 2026-03-02 17:20:28 +00:00
Felipe Coutinho
3d3a9e1414 feat(auth): implementar passkeys e gerenciamento em ajustes 2026-03-02 01:33:05 +00:00
Felipe Coutinho
4a88309709 chore: apply pending dashboard and UI updates 2026-02-28 15:34:54 +00:00
Felipe Coutinho
15b2ee18e1 feat: bulk delete com escopo para mesma série + recorrente só consome limite após data
Aproveitamento parcial da PR #18 (fechada):

- Bulk delete: quando todos os selecionados pertencem à mesma série
  (parcelado/recorrente), abre dialog de escopo com 3 opções ao invés
  de deletar direto
- Recorrente no cartão: despesa recorrente só consome limite quando
  purchaseDate <= current_date (cartões ativos, inativos e relatório)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:54:08 +00:00
Felipe Coutinho
3f3488c8a0 refactor: remover funções, tipos e exports não utilizados
Remove createActionHandler, validateHashToken, decimalSchema,
optionalPeriodSchema, dateStringSchema, amountSchema, FeedbackDialog
standalone, CalendarEventType, parseDateKey, entre outros.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 15:40:59 +00:00
Felipe Coutinho
e644d67022 refactor: extrair data fetching da page de pagadores para data.ts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 15:40:52 +00:00
Felipe Coutinho
ac2ea63dbd refactor: simplificar lancamento-dialog e mass-add-dialog
Substitui FaturaWarningDialog por deriveCreditCardPeriod() que calcula
o período da fatura automaticamente a partir da data de compra +
dia de fechamento/vencimento do cartão.

lancamento-dialog: remove periodDirty state, adiciona seção colapsável
"Condições e anotações", propaga closingDay/dueDay via cardInfo.

mass-add-dialog: unifica contaId/cartaoId em contaCartaoId com
parsing por prefixo, period picker apenas para cartão de crédito.

basic-fields-section: remove PeriodPicker (período agora auto-derivado),
move Estabelecimento para topo.

payment-method-section: adiciona InlinePeriodPicker como link
"Fatura de [mês]" com popover MonthPicker.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:23:23 +00:00
Felipe Coutinho
96118d85e4 style: padronizar dialogs e aplicar formatação Biome
DialogContent: padding p-6→p-10, max-w-lg→max-w-xl.
DialogFooter/AlertDialogFooter: botões com flex-1 (largura igual).
Remove gap-3/w-full redundantes de 12+ dialogs.

Reformatação Biome: line wrapping, import ordering.
Error component renomeado para evitar shadowing do global Error.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:22:59 +00:00
Felipe Coutinho
803e273538 fix: corrigir tipos e eliminar non-null assertions
Substitui non-null assertions (!) por type assertions ou optional
chaining com guards. Troca any por unknown/tipos explícitos.

- drizzle.config: DATABASE_URL! → as string
- use-form-state: Record<string, any> → Record<string, unknown>
- actions: catch (e: any) → catch (e), model tipado explicitamente
- pagadores/data: row: any → Record<string, unknown>
- note-dialog: result tipado explicitamente
- bulk-import: payload as any removido
- Map.get()! → optional chaining + guards em relatórios e dashboard

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:22:41 +00:00
Felipe Coutinho
8de22b9930 refactor: remover código morto e exports não utilizados
Remove 6 componentes não utilizados (dashboard-grid, expenses/income
by category widgets, installment analysis panels, fatura-warning-dialog).

Remove funções/tipos não utilizados: successResult, generateApiToken,
validateApiToken, getTodayUTC/Local, formatDateForDb, getDateInfo,
calculatePercentage, roundToDecimals, safeParseInt/Float, isPeriodValid,
getLastPeriods, normalizeWhitespace, formatCurrency wrapper,
InboxItemInput, InboxBatchInput, ProcessInboxInput, DiscardInboxInput,
LancamentosColumnId, 5 funções de anticipation-helpers.

Redireciona imports de formatCurrency para lib/lancamentos/formatting-helpers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:19:33 +00:00
Felipe Coutinho
9cb6593186 feat: changelog como página própria, versão 1.7.1
- Remove aba Changelog de Ajustes; cria página em /changelog
- Adiciona link para /changelog no menu do usuário com versão ao lado
- Data do changelog formatada como dd/mm/aaaa
- Limpa formatação ** do CHANGELOG.md
- Bump de versão para 1.7.1

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 16:07:34 +00:00
Felipe Coutinho
1b90be6b54 feat: topbar de navegação como experimento de UI (v1.7.0)
- Substitui header fixo por topbar com backdrop blur e navegação agrupada em 5 seções
- Adiciona FerramentasDropdown consolidando calculadora e modo privacidade
- NotificationBell expandida com orçamentos e pré-lançamentos
- Remove logout-button, header-dashboard e privacy-mode-toggle como componentes separados
- Logo refatorado com variante compact; topbar com links em lowercase
- Adiciona dependência radix-ui ^1.4.3
- Atualiza CHANGELOG para v1.7.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 15:43:14 +00:00
Felipe Coutinho
f640990912 chore: remover páginas estabelecimentos e gastos-por-categoria
- Remove /estabelecimentos e todos seus componentes e actions
- Remove /relatorios/gastos-por-categoria e seus arquivos
- Remove tabela `estabelecimentos` do schema e migration 0019
- Remove nav items de ambas as features do sidebar
- Reverte widget expenses-by-category ao estado original
- Remove filtro de estabelecimento dos lançamentos (filters, table, page-helpers)
- Reverte getRecentEstablishmentsAction para query apenas em lancamentos
- Limpa CHANGELOG removendo entradas das features removidas
2026-02-21 21:28:36 +00:00
Guilherme Bano
94f6b0a986 Correção de integração com o resend 2026-02-21 21:28:36 +00:00
Guilherme Bano
9b78f839bf Adicionado aba de estabelecimentos e feita ajuste de interface. Detalhes adicionados no CHANGELOG.md 2026-02-21 21:28:36 +00:00
Guilherme Bano
ffde55f589 ajuste de layout mobile, melhorias e criação de novas funções. Detalhes adicionados no CHANGELOG.md 2026-02-21 21:28:36 +00:00
Felipe Coutinho
31fe752b7d feat(v1.5.3): status de pagamento no painel do pagador + SEO landing + WebP
- Card de Status de Pagamento com totais pagos/pendentes e lista de boletos individuais
- Validação obrigatória de categoria/conta/cartão no dialog de lançamento (client + server)
- SEO completo na landing: Open Graph, Twitter Card, JSON-LD, sitemap.xml, robots.txt
- Imagens convertidas de PNG para WebP (performance)
- HTML lang corrigido para pt-BR; template de título dinâmico

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-21 17:48:52 +00:00
Felipe Coutinho
a1347aed28 feat(v1.5.1): renomeação OpenSheets → OpenMonetis + multi-domínio
Renomeia o projeto em ~40 arquivos (package.json, manifests, layouts,
componentes, server actions, emails, Docker, docs, landing page).
Adiciona suporte a multi-domínio via PUBLIC_DOMAIN onde o domínio
público serve apenas a landing page sem botões de auth.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 17:16:50 +00:00
Felipe Coutinho
98dd0f11e1 fix: lazy-load BETTER_AUTH_SECRET para corrigir Docker build
Validação eager do secret no top-level do módulo causava falha no
build Docker porque a env var não existe em build-time. Movido para
função getJwtSecret() chamada em runtime.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 22:35:51 +00:00
Felipe Coutinho
b9f788312c chore: atualizações de dependências, lint fixes e ajustes menores
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 21:35:39 +00:00
Felipe Coutinho
2362a70b9d feat(v1.5.0): customização de fontes e correção de cores em tendências
Adiciona sistema de customização de fontes por usuário via CSS custom
properties, com preview ao vivo e persistência no banco. Corrige lógica
de cores invertida na tabela de receitas em tendências.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 21:35:00 +00:00
Felipe Coutinho
4b442a907a feat(v1.4.1): tabs de histórico, logo matching e melhorias nos pré-lançamentos
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 00:06:54 +00:00
Felipe Coutinho
f50261208a feat(v1.4.0): design system semântico, correções de revalidação e melhorias de UX
- Adicionar tokens semânticos de estado (success, warning, info) no globals.css
- Migrar ~60+ componentes de cores hardcoded do Tailwind para tokens semânticos
- Unificar 3 arrays duplicados de cores de categorias em importação única
- Corrigir widgets de boleto/fatura que não atualizavam após pagamento
  (actions de fatura e antecipação não invalidavam cache do dashboard)
- Corrigir scroll em listas Popover+Command (modal prop)
- Adicionar link "detalhes" no card de orçamento para página da categoria
- Adicionar indicadores de tendência coloridos nos cards de métricas
- Estender cores de chart de 6 para 10
- Normalizar dark mode e remover tokens não utilizados

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 15:14:59 +00:00
Felipe Coutinho
390754c0e8 feat(ajustes): adicionar aba changelog com histórico de versões
Parser lê o CHANGELOG.md e exibe as versões com badges por tipo de mudança
(Adicionado, Alterado, Corrigido) na página de ajustes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 17:45:24 +00:00
Felipe Coutinho
6f5c41a4cf perf: otimizar dashboard com indexes, cache e consolidação de queries (v1.3.0)
- Adicionar indexes compostos em lancamentos para queries frequentes
- Eliminar ~20 JOINs com pagadores via helper cacheado getAdminPagadorId()
- Consolidar queries: income-expense-balance (12→1), payment-status (2→1), categories (4→2)
- Adicionar cache cross-request via unstable_cache com tag-based invalidation
- Limitar scan de métricas a 24 meses
- Deduplicar auth session por request via React.cache()

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 12:24:15 +00:00
Felipe Coutinho
a70a83dd9d feat(pagadores): adicionar widget no dashboard e atualizar avatares
- Novo widget de pagadores no dashboard com resumo de transações
- Substituir avatares SVG por PNG com melhor qualidade
- Melhorar seção de pagador no diálogo de lançamentos
- Adicionar ação para buscar pagadores por nome
- Atualizar componentes de seleção (cartões, categorias, contas)
- Melhorias no layout de ajustes e relatórios

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 01:44:50 +00:00
Felipe Coutinho
df1d149e4a refactor(sidebar): reorganizar navegação e aplicar formatação Biome
- Simplifica estrutura da sidebar combinando seções "Visão Geral" e "Gestão Financeira"
- Renomeia itens de relatórios para maior clareza ("Tendências", "Uso de Cartões")
- Aplica correções de formatação do Biome (ordenação de imports, quebras de linha)
- Remove código comentado não utilizado
- Adiciona migração 0014 do Drizzle

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 13:16:39 +00:00
Felipe Coutinho
2eafceb6d3 refactor: atualizar imports para os novos nomes de tabelas
- Atualizar imports em todos os arquivos que usavam os nomes antigos
- Corrigir referências para preferenciasUsuario, insightsSalvos, tokensApi, preLancamentos, antecipacoesParcelas, compartilhamentosPagador
2026-01-27 14:19:46 +00:00
Felipe Coutinho
a7f63fb77a refactor: migrate from ESLint to Biome and extract SQL queries to data.ts
- Replace ESLint with Biome for linting and formatting
- Configure Biome with tabs, double quotes, and organized imports
- Move all SQL/Drizzle queries from page.tsx files to data.ts files
- Create new data.ts files for: ajustes, dashboard, relatorios/categorias
- Update existing data.ts files: extrato, fatura (add lancamentos queries)
- Remove all drizzle-orm imports from page.tsx files
- Update README.md with new tooling info

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 13:15:37 +00:00
Felipe Coutinho
8ffe61c59b refactor(inbox): rename caixa-de-entrada to pre-lancamentos e remove colunas não utilizadas
BREAKING CHANGES:
- Renomeia rota /caixa-de-entrada para /pre-lancamentos
- Remove colunas device_id, parsed_date e discard_reason da tabela inbox_items

Mudanças:
- Move componentes de caixa-de-entrada para pre-lancamentos
- Atualiza sidebar e navegação para nova rota
- Remove campos não utilizados do schema, types e APIs
- Adiciona migration 0011 para remover colunas do banco
- Simplifica lógica de data padrão usando notificationTimestamp
2026-01-26 17:05:55 +00:00
Felipe Coutinho
c0fb11f89c refactor(inbox): remove process dialog e integra fluxo ao lancamento-dialog
- Remove process-dialog.tsx (componente não mais utilizado)
- Simplifica inbox-page.tsx removendo estados e lógica do process dialog
- Atualiza inbox-details-dialog para usar lancamento-dialog diretamente
- Adiciona suporte a dados iniciais do inbox no lancamento-dialog
- Move campos de metadata da inbox para o form de lançamento
- Remove campo currency não utilizado do schema
- Atualiza actions e data com melhor tratamento de erros
2026-01-26 13:31:37 +00:00
Felipe Coutinho
2d62fd0302 fix(api): use hash-based token validation instead of JWT
Changed all API endpoints to validate os_xxx tokens via SHA-256 hash
lookup in the database instead of expecting JWT format.

This allows tokens generated in the settings page (Ajustes → Dispositivos)
to work correctly with the Android app.

- /api/auth/device/verify: validates os_xxx tokens via hash
- /api/inbox: uses hash-based auth
- /api/inbox/batch: uses hash-based auth
- No token expiration (tokens valid until revoked)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:14:54 +00:00
Felipe Coutinho
9ff42ecbe7 feat(inbox): add Caixa de Entrada page for managing companion notifications
- Create inbox page with pending items management:
  - InboxCard: displays notification summary with parsed data
  - InboxDetailsDialog: view full notification details
  - ProcessDialog: convert notification to transaction (lancamento)

- Add server actions for inbox operations:
  - getInboxItems: fetch pending inbox items
  - processInboxItem: create lancamento from inbox item
  - discardInboxItem: discard unwanted notifications

- Add navigation link to sidebar under 'Gestão Financeira'
- Add revalidation config for inbox-related paths
2026-01-23 12:12:22 +00:00
Felipe Coutinho
2532f2d6ad feat(auth): add API token authentication for OpenSheets Companion
- Implement JWT-based authentication system for device access
  - Access tokens (7 day expiry) and refresh tokens (90 day expiry)
  - HMAC-SHA256 signing with timing-safe comparison
  - Token hashing with SHA-256 for secure storage

- Add device authentication endpoints:
  - POST /api/auth/device/token - Login with email/password, get tokens
  - POST /api/auth/device/refresh - Refresh access token
  - POST /api/auth/device/verify - Verify token validity
  - GET /api/auth/device/tokens - List user's API tokens
  - DELETE /api/auth/device/tokens/[id] - Revoke specific token

- Track token usage (last used timestamp and IP)
2026-01-23 12:11:19 +00:00
Felipe Coutinho
29a457ad36 feat(database): add api_tokens and inbox_items tables for OpenSheets Companion
- Add api_tokens table to store device authentication tokens
  - Includes token hash, prefix, expiration, and usage tracking
  - Cascades on user deletion

- Add inbox_items table to store notifications from companion app
  - Stores original notification data and parsed transaction info
  - Tracks processing status (pending, processed, discarded)
  - Links to created lancamento when processed

- Add TypeScript types: ApiToken, NewApiToken, InboxItem, NewInboxItem
- Add inbox Zod schemas for input validation
2026-01-23 12:10:05 +00:00
Felipe Coutinho
a57c73bd11 feat(lancamentos): adiciona suporte a ícone de categoria
Adiciona campo categoriaIcon ao tipo LancamentoItem e seu mapeamento
no page-helpers para exibir ícones das categorias na tabela.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 12:38:47 +00:00
Felipe Coutinho
540b250a47 feat(dashboard): adiciona widgets movíveis e ocultáveis
- Cria SortableWidget com @dnd-kit para drag-and-drop
- Cria DashboardGridEditable com modo de edição
- Cria WidgetSettingsDialog para gerenciar visibilidade
- Cria server actions para persistir preferências
2026-01-20 16:36:33 +00:00
Felipe Coutinho
2caf86871a feat(cartoes): adiciona filtro de período e logo no gráfico de uso
- Adiciona filtros de 3, 6 e 12 meses no CardUsageChart
- Exibe logo e nome do cartão no header do gráfico
- Atualiza fetchCardDetail para buscar 12 meses de dados
2026-01-20 15:21:02 +00:00
Felipe Coutinho
5b8f8fc42b feat: adicionar página Top Estabelecimentos
- Criar página /top-estabelecimentos com análise de gastos por local
- Adicionar componentes: establishments-list, highlights-cards, summary-cards
- Adicionar filtro de período personalizado
- Criar função de busca de dados para top estabelecimentos

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 13:43:35 +00:00
Felipe Coutinho
c55b808bb6 feat(relatorios): adicionar página de relatório de cartões
- Criar página /relatorios/cartoes com visão geral dos cartões
- Adicionar componentes: cards-overview, card-usage-chart, card-top-expenses
- Adicionar componentes: card-category-breakdown, card-invoice-status
- Criar função de busca de dados para relatório de cartões

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 13:43:26 +00:00
Felipe Coutinho
478bd0c267 feat(lancamentos): separar botões Nova Receita e Nova Despesa
- Substituir botão único "Novo lançamento" por dois botões separados
- Adicionar ícones coloridos (verde para Receita, vermelho para Despesa)
- Adicionar suporte a defaultTransactionType no dialog
- Atualizar título e descrição do dialog conforme tipo selecionado
- Ocultar campo de tipo de transação quando tipo é pré-definido

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 13:43:00 +00:00
Felipe Coutinho
9b08a8e020 style(dashboard): adicionar ícone ao link "Ver mais" no widget Top Estabelecimentos
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 13:40:21 +00:00
Felipe Coutinho
9fcb707be7 feat(dashboard): adicionar ícones coloridos nos widgets de categorias
- Criar utilitário centralizado para cores de categorias (lib/utils/category-colors.ts)
- Aplicar ícones coloridos no widget de despesas por categoria
- Aplicar ícones coloridos no widget de receitas por categoria
- Refatorar top-categories para usar utilitário centralizado

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 13:40:14 +00:00
Felipe Coutinho
6a45a5110d feat: implementar melhorias em importação, compartilhamento e contas inativas
- Corrigir cálculo de valor na importação de lançamentos parcelados
    - Exibir valor total (parcela × quantidade) ao invés do valor da parcela individual
    - Permite recriar parcelamentos importados com valor correto

  - Permitir que usuários compartilhados se descompartilhem de pagadores
    - Adicionar componente PagadorLeaveShareCard na aba Perfil
    - Usuário filho pode sair do compartilhamento sem precisar do usuário pai
    - Manter autorização bidirecionada na action de remoção de share

  - Implementar submenu "Inativos" para contas bancárias
    - Criar página /contas/inativos seguindo padrão de cartões
    - Filtrar contas ativas e inativas em páginas separadas
    - Adicionar ícone e navegação no sidebar
2026-01-11 22:44:20 +00:00
Felipe Coutinho
901e423959 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
2026-01-05 13:01:18 +00:00