diff --git a/backend/controllers/diaryDateActivityController.js b/backend/controllers/diaryDateActivityController.js index 9e34b19..38629ec 100644 --- a/backend/controllers/diaryDateActivityController.js +++ b/backend/controllers/diaryDateActivityController.js @@ -121,8 +121,8 @@ export const getDiaryDateActivities = async (req, res) => { export const addGroupActivity = async(req, res) => { try { const { authcode: userToken } = req.headers; - const { clubId, diaryDateId, groupId, activity, timeblockId } = req.body; - const activityItem = await diaryDateActivityService.addGroupActivity(userToken, clubId, diaryDateId, groupId, activity, timeblockId); + const { clubId, diaryDateId, groupId, activity, predefinedActivityId, timeblockId } = req.body; + const activityItem = await diaryDateActivityService.addGroupActivity(userToken, clubId, diaryDateId, groupId, activity, predefinedActivityId, timeblockId); // Emit Socket-Event const diaryDate = await DiaryDate.findByPk(diaryDateId); diff --git a/backend/services/diaryDateActivityService.js b/backend/services/diaryDateActivityService.js index d9f9b73..2c381c0 100644 --- a/backend/services/diaryDateActivityService.js +++ b/backend/services/diaryDateActivityService.js @@ -310,7 +310,7 @@ class DiaryDateActivityService { return activitiesWithImages; } - async addGroupActivity(userToken, clubId, diaryDateId, groupId, activity, timeblockId = null) { + async addGroupActivity(userToken, clubId, diaryDateId, groupId, activity, predefinedActivityId = null, timeblockId = null) { await checkAccess(userToken, clubId); let diaryDateActivity; @@ -350,11 +350,37 @@ class DiaryDateActivityService { console.error('Group diaryDateId:', group.diaryDateId, 'Activity diaryDateId:', diaryDateActivity.diaryDateId); throw new Error('Group isn\'t related to date'); } - const [predefinedActivity, created] = await PredefinedActivity.findOrCreate({ - where: { - name: activity + + let predefinedActivity = null; + + // 1. Versuche zuerst, die PredefinedActivity per ID zu finden + if (predefinedActivityId) { + predefinedActivity = await PredefinedActivity.findByPk(predefinedActivityId); + } + + // 2. Falls nicht gefunden, suche nach Name oder Code + if (!predefinedActivity) { + const normalized = (activity || '').trim(); + if (normalized) { + predefinedActivity = await PredefinedActivity.findOne({ + where: { + [Op.or]: [ + { name: normalized }, + { code: normalized } + ] + } + }); } - }); + } + + // 3. Falls immer noch nicht gefunden, erstelle eine neue + if (!predefinedActivity) { + predefinedActivity = await PredefinedActivity.create({ + name: activity || '', + code: activity || '', + }); + } + devLog(predefinedActivity); const activityData = { diaryDateActivity: diaryDateActivity.id, diff --git a/frontend/src/views/DiaryView.vue b/frontend/src/views/DiaryView.vue index 1b1a88d..1d4bc55 100644 --- a/frontend/src/views/DiaryView.vue +++ b/frontend/src/views/DiaryView.vue @@ -817,6 +817,7 @@ export default { duration: '', durationText: '', groupId: '', + predefinedActivityId: null, isTimeBlock: false, }, predefinedActivities: [], @@ -1730,6 +1731,7 @@ export default { clubId: this.currentClub, diaryDateId: this.date.id, activity: this.newPlanItem.activity, + predefinedActivityId: this.newPlanItem.predefinedActivityId, groupId: Number(this.newPlanItem.groupId), timeblockId: this.selectedTimeblockId, }); @@ -1738,7 +1740,7 @@ export default { this.addNewItem = false; this.addNewGroupActivity = false; this.selectedTimeblockId = null; - this.newPlanItem = { activity: '', duration: '', durationText: '', groupId: '' }; + this.newPlanItem = { activity: '', duration: '', durationText: '', groupId: '', predefinedActivityId: null }; this.trainingPlan = await apiClient.get(`/diary-date-activities/${this.currentClub}/${this.date.id}`).then(response => response.data); this.calculateIntermediateTimes(); } catch (error) { @@ -2450,6 +2452,7 @@ export default { this.newPlanItem.activity = (s.code && s.code.trim() !== '') ? s.code : s.name; this.newPlanItem.durationText = s.durationText || ''; this.newPlanItem.duration = s.duration || ''; + this.newPlanItem.predefinedActivityId = s.id || null; this.newItemShowDropdown = false; this.newItemSearchResults = []; },