Zeiterfassung

Alexander Nolte
Alexander Nolte 4 Minuten Lesezeit

Zeiterfassung – selbst gehostet, für dich und dein Team

Stempeluhr-Apps gibt es viele – meist in der Cloud, mit Abo und mit der Frage, wo die eigenen Arbeitszeiten eigentlich landen. Ich wollte eine Zeiterfassung, die auf meinem eigenen Server läuft, ohne Abhängigkeiten auskommt und trotzdem das kann, was im Alltag wirklich zählt: Einstempeln per Klick, Gleitzeitkonto, Urlaubsplanung und eine saubere Auswertung.

Herausgekommen ist eine schlanke PHP-Anwendung, die ich hier gerne mit dir teile – als freie Software unter der GNU AGPL-3.0.

Die Stempelseite: gearbeitete Zeit, Restzeit und voraussichtlicher Feierabend auf einen Blick

Was die App kann

Stempeln

  • Start/Stop per Button, auch am Smartphone (lässt sich als Web-App auf den Homescreen legen)
  • Live-Anzeige: heute gearbeitet, noch offene Zeit und voraussichtlicher Feierabend – inklusive noch fehlender Pflichtpause
  • Vergessen auszustempeln? Die App merkt es am nächsten Tag und fragt nach der Endzeit
  • Schnellerfassung für heute: Gleitzeit, Urlaub oder Krank – Vormittag, Nachmittag oder ganzer Tag

Pausen nach Arbeitszeitgesetz

  • Fehlt beim Ausstempeln die Mindestpause (§ 4 ArbZG: 30 Min. ab 6 h, 45 Min. ab 9 h), schlägt die App eine Pause vor und fügt sie auf Wunsch ein
  • Die Pausenregeln sind pro Benutzer einstellbar
  • Hinweis bei mehr als 10 Stunden am Tag

Arbeitszeitmodelle

  • Wochenstunden gleichmäßig auf 4, 5 oder 6 Tage verteilen – oder feste Stunden je Wochentag (Teilzeit)
  • Modelle mit „Gültig ab“-Datum: Wechselst du in Teilzeit, bleiben frühere Monate korrekt berechnet

Auswertung

  • Woche, Monat, Jahr oder freier Zeitraum – nach Tagen, Wochen oder Monaten
  • Soll/Ist-Diagramm, Verlauf des Gleitzeitsaldos und eine Liste mit Beginn, Ende, Pause und Saldo
  • Export als CSV (Excel-tauglich) und Druckansicht/PDF

Urlaub, Feiertage & Ferien

  • Urlaubsplaner mit Jahreskalender, Anspruch, Übertrag und Resturlaub; halbe Tage, Krank, Sonderurlaub, Gleittag
  • Gesetzliche Feiertage aller 16 Bundesländer werden automatisch berechnet
  • Schulferien per Klick importierbar (OpenHolidays API)
  • Betriebliche freie Tage, z. B. Heiligabend oder Silvester
  • Optional: Abwesenheiten aus einem CalDAV-Kalender übernehmen, z. B. aus Nextcloud

Zeitzuschläge

  • Prozentsätze für Samstag, Sonntag, Feiertag, Weihnachten/1. Mai und Nacht frei einstellbar
  • Wahlweise als Zeitgutschrift aufs Gleitzeitkonto oder nur zum Ausweisen

Mehrbenutzer

  • Ein Admin legt Benutzer an, jeder sieht nur seine eigenen Daten
  • Admins können Auswertungen und Konten aller Benutzer einsehen und korrigieren
Monatsauswertung mit Soll/Ist-Diagramm und Gleitzeitsaldo

Voraussetzungen

  • Webserver mit PHP 8.1 oder neuer (getestet mit Apache, z. B. unter KeyHelp)
  • MariaDB 10.5+ oder MySQL 8
  • PHP-Erweiterungen: pdo_mysql, curl, openssl, mbstring
  • Keine Composer-Pakete, kein Node.js, keine externen Bibliotheken

