Files
openmonetis/lib/categorias/defaults.ts
Felipe Coutinho df1d149e4a 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>
2026-01-29 13:16:39 +00:00

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,
})),
);
}