From 408bdb87a4eca0e4ac2b6eb85f6271e2c8c27b42 Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms <tleilax+studip@gmail.com> Date: Tue, 27 Sep 2022 10:18:47 +0000 Subject: [PATCH] update consultation events when course or institute members change, fixes #675 Closes #675 Merge request studip/studip!972 --- lib/modules/ConsultationModule.class.php | 46 ++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/lib/modules/ConsultationModule.class.php b/lib/modules/ConsultationModule.class.php index ca5654d3725..acc2cb4cd6d 100644 --- a/lib/modules/ConsultationModule.class.php +++ b/lib/modules/ConsultationModule.class.php @@ -9,6 +9,52 @@ class ConsultationModule extends CorePlugin implements StudipModule, SystemPlugi { parent::__construct(); + // Update consultation events for the course when a member changes + foreach (['UserDidEnterCourse', 'UserDidLeaveCourse'] as $event) { + NotificationCenter::on($event, function ($event, $course_id) { + $course = Course::find($course_id); + if ($course) { + ConsultationSlot::findEachBySQL( + function (ConsultationSlot $slot) { + $slot->updateEvents(); + }, + "JOIN consultation_blocks USING (block_id) + WHERE range_id = ? AND range_type = 'course'", + [$course_id] + ); + } + }); + } + + // Update consultation events for the course when a member changes + foreach (['InstituteMemberDidCreate', 'InstituteMemberDidDelete'] as $event) { + NotificationCenter::on($event, function ($event, InstituteMember $member) { + ConsultationSlot::findEachBySQL( + function (ConsultationSlot $slot) { + $slot->updateEvents(); + }, + "JOIN consultation_blocks USING (block_id) + WHERE range_id = ? AND range_type = 'institute'", + [$member->institut_id] + ); + }); + } + + NotificationCenter::on('UserDidLeaveCourse', function ($event, $course_id) { + // Delete consultation events for the user and course + $course = Course::find($course_id); + if ($course) { + ConsultationSlot::findEachBySQL( + function (ConsultationSlot $slot) { + $slot->updateEvents(); + }, + "JOIN consultation_blocks USING (block_id) + WHERE range_id = ? AND range_type = 'course'", + [$course_id] + ); + } + }); + NotificationCenter::on('UserDidDelete', function ($event, $user) { // Delete consultation bookings and slots ConsultationBooking::deleteByUser_id($user->id); -- GitLab