import { pgTable, uuid, bigint, text, timestamp, jsonb, index, check, } from "drizzle-orm/pg-core"; import { sql } from "drizzle-orm"; import {tenants} from "./tenants"; import {authUsers} from "./auth_users"; export const stafftimeevents = pgTable( "staff_time_events", { id: uuid("id").primaryKey().defaultRandom(), tenant_id: bigint("tenant_id", { mode: "number" }) .notNull() .references(() => tenants.id), user_id: uuid("user_id") .notNull() .references(() => authUsers.id), // Akteur actortype: text("actor_type").notNull(), // 'user' | 'system' actoruser_id: uuid("actor_user_id").references(() => authUsers.id), // Zeit eventtime: timestamp("event_time", { withTimezone: true, }).notNull(), // Fachliche Bedeutung eventtype: text("event_type").notNull(), // Quelle source: text("source").notNull(), // web | mobile | terminal | system // Entkräftung invalidates_event_id: uuid("invalidates_event_id") .references(() => stafftimeevents.id), //Beziehung Approval etc related_event_id: uuid("related_event_id") .references(() => stafftimeevents.id), // Zusatzdaten metadata: jsonb("metadata"), // Technisch created_at: timestamp("created_at", { withTimezone: true, }) .defaultNow() .notNull(), }, (table) => ({ // Indizes tenantUserTimeIdx: index("idx_time_events_tenant_user_time").on( table.tenant_id, table.user_id, table.eventtime ), createdAtIdx: index("idx_time_events_created_at").on(table.created_at), invalidatesIdx: index("idx_time_events_invalidates").on( table.invalidates_event_id ), // Constraints actorUserCheck: check( "time_events_actor_user_check", sql` (actor_type = 'system' AND actor_user_id IS NULL) OR (actor_type = 'user' AND actor_user_id IS NOT NULL) ` ), }) );