import { sql } from 'drizzle-orm'; import { integer, real, sqliteTable, text } from 'drizzle-orm/sqlite-core'; import { users } from './users'; /** * Tabela de gastos avulsos (despesas pontuais). * Ex: Cinema, iFood, Uber, Farmácia. * Cada registro representa um gasto único em uma data específica. * O valor é subtraído do saldo disponível do mês em que a despesa ocorreu. */ export const oneTimeExpenses = sqliteTable('one_time_expenses', { id: integer('id').primaryKey({ autoIncrement: true }), user_id: integer('user_id') .notNull() .references(() => users.id, { onDelete: 'cascade' }), /** Nome/descrição do gasto (ex: "Cinema com a família", "iFood jantar") */ name: text('name').notNull(), /** Valor do gasto (em R$) */ amount: real('amount').notNull(), /** * Categoria do gasto para organização e futuros relatórios. * Ex: "alimentação", "lazer", "saúde", "transporte", "educação", "outros" */ category: text('category').notNull().default('outros'), /** Tipo do lançamento: 'expense' (despesa) ou 'income' (receita) */ type: text('type').notNull().default('expense'), /** * Data em que o gasto ocorreu. * Formato ISO 8601 (YYYY-MM-DD). Usado para atribuir o gasto ao mês correto. * Default: data atual no momento da inserção. */ expense_date: text('expense_date').notNull().default(sql`(date('now'))`), /** Observações opcionais (ex: "Split 50/50 com João") */ notes: text('notes'), created_at: text('created_at') .notNull() .default(sql`(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))`), updated_at: text('updated_at') .notNull() .default(sql`(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))`), }); export type OneTimeExpense = typeof oneTimeExpenses.$inferSelect; export type NewOneTimeExpense = typeof oneTimeExpenses.$inferInsert;