Aufräumen und header zentralisieren

This commit is contained in:
2026-02-05 01:23:49 +01:00
parent 063fb68b12
commit 7d6951334f
22 changed files with 58 additions and 182 deletions

470
doc/DSGVO-Dokumentation.md Normal file
View File

@@ -0,0 +1,470 @@
# DSGVO-Dokumentation
## Stundenerfassungssystem
---
## 1. Verantwortlicher und Kontaktdaten
**Verantwortlicher für die Datenverarbeitung:**
SDS Systemtechnik
Rudolf-Diesel-Str. 7
75365 Calw
info@sds-systemtechnik.de
+497051931540
**Datenschutzbeauftragter (falls vorhanden):**
Matthias Herrlinger
connexo GmbH
Jägerstraße 4F
71296 Heimsheim
**Kontakt für Datenschutzanfragen:**
Carsten Graf
Mechatronik-Ingenieur / IT-Infrastruktur
SDS Systemtechnik
carsten.graf@sds-systemtechnik.de
+4970519315416
---
## 2. Zweck der Datenverarbeitung
Das Stundenerfassungssystem dient der Erfassung, Verwaltung und Dokumentation von Arbeitszeiten der Mitarbeiter. Die Verarbeitung personenbezogener Daten erfolgt zu folgenden Zwecken:
- **Zeiterfassung**: Erfassung von Arbeitsbeginn, Arbeitsende, Pausen und Gesamtarbeitszeit
- **Arbeitszeitverwaltung**: Berechnung von Überstunden, Urlaubstagen und Fehlzeiten
- **Lohnabrechnung**: Bereitstellung von Daten für die Lohn- und Gehaltsabrechnung
- **Projektabrechnung**: Zuordnung von Arbeitszeiten zu Projekten und Projektnummern
- **Compliance**: Einhaltung arbeitsrechtlicher Vorschriften (z.B. Arbeitszeitgesetz)
- **Authentifizierung**: Sicherstellung des Zugriffs nur für berechtigte Personen
- **Automatische Zeiterfassung**: IP-basierte automatische Erfassung von Arbeitsbeginn und -ende (optional)
---
## 3. Rechtsgrundlage
Die Verarbeitung personenbezogener Daten erfolgt auf Grundlage der folgenden Rechtsgrundlagen nach der DSGVO:
- **Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung)**: Erfüllung des Arbeitsvertrags, insbesondere Erfassung der Arbeitszeit zur Lohnabrechnung
- **Art. 6 Abs. 1 lit. c DSGVO (Rechtliche Verpflichtung)**: Erfüllung gesetzlicher Verpflichtungen (z.B. Arbeitszeitgesetz, Aufbewahrungspflichten nach HGB/GoBD)
- **Art. 6 Abs. 1 lit. f DSGVO (Berechtigtes Interesse)**: Betriebswirtschaftliche Interessen (Projektabrechnung, Arbeitszeitoptimierung)
**Besondere Kategorien personenbezogener Daten:**
- **Krankheitsdaten** (sick_status): Art. 9 Abs. 2 lit. b DSGVO (Arbeitsrechtliche Verpflichtungen)
---
## 4. Erfasste Datenkategorien
### 4.1 Benutzerdaten (Tabelle: `users`)
| Datenfeld | Beschreibung | Kategorie |
|-----------|--------------|-----------|
| `id` | Eindeutige Benutzer-ID (automatisch generiert) | Identifikationsdaten |
| `username` | Benutzername für Login | Authentifizierung |
| `password` | Passwort (gehasht mit bcrypt) | Authentifizierung |
| `firstname` | Vorname | Identifikationsdaten |
| `lastname` | Nachname | Identifikationsdaten |
| `personalnummer` | Personalnummer des Mitarbeiters | Identifikationsdaten |
| `role` | Benutzerrolle(n) als JSON-Array (z.B. "mitarbeiter", "verwaltung", "admin") | Berechtigungsdaten |
| `wochenstunden` | Soll-Arbeitsstunden pro Woche | Arbeitszeitdaten |
| `urlaubstage` | Anzahl der Urlaubstage pro Jahr | Arbeitszeitdaten |
| `overtime_offset_hours` | Manuelle Korrektur der Überstunden durch Verwaltung | Arbeitszeitdaten |
| `vacation_offset_days` | Manuelle Korrektur der Urlaubstage durch Verwaltung | Arbeitszeitdaten |
| `ping_ip` | IP-Adresse für automatische Zeiterfassung (optional) | Technische Daten |
| `last_week_start` | Letzte bearbeitete Woche (für UI-Navigation) | Systemdaten |
| `created_at` | Zeitstempel der Benutzererstellung | Metadaten |
### 4.2 Zeiterfassungsdaten (Tabelle: `timesheet_entries`)
| Datenfeld | Beschreibung | Kategorie |
|-----------|--------------|-----------|
| `id` | Eindeutige Eintrags-ID | Identifikationsdaten |
| `user_id` | Verknüpfung zum Benutzer | Identifikationsdaten |
| `date` | Datum des Arbeitstages (Format: YYYY-MM-DD) | Zeitstempel |
| `start_time` | Arbeitsbeginn (Format: HH:MM) | Zeitstempel |
| `end_time` | Arbeitsende (Format: HH:MM) | Zeitstempel |
| `pause_start_time` | Pausenbeginn (Format: HH:MM, optional) | Zeitstempel |
| `pause_end_time` | Pausenende (Format: HH:MM, optional) | Zeitstempel |
| `break_minutes` | Pausenzeit in Minuten | Arbeitszeitdaten |
| `total_hours` | Berechnete Gesamtarbeitszeit in Stunden | Arbeitszeitdaten |
| `activity1_desc` bis `activity5_desc` | Beschreibung der Tätigkeit (bis zu 5 pro Tag) | Tätigkeitsdaten |
| `activity1_hours` bis `activity5_hours` | Stunden für die jeweilige Tätigkeit | Tätigkeitsdaten |
| `activity1_project_number` bis `activity5_project_number` | Projektnummer für die jeweilige Tätigkeit | Projektbezogene Daten |
| `notes` | Freitext-Notizen zum Arbeitstag | Tätigkeitsdaten |
| `overtime_taken_hours` | Verbrauchte Überstunden an diesem Tag | Arbeitszeitdaten |
| `vacation_type` | Urlaubstyp ("full" = ganzer Tag, "half" = halber Tag, null = kein Urlaub) | Arbeitszeitdaten |
| `sick_status` | Krankheitsstatus (0 = nicht krank, 1 = krank) | Gesundheitsdaten |
| `weekend_travel` | Wochenend-Reise (0 = nein, 1 = ja) | Arbeitszeitdaten |
| `applied_weekend_percentage` | Angewendeter Wochenend-Prozentsatz für Berechnung | Arbeitszeitdaten |
| `status` | Status des Eintrags ("offen", "eingereicht") | Metadaten |
| `created_at` | Zeitstempel der Erstellung | Metadaten |
| `updated_at` | Zeitstempel der letzten Änderung | Metadaten |
### 4.3 Wochenstundenzettel (Tabelle: `weekly_timesheets`)
| Datenfeld | Beschreibung | Kategorie |
|-----------|--------------|-----------|
| `id` | Eindeutige Stundenzettel-ID | Identifikationsdaten |
| `user_id` | Verknüpfung zum Benutzer | Identifikationsdaten |
| `week_start` | Startdatum der Woche (Format: YYYY-MM-DD) | Zeitstempel |
| `week_end` | Enddatum der Woche (Format: YYYY-MM-DD) | Zeitstempel |
| `version` | Versionsnummer des Stundenzettels (bei Änderungen) | Metadaten |
| `version_reason` | Grund für die neue Version (Freitext) | Metadaten |
| `status` | Status ("eingereicht", "bearbeitet") | Metadaten |
| `submitted_at` | Zeitstempel der Einreichung | Metadaten |
| `reviewed_by` | ID des prüfenden Verwaltungsmitarbeiters | Identifikationsdaten |
| `reviewed_at` | Zeitstempel der Prüfung | Metadaten |
| `pdf_downloaded_at` | Zeitstempel des PDF-Downloads | Metadaten |
| `pdf_downloaded_by` | ID des Benutzers, der das PDF heruntergeladen hat | Identifikationsdaten |
| `admin_comment` | Kommentar der Verwaltung zum Stundenzettel | Metadaten |
### 4.4 IP-basierte Zeiterfassung (Tabelle: `ping_status`)
| Datenfeld | Beschreibung | Kategorie |
|-----------|--------------|-----------|
| `user_id` | Verknüpfung zum Benutzer | Identifikationsdaten |
| `date` | Datum (Format: YYYY-MM-DD) | Zeitstempel |
| `last_successful_ping` | Zeitstempel des letzten erfolgreichen Pings | Technische Daten |
| `failed_ping_count` | Anzahl fehlgeschlagener Pings | Technische Daten |
| `start_time_set` | Flag, ob Start-Zeit bereits gesetzt wurde (0/1) | Technische Daten |
| `first_failed_ping_time` | Zeitstempel des ersten fehlgeschlagenen Pings | Technische Daten |
### 4.5 LDAP-Synchronisation (Tabelle: `ldap_sync_log`)
| Datenfeld | Beschreibung | Kategorie |
|-----------|--------------|-----------|
| `id` | Eindeutige Log-ID | Identifikationsdaten |
| `sync_type` | Typ der Synchronisation ("manual" oder "automatic") | Metadaten |
| `status` | Status ("success", "error") | Metadaten |
| `users_synced` | Anzahl synchronisierter Benutzer | Metadaten |
| `error_message` | Fehlermeldung bei Fehlern (optional) | Metadaten |
| `sync_started_at` | Zeitstempel des Synchronisationsbeginns | Metadaten |
| `sync_completed_at` | Zeitstempel des Synchronisationsendes | Metadaten |
**LDAP-Konfiguration (Tabelle: `ldap_config`):**
Diese Tabelle enthält keine personenbezogenen Daten, sondern nur technische Konfigurationsdaten für die LDAP-Verbindung.
**LDAP-Synchronisierte Daten:**
Bei aktivierter LDAP-Integration werden folgende Daten aus dem Active Directory synchronisiert:
- `username` (sAMAccountName)
- `firstname` (givenName)
- `lastname` (sn)
### 4.6 Session-Daten (Express-Session)
| Datenfeld | Beschreibung | Speicherdauer |
|-----------|--------------|---------------|
| `userId` | ID des angemeldeten Benutzers | 24 Stunden (Standard) oder 30 Tage (bei "Angemeldet bleiben") |
| `roles` | Array der Benutzerrollen | 24 Stunden (Standard) oder 30 Tage (bei "Angemeldet bleiben") |
| `currentRole` | Aktuell ausgewählte Rolle | 24 Stunden (Standard) oder 30 Tage (bei "Angemeldet bleiben") |
**Cookie-Informationen:**
- Cookie-Name: `connect.sid`
- Speicherort: Client-Browser
- Verschlüsselung: Session-Daten werden serverseitig gespeichert, Cookie enthält nur Session-ID
### 4.7 Systemdaten (keine personenbezogenen Daten)
**Tabelle: `public_holidays`**
- `date`: Feiertagsdatum
- `name`: Name des Feiertags
**Tabelle: `system_options`**
- `saturday_percentage`: Prozentsatz für Samstagsarbeit
- `sunday_percentage`: Prozentsatz für Sonntagsarbeit
- `checkin_root_url`: Basis-URL für Check-in/Check-out Links
---
## 5. Datenquellen
Die personenbezogenen Daten stammen aus folgenden Quellen:
1. **Direkte Eingabe durch Mitarbeiter**: Zeiterfassungsdaten, Tätigkeitsbeschreibungen, Projektnummern, Notizen
2. **Automatische Erfassung**: IP-basierte Zeiterfassung (optional, wenn `ping_ip` konfiguriert ist)
3. **LDAP/Active Directory**: Bei aktivierter LDAP-Integration werden Benutzername, Vorname und Nachname aus dem Active Directory synchronisiert
4. **Administrative Eingabe**: Personalnummer, Wochenstunden, Urlaubstage, Überstunden-Offset, Urlaubstage-Offset durch Verwaltung/Admin
5. **Automatische Berechnung**: Gesamtstunden, Überstunden werden automatisch aus den eingegebenen Daten berechnet
6. **Systemgeneriert**: IDs, Zeitstempel (created_at, updated_at), Session-Daten
---
## 6. Empfänger der Daten
Die personenbezogenen Daten werden folgenden Empfängern zugänglich gemacht:
### 6.1 Interne Empfänger
- **Mitarbeiter**: Zugriff auf eigene Zeiterfassungsdaten über das Dashboard
- **Verwaltungsmitarbeiter**: Zugriff auf alle eingereichten Stundenzettel zur Prüfung und PDF-Generierung
- **Administratoren**: Vollzugriff auf alle Daten zur Systemverwaltung und Benutzerverwaltung
- **IT-Administration**: Technischer Zugriff für Wartung und Support (nur bei Bedarf)
### 6.2 Externe Empfänger
- **Lohnbuchhaltung**: PDF-Stundenzettel werden für die Lohnabrechnung verwendet (manueller Export)
- **Steuerberater/Wirtschaftsprüfer**: Bei Prüfungen können Daten eingesehen werden (gemäß gesetzlichen Aufbewahrungspflichten)
### 6.3 Keine Weitergabe an Dritte
Die Daten werden nicht an Dritte (außerhalb der oben genannten Empfänger) weitergegeben. Es erfolgt keine Datenweitergabe an:
- Externe Dienstleister (außer bei expliziter Auftragsverarbeitung)
- Marketing-Unternehmen
- Soziale Netzwerke
- Andere Unternehmen
---
## 7. Speicherdauer und Löschung
### 7.1 Speicherdauer
Die personenbezogenen Daten werden für folgende Zeiträume gespeichert:
- **Zeiterfassungsdaten**: Mindestens 10 Jahre gemäß § 257 HGB (Aufbewahrungspflicht für Handelsbücher und Belege)
- **Lohnabrechnungsrelevante Daten**: 10 Jahre gemäß § 147 AO (Abgabenordnung)
- **Benutzerdaten**: Solange der Mitarbeiter im Unternehmen beschäftigt ist, danach gemäß Aufbewahrungspflichten
- **Session-Daten**: Werden automatisch nach Ablauf der Cookie-Laufzeit gelöscht (24 Stunden oder 30 Tage)
- **LDAP-Sync-Logs**: 1 Jahr (technische Logs)
### 7.2 Löschung
Die Löschung erfolgt:
- **Automatisch**: Session-Daten nach Ablauf der Cookie-Laufzeit
- **Manuell**: Bei Beendigung des Arbeitsverhältnisses, jedoch unter Beachtung der gesetzlichen Aufbewahrungspflichten
- **Auf Anfrage**: Gemäß den Betroffenenrechten (siehe Abschnitt 8), soweit keine gesetzlichen Aufbewahrungspflichten entgegenstehen
**Hinweis**: Auch nach Beendigung des Arbeitsverhältnisses können Daten aufgrund gesetzlicher Aufbewahrungspflichten (HGB, AO) nicht sofort gelöscht werden. Nach Ablauf der Aufbewahrungsfristen erfolgt die Löschung.
---
## 8. Betroffenenrechte
Jede betroffene Person hat folgende Rechte nach der DSGVO:
### 8.1 Auskunftsrecht (Art. 15 DSGVO)
Sie haben das Recht, Auskunft über die zu Ihrer Person gespeicherten Daten zu erhalten. Dies umfasst:
- Kategorien der verarbeiteten Daten
- Zweck der Verarbeitung
- Empfänger der Daten
- Geplante Speicherdauer
- Herkunft der Daten
### 8.2 Recht auf Berichtigung (Art. 16 DSGVO)
Sie haben das Recht, die Berichtigung unrichtiger oder die Vervollständigung unvollständiger Daten zu verlangen.
### 8.3 Recht auf Löschung (Art. 17 DSGVO)
Sie haben das Recht, die Löschung Ihrer Daten zu verlangen, sofern:
- Die Daten für den ursprünglichen Zweck nicht mehr benötigt werden
- Sie Ihre Einwilligung widerrufen haben
- Die Daten unrechtmäßig verarbeitet wurden
- Keine gesetzlichen Aufbewahrungspflichten entgegenstehen
**Wichtig**: Aufgrund gesetzlicher Aufbewahrungspflichten (HGB, AO) können Zeiterfassungsdaten für 10 Jahre nicht gelöscht werden.
### 8.4 Recht auf Einschränkung der Verarbeitung (Art. 18 DSGVO)
Sie haben das Recht, die Einschränkung der Verarbeitung zu verlangen, wenn:
- Die Richtigkeit der Daten bestritten wird
- Die Verarbeitung unrechtmäßig ist
- Die Daten nicht mehr benötigt werden, aber für Rechtsansprüche erforderlich sind
### 8.5 Recht auf Datenübertragbarkeit (Art. 20 DSGVO)
Sie haben das Recht, Ihre Daten in einem strukturierten, gängigen und maschinenlesbaren Format zu erhalten und an einen anderen Verantwortlichen zu übermitteln.
### 8.6 Widerspruchsrecht (Art. 21 DSGVO)
Sie haben das Recht, der Verarbeitung Ihrer Daten zu widersprechen, wenn die Verarbeitung auf Art. 6 Abs. 1 lit. f DSGVO (Berechtigtes Interesse) beruht.
**Hinweis**: Da die Zeiterfassung primär zur Erfüllung arbeitsvertraglicher und gesetzlicher Verpflichtungen erfolgt, ist ein Widerspruch in der Regel nicht möglich.
### 8.7 Widerruf der Einwilligung (Art. 7 Abs. 3 DSGVO)
Falls die Datenverarbeitung auf einer Einwilligung beruht, haben Sie das Recht, diese jederzeit zu widerrufen.
### 8.8 Beschwerderecht (Art. 77 DSGVO)
Sie haben das Recht, eine Beschwerde bei einer Aufsichtsbehörde einzulegen, insbesondere in dem Mitgliedstaat, in dem Sie sich aufhalten, arbeiten oder in dem der mutmaßliche Verstoß aufgetreten ist.
**Zuständige Aufsichtsbehörde:**
Der Landesbeauftragte für den Datenschutz und die Informationsfreiheit Baden-Württemberg
[Adresse]
[E-Mail]
[Telefon]
### 8.9 Ausübung der Rechte
Um Ihre Rechte auszuüben, wenden Sie sich bitte an:
Carsten Graf
Mechatronik-Ingenieur / IT-Infrastruktur
SDS Systemtechnik
[E-Mail]
[Telefon]
---
## 9. Technische und organisatorische Maßnahmen (TOM)
Zur Gewährleistung der Datensicherheit wurden folgende technische und organisatorische Maßnahmen implementiert:
### 9.1 Zugriffskontrolle
- **Authentifizierung**: Passwort-basierte Authentifizierung mit bcrypt-Hashing (10 Runden)
- **Autorisierung**: Rollenbasierte Zugriffskontrolle (Mitarbeiter, Verwaltung, Admin)
- **Session-Management**: Express-Session mit serverseitiger Speicherung, Session-IDs in verschlüsselten Cookies
- **Automatische Abmeldung**: Session-Cookies laufen nach 24 Stunden (Standard) oder 30 Tagen (bei "Angemeldet bleiben") ab
### 9.2 Verschlüsselung
- **Passwörter**: Bcrypt-Hashing mit Salt (10 Runden)
- **Datenübertragung**: Empfohlen wird die Verwendung von HTTPS (TLS/SSL) über einen Reverse Proxy (z.B. nginx)
- **Datenbank**: SQLite-Datenbankdatei sollte auf einem gesicherten Server gespeichert werden
### 9.3 Datensicherung
- **Backups**: Regelmäßige Backups der SQLite-Datenbankdatei (`stundenerfassung.db`)
- **Backup-Speicherung**: Backups sollten an einem separaten, gesicherten Ort gespeichert werden
### 9.4 Integrität
- **Datenbank-Constraints**: Foreign Keys und Constraints zur Gewährleistung der Datenintegrität
- **Validierung**: Eingabevalidierung auf Server- und Client-Seite
- **Versionierung**: Versionsverwaltung bei Stundenzetteln zur Nachvollziehbarkeit von Änderungen
### 9.5 Verfügbarkeit
- **Server-Monitoring**: Überwachung der Server-Verfügbarkeit
- **Fehlerbehandlung**: Umfassende Fehlerbehandlung und Logging
### 9.6 Trennbarkeit
- **Datenbank-Isolation**: Jeder Benutzer kann nur auf seine eigenen Daten zugreifen (außer Verwaltung/Admin)
- **Rollenbasierte Ansichten**: Unterschiedliche Ansichten je nach Benutzerrolle
### 9.7 Pseudonymisierung
- **Benutzer-IDs**: Interne Verwendung von numerischen IDs statt Namen für Datenbankverknüpfungen
- **Session-IDs**: Verwendung von zufälligen Session-IDs statt direkter Benutzeridentifikation in Cookies
---
## 10. Besondere Verarbeitungssituationen
### 10.1 IP-basierte automatische Zeiterfassung
**Funktionsweise:**
- Mitarbeiter können optional eine IP-Adresse (`ping_ip`) hinterlegen
- Das System pingt diese IP-Adresse jede Minute
- Bei erfolgreichem Ping wird automatisch die Start-Zeit gesetzt
- Bei 3 fehlgeschlagenen Pings wird automatisch die End-Zeit gesetzt
**Erfasste Daten:**
- IP-Adresse des Mitarbeiters (freiwillig hinterlegt)
- Ping-Status (erfolgreich/fehlgeschlagen)
- Zeitstempel der Pings
- Automatisch generierte Start- und End-Zeiten
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung) - Erfassung der Arbeitszeit
**Hinweis:** Die IP-Adresse wird nur für die automatische Zeiterfassung verwendet und nicht an Dritte weitergegeben.
### 10.2 LDAP/Active Directory Integration
**Funktionsweise:**
- Optional kann eine LDAP/Active Directory-Verbindung konfiguriert werden
- Benutzer werden automatisch oder manuell aus dem Active Directory synchronisiert
- Synchronisierte Daten: Benutzername, Vorname, Nachname
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung) - Bereitstellung des Systems für Mitarbeiter
**Hinweis:** Die LDAP-Konfiguration (URL, Bind-DN, Passwort) wird verschlüsselt in der Datenbank gespeichert. Die Synchronisation erfolgt nur innerhalb des Unternehmensnetzwerks.
### 10.3 PDF-Generierung
**Funktionsweise:**
- Verwaltungsmitarbeiter können PDF-Stundenzettel generieren
- PDFs enthalten alle Zeiterfassungsdaten einer Woche
- PDFs werden für die Lohnabrechnung verwendet
**Enthaltene Daten:**
- Mitarbeitername und Personalnummer
- Zeitraum (Woche)
- Alle Tageseinträge mit Start, Ende, Pause, Stunden
- Tätigkeiten mit Projektnummern
- Überstunden, Urlaub, Feiertage
- Gesamtstundensumme
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung) - Lohnabrechnung
**Hinweis:** PDFs werden nur intern verwendet und nicht an Dritte weitergegeben (außer Lohnbuchhaltung).
### 10.4 QR-Code Check-in/Check-out
**Funktionsweise:**
- Jeder Mitarbeiter erhält einen persönlichen QR-Code
- QR-Code enthält die Benutzer-ID
- Scan des QR-Codes führt zu Check-in oder Check-out
**Erfasste Daten:**
- Benutzer-ID (aus QR-Code)
- Zeitstempel des Scans
- Automatisch gesetzte Start- oder End-Zeit
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung) - Erfassung der Arbeitszeit
---
## 11. Datenübertragung in Drittländer
**Aktuell erfolgt keine Datenübertragung in Drittländer.**
Alle Daten werden auf Servern innerhalb der Europäischen Union (EU) oder des Europäischen Wirtschaftsraums (EWR) gespeichert und verarbeitet.
Falls in Zukunft eine Datenübertragung in Drittländer erforderlich sein sollte, wird dies nur unter Einhaltung der DSGVO-Anforderungen (z.B. Standardvertragsklauseln, Angemessenheitsbeschluss) erfolgen.
---
## 12. Automatisierte Entscheidungsfindung und Profiling
**Es erfolgt keine automatisierte Entscheidungsfindung (Art. 22 DSGVO) oder Profiling.**
Die automatische Berechnung von Arbeitszeiten und Überstunden dient lediglich der Unterstützung der manuellen Prüfung durch die Verwaltung und stellt keine automatisierte Entscheidung dar.
---
## 13. Änderungen dieser Dokumentation
Diese DSGVO-Dokumentation wird bei Änderungen der Datenverarbeitung aktualisiert. Die aktuelle Version ist immer im System verfügbar.
**Letzte Aktualisierung:** [Datum]
**Version:** 1.0
---
## 14. Anhang: Datenbank-Schema-Übersicht
### Tabellen mit personenbezogenen Daten:
1. **users**: Benutzerdaten, Authentifizierung, Arbeitszeitkonfiguration
2. **timesheet_entries**: Tageseinträge mit Zeiten, Tätigkeiten, Projektnummern
3. **weekly_timesheets**: Eingereichte Wochenstundenzettel
4. **ping_status**: IP-basierte Zeiterfassungsdaten
5. **ldap_sync_log**: Synchronisationsprotokolle (enthält Anzahl synchronisierter Benutzer)
### Tabellen ohne personenbezogene Daten:
1. **public_holidays**: Feiertage (Baden-Württemberg)
2. **system_options**: Systemweite Einstellungen
3. **ldap_config**: LDAP-Konfiguration (keine personenbezogenen Daten)
---
**Ende der DSGVO-Dokumentation**

