Refactor README.md for improved structure and clarity; add collapsible sections for screenshots and features

This commit is contained in:
Felix Schlusche
2025-10-23 14:32:33 +02:00
parent b0dd773fba
commit bd8131f18e

369
README.md
View File

@@ -2,7 +2,8 @@
Eine Full-Stack-Zeiterfassungsanwendung, entwickelt mit Node.js, Express, SQLite und containerisiert mit Docker. Eine Full-Stack-Zeiterfassungsanwendung, entwickelt mit Node.js, Express, SQLite und containerisiert mit Docker.
## Screenshots <details>
<summary><b>📸 Screenshots</b></summary>
![Screenshot 1](media/screenshots/Screenshot1.png) ![Screenshot 1](media/screenshots/Screenshot1.png)
*Hauptansicht mit Timer und Monatsübersicht* *Hauptansicht mit Timer und Monatsübersicht*
@@ -13,254 +14,240 @@ Eine Full-Stack-Zeiterfassungsanwendung, entwickelt mit Node.js, Express, SQLite
![Screenshot 3](media/screenshots/Screenshot3.png) ![Screenshot 3](media/screenshots/Screenshot3.png)
*Eintragsbearbeitung und Bulk-Operationen* *Eintragsbearbeitung und Bulk-Operationen*
</details>
## Funktionen ## Funktionen
### Zeiterfassung ### ⏱️ Zeiterfassung
- **Start/Stop Timer**: Live-Timer mit automatischer Zeiterfassung für den aktuellen Tag - **Live-Timer mit automatischen Pausen**: Start/Stop-Timer erfasst die tägliche Arbeitszeit
- Pause nach 6 Stunden (30 Min) oder 9 Stunden (45 Min) gemäß deutschem Arbeitszeitgesetz - Automatische Pausen nach 6h (30 Min) oder 9h (45 Min) gemäß deutschem Arbeitszeitgesetz
- Automatische Rundung auf 15-Minuten-Intervalle - Rundung auf 15-Minuten-Intervalle
- Timer läuft auch nach Seiten-Reload weiter - Timer persistiert über Seiten-Reloads
- **Manuelle Eingabe**: Erfassung von Arbeitszeiten (Datum, Startzeit, Endzeit, Pause) - Manuelle Startzeit-Eingabe möglich
- **Inline-Bearbeitung**: Schnelle Änderung von Zeiten durch Klick in die Tabelle - Visueller Indikator (blinkendes Uhr-Icon) bei laufendem Timer
- **Standort-Tracking**: Home-Office oder Büro pro Eintrag - **Flexible Eingabemodi**:
- **Urlaub eintragen**: Urlaubstage werden nicht vom Saldo abgezogen - Manuelle Eingabe (Datum, Start, Ende, Pause)
- **Gleittage eintragen**: Gleittage ziehen 8 Stunden vom Saldo ab - Inline-Bearbeitung direkt in der Tabelle
- Schnelles Hinzufügen von Einträgen über Monatsansicht
- **Arbeitsort-Tracking**: Büro oder Home-Office pro Eintrag
- **Sondereinträge**:
- Urlaubstage (werden nicht vom Saldo abgezogen)
- Gleittage (ziehen 8h vom Saldo ab)
### Intelligente Berechnungen ### 📊 Intelligente Berechnungen
- **Automatische Pausenberechnung** nach deutschem Arbeitszeitgesetz: - **Automatische Pausenberechnung** (deutsches Arbeitszeitgesetz)
- \> 6 Stunden: 30 Minuten Pause - **10-Stunden-Cap** für maximale Nettoarbeitszeit pro Tag
- \> 9 Stunden: 45 Minuten Pause - **Live-Statistiken** mit laufendem Timer:
- **Maximum von 10 Stunden Nettoarbeitszeit** pro Tag - Soll-Stunden (basierend auf Arbeitstagen)
-**Monatliche Statistiken**: Soll-Stunden, Ist-Stunden, Saldo (Monat + Gesamt) - Ist-Stunden (inkl. aktuell laufender Timer)
- **Arbeitstage-Berechnung**: Automatische Erkennung von Wochenenden und Feiertagen - Monatssaldo + Gesamtsaldo mit Vormonatsübertrag
- Arbeitstage-Zählung
- **Urlaubsverwaltung**:
- Konfigurierbares Jahres-Kontingent
- Tracking: Genommen, Geplant, Verfügbar
- Automatische Jahresberechnung
### Bundesland-spezifische Feiertage ### 🗓️ Bundesland-spezifische Feiertage
- **16 Bundesländer**: Auswahl des Bundeslandes für korrekte Feiertagsberechnung - **16 Bundesländer** mit korrekten regionalen Feiertagen
- **Persistente Einstellung**: Bundesland-Auswahl wird gespeichert - **Persistente Einstellung** (gespeichert in Datenbank)
- **Kollisionserkennung**: Warnung bei Feiertagen, die mit bestehenden Einträgen kollidieren - **Kollisionserkennung**: Warnung bei Feiertagen mit bestehenden Einträgen
- **Alle regionalen Feiertage**: Heilige Drei Könige, Fronleichnam, Reformationstag, etc. - **Alle Feiertage**: Bundeseinheitlich + regional (z.B. Fronleichnam, Reformationstag)
### Monatsansicht & Navigation ### 📅 Monatsansicht & Navigation
- **Monatskalender**: Vollständige Ansicht aller Tage des Monats - **Vollständiger Monatskalender** mit allen Tagen
- **Farbcodierung**: - **Intuitive Farbcodierung**:
- Grün: Home-Office Tage - 🟢 Grün: Home-Office
- Gelb: Urlaub - 🟡 Gelb: Urlaub
- Cyan: Gleittage - 🔵 Cyan: Gleittage
- Rot: Fehlende Einträge an Arbeitstagen - 🔴 Rot: Fehlende Arbeitstage
- Grau: Wochenenden - Grau: Wochenenden
- Blau: Feiertage mit Namen - 🔵 Blau: Feiertage (mit Namen)
- **Vor/Zurück Navigation**: Einfaches Wechseln zwischen Monaten - **Navigation**: Vor/Zurück-Buttons zum Monatswechsel
- **Auto-Fill Funktion**: Automatisches Ausfüllen des gesamten Monats mit Standard-Arbeitszeiten - **Auto-Fill**: Automatisches Befüllen des Monats mit Standard-Arbeitszeiten (9:00-17:30)
- **Quick-Actions**: Plus-Buttons für schnelles Hinzufügen von Einträgen
### Bulk-Operationen ### Bulk-Operationen
- **Mehrfachauswahl**: Checkbox-Modus für schnelle Massenbearbeitung - **Mehrfachauswahl-Modus** mit Checkboxen
- **Bulk-Standort setzen**: Mehrere Einträge auf einmal auf Home/Büro setzen - **Bulk-Aktionen**:
-**Bulk-Löschen**: Mehrere Einträge auf einmal löschen - Standort setzen (Büro/Home)
- Urlaub eintragen
- Gleitzeit eintragen
- Löschen
- **Funktioniert in beiden Ansichten** (Monatsansicht + Filteransicht)
### Filter & Export ### 🔍 Filter & Export
- **Zeitraum-Filter**: Filterung nach Datum (Von/Bis) - **Zeitraum-Filter**: Von/Bis-Datum (bleibt bei Bulk-Aktionen erhalten)
- **CSV-Export (Alle)**: Export aller Einträge im gewählten Zeitraum - **Getrennte Ansichten**: Monatsnavigation wird bei Filter-Ansicht ausgeblendet
- **CSV-Export (Abweichungen)**: Export nur der Tage mit Abweichungen von 8,0 Stunden - **CSV-Export (Alle)**: Alle Einträge im gewählten Zeitraum
- Ideal für Arbeitszeitnachweise bei Gleitzeit - Spalten: Datum, Start, Ende, Pause (Min), Netto (h), Arbeitsort, Abweichung (h)
- Zeigt nur relevante Über-/Unterschreitungen - **CSV-Export (Abweichungen)**: Nur Tage ≠ 8,0h
- **Deutsches Format**: Komma als Dezimaltrennzeichen, DD.MM.YYYY Datumsformat - Ideal für Gleitzeit-Nachweise
- **Deutsches Format**: Semikolon-getrennt, Komma-Dezimal
### Benutzerfreundlichkeit ### 🎨 Modernes UI/UX
- **Responsive Design**: Optimiert für Desktop, Tablet und Smartphone - **Premium Design**: Glass-Morphism, Gradients, Schatten, Animationen
- **Dark Mode**: Modernes dunkles Design für augenschonende Arbeit - **Responsive**: Desktop, Tablet, Mobile
- **Toast-Benachrichtigungen**: Visuelles Feedback bei Aktionen - **Dark Mode**: Augenschonendes dunkles Design
- **Flatpickr**: Moderne Datums- und Zeitauswahl mit Touch-Support - **Toast-Benachrichtigungen**: Visuelles Feedback
- **Persistente Daten**: SQLite-Datenbank mit automatischer Migration - **Icons**: Lucide Icons für klare Symbolik
- **Flatpickr**: Touch-optimierte Datums-/Zeit-Picker
## Technologie-Stack ## 🏗️ Technologie-Stack
- **Backend**: Node.js, Express.js (modular aufgebaut) **Backend:**
- **Config**: Datenbank-Setup & Migrationen - Node.js 18+ mit Express.js
- **Utils**: Zeitberechnungen nach deutschem Arbeitszeitgesetz - SQLite (better-sqlite3) für dateibasierte Persistenz
- **Routes**: Separate Module für API-Endpunkte - Modulare Architektur (config, utils, routes)
- **Datenbank**: SQLite (better-sqlite3)
- **Frontend**: Vanilla JavaScript, HTML, Tailwind CSS
- **Containerisierung**: Docker, Docker Compose
## Projektstruktur **Frontend:**
- Vanilla JavaScript (ES6+)
- Tailwind CSS (CDN)
- Lucide Icons
- Flatpickr (Datums-/Zeit-Picker)
**Infrastructure:**
- Docker & Docker Compose
- Multi-Stage Build für optimierte Images
## 📁 Projektstruktur
``` ```
/timetracker timetracker/
├── src/ # Backend-Code (refactored) ├── server.js # Express Entry Point
│ ├── config/ ├── db/
│ └── database.js # Datenbank-Initialisierung & Migrationen ├── schema.sql # Datenbankschema
── utils/ ── timetracker.db # SQLite Datenbank (generiert)
│ │ └── timeCalculator.js # Zeitberechnungen (Pausen, Caps) ├── public/
── routes/ ── index.html # Single-Page Application
├── entries.js # CRUD API-Endpunkte └── app.js # Frontend-Logik (~2700 Zeilen)
│ └── export.js # CSV-Export ├── media/screenshots/ # App-Screenshots
├── public/ # Frontend ├── Dockerfile # Container-Image
│ ├── index.html # Hauptbenutzeroberfläche ├── docker-compose.yml # Orchestrierung
│ ├── app.js # Frontend-Logik └── package.json
│ └── js/ # Frontend-Module (optional)
│ ├── state.js # State Management
│ ├── utils/ # Utilities
│ ├── api/ # API-Client
│ └── ui/ # UI-Komponenten
├── db/
│ └── schema.sql # Datenbankschema
├── server.js # Express-Server (22 Zeilen - Entry Point)
├── Dockerfile # Multi-Stage Docker Build
├── docker-compose.yml # Docker Compose Konfiguration
├── package.json
└── README.md
``` ```
## Deutsche Pausenregelung ## ⚙️ Deutsche Arbeitszeitregelungen
Die Anwendung berechnet automatisch die Pausenzeiten gemäß deutschem Arbeitszeitgesetz: Die App implementiert deutsches Arbeitszeitgesetz (ArbZG):
- **> 6 Stunden Arbeitszeit**: 30 Minuten Pause werden abgezogen
- **> 9 Stunden Arbeitszeit**: 45 Minuten Pause werden abgezogen
- **Nettostunden sind auf maximal 10,0 Stunden begrenzt**
## API-Endpunkte - **> 6h Arbeit** → 30 Min Pause (automatisch)
- **> 9h Arbeit** → 45 Min Pause (automatisch)
- **Maximale Nettoarbeitszeit**: 10,0h pro Tag
- **Rundung**: Alle Zeiten auf 15-Minuten-Intervalle
### Zeiteinträge ## 🚀 Installation & Ausführung
- `GET /api/entries?from=YYYY-MM-DD&to=YYYY-MM-DD` - Alle Einträge im Zeitraum abrufen
- `POST /api/entries` - Neuen Eintrag erstellen
- `PUT /api/entries/:id` - Bestehenden Eintrag aktualisieren
- `DELETE /api/entries/:id` - Eintrag löschen
### Export ### 🐳 Option 1: Docker Compose (Empfohlen)
- `GET /api/export?from=YYYY-MM-DD&to=YYYY-MM-DD` - Alle Einträge als CSV exportieren
- `GET /api/export-deviations?from=YYYY-MM-DD&to=YYYY-MM-DD` - Nur Abweichungen als CSV exportieren
### Einstellungen **Voraussetzungen:** Docker & Docker Compose
- `GET /api/settings/:key` - Einstellung abrufen
- `POST /api/settings` - Einstellung speichern (key, value)
- `GET /api/settings` - Alle Einstellungen abrufen
## Installation & Ausführung
### Repository klonen
```bash ```bash
# Repository klonen
git clone https://gitea.fx-se.de/maggot/timetracker.git git clone https://gitea.fx-se.de/maggot/timetracker.git
cd timetracker cd timetracker
```
### Option 1: Mit Docker Compose (Empfohlen) # Starten
**Voraussetzungen:**
- Docker und Docker Compose installiert
**Starten:**
```bash
docker-compose up -d docker-compose up -d
```
**Logs ansehen:** # Logs
```bash
docker-compose logs -f docker-compose logs -f
```
**Stoppen:** # Stoppen
```bash
docker-compose down docker-compose down
```
**Stoppen und Daten löschen:** # Stoppen + Daten löschen
```bash
docker-compose down -v docker-compose down -v
``` ```
Die Anwendung läuft auf: **App läuft auf:** `http://localhost:3000`
```
http://localhost:3000
```
### Option 2: Mit Docker (manuell) ### 🐋 Option 2: Docker (manuell)
**Docker-Image erstellen:**
```bash ```bash
# Image bauen
docker build -t zeiterfassung . docker build -t zeiterfassung .
```
**Container starten:** # Container starten (mit Daten-Persistenz)
```bash
docker run -p 3000:3000 -v $(pwd)/db:/app/db zeiterfassung docker run -p 3000:3000 -v $(pwd)/db:/app/db zeiterfassung
``` ```
Das `-v` Flag bindet das Datenbankverzeichnis ein, um Daten zwischen Container-Neustarts zu erhalten. ### 💻 Option 3: Lokal (ohne Docker)
### Option 3: Lokale Ausführung (ohne Docker) **Voraussetzungen:** Node.js 18+
**Voraussetzungen:**
- Node.js 18+ installiert
**Installation:**
1. Abhängigkeiten installieren:
```bash ```bash
npm install npm install
```
2. Server starten:
```bash
npm start npm start
``` ```
3. Browser öffnen und navigieren zu: **App läuft auf:** `http://localhost:3000`
## 📤 CSV-Export
Die App bietet zwei Export-Modi über die Filter-Ansicht:
### Export Alle (📥)
Exportiert **alle** Einträge im gewählten Zeitraum.
**Spalten:**
``` ```
http://localhost:3000 Datum;Start;Ende;Pause (min);Netto (h);Arbeitsort;Abweichung (h)
``` ```
## CSV-Export-Format **Beispiel:**
Die Anwendung bietet zwei Export-Optionen:
### 1. Vollständiger Export (📥 Button)
Exportiert alle Einträge im gewählten Zeitraum (oder alle, wenn kein Filter gesetzt).
### 2. Export nur Abweichungen (⚠️ Button)
Exportiert **nur** Tage, die von der Standard-Arbeitszeit (8,0 Stunden) abweichen.
- **Zweck**: Ideal für Arbeitszeitnachweise bei Gleitzeit-Modellen
- **Inhalt**: Nur Über- und Unterschreitungen der 8-Stunden-Marke
- **Vorteil**: Übersichtlicher Nachweis für HR/Verwaltung ohne irrelevante Standard-Tage
### CSV-Spalten:
- **Datum**: TT.MM.JJJJ (z.B. 23.10.2025)
- **Typ**: Arbeit / Urlaub / Gleitzeit
- **Startzeit**: HH:MM (z.B. 08:00, bei Urlaub/Gleitzeit: -)
- **Endzeit**: HH:MM (z.B. 17:00, bei Urlaub/Gleitzeit: -)
- **Pause in Minuten**: Ganzzahl (z.B. 30)
- **Gesamtstunden**: Nettostunden mit Komma als Dezimaltrennzeichen (z.B. 8,50)
**Beispiel Abweichungs-Export:**
```csv ```csv
Datum,Startzeit,Endzeit,Pause in Minuten,Gesamtstunden 2025-10-21;08:00;17:00;30;8,50;Büro;+0,50
21.10.2025,08:00,18:30,45,9,75 2025-10-22;09:00;18:00;45;8,25;Home;+0,25
22.10.2025,09:00,15:30,30,6,00 2025-10-23;08:30;16:30;30;7,50;Büro;-0,50
``` ```
(Tage mit exakt 8,0h werden nicht exportiert)
## Entwicklung ### Export Abweichungen (⚠️)
Exportiert **nur** Tage mit ≠ 8,0 Stunden.
Die Anwendung verwendet: **Zweck:** Gleitzeit-Nachweise für HR (nur relevante Über-/Unterschreitungen)
- **Flatpickr** für die Datums- und Zeitauswahl mit mobilfreundlichen Oberflächen
- **Tailwind CSS** für das Styling (geladen über CDN)
- **SQLite** für leichtgewichtige, dateibasierte Datenpersistenz
- **Modulare Backend-Architektur** für bessere Wartbarkeit und Testbarkeit
- Alle Berechnungen werden serverseitig durchgeführt, um die Datenintegrität zu gewährleisten
### Code-Struktur **Beispiel:**
```csv
2025-10-21;08:00;18:30;45;9,75;Büro;+1,75
2025-10-23;09:00;15:30;30;6,00;Home;-2,00
```
*(Tage mit exakt 8,0h fehlen)*
**Backend:** **Format:** Semikolon-getrennt, Komma-Dezimal, YYYY-MM-DD Datum
- `server.js` - Express-Setup und Routing (22 Zeilen)
- `src/config/database.js` - Datenbank-Initialisierung
- `src/utils/timeCalculator.js` - Geschäftslogik für Zeitberechnungen
- `src/routes/entries.js` - CRUD-Endpunkte
- `src/routes/export.js` - CSV-Export
**Frontend:** ## 📡 API-Endpunkte
- `public/app.js` - Haupt-Frontend-Logik
- `public/js/` - Optionale Module (state, utils, api, ui)
## Lizenz ### Einträge
- `GET /api/entries?from=YYYY-MM-DD&to=YYYY-MM-DD` - Einträge abrufen
- `POST /api/entries` - Eintrag erstellen
- `PUT /api/entries/:id` - Eintrag aktualisieren
- `DELETE /api/entries/:id` - Eintrag löschen
MIT ### Einstellungen
- `GET /api/settings/:key` - Setting abrufen
- `POST /api/settings` - Setting speichern `{key, value}`
- `GET /api/settings` - Alle Settings
## 🛠️ Entwicklung
**Architektur:** Single-Page Application (SPA) mit REST-API Backend
**Tech-Details:**
- Flatpickr für Touch-optimierte Picker
- Lucide Icons für Symbolik
- SQLite für dateibasierte Persistenz
- Server-seitige Berechnungen für Datenintegrität
- Responsive Design (Tailwind CSS via CDN)
**Datenpersistenz:**
- SQLite-Datenbank: `db/timetracker.db`
- Automatische Migrations beim Start
- Volume-Mounting in Docker für Persistenz
## 📄 Lizenz
MIT License - siehe LICENSE Datei
---
**Entwickelt mit ❤️ für deutsches Arbeitszeitrecht**