- 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>
84 lines
2.9 KiB
TypeScript
84 lines
2.9 KiB
TypeScript
import { eq } from "drizzle-orm";
|
|
import { categorias } from "@/db/schema";
|
|
import type { CategoryType } from "@/lib/categorias/constants";
|
|
import { db } from "@/lib/db";
|
|
|
|
export type DefaultCategory = {
|
|
name: string;
|
|
type: CategoryType;
|
|
icon: string | null;
|
|
};
|
|
|
|
export const DEFAULT_CATEGORIES: DefaultCategory[] = [
|
|
// Despesas
|
|
{ name: "Alimentação", type: "despesa", icon: "RiRestaurant2Line" },
|
|
{ name: "Transporte", type: "despesa", icon: "RiBusLine" },
|
|
{ name: "Moradia", type: "despesa", icon: "RiHomeLine" },
|
|
{ name: "Saúde", type: "despesa", icon: "RiStethoscopeLine" },
|
|
{ name: "Educação", type: "despesa", icon: "RiBook2Line" },
|
|
{ name: "Lazer", type: "despesa", icon: "RiGamepadLine" },
|
|
{ name: "Compras", type: "despesa", icon: "RiShoppingBagLine" },
|
|
{ name: "Assinaturas", type: "despesa", icon: "RiServiceLine" },
|
|
{ name: "Pets", type: "despesa", icon: "RiBearSmileLine" },
|
|
{ name: "Mercado", type: "despesa", icon: "RiShoppingBasketLine" },
|
|
{ name: "Restaurantes", type: "despesa", icon: "RiRestaurantLine" },
|
|
{ name: "Delivery", type: "despesa", icon: "RiMotorbikeLine" },
|
|
{ name: "Energia e água", type: "despesa", icon: "RiFlashlightLine" },
|
|
{ name: "Internet", type: "despesa", icon: "RiWifiLine" },
|
|
{ name: "Vestuário", type: "despesa", icon: "RiTShirtLine" },
|
|
{ name: "Viagem", type: "despesa", icon: "RiFlightTakeoffLine" },
|
|
{ name: "Presentes", type: "despesa", icon: "RiGiftLine" },
|
|
{ name: "Pagamentos", type: "despesa", icon: "RiBillLine" },
|
|
{ name: "Outras despesas", type: "despesa", icon: "RiMore2Line" },
|
|
|
|
// Receitas
|
|
{ name: "Salário", type: "receita", icon: "RiWallet3Line" },
|
|
{ name: "Freelance", type: "receita", icon: "RiUserStarLine" },
|
|
{ name: "Investimentos", type: "receita", icon: "RiStockLine" },
|
|
{ name: "Vendas", type: "receita", icon: "RiShoppingCartLine" },
|
|
{ name: "Prêmios", type: "receita", icon: "RiMedalLine" },
|
|
{ name: "Reembolso", type: "receita", icon: "RiRefundLine" },
|
|
{ name: "Aluguel recebido", type: "receita", icon: "RiBuilding2Line" },
|
|
{ name: "Outras receitas", type: "receita", icon: "RiMore2Line" },
|
|
{ name: "Saldo inicial", type: "receita", icon: "RiWallet2Line" },
|
|
|
|
// Categoria especial para transferências entre contas
|
|
{
|
|
name: "Transferência interna",
|
|
type: "receita",
|
|
icon: "RiArrowLeftRightLine",
|
|
},
|
|
];
|
|
|
|
/**
|
|
* Seeds default categories for a new user
|
|
* @param userId - User ID to seed categories for
|
|
*/
|
|
export async function seedDefaultCategoriesForUser(userId: string | undefined) {
|
|
if (!userId) {
|
|
return;
|
|
}
|
|
|
|
const existing = await db.query.categorias.findFirst({
|
|
columns: { id: true },
|
|
where: eq(categorias.userId, userId),
|
|
});
|
|
|
|
if (existing) {
|
|
return;
|
|
}
|
|
|
|
if (DEFAULT_CATEGORIES.length === 0) {
|
|
return;
|
|
}
|
|
|
|
await db.insert(categorias).values(
|
|
DEFAULT_CATEGORIES.map((category) => ({
|
|
name: category.name,
|
|
type: category.type,
|
|
icon: category.icon,
|
|
userId,
|
|
})),
|
|
);
|
|
}
|