285
doc/README.md Normal file
View File

@@ -0,0 +1,285 @@
# Stundenerfassungs-System
Eine webbasierte Anwendung zur Erfassung von Arbeitszeiten mit Admin-Bereich, PDF-Export, Überstunden-Verwaltung und LDAP-Integration.
## Features
### Für Mitarbeiter
- ✅ Login mit Benutzername und Passwort oder LDAP
- ✅ Wöchentliche Stundenerfassung (Montag - Sonntag)
- ✅ Automatisches Speichern der Einträge
- ✅ Eingabe von Start-/Endzeit, Pausen und Notizen
- ✅ Mehrere Tätigkeiten pro Tag mit Projektnummern (bis zu 5)
- ✅ Automatische Berechnung der Gesamtstunden
- ✅ Überstunden-Verwaltung (Anzeige und Verbrauch)
- ✅ Urlaubsverwaltung (ganzer/halber Tag)
- ✅ Krankheitstage erfassen
- ✅ Feiertage werden automatisch erkannt
- ✅ Wochenend-Prozentsätze (konfigurierbar)
- ✅ Wöchentliches Abschicken des Stundenzettels
- ✅ Überstunden-Auswertung pro Woche mit detaillierter Aufschlüsselung
- ✅ Anzeige aktueller Überstunden und verbleibender Urlaubstage
- ✅ Automatische Zeiterfassung via IP-Ping (optional)
- ✅ QR-Code für Check-in/Check-out
### Für Administratoren
- ✅ Benutzerverwaltung (Anlegen, Löschen, Bearbeiten)
- ✅ Rollenvergabe (Mitarbeiter, Verwaltung, Admin)
- ✅ Mehrere Rollen pro Benutzer möglich
- ✅ Übersicht aller Benutzer mit Statistiken
- ✅ Personalnummern verwalten
- ✅ Wochenstunden und Urlaubstage pro Mitarbeiter konfigurieren
- ✅ LDAP-Integration für Benutzer-Synchronisation
- ✅ LDAP-Konfiguration und manuelle/automatische Synchronisation
- ✅ System-Optionen (Wochenend-Prozentsätze)
### Für Verwaltung
- ✅ Postfach mit eingereichten Stundenzetteln
- ✅ PDF-Generierung und Download
- ✅ Übersichtliche Darstellung aller Einreichungen
- ✅ Wochenansicht mit Statistiken pro Mitarbeiter
- ✅ Überstunden-Offset (manuelle Korrekturen)
- ✅ Admin-Kommentare zu Stundenzetteln
- ✅ Versionsverwaltung bei Änderungen
- ✅ Übersicht über Überstunden und Urlaubstage aller Mitarbeiter
## Installation
### Voraussetzungen
- Node.js (Version 14 oder höher)
- npm (wird mit Node.js installiert)
### Schritt 1: Dependencies installieren
```bash
npm install
```
### Schritt 2: Server starten
```bash
npm start
```
Der Server läuft nun auf `http://localhost:3333`
Für Entwicklung mit automatischem Neustart:
```bash
npm run dev
```
### Docker (optional)
Das System kann auch mit Docker betrieben werden:
```bash
docker-compose up -d
```
## Standard-Zugangsdaten
Nach der Installation sind folgende Benutzer verfügbar:
### Administrator
- **Benutzername:** admin
- **Passwort:** admin123
- **Funktion:** Kann Benutzer anlegen und verwalten, LDAP konfigurieren
### Verwaltung
- **Benutzername:** verwaltung
- **Passwort:** verwaltung123
- **Funktion:** Kann eingereichte Stundenzettel einsehen, PDFs erstellen und Überstunden korrigieren
**WICHTIG:** Bitte ändern Sie diese Passwörter nach der ersten Anmeldung!
## Verwendung
### Für Mitarbeiter
1. Melden Sie sich mit Ihren Zugangsdaten an
2. Wählen Sie die gewünschte Woche aus (Pfeiltasten)
3. Tragen Sie Ihre Arbeitszeiten ein:
- **Start:** Arbeitsbeginn
- **Ende:** Arbeitsende
- **Pause:** Pausenzeit in Minuten
- **Tätigkeiten:** Bis zu 5 Tätigkeiten mit Beschreibung, Stunden und Projektnummer
- **Notizen:** Optional, z.B. Projekt oder Tätigkeit
- **Überstunden:** Optional, wenn Überstunden verbraucht werden sollen
- **Urlaub:** Ganzer oder halber Tag Urlaub
- **Krank:** Krankheitstag markieren
4. Die Einträge werden automatisch gespeichert
5. Am Ende der Woche: Klicken Sie auf **"Woche abschicken"**
6. Nach dem Abschicken können keine Änderungen mehr vorgenommen werden
7. **Überstunden-Auswertung:** Klicken Sie auf "Details anzeigen" im Bereich "Aktuelle Überstunden" für eine wöchentliche Aufschlüsselung
### Für Administratoren
1. Melden Sie sich als Admin an
2. Sie gelangen automatisch zur Benutzerverwaltung
3. **Neuen Benutzer anlegen:**
- Füllen Sie das Formular aus
- Wählen Sie die passende Rolle (mehrere möglich)
- Personalnummer, Wochenstunden und Urlaubstage konfigurieren
- Klicken Sie auf "Benutzer anlegen"
4. **Benutzer löschen:**
- Klicken Sie auf "Löschen" neben dem gewünschten Benutzer
- System-Benutzer (Admin, Verwaltung) können nicht gelöscht werden
5. **LDAP konfigurieren:**
- Navigieren Sie zum LDAP-Bereich
- Konfigurieren Sie LDAP-Verbindung und Synchronisation
- Führen Sie manuelle Synchronisationen durch oder aktivieren Sie automatische Syncs
### Für Verwaltung
1. Melden Sie sich als Verwaltungs-Benutzer an
2. Sie sehen alle eingereichten Stundenzettel im Postfach
3. **PDF erstellen:**
- Klicken Sie auf "PDF herunterladen" neben dem gewünschten Stundenzettel
- Die PDF wird automatisch generiert und heruntergeladen
4. **Überstunden korrigieren:**
- In der Wochenansicht können Sie manuelle Korrekturen (Offset) für jeden Mitarbeiter vornehmen
5. **Kommentare hinzufügen:**
- Fügen Sie Admin-Kommentare zu Stundenzetteln hinzu
6. Die PDF enthält:
- Mitarbeitername und Personalnummer
- Zeitraum
- Alle Tageseinträge mit Start, Ende, Pause, Stunden, Tätigkeiten und Notizen
- Überstunden-Verbrauch
- Urlaubstage
- Gesamtstundensumme
## Technologie-Stack
- **Backend:** Node.js + Express
- **Datenbank:** SQLite3
- **Template Engine:** EJS
- **PDF-Generierung:** PDFKit
- **Authentifizierung:** bcryptjs + express-session
- **LDAP:** ldapjs
- **QR-Codes:** qrcode
## Projektstruktur
```
stundenerfassung/
├── routes/ # API-Routen
│ ├── admin-routes.js # Admin-Funktionen
│ ├── admin-ldap-routes.js # LDAP-Verwaltung
│ ├── auth-routes.js # Authentifizierung
│ ├── dashboard-routes.js # Dashboard-Routen
│ ├── timesheet-routes.js # Stundenerfassung
│ ├── user-routes.js # Benutzer-APIs
│ └── verwaltung-routes.js # Verwaltungs-Funktionen
├── services/ # Services
│ ├── feiertage-service.js # Feiertags-API
│ ├── ldap-service.js # LDAP-Service
│ ├── ldap-scheduler.js # LDAP-Synchronisation
│ ├── pdf-service.js # PDF-Generierung
│ └── ping-service.js # IP-basierte Zeiterfassung
├── views/ # EJS-Templates
├── public/ # Statische Dateien
│ ├── css/
│ ├── js/
│ └── images/
└── helpers/ # Helper-Funktionen
```
## Datenbankstruktur
### Tabelle: users
- Speichert Benutzerinformationen und Zugangsdaten
- Passwörter werden verschlüsselt gespeichert
- Unterstützt mehrere Rollen pro Benutzer
- Personalnummer, Wochenstunden, Urlaubstage, Überstunden-Offset
### Tabelle: timesheet_entries
- Speichert einzelne Tageseinträge
- Automatische Berechnung der Gesamtstunden
- Unterstützt mehrere Tätigkeiten pro Tag
- Überstunden-Verbrauch, Urlaub, Krankheit
### Tabelle: weekly_timesheets
- Speichert eingereichte Wochenstundenzettel
- Verknüpfung mit Benutzer und Status
- Versionsverwaltung und Admin-Kommentare
### Tabelle: system_options
- Systemweite Einstellungen
- Wochenend-Prozentsätze (Samstag/Sonntag)
### Tabelle: public_holidays
- Öffentliche Feiertage (Baden-Württemberg)
- Automatische Aktualisierung
### Tabelle: ldap_config
- LDAP-Konfiguration
- Synchronisationseinstellungen
### Tabelle: ping_status
- IP-basierte Zeiterfassung
- Ping-Status pro Benutzer und Tag
## Features im Detail
### Überstunden-Verwaltung
- Automatische Berechnung basierend auf Sollstunden
- Berücksichtigung von Wochenend-Prozentsätzen
- Feiertagsstunden werden automatisch hinzugefügt
- Urlaubsstunden werden in die Berechnung einbezogen
- Manuelle Korrekturen durch Verwaltung möglich
- Detaillierte wöchentliche Auswertung für Mitarbeiter
### Urlaubsverwaltung
- Ganzer oder halber Tag Urlaub
- Verbleibende Urlaubstage werden angezeigt
- Verplante Urlaubstage werden erfasst
- Urlaubstage werden in Überstunden-Berechnung berücksichtigt
### Wochenend-Prozentsätze
- Konfigurierbare Prozentsätze für Samstag und Sonntag
- Werden automatisch auf gearbeitete Stunden angewendet
- Standard: 100% (keine Zuschläge)
### Feiertage
- Automatische Erkennung öffentlicher Feiertage (Baden-Württemberg)
- Feiertagsstunden werden automatisch berechnet
- Arbeit an Feiertagen zählt als Überstunden
### LDAP-Integration
- Automatische Benutzer-Synchronisation
- Konfigurierbare Synchronisationsintervalle
- Manuelle Synchronisation möglich
- LDAP-Authentifizierung als Alternative zu lokalen Passwörtern
## Sicherheit
- ✅ Passwörter werden mit bcrypt verschlüsselt
- ✅ Session-basierte Authentifizierung
- ✅ Rollenbasierte Zugriffskontrolle
- ✅ CSRF-Schutz durch Sessions
- ✅ LDAP-Integration für zentrale Authentifizierung
- ✅ SQL-Injection-Schutz durch parametrisierte Queries
## Anpassungen
### Port ändern
Bearbeiten Sie in `server.js` die Zeile:
```javascript
const PORT = 3333; // Ändern Sie hier den Port
```
### Datenbank-Speicherort
Die Datenbank wird standardmäßig als `stundenerfassung.db` im Projektverzeichnis gespeichert.
Über die Umgebungsvariable `DB_PATH` kann ein anderer Pfad angegeben werden.
### Wochenend-Prozentsätze
Im Admin-Bereich können die Prozentsätze für Samstag und Sonntag konfiguriert werden.
Standard: 100% (keine Zuschläge).
## Lizenz
Proprietär - Für interne Firmennutzung
## Support
Bei Fragen oder Problemen wenden Sie sich bitte an Ihre IT-Abteilung.

