diff options
Diffstat (limited to 'api/src/db/schema/users.ts')
| -rw-r--r-- | api/src/db/schema/users.ts | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/api/src/db/schema/users.ts b/api/src/db/schema/users.ts new file mode 100644 index 0000000..636ad2d --- /dev/null +++ b/api/src/db/schema/users.ts @@ -0,0 +1,37 @@ +import { sql } from 'drizzle-orm'; +import { integer, real, sqliteTable, text } from 'drizzle-orm/sqlite-core'; + +/** + * Tabela de usuários. + * Por ora, suporta um único usuário local (single-user app). + * O campo `net_salary_override` permite que o usuário edite manualmente + * o salário líquido calculado, para cobrir descontos extras (plano de saúde, VT, etc.). + */ +export const users = sqliteTable('users', { + id: integer('id').primaryKey({ autoIncrement: true }), + + name: text('name').notNull(), + email: text('email').unique().notNull(), + password_hash: text('password_hash').notNull(), + + /** Salário bruto informado pelo usuário (em R$) */ + gross_salary: real('gross_salary').notNull().default(0), + + /** + * Override manual do salário líquido. + * Quando NULL, o app usa o valor calculado automaticamente (INSS + IRRF). + * Quando preenchido, este valor é usado como base para o saldo disponível. + */ + net_salary_override: real('net_salary_override'), + + 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 User = typeof users.$inferSelect; +export type NewUser = typeof users.$inferInsert; |