From 0ec620a8b069cc72d0c65b8fa23aef8fea1d9fa5 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Fri, 24 Mar 2023 10:49:58 +0000
Subject: [PATCH] use correct pk and remove handling for copying studycourse,
 adds migration to...

Closes #2441

Merge request studip/studip!1638
---
 .../5.3.19_cleanup_admission_seminar_user.php | 48 +++++++++++++++++++
 lib/models/CourseMember.class.php             |  6 +--
 2 files changed, 49 insertions(+), 5 deletions(-)
 create mode 100644 db/migrations/5.3.19_cleanup_admission_seminar_user.php

diff --git a/db/migrations/5.3.19_cleanup_admission_seminar_user.php b/db/migrations/5.3.19_cleanup_admission_seminar_user.php
new file mode 100644
index 00000000000..94b5cc852a7
--- /dev/null
+++ b/db/migrations/5.3.19_cleanup_admission_seminar_user.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @see https://gitlab.studip.de/studip/studip/-/issues/2441
+ */
+final class CleanupAdmissionSeminarUser extends Migration
+{
+    public function description()
+    {
+        return 'Removes entries from table admission_seminar_user that are '
+             . 'already in table seminar_user';
+    }
+
+    protected function up()
+    {
+        // Fetch affected course ids
+        $query = "SELECT DISTINCT `seminar_id`
+                  FROM `admission_seminar_user`
+                  JOIN `seminar_user` USING (`seminar_id`, `user_id`)";
+        $course_ids = DBManager::get()->fetchFirst($query);
+
+        // Remove all entries that are already in seminar_user
+        $query = "DELETE `admission_seminar_user`
+                  FROM `admission_seminar_user`
+                  JOIN `seminar_user` USING (`seminar_id`, `user_id`)";
+        DBManager::get()->exec($query);
+
+        // Adjust positions in admission_seminar_user for all affected courses
+        foreach ($course_ids as $course_id) {
+            $query = "SELECT `user_id`
+                      FROM `admission_seminar_user`
+                      WHERE `seminar_id` = ? AND status = 'awaiting'
+                      ORDER BY `position`";
+            $user_ids = DBManager::get()->fetchFirst($query, [$course_id]);
+
+            foreach ($user_ids as $index => $user_id) {
+                $query = "UPDATE `admission_seminar_user`
+                          SET `position` = ?
+                          WHERE `seminar_id` = ? AND `user_id` = ?";
+                DBManager::get()->execute($query, [
+                    $index + 1,
+                    $course_id,
+                    $user_id
+                ]);
+            }
+        }
+    }
+}
diff --git a/lib/models/CourseMember.class.php b/lib/models/CourseMember.class.php
index dc3a8fb9930..e905d4b6806 100644
--- a/lib/models/CourseMember.class.php
+++ b/lib/models/CourseMember.class.php
@@ -380,12 +380,8 @@ class CourseMember extends SimpleORMap implements PrivacyObject
         $admission_comment = '';
         $mkdate = time();
 
-        $admission_user = AdmissionApplication::find([$seminar_id, $user_id]);
+        $admission_user = AdmissionApplication::find([$user_id, $seminar_id]);
         if ($admission_user) {
-            // copy the studycourse from admission_seminar_user
-            if ($copy_studycourse && $admission_user->studiengang_id) {
-                $contingent = $admission_user->studiengang_id;
-            }
             $admission_status = $admission_user->status;
             $admission_comment = $admission_user->comment ?? '';
             $mkdate = $admission_user->mkdate;
-- 
GitLab