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
TimeMaster Mobile (Flutter)
Employee-only App: Login + Ein-/Ausstempeln + Pause. Gegen bestehende Backend-API
(backend/app/routers/{auth,time_entries}.py).
Setup
cd mobile
flutter create . --platforms=android,ios # generiert android/ios-Ordner (fehlen noch)
flutter pub get
flutter run
Kein flutter hier lokal verfügbar (kein SDK installiert) – pubspec.yaml +
lib/ sind von Hand geschrieben, ungetestet. Vor erstem Start:
flutter create . im mobile/-Ordner ausführen, damit android/, ios/ +
Gradle/Xcode-Projekte entstehen (überschreibt lib/main.dart NICHT, da
bereits vorhanden – bestehende Dateien bleiben).
Auth-Flow
POST /auth/login→ beitotp_required: truezweiter SchrittPOST /auth/totp/login- Access-Token in
flutter_secure_storage, Refresh-Token läuft NUR als HttpOnly-Cookie (Backend gibt ihn nie im Body zurück) → persistentePersistCookieJar(cookie_jar/dio_cookie_manager) nötig, siehelib/services/api_client.dart. - 401 → einmaliger Auto-Refresh via Cookie, danach Logout + Redirect (Redirect
aktuell nicht verdrahtet –
onUnauthorized-Callback ist vorbereitet, aber inmain.dartnoch nicht an Navigator gebunden – TODO).
Server-Adresse
Einstellbar im Login-Screen (Zahnrad oben rechts), landet in Secure Storage.
Default zeigt auf Platzhalter-URL – vor erstem Test auf 137 oder 164 zeigen
(https://<host>/api/v1).
Umfang aktuell
Nur Login + stamp-in/out + break-start/end + Status "heute". Kein Antrags- Workflow (Abwesenheit etc.), kein Offline-Modus, keine echte Android/iOS- Build-Config (android/ios-Ordner fehlen noch, siehe oben).