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;
|