{"id":45964361,"url":"https://github.com/phash/praxiszeit","last_synced_at":"2026-02-28T14:02:32.315Z","repository":{"id":337286270,"uuid":"1152831038","full_name":"phash/praxiszeit","owner":"phash","description":null,"archived":false,"fork":false,"pushed_at":"2026-02-28T01:17:33.000Z","size":14395,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-02-28T04:58:38.827Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/phash.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-08T14:02:16.000Z","updated_at":"2026-02-28T01:17:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/phash/praxiszeit","commit_stats":null,"previous_names":["phash/praxiszeit"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/phash/praxiszeit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phash%2Fpraxiszeit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phash%2Fpraxiszeit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phash%2Fpraxiszeit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phash%2Fpraxiszeit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phash","download_url":"https://codeload.github.com/phash/praxiszeit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phash%2Fpraxiszeit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29936367,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-28T13:49:17.081Z","status":"ssl_error","status_checked_at":"2026-02-28T13:48:50.396Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-02-28T14:01:57.152Z","updated_at":"2026-02-28T14:02:32.273Z","avatar_url":"https://github.com/phash.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PraxisZeit - Zeiterfassungssystem\n\nWebbasiertes Zeiterfassungssystem für eine Arztpraxis in Bayern.\nInstallierbar als **Progressive Web App (PWA)** auf Smartphone und Desktop.\n\n## Features\n\n### Für Mitarbeiter\n- ✅ **Stempeluhr** - Ein-/Ausstempeln direkt auf dem Dashboard\n- ✅ **Zeiterfassung** (von–bis mit Pausen)\n- ✅ **Dashboard** mit Soll/Ist-Vergleich und Überstundenkonto\n- ✅ **Urlaubsverwaltung** (stundenbasiert mit Restanzeige)\n- ✅ **Abwesenheiten** (Urlaub, Krankheit, Fortbildung, Sonstiges)\n- ✅ **Zeitraum-Erfassung** (mehrere Tage auf einmal)\n- ✅ **Profilseite** (Passwort ändern, persönliche Daten)\n- ✅ **Änderungsanträge** für vergangene Tage\n\n### Für Admins\n- ✅ **Benutzerverwaltung** mit Rollenverwaltung\n- ✅ **Arbeitszeiten-Historie** (Stundenänderungen nachverfolgen)\n- ✅ **Individuelle Tagesplanung** (Stunden je Wochentag konfigurierbar)\n- ✅ **Urlaubsübersicht** (Budget, Verbrauch, Resturlaub pro MA)\n- ✅ **Kalenderfarben** für Abwesenheitskalender\n- ✅ **Admin-Dashboard** mit Team-Übersicht\n- ✅ **Berichte \u0026 Export**:\n  - Monatsreport (detailliert mit täglichen Einträgen)\n  - Jahresreport Classic (kompakte 12-Monats-Übersicht)\n  - Jahresreport Detailliert (365 Tage pro MA)\n- ✅ **Abwesenheitskalender** für das ganze Team\n- ✅ **Änderungsanträge** genehmigen/ablehnen\n- ✅ **Fehler-Monitoring** (Backend-Fehler mit Status und GitHub-Integration)\n- ✅ **Änderungsprotokoll** (Audit-Log aller Systemaktionen)\n- ✅ **ArbZG-Compliance-Reports**: Ruhezeitverstöße (§5), Sonntagsarbeit (§11), Nachtarbeit (§6), Ersatzruhetag-Tracking (§11)\n\n### ArbZG-Compliance (§3–§18)\n- ⚖️ **§3**: 8h-Warnung + 10h-Hard-Stop an allen Eingabepfaden (inkl. Admin-Direkteintrag, Änderungsanträge)\n- ⚖️ **§4**: Pflichtpause-Prüfung (\u003e6h→30min, \u003e9h→45min) an allen Eingabepfaden\n- ⚖️ **§5**: 11h-Mindestruhezeit-Prüfung mit Admin-Report\n- ⚖️ **§6**: Nachtarbeit-Erkennung (23–6 Uhr), Badge im Frontend, Admin-Report mit Nachtarbeitnehmer-Schwellwert (≥48 Tage/Jahr)\n- ⚖️ **§9/10**: Sonn-/Feiertagserkennung, Warnungen, optionales Ausnahmegrund-Feld (`sunday_exception_reason`)\n- ⚖️ **§11**: 15-freie-Sonntage-Report + Ersatzruhetag-Tracking (2/8 Wochen)\n- ⚖️ **§14**: 48h-Wochenarbeitszeit-Warnung\n- ⚖️ **§16**: Excel-Export, 2-Jahres-Retention-Dokumentation, Link zum Gesetzestext\n- ⚖️ **§18**: `exempt_from_arbzg`-Flag für leitende Angestellte (Chefärzte, Praxisinhaber)\n\n### Weitere Features\n- 📱 **PWA** - Installierbar als App auf Smartphone und Desktop\n- 🗓️ **Bayerischer Feiertagskalender** (automatisch berücksichtigt)\n- 📅 **Wochenenden** automatisch ausschließen bei Zeiträumen\n- 📊 **Historische Stundenänderungen** werden korrekt berechnet\n- 🎨 **Responsive Design** – Hamburger-Menü, Card-Layouts auf Mobile für alle Tabellen\n- ♿ **Barrierefreiheit (A11y)** – ARIA-Rollen, FocusTrap, Keyboard-Navigation, screenreader-optimiert\n- 🔔 **Toast-Notifications** – Styled Benachrichtigungen statt browser-native alert/confirm\n- ❤️ **Health Check** (`/api/health`) mit DB-Connectivity-Test\n\n## Technologie-Stack\n\n- **Backend:** Python 3.12 + FastAPI + SQLAlchemy + PostgreSQL\n- **Frontend:** React + TypeScript + Vite + Tailwind CSS\n- **PWA:** vite-plugin-pwa + Workbox (Service Worker)\n- **Deployment:** Docker Compose\n\n## Installation\n\n### Voraussetzungen\n\n- Docker \u0026 Docker Compose\n- (optional) Node.js 20+ für lokale Frontend-Entwicklung\n- (optional) Python 3.12+ für lokale Backend-Entwicklung\n\n### Setup\n\n1. **Repository klonen:**\n```bash\ngit clone https://github.com/phash/praxiszeit.git\ncd praxiszeit\n```\n\n2. **Environment-Variablen konfigurieren:**\n```bash\ncp .env.example .env\n```\n\nBearbeite `.env` und setze:\n- `POSTGRES_PASSWORD` - Datenbank-Passwort\n- `SECRET_KEY` - JWT Secret (generiere mit `openssl rand -hex 32`)\n- `ADMIN_EMAIL` - Admin E-Mail (z.B. admin@praxis.de)\n- `ADMIN_PASSWORD` - Admin Passwort\n\n3. **Docker Container starten:**\n```bash\ndocker-compose up -d\n```\n\nDie Datenbank wird automatisch initialisiert und Migrationen ausgeführt.\n\n4. **Anwendung öffnen:**\n```\nFrontend: http://localhost\nBackend API: http://localhost:8000\nAPI Docs: http://localhost:8000/docs\n```\n\n### PWA-Installation\n\nPraxisZeit kann als App auf dem Smartphone oder Desktop installiert werden:\n\n- **Chrome/Edge (Desktop):** Adressleiste → \"App installieren\"\n- **Chrome (Android):** Menü → \"App installieren\" oder \"Zum Startbildschirm\"\n- **Safari (iOS):** Teilen → \"Zum Home-Bildschirm\"\n- **Im WLAN:** `http://\u003cSERVER-IP\u003e` im Browser öffnen\n\n### Initiales Admin-Login\n\nDie Zugangsdaten für den Admin-Account sind in der `.env`-Datei definiert:\n- **Email:** Siehe `ADMIN_EMAIL`\n- **Password:** Siehe `ADMIN_PASSWORD`\n\n### Test-Daten generieren (optional)\n\nUm das System mit realistischen Test-Daten für 2026 zu befüllen:\n\n```bash\ndocker-compose exec backend python create_test_data.py\n```\n\nDies erstellt:\n- 4 Mitarbeiterinnen (2 Vollzeit, 2 Teilzeit)\n- Vollständige Zeiteinträge für 2026\n- Realistische Abwesenheiten (Urlaub, Krankheit, Fortbildung)\n- Arbeitszeiten-Änderung (Sophie Schmidt: 30h → 20h ab März)\n\n## Stempeluhr\n\nDie Stempeluhr erscheint oben auf dem Dashboard und ermöglicht schnelles Ein-/Ausstempeln:\n\n- **Einstempeln:** Grüner Button → erstellt Zeiteintrag mit Startzeit = jetzt\n- **Ausstempeln:** Roter Button → fragt Pausenminuten ab, setzt Endzeit = jetzt\n- **Live-Anzeige:** Zeigt laufende Arbeitszeit seit Einstempeln\n- **Vergessenes Ausstempeln:** Wird beim nächsten Einstempeln automatisch um 23:59 geschlossen\n- **Mehrere Einträge/Tag:** Nach Ausstempeln kann erneut eingestempelt werden\n\n## Datenbank\n\n### Struktur\n\n- **users** - Benutzer mit Rollen, Wochenstunden, Urlaubsanspruch, Kalenderfarbe, Tagesplanung\n- **working_hours_changes** - Historie von Stundenänderungen\n- **time_entries** - Zeiteinträge (Start, Ende nullable für Stempeluhr, Pausen, `sunday_exception_reason` §10 ArbZG)\n- **absences** - Abwesenheiten mit Typ und optional Zeitraum\n- **public_holidays** - Bayerische Feiertage\n- **change_requests** - Änderungsanträge für vergangene Einträge\n- **time_entry_audit_logs** - Audit-Logs für Zeiteinträge\n- **error_logs** - Backend-Fehler mit Deduplizierung, Status und GitHub-Verlinkung\n\n### Migrationen\n\nDie Datenbank wird beim Start automatisch migriert. Manuelle Migration:\n\n```bash\ndocker-compose exec backend alembic upgrade head\n```\n\nNeue Migration erstellen:\n\n```bash\ndocker-compose exec backend alembic revision --autogenerate -m \"description\"\n```\n\n**Aktuelle Migrationen:**\n- `001` - Initial Schema (User, TimeEntry, Absence, PublicHoliday)\n- `002` - Add track_hours field\n- `003` - Add end_date to absences (Zeiträume)\n- `004` - Add calendar_color to users\n- `005` - Add working_hours_changes table\n- `006` - Add work_days_per_week\n- `007` - Add change_requests\n- `008` - Add time_entry_audit_logs\n- `009` - Make end_time nullable (Stempeluhr)\n- `010` - Add username field, make email optional\n- `011` - Add clock_in_note to time_entries\n- `012` - Add absence_type_other_label\n- `013` - Add daily schedule columns to users (use_daily_schedule, hours_monday–friday)\n- `014` - Add error_logs table\n- `015` - Add token_version to users (JWT revocation)\n- `016` - Add sunday_exception_reason to time_entries + exempt_from_arbzg to users (§10/§18 ArbZG)\n\n## Entwicklung\n\n### Backend lokal ausführen\n\n```bash\ncd backend\npython -m venv venv\nsource venv/bin/activate  # Windows: venv\\Scripts\\activate\npip install -r requirements.txt\nalembic upgrade head\nuvicorn app.main:app --reload\n```\n\n### Frontend lokal ausführen\n\n```bash\ncd frontend\nnpm install\nnpm run dev\n```\n\n### Logs anzeigen\n\n```bash\ndocker-compose logs -f backend\ndocker-compose logs -f frontend\n```\n\n## API Dokumentation\n\nDie vollständige API-Dokumentation ist verfügbar unter:\n- **Swagger UI:** http://localhost:8000/docs\n- **ReDoc:** http://localhost:8000/redoc\n\n### Wichtige Endpoints\n\n**Authentifizierung:**\n- `POST /api/auth/login` - Login\n- `GET /api/auth/me` - Aktueller User\n- `PUT /api/auth/password` - Passwort ändern\n\n**Stempeluhr:**\n- `GET /api/time-entries/clock-status` - Aktueller Stempel-Status\n- `POST /api/time-entries/clock-in` - Einstempeln\n- `POST /api/time-entries/clock-out` - Ausstempeln (mit Pauseneingabe)\n\n**Zeiterfassung:**\n- `GET /api/time-entries` - Liste der Einträge\n- `POST /api/time-entries` - Neuer Eintrag\n- `PUT /api/time-entries/{id}` - Bearbeiten\n- `DELETE /api/time-entries/{id}` - Löschen\n\n**Abwesenheiten:**\n- `GET /api/absences` - Liste\n- `POST /api/absences` - Neue Abwesenheit (auch Zeiträume)\n- `DELETE /api/absences/{id}` - Löschen\n- `GET /api/absences/calendar` - Kalender-Ansicht\n\n**Admin:**\n- `GET /api/admin/users` - Alle Benutzer\n- `POST /api/admin/users` - User anlegen\n- `PUT /api/admin/users/{id}` - User bearbeiten\n- `GET /api/admin/users/{id}/working-hours-changes` - Stundenhistorie\n- `POST /api/admin/users/{id}/working-hours-changes` - Stundenänderung erfassen\n- `GET /api/admin/reports/monthly` - Monatsberichte\n- `GET /api/admin/reports/export?month=YYYY-MM` - Monatsexport Excel\n- `GET /api/admin/reports/export-yearly?year=YYYY` - Jahresexport detailliert\n- `GET /api/admin/reports/export-yearly-classic?year=YYYY` - Jahresexport classic\n- `GET /api/admin/reports/rest-time-violations?year=YYYY` - Ruhezeitverstöße §5 ArbZG\n- `GET /api/admin/reports/sunday-summary?year=YYYY` - Sonntagsarbeit §11 ArbZG\n- `GET /api/admin/reports/night-work-summary?year=YYYY` - Nachtarbeit §6 ArbZG\n- `GET /api/admin/reports/compensatory-rest?year=YYYY` - Ersatzruhetag-Tracking §11 ArbZG\n\n**Dashboard:**\n- `GET /api/dashboard` - Dashboard-Daten\n- `GET /api/dashboard/overtime` - Überstundenkonto mit Historie\n- `GET /api/dashboard/vacation` - Urlaubskonto\n\n## Deployment\n\n### Produktions-Deployment\n\n1. Server mit Docker \u0026 Docker Compose vorbereiten\n2. Repository klonen\n3. `.env` mit Produktions-Credentials erstellen\n4. SSL-Zertifikate unter `ssl/` ablegen (`cert.pem`, `key.pem`, `nginx-ssl.conf`)\n5. Container mit SSL starten:\n\n```bash\ndocker compose -f docker-compose.yml -f docker-compose.ssl.yml up -d --build\n```\n\n**Updates einspielen:**\n```bash\ngit pull\ndocker compose -f docker-compose.yml -f docker-compose.ssl.yml up -d --build\n```\n\nDatenbank-Migrationen werden automatisch beim Start ausgeführt.\n\n### Backup\n\n**Datenbank-Backup:**\n```bash\ndocker-compose exec db pg_dump -U praxiszeit praxiszeit \u003e backup.sql\n```\n\n**Datenbank-Restore:**\n```bash\ndocker-compose exec -T db psql -U praxiszeit praxiszeit \u003c backup.sql\n```\n\n## Support \u0026 Dokumentation\n\n- **CLAUDE.md** - Umfangreiche Projekt-Dokumentation für Entwickler\n- **PraxisZeit-Mitarbeiter-Handbuch.pdf** - Benutzerhandbuch für Mitarbeiter\n- **PraxisZeit-Admin-Handbuch.pdf** - Technisches Handbuch für Administratoren\n- **PraxisZeit-Cheat-Sheet.pdf** - Schnellreferenz für den Schreibtisch\n- **ARC42.md** - Architekturdokumentation (ARC42-Format)\n- **API Docs** - http://localhost:8000/docs\n- **GitHub Issues** - https://github.com/phash/praxiszeit/issues\n\n## Lizenz\n\nProprietär - Alle Rechte vorbehalten\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphash%2Fpraxiszeit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphash%2Fpraxiszeit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphash%2Fpraxiszeit/lists"}