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

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 → bei totp_required: true zweiter Schritt POST /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) → persistente PersistCookieJar (cookie_jar/dio_cookie_manager) nötig, siehe lib/services/api_client.dart.
  • 401 → einmaliger Auto-Refresh via Cookie, danach Logout + Redirect (Redirect aktuell nicht verdrahtet – onUnauthorized-Callback ist vorbereitet, aber in main.dart noch 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).

S
Description
No description provided
Readme
124 KiB
0 Stars 1 Watchers 0 Forks
Languages
Dart 99.6%
Kotlin 0.4%