// Hand-written to match supabase/schema.sql + supabase/migrations/*.sql (no DB // connection string available to run `supabase gen types typescript` in this // environment — regenerate from the live project once you have the Supabase // CLI linked). export type EmploymentStatus = "Aktiv" | "Karenz" | "Geplant" | "Ausgetreten"; export type EmploymentType = "Vollzeit" | "Teilzeit"; export type ContractType = "unbefristet" | "befristet"; export type PaygradeType = "A" | "B" | "C" | "D" | "E" | "F"; export type SourceType = "Intern" | "Extern"; export type GenderType = "m" | "w"; // Single HR-only role (see docs/decisions/0001-hr-only-access.md). Kept as a // union (not a string literal) so a future hr_admin/hr_user split, if ever // technically required, is a type-level addition, not a rewrite. export type ProfileRole = "hr"; export type HistoryEventType = | "Eintritt" | "Beförderung" | "Versetzung" | "Karenz" | "Vertragsänderung" | "Stammdatenänderung" | "Austritt" | "Wiedereintritt" | "Reorganisation" | "Gehaltsanpassung" | "Rückkehr"; export type PositionStatus = "open" | "filled"; export type ReorgMoveKind = "emp" | "team" | "abt" | "dept"; export type PendingChangeType = | "transfer" | "promotion" | "karenz_start" | "karenz_return" | "contract_change" | "reorg"; export type PendingChangeStatus = "pending" | "applied" | "cancelled"; // @supabase/postgrest-js requires every table/view to carry a Relationships // array (used for typed embedded selects) — left empty since no code in this // app relies on nested/embedded resource selects. type NoRelationships = { Relationships: [] }; export type Database = { public: { Tables: { divisions: NoRelationships & { Row: { id: string; org_number: string; name: string }; Insert: { id?: string; org_number: string; name: string }; Update: Partial<{ id: string; org_number: string; name: string }>; }; departments: NoRelationships & { Row: { id: string; org_number: string; name: string; division_id: string }; Insert: { id?: string; org_number: string; name: string; division_id: string }; Update: Partial<{ id: string; org_number: string; name: string; division_id: string }>; }; teams: NoRelationships & { Row: { id: string; org_number: string; name: string; department_id: string }; Insert: { id?: string; org_number: string; name: string; department_id: string }; Update: Partial<{ id: string; org_number: string; name: string; department_id: string }>; }; locations: NoRelationships & { Row: { id: string; name: string; country: string }; Insert: { id?: string; name: string; country: string }; Update: Partial<{ id: string; name: string; country: string }>; }; profiles: NoRelationships & { Row: { id: string; email: string; full_name: string | null; role: ProfileRole; is_active: boolean; created_by: string | null; created_at: string; updated_at: string; }; Insert: { id: string; email: string; full_name?: string | null; role?: ProfileRole; is_active?: boolean; created_by?: string | null; created_at?: string; updated_at?: string; }; Update: Partial<{ id: string; email: string; full_name: string | null; role: ProfileRole; is_active: boolean; created_by: string | null; created_at: string; updated_at: string; }>; }; employees: NoRelationships & { Row: { id: string; personnel_number: number; first_name: string; last_name: string; gender: GenderType; birth_date: string; sv_nummer: string | null; nationality: string; address: string | null; address_country: string | null; email: string; phone: string | null; team_id: string | null; division_id: string; job_title: string; location_id: string; manager_id: string | null; org_level: number; is_lead: boolean; employment_type: EmploymentType; weekly_hours: number; /** @deprecated Salary is out of MVP scope; column kept only for pre-existing data. */ monthly_salary_gross: number | null; contract_type: ContractType; contract_end_date: string | null; paygrade: PaygradeType; source: SourceType; status: EmploymentStatus; entry_date: string; exit_date: string | null; exit_reason: string | null; karenz_start_date: string | null; karenz_return_date: string | null; avatar_color: string | null; created_at: string; updated_at: string; }; Insert: { id?: string; first_name: string; last_name: string; gender: GenderType; birth_date: string; sv_nummer?: string | null; nationality?: string; address?: string | null; address_country?: string | null; email: string; phone?: string | null; team_id?: string | null; division_id?: string; job_title: string; location_id: string; manager_id?: string | null; org_level?: number; is_lead?: boolean; employment_type?: EmploymentType; weekly_hours?: number; contract_type?: ContractType; contract_end_date?: string | null; paygrade?: PaygradeType; source?: SourceType; status?: EmploymentStatus; entry_date: string; exit_date?: string | null; exit_reason?: string | null; karenz_start_date?: string | null; karenz_return_date?: string | null; avatar_color?: string | null; created_at?: string; updated_at?: string; }; Update: Partial; }; employee_history: NoRelationships & { Row: { id: string; employee_id: string; event_date: string; event_type: HistoryEventType; description: string; reorg_scenario_id: string | null; created_at: string; }; Insert: { id?: string; employee_id: string; event_date: string; event_type: HistoryEventType; description: string; reorg_scenario_id?: string | null; created_at?: string; }; Update: Partial; }; positions: NoRelationships & { Row: { id: string; position_number: string; title: string; team_id: string; division_id: string; is_lead: boolean; reports_to_employee_id: string | null; status: PositionStatus; created_at: string; filled_at: string | null; filled_by_employee_id: string | null; }; Insert: { id?: string; position_number?: string; title: string; team_id: string; division_id?: string; is_lead?: boolean; reports_to_employee_id?: string | null; status?: PositionStatus; created_at?: string; filled_at?: string | null; filled_by_employee_id?: string | null; }; Update: Partial; }; hire_drafts: NoRelationships & { Row: { id: string; created_by: string | null; step: number; payload: Record; updated_at: string }; Insert: { id?: string; created_by?: string | null; step?: number; payload: Record; updated_at?: string }; Update: Partial; }; saved_reports: NoRelationships & { Row: { id: string; created_by: string | null; name: string; config: Record; created_at: string }; Insert: { id?: string; created_by?: string | null; name: string; config: Record; created_at?: string }; Update: Partial; }; audit_log: NoRelationships & { Row: { id: string; occurred_at: string; actor_user_id: string | null; actor_name: string; action: string; target_label: string; target_employee_id: string | null; details: string | null; }; Insert: { id?: string; occurred_at?: string; actor_user_id?: string | null; actor_name: string; action: string; target_label: string; target_employee_id?: string | null; details?: string | null; }; Update: Partial; }; reorg_scenarios: NoRelationships & { Row: { id: string; name: string; effective_date: string; created_by: string | null; applied: boolean; applied_at: string | null; undo_snapshot: Record | null; created_at: string; }; Insert: { id?: string; name: string; effective_date: string; created_by?: string | null; applied?: boolean; applied_at?: string | null; undo_snapshot?: Record | null; created_at?: string; }; Update: Partial; }; reorg_moves: NoRelationships & { Row: { id: string; scenario_id: string; kind: ReorgMoveKind; payload: Record }; Insert: { id?: string; scenario_id: string; kind: ReorgMoveKind; payload: Record }; Update: Partial; }; pending_org_changes: NoRelationships & { Row: { id: string; employee_id: string; change_type: PendingChangeType; effective_date: string; payload: Record; reorg_scenario_id: string | null; status: PendingChangeStatus; created_by: string | null; created_at: string; applied_at: string | null; }; Insert: { id?: string; employee_id: string; change_type: PendingChangeType; effective_date: string; payload: Record; reorg_scenario_id?: string | null; status?: PendingChangeStatus; created_by?: string | null; created_at?: string; applied_at?: string | null; }; Update: Partial; }; }; Views: Record; Functions: { hire_employee: { Args: { payload: Record }; Returns: string }; terminate_employee: { Args: { payload: Record }; Returns: void }; transfer_employee: { Args: { payload: Record }; Returns: void }; promote_employee: { Args: { payload: Record }; Returns: void }; start_karenz: { Args: { payload: Record }; Returns: void }; adjust_karenz_return: { Args: { payload: Record }; Returns: void }; record_karenz_return: { Args: { payload: Record }; Returns: void }; change_employee_data: { Args: { payload: Record }; Returns: void }; rehire_employee: { Args: { payload: Record }; Returns: void }; create_position: { Args: { payload: Record }; Returns: string }; staff_position_internally: { Args: { payload: Record }; Returns: void }; apply_reorg: { Args: { payload: Record }; Returns: string }; undo_reorg: { Args: { payload: Record }; Returns: void }; apply_due_pending_changes: { Args: Record; Returns: number }; }; }; };