Quando o usuário adiciona uma nova linha de transação no dialog de múltiplos lançamentos,
a data agora é pré-preenchida com o valor da transação anterior em vez da data atual.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Adiciona arquivo display-names.ts com 433 nomes legiveis (ex: bb.png → "Banco do Brasil")
- Adiciona getLogoDisplayName() que consulta dicionario primeiro, com fallback para deriveNameFromLogo
- Adiciona normalizeForSearch() para busca accent-insensitive
- Atualiza account-dialog, card-dialog, logo-picker e use-logo-selection para usar a nova API
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Quando o usuario tenta fechar ou cancelar o dialogo de multiplos lancamentos
com dados ainda nao salvos, agora exibe um ConfirmActionDialog pedindo
confirmacao. Evita perda acidental de dados preenchidos.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Bump de dependências: next 16.2.6, react/react-dom 19.2.6, react-day-picker 10
(major), tailwindcss/postcss 4.3.0, tailwind-merge 3.6.0, better-auth 1.6.10,
ai-sdk (anthropic/google/openai), aws-sdk S3 3.1045, resend 6.12.3,
biome 2.4.15, knip 6.12.2, @types/node 25.6.2.
Changelog: número de versão em text-lg e padding do card de resumo aumentado
para p-6 para melhor leitura na linha do tempo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Toggle compacto R$/% no card 'Dividir lançamento' usando ToggleGroup do shadcn.
No modo %, cada input exibe o valor convertido em R$ logo abaixo (mesmo padrão
do InlinePeriodPicker). Helpers amountToPercent/percentToAmount reutilizam
safeToNumber, normalizeDecimalInput e formatDecimalForDbRequired.
Indicador de orçamento ao lado do nome da categoria selecionada: mostra
'R$ gasto de R$ orçado (%)' com cores semânticas (verde/âmbar/vermelho).
Busca assíncrona via getCategoryBudgetSummaryAction com cache por instância
(useRef<Map>) e cancelamento de race condition. Suprimido quando o input divide
a linha com o campo de tipo de transação (caso pré-lançamentos).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Novo filtro mín/máx de valor no sheet de filtros, com debounce (400ms) e
persistência via query string (amountMin/amountMax). Constantes AMOUNT_MIN_PARAM
e AMOUNT_MAX_PARAM extraídas para constants.ts; parsePositiveAmount exportado de
page-helpers e reutilizado pelo useDebouncedAmountFilter. A comparação do
debounce usa o valor normalizado para evitar roundtrips RSC desnecessários.
Botão 'Limpar' discreto ao lado do botão 'Filtros', visível apenas quando
há filtros ativos.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adicionado leftJoin(financialAccounts) + excludeTransactionsFromExcludedAccounts()
em 6 queries de payers/details.ts (totais do mês, histórico, uso de cartões, etc.)
e em fetchBudgetsForUser/fetchCategoryBudgetSummary de budgets/queries.ts.
Contas marcadas como excludeFromBalance (ex: Ajuste de saldo) não entram mais
nos cálculos de gasto, alinhando a tela de Pessoas, Orçamentos e o badge do modal.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Em recorrência, currentInstallment é undefined e o label usava 'parcela',
gerando 'Todas as pessoas desta parcela (undefined/3)'. Adiciona helpers
getPeriodLabel/getPeriodDescription que adaptam o texto para installment
vs recurring, seguindo o padrão das outras opções.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Filtros multi-seleção em lançamentos (condição, forma de pagamento, pessoa,
categoria, conta/cartão), changelog redesenhado como timeline colapsável com
detecção de bump e resumo, e diálogos migrados para as animações utilitárias
do tw-animate-css. Inclui ajustes de label no BulkActionDialog, refinamentos
visuais na landing page e atualização da navbar.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
No card e no modal de detalhes de anotações, onde não há interação
de marcação, tarefas não concluídas exibem RiSubtractLine em vez
do quadrado com borda. Locais interativos mantêm o comportamento atual.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adiciona prop indicatorClassName ao componente Progress. Orçamentos
estourados e cartões com 100% do limite utilizado exibem a barra
com indicador e fundo na cor destructive.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ao selecionar "Dinheiro" como forma de pagamento, exibe apenas contas
do tipo "Dinheiro". Transferências recebidas (amount > 0) passam a
exibir sinal + mantendo a cor azul.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adiciona "Dinheiro" (issue #50) e "Outros" à lista de tipos de conta.
Implementa AccountTypeSelectContent com ícones distintos por tipo via
getAccountTypeIcon em shared/utils/icons.tsx.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fetchCardTransactions não preenchia hasAttachments, então o ícone não
aparecia em /cards/[cardId]/invoice. Agora delega para
fetchTransactionsWithRelations, que já calcula o flag via EXISTS.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- dashboard: melhorias em métricas, filtros de transações e overview de período
- transactions: colunas, tabela e página com novos campos e ajustes de exibição
- ui: card, table, navigation-menu, navbar, month-picker, logo-picker, theme-toggler
- calculator: ajustes de display, keypad e estado
- calendar: melhorias de grid e day-cell
- insights: atualização de constantes
- settings: pequenos ajustes
- pnpm-lock: atualização de dependências
- pdf.worker: atualização do worker
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Remove a seção "Veja o que você pode fazer" com o componente ScreenshotTabs,
as 14 imagens preview-*.webp, o link #telas do nav e o export pwaCompatList sem uso.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Intl.DateTimeFormat sem timeZone usava o fuso do servidor (UTC) no SSR
e o fuso do browser (BRT) no cliente, causando erro de hidratação.
Ambos os formatters passam a usar timeZone: "America/Sao_Paulo" explicitamente.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- nome do boleto virou link para /transactions?q=<nome>
- quando o período selecionado não é o atual, inclui ?periodo=<mes-ano> na URL
- ícone RiExternalLinkLine ao lado do nome, mesmo padrão do widget de faturas
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- widget de faturas abre modal com seleção de conta de origem e data antes de pagar
- widget de boletos ganha a mesma paridade: modal com conta de pagamento e data
- toggleTransactionSettlementAction aceita paymentAccountId e paymentDate opcionais
- DashboardBill expõe accountId para inicializar o modal com a conta já vinculada
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 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>
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>
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>
- 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>