13 Commits
Author SHA1 Message Date
patrickandClaude Sonnet 5 ffd972392c feat: QR-Code für Kiosk-Login anzeigen
Neuer KioskQrScreen (erreichbar über QR-Icon im HomeScreen-AppBar) fordert
über POST /kiosk/my-qr-token einen 5min gültigen, einmalig einlösbaren
Login-Token an und zeigt ihn als QR-Code (qr_flutter). Mitarbeiter scannt
ihn am Kiosk-Tablet statt PIN einzutippen. Live-Countdown, Neu-Erzeugen bei
Ablauf. v0.1.11+12.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-10 14:53:56 +02:00
patrickandClaude Sonnet 5 d6664c582c feat: Info-Menüpunkt für Version + manuellen Update-Check
Analog zur Kiosk-App: Info-Button im HomeScreen-AppBar öffnet Dialog mit
installierter Version + "Jetzt prüfen"-Button für manuellen Update-Check.
v0.1.10+11.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-10 14:05:19 +02:00
patrickandClaude Sonnet 5 e9c455bd6e feat: Autofill für Passwortmanager (Bitwarden, Google etc.)
Login-Felder in AutofillGroup mit autofillHints (username/email, password).
TextInput.finishAutofillContext() nach erfolgreichem Login/TOTP löst den
System-"Passwort speichern?"-Prompt aus. Ergänzt die bestehende App-eigene
Zugangsdaten-Speicherung (CredentialsService) – beides kann parallel
genutzt werden. v0.1.9+10.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-10 01:26:53 +02:00
patrickandClaude Sonnet 5 200709d416 feat: Übersicht-Tab (Zeitkonto, Urlaubskonto, Zeiten-Historie)
Bottom-Navigation (MainShell) mit zwei Tabs: Stempeln (bisheriger
HomeScreen) + neue Übersicht (read-only): Zeitkonto (gearbeitet/Soll/Saldo
via GET /time/balance/me), Urlaubskonto (Anspruch/genommen/verfügbar via
GET /absences/balance) und die letzten Zeiteinträge (GET /time/entries).
Kein Beantragen von Urlaub, keine Korrektur – nur Anzeige. intl-Locale-Init
bewusst vermieden (Crash-Risiko wie beim letzten Mal), Datum manuell
formatiert. v0.1.8+9.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-10 00:21:52 +02:00
patrickandClaude Sonnet 5 046f7f4359 feat: In-App-Update (Download + Installer direkt öffnen)
"Jetzt aktualisieren"-Button im Update-Banner lädt die neue APK vom Server
herunter (mit Fortschrittsbalken) und öffnet danach direkt den Android-
Paketinstaller (open_filex + FileProvider). Kein Silent-Install (App ist
nicht Geräteeigentümer/MDM) – User bestätigt die Installation weiterhin im
System-Dialog, muss nur nicht mehr manuell ins Portal wechseln.
REQUEST_INSTALL_PACKAGES-Permission + FileProvider-Konfiguration ergänzt.
v0.1.7+8.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-10 00:14:53 +02:00
patrickandClaude Sonnet 5 3ed374dd68 fix: Mikrosekunden + falsche Zeitzone in "Eingestempelt seit"-Anzeige
Statustext zeigte den rohen Server-String (UTC, teils noch mit
Mikrosekunden bei Alt-Einträgen von vor dem Backend-Fix) direkt an.
Jetzt: HH:MM, korrekt von UTC nach lokaler Gerätezeit umgerechnet
(Backend sendet UTC, siehe time_service.py). v0.1.6+7.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-10 00:09:54 +02:00
patrickandClaude Sonnet 5 46cdcececd feat: Update-Hinweis beim App-Start
Ruft /static/downloads/version.txt vom konfigurierten Server ab und
vergleicht gegen kAppVersion. Bei Abweichung Hinweis-Banner auf HomeScreen
("Neue Version X verfügbar, installiert: Y"). Rein informativ, kein
Auto-Update (APK-Sideloading, kein Play-Store-Mechanismus verfügbar).
Fehler beim Check (offline, Server down) werden stillschweigend ignoriert.
v0.1.5+6.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-10 00:05:34 +02:00
patrickandClaude Sonnet 5 bcf179e06f fix: FormatException bei Zeitanzeige (Mikrosekunden + UTC-Fehler)
Backend liefert start_time/break_start als "HH:MM:SS" oder "HH:MM:SS.ffffff"
(datetime.now(timezone.utc).time() strippt Mikrosekunden nicht) – der
Live-Timer parste den Sekunden-Anteil naiv mit int.parse, was bei
vorhandenen Mikrosekunden mit "FormatException: Invalid radix-10 number"
crashte. Zusätzlich war die Zeit fälschlich als lokale Zeit behandelt
worden statt als UTC (Server sendet UTC) – Dauer wäre um die
Zeitzonendifferenz verfälscht gewesen. Beides gefixt: Sekunden-Anteil vor
dem Punkt abschneiden, Vergleich komplett in UTC. v0.1.4+5.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-09 23:57:59 +02:00
patrickandClaude Sonnet 5 e57b796db5 feat: Zugangsdaten merken, Passwort nur biometrie-geschützt
E-Mail wird nach erfolgreichem Login immer lokal gespeichert (Vorausfüllen).
Passwort wird nur gespeichert, wenn das Gerät Biometrie/PIN unterstützt –
Zugriff darauf ist an den Biometrie-Prompt gekoppelt ("Mit Biometrie
anmelden"-Button), nicht nur an Secure-Storage-Verschlüsselung allein.
Geräte ohne Biometrie sehen nur das vorausgefüllte E-Mail-Feld. v0.1.3+4.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-09 23:45:43 +02:00
patrickandClaude Sonnet 5 9495115a4d feat: Biometrie-Sperre (Fingerabdruck/Face-Unlock/PIN)
Ersetzt NICHT den Erstlogin (Backend kennt keine Biometrie) – schaltet nur
den lokal gespeicherten Access-Token beim App-Start bzw. beim Zurückkehren
aus dem Hintergrund frei. Geräte ohne Biometrie/PIN bleiben unverändert
(kein Lock-Screen). MainActivity auf FlutterFragmentActivity umgestellt
(Voraussetzung für local_auth), USE_BIOMETRIC-Permission ergänzt. v0.1.2+3.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-09 23:44:41 +02:00
patrickandClaude Sonnet 5 8c51831f55 fix: sichtbare Fehleranzeige statt weißem Screen + Versionsnummer
Release-Build zeigte bei unbehandelten Exceptions nur eine leere Fläche
(Flutter-Default-ErrorWidget ohne Text im Release-Modus). Jetzt: eigenes
ErrorWidget.builder (roter Screen mit Fehlertext + Version), runZonedGuarded
in main(), generische catch-Blöcke in HomeScreen (bisher nur DioException
gefangen). App-Version v0.1.1+2 sichtbar in Login-/Home-AppBar, damit
Feldberichte einem Build zuzuordnen sind.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-09 23:38:12 +02:00
patrickandClaude Sonnet 5 22d899a817 feat: Live-Timer für Arbeitszeit und Pausendauer
Statuskarte zeigt jetzt laufende Dauer (HH:MM:SS) seit Einstempeln bzw.
seit Pausenbeginn, aktualisiert sekündlich per Timer.periodic.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-09 23:27:24 +02:00
patrickandClaude Sonnet 5 0b980d73bc feat(mobile): Flutter-App Grundgerüst (Login + Stempeln)
Employee-only App gegen bestehende Backend-API: Login inkl. TOTP-Schritt,
Ein-/Ausstempeln, Pause, Status "heute". Refresh-Token läuft nur als
HttpOnly-Cookie (Backend gibt ihn nie im Body zurück) → persistente
Cookie-Jar statt Secure-Storage-Refresh-Token. android/-Projektordner via
flutter create auf root@192.168.1.236 generiert, INTERNET-Permission
nachgetragen. Ungetestet auf echtem Gerät.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-09 22:59:22 +02:00