Skip to content

Latest commit

 

History

History
412 lines (280 loc) · 19.1 KB

README.md

File metadata and controls

412 lines (280 loc) · 19.1 KB

Build Status Sonarcloud Status Docker Pulls Total Downloads Heroku

Urlaubsverwaltung


Übersicht

Die Urlaubsverwaltung ist eine Web-Anwendung, die es ermöglicht, Urlaubsanträge von Mitarbeitern elektronisch zu verwalten. Mitarbeiter stellen Urlaubsanträge, die von den jeweils Berechtigten genehmigt oder abgelehnt werden. Die Anwendung bietet eine Übersicht über die bestehenden Urlaubsanträge und ermöglicht außerdem Überblick und Pflege von Urlaubsanspruch und Anzahl verbleibender Urlaubstage der Mitarbeiter. Zusätzlich können Krankmeldungen erfasst und überblickt werden.

Screenshot Urlaubsverwaltung Screenshot Urlaubsverwaltung

Demo System

Zum Ausprobieren der Anwendung gibt es ein Demo System mit Testbenutzern für die unterschiedlichen Rollen:

Rolle Benutzername Passwort Vorname, Nachname
Office test secret Marlene Muster
Chef testBoss secret Max Muster
Freigabe Verantwortlicher testManager secret Peter Huber
Abteilungsleiter testHead secret Thorsten Krüger
Benutzer testUser secret Klaus Müller
Admin admin secret Senor Operation

Blog Posts

Weitere Informationen zur Geschichte und Entwicklung der Urlaubsverwaltung findet man im synyx Blog:

FAQ

Für Fragen, die bei der Benutzung der Urlaubsverwaltung aufkommen können, gibt es ein FAQ. Der Fragenkatalog erhebt keinen Anspruch auf Vollständigkeit und befindet sich im ständigen Wachstum und in Veränderung.

Berechtigungen

In der Urlaubsverwaltung gibt es aktuell folgende Arten von Berechtigungen:

  • inaktiv: hat keinen Zugang mehr zur Urlaubsverwaltung (Daten des Benutzers bleiben zur Archivierung bestehen)
  • User: darf Urlaub für sich selbst beantragen
  • Abteilungsleiter: darf Urlaubsanträge für die Benutzer seiner Abteilungen einsehen, genehmigen und ablehnen
  • Freigabe Verantwortlicher: ist bei der zweistufigen Genehmigung von Anträgen verantwortlich für die endgültige Freigabe
  • Chef: darf Urlaubsanträge aller Benutzer einsehen, genehmigen und ablehnen
  • Office: darf Einstellungen zur Anwendung vornehmen, Mitarbeiter verwalten, Urlaub für Mitarbeiter beantragen/stornieren und Krankmeldungen pflegen
  • Admin: Keine fachliche Rolle sondern nur für den Zugriff von Management Schnittstellen (Spring Boot Actuator).

Eine aktive Person kann eine oder mehrere Rollen innehaben.

REST-Schnittstelle

Die Urlaubsverwaltung besitzt einen sich selbst beschreibende REST-Schnittstelle. Diese kann mit über /api/ aufgerufen werden, z.Bsp. hier: https://urlaubsverwaltung.herokuapp.com/api/


Installation

Um eine aktuelle Version der Urlaubsverwaltung zu installieren, bitte die folgende Anleitung befolgen.

Falls noch eine ältere Version (< 2.12.0) der Urlaubsverwaltung verwendet hier, können Details zur Installation und Konfiguration hier nachgelesen werden.

Zusätzlich wird die Urlaubsverwaltung auch als Docker Image synxy/urlaubsverwaltung bereitgestellt. Beispiele zu diesem Deployment gibt es hier.

Systemvoraussetzungen

  • JDK 8
  • MySQL Datenbank

Download

Die Anwendung steht auf Github bereits als deploybare WAR-Datei zum Download zur Verfügung. Einfach die WAR-Datei der aktuellsten Version hier downloaden. Auch wenn der Download eine WAR-Datei ist, kann sie wie die bisherige JAR-Datei verwendet werden, da die WAR-Datei einen Tomcat bundled.

Starten der Anwendung

