Eine Befoerderung benennt die Planstelle um
Some checks failed
CI / Migrationen auf leerer Datenbank (push) Has been cancelled
CI / Lint, Typen, Tests, Build (push) Has been cancelled

Bisher schrieb promote_employee den neuen Titel nach employees.job_title -- und
nur dorthin. Gesehen hat ihn niemand: Akte, Organigramm und die Exporte zeigen
alle die Taetigkeit der Planstelle. Haltbar war er auch nicht, denn
hire_employee, transfer_employee und change_employee_data setzen dieselbe
Spalte aus der Planstelle; die naechste Adressaenderung ueberschrieb ihn wieder.

Gemeldet von Lara und im Testprotokoll als H.10. Max hat entschieden: die
Befoerderung benennt die Planstelle um.

Umbenannt wird die Stelle, auf der die Person danach sitzt -- die Zielstelle,
sonst die bisherige. Im Formular ist das ohne Ueberraschung, weil es beim
Waehlen einer Zielplanstelle deren Taetigkeit als Vorschlag eintraegt: wer
nichts aendert, benennt auch nichts um. Und umbenannt wird nicht der
Katalogeintrag, sondern die Planstelle zeigt auf einen anderen -- den Eintrag
selbst umzubenennen traefe jede Planstelle mit derselben Taetigkeit.

Die Regel "gleiche Taetigkeit, ein Katalogeintrag" stand nur in
create_position und wandert nach job_fuer_titel(); zwei Fassungen derselben
Regel laufen hier erfahrungsgemaess auseinander. Die Nummernvergabe nimmt dabei
die erste freie statt count(*) + 1 -- gezaehlt wurde bisher, und das vergibt
eine belegte Nummer, sobald ein Eintrag geloescht wurde oder Codes aus einer
fremden Quelle danebenstehen, wie bei der Uebernahme der Manner-Daten.

Der Nachtlauf tut dasselbe, sonst benennt eine datierte Befoerderung am
Stichtag nichts um. Der Rauchtest prueft beide Wege und dass der alte
Katalogeintrag stehen bleibt.
This commit is contained in:
2026-09-29 20:29:56 +02:00
parent fe858c6c24
commit 38f8c99968
2 changed files with 281 additions and 1 deletions

View File

@@ -55,6 +55,7 @@ declare
v_offen int;
v_meldung text;
v_ging boolean;
v_titel text;
begin
select id into v_wurzel from org_units where parent_id is null;
select id into v_ort from locations order by name limit 1;
@@ -112,7 +113,34 @@ begin
if (select paygrade::text from employees where id = v_a) <> 'HG15' then
raise exception 'Die Beförderung hat den Hay-Grade nicht gesetzt.';
end if;
raise notice '4/8 Beförderung am selben Tag, Hay-Grade gesetzt';
-- Die Bezeichnung gehört zur Planstelle: dort lesen sie Akte, Organigramm
-- und die Exporte. Vorher stand der neue Titel allein an der Person und war
-- nirgends zu sehen.
select j.title into v_titel
from om_positions p join jobs j on j.id = p.job_id where p.id = v_p3;
if v_titel <> 'Rauchtest Leitung' then
raise exception 'Die Zielplanstelle heisst nach der Beförderung „%", erwartet „Rauchtest Leitung".', v_titel;
end if;
raise notice '4/8 Beförderung am selben Tag: Hay-Grade und Planstellenbezeichnung';
-- Dieselbe Planstelle, nur ein neuer Name — der Fall aus dem Testtag.
perform promote_employee(jsonb_build_object(
'employee_id', v_a, 'effective_date', current_date::text,
'new_title', 'Rauchtest Leitung Senior', 'new_paygrade', 'HG16'));
select j.title into v_titel
from om_positions p join jobs j on j.id = p.job_id where p.id = v_p3;
if v_titel <> 'Rauchtest Leitung Senior' then
raise exception 'Ohne Stellenwechsel heisst die Planstelle „%", erwartet „Rauchtest Leitung Senior".', v_titel;
end if;
-- Der Katalogeintrag der alten Bezeichnung bleibt stehen: an ihm können
-- andere Planstellen hängen. Umbenannt wird die Stelle, nicht der Katalog.
if not exists (select 1 from jobs where title = 'Rauchtest Leitung') then
raise exception 'Der alte Katalogeintrag wurde umbenannt statt die Planstelle umgehängt.';
end if;
raise notice '4b/8 Beförderung ohne Stellenwechsel benennt dieselbe Planstelle um';
-- ── Vorgemerkte Planstelle (20260929200000) ─────────────────────
-- Eine Versetzung in die Zukunft belegt die Zielstelle, obwohl dort noch