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
| Route | Screen | Funktion |
|---|---|---|
login | LoginScreen | PIN-Login mit Bediener-Picker (GET /api/v1/benutzer) |
home | HomeScreen | 3 Kacheln: Tische / Neue Bestellung / Einstellungen |
tische | TischeScreen | Grid (Adaptive 110 dp), Raum-Filter, Status-Farben (grün=frei, rot=belegt, orange=reserviert) |
tisch/{uuid} | TischDetailScreen | Tisch-Info + Bon-Positionen + Bar-/Karte-Bezahlung + Freigabe |
bestellung/neu?tischUuid&bonUuid | NeueBestellungScreen | Artikel-Suche (≥2 Zeichen, 250 ms debounce) + Warenkorb + POST /bestellung |
settings | SettingsScreen | Server-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:
deviceToken—pp_*-Bearer für Server-Calls (im OkHttp-Interceptor automatisch alsAuthorization-Header gesetzt viarunBlocking { 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/meGET /auth/device/me(Bearerpp_…)GET /api/v1/benutzer(Login-Picker)GET /api/v1/raeume,/tische?raum=,/tische/{uuid},POST /tische/{uuid}/statusGET /api/v1/warengruppen,/artikel,/artikel/suche?q=&limit=GET /api/v1/bons/{uuid},/bestellungenPOST /api/v1/bons/{uuid}/positionen,PATCH/DELETE /bonpositionen/{uuid}POST /api/v1/bestellung,/bezahlungPOST /api/v1/bons/{uuid}/druck,/schublade/oeffnen
Quirks
- Compose-Navigation-Args:
nullable=truemitdefaultValue=""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).