aboutsummaryrefslogtreecommitdiff
path: root/api/src/db/schema/one-time-expenses.ts
diff options
context:
space:
mode:
authorLucas Faria Mendes <lucas.fariamo08@gmail.com>2026-08-16 23:17:42 +0000
committerLucas Faria Mendes <lucas.fariamo08@gmail.com>2026-08-16 23:17:42 +0000
commit375482e654a01615683867e732ac9e458c7cbe74 (patch)
tree12d1b31b8deb6bf8590bcdbc2cfb52dcc553e006 /api/src/db/schema/one-time-expenses.ts
parent2c2dfba45357bbd205a59145ae55a2779c911ae0 (diff)
downloadyaba-master.tar.gz
yaba-master.zip
feat: upload yaba srcHEADmaster
Signed-off-by: Lucas Faria Mendes <lucas.fariamo08@gmail.com>
Diffstat (limited to 'api/src/db/schema/one-time-expenses.ts')
-rw-r--r--api/src/db/schema/one-time-expenses.ts53
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;