Files
alpenwerk-hr/db/migrations/20260924160000_angehoerige_bearbeiten.sql
Andrei Laas e5aa527473
All checks were successful
CI / Lint, Typen, Tests, Build (push) Successful in 11m26s
CI / Migrationen auf leerer Datenbank (push) Successful in 10m15s
Angehoerige berichtigen, und beide Abschnitte sehen gleich aus
Angehoerige liessen sich bisher nur anlegen und entfernen. Ein Tippfehler
im Namen war nur zu beheben, indem man die Person loeschte und neu
anlegte -- zwei Eintraege in der Akte fuer eine Korrektur, und der erste
sagte "entfernt", was nicht stimmte. Jetzt steht in jeder Zeile ein Stift,
wie beim Notfallkontakt.

update_employee_dependent kommt bewusst **ohne** Stichtag. Hinzufuegen und
Entfernen tragen einen, dort passiert etwas zu einem Zeitpunkt. Eine
Berichtigung nicht: der Wert war schon vorher falsch, und ein "wirksam ab"
hiesse, die Person habe bis dahin anders geheissen. Der Eintrag in der
Akte nennt deshalb Vorher und Nachher statt eines Datums.

In "Daten aendern" standen fuer den Notfallkontakt drei Eingabefelder,
waehrend die Angehoerigen darueber als Tabelle mit Knoepfen erscheinen --
zwei Bauformen fuer denselben Zweck, direkt untereinander. Dort steht
jetzt derselbe Abschnitt wie im Reiter "Stammdaten"; beide laufen ueber
das "Wirksam ab" des Formulars, wie die Angehoerigen es schon taten.

Damit schreibt auch nur noch eine Stelle diese drei Spalten. Vorher
schickte das Formular sie zusaetzlich im eigenen Aufruf mit.
2026-09-23 20:03:43 +02:00

94 lines
3.8 KiB
PL/PgSQL

-- 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
$$;