TeamVis Self-Host-Bundle v0.31.0

This commit is contained in:
TeamVis Release
2026-06-25 16:38:31 +02:00
commit 717325742d
68 changed files with 3762 additions and 0 deletions
@@ -0,0 +1,54 @@
-- ====================================================================
-- 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.';