Add comprehensive project documentation (claude.md)

Provides detailed overview of the entire Dienstplan project including:
- All three implementations (Web-App, Python/Excel, Android)
- Calculation logic differences between versions
- Complete file structure documentation
- Development guidelines and testing scenarios
- Code architecture explanation
- Deployment options and security notes

This document serves as a comprehensive guide for understanding
and maintaining the project.
This commit is contained in:
Claude 2025-11-18 20:03:04 +00:00
parent 520e3b62e0
commit 8c436c4aa9
No known key found for this signature in database

329
claude.md Normal file
View file

@ -0,0 +1,329 @@
# Dienstplan Bonusrechner - Projekt Übersicht
## Projektbeschreibung
Dieses Projekt berechnet Bonuszahlungen für Mitarbeiter basierend auf Wochenend- und Feiertagsdiensten nach spezifischen NRW-Regeln. Es existieren drei verschiedene Implementierungen für unterschiedliche Anwendungsfälle.
## Verfügbare Implementierungen
### 1. Web-App (empfohlen)
**Verzeichnis**: `webapp/`
**Technologie**: Vanilla JavaScript, HTML5, CSS3
**Verwendung**: Browser-basiert, keine Installation erforderlich
Die Web-App ist die modernste und benutzerfreundlichste Version. Sie läuft komplett im Browser und speichert Daten lokal im LocalStorage.
### 2. Python/Excel Version
**Verzeichnis**: `src/`
**Technologie**: Python mit openpyxl
**Verwendung**: Generiert Excel-Dateien mit Formeln
Die ursprüngliche Implementierung, die Excel-Arbeitsmappen mit eingebetteten Formeln erstellt.
### 3. Android App
**Verzeichnis**: `android-app/`
**Technologie**: Kotlin, Android SDK
**Verwendung**: Native Android-Anwendung
Mobile Version für Android-Geräte.
## Berechnungsregeln - Unterschiede
### Web-App Logik (Benutzer-Anforderung)
Die Web-App implementiert eine vereinfachte Logik:
1. **Qualifizierende Tage (WE/Feiertag)**:
- Freitag, Samstag, Sonntag
- Feiertage in NRW
- Tag vor einem Feiertag
2. **Bonusberechnung**:
- Mindestens **2.0 qualifizierende Tage** erforderlich
- Bei Erreichen: **1.0 qualifizierender Tag** wird abgezogen
- **Alle übrigen Tage** werden bezahlt:
- Normale Tage (Mo-Do, kein Feiertag): 250€
- Qualifizierende Tage: 450€
- Unter Schwellenwert: **Keine Bonuszahlung**
### Python/Android Logik (Variante 2 "streng")
Die ältere Implementierung nutzt eine andere Logik:
1. **Tag-Kategorien**:
- **WT-Tag** (Werktag): Mo-Do (ohne Feiertag/Vortag)
- **WE-Tag** (Weekend): Fr-So + Feiertag + Vortag Feiertag
2. **Bonusberechnung**:
- **WT-Tage** werden **immer** mit 250€ vergütet
- **WE-Tage** nur vergütet wenn ≥ 2.0 WE-Einheiten:
- Bei Erreichen: 450€ pro WE-Tag
- Dann Abzug von 1.0 WE-Einheit (Freitag-Priorität)
- Unter Schwellenwert: WE-Dienste = 0€ (nicht als WT vergütet)
### Wichtiger Unterschied - Beispiel
**Szenario**: Mitarbeiter arbeitet 1 × Mo, 1 × Di, 1 × Sa
**Web-App**:
- Qualifizierende Tage: 1.0 (nur Samstag)
- Schwellenwert nicht erreicht → **0€ Bonus**
**Python/Android**:
- WT-Tage: 2.0 (Mo, Di) → 2 × 250€ = **500€**
- WE-Tage: 1.0 (Sa) → Schwelle nicht erreicht → 0€
- **Gesamt: 500€**
Die Web-App ist **strenger** für Mitarbeiter ohne ausreichend WE-Dienste.
## Dateistruktur
```
Dienstplan/
├── webapp/ # Web-Anwendung (Browser)
│ ├── index.html # Haupt-UI
│ ├── styles.css # Styling (Gradient-Design)
│ ├── app.js # UI-Logik, Event-Handling
│ ├── calculator.js # Bonusberechnungs-Engine
│ ├── holidays.js # NRW-Feiertage (2025-2030)
│ ├── storage.js # LocalStorage-Verwaltung
│ └── README.md # Web-App Dokumentation
├── src/ # Python/Excel Version
│ ├── build_template.py # Excel-Vorlage erstellen
│ ├── fill_plan_dates.py # Monatspläne generieren
│ └── read_excel.py # Excel-Dateien lesen
├── android-app/ # Android App
│ ├── app/src/main/java/com/dienstplan/nrw/
│ │ ├── MainActivity.kt # Haupt-Activity
│ │ ├── data/
│ │ │ ├── PayrollCalculator.kt # Bonusberechnung
│ │ │ ├── HolidayProvider.kt # Feiertagsdaten
│ │ │ └── DutyDataStore.kt # Datenverwaltung
│ │ └── model/ # Datenmodelle
│ └── README.md # Android-Dokumentation
├── templates/ # Excel-Vorlagen
├── output/ # Generierte Excel-Dateien
├── README.md # Projekt-Hauptdokumentation
├── SPECIFICATION.md # Detaillierte Regelspezifikation
├── claude.md # Diese Datei
└── requirements.txt # Python-Abhängigkeiten
```
## NRW Feiertage
Alle Implementierungen nutzen die gleichen NRW-Feiertage:
- Neujahr (1. Januar)
- Karfreitag (variabel)
- Ostermontag (variabel)
- Tag der Arbeit (1. Mai)
- Christi Himmelfahrt (variabel)
- Pfingstmontag (variabel)
- Fronleichnam (variabel)
- Tag der Deutschen Einheit (3. Oktober)
- Allerheiligen (1. November)
- 1. Weihnachtstag (25. Dezember)
- 2. Weihnachtstag (26. Dezember)
**Abdeckung**: 2025-2030 (Web-App), 2025-2026 (Python/Android)
## Entwicklungshinweise
### Web-App erweitern
**Neue Feiertage hinzufügen** (`webapp/holidays.js`):
```javascript
2031: [
{ date: '2031-01-01', name: 'Neujahr' },
// ... weitere Feiertage
]
```
**Berechnungsraten ändern** (`webapp/calculator.js`):
```javascript
this.RATE_NORMAL = 250; // Normale Tage
this.RATE_WEEKEND = 450; // WE/Feiertag Tage
this.MIN_QUALIFYING_DAYS = 2.0; // Schwellenwert
```
### Python Version erweitern
**Neue Monate generieren**:
```bash
python src/fill_plan_dates.py 2025 11 # November 2025
```
### Android App
**Build & Install**:
```bash
cd android-app
./gradlew assembleDebug
adb install app/build/outputs/apk/debug/app-debug.apk
```
## Testing-Szenarien
### Testfall 1: Schwellenwert genau erreicht
- 1 × Freitag (1.0)
- 1 × Samstag (1.0)
- Erwartung: 2.0 qualifizierende Tage → 1.0 abgezogen → 1.0 × 450€ = **450€**
### Testfall 2: Schwellenwert nicht erreicht
- 1 × Samstag (1.0)
- 1 × Sonntag (0.5 - halber Dienst)
- Erwartung: 1.5 qualifizierende Tage → **0€** (Schwelle nicht erreicht)
### Testfall 3: Mit normalen Tagen
- 2 × Montag (2.0)
- 2 × Samstag (2.0)
- Erwartung:
- 2.0 qualifizierende → -1.0 Abzug → 1.0 bezahlt
- Bonus: (2 × 250€) + (1 × 450€) = **950€**
### Testfall 4: Feiertag + Vortag
- 1 × Donnerstag vor Karfreitag (qualifizierend!)
- 1 × Karfreitag (Feiertag, qualifizierend!)
- Erwartung: 2.0 qualifizierende → -1.0 → 1.0 × 450€ = **450€**
## Häufige Anpassungen
### Schwellenwert ändern (Web-App)
`webapp/calculator.js`, Zeile 10:
```javascript
this.MIN_QUALIFYING_DAYS = 3.0; // Statt 2.0
```
### Vergütungsraten ändern (Web-App)
`webapp/calculator.js`, Zeilen 8-9:
```javascript
this.RATE_NORMAL = 300; // Statt 250
this.RATE_WEEKEND = 500; // Statt 450
```
### Abzug ändern (Web-App)
Aktuell ist der Abzug fest auf 1.0 kodiert in `webapp/calculator.js`, Zeile 66:
```javascript
qualifyingDaysDeducted = 1.0;
```
Um dies flexibel zu machen, könnte man hinzufügen:
```javascript
this.DEDUCTION_AMOUNT = 1.0; // Im Constructor
// Dann verwenden:
qualifyingDaysDeducted = this.DEDUCTION_AMOUNT;
```
## Code-Architektur
### Web-App (MVC-ähnlich)
**Model** (`storage.js`):
- Datenverwaltung
- LocalStorage-Persistenz
- CRUD-Operationen für Mitarbeiter & Dienste
**Controller** (`app.js`):
- Event-Handling
- Koordination zwischen Model, View, Calculator
- UI-State-Management
**Business Logic** (`calculator.js`):
- Bonusberechnung
- Tag-Klassifizierung (qualifizierend/normal)
- Formatierung
**Data Provider** (`holidays.js`):
- Feiertagsdaten
- Datum-Utilities
**View** (`index.html` + `styles.css`):
- UI-Layout (Tabs)
- Styling
- Responsives Design
### Datenfluss (Web-App)
```
User Action (UI)
Event Handler (app.js)
Storage Operation (storage.js) ←→ LocalStorage
Data Retrieved
Calculator Processing (calculator.js) → Holiday Check (holidays.js)
Results
UI Update (app.js)
View Rendering (HTML)
```
## Browser-Kompatibilität (Web-App)
- **Chrome/Edge**: ✅ Vollständig unterstützt
- **Firefox**: ✅ Vollständig unterstützt
- **Safari**: ✅ Vollständig unterstützt
- **Opera**: ✅ Vollständig unterstützt
**Mindestanforderungen**:
- LocalStorage API
- ES6 JavaScript (Arrow Functions, Classes, Template Literals)
- CSS Grid & Flexbox
- Date API
## Deployment-Optionen (Web-App)
### Option 1: Lokale Datei
Einfach `index.html` im Browser öffnen - funktioniert sofort!
### Option 2: Statischer Webserver
```bash
# Python
python -m http.server 8000
# Node.js
npx http-server -p 8000
# PHP
php -S localhost:8000
```
### Option 3: Cloud-Hosting
Geeignet für Plattformen wie:
- **GitHub Pages**: Kostenlos, einfach via Git
- **Netlify**: Drag & Drop, kostenloser Plan
- **Vercel**: Automatisches Deployment
- **AWS S3**: Static Website Hosting
Da die App rein client-seitig läuft (keine Server-Logik), ist jeder Static-Hosting-Service geeignet.
## Sicherheitshinweise
### LocalStorage-Daten
- Daten sind **nicht verschlüsselt**
- Für produktive Nutzung mit sensiblen Daten ggf. Verschlüsselung hinzufügen
- Regelmäßige Backups via Export-Funktion empfohlen
### CORS (bei Web-Hosting)
- LocalStorage funktioniert nur auf gleicher Domain
- Beim Testen via `file://` können CORS-Einschränkungen auftreten
- Lösung: Lokaler Webserver (siehe Deployment-Optionen)
## Lizenz
MIT License - Siehe Hauptprojekt
## Versionshistorie
- **v3.0** (2025): Web-App hinzugefügt mit vereinfachter Berechnungslogik
- **v2.0** (2024): Android-App implementiert
- **v1.0**: Python/Excel Version (Variante 2 "streng")
## Kontakt & Support
Für Fragen zum Projekt siehe `README.md` der jeweiligen Implementierung.