diff --git a/backend/controllers/clubDashboardController.js b/backend/controllers/clubDashboardController.js index 055cdfc5..b7651432 100755 --- a/backend/controllers/clubDashboardController.js +++ b/backend/controllers/clubDashboardController.js @@ -610,7 +610,7 @@ export const getClubDashboard = async (req, res) => { title: 'Finanzen', value: paidRatio === null ? 'Keine Daten' : `${paidRatio} % erledigt`, meta: paymentClaims.length > 0 ? `${paymentClaims.length} offene oder teilweise offene Forderungen` : 'Noch keine Beitragsforderungen erfasst', - to: '/club-tasks', + to: '/club-payments', }, ], }, diff --git a/docs/club-outstanding-plan.md b/docs/club-outstanding-plan.md index 494aeb51..4224037d 100755 --- a/docs/club-outstanding-plan.md +++ b/docs/club-outstanding-plan.md @@ -17,17 +17,16 @@ sein. Danach wird der reale Kommunikationsversand abgesichert. Erst auf dieser Basis lohnt sich der Ausbau von Nachvollziehbarkeit (Historie und Archiv) und der letzte UX-Feinschliff. -1. Club-UI-Absicherung in den Kernviews -2. Kommunikation produktiv absichern -3. Historie und Archiv vertiefen -4. Restliche Club-UX und Dashboard verdichten -5. Erst danach das `mein-tt.de`-Produkt inhaltlich ausbauen +1. Restliche Club-UX und Dashboard verdichten + +Der Player-Bereich `mein-tt.de` wird nicht mehr als Phase dieses Club-Plans +gefuehrt. Die eigenstaendige Roadmap steht in [mein-tt-product-plan.md](./mein-tt-product-plan.md). ## Arbeitsreihenfolge ### Phase 1: Absicherung der bestehenden Club-Views -Status: in Arbeit +Status: umgesetzt, abschliessender manueller Smoke-Check offen Ziel: - Keine haengenden Formulare bei Reload, Clubwechsel oder Auswahlwechsel. @@ -66,6 +65,8 @@ Prioritaet innerhalb der Phase: ### Phase 2: Kommunikation produktiv absichern +Status: technisch umgesetzt, reale SMTP-Testzustellung und Betriebsdokumentation offen + Ziel: - Nachrichtenfluss nicht nur funktional, sondern praxisnah robust machen. @@ -87,6 +88,8 @@ Hinweis zur Abhaengigkeit: ### Phase 3: Historie und Archiv vertiefen +Status: umgesetzt + Ziel: - Vergaengliche Vorgange muessen spaeter besser auffindbar und nachvollziehbar sein. @@ -106,6 +109,8 @@ Hinweis zur Abhaengigkeit: ### Phase 4: Restliche Club-UX verdichten +Status: umgesetzt, manueller Bereichs-Smoketest vor Auslieferung empfohlen + Ziel: - Das Dashboard und die Detailmodule sollen gleiche Sprache sprechen. @@ -119,16 +124,6 @@ Fertig, wenn: - Der Einstieg immer zur naechsten sinnvollen Aktion fuehrt. - Die wichtigsten Statuswerte nicht doppelt oder widerspruechlich gezeigt werden. -### Phase 5: Player-Produkt erst danach - -Ziel: -- `mein-tt.de` bekommt nur dann neue Inhalte, wenn die Club-Seite stabil ist. - -Arbeitspakete: -- Anforderungen fuer Spieleransichten separat sammeln. -- Keine Club-spezifischen Workflows mehr in das Player-Produkt ziehen. -- Neue Spielerfeatures nur gegen eigene Prioritaeten und nicht als Restverwertung der Club-Roadmap planen. - ## Nicht als naechstes anfassen - Generelles Beitrags- und Tarifsystem mit Familienlogik, Alterslogik und Gueltigkeitszeitrainen. @@ -137,26 +132,10 @@ Arbeitspakete: ## Konkrete naechste Tickets -### Jetzt - -1. Club-UI-Smoke-Check und Kantenfallkorrekturen fuer Aufgaben und Kommunikation. -2. Club-UI-Smoke-Check und Kantenfallkorrekturen fuer Konten und Rechnungen. -3. Einheitliche Read-only-, Lade- und Fehlerzustaende in den vier Kernviews. - -### Danach - -4. SMTP-Test fuer Kommunikation mit realer Zieladresse und dokumentiertem Ergebnis. -5. Sichtbare Behandlung fehlender oder fehlerhafter SMTP-Konfiguration nachziehen. -6. Reply-To je Verein/Vorlage entscheiden und bei Bedarf umsetzen. -7. Dokumentanhaenge fuer Kommunikation und Vorlagen. -8. Serienvorlagen und wiederkehrende Nachrichtentypen. - -### Anschliessend - -9. Historie: Filter nach Modul und Vorgangstyp sowie Querverweise auf Zielobjekte. -10. Archiv: Suche, Schnellfilter und danach weitere Objektklassen. -11. Historie: Export auf Basis der stabilen Filter- und Objektstruktur. -12. Dashboard-Deep-Links, Schnellzugriffe und Statuskonsistenz abschliessen. +1. Dashboard-Deep-Links zwischen Mitgliedern, Zahlungen, Kommunikation und Archiv prüfen und vervollständigen. +2. Schnellzugriffe gegen die häufigsten Tagesaktionen abgleichen. +3. Statuswörter, Akzentfarben und Listenlabels vereinheitlichen. +4. Bereichsübergreifenden Smoke-Check für Navigation, Rechte und leere Zustände durchführen. ## Abhaengigkeiten diff --git a/docs/mein-tt-product-plan.md b/docs/mein-tt-product-plan.md new file mode 100644 index 00000000..ffc2f2fc --- /dev/null +++ b/docs/mein-tt-product-plan.md @@ -0,0 +1,19 @@ +# mein-tt.de: Produkt-Roadmap + +Stand: 2026-07-22 + +## Abgrenzung + +Diese Roadmap ist bewusst vom Club-Produkt getrennt. Spielerfunktionen dürfen +keine Vereinsworkflows, Vereinsrollen oder Verwaltungsdaten voraussetzen. + +## Startpunkt + +- Anforderungen aus Spielersicht sammeln und priorisieren. +- Bestehende Player-Ansichten, Datenquellen und Rechte prüfen. +- Ein erstes, eigenständiges Zielbild mit Nutzen, Zielgruppe und Erfolgskriterien festlegen. + +## Noch zu füllen + +Konkrete Features werden erst nach der Anforderungsaufnahme in Prioritäten, +Abhängigkeiten und umsetzbare Tickets überführt. diff --git a/docs/tt-club.de-le-ssl.conf b/docs/tt-club.de-le-ssl.conf new file mode 100644 index 00000000..4e14f7c8 --- /dev/null +++ b/docs/tt-club.de-le-ssl.conf @@ -0,0 +1,22 @@ + + ServerName tt-club.de + ServerAlias www.tt-club.de + # tt-club.de nutzt dieselbe ausgerollte Anwendung wie tt-tagebuch.de. + DocumentRoot /var/www/tt-tagebuch.de + + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + + ErrorLog ${APACHE_LOG_DIR}/tt-club.de_error.log + CustomLog ${APACHE_LOG_DIR}/tt-club.de_access.log combined + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/tt-club.de/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/tt-club.de/privkey.pem + Include /etc/letsencrypt/options-ssl-apache.conf + ProxyRequests Off + ProxyPass /api http://localhost:3050/api + ProxyPassReverse /api http://localhost:3050/api + ProxyPass / http://localhost:3050/ + ProxyPassReverse / http://localhost:3050/ + diff --git a/docs/tt-club.de.conf b/docs/tt-club.de.conf new file mode 100644 index 00000000..7c092af3 --- /dev/null +++ b/docs/tt-club.de.conf @@ -0,0 +1,9 @@ +# HTTP: www.tt-club.de und tt-club.de -> HTTPS + + ServerName www.tt-club.de + Redirect permanent / https://tt-club.de/ + + + ServerName tt-club.de + Redirect permanent / https://tt-club.de/ + diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue index 5c2526e1..cf339ed4 100755 --- a/frontend/src/views/Home.vue +++ b/frontend/src/views/Home.vue @@ -105,7 +105,12 @@ -
+
+

