refactor(sidebar): reorganizar navegação e aplicar formatação Biome

- Simplifica estrutura da sidebar combinando seções "Visão Geral" e "Gestão Financeira"
- Renomeia itens de relatórios para maior clareza ("Tendências", "Uso de Cartões")
- Aplica correções de formatação do Biome (ordenação de imports, quebras de linha)
- Remove código comentado não utilizado
- Adiciona migração 0014 do Drizzle

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Felipe Coutinho
2026-01-29 13:16:39 +00:00
parent 120da3659b
commit df1d149e4a
43 changed files with 4446 additions and 2515 deletions

View File

@@ -5,7 +5,7 @@ import { and, eq, isNull, ne } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import { headers } from "next/headers";
import { z } from "zod";
import { tokensApi, pagadores } from "@/db/schema";
import { pagadores, tokensApi } from "@/db/schema";
import { auth } from "@/lib/auth/config";
import { db, schema } from "@/lib/db";
import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants";

View File

@@ -11,10 +11,10 @@ import {
cartoes,
categorias,
contas,
insightsSalvos,
lancamentos,
orcamentos,
pagadores,
insightsSalvos,
} from "@/db/schema";
import { ACCOUNT_AUTO_INVOICE_NOTE_PREFIX } from "@/lib/accounts/constants";
import { getUser } from "@/lib/auth/server";
@@ -752,7 +752,10 @@ export async function saveInsightsAction(
modelId,
data: JSON.stringify(data),
})
.returning({ id: insightsSalvos.id, createdAt: insightsSalvos.createdAt });
.returning({
id: insightsSalvos.id,
createdAt: insightsSalvos.createdAt,
});
const insertedRecord = result[0];
if (!insertedRecord) {

View File

@@ -4,8 +4,8 @@ import { and, asc, desc, eq, inArray, isNull, or } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import { z } from "zod";
import {
categorias,
antecipacoesParcelas,
categorias,
lancamentos,
pagadores,
} from "@/db/schema";
@@ -320,10 +320,7 @@ export async function getInstallmentAnticipationsAction(
eq(antecipacoesParcelas.lancamentoId, lancamentos.id),
)
.leftJoin(pagadores, eq(antecipacoesParcelas.pagadorId, pagadores.id))
.leftJoin(
categorias,
eq(antecipacoesParcelas.categoriaId, categorias.id),
)
.leftJoin(categorias, eq(antecipacoesParcelas.categoriaId, categorias.id))
.where(
and(
eq(antecipacoesParcelas.seriesId, validatedSeriesId),

View File

@@ -2,10 +2,10 @@ import { and, desc, eq, type SQL } from "drizzle-orm";
import {
cartoes,
categorias,
compartilhamentosPagador,
contas,
lancamentos,
pagadores,
compartilhamentosPagador,
user as usersTable,
} from "@/db/schema";
import { db } from "@/lib/db";
@@ -30,7 +30,10 @@ export async function fetchPagadorShares(
userEmail: usersTable.email,
})
.from(compartilhamentosPagador)
.innerJoin(usersTable, eq(compartilhamentosPagador.sharedWithUserId, usersTable.id))
.innerJoin(
usersTable,
eq(compartilhamentosPagador.sharedWithUserId, usersTable.id),
)
.where(eq(compartilhamentosPagador.pagadorId, pagadorId));
return shareRows.map((share) => ({

View File

@@ -4,7 +4,7 @@ import { randomBytes } from "node:crypto";
import { and, eq } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import { z } from "zod";
import { pagadores, compartilhamentosPagador, user } from "@/db/schema";
import { compartilhamentosPagador, pagadores, user } from "@/db/schema";
import { handleActionError, revalidateForEntity } from "@/lib/actions/helpers";
import type { ActionResult } from "@/lib/actions/types";
import { getUser } from "@/lib/auth/server";
@@ -287,7 +287,9 @@ export async function deletePagadorShareAction(
};
}
await db.delete(compartilhamentosPagador).where(eq(compartilhamentosPagador.id, data.shareId));
await db
.delete(compartilhamentosPagador)
.where(eq(compartilhamentosPagador.id, data.shareId));
revalidate();
revalidatePath(`/pagadores/${existing.pagadorId}`);

View File

@@ -1,5 +1,3 @@
import { and, desc, eq, gte } from "drizzle-orm";
import type {
InboxItem,
@@ -9,8 +7,8 @@ import {
cartoes,
categorias,
contas,
preLancamentos,
lancamentos,
preLancamentos,
} from "@/db/schema";
import { db } from "@/lib/db";
import {
@@ -26,7 +24,9 @@ export async function fetchInboxItems(
const items = await db
.select()
.from(preLancamentos)
.where(and(eq(preLancamentos.userId, userId), eq(preLancamentos.status, status)))
.where(
and(eq(preLancamentos.userId, userId), eq(preLancamentos.status, status)),
)
.orderBy(desc(preLancamentos.createdAt));
return items;
@@ -39,7 +39,9 @@ export async function fetchInboxItemById(
const [item] = await db
.select()
.from(preLancamentos)
.where(and(eq(preLancamentos.id, itemId), eq(preLancamentos.userId, userId)))
.where(
and(eq(preLancamentos.id, itemId), eq(preLancamentos.userId, userId)),
)
.limit(1);
return item ?? null;
@@ -91,7 +93,10 @@ export async function fetchPendingInboxCount(userId: string): Promise<number> {
.select({ id: preLancamentos.id })
.from(preLancamentos)
.where(
and(eq(preLancamentos.userId, userId), eq(preLancamentos.status, "pending")),
and(
eq(preLancamentos.userId, userId),
eq(preLancamentos.status, "pending"),
),
);
return items.length;

View File

@@ -2,7 +2,7 @@ import { RiBankCard2Line } from "@remixicon/react";
import PageDescription from "@/components/page-description";
export const metadata = {
title: "Relatório de Cartões | Opensheets",
title: "Uso de Cartões | Opensheets",
};
export default function RootLayout({
@@ -14,7 +14,7 @@ export default function RootLayout({
<section className="space-y-6 px-6">
<PageDescription
icon={<RiBankCard2Line />}
title="Relatório de Cartões"
title="Uso de Cartões"
subtitle="Análise detalhada do uso dos seus cartões de crédito."
/>
{children}

View File

@@ -2,7 +2,7 @@ import { RiFileChartLine } from "@remixicon/react";
import PageDescription from "@/components/page-description";
export const metadata = {
title: "Relatórios | Opensheets",
title: "Tendências | Opensheets",
};
export default function RootLayout({
@@ -14,7 +14,7 @@ export default function RootLayout({
<section className="space-y-6 px-6">
<PageDescription
icon={<RiFileChartLine />}
title="Relatórios de Categorias"
title="Tendências"
subtitle="Acompanhe a evolução dos seus gastos e receitas por categoria ao longo do tempo."
/>
{children}