Elf Punkte aus der Rueckmeldung, und die verlorene Anmerkung
Kleinigkeiten zuerst: "Gelaufen" heisst jetzt "Vergangen", die Kachel "Langzeitabwesend" heisst "Langzeitabwesende", "Eintritte/Austritte (Jahr)" heissen "(YTD)" -- gezaehlt wurde ohnehin seit Jahresbeginn. "Personenkreis" heisst "Grund". Der Hinweis unter dem Grad der Behinderung und der Erklaertext ueber dem Honestly-Report sind weg. "Gehaltsanpassung" steht nicht mehr im Filter des Protokolls: das Gehalt ist aus dem Funktionsumfang, keine Funktion schreibt die Art mehr, und ein Filter, der immer leer ausgeht, sieht aus wie ein Fehler. Im Fenster fuer den Notfallkontakt faellt "Wirksam ab" weg -- eine Telefonnummer fuer den Ernstfall gilt ab sofort. In "Daten aendern" wandert der Block unter die Angehoerigen, dieselbe Reihenfolge wie im Reiter "Stammdaten". Auf der Uebersicht fuehren die Namen unter "Letzte Aktivitaeten" in die Akte; vorher war die Karte eine Sackgasse. "Eintrag berichtigen" bot fuer jedes Feld ein Textfeld an, auch fuer "Notfallkontakt Verhaeltnis", wo die Erfassung sonst eine Liste fuehrt. Wer dort "Gattin" statt "Gattin/Gatte" tippte, erzeugte einen Wert, den keine Auswertung mehr findet -- die Berichtigung schreibt in dieselbe Spalte wie das Formular, nur ohne dessen Pruefung. Welche Felder eine Liste bekommen, steht in lib/historie-felder.ts; ein Test prueft jeden Schluessel gegen app_feld_karte(), damit ein Tippfehler dort nicht still auf ein Textfeld zurueckfaellt. Felder mit Aufzaehlungstyp bleiben bewusst aussen vor: dort ist der gespeicherte Wert nicht die Anzeige. Und die Antwort auf "wo sieht man die Anmerkung beim Austritt?": nirgends. Das Formular sammelte sie ein, terminate_employee liess sie fallen. Bis 20260814100000 stand sie in der Beschreibung des Ereignisses; beim Umschreiben fuer den Nichtantritt ging sie verloren, und die Migration fuer die Austrittsart reichte die verkuerzte Fassung weiter. Sie steht jetzt wieder in der Personalakte und im Protokoll, und die Selbstpruefung faengt den naechsten Verlust ab.
This commit is contained in:
52
tests/unit/historie-felder.test.ts
Normal file
52
tests/unit/historie-felder.test.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import { readFileSync } from "node:fs";
|
||||
import { join } from "node:path";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { FELD_AUSWAHLEN, auswahlFuer } from "@/lib/historie-felder";
|
||||
|
||||
// Die Schlüssel sind Bezeichnungen aus `app_feld_karte()`. Stimmt eine nicht
|
||||
// mehr — umbenannt, vertippt —, fällt das nirgends auf: das Feld bliebe im
|
||||
// Dialog „Eintrag berichtigen" einfach ein Textfeld, und getippte Werte
|
||||
// landeten wieder in der Spalte. Ein stiller Rückfall auf den Zustand, den
|
||||
// diese Datei beheben soll.
|
||||
//
|
||||
// Geprüft wird gegen die zuletzt gültige Fassung der Feldkarte.
|
||||
const MIGRATION = join(process.cwd(), "db/migrations/20260923120000_firmenemail.sql");
|
||||
|
||||
function bezeichnungenDerFeldkarte(): string[] {
|
||||
const sql = readFileSync(MIGRATION, "utf8");
|
||||
const block = sql.match(/FUNCTION public\.app_feld_karte\(\)[\s\S]*?\$function\$;/)?.[0];
|
||||
expect(block, "app_feld_karte steht nicht mehr in dieser Migration").toBeDefined();
|
||||
// Je Zeile: 'Bezeichnung', jsonb_build_array('spalte', 'typ', 'gruppe'),
|
||||
return [...block!.matchAll(/^\s*'([^']+)',\s+jsonb_build_array\(/gm)].map((m) => m[1]);
|
||||
}
|
||||
|
||||
describe("Die Auswahllisten im Dialog „Eintrag berichtigen“", () => {
|
||||
it("nennen nur Felder, die es in der Feldkarte gibt", () => {
|
||||
const bekannt = new Set(bezeichnungenDerFeldkarte());
|
||||
expect(bekannt.size).toBeGreaterThan(30);
|
||||
for (const feld of Object.keys(FELD_AUSWAHLEN)) {
|
||||
expect(bekannt, `„${feld}“ steht nicht in app_feld_karte()`).toContain(feld);
|
||||
}
|
||||
});
|
||||
|
||||
it("bieten für das Verhältnis des Notfallkontakts eine Liste an", () => {
|
||||
// Der gemeldete Fall: dort liess sich freier Text eintragen, während die
|
||||
// Erfassung überall sonst eine Liste führt.
|
||||
expect(auswahlFuer("Notfallkontakt Verhältnis")).toContain("Gattin/Gatte");
|
||||
expect(auswahlFuer("Notfallkontakt Verhältnis")).toContain("Tochter");
|
||||
});
|
||||
|
||||
it("lassen Felder ohne feste Liste als Textfeld stehen", () => {
|
||||
expect(auswahlFuer("Adresse")).toBeUndefined();
|
||||
expect(auswahlFuer("Wochenstunden")).toBeUndefined();
|
||||
});
|
||||
|
||||
it("führen keine Felder mit Aufzählungstyp", () => {
|
||||
// Dort ist der gespeicherte Wert nicht die Anzeige (`m`/`w`,
|
||||
// `true`/`false`). Eine Liste, die die Anzeigeform schreibt, liefe in
|
||||
// einen Umwandlungsfehler oder in einen stillen Fehlwert.
|
||||
for (const feld of ["Geschlecht", "Beschäftigungsausmaß", "Vertragsart", "Besetzungsart", "Betriebsrat"]) {
|
||||
expect(auswahlFuer(feld), `„${feld}“ gehört nicht in die Auswahl`).toBeUndefined();
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user