From c49ad387cf7881ad29cbc38a7a902498da372a42 Mon Sep 17 00:00:00 2001
From: Rasmus Fuhse <krassmus@gmail.com>
Date: Tue, 31 Mar 2020 16:57:28 +0200
Subject: [PATCH] add coursegroup support

---
 controllers/copy.php | 35 ++++++++++++++++++++++++++++++-----
 plugin.manifest      |  4 ++--
 views/copy/info.php  |  7 +++++++
 3 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/controllers/copy.php b/controllers/copy.php
index 6a075e6..9476018 100755
--- a/controllers/copy.php
+++ b/controllers/copy.php
@@ -19,6 +19,7 @@ class CopyController extends PluginController
         $this->semester = UserConfig::get($GLOBALS['user']->id)->COURSECOPY_SETTINGS_SEMESTER_ID
             ? Semester::find(UserConfig::get($GLOBALS['user']->id)->COURSECOPY_SETTINGS_SEMESTER_ID)
             : $this->semesters[0];
+        $this->have_coursegroups = true;
     }
 
     public function semester_start_und_ende_action($semester_id)
@@ -30,7 +31,12 @@ class CopyController extends PluginController
     public function process_action()
     {
         if (Request::isPost()) {
-            foreach (array("semester_id", "dozent_id", "lock_copied_courses", "invisible_copied_courses", "cycles", "resource_assignments", "week_offset", "end_offset", "copy_tutors") as $param) {
+            $params = [
+                "semester_id", "dozent_id", "lock_copied_courses",
+                "invisible_copied_courses", "cycles", "resource_assignments",
+                "week_offset", "end_offset", "copy_tutors", "with_children"
+            ];
+            foreach ($params as $param) {
                 $config_name = "COURSECOPY_SETTINGS_".strtoupper($param);
                 UserConfig::get($GLOBALS['user']->id)->store($config_name, Request::get($param));
             }
@@ -49,12 +55,30 @@ class CopyController extends PluginController
             if ($semester) {
                 $lock_copied_courses = Request::get('lock_copied_courses');
                 $invisible_copied_courses = Request::get('invisible_copied_courses');
-                foreach (Request::getArray("c") as $course_id) {
+                $course_ids = Request::getArray("c");
+                if (Request::get("with_children")) {
+                    $statement = DBManager::get()->prepare("
+                        SELECT DISTINCT Seminar_id
+                        FROM seminare
+                        WHERE seminare.parent_course IN (?)
+                    ");
+                    $statement->execute([$course_ids]);
+                    $course_ids = array_merge($course_ids, $statement->fetchAll(PDO::FETCH_COLUMN, 0));
+                    $course_ids = array_unique($course_ids);
+                    //remind that the children should now be at the end of the array
+                }
+                $copies = [];
+                foreach ($course_ids as $course_id) {
                     $oldcourse = Course::find($course_id);
 
                     if ($oldcourse) {
                         $newcourse = new Course();
                         $newcourse->setData($oldcourse->toArray());
+                        if ($newcourse['parent_course']) {
+                            $newcourse['parent_course'] = isset($copies[$newcourse['parent_course']])
+                                ? $copies[$newcourse['parent_course']]
+                                : null;
+                        }
                         $newcourse['chdate'] = time();
                         $newcourse['mkdate'] = time();
                         $newcourse->setId($newcourse->getNewId());
@@ -63,6 +87,7 @@ class CopyController extends PluginController
                             $newcourse['visible'] = 0;
                         }
                         $newcourse->store();
+                        $copies[$course_id] = $newcourse->getId();
 
                         //copy avatar
                         if (CourseAvatar::getAvatar($course_id)->is_customized()) {
@@ -174,7 +199,7 @@ class CopyController extends PluginController
                                     SELECT date_typ
                                     FROM (
                                         SELECT termine.date_typ, COUNT(*) AS number
-                                        FROM termine 
+                                        FROM termine
                                         WHERE termine.metadate_id = :metadate_id
                                         GROUP BY termine.date_typ
                                     ) AS counter
@@ -203,10 +228,10 @@ class CopyController extends PluginController
 
                                 if (Request::get("resource_assignments")) {
                                     $statement = DBManager::get()->prepare("
-                                        SELECT resource_id 
+                                        SELECT resource_id
                                         FROM (
                                             SELECT resource_id, COUNT(*) AS number
-                                            FROM termine 
+                                            FROM termine
                                                 INNER JOIN resources_assign ON (resources_assign.assign_user_id = termine.termin_id)
                                             WHERE termine.metadate_id = :metadate_id
                                             GROUP BY resources_assign.resource_id
diff --git a/plugin.manifest b/plugin.manifest
index 27e9c9e..a5fa476 100755
--- a/plugin.manifest
+++ b/plugin.manifest
@@ -1,6 +1,6 @@
 pluginname=CourseCopy
 pluginclassname=CourseCopy
-version=1.4
+version=1.5
 origin=data-quest
 studipMinVersion=4.0
-studipMaxVersion=4.99.99
\ No newline at end of file
+studipMaxVersion=4.99.99
diff --git a/views/copy/info.php b/views/copy/info.php
index c37e1ca..fb2d3cd 100755
--- a/views/copy/info.php
+++ b/views/copy/info.php
@@ -48,6 +48,13 @@
                 <input type="checkbox" name="invisible_copied_courses" value="1"<?= UserConfig::get($GLOBALS['user']->id)->COURSECOPY_SETTINGS_INVISIBLE_COPIED_COURSES ? " checked" : "" ?>>
                 <?= _('Kopierte Veranstaltungen unsichtbar schalten') ?>
             </label>
+
+            <? if ($have_coursegroups) : ?>
+                <label>
+                    <input type="checkbox" name="with_children" value="1"<?= UserConfig::get($GLOBALS['user']->id)->COURSECOPY_SETTINGS_WITH_CHILDREN ? " checked" : "" ?>>
+                    <?= _("Veranstaltungsgruppen inklusive Kindveranstaltungen kopieren") ?>
+                </label>
+            <? endif ?>
         </label>
 
     </fieldset>
-- 
GitLab