-- ==================================================================== -- 0039_compliance_employee_bindings — Person-zentrierte Compliance-Bindings -- ==================================================================== -- Bisher konnten Compliance-Rollen nur an Stellen (positions) gebunden -- werden. Manche Pflichtrollen sind aber persönliche Bestellungen, die -- nicht an einer eigenen Stelle hängen (z.B. VEFK, Stv. VEFK, -- Brandschutzhelfer:in, einzelne Schaltberechtigte). -- -- Diese Migration erweitert compliance_role_bindings um eine optionale -- employee_id. Pro Binding wird entweder eine Position oder ein -- Mitarbeiter referenziert — nie beides, nie keines. -- -------------------------------------------------------------------- -- position_id wird optional alter table public.compliance_role_bindings alter column position_id drop not null; -- Neue Spalte für Personen-Bindings alter table public.compliance_role_bindings add column if not exists employee_id uuid references public.employees(id) on delete cascade; -- XOR-Constraint: genau einer von position_id / employee_id muss gesetzt sein alter table public.compliance_role_bindings drop constraint if exists compliance_role_bindings_subject_check; alter table public.compliance_role_bindings add constraint compliance_role_bindings_subject_check check ( (position_id is not null and employee_id is null) or (position_id is null and employee_id is not null) ); -- Unique-Constraint erweitern: jetzt auch für employee-Bindings eindeutig -- (Drop+Recreate, weil die alte Definition nur position_id berücksichtigt -- hat — null-Werte würden mehrfach erlaubt sein.) alter table public.compliance_role_bindings drop constraint if exists compliance_role_bindings_unique; create unique index if not exists compliance_role_bindings_unique_position on public.compliance_role_bindings (framework_id, role_id, position_id) where position_id is not null; create unique index if not exists compliance_role_bindings_unique_employee on public.compliance_role_bindings (framework_id, role_id, employee_id) where employee_id is not null; -- Lookup-Index auf employee_id (analog zu position_id) create index if not exists compliance_role_bindings_employee_idx on public.compliance_role_bindings (employee_id); comment on column public.compliance_role_bindings.position_id is 'Wenn gesetzt: Rolle hängt an einer Stelle — Inhaber der Stelle ist Compliance-Träger. Sich gegenseitig ausschließend mit employee_id.'; comment on column public.compliance_role_bindings.employee_id is 'Wenn gesetzt: Rolle ist eine persönliche Bestellung an einen Mitarbeiter (z.B. VEFK, Brandschutzhelfer:in). Sich gegenseitig ausschließend mit position_id.';