Installation

  1. ZIP herunterladen, entpacken und in dein Webverzeichnis hochladen.

  2. Datenbank anlegen und das Schema importieren:

    mysql -u zeiterfassung -p zeiterfassung < install/schema.sql
  3. Konfiguration anlegen und einen Schlüssel erzeugen:

    cp config.sample.php config.php
    php -r 'echo bin2hex(random_bytes(32)), PHP_EOL;'

    Den ausgegebenen Wert als app_key in die config.php eintragen, dazu die Datenbank-Zugangsdaten.

  4. https://deine-domain/setup.php aufrufen und den ersten Benutzer anlegen – er wird automatisch Administrator.

  5. Eigenes Logo hinterlegen: assets/logo.svg durch dein Logo ersetzen (gleicher Dateiname).

  6. Optional einen täglichen Cronjob einrichten (Kalender-Sync und Ferienimport):

    /usr/bin/php /pfad/zur/zeiterfassung/cron/sync.php

Eine .htaccess für Apache liegt bei und sperrt Konfiguration und interne Verzeichnisse. Wenn du nginx nutzt, musst du das selbst nachbauen.

Update von Version 1.0

mysql -u zeiterfassung -p zeiterfassung < install/upgrade-1.1.sql

Danach die Dateien ersetzen – deine config.php bleibt erhalten.

Datenschutz

Alle Daten bleiben auf deinem Server. Es gibt kein Tracking und keine Telemetrie. Externe Verbindungen entstehen nur, wenn du sie auslöst: beim Import der Schulferien (openholidaysapi.org) und beim Abgleich mit deinem eigenen Kalender. Passwörter werden gehasht gespeichert, das CalDAV-App-Passwort verschlüsselt.

Wichtige Hinweise

  • Zeitzuschläge: Einen allgemeinen gesetzlichen Anspruch auf Sonntags- oder Feiertagszuschläge gibt es nicht. Welche Sätze für dich gelten, regeln dein Tarif- oder Arbeitsvertrag. Die App rechnet nur mit den Werten, die du einträgst.
  • Keine Rechtsberatung: Die Pausenprüfung orientiert sich am Arbeitszeitgesetz, ersetzt aber keine Prüfung im Einzelfall.
  • Bekannte Grenzen: Wiederkehrende Kalendertermine werden beim CalDAV-Import übersprungen. Ein Verfall von Resturlaub (z. B. zum 31.03.) ist nicht abgebildet. Regional begrenzte Feiertage legst du als betrieblichen freien Tag an.

Lizenz

Die Zeiterfassung ist freie Software unter der GNU Affero General Public License v3.0 (AGPL-3.0-only). Der vollständige Lizenztext liegt als LICENSE im ZIP.

  • Du darfst die App nutzen, verändern und weitergeben – privat wie beruflich.
  • Veränderungen bleiben offen: Gibst du eine veränderte Fassung weiter oder stellst sie anderen über das Netz zur Verfügung, muss sie ebenfalls unter der AGPL-3.0 stehen und ihr Quellcode zugänglich sein. Den Link „Quellcode“ im Footer stellst du dafür in der config.php über source_url ein.
  • Zusätzliche Bedingung (§ 7 b AGPL-3.0): Der Urheberhinweis „Mit ♥ gemacht in Paderborn“ mit Link auf www.alexnolte.de im Footer sowie die Datei NOTICE müssen erhalten und sichtbar bleiben. Eigene Hinweise wie „angepasst von …“ darfst du gerne ergänzen.
  • Keine Gewährleistung: Die Software wird ohne jede Gewährleistung bereitgestellt.

Download

Download: zeiterfassung-1.1.zip

Dies ist ein privates Projekt ohne Support-Anspruch – über Rückmeldungen, Fehlerberichte und Ideen freue ich mich aber jederzeit.