110
doc/SCHNELLSTART.md Normal file
View File

@@ -0,0 +1,110 @@
# Schnellstart-Anleitung
## Installation in 3 Schritten
### 1. Projekt entpacken
Entpacken Sie das Projekt-Archiv in einen beliebigen Ordner auf Ihrem Server.
### 2. Dependencies installieren
Öffnen Sie ein Terminal/Kommandozeile im Projekt-Ordner und führen Sie aus:
```bash
npm install
```
Dies installiert alle benötigten Pakete:
- express (Webserver)
- sqlite3 (Datenbank)
- bcryptjs (Passwort-Verschlüsselung)
- express-session (Session-Verwaltung)
- ejs (Template Engine)
- pdfkit (PDF-Generierung)
- body-parser (Request-Verarbeitung)
### 3. Server starten
```bash
npm start
```
Die Anwendung ist nun unter `http://localhost:3000` erreichbar.
## Erster Login
### Als Administrator
- URL: `http://localhost:3000`
- Benutzername: `admin`
- Passwort: `admin123`
Nach dem Login können Sie:
- Neue Mitarbeiter anlegen
- Rollen vergeben (Mitarbeiter, Verwaltung, Admin)
- Benutzer verwalten
### Als Verwaltung
- URL: `http://localhost:3000`
- Benutzername: `verwaltung`
- Passwort: `verwaltung123`
Nach dem Login können Sie:
- Eingereichte Stundenzettel einsehen
- PDFs erstellen und herunterladen
## Wichtige Hinweise
⚠️ **Passwörter ändern!**
Bitte ändern Sie die Standard-Passwörter nach der ersten Anmeldung!
⚠️ **Firewall-Einstellungen**
Stellen Sie sicher, dass Port 3000 in Ihrer Firewall geöffnet ist, falls Sie von anderen Computern darauf zugreifen möchten.
⚠️ **Produktiv-Einsatz**
Für den Produktiv-Einsatz empfehlen wir:
- HTTPS verwenden (z.B. mit nginx als Reverse Proxy)
- Starke Passwörter verwenden
- Regelmäßige Backups der Datenbank erstellen
## Port ändern
Falls Port 3000 bereits belegt ist, können Sie den Port ändern:
1. Öffnen Sie `server.js`
2. Ändern Sie die Zeile `const PORT = 3000;` auf den gewünschten Port
3. Speichern und Server neu starten
## Datenbank-Speicherort
Die SQLite-Datenbank wird automatisch als `stundenerfassung.db` im Projekt-Verzeichnis erstellt.
**Backup erstellen:**
Kopieren Sie einfach die Datei `stundenerfassung.db` an einen sicheren Ort.
## Problemlösung
### Server startet nicht
- Prüfen Sie, ob Port 3000 bereits belegt ist
- Prüfen Sie, ob Node.js installiert ist: `node --version`
- Prüfen Sie, ob alle Dependencies installiert sind: `npm install`
### Login funktioniert nicht
- Löschen Sie die Datei `stundenerfassung.db` und starten Sie den Server neu
- Die Datenbank wird dann mit den Standard-Benutzern neu erstellt
### PDF-Download funktioniert nicht
- Prüfen Sie die Browser-Konsole auf Fehler
- Stellen Sie sicher, dass Popups für die Seite erlaubt sind
## Workflow
1. **Admin** legt neue Mitarbeiter an
2. **Mitarbeiter** melden sich an und erfassen ihre Stunden
3. Mitarbeiter sehen ihre Woche (Montag-Sonntag)
4. Einträge werden automatisch beim Ausfüllen gespeichert
5. Am Ende der Woche: "Woche abschicken" klicken
6. **Verwaltung** sieht eingereichte Stundenzettel im Postfach
7. Verwaltung kann PDFs erstellen und herunterladen
## Support
Bei Fragen oder Problemen:
- Prüfen Sie die ausführliche README.md
- Kontaktieren Sie Ihre IT-Abteilung

