Files
alpenwerk-hr/lib/onboarding.ts
Andrei Laas 8d0c9b4b65 Workshop-Anforderungen, erster Teil: was ohne Migration geht
Anforderung 1 — Freiwilliger vs unfreiwilliger Austritt. Die Liste der
Beendigungsarten zieht aus TerminatePanel.tsx nach lib/beendigung.ts um: der
Berichtemanager braucht sie ebenso, und zwei Listen liefen auseinander. Zwei
neue Arten (Beendigung in der Probezeit, je Seite). Auf wessen Betreiben
beendet wurde, wird aus der Art **abgeleitet** und nicht daneben gespeichert
— als zweites freies Feld liesse sich "Entlassung, freiwillig" erfassen. Das
Dropdown im Formular schraenkt die Auswahl darunter ein.

Drei Gruppen statt zwei: Befristungsablauf geschieht auf niemandes
Betreiben, ein Nichtantritt ist kein Austritt. Beide einer Seite
zuzuschlagen wuerde jede Fluktuationsquote verfaelschen.

Anforderung 2 — Namensfilter in "Anstehend", ab neun Eintraegen.

Anforderung 3 — die zwei Unterschriftenfelder im gedruckten Blatt sind weg;
"Firmenfahrzeug" steht in beiden Checklisten. has_dienstwagen sagt, ob eines
zusteht, nicht ob es uebergeben wurde.

Anforderung 4 — "+794 weitere" ist ein Knopf geworden; die Namen waren
vorher nur ueber den Export erreichbar. Stammdatenaenderung und
Gehaltsanpassung stehen nicht mehr zur Auswahl: die eine entsteht bei jeder
geaenderten Telefonnummer, die andere ist ein totes Ereignis, seit das
Gehalt in Loga liegt. Neu ist der Untertyp — Beendigungsart beim Austritt,
Art der Abwesenheit bei der Langzeitabwesenheit, im Bericht und im Export.

Anforderung 10 — zwei Kacheln. "Aktives Dienstverhaeltnis" ist nicht
dasselbe wie "Aktive Mitarbeiter:innen": dort steht, wer heute arbeitet,
hier, mit wem ein Vertrag laeuft. Sichtbar waren 806 und 10, addieren musste
man selbst.
2026-09-15 22:35:47 +02:00

105 lines
4.4 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" },
// Aus dem Workshop nachgetragen: die Übergabe eines Firmenfahrzeugs ist
// ein eigener Vorgang mit Papieren und Schlüsseln und stand bisher
// nirgends. `employees.has_dienstwagen` sagt, ob eines zusteht — nicht,
// ob es übergeben wurde. Das sind zwei verschiedene Fragen.
{ key: "firmenfahrzeug", label: "Firmenfahrzeug", 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);
}