Files
timetracker/README.md
Felix Schlusche b0dd773fba Add initial schema for entries and settings tables
- Created 'entries' table to track time entries with fields for date, start time, end time, pause minutes, location, and entry type.
- Created 'settings' table to store key-value pairs for application settings with an updated timestamp.
2025-10-23 14:27:25 +02:00

8.9 KiB

Zeiterfassung

Eine Full-Stack-Zeiterfassungsanwendung, entwickelt mit Node.js, Express, SQLite und containerisiert mit Docker.

Screenshots

Screenshot 1 Hauptansicht mit Timer und Monatsübersicht

Screenshot 2 Detaillierte Statistiken und Urlaubsverwaltung

Screenshot 3 Eintragsbearbeitung und Bulk-Operationen

Funktionen

Zeiterfassung

  • Start/Stop Timer: Live-Timer mit automatischer Zeiterfassung für den aktuellen Tag
    • Pause nach 6 Stunden (30 Min) oder 9 Stunden (45 Min) gemäß deutschem Arbeitszeitgesetz
    • Automatische Rundung auf 15-Minuten-Intervalle
    • Timer läuft auch nach Seiten-Reload weiter
  • Manuelle Eingabe: Erfassung von Arbeitszeiten (Datum, Startzeit, Endzeit, Pause)
  • Inline-Bearbeitung: Schnelle Änderung von Zeiten durch Klick in die Tabelle
  • Standort-Tracking: Home-Office oder Büro pro Eintrag
  • Urlaub eintragen: Urlaubstage werden nicht vom Saldo abgezogen
  • Gleittage eintragen: Gleittage ziehen 8 Stunden vom Saldo ab

Intelligente Berechnungen

  • Automatische Pausenberechnung nach deutschem Arbeitszeitgesetz:
    • > 6 Stunden: 30 Minuten Pause
    • > 9 Stunden: 45 Minuten Pause
  • Maximum von 10 Stunden Nettoarbeitszeit pro Tag
  • Monatliche Statistiken: Soll-Stunden, Ist-Stunden, Saldo (Monat + Gesamt)
  • Arbeitstage-Berechnung: Automatische Erkennung von Wochenenden und Feiertagen

Bundesland-spezifische Feiertage

  • 16 Bundesländer: Auswahl des Bundeslandes für korrekte Feiertagsberechnung
  • Persistente Einstellung: Bundesland-Auswahl wird gespeichert
  • Kollisionserkennung: Warnung bei Feiertagen, die mit bestehenden Einträgen kollidieren
  • Alle regionalen Feiertage: Heilige Drei Könige, Fronleichnam, Reformationstag, etc.

Monatsansicht & Navigation

  • Monatskalender: Vollständige Ansicht aller Tage des Monats
  • Farbcodierung:
    • Grün: Home-Office Tage
    • Gelb: Urlaub
    • Cyan: Gleittage
    • Rot: Fehlende Einträge an Arbeitstagen
    • Grau: Wochenenden
    • Blau: Feiertage mit Namen
  • Vor/Zurück Navigation: Einfaches Wechseln zwischen Monaten
  • Auto-Fill Funktion: Automatisches Ausfüllen des gesamten Monats mit Standard-Arbeitszeiten

Bulk-Operationen

  • Mehrfachauswahl: Checkbox-Modus für schnelle Massenbearbeitung
  • Bulk-Standort setzen: Mehrere Einträge auf einmal auf Home/Büro setzen
  • Bulk-Löschen: Mehrere Einträge auf einmal löschen

Filter & Export

  • Zeitraum-Filter: Filterung nach Datum (Von/Bis)
  • CSV-Export (Alle): Export aller Einträge im gewählten Zeitraum
  • CSV-Export (Abweichungen): Export nur der Tage mit Abweichungen von 8,0 Stunden
    • Ideal für Arbeitszeitnachweise bei Gleitzeit
    • Zeigt nur relevante Über-/Unterschreitungen
  • Deutsches Format: Komma als Dezimaltrennzeichen, DD.MM.YYYY Datumsformat

Benutzerfreundlichkeit

  • Responsive Design: Optimiert für Desktop, Tablet und Smartphone
  • Dark Mode: Modernes dunkles Design für augenschonende Arbeit
  • Toast-Benachrichtigungen: Visuelles Feedback bei Aktionen
  • Flatpickr: Moderne Datums- und Zeitauswahl mit Touch-Support
  • Persistente Daten: SQLite-Datenbank mit automatischer Migration

Technologie-Stack

  • Backend: Node.js, Express.js (modular aufgebaut)
    • Config: Datenbank-Setup & Migrationen
    • Utils: Zeitberechnungen nach deutschem Arbeitszeitgesetz
    • Routes: Separate Module für API-Endpunkte
  • Datenbank: SQLite (better-sqlite3)
  • Frontend: Vanilla JavaScript, HTML, Tailwind CSS
  • Containerisierung: Docker, Docker Compose

Projektstruktur

/timetracker
  ├── src/                 # Backend-Code (refactored)
  │   ├── config/
  │   │   └── database.js      # Datenbank-Initialisierung & Migrationen
  │   ├── utils/
  │   │   └── timeCalculator.js # Zeitberechnungen (Pausen, Caps)
  │   └── routes/
  │       ├── entries.js       # CRUD API-Endpunkte
  │       └── export.js        # CSV-Export
  ├── public/              # Frontend
  │   ├── index.html       # Hauptbenutzeroberfläche
  │   ├── app.js           # Frontend-Logik
  │   └── 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

Die Anwendung berechnet automatisch die Pausenzeiten gemäß deutschem Arbeitszeitgesetz:

  • > 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

Zeiteinträge

  • 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

  • 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

  • GET /api/settings/:key - Einstellung abrufen
  • POST /api/settings - Einstellung speichern (key, value)
  • GET /api/settings - Alle Einstellungen abrufen

Installation & Ausführung

Repository klonen

git clone https://gitea.fx-se.de/maggot/timetracker.git
cd timetracker

Option 1: Mit Docker Compose (Empfohlen)

Voraussetzungen:

  • Docker und Docker Compose installiert

Starten:

docker-compose up -d

Logs ansehen:

docker-compose logs -f

Stoppen:

docker-compose down

Stoppen und Daten löschen:

docker-compose down -v

Die Anwendung läuft auf:

http://localhost:3000

Option 2: Mit Docker (manuell)

Docker-Image erstellen:

docker build -t zeiterfassung .

Container starten:

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: Lokale Ausführung (ohne Docker)

Voraussetzungen:

  • Node.js 18+ installiert

Installation:

  1. Abhängigkeiten installieren:
npm install
  1. Server starten:
npm start
  1. Browser öffnen und navigieren zu:
http://localhost:3000

CSV-Export-Format

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:

Datum,Startzeit,Endzeit,Pause in Minuten,Gesamtstunden
21.10.2025,08:00,18:30,45,9,75
22.10.2025,09:00,15:30,30,6,00

(Tage mit exakt 8,0h werden nicht exportiert)

Entwicklung

Die Anwendung verwendet:

  • 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

Backend:

  • 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:

  • public/app.js - Haupt-Frontend-Logik
  • public/js/ - Optionale Module (state, utils, api, ui)

Lizenz

MIT