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.
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
-- 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
|
||||
$$;
|
||||
Reference in New Issue
Block a user