Files
alpenwerk-hr/lib/offboarding.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

94 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";
export { istErledigt, wertIstGueltig } from "./checklist";
// Die Offboarding-Checkliste — vom selben Blatt Papier wie die Onboarding-
// Liste, nur für den anderen Weg. Was dort steht, ist hier eins zu eins
// übernommen; wo die Bezeichnung „GKK" auf dem Blatt steht statt des heute
// gebräuchlichen „ÖGK", ist sie unverändert stehengeblieben — das ist der
// Name, unter dem der Vorgang im Haus läuft, nicht ein Tippfehler.
//
// Zwei Punkte auf dem Blatt tragen denselben Namen zweimal: „Überleitung
// Salden für Auszahlung" steht einmal als abzuhakende Aufgabe und daneben als
// Feld für den tatsächlichen Betrag. Das ist kein Versehen im Blatt, sondern
// zwei verschiedene Fragen — „ist es veranlasst?" und „wie viel ist es?" —,
// die hier auch zwei verschiedene Punkte sind.
//
// Warum kein Ja/Nein-Punkt hier steht (anders als Prämienanspruch beim
// Onboarding): auf diesem Blatt gibt es keine Stelle mit zwei Kästchen
// nebeneinander. Taucht künftig eine auf, ist `art: "janein"` bereit.
export const OFFBOARDING_GRUPPEN: readonly AufgabenGruppe[] = [
{
key: "aufgaben",
label: "Zu erledigende Aufgaben",
punkte: [
{ key: "br_verstaendigung", label: "BR Verständigung bei KDG", art: "haken" },
{ key: "kuendigungsschreiben", label: "Kündigungsschreiben (KDG)", art: "haken" },
{ key: "bestaetigung_kdn_bei", label: "Bestätigung KDN / BEI", art: "haken" },
{ key: "lgv_austritt", label: "LGV Austritt", art: "haken" },
{ key: "gkk_abmeldung", label: "GKK-Abmeldung", art: "haken" },
{ key: "if6020_austritt", label: "IF 6020 Austritt", art: "haken" },
{ key: "ueberleitung_salden", label: "Überleitung Salden für Auszahlung", art: "haken" },
{ key: "endabrechnung", label: "Endabrechnung", art: "haken" },
// Gegenstück zum gleichnamigen Punkt beim Onboarding: dort die Übergabe,
// hier die Rückgabe. Aus dem Workshop nachgetragen.
{ key: "firmenfahrzeug", label: "Firmenfahrzeug", art: "haken" },
{ key: "offboarding_gestartet", label: "Offboarding gestartet", art: "haken" },
],
},
{
key: "vermerke",
label: "Vermerke",
punkte: [
{ key: "resturlaub", label: "Resturlaub", art: "text" },
{ key: "ueberleitung_salden_betrag", label: "Überleitung Salden für Auszahlung — Betrag", art: "text" },
],
},
] as const;
export const OFFBOARDING_PUNKTE: readonly AufgabenPunkt[] = alleReichungen(OFFBOARDING_GRUPPEN);
export function punktZu(key: string): AufgabenPunkt | undefined {
return punktZuVon(OFFBOARDING_PUNKTE, key);
}
export function fortschritt(staende: AufgabenStand[]): Fortschritt {
return fortschrittVon(OFFBOARDING_PUNKTE, staende);
}
/**
* Ob eine Person offzuboarden ist — die Regel hinter dem Reiter.
*
* Geprüft wird `exit_date`, nicht `status`. Eine künftige Beendigung setzt
* beide Felder sofort — terminate_employee schreibt `exit_date` unabhängig
* davon, ob der Stichtag schon erreicht ist —, während `status` erst am
* Stichtag selbst auf „Ausgetreten" wechselt. Bis dahin steht die Person
* weiterhin als „Aktiv"; die vier Wochen bis zum Austritt sind aber genau die
* Zeit, in der IT-Zugänge, Hardware und Anmeldungen abgewickelt werden. Mit
* `status` als Bedingung bliebe der Reiter bis zum letzten Arbeitstag
* unsichtbar — zu spät, um dort etwas vorzubereiten.
*
* No Show hat `exit_date` ebenfalls gesetzt (den Eintrittstag), aber nie
* einen Tag gearbeitet: keinen IT-Zugang, der eingerichtet wurde, keine
* GKK-Anmeldung, kein Dienstzettel. Ein Reiter mit einer leeren Liste wäre
* dort ein Etikett ohne Inhalt — deshalb der Ausschluss über `exit_reason`.
*
* Wird die Person wiedereingestellt, setzt rehire_employee `exit_date` und
* `exit_reason` ausdrücklich auf null zurück, und die Regel verneint wieder —
* die Checkliste bleibt in den Daten stehen, nur ihr Reiter verschwindet,
* solange sie ohne Gegenstand ist.
*/
export function gehoertOffboarding(employee: { exit_date: string | null; exit_reason: string | null }): boolean {
return employee.exit_date !== null && employee.exit_reason !== "No Show";
}