Files
alpenwerk-hr/db/migrations/20260930100000_wochenstunden_ohne_scheinaenderung.sql
Andrei Laas cf5ed5c6c6
Some checks failed
CI / Migrationen auf leerer Datenbank (push) Has been cancelled
CI / Lint, Typen, Tests, Build (push) Successful in 11m17s
Vier Befunde, die still falsche Ergebnisse lieferten
C.08 -- die Suche mit Bindestrich fand nichts. Das Feld wird per translate an
"-/:.," in Leerzeichen zerlegt, die Eingabe aber nicht: "Mueller-Weiss" erzeugte
das Muster mueller-weiss%, waehrend im Heuhaufen "mueller weiss" stand. Ohne
Bindestrich fand man dieselbe Person. Die Trennzeichen stehen jetzt einmal in
lib/employee-search.ts und werden von beiden Seiten des Vergleichs benutzt.

C.09 -- der Einheitenfilter verlor jede Person mit vorgemerktem Austritt.
"Laufend" war valid_to is null, aber terminate_employee setzt das Ende schon
beim Erfassen, Monate vor dem Tag. Jetzt zaehlt auch, was noch laeuft
(valid_to > heute). Bewusst ohne valid_from <= heute: ein geplanter Eintritt
gehoert in die Liste, sonst fiele er aus dem Filter, obwohl der Status
"Geplant" ihn ausdruecklich fuehrt.

E.07 -- nur die Kostenstelle zu aendern war unmoeglich. update_position weist
einen Aufruf ohne Aenderung ab, und die Umkontierung lief erst bei dessen
Erfolg. Sie wird jetzt uebersprungen, wenn sich an den Stammangaben nichts
geaendert hat.

H.06 -- jedes Speichern erzeugte zusaetzlich "Wochenstunden 30.0 -> 30". Der
Vergleich laeuft ueber Text, die Spalte ist numeric(4,1), und das Formular
schickt 30. Der Kommentar an der Zeile nannte die Absicht richtig, nur reicht
::numeric dafuer nicht -- es muss auf die Genauigkeit der Spalte gehen.
2026-09-29 19:47:48 +02:00

76 lines
3.1 KiB
SQL

-- Keine Vertragsänderung über nichts
--
-- Gemeldet im Test vom 29.09. (H.06): jedes Speichern in „Daten ändern"
-- erzeugte zusätzlich eine Vertragsänderung „Wochenstunden 30.0 → 30", auch
-- wenn niemand die Stunden angefasst hatte.
--
-- Der Vergleich läuft über Text. Die Spalte ist numeric(4,1), also liefert
-- `v_old.weekly_hours::text` den Wert „30.0". Das Formular schickt die Zahl
-- 30, und `('30')::numeric::text` ergibt „30" — numeric merkt sich die
-- Nachkommastellen der Eingabe. Zwei verschiedene Zeichenketten für dieselbe
-- Zahl.
--
-- Der Kommentar an dieser Zeile sagt „Über ::numeric::text, damit 38.50 und
-- 38.5 gleich zählen" — die Absicht stimmte, nur reicht `::numeric` dafür
-- nicht. Die Umwandlung muss auf **die Genauigkeit der Spalte** gehen, dann
-- steht auf beiden Seiten dieselbe Schreibweise.
--
-- Folgen bisher: Historie und der Ereignisbericht „Vertragsänderung" füllten
-- sich mit Einträgen über nichts, und im Nachtlauf hing an jeder solchen
-- Änderung ein geplanter Vorgang, der nichts tat.
do $migration$
declare
v_alt constant text := $anker$(nullif(v_contract->>'weekly_hours','')::numeric)::text$anker$;
v_neu constant text := $anker$(nullif(v_contract->>'weekly_hours','')::numeric(4,1))::text$anker$;
v_def text;
v_anzahl int;
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 = 'change_employee_data' and p.prokind = 'f';
if v_def is null then raise exception 'change_employee_data ist nicht vorhanden.'; end if;
v_anzahl := (length(v_def) - length(replace(v_def, v_alt, ''))) / length(v_alt);
if v_anzahl <> 1 then
raise exception 'Der Vergleich der Wochenstunden kommt % mal vor, erwartet einmal.', v_anzahl;
end if;
execute replace(v_def, v_alt, v_neu);
end
$migration$;
-- Selbstprüfung: das Neue und das, was an dieser Funktion schon einmal
-- verlorengegangen ist.
do $$
declare
v_def 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 = 'change_employee_data' and p.prokind = 'f';
if v_def not like '%::numeric(4,1))::text%' then
raise exception 'change_employee_data vergleicht die Wochenstunden weiter ohne Genauigkeit.';
end if;
if v_def not like '%''Hay-Grade''%' then
raise exception 'change_employee_data protokolliert den Hay-Grade nicht mehr.';
end if;
if v_def not like '%nullif(v_person->>''email'', '''')%' then
raise exception 'change_employee_data hat die Leerstring-Behandlung verloren.';
end if;
if v_def not like '%cornerstone_id%' then
raise exception 'change_employee_data hat die Cornerstone-ID verloren.';
end if;
if v_def not like '%require_hr_admin()%' then
raise exception 'change_employee_data prueft die Rechte nicht.';
end if;
if v_def not like '%search_path%' then
raise exception 'change_employee_data hat keinen festen search_path.';
end if;
raise notice 'Wochenstunden werden mit der Genauigkeit der Spalte verglichen.';
end
$$;