Zum Hauptinhalt springen

goapp (Orderman)

Die goapp (de.profipos.goapp, Android / Kotlin / Jetpack Compose) ist der mobile Bedien-Client für Servicekräfte. Live-Build seit 13.06.2026: Jenkins de.profipos.go-app #2870 (Commit 3ec7414).

Jenkins-Job-Namens-Quirk

Das Repo heißt de.profipos.goapp, der Jenkins-Job heißt de.profipos.go-app (mit Bindestrich!). Hardcoded in tools/jenkins-tg.ps1.

Screens

RouteScreenFunktion
loginLoginScreenPIN-Login mit Bediener-Picker (GET /api/v1/benutzer)
homeHomeScreen3 Kacheln: Tische / Neue Bestellung / Einstellungen
tischeTischeScreenGrid (Adaptive 110 dp), Raum-Filter, Status-Farben (grün=frei, rot=belegt, orange=reserviert)
tisch/{uuid}TischDetailScreenTisch-Info + Bon-Positionen + Bar-/Karte-Bezahlung + Freigabe
bestellung/neu?tischUuid&bonUuidNeueBestellungScreenArtikel-Suche (≥2 Zeichen, 250 ms debounce) + Warenkorb + POST /bestellung
settingsSettingsScreenServer-URL, Geräte-Token, Drucker-Host/Port, Logout

Architektur

  • DI: Hilt
  • HTTP: Retrofit + OkHttp-Interceptor
  • Persistenz: DataStore-Preferences (AppPrefs)
  • State: ViewModel + StateFlow
  • Navigation: Compose Navigation

Auth-Layer

AppPrefs kennt:

  • deviceTokenpp_*-Bearer für Server-Calls (im OkHttp-Interceptor automatisch als Authorization-Header gesetzt via runBlocking { prefs.currentToken() }).
  • Benutzer-Session: userToken, userUuid, anzeigeName, rollen, ablaufAm. Wird nur im Logout-Request-Body übertragen.
  • Drucker-Config: druckerHost, druckerPort.
Backwards-Compat

AppPrefs.token ist Alias für deviceToken, damit der ServerStatusRepository nicht angefasst werden musste.

Genutzte Endpoints

  • POST /api/v1/auth/login, POST /auth/logout, GET /auth/me
  • GET /auth/device/me (Bearer pp_…)
  • GET /api/v1/benutzer (Login-Picker)
  • GET /api/v1/raeume, /tische?raum=, /tische/{uuid}, POST /tische/{uuid}/status
  • GET /api/v1/warengruppen, /artikel, /artikel/suche?q=&limit=
  • GET /api/v1/bons/{uuid}, /bestellungen
  • POST /api/v1/bons/{uuid}/positionen, PATCH/DELETE /bonpositionen/{uuid}
  • POST /api/v1/bestellung, /bezahlung
  • POST /api/v1/bons/{uuid}/druck, /schublade/oeffnen

Quirks

  • Compose-Navigation-Args: nullable=true mit defaultValue="" geht nicht → defaultValue="" + im ViewModel .takeIf { it.isNotBlank() }.
  • runBlocking { prefs.currentToken() } im OkHttp-Interceptor schickt immer den Geräte-Token (pp_…), nicht den Benutzer-Token.
  • Polling-Intervall Tische: 5 s (GoAppRepository.pollTische).

Verwandte Themen