aboutsummaryrefslogtreecommitdiff
path: root/api/src/db/schema/incomes.ts
blob: f502cb922f43de10823cc0753c0a93e5d1b3b810 (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
import { sql } from 'drizzle-orm';
import { integer, real, sqliteTable, text } from 'drizzle-orm/sqlite-core';
import { users } from './users';

/**
 * Tabela de rendas/salários.
 * Armazena o histórico de salários por mês/ano, permitindo que o usuário
 * tenha registros diferentes para cada período (ex: aumento de salário em julho).
 */
export const incomes = sqliteTable('incomes', {
  id: integer('id').primaryKey({ autoIncrement: true }),

  user_id: integer('user_id')
    .notNull()
    .references(() => users.id, { onDelete: 'cascade' }),

  /** Salário bruto do período (em R$) */
  gross_salary: real('gross_salary').notNull(),

  /**
   * Salário líquido calculado automaticamente pelo app (INSS + IRRF).
   * Armazenado para fins de histórico e auditoria.
   */
  calculated_net_salary: real('calculated_net_salary').notNull(),

  /**
   * Salário líquido efetivo usado no cálculo do saldo.
   * Pode diferir do calculado caso o usuário tenha feito um override manual.
   */
  effective_net_salary: real('effective_net_salary').notNull(),

  /** Mês de referência (1-12) */
  reference_month: integer('reference_month').notNull(),

  /** Ano de referência (ex: 2025) */
  reference_year: integer('reference_year').notNull(),

  /** Observações opcionais (ex: "13º salário", "PLR") */
  description: text('description'),

  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 Income = typeof incomes.$inferSelect;
export type NewIncome = typeof incomes.$inferInsert;