refactor: alinha features financeiras ao novo naming

This commit is contained in:
Felipe Coutinho
2026-03-14 12:50:55 +00:00
parent ef918a3667
commit 67ad4b9d02
51 changed files with 876 additions and 898 deletions

View File

@@ -9,20 +9,20 @@ import {
fetchAccountSummary,
} from "@/features/accounts/statement-queries";
import { fetchUserPreferences } from "@/features/settings/queries";
import { LancamentosPage as LancamentosSection } from "@/features/transactions/components/page/transactions-page";
import { TransactionsPage as LancamentosSection } from "@/features/transactions/components/page/transactions-page";
import {
buildLancamentoWhere,
buildTransactionWhere,
buildOptionSets,
buildSluggedFilters,
buildSlugMaps,
extractLancamentoSearchFilters,
extractTransactionSearchFilters,
getSingleParam,
mapLancamentosData,
mapTransactionsData,
type ResolvedSearchParams,
} from "@/features/transactions/page-helpers";
import {
fetchLancamentoFilterSources,
fetchRecentEstablishments,
fetchTransactionFilterSources,
} from "@/features/transactions/queries";
import MonthNavigation from "@/shared/components/month-picker/month-navigation";
import { Button } from "@/shared/components/ui/button";
@@ -41,7 +41,7 @@ const capitalize = (value: string) =>
value.length > 0 ? value[0]?.toUpperCase().concat(value.slice(1)) : value;
export default async function Page({ params, searchParams }: PageProps) {
const { accountId: contaId } = await params;
const { accountId } = await params;
const userId = await getUserId();
const resolvedSearchParams = searchParams ? await searchParams : undefined;
@@ -52,9 +52,9 @@ export default async function Page({ params, searchParams }: PageProps) {
year,
} = parsePeriodParam(periodoParamRaw);
const searchFilters = extractLancamentoSearchFilters(resolvedSearchParams);
const searchFilters = extractTransactionSearchFilters(resolvedSearchParams);
const account = await fetchAccountData(userId, contaId);
const account = await fetchAccountData(userId, accountId);
if (!account) {
notFound();
@@ -67,16 +67,16 @@ export default async function Page({ params, searchParams }: PageProps) {
estabelecimentos,
userPreferences,
] = await Promise.all([
fetchLancamentoFilterSources(userId),
fetchTransactionFilterSources(userId),
loadLogoOptions(),
fetchAccountSummary(userId, contaId, selectedPeriod),
fetchAccountSummary(userId, accountId, selectedPeriod),
fetchRecentEstablishments(userId),
fetchUserPreferences(userId),
]);
const sluggedFilters = buildSluggedFilters(filterSources);
const slugMaps = buildSlugMaps(sluggedFilters);
const filters = buildLancamentoWhere({
const filters = buildTransactionWhere({
userId,
period: selectedPeriod,
filters: searchFilters,
@@ -84,9 +84,9 @@ export default async function Page({ params, searchParams }: PageProps) {
accountId: account.id,
});
const lancamentoRows = await fetchAccountLancamentos(filters);
const transactionRows = await fetchAccountLancamentos(filters);
const lancamentosData = mapLancamentosData(lancamentoRows);
const transactionData = mapTransactionsData(transactionRows);
const { openingBalance, currentBalance, totalIncomes, totalExpenses } =
accountSummary;
@@ -105,18 +105,18 @@ export default async function Page({ params, searchParams }: PageProps) {
};
const {
pagadorOptions,
splitPagadorOptions,
defaultPagadorId,
contaOptions,
cartaoOptions,
categoriaOptions,
pagadorFilterOptions,
categoriaFilterOptions,
contaCartaoFilterOptions,
payerOptions,
splitPayerOptions,
defaultPayerId,
accountOptions,
cardOptions,
categoryOptions,
payerFilterOptions,
categoryFilterOptions,
accountCardFilterOptions,
} = buildOptionSets({
...sluggedFilters,
pagadorRows: filterSources.pagadorRows,
payerRows: filterSources.payerRows,
limitContaId: account.id,
});
@@ -157,21 +157,21 @@ export default async function Page({ params, searchParams }: PageProps) {
<section className="flex flex-col gap-4">
<LancamentosSection
currentUserId={userId}
lancamentos={lancamentosData}
pagadorOptions={pagadorOptions}
splitPagadorOptions={splitPagadorOptions}
defaultPagadorId={defaultPagadorId}
contaOptions={contaOptions}
cartaoOptions={cartaoOptions}
categoriaOptions={categoriaOptions}
pagadorFilterOptions={pagadorFilterOptions}
categoriaFilterOptions={categoriaFilterOptions}
contaCartaoFilterOptions={contaCartaoFilterOptions}
transactions={transactionData}
payerOptions={payerOptions}
splitPayerOptions={splitPayerOptions}
defaultPayerId={defaultPayerId}
accountOptions={accountOptions}
cardOptions={cardOptions}
categoryOptions={categoryOptions}
payerFilterOptions={payerFilterOptions}
categoryFilterOptions={categoryFilterOptions}
accountCardFilterOptions={accountCardFilterOptions}
selectedPeriod={selectedPeriod}
estabelecimentos={estabelecimentos}
allowCreate={false}
noteAsColumn={userPreferences?.extratoNoteAsColumn ?? false}
columnOrder={userPreferences?.lancamentosColumnOrder ?? null}
noteAsColumn={userPreferences?.statementNoteAsColumn ?? false}
columnOrder={userPreferences?.transactionsColumnOrder ?? null}
/>
</section>
</main>

View File

@@ -24,7 +24,7 @@ export default function OrcamentosLoading() {
<div className="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
{Array.from({ length: 6 }).map((_, i) => (
<div key={i} className="rounded-2xl border p-6 space-y-4">
{/* Categoria com ícone */}
{/* Category com ícone */}
<div className="flex items-center gap-3">
<Skeleton className="size-10 rounded-2xl bg-foreground/10" />
<div className="flex-1 space-y-2">

View File

@@ -1,29 +1,29 @@
import { RiPencilLine } from "@remixicon/react";
import { notFound } from "next/navigation";
import type { Conta } from "@/db/schema";
import type { FinancialAccount } from "@/db/schema";
import { CardDialog } from "@/features/cards/components/card-dialog";
import type { Card } from "@/features/cards/components/types";
import { InvoiceSummaryCard } from "@/features/invoices/components/invoice-summary-card";
import {
fetchCardData,
fetchCardLancamentos,
fetchCardTransactions,
fetchInvoiceData,
} from "@/features/invoices/queries";
import { fetchUserPreferences } from "@/features/settings/queries";
import { LancamentosPage as LancamentosSection } from "@/features/transactions/components/page/transactions-page";
import { TransactionsPage as LancamentosSection } from "@/features/transactions/components/page/transactions-page";
import {
buildLancamentoWhere,
buildOptionSets,
buildSluggedFilters,
buildSlugMaps,
extractLancamentoSearchFilters,
buildTransactionWhere,
extractTransactionSearchFilters,
getSingleParam,
mapLancamentosData,
mapTransactionsData,
type ResolvedSearchParams,
} from "@/features/transactions/page-helpers";
import {
fetchLancamentoFilterSources,
fetchRecentEstablishments,
fetchTransactionFilterSources,
} from "@/features/transactions/queries";
import MonthNavigation from "@/shared/components/month-picker/month-navigation";
import { Button } from "@/shared/components/ui/button";
@@ -39,7 +39,7 @@ type PageProps = {
};
export default async function Page({ params, searchParams }: PageProps) {
const { cardId: cartaoId } = await params;
const { cardId } = await params;
const userId = await getUserId();
const resolvedSearchParams = searchParams ? await searchParams : undefined;
@@ -50,9 +50,9 @@ export default async function Page({ params, searchParams }: PageProps) {
year,
} = parsePeriodParam(periodoParamRaw);
const searchFilters = extractLancamentoSearchFilters(resolvedSearchParams);
const searchFilters = extractTransactionSearchFilters(resolvedSearchParams);
const card = await fetchCardData(userId, cartaoId);
const card = await fetchCardData(userId, cardId);
if (!card) {
notFound();
@@ -65,16 +65,16 @@ export default async function Page({ params, searchParams }: PageProps) {
estabelecimentos,
userPreferences,
] = await Promise.all([
fetchLancamentoFilterSources(userId),
fetchTransactionFilterSources(userId),
loadLogoOptions(),
fetchInvoiceData(userId, cartaoId, selectedPeriod),
fetchInvoiceData(userId, cardId, selectedPeriod),
fetchRecentEstablishments(userId),
fetchUserPreferences(userId),
]);
const sluggedFilters = buildSluggedFilters(filterSources);
const slugMaps = buildSlugMaps(sluggedFilters);
const filters = buildLancamentoWhere({
const filters = buildTransactionWhere({
userId,
period: selectedPeriod,
filters: searchFilters,
@@ -82,35 +82,39 @@ export default async function Page({ params, searchParams }: PageProps) {
cardId: card.id,
});
const lancamentoRows = await fetchCardLancamentos(filters);
const transactionRows = await fetchCardTransactions(filters);
const lancamentosData = mapLancamentosData(lancamentoRows);
const transactionData = mapTransactionsData(transactionRows);
const {
pagadorOptions,
splitPagadorOptions,
defaultPagadorId,
contaOptions,
cartaoOptions,
categoriaOptions,
pagadorFilterOptions,
categoriaFilterOptions,
contaCartaoFilterOptions,
payerOptions,
splitPayerOptions,
defaultPayerId,
accountOptions,
cardOptions,
categoryOptions,
payerFilterOptions,
categoryFilterOptions,
accountCardFilterOptions,
} = buildOptionSets({
...sluggedFilters,
pagadorRows: filterSources.pagadorRows,
payerRows: filterSources.payerRows,
limitCartaoId: card.id,
});
const accountOptions = filterSources.contaRows.map((conta: Conta) => ({
id: conta.id,
name: conta.name ?? "Conta",
logo: conta.logo ?? null,
}));
const cardDialogAccounts = filterSources.accountRows.map(
(financialAccount: FinancialAccount) => ({
id: financialAccount.id,
name: financialAccount.name ?? "FinancialAccount",
logo: financialAccount.logo ?? null,
}),
);
const contaName =
filterSources.contaRows.find((conta: Conta) => conta.id === card.contaId)
?.name ?? "Conta";
const accountName =
filterSources.accountRows.find(
(financialAccount: FinancialAccount) =>
financialAccount.id === card.accountId,
)?.name ?? "FinancialAccount";
const cardDialogData: Card = {
id: card.id,
@@ -125,9 +129,9 @@ export default async function Page({ params, searchParams }: PageProps) {
card.limit !== null && card.limit !== undefined
? Number(card.limit)
: null,
contaId: card.contaId,
contaName,
limitInUse: null,
accountId: card.accountId,
accountName,
limitInUse: 0,
limitAvailable: null,
};
@@ -145,7 +149,7 @@ export default async function Page({ params, searchParams }: PageProps) {
<section className="flex flex-col gap-4">
<InvoiceSummaryCard
cartaoId={card.id}
cardId={card.id}
period={selectedPeriod}
cardName={card.name}
cardBrand={card.brand ?? null}
@@ -163,7 +167,7 @@ export default async function Page({ params, searchParams }: PageProps) {
mode="update"
card={cardDialogData}
logoOptions={logoOptions}
accounts={accountOptions}
accounts={cardDialogAccounts}
trigger={
<Button
type="button"
@@ -183,24 +187,24 @@ export default async function Page({ params, searchParams }: PageProps) {
<section className="flex flex-col gap-4">
<LancamentosSection
currentUserId={userId}
lancamentos={lancamentosData}
pagadorOptions={pagadorOptions}
splitPagadorOptions={splitPagadorOptions}
defaultPagadorId={defaultPagadorId}
contaOptions={contaOptions}
cartaoOptions={cartaoOptions}
categoriaOptions={categoriaOptions}
pagadorFilterOptions={pagadorFilterOptions}
categoriaFilterOptions={categoriaFilterOptions}
contaCartaoFilterOptions={contaCartaoFilterOptions}
transactions={transactionData}
payerOptions={payerOptions}
splitPayerOptions={splitPayerOptions}
defaultPayerId={defaultPayerId}
accountOptions={accountOptions}
cardOptions={cardOptions}
categoryOptions={categoryOptions}
payerFilterOptions={payerFilterOptions}
categoryFilterOptions={categoryFilterOptions}
accountCardFilterOptions={accountCardFilterOptions}
selectedPeriod={selectedPeriod}
estabelecimentos={estabelecimentos}
allowCreate
noteAsColumn={userPreferences?.extratoNoteAsColumn ?? false}
columnOrder={userPreferences?.lancamentosColumnOrder ?? null}
defaultCartaoId={card.id}
noteAsColumn={userPreferences?.statementNoteAsColumn ?? false}
columnOrder={userPreferences?.transactionsColumnOrder ?? null}
defaultCardId={card.id}
defaultPaymentMethod="Cartão de crédito"
lockCartaoSelection
lockCardSelection
lockPaymentMethod
/>
</section>

View File

@@ -2,14 +2,14 @@ import { notFound } from "next/navigation";
import { CategoryDetailHeader } from "@/features/categories/components/category-detail-header";
import { fetchCategoryDetails } from "@/features/dashboard/categories/category-details-queries";
import { fetchUserPreferences } from "@/features/settings/queries";
import { LancamentosPage } from "@/features/transactions/components/page/transactions-page";
import { TransactionsPage } from "@/features/transactions/components/page/transactions-page";
import {
buildOptionSets,
buildSluggedFilters,
} from "@/features/transactions/page-helpers";
import {
fetchLancamentoFilterSources,
fetchRecentEstablishments,
fetchTransactionFilterSources,
} from "@/features/transactions/queries";
import MonthNavigation from "@/shared/components/month-picker/month-navigation";
import { getUserId } from "@/shared/lib/auth/server";
@@ -42,7 +42,7 @@ export default async function Page({ params, searchParams }: PageProps) {
const [detail, filterSources, estabelecimentos, userPreferences] =
await Promise.all([
fetchCategoryDetails(userId, categoryId, selectedPeriod),
fetchLancamentoFilterSources(userId),
fetchTransactionFilterSources(userId),
fetchRecentEstablishments(userId),
fetchUserPreferences(userId),
]);
@@ -53,18 +53,18 @@ export default async function Page({ params, searchParams }: PageProps) {
const sluggedFilters = buildSluggedFilters(filterSources);
const {
pagadorOptions,
splitPagadorOptions,
defaultPagadorId,
contaOptions,
cartaoOptions,
categoriaOptions,
pagadorFilterOptions,
categoriaFilterOptions,
contaCartaoFilterOptions,
payerOptions,
splitPayerOptions,
defaultPayerId,
accountOptions,
cardOptions,
categoryOptions,
payerFilterOptions,
categoryFilterOptions,
accountCardFilterOptions,
} = buildOptionSets({
...sluggedFilters,
pagadorRows: filterSources.pagadorRows,
payerRows: filterSources.payerRows,
});
const currentPeriodLabel = displayPeriod(detail.period);
@@ -82,23 +82,23 @@ export default async function Page({ params, searchParams }: PageProps) {
percentageChange={detail.percentageChange}
transactionCount={detail.transactions.length}
/>
<LancamentosPage
<TransactionsPage
currentUserId={userId}
lancamentos={detail.transactions}
pagadorOptions={pagadorOptions}
splitPagadorOptions={splitPagadorOptions}
defaultPagadorId={defaultPagadorId}
contaOptions={contaOptions}
cartaoOptions={cartaoOptions}
categoriaOptions={categoriaOptions}
pagadorFilterOptions={pagadorFilterOptions}
categoriaFilterOptions={categoriaFilterOptions}
contaCartaoFilterOptions={contaCartaoFilterOptions}
transactions={detail.transactions}
payerOptions={payerOptions}
splitPayerOptions={splitPayerOptions}
defaultPayerId={defaultPayerId}
accountOptions={accountOptions}
cardOptions={cardOptions}
categoryOptions={categoryOptions}
payerFilterOptions={payerFilterOptions}
categoryFilterOptions={categoryFilterOptions}
accountCardFilterOptions={accountCardFilterOptions}
selectedPeriod={detail.period}
estabelecimentos={estabelecimentos}
allowCreate={true}
noteAsColumn={userPreferences?.extratoNoteAsColumn ?? false}
columnOrder={userPreferences?.lancamentosColumnOrder ?? null}
noteAsColumn={userPreferences?.statementNoteAsColumn ?? false}
columnOrder={userPreferences?.transactionsColumnOrder ?? null}
/>
</main>
);

View File

@@ -24,12 +24,12 @@ export default async function Page() {
pendingItems={pendingItems}
processedItems={processedItems}
discardedItems={discardedItems}
pagadorOptions={dialogData.pagadorOptions}
splitPagadorOptions={dialogData.splitPagadorOptions}
defaultPagadorId={dialogData.defaultPagadorId}
contaOptions={dialogData.contaOptions}
cartaoOptions={dialogData.cartaoOptions}
categoriaOptions={dialogData.categoriaOptions}
payerOptions={dialogData.payerOptions}
splitPayerOptions={dialogData.splitPayerOptions}
defaultPayerId={dialogData.defaultPayerId}
accountOptions={dialogData.accountOptions}
cardOptions={dialogData.cardOptions}
categoryOptions={dialogData.categoryOptions}
estabelecimentos={dialogData.estabelecimentos}
appLogoMap={appLogoMap}
/>

View File

@@ -9,7 +9,7 @@ import { PreferencesForm } from "@/features/settings/components/preferences-form
import { UpdateEmailForm } from "@/features/settings/components/update-email-form";
import { UpdateNameForm } from "@/features/settings/components/update-name-form";
import { UpdatePasswordForm } from "@/features/settings/components/update-password-form";
import { fetchAjustesPageData } from "@/features/settings/queries";
import { fetchSettingsPageData } from "@/features/settings/queries";
import { Card } from "@/shared/components/ui/card";
import {
Tabs,
@@ -32,7 +32,7 @@ export default async function Page() {
const userEmail = session.user.email || "";
const { authProvider, userPreferences, userApiTokens } =
await fetchAjustesPageData(session.user.id);
await fetchSettingsPageData(session.user.id);
return (
<div className="w-full">
@@ -71,11 +71,11 @@ export default async function Page() {
</p>
</div>
<PreferencesForm
extratoNoteAsColumn={
userPreferences?.extratoNoteAsColumn ?? false
statementNoteAsColumn={
userPreferences?.statementNoteAsColumn ?? false
}
lancamentosColumnOrder={
userPreferences?.lancamentosColumnOrder ?? null
transactionsColumnOrder={
userPreferences?.transactionsColumnOrder ?? null
}
/>
</div>