-- Die Wiedereinstellung prüft die Zielplanstelle wie Eintritt und Versetzung. -- -- rehire_employee verlangte zwar eine Planstelle, setzte die Besetzung dann -- aber ungeprüft: weder ob die Stelle zum Wiedereintritt gilt noch ob sie -- frei ist. Eine wiedereingestellte Person konnte damit auf einer bereits -- besetzten Stelle landen — abgefangen erst vom Teilindex, mit einer Meldung, -- die in der Oberfläche nichts erklärt — oder auf einer, die es zu dem Datum -- gar nicht gibt. -- -- Dieselbe Regel wie in 20260810100000: das Datum muss in -- [valid_from, valid_to) liegen, und es darf keine Zuordnung geben, die zu -- diesem Zeitpunkt noch gilt. do $$ declare v_def text; v_neu text; begin select pg_get_functiondef(p.oid) into v_def from pg_proc p join pg_namespace n on n.oid = p.pronamespace where n.nspname = 'public' and p.proname = 'rehire_employee' limit 1; if v_def is null then raise exception 'rehire_employee() nicht gefunden.'; end if; -- Über ein Muster, weil der Rumpf CRLF enthalten kann; ein wörtlicher -- Vergleich fände nichts und die Migration meldete trotzdem Erfolg. v_neu := regexp_replace( v_def, 'if\s+v_position_id\s+is\s+null\s+then\s+raise\s+exception\s+''Für die Wiedereinstellung muss eine Planstelle angegeben werden\.'';\s+end\s+if;', $neu$if v_position_id is null then raise exception 'Für die Wiedereinstellung muss eine Planstelle angegeben werden.'; end if; declare v_ab date; v_bis date; v_besetzt uuid; begin select valid_from, valid_to into v_ab, v_bis from om_positions where id = v_position_id; if v_ab is null then raise exception 'Die Planstelle existiert nicht.'; end if; if v_date < v_ab then raise exception 'Die Planstelle gilt erst ab %. Ein Wiedereintritt am % ist darauf nicht möglich.', v_ab, v_date; end if; if v_bis is not null and v_date >= v_bis then raise exception 'Die Planstelle gilt nur bis %. Ein Wiedereintritt am % ist darauf nicht möglich.', v_bis, v_date; end if; select pa.employee_id into v_besetzt from position_assignments pa where pa.position_id = v_position_id and (pa.valid_to is null or pa.valid_to > v_date); if v_besetzt is not null then raise exception 'Diese Planstelle ist bereits besetzt.'; end if; end;$neu$, 'g' ); if v_neu = v_def then raise exception 'Das Muster passte nicht — rehire_employee blieb unverändert.'; end if; execute v_neu; end; $$; -- ═══ Gegenprobe ══════════════════════════════════════════════════ do $$ begin if (select pg_get_functiondef(p.oid) from pg_proc p join pg_namespace n on n.oid = p.pronamespace where n.nspname = 'public' and p.proname = 'rehire_employee' limit 1) not like '%gilt erst ab%' then raise exception 'rehire_employee() enthält die Gültigkeitsprüfung nicht.'; end if; end; $$;