diff --git a/backend/controllers/clubsController.js b/backend/controllers/clubsController.js index 76d8b2e3..7fc7e5c3 100644 --- a/backend/controllers/clubsController.js +++ b/backend/controllers/clubsController.js @@ -60,11 +60,10 @@ export const updateClubSettings = async (req, res) => { try { const { authcode: token } = req.headers; const { clubid } = req.params; - const { greetingText, associationMemberNumber, myTischtennisClubId, myTischtennisFedNickname, autoFetchRankings } = req.body; + const { greetingText, associationMemberNumber, myTischtennisFedNickname, autoFetchRankings } = req.body; const updated = await ClubService.updateClubSettings(token, clubid, { greetingText, associationMemberNumber, - myTischtennisClubId, myTischtennisFedNickname, autoFetchRankings }); diff --git a/backend/migrations/20260315_add_club_rankings_settings.sql b/backend/migrations/20260315_add_club_rankings_settings.sql index c0a8eb09..95dd9891 100644 --- a/backend/migrations/20260315_add_club_rankings_settings.sql +++ b/backend/migrations/20260315_add_club_rankings_settings.sql @@ -1,9 +1,8 @@ -- Migration: Add myTischtennis rankings settings to clubs table --- Enables per-club configuration of TTR/QTTR rankings fetch (club ID, federation, enable flag) +-- Enables per-club configuration of TTR/QTTR rankings fetch. +-- Club number comes from association_member_number (Verbands-Mitgliedsnummer). ALTER TABLE clubs - ADD COLUMN IF NOT EXISTS my_tischtennis_club_id VARCHAR(50) NULL - COMMENT 'myTischtennis club number for rankings (e.g. 43030)', ADD COLUMN IF NOT EXISTS my_tischtennis_fed_nickname VARCHAR(50) NULL COMMENT 'Federation short name for rankings (e.g. HeTTV)', ADD COLUMN IF NOT EXISTS auto_fetch_rankings BOOLEAN NOT NULL DEFAULT FALSE diff --git a/backend/models/Club.js b/backend/models/Club.js index 9e44c3ff..1fe14861 100644 --- a/backend/models/Club.js +++ b/backend/models/Club.js @@ -17,12 +17,6 @@ const Club = sequelize.define('Club', { allowNull: true, field: 'association_member_number' }, - myTischtennisClubId: { - type: DataTypes.STRING, - allowNull: true, - field: 'my_tischtennis_club_id', - comment: 'myTischtennis club number for rankings (e.g. 43030)' - }, myTischtennisFedNickname: { type: DataTypes.STRING, allowNull: true, diff --git a/backend/services/clubService.js b/backend/services/clubService.js index c35af8a3..af315b45 100644 --- a/backend/services/clubService.js +++ b/backend/services/clubService.js @@ -70,7 +70,6 @@ class ClubService { async updateClubSettings(userToken, clubId, { greetingText, associationMemberNumber, - myTischtennisClubId, myTischtennisFedNickname, autoFetchRankings }) { @@ -80,7 +79,6 @@ class ClubService { throw new Error('clubnotfound'); } const updates = { greetingText, associationMemberNumber }; - if (myTischtennisClubId !== undefined) updates.myTischtennisClubId = myTischtennisClubId || null; if (myTischtennisFedNickname !== undefined) updates.myTischtennisFedNickname = myTischtennisFedNickname || null; if (autoFetchRankings !== undefined) updates.autoFetchRankings = !!autoFetchRankings; return await club.update(updates); diff --git a/backend/services/memberService.js b/backend/services/memberService.js index f908a8ab..f18c4066 100644 --- a/backend/services/memberService.js +++ b/backend/services/memberService.js @@ -396,14 +396,14 @@ class MemberService { }; } - const effectiveClubId = (club.myTischtennisClubId || '').trim() || account.clubId; + const effectiveClubId = (club.associationMemberNumber || '').trim() || account.clubId; const effectiveFedNickname = (club.myTischtennisFedNickname || '').trim() || account.fedNickname; if (!effectiveClubId || !effectiveFedNickname) { console.error('[updateRatingsFromMyTischtennis] - Missing clubId or fedNickname:', { clubId: effectiveClubId, fedNickname: effectiveFedNickname, - fromClub: !!(club.myTischtennisClubId && club.myTischtennisFedNickname) + fromClub: !!(club.associationMemberNumber && club.myTischtennisFedNickname) }); return { status: 400, diff --git a/frontend/src/i18n/locales/de.json b/frontend/src/i18n/locales/de.json index 079be8e4..dc75b1f0 100644 --- a/frontend/src/i18n/locales/de.json +++ b/frontend/src/i18n/locales/de.json @@ -741,10 +741,9 @@ "myTischtennisRankings": "myTischtennis TTR/QTTR-Ranglisten", "myTischtennisRankingsHint": "Automatischer Abruf der Vereins-Rangliste für TTR- und QTTR-Updates der Mitglieder.", "autoFetchRankings": "Ranglisten automatisch abrufen", - "myTischtennisClubId": "myTischtennis Vereinsnummer", - "myTischtennisClubIdPlaceholder": "z. B. 43030", "myTischtennisFedNickname": "Verbandskürzel", - "myTischtennisFedNicknamePlaceholder": "z. B. HeTTV" + "myTischtennisFedNicknamePlaceholder": "z. B. HeTTV", + "rankingsUsesAssociationNumber": "Die Vereinsnummer für den Ranglisten-Abruf entspricht der Verbands-Mitgliedsnummer oben." }, "predefinedActivities": { "title": "Vordefinierte Aktivitäten", diff --git a/frontend/src/views/ClubSettings.vue b/frontend/src/views/ClubSettings.vue index 9e22f39b..97429a0c 100644 --- a/frontend/src/views/ClubSettings.vue +++ b/frontend/src/views/ClubSettings.vue @@ -61,15 +61,12 @@
-
- - -
+

{{ $t('clubSettings.rankingsUsesAssociationNumber') }}

@@ -112,7 +109,6 @@ export default { activeTab: 'settings', greeting: '', associationMemberNumber: '', - myTischtennisClubId: '', myTischtennisFedNickname: '', autoFetchRankings: false, saved: false, @@ -136,7 +132,6 @@ export default { if (!this.currentClub) { this.greeting = ''; this.associationMemberNumber = ''; - this.myTischtennisClubId = ''; this.myTischtennisFedNickname = ''; this.autoFetchRankings = false; this.loadError = null; @@ -149,14 +144,12 @@ export default { const club = response.data; this.greeting = club?.greetingText ?? ''; this.associationMemberNumber = club?.associationMemberNumber ?? ''; - this.myTischtennisClubId = club?.myTischtennisClubId ?? ''; this.myTischtennisFedNickname = club?.myTischtennisFedNickname ?? ''; this.autoFetchRankings = !!club?.autoFetchRankings; } catch (e) { this.loadError = this.$t('clubSettings.loadFailed'); this.greeting = ''; this.associationMemberNumber = ''; - this.myTischtennisClubId = ''; this.myTischtennisFedNickname = ''; this.autoFetchRankings = false; } finally { @@ -172,7 +165,6 @@ export default { await apiClient.put(`/clubs/${this.currentClub}/settings`, { greetingText: this.greeting, associationMemberNumber: this.associationMemberNumber, - myTischtennisClubId: this.myTischtennisClubId || null, myTischtennisFedNickname: this.myTischtennisFedNickname || null, autoFetchRankings: this.autoFetchRankings, }); @@ -211,7 +203,7 @@ export default { } .text-input { width: 100%; border: 1px solid #ddd; border-radius: 6px; padding: 8px; font-size: 14px; } .rankings-row { margin-bottom: 12px; } -.rankings-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 12px; } +.rankings-fields { margin-top: 12px; } .field-group label { display: block; margin-bottom: 4px; font-weight: 500; color: #333; } .checkbox-label { display: flex; align-items: center; gap: 8px; cursor: pointer; } .checkbox-label input[type="checkbox"] { width: auto; }