Damit man die Anwendung möglichst schnell ausprobieren kann, bietet es sich an die Anwendung im Entwicklungsmodus zu starten:

java -jar -Dspring.profiles.active=dev urlaubsverwaltung.war

Auf diese Weise wird die Anwendung mit einer In-Memory-Datenbank und Testdaten gestartet. Man kann sich mit den gleichen Benutzerdaten wie beim Demo System anmelden.

Aufrufen der Anwendung

Die Anwendung ist nun erreichbar unter

<servername>:8080/

Anwendung als Service

Da die Anwendung auf Spring Boot basiert, lässt sie sich sehr komfortabel als Service installieren. Wie genau dies funktioniert, kann den entsprechenden Kapiteln in der Spring Boot Dokumentation nachgelesen werden:

Konfigurationsdatei

Die Anwendung besitzt im Verzeichnis src/main/resources eine application.properties Datei zur Konfiguration. Diese beinhaltet gewisse Grundeinstellungen und Standardwerte. Diese allein reichen für die Produktivnahme der Anwendung allerdings noch nicht aus. Spezifische Konfigurationen wie z.B. die Datenbank Einstellungen müssen durch eine eigene Properties-Datei hinterlegt werden. Welche Konfigurationen überschrieben werden können/müssen, kann in einer beispielhaften Konfigurationsdatei eingesehen werden. Diese Datei kann einfach als Grundlage genommen werden, um eine eigene application.properties zu erstellen, die die Standardwerte überschreibt.

Welche Möglichkeiten es bei Spring Boot gibt, damit die eigene Konfigurationsdatei genutzt wird, kann hier nachgelesen werden.

Einfachste Möglichkeit: Man kann in dem Verzeichnis, in dem man die Anwendung startet eine Datei namens application.properties mit eigener Konfiguration hinterlegen. Die dort konfigurierten Properties überschreiben dann die Standardwerte.

Datenbank

Die in der Konfigurationsdatei konfigurierte Datenbank muss existieren.

Achtung! Produktives Starten der Anwendung

Wenn eine eigene Konfigurationsdatei hinterlegt ist, darf die Anwendung natürlich nicht mehr im Entwicklungsmodus gestartet werden, d.h. die Anwendung muss ohne -Dspring.profiles.active=dev gestartet werden:

java -jar urlaubsverwaltung.war

Authentifizierung

Die Anwendung verfügt über drei verschiedene Authentifizierungsmöglichkeiten:

  • default
    • für lokalen Entwicklungsmodus
  • ldap
    • Authentifizierung via LDAP
    • Es müssen die LDAP URL, die LDAP Base und LDAP User DN Patterns konfiguriert sein, damit eine Authentifizierung via LDAP möglich ist.
  • activeDirectory
    • Authentifizierung via Active Directory
    • Es müssen die Active Directory Domain und LDAP URL konfiguriert sein, damit eine Authentifizierung via Active Directory möglich ist.

Der erste Benutzer, der sich erfolgreich im System einloggt, wird in der Urlaubsverwaltung mit der Rolle Office angelegt. Dies ermöglicht Benutzer- und Rechteverwaltung innerhalb der Anwendung und das Pflegen der Einstellungen für die Anwendung.

LDAP

Um LDAP zur Authentifizierung zu nutzen, muss die Property auth in der eigenen Konfigurationsdatei auf ldap gesetzt werden:

auth=ldap
Active Directory

Um Active Directory zur Authentifizierung zu nutzen, muss die Property auth in der eigenen Konfigurationsdatei auf activeDirectory gesetzt werden:

auth=activeDirectory
Synchronisation der User-Datenbank

Ab Version 2.14 werden die LDAP/AD-Benutzer nicht mehr automatisch in die Urlaubsverwaltung synchronisiert, sondern nur noch beim Login des jeweiligen Users in die Datenbank übertragen. Man kann die automatische Synchronisation aller Benutzer aktivieren indem man in der Konfiguration das Property uv.security.ldap.sync bzw. uv.security.activeDirectory.sync auf true gesetzt wird:

uv.security.ldap.sync=true
bzw.
uv.security.activeDirectory.sync=true

Synchronisation mit Kalender

