diff options
Diffstat (limited to 'api/src/db/schema/one-time-expenses.ts')
| -rw-r--r-- | api/src/db/schema/one-time-expenses.ts | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/api/src/db/schema/one-time-expenses.ts b/api/src/db/schema/one-time-expenses.ts new file mode 100644 index 0000000..10c9c01 --- /dev/null +++ b/api/src/db/schema/one-time-expenses.ts @@ -0,0 +1,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; |