22
doc/Stundenregeln.txt Normal file
View File

@@ -0,0 +1,22 @@
- Standarterfassung: (Ende - Start ) - Pause
- Überstunden nehmen
- Wenn Überstunden eingetragen > (Wochenarbeitszeit / Arbeitstage) -> Muss noch Start und Ende und Pause eingetragen werden
- Wenn Überstunden = (Wochenarbeitszeit / Arbeitstage) -> Tag als ausgefüllt zu betrachten
- Wird nur für die anzeige benötigt
- Stunden werden (Ende - Start ) - Pause berechnet.
- Urlaub
- Wird als ausgefüllt betrachtet wenn ganzer Urlaubstag
- Wenn halber Urlaubstag muss (Ende - Start ) - Pause eingetragen werden.
- Stunden werden als (Wochenarbeitszeit / Arbeitstage) gerechnet wenn ganzer Tag
- Wenn halber tag Ulaub ((Wochenarbeitszeit / Arbeitstage) / 2) zur ((Ende - Start ) - Pause) addiert
- Wird von Verbleibendem Urlaub abgezogen
- Krank
- Wird als ausgefüllt betrachtet
- Stunden werden als (Wochenarbeitszeit / Arbeitstage) gerechnt
- Feiertage
- Wird als ausgefüllt betrachtet
- Stunden werden als (Wochenarbeitszeit / Arbeitstage) gerechnet

