The offboarding list was a checkbox fieldset inside the exit panel — four items, never sent anywhere. Nothing in terminateEmployee's payload carried them; ticking a box there recorded exactly nothing. It's replaced with the same kind of list the entries got: its own tab, appearing the moment an exit is recorded, with one item per row, a comment on each, and — unlike the fieldset — a record of who touched it and when. The eleven items come from the same printed sheet as the entry list. Nine are plain checkboxes. Two are text fields under "Vermerke": remaining vacation and the balance transferred for payout — the sheet names "Überleitung Salden für Auszahlung" twice, once as a task to do and once as the actual figure, and those are genuinely two different questions, kept as two items. Where the sheet still says "GKK" rather than today's "ÖGK", it's left as written — that's the name the process runs under internally, not a typo. No Show gets no list. Never having worked a single day, there's no IT access to revoke, no GKK registration to undo, no Dienstzettel to collect — an empty checklist there would be a label with nothing behind it. Both the tab and the auto-creation on exit check for this specifically, not just the "Ausgetreten" status that No Show shares with a real exit. Rehiring the same person hides the tab again — the data stays, since it happened, but a checklist for someone currently working has nothing to point at. The engine (what counts as done, how progress is computed) moved into lib/checklist.ts so onboarding and offboarding can't drift into two different ideas of "done" the way two independent copies eventually do; lib/onboarding.ts and lib/offboarding.ts bind it to their own item list, and the tab UI is a single ChecklistPanel bound the same way. Checked against the real database: a real exit creates all eleven items in the same transaction as the exit itself; a No Show creates none; rehiring flips the tab off while the old answers stay queryable. One false alarm during that check turned out to be the user's own clicks on a real employee's onboarding list, made in the browser while trying the earlier feature — left untouched, not test debris. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
100 lines
4.1 KiB
TypeScript
100 lines
4.1 KiB
TypeScript
import {
|
|
alleReichungen,
|
|
fortschrittVon,
|
|
punktZuVon,
|
|
type AufgabenGruppe,
|
|
type AufgabenPunkt,
|
|
type AufgabenStand,
|
|
type Fortschritt,
|
|
} from "./checklist";
|
|
|
|
export type { AufgabenArt, AufgabenGruppe, AufgabenPunkt, AufgabenStand, Fortschritt } from "./checklist";
|
|
// istErledigt/wertIstGueltig nehmen bereits einen Punkt entgegen, nicht den
|
|
// Schlüssel — sie brauchen keine Bindung an dieses Verzeichnis und werden
|
|
// unverändert weitergereicht.
|
|
export { istErledigt, wertIstGueltig } from "./checklist";
|
|
|
|
// Die Onboarding-Checkliste — ein Verzeichnis, das Oberfläche, Fortschritt
|
|
// und Auswertung gemeinsam lesen.
|
|
//
|
|
// Die Punkte stehen hier und nicht in der Datenbank. Das ist eine Entscheidung
|
|
// mit einer Kehrseite, also der Grund: eine Checkliste ist ein Firmenprozess,
|
|
// kein Stammdatum. Sie ändert sich selten, und wenn, dann soll die Änderung
|
|
// durch Prüfung und Protokoll gehen wie jede andere. Dafür lässt sie sich
|
|
// nicht ohne Aufspielen anpassen.
|
|
//
|
|
// Gespeichert wird je Person und Punkt **nur die Antwort**, unter dem
|
|
// Schlüssel des Punktes. Ein später entfernter Punkt lässt die alten Antworten
|
|
// deshalb stehen — sie verschwinden aus der Liste, aber nicht aus den Daten,
|
|
// und eine Akte von damals bleibt lesbar.
|
|
//
|
|
// Die Mechanik selbst (Fortschritt, was als erledigt zählt) steht in
|
|
// lib/checklist.ts — geteilt mit lib/offboarding.ts, damit beide Listen
|
|
// dasselbe „erledigt" meinen und nicht mit der Zeit auseinanderlaufen.
|
|
|
|
export const ONBOARDING_GRUPPEN: readonly AufgabenGruppe[] = [
|
|
{
|
|
key: "aufgaben",
|
|
label: "Zu erledigen",
|
|
punkte: [
|
|
{ key: "dienstzettel", label: "Dienstzettel / Dienstvertrag", art: "haken" },
|
|
{ key: "dienstzettel_retour", label: "Dienstzettel / Dienstvertrag retour", art: "haken" },
|
|
{ key: "onboarding_gestartet", label: "Onboarding gestartet", art: "haken" },
|
|
{ key: "lgv_e9", label: "LGV Anlage / E9", art: "haken" },
|
|
{ key: "interflex", label: "Interflex Anlage", art: "haken" },
|
|
{ key: "eurest", label: "Anmeldung EUREST", art: "haken" },
|
|
{ key: "oegk", label: "Anmeldung ÖGK", art: "haken" },
|
|
{ key: "webclient", label: "WebClient", art: "haken" },
|
|
{ key: "datensatzberechtigung", label: "Datensatzberechtigung Führungskraft", art: "haken" },
|
|
{ key: "praemienanspruch", label: "Prämienanspruch", art: "janein" },
|
|
{
|
|
key: "webreise",
|
|
label: "Webreise Benutzer",
|
|
art: "haken",
|
|
hinweis: "HM 13, Seite 2 Punkt 15, „J“, ganz am Ende mit einfügen",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: "unterlagen",
|
|
label: "Unterlagen",
|
|
punkte: [
|
|
{ key: "passkopie", label: "Passkopie / Ausweis", art: "haken" },
|
|
{
|
|
key: "arbeitsbewilligung",
|
|
label: "Arbeitsbewilligung",
|
|
art: "haken",
|
|
hinweis: "Nur bei Staatsbürgerschaft ausserhalb EU/EWR und Schweiz",
|
|
},
|
|
{ key: "meldezettel", label: "Meldezettel", art: "haken" },
|
|
{ key: "bankverbindung", label: "Bankverbindung", art: "haken" },
|
|
{ key: "ecard", label: "E-Card", art: "haken" },
|
|
{ key: "strafregisterauszug", label: "Strafregisterauszug", art: "haken" },
|
|
{ key: "salmonellenbefund", label: "Salmonellenbefund", art: "haken" },
|
|
{ key: "personaldatenblatt", label: "Personaldatenblatt", art: "haken" },
|
|
{ key: "cv", label: "CV", art: "haken" },
|
|
{ key: "goodies", label: "Goodies", art: "haken" },
|
|
{ key: "willkommensmappe", label: "Willkommensmappe", art: "haken" },
|
|
],
|
|
},
|
|
{
|
|
key: "vermerke",
|
|
label: "Vermerke — Grösse",
|
|
punkte: [
|
|
{ key: "groesse_schuhe", label: "Schuhe", art: "text" },
|
|
{ key: "groesse_tshirt", label: "T-Shirt", art: "text" },
|
|
{ key: "groesse_hose", label: "Hose", art: "text" },
|
|
],
|
|
},
|
|
] as const;
|
|
|
|
export const ONBOARDING_PUNKTE: readonly AufgabenPunkt[] = alleReichungen(ONBOARDING_GRUPPEN);
|
|
|
|
export function punktZu(key: string): AufgabenPunkt | undefined {
|
|
return punktZuVon(ONBOARDING_PUNKTE, key);
|
|
}
|
|
|
|
export function fortschritt(staende: AufgabenStand[]): Fortschritt {
|
|
return fortschrittVon(ONBOARDING_PUNKTE, staende);
|
|
}
|