diff --git a/application/config/navigation.php b/application/config/navigation.php index 033a65f86..957bdbdae 100644 --- a/application/config/navigation.php +++ b/application/config/navigation.php @@ -119,6 +119,13 @@ $config['navigation_header'] = array( 'expand' => true, 'sort' => 30, 'requiredPermissions' => 'system/issues_verwalten:r' + ), + 'gruppenmanagement' => array( + 'link' => site_url('person/Gruppenmanagement'), + 'description' => 'Gruppenmanagement', + 'expand' => true, + 'sort' => 40, + 'requiredPermissions' => 'lehre/gruppenmanager:r' ) ) ), diff --git a/application/controllers/person/Gruppenmanagement.php b/application/controllers/person/Gruppenmanagement.php new file mode 100644 index 000000000..8e8e22d41 --- /dev/null +++ b/application/controllers/person/Gruppenmanagement.php @@ -0,0 +1,254 @@ + 'lehre/gruppenmanager:r', + 'showBenutzergruppe' => 'lehre/gruppenmanager:r', + 'getBenutzer' => 'lehre/gruppenmanager:r', + 'getAllBenutzer' => 'lehre/gruppenmanager:r', + 'addBenutzer' => 'lehre/gruppenmanager:rw', + 'removeBenutzer' => 'lehre/gruppenmanager:rw' + ) + ); + + // Loads models + $this->load->model('person/benutzer_model', 'BenutzerModel'); + $this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel'); + $this->load->model('person/benutzergruppe_model', 'BenutzergruppeModel'); + $this->load->model('system/Log_model', 'LogModel'); + + $this->load->library('WidgetLib'); + $this->loadPhrases( + array( + 'global', + 'person', + 'lehre', + 'ui', + 'filter', + 'gruppenmanagement' + ) + ); + + $this->setControllerId(); // sets the controller id + $this->_setAuthUID(); // sets property uid + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * Main page + */ + public function index() + { + $this->load->view( + 'person/gruppenmanagement/gruppenmanagement.php', + array('uid' => $this->_uid) + ); + } + + /** + * Shows Benutzergruppe overview page. + */ + public function showBenutzergruppe() + { + $this->_setNavigationMenuShowDetails(); + $gruppe_kurzbz = $this->input->get('gruppe_kurzbz'); + + $data[self::FHC_CONTROLLER_ID] = $this->getControllerId(); + + $this->load->view( + 'person/gruppenmanagement/benutzergruppe.php', + array('gruppe_kurzbz' => $gruppe_kurzbz) + ); + } + + /** + * Gets Benutzer assigned to a Gruppe + */ + public function getBenutzer() + { + $gruppe_kurzbz = $this->input->get('gruppe_kurzbz'); + + $this->BenutzergruppeModel->addSelect('uid, vorname, nachname, ben.aktiv'); + $this->BenutzergruppeModel->addJoin('public.tbl_benutzer ben', 'uid'); + $this->BenutzergruppeModel->addJoin('public.tbl_person', 'person_id'); + $benutzerRes = $this->BenutzergruppeModel->loadWhere(array('gruppe_kurzbz' => $gruppe_kurzbz)); + + $this->outputJson($benutzerRes); + } + + /** + * Gets all Benutzer for assignment to Gruppe + */ + public function getAllBenutzer() + { + $this->BenutzerModel->addSelect('uid, vorname, nachname'); + $this->BenutzerModel->addJoin('public.tbl_person', 'person_id'); + $benutzerRes = $this->BenutzerModel->loadWhere( + array('tbl_benutzer.aktiv' => true) + ); + $this->outputJson($benutzerRes); + } + + /** + * Adds a Benutzer to Gruppe + */ + public function addBenutzer() + { + $uid = $this->input->post('uid'); + $gruppe_kurzbz = $this->input->post('gruppe_kurzbz'); + + if (isEmptyString($uid)) + $result = error('Uid missing'); + else + { + $benutzerExistsRes = $this->BenutzergruppeModel->loadWhere( + array( + 'uid' => $uid, + 'gruppe_kurzbz' => $gruppe_kurzbz + ) + ); + + if (isError($benutzerExistsRes)) + { + $this->outputJsonError(getError($benutzerExistsRes)); + return; + } + + if (hasData($benutzerExistsRes)) + { + $this->outputJsonError($this->p->t('gruppenmanagement', 'benutzerSchonZugewiesen')); + return; + } + + $result = $this->BenutzergruppeModel->insert( + array( + 'uid' => $uid, + 'gruppe_kurzbz' => $gruppe_kurzbz, + 'insertamum' => date('Y-m-d H:i:s'), + 'insertvon' => $this->_uid + ) + ); + + // log the group add + $lastQry = $this->db->last_query(); + + if (isSuccess($result)) + { + $beschreibung = 'Gruppenmanagement: Nutzer zu Gruppe hinzugefügt'; + $this->_writeLog($this->_uid, $beschreibung, $lastQry); + } + } + + $this->outputJson($result); + } + + /** + * Removes Benutzer from Gruppe + */ + public function removeBenutzer() + { + $uid = $this->input->post('uid'); + $gruppe_kurzbz = $this->input->post('gruppe_kurzbz'); + + if (isEmptyString($uid)) + $result = error('Uid missing'); + else + { + $result = $this->BenutzergruppeModel->delete( + array( + 'uid' => $uid, + 'gruppe_kurzbz' => $gruppe_kurzbz + ) + ); + } + + // log the group remove + $lastQry = $this->db->last_query(); + + if (isSuccess($result)) + { + $beschreibung = 'Gruppenmanagement: Nutzer aus Gruppe entfernt'; + $this->_writeLog($this->_uid, $beschreibung, $lastQry); + } + + $this->outputJson($result); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + + /** + * Define the navigation menu for the showDetails page + */ + private function _setNavigationMenuShowDetails() + { + $this->load->library('NavigationLib', array('navigation_page' => 'person/Gruppenmanagement/showBenutzergruppe')); + + $link = site_url('person/Gruppenmanagement'); + + $this->navigationlib->setSessionMenu( + array( + 'back' => $this->navigationlib->oneLevel( + 'Zurück', // description + $link, // link + array(), // children + 'angle-left', // icon + true, // expand + null, // subscriptDescription + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 1 // sort + ) + ) + ); + } + + /** + * Set uid of authentificated user + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } + + /** + * Writes an entry in the log table + */ + private function _writeLog($uid, $beschreibung, $lastQry) + { + $mitarbeiterResult = $this->MitarbeiterModel->load(array('mitarbeiter_uid'=>$this->_uid)); + + if(!isSuccess($mitarbeiterResult) || !hasData($mitarbeiterResult)) + { + $uid = DUMMY_LEKTOR_UID; + $beschreibung .= ': '.$this->_uid; + $beschreibung = mb_substr($beschreibung, 0, 64); + } + + $this->LogModel->insert(array( + 'mitarbeiter_uid' => $uid, + 'beschreibung' => $beschreibung, + 'sql' => $lastQry + )); + } + +} diff --git a/application/views/person/gruppenmanagement/benutzergruppe.php b/application/views/person/gruppenmanagement/benutzergruppe.php new file mode 100644 index 000000000..0096f8d52 --- /dev/null +++ b/application/views/person/gruppenmanagement/benutzergruppe.php @@ -0,0 +1,75 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Benutzer in Gruppe', + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'sbadmintemplate' => true, + 'tablesorter' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'navigationwidget' => true, + 'phrases' => array( + 'gruppenmanagement', + 'ui' + ), + 'customCSSs' => 'public/css/sbadmin2/tablesort_bootstrap.css', + 'customJSs' => array('public/js/bootstrapper.js', 'public/js/tablesort/tablesort.js', 'public/js/person/benutzergruppe.js') + ) + ); +?> + + +
+ + widgetlib->widget('NavigationWidget'); ?> + +
+
+
+
+ +
+
+
+
+
+
+ + + + + + +
+
+
+
+
+
+ + + + + + + + + + +
Uidp->t('person', 'vorname')); ?>p->t('person', 'nachname')); ?>p->t('gruppenmanagement', 'aktiv')); ?>p->t('ui', 'entfernen')); ?>
+
+
+
+
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/person/gruppenmanagement/gruppenmanagement.php b/application/views/person/gruppenmanagement/gruppenmanagement.php new file mode 100644 index 000000000..32416eb86 --- /dev/null +++ b/application/views/person/gruppenmanagement/gruppenmanagement.php @@ -0,0 +1,46 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Gruppenmanagement', + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'sbadmintemplate' => true, + 'tablesorter' => true, + 'ajaxlib' => true, + 'filterwidget' => true, + 'navigationwidget' => true, + 'phrases' => array( + 'ui' + ), + 'customCSSs' => 'public/css/sbadmin2/tablesort_bootstrap.css', + 'customJSs' => array('public/js/bootstrapper.js') + ) + ); +?> + + +
+ + widgetlib->widget('NavigationWidget'); ?> + +
+
+
+
+ +
+
+
+ load->view('person/gruppenmanagement/gruppenmanagementData.php'); ?> +
+
+
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/person/gruppenmanagement/gruppenmanagementData.php b/application/views/person/gruppenmanagement/gruppenmanagementData.php new file mode 100644 index 000000000..2a07f85f7 --- /dev/null +++ b/application/views/person/gruppenmanagement/gruppenmanagementData.php @@ -0,0 +1,66 @@ + ' + SELECT gruppe_kurzbz, grp.bezeichnung AS gruppe_bezeichnung, grp.beschreibung AS gruppe_beschreibung, + studiengang_kz, UPPER(stg.typ||stg.kurzbz) AS studiengang_kurzbz, semester, sichtbar, lehre, grp.aktiv, mailgrp, generiert + FROM public.tbl_gruppe grp + JOIN public.tbl_studiengang stg USING (studiengang_kz) + JOIN public.tbl_gruppe_manager grpmgr USING (gruppe_kurzbz) + WHERE grp.aktiv = TRUE + AND grpmgr.uid = \''.$uid.'\'', + 'requiredPermissions' => 'lehre/gruppenmanager', + 'datasetRepresentation' => 'tablesorter', + 'additionalColumns' => array('Teilnehmer'), + 'columnsAliases' => array( + ucfirst($this->p->t('gruppenmanagement', 'kurzbezeichnung')), + ucfirst($this->p->t('gruppenmanagement', 'bezeichnung')), + ucfirst($this->p->t('gruppenmanagement', 'beschreibung')), + ucfirst($this->p->t('lehre', 'studiengangskennzahlLehre')), + ucfirst($this->p->t('lehre', 'studiengang')), + ucfirst($this->p->t('lehre', 'semester')), + 'Sichtbar', + 'Lehre', + 'Aktiv', + 'Mailgrp', + 'Generiert' + ), + 'formatRow' => function($datasetRaw) { + + /* NOTE: Dont use $this here for PHP Version compatibility */ + $datasetRaw->{'Teilnehmer'} = sprintf( + ''.$this->p->t('gruppenmanagement', 'zuweisenloeschen').'', + site_url('person/Gruppenmanagement/showBenutzergruppe'), + $datasetRaw->{'gruppe_kurzbz'}, + 'index', + (isset($_GET['fhc_controller_id'])?$_GET['fhc_controller_id']:'') + ); + + if ($datasetRaw->{'gruppe_bezeichnung'} == null) + { + $datasetRaw->{'gruppe_bezeichnung'} = '-'; + } + if ($datasetRaw->{'gruppe_beschreibung'} == null) + { + $datasetRaw->{'gruppe_beschreibung'} = '-'; + } + if ($datasetRaw->{'semester'} == null) + { + $datasetRaw->{'semester'} = '-'; + } + $datasetRaw->{'sichtbar'} = $datasetRaw->{'sichtbar'} == 'true' ? 'ja' : 'nein'; + $datasetRaw->{'lehre'} = $datasetRaw->{'lehre'} == 'true' ? 'ja' : 'nein'; + $datasetRaw->{'aktiv'} = $datasetRaw->{'aktiv'} == 'true' ? 'ja' : 'nein'; + $datasetRaw->{'mailgrp'} = $datasetRaw->{'mailgrp'} == 'true' ? 'ja' : 'nein'; + $datasetRaw->{'generiert'} = $datasetRaw->{'generiert'} == 'true' ? 'ja' : 'nein'; + + return $datasetRaw; + } + ); + + $filterWidgetArray['app'] = 'core'; + $filterWidgetArray['datasetName'] = 'gruppenmanagement'; + $filterWidgetArray['filterKurzbz'] = 'gruppenmanagement'; + $filterWidgetArray['filter_id'] = $this->input->get('filter_id'); + + echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray); +?> diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php index ed17a096d..0380ea8d5 100644 --- a/config/global.config-default.inc.php +++ b/config/global.config-default.inc.php @@ -258,6 +258,9 @@ define('STIP_USER_PASSWORD','password'); // Array mit Usern die nicht Kollidieren define('KOLLISIONSFREIE_USER',serialize(array('_DummyLektor'))); +// UID des Dummy Lektors +define('DUMMY_LEKTOR_UID','_DummyLektor'); + // Soll der Lageplan am Infoterminal angezeigt werden (true|false) //define('CIS_INFOSCREEN_LAGEPLAN_ANZEIGEN', true); diff --git a/include/gruppemanager.class.php b/include/gruppemanager.class.php new file mode 100644 index 000000000..009804204 --- /dev/null +++ b/include/gruppemanager.class.php @@ -0,0 +1,187 @@ +. + */ +require_once(dirname(__FILE__).'/basis_db.class.php'); + +class gruppemanager extends basis_db +{ + public $new; + + //Tabellenspalten + public $uid; // varchar(32) + public $gruppe_kurzbz; // varchar(32) + public $insertamum; // timestamp + public $insertvon; // varchar(32) + + public $uids = array(); // array + + /** + * Konstruktor - Laedt optional einen Gruppenmanager + * @param $uid + * @param $gruppe_kurzbz + */ + public function __construct($uid=null, $gruppe_kurzbz=null) + { + parent::__construct(); + + if(!is_null($gruppe_kurzbz) && !is_null($uid)) + $this->load($uid, $gruppe_kurzbz); + } + + /** + * Laedt die BenutzerGruppe + * @param uid, gruppe_kurzbz + * @return true wenn ok, false im Fehlerfall + */ + public function load($uid, $gruppe_kurzbz) + { + $qry = "SELECT * FROM public.tbl_gruppe_manager WHERE uid=".$this->db_add_param($uid)." AND gruppe_kurzbz=".$this->db_add_param($gruppe_kurzbz); + + if($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $this->uid = $row->uid; + $this->gruppe_kurzbz = $row->gruppe_kurzbz; + $this->insertamum = $row->insertamum; + $this->insertvon = $row->insertvon; + return true; + } + else + { + $this->errormsg = 'Es wurde kein Datensatz gefunden'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Laden des Datensatzes'; + return false; + } + } + + /** + * Laedt die Manager einer Benutzergruppe + * @param gruppe_kurzbz + * @return true wenn ok, false im Fehlerfall + */ + public function load_uids($gruppe_kurzbz) + { + $qry = "SELECT * FROM public.tbl_gruppe_manager + WHERE gruppe_kurzbz=".$this->db_add_param($gruppe_kurzbz); + + if ($this->db_query($qry)) + { + if ($this->db_num_rows() == 0) + return false; + else + { + while ($row = $this->db_fetch_object()) + { + $gm_obj = new gruppemanager(); + $gm_obj->uid = $row->uid; + $this->uids[] = $gm_obj; + } + return true; + } + } + else + { + $this->errormsg = 'Fehler beim Laden des Datensatzes'; + return false; + } + } + + /** + * Prueft die Variablen vor dem Speichern + * auf Gueltigkeit. + * @return true wenn ok, false im Fehlerfall + */ + protected function validate() + { + if(mb_strlen($this->uid)>32) + { + $this->errormsg = 'UID darf nich laenger als 32 Zeichen sein'; + return false; + } + if(mb_strlen($this->gruppe_kurzbz)>32) + { + $this->errormsg = 'Gruppe_kurzbz darf nicht laenger als 32 Zeichen sein'; + return false; + } + if(mb_strlen($this->insertvon)>32) + { + $this->errormsg = 'Insertvon darf nicht laenger als 32 Zeichen sein'; + return false; + } + + return true; + } + + /** + * Speichert GruppeManager in die Datenbank + * Wenn $new auf true gesetzt ist wird ein neuer Datensatz + * angelegt, ansonsten der Datensatz upgedated + * @return true wenn erfolgreich, false im Fehlerfall + */ + public function save() + { + //Variablen auf Gueltigkeit pruefen + if(!$this->validate()) + return false; + + $qry = 'INSERT INTO public.tbl_gruppe_manager (uid, gruppe_kurzbz, insertamum, insertvon) + VALUES('.$this->db_add_param($this->uid).','. + $this->db_add_param($this->gruppe_kurzbz).','. + $this->db_add_param($this->insertamum).','. + $this->db_add_param($this->insertvon).');'; + + if($this->db_query($qry)) + { + //Log schreiben + return true; + } + else + { + $this->errormsg = 'Fehler beim Speichern des GruppeManagers'; + return false; + } + } + + /** + * Loescht eine Gruppenmanagerzuordnung + * + * @param $uid + * @param $gruppe_kurzbz + * @return boolean + */ + public function delete($uid, $gruppe_kurzbz) + { + $qry = "DELETE FROM public.tbl_gruppe_manager WHERE uid=".$this->db_add_param($uid)." AND gruppe_kurzbz=".$this->db_add_param($gruppe_kurzbz); + + if($this->db_query($qry)) + return true; + else + { + $this->errormsg = 'Fehler beim Loeschen der Zuteilung'; + return false; + } + } +} +?> diff --git a/public/js/person/benutzergruppe.js b/public/js/person/benutzergruppe.js new file mode 100644 index 000000000..353cb6ea3 --- /dev/null +++ b/public/js/person/benutzergruppe.js @@ -0,0 +1,223 @@ +/** + * Javascript file for benutzergruppe management page + */ + +var Benutzergruppe = { + getBenutzer: function(gruppe_kurzbz) { + FHC_AjaxClient.ajaxCallGet( + 'person/gruppenmanagement/getBenutzer', + { + gruppe_kurzbz: gruppe_kurzbz + }, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); + return; + } + + let benutzerTable = $("#benutzer-table tbody"); + benutzerTable.empty(); + + if (FHC_AjaxClient.hasData(data)) + { + // save loaded data + let benutzerData = FHC_AjaxClient.getData(data); + + // fill table with Benutzer of Gruppe + for (let i = 0; i < benutzerData.length; i++) + { + let benutzer = benutzerData[i]; + benutzerTable.append( + ""+ + ""+benutzer.uid+""+ + ""+benutzer.vorname+""+ + ""+benutzer.nachname+""+ + ""+(benutzer.aktiv === true ? "Ja" : "Nein")+""+ + ""+ + ""+ + ""+ + "" + ); + + // add delete event to button + $("#"+benutzer.uid+"_benutzerLoeschen").click( + function() { + Benutzergruppe.removeBenutzer(benutzer.uid, gruppe_kurzbz); + } + ) + } + } + + // add tablesorter to benutzergruppe table + Benutzergruppe._setTablesorter(); + }, + errorCallback: function(jqXHR, textStatus, errorThrown) { + FHC_DialogLib.alertError(textStatus); + } + } + ); + }, + getAllBenutzer: function() { + FHC_AjaxClient.ajaxCallGet( + 'person/gruppenmanagement/getAllBenutzer', + null, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); + return; + } + + if (FHC_AjaxClient.hasData(data)) + { + benutzerArr = []; + + // save loaded data + let benutzerData = FHC_AjaxClient.getData(data); + + for (let i = 0; i < benutzerData.length; i++) + { + let ben = benutzerData[i]; + + benutzerArr.push( + { + vorname: ben.vorname, + nachname: ben.nachname, + uid: ben.uid, + label: ben.nachname + " " + ben.vorname + " (" + ben.uid + ")", + id: ben.uid + } + ); + } + + // callback for searching source mitarbeiter array correctly + let sourceCallback = function(request, response) + { + // case insensitive matcher + let matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i"); + + // match vorname nachname OR nachname vorname OR uid + response($.grep(benutzerArr, function (value) { + return matcher.test(value.nachname + ' '+value.vorname + ' ' + value.nachname) + || matcher.test(value.uid); + })); + } + + // fill autocomplete field with benutzer data + Benutzergruppe._fillAutocomplete( + 'teilnehmerSelect', + 'teilnehmer_uid', + sourceCallback + ); + } + }, + errorCallback: function(jqXHR, textStatus, errorThrown) { + FHC_DialogLib.alertError(textStatus); + } + } + ); + }, + addBenutzer: function(uid, gruppe_kurzbz) { + FHC_AjaxClient.ajaxCallPost( + 'person/gruppenmanagement/addBenutzer', + { + uid: uid, + gruppe_kurzbz: gruppe_kurzbz + }, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); + return; + } + + if (FHC_AjaxClient.hasData(data)) + { + // load Benutzer after add to show change + Benutzergruppe.getBenutzer(gruppe_kurzbz); + } + }, + errorCallback: function(jqXHR, textStatus, errorThrown) { + FHC_DialogLib.alertError(textStatus); + } + } + ); + }, + removeBenutzer: function(uid, gruppe_kurzbz) { + FHC_AjaxClient.ajaxCallPost( + 'person/gruppenmanagement/removeBenutzer', + { + uid: uid, + gruppe_kurzbz: gruppe_kurzbz + }, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); + return; + } + + if (FHC_AjaxClient.hasData(data)) + { + // load Benutzer after remove to show change + Benutzergruppe.getBenutzer(gruppe_kurzbz); + } + }, + errorCallback: function(jqXHR, textStatus, errorThrown) { + FHC_DialogLib.alertError(textStatus); + } + } + ); + }, + _fillAutocomplete: function(autocompleteId, idFieldId, source) { + // jQuery ui autocomplete for benutzer + $("#"+autocompleteId).autocomplete( + { + // custom matcher + source: source, + autoFocus: true, + select: function(event, ui) + { + // when autocmplete entry selected, display label text in autocomplete, fill hidden value field + $("#"+autocompleteId).val(ui.item.label); + $("#"+idFieldId).val(ui.item.id); + return false; + } + } + ); + }, + _setTablesorter: function() { + Tablesort.addTablesorter( + // sort by first and third column asc, show filters beggining with 2 Benutzer, exclude fifth column from filter + "benutzer-table", [[0,0], [2,0]], ["filter", "zebra"], 2, {headers: {4: {filter: false}}} + ) + } +}; + +/** + * When JQuery is up + */ +$(document).ready(function() { + // get the group name + let gruppe_kurzbz = $("#gruppe_kurzbz").val(); + + // load Benutzer for autocomplete selection + Benutzergruppe.getAllBenutzer(); + // load Benutzer for table + Benutzergruppe.getBenutzer(gruppe_kurzbz); + + // add click event to "add Benutzer" button + $("#teilnehmerHinzufuegen").click(function(){ + let uid = $("#teilnehmer_uid").val(); + Benutzergruppe.addBenutzer(uid, gruppe_kurzbz); + $("#teilnehmerSelect").val(''); + } + ); +}); diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 2fa96748b..e0168aa28 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -6243,6 +6243,72 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht } } +// Creates table public.tbl_gruppe_manager if it doesn't exist and grants privileges +if (!$result = @$db->db_query('SELECT 1 FROM public.tbl_gruppe_manager LIMIT 1')) +{ + $qry = 'CREATE TABLE public.tbl_gruppe_manager ( + gruppe_manager_id integer, + gruppe_kurzbz varchar(32) NOT NULL, + uid varchar(32) NOT NULL, + insertamum timestamp DEFAULT NOW(), + insertvon varchar(32) + ); + + COMMENT ON TABLE public.tbl_gruppe_manager IS \'Table to save assignments groups to their managers.\'; + COMMENT ON COLUMN public.tbl_gruppe_manager.gruppe_kurzbz IS \'Name of group\'; + COMMENT ON COLUMN public.tbl_gruppe_manager.uid IS \'User id of group manager\'; + + CREATE SEQUENCE public.seq_gruppe_manager_gruppe_manager_id + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + ALTER TABLE public.tbl_gruppe_manager ALTER COLUMN gruppe_manager_id SET DEFAULT nextval(\'public.seq_gruppe_manager_gruppe_manager_id\'::regclass); + + GRANT SELECT, UPDATE ON SEQUENCE public.seq_gruppe_manager_gruppe_manager_id TO vilesci; + GRANT SELECT, UPDATE ON SEQUENCE public.seq_gruppe_manager_gruppe_manager_id TO fhcomplete; + + ALTER TABLE public.tbl_gruppe_manager ADD CONSTRAINT pk_gruppe_manager PRIMARY KEY (gruppe_manager_id); + + ALTER TABLE public.tbl_gruppe_manager ADD CONSTRAINT fk_gruppe_manager_gruppe_kurzbz FOREIGN KEY (gruppe_kurzbz) REFERENCES public.tbl_gruppe(gruppe_kurzbz) ON UPDATE CASCADE ON DELETE CASCADE; + ALTER TABLE public.tbl_gruppe_manager ADD CONSTRAINT fk_gruppe_manager_uid FOREIGN KEY (uid) REFERENCES public.tbl_benutzer(uid) ON UPDATE CASCADE ON DELETE RESTRICT; + + ALTER TABLE public.tbl_gruppe_manager ADD CONSTRAINT uk_gruppe_manager_gruppe_kurzbz_uid UNIQUE (gruppe_kurzbz, uid);'; + + if (!$db->db_query($qry)) + echo 'public.tbl_gruppe_manager: '.$db->db_last_error().'
'; + else + echo '
public.tbl_gruppe_manager table created'; + + $qry = 'GRANT SELECT ON TABLE public.tbl_gruppe_manager TO web;'; + if (!$db->db_query($qry)) + echo 'public.tbl_gruppe_manager: '.$db->db_last_error().'
'; + else + echo '
Granted privileges to web on public.tbl_gruppe_manager'; + + $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.tbl_gruppe_manager TO vilesci;'; + if (!$db->db_query($qry)) + echo 'public.tbl_gruppe_manager: '.$db->db_last_error().'
'; + else + echo '
Granted privileges to vilesci on public.tbl_gruppe_manager'; +} + +// Add permission for managing user groups +if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'lehre/gruppenmanager';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('lehre/gruppenmanager', 'Manager einer Gruppe werden und die Gruppe verwalten');"; + + if(!$db->db_query($qry)) + echo 'system.tbl_berechtigung '.$db->db_last_error().'
'; + else + echo ' system.tbl_berechtigung: Added permission for lehre/gruppenmanager
'; + } +} + // NOTE(chris): Add "Template" to "Lehrtyp" if($result = @$db->db_query("SELECT 1 FROM lehre.tbl_lehrtyp WHERE bezeichnung = 'Template';")) { diff --git a/system/filtersupdate.php b/system/filtersupdate.php index abe8ac1a5..02c30b648 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1112,6 +1112,27 @@ $filters = array( } ', 'oe_kurzbz' => null + ), + array( + 'app' => 'core', + 'dataset_name' => 'gruppenmanagement', + 'filter_kurzbz' => 'gruppenmanagement', + 'description' => '{Meine Gruppen}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "gruppenmanagement", + "columns": [ + {"name": "gruppe_kurzbz"}, + {"name": "gruppe_bezeichnung"}, + {"name": "gruppe_beschreibung"}, + {"name": "studiengang_kurzbz"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null, ) ); diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 2f62e4138..9e0a87b6e 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -16238,7 +16238,7 @@ array( 'sprache' => 'German', 'text' => 'Ab dem Studienjahr 2022/23 ist der Erwerb von internationalen und interkulturellen Kompetenzen Teil des Curriculums.
Auf der Grundlage der vorliegenden Maßnahmen absolvieren Sie im Laufe ihres Studiums Internationalisierungsaktivitäten, die mit unterschiedlichen ECTS-Punkten hinterlegt sind.
- In Summe müssen 5 ECTS erworben werden, die im 6. Semester wirksam werden.
+ In Summe müssen 5 ECTS erworben werden, die im 6. Semester wirksam werden.
Das Modul „International skills“ wird mit der Beurteilung „Mit Erfolg teilgenommen“ abgeschlossen.
Bitte wählen Sie die für Sie in Frage kommenden Maßnahmen aus und planen Sie das entsprechende Semester.
Sobald die 5 ECTS erreicht wurden, überprüft der Studiengang die von Ihnen hochgeladenen Dokumente.', @@ -16758,6 +16758,186 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'benutzerSchonZugewiesen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Benutzer ist bereits der Gruppe zugewiesen", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "User is already assigned to the group", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'gruppenmanagement', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Gruppenmanagement", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Group management", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'kurzbezeichnung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Kurzbezeichnung", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Short description", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'bezeichnung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Bezeichnung", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Name", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'beschreibung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Beschreibung", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Description", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'zuweisenloeschen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Zuweisen/Entfernen", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Assign/Remove", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'benutzergruppe', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Benutzergruppe", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "User group", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'benutzerHinzufuegen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Benutzer hinzufügen", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Add user", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'gruppenmanagement', + 'phrase' => 'aktiv', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "aktiv", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "active", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ) ); diff --git a/vilesci/lehre/einheit_menu.php b/vilesci/lehre/einheit_menu.php index bfb44e8d9..a6e09fe23 100644 --- a/vilesci/lehre/einheit_menu.php +++ b/vilesci/lehre/einheit_menu.php @@ -24,6 +24,7 @@ require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/studiengang.class.php'); require_once('../../include/gruppe.class.php'); +require_once('../../include/gruppemanager.class.php'); require_once('../../include/person.class.php'); require_once('../../include/benutzer.class.php'); require_once('../../include/student.class.php'); @@ -82,17 +83,59 @@ if(!$rechte->isBerechtigt('lehre/gruppe', null, 's')) Gruppe-Verwaltung + - + %s - %s %s " + ."Manager entfernen" + ."" + .""; + ?> + @@ -158,8 +301,10 @@ else if (isset($_GET['type']) && $_GET['type']=='delete') if($rechte->isBerechtigt('lehre/gruppe', $oe_studiengang, 'suid')) { + $grp_kurzbz = $_GET['einheit_id']; + $e=new gruppe(); - if(!$e->delete($_GET['einheit_id'])) + if(!$e->delete($grp_kurzbz)) echo $e->errormsg; } else @@ -214,6 +359,7 @@ function printDropDown() echo ''; echo ''; } + function doSave() { global $rechte; @@ -241,8 +387,10 @@ function doSave() $e->new = false; } + $user = get_uid(); + $e->updateamum = date('Y-m-d H:i:s'); - $e->updatevon = get_uid(); + $e->updatevon = $user; $e->bezeichnung = $_POST['bezeichnung']; $e->beschreibung = $_POST['beschreibung']; $e->studiengang_kz = $_POST['studiengang_kz']; @@ -258,13 +406,66 @@ function doSave() $e->sort = $_POST['sort']; $e->content_visible = isset($_POST['content_visible']); + + // gruppemanager immer array, leer wenn keine angegeben + $gruppemanager_uids = isset($_POST['gruppemanager']) && is_array($_POST['gruppemanager']) ? $_POST['gruppemanager'] : array(); + + // Prüfung: generierte Gruppen haben keine Manager + if (count($gruppemanager_uids) > 0 && $e->generiert === true) + { + echo "Generierte Gruppen dürfen keine Administratoren haben!"; + return; + } + if(!$e->save()) - echo $e->errormsg; + echo "".$e->errormsg.""; + else // wenn Gruppe erfolgreich gespeichert, Gruppenmanager speichern + { + // Gruppe gemäss Konvention in Großbuchstaben + $gruppe_kurzbz = mb_strtoupper($_POST['kurzbz']); + + // bestehende Gruppenmanager laden + $bestehende_gruppemanager_uids = array(); + $gruppemanager_hlp = new gruppemanager(); + if ($gruppemanager_hlp->load_uids($gruppe_kurzbz)) + { + foreach ($gruppemanager_hlp->uids as $uid_obj) + { + $bestehende_gruppemanager_uids[] = $uid_obj->uid; + } + } + + foreach ($gruppemanager_uids as $gruppemanager_uid) + { + // wenn Gruppenmanager noch nicht zugewiesen + if (!in_array($gruppemanager_uid, $bestehende_gruppemanager_uids)) + { + // Gruppemanager speichern + $gruppemgr = new gruppemanager(); + $gruppemgr->uid = $gruppemanager_uid; + $gruppemgr->gruppe_kurzbz = $gruppe_kurzbz; + $gruppemgr->insertamum = date('Y-m-d H:i:s'); + $gruppemgr->insertvon = $user; + + if(!$gruppemgr->save()) + echo $gruppemgr->errormsg; + } + } + + // zu löschende Gruppemanager ermitteln + $geloeschte_gruppemanager_uids = array_diff($bestehende_gruppemanager_uids, $gruppemanager_uids); + + // Nicht mehr vorhandene Gruppenmanager löschen + $gruppemanager_hlp = new gruppemanager(); + foreach ($geloeschte_gruppemanager_uids as $geloeschte_uid) + { + if (!$gruppemanager_hlp->delete($geloeschte_uid, $gruppe_kurzbz)) + echo $gruppemanager_hlp->errormsg; + } + } } } - - function doEdit($kurzbz,$new=false) { global $db, $rechte, $studiengang, $searchItems; @@ -282,6 +483,9 @@ function doEdit($kurzbz,$new=false)

Gruppe
+ + + @@ -341,6 +545,44 @@ function doEdit($kurzbz,$new=false) + + + load_uids($e->gruppe_kurzbz); + + // richtige Tabellenzeige Grösse wenn Administratoren vorhanden + if ($gruppemanager_uids_result === true) + { + $gruppemanagerCellClass = ' class="gruppenmanager-cell"'; + } + ?> + id="gruppenmanager-cell"> + + + Generierte Gruppen dürfen keine Administratoren haben. + + "; + // alle Manager der Gruppe anzeigen + if ($gruppemanager_uids_result === true) + { + $count = 1; + foreach ($gruppemanager_hlp->uids as $uid_obj) + { + $ben = new benutzer($uid_obj->uid); + // Vorlagestring durch Werte ersetzen und ausgeben + echo sprintf(MANAGER_HTML, $uid_obj->uid, $ben->vorname, $ben->nachname, $uid_obj->uid); + if ($count % 5 == 0) // neue Zeile nach 5 Elementen + echo "

"; + $count++; + } + } + ?> + +
+
Kurzbezeichnung
GruppenadministratorOptional, Administratoren, die Benutzer zur Gruppe entfernen/hinzufügen können
Semester