diff --git a/db/migrations/20260929200000_vorgemerkte_planstelle.sql b/db/migrations/20260929200000_vorgemerkte_planstelle.sql index f2680b2..05d72fe 100644 --- a/db/migrations/20260929200000_vorgemerkte_planstelle.sql +++ b/db/migrations/20260929200000_vorgemerkte_planstelle.sql @@ -115,10 +115,20 @@ end $migration$; -- ═══ transfer_employee ════════════════════════════════════════════ +-- +-- Der Anker steht auf der zweiten Zeile der Belegungsabfrage. Die erste +-- Fassung dieser Migration zielte auf +-- +-- where pa.position_id = v_target_position and pa.valid_to is null; +-- +-- also auf den Wortlaut aus 20260727120200 — und fand nichts. Die Funktion ist +-- seither dynamisch gepatcht worden: die Abfrage ist zweizeilig und +-- berücksichtigt den Stichtag. Dieselbe Falle wie immer, nur diesmal nicht im +-- Rumpf einer Funktion, sondern im Anker auf sie. do $migration$ declare - v_alt constant text := $anker$where pa.position_id = v_target_position and pa.valid_to is null;$anker$; - v_neu constant text := $anker$where pa.position_id = v_target_position and pa.valid_to is null; + v_alt constant text := $anker$and (pa.valid_to is null or pa.valid_to > v_effective);$anker$; + v_neu constant text := $anker$and (pa.valid_to is null or pa.valid_to > v_effective); declare v_vorgemerkt date := planstelle_vorgemerkt(v_target_position, v_effective, v_employee_id); diff --git a/db/tests/rauchtest.sql b/db/tests/rauchtest.sql index ddf39bd..12056ad 100644 --- a/db/tests/rauchtest.sql +++ b/db/tests/rauchtest.sql @@ -54,6 +54,7 @@ declare v_stelle uuid; v_offen int; v_meldung text; + v_ging boolean; 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; @@ -120,19 +121,28 @@ begin perform transfer_employee(jsonb_build_object( 'employee_id', v_a, 'target_position_id', v_p4, 'effective_date', (current_date + 10)::text)); + -- Der Fehlschlag wird **ausserhalb** des Blocks ausgewertet. Ein `raise` + -- innerhalb landet im eigenen exception-Zweig — und weil seine Meldung das + -- Wort „vorgemerkte" enthielt, bestand der Schritt beim ersten Lauf, obwohl + -- die Migration gar nicht angewendet war. Ein Test, der sich selbst + -- durchwinkt, ist schlimmer als keiner. + v_ging := false; begin perform hire_employee(jsonb_build_object( 'personnel_number', v_nr + 1, 'first_name', 'Rauch', 'last_name', 'Test-B', 'gender', 'm', 'birth_date', '1990-01-01', 'location_id', v_ort, 'position_id', v_p4, 'entry_date', current_date::text)); - raise exception 'Die vorgemerkte Planstelle liess sich besetzen.'; + v_ging := true; exception - when others then - v_meldung := SQLERRM; - if v_meldung not like '%vorgemerkt%' then - raise exception 'Erwartet wurde die Meldung zur Vormerkung, kam aber: %', v_meldung; - end if; + when others then v_meldung := SQLERRM; end; + + if v_ging then + raise exception 'Die vorgemerkte Planstelle liess sich besetzen — die Pruefung greift nicht.'; + end if; + if v_meldung not like '%bereits eine Versetzung vorgemerkt%' then + raise exception 'Erwartet wurde die Meldung zur Vormerkung, kam aber: %', v_meldung; + end if; raise notice '5/8 Vorgemerkte Planstelle wird abgewiesen'; -- Die eigene Vormerkung darf nicht im Weg stehen: dieselbe Versetzung noch