aboutsummaryrefslogtreecommitdiff
path: root/api/src/db/schema/one-time-expenses.ts
blob: 10c9c0144f32bff764ba54625e50de456336c592 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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;