View File

@@ -0,0 +1,17 @@
- Mitarbeiter Name in den QR code Sheets -> DONE
- Pause vorbelegen (einstellbar in der Admin) -> DONE Wird anhand der Gesetztlichen vorgaben berechnet
- Offset für die Verwaltung für Urlaubstage -> DONE
- Stunden pro Tag und wie viele Tage arbeit -> DONE
- Reisen für Wochenende -> DONE
- LDAP Prüfung -> DONE GEHT?!
- DSGVO Sicherheit -> DONE
- Feiertage müssen als ausgefüllt zählen -> DONE
- Mitarbeiter sollen PDF ansehen können. -> DONE
- Wenn bereits heruntergeladen wurde und neue version da ist Meldung an Verwaltung. -> DONE Muss getestet werden
- Wenn ganzer Tag Urlaub gesetzt wird steht erst 8h (Urlaub) und dann nur noch 8h
- Feiertage im PDF anzeigen -> DONE
- Oben wenn woche eingereicht anzeigen als hilfestellung -> DONE
- Ausgefüllte Tage anhand der Tage pro woche gültig setzten -> DONE Testen
- Überstunden müssen anhand der Tagesstunden auch auf gültig setzten (Tag ausgefüllt wenn weniger als 8h) -> DONE sollte passen
- Verplante Urlaubstage müssen auf abgezogen werden, wenn die Woche die gepalnt war eingereicht wurde. -> DONE Testen