-- Angehörige lassen sich bearbeiten. -- -- Bisher gab es nur Hinzufügen und Entfernen. Ein Tippfehler im Namen oder -- ein falsches Geburtsdatum liess sich nur beheben, indem man die Person -- löschte und neu anlegte — zwei Einträge in der Akte für eine Korrektur, und -- der erste sagt „entfernt", was nicht stimmt. -- -- Anders als Hinzufügen und Entfernen **ohne Stichtag**: eine Berichtigung -- gilt rückwirkend, denn der Wert war schon vorher falsch. Ein „wirksam ab" -- hiesse, die Person habe bis dahin anders geheissen. Wer eine tatsächliche -- Änderung zum Stichtag abbilden will — jemand heiratet und heisst fortan -- anders —, entfernt und legt neu an; dafür sind die beiden Vorgänge da. -- -- Der Eintrag in der Akte nennt deshalb Vorher und Nachher, nicht ein Datum. create or replace function update_employee_dependent(payload jsonb) returns void language plpgsql set search_path to 'public', 'pg_temp' as $$ declare v_alt employee_dependents%rowtype; v_employee_name text; v_neu_name text := (payload->>'first_name') || ' ' || (payload->>'last_name'); v_alt_name text; begin perform require_hr_admin(); select * into v_alt from employee_dependents where id = (payload->>'dependent_id')::uuid; if not found then raise exception 'Angehörige:r nicht gefunden.'; end if; v_alt_name := v_alt.first_name || ' ' || v_alt.last_name; select first_name || ' ' || last_name into v_employee_name from employees where id = v_alt.employee_id; -- Nur die Felder, die mitkommen. Die SV-Nummer ist freiwillig und muss -- sich leeren lassen, deshalb `case when ? then nullif` statt coalesce — -- dieselbe Form wie bei den freiwilligen Feldern der Person -- (20260923160000). update employee_dependents set first_name = coalesce(payload->>'first_name', first_name), last_name = coalesce(payload->>'last_name', last_name), relationship = coalesce(payload->>'relationship', relationship), birth_date = coalesce((payload->>'birth_date')::date, birth_date), sv_nummer = case when payload ? 'sv_nummer' then nullif(payload->>'sv_nummer', '') else sv_nummer end where id = v_alt.id; insert into employee_history (employee_id, event_date, event_type, description) values ( v_alt.employee_id, current_date, 'Stammdatenänderung', 'Angehörige:r berichtigt: ' || v_alt_name || ' (' || v_alt.relationship || ') → ' || v_neu_name || ' (' || (payload->>'relationship') || ')' ); insert into audit_log (actor_user_id, actor_name, action, target_label, target_employee_id, details, changes) values ( app_current_user_id(), current_actor_name(), 'Angehörige:r berichtigt', v_employee_name, v_alt.employee_id, v_alt_name || ' → ' || v_neu_name, app_aenderung( app_aenderung( app_aenderung( app_aenderung('[]'::jsonb, 'Name', v_alt_name, v_neu_name), 'Verhältnis', v_alt.relationship, payload->>'relationship'), 'Geburtsdatum', v_alt.birth_date::text, payload->>'birth_date'), 'SV-Nummer', v_alt.sv_nummer, nullif(payload->>'sv_nummer', '')) ); end; $$; grant execute on function public.update_employee_dependent(payload jsonb) to alpenwerk_app; -- Selbstprüfung. do $$ declare v_def text := pg_get_functiondef('public.update_employee_dependent(jsonb)'::regprocedure); begin if v_def not like '%require_hr_admin%' then raise exception 'update_employee_dependent prueft die Rechte nicht.'; end if; if position('SET search_path' in v_def) = 0 then raise exception 'update_employee_dependent hat keinen festen search_path.'; end if; if v_def like '%auth.uid()%' then raise exception 'update_employee_dependent ruft auth.uid().'; end if; if v_def not like '%insert into audit_log%' then raise exception 'update_employee_dependent schreibt kein Protokoll.'; end if; end $$;