# Schedule/Tournament Block Port (Android)

Stand: 2026-03-06

## Umgesetzt

### 1) ScheduleView.vue -> Android
- Neuer Compose-Screen: `ScheduleScreen`.
- Neuer ViewModel-Flow: `ScheduleViewModel` (StateFlow, Retry, Dialog-State).
- Team-Auswahl, Match-Liste, Liga-Tabelle.
- Spieler-Auswahl pro Match (ready/planned/played) inkl. Save.
- Error/Loading/Retry über bestehendes ErrorFeedback.
- Socket-Integration über zentrale Architektur:
  - `schedule:match:updated`
  - `schedule:match-report:submitted`
  -> ViewModel triggert Reload von Match/Tabelle.

### 2) TournamentsView.vue + TournamentTab.vue -> Android
- Neuer Compose-Screen: `TournamentsScreen` mit Top-Tabs (internal/external/mini/official).
- Neuer ViewModel-Flow für Tab-Navigation: `TournamentsViewModel`.
- Neuer Feature-Screen: `TournamentTabScreen` + `TournamentTabViewModel`.
- Umgesetzte Kernfeatures:
  - Turnierliste laden und Turnier auswählen
  - neues Turnier erstellen
  - neue Mini-Meisterschaft erstellen
  - Konfiguration bearbeiten/speichern (Name, Datum, Gewinnsätze, Tische, Modus)
  - Teilnehmer laden/hinzufügen/entfernen
  - Matchliste laden und Match-Ergebnis speichern
- Socket-Integration über zentrale Architektur:
  - `tournament:changed`
  -> ViewModel lädt Turnierdaten neu.

### 3) Gemeinsame Domain (Schedule + Tournament)
Zentral im Repository modelliert:
- Schedule Domain Models:
  - `ScheduleTeamItem`, `ScheduleMatchItem`, `ScheduleLeagueTableRow`
- Tournament Domain Models:
  - `TournamentItem`, `TournamentParticipantItem`, `TournamentMatchItem`
- Zentrale Mapper in `RepositoryMappers` ergänzt.
- Zentrale Repository-Methoden für beide Bereiche ergänzt.
- Services ergänzt:
  - `ScheduleService`
  - `TournamentService`

## Genutzte API-Endpunkte

### Schedule
- `GET /club-teams/club/{clubId}`
- `GET /matches/leagues/{clubId}/matches`
- `GET /matches/leagues/{clubId}/matches/{leagueId}`
- `GET /matches/leagues/{clubId}/table/{leagueId}`
- `PATCH /matches/{matchId}/players`
- `GET /clubmembers/get/{clubId}/true`

### Tournament
- `GET /tournament/{clubId}`
- `GET /tournament/{clubId}?type=mini`
- `GET /tournament/{clubId}/{tournamentId}`
- `POST /tournament`
- `POST /tournament/mini`
- `PUT /tournament/{clubId}/{tournamentId}`
- `POST /tournament/participants`
- `POST /tournament/participant`
- `DELETE /tournament/participant`
- `GET /tournament/matches/{clubId}/{tournamentId}`
- `POST /tournament/match/result`
- `GET /clubmembers/get/{clubId}/true`

## Socket-Events (zentral integriert)
- `schedule:match:updated` -> Schedule Reload
- `schedule:match-report:submitted` -> Schedule Reload
- `tournament:changed` -> Tournament Reload

Technische Einbindung:
- Events kommen über `SocketManager` -> `TrainingstagebuchRepository.socketDomainEvents` -> Service -> ViewModel.

## Unterschiede zur Vue-Version (offen)
- `TournamentTab.vue` ist als funktionsfähiger Kernport umgesetzt, aber nicht 1:1 in der Breite aller Untertabs (`groups/results/placements` in voller Web-Tiefe).
- `TournamentsView.vue` Tab `official` ist aktuell als dokumentierter Placeholder (optionaler Teil aus der Anforderung).
- PDF-bezogene Flows (Web `PDFGenerator`) sind in diesem Block nicht nativ umgesetzt und aktuell dokumentiert.
- `ScheduleView.vue` CSV-Import/Galerie-/NuScore-spezifische Dialogflüsse sind noch nicht vollständig nativ nachgezogen.