Die Urlaubsverwaltung bietet die Möglichkeit alle Urlaube und Krankheitstage mit einem Kalender zu synchronisieren. Dafür werden Microsoft Exchange bzw. Office 356 und Google Calendar unterstützt.

Konfiguration Microsoft Exchange

Einstellungsdialog für Microsoft Exchange als Kalenderanbindung

Anhand der zu konfigurierenden Email-Adresse wird per Autodiscovery die dazugehörige Exchange Server Adresse ermittelt, welche für die synchronisation verwendet wird. Wichtig ist, dass der gewünschte Kalender bereits zuvor angelegt wurde.

Konfiguration Google Calendar

Einstellungsdialog für Google Calendar als Kalenderanbindung

Die Anbindung von Google Calendar basiert auf einem OAuth 2.0 Handshake. Sobald alle Konfigurationsfelder wie unten beschrieben für die Synchronisation mit Google Calendar befüllt sind, kann mit dem Button "Zugriff erlauben..." der OAuth 2.0 Handshake durchgeführt werden. Sofern dieser Schritt erfolgreich war und die Synchronisation eingerichtet ist, steht neben dem Button "Verbindung zum Google-Kalender ist hergestellt."

Client anlegen

Anlage eines OAuth 2.0 Clients

Um einen solchen OAuth 2.0 Handshake durchführen zu können ist es zunächst notwendig die Urlaubsverwaltung als Anwendung bei Google bekannt zu machen. Dies geschieht über APIs und Services. Hier muss zunächst ein Projekt angelegt werden. Sobald das geschehen ist kann die Calendar API aktiviert werden. Nach der Aktivierung müssen außerdem OAuth 2.0 Client Zugangsdaten erzeugt werden. Es müssen außerdem die Autorisierte Weiterleitungs-URIs mit dem Wert gefüllt werden der in den Einstellungen unter Weiterleitungs-URL angezeigt wird. Direkt nach der Erstellung werden Client Id und Client Secret angezeigt. Diese müssen dann in den Einstellungen der Urlaubsverwaltung entsprechend hinterlegt werden.

Kalender anlegen/konfigurieren

Eine weitere notwendige Information ist die Kalender ID welche später zur Synchronisation verwendet wird. Es kann dafür entweder ein bestehender Kalender verwendet werden oder ein neuer Kalender angelegt werden. In Google Calendar kann man dann in den Kalendereinstellungen die Kalendar ID finden. Diese muss ebenfalls in der Urlaubsverwaltung gepflegt werden.

Urlaubsverwaltung Weiterleitungs-URL

Damit der OAuth 2.0 Handshake durchgeführt werden kann, ist es notwendig die die Weiterleitungs-URL bei der Konfiguration der Webanwendung bei Google anzugeben. Diese ist abhängig von der Installation und wird in den Einstellungen des Google Kalenders angezeigt, z.B. http://localhost:8080/web/google-api-handshake für ein Testsystem. Sie ist nur für die initiale Freigabe des Kalenders nötig.


Entwicklung

Im Folgenden werden die durchzuführenden Schritte beschrieben, wenn man an der Urlaubsverwaltung entwickeln möchte.

Repository clonen

git clone [email protected]:synyx/urlaubsverwaltung.git

Release

Für ein Release wird das maven-release-plugin verwendet. Zum sorgenfreien Release Erstellung kann folgendes Script verwendet werden.

export RELEASE_VERSION=0.10.0
export NEW_VERSION=0.11.0-SNAPSHOT
./release.sh
git fetch

Anwendung starten

Die Urlaubsverwaltung ist eine Spring Boot Anwendung und kann mit dem Maven Plugin gestartet werden:

./mvnw clean spring-boot:run

bzw. für Windows Benutzer über:

./mvnw.cmd clean spring-boot:run
Wenn mit einer eigenen Konfigurationsdatei gearbeitet werden soll, kann diese als Spring profile Parameter beim Start angegeben werden. Zum Beispiel kann eine Konfiguration für MariaDB unter application-mariadb.properties angelegt und mit folgendem Maven Aufruf gestartet werden:
./mvnw clean spring-boot:run -Drun.profiles=mariadb

Einzelne Parameter lassen sich mit -D<parameterName>=<parameterWert> überschreiben.

