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.
94 lines
4.4 KiB
TypeScript
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";
|
|
}
|