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