Im Browser lässt sich die Anwendung dann über http://localhost:8080/ ansteuern.

Ohne weitere Anpassung der Standardkonfiguration wird eine H2-Datenbank verwendet und es werden Testdaten angelegt, d.h. Benutzer, Urlaubsanträge und Krankmeldungen. Daher kann man sich in der Weboberfläche nun mit verschiedenen Testbenutzern anmelden:

  • testUser/secret: Benutzer mit der Rolle User
  • testBoss/secret: Benutzer mit der Rolle Boss
  • testHead/secret: Benutzer mit der Rolle DepartmentHead
  • testManager/secret: Benutzer mit der Rolle SecondStageAuthority
  • test/secret: Benutzer mit der Rolle Office

Fontend Entwicklung

Die User Experience einiger Seiten wird zur Laufzeit mit JavaScript weiter verbessert.

Assets sind in <root>/src/main/webapp zu finden

  • bundles sind in den JSPs zu integrieren
  • components sind einzelne Komponenten zur Wiederverwendung wie z. B. der datepicker
  • js beinhaltet Seitenspezifische Dinge
  • lib sind third-party Bibliotheken

Der Frontend Build ist in Maven integriert. Isoliert können die Assets aber auch auf der Kommandozeile gebaut werden.

  • npm run build
    • baut optimierte, minifizierte Assets
  • npm run build:dev
    • baut nicht minifizierte Assets
  • npm run build:watch
    • baut automatisch nach dem editieren von JavaScript / CSS Dateien neue Assets

Anlegen von Testdaten deaktivieren

Möchte man, dass beim Starten der Anwendung keine Testdaten generiert werden, muss man die Property testdata.create in den application-dev.properties auf false setzen.

H2 Web Konsole

Die Standardkonfiguration im dev-Profil sorgt dafür, dass eine H2 Web Konsole aktiv ist.
Diese kann standardmäßig erreicht werden unter:

localhost:8080/h2-console/

Die H2 Konfigurationen können in der application-dev.properties überschrieben werden.

API

Die Urlaubsverwaltung verfügt über eine API, die unter http://localhost:8080/api erreichbar ist.

Authentifizierung

Siehe Authentifizierung

Möchte man LDAP oder Active Directory zur Authentifizierung nutzen, setzt man die Property auth entweder als System Property oder man konfiguriert diese in den application.properties bzw. in den application-dev.properties.

Hinweis: Die Verbindung zum LDAP / Active Directory muss dafür selbstverständlich korrekt in den application.properties bzw. in den application-dev.properties konfiguriert sein.

LDAP

Die Anwendung mit dem Parameter -Dauth=ldap starten:

./mvnw clean spring-boot:run -Dauth=ldap

Oder die Property auth in den application.properties bzw. in den application-dev.properties setzen:

auth=ldap

Active Directory

Die Anwendung mit dem Parameter -Dauth=activeDirectory starten:

./mvnw clean spring-boot:run -Dauth=activeDirectory

Oder die Property auth in den application.properties bzw. in den application-dev.properties setzen:

auth=activeDirectory

Externe Systeme mit Docker virtualisieren

Wenn man in einer produktions-nahen Umgebung entwickeln oder Probleme nachstellen will, bietet es sich an, die extenen Systeme wie die Datenbank oder den LDAP-Server zu virtualisieren. Hier wird gezeigt, wie man das mit Docker tun kann.


Hinweise zu Versionen

Alle Änderungen an der Anwendung werden im Changelog gepflegt: Changelog


Technologien

  • Die Anwendung basiert auf dem Spring MVC Framework.
  • Zur Ermittlung von Feiertagen wird das Framework Jollyday benutzt.
  • Das Frontend beinhaltet Elemente von Bootstrap gewürzt mit einer Prise jQuery und Font Awesome. *Für die Darstellung der Benutzer Avatare wird Gravatar benutzt.
  • Zur Synchronisation der Urlaubs- und Krankmeldungstermine mit einem Microsoft Exchange Kalender wird die EWS JAVA API genutzt.
  • Zur Synchronisation der Urlaubs- und Krankmeldungstermine mit einem Google Calendar wird der Google API Client verwendet.

Lizenz

synyx/urlaubsverwaltung is licensed under the Apache License 2.0