# Implementation Matrix

| Vue View | Route (router.js) | Android Route/Screen | Status (Implemented/Partial/Placeholder/Missing) | Hinweise (API/State/Socket) |
|---|---|---|---|---|
| Activate.vue | `/activate/:activationCode` | `AppRoute.Activate` / `ActivateScreen` | Implemented | Dateien: `ActivateScreen.kt`, `ActivateViewModel.kt`, `TrainingstagebuchRepository.activate()`; DeepLink: `trainingstagebuch://auth/activate/{activationCode}`. |
| ClubSettings.vue | `/club-settings` | `AppRoute.ClubSettings` / `ClubSettingsScreen` | Partial | Dateien: `ClubSettingsScreen.kt`, `ClubSettingsViewModel.kt`, `ClubSettingsService.kt`, `TrainingstagebuchRepository.loadClubSettings()/saveClubSettings()/loadClubTrainingGroups()/createClubTrainingGroup()/updateClubTrainingGroup()/deleteClubTrainingGroup()/loadClubTrainingTimes()/createClubTrainingTime()/updateClubTrainingTime()/deleteClubTrainingTime()`; umgesetzt: Tabs `Settings/Training Groups/Training Times`, CRUD inkl. Edit für Groups/Times, Loading/Error/Success, Dropdown-Auswahl (Group/Weekday) + Edit-Dialoge. Offen: weitere Feinschliffe zur vollständigen Vue-UX-Parität. |
| ClubView.vue | `/showclub/:clubId` | `AppRoute.ShowClub` / `ShowClubScreen` | Partial | Dateien: `ShowClubScreen.kt`, `ShowClubViewModel.kt`, `HomeService.loadClub()/requestClubAccess()/loadNotApprovedMembers()`, `TrainingstagebuchRepository.loadClub()/requestClubAccess()/loadNotApprovedMembers()`; umgesetzt: Laden + Error/Retry + aktive Mitgliederliste + AccessDenied/Requested + Zugriff anfragen (`/clubs/request/{clubId}`) + Open-Requests (`/clubmembers/notapproved/{clubId}`). Offen: weitere Club-Detail-Parität (z. B. differenzierte Rechteanzeige). |
| CreateClub.vue | `/createclub` | `AppRoute.CreateClub` / `CreateClubScreen` | Implemented | Dateien: `CreateClubScreen.kt`, `CreateClubViewModel.kt`, `HomeService.createClub()`, `TrainingstagebuchRepository.createClub()`; Validierung (Name >= 3), Loading/Error, setzt `currentClub` nach Erfolg wenn Club-ID vorhanden. |
| Datenschutz.vue | `/datenschutz` | `AppRoute.Datenschutz` / `DatenschutzScreen` | Placeholder | Reiner Platzhalter-Screen. |
| DiaryView.vue | `/diary` | `AppRoute.Diary` / `DiaryScreen` | Placeholder | Viele Diary-APIs vorhanden, aber Android-Screen aktuell Platzhalter. |
| ForgotPassword.vue | `/forgot-password` | `AppRoute.ForgotPassword` / `ForgotPasswordScreen` | Implemented | Dateien: `ForgotPasswordScreen.kt`, `ForgotPasswordViewModel.kt`, `TrainingstagebuchRepository.forgotPassword()`; Loading/Error/Success vorhanden, DeepLink: `trainingstagebuch://auth/forgot-password`. |
| Home.vue | `/` | `AppRoute.Home` / `HomeScreen` | Implemented | Dateien: `HomeScreen.kt`, `HomeViewModel.kt`, `TrainingstagebuchRepository.loadHomeData()` (nutzt `/clubs`), Loading/Error vorhanden. |
| Impressum.vue | `/impressum` | `AppRoute.Impressum` / `ImpressumScreen` | Placeholder | Reiner Platzhalter-Screen. |
| Login.vue | `/login` | `AppRoute.Login` / `LoginScreen` | Implemented | Dateien: `LoginScreen.kt`, `LoginViewModel.kt`, `TrainingstagebuchRepository.login()`; Session via `SessionManager`, ErrorBanner/Snackbar integriert. |
| LogsView.vue | `/logs` | `AppRoute.Logs` / `LogsScreen` | Placeholder | API-Endpunkte vorhanden (`getLogs`, `getLogDetail`), Android-Screen Platzhalter. |
| MembersView.vue | `/members` | `AppRoute.Members` / `MembersScreen` | Partial | Dateien: `MembersScreen.kt`, `MembersViewModel.kt`, `MembersService.loadMembers()/saveMember()/quick*()/image*()/trainingGroup*()/note*()`, `TrainingstagebuchRepository.loadMembers()/saveMember()/quick*()/image*()/trainingGroup*()/note*()`; umgesetzt: Loading/Error/Retry, Stats (aktiv/test/inaktiv), Suche, Inaktiv-Filter, Sortierung, Core-Form (Vorname/Nachname/active/testMembership), Kontakte (Phone/Email), Quick-Aktionen (`quick-deactivate`, `quick-update-test-membership`), Bild-Basis (Upload/Primär/Löschen), Training-Groups (laden/hinzufügen/entfernen), Notizen (laden/anlegen/löschen via `/membernotes`). Fehlend zur Vue-Parität: Transfer, erweiterte Kontakt-/Bilddetails. |
| MemberTransferSettingsView.vue | `/member-transfer-settings` | `AppRoute.MemberTransferSettings` / `MemberTransferSettingsScreen` | Implemented | Dateien: `MemberTransferSettingsScreen.kt`, `MemberTransferSettingsViewModel.kt`, `MemberTransferService.kt`, `TrainingstagebuchRepository.loadMemberTransferConfig()/saveMemberTransferConfig()/deleteMemberTransferConfig()/executeMemberTransfer()`; inkl. Loading/Error, Save/Delete/Execute + Transfer-Summary. |
| MyTischtennisAccount.vue | `/mytischtennis-account` | `AppRoute.MyTischtennisAccount` / `MyTischtennisAccountScreen` | Placeholder | API-Endpunkte vorhanden (`getMyTischtennis*`), Android-Screen Platzhalter. |
| OfficialTournaments.vue | - | - | Missing | Keine Vue-Route in `router.js`; Android hat keinen Route-/Screen-Eintrag. API-Endpunkte vorhanden (`getOfficialTournaments` etc.). |
| PendingApprovalsView.vue | `/pending-approvals` | `AppRoute.PendingApprovals` / `PendingApprovalsScreen` | Implemented | Dateien: `PendingApprovalsScreen.kt`, `PendingApprovalsViewModel.kt`, `HomeService.loadPendingApprovals()/approvePendingUser()/rejectPendingUser()`, `TrainingstagebuchRepository.loadPendingApprovals()/approvePendingUser()/rejectPendingUser()`; umgesetzt: Laden der offenen Requests + Approve/Reject inkl. Loading/Error/Success. |
| PermissionsView.vue | `/permissions` | `AppRoute.Permissions` / `PermissionsScreen` | Placeholder | Permissions-APIs vorhanden, Android ohne State/Logik. |
| PersonalSettings.vue | `/personal-settings` | `AppRoute.PersonalSettings` / `PersonalSettingsScreen` | Placeholder | Route vorhanden, derzeit Platzhalter. |
| PredefinedActivities.vue | `/predefined-activities` | `AppRoute.PredefinedActivities` / `PredefinedActivitiesScreen` | Placeholder | Predefined-Activities-APIs vorhanden, Android-Screen Platzhalter. |
| Register.vue | `/register` | `AppRoute.Register` / `RegisterScreen` | Implemented | Dateien: `RegisterScreen.kt`, `RegisterViewModel.kt`, `TrainingstagebuchRepository.register()` (nutzt `/auth/register`), Loading/Error vorhanden. |
| ResetPassword.vue | `/reset-password/:token` | `AppRoute.ResetPassword` / `ResetPasswordScreen` | Implemented | Dateien: `ResetPasswordScreen.kt`, `ResetPasswordViewModel.kt`, `TrainingstagebuchRepository.resetPassword()`; Validierung (match/min length) + Loading/Error/Success, DeepLink: `trainingstagebuch://auth/reset-password/{token}`. |
| ScheduleView.vue | `/schedule` | `AppRoute.Schedule` / `ScheduleScreen` | Placeholder | Match/Schedule-APIs vorhanden; Socket-Themen aus Vue nicht in Android umgesetzt. |
| TeamManagementView.vue | `/team-management` | `AppRoute.TeamManagement` / `TeamManagementScreen` | Placeholder | Team-APIs vorhanden, Android-Screen Platzhalter. |
| TournamentTab.vue | - | - | Missing | Vue-Komponente (Tab), keine eigene Route; Android hat keinen separaten Tab-/Screen-Eintrag. |
| TournamentsView.vue | `/tournaments` | `AppRoute.Tournaments` / `TournamentsScreen` | Placeholder | Umfangreiche Tournament-APIs vorhanden, Android-Screen aktuell Platzhalter. |
| TrainingStatsView.vue | `/training-stats` | `AppRoute.TrainingStats` / `TrainingStatsScreen` | Placeholder | Training-Stats-API vorhanden (`getTrainingStats`), Android-Screen Platzhalter. |
