diff --git a/CHANGELOG.md b/CHANGELOG.md index 325e6cf..969eda0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ e este projeto adere ao [Versionamento Semântico](https://semver.org/lang/pt-BR ## [2.4.2] - 2026-04-20 -Esta versão é quase toda sobre organização e polimento. O código interno do Dashboard foi reestruturado — módulos espalhados pela raiz da feature foram agrupados em subdiretórios coesos e a arquitetura de widgets foi renovada com um novo `widget-registry`. A sidebar lateral foi aposentada em favor de uma navegação concentrada na navbar. A interface passou por um refinamento visual amplo: cards redesenhados, dark mode mais consistente e efeitos decorativos removidos para uma composição mais limpa. As imagens de preview da landing page foram atualizadas. Por fim, a integração com Logo.dev ganhou uma arquitetura mais segura — o token agora é lido apenas no servidor e nunca chega ao cliente. +Esta versão é quase toda sobre organização e polimento. O código interno do Dashboard foi reestruturado — módulos espalhados pela raiz da feature foram agrupados em subdiretórios coesos e a arquitetura de widgets foi renovada com um novo `widget-registry`. A sidebar lateral foi aposentada em favor de uma navegação concentrada na navbar. A interface passou por um refinamento visual amplo: cards redesenhados, dark mode mais consistente e efeitos decorativos removidos para uma composição mais limpa. As imagens de preview da landing page foram atualizadas. Por fim, a integração com Logo.dev ganhou uma arquitetura mais segura — o token agora é lido apenas no servidor e nunca chega ao cliente. O conceito de "Pagador" foi renomeado para "Pessoa" em toda a interface. ### Adicionado @@ -29,6 +29,7 @@ Esta versão é quase toda sobre organização e polimento. O código interno do - Landing: imagens de preview atualizadas; `mainFeatures` + `extraFeatures` unificados em grid único; dark mode nos botões de CTA - Navbar: dark mode corrigido no navbar-shell (`dark:bg-card`, `dark:border-b-border/60`) - Logo.dev: `NEXT_PUBLIC_LOGO_DEV_TOKEN` renomeado para `LOGO_DEV_TOKEN` (agora lido em runtime server-side apenas) +- UI: conceito "Pagador/Pagadores" renomeado para **"Pessoa/Pessoas"** em toda a interface — labels, títulos, toasts, mensagens de erro, cabeçalhos de tabela e exportações. Código, rotas (`/payers`) e schema do banco (`pagadores`) permanecem inalterados; a divergência entre UI e código é intencional - Deps: next 16.2.3 → 16.2.4, better-auth 1.6.2 → 1.6.5, ai 6.0.159 → 6.0.168 e outros patches menores ### Removido diff --git a/CLAUDE.md b/CLAUDE.md index 39c301a..35ccaa9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -217,7 +217,9 @@ Layouts, `loading.tsx` e metadata continuam em `src/app/`. | `contas` | `accounts` | | `categorias` | `categories` | | `orcamentos` | `budgets` | -| `pagadores` | `payers` | +| `pessoas` | `payers` | + +> **Nota:** o conceito de "pagador" foi renomeado para **"pessoa"** na UI (labels, toasts, textos visíveis ao usuário). O código, rotas e schema continuam usando o termo original em inglês (`payer`, `payerId`, `adminPayerId`) e em português interno (`pagador` como variável). Não renomear esses identificadores — a divergência entre UI e código é intencional e documentada. | `anotacoes` | `notes` | | `calendario` | `calendar` | | `ajustes` | `settings` | diff --git a/src/app/(dashboard)/payers/layout.tsx b/src/app/(dashboard)/payers/layout.tsx index 5131b00..a76c6ad 100644 --- a/src/app/(dashboard)/payers/layout.tsx +++ b/src/app/(dashboard)/payers/layout.tsx @@ -2,7 +2,7 @@ import { RiGroupLine } from "@remixicon/react"; import PageDescription from "@/shared/components/page-description"; export const metadata = { - title: "Pagadores", + title: "Pessoas", }; export default function RootLayout({ @@ -14,7 +14,7 @@ export default function RootLayout({
} - title="Pagadores" + title="Pessoas" subtitle="Gerencie as pessoas ou entidades responsáveis pelos pagamentos." /> {children} diff --git a/src/app/(dashboard)/payers/loading.tsx b/src/app/(dashboard)/payers/loading.tsx index 694a434..9269133 100644 --- a/src/app/(dashboard)/payers/loading.tsx +++ b/src/app/(dashboard)/payers/loading.tsx @@ -1,7 +1,7 @@ import { Skeleton } from "@/shared/components/ui/skeleton"; /** - * Loading state para a página de pagadores + * Loading state para a página de pessoas * Layout: Header + Input de compartilhamento + Grid de cards */ export default function PagadoresLoading() { @@ -17,7 +17,7 @@ export default function PagadoresLoading() { - {/* Grid de cards de pagadores */} + {/* Grid de cards de pessoas */}
{Array.from({ length: 6 }).map((_, i) => (
diff --git a/src/features/accounts/actions.ts b/src/features/accounts/actions.ts index 56db01b..bb8f0e7 100644 --- a/src/features/accounts/actions.ts +++ b/src/features/accounts/actions.ts @@ -99,7 +99,7 @@ export async function createAccountAction( if (hasInitialBalance && !adminPayerId) { throw new Error( - "Pagador com papel administrador não encontrado. Crie um pagador admin antes de definir um saldo inicial.", + "Pessoa com papel administrador não encontrado. Crie um pessoa admin antes de definir um saldo inicial.", ); } @@ -299,7 +299,7 @@ export async function transferBetweenAccountsAction( if (!adminPayerId) { throw new Error( - "Pagador administrador não encontrado. Por favor, crie um pagador admin.", + "Pessoa administrador não encontrado. Por favor, crie um pessoa admin.", ); } diff --git a/src/features/accounts/components/account-statement-card.tsx b/src/features/accounts/components/account-statement-card.tsx index fe38f53..ca322a4 100644 --- a/src/features/accounts/components/account-statement-card.tsx +++ b/src/features/accounts/components/account-statement-card.tsx @@ -123,7 +123,7 @@ export function AccountStatementCard({ {formatCurrency(totalExpenses)} diff --git a/src/features/dashboard/components/dashboard-metrics-cards.tsx b/src/features/dashboard/components/dashboard-metrics-cards.tsx index 0eaa89b..47fe35c 100644 --- a/src/features/dashboard/components/dashboard-metrics-cards.tsx +++ b/src/features/dashboard/components/dashboard-metrics-cards.tsx @@ -38,7 +38,7 @@ const CARDS = [ helpTitle: "Como calculamos receitas", helpLines: [ "Somamos os lançamentos do tipo Receita no período selecionado.", - "Consideramos lançamentos efetivados e não efetivados do pagador principal (admin).", + "Consideramos lançamentos efetivados e não efetivados da pessoa principal (admin).", "Movimentações de contas marcadas como não consideradas no saldo total ficam fora deste card.", "Não entram transferências internas nem lançamentos automáticos de fatura.", "Saldo inicial também fica fora quando a conta está marcada para desconsiderá-lo das receitas.", @@ -54,7 +54,7 @@ const CARDS = [ helpTitle: "Como calculamos despesas", helpLines: [ "Somamos os lançamentos do tipo Despesa no período selecionado.", - "Consideramos lançamentos efetivados e não efetivados do pagador principal (admin).", + "Consideramos lançamentos efetivados e não efetivados da pessoa principal (admin).", "Movimentações de contas marcadas como não consideradas no saldo total ficam fora deste card.", "Não entram transferências internas nem lançamentos automáticos de fatura.", "O valor mostrado é a saída efetiva do período, sempre em número positivo no card.", diff --git a/src/features/dashboard/components/invoices/invoice-list-item.tsx b/src/features/dashboard/components/invoices/invoice-list-item.tsx index 2a33135..3c08a97 100644 --- a/src/features/dashboard/components/invoices/invoice-list-item.tsx +++ b/src/features/dashboard/components/invoices/invoice-list-item.tsx @@ -86,7 +86,7 @@ export function InvoiceListItem({ invoice, onPay }: InvoiceListItemProps) { {linkNode}

- Distribuição por pagador + Distribuição por pessoa

    {breakdown.map((share, index) => ( diff --git a/src/features/dashboard/components/widgets/payers-widget.tsx b/src/features/dashboard/components/widgets/payers-widget.tsx index ad1ca29..0c51600 100644 --- a/src/features/dashboard/components/widgets/payers-widget.tsx +++ b/src/features/dashboard/components/widgets/payers-widget.tsx @@ -28,8 +28,8 @@ export function PayersWidget({ payers }: PayersWidgetProps) { {payers.length === 0 ? ( } - title="Nenhum pagador para o período" - description="Quando houver despesas associadas a pagadores, eles aparecerão aqui." + title="Nenhuma pessoa para o período" + description="Quando houver despesas associadas a pessoas, elas aparecerão aqui." /> ) : (
    diff --git a/src/features/dashboard/expenses/installment-analysis-queries.ts b/src/features/dashboard/expenses/installment-analysis-queries.ts index f565ff7..427d903 100644 --- a/src/features/dashboard/expenses/installment-analysis-queries.ts +++ b/src/features/dashboard/expenses/installment-analysis-queries.ts @@ -71,7 +71,7 @@ export async function fetchInstallmentAnalysis( return { installmentGroups: [], totalPendingInstallments: 0 }; } - // 1. Buscar todos os lançamentos parcelados não antecipados do pagador admin + // 1. Buscar todos os lançamentos parcelados não antecipados da pessoa admin const installmentRows = await db .select({ id: transactions.id, diff --git a/src/features/dashboard/invoices/invoices-queries.ts b/src/features/dashboard/invoices/invoices-queries.ts index 6582ab9..b3037fb 100644 --- a/src/features/dashboard/invoices/invoices-queries.ts +++ b/src/features/dashboard/invoices/invoices-queries.ts @@ -244,7 +244,7 @@ export async function fetchDashboardInvoices( } const payerId = row.payerId ?? null; - const pagadorName = row.pagadorName?.trim() || "Sem pagador"; + const pagadorName = row.pagadorName?.trim() || "Sem pessoa"; const pagadorAvatar = row.pagadorAvatar ?? null; const payerKey = payerId ?? "__without-payer__"; const key = `${row.cardId}:${payerKey}`; diff --git a/src/features/dashboard/widget-registry/widget-config.tsx b/src/features/dashboard/widget-registry/widget-config.tsx index 287949a..1df0a2d 100644 --- a/src/features/dashboard/widget-registry/widget-config.tsx +++ b/src/features/dashboard/widget-registry/widget-config.tsx @@ -251,8 +251,8 @@ export const widgetsConfig: WidgetConfig[] = [ }, { id: "pagadores", - title: "Pagadores", - subtitle: "Despesas por pagador no período", + title: "Pessoas", + subtitle: "Despesas por pessoa no período", icon: , component: ({ data }) => ( diff --git a/src/features/payers/actions.ts b/src/features/payers/actions.ts index df836f6..e867001 100644 --- a/src/features/payers/actions.ts +++ b/src/features/payers/actions.ts @@ -34,9 +34,9 @@ const statusEnum = z const baseSchema = z.object({ name: z - .string({ message: "Informe o nome do pagador." }) + .string({ message: "Informe o nome da pessoa." }) .trim() - .min(1, "Informe o nome do pagador."), + .min(1, "Informe o nome da pessoa."), email: z .string() .trim() @@ -110,7 +110,7 @@ export async function createPayerAction( revalidate(user.id); - return { success: true, message: "Payer criado com sucesso." }; + return { success: true, message: "Pessoa criada com sucesso." }; } catch (error) { return handleActionError(error); } @@ -130,7 +130,7 @@ export async function updatePayerAction( if (!existing) { return { success: false, - error: "Pagador não encontrado.", + error: "Pessoa não encontrada.", }; } @@ -160,7 +160,7 @@ export async function updatePayerAction( revalidate(currentUser.id); - return { success: true, message: "Payer atualizado com sucesso." }; + return { success: true, message: "Pessoa atualizada com sucesso." }; } catch (error) { return handleActionError(error); } @@ -180,14 +180,14 @@ export async function deletePayerAction( if (!existing) { return { success: false, - error: "Pagador não encontrado.", + error: "Pessoa não encontrada.", }; } if (existing.role === PAYER_ROLE_ADMIN) { return { success: false, - error: "Pagadores administradores não podem ser removidos.", + error: "Pessoas administradoras não podem ser removidas.", }; } @@ -197,7 +197,7 @@ export async function deletePayerAction( revalidate(user.id); - return { success: true, message: "Payer removido com sucesso." }; + return { success: true, message: "Pessoa removida com sucesso." }; } catch (error) { return handleActionError(error); } @@ -221,7 +221,7 @@ export async function joinPayerByShareCodeAction( if (pagadorRow.userId === user.id) { return { success: false, - error: "Você já é o proprietário deste pagador.", + error: "Você já é o proprietário desta entidade pagadora.", }; } @@ -235,7 +235,7 @@ export async function joinPayerByShareCodeAction( if (existingShare) { return { success: false, - error: "Você já possui acesso a este pagador.", + error: "Você já possui acesso a esta pessoa.", }; } @@ -248,7 +248,7 @@ export async function joinPayerByShareCodeAction( revalidate(user.id); - return { success: true, message: "Payer adicionado à sua lista." }; + return { success: true, message: "Pessoa adicionada à sua lista." }; } catch (error) { return handleActionError(error); } @@ -313,7 +313,7 @@ export async function regeneratePayerShareCodeAction( }); if (!existing) { - return { success: false, error: "Payer não encontrado." }; + return { success: false, error: "Pessoa não encontrada." }; } let attempts = 0; diff --git a/src/features/payers/components/details/payer-header-card.tsx b/src/features/payers/components/details/payer-header-card.tsx index acb9ec5..1f1d033 100644 --- a/src/features/payers/components/details/payer-header-card.tsx +++ b/src/features/payers/components/details/payer-header-card.tsx @@ -66,7 +66,7 @@ export function PayerHeaderCard({ const openConfirmDialog = () => { if (!payer.email) { - toast.error("Cadastre um e-mail para este pagador antes de enviar."); + toast.error("Cadastre um e-mail para esta pessoa antes de enviar."); return; } setConfirmOpen(true); @@ -74,7 +74,7 @@ export function PayerHeaderCard({ const handleSendSummary = () => { if (!payer.email) { - toast.error("Cadastre um e-mail para este pagador antes de enviar."); + toast.error("Cadastre um e-mail para esta pessoa antes de enviar."); return; } diff --git a/src/features/payers/components/details/payer-history-card.tsx b/src/features/payers/components/details/payer-history-card.tsx index 82ff394..fd19f1a 100644 --- a/src/features/payers/components/details/payer-history-card.tsx +++ b/src/features/payers/components/details/payer-history-card.tsx @@ -67,7 +67,7 @@ export function PayerHistoryCard({ data }: PagadorHistoryCardProps) { Evolução (últimos 6 meses)

    - Despesas registradas para este pagador ao longo do tempo. + Despesas registradas para esta pessoa ao longo do tempo.

    diff --git a/src/features/payers/components/details/payer-info-card.tsx b/src/features/payers/components/details/payer-info-card.tsx index 2213aa1..33afea3 100644 --- a/src/features/payers/components/details/payer-info-card.tsx +++ b/src/features/payers/components/details/payer-info-card.tsx @@ -32,7 +32,7 @@ export function PagadorInfoCard({ payer }: PayerInfoCardProps) { - Detalhes do pagador + Detalhes da pessoa {showSensitiveDetails @@ -106,7 +106,7 @@ export function PagadorInfoCard({ payer }: PayerInfoCardProps) { const resolveRoleLabel = (role: string | null) => { if (role === PAYER_ROLE_ADMIN) return "Administrador"; - return "Pagador"; + return "Pessoa"; }; type InfoItemProps = { diff --git a/src/features/payers/components/details/payer-sharing-card.tsx b/src/features/payers/components/details/payer-sharing-card.tsx index 15908f8..3c963cc 100644 --- a/src/features/payers/components/details/payer-sharing-card.tsx +++ b/src/features/payers/components/details/payer-sharing-card.tsx @@ -89,7 +89,7 @@ export function PayerSharingCard({

    Compartilhe o código abaixo com outra pessoa. Ela poderá adicioná-lo - na página de pagadores usando a opção Adicionar por código para ter + na página de pessoas usando a opção Adicionar por código para ter acesso somente leitura.

    diff --git a/src/features/payers/components/payer-dialog.tsx b/src/features/payers/components/payer-dialog.tsx index b68330a..35b2cd6 100644 --- a/src/features/payers/components/payer-dialog.tsx +++ b/src/features/payers/components/payer-dialog.tsx @@ -182,7 +182,7 @@ export function PayerDialog({ const payerId = payer?.id; if (mode === "update" && !payerId) { - const message = "Pagador inválido."; + const message = "Pessoa inválida."; setErrorMessage(message); toast.error(message); return; @@ -216,13 +216,12 @@ export function PayerDialog({ }); }; - const title = mode === "create" ? "Novo pagador" : "Editar pagador"; + const title = mode === "create" ? "Nova pessoa" : "Editar pessoa"; const description = mode === "create" - ? "Selecione um avatar e informe os detalhes para criar um novo pagador." - : "Atualize os detalhes do pagador selecionado."; - const submitLabel = - mode === "create" ? "Salvar pagador" : "Atualizar pagador"; + ? "Selecione um avatar e informe os detalhes para criar uma nova pessoa." + : "Atualize os detalhes da pessoa selecionada."; + const submitLabel = mode === "create" ? "Salvar pessoa" : "Atualizar pessoa"; const isUploadSelected = uploadedAvatar !== null && formState.avatarUrl === uploadedAvatar; @@ -388,7 +387,7 @@ export function PayerDialog({ id="payer-note" value={formState.note} onChange={(event) => updateField("note", event.target.value)} - placeholder="Observações sobre este pagador" + placeholder="Observações sobre esta pessoa" />
diff --git a/src/features/payers/components/payers-page.tsx b/src/features/payers/components/payers-page.tsx index 77247d4..c01ed49 100644 --- a/src/features/payers/components/payers-page.tsx +++ b/src/features/payers/components/payers-page.tsx @@ -60,7 +60,7 @@ export function PayersPage({ payers, avatarOptions }: PayersPageProps) { const handleRemoveRequest = (payer: Payer) => { if (payer.role === PAYER_ROLE_ADMIN) { - toast.error("Pagadores administradores não podem ser removidos."); + toast.error("Pessoas administradoras não podem ser removidas."); return; } setPayerToRemove(payer); @@ -91,8 +91,8 @@ export function PayersPage({ payers, avatarOptions }: PayersPageProps) { }; const removeTitle = payerToRemove - ? `Remover pagador "${payerToRemove.name}"?` - : "Remover pagador?"; + ? `Remover pessoa "${payerToRemove.name}"?` + : "Remover pessoa?"; const handleJoinByCode = (event: React.FormEvent) => { event.preventDefault(); @@ -127,7 +127,7 @@ export function PayersPage({ payers, avatarOptions }: PayersPageProps) { trigger={ } /> @@ -151,7 +151,7 @@ export function PayersPage({ payers, avatarOptions }: PayersPageProps) { {orderedPayers.length === 0 ? (
- Cadastre seu primeiro pagador para organizar cobranças e + Cadastre seu primeira pessoa para organizar cobranças e pagamentos recorrentes.
@@ -185,8 +185,8 @@ export function PayersPage({ payers, avatarOptions }: PayersPageProps) { open={removeOpen && !!payerToRemove} onOpenChange={handleRemoveOpenChange} title={removeTitle} - description="Ao remover este pagador, os registros relacionados a ele deixarão de ser associados automaticamente." - confirmLabel="Remover pagador" + description="Ao remover esta pessoa, os registros relacionados a ele deixarão de ser associados automaticamente." + confirmLabel="Remover pessoa" pendingLabel="Removendo..." confirmVariant="destructive" onConfirm={handleRemoveConfirm} diff --git a/src/features/payers/detail-actions.ts b/src/features/payers/detail-actions.ts index 633e1ac..b253517 100644 --- a/src/features/payers/detail-actions.ts +++ b/src/features/payers/detail-actions.ts @@ -19,7 +19,7 @@ import { formatDateTime } from "@/shared/utils/date"; import { displayPeriod } from "@/shared/utils/period"; const inputSchema = z.object({ - payerId: z.string().uuid("Payer inválido."), + payerId: z.string().uuid("Pessoa inválida."), period: z .string() .regex(/^\d{4}-\d{2}$/, "Período inválido. Informe no formato AAAA-MM."), @@ -404,7 +404,7 @@ export async function sendPayerSummaryAction( }); if (!pagadorRow) { - return { success: false, error: "Pagador não encontrado." }; + return { success: false, error: "Pessoa não encontrada." }; } if (!pagadorRow.email) { diff --git a/src/features/settings/actions.ts b/src/features/settings/actions.ts index 15ce1a8..5b0eec6 100644 --- a/src/features/settings/actions.ts +++ b/src/features/settings/actions.ts @@ -81,7 +81,7 @@ async function resetUserAppData( const payerName = (user.name && user.name.trim().length > 0 ? user.name.trim() - : normalizeNameFromEmail(user.email)) || "Payer principal"; + : normalizeNameFromEmail(user.email)) || "Pessoa principal"; const avatarUrl = user.image ?? DEFAULT_PAYER_AVATAR; const defaultPayerStatus = PAYER_STATUS_OPTIONS[0]; @@ -176,7 +176,7 @@ export async function updateNameAction( .set({ name: fullName }) .where(eq(schema.user.id, session.user.id)); - // Sincronizar nome com o pagador admin + // Sincronizar nome com o pessoa admin if (adminPayerId) { await db .update(payers) diff --git a/src/features/settings/components/delete-account-form.tsx b/src/features/settings/components/delete-account-form.tsx index 49ea397..a3d6200 100644 --- a/src/features/settings/components/delete-account-form.tsx +++ b/src/features/settings/components/delete-account-form.tsx @@ -94,12 +94,12 @@ export function DeleteAccountForm() {
  • Lançamentos, faturas, antecipações e pré-lançamentos
  • Contas, cartões, orçamentos e anotações
  • -
  • Pagadores próprios e compartilhamentos recebidos
  • +
  • Pessoas próprios e compartilhamentos recebidos
  • Preferências do app, insights salvos e tokens do Companion
  • - Categorias padrão e pagador admin serão recriados + Categorias padrão e pessoa admin serão recriadas automaticamente
@@ -130,7 +130,7 @@ export function DeleteAccountForm() {
  • Lançamentos, orçamentos e anotações
  • Contas, cartões e categorias
  • -
  • Pagadores, credenciais e configurações
  • +
  • Pessoas, credenciais e configurações
  • Resumindo, sua conta irá de arrasta pra cima!
  • diff --git a/src/features/transactions/actions/bulk-actions.ts b/src/features/transactions/actions/bulk-actions.ts index 6d04a79..5bb44b0 100644 --- a/src/features/transactions/actions/bulk-actions.ts +++ b/src/features/transactions/actions/bulk-actions.ts @@ -602,7 +602,7 @@ export async function createMassTransactionsAction( if (transaction.payerId && invalidPayers.has(transaction.payerId)) { return { success: false, - error: `Payer não encontrado na transação ${i + 1}.`, + error: `Pessoa não encontrado na transação ${i + 1}.`, }; } if ( @@ -611,7 +611,7 @@ export async function createMassTransactionsAction( ) { return { success: false, - error: `Category não encontrada na transação ${i + 1}.`, + error: `Categoria não encontrada na transação ${i + 1}.`, }; } } diff --git a/src/features/transactions/actions/core.ts b/src/features/transactions/actions/core.ts index 089d4fc..bcfecf7 100644 --- a/src/features/transactions/actions/core.ts +++ b/src/features/transactions/actions/core.ts @@ -189,8 +189,8 @@ export async function validateAllOwnership( ]; const errors = [ - "Pagador não encontrado ou sem permissão.", - "Pagador secundário não encontrado ou sem permissão.", + "Pessoa não encontrada ou sem permissão.", + "Pessoa secundário não encontrado ou sem permissão.", "Categoria não encontrada.", "Conta não encontrada.", "Cartão não encontrado.", @@ -359,7 +359,7 @@ const refineLancamento = ( ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["payerId"], - message: "Selecione o pagador principal para dividir o lançamento.", + message: "Selecione a pessoa principal para dividir o lançamento.", }); } @@ -367,13 +367,13 @@ const refineLancamento = ( ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["secondaryPayerId"], - message: "Selecione o pagador secundário para dividir o lançamento.", + message: "Selecione a pessoa secundário para dividir o lançamento.", }); } else if (data.payerId && data.secondaryPayerId === data.payerId) { ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["secondaryPayerId"], - message: "Escolha um pagador diferente para dividir o lançamento.", + message: "Escolha uma pessoa diferente para dividir o lançamento.", }); } diff --git a/src/features/transactions/actions/import-action.ts b/src/features/transactions/actions/import-action.ts index 2d6d624..599c8b9 100644 --- a/src/features/transactions/actions/import-action.ts +++ b/src/features/transactions/actions/import-action.ts @@ -84,7 +84,7 @@ export async function importTransactionsAction( validateCartaoOwnership(userId, cardId), ]); - if (!payerOk) return { success: false, error: "Pagador não encontrado." }; + if (!payerOk) return { success: false, error: "Pessoa não encontrada." }; if (!accountOk) return { success: false, error: "Conta não encontrada." }; if (!cardOk) return { success: false, error: "Cartão não encontrado." }; diff --git a/src/features/transactions/anticipation-actions.ts b/src/features/transactions/anticipation-actions.ts index 43b9766..7fe9403 100644 --- a/src/features/transactions/anticipation-actions.ts +++ b/src/features/transactions/anticipation-actions.ts @@ -159,7 +159,7 @@ export async function createInstallmentAnticipationAction( if (data.payerId && payer.length === 0) { return { success: false, - error: "Pagador inválido para esta conta.", + error: "Pessoa inválida para esta conta.", }; } diff --git a/src/features/transactions/column-order.ts b/src/features/transactions/column-order.ts index d22b317..8c2f02b 100644 --- a/src/features/transactions/column-order.ts +++ b/src/features/transactions/column-order.ts @@ -21,7 +21,7 @@ export const LANCAMENTOS_COLUMN_LABELS: Record = { condition: "Condição", paymentMethod: "Forma de Pagamento", categoriaName: "Categoria", - pagadorName: "Pagador", + pagadorName: "Pessoa", note: "Anotação", contaCartao: "Conta/Cartão", }; diff --git a/src/features/transactions/components/dialogs/anticipate-installments-dialog/anticipate-installments-dialog.tsx b/src/features/transactions/components/dialogs/anticipate-installments-dialog/anticipate-installments-dialog.tsx index 910bf26..1c109f9 100644 --- a/src/features/transactions/components/dialogs/anticipate-installments-dialog/anticipate-installments-dialog.tsx +++ b/src/features/transactions/components/dialogs/anticipate-installments-dialog/anticipate-installments-dialog.tsx @@ -269,7 +269,7 @@ export function AnticipateInstallmentsDialog({ - Pagador + Pessoa - + {payerId && (() => { const selectedOption = payerOptions.find( diff --git a/src/features/transactions/components/dialogs/mass-add-dialog.tsx b/src/features/transactions/components/dialogs/mass-add-dialog.tsx index 533fd4e..7848dc3 100644 --- a/src/features/transactions/components/dialogs/mass-add-dialog.tsx +++ b/src/features/transactions/components/dialogs/mass-add-dialog.tsx @@ -525,7 +525,7 @@ export function MassAddDialog({ htmlFor={`pagador-${transaction.id}`} className="sr-only" > - Pagador {index + 1} + Pessoa {index + 1} - {/* Pagador */} + {/* Pessoa */}
    - + diff --git a/src/features/transactions/components/transactions-export.tsx b/src/features/transactions/components/transactions-export.tsx index ade5c7a..deede3c 100644 --- a/src/features/transactions/components/transactions-export.tsx +++ b/src/features/transactions/components/transactions-export.tsx @@ -109,7 +109,7 @@ export function TransactionsExport({ "Valor", "Category", "Conta/Cartão", - "Payer", + "Pessoa", ]; const rows: string[][] = []; @@ -169,7 +169,7 @@ export function TransactionsExport({ "Valor", "Category", "Conta/Cartão", - "Payer", + "Pessoa", ]; const rows: (string | number)[][] = []; @@ -277,7 +277,7 @@ export function TransactionsExport({ "Valor", "Categoria", "Conta/Cartão", - "Payer", + "Pessoa", ], ]; @@ -317,7 +317,7 @@ export function TransactionsExport({ 5: { cellWidth: 24 }, // Valor 6: { cellWidth: 30 }, // Categoria 7: { cellWidth: 30 }, // Conta/Cartão - 8: { cellWidth: 31 }, // Payer + 8: { cellWidth: 31 }, // Pessoa }, didParseCell: (cellData) => { if (cellData.section === "body" && cellData.column.index === 5) { diff --git a/src/shared/components/navigation/navbar/nav-items.tsx b/src/shared/components/navigation/navbar/nav-items.tsx index d31d45b..4d4a4e6 100644 --- a/src/shared/components/navigation/navbar/nav-items.tsx +++ b/src/shared/components/navigation/navbar/nav-items.tsx @@ -92,7 +92,7 @@ export const NAV_SECTIONS: NavSection[] = [ items: [ { href: "/payers", - label: "Pagadores", + label: "Pessoas", description: "Gerencie quem divide as despesas", icon: , iconClass: "text-primary", diff --git a/src/shared/components/skeletons/transactions-table-skeleton.tsx b/src/shared/components/skeletons/transactions-table-skeleton.tsx index fd66394..1523d4e 100644 --- a/src/shared/components/skeletons/transactions-table-skeleton.tsx +++ b/src/shared/components/skeletons/transactions-table-skeleton.tsx @@ -24,7 +24,7 @@ export function TransactionsTableSkeleton() { Valor Condição Pagamento - Pagador + Pessoa Categoria Conta/Cartão Ações diff --git a/src/shared/lib/payers/defaults.ts b/src/shared/lib/payers/defaults.ts index d9d1137..4a6c27a 100644 --- a/src/shared/lib/payers/defaults.ts +++ b/src/shared/lib/payers/defaults.ts @@ -36,7 +36,7 @@ export async function ensureDefaultPagadorForUser(user: SeedUserLike) { const name = (user.name && user.name.trim().length > 0 ? user.name.trim() - : normalizeNameFromEmail(user.email)) || "Payer principal"; + : normalizeNameFromEmail(user.email)) || "Pessoa principal"; // Usa a imagem do Google se disponível, senão usa o avatar padrão const avatarUrl = user.image ?? DEFAULT_PAYER_AVATAR; diff --git a/src/shared/lib/payers/utils.ts b/src/shared/lib/payers/utils.ts index 45941b4..3f0023b 100644 --- a/src/shared/lib/payers/utils.ts +++ b/src/shared/lib/payers/utils.ts @@ -53,11 +53,11 @@ export const normalizeNameFromEmail = ( email: string | null | undefined, ): string => { if (!email) { - return "Novo pagador"; + return "Nova pessoa"; } const [local] = email.split("@"); if (!local) { - return "Novo pagador"; + return "Nova pessoa"; } return local .split(".")