diff --git a/app/(dashboard)/ajustes/layout.tsx b/app/(dashboard)/ajustes/layout.tsx index 4c4099e..4ca3c5b 100644 --- a/app/(dashboard)/ajustes/layout.tsx +++ b/app/(dashboard)/ajustes/layout.tsx @@ -1,5 +1,5 @@ import { RiSettings2Line } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Ajustes | OpenMonetis", diff --git a/app/(dashboard)/anotacoes/layout.tsx b/app/(dashboard)/anotacoes/layout.tsx index 0a25dbe..dbcf8b7 100644 --- a/app/(dashboard)/anotacoes/layout.tsx +++ b/app/(dashboard)/anotacoes/layout.tsx @@ -1,5 +1,5 @@ import { RiTodoLine } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Anotações | OpenMonetis", diff --git a/app/(dashboard)/calendario/layout.tsx b/app/(dashboard)/calendario/layout.tsx index 4686a63..6c8195a 100644 --- a/app/(dashboard)/calendario/layout.tsx +++ b/app/(dashboard)/calendario/layout.tsx @@ -1,5 +1,5 @@ import { RiCalendarEventLine } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Calendário | OpenMonetis", diff --git a/app/(dashboard)/cartoes/[cartaoId]/fatura/actions.ts b/app/(dashboard)/cartoes/[cartaoId]/fatura/actions.ts index 3ad9cab..9a1e870 100644 --- a/app/(dashboard)/cartoes/[cartaoId]/fatura/actions.ts +++ b/app/(dashboard)/cartoes/[cartaoId]/fatura/actions.ts @@ -9,9 +9,9 @@ import { lancamentos, pagadores, } from "@/db/schema"; -import { buildInvoicePaymentNote } from "@/lib/accounts/constants"; import { revalidateForEntity } from "@/lib/actions/helpers"; import { getUser } from "@/lib/auth/server"; +import { buildInvoicePaymentNote } from "@/lib/contas/constants"; import { db } from "@/lib/db"; import { INVOICE_PAYMENT_STATUS, diff --git a/app/(dashboard)/cartoes/[cartaoId]/fatura/data.ts b/app/(dashboard)/cartoes/[cartaoId]/fatura/data.ts index 6c5322d..6162543 100644 --- a/app/(dashboard)/cartoes/[cartaoId]/fatura/data.ts +++ b/app/(dashboard)/cartoes/[cartaoId]/fatura/data.ts @@ -1,6 +1,6 @@ import { and, desc, eq, type SQL, sum } from "drizzle-orm"; import { cartoes, faturas, lancamentos } from "@/db/schema"; -import { buildInvoicePaymentNote } from "@/lib/accounts/constants"; +import { buildInvoicePaymentNote } from "@/lib/contas/constants"; import { db } from "@/lib/db"; import { INVOICE_PAYMENT_STATUS, diff --git a/app/(dashboard)/cartoes/[cartaoId]/fatura/loading.tsx b/app/(dashboard)/cartoes/[cartaoId]/fatura/loading.tsx index 5e09e9a..2e99a3c 100644 --- a/app/(dashboard)/cartoes/[cartaoId]/fatura/loading.tsx +++ b/app/(dashboard)/cartoes/[cartaoId]/fatura/loading.tsx @@ -2,7 +2,7 @@ import { FilterSkeleton, InvoiceSummaryCardSkeleton, TransactionsTableSkeleton, -} from "@/components/skeletons"; +} from "@/components/shared/skeletons"; import { Skeleton } from "@/components/ui/skeleton"; /** diff --git a/app/(dashboard)/cartoes/layout.tsx b/app/(dashboard)/cartoes/layout.tsx index 20cd696..90b73e2 100644 --- a/app/(dashboard)/cartoes/layout.tsx +++ b/app/(dashboard)/cartoes/layout.tsx @@ -1,5 +1,5 @@ import { RiBankCard2Line } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Cartões | OpenMonetis", diff --git a/app/(dashboard)/categorias/layout.tsx b/app/(dashboard)/categorias/layout.tsx index bb2e67f..0b6f26d 100644 --- a/app/(dashboard)/categorias/layout.tsx +++ b/app/(dashboard)/categorias/layout.tsx @@ -1,5 +1,5 @@ import { RiPriceTag3Line } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Categorias | OpenMonetis", diff --git a/app/(dashboard)/changelog/layout.tsx b/app/(dashboard)/changelog/layout.tsx index 0f86c00..ebf41f6 100644 --- a/app/(dashboard)/changelog/layout.tsx +++ b/app/(dashboard)/changelog/layout.tsx @@ -1,5 +1,5 @@ import { RiHistoryLine } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Cartões | OpenMonetis", diff --git a/app/(dashboard)/contas/[contaId]/extrato/data.ts b/app/(dashboard)/contas/[contaId]/extrato/data.ts index 79700d2..06f701a 100644 --- a/app/(dashboard)/contas/[contaId]/extrato/data.ts +++ b/app/(dashboard)/contas/[contaId]/extrato/data.ts @@ -1,6 +1,6 @@ import { and, desc, eq, lt, type SQL, sql } from "drizzle-orm"; import { contas, lancamentos, pagadores } from "@/db/schema"; -import { INITIAL_BALANCE_NOTE } from "@/lib/accounts/constants"; +import { INITIAL_BALANCE_NOTE } from "@/lib/contas/constants"; import { db } from "@/lib/db"; import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; diff --git a/app/(dashboard)/contas/[contaId]/extrato/loading.tsx b/app/(dashboard)/contas/[contaId]/extrato/loading.tsx index 02fa036..8d83f4c 100644 --- a/app/(dashboard)/contas/[contaId]/extrato/loading.tsx +++ b/app/(dashboard)/contas/[contaId]/extrato/loading.tsx @@ -2,7 +2,7 @@ import { AccountStatementCardSkeleton, FilterSkeleton, TransactionsTableSkeleton, -} from "@/components/skeletons"; +} from "@/components/shared/skeletons"; import { Skeleton } from "@/components/ui/skeleton"; /** diff --git a/app/(dashboard)/contas/actions.ts b/app/(dashboard)/contas/actions.ts index 1c623be..3e7272b 100644 --- a/app/(dashboard)/contas/actions.ts +++ b/app/(dashboard)/contas/actions.ts @@ -3,19 +3,19 @@ import { and, eq } from "drizzle-orm"; import { z } from "zod"; import { categorias, contas, lancamentos, pagadores } from "@/db/schema"; -import { - INITIAL_BALANCE_CATEGORY_NAME, - INITIAL_BALANCE_CONDITION, - INITIAL_BALANCE_NOTE, - INITIAL_BALANCE_PAYMENT_METHOD, - INITIAL_BALANCE_TRANSACTION_TYPE, -} from "@/lib/accounts/constants"; import { type ActionResult, handleActionError, revalidateForEntity, } from "@/lib/actions/helpers"; import { getUser } from "@/lib/auth/server"; +import { + INITIAL_BALANCE_CATEGORY_NAME, + INITIAL_BALANCE_CONDITION, + INITIAL_BALANCE_NOTE, + INITIAL_BALANCE_PAYMENT_METHOD, + INITIAL_BALANCE_TRANSACTION_TYPE, +} from "@/lib/contas/constants"; import { db } from "@/lib/db"; import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; import { noteSchema, uuidSchema } from "@/lib/schemas/common"; diff --git a/app/(dashboard)/contas/data.ts b/app/(dashboard)/contas/data.ts index b1b0d60..3cc927e 100644 --- a/app/(dashboard)/contas/data.ts +++ b/app/(dashboard)/contas/data.ts @@ -1,6 +1,6 @@ import { and, eq, ilike, not, sql } from "drizzle-orm"; import { contas, lancamentos, pagadores } from "@/db/schema"; -import { INITIAL_BALANCE_NOTE } from "@/lib/accounts/constants"; +import { INITIAL_BALANCE_NOTE } from "@/lib/contas/constants"; import { db } from "@/lib/db"; import { loadLogoOptions } from "@/lib/logo/options"; import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; diff --git a/app/(dashboard)/contas/layout.tsx b/app/(dashboard)/contas/layout.tsx index 21dfb70..7c80448 100644 --- a/app/(dashboard)/contas/layout.tsx +++ b/app/(dashboard)/contas/layout.tsx @@ -1,5 +1,5 @@ import { RiBankLine } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Contas | OpenMonetis", diff --git a/app/(dashboard)/dashboard/loading.tsx b/app/(dashboard)/dashboard/loading.tsx index 40e5877..6d4ed30 100644 --- a/app/(dashboard)/dashboard/loading.tsx +++ b/app/(dashboard)/dashboard/loading.tsx @@ -1,10 +1,6 @@ -import { DashboardGridSkeleton } from "@/components/skeletons"; +import { DashboardGridSkeleton } from "@/components/shared/skeletons"; import { Skeleton } from "@/components/ui/skeleton"; -/** - * Loading state para a página do dashboard - * Estrutura: Welcome Banner → Month Picker → Section Cards → Widget Grid - */ export default function DashboardLoading() { return (
diff --git a/app/(dashboard)/insights/actions.ts b/app/(dashboard)/insights/actions.ts index 4f079bc..73d138d 100644 --- a/app/(dashboard)/insights/actions.ts +++ b/app/(dashboard)/insights/actions.ts @@ -16,8 +16,8 @@ import { orcamentos, pagadores, } from "@/db/schema"; -import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; import { getUser } from "@/lib/auth/server"; +import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/contas/constants"; import { db } from "@/lib/db"; import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; import { diff --git a/app/(dashboard)/insights/layout.tsx b/app/(dashboard)/insights/layout.tsx index ef8a03a..97d8e7b 100644 --- a/app/(dashboard)/insights/layout.tsx +++ b/app/(dashboard)/insights/layout.tsx @@ -1,5 +1,5 @@ import { RiSparklingLine } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Insights | OpenMonetis", diff --git a/app/(dashboard)/lancamentos/actions.ts b/app/(dashboard)/lancamentos/actions.ts index b6364a8..e28b30c 100644 --- a/app/(dashboard)/lancamentos/actions.ts +++ b/app/(dashboard)/lancamentos/actions.ts @@ -10,15 +10,15 @@ import { lancamentos, pagadores, } from "@/db/schema"; +import { handleActionError, revalidateForEntity } from "@/lib/actions/helpers"; +import type { ActionResult } from "@/lib/actions/types"; +import { getUser } from "@/lib/auth/server"; import { INITIAL_BALANCE_CONDITION, INITIAL_BALANCE_NOTE, INITIAL_BALANCE_PAYMENT_METHOD, INITIAL_BALANCE_TRANSACTION_TYPE, -} from "@/lib/accounts/constants"; -import { handleActionError, revalidateForEntity } from "@/lib/actions/helpers"; -import type { ActionResult } from "@/lib/actions/types"; -import { getUser } from "@/lib/auth/server"; +} from "@/lib/contas/constants"; import { db } from "@/lib/db"; import { LANCAMENTO_CONDITIONS, diff --git a/app/(dashboard)/lancamentos/data.ts b/app/(dashboard)/lancamentos/data.ts index 27b4efe..2482052 100644 --- a/app/(dashboard)/lancamentos/data.ts +++ b/app/(dashboard)/lancamentos/data.ts @@ -6,7 +6,7 @@ import { lancamentos, pagadores, } from "@/db/schema"; -import { INITIAL_BALANCE_NOTE } from "@/lib/accounts/constants"; +import { INITIAL_BALANCE_NOTE } from "@/lib/contas/constants"; import { db } from "@/lib/db"; export async function fetchLancamentos(filters: SQL[]) { diff --git a/app/(dashboard)/lancamentos/layout.tsx b/app/(dashboard)/lancamentos/layout.tsx index 9087375..4a19089 100644 --- a/app/(dashboard)/lancamentos/layout.tsx +++ b/app/(dashboard)/lancamentos/layout.tsx @@ -1,5 +1,5 @@ import { RiArrowLeftRightLine } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Lançamentos | OpenMonetis", diff --git a/app/(dashboard)/lancamentos/loading.tsx b/app/(dashboard)/lancamentos/loading.tsx index 697ec09..2eeb034 100644 --- a/app/(dashboard)/lancamentos/loading.tsx +++ b/app/(dashboard)/lancamentos/loading.tsx @@ -1,7 +1,7 @@ import { FilterSkeleton, TransactionsTableSkeleton, -} from "@/components/skeletons"; +} from "@/components/shared/skeletons"; import { Skeleton } from "@/components/ui/skeleton"; /** diff --git a/app/(dashboard)/layout.tsx b/app/(dashboard)/layout.tsx index 624c48a..e6593f1 100644 --- a/app/(dashboard)/layout.tsx +++ b/app/(dashboard)/layout.tsx @@ -1,5 +1,5 @@ import { FontProvider } from "@/components/font-provider"; -import { AppNavbar } from "@/components/navbar/app-navbar"; +import { AppNavbar } from "@/components/navigation/navbar/app-navbar"; import { PrivacyProvider } from "@/components/privacy-provider"; import { getUserSession } from "@/lib/auth/server"; import { fetchDashboardNotifications } from "@/lib/dashboard/notifications"; diff --git a/app/(dashboard)/orcamentos/data.ts b/app/(dashboard)/orcamentos/data.ts index 7ae68c4..c4bf984 100644 --- a/app/(dashboard)/orcamentos/data.ts +++ b/app/(dashboard)/orcamentos/data.ts @@ -6,7 +6,7 @@ import { orcamentos, pagadores, } from "@/db/schema"; -import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; +import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/contas/constants"; import { db } from "@/lib/db"; import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; diff --git a/app/(dashboard)/orcamentos/layout.tsx b/app/(dashboard)/orcamentos/layout.tsx index 2ea292c..3c8f7cd 100644 --- a/app/(dashboard)/orcamentos/layout.tsx +++ b/app/(dashboard)/orcamentos/layout.tsx @@ -1,5 +1,5 @@ import { RiBarChart2Line } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Orçamentos | OpenMonetis", diff --git a/app/(dashboard)/pagadores/layout.tsx b/app/(dashboard)/pagadores/layout.tsx index 3398d7f..7c97e11 100644 --- a/app/(dashboard)/pagadores/layout.tsx +++ b/app/(dashboard)/pagadores/layout.tsx @@ -1,5 +1,5 @@ import { RiGroupLine } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Pagadores | OpenMonetis", diff --git a/app/(dashboard)/pre-lancamentos/layout.tsx b/app/(dashboard)/pre-lancamentos/layout.tsx index 1d01634..d39a2a1 100644 --- a/app/(dashboard)/pre-lancamentos/layout.tsx +++ b/app/(dashboard)/pre-lancamentos/layout.tsx @@ -1,5 +1,5 @@ import { RiAtLine } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Pré-Lançamentos | OpenMonetis", diff --git a/app/(dashboard)/dashboard/analise-parcelas/layout.tsx b/app/(dashboard)/relatorios/analise-parcelas/layout.tsx similarity index 87% rename from app/(dashboard)/dashboard/analise-parcelas/layout.tsx rename to app/(dashboard)/relatorios/analise-parcelas/layout.tsx index a17f31f..85d107a 100644 --- a/app/(dashboard)/dashboard/analise-parcelas/layout.tsx +++ b/app/(dashboard)/relatorios/analise-parcelas/layout.tsx @@ -1,5 +1,5 @@ import { RiSecurePaymentLine } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Análise de Parcelas | OpenMonetis", diff --git a/app/(dashboard)/dashboard/analise-parcelas/page.tsx b/app/(dashboard)/relatorios/analise-parcelas/page.tsx similarity index 100% rename from app/(dashboard)/dashboard/analise-parcelas/page.tsx rename to app/(dashboard)/relatorios/analise-parcelas/page.tsx diff --git a/app/(dashboard)/relatorios/estabelecimentos/layout.tsx b/app/(dashboard)/relatorios/estabelecimentos/layout.tsx index c20ca10..95d9e9a 100644 --- a/app/(dashboard)/relatorios/estabelecimentos/layout.tsx +++ b/app/(dashboard)/relatorios/estabelecimentos/layout.tsx @@ -1,5 +1,5 @@ import { RiStore2Line } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Top Estabelecimentos | OpenMonetis", diff --git a/app/(dashboard)/relatorios/estabelecimentos/page.tsx b/app/(dashboard)/relatorios/estabelecimentos/page.tsx index 4c0d359..4634366 100644 --- a/app/(dashboard)/relatorios/estabelecimentos/page.tsx +++ b/app/(dashboard)/relatorios/estabelecimentos/page.tsx @@ -1,14 +1,14 @@ -import { EstablishmentsList } from "@/components/top-estabelecimentos/establishments-list"; -import { HighlightsCards } from "@/components/top-estabelecimentos/highlights-cards"; -import { PeriodFilterButtons } from "@/components/top-estabelecimentos/period-filter"; -import { SummaryCards } from "@/components/top-estabelecimentos/summary-cards"; -import { TopCategories } from "@/components/top-estabelecimentos/top-categories"; +import { EstablishmentsList } from "@/components/relatorios/estabelecimentos/establishments-list"; +import { HighlightsCards } from "@/components/relatorios/estabelecimentos/highlights-cards"; +import { PeriodFilterButtons } from "@/components/relatorios/estabelecimentos/period-filter"; +import { SummaryCards } from "@/components/relatorios/estabelecimentos/summary-cards"; +import { TopCategories } from "@/components/relatorios/estabelecimentos/top-categories"; import { Card } from "@/components/ui/card"; import { getUser } from "@/lib/auth/server"; import { fetchTopEstabelecimentosData, type PeriodFilter, -} from "@/lib/top-estabelecimentos/fetch-data"; +} from "@/lib/relatorios/estabelecimentos/fetch-data"; import { parsePeriodParam } from "@/lib/utils/period"; type PageSearchParams = Promise>; diff --git a/app/(dashboard)/relatorios/tendencias/layout.tsx b/app/(dashboard)/relatorios/tendencias/layout.tsx index 19bc5ed..a496fd9 100644 --- a/app/(dashboard)/relatorios/tendencias/layout.tsx +++ b/app/(dashboard)/relatorios/tendencias/layout.tsx @@ -1,5 +1,5 @@ import { RiFileChartLine } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Tendências | OpenMonetis", diff --git a/app/(dashboard)/relatorios/tendencias/loading.tsx b/app/(dashboard)/relatorios/tendencias/loading.tsx index c39eac1..bedc39a 100644 --- a/app/(dashboard)/relatorios/tendencias/loading.tsx +++ b/app/(dashboard)/relatorios/tendencias/loading.tsx @@ -1,4 +1,4 @@ -import { CategoryReportSkeleton } from "@/components/skeletons/category-report-skeleton"; +import { CategoryReportSkeleton } from "@/components/shared/skeletons/category-report-skeleton"; export default function Loading() { return ( diff --git a/app/(dashboard)/relatorios/uso-cartoes/layout.tsx b/app/(dashboard)/relatorios/uso-cartoes/layout.tsx index 2c8efb6..8a54809 100644 --- a/app/(dashboard)/relatorios/uso-cartoes/layout.tsx +++ b/app/(dashboard)/relatorios/uso-cartoes/layout.tsx @@ -1,5 +1,5 @@ import { RiBankCard2Line } from "@remixicon/react"; -import PageDescription from "@/components/page-description"; +import PageDescription from "@/components/shared/page-description"; export const metadata = { title: "Uso de Cartões | OpenMonetis", diff --git a/components/anotacoes/notes-page.tsx b/components/anotacoes/notes-page.tsx index 16a3f33..e4cde9e 100644 --- a/components/anotacoes/notes-page.tsx +++ b/components/anotacoes/notes-page.tsx @@ -8,7 +8,7 @@ import { deleteNoteAction, } from "@/app/(dashboard)/anotacoes/actions"; import { ConfirmActionDialog } from "@/components/confirm-action-dialog"; -import { EmptyState } from "@/components/empty-state"; +import { EmptyState } from "@/components/shared/empty-state"; import { Button } from "@/components/ui/button"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Card } from "../ui/card"; diff --git a/components/cartoes/cards-page.tsx b/components/cartoes/cards-page.tsx index bb71fb9..aeef05e 100644 --- a/components/cartoes/cards-page.tsx +++ b/components/cartoes/cards-page.tsx @@ -6,7 +6,7 @@ import { useCallback, useMemo, useState } from "react"; import { toast } from "sonner"; import { deleteCardAction } from "@/app/(dashboard)/cartoes/actions"; import { ConfirmActionDialog } from "@/components/confirm-action-dialog"; -import { EmptyState } from "@/components/empty-state"; +import { EmptyState } from "@/components/shared/empty-state"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; diff --git a/components/contas/accounts-page.tsx b/components/contas/accounts-page.tsx index 09c5485..1b6f34b 100644 --- a/components/contas/accounts-page.tsx +++ b/components/contas/accounts-page.tsx @@ -8,7 +8,7 @@ import { toast } from "sonner"; import { deleteAccountAction } from "@/app/(dashboard)/contas/actions"; import { ConfirmActionDialog } from "@/components/confirm-action-dialog"; import { AccountCard } from "@/components/contas/account-card"; -import { EmptyState } from "@/components/empty-state"; +import { EmptyState } from "@/components/shared/empty-state"; import { Button } from "@/components/ui/button"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { getCurrentPeriod } from "@/lib/utils/period"; diff --git a/components/insights/insights-page.tsx b/components/insights/insights-page.tsx index 5709b16..8e3d5ca 100644 --- a/components/insights/insights-page.tsx +++ b/components/insights/insights-page.tsx @@ -17,12 +17,12 @@ import { saveInsightsAction, } from "@/app/(dashboard)/insights/actions"; import { DEFAULT_MODEL } from "@/app/(dashboard)/insights/data"; +import { EmptyState } from "@/components/shared/empty-state"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import type { InsightsResponse } from "@/lib/schemas/insights"; -import { EmptyState } from "../empty-state"; import { InsightsGrid } from "./insights-grid"; import { ModelSelector } from "./model-selector"; diff --git a/components/lancamentos/dialogs/lancamento-dialog/payment-method-section.tsx b/components/lancamentos/dialogs/lancamento-dialog/payment-method-section.tsx index 50ebe7c..e7af072 100644 --- a/components/lancamentos/dialogs/lancamento-dialog/payment-method-section.tsx +++ b/components/lancamentos/dialogs/lancamento-dialog/payment-method-section.tsx @@ -2,7 +2,7 @@ import { useState } from "react"; import { Label } from "@/components/ui/label"; -import { MonthPicker } from "@/components/ui/monthpicker"; +import { MonthPicker } from "@/components/ui/month-picker"; import { Popover, PopoverContent, diff --git a/components/lancamentos/dialogs/mass-add-dialog.tsx b/components/lancamentos/dialogs/mass-add-dialog.tsx index a848958..7b922ce 100644 --- a/components/lancamentos/dialogs/mass-add-dialog.tsx +++ b/components/lancamentos/dialogs/mass-add-dialog.tsx @@ -15,7 +15,7 @@ import { DialogTitle, } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; -import { MonthPicker } from "@/components/ui/monthpicker"; +import { MonthPicker } from "@/components/ui/month-picker"; import { Popover, PopoverContent, @@ -36,7 +36,6 @@ import { groupAndSortCategorias } from "@/lib/lancamentos/categoria-helpers"; import { LANCAMENTO_PAYMENT_METHODS } from "@/lib/lancamentos/constants"; import { getTodayDateString } from "@/lib/utils/date"; import { displayPeriod } from "@/lib/utils/period"; -import type { SelectOption } from "../../types"; import { CategoriaSelectContent, ContaCartaoSelectContent, @@ -45,6 +44,7 @@ import { TransactionTypeSelectContent, } from "../select-items"; import { EstabelecimentoInput } from "../shared/estabelecimento-input"; +import type { SelectOption } from "../types"; /** Payment methods sem Boleto para este modal */ const MASS_ADD_PAYMENT_METHODS = LANCAMENTO_PAYMENT_METHODS.filter( diff --git a/components/navbar/nav-tools.tsx b/components/navbar/nav-tools.tsx deleted file mode 100644 index 55c98a6..0000000 --- a/components/navbar/nav-tools.tsx +++ /dev/null @@ -1,103 +0,0 @@ -"use client"; - -import { RiCalculatorLine, RiEyeLine, RiEyeOffLine } from "@remixicon/react"; -import { useState } from "react"; -import { CalculatorDialogContent } from "@/components/calculadora/calculator-dialog"; -import { usePrivacyMode } from "@/components/privacy-provider"; -import { Badge } from "@/components/ui/badge"; -import { Dialog, DialogTrigger } from "@/components/ui/dialog"; -import { cn } from "@/lib/utils/ui"; - -const itemClass = - "flex w-full items-center gap-2.5 rounded-sm px-2 py-2 text-sm text-foreground hover:bg-accent transition-colors cursor-pointer"; - -export function NavToolsDropdown() { - const { privacyMode, toggle } = usePrivacyMode(); - const [calcOpen, setCalcOpen] = useState(false); - - return ( - -
    -
  • - - - -
  • -
  • - -
  • -
- -
- ); -} - -type MobileToolsProps = { - onClose: () => void; -}; - -export function MobileTools({ onClose }: MobileToolsProps) { - const { privacyMode, toggle } = usePrivacyMode(); - const [calcOpen, setCalcOpen] = useState(false); - - return ( - - - - - - - - ); -} diff --git a/components/navbar/app-navbar.tsx b/components/navigation/navbar/app-navbar.tsx similarity index 93% rename from components/navbar/app-navbar.tsx rename to components/navigation/navbar/app-navbar.tsx index a68d485..66fc2ec 100644 --- a/components/navbar/app-navbar.tsx +++ b/components/navigation/navbar/app-navbar.tsx @@ -1,9 +1,9 @@ import Link from "next/link"; import { AnimatedThemeToggler } from "@/components/animated-theme-toggler"; +import { Logo } from "@/components/logo"; import { NotificationBell } from "@/components/notificacoes/notification-bell"; -import { RefreshPageButton } from "@/components/refresh-page-button"; +import { RefreshPageButton } from "@/components/shared/refresh-page-button"; import type { DashboardNotificationsSnapshot } from "@/lib/dashboard/notifications"; -import { Logo } from "../logo"; import { NavMenu } from "./nav-menu"; import { NavbarUser } from "./navbar-user"; diff --git a/components/navbar/mobile-link.tsx b/components/navigation/navbar/mobile-link.tsx similarity index 100% rename from components/navbar/mobile-link.tsx rename to components/navigation/navbar/mobile-link.tsx diff --git a/components/navbar/nav-dropdown.tsx b/components/navigation/navbar/nav-dropdown.tsx similarity index 100% rename from components/navbar/nav-dropdown.tsx rename to components/navigation/navbar/nav-dropdown.tsx diff --git a/components/navbar/nav-items.tsx b/components/navigation/navbar/nav-items.tsx similarity index 93% rename from components/navbar/nav-items.tsx rename to components/navigation/navbar/nav-items.tsx index 7623184..57c2328 100644 --- a/components/navbar/nav-items.tsx +++ b/components/navigation/navbar/nav-items.tsx @@ -8,6 +8,7 @@ import { RiFileChartLine, RiGroupLine, RiPriceTag3Line, + RiSecurePaymentLine, RiSparklingLine, RiStore2Line, RiTodoLine, @@ -111,6 +112,11 @@ export const NAV_SECTIONS: NavSection[] = [ icon: , preservePeriod: true, }, + { + href: "/relatorios/analise-parcelas", + label: "análise de parcelas", + icon: , + }, { href: "/relatorios/estabelecimentos", label: "estabelecimentos", diff --git a/components/navbar/nav-link.tsx b/components/navigation/navbar/nav-link.tsx similarity index 100% rename from components/navbar/nav-link.tsx rename to components/navigation/navbar/nav-link.tsx diff --git a/components/navbar/nav-menu.tsx b/components/navigation/navbar/nav-menu.tsx similarity index 86% rename from components/navbar/nav-menu.tsx rename to components/navigation/navbar/nav-menu.tsx index 8a2b1d8..134a732 100644 --- a/components/navbar/nav-menu.tsx +++ b/components/navigation/navbar/nav-menu.tsx @@ -2,7 +2,9 @@ import { RiDashboardLine, RiMenuLine } from "@remixicon/react"; import { useState } from "react"; +import { CalculatorDialogContent } from "@/components/calculadora/calculator-dialog"; import { Button } from "@/components/ui/button"; +import { Dialog } from "@/components/ui/dialog"; import { NavigationMenu, NavigationMenuContent, @@ -26,7 +28,9 @@ import { MobileTools, NavToolsDropdown } from "./nav-tools"; export function NavMenu() { const [sheetOpen, setSheetOpen] = useState(false); + const [calculatorOpen, setCalculatorOpen] = useState(false); const close = () => setSheetOpen(false); + const openCalculator = () => setCalculatorOpen(true); return ( <> @@ -56,7 +60,7 @@ export function NavMenu() { Ferramentas - + @@ -114,10 +118,14 @@ export function NavMenu() { })} - + + + + + ); } diff --git a/components/navbar/nav-pill.tsx b/components/navigation/navbar/nav-pill.tsx similarity index 100% rename from components/navbar/nav-pill.tsx rename to components/navigation/navbar/nav-pill.tsx diff --git a/components/navbar/nav-styles.ts b/components/navigation/navbar/nav-styles.ts similarity index 100% rename from components/navbar/nav-styles.ts rename to components/navigation/navbar/nav-styles.ts diff --git a/components/navigation/navbar/nav-tools.tsx b/components/navigation/navbar/nav-tools.tsx new file mode 100644 index 0000000..4bfc809 --- /dev/null +++ b/components/navigation/navbar/nav-tools.tsx @@ -0,0 +1,106 @@ +"use client"; + +import { RiCalculatorLine, RiEyeLine, RiEyeOffLine } from "@remixicon/react"; +import { usePrivacyMode } from "@/components/privacy-provider"; +import { Badge } from "@/components/ui/badge"; +import { cn } from "@/lib/utils/ui"; + +const itemClass = + "flex w-full items-center gap-2.5 rounded-sm px-2 py-2 text-sm text-foreground hover:bg-accent transition-colors cursor-pointer"; + +type NavToolsDropdownProps = { + onOpenCalculator: () => void; +}; + +export function NavToolsDropdown({ onOpenCalculator }: NavToolsDropdownProps) { + const { privacyMode, toggle } = usePrivacyMode(); + + return ( +
    +
  • + +
  • +
  • + +
  • +
+ ); +} + +type MobileToolsProps = { + onClose: () => void; + onOpenCalculator: () => void; +}; + +export function MobileTools({ onClose, onOpenCalculator }: MobileToolsProps) { + const { privacyMode, toggle } = usePrivacyMode(); + + return ( + <> + + + + ); +} diff --git a/components/navbar/navbar-user.tsx b/components/navigation/navbar/navbar-user.tsx similarity index 98% rename from components/navbar/navbar-user.tsx rename to components/navigation/navbar/navbar-user.tsx index 3cb9fe4..7a124b6 100644 --- a/components/navbar/navbar-user.tsx +++ b/components/navigation/navbar/navbar-user.tsx @@ -11,6 +11,7 @@ import Link from "next/link"; import { useRouter } from "next/navigation"; import { useMemo, useState } from "react"; import { FeedbackDialogBody } from "@/components/feedback/feedback-dialog"; +import { Badge } from "@/components/ui/badge"; import { Dialog, DialogTrigger } from "@/components/ui/dialog"; import { DropdownMenu, @@ -24,7 +25,6 @@ import { authClient } from "@/lib/auth/client"; import { getAvatarSrc } from "@/lib/pagadores/utils"; import { cn } from "@/lib/utils/ui"; import { version } from "@/package.json"; -import { Badge } from "../ui/badge"; const itemClass = "flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm transition-colors hover:bg-accent"; diff --git a/components/sidebar/app-sidebar.tsx b/components/navigation/sidebar/app-sidebar.tsx similarity index 90% rename from components/sidebar/app-sidebar.tsx rename to components/navigation/sidebar/app-sidebar.tsx index 55169b7..c20e08c 100644 --- a/components/sidebar/app-sidebar.tsx +++ b/components/navigation/sidebar/app-sidebar.tsx @@ -1,9 +1,9 @@ "use client"; import * as React from "react"; import { Logo } from "@/components/logo"; -import { NavMain } from "@/components/sidebar/nav-main"; -import { NavSecondary } from "@/components/sidebar/nav-secondary"; -import { NavUser } from "@/components/sidebar/nav-user"; +import { NavMain } from "@/components/navigation/sidebar/nav-main"; +import { NavSecondary } from "@/components/navigation/sidebar/nav-secondary"; +import { NavUser } from "@/components/navigation/sidebar/nav-user"; import { Sidebar, SidebarContent, diff --git a/components/sidebar/nav-link.tsx b/components/navigation/sidebar/nav-link.tsx similarity index 95% rename from components/sidebar/nav-link.tsx rename to components/navigation/sidebar/nav-link.tsx index 14de25c..bdc8441 100644 --- a/components/sidebar/nav-link.tsx +++ b/components/navigation/sidebar/nav-link.tsx @@ -10,6 +10,7 @@ import { RiFundsLine, RiGroupLine, RiPriceTag3Line, + RiSecurePaymentLine, RiSettings2Line, RiSparklingLine, RiTodoLine, @@ -165,6 +166,11 @@ export function createSidebarNavData( url: "/relatorios/uso-cartoes", icon: RiBankCard2Line, }, + { + title: "Análise de Parcelas", + url: "/relatorios/analise-parcelas", + icon: RiSecurePaymentLine, + }, ], }, ], diff --git a/components/sidebar/nav-main.tsx b/components/navigation/sidebar/nav-main.tsx similarity index 100% rename from components/sidebar/nav-main.tsx rename to components/navigation/sidebar/nav-main.tsx diff --git a/components/sidebar/nav-secondary.tsx b/components/navigation/sidebar/nav-secondary.tsx similarity index 100% rename from components/sidebar/nav-secondary.tsx rename to components/navigation/sidebar/nav-secondary.tsx diff --git a/components/sidebar/nav-user.tsx b/components/navigation/sidebar/nav-user.tsx similarity index 100% rename from components/sidebar/nav-user.tsx rename to components/navigation/sidebar/nav-user.tsx diff --git a/components/orcamentos/budgets-page.tsx b/components/orcamentos/budgets-page.tsx index 59fc794..c70daf8 100644 --- a/components/orcamentos/budgets-page.tsx +++ b/components/orcamentos/budgets-page.tsx @@ -8,7 +8,7 @@ import { duplicatePreviousMonthBudgetsAction, } from "@/app/(dashboard)/orcamentos/actions"; import { ConfirmActionDialog } from "@/components/confirm-action-dialog"; -import { EmptyState } from "@/components/empty-state"; +import { EmptyState } from "@/components/shared/empty-state"; import { Button } from "@/components/ui/button"; import { Card } from "../ui/card"; import { BudgetCard } from "./budget-card"; diff --git a/components/period-picker.tsx b/components/period-picker.tsx index 7425d20..522b8fb 100644 --- a/components/period-picker.tsx +++ b/components/period-picker.tsx @@ -5,7 +5,7 @@ import { format } from "date-fns"; import { ptBR } from "date-fns/locale"; import { useState } from "react"; import { Button } from "@/components/ui/button"; -import { MonthPicker } from "@/components/ui/monthpicker"; +import { MonthPicker } from "@/components/ui/month-picker"; import { Popover, PopoverContent, diff --git a/components/relatorios/category-report-chart.tsx b/components/relatorios/category-report-chart.tsx index 72f80ac..574cf1f 100644 --- a/components/relatorios/category-report-chart.tsx +++ b/components/relatorios/category-report-chart.tsx @@ -9,7 +9,7 @@ import { type TooltipProps, XAxis, } from "recharts"; -import { EmptyState } from "@/components/empty-state"; +import { EmptyState } from "@/components/shared/empty-state"; import { Card, CardContent, diff --git a/components/relatorios/category-report-filters.tsx b/components/relatorios/category-report-filters.tsx index 51dfd9e..e4c9e3e 100644 --- a/components/relatorios/category-report-filters.tsx +++ b/components/relatorios/category-report-filters.tsx @@ -18,7 +18,7 @@ import { CommandItem, CommandList, } from "@/components/ui/command"; -import { MonthPicker } from "@/components/ui/monthpicker"; +import { MonthPicker } from "@/components/ui/month-picker"; import { Popover, PopoverContent, diff --git a/components/relatorios/category-report-page.tsx b/components/relatorios/category-report-page.tsx index f86e223..6033146 100644 --- a/components/relatorios/category-report-page.tsx +++ b/components/relatorios/category-report-page.tsx @@ -7,8 +7,8 @@ import { } from "@remixicon/react"; import { useRouter, useSearchParams } from "next/navigation"; import { useCallback, useMemo, useState, useTransition } from "react"; -import { EmptyState } from "@/components/empty-state"; -import { CategoryReportSkeleton } from "@/components/skeletons/category-report-skeleton"; +import { EmptyState } from "@/components/shared/empty-state"; +import { CategoryReportSkeleton } from "@/components/shared/skeletons/category-report-skeleton"; import { Card } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import type { CategoryChartData } from "@/lib/relatorios/fetch-category-chart-data"; diff --git a/components/empty-state.tsx b/components/shared/empty-state.tsx similarity index 100% rename from components/empty-state.tsx rename to components/shared/empty-state.tsx diff --git a/components/page-description.tsx b/components/shared/page-description.tsx similarity index 100% rename from components/page-description.tsx rename to components/shared/page-description.tsx diff --git a/components/refresh-page-button.tsx b/components/shared/refresh-page-button.tsx similarity index 100% rename from components/refresh-page-button.tsx rename to components/shared/refresh-page-button.tsx diff --git a/components/skeletons/account-statement-card-skeleton.tsx b/components/shared/skeletons/account-statement-card-skeleton.tsx similarity index 100% rename from components/skeletons/account-statement-card-skeleton.tsx rename to components/shared/skeletons/account-statement-card-skeleton.tsx diff --git a/components/skeletons/category-report-skeleton.tsx b/components/shared/skeletons/category-report-skeleton.tsx similarity index 100% rename from components/skeletons/category-report-skeleton.tsx rename to components/shared/skeletons/category-report-skeleton.tsx diff --git a/components/skeletons/dashboard-grid-skeleton.tsx b/components/shared/skeletons/dashboard-grid-skeleton.tsx similarity index 100% rename from components/skeletons/dashboard-grid-skeleton.tsx rename to components/shared/skeletons/dashboard-grid-skeleton.tsx diff --git a/components/skeletons/filter-skeleton.tsx b/components/shared/skeletons/filter-skeleton.tsx similarity index 100% rename from components/skeletons/filter-skeleton.tsx rename to components/shared/skeletons/filter-skeleton.tsx diff --git a/components/skeletons/index.ts b/components/shared/skeletons/index.ts similarity index 100% rename from components/skeletons/index.ts rename to components/shared/skeletons/index.ts diff --git a/components/skeletons/invoice-summary-card-skeleton.tsx b/components/shared/skeletons/invoice-summary-card-skeleton.tsx similarity index 100% rename from components/skeletons/invoice-summary-card-skeleton.tsx rename to components/shared/skeletons/invoice-summary-card-skeleton.tsx diff --git a/components/skeletons/section-cards-skeleton.tsx b/components/shared/skeletons/section-cards-skeleton.tsx similarity index 100% rename from components/skeletons/section-cards-skeleton.tsx rename to components/shared/skeletons/section-cards-skeleton.tsx diff --git a/components/skeletons/transactions-table-skeleton.tsx b/components/shared/skeletons/transactions-table-skeleton.tsx similarity index 100% rename from components/skeletons/transactions-table-skeleton.tsx rename to components/shared/skeletons/transactions-table-skeleton.tsx diff --git a/components/skeletons/widget-skeleton.tsx b/components/shared/skeletons/widget-skeleton.tsx similarity index 100% rename from components/skeletons/widget-skeleton.tsx rename to components/shared/skeletons/widget-skeleton.tsx diff --git a/components/top-estabelecimentos/establishments-list.tsx b/components/top-estabelecimentos/establishments-list.tsx deleted file mode 100644 index 1681863..0000000 --- a/components/top-estabelecimentos/establishments-list.tsx +++ /dev/null @@ -1,130 +0,0 @@ -"use client"; - -import { RiStore2Line } from "@remixicon/react"; -import MoneyValues from "@/components/money-values"; -import { Badge } from "@/components/ui/badge"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { WidgetEmptyState } from "@/components/widget-empty-state"; -import type { TopEstabelecimentosData } from "@/lib/top-estabelecimentos/fetch-data"; -import { Progress } from "../ui/progress"; - -type EstablishmentsListProps = { - establishments: TopEstabelecimentosData["establishments"]; -}; - -const buildInitials = (value: string) => { - const parts = value.trim().split(/\s+/).filter(Boolean); - if (parts.length === 0) return "ES"; - if (parts.length === 1) { - const firstPart = parts[0]; - return firstPart ? firstPart.slice(0, 2).toUpperCase() : "ES"; - } - const firstChar = parts[0]?.[0] ?? ""; - const secondChar = parts[1]?.[0] ?? ""; - return `${firstChar}${secondChar}`.toUpperCase() || "ES"; -}; - -export function EstablishmentsList({ - establishments, -}: EstablishmentsListProps) { - if (establishments.length === 0) { - return ( - - - - - Top Estabelecimentos - - - - } - title="Nenhum estabelecimento encontrado" - description="Quando houver compras registradas, elas aparecerão aqui." - /> - - - ); - } - - const maxCount = Math.max(...establishments.map((e) => e.count)); - - return ( - - - - - Top Estabelecimentos por Frequência - - - -
- {establishments.map((establishment, index) => { - const _initials = buildInitials(establishment.name); - - return ( -
-
-
- {/* Rank number - same size as icon containers */} -
- - {index + 1} - -
- - {/* Name and categories */} -
- - {establishment.name} - -
- {establishment.categories - .slice(0, 2) - .map((cat, catIndex) => ( - - {cat.name} - - ))} -
-
-
- - {/* Value and stats */} -
- - - {establishment.count}x • Média:{" "} - - -
-
- - {/* Progress bar */} -
- -
-
- ); - })} -
-
-
- ); -} diff --git a/components/top-estabelecimentos/highlights-cards.tsx b/components/top-estabelecimentos/highlights-cards.tsx deleted file mode 100644 index 0378663..0000000 --- a/components/top-estabelecimentos/highlights-cards.tsx +++ /dev/null @@ -1,51 +0,0 @@ -"use client"; - -import { RiFireLine, RiTrophyLine } from "@remixicon/react"; -import { Card, CardContent } from "@/components/ui/card"; -import type { TopEstabelecimentosData } from "@/lib/top-estabelecimentos/fetch-data"; - -type HighlightsCardsProps = { - summary: TopEstabelecimentosData["summary"]; -}; - -export function HighlightsCards({ summary }: HighlightsCardsProps) { - return ( -
- - -
-
- -
-
-

- Mais Frequente -

-

- {summary.mostFrequent || "—"} -

-
-
-
-
- - - -
-
- -
-
-

- Maior Gasto Total -

-

- {summary.highestSpending || "—"} -

-
-
-
-
-
- ); -} diff --git a/components/top-estabelecimentos/period-filter.tsx b/components/top-estabelecimentos/period-filter.tsx deleted file mode 100644 index d1bf19a..0000000 --- a/components/top-estabelecimentos/period-filter.tsx +++ /dev/null @@ -1,48 +0,0 @@ -"use client"; - -import { useRouter, useSearchParams } from "next/navigation"; -import { Button } from "@/components/ui/button"; -import type { PeriodFilter } from "@/lib/top-estabelecimentos/fetch-data"; -import { cn } from "@/lib/utils"; - -type PeriodFilterProps = { - currentFilter: PeriodFilter; -}; - -const filterOptions: { value: PeriodFilter; label: string }[] = [ - { value: "3", label: "3 meses" }, - { value: "6", label: "6 meses" }, - { value: "12", label: "12 meses" }, -]; - -export function PeriodFilterButtons({ currentFilter }: PeriodFilterProps) { - const router = useRouter(); - const searchParams = useSearchParams(); - - const handleFilterChange = (filter: PeriodFilter) => { - const params = new URLSearchParams(searchParams.toString()); - params.set("meses", filter); - router.push(`/relatorios/estabelecimentos?${params.toString()}`); - }; - - return ( -
-
- {filterOptions.map((option) => ( - - ))} -
-
- ); -} diff --git a/components/top-estabelecimentos/summary-cards.tsx b/components/top-estabelecimentos/summary-cards.tsx deleted file mode 100644 index 3b26655..0000000 --- a/components/top-estabelecimentos/summary-cards.tsx +++ /dev/null @@ -1,78 +0,0 @@ -"use client"; - -import { - RiExchangeLine, - RiMoneyDollarCircleLine, - RiRepeatLine, - RiStore2Line, -} from "@remixicon/react"; -import MoneyValues from "@/components/money-values"; -import { Card, CardContent } from "@/components/ui/card"; -import type { TopEstabelecimentosData } from "@/lib/top-estabelecimentos/fetch-data"; - -type SummaryCardsProps = { - summary: TopEstabelecimentosData["summary"]; -}; - -export function SummaryCards({ summary }: SummaryCardsProps) { - const cards = [ - { - title: "Estabelecimentos", - value: summary.totalEstablishments, - isMoney: false, - icon: RiStore2Line, - description: "Locais diferentes", - }, - { - title: "Transações", - value: summary.totalTransactions, - isMoney: false, - icon: RiExchangeLine, - description: "Compras no período", - }, - { - title: "Total Gasto", - value: summary.totalSpent, - isMoney: true, - icon: RiMoneyDollarCircleLine, - description: "Soma de todas as compras", - }, - { - title: "Ticket Médio", - value: summary.avgPerTransaction, - isMoney: true, - icon: RiRepeatLine, - description: "Média por transação", - }, - ]; - - return ( -
- {cards.map((card) => ( - - -
-
-

- {card.title} -

- {card.isMoney ? ( - - ) : ( -

{card.value}

- )} -

- {card.description} -

-
- -
-
-
- ))} -
- ); -} diff --git a/components/top-estabelecimentos/top-categories.tsx b/components/top-estabelecimentos/top-categories.tsx deleted file mode 100644 index 8648fa7..0000000 --- a/components/top-estabelecimentos/top-categories.tsx +++ /dev/null @@ -1,97 +0,0 @@ -"use client"; - -import { RiPriceTag3Line } from "@remixicon/react"; -import { CategoryIconBadge } from "@/components/categorias/category-icon-badge"; -import MoneyValues from "@/components/money-values"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { WidgetEmptyState } from "@/components/widget-empty-state"; -import type { TopEstabelecimentosData } from "@/lib/top-estabelecimentos/fetch-data"; -import { Progress } from "../ui/progress"; - -type TopCategoriesProps = { - categories: TopEstabelecimentosData["topCategories"]; -}; - -export function TopCategories({ categories }: TopCategoriesProps) { - if (categories.length === 0) { - return ( - - - - - Principais Categorias - - - - } - title="Nenhuma categoria encontrada" - description="Quando houver despesas categorizadas, elas aparecerão aqui." - /> - - - ); - } - - const totalAmount = categories.reduce((acc, c) => acc + c.totalAmount, 0); - - return ( - - - - - Principais Categorias - - - -
- {categories.map((category, index) => { - const percent = - totalAmount > 0 ? (category.totalAmount / totalAmount) * 100 : 0; - - return ( -
-
-
- - - {/* Name and percentage */} -
- - {category.name} - - - {percent.toFixed(0)}% do total •{" "} - {category.transactionCount}x - -
-
- - {/* Value */} -
- -
-
- - {/* Progress bar */} -
- -
-
- ); - })} -
-
-
- ); -} diff --git a/components/ui/monthpicker.tsx b/components/ui/month-picker.tsx similarity index 100% rename from components/ui/monthpicker.tsx rename to components/ui/month-picker.tsx diff --git a/lib/accounts/constants.ts b/lib/contas/constants.ts similarity index 100% rename from lib/accounts/constants.ts rename to lib/contas/constants.ts diff --git a/lib/dashboard/accounts.ts b/lib/dashboard/accounts.ts index 3b1d6bc..492d6b4 100644 --- a/lib/dashboard/accounts.ts +++ b/lib/dashboard/accounts.ts @@ -1,6 +1,6 @@ import { and, eq, sql } from "drizzle-orm"; import { contas, lancamentos, pagadores } from "@/db/schema"; -import { INITIAL_BALANCE_NOTE } from "@/lib/accounts/constants"; +import { INITIAL_BALANCE_NOTE } from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; diff --git a/lib/dashboard/categories/category-details.ts b/lib/dashboard/categories/category-details.ts index 7798034..787a23a 100644 --- a/lib/dashboard/categories/category-details.ts +++ b/lib/dashboard/categories/category-details.ts @@ -1,10 +1,10 @@ import { and, desc, eq, isNull, ne, or, sql } from "drizzle-orm"; import { categorias, contas, lancamentos, pagadores } from "@/db/schema"; +import type { CategoryType } from "@/lib/categorias/constants"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; -import type { CategoryType } from "@/lib/categorias/constants"; +} from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { mapLancamentosData } from "@/lib/lancamentos/page-helpers"; diff --git a/lib/dashboard/categories/category-history.ts b/lib/dashboard/categories/category-history.ts index 8e0f57a..8438121 100644 --- a/lib/dashboard/categories/category-history.ts +++ b/lib/dashboard/categories/category-history.ts @@ -2,7 +2,7 @@ import { addMonths, format } from "date-fns"; import { ptBR } from "date-fns/locale"; import { and, eq, inArray, isNull, or, sql } from "drizzle-orm"; import { categorias, lancamentos, pagadores } from "@/db/schema"; -import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; +import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; diff --git a/lib/dashboard/categories/expenses-by-category.ts b/lib/dashboard/categories/expenses-by-category.ts index 70c5de0..7aaf5f3 100644 --- a/lib/dashboard/categories/expenses-by-category.ts +++ b/lib/dashboard/categories/expenses-by-category.ts @@ -1,6 +1,6 @@ import { and, eq, inArray, isNull, or, sql } from "drizzle-orm"; import { categorias, lancamentos, orcamentos } from "@/db/schema"; -import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; +import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; diff --git a/lib/dashboard/categories/income-by-category.ts b/lib/dashboard/categories/income-by-category.ts index d544d1f..dd38246 100644 --- a/lib/dashboard/categories/income-by-category.ts +++ b/lib/dashboard/categories/income-by-category.ts @@ -3,7 +3,7 @@ import { categorias, contas, lancamentos, orcamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; +} from "@/lib/contas/constants"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; import { calculatePercentageChange } from "@/lib/utils/math"; diff --git a/lib/dashboard/expenses/installment-analysis.ts b/lib/dashboard/expenses/installment-analysis.ts index ab83a36..c65b073 100644 --- a/lib/dashboard/expenses/installment-analysis.ts +++ b/lib/dashboard/expenses/installment-analysis.ts @@ -3,7 +3,7 @@ import { cartoes, lancamentos, pagadores } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; +} from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; @@ -172,8 +172,5 @@ export async function fetchInstallmentAnalysis( 0, ); - return { - installmentGroups, - totalPendingInstallments, - }; + return { installmentGroups, totalPendingInstallments }; } diff --git a/lib/dashboard/expenses/installment-expenses.ts b/lib/dashboard/expenses/installment-expenses.ts index aef40a1..939e38d 100644 --- a/lib/dashboard/expenses/installment-expenses.ts +++ b/lib/dashboard/expenses/installment-expenses.ts @@ -3,7 +3,7 @@ import { lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; +} from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; @@ -65,9 +65,11 @@ export async function fetchInstallmentExpenses( ) .orderBy(desc(lancamentos.purchaseDate), desc(lancamentos.createdAt)); + type InstallmentExpenseRow = (typeof rows)[number]; + const expenses = rows .map( - (row): InstallmentExpense => ({ + (row: InstallmentExpenseRow): InstallmentExpense => ({ id: row.id, name: row.name, amount: Math.abs(toNumber(row.amount)), @@ -79,7 +81,7 @@ export async function fetchInstallmentExpenses( period: row.period, }), ) - .sort((a, b) => { + .sort((a: InstallmentExpense, b: InstallmentExpense) => { // Calcula parcelas restantes para cada item const remainingA = a.installmentCount && a.currentInstallment @@ -94,7 +96,5 @@ export async function fetchInstallmentExpenses( return remainingA - remainingB; }); - return { - expenses, - }; + return { expenses }; } diff --git a/lib/dashboard/expenses/recurring-expenses.ts b/lib/dashboard/expenses/recurring-expenses.ts index 2a4c6b9..94e5cf7 100644 --- a/lib/dashboard/expenses/recurring-expenses.ts +++ b/lib/dashboard/expenses/recurring-expenses.ts @@ -3,7 +3,7 @@ import { lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; +} from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; diff --git a/lib/dashboard/expenses/top-expenses.ts b/lib/dashboard/expenses/top-expenses.ts index 9176861..07c8136 100644 --- a/lib/dashboard/expenses/top-expenses.ts +++ b/lib/dashboard/expenses/top-expenses.ts @@ -3,7 +3,7 @@ import { cartoes, contas, lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; +} from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; diff --git a/lib/dashboard/income-expense-balance.ts b/lib/dashboard/income-expense-balance.ts index 8c4fd29..9cabbab 100644 --- a/lib/dashboard/income-expense-balance.ts +++ b/lib/dashboard/income-expense-balance.ts @@ -3,7 +3,7 @@ import { contas, lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; +} from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; diff --git a/lib/dashboard/invoices.ts b/lib/dashboard/invoices.ts index caf1b94..b19a0e6 100644 --- a/lib/dashboard/invoices.ts +++ b/lib/dashboard/invoices.ts @@ -1,6 +1,6 @@ import { and, eq, ilike, isNotNull, sql } from "drizzle-orm"; import { cartoes, faturas, lancamentos, pagadores } from "@/db/schema"; -import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; +import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { diff --git a/lib/dashboard/metrics.ts b/lib/dashboard/metrics.ts index 28e1ec9..05022d2 100644 --- a/lib/dashboard/metrics.ts +++ b/lib/dashboard/metrics.ts @@ -15,7 +15,7 @@ import { contas, lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; +} from "@/lib/contas/constants"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; import { safeToNumber } from "@/lib/utils/number"; diff --git a/lib/dashboard/pagadores.ts b/lib/dashboard/pagadores.ts index 2c7e19c..98d9405 100644 --- a/lib/dashboard/pagadores.ts +++ b/lib/dashboard/pagadores.ts @@ -1,6 +1,6 @@ import { and, desc, eq, inArray, isNull, or, sql } from "drizzle-orm"; import { lancamentos, pagadores } from "@/db/schema"; -import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; +import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; diff --git a/lib/dashboard/payments/payment-conditions.ts b/lib/dashboard/payments/payment-conditions.ts index 6d0e784..c1eb0eb 100644 --- a/lib/dashboard/payments/payment-conditions.ts +++ b/lib/dashboard/payments/payment-conditions.ts @@ -3,7 +3,7 @@ import { lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; +} from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; diff --git a/lib/dashboard/payments/payment-methods.ts b/lib/dashboard/payments/payment-methods.ts index 4ebcf4c..38a8583 100644 --- a/lib/dashboard/payments/payment-methods.ts +++ b/lib/dashboard/payments/payment-methods.ts @@ -3,7 +3,7 @@ import { lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; +} from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; diff --git a/lib/dashboard/payments/payment-status.ts b/lib/dashboard/payments/payment-status.ts index 32542d3..2839a59 100644 --- a/lib/dashboard/payments/payment-status.ts +++ b/lib/dashboard/payments/payment-status.ts @@ -1,6 +1,6 @@ import { and, eq, inArray, sql } from "drizzle-orm"; import { lancamentos } from "@/db/schema"; -import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; +import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; diff --git a/lib/dashboard/purchases-by-category.ts b/lib/dashboard/purchases-by-category.ts index 5892b7d..2d266c0 100644 --- a/lib/dashboard/purchases-by-category.ts +++ b/lib/dashboard/purchases-by-category.ts @@ -3,7 +3,7 @@ import { cartoes, categorias, contas, lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; +} from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; diff --git a/lib/dashboard/top-establishments.ts b/lib/dashboard/top-establishments.ts index d7057c7..93d5667 100644 --- a/lib/dashboard/top-establishments.ts +++ b/lib/dashboard/top-establishments.ts @@ -3,7 +3,7 @@ import { cartoes, contas, lancamentos } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; +} from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; diff --git a/lib/dashboard/widgets/widgets-config.tsx b/lib/dashboard/widgets/widgets-config.tsx index b1461f9..bbb1d42 100644 --- a/lib/dashboard/widgets/widgets-config.tsx +++ b/lib/dashboard/widgets/widgets-config.tsx @@ -17,11 +17,11 @@ import { import Link from "next/link"; import type { ReactNode } from "react"; import { BoletosWidget } from "@/components/dashboard/boletos-widget"; +import { InstallmentExpensesWidget } from "@/components/dashboard/installment-expenses-widget"; import { ExpensesByCategoryWidgetWithChart } from "@/components/dashboard/expenses-by-category-widget-with-chart"; import { GoalsProgressWidget } from "@/components/dashboard/goals-progress-widget"; import { IncomeByCategoryWidgetWithChart } from "@/components/dashboard/income-by-category-widget-with-chart"; import { IncomeExpenseBalanceWidget } from "@/components/dashboard/income-expense-balance-widget"; -import { InstallmentExpensesWidget } from "@/components/dashboard/installment-expenses-widget"; import { InvoicesWidget } from "@/components/dashboard/invoices-widget"; import { MyAccountsWidget } from "@/components/dashboard/my-accounts-widget"; import { NotesWidget } from "@/components/dashboard/notes-widget"; @@ -31,7 +31,7 @@ import { PaymentStatusWidget } from "@/components/dashboard/payment-status-widge import { PurchasesByCategoryWidget } from "@/components/dashboard/purchases-by-category-widget"; import { RecurringExpensesWidget } from "@/components/dashboard/recurring-expenses-widget"; import { SpendingOverviewWidget } from "@/components/dashboard/spending-overview-widget"; -import type { DashboardData } from "./fetch-dashboard-data"; +import type { DashboardData } from "../fetch-dashboard-data"; export type WidgetConfig = { id: string; @@ -173,15 +173,6 @@ export const widgetsConfig: WidgetConfig[] = [ component: ({ data }) => ( ), - action: ( - - Análise - - - ), }, { id: "spending-overview", diff --git a/lib/lancamentos/page-helpers.ts b/lib/lancamentos/page-helpers.ts index b8e22e6..665a4a1 100644 --- a/lib/lancamentos/page-helpers.ts +++ b/lib/lancamentos/page-helpers.ts @@ -8,7 +8,7 @@ import { lancamentos, pagadores, } from "@/db/schema"; -import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; +import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/contas/constants"; import { db } from "@/lib/db"; import { LANCAMENTO_CONDITIONS, diff --git a/lib/pagadores/details.ts b/lib/pagadores/details.ts index d05c053..7608403 100644 --- a/lib/pagadores/details.ts +++ b/lib/pagadores/details.ts @@ -12,7 +12,7 @@ import { sum, } from "drizzle-orm"; import { cartoes, lancamentos } from "@/db/schema"; -import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; +import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/contas/constants"; import { db } from "@/lib/db"; const RECEITA = "Receita"; diff --git a/lib/top-estabelecimentos/fetch-data.ts b/lib/relatorios/estabelecimentos/fetch-data.ts similarity index 99% rename from lib/top-estabelecimentos/fetch-data.ts rename to lib/relatorios/estabelecimentos/fetch-data.ts index 79a221f..2f33241 100644 --- a/lib/top-estabelecimentos/fetch-data.ts +++ b/lib/relatorios/estabelecimentos/fetch-data.ts @@ -17,7 +17,7 @@ import { categorias, contas, lancamentos, pagadores } from "@/db/schema"; import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX, INITIAL_BALANCE_NOTE, -} from "@/lib/accounts/constants"; +} from "@/lib/contas/constants"; import { db } from "@/lib/db"; import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; import { safeToNumber } from "@/lib/utils/number"; diff --git a/lib/relatorios/fetch-category-chart-data.ts b/lib/relatorios/fetch-category-chart-data.ts index 94bd610..f368e10 100644 --- a/lib/relatorios/fetch-category-chart-data.ts +++ b/lib/relatorios/fetch-category-chart-data.ts @@ -2,7 +2,7 @@ import { format } from "date-fns"; import { ptBR } from "date-fns/locale"; import { and, eq, inArray, isNull, or, sql } from "drizzle-orm"; import { categorias, lancamentos } from "@/db/schema"; -import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; +import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id"; diff --git a/lib/relatorios/fetch-category-report.ts b/lib/relatorios/fetch-category-report.ts index 5ca08cc..a2335a3 100644 --- a/lib/relatorios/fetch-category-report.ts +++ b/lib/relatorios/fetch-category-report.ts @@ -1,6 +1,6 @@ import { and, eq, inArray, isNull, or, sql } from "drizzle-orm"; import { categorias, lancamentos } from "@/db/schema"; -import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants"; +import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/contas/constants"; import { toNumber } from "@/lib/dashboard/common"; import { db } from "@/lib/db"; import { getAdminPagadorId } from "@/lib/pagadores/get-admin-id";