Dashboard konnte nicht geladen werden

+

{{ dashboardError }}

+ +
+

Noch keine Dashboard-Daten

Wähle zuerst einen Verein aus, damit Aufgaben, Mitglieder, Trainings und Termine geladen werden. @@ -743,6 +748,7 @@ export default { return { dashboardSectionsOverride: null, dashboardLoading: false, + dashboardError: '', }; }, computed: { @@ -793,22 +799,28 @@ export default { await this.loadClubDashboard(); }, }, + appProduct() { + this.loadClubDashboard(); + }, }, methods: { ...mapActions(['logout']), async loadClubDashboard() { if (!this.isTtVereinProduct || !this.isAuthenticated || !this.currentClub) { this.dashboardSectionsOverride = null; + this.dashboardError = ''; return; } this.dashboardLoading = true; + this.dashboardError = ''; try { const response = await apiClient.get(`/club-dashboard/${this.currentClub}`); const sections = Array.isArray(response.data?.sections) ? response.data.sections : null; this.dashboardSectionsOverride = sections && sections.length > 0 ? sections : null; - } catch (_error) { + } catch (error) { this.dashboardSectionsOverride = null; + this.dashboardError = error?.response?.data?.error || 'Bitte prüfe deine Verbindung und versuche es erneut.'; } finally { this.dashboardLoading = false; }