- botão "Ajustar fatura" na página da fatura abre dialog com input do valor real
e preview da diferença; action faz upsert/delete idempotente do lançamento de ajuste
- opção "Reembolso" no dropdown de ações de despesas à vista cria receita espelhada
no extrato ou fatura correta, vinculada ao lançamento original
- botão "Ajustar saldo" no extrato da conta compara saldo real informado e gera
lançamento de ajuste por (accountId, period) via upsert/delete idempotente
- constantes INVOICE_ADJUSTMENT_NAME, ACCOUNT_BALANCE_ADJUSTMENT_NAME,
REFUND_NOTE_PREFIX e buildRefundNote() centralizadas em shared/lib/accounts/constants.ts
- extrato agora contabiliza transferências internas em Entradas e Saídas corretamente
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- campo limite passa a ser NOT NULL DEFAULT 0 no schema (migration 0029)
- validação Zod com requiredDecimalSchema garante valor positivo no formulário
- validateCardLimit() em transactions/actions/core.ts bloqueia criação e edição
de despesas em cartão que ultrapassem o limite disponível, retornando mensagem
com o valor exato restante
- tipos Card.limit e Card.limitAvailable deixam de ser nullable
- branch "sem limite registrado" removido de card-item.tsx
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adiciona ao bloco da v2.4.4 as mudanças de logo (split em LogoIcon/
LogoText, SVGs inline, troca dos PNGs por SVGs no public/ e
rasterização em alta resolução nos PDFs) e o fix do baseUrl no
tsconfig. Também atualiza a data da release para 2026-04-27.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Atualiza loadExportLogoDataUrl para carregar SVGs e rasterizar no canvas
a 4× a resolução natural antes de retornar o data URL — preserva nitidez
quando o PDF amplia a imagem. Default do path mudou para
/images/logo_text.svg.
Os exports de categorias e lançamentos agora apontam para os arquivos
.svg em vez dos .png removidos.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- adiciona public/images/logo_small.svg e logo_text.svg com width/height
explícitos (necessário para naturalWidth/Height funcionar via <img>)
- remove os PNGs antigos (logo_small.png e logo_text.png)
- atualiza referência no README.md (header) para logo_small.svg
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Substitui as PNGs raster do componente Logo por SVGs inline e quebra
em dois subcomponentes reutilizáveis:
- LogoIcon (src/shared/components/logo-icon.tsx): SVG do ícone laranja
(viewBox 0 0 200 200), aceita SVGProps via spread
- LogoText (src/shared/components/logo-text.tsx): SVG do wordmark
(viewBox 0 0 574.201 89.6), fill #000 + dark:invert para alternar
preto/branco conforme o tema
- Logo (orquestrador): mantém a API atual (variants full/compact/small,
invertTextOnDark, colorIcon, iconClassName, textClassName) e agora
renderiza os SVGs em vez de next/image
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
A remoção de "ignoreDeprecations": "6.0" no commit anterior reabriu o
erro TS5101 sobre baseUrl. Como moduleResolution: bundler resolve os
paths relativos ao próprio tsconfig.json, baseUrl é redundante e pode
ser removido.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Versão dedicada a remover a dependência de pgcrypto e a enxugar os
backups. CHANGELOG, badge do README e fluxo de restore atualizados;
script pnpm db:extensions removido do package.json.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adiciona --schema=public --schema=drizzle aos pg_dump (modos remote e
docker), descartando os schemas internos do Supabase (auth, realtime,
storage, vault, graphql, etc.). Restaurações em PostgreSQL padrão
deixam de produzir os ~148 erros de role/extension does not exist.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Move a geração do share_code do PostgreSQL para a camada de aplicação,
eliminando a dependência da extensão pgcrypto no setup do banco.
- schema: drop default substr(encode(gen_random_bytes(24), 'base64'), 1, 24)
da coluna share_code em pagadores (continua NOT NULL)
- nova util generateShareCode() em shared/lib/payers/share-code.ts
(server-only, usa crypto.randomBytes do Node)
- chamadas explícitas em createPayerAction, ensureDefaultPagadorForUser,
resetUserAppData e mock-data ao inserir pagadores
- migration 0028_fancy_reaper renumerada (0027 já estava ocupado por
arquivo órfão); journal e snapshot atualizados
- remove etapa de habilitação de pgcrypto do docker-entrypoint.sh
- remove scripts/postgres/ (init.sql e enable-extensions.ts)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Containers em hosts com IPv6 habilitado tentavam conectar via ::1
e falhavam por timeout antes de cair no fallback IPv4. Fixar
127.0.0.1 elimina a ambiguidade.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- updateCategoryAction: mensagem de sucesso "Category atualizada com
sucesso." → "Categoria atualizada com sucesso."
- AnticipateInstallmentsDialog: rótulos "Period" → "Fatura" e
"Category" → "Categoria"
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- TransactionTypeBadge: substitui StatusDot por ícones direcionais
(RiArrowRightDownLine receita, RiArrowRightUpLine despesa,
RiArrowLeftRightLine transferência), adiciona borda e shadow sutil
e dessaturação no dark mode; rótulo "Transferência" abreviado
para "Transf."
- RadioGroup: indicador trocado de RiCircleLine por RiCheckLine com
fundo sólido primary no estado selecionado
- Tabela de seleção de parcelas no dialog de antecipação reduzida
para três colunas (estabelecimento, fatura, valor); coluna de
vencimento removida e nome do estabelecimento absorve a parcela
- Inter agora carrega explicitamente os pesos 500, 600 e 700
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Cada EstablishmentLogo dispara um GET para /api/logo/mapping por
nome único (deduplicado pelo React Query, mas ainda N requests por
página). Em /dashboard, /transactions e /payers/[payerId] agora
fazemos uma única query SQL em batch (fetchEstablishmentLogoMap) e
semeamos o cache do React Query antes do primeiro render via novo
LogoPrefetchProvider — eliminando os requests da rede.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Três caminhos de deleção não chamavam o cleanup de storage, deixando
arquivos órfãos no S3:
- deleteTransactionBulkAction: deleções por escopo de série (período,
futuras, todas) agora coletam attachments vinculados antes do delete
e disparam cleanupAttachmentsAfterTransactionDelete
- deleteMultipleTransactionsAction: mesma correção para seleção
múltipla de lançamentos
- resetUserAppData: reset de conta em Ajustes coleta os fileKeys
antes de truncar e remove os objetos do S3 em paralelo
Também ajusta deleteS3Object para ignorar NoSuchKey silenciosamente,
necessário para providers S3-compatíveis como Cloudflare R2 que não
são idempotentes nessa operação.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adiciona splitGroupId para vincular as duas shares de um lançamento
dividido (schema + índice + migration 0026). Habilita:
- Edição de par dividido com escolha de escopo (apenas este lado ou
ambos) via novo SplitPairDialog e updateTransactionSplitPairAction
- Filtro "Somente divididos" (isDivided) na tabela de lançamentos
- Visibilidade de anexos para pessoas com acesso compartilhado via
payerShares; upload e detach em massa expandem para shares irmãs
- Cópia independente de anexos no fluxo "Importar para Minha Conta"
(novo fileKey, novo userId, S3 CopyObject) com seção read-only
"Anexos que serão copiados" no dialog de importação
- Ícone de clipe na tabela de lançamentos da página da pessoa via
EXISTS em fetchPagadorLancamentos
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
CSP não tem efeito em respostas JSON e expunha domínios
internos (Umami, Supabase, logo.dev) em endpoints públicos.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Lançamentos parcelados com o mesmo seriesId agora são consolidados em
um único evento do tipo 'installment' no calendário, exibindo 'Nx de
R$ X' em vez de repetir o mesmo item N vezes. Legenda e modal de
detalhes atualizados para refletir o novo tipo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ícone de tarefa concluída em card e detalhes simplificado para
RiCheckLine verde sem caixa. Checkbox no modal de edição usa bg/border
success com texto success-foreground (claro no light, escuro no dark).
Footer do modal de detalhes reordenado: Cancelar à esquerda, Alterar
primário à direita.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Todas as strings visíveis ao usuário (labels, títulos, toasts, mensagens
de erro, cabeçalhos de tabela, exportações) foram atualizadas. Acordos
de gênero em português corrigidos. Código, rotas (/payers) e schema do
banco (pagadores) permanecem inalterados — divergência intencional
documentada em CLAUDE.md e CHANGELOG.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Parser ignorava texto livre entre o cabeçalho ## [versão] e a primeira
seção ###. Adicionado campo `summary` em ChangelogVersion e captura das
linhas de texto antes da primeira seção. ChangelogTab renderiza o resumo
logo abaixo do cabeçalho, antes das entradas técnicas.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
NEXT_PUBLIC_LOGO_DEV_TOKEN renomeado para LOGO_DEV_TOKEN — lido apenas
em runtime no servidor. URL construída nos endpoints /api/logo/mapping e
/api/logo/search; cliente nunca recebe o token. Novo server.ts com
isLogoDevEnabled() e buildLogoDevUrl(). LogoDevProvider (Context) propaga
flag `enabled` para Client Components. Build arg removido do Dockerfile
e do workflow docker-publish.yml.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Raio de borda global 0.625rem → 0.7rem; ajustes finos em --card e --border.
DotPattern removido do layout, tela de auth e landing page.
Account-card redesenhado (cores de saldo, tooltip de flags de exclusão).
Budget-card, card-item, calendário (day-cell, event-modal) com layout revisado.
Auth-card-shell simplificado (sem glassmorphism/blob). Landing page com
mainFeatures + extraFeatures em grid único e dark mode nos botões de CTA.
Imagens de preview da landing atualizadas. CSS --data-7..10 removidas.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Componentes da sidebar lateral (app-sidebar, nav-main, nav-secondary,
nav-user, nav-link), sidebar.tsx e use-mobile.ts removidos.
Barrel exports órfãos de shared/hooks, shared/components/providers,
shared/lib/schemas e shared/lib/types também removidos.
Navbar recebe ajustes menores de markup e acessibilidade.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Arquivos de queries, helpers e controllers dispersos na raiz de dashboard/
foram movidos para subdiretórios temáticos (bills/, invoices/, notes/,
notifications/, overview/, payments/, goals-progress/, categories/).
~25 widgets monolíticos obsoletos removidos em favor de nova arquitetura
baseada em widget-registry com components/widgets/. Novos componentes:
category-breakdown-chart/list, goals-progress-item, percentage-change-indicator.
Imports atualizados em fetch-dashboard-data e transaction-filters limpos.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Container do PostgreSQL falhava ao iniciar em instalações existentes
após atualização da imagem: o entrypoint passou a recusar dados no
caminho legado. Variável PGDATA fixa o caminho e preserva dados de
quem já tinha o volume populado.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
PR #42 trocou tabs por spaces no arquivo inteiro, quebrando o Biome.
Revertido pelo lint:fix para manter consistência com o resto do projeto.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
A tab foi introduzida no PR #42 mas não tinha TabsContent correspondente
e o value tinha typo ("intergrations") — UI vazia.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Baseado em análise do pg_stat_user_indexes (187 dias de estatísticas):
removidos 7 índices com 0 scans e adicionados 17 índices em foreign
keys que antes geravam sequential scans durante deletes nas tabelas pai.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit improves the visual design of the auth pages by adding a new layout wrapper with an animated blob background effect and updating the auth card shell with a glassmorphism style. It also updates the navigation items to use capitalized labels instead of lowercase for better readability.
NEXT_PUBLIC_* é inlined pelo Next.js em build time — a variável precisa
ser injetada via ARG no Dockerfile e build-args no workflow do CI.
Sem isso, o token fica undefined e os logos nunca são exibidos.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Nova tabela `establishment_logos` no schema (userId + nameKey → domain)
- Utilitários: `buildLogoDevUrl`, `toNameKey`, `logoQueryKeys`, `LOGO_DEV_TOKEN`
- `EstablishmentLogo`: exibe logo via Logo.dev com fallback para iniciais; hover mostra ícone de edição
- `EstablishmentLogoPicker`: popover para buscar e fixar domínio Logo.dev por estabelecimento
- API routes: `GET /api/logo/mapping` e `GET /api/logo/search`
- Server actions/queries para persistência do mapeamento por usuário
- CSP: libera `https://img.logo.dev` em `img-src`
- `.env.example`: variáveis `NEXT_PUBLIC_LOGO_DEV_TOKEN` e `LOGO_DEV_SECRET_KEY`
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- compose: removidos profiles, build e dependência de arquivo externo;
agora standalone com curl + docker compose up -d
- compose: variáveis opcionais movidas para .env via env_file
- entrypoint: extensão pgcrypto criada via Node.js antes das migrations
- entrypoint: loop de retry reescrito; removido hack @localhost→@db
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>