Add HR KPI cockpit

This commit is contained in:
2026-05-13 07:10:13 +02:00
parent 819a023163
commit 20be752adc
7 changed files with 2216 additions and 0 deletions
@@ -0,0 +1,315 @@
# HR-KPI-Pruefung gegen Schweizer Praxis und HR-Best-Practices
Stand: 2026-05-13
Zweck dieses Dokuments:
- fachliche Pruefpunkte fuer den neuen Reiter `HR KPI` sammeln
- keine Codeaenderung ausloesen
- sichtbar machen, welche Kennzahlen bereits plausibel sind und wo vor produktiver Nutzung noch HR-/Fachentscheid noetig ist
## Quellen und Massstab
Verwendeter Massstab:
- Schweizer Absenzverstaendnis gemaess BFS/AVOL: Absenzen sind Zeiten, in denen eine Person normalerweise haette arbeiten muessen, aber nicht gearbeitet hat. Ferien/Feiertage und flexible Arbeitszeitreduktionen sind keine Absenzen.
- Obsan/BFS-Definition fuer gesundheitsbedingte Absenzen: Krankheit und Unfall; Absenzenquote = Absenzen als Prozent der vertraglich festgelegten Jahresarbeitszeit.
- Internationale HR-Controlling-Praxis fuer Fluktuation: Austritte im Zeitraum geteilt durch durchschnittlichen Headcount im Zeitraum. Freiwillige und unfreiwillige Austritte sollten getrennt ausgewiesen werden.
Referenzen:
- BFS Arbeitsvolumenstatistik / Definitionen: https://www.bfs.admin.ch/bfs/de/home/statistiken/arbeit-erwerb/erhebungen/avol.html
- Obsan/BFS Absenzen Krankheit/Unfall: https://ind.obsan.admin.ch/de/indicator/pflemo/absenzen-durch-krankheitunfall
- BAG/Obsan MonAM Absenzen Krankheit/Unfall: https://ind.obsan.admin.ch/fr/indicator/monam/absences-au-travail-pour-cause-de-maladie-ou-d-accident-age-15
- CIPD Retention/Turnover Guidance: https://www.cipd.org/en/knowledge/guides/employee-retention/
- SHRM-nahe Turnover-Formel, oeffentlich referenziert: Separations / Average Employees * 100
## Aktueller Umsetzungsstand im Reiter
Der Reiter liest aktuell:
- `C:\temp\Saldiperstichdatum.xlsx` als Hauptquelle Rexx #757
- `C:\temp\Exportkommengehen.xlsx` fuer Geburtsdatum / Arbeitszeitmodell
- `C:\temp\HR_KPI_Export.xlsx` fuer SAP-Felder
- `C:\temp\Abwesenheitinstunden.xlsx` fuer Krankheit/Absenzen aus Rexx #744
- `C:\temp\Personalausgeschieden.xlsx` fuer Austritte/Fluktuation aus Rexx #381
Die Power-Query-/DAX-Logik wurde nicht als Interpreter umgesetzt, sondern als C#-Nachbau.
## Pruefpunkte mit moeglicher Abweichung
### 1. Fluktuationsnenner: Stichtags-Headcount statt Durchschnitt
Aktueller Reiter:
- `Headcount Festangestellt` wird aus dem aktuell geladenen Stichtagsbestand gerechnet.
- `Avg Headcount Quartal` und `Avg Headcount Jahr` entsprechen aktuell faktisch ebenfalls diesem Stichtagswert.
Best Practice:
- Fluktuation sollte fuer Monat, Quartal und Jahr mit durchschnittlichem Headcount des jeweiligen Zeitraums gerechnet werden.
- Bei stabiler Belegschaft ist der Unterschied klein.
- Bei Wachstum, Abbau oder saisonalen Schwankungen kann der Unterschied relevant sein.
Pruefen:
- Liefert Rexx/SAP monatliche Headcount-Snapshots?
- Falls ja: Monatsdurchschnitt fuer Quartal/Jahr berechnen.
- Falls nein: UI klar als `Stichtagsnahe Fluktuation` oder `Naeherung` beschriften.
Status:
- fachlich akzeptabel als erste Naeherung
- fuer offizielles HR-Reporting noch zu bestaetigen
### 2. Freiwillige vs. unfreiwillige Austritte
Aktueller Reiter:
- `Ist_Arbeitnehmerkuendigung` versucht freiwillige Arbeitnehmer-/Mitarbeiterkuendigungen anhand Textmustern zu erkennen.
- Praktikanten, Werkstudenten, Aushilfen, Lehrlinge, Pensionierungen, befristete Vertraege und Kuendigungen durch Trafag werden ausgeschlossen.
Best Practice:
- Total Turnover und Voluntary Turnover getrennt ausweisen.
- Fuer Retention ist freiwillige Fluktuation meist entscheidender als Gesamtaustritte.
Pruefen:
- Sind alle Rexx-Austrittsarten stabil und vollstaendig gemappt?
- Gibt es lokale Schreibweisen wie `Kdg AN`, `Eigenkuendigung`, `Aufhebungsvereinbarung`, `Mutual agreement`, `Ende Probezeit`?
- Soll `Aufhebungsvereinbarung` zaehlen oder separat ausgewiesen werden?
Status:
- HR-gepruefte Grundlogik vorhanden
- Mappingliste muss bei neuen Austrittsarten gepflegt/validiert werden
### 3. Fluktuation Quartal/Jahr bei nur einem aktuellen Bestand
Aktueller Reiter:
- Quartals-/Jahresraten werden ueber Austrittsdatum gefiltert.
- Headcount bleibt aktueller Stichtagsbestand.
Risiko:
- Wenn der aktuelle Bestand z. B. Ende Jahr niedriger/hoeher ist als im Quartal, verzerrt das die historische Rate.
Pruefen:
- Fuer Quartal/Jahr entweder echte historische Headcounts laden oder die Kennzahl explizit als operative Naeherung fuehren.
Status:
- Darstellung gut fuer operatives Cockpit
- nicht automatisch als auditierbare Jahreskennzahl verwenden
### 4. Absenzenquote: 21 Arbeitstage pauschal
Aktueller Reiter:
- Krankheitstage = Stunden / 8.4
- Krankenquote je Mitarbeiter = Krankheitstage / 21
- Gesamtquote = Krankheitstage / (Headcount * 21)
Schweizer/BFS-nahe Praxis:
- Absenzenquote wird als Dauer der Absenzen in Prozent der vertraglich festgelegten Arbeitszeit berechnet.
- Bei Teilzeit und unterschiedlichen Sollzeiten sollte der Nenner aus Sollarbeitszeit/Solltagen kommen.
Pruefen:
- Soll der Nenner pro Person aus `Avg_Sollzeit_Tag`, Arbeitszeitmodell oder Beschaeftigungsgrad berechnet werden?
- Fuer Teilzeit nicht pauschal 21 Vollzeittage verwenden, falls die Quote offiziell sein soll.
- Krankheit und Unfall separat ausweisen, wenn Datenquelle das erlaubt.
Status:
- 21-Tage-Naeherung gut fuer schnelle Sicht
- fuer Schweizer Standard-Absenzquote fachlich zu ungenau
### 5. Krankheit kurz/lang Definition
Aktueller Reiter:
- `Krankheit angetreten` = kurz
- `Krank nicht buchbar angetreten` = lang
- Umrechnung pauschal Stunden / 8.4
Pruefen:
- Bedeutet `Krank nicht buchbar` fachlich wirklich Langzeitkrankheit?
- Oder ist es ein Buchungs-/Workflowstatus?
- HR muss bestaetigen, ob diese Felder Kurz-/Langzeitkrankheit abbilden.
Status:
- benoetigt HR-/Rexx-Felddefinition
### 6. Unfalltage aus SAP vs. Rexx-Absenzen
Aktueller Reiter:
- Krankheit kommt aus Rexx-Stunden.
- BU/NBU kommt aus SAP-HR-KPI-Datei.
Pruefen:
- Sind BU/NBU in SAP und Krankheit in Rexx zeitlich gleich abgegrenzt?
- Sind Unfalltage in den Rexx-Krankheitsstunden enthalten oder getrennt?
- Gibt es Doppelzaehlung, wenn Krankheit/Unfall spaeter zusammengefuehrt werden?
Status:
- getrennte Anzeige ist korrekt
- Gesamtabsenzquote aus Krankheit + Unfall erst nach Quellenabgleich bilden
### 7. FTE-Berechnung
Aktueller Reiter:
- FTE = Beschaeftigungsgrad aus SAP / 100.
- Wenn SAP-Wert fehlt: Vollzeit = 1, sonst 0.5.
Best Practice:
- FTE sollte aus vertraglichem Beschaeftigungsgrad oder Sollarbeitszeit pro Person kommen.
- Pauschal 0.5 fuer Nicht-Vollzeit ist nur Fallback.
Pruefen:
- Ist `Beschaeftigungsgrad %` fuer alle aktiven Mitarbeitenden verfuegbar?
- Wenn nein: kann Rexx `Arbeitszeitmodell` oder Sollzeit genauer liefern?
Status:
- korrekt, wenn SAP-Datei vollstaendig ist
- Fallback fuer offizielle FTE zu grob
### 8. GLZ-Ampel 50/100 Stunden
Aktueller Reiter:
- Gruen: absolut <= 50h
- Gelb: absolut <= 100h
- Rot: absolut > 100h
Pruefen:
- Sind diese Schwellen HR-/GL-/Reglement-konform?
- Soll negative GLZ gleich behandelt werden wie positive?
- Gibt es unterschiedliche Regeln fuer Teilzeit?
Status:
- als Management-Ampel plausibel
- Schwellen fachlich bestaetigen lassen
### 9. Ferien-Rest-Ampel
Aktueller Reiter:
- Restferien <= 5 Tage = Gruen
- > 5 Tage = Rot
Pruefen:
- Ist >5 Tage wirklich kritisch oder nur zum Jahresende relevant?
- Soll der Stichtag im Jahr beruecksichtigt werden?
- Soll Anspruch, bezogen, ausstehend und Rest getrennt nach Kalenderjahr gezeigt werden?
Status:
- sehr grobe Ampel
- saisonale Logik fehlt
### 10. Lohn / Datenschutz
Aktueller Reiter:
- Bruttolohn wird im Model geladen, aber aktuell nicht prominent als KPI angezeigt.
Pruefen:
- Darf Bruttolohn im HR-KPI-Reiter angezeigt werden?
- Falls ja: welche Rollen duerfen ihn sehen?
- Falls nein: Feld im UI konsequent ausblenden oder gar nicht laden.
Status:
- vor produktivem Einsatz mit Datenschutz/HR klaeren
### 11. Altersgruppen / Geschlecht
Aktueller Reiter:
- Alter und Geschlecht werden berechnet/gemappt.
- Noch keine spezifischen Diversity-/Altersstruktur-Kacheln.
Pruefen:
- Soll Geschlecht nach Schweizer Datenschutz-/HR-Kontext im Cockpit sichtbar sein?
- Aggregiert ja/nein?
- Mindestgruppengroessen fuer Anzeige definieren, damit keine Einzelpersonen ableitbar sind.
Status:
- Daten vorhanden
- Anzeige/Datenschutz noch nicht entschieden
### 12. Personalschluessel / Join-Qualitaet
Aktueller Reiter:
- Rexx #757 und SAP werden ueber Personalnummer verbunden.
- Rexx #732 wird ueber Name verbunden, weil keine Personalnummer vorhanden ist.
Risiko:
- Name-Join ist fehleranfaellig bei gleichen Namen, Namensaenderungen, Sonderzeichen oder Formatabweichungen.
Pruefen:
- Gibt es in #732 doch eine stabile ID?
- Falls nein: Join-Trefferquote anzeigen.
- Nicht gematchte Namen separat ausweisen.
Status:
- wichtigster technischer Qualitaetspruefpunkt
## Empfohlene Mindestkontrollen vor produktiver Nutzung
1. Kontrollwerte aus Power BI / HR gegen neuen Reiter vergleichen:
- `Austritte Total Rexx = 104`
- `Austritte Arbeitnehmerkuendigung = 42`
- `Austritte Fluktuationsrelevant = 33`
2. Headcount aktiv gegen Rexx/HR-Stichtagszahl vergleichen.
3. FTE-Summe gegen SAP/HR vergleichen.
4. Krankheitstage aus Rexx direkt gegen Export-Summe vergleichen.
5. BU/NBU-Tage gegen SAP-Datei summieren.
6. Stichprobe von mindestens 10 Mitarbeitenden pruefen:
- Personalnummer
- Organisation
- FTE
- GLZ
- Ferien Rest
- Krankheitstage
7. Join-Qualitaet dokumentieren:
- Anzahl Rexx-Hauptzeilen
- Anzahl SAP-Treffer
- Anzahl #732-Name-Treffer
- Anzahl nicht gematcht
## Empfehlung fuer die naechste Umsetzung
Noch keine Formel aendern, bevor die Kontrollwerte protokolliert sind.
Sinnvolle naechste technische Erweiterungen:
- Tab `Datenstatus` um Join-Trefferquoten erweitern.
- Tab `Fluktuation` mit Kontrollwerten Power BI/HR anzeigen.
- Absenzenquote optional auf vertragliche Sollzeit/FTE umstellen.
- Kennzahlen mit `Naeherung` markieren, solange nur ein Stichtagsbestand statt historischer Monats-Snapshots vorhanden ist.