From 0565945451e03b65cdb14be8a210a4d9a2213926 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Tue, 2 May 2023 14:26:44 +0000
Subject: [PATCH] allow forcing of 'manual auto insert', fixes #2576

Closes #2576

Merge request studip/studip!1735
---
 app/controllers/admin/autoinsert.php  | 16 ++++++----
 app/views/admin/autoinsert/manual.php | 45 +++++++++++++++++++--------
 lib/classes/AutoInsert.class.php      | 11 +++----
 3 files changed, 47 insertions(+), 25 deletions(-)

diff --git a/app/controllers/admin/autoinsert.php b/app/controllers/admin/autoinsert.php
index 70464e17d58..f89979555ad 100644
--- a/app/controllers/admin/autoinsert.php
+++ b/app/controllers/admin/autoinsert.php
@@ -149,14 +149,17 @@ class Admin_AutoinsertController extends AuthenticatedController
         $this->seminar_search = [];
 
         PageLayout::setTitle(_('Manuelles Eintragen von Nutzergruppen in Veranstaltungen'));
-        if (Request::submitted('submit')) {
+        if (Request::submittedSome('submit', 'force')) {
             $filters = array_filter(Request::getArray('filter'));
-            if (!Request::get('sem_id') || Request::get('sem_id') == 'false') {
+            $force = Request::bool('force', false);
+            $seminar_id = Request::option('sem_id');
+
+            if (!$seminar_id || $seminar_id === 'false') {
                 PageLayout::postError(_('Ungültiger Aufruf'));
             } elseif (!count($filters)) {
                 PageLayout::postError(_('Keine Filterkriterien gewählt'));
             } else {
-                $seminar = Seminar::GetInstance(Request::option('sem_id'));
+                $seminar = Seminar::GetInstance($seminar_id);
 
                 $userlookup = new UserLookup();
                 foreach ($filters as $type => $values) {
@@ -166,9 +169,9 @@ class Admin_AutoinsertController extends AuthenticatedController
                 $real_users = 0;
 
                 foreach ($user_ids as $user_id) {
-                    if (!AutoInsert::checkAutoInsertUser(Request::option('sem_id'), $user_id)) {
-                        $seminar->addMember($user_id);
-                        $real_users += AutoInsert::saveAutoInsertUser(Request::option('sem_id'), $user_id);
+                    if ($force || !AutoInsert::checkAutoInsertUser($seminar_id, $user_id)) {
+                        $real_users += $seminar->addMember($user_id) ? 1 : 0;
+                        AutoInsert::saveAutoInsertUser($seminar_id, $user_id);
                     }
                 }
 
@@ -192,6 +195,7 @@ class Admin_AutoinsertController extends AuthenticatedController
                 }
 
                 $this->redirect('admin/autoinsert/manual');
+                return;
             }
         }
 
diff --git a/app/views/admin/autoinsert/manual.php b/app/views/admin/autoinsert/manual.php
index c06454830a8..dd0f834bdde 100644
--- a/app/views/admin/autoinsert/manual.php
+++ b/app/views/admin/autoinsert/manual.php
@@ -134,6 +134,25 @@
                 </tr>
                 </tbody>
             <? endif ?>
+            <thead>
+                <tr>
+                    <th colspan="3"><?= _('Einstellungen') ?></th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr>
+                    <td colspan="3">
+                        <label>
+                            <input type="checkbox" name="force" value="1">
+                            <?= _('Eintragung forcieren') ?>
+                            <?= tooltipIcon(implode("\n", [
+                                _('Ãœber diese Einstellung kann forciert werden, dass alle gefundenen Personen in die Veranstaltung eingetragen werden.'),
+                                _('Ansonsten werden nur die Personen eingetragen, die bislang noch nicht über diesen Mechanismus eingetragen wurden.'),
+                            ])) ?>
+                        </label>
+                    </td>
+                </tr>
+            </tbody>
             <tfoot>
             <tr>
                 <td colspan="3">
@@ -157,20 +176,20 @@
                 if (!$(this).next().length || !$(this).next().is('span')) {
                     $(this).after($('<span id="autoinsert_count" style="vertical-align: middle;"/>'));
                 }
-                $.getJSON('<?= $controller->manual_count() ?>',
-                    $(this).closest('form').serializeArray(),
-                    function (json) {
-                        var result = "";
-                        if (!json || json.error) {
-                            result = '<?= _('Fehler') ?>: ';
-                            result += json.error || '<?= _('Fehler bei der Ãœbertragung') ?>';
-                        } else {
-                            result = '<?= _('Gefundene Nutzer') ?>: ';
-                            result += "<strong>" + json.users + "</strong>";
-                        }
-                        $('#autoinsert_count').html(result);
+                $.getJSON(
+                    '<?= $controller->manual_count() ?>',
+                    $(this).closest('form').serializeArray()
+                ).done(function (json) {
+                    let result = '';
+                    if (!json || json.error) {
+                        result = '<?= _('Fehler') ?>: ';
+                        result += json.error || '<?= _('Fehler bei der Ãœbertragung') ?>';
+                    } else {
+                        result = '<?= _('Gefundene Personen') ?>: ';
+                        result += "<strong>" + json.users + "</strong>";
                     }
-                );
+                    $('#autoinsert_count').html(' ' + result);
+                });
                 event.preventDefault();
             });
             $('input[name^=remove_filter]').click(function (event) {
diff --git a/lib/classes/AutoInsert.class.php b/lib/classes/AutoInsert.class.php
index 417e6ffa518..fd0f7bba3c0 100644
--- a/lib/classes/AutoInsert.class.php
+++ b/lib/classes/AutoInsert.class.php
@@ -313,12 +313,11 @@ class AutoInsert
      */
     public static function saveAutoInsertUser($seminar_id, $user_id)
     {
-        $query     = "INSERT INTO auto_insert_user (Seminar_id, user_id, mkdate)
-                  SELECT ?, user_id, UNIX_TIMESTAMP() FROM auth_user_md5 WHERE
-                  user_id=? AND perms NOT IN('root','admin')";
-        $statement = DBManager::get()->prepare($query);
-        $statement->execute([$seminar_id, $user_id]);
-        return $statement->rowCount();
+        $query = "INSERT IGNORE INTO auto_insert_user (Seminar_id, user_id, mkdate)
+                  SELECT ?, user_id, UNIX_TIMESTAMP()
+                  FROM auth_user_md5
+                  WHERE user_id = ? AND perms NOT IN ('root','admin')";
+        return DBManager::get()->execute($query, [$seminar_id, $user_id]);
     }
 
     /**
-- 
GitLab