# Implementation Status (Vue -> Android)

Stand: 2026-03-06

Quellen:
- `docs/frontend_dependency_graph.md`
- `docs/mobile_spec.md`
- `android-app` (Navigation/Screens/ViewModels/Services/Repository)

## Status-Legende
- `Fully implemented`: eigener Android Screen + ViewModel + Service/Repository-Anbindung, fachlicher Kernflow vorhanden
- `Partially implemented`: Screen/ViewModel vorhanden, aber wesentliche Web-Teilfunktion(en) reduziert/noch offen
- `Placeholder`: Route vorhanden, aber Platzhalter-Screen ohne Fachlogik
- `Missing`: keine echte Android-Umsetzung für diese View/Funktion

| Vue View | Android Screen/Route | Status | Wichtigste Android-Dateien | API-/Socket-Abhängigkeiten |
|---|---|---|---|---|
| Activate.vue | `ActivateScreen` / `activate/{activationCode}` | Fully implemented | `ui/screens/ActivateScreen.kt`, `viewmodel/ActivateViewModel.kt`, `repository/TrainingstagebuchRepository.kt` | API: `GET /auth/activate/{activationCode}`; Socket: - |
| ClubSettings.vue | `ClubSettingsScreen` / `club-settings` | Fully implemented | `ui/screens/ClubSettingsScreen.kt`, `viewmodel/ClubSettingsViewModel.kt`, `services/ClubSettingsService.kt`, `repository/TrainingstagebuchRepository.kt` | API: `GET /clubs/{clubId}`, `PUT /clubs/{clubId}/settings`, `GET/POST/PUT/DELETE /training-groups/{clubId}*`, `GET/POST/PUT/DELETE /training-times/{clubId}*`; Socket: - |
| ClubView.vue | `ShowClubScreen` / `showclub/{clubId}` | Fully implemented | `ui/screens/ShowClubScreen.kt`, `viewmodel/ShowClubViewModel.kt`, `services/HomeService.kt`, `repository/TrainingstagebuchRepository.kt` | API: `GET /clubs/{clubId}`, `GET /clubs/request/{clubId}`, `GET /clubmembers/notapproved/{clubId}`; Socket: - |
| CreateClub.vue | `CreateClubScreen` / `createclub` | Fully implemented | `ui/screens/CreateClubScreen.kt`, `viewmodel/CreateClubViewModel.kt`, `repository/TrainingstagebuchRepository.kt` | API: `POST /clubs`; Socket: - |
| Datenschutz.vue | `DatenschutzScreen` / `datenschutz` | Fully implemented | `ui/screens/DatenschutzScreen.kt`, `viewmodel/LegalViewModels.kt`, `ui/navigation/AppNavGraph.kt` | API: - (statische Legal-View); Socket: - |
| DiaryView.vue | `DiaryScreen` / `diary` | Fully implemented | `ui/screens/DiaryScreen.kt`, `viewmodel/DiaryViewModel.kt`, `services/DiaryService.kt`, `repository/TrainingstagebuchRepository.kt` | API: Diary/participants/activities/tags/notes/plan/groups/accidents/member-stats Endpunkte; Socket: `participant:*`, `diary:*`, `activity:*`, `group:changed`, `member:changed` |
| ForgotPassword.vue | `ForgotPasswordScreen` / `forgot-password` | Fully implemented | `ui/screens/ForgotPasswordScreen.kt`, `viewmodel/ForgotPasswordViewModel.kt`, `repository/TrainingstagebuchRepository.kt` | API: `POST /auth/forgot-password`; Socket: - |
| Home.vue | `HomeScreen` / `home` | Fully implemented | `ui/screens/HomeScreen.kt`, `viewmodel/HomeViewModel.kt`, `ui/navigation/AppNavGraph.kt` | API: `GET /clubs`; Socket: - |
| Impressum.vue | `ImpressumScreen` / `impressum` | Fully implemented | `ui/screens/ImpressumScreen.kt`, `viewmodel/LegalViewModels.kt`, `ui/navigation/AppNavGraph.kt` | API: - (statische Legal-View); Socket: - |
| Login.vue | `LoginScreen` / `login` | Fully implemented | `ui/screens/LoginScreen.kt`, `viewmodel/LoginViewModel.kt`, `services/AuthService.kt`, `network/AuthInterceptor.kt` | API: `POST /auth/login`, `GET /session/status`; Socket: connect on login |
| LogsView.vue | `LogsScreen` / `logs` | Fully implemented | `ui/screens/LogsScreen.kt`, `viewmodel/LogsViewModel.kt`, `services/LogsService.kt`, `repository/TrainingstagebuchRepository.kt` | API: `GET /logs`, `GET /logs/{id}`; Socket: - |
| MemberTransferSettingsView.vue | `MemberTransferSettingsScreen` / `member-transfer-settings` | Fully implemented | `ui/screens/MemberTransferSettingsScreen.kt`, `viewmodel/MemberTransferSettingsViewModel.kt`, `services/MemberTransferService.kt`, `repository/TrainingstagebuchRepository.kt` | API: `GET/POST/DELETE /member-transfer-config/{clubId}`, `POST /clubmembers/transfer/{clubId}`; Socket: - |
| MembersView.vue | `MembersScreen` / `members` | Fully implemented | `ui/screens/MembersScreen.kt`, `viewmodel/MembersViewModel.kt`, `services/MembersService.kt`, `repository/TrainingstagebuchRepository.kt` | API: Member CRUD/notes/images/training-groups/quick-actions Endpunkte + `POST /clubmembers/update-ratings/{clubId}`; Socket: - |
| MyTischtennisAccount.vue | `MyTischtennisAccountScreen` / `mytischtennis-account` | Fully implemented | `ui/screens/MyTischtennisAccountScreen.kt`, `viewmodel/MyTischtennisAccountViewModel.kt`, `services/MyTischtennisAccountService.kt`, `repository/TrainingstagebuchRepository.kt` | API: `GET /mytischtennis/account`, `GET /mytischtennis/status`, `POST /mytischtennis/verify`, `POST /mytischtennis/account`, `DELETE /mytischtennis/account`; Socket: - |
| OfficialTournaments.vue | innerhalb `TournamentsScreen` (Tab `official`) | Fully implemented | `ui/screens/TournamentsScreen.kt`, `viewmodel/TournamentsViewModel.kt`, `services/TournamentService.kt`, `repository/TrainingstagebuchRepository.kt`, `network/ApiService.kt` | API: `GET /official-tournaments/{clubId}`, `GET /official-tournaments/{clubId}/participations/summary`, `POST /official-tournaments/{clubId}/upload`, `GET /official-tournaments/{clubId}/{id}`, `POST /official-tournaments/{clubId}/{id}/participation`, `POST /official-tournaments/{clubId}/{id}/status`, `DELETE /official-tournaments/{clubId}/{id}`; Socket: - |
| PendingApprovalsView.vue | `PendingApprovalsScreen` / `pending-approvals` | Fully implemented | `ui/screens/PendingApprovalsScreen.kt`, `viewmodel/PendingApprovalsViewModel.kt`, `services/HomeService.kt`, `repository/TrainingstagebuchRepository.kt` | API: `GET /clubs/pending/{clubId}`, `POST /clubs/approve`, `POST /clubs/reject`; Socket: - |
| PermissionsView.vue | `PermissionsScreen` / `permissions` | Fully implemented | `ui/screens/PermissionsScreen.kt`, `viewmodel/PermissionsViewModel.kt`, `services/PermissionsService.kt`, `repository/TrainingstagebuchRepository.kt` | API: `GET /permissions/roles/available`, `GET /permissions/structure/all`, `GET /permissions/{clubId}/members`, `PUT /permissions/{clubId}/user/{userId}/role`, `PUT /permissions/{clubId}/user/{userId}/status`, `PUT /permissions/{clubId}/user/{userId}/permissions`; Socket: - |
| PersonalSettings.vue | `PersonalSettingsScreen` / `personal-settings` | Fully implemented | `ui/screens/PersonalSettingsScreen.kt`, `viewmodel/PersonalSettingsViewModel.kt`, `services/PersonalSettingsService.kt`, `MainActivity.kt` | API: - (lokale Persistenz + App-Locale); Socket: - |
| PredefinedActivities.vue | `PredefinedActivitiesScreen` / `predefined-activities` | Fully implemented | `ui/screens/PredefinedActivitiesScreen.kt`, `viewmodel/PredefinedActivitiesViewModel.kt`, `services/PredefinedActivitiesService.kt`, `repository/TrainingstagebuchRepository.kt` | API: `GET /predefined-activities*`, `POST/PUT /predefined-activities*`, `POST /predefined-activities/merge`, `POST /predefined-activities/deduplicate`, `DELETE /predefined-activities/{id}/image/{imageId}`; Socket: - |
| Register.vue | `RegisterScreen` / `register` | Fully implemented | `ui/screens/RegisterScreen.kt`, `viewmodel/RegisterViewModel.kt`, `repository/TrainingstagebuchRepository.kt` | API: `POST /auth/register`; Socket: - |
| ResetPassword.vue | `ResetPasswordScreen` / `reset-password/{token}` | Fully implemented | `ui/screens/ResetPasswordScreen.kt`, `viewmodel/ResetPasswordViewModel.kt`, `repository/TrainingstagebuchRepository.kt` | API: `POST /auth/reset-password`; Socket: - |
| ScheduleView.vue | `ScheduleScreen` / `schedule` | Fully implemented | `ui/screens/ScheduleScreen.kt`, `viewmodel/ScheduleViewModel.kt`, `services/ScheduleService.kt`, `repository/TrainingstagebuchRepository.kt` | API: `GET /club-teams/club/{clubId}`, `GET /matches/leagues/{clubId}/matches*`, `GET /matches/leagues/{clubId}/table/{leagueId}`, `PATCH /matches/{matchId}/players`; Socket: `schedule:match:updated`, `schedule:match-report:submitted` |
| TeamManagementView.vue | `TeamManagementScreen` / `team-management` | Fully implemented | `ui/screens/TeamManagementScreen.kt`, `viewmodel/TeamManagementViewModel.kt`, `services/TeamManagementService.kt`, `repository/TrainingstagebuchRepository.kt` | API: `GET/POST/PUT/DELETE /club-teams*`, `GET /team-documents/club-team/{clubTeamId}`, `POST /team-documents/club-team/{clubTeamId}/upload`, `POST /team-documents/{documentId}/parse`, `GET /logs/scheduler/last-executions`, `GET /matches/leagues/{clubId}/stats/{leagueId}`, `POST /mytischtennis/parse-url`, `POST /mytischtennis/configure-team`, `POST /mytischtennis/configure-league`, `POST/GET /mytischtennis/fetch-team-data*`; Socket: - |
| TournamentTab.vue | innerhalb `TournamentsScreen` | Fully implemented | `ui/screens/TournamentTabScreen.kt`, `viewmodel/TournamentTabViewModel.kt`, `services/TournamentService.kt`, `repository/TrainingstagebuchRepository.kt` | API: zentrale Tournament-Endpunkte (`/tournament*`, `/tournament/participants`, `/tournament/matches*`, `/tournament/match/result`) inkl. Mode-Filter `external`/`mini`; Socket: `tournament:changed` |
| TournamentsView.vue | `TournamentsScreen` / `tournaments` | Fully implemented | `ui/screens/TournamentsScreen.kt`, `viewmodel/TournamentsViewModel.kt`, `ui/screens/TournamentTabScreen.kt` | API: über TournamentTab + Official-Tab (`GET /official-tournaments/{clubId}`, `GET /official-tournaments/{clubId}/participations/summary`); Socket: über TournamentTab (`tournament:changed`) |
| TrainingStatsView.vue | `TrainingStatsScreen` / `training-stats` | Fully implemented | `ui/screens/TrainingStatsScreen.kt`, `viewmodel/TrainingStatsViewModel.kt`, `services/TrainingStatsService.kt`, `repository/TrainingstagebuchRepository.kt` | API: `GET /training-stats/{clubId}`, `GET /member-activities/{clubId}/{memberId}`, `GET /member-activities/{clubId}/{memberId}/last-participations`; Socket: - |

## Kurzfazit
- `Fully implemented`: 26
- `Partially implemented`: 0
- `Placeholder`: 0
- `Missing`: 0
