From 450b0b64339db9316e196676c474eccf981a1ea8 Mon Sep 17 00:00:00 2001 From: Manfred Date: Wed, 14 Sep 2022 15:55:07 +0200 Subject: [PATCH 01/88] Initial commit --- include/berechtigung.class.php | 37 + .../benutzerberechtigung_autocomplete.php | 116 ++ .../benutzerberechtigung_details.php | 1149 +++++++++++------ 3 files changed, 914 insertions(+), 388 deletions(-) create mode 100644 vilesci/stammdaten/benutzerberechtigung_autocomplete.php diff --git a/include/berechtigung.class.php b/include/berechtigung.class.php index 684ad4e81..ab224be4d 100644 --- a/include/berechtigung.class.php +++ b/include/berechtigung.class.php @@ -312,5 +312,42 @@ class berechtigung extends basis_db return false; } } + + /** + * Sucht nach Berechtigungen + * @param string $searchItem Suchbegriff + * @return boolean + */ + public function searchBerechtigungen($searchItem) + { + $this->result=array(); + $qry = 'SELECT * FROM system.tbl_berechtigung WHERE + ( + LOWER(berechtigung_kurzbz) LIKE LOWER(\'%'.$this->db_escape(($searchItem)).'%\') + OR + LOWER(beschreibung) LIKE LOWER(\'%'.$this->db_escape(($searchItem)).'%\') + )'; + + $qry .= ' ORDER BY berechtigung_kurzbz'; + + if($this->db_query($qry)) + { + while($row = $this->db_fetch_object()) + { + $obj = new berechtigung(); + + $obj->berechtigung_kurzbz = $row->berechtigung_kurzbz; + $obj->beschreibung = $row->beschreibung; + + $this->result[] = $obj; + } + return true; + } + else + { + $this->errormsg = 'Fehler beim Laden der Berechtigungen'; + return false; + } + } } ?> \ No newline at end of file diff --git a/vilesci/stammdaten/benutzerberechtigung_autocomplete.php b/vilesci/stammdaten/benutzerberechtigung_autocomplete.php new file mode 100644 index 000000000..07e57809e --- /dev/null +++ b/vilesci/stammdaten/benutzerberechtigung_autocomplete.php @@ -0,0 +1,116 @@ + + */ +require_once ('../../config/vilesci.config.inc.php'); +require_once ('../../include/functions.inc.php'); +require_once ('../../include/basis_db.class.php'); +require_once ('../../include/ort.class.php'); +require_once ('../../include/benutzer.class.php'); +require_once ('../../include/studiengang.class.php'); +require_once ('../../include/berechtigung.class.php'); +require_once ('../../include/organisationseinheit.class.php'); +require_once ('../../include/sprache.class.php'); + +if (! $db = new basis_db()) + die('Es konnte keine Verbindung zum Server aufgebaut werden.'); + +$uid = get_uid(); +$sprache = getSprache(); + +if (isset($_REQUEST['autocomplete']) && $_REQUEST['autocomplete'] == 'benutzer') +{ + $search = trim((isset($_REQUEST['term']) ? $_REQUEST['term'] : '')); + if (is_null($search) || $search == '') + exit(); + + $benutzer = new benutzer(); + + if ($benutzer->search(array( + $search + ))) + { + $result_obj = array(); + foreach ($benutzer->result as $row) + { + $item['vorname'] = html_entity_decode($row->vorname); + $item['nachname'] = html_entity_decode($row->nachname); + $item['uid'] = html_entity_decode($row->uid); + $result_obj[] = $item; + } + echo json_encode($result_obj); + } + exit(); +} + +if (isset($_REQUEST['autocomplete']) && $_REQUEST['autocomplete'] == 'berechtigung') +{ + $search = trim((isset($_REQUEST['term']) ? $_REQUEST['term'] : '')); + if (is_null($search) || $search == '') + exit(); + + $berechtigung = new berechtigung(); + + if ($berechtigung->searchBerechtigungen($search)) + { + $result_obj = array(); + foreach ($berechtigung->result as $row) + { + $item['berechtigung_kurzbz'] = html_entity_decode($row->berechtigung_kurzbz); + $item['beschreibung'] = html_entity_decode($row->beschreibung); + $result_obj[] = $item; + } + echo json_encode($result_obj); + } + exit(); +} + +if (isset($_REQUEST['autocomplete']) && $_REQUEST['autocomplete'] == 'oe_kurzbz') +{ + $search = trim((isset($_REQUEST['term']) ? $_REQUEST['term'] : '')); + if (is_null($search) || $search == '') + exit(); + + $search = array($search); + $oe = new organisationseinheit(); + $oe->search($search); + + $stg = new studiengang(); + $stg->search($search); + foreach($stg->result as $row) + { + if($row->aktiv===true) + $oe->result[] = new organisationseinheit($row->oe_kurzbz); + } + + if(is_array($oe->result) && count($oe->result) > 0) + { + $result_obj = array(); + foreach($oe->result as $row) + { + if($row->aktiv==true) + { + $item['oe_kurzbz'] = html_entity_decode($row->oe_kurzbz); + $item['organisationseinheittyp_kurzbz'] = html_entity_decode($row->organisationseinheittyp_kurzbz); + $item['bezeichnung'] = html_entity_decode($row->bezeichnung); + $result_obj[] = $item; + } + } + echo json_encode($result_obj); + } + exit(); +} + +?> diff --git a/vilesci/stammdaten/benutzerberechtigung_details.php b/vilesci/stammdaten/benutzerberechtigung_details.php index 83a9c34bb..03e7b15b9 100644 --- a/vilesci/stammdaten/benutzerberechtigung_details.php +++ b/vilesci/stammdaten/benutzerberechtigung_details.php @@ -37,7 +37,28 @@ require_once('../../include/person.class.php'); require_once('../../include/benutzer.class.php'); require_once('../../include/funktion.class.php'); require_once('../../include/wawi_kostenstelle.class.php'); +require_once('../../include/log.class.php'); +/* + * TODOs + * + +Checkbox-Range +Mehrfach-Löschen + + +Wawi und kostenstelle ausblenden +Checkbox markieren bei (doppel)klick auf Zeile + +---------------------- + +Nach übertragen gleich zu Person springen +Bug in Kopieren - Verdoppelt alle Einträge +Sortierreihenfolge. OE wird anscheinend nicht sortiert +ART prüfen auf schreibweise +BEschreibungstexte bestehender Rechte + + */ $user = get_uid(); $rechte = new benutzerberechtigung(); @@ -51,7 +72,8 @@ if(!$rechte->isBerechtigt('basis/berechtigung')) //$reloadstr = ''; // neuladen der liste im oberen frame $htmlstr = ''; -$errorstr = ''; //fehler beim insert +$errorstr = ''; +$successstr = ''; $sel = ''; $chk = ''; $oe_arr = array(); @@ -73,64 +95,161 @@ $neu = false; $negativ = false; $filter=(isset($_GET['filter'])?$_GET['filter']:'alle'); -if(isset($_POST['del'])) +if(isset($_POST['delete']) && $_POST['delete'] != '') { if(!$rechte->isBerechtigt('basis/berechtigung', null, 'suid')) - die('Sie haben keine Berechtigung fuer diese Aktion'); + die($rechte->errormsg); - $benutzerberechtigung_id = $_POST['benutzerberechtigung_id']; + $benutzerberechtigung_id = $_POST['delete']; $ber = new benutzerberechtigung(); if(!$ber->delete($benutzerberechtigung_id)) $errorstr .= 'Datensatz konnte nicht gelöscht werden!'; - //$reloadstr .= "\n"; + //$reloadstr .= ""; } -if(isset($_POST['kopieren'])) +if(isset($_POST['delete_multi']) && $_POST['delete_multi'] != '') { + if(!$rechte->isBerechtigt('basis/berechtigung', null, 'suid')) + die($rechte->errormsg); + + if (isset($_POST['dataset'])) + { + $i = 0; + foreach ($_POST['dataset'] AS $benutzerberechtigung_id => $value) + { + // Nur markierte Rechte kopieren + if (!isset($value['check'])) + { + continue; + } + + $ber = new benutzerberechtigung(); + if(!$ber->delete($benutzerberechtigung_id)) + { + $errorstr .= 'Datensatz konnte nicht gelöscht werden!'; + } + else + { + $i ++; + //Log schreiben + $log = new log(); + + $logdata = var_export((array) $ber, true); + $log->new = true; + $log->sql = $logdata; + $log->sqlundo = 'Kein Undo vorhanden'; + $log->executetime = date('Y-m-d H:i:s'); + $log->mitarbeiter_uid = $user; + $log->beschreibung = 'Berechtigung gelöscht'; + + if(!$log->save()) + { + $errorstr .= "Fehler beim schreiben des Log-Eintrags
"; + } + } + } + if ($errorstr == '') + { + $successstr .= "".$i." Rechte erfolgreich gelöscht
"; + } + } + + + + //$reloadstr .= ""; + +} + +if(isset($_POST['uebertragen']) && $_POST['uebertragen_nach'] != '') +{ + //echo '
', var_dump($_POST), '
';exit(); if($rechte->isBerechtigt('basis/berechtigung', null, 'suid')) { - $uid = $_POST['uid']; - $uid_von = $_POST['uid_von']; + $uidVon = $_POST['uid']; + $copyTo = $_POST['uebertragen_nach']; - $rechtevon = new benutzerberechtigung(); - if(!$rechtevon->loadBenutzerRollen($uid_von)) - die('Fehler beim Laden der Berechtigung von '.$uid_von); - - foreach($rechtevon->berechtigungen AS $row) + if (isset($_POST['dataset'])) { - //Nur aktive Berechtigungen kopieren - if(($row->start=='' || $row->start<=date('Y-m-d')) && ($row->ende=='' || $row->ende>=date('Y-m-d'))) + $i = 0; + foreach ($_POST['dataset'] AS $key => $value) { + // Nur markierte Rechte kopieren + if (!isset($value['check'])) + { + continue; + } + + $rolle_kurzbz = (isset($value['rolle_kurzbz']) ? $value['rolle_kurzbz'] : ''); + $berechtigung_kurzbz = (isset($value['berechtigung_kurzbz']) ? $value['berechtigung_kurzbz'] : ''); + $art = (isset($value['art']) ? $value['art'] : ''); + $oe_kurzbz = (isset($value['oe_kurzbz']) ? $value['oe_kurzbz'] : ''); + $kostenstelle_id = (isset($value['kostenstelle_id']) ? $value['kostenstelle_id'] : ''); + $start = (isset($value['start']) ? $value['start'] : ''); + $ende = (isset($value['ende']) ? $value['ende'] : ''); + $anmerkung = (isset($value['anmerkung']) ? $value['anmerkung'] : ''); + + $funktion_kurzbz = (isset($value['funktion_kurzbz']) ? $value['funktion_kurzbz'] : ''); + $studiensemester_kurzbz = null; + $ber = new benutzerberechtigung(); - $ber->new = true; - //$ber->benutzerberechtigung_id = $benutzerberechtigung_id; - $ber->art = $row->art; - $ber->oe_kurzbz = $row->oe_kurzbz; - $ber->berechtigung_kurzbz = $row->berechtigung_kurzbz; - $ber->rolle_kurzbz = $row->rolle_kurzbz; - $ber->uid = $uid; - $ber->funktion_kurzbz = $row->funktion_kurzbz; - $ber->studiensemester_kurzbz = $row->studiensemester_kurzbz; - $ber->start = $row->start; - $ber->ende = $row->ende; - $ber->negativ = $row->negativ; - $ber->insertamum=date('Y-m-d H:i:s'); + $ber->insertamum = date('Y-m-d H:i:s'); $ber->insertvon = $user; + $ber->new = true; + + if (isset($value['negativ'])) + $ber->negativ = true; + else + $ber->negativ = false; + + $ber->art = $art; + $ber->oe_kurzbz = $oe_kurzbz; + $ber->berechtigung_kurzbz = $berechtigung_kurzbz; + $ber->rolle_kurzbz = $rolle_kurzbz; + $ber->uid = $copyTo; + $ber->funktion_kurzbz = $funktion_kurzbz; + $ber->studiensemester_kurzbz = $studiensemester_kurzbz; + $ber->start = $start; + $ber->ende = $ende; $ber->updateamum = date('Y-m-d H:i:s'); $ber->updatevon = $user; - $ber->kostenstelle_id = $row->kostenstelle_id; - $ber->anmerkung = 'Kopiert von UID '.$uid_von.($row->anmerkung!=''?'. Anmerkung von UID '.$uid_von.': '.$row->anmerkung:''); + $ber->kostenstelle_id = $kostenstelle_id; + $ber->anmerkung = 'Kopiert von UID '.$uidVon.($anmerkung!=''?'. Anmerkung von UID '.$uidVon.': '.$anmerkung:''); if(!$ber->save()) { - if (!$ber->new) - $errorstr .= "Datensatz konnte nicht gespeichert werden!".$ber->errormsg; + $errorstr .= "Datensatz konnte nicht gespeichert werden!".$ber->errormsg; } + else + { + $i ++; + //Log schreiben + $log = new log(); + + $logdata = var_export((array) $ber, true); + $log->new = true; + $log->sql = $logdata; + $log->sqlundo = 'Kein Undo vorhanden'; + $log->executetime = date('Y-m-d H:i:s'); + $log->mitarbeiter_uid = $user; + $log->beschreibung = 'Berechtigung übertragen von '.$uidVon.' nach '.$copyTo; + + if(!$log->save()) + { + $errorstr .= "Fehler beim schreiben des Log-Eintrags
"; + } + } + } + if ($errorstr == '') + { + $successstr .= "".$i." Rechte erfolgreich kopiert
"; + echo ""; } } } @@ -140,71 +259,137 @@ if(isset($_POST['kopieren'])) } } -if(isset($_POST['schick']) || isset($_POST['copy'])) +if(isset($_POST['schick'])) { if($rechte->isBerechtigt('basis/berechtigung', null, 'suid')) { - $benutzerberechtigung_id = $_POST['benutzerberechtigung_id']; - $art = $_POST['art']; - $oe_kurzbz = (isset($_POST['oe_kurzbz'])?$_POST['oe_kurzbz']:''); - $berechtigung_kurzbz = (isset($_POST['berechtigung_kurzbz'])?$_POST['berechtigung_kurzbz']:''); - $rolle_kurzbz = (isset($_POST['rolle_kurzbz'])?$_POST['rolle_kurzbz']:''); - $uid = $_POST['uid']; - $funktion_kurzbz = $_POST['funktion_kurzbz']; - $studiensemester_kurzbz = null;//$_POST['studiensemester_kurzbz']; - $start = $_POST['start']; - $ende = $_POST['ende']; - $kostenstelle_id = (isset($_POST['kostenstelle_id'])?$_POST['kostenstelle_id']:''); - $anmerkung = (isset($_POST['anmerkung'])?$_POST['anmerkung']:''); + if (isset($_POST['dataset'])) + { + foreach ($_POST['dataset'] AS $benutzerberechtigung_id => $value) + { + $rolle_kurzbz = (isset($value['rolle_kurzbz']) ? $value['rolle_kurzbz'] : ''); + $berechtigung_kurzbz = (isset($value['berechtigung_kurzbz']) ? $value['berechtigung_kurzbz'] : ''); + $art = (isset($value['art']) ? $value['art'] : ''); + $oe_kurzbz = (isset($value['oe_kurzbz']) ? $value['oe_kurzbz'] : ''); + $kostenstelle_id = (isset($value['kostenstelle_id']) ? $value['kostenstelle_id'] : ''); + $start = (isset($value['start']) ? $value['start'] : ''); + $ende = (isset($value['ende']) ? $value['ende'] : ''); + $uid = $_POST['uid']; + $anmerkung = (isset($value['anmerkung']) ? $value['anmerkung'] : ''); + $funktion_kurzbz = (isset($_POST['funktion_kurzbz']) ? $_POST['funktion_kurzbz'] : ''); + $studiensemester_kurzbz = null; + + $ber = new benutzerberechtigung(); + if (isset($_POST['neu'])) + { + $ber->insertamum = date('Y-m-d H:i:s'); + $ber->insertvon = $user; + $ber->new = true; + } + else + { + if(!$ber->load($benutzerberechtigung_id)) + die('Fehler beim Laden der Berechtigung'); + } + if (isset($value['negativ'])) + $ber->negativ = true; + else + $ber->negativ = false; + + $ber->benutzerberechtigung_id = $benutzerberechtigung_id; + $ber->art = $art; + $ber->oe_kurzbz = $oe_kurzbz; + $ber->berechtigung_kurzbz = $berechtigung_kurzbz; + $ber->rolle_kurzbz = $rolle_kurzbz; + $ber->uid = $uid; + $ber->funktion_kurzbz = $funktion_kurzbz; + $ber->studiensemester_kurzbz = $studiensemester_kurzbz; + $ber->start = $start; + $ber->ende = $ende; + $ber->updateamum = date('Y-m-d H:i:s'); + $ber->updatevon = $user; + $ber->kostenstelle_id = $kostenstelle_id; + $ber->anmerkung = $anmerkung; + + if(!$ber->save()) + { + if (!$ber->new) + $errorstr .= "Datensatz konnte nicht upgedatet werden!".$ber->errormsg; + else + $errorstr .= "Datensatz konnte nicht gespeichert werden!".$ber->errormsg; + } + else + { + //Log schreiben + $log = new log(); + + $logdata = var_export((array) $ber, true); + $log->new = true; + $log->sql = $logdata; + $log->sqlundo = 'Kein Undo vorhanden'; + $log->executetime = date('Y-m-d H:i:s'); + $log->mitarbeiter_uid = $user; + if (isset($_POST['neu'])) + $log->beschreibung = 'Neue Berechtigung für '.$uid.' angelegt'; + else + $log->beschreibung = 'Berechtigung für '.$uid.' aktualisiert'; + + if(!$log->save()) + { + $errorstr .= "Fehler beim schreiben des Log-Eintrags
"; + } + } + } + } + } + else + { + $errorstr.='Fehler beim Speichern: '.$rechte->errormsg; + } +} + +if(isset($_POST['copy']) && $_POST['copy'] != '') +{ + if($rechte->isBerechtigt('basis/berechtigung', null, 'suid')) + { $ber = new benutzerberechtigung(); - if (isset($_POST['neu']) || isset($_POST['copy'])) - { - $ber->insertamum=date('Y-m-d H:i:s'); - $ber->insertvon = $user; - $ber->new = true; - } - else - { - if(!$ber->load($benutzerberechtigung_id)) - die('Fehler beim Laden der Berechtigung'); - } - if (isset($_POST['negativ'])) - $ber->negativ = true; - else - $ber->negativ = false; + if(!$ber->load($_POST['copy'])) + die('Fehler beim Laden der Berechtigung'); - $ber->benutzerberechtigung_id = $benutzerberechtigung_id; - $ber->art = $art; - $ber->oe_kurzbz = $oe_kurzbz; - $ber->berechtigung_kurzbz = $berechtigung_kurzbz; - $ber->rolle_kurzbz = $rolle_kurzbz; - $ber->uid = $uid; - $ber->funktion_kurzbz = $funktion_kurzbz; - $ber->studiensemester_kurzbz = $studiensemester_kurzbz; - $ber->start = $start; - $ber->ende = $ende; - $ber->updateamum = date('Y-m-d H:i:s'); - $ber->updatevon = $user; - $ber->kostenstelle_id = $kostenstelle_id; - $ber->anmerkung = $anmerkung; + $ber->new = true; + $ber->insertamum = date('Y-m-d H:i:s'); + $ber->insertvon = $user; - if(!$ber->save()){ + if(!$ber->save()) + { if (!$ber->new) $errorstr .= "Datensatz konnte nicht upgedatet werden!".$ber->errormsg; else $errorstr .= "Datensatz konnte nicht gespeichert werden!".$ber->errormsg; } - /*if ($ber->new) + else { - $reloadstr .= "\n"; - }*/ + //Log schreiben + $log = new log(); + + $logdata = var_export((array) $ber, true); + $log->new = true; + $log->sql = $logdata; + $log->sqlundo = 'Kein Undo vorhanden'; + $log->executetime = date('Y-m-d H:i:s'); + $log->mitarbeiter_uid = $user; + $log->beschreibung = 'Berechtigung für '.$uid.' kopiert'; + + if(!$log->save()) + { + $errorstr .= "Fehler beim schreiben des Log-Eintrags
"; + } + } } else { - $errorstr.='Fehler beim Speichern: Sie haben keine Berechtigung zum Speichern'; + $errorstr.='Fehler beim Speichern: '.$rechte->errormsg; } } @@ -220,10 +405,10 @@ sort($rolle_arr); $b->getBerechtigungen(); foreach($b->result as $berechtigung) { - $berechtigung_arr[] = $berechtigung->berechtigung_kurzbz; + $berechtigung_arr[$berechtigung->berechtigung_kurzbz] = $berechtigung->beschreibung; $berechtigung_beschreibung_arr[] = $berechtigung->beschreibung; } -//var_dump($berechtigung_arr); + $st = new studiensemester(); $st->getAll(); foreach($st->studiensemester as $studiensemester) @@ -233,6 +418,10 @@ foreach($st->studiensemester as $studiensemester) $oe = new organisationseinheit(); $oe->getAll(); +foreach ($oe->result AS $row) +{ + $oe_arr[$row->oe_kurzbz] = $row->organisationseinheittyp_kurzbz.' '.$row->bezeichnung; +} $kostenstelle = new wawi_kostenstelle(); $kostenstelle->getAll(); @@ -259,13 +448,16 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $rights->loadBenutzerRollen($uid); $name = new benutzer(); $name->load($uid); - $htmlstr .= "Berechtigungen von ".$name->nachname." ".$name->vorname." (".$uid.")\n"; + + $htmlstr .= "Berechtigungen von ".$name->nachname." ".$name->vorname." (".$uid.")"; + $htmlstr .= "

".$errorstr."

".$successstr."

"; + //Formular zum Kopieren von Berechtigungen - $htmlstr .= "
\n"; - $htmlstr .= "Berechtigungen (aktive) kopieren von UID \n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "
\n"; + //$htmlstr .= "
"; + //$htmlstr .= "Berechtigungen (aktive) kopieren von UID "; + //$htmlstr .= ""; + //$htmlstr .= ""; + //$htmlstr .= "
"; $i = 0; // Zusätzlich jede Funktion mit einer gültigen Berechtigung anzeigen @@ -291,11 +483,13 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $i++; if ($i==1) { - $htmlstr .= "Geerbte Berechtigungen aus Funktion\n"; + $htmlstr .= "

Geerbte Berechtigungen aus Funktion(en) "; } - $htmlstr .= ($i>1?", ":"").$funktion_bezeichnung->beschreibung.""; + $htmlstr .= ($i > 1 ? ", " : "").$funktion_bezeichnung->beschreibung; } } + if(!empty($funktionsrecht)) + $htmlstr .= '

'; } } elseif(isset($_REQUEST['funktion_kurzbz']) && $_REQUEST['funktion_kurzbz']!='') @@ -307,10 +501,10 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) die('Funktion existiert nicht'); $rights->loadBenutzerRollen(null, $funktion_kurzbz); - $htmlstr .= "Berechtigungen der Funktion ".$funktion->beschreibung."\n"; + $htmlstr .= "Berechtigungen der Funktion ".$funktion->beschreibung.""; } - //$htmlstr .= "Berechtigungen von ".$name->nachname." ".$name->vorname." (".$uid.")".$funktion_kurzbz."\n"; + //$htmlstr .= "Berechtigungen von ".$name->nachname." ".$name->vorname." (".$uid.")".$funktion_kurzbz.""; /*$htmlstr .= '      Filter: Alle | nur WaWi @@ -318,16 +512,19 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) ';*/ - $htmlstr .= "\n"; //Alternatives styling fuer Tablesorter um Platz zu sparen. - $htmlstr .= "\n"; + //////////////// + // Neue Berechtigung einfügen + //////////////// + + $htmlstr .= "
"; + $htmlstr .= ""; $htmlstr .= " - - - + + @@ -335,63 +532,52 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) - - \n"; + "; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; + $htmlstr .= ""; + $htmlstr .= ""; + $htmlstr .= ""; + $htmlstr .= ""; + $htmlstr .= ""; + $htmlstr .= ""; - //Status - $htmlstr .= " \n"; + $htmlstr .= ""; //Rolle - $htmlstr .= " \n"; + $htmlstr .= " "; //Berechtigung_kurzbz - $htmlstr .= " \n"; + $htmlstr .= " "; //Art - $htmlstr .= " \n"; + $htmlstr .= " "; //Organisationseinheit - if($funktion_kurzbz!='') - $htmlstr .= " \n"; + if($funktion_kurzbz != '') + { + $htmlstr .= " "; + } else { - $htmlstr .= " \n"; + $htmlstr .= " "; } //Kostenstelle - $htmlstr .= " \n"; + $htmlstr .= " "; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; + //Negativ + $htmlstr .= " "; + + //Start + $htmlstr .= " "; + + //Ende + $htmlstr .= " "; //Anmerkung - $htmlstr .= " \n"; + $htmlstr .= " "; - $htmlstr .= " "; - $htmlstr .= "\n"; - $htmlstr .= " \n"; + $htmlstr .= " "; + $htmlstr .= ""; + $htmlstr .= "
Rolle Berechtigung ArtOrganisationseinheitKostenstelleOrganisationseinheitKostenstelle Neg Gültig ab Gültig bisInfo
 Neu: "; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " OE aus MA-FunktionOE aus MA-Funktion"; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= "
"; + + $htmlstr .= "
"; + + //////////////// + // Tabelle für bestehende Berechtigungen + //////////////// + + $htmlstr .= "
"; + + $htmlstr .= ""; + $htmlstr .= ""; + $htmlstr .= " + + + +
+ + +
+ "; + $htmlstr .= ""; + $htmlstr .= ""; + $htmlstr .= " + + + + + + + + + + + + + + + "; foreach($rights->berechtigungen as $b) { @@ -430,199 +659,139 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) break; default: break; } - if(isset($_POST['edit']) && $_POST['benutzerberechtigung_id']==$b->benutzerberechtigung_id) + + $htmlstr .= " "; + $heute = strtotime(date('Y-m-d')); + if ($b->ende!='' && strtotime($b->ende) < $heute) { - $htmlstr .= " \n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - - $heute = strtotime(date('Y-m-d')); - if ($b->ende!='' && strtotime($b->ende)<$heute) - { - $status="ampel_rot.png"; - $titel="ccc"; - } - elseif ($b->start!='' && strtotime($b->start)>$heute) - { - $status="ampel_gelb.png"; - $titel="bbb"; - } - else - { - $status="ampel_gruen.png"; - $titel="aaa"; - } - //Status - $htmlstr .= " \n"; - //Rolle - $htmlstr .= " \n"; - - //Berechtigung - $htmlstr .= " \n"; - - //Art - $htmlstr .= " \n"; - - //Organisationseinheit - if($funktion_kurzbz!='') - $htmlstr .= " \n"; - else - { - $htmlstr .= " \n"; - } - - //Kostenstelle - $htmlstr .= " \n"; - - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - - $htmlstr .= " "; - $htmlstr .= " "; - $htmlstr .= "\n"; - $htmlstr .= " \n"; + $titel="ccc"; + $style = 'style="border-left: 10px solid tomato; border-right: 10px solid transparent; text-align: center; vertical-align: middle"'; + } + elseif ($b->start!='' && strtotime($b->start) > $heute) + { + $titel="bbb"; + $style = 'style="border-left: 10px solid gold; border-right: 10px solid transparent; text-align: center; vertical-align: middle"'; } else { - $htmlstr .= " \n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; + $titel="aaa"; + $style = 'style="border-left: 10px solid LightGreen; border-right: 10px solid transparent; text-align: center; vertical-align: middle"'; + } + // Auswahlcheckbox + $htmlstr .= " "; - $heute = strtotime(date('Y-m-d')); - if ($b->ende!='' && strtotime($b->ende)<$heute) + //Rolle + $htmlstr .= " \n"; - //Rolle - $htmlstr .= " \n"; + $sel = ""; + $htmlstr .= ""; + } + $htmlstr .= " "; + $htmlstr.=""; - //Berechtigung - $htmlstr .= " \n"; + //Berechtigung + $htmlstr .= " "; - //Art - $htmlstr .= " \n"; + //Art + $htmlstr .= " "; - //Organisationseinheit - $oekey = $oe->result; - $org = new organisationseinheit(); - $org->load($b->oe_kurzbz); - $htmlstr .= " \n"; - - //Kostenstelle - $kst = new wawi_kostenstelle(); - $kst->load($b->kostenstelle_id); - if(!$kst->aktiv) - $style='style="text-decoration:line-through;"'; - else - $style=''; - $htmlstr .= " \n"; - - - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - - $htmlstr .= " "; - $htmlstr .= " "; - $htmlstr .= "\n"; - $htmlstr .= " \n"; + //Organisationseinheit + if($funktion_kurzbz != '') + { + $htmlstr .= " "; + } + else + { + $htmlstr .= " "; } + //Kostenstelle + $htmlstr .= " "; + + //Negativ-Checkbox + $htmlstr .= " "; + + //Gültig ab + $htmlstr .= " "; + + // Gültig bis + $htmlstr .= " "; + + //Anmerkung + $htmlstr .= " "; + + //Info + $htmlstr .= " "; + + $htmlstr .= " "; + $htmlstr .= " "; } - - $htmlstr .= "
RolleBerechtigungArtOrganisationseinheitKostenstelleNegGültig abGültig bisAnmerkungInfo
aktiv"; - - // Wenn editiert wird, zu der Zeile Springen - $htmlstr.=" - - "; - $htmlstr.="OE aus MA-Funktionnegativ?'checked="checked"':'')." onchange='markier(\"td_".$b->benutzerberechtigung_id."\")'>anmerkung))."' size='30' maxlength='256' markier(\"td_".$b->benutzerberechtigung_id."\")'>information  
"; + $htmlstr .= " ".$titel.""; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " aktiv$b->rolle_kurzbz$b->berechtigung_kurzbz"; + $htmlstr .= " ".$b->berechtigung_kurzbz.""; + $htmlstr .= " berechtigung_kurzbz] : '')."'>"; + $htmlstr .= " ".$b->art.""; + $htmlstr .= " ".$b->art.""; + $htmlstr .= " "; + $htmlstr .= " ".$org->organisationseinheittyp_kurzbz." ".$org->bezeichnung."$kst->bezeichnungnegativ?'checked="checked"':'')." onchange='markier(\"td_".$b->benutzerberechtigung_id."\")' disabled>".$b->start."".$b->ende."".$b->anmerkung."information
OE aus MA-Funktion"; + $htmlstr .= " ".($b->oe_kurzbz != '' ? $oe_arr[$b->oe_kurzbz] : '').""; + $htmlstr .= " "; + $htmlstr .= " oe_kurzbz] : '')."'>"; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " negativ?'checked="checked"':'').">"; + $htmlstr .= " "; + $htmlstr .= " ".$b->start.""; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " ".$b->ende.""; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " anmerkung))."' size='30' maxlength='256'>"; + $htmlstr .= " information"; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= "
\n"; + $htmlstr .= ""; + $htmlstr .= '
+
'; + $htmlstr .= ''; + $htmlstr .= ' + +
'; + $htmlstr .= ""; } -$htmlstr .= "
".$errorstr."
\n"; + ?> @@ -635,58 +804,19 @@ $htmlstr .= "
".$errorstr."
\n"; - - - + + + + + + - + + -

Berechtigung - Rolle - Übersicht

+

Berechtigung - Rolle -

deleteRolleBerechtigung($rolle_kurzbz, $berechtigung_kurzbz)): ?> Fehler beim Löschen: errormsg ?> - Berechtigung gelöscht! + Berechtigung gelöscht! -
- Zurück + Zurück zur Rollenübersicht -

RolleBerechtigung "":

- +

getBerechtigungen(); ?>
+ - - - + + + +
@@ -154,6 +216,8 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); getRolleBerechtigung($rolle_kurzbz); foreach($berechtigungen->result as $rolle): ?> @@ -161,7 +225,7 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); From 7cdb7688c4cb858c0fca8044c0ea4cc53276db89 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 28 Nov 2022 17:27:39 +0100 Subject: [PATCH 07/88] =?UTF-8?q?Fixed:=20Vergangene=20Anrechnungen=20k?= =?UTF-8?q?=C3=B6nnen=20jetzt=20eingesehen=20werden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Manche vergangene Anrechnungen konnten nicht eingesehen werden, weil die Zuordnung der Studenten zu den Lehrveranstaltungen aufgelöst bzw. geändert werden. Gefixt, indem nun bei einer bestehenden Anrechnung die bei der Anrechnung hinterlegten Lehrveranstaltung herangezogen wird. --- .../anrechnung/ApproveAnrechnungDetail.php | 3 +- .../lehre/anrechnung/RequestAnrechnung.php | 2 +- .../anrechnung/ReviewAnrechnungDetail.php | 3 +- application/libraries/AnrechnungLib.php | 28 ++++++++++++++----- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php index 1f5c853db..b7953456c 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php @@ -90,7 +90,8 @@ class approveAnrechnungDetail extends Auth_Controller $antragData = $this->anrechnunglib->getAntragData( $anrechnungData->prestudent_id, $anrechnungData->studiensemester_kurzbz, - $anrechnungData->lehrveranstaltung_id + $anrechnungData->lehrveranstaltung_id, + $anrechnungData->anrechnung_id ); // Get Empfehlung data diff --git a/application/controllers/lehre/anrechnung/RequestAnrechnung.php b/application/controllers/lehre/anrechnung/RequestAnrechnung.php index fbaac9b3e..3f9138f04 100644 --- a/application/controllers/lehre/anrechnung/RequestAnrechnung.php +++ b/application/controllers/lehre/anrechnung/RequestAnrechnung.php @@ -93,7 +93,7 @@ class requestAnrechnung extends Auth_Controller $anrechnungData = $this->anrechnunglib->getAnrechnungDataByLv($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id); // Get Antrag data - $antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id); + $antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id, $anrechnungData->anrechnung_id); $viewData = array( 'antragData' => $antragData, diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php index 1bd92004d..d2a3696b3 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php @@ -84,7 +84,8 @@ class reviewAnrechnungDetail extends Auth_Controller $antragData = $this->anrechnunglib->getAntragData( $anrechnungData->prestudent_id, $anrechnungData->studiensemester_kurzbz, - $anrechnungData->lehrveranstaltung_id + $anrechnungData->lehrveranstaltung_id, + $anrechnungData->anrechnung_id ); // Get Empfehlung data diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php index 86a81fb55..dfa733d8d 100644 --- a/application/libraries/AnrechnungLib.php +++ b/application/libraries/AnrechnungLib.php @@ -37,18 +37,32 @@ class AnrechnungLib * @param $lv_id * @return StdClass */ - public function getAntragData($prestudent_id, $studiensemester_kurzbz, $lv_id) + public function getAntragData($prestudent_id, $studiensemester_kurzbz, $lv_id, $anrechnung_id) { $antrag_data = new StdClass(); // Get students UID. $uid = $this->ci->StudentModel->getUID($prestudent_id); - - // Get lehrveranstaltung data. Break, if course is not assigned to student. - if(!$lv = getData($this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id))[0]) - { - show_error('You are not assigned to this course yet.'); - } + + // Get lehrveranstaltung data. + // If it is a first time request for Anrechnung... + if (isEmptyString($anrechnung_id)) + { + //...get LV by student to check also, if student is assigned to that lv + $result = $this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id); + if (!hasData($result)) + { + // ...and break, if course is not assigned to student + show_error('You are not assigned to this course yet.'); + } + } + //...in any other case (STGL View; Lector View; Student View when Anrechnung exist) + else + { + $result = $this->ci->LehrveranstaltungModel->load($lv_id); + } + + $lv = getData($result)[0]; // Get the students personal data if (!$person = getData($this->ci->PersonModel->getByUid($uid))[0]) From ca217f186979c9eb5d8ded9b65bf940a511e2748 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 29 Nov 2022 18:10:39 +0100 Subject: [PATCH 08/88] Fixed: Downloadlink erzeugt nach Page Reload keine Fehlermeldung mehr --- .../anrechnung/approveAnrechnungUebersichtData.php | 6 +----- .../anrechnung/reviewAnrechnungUebersichtData.php | 6 +----- .../anrechnung/approveAnrechnungUebersicht.js | 14 ++++++++++++++ .../lehre/anrechnung/reviewAnrechnungUebersicht.js | 14 ++++++++++++++ 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php index 83370769f..1eade50d2 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php @@ -213,11 +213,7 @@ $filterWidgetArray = array( begruendung: {headerFilter:"input", visible: true}, student: {headerFilter:"input"}, zgv: {visible: false, headerFilter:"input"}, - dokument_bezeichnung: {headerFilter:"input", formatter:"link", formatterParams:{ - labelField:"dokument_bezeichnung", - url:function(cell){return "'. current_url() .'/download?dms_id=" + cell.getData().dms_id}, - target:"_blank" - }}, + dokument_bezeichnung: {headerFilter:"input", formatter:"link", formatterParams: paramLookup_dokBez}, anmerkung_student: {headerFilter:"input"}, antragsdatum: {align:"center", headerFilter:"input", mutator: mut_formatStringDate}, empfehlung_anrechnung: {headerFilter:"input", align:"center", formatter: format_empfehlung_anrechnung, headerFilterFunc: hf_filterTrueFalse}, diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php index 89b3ba70f..d48018171 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php @@ -134,11 +134,7 @@ $filterWidgetArray = array( student: {headerFilter:"input"}, begruendung: {headerFilter:"input"}, zgv: {visible: false, headerFilter:"input"}, - dokument_bezeichnung: {headerFilter:"input", formatter:"link", formatterParams:{ - labelField:"dokument_bezeichnung", - url:function(cell){return "'. current_url() .'/download?dms_id=" + cell.getData().dms_id}, - target:"_blank" - }}, + dokument_bezeichnung: {headerFilter:"input", formatter:"link", formatterParams: paramLookup_dokBez}, anmerkung_student: {headerFilter:"input"}, antragsdatum: {align:"center", headerFilter:"input", mutator: mut_formatStringDate}, empfehlung_anrechnung: {headerFilter:"input", align:"center", formatter: format_empfehlung_anrechnung, headerFilterFunc: hf_filterTrueFalse}, diff --git a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js index e831856d8..15d657b81 100644 --- a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js @@ -1,4 +1,6 @@ const BASE_URL = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router; +const CALLED_PATH = FHC_JS_DATA_STORAGE_OBJECT.called_path; +const CONTROLLER_URL = BASE_URL + '/' + CALLED_PATH; const APPROVE_ANRECHNUNG_DETAIL_URI = "lehre/anrechnung/ApproveAnrechnungDetail"; const ANRECHNUNGSTATUS_PROGRESSED_BY_STGL = 'inProgressDP'; @@ -203,6 +205,18 @@ var format_empfehlung_anrechnung = function(cell, formatterParams){ : FHC_PhrasesLib.t("ui", "nein"); } +/** + * Returns formatter params for field dokument_bezeichnung (= Spalte Nachweisdokumente) + * NOTE: Returning a formatter param object fixes the problem, that tabulator did not know the url after refreshing the page. + */ +function paramLookup_dokBez(cell){ + return { + labelField: 'dokument_bezeichnung', + url: CONTROLLER_URL + '/download?dms_id=' + cell.getData().dms_id, + target: '_blank' + } +} + /* * Hook to overwrite TableWigdgets select-all-button behaviour * Select all (filtered) rows that are progressed by stg leiter. diff --git a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js index fd7155fa0..47b2a2dc5 100644 --- a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js @@ -1,4 +1,6 @@ const BASE_URL = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router; +const CALLED_PATH = FHC_JS_DATA_STORAGE_OBJECT.called_path; +const CONTROLLER_URL = BASE_URL + '/' + CALLED_PATH; const APPROVE_ANRECHNUNG_DETAIL_URI = "lehre/anrechnung/ReviewAnrechnungDetail"; const ANRECHNUNGSTATUS_PROGRESSED_BY_STGL = 'inProgressDP'; @@ -121,6 +123,18 @@ var format_empfehlung_anrechnung = function(cell, formatterParams){ : FHC_PhrasesLib.t("ui", "nein"); } +/** + * Returns formatter params for field dokument_bezeichnung (= Spalte Nachweisdokumente) + * NOTE: Returning a formatter param object fixes the problem, that tabulator did not know the url after refreshing the page. + */ +function paramLookup_dokBez(cell){ + return { + labelField: 'dokument_bezeichnung', + url: CONTROLLER_URL + '/download?dms_id=' + cell.getData().dms_id, + target: '_blank' + } +} + /* * Hook to overwrite TableWigdgets select-all-button behaviour * Select all (filtered) rows that are progressed by stg leiter. From cee15a68ba5a0b53e7575d873b4db0d49a4ce710 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 10:48:52 +0100 Subject: [PATCH 09/88] Added config['fbl'] and config['send_mail'] to anrechnungen . config['fbl'] enables Fachbereichsleitung instead of LektorInnen . config['send_mail'] enables sending Info Mails --- application/config/anrechnung.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/application/config/anrechnung.php b/application/config/anrechnung.php index c2e38385c..2c7ec1a5b 100644 --- a/application/config/anrechnung.php +++ b/application/config/anrechnung.php @@ -7,8 +7,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); $config['interval_blocking_application'] = 'P1M'; // Application submission period given by start- and enddate. -$config['submit_application_start'] = '05.09.2022'; -$config['submit_application_end'] = '22.09.2022'; +//$config['submit_application_start'] = '05.09.2022'; +//$config['submit_application_end'] = '22.10.2022'; // Lehrveranstaltungen with these grades will be blocked for application $config['grades_blocking_application'] = array( @@ -19,4 +19,9 @@ $config['grades_blocking_application'] = array( 14, // nicht bestanden, 15, // nicht teilgenommen 18 // unentschuldigt -); \ No newline at end of file +); + +//Enables Fachbereichsleiter instead of LV Leiter +$config['fbl'] = FALSE; +//Enables Info Mails +$config['send_mail'] = TRUE; \ No newline at end of file From 10ed780b6c76847b9d2bf0f928669591d8cc40eb Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 10:50:08 +0100 Subject: [PATCH 10/88] Added method getFachbereichsleitungByLv to Lehrveranstaltung_model Gets all fachbereichsleiter of a Lehrveranstaltung --- .../education/Lehrveranstaltung_model.php | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index f54443955..b0c7d23a6 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -200,6 +200,29 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($query, array($lehrveranstaltung_id, $studiensemester_kurzbz)); } + /** + * Gets all fachbereichsleiter of a Lehrveranstaltung + * @param $lehrveranstaltung_id + * @return array|null + */ + public function getFachbereichByLv($lehrveranstaltung_id) + { + $query = "select distinct vorname, nachname, uid, true as lvleiter + FROM + lehre.tbl_lehrveranstaltung lv + JOIN public.tbl_organisationseinheit og using (oe_kurzbz) + JOIN public.tbl_benutzerfunktion bf using (oe_kurzbz) + join public.tbl_benutzer b using (uid) + join public.tbl_person p using (person_id) + where + bf.datum_von <= now()::date + and (bf.datum_bis >= now()::date or bf.datum_bis is null) + and bf.funktion_kurzbz = 'Leitung' + AND og.organisationseinheittyp_kurzbz = 'Fachbereich' + and lehrveranstaltung_id = ?"; + + return $this->execQuery($query, array($lehrveranstaltung_id)); + } /** * Gets Lehrveranstaltungen of a student From 88246c443a85df82fa2b20712d7cd808599af01c Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 10:53:21 +0100 Subject: [PATCH 11/88] Added function getFachbereichleitung to AnrechnungLib ...plus adaptation to getEmpfehlungData to use this function. --- application/libraries/AnrechnungLib.php | 57 +++++++++++++++++++++---- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php index 86a81fb55..82410b398 100644 --- a/application/libraries/AnrechnungLib.php +++ b/application/libraries/AnrechnungLib.php @@ -274,14 +274,21 @@ class AnrechnungLib if (hasData($result)) { $empfehlung_data->empfehlungsanfrageAm = (new DateTime($result->retval[0]->insertamum))->format('d.m.Y'); - - // Get lectors who received request for recommendation - $lector_arr = self::getLectors($anrechnung_id); - - if (!isEmptyArray($lector_arr)) - { - $empfehlung_data->empfehlungsanfrageAn = implode(', ', array_column($lector_arr, 'fullname')); - } + + // Get users who received request for recommendation (Fachbereichsleitung / Lektor) + if($this->ci->config->item('fbl') === TRUE) + { + $res = $this->getFachbereichleitung($anrechnung_id); + } + else + { + $res = $this->getLectors($anrechnung_id); + } + + if (!isEmptyArray($res)) + { + $empfehlung_data->empfehlungsanfrageAn = implode(', ', array_column($res, 'fullname')); + } } if (is_null($anrechnung->empfehlung_anrechnung)) @@ -803,6 +810,40 @@ class AnrechnungLib return $lector_arr; } + /** + * Get Fachbereichsleitung. + * + * @param $anrechnung_id + * @return false|mixed|null + */ + public function getFachbereichleitung($anrechnung_id) + { + $this->ci->AnrechnungModel->addSelect('lehrveranstaltung_id'); + $result = $this->ci->AnrechnungModel->load($anrechnung_id); + + $lehrveranstaltung_id = getData($result)[0]->lehrveranstaltung_id; + + // Get FBLs + $result = $this->ci->LehrveranstaltungModel->getFachbereichByLv($lehrveranstaltung_id); + + if (!hasData($result)) + { + return false; + } + + $fbl_arr = getData($result); + + foreach ($fbl_arr as $fbl) + { + $fbl->fullname = $fbl->vorname. ' '. $fbl->nachname; + } + + // Now make the fbl array unique + $fbl_arr = array_unique($fbl_arr, SORT_REGULAR); + + return $fbl_arr; + } + // Return an object with Anrechnungdata private function _setAnrechnungDataObject($anrechnung) { From 4a87fb49e908091a3612bf82b1c5e131abc3b713 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 13:22:48 +0100 Subject: [PATCH 12/88] Created new Review Anrechnung Uebersicht Tabulator for Fachbereichsleitung --- .../reviewAnrechnungUebersichtData_fbl.php | 159 ++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 application/views/lehre/anrechnung/reviewAnrechnungUebersichtData_fbl.php diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData_fbl.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData_fbl.php new file mode 100644 index 000000000..a20d85f9f --- /dev/null +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData_fbl.php @@ -0,0 +1,159 @@ +>' . $LANGUAGE_INDEX . ', + array_to_json(zgv.bezeichnung::varchar[])->>' . $LANGUAGE_INDEX . ' + ) AS zgv + FROM public.tbl_prestudent + LEFT JOIN bis.tbl_zgv zgv USING (zgv_code) + LEFT JOIN bis.tbl_zgvmaster zgvmaster USING (zgvmas_code) + WHERE prestudent_id = anrechnung.prestudent_id + ) AS zgv, + anrechnung.insertamum::date AS "antragsdatum", + empfehlung_anrechnung, + (SELECT status_kurzbz + FROM lehre.tbl_anrechnungstatus + JOIN lehre.tbl_anrechnung_anrechnungstatus USING (status_kurzbz) + WHERE anrechnung_id = anrechnung.anrechnung_id + ORDER BY insertamum DESC + LIMIT 1 + ) AS status_kurzbz + FROM lehre.tbl_anrechnung AS anrechnung + JOIN public.tbl_prestudent USING (prestudent_id) + JOIN public.tbl_person AS person USING (person_id) + JOIN public.tbl_studiengang AS stg USING (studiengang_kz) + JOIN lehre.tbl_lehrveranstaltung AS lv USING (lehrveranstaltung_id) + LEFT JOIN campus.tbl_dms_version AS dmsversion USING (dms_id) + JOIN lehre.tbl_anrechnung_anrechnungstatus USING (anrechnung_id) + JOIN lehre.tbl_anrechnung_begruendung AS begruendung USING (begruendung_id) + ) + +SELECT DISTINCT /*ON (anrechnungen.*, bf.uid)*/ anrechnungen.*, + array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung" + FROM anrechnungen + JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz) + JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id) +/*JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id)*/ +JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id) +JOIN public.tbl_organisationseinheit og using (oe_kurzbz) +JOIN public.tbl_benutzerfunktion bf using (oe_kurzbz) + WHERE anrechnungen.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND le.studiensemester_kurzbz = anrechnungen.studiensemester_kurzbz +/*AND lema.mitarbeiter_uid = \'' . $LEKTOR_UID . '\'*/ + AND le.lehre = TRUE +AND bf.funktion_kurzbz = \'Leitung\' +AND og.organisationseinheittyp_kurzbz = \'Fachbereich\' +AND bf.uid = \'' . $LEKTOR_UID . '\' + AND EXISTS ( + SELECT 1 + FROM lehre.tbl_anrechnung_anrechnungstatus + WHERE anrechnung_id = anrechnungen.anrechnung_id + AND status_kurzbz=\'inProgressLektor\' + ) +order by empfehlung_anrechnung NULLS FIRST, antragsdatum +'; + +$filterWidgetArray = array( + 'query' => $query, + 'tableUniqueId' => 'approveAnrechnungUebersicht', + 'requiredPermissions' => 'lehre/anrechnung_empfehlen', + 'datasetRepresentation' => 'tabulator', + 'columnsAliases' => array( + 'anrechnung_id', + 'lehrveranstaltung_id', + 'begruendung_id', + 'dms_id', + 'studiensemester_kurzbz', + 'studiengang_kz', + ucfirst($this->p->t('lehre', 'studiengang')), + ucfirst($this->p->t('lehre', 'lehrveranstaltung')), + 'ECTS', + ucfirst($this->p->t('person', 'studentIn')), + ucfirst($this->p->t('global', 'begruendung')), + ucfirst($this->p->t('anrechnung', 'nachweisdokumente')), + ucfirst($this->p->t('anrechnung', 'herkunft')), + ucfirst($this->p->t('global', 'zgv')), + ucfirst($this->p->t('anrechnung', 'antragdatum')), + ucfirst($this->p->t('anrechnung', 'empfehlung')), + 'status_kurzbz', + 'Status' + ), + 'datasetRepOptions' => '{ + height: func_height(this), + layout: "fitColumns", // fit columns to width of table + persistentLayout:true, + persistentSort:true, + autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated + headerFilterPlaceholder: " ", + index: "anrechnung_id", // assign specific column as unique id (important for row indexing) + selectable: true, // allow row selection + selectableRangeMode: "click", // allow range selection using shift end click on end of range + selectablePersistence:false, // deselect previously selected rows when table is filtered, sorted or paginated + tableBuilt: function(){ + func_tableBuilt(this); + }, + tableWidgetFooter: { + selectButtons: true + }, + selectableCheck: function(row){ + return func_selectableCheck(row); + }, + rowFormatter:function(row){ + func_rowFormatter(row); + }, + rowUpdated:function(row){ + func_rowUpdated(row); + }, + tooltips: function(cell){ + return func_tooltips(cell); + } + }', // tabulator properties + 'datasetRepFieldsDefs' => '{ + anrechnung_id: {visible: false, headerFilter:"input"}, + lehrveranstaltung_id: {visible: false, headerFilter:"input"}, + begruendung_id: {visible: false, headerFilter:"input"}, + dms_id: {visible: false, headerFilter:"input"}, + studiensemester_kurzbz: {visible: false, headerFilter:"input"}, + studiengang_kz: {visible: false, headerFilter:"input"}, + stg_bezeichnung: {headerFilter:"input"}, + lv_bezeichnung: {headerFilter:"input"}, + ects: {headerFilter:"input", align:"center"}, + student: {headerFilter:"input"}, + begruendung: {headerFilter:"input"}, + zgv: {visible: false, headerFilter:"input"}, + dokument_bezeichnung: {headerFilter:"input", formatter:"link", formatterParams:{ + labelField:"dokument_bezeichnung", + url:function(cell){return "'. current_url() .'/download?dms_id=" + cell.getData().dms_id}, + target:"_blank" + }}, + anmerkung_student: {headerFilter:"input"}, + antragsdatum: {align:"center", headerFilter:"input", mutator: mut_formatStringDate}, + empfehlung_anrechnung: {headerFilter:"input", align:"center", formatter: format_empfehlung_anrechnung, headerFilterFunc: hf_filterTrueFalse}, + status_kurzbz: {visible: false, headerFilter:"input"}, + status_bezeichnung: {headerFilter:"input"} + }', // col properties +); + +echo $this->widgetlib->widget('TableWidget', $filterWidgetArray); + +?> \ No newline at end of file From fe2601b29ae15bbf7b92136ed24305e920506a0d Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 13:25:25 +0100 Subject: [PATCH 13/88] Adapt view to use Fachbereichsleitungs-DataView --- .../views/lehre/anrechnung/reviewAnrechnungUebersicht.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php index ae5e08055..82e66487f 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php @@ -117,7 +117,13 @@ $this->load->view(
- load->view('lehre/anrechnung/reviewAnrechnungUebersichtData.php'); ?> + load->config('anrechnung'); + if($this->config->item('fbl')===TRUE) + $this->load->view('lehre/anrechnung/reviewAnrechnungUebersichtData_fbl.php'); + else + $this->load->view('lehre/anrechnung/reviewAnrechnungUebersichtData.php');?>
From 0197e5b175cd81a2e059d845cbe2cbd98f468e67 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 13:33:28 +0100 Subject: [PATCH 14/88] Adapted STGL Views to display Fachbereichsleitung (as 'Empfaenger') after recommendation --- .../anrechnung/ApproveAnrechnungDetail.php | 23 +++++++++++-------- .../ApproveAnrechnungUebersicht.php | 23 +++++++++++++------ 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php index 1f5c853db..ccdabf4e0 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php @@ -33,6 +33,9 @@ class approveAnrechnungDetail extends Auth_Controller ) ); + //Load configs + $this->load->config('anrechnung'); + // Load models $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); $this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel'); @@ -227,16 +230,18 @@ class approveAnrechnungDetail extends Auth_Controller // Count up LV with no lector $counter++; - // Break, if LV has no lector - break; - } + // Get Fachbereichsleitung or LV Leitung. + if($this->config->item('fbl') === TRUE) + { + $result = $this->anrechnunglib->getFachbereichleitung($anrechnung_id); + } + else + { + // If LV Leitung is not present, gets all LV lectors. + $result = $this->anrechnunglib->getLectors($anrechnung_id); + } - // Get full name of LV Leitung. - // If LV Leitung is not present, get full name of LV lectors. - $lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']); - $empfehlungsanfrage_an = !isEmptyArray($lector_arr) - ? implode(', ', array_column($lector_arr, 'fullname')) - : ''; + $empfehlungsanfrage_an = !isEmptyArray($result) ? implode(', ', array_column($result, 'fullname')) : ''; // Request Recommendation if($this->anrechnunglib->requestRecommendation($item['anrechnung_id'])) diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php index 9eb0c9734..b6bae4b32 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php @@ -28,6 +28,9 @@ class approveAnrechnungUebersicht extends Auth_Controller ) ); + // Load configs + $this->load->config('anrechnung'); + // Load models $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); $this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel'); @@ -207,14 +210,20 @@ class approveAnrechnungUebersicht extends Auth_Controller // Request Recommendation if($this->anrechnunglib->requestRecommendation($item['anrechnung_id'])) { - // Get full name of LV Leitung. - // If LV Leitung is not present, get full name of LV lectors. - $lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']); - $empfehlungsanfrage_an = !isEmptyArray($lector_arr) - ? implode(', ', array_column($lector_arr, 'fullname')) - : ''; + // Get full name of Fachbereichsleitung or LV Leitung. + if($this->config->item('fbl') === TRUE) + { + $result = $this->anrechnunglib->getFachbereichleitung($item['anrechnung_id']); + } + else + { + // If LV Leitung is not present, get full name of LV lectors. + $result = $this->anrechnunglib->getLectors($item['anrechnung_id']); + } - $retval[]= array( + $empfehlungsanfrage_an = !isEmptyArray($result) ? implode(', ', array_column($result, 'fullname')) : ''; + + $retval[]= array( 'anrechnung_id' => $item['anrechnung_id'], 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR, 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR), From d3a1ed222c449a934761477bdafcd0ff2768c42f Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 13:40:58 +0100 Subject: [PATCH 15/88] Adapted to send mails only if config['mail'] is TRUE --- .../anrechnung/ApproveAnrechnungDetail.php | 5 +++- .../ApproveAnrechnungUebersicht.php | 7 +++-- .../anrechnung/ReviewAnrechnungDetail.php | 25 +++++++++++------ .../anrechnung/ReviewAnrechnungUebersicht.php | 27 ++++++++++++------- 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php index ccdabf4e0..8bcf3ef7a 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php @@ -264,7 +264,10 @@ class approveAnrechnungDetail extends Auth_Controller * */ if (!isEmptyArray($retval)) { - self::_sendSanchoMailToLectors($retval); + if ($this->config->item('send_mail') === TRUE) + { + $this->_sendSanchoMailToLectors($anrechnung_id); + } // Output json to ajax return $this->outputJsonSuccess($retval); diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php index b6bae4b32..836e7f719 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php @@ -235,13 +235,16 @@ class approveAnrechnungUebersicht extends Auth_Controller } /** - * Send mails to lectors + * Send mails * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector * even if they are required for more recommendations * */ if (!isEmptyArray($retval)) { - self::_sendSanchoMailToLectors($retval); + if ($this->config->item('send_mail') === TRUE) + { + $this->_sendSanchoMail($retval); + } } // Output json to ajax diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php index 1bd92004d..53c4bb815 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php @@ -28,6 +28,9 @@ class reviewAnrechnungDetail extends Auth_Controller ) ); + // Load configs + $this->load->config('anrechnung'); + // Load models $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); $this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel'); @@ -140,10 +143,13 @@ class reviewAnrechnungDetail extends Auth_Controller * Send mails to STGL (if not present STGL, send to STGL assistance) * NOTE: mails are sent at the end to ensure sending only one mail to each STGL * */ - if (!$this->_sendSanchoMails($json, true)) - { - return $this->outputJsonError('Failed sending emails'); - } + if ($this->config->item('send_mail') === TRUE) + { + if (!$this->_sendSanchoMails($json, true)) + { + return $this->outputJsonError('Failed sending emails'); + } + } return $this->outputJsonSuccess($json); } @@ -191,10 +197,13 @@ class reviewAnrechnungDetail extends Auth_Controller if (isset($json) && !isEmptyArray($json)) { // Send mails to STGL (if not present STGL, send to STGL assistance) - if (!$this->_sendSanchoMails($json, false)) - { - return $this->outputJsonError('Failed sending emails'); - } + if ($this->config->item('send_mail') === TRUE) + { + if (!$this->_sendSanchoMails($json, false)) + { + return $this->outputJsonError('Failed sending emails'); + } + } return $this->outputJsonSuccess($json); } diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php index c63d0af69..74d13698a 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php @@ -26,6 +26,9 @@ class reviewAnrechnungUebersicht extends Auth_Controller ) ); + // Load configs + $this->load->config('anrechnung'); + // Load models $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); $this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel'); @@ -111,16 +114,19 @@ class reviewAnrechnungUebersicht extends Auth_Controller * Send mails to STGL (if not present STGL, send to STGL assistance) * NOTE: mails are sent at the end to ensure sending only one mail to each STGL * */ - if (!$this->_sendSanchoMails($json, true)) - { - show_error('Failed sending emails'); - } + if ($this->config->item('send_mail') === TRUE) + { + if (!$this->_sendSanchoMails($json, true)) + { + show_error('Failed sending emails'); + } + } return $this->outputJsonSuccess($json); } else { - return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); + $this->terminateWithJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); } } @@ -154,10 +160,13 @@ class reviewAnrechnungUebersicht extends Auth_Controller if (isset($json) && !isEmptyArray($json)) { // Send mails to STGL (if not present STGL, send to STGL assistance) - if (!$this->_sendSanchoMails($json, false)) - { - show_error('Failed sending emails'); - } + if ($this->config->item('send_mail') === TRUE) + { + if (!$this->_sendSanchoMails($json, false)) + { + show_error('Failed sending emails'); + } + } return $this->outputJsonSuccess($json); } From e148d8c2f48a25f8da6a00ff099ab04b9f9b170d Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 13:49:23 +0100 Subject: [PATCH 16/88] Added function to get Fachbereich as mail receivers --- .../anrechnung/ApproveAnrechnungDetail.php | 30 +++++++--- .../ApproveAnrechnungUebersicht.php | 57 +++++++++++++++---- 2 files changed, 69 insertions(+), 18 deletions(-) diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php index 8bcf3ef7a..bc5f19bd8 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php @@ -496,18 +496,24 @@ class approveAnrechnungDetail extends Auth_Controller /** - * Get lectors (prio for LV-Leitung, if not present to all lectors of LV. + * Get mail receivers. + * If config is default (lectors): prio for LV-Leitung, if not present to all lectors of LV. * Anyway this function will receive a unique array to avoid sending more mails to one and the same lector. * **/ - $lector_arr = $this->_getLectors($anrechnung_arr); + if ($this->config->item('fbl') === TRUE) + { + $receiver_arr = $this->_getFachbereichleitung($lehrveranstaltung_id); + } + else + { + $receiver_arr = $this->_getLectors($studiensemester_kurzbz, $lehrveranstaltung_id); + } - - - // Send mail to lectors - foreach ($lector_arr as $lector) + // Send mail + foreach ($receiver_arr as $receiver) { - $to = $lector->uid; - $vorname = $lector->vorname; + $to = $receiver->uid. '@'. DOMAIN;; + $vorname = $receiver->vorname; // Get full name of stgl $this->load->model('person/Person_model', 'PersonModel'); @@ -592,6 +598,14 @@ class approveAnrechnungDetail extends Auth_Controller } + // Get Fachbereichsleitungen + private function _getFachbereichleitung($lehrveranstaltung_id) + { + $result = $this->LehrveranstaltungModel->getFachbereichByLv($lehrveranstaltung_id); + + return hasData($result) ? getData($result) : show_error('Failed retrieving Fachbereichsleitung'); + } + private function _saveEmpfehlungsNotiz($anrechnung_id, $empfehlungstext, $notiz_id) { $this->load->model('person/Notiz_model', 'NotizModel'); diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php index 836e7f719..c647138c9 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php @@ -328,7 +328,7 @@ class approveAnrechnungUebersicht extends Auth_Controller * @param $mail_params * @return bool */ - private function _sendSanchoMailToLectors($mail_params) + private function _sendSanchoMail($mail_params) { // Get Lehrveranstaltungen $anrechnung_arr = array(); @@ -344,18 +344,25 @@ class approveAnrechnungUebersicht extends Auth_Controller $anrechnung_arr = array_unique($anrechnung_arr, SORT_REGULAR); - - /** - * Get lectors (prio for LV-Leitung, if not present to all lectors of LV. - * Anyway this function will receive a unique array to avoid sending more mails to one and the same lector. - * **/ - $lector_arr = $this->_getLectors($anrechnung_arr); + /** + * Get mail receivers. + * If retrieving lectors: prio for LV-Leitung, if not present to all lectors of LV. + * This function will receive a unique array to avoid sending more mails to one and the same user. + **/ + if($this->config->item('fbl') === TRUE) + { + $receiver_arr = $this->_getFachbereichleitung($anrechnung_arr); + } + else + { + $receiver_arr = $this->_getLectors($anrechnung_arr); + } // Send mail to lectors - foreach ($lector_arr as $lector) + foreach ($receiver_arr as $receiver) { - $to = $lector->uid; - $vorname = $lector->vorname; + $to = $receiver->uid. '@'. DOMAIN; + $vorname = $receiver->vorname; // Get full name of stgl $this->load->model('person/Person_model', 'PersonModel'); @@ -439,4 +446,34 @@ class approveAnrechnungUebersicht extends Auth_Controller return $lector_arr; } + + /** + * Get Fachbereichsleitung with unique uids. + * + * @param $anrechnung_arr + * @return array + */ + private function _getFachbereichleitung($anrechnung_arr) + { + $fbl_arr = array(); + + // Get lectors + foreach($anrechnung_arr as $anrechnung) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $result = $this->LehrveranstaltungModel->getFachbereichByLv($anrechnung['lehrveranstaltung_id']); + + if (!hasData($result)) + { + show_error('No Fachbereichsleitung found'); + } + + $fbl_arr = array_merge($fbl_arr, getData($result)); + } + + // Make Fachbereichsleiter array unique + $fbl_arr = array_unique($fbl_arr, SORT_REGULAR); + + return $fbl_arr; + } } From 21060b31dc07b03fb108614a3e30049a6edd904f Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 13:59:28 +0100 Subject: [PATCH 17/88] Bugfixed error message when LV has no lectors and only one recommendation is requested --- .../anrechnung/ApproveAnrechnungDetail.php | 19 ++++++++----------- .../ApproveAnrechnungUebersicht.php | 9 +++++++-- .../anrechnung/approveAnrechnungUebersicht.js | 8 ++++---- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php index bc5f19bd8..3f8f67639 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php @@ -220,15 +220,12 @@ class approveAnrechnungDetail extends Auth_Controller } $retval = array(); - $counter = 0; - - foreach ($data as $item) - { - // Check if Anrechnungs-LV has lector - if (!$this->anrechnunglib->LVhasLector($item['anrechnung_id'])) - { - // Count up LV with no lector - $counter++; + + // Check if Anrechnungs-LV has lector + if (!$this->anrechnunglib->LVhasLector($anrechnung_id)) + { + $this->terminateWithJsonError('LV has no lector'); + } // Get Fachbereichsleitung or LV Leitung. if($this->config->item('fbl') === TRUE) @@ -274,9 +271,9 @@ class approveAnrechnungDetail extends Auth_Controller } // Output json to ajax - if (isEmptyArray($retval) && $counter > 0) + if (isEmptyArray($retval)) { - return $this->outputJsonError( + $this->terminateWithJsonError( "Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt." ); } diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php index c647138c9..77ee5bb40 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php @@ -248,9 +248,14 @@ class approveAnrechnungUebersicht extends Auth_Controller } // Output json to ajax - if (isEmptyArray($retval) && $counter == 0) + if (isEmptyArray($retval)) { - return $this->outputJsonError('Es wurden keine Empfehlungen angefordert'); + if ($counter > 0) + { + $this->terminateWithJsonError('Bei '. $counter.' LV sind keine LektorInnen zugeteilt.'); + } + + $this->terminateWithJsonError('Es wurden keine Empfehlungen angefordert'); } return $this->outputJsonSuccess($retval); diff --git a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js index e831856d8..0198bfb26 100644 --- a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js @@ -603,14 +603,14 @@ $(function(){ // Print success message FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "empfehlungWurdeAngefordert")); } - } //Update status 'genehmigt' $('#tableWidgetTabulator').tabulator('updateData', data); - // Deselect rows - var indexesToDeselect = data.map(x => x.anrechnung_id); - $("#tableWidgetTabulator").tabulator('deselectRow', indexesToDeselect); + // Deselect rows + var indexesToDeselect = data.map(x => x.anrechnung_id); + $("#tableWidgetTabulator").tabulator('deselectRow', indexesToDeselect); + } }, errorCallback: function (jqXHR, textStatus, errorThrown) { From 8735318545cfc070377b7a005643658c0738d443 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 14:03:22 +0100 Subject: [PATCH 18/88] Enhanced code readability --- .../anrechnung/ApproveAnrechnungDetail.php | 119 ++++++++---------- .../anrechnung/ReviewAnrechnungUebersicht.php | 4 +- .../anrechnung/approveAnrechnungDetail.js | 10 +- .../anrechnung/approveAnrechnungUebersicht.js | 19 +-- 4 files changed, 57 insertions(+), 95 deletions(-) diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php index 3f8f67639..6c03aeb07 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php @@ -212,9 +212,9 @@ class approveAnrechnungDetail extends Auth_Controller */ public function requestRecommendation() { - $data = $this->input->post('data'); + $anrechnung_id = $this->input->post('anrechnung_id'); - if(isEmptyArray($data)) + if(isEmptyString($anrechnung_id)) { return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } @@ -227,32 +227,31 @@ class approveAnrechnungDetail extends Auth_Controller $this->terminateWithJsonError('LV has no lector'); } - // Get Fachbereichsleitung or LV Leitung. - if($this->config->item('fbl') === TRUE) - { - $result = $this->anrechnunglib->getFachbereichleitung($anrechnung_id); - } - else - { - // If LV Leitung is not present, gets all LV lectors. - $result = $this->anrechnunglib->getLectors($anrechnung_id); - } + // Get Fachbereichsleitung or LV Leitung. + if($this->config->item('fbl') === TRUE) + { + $result = $this->anrechnunglib->getFachbereichleitung($anrechnung_id); + } + else + { + // If LV Leitung is not present, gets all LV lectors. + $result = $this->anrechnunglib->getLectors($anrechnung_id); + } - $empfehlungsanfrage_an = !isEmptyArray($result) ? implode(', ', array_column($result, 'fullname')) : ''; + $empfehlungsanfrage_an = !isEmptyArray($result) ? implode(', ', array_column($result, 'fullname')) : ''; - // Request Recommendation - if($this->anrechnunglib->requestRecommendation($item['anrechnung_id'])) - { - $retval[]= array( - 'anrechnung_id' => $item['anrechnung_id'], - 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR, - 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR), - 'empfehlung_anrechnung' => null, - 'empfehlungsanfrageAm' => (new DateTime())->format('d.m.Y'), - 'empfehlungsanfrageAn' => $empfehlungsanfrage_an - ); - } - } + // Request Recommendation + if($this->anrechnunglib->requestRecommendation($anrechnung_id)) + { + $retval[]= array( + 'anrechnung_id' => $anrechnung_id, + 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR, + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR), + 'empfehlung_anrechnung' => null, + 'empfehlungsanfrageAm' => (new DateTime())->format('d.m.Y'), + 'empfehlungsanfrageAn' => $empfehlungsanfrage_an + ); + } /** * Send mails to lectors @@ -278,7 +277,7 @@ class approveAnrechnungDetail extends Auth_Controller ); } - return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); + $this->terminateWithJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); } /** @@ -472,25 +471,13 @@ class approveAnrechnungDetail extends Auth_Controller /** * Send mail to lectors asking for recommendation. (first to LV-Leitung, if not present to all lectors of lv) - * @param $mail_params + * @param $anrechnung_id * @return bool */ - private function _sendSanchoMailToLectors($mail_params) + private function _sendSanchoMailToLectors($anrechnung_id) { - // Get Lehrveranstaltungen - $anrechnung_arr = array(); - - foreach ($mail_params as $item) - { - $this->AnrechnungModel->addSelect('lehrveranstaltung_id, studiensemester_kurzbz'); - $anrechnung_arr[]= array( - 'lehrveranstaltung_id' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->lehrveranstaltung_id, - 'studiensemester_kurzbz' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->studiensemester_kurzbz - ); - } - - $anrechnung_arr = array_unique($anrechnung_arr, SORT_REGULAR); - + $lehrveranstaltung_id = $this->AnrechnungModel->load($anrechnung_id)->retval[0]->lehrveranstaltung_id; + $studiensemester_kurzbz = $this->AnrechnungModel->load($anrechnung_id)->retval[0]->studiensemester_kurzbz; /** * Get mail receivers. @@ -548,35 +535,30 @@ class approveAnrechnungDetail extends Auth_Controller * @param $anrechnung_arr * @return array */ - private function _getLectors($anrechnung_arr) + private function _getLectors($studiensemester_kurzbz, $lehrveranstaltung_id) { $lector_arr = array(); - // Get lectors - foreach($anrechnung_arr as $anrechnung) - { - $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); - $result = $this->LehrveranstaltungModel->getLecturersByLv($anrechnung['studiensemester_kurzbz'], $anrechnung['lehrveranstaltung_id']); + $result = $this->LehrveranstaltungModel->getLecturersByLv($studiensemester_kurzbz, $lehrveranstaltung_id); - if (!$result = getData($result)) - { - show_error('Failed retrieving lectors of Lehrveranstaltung'); - } + if (!$result = getData($result)) + { + show_error('Failed retrieving lectors of Lehrveranstaltung'); + } - // Check if lv has LV-Leitung - $key = array_search(true, array_column($result, 'lvleiter')); + // Check if lv has LV-Leitung + $key = array_search(true, array_column($result, 'lvleiter')); - // If lv has LV-Leitung, keep only the one - if ($key !== false) - { - $lector_arr[]= $result[$key]; - } - // ...otherwise keep all lectors - else - { - $lector_arr = array_merge($lector_arr, $result); - } - } + // If lv has LV-Leitung, keep only the one + if ($key !== false) + { + $lector_arr[]= $result[$key]; + } + // ...otherwise keep all lectors + else + { + $lector_arr = array_merge($lector_arr, $result); + } /** * NOTE: This step is only done to make the array unique by uid, vorname and nachname in the following step @@ -625,8 +607,5 @@ class approveAnrechnungDetail extends Auth_Controller trim($empfehlungstext), $this->_uid ); - - } - -} +} \ No newline at end of file diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php index 74d13698a..3ea7e4075 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php @@ -231,9 +231,9 @@ class reviewAnrechnungUebersicht extends Auth_Controller if($result = getData($result)) { - $entitled_lector_arr = array_column($result, 'uid'); + $entitled_uid_arr = array_column($result, 'uid'); - if (in_array($this->_uid, $entitled_lector_arr)) + if (in_array($this->_uid, $entitled_uid_arr)) { return; } diff --git a/public/js/lehre/anrechnung/approveAnrechnungDetail.js b/public/js/lehre/anrechnung/approveAnrechnungDetail.js index 3a91f4e3a..0bd92277a 100644 --- a/public/js/lehre/anrechnung/approveAnrechnungDetail.js +++ b/public/js/lehre/anrechnung/approveAnrechnungDetail.js @@ -194,17 +194,9 @@ $(function(){ // Get form data let form_data = $('#form-empfehlung').serializeArray(); - - // Prepare data object for ajax call - let data = { - 'data': [{ - 'anrechnung_id' : form_data[0].value - }] - }; - FHC_AjaxClient.ajaxCallPost( FHC_JS_DATA_STORAGE_OBJECT.called_path + "/requestRecommendation", - data, + {anrechnung_id: form_data[0].value}, { successCallback: function (data, textStatus, jqXHR) { diff --git a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js index 0198bfb26..889316155 100644 --- a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js @@ -556,12 +556,8 @@ $(function(){ } } - selected_data.map(function(data){ - // reduce to necessary fields - return { - 'anrechnung_id' : data.anrechnung_id, - } - }); + // Reduce to necessary fields + selected_data = selected_data.map(data => ({'anrechnung_id' : data.anrechnung_id})); // Alert and exit if no anrechnung is selected if (selected_data.length == 0) @@ -570,14 +566,9 @@ $(function(){ return; } - // Prepare data object for ajax call - let data = { - 'data': selected_data - }; - FHC_AjaxClient.ajaxCallPost( FHC_JS_DATA_STORAGE_OBJECT.called_path + "/requestRecommendation", - data, + {data: selected_data}, { successCallback: function (data, textStatus, jqXHR) { @@ -604,8 +595,8 @@ $(function(){ FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "empfehlungWurdeAngefordert")); } - //Update status 'genehmigt' - $('#tableWidgetTabulator').tabulator('updateData', data); + //Update status 'genehmigt' + $('#tableWidgetTabulator').tabulator('updateData', data); // Deselect rows var indexesToDeselect = data.map(x => x.anrechnung_id); From c3e3d8e9d71349f7e51b311d8359b415ee4819dc Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 14:05:42 +0100 Subject: [PATCH 19/88] Added Fachbereichsleitung permission check to read Anrechnung and download Document --- .../anrechnung/ReviewAnrechnungDetail.php | 20 +++++++++++++++---- .../anrechnung/ReviewAnrechnungUebersicht.php | 10 ++++++++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php index 53c4bb815..63b83df11 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php @@ -262,8 +262,14 @@ class reviewAnrechnungDetail extends Auth_Controller show_error('Failed retrieving Anrechnung'); } - $result = $this->LehrveranstaltungModel - ->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + if($this->config->item('fbl') === TRUE) + { + $result = $this->LehrveranstaltungModel->getFachbereichByLv($result->lehrveranstaltung_id); + } + else + { + $result = $this->LehrveranstaltungModel->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + } if($result = getData($result)) { @@ -291,8 +297,14 @@ class reviewAnrechnungDetail extends Auth_Controller show_error('Failed retrieving Anrechnung'); } - $result = $this->LehrveranstaltungModel - ->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + if($this->config->item('fbl') === TRUE) + { + $result = $this->LehrveranstaltungModel->getFachbereichByLv($result->lehrveranstaltung_id); + } + else + { + $result = $this->LehrveranstaltungModel->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + } if($result = getData($result)) { diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php index 3ea7e4075..77dfeeb57 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php @@ -226,8 +226,14 @@ class reviewAnrechnungUebersicht extends Auth_Controller show_error('Failed retrieving Anrechnung'); } - $result = $this->LehrveranstaltungModel - ->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + if ($this->config->item('fbl') === TRUE) + { + $result = $this->LehrveranstaltungModel->getFachbereichByLv($result->lehrveranstaltung_id); + } + else + { + $result = $this->LehrveranstaltungModel->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + } if($result = getData($result)) { From 32bdeec02eff38f57671de56d54b8f6b2fbcca90 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 15:49:04 +0100 Subject: [PATCH 20/88] Added date check for Fachbereichsleitung in Tabulator query --- .../lehre/anrechnung/reviewAnrechnungUebersichtData_fbl.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData_fbl.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData_fbl.php index a20d85f9f..f586e428d 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData_fbl.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData_fbl.php @@ -62,6 +62,8 @@ JOIN public.tbl_benutzerfunktion bf using (oe_kurzbz) /*AND lema.mitarbeiter_uid = \'' . $LEKTOR_UID . '\'*/ AND le.lehre = TRUE AND bf.funktion_kurzbz = \'Leitung\' +and bf.datum_von <= now() +and (bf.datum_bis >= now() or bf.datum_bis is null) AND og.organisationseinheittyp_kurzbz = \'Fachbereich\' AND bf.uid = \'' . $LEKTOR_UID . '\' AND EXISTS ( From 40c7e1c9f0e206b13ef7d7435071fb069eb6ddd9 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 15:52:30 +0100 Subject: [PATCH 21/88] Created new Approve Anrechnung Uebersicht for Fachbereichsleitung --- .../approveAnrechnungUebersichtData_fbl.php | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 application/views/lehre/anrechnung/approveAnrechnungUebersichtData_fbl.php diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData_fbl.php b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData_fbl.php new file mode 100644 index 000000000..08d7638fc --- /dev/null +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData_fbl.php @@ -0,0 +1,235 @@ +>' . $LANGUAGE_INDEX . ', + array_to_json(zgv.bezeichnung::varchar[])->>' . $LANGUAGE_INDEX . ' + ) AS zgv + FROM public.tbl_prestudent + LEFT JOIN bis.tbl_zgv zgv USING (zgv_code) + LEFT JOIN bis.tbl_zgvmaster zgvmaster USING (zgvmas_code) + WHERE prestudent_id = anrechnung.prestudent_id + ) AS zgv, + anrechnung.insertamum::date AS "antragsdatum", + empfehlung_anrechnung, + (SELECT status_kurzbz + FROM lehre.tbl_anrechnungstatus + JOIN lehre.tbl_anrechnung_anrechnungstatus USING (status_kurzbz) + WHERE anrechnung_id = anrechnung.anrechnung_id + ORDER BY insertamum DESC + LIMIT 1 + ) AS status_kurzbz, + student.student_uid, + anrechnung.prestudent_id + FROM lehre.tbl_anrechnung AS anrechnung + JOIN public.tbl_prestudent USING (prestudent_id) + JOIN public.tbl_person AS person USING (person_id) + JOIN public.tbl_studiengang AS stg USING (studiengang_kz) + JOIN lehre.tbl_lehrveranstaltung AS lv USING (lehrveranstaltung_id) + LEFT JOIN campus.tbl_dms_version AS dmsversion USING (dms_id) + JOIN lehre.tbl_anrechnung_anrechnungstatus USING (anrechnung_id) + JOIN lehre.tbl_anrechnung_begruendung AS begruendung USING (begruendung_id) + JOIN public.tbl_student student USING (prestudent_id) + WHERE anrechnung.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND stg.studiengang_kz IN (' . $STUDIENGAENGE_ENTITLED . ') + ) + + SELECT anrechnungen.anrechnung_id, + anrechnungen.lehrveranstaltung_id, + anrechnungen.begruendung_id, + anrechnungen.dms_id, + anrechnungen.studiensemester_kurzbz, + anrechnungen.studiengang_kz, + anrechnungen.stg_bezeichnung, + anrechnungen.orgform_kurzbz, + anrechnungen.ausbildungssemester, + anrechnungen.lv_bezeichnung, + anrechnungen.ects::float4 AS ects, + NULL AS "ectsSumBisherUndNeu", + anrechnungen.ectsSumSchulisch::float4 AS "ectsSumSchulisch", + anrechnungen.ectsSumBeruflich::float4 AS "ectsSumBeruflich", + anrechnungen.begruendung, + anrechnungen.student, + anrechnungen.dokument_bezeichnung, + anrechnungen.anmerkung_student, + anrechnungen.zgv, + anrechnungen.antragsdatum, + anrechnungen.empfehlung_anrechnung, + anrechnungen.status_kurzbz, + array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung", + anrechnungen.prestudent_id, + CASE + WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL + ELSE + (SELECT insertamum::date + FROM lehre.tbl_anrechnungstatus + JOIN lehre.tbl_anrechnung_anrechnungstatus USING (status_kurzbz) + WHERE anrechnung_id = anrechnungen.anrechnung_id + AND status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR . '\' + ORDER BY insertamum DESC + LIMIT 1) + END "empfehlungsanfrageAm", + CASE + WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL + ELSE + (SELECT COALESCE( + STRING_AGG(CONCAT_WS(\' \', vorname, nachname), \', \') + ) empfehlungsanfrageAn + FROM ( + SELECT DISTINCT ON (benutzer.uid) bf.uid, vorname, nachname + FROM lehre.tbl_lehreinheit + JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id) + JOIN public.tbl_organisationseinheit og using (oe_kurzbz) + JOIN public.tbl_benutzerfunktion bf using (oe_kurzbz) + JOIN public.tbl_benutzer benutzer ON bf.uid = benutzer.uid + JOIN public.tbl_person USING (person_id) + WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + and bf.datum_von <= now() + and (bf.datum_bis >= now() or bf.datum_bis is null) + AND lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id + AND benutzer.aktiv = TRUE + AND tbl_person.aktiv = TRUE + ORDER BY benutzer.uid, nachname, vorname + ) as tmp_lvlektoren + ) + END "empfehlungsanfrageAn" + FROM anrechnungen + JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz) + WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND studiengang_kz IN (' . $STUDIENGAENGE_ENTITLED . ') +'; + +$filterWidgetArray = array( + 'query' => $query, + 'tableUniqueId' => 'approveAnrechnungUebersicht', + 'requiredPermissions' => 'lehre/anrechnung_genehmigen', + 'datasetRepresentation' => 'tabulator', + 'columnsAliases' => array( + 'anrechnung_id', + 'lehrveranstaltung_id', + 'begruendung_id', + 'dms_id', + 'studiensemester_kurzbz', + 'studiengang_kz', + ucfirst($this->p->t('lehre', 'studiengang')), + ucfirst($this->p->t('lehre', 'organisationsform')), + 'Semester', + ucfirst($this->p->t('lehre', 'lehrveranstaltung')), + 'ECTS (LV)', + 'ECTS (LV + Bisher)', + 'ECTS (Bisher schulisch)', + 'ECTS (Bisher beruflich', + ucfirst($this->p->t('global', 'begruendung')), + ucfirst($this->p->t('person', 'studentIn')), + ucfirst($this->p->t('anrechnung', 'nachweisdokumente')), + ucfirst($this->p->t('anrechnung', 'herkunft')), + ucfirst($this->p->t('global', 'zgv')), + ucfirst($this->p->t('anrechnung', 'antragdatum')), + ucfirst($this->p->t('anrechnung', 'empfehlung')), + 'status_kurzbz', + 'Status', + 'PrestudentID', + ucfirst($this->p->t('anrechnung', 'empfehlungsanfrageAm')), + ucfirst($this->p->t('anrechnung', 'empfehlungsanfrageAn')) + ), + 'datasetRepOptions' => '{ + height: func_height(this), + layout: "fitColumns", // fit columns to width of table + persistentLayout:true, + persistentSort:true, + persistentFilter:true, + autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated + headerFilterPlaceholder: " ", + index: "anrechnung_id", // assign specific column as unique id (important for row indexing) + selectable: true, // allow row selection + selectableRangeMode: "click", // allow range selection using shift end click on end of range + selectablePersistence:false, // deselect previously selected rows when table is filtered, sorted or paginated + tableBuilt: function(){ + func_tableBuilt(this); + }, + tableWidgetFooter: { + selectButtons: true + }, + selectableCheck: function(row){ + return func_selectableCheck(row); + }, + rowFormatter:function(row){ + func_rowFormatter(row); + }, + rowSelectionChanged:function(data, rows){ + func_rowSelectionChanged(data, rows); + }, + tooltips: function(cell){ + return func_tooltips(cell); + } + }', // tabulator properties + 'datasetRepFieldsDefs' => '{ + anrechnung_id: {visible: false, headerFilter:"input"}, + lehrveranstaltung_id: {visible: false, headerFilter:"input"}, + begruendung_id: {visible: false, headerFilter:"input"}, + dms_id: {visible: false, headerFilter:"input"}, + studiensemester_kurzbz: {visible: false, headerFilter:"input"}, + studiengang_kz: {visible: false, headerFilter:"input"}, + stg_bezeichnung: {headerFilter:"input"}, + orgform_kurzbz: {headerFilter:"input"}, + ausbildungssemester: {headerFilter:"input"}, + lv_bezeichnung: {headerFilter:"input"}, + ects: {headerFilter:"input", align:"center"}, + ectsSumBisherUndNeu: {formatter: format_ectsSumBisherUndNeu}, + ectsSumSchulisch: {visible: false, headerFilter:"input", align:"right"}, + ectsSumBeruflich: {visible: false, headerFilter:"input", align:"right"}, + begruendung: {headerFilter:"input", visible: true}, + student: {headerFilter:"input"}, + zgv: {visible: false, headerFilter:"input"}, + dokument_bezeichnung: {headerFilter:"input", formatter:"link", formatterParams:{ + labelField:"dokument_bezeichnung", + url:function(cell){return "'. current_url() .'/download?dms_id=" + cell.getData().dms_id}, + target:"_blank" + }}, + anmerkung_student: {headerFilter:"input"}, + antragsdatum: {align:"center", headerFilter:"input", mutator: mut_formatStringDate}, + empfehlung_anrechnung: {headerFilter:"input", align:"center", formatter: format_empfehlung_anrechnung, headerFilterFunc: hf_filterTrueFalse}, + status_kurzbz: {visible: false, headerFilter:"input"}, + status_bezeichnung: {headerFilter:"input"}, + prestudent_id: {visible: false, headerFilter:"input"}, + empfehlungsanfrageAm: {visible: false, align:"center", headerFilter:"input", mutator: mut_formatStringDate}, + empfehlungsanfrageAn: {visible: false, headerFilter:"input"} + }', // col properties +); + +echo $this->widgetlib->widget('TableWidget', $filterWidgetArray); + +?> From 8d221be0505c695a9920014c19780508d384575a Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 6 Dec 2022 15:53:15 +0100 Subject: [PATCH 22/88] Adapt view to use Fachbereichsleitung-DataView --- .../lehre/anrechnung/approveAnrechnungUebersicht.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php b/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php index f5d1e8214..34cb6b998 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php @@ -124,7 +124,14 @@ $this->load->view(
- load->view('lehre/anrechnung/approveAnrechnungUebersichtData.php'); ?> + load->config('anrechnung'); + if ($this->config->item('fbl') === TRUE) + $this->load->view('lehre/anrechnung/approveAnrechnungUebersichtData_fbl.php'); + else + $this->load->view('lehre/anrechnung/approveAnrechnungUebersichtData.php'); + ?>
From 29f1760a7c6573e27781125af8d1f60372d71a1e Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 11 Jan 2023 13:45:18 +0100 Subject: [PATCH 23/88] =?UTF-8?q?Added:=20LektorInnen=20sehen=20jetzt=20nu?= =?UTF-8?q?r=20Anrechnungen,=20f=C3=BCr=20die=20sie=20eine=20Empfehlung=20?= =?UTF-8?q?abgeben=20d=C3=BCrfen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Es gibt eine neue Spalte 'empfehlungsberechtigt' in der Anrechnungentabelle. Defaultmäßig werden nur 'empfehlungsberechtigt' Anrechnungen angezeigt, wo LektorIn: - LV Leitung der LV ist ODER - die LV keine LV-Leitung hat Über den Filter können aber auch alle angezeigt werden. --- .../reviewAnrechnungUebersichtData.php | 41 ++++++++++++++++--- .../anrechnung/reviewAnrechnungUebersicht.js | 12 +++++- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php index d48018171..aa28d7fc0 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php @@ -46,16 +46,40 @@ $query = ' LEFT JOIN campus.tbl_dms_version AS dmsversion USING (dms_id) JOIN lehre.tbl_anrechnung_anrechnungstatus USING (anrechnung_id) JOIN lehre.tbl_anrechnung_begruendung AS begruendung USING (begruendung_id) - ) + WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + ), + tbl_lvleitungen AS + ( + SELECT DISTINCT ON (benutzer.uid, lehrveranstaltung_id) lehrveranstaltung_id, uid, + CASE WHEN lehrfunktion_kurzbz = \'LV-Leitung\' THEN TRUE + ELSE FALSE + END AS lvleiter + FROM lehre.tbl_lehreinheit + JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) + JOIN public.tbl_benutzer benutzer ON lema.mitarbeiter_uid = benutzer.uid + JOIN public.tbl_person USING (person_id) + JOIN lehre.tbl_anrechnung USING (lehrveranstaltung_id) + WHERE tbl_lehreinheit.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND benutzer.aktiv = TRUE + AND tbl_person.aktiv = TRUE + ORDER BY lehrveranstaltung_id, benutzer.uid, lehrfunktion_kurzbz DESC + ) SELECT DISTINCT ON (anrechnungen.*, lema.mitarbeiter_uid) anrechnungen.*, - array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung" + array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung", + CASE + -- erst prüfen, ob es überhaupt eine LV Leitung gibt (wenn nicht, dann immer empfehlungsberechtigt) + WHEN EXISTS (SELECT 1 FROM tbl_lvleitungen WHERE lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id AND lvleiter = TRUE) + -- wenn ja, return true, wenn user LV Leitung ist oder false, wenn nicht + THEN (SELECT EXISTS (SELECT 1 FROM tbl_lvleitungen WHERE lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id AND lvleiter = TRUE AND uid = \'' . $LEKTOR_UID . '\')) + -- wenn es keine LV Leitung, return immer true + ELSE TRUE + END AS empfehlungsberechtigt FROM anrechnungen JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz) JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id) JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) - WHERE anrechnungen.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' - AND le.studiensemester_kurzbz = anrechnungen.studiensemester_kurzbz + WHERE le.studiensemester_kurzbz = anrechnungen.studiensemester_kurzbz AND lema.mitarbeiter_uid = \'' . $LEKTOR_UID . '\' AND le.lehre = TRUE AND EXISTS ( @@ -89,7 +113,8 @@ $filterWidgetArray = array( ucfirst($this->p->t('anrechnung', 'antragdatum')), ucfirst($this->p->t('anrechnung', 'empfehlung')), 'status_kurzbz', - 'Status' + 'Status', + 'empfehlungsberechtigt' ), 'datasetRepOptions' => '{ height: func_height(this), @@ -98,6 +123,7 @@ $filterWidgetArray = array( persistentSort:true, autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated headerFilterPlaceholder: " ", + initialHeaderFilter: [{field:"empfehlungsberechtigt", value: true}], index: "anrechnung_id", // assign specific column as unique id (important for row indexing) selectable: true, // allow row selection selectableRangeMode: "click", // allow range selection using shift end click on end of range @@ -139,7 +165,10 @@ $filterWidgetArray = array( antragsdatum: {align:"center", headerFilter:"input", mutator: mut_formatStringDate}, empfehlung_anrechnung: {headerFilter:"input", align:"center", formatter: format_empfehlung_anrechnung, headerFilterFunc: hf_filterTrueFalse}, status_kurzbz: {visible: false, headerFilter:"input"}, - status_bezeichnung: {headerFilter:"input"} + status_bezeichnung: {headerFilter:"input"}, + empfehlungsberechtigt: {formatter:"tickCross", align:"center", + headerFilter:"tickCross", headerFilterParams:{"tristate": true, "initial": true}, headerFilterFunc: hf_empfehlungsberechtigt + } }', // col properties ); diff --git a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js index 47b2a2dc5..b948ecab4 100644 --- a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js @@ -51,6 +51,12 @@ function hf_filterTrueFalse(headerValue, rowValue){ } } +// Filters empfehlungsberechtigt boolean values +function hf_empfehlungsberechtigt(headerValue, rowValue){ + + return rowValue == headerValue.toString(); +} + // Adds column details function func_tableBuilt(table) { table.addColumn( @@ -74,9 +80,10 @@ function func_tableBuilt(table) { // Formats the rows function func_rowFormatter(row){ let status_kurzbz = row.getData().status_kurzbz; + let empfehlungsberechtigt = row.getData().empfehlungsberechtigt; row.getCells().forEach(function(cell){ - if (status_kurzbz != ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR) + if (status_kurzbz != ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR || empfehlungsberechtigt == "false") { row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default } @@ -86,9 +93,10 @@ function func_rowFormatter(row){ // Formats row selectable/unselectable function func_selectableCheck(row){ let status_kurzbz = row.getData().status_kurzbz; + let empfehlungsberechtigt = row.getData().empfehlungsberechtigt; return ( - status_kurzbz == ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR + status_kurzbz == ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR || empfehlungsberechtigt == "false" ); } From d1319a23ad7f608f7a4b6cb184bb2c6d145e6c10 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 11 Jan 2023 13:47:23 +0100 Subject: [PATCH 24/88] =?UTF-8?q?Added:=20STGLs=20sehen=20jetzt=20nur=20An?= =?UTF-8?q?rechnungen=20von=20STGs,=20f=C3=BCr=20die=20sie=20eine=20Berech?= =?UTF-8?q?tigung=20haben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Es gibt eine neue Spalte 'schreibberechtigt' in der Anrechnungentabelle. Defaultmäßig werden nur 'schreibberechtigte' Anrechnungen angezeigt, wo STGL die Berechtigung auf die OE hat. Über den Filter können aber auch alle angezeigt werden. --- .../ApproveAnrechnungUebersicht.php | 16 +++++++++- .../approveAnrechnungUebersichtData.php | 14 ++++++++- .../anrechnung/approveAnrechnungUebersicht.js | 29 ++++++++++++------- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php index 77ee5bb40..7e1853b47 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php @@ -81,6 +81,19 @@ class approveAnrechnungUebersicht extends Auth_Controller show_error(getError($studiengang_kz_arr)); } + // Get oes the user is entitled for + $oe_kurzbz_arr_schreibberechtigt = array(); + if ($oe_arr = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN)) + { + foreach($oe_arr as $oe) + { + $berechtigt = $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $oe); + + if ($berechtigt) $oe_kurzbz_arr_schreibberechtigt[]= $oe; + } + } + + // Check if permission is readonly $hasReadOnlyAccess = $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's') && !$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid'); @@ -90,7 +103,8 @@ class approveAnrechnungUebersicht extends Auth_Controller $viewData = array( 'studiensemester_selected' => $studiensemester_kurzbz, - 'studiengaenge_entitled' => $studiengang_kz_arr, + 'studiengaenge_entitled' => $studiengang_kz_arr, // alle STG mit Lese- und Schreibberechtigung + 'oes_schreibberechtigt' => $oe_kurzbz_arr_schreibberechtigt, // alle STG nur mit Schreibberechtigung 'hasReadOnlyAccess' => $hasReadOnlyAccess, 'hasCreateAnrechnungAccess' => $hasCreateAnrechnungAccess ); diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php index 1eade50d2..87ba57b6f 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php @@ -3,7 +3,8 @@ const ANRECHNUNGSTATUS_PROGRESSED_BY_STGL = 'inProgressDP'; const ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR = 'inProgressLektor'; $STUDIENSEMESTER = $studiensemester_selected; -$STUDIENGAENGE_ENTITLED = implode(', ', $studiengaenge_entitled); +$STUDIENGAENGE_ENTITLED = implode(', ', $studiengaenge_entitled); // alle STG mit Lese- und Schreibberechtigung +$ORGANISATIONSEINHEITEN_SCHREIBBERECHTIGT = "'". implode(', ', $oes_schreibberechtigt). "'"; // alle STG nur mit Schreibberechtigung $LANGUAGE_INDEX = getUserLanguage() == 'German' ? '0' : '1'; $query = ' @@ -14,6 +15,10 @@ $query = ' anrechnung.lehrveranstaltung_id, anrechnung.begruendung_id, anrechnung.dms_id, + CASE + WHEN stg.typ || stg.kurzbz IN (' . $ORGANISATIONSEINHEITEN_SCHREIBBERECHTIGT . ') THEN TRUE + ELSE FALSE + END "schreibberechtigt", anrechnung.studiensemester_kurzbz, stg.studiengang_kz, stg.bezeichnung AS stg_bezeichnung, @@ -71,6 +76,7 @@ $query = ' anrechnungen.lehrveranstaltung_id, anrechnungen.begruendung_id, anrechnungen.dms_id, + anrechnungen.schreibberechtigt, anrechnungen.studiensemester_kurzbz, anrechnungen.studiengang_kz, anrechnungen.stg_bezeichnung, @@ -141,6 +147,7 @@ $filterWidgetArray = array( 'lehrveranstaltung_id', 'begruendung_id', 'dms_id', + 'schreibberechtigt', 'studiensemester_kurzbz', 'studiengang_kz', ucfirst($this->p->t('lehre', 'studiengang')), @@ -172,6 +179,7 @@ $filterWidgetArray = array( persistentFilter:true, autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated headerFilterPlaceholder: " ", + initialHeaderFilter: [{field:"schreibberechtigt", value: true}], index: "anrechnung_id", // assign specific column as unique id (important for row indexing) selectable: true, // allow row selection selectableRangeMode: "click", // allow range selection using shift end click on end of range @@ -200,6 +208,10 @@ $filterWidgetArray = array( lehrveranstaltung_id: {visible: false, headerFilter:"input"}, begruendung_id: {visible: false, headerFilter:"input"}, dms_id: {visible: false, headerFilter:"input"}, + schreibberechtigt: { + formatter:"tickCross", align:"center", + headerFilter:"tickCross", headerFilterParams:{"tristate": true, "initial": true}, headerFilterFunc: hf_schreibberechtigt + }, studiensemester_kurzbz: {visible: false, headerFilter:"input"}, studiengang_kz: {visible: false, headerFilter:"input"}, stg_bezeichnung: {headerFilter:"input"}, diff --git a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js index 395937950..c2a115961 100644 --- a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js @@ -57,6 +57,12 @@ function hf_filterTrueFalse(headerValue, rowValue){ } } +// Filters schreibberechtigt boolean values +function hf_schreibberechtigt(headerValue, rowValue){ + + return rowValue == headerValue.toString(); +} + // Adds column details // Sets focus on filterbutton, if table starts with stored filter. function func_tableBuilt(table) { @@ -173,19 +179,22 @@ function func_selectableCheck(row){ // data = selected data, rows = selected rows function func_rowSelectionChanged(data, rows){ - // Sum up over all anzurechnenden LV-ECTS by Prestudent - selectedPrestudentWithAccumulatedLvEcts = approveAnrechnung.getSumLvEctsByPreStudent(data); + if (tabulator != null) + { + // Sum up over all anzurechnenden LV-ECTS by Prestudent + selectedPrestudentWithAccumulatedLvEcts = approveAnrechnung.getSumLvEctsByPreStudent(data); - // Loop through all active rows - var rowManager = tabulator.rowManager; - for (var i = 0; i < rowManager.activeRows.length; i++) { + // Loop through all active rows + var rowManager = tabulator.rowManager; + for (var i = 0; i < rowManager.activeRows.length; i++) { - // Reinitialize row -> triggers formatters. - rowManager.activeRows[i].reinitialize(); + // Reinitialize row -> triggers formatters. + rowManager.activeRows[i].reinitialize(); + } + + // Show number of selected rows. + approveAnrechnung.showNumberSelectedRows(rows); } - - // Show number of selected rows. - approveAnrechnung.showNumberSelectedRows(rows); } // Returns tooltip From fb4f9981f0493918413ce1e9b013239523a65bfc Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 11 Jan 2023 13:52:44 +0100 Subject: [PATCH 25/88] Corrected: Anzeige aller LV-Leitungen, an die Empfehlung gesendet wurde In der STGL Anrechnungs-Detailsicht wurde bisher nur die erste LV-Leitung aus dem Ergebnisarray ausgelesen. Nun werden alle angezeigt. --- application/libraries/AnrechnungLib.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php index b37aa46b6..d5168910b 100644 --- a/application/libraries/AnrechnungLib.php +++ b/application/libraries/AnrechnungLib.php @@ -795,11 +795,14 @@ class AnrechnungLib // Check if lv has LV-Leitung $key = array_search(true, array_column($result, 'lvleiter')); - - // If lv has LV-Leitung, keep only the one + + // If lv has 1 or more LV-Leitungen, keep only them if ($key !== false) { - $lector_arr[]= $result[$key]; + foreach ($result as $lector) + { + if ($lector->lvleiter) $lector_arr[]= $lector; + } } // ...otherwise keep all lectors else From 3f4efbcd163089e6f557ed500bdc65517e246953 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 11 Jan 2023 18:05:49 +0100 Subject: [PATCH 26/88] Added function isEmpfehlungsberechtigt to AnrechnungLib Checks if user is allowed to recommend Anrechnung. --- application/libraries/AnrechnungLib.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php index d5168910b..7a0a4b892 100644 --- a/application/libraries/AnrechnungLib.php +++ b/application/libraries/AnrechnungLib.php @@ -762,6 +762,21 @@ class AnrechnungLib // Continue, if LV has no lector (there is no one to ask for recommendation) return hasData($result) ? true : false; } + + /** + * Check if user is allowed to recommend Anrechnung. + * + * @param $anrechnung_id + * @return bool + */ + public function isEmpfehlungsberechtigt($anrechnung_id) + { + // Get lv-leitungen or, if not present, all lectors of lv. + $lector_arr = $this->getLectors($anrechnung_id); + + // Return false if lv-leitung is present and user is not lv-leitung. Otherways return always true. + return in_array(getAuthUID(), array_column($lector_arr, 'uid')); + } /** * Get LV Leitung. If not present, get all LV lectors. From f2231fcba2d3262de6bc99b37afc26677231afb1 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 11 Jan 2023 18:13:14 +0100 Subject: [PATCH 27/88] Disabled recommendation buttons if Lector is not empfehlungsberechtigt If lector should see Anrechnung but not give a recommendation (because is not the LV-Leitung), then recommendation buttons are disabled. --- .../controllers/lehre/anrechnung/ReviewAnrechnungDetail.php | 6 +++++- .../views/lehre/anrechnung/reviewAnrechnungDetail.php | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php index 8cb6e3d79..a3859a1b6 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php @@ -94,10 +94,14 @@ class reviewAnrechnungDetail extends Auth_Controller // Get Empfehlung data $empfehlungData = $this->anrechnunglib->getEmpfehlungData($anrechnung_id); + // False if LV-Leitung is present and user is not LV-Leitung. Otherwise always true. + $isEmpfehlungsberechtigt = $this->anrechnunglib->isEmpfehlungsberechtigt($anrechnung_id); + $viewData = array( 'antragData' => $antragData, 'anrechnungData' => $anrechnungData, - 'empfehlungData' => $empfehlungData + 'empfehlungData' => $empfehlungData, + 'isEmpfehlungsberechtigt' => $isEmpfehlungsberechtigt ); $this->load->view('lehre/anrechnung/reviewAnrechnungDetail.php', $viewData); diff --git a/application/views/lehre/anrechnung/reviewAnrechnungDetail.php b/application/views/lehre/anrechnung/reviewAnrechnungDetail.php index 462124666..9b0748979 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungDetail.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungDetail.php @@ -287,12 +287,12 @@ $this->load->view(
From 8bd007b6ea31f2840fc85dea9ef3b587ebab2cfb Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 12 Jan 2023 09:38:41 +0100 Subject: [PATCH 28/88] Merged Fachbereichsleitungs-files into core files . approveAnrechnungUebersichtData_fbl.php into approveAnrechnungUebersichtData.php . reviewAnrechnungUebersichtData_fbl.php into reviewAnrechnungUebersichtData.php --- .../approveAnrechnungUebersicht.php | 9 +- .../approveAnrechnungUebersichtData.php | 43 ++++++- .../anrechnung/reviewAnrechnungUebersicht.php | 8 +- .../reviewAnrechnungUebersichtData.php | 109 +++++++++++++----- 4 files changed, 117 insertions(+), 52 deletions(-) diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php b/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php index 34cb6b998..dec7dcaff 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php @@ -124,14 +124,7 @@ $this->load->view(
- load->config('anrechnung'); - if ($this->config->item('fbl') === TRUE) - $this->load->view('lehre/anrechnung/approveAnrechnungUebersichtData_fbl.php'); - else - $this->load->view('lehre/anrechnung/approveAnrechnungUebersichtData.php'); - ?> + load->view('lehre/anrechnung/approveAnrechnungUebersichtData.php'); ?>
diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php index 87ba57b6f..0a0d33c3b 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php @@ -107,8 +107,39 @@ $query = ' AND status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR . '\' ORDER BY insertamum DESC LIMIT 1) - END "empfehlungsanfrageAm", - CASE + END "empfehlungsanfrageAm",'; + +$this->load->config('anrechnung'); +if ($this->config->item('fbl') === TRUE) +{ + $query.= ' CASE + WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL + ELSE + (SELECT COALESCE( + STRING_AGG(CONCAT_WS(\' \', vorname, nachname), \', \') + ) empfehlungsanfrageAn + FROM ( + SELECT DISTINCT ON (benutzer.uid) bf.uid, vorname, nachname + FROM lehre.tbl_lehreinheit + JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id) + JOIN public.tbl_organisationseinheit og using (oe_kurzbz) + JOIN public.tbl_benutzerfunktion bf using (oe_kurzbz) + JOIN public.tbl_benutzer benutzer ON bf.uid = benutzer.uid + JOIN public.tbl_person USING (person_id) + WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + and bf.datum_von <= now() + and (bf.datum_bis >= now() or bf.datum_bis is null) + AND lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id + AND benutzer.aktiv = TRUE + AND tbl_person.aktiv = TRUE + ORDER BY benutzer.uid, nachname, vorname + ) as tmp_lvlektoren + ) + END "empfehlungsanfrageAn"'; +} +else +{ + $query.= ' CASE WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL ELSE (SELECT COALESCE( @@ -130,8 +161,10 @@ $query = ' ORDER BY benutzer.uid, lvleiter DESC, nachname, vorname ) as tmp_lvlektoren ) - END "empfehlungsanfrageAn" - FROM anrechnungen + END "empfehlungsanfrageAn"'; +} + +$query.= ' FROM anrechnungen JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz) WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' AND studiengang_kz IN (' . $STUDIENGAENGE_ENTITLED . ') @@ -147,7 +180,7 @@ $filterWidgetArray = array( 'lehrveranstaltung_id', 'begruendung_id', 'dms_id', - 'schreibberechtigt', + 'Schreibberechtigt', 'studiensemester_kurzbz', 'studiengang_kz', ucfirst($this->p->t('lehre', 'studiengang')), diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php index 82e66487f..e3de15084 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php @@ -117,13 +117,7 @@ $this->load->view(
- load->config('anrechnung'); - if($this->config->item('fbl')===TRUE) - $this->load->view('lehre/anrechnung/reviewAnrechnungUebersichtData_fbl.php'); - else - $this->load->view('lehre/anrechnung/reviewAnrechnungUebersichtData.php');?> + load->view('lehre/anrechnung/reviewAnrechnungUebersichtData.php');?>
diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php index aa28d7fc0..ca086506f 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php @@ -63,32 +63,77 @@ $query = ' AND benutzer.aktiv = TRUE AND tbl_person.aktiv = TRUE ORDER BY lehrveranstaltung_id, benutzer.uid, lehrfunktion_kurzbz DESC - ) - - SELECT DISTINCT ON (anrechnungen.*, lema.mitarbeiter_uid) anrechnungen.*, - array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung", - CASE - -- erst prüfen, ob es überhaupt eine LV Leitung gibt (wenn nicht, dann immer empfehlungsberechtigt) - WHEN EXISTS (SELECT 1 FROM tbl_lvleitungen WHERE lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id AND lvleiter = TRUE) - -- wenn ja, return true, wenn user LV Leitung ist oder false, wenn nicht - THEN (SELECT EXISTS (SELECT 1 FROM tbl_lvleitungen WHERE lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id AND lvleiter = TRUE AND uid = \'' . $LEKTOR_UID . '\')) - -- wenn es keine LV Leitung, return immer true - ELSE TRUE - END AS empfehlungsberechtigt - FROM anrechnungen - JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz) - JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id) - JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) - WHERE le.studiensemester_kurzbz = anrechnungen.studiensemester_kurzbz - AND lema.mitarbeiter_uid = \'' . $LEKTOR_UID . '\' - AND le.lehre = TRUE - AND EXISTS ( - SELECT 1 - FROM lehre.tbl_anrechnung_anrechnungstatus - WHERE anrechnung_id = anrechnungen.anrechnung_id - AND status_kurzbz=\'inProgressLektor\' - ) -'; + )'; + +$this->load->config('anrechnung'); +if ($this->config->item('fbl') === TRUE) +{ + $query.= ' + SELECT DISTINCT /*ON (anrechnungen.*, bf.uid)*/ + CASE + -- erst prüfen, ob es überhaupt eine LV Leitung gibt (wenn nicht, dann immer empfehlungsberechtigt) + WHEN EXISTS (SELECT 1 FROM tbl_lvleitungen WHERE lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id AND lvleiter = TRUE) + -- wenn ja, return true, wenn user LV Leitung ist oder false, wenn nicht + THEN (SELECT EXISTS (SELECT 1 FROM tbl_lvleitungen WHERE lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id AND lvleiter = TRUE AND uid = \'' . $LEKTOR_UID . '\')) + -- wenn es keine LV Leitung, return immer true + ELSE TRUE + END AS empfehlungsberechtigt, + anrechnungen.*, + array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung" + FROM anrechnungen + JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz) + JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id) + /*JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id)*/ + JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id) + JOIN public.tbl_organisationseinheit og using (oe_kurzbz) + JOIN public.tbl_benutzerfunktion bf using (oe_kurzbz) + WHERE anrechnungen.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND le.studiensemester_kurzbz = anrechnungen.studiensemester_kurzbz + /*AND lema.mitarbeiter_uid = \'' . $LEKTOR_UID . '\'*/ + AND le.lehre = TRUE + AND bf.funktion_kurzbz = \'Leitung\' + and bf.datum_von <= now() + and (bf.datum_bis >= now() or bf.datum_bis is null) + AND og.organisationseinheittyp_kurzbz = \'Fachbereich\' + AND bf.uid = \'' . $LEKTOR_UID . '\' + AND EXISTS ( + SELECT 1 + FROM lehre.tbl_anrechnung_anrechnungstatus + WHERE anrechnung_id = anrechnungen.anrechnung_id + AND status_kurzbz=\'inProgressLektor\' + ) + order by empfehlung_anrechnung NULLS FIRST, antragsdatum + '; +} +else +{ + $query.= ' + SELECT DISTINCT ON (anrechnungen.*, lema.mitarbeiter_uid) + CASE + -- erst prüfen, ob es überhaupt eine LV Leitung gibt (wenn nicht, dann immer empfehlungsberechtigt) + WHEN EXISTS (SELECT 1 FROM tbl_lvleitungen WHERE lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id AND lvleiter = TRUE) + -- wenn ja, return true, wenn user LV Leitung ist oder false, wenn nicht + THEN (SELECT EXISTS (SELECT 1 FROM tbl_lvleitungen WHERE lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id AND lvleiter = TRUE AND uid = \'' . $LEKTOR_UID . '\')) + -- wenn es keine LV Leitung, return immer true + ELSE TRUE + END AS empfehlungsberechtigt, + anrechnungen.*, + array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung" + FROM anrechnungen + JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz) + JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id) + JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) + WHERE le.studiensemester_kurzbz = anrechnungen.studiensemester_kurzbz + AND lema.mitarbeiter_uid = \'' . $LEKTOR_UID . '\' + AND le.lehre = TRUE + AND EXISTS ( + SELECT 1 + FROM lehre.tbl_anrechnung_anrechnungstatus + WHERE anrechnung_id = anrechnungen.anrechnung_id + AND status_kurzbz=\'inProgressLektor\' + ) + '; +} $filterWidgetArray = array( 'query' => $query, @@ -96,6 +141,7 @@ $filterWidgetArray = array( 'requiredPermissions' => 'lehre/anrechnung_empfehlen', 'datasetRepresentation' => 'tabulator', 'columnsAliases' => array( + 'Empfehlungsberechtigt', 'anrechnung_id', 'lehrveranstaltung_id', 'begruendung_id', @@ -113,8 +159,7 @@ $filterWidgetArray = array( ucfirst($this->p->t('anrechnung', 'antragdatum')), ucfirst($this->p->t('anrechnung', 'empfehlung')), 'status_kurzbz', - 'Status', - 'empfehlungsberechtigt' + 'Status' ), 'datasetRepOptions' => '{ height: func_height(this), @@ -148,6 +193,9 @@ $filterWidgetArray = array( } }', // tabulator properties 'datasetRepFieldsDefs' => '{ + empfehlungsberechtigt: {formatter:"tickCross", align:"center", headerTooltip:"Berechtigt wenn man die LV leitet oder wenn der LV keine LV-Leitung zugeordnet ist.", + headerFilter:"tickCross", headerFilterParams:{"tristate": true, "initial": true}, headerFilterFunc: hf_empfehlungsberechtigt + }, anrechnung_id: {visible: false, headerFilter:"input"}, lehrveranstaltung_id: {visible: false, headerFilter:"input"}, begruendung_id: {visible: false, headerFilter:"input"}, @@ -165,10 +213,7 @@ $filterWidgetArray = array( antragsdatum: {align:"center", headerFilter:"input", mutator: mut_formatStringDate}, empfehlung_anrechnung: {headerFilter:"input", align:"center", formatter: format_empfehlung_anrechnung, headerFilterFunc: hf_filterTrueFalse}, status_kurzbz: {visible: false, headerFilter:"input"}, - status_bezeichnung: {headerFilter:"input"}, - empfehlungsberechtigt: {formatter:"tickCross", align:"center", - headerFilter:"tickCross", headerFilterParams:{"tristate": true, "initial": true}, headerFilterFunc: hf_empfehlungsberechtigt - } + status_bezeichnung: {headerFilter:"input"} }', // col properties ); From f0b1c14ea4640f9aba2515e2bc9192012bd02692 Mon Sep 17 00:00:00 2001 From: Manfred Date: Tue, 17 Jan 2023 15:57:01 +0100 Subject: [PATCH 29/88] Contents unchanged --- vilesci/stammdaten/benutzerberechtigung_uebersicht.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vilesci/stammdaten/benutzerberechtigung_uebersicht.php b/vilesci/stammdaten/benutzerberechtigung_uebersicht.php index 655ce058e..2361af438 100644 --- a/vilesci/stammdaten/benutzerberechtigung_uebersicht.php +++ b/vilesci/stammdaten/benutzerberechtigung_uebersicht.php @@ -21,7 +21,7 @@ * Gerald Simane-Sequens < gerald.simane-sequens@technikum-wien.at > * Manfred Kindl */ -require_once('../../config/vilesci.config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/studiengang.class.php'); require_once('../../include/benutzerberechtigung.class.php'); From feb14a9f39ae9192a011373ecf4e7c822278ec58 Mon Sep 17 00:00:00 2001 From: Manfred Date: Mon, 13 Feb 2023 11:27:54 +0100 Subject: [PATCH 30/88] Anpassung Speicherbutton, Tooltips, Alertmessages --- .../benutzerberechtigung_details.php | 159 +++++++++++++----- .../benutzerberechtigung_uebersicht.php | 2 +- 2 files changed, 122 insertions(+), 39 deletions(-) diff --git a/vilesci/stammdaten/benutzerberechtigung_details.php b/vilesci/stammdaten/benutzerberechtigung_details.php index c8dff5491..26c105049 100644 --- a/vilesci/stammdaten/benutzerberechtigung_details.php +++ b/vilesci/stammdaten/benutzerberechtigung_details.php @@ -473,7 +473,23 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $name->load($uid); $htmlstr .= "Berechtigungen von ".$name->nachname." ".$name->vorname." (".$uid.")"; - $htmlstr .= "

".$errorstr."

".$successstr."

"; + $message = ''; + $class = ''; + if ($errorstr != '' || $successstr != '') + { + if ($successstr != '') + { + $class = 'class="alert alert-success"'; + $message = $successstr; + } + elseif ($errorstr != '') + { + $class = 'class="alert alert-danger"'; + $message = $errorstr; + } + } + $htmlstr .= '
'.$message.'
'; + //$htmlstr .= "

".$errorstr."

".$successstr."

"; //Formular zum Kopieren von Berechtigungen //$htmlstr .= "
"; @@ -562,8 +578,6 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
- - "; @@ -641,7 +655,7 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) //Anmerkung $htmlstr .= " "; - $htmlstr .= " "; + $htmlstr .= " "; $htmlstr .= ""; $htmlstr .= "
art ?> beschreibung ?> - + entfernen Gültig ab Gültig bis AnmerkungInfo
"; @@ -656,32 +670,32 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $htmlstr .= ""; $htmlstr .= ""; - $htmlstr .= " + /*$htmlstr .= "
- - +
- "; + ";*/ $htmlstr .= ""; - $htmlstr .= ""; + $htmlstr .= ""; $htmlstr .= " - + - + - + "; foreach($rights->berechtigungen as $b) @@ -743,7 +757,7 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $htmlstr .= " "; if ($b->rolle_kurzbz != '') { - $htmlstr .= " "; + $htmlstr .= " "; } $htmlstr.=""; @@ -754,7 +768,11 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) class='berechtigung_autocomplete' name='dataset[$b->benutzerberechtigung_id][berechtigung_kurzbz]' value='".$b->berechtigung_kurzbz."' - title='".($b->berechtigung_kurzbz != '' ? $berechtigung_arr[$b->berechtigung_kurzbz] : '')."'>"; + title='".($b->berechtigung_kurzbz != '' ? $berechtigung_arr[$b->berechtigung_kurzbz] : '')."' + data-toggle='tooltip' + data-html='true' + data-placement='auto' + data-original-title='Foo'>"; $htmlstr .= " "; //Art @@ -827,20 +845,36 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $htmlstr .= " "; //Info - $htmlstr .= " "; + $htmlstr .= " "; $htmlstr .= " "; $htmlstr .= " "; } $htmlstr .= "
+ Rolle Berechtigung Art Organisationseinheit KostenstelleNeg Gültig ab Gültig bis Anmerkung Info
information + + "; - $htmlstr .= " "; - $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " "; $htmlstr .= "
"; - $htmlstr .= '
-
'; - $htmlstr .= ''; - $htmlstr .= ' - + $htmlstr .= '
+
+ +
+ +
+ +
+
+ +
'; $htmlstr .= ""; @@ -856,18 +890,19 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) + - + - + - + "; + +} + if(isset($_POST['schick'])) { if($rechte->isBerechtigt('basis/berechtigung', null, 'suid')) @@ -418,9 +482,10 @@ if (!$b = new berechtigung()) $b->getRollen(); foreach($b->result as $berechtigung) { - $rolle_arr[] = $berechtigung->rolle_kurzbz; + $rolle_arr[$berechtigung->rolle_kurzbz] = $berechtigung->beschreibung; } -sort($rolle_arr); +ksort($rolle_arr, SORT_STRING | SORT_FLAG_CASE); + $b->getBerechtigungen(); foreach($b->result as $berechtigung) { @@ -592,10 +657,10 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) //Rolle $htmlstr .= " "; @@ -683,8 +748,8 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $htmlstr .= " - Rolle - Berechtigung + Rolle + Berechtigung Art Organisationseinheit Kostenstelle @@ -742,22 +807,32 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) //Rolle $htmlstr .= " "; - $htmlstr .= " "; $htmlstr .= " "; - for ($i = 0; $i < sizeof($rolle_arr); $i++) + foreach ($rolle_arr AS $key => $value) { - if ($b->rolle_kurzbz == $rolle_arr[$i]) + if ($b->rolle_kurzbz == $key) { - $sel = " selected"; + $sel = " selected='selected'"; } else $sel = ""; - $htmlstr .= ""; + $htmlstr .= ""; } $htmlstr .= " "; if ($b->rolle_kurzbz != '') { - $htmlstr .= " "; + $htmlstr .= " "; } $htmlstr.=""; @@ -827,13 +902,13 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $htmlstr .= " "; //Gültig ab - $htmlstr .= " "; + $htmlstr .= " "; $htmlstr .= " ".$b->start.""; $htmlstr .= " "; $htmlstr .= " "; // Gültig bis - $htmlstr .= " "; + $htmlstr .= " "; $htmlstr .= " ".$b->ende.""; $htmlstr .= " "; $htmlstr .= " "; @@ -842,7 +917,8 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $htmlstr .= " "; $htmlstr .= " anmerkung))."' data-toggle='tooltip' @@ -856,36 +932,54 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $htmlstr .= " + data-placement='auto'> "; - $htmlstr .= " "; - $htmlstr .= " "; - $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " "; $htmlstr .= " "; $htmlstr .= " "; } $htmlstr .= ""; $htmlstr .= '
- -
- -
- + +
+
+ +
+ +
+ +
-
'; $htmlstr .= ""; - + $htmlstr .= "
















"; } ?> @@ -910,7 +1004,203 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) ?> - + + + + + + + + + + + + + +

+ + + + + From 43f613b0bc286bf9c85981727fe187d7e3890447 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Wed, 5 Apr 2023 13:32:32 +0200 Subject: [PATCH 84/88] =?UTF-8?q?=C3=84nderung=20FHStG=20auf=20FHG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rdf/diplomasupplement.xml.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rdf/diplomasupplement.xml.php b/rdf/diplomasupplement.xml.php index 47da798b7..4f19566d2 100644 --- a/rdf/diplomasupplement.xml.php +++ b/rdf/diplomasupplement.xml.php @@ -257,7 +257,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") if($row->typ=='d') { echo ' UNESCO ISCED 7'; - echo ' '; + echo ' '; echo ' '; echo ' '; echo ' '; @@ -269,7 +269,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") elseif($row->typ=='m') { echo ' UNESCO ISCED 7'; - echo ' '; + echo ' '; echo ' '; echo ' '; echo ' '; @@ -281,7 +281,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") elseif($row->typ=='b') { echo ' UNESCO ISCED 6'; - echo ' '; + echo ' '; echo ' '; echo ' '; echo ' '; @@ -299,8 +299,8 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") elseif($row->typ=='l' || $row->typ=='k' || $row->typ=='e') { echo ' UNESCO ISCED 7'; - echo ' Lehrgang zur Weiterbildung nach §9 FHStG idgF.'; - echo ' Certificate Program for Further Education subjected to § 9 FHStG'; + echo ' Lehrgang zur Weiterbildung nach §9 FHG idgF.'; + echo ' Certificate Program for Further Education subjected to § 9 FHG'; echo ' '; echo ' '; echo ' '; From 326b53544a47dcc8e0fc5a61eb40f94023cc47b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Wed, 5 Apr 2023 16:28:19 +0200 Subject: [PATCH 85/88] =?UTF-8?q?=C3=9Cbernahme=20Optimierung=20der=20Anwe?= =?UTF-8?q?senheitsabfrage=20von=20BFI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/anwesenheit.class.php | 1373 +++++++++++++++++---------------- 1 file changed, 714 insertions(+), 659 deletions(-) diff --git a/include/anwesenheit.class.php b/include/anwesenheit.class.php index 3365e6d68..2b8389c79 100644 --- a/include/anwesenheit.class.php +++ b/include/anwesenheit.class.php @@ -1,659 +1,714 @@ - - */ -/** - * Klasse zur Verwaltung der Anwesenheiten der Studierenden - */ -require_once(dirname(__FILE__).'/basis_db.class.php'); -require_once(dirname(__FILE__).'/../config/global.config.inc.php'); - -class anwesenheit extends basis_db -{ - public $new=true; // boolean - public $result = array(); - - public $anwesenheit_id; // serial - public $uid; // varchar(32) - public $einheiten; // numeric(3,1) - public $datum; // date - public $anwesend; // boolean - public $lehreinheit_id; // bigint - public $anmerkung; // varchar(256) - - /** - * Konstruktor - * @param $anwesenheit_id ID des Datensatzes der geladen werden soll (Default=null) - */ - public function __construct($anwesenheit_id=null) - { - parent::__construct(); - - if(!is_null($anwesenheit_id)) - $this->load($anwesenheit_id); - } - - /** - * Laedt den Datensatz mit der ID $anwesenheit_id - * @param $anwesenheit_id ID des Datensatzes - * @return true wenn ok, false im Fehlerfall - */ - public function load($anwesenheit_id) - { - //Pruefen ob anwesenheit_id eine gueltige Zahl ist - if(!is_numeric($anwesenheit_id) || $anwesenheit_id == '') - { - $this->errormsg = 'Anwesenheit_id muss eine Zahl sein'; - return false; - } - - //Daten aus der Datenbank lesen - $qry = "SELECT * FROM campus.tbl_anwesenheit WHERE anwesenheit_id=".$this->db_add_param($anwesenheit_id, FHC_INTEGER, false); - - if(!$this->db_query($qry)) - { - $this->errormsg = 'Fehler bei einer Datenbankabfrage'; - return false; - } - - if($row = $this->db_fetch_object()) - { - $this->anwesenheit_id = $row->anwesenheit_id; - $this->uid = $row->uid; - $this->einheiten = $row->einheiten; - $this->datum = $row->datum; - $this->anwesend = $this->db_parse_bool($row->anwesend); - $this->lehreinheit_id = $row->lehreinheit_id; - $this->anmerkung = $row->anmerkung; - $this->new=false; - } - else - { - $this->errormsg = 'Es ist kein Datensatz mit dieser ID vorhanden'; - return false; - } - - return true; - } - - /** - * Prueft die Variablen auf Gueltigkeit - * @return true wenn ok, false im Fehlerfall - */ - protected function validate() - { - //Zahlenfelder pruefen - if(!is_numeric($this->anwesenheit_id) && $this->anwesenheit_id!='') - { - $this->errormsg='anwesenheit_id enthaelt ungueltige Zeichen'; - return false; - } - - //Gesamtlaenge pruefen - if(mb_strlen($this->anmerkung)>255) - { - $this->errormsg = 'Anmerkung darf nicht länger als 255 Zeichen sein'; - return false; - } - - $this->errormsg = ''; - return true; - } - - /** - * Speichert den aktuellen Datensatz in die Datenbank - * Wenn $neu auf true gesetzt ist wird ein neuer Datensatz angelegt - * andernfalls wird der bestehende Datensatz aktualisiert - * @return true wenn ok, false im Fehlerfall - */ - public function save() - { - //Variablen pruefen - if(!$this->validate()) - return false; - - if($this->new) - { - //Neuen Datensatz einfuegen - $qry='BEGIN;INSERT INTO campus.tbl_anwesenheit (uid, einheiten, anwesend, datum, lehreinheit_id, anmerkung) VALUES('. - $this->db_add_param($this->uid).', '. - $this->db_add_param($this->einheiten).', '. - $this->db_add_param($this->anwesend, FHC_BOOLEAN).', '. - $this->db_add_param($this->datum).', '. - $this->db_add_param($this->lehreinheit_id).', '. - $this->db_add_param($this->anmerkung).');'; - } - else - { - //Pruefen ob id eine gueltige Zahl ist - if(!is_numeric($this->anwesenheit_id)) - { - $this->errormsg = 'anwesenheit_id muss eine gueltige Zahl sein'; - return false; - } - $qry='UPDATE campus.tbl_anwesenheit SET'. - ' uid='.$this->db_add_param($this->uid).', '. - ' einheiten='.$this->db_add_param($this->einheiten).', '. - ' anwesend='.$this->db_add_param($this->anwesend,FHC_BOOLEAN).', '. - ' datum='.$this->db_add_param($this->datum).', '. - ' lehreinheit_id='.$this->db_add_param($this->lehreinheit_id, FHC_INTEGER).', '. - ' anmerkung='.$this->db_add_param($this->anmerkung).' '. - 'WHERE anwesenheit_id='.$this->db_add_param($this->anwesenheit_id, FHC_INTEGER, false).';'; - } - - if($this->db_query($qry)) - { - if($this->new) - { - //naechste ID aus der Sequence holen - $qry="SELECT currval('campus.seq_anwesenheit_anwesenheit_id') as id;"; - if($this->db_query($qry)) - { - if($row = $this->db_fetch_object()) - { - $this->anwesenheit_id = $row->id; - $this->db_query('COMMIT'); - } - else - { - $this->db_query('ROLLBACK'); - $this->errormsg = "Fehler beim Auslesen der Sequence"; - return false; - } - } - else - { - $this->db_query('ROLLBACK'); - $this->errormsg = 'Fehler beim Auslesen der Sequence'; - return false; - } - } - - } - else - { - $this->errormsg = 'Fehler beim Speichern des Datensatzes'; - return false; - } - return $this->anwesenheit_id; - } - - /** - * Laedt die Anwesenheiten einer Lehreinheit/Datum - * @param $lehreinheit_id - * @param $datum - * @return boolean true wenn ok, false im Fehlerfall - */ - public function getAnwesenheitLehreinheit($lehreinheit_id, $datum=null) - { - $qry = "SELECT * FROM campus.tbl_anwesenheit - WHERE - lehreinheit_id=".$this->db_add_param($lehreinheit_id, FHC_INTEGER); - - if(!is_null($datum)) - $qry.=" AND datum=".$this->db_add_param($datum); - - if($result = $this->db_query($qry)) - { - while($row = $this->db_fetch_object($result)) - { - $obj = new anwesenheit(); - - $obj->anwesenheit_id = $row->anwesenheit_id; - $obj->uid = $row->uid; - $obj->einheiten = $row->einheiten; - $obj->datum = $row->datum; - $obj->anwesend = $this->db_parse_bool($row->anwesend); - $obj->lehreinheit_id = $row->lehreinheit_id; - $obj->anmerkung = $row->anmerkung; - - $this->result[] = $obj; - } - return true; - } - else - { - $this->errormsg = 'Fehler beim Laden der Daten'; - return false; - } - } - - public function loadAnwesenheitMitarbeiter($mitarbeiter_uid, $lehreinheit_id) - { - $qry = "SELECT - datum, a.einheiten, - (SELECT true FROM campus.tbl_anwesenheit - WHERE lehreinheit_id=".$this->db_add_param($lehreinheit_id)." AND datum=a.datum LIMIT 1) as anwesend, - (SELECT stundensatz FROM lehre.tbl_lehreinheitmitarbeiter WHERE lehreinheit_id=".$this->db_add_param($lehreinheit_id)." - AND mitarbeiter_uid=".$this->db_add_param($mitarbeiter_uid).") as stundensatz - FROM - (SELECT datum, count(distinct stunde) as einheiten FROM lehre.tbl_stundenplan - WHERE - lehreinheit_id=".$this->db_add_param($lehreinheit_id)." - AND mitarbeiter_uid=".$this->db_add_param($mitarbeiter_uid)." - GROUP by datum) as a - "; - - if($result = $this->db_query($qry)) - { - $this->anzahl_termine=0; - $this->anzahl_anwesend=0; - $this->anwesenheit = array(); - - while($row = $this->db_fetch_object($result)) - { - $anwesend = $this->db_parse_bool($row->anwesend); - $key = $lehreinheit_id.'/'.$row->datum; - - $this->anwesenheit[$key]['anwesend'] = ($anwesend?true:false); - $this->anwesenheit[$key]['lehreinheit_id'] = $lehreinheit_id; - $this->anwesenheit[$key]['datum']=$row->datum; - $this->anwesenheit[$key]['einheiten']=$row->einheiten; - $this->anwesenheit[$key]['stundensatz']=$row->stundensatz; - - $this->anzahl_termine++; - if($anwesend) - $this->anzahl_anwesend++; - } - if($this->anzahl_termine>0) - { - $this->prozent_anwesend=$this->anzahl_anwesend/$this->anzahl_termine*100; - } - return true; - } - else - { - $this->errormsg='Fehler beim Laden der Daten'; - return false; - } - } - - /** - * Liefert für Student und Einheit wieviel Einheiten als anwesend/abwesend - * eingetragen sind. - * - * @param string $uid - * @param int $lehreinheit_id - * @param bool $anwesend - * @return int - */ - public function getAnwesenheit($uid, $lehreinheit_id, $anwesend = FALSE) - { - $qry = 'SELECT sum(einheiten) AS einheiten ' - . 'FROM campus.tbl_anwesenheit ' - . 'WHERE uid = ' . $this->db_add_param($uid) - . ' AND lehreinheit_id = ' . $this->db_add_param($lehreinheit_id, FHC_INTEGER) - . ' AND anwesend = ' . $this->db_add_param($anwesend, FHC_BOOLEAN); - - $result = $this->db_query($qry); - $row = $this->db_fetch_object($result); - - return $row->einheiten; - } - - /** - * Liefert die Anwesenheiten/Abwesenheiten eines Studenten bei einer LV - * - * @param string $student_uid - * @param int $lehrveranstaltung_id - * @param string $studiensemester_kurzbz - * @param boolean $anwesend - * @return boolean - */ - public function getAnwesenheitLehrveranstaltung($student_uid, $lehrveranstaltung_id, $studiensemester_kurzbz, $anwesend=false) - { - $qry = 'SELECT - distinct tbl_anwesenheit.* - FROM - campus.tbl_anwesenheit - JOIN campus.vw_student_lehrveranstaltung USING(uid) - WHERE - uid='.$this->db_add_param($student_uid).' - AND vw_student_lehrveranstaltung.lehreinheit_id=tbl_anwesenheit.lehreinheit_id - AND lehrveranstaltung_id='.$this->db_add_param($lehrveranstaltung_id, FHC_INTEGER).' - AND studiensemester_kurzbz='.$this->db_add_param($studiensemester_kurzbz).' - AND anwesend=' . $this->db_add_param($anwesend, FHC_BOOLEAN).' - ORDER BY datum'; - - if($result = $this->db_query($qry)) - { - while($row = $this->db_fetch_object($result)) - { - $obj = new anwesenheit(); - - $obj->anwesenheit_id = $row->anwesenheit_id; - $obj->uid = $row->uid; - $obj->einheiten = $row->einheiten; - $obj->datum = $row->datum; - $obj->anwesend = $this->db_parse_bool($row->anwesend); - $obj->lehreinheit_id = $row->lehreinheit_id; - $obj->anmerkung = $row->anmerkung; - - $this->result[] = $obj; - } - return true; - } - else - { - $this->errormsg = 'Fehler beim Laden der Daten'; - return false; - } - } - - /** - * Liefert die Termine an denen eine Abwesenheit eingetragen ist. - * - * @param string $uid - * @param int $lehreinheit_id - * @return array - */ - public function getAbwesendTermine($uid, $lehreinheit_id) - { - - $qry = 'SELECT datum, einheiten ' - . 'FROM campus.tbl_anwesenheit ' - . 'WHERE uid = ' . $this->db_add_param($uid) - . ' AND lehreinheit_id = ' . $this->db_add_param($lehreinheit_id) - . ' AND anwesend = FALSE ' - . 'ORDER BY datum'; - - $result = $this->db_query($qry); - $ret_obj = array(); - - while($row = $this->db_fetch_object($result)) - { - $ret_obj[] = $row; - } - - return $ret_obj; - } - - public function getAmpel($anwesenheit_relativ) - { - - if($anwesenheit_relativ < FAS_ANWESENHEIT_ROT) - { - return 'red'; - } - elseif($anwesenheit_relativ < FAS_ANWESENHEIT_GELB) - { - return 'yellow'; - } - else - { - return 'green'; - } - } - - /** - * Prueft ob Anwesenheiten erfasst wurden - * @param $lehreinheit_id ID der Lehreinheit - * @param $datum Datum - * @param $uid UID des Studierenden - * @return boolean true wenn vorhanden, sonst false - */ - public function AnwesenheitExists($lehreinheit_id, $datum, $uid=null) - { - $qry = "SELECT - 1 - FROM - campus.tbl_anwesenheit - WHERE - anwesend=true - AND lehreinheit_id=".$this->db_add_param($lehreinheit_id)." - AND datum=".$this->db_add_param($datum); - - if($uid!='') - $qry.=" AND uid=".$this->db_add_param($uid); - - if($result = $this->db_query($qry)) - { - if($this->db_num_rows($result)>0) - return true; - else - return false; - } - else - { - $this->errormsg = 'Fehler beim Laden der Daten'; - return false; - } - } - - /** - * Prueft ob Anwesenheiten erfasst wurden - * @param $lehreinheit_id ID der Lehreinheit - * @param $datum Datum - * @param $uid UID des Studierenden - * @return boolean true wenn vorhanden, sonst false - */ - public function AnwesenheitEntryExists($lehreinheit_id, $datum, $uid=null) - { - $qry = "SELECT - 1 - FROM - campus.tbl_anwesenheit - WHERE - lehreinheit_id=".$this->db_add_param($lehreinheit_id)." - AND datum=".$this->db_add_param($datum)." - AND uid=".$this->db_add_param($uid); - - if($result = $this->db_query($qry)) - { - if($this->db_num_rows($result)>0) - return true; - else - return false; - } - else - { - $this->errormsg = 'Fehler beim Laden der Daten'; - return false; - } - } - - /** - * Laedt die Anwesenheiten in Prozent von Studierenden bei Lehrveranstaltungen - * Wenn die StudentUID uebergeben wird, werden alle Lehrveranstaltungen zu denen der Studierenden zugeteilt ist inkl Prozent der Anwesenheit - * Wenn die LehrveranstaltungID uebergeben wird, werden alle Studierenden geholt die zugeteilt sind inkl Prozent der Anwesenheit - * Es werden pro Student die Anwesenheiten berechnet aufgrund der Lehreinheit zu der sie zugeordnet sind - * @param $studiensemester_kurzbz - * @param $student_uid - * @param $lehrveranstaltung_id - * @return boolean true wenn ok, false im fehlerfall - */ - public function loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid=null, $lehrveranstaltung_id=null) - { - $qry = "SELECT lehrveranstaltung_id, bezeichnung, vorname, wahlname, nachname,uid, sum(anwesend) as anwesend, sum(nichtanwesend) as nichtanwesend, sum(gesamtstunden) as gesamtstunden FROM ( - SELECT - lehrveranstaltung_id, bezeichnung, vorname, wahlname, nachname, uid, - ( - SELECT - sum(einheiten) - FROM - campus.tbl_anwesenheit - WHERE - lehreinheit_id=vw_student_lehrveranstaltung.lehreinheit_id - AND uid=vw_student_lehrveranstaltung.uid - AND anwesend - ) as anwesend, - ( - SELECT - sum(einheiten) - FROM - campus.tbl_anwesenheit - WHERE - lehreinheit_id=vw_student_lehrveranstaltung.lehreinheit_id - AND uid=vw_student_lehrveranstaltung.uid - AND NOT anwesend - ) as nichtanwesend, - ( - SELECT count(*) anzahl FROM - (SELECT datum, stunde FROM campus.vw_stundenplan - WHERE lehreinheit_id=vw_student_lehrveranstaltung.lehreinheit_id - AND (vw_stundenplan.titel not like '%Nebenprüfung%' OR vw_stundenplan.titel is null) GROUP BY datum, stunde) as a - ) as gesamtstunden - FROM - campus.vw_student_lehrveranstaltung - JOIN public.tbl_benutzer USING(uid) - JOIN public.tbl_person USING(person_id) - WHERE - studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz); - - if(!is_null($lehrveranstaltung_id)) - $qry.=" AND lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id); - if(!is_null($student_uid)) - $qry.=" AND uid=".$this->db_add_param($student_uid); - - $qry.=") as b GROUP BY lehrveranstaltung_id, bezeichnung, vorname, wahlname, nachname, uid"; - - if($lehrveranstaltung_id!='') - $qry.=" order by nachname, vorname "; - elseif($student_uid!='') - $qry.=" order by bezeichnung"; - - if($result = $this->db_query($qry)) - { - while($row = $this->db_fetch_object($result)) - { - $obj = new stdClass(); - $obj->bezeichnung = $row->bezeichnung; - $obj->anwesend = $row->anwesend; - $obj->nichtanwesend = $row->nichtanwesend; - $obj->gesamtstunden = $row->gesamtstunden; - - $obj->erfassteanwesenheit = $row->anwesend+$row->nichtanwesend; - if($row->gesamtstunden=='' || $obj->erfassteanwesenheit=='') - $obj->prozent=100; - else - $obj->prozent = number_format(100-(100/$obj->gesamtstunden*$row->nichtanwesend),2); - $obj->vorname = $row->vorname; - $obj->wahlname = $row->wahlname; - $obj->nachname = $row->nachname; - $obj->uid = $row->uid; - $obj->lehrveranstaltung_id = $row->lehrveranstaltung_id; - $this->result[] = $obj; - } - return true; - } - else - { - $this->errormsg='Fehler beim Laden der Daten'; - return false; - } - } - - /** - * Aendert die bestehende Anwesenheit - * @param $lehreinheit_id ID der Lehreinheit - * @param $datum Datum - * @param $uid UID des Studierenden - * @return boolean true ok, sonst false - */ - public function AnwesenheitToggle($lehreinheit_id, $datum, $uid) - { - if($this->AnwesenheitEntryExists($lehreinheit_id, $datum, $uid)) - { - $qry = "UPDATE - campus.tbl_anwesenheit - SET anwesend= NOT anwesend - WHERE - lehreinheit_id=".$this->db_add_param($lehreinheit_id)." - AND datum=".$this->db_add_param($datum)." - AND uid=".$this->db_add_param($uid); - - if($result = $this->db_query($qry)) - { - if($this->db_affected_rows($result)>0) - return true; - else - { - $this->errormsg='Anwesenheitsliste wurde noch nicht erfasst'; - return false; - } - } - else - { - $this->errormsg = 'Fehler beim Laden der Daten'; - return false; - } - } - else - { - // Anwesenheitsliste wurde noch nicht erfasst. Eintrag neu anlegen - - // Einheiten ermitteln - $qry = "SELECT - distinct stunde - FROM - lehre.tbl_stundenplan - WHERE - lehreinheit_id=".$this->db_add_param($lehreinheit_id)." - AND datum=".$this->db_add_param($datum); - - if($result = $this->db_query($qry)) - { - if($anzahl = $this->db_num_rows($result)) - { - $einheiten = $anzahl; - } - } - if($einheiten>0) - { - $this->lehreinheit_id=$lehreinheit_id; - $this->datum = $datum; - $this->uid = $uid; - $this->anwesend=true; - $this->new=true; - $this->einheiten=$einheiten; - if($this->save()) - return true; - else - { - $this->errormsg = 'Fehler beim Speichern der Daten'; - return true; - } - } - else - { - $this->errormsg = 'Anzahl der Einheiten fuer diesen Tag konnte nicht ermittelt werden'; - return false; - } - } - } - - /** - * Loescht eine Anwesenheit - * @param anwesenheit_id integer ID der Anwesenheit. - * @return boolean true wenn ok , false im fehlerfall - */ - public function delete($anwesenheit_id) - { - $qry = "DELETE FROM campus.tbl_anwesenheit WHERE anwesenheit_id=".$this->db_add_param($anwesenheit_id, FHC_INTEGER).";"; - - if($this->db_query($qry)) - { - return true; - } - else - { - $this->errormsg = 'Fehler beim Löschen der Anwesenheit'; - return false; - } - } -} + + */ +/** + * Klasse zur Verwaltung der Anwesenheiten der Studierenden + */ +require_once(dirname(__FILE__).'/basis_db.class.php'); +require_once(dirname(__FILE__).'/../config/global.config.inc.php'); + +class anwesenheit extends basis_db +{ + public $new=true; // boolean + public $result = array(); + + public $anwesenheit_id; // serial + public $uid; // varchar(32) + public $einheiten; // numeric(3,1) + public $datum; // date + public $anwesend; // boolean + public $lehreinheit_id; // bigint + public $anmerkung; // varchar(256) + + /** + * Konstruktor + * @param $anwesenheit_id ID des Datensatzes der geladen werden soll (Default=null) + */ + public function __construct($anwesenheit_id=null) + { + parent::__construct(); + + if(!is_null($anwesenheit_id)) + $this->load($anwesenheit_id); + } + + /** + * Laedt den Datensatz mit der ID $anwesenheit_id + * @param $anwesenheit_id ID des Datensatzes + * @return true wenn ok, false im Fehlerfall + */ + public function load($anwesenheit_id) + { + //Pruefen ob anwesenheit_id eine gueltige Zahl ist + if(!is_numeric($anwesenheit_id) || $anwesenheit_id == '') + { + $this->errormsg = 'Anwesenheit_id muss eine Zahl sein'; + return false; + } + + //Daten aus der Datenbank lesen + $qry = "SELECT * FROM campus.tbl_anwesenheit WHERE anwesenheit_id=".$this->db_add_param($anwesenheit_id, FHC_INTEGER, false); + + if(!$this->db_query($qry)) + { + $this->errormsg = 'Fehler bei einer Datenbankabfrage'; + return false; + } + + if($row = $this->db_fetch_object()) + { + $this->anwesenheit_id = $row->anwesenheit_id; + $this->uid = $row->uid; + $this->einheiten = $row->einheiten; + $this->datum = $row->datum; + $this->anwesend = $this->db_parse_bool($row->anwesend); + $this->lehreinheit_id = $row->lehreinheit_id; + $this->anmerkung = $row->anmerkung; + $this->new=false; + } + else + { + $this->errormsg = 'Es ist kein Datensatz mit dieser ID vorhanden'; + return false; + } + + return true; + } + + /** + * Prueft die Variablen auf Gueltigkeit + * @return true wenn ok, false im Fehlerfall + */ + protected function validate() + { + //Zahlenfelder pruefen + if(!is_numeric($this->anwesenheit_id) && $this->anwesenheit_id!='') + { + $this->errormsg='anwesenheit_id enthaelt ungueltige Zeichen'; + return false; + } + + //Gesamtlaenge pruefen + if(mb_strlen($this->anmerkung)>255) + { + $this->errormsg = 'Anmerkung darf nicht länger als 255 Zeichen sein'; + return false; + } + + $this->errormsg = ''; + return true; + } + + /** + * Speichert den aktuellen Datensatz in die Datenbank + * Wenn $neu auf true gesetzt ist wird ein neuer Datensatz angelegt + * andernfalls wird der bestehende Datensatz aktualisiert + * @return true wenn ok, false im Fehlerfall + */ + public function save() + { + //Variablen pruefen + if(!$this->validate()) + return false; + + if($this->new) + { + //Neuen Datensatz einfuegen + $qry='BEGIN;INSERT INTO campus.tbl_anwesenheit (uid, einheiten, anwesend, datum, lehreinheit_id, anmerkung) VALUES('. + $this->db_add_param($this->uid).', '. + $this->db_add_param($this->einheiten).', '. + $this->db_add_param($this->anwesend, FHC_BOOLEAN).', '. + $this->db_add_param($this->datum).', '. + $this->db_add_param($this->lehreinheit_id).', '. + $this->db_add_param($this->anmerkung).');'; + } + else + { + //Pruefen ob id eine gueltige Zahl ist + if(!is_numeric($this->anwesenheit_id)) + { + $this->errormsg = 'anwesenheit_id muss eine gueltige Zahl sein'; + return false; + } + $qry='UPDATE campus.tbl_anwesenheit SET'. + ' uid='.$this->db_add_param($this->uid).', '. + ' einheiten='.$this->db_add_param($this->einheiten).', '. + ' anwesend='.$this->db_add_param($this->anwesend,FHC_BOOLEAN).', '. + ' datum='.$this->db_add_param($this->datum).', '. + ' lehreinheit_id='.$this->db_add_param($this->lehreinheit_id, FHC_INTEGER).', '. + ' anmerkung='.$this->db_add_param($this->anmerkung).' '. + 'WHERE anwesenheit_id='.$this->db_add_param($this->anwesenheit_id, FHC_INTEGER, false).';'; + } + + if($this->db_query($qry)) + { + if($this->new) + { + //naechste ID aus der Sequence holen + $qry="SELECT currval('campus.seq_anwesenheit_anwesenheit_id') as id;"; + if($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $this->anwesenheit_id = $row->id; + $this->db_query('COMMIT'); + } + else + { + $this->db_query('ROLLBACK'); + $this->errormsg = "Fehler beim Auslesen der Sequence"; + return false; + } + } + else + { + $this->db_query('ROLLBACK'); + $this->errormsg = 'Fehler beim Auslesen der Sequence'; + return false; + } + } + + } + else + { + $this->errormsg = 'Fehler beim Speichern des Datensatzes'; + return false; + } + return $this->anwesenheit_id; + } + + /** + * Laedt die Anwesenheiten einer Lehreinheit/Datum + * @param $lehreinheit_id + * @param $datum + * @return boolean true wenn ok, false im Fehlerfall + */ + public function getAnwesenheitLehreinheit($lehreinheit_id, $datum=null) + { + $qry = "SELECT * FROM campus.tbl_anwesenheit + WHERE + lehreinheit_id=".$this->db_add_param($lehreinheit_id, FHC_INTEGER); + + if(!is_null($datum)) + $qry.=" AND datum=".$this->db_add_param($datum); + + if($result = $this->db_query($qry)) + { + while($row = $this->db_fetch_object($result)) + { + $obj = new anwesenheit(); + + $obj->anwesenheit_id = $row->anwesenheit_id; + $obj->uid = $row->uid; + $obj->einheiten = $row->einheiten; + $obj->datum = $row->datum; + $obj->anwesend = $this->db_parse_bool($row->anwesend); + $obj->lehreinheit_id = $row->lehreinheit_id; + $obj->anmerkung = $row->anmerkung; + + $this->result[] = $obj; + } + return true; + } + else + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + } + + public function loadAnwesenheitMitarbeiter($mitarbeiter_uid, $lehreinheit_id) + { + $qry = "SELECT + datum, a.einheiten, + (SELECT true FROM campus.tbl_anwesenheit + WHERE lehreinheit_id=".$this->db_add_param($lehreinheit_id)." AND datum=a.datum LIMIT 1) as anwesend, + (SELECT stundensatz FROM lehre.tbl_lehreinheitmitarbeiter WHERE lehreinheit_id=".$this->db_add_param($lehreinheit_id)." + AND mitarbeiter_uid=".$this->db_add_param($mitarbeiter_uid).") as stundensatz + FROM + (SELECT datum, count(distinct stunde) as einheiten FROM lehre.tbl_stundenplan + WHERE + lehreinheit_id=".$this->db_add_param($lehreinheit_id)." + AND mitarbeiter_uid=".$this->db_add_param($mitarbeiter_uid)." + GROUP by datum) as a + "; + + if($result = $this->db_query($qry)) + { + $this->anzahl_termine=0; + $this->anzahl_anwesend=0; + $this->anwesenheit = array(); + + while($row = $this->db_fetch_object($result)) + { + $anwesend = $this->db_parse_bool($row->anwesend); + $key = $lehreinheit_id.'/'.$row->datum; + + $this->anwesenheit[$key]['anwesend'] = ($anwesend?true:false); + $this->anwesenheit[$key]['lehreinheit_id'] = $lehreinheit_id; + $this->anwesenheit[$key]['datum']=$row->datum; + $this->anwesenheit[$key]['einheiten']=$row->einheiten; + $this->anwesenheit[$key]['stundensatz']=$row->stundensatz; + + $this->anzahl_termine++; + if($anwesend) + $this->anzahl_anwesend++; + } + if($this->anzahl_termine>0) + { + $this->prozent_anwesend=$this->anzahl_anwesend/$this->anzahl_termine*100; + } + return true; + } + else + { + $this->errormsg='Fehler beim Laden der Daten'; + return false; + } + } + + /** + * Liefert für Student und Einheit wieviel Einheiten als anwesend/abwesend + * eingetragen sind. + * + * @param string $uid + * @param int $lehreinheit_id + * @param bool $anwesend + * @return int + */ + public function getAnwesenheit($uid, $lehreinheit_id, $anwesend = FALSE) + { + $qry = 'SELECT sum(einheiten) AS einheiten ' + . 'FROM campus.tbl_anwesenheit ' + . 'WHERE uid = ' . $this->db_add_param($uid) + . ' AND lehreinheit_id = ' . $this->db_add_param($lehreinheit_id, FHC_INTEGER) + . ' AND anwesend = ' . $this->db_add_param($anwesend, FHC_BOOLEAN); + + $result = $this->db_query($qry); + $row = $this->db_fetch_object($result); + + return $row->einheiten; + } + + /** + * Liefert die Anwesenheiten/Abwesenheiten eines Studenten bei einer LV + * + * @param string $student_uid + * @param int $lehrveranstaltung_id + * @param string $studiensemester_kurzbz + * @param boolean $anwesend + * @return boolean + */ + public function getAnwesenheitLehrveranstaltung($student_uid, $lehrveranstaltung_id, $studiensemester_kurzbz, $anwesend=false) + { + $qry = 'SELECT + distinct tbl_anwesenheit.* + FROM + campus.tbl_anwesenheit + JOIN campus.vw_student_lehrveranstaltung USING(uid) + WHERE + uid='.$this->db_add_param($student_uid).' + AND vw_student_lehrveranstaltung.lehreinheit_id=tbl_anwesenheit.lehreinheit_id + AND lehrveranstaltung_id='.$this->db_add_param($lehrveranstaltung_id, FHC_INTEGER).' + AND studiensemester_kurzbz='.$this->db_add_param($studiensemester_kurzbz).' + AND anwesend=' . $this->db_add_param($anwesend, FHC_BOOLEAN).' + ORDER BY datum'; + + if($result = $this->db_query($qry)) + { + while($row = $this->db_fetch_object($result)) + { + $obj = new anwesenheit(); + + $obj->anwesenheit_id = $row->anwesenheit_id; + $obj->uid = $row->uid; + $obj->einheiten = $row->einheiten; + $obj->datum = $row->datum; + $obj->anwesend = $this->db_parse_bool($row->anwesend); + $obj->lehreinheit_id = $row->lehreinheit_id; + $obj->anmerkung = $row->anmerkung; + + $this->result[] = $obj; + } + return true; + } + else + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + } + + /** + * Liefert die Termine an denen eine Abwesenheit eingetragen ist. + * + * @param string $uid + * @param int $lehreinheit_id + * @return array + */ + public function getAbwesendTermine($uid, $lehreinheit_id) + { + + $qry = 'SELECT datum, einheiten ' + . 'FROM campus.tbl_anwesenheit ' + . 'WHERE uid = ' . $this->db_add_param($uid) + . ' AND lehreinheit_id = ' . $this->db_add_param($lehreinheit_id) + . ' AND anwesend = FALSE ' + . 'ORDER BY datum'; + + $result = $this->db_query($qry); + $ret_obj = array(); + + while($row = $this->db_fetch_object($result)) + { + $ret_obj[] = $row; + } + + return $ret_obj; + } + + public function getAmpel($anwesenheit_relativ) + { + + if($anwesenheit_relativ < FAS_ANWESENHEIT_ROT) + { + return 'red'; + } + elseif($anwesenheit_relativ < FAS_ANWESENHEIT_GELB) + { + return 'yellow'; + } + else + { + return 'green'; + } + } + + /** + * Prueft ob Anwesenheiten erfasst wurden + * @param $lehreinheit_id ID der Lehreinheit + * @param $datum Datum + * @param $uid UID des Studierenden + * @return boolean true wenn vorhanden, sonst false + */ + public function AnwesenheitExists($lehreinheit_id, $datum, $uid=null) + { + $qry = "SELECT + 1 + FROM + campus.tbl_anwesenheit + WHERE + anwesend=true + AND lehreinheit_id=".$this->db_add_param($lehreinheit_id)." + AND datum=".$this->db_add_param($datum); + + if($uid!='') + $qry.=" AND uid=".$this->db_add_param($uid); + + if($result = $this->db_query($qry)) + { + if($this->db_num_rows($result)>0) + return true; + else + return false; + } + else + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + } + + /** + * Prueft ob Anwesenheiten erfasst wurden + * @param $lehreinheit_id ID der Lehreinheit + * @param $datum Datum + * @param $uid UID des Studierenden + * @return boolean true wenn vorhanden, sonst false + */ + public function AnwesenheitEntryExists($lehreinheit_id, $datum, $uid=null) + { + $qry = "SELECT + 1 + FROM + campus.tbl_anwesenheit + WHERE + lehreinheit_id=".$this->db_add_param($lehreinheit_id)." + AND datum=".$this->db_add_param($datum)." + AND uid=".$this->db_add_param($uid); + + if($result = $this->db_query($qry)) + { + if($this->db_num_rows($result)>0) + return true; + else + return false; + } + else + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + } + + /** + * Laedt die Anwesenheiten in Prozent von Studierenden bei Lehrveranstaltungen + * Wenn die StudentUID uebergeben wird, werden alle Lehrveranstaltungen zu denen der Studierenden zugeteilt ist inkl Prozent der Anwesenheit + * Wenn die LehrveranstaltungID uebergeben wird, werden alle Studierenden geholt die zugeteilt sind inkl Prozent der Anwesenheit + * Es werden pro Student die Anwesenheiten berechnet aufgrund der Lehreinheit zu der sie zugeordnet sind + * @param $studiensemester_kurzbz + * @param $student_uid + * @param $lehrveranstaltung_id + * @return boolean true wenn ok, false im fehlerfall + */ + public function loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid=null, $lehrveranstaltung_id=null) + { + $qry = "SELECT + lehrveranstaltung_id, vorname, nachname, wahlname, student_uid as uid, bezeichnung, + gesamt as gesamtstunden, anwesend, nichtanwesend, trunc(100-(nichtanwesend/gesamt)*100,2) as prozent + FROM + ( + SELECT + vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid, + count(stundenplan_id) as gesamt, + case when anwesend.summe is null then 0 else anwesend.summe end as anwesend, + case when nichtanwesend.summe is null then 0 else nichtanwesend.summe end as nichtanwesend + FROM + ( + SELECT + sum(stundenplan_id) as stundenplan_id, datum, stunde, lehrveranstaltung_id, + bezeichnung, studiensemester_kurzbz, studiengang_kz, + TRIM( + CASE WHEN stp.gruppe_kurzbz is not null then stp.gruppe_kurzbz + else stp.semester||(case when verband is null then '' else stp.verband end)||(case when stp.gruppe is null then '' else stp.gruppe end) end) as gruppe + FROM + lehre.tbl_lehrveranstaltung lv + JOIN lehre.tbl_lehreinheit le using (lehrveranstaltung_id) + JOIN lehre.tbl_stundenplan stp using (lehreinheit_id,studiengang_kz) + WHERE + studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + AND (titel not like '%Nebenprüfung%' OR titel is null) + + group by datum, stunde, lehrveranstaltung_id, bezeichnung, studiensemester_kurzbz, studiengang_kz, stp.gruppe_kurzbz, stp.semester, stp.verband, stp.gruppe + )x + JOIN ( + SELECT semester::text as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz + FROM + public.tbl_studentlehrverband + WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + + UNION + + SELECT semester||verband as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz + FROM + public.tbl_studentlehrverband + WHERE + studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + + UNION + + SELECT semester||verband||gruppe as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz + FROM + public.tbl_studentlehrverband + WHERE + studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + + UNION + + SELECT gruppe_kurzbz as gruppe, public.tbl_benutzergruppe.studiensemester_kurzbz, uid as student_uid, studiengang_kz + FROM + public.tbl_benutzergruppe + JOIN + public.tbl_gruppe using (gruppe_kurzbz) + WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + + )a using (gruppe, studiensemester_kurzbz, studiengang_kz) + JOIN public.tbl_benutzer b on b.uid = student_uid + JOIN public.tbl_person p using(person_id) + LEFT JOIN( + SELECT + lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe + FROM + campus.tbl_anwesenheit a + JOIN lehre.tbl_lehreinheit le using (lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id) + WHERE + anwesend = true AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + GROUP BY + lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz + )anwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz) + LEFT JOIN( + SELECT lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe + FROM + campus.tbl_anwesenheit a + JOIN lehre.tbl_lehreinheit le using (lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id) + WHERE + anwesend = false AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + GROUP BY + lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz + )nichtanwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz) + WHERE + lehrveranstaltung_id > 0 + "; + + if(!is_null($student_uid)) + $qry.=" AND student_uid=".$this->db_add_param($student_uid); + if(!is_null($lehrveranstaltung_id)) + $qry.=" AND lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id); + + $qry.="group by + vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid, anwesend.summe, nichtanwesend.summe + )m"; + + if($lehrveranstaltung_id != '') + $qry.=" order by nachname, vorname "; + elseif($student_uid != '') + $qry.=" order by bezeichnung"; + + if($result = $this->db_query($qry)) + { + while($row = $this->db_fetch_object($result)) + { + $obj = new stdClass(); + $obj->bezeichnung = $row->bezeichnung; + $obj->anwesend = $row->anwesend; + $obj->nichtanwesend = $row->nichtanwesend; + $obj->gesamtstunden = $row->gesamtstunden; + + $obj->erfassteanwesenheit = $row->anwesend+$row->nichtanwesend; + if($row->gesamtstunden=='' || $obj->erfassteanwesenheit=='') + $obj->prozent=100; + else + $obj->prozent = number_format(100-(100/$obj->gesamtstunden*$row->nichtanwesend),2); + $obj->vorname = $row->vorname; + $obj->wahlname = $row->wahlname; + $obj->nachname = $row->nachname; + $obj->uid = $row->uid; + $obj->lehrveranstaltung_id = $row->lehrveranstaltung_id; + $this->result[] = $obj; + } + return true; + } + else + { + $this->errormsg='Fehler beim Laden der Daten'; + return false; + } + } + + /** + * Aendert die bestehende Anwesenheit + * @param $lehreinheit_id ID der Lehreinheit + * @param $datum Datum + * @param $uid UID des Studierenden + * @return boolean true ok, sonst false + */ + public function AnwesenheitToggle($lehreinheit_id, $datum, $uid) + { + if($this->AnwesenheitEntryExists($lehreinheit_id, $datum, $uid)) + { + $qry = "UPDATE + campus.tbl_anwesenheit + SET anwesend= NOT anwesend + WHERE + lehreinheit_id=".$this->db_add_param($lehreinheit_id)." + AND datum=".$this->db_add_param($datum)." + AND uid=".$this->db_add_param($uid); + + if($result = $this->db_query($qry)) + { + if($this->db_affected_rows($result)>0) + return true; + else + { + $this->errormsg='Anwesenheitsliste wurde noch nicht erfasst'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + } + else + { + // Anwesenheitsliste wurde noch nicht erfasst. Eintrag neu anlegen + + // Einheiten ermitteln + $qry = "SELECT + distinct stunde + FROM + lehre.tbl_stundenplan + WHERE + lehreinheit_id=".$this->db_add_param($lehreinheit_id)." + AND datum=".$this->db_add_param($datum); + + if($result = $this->db_query($qry)) + { + if($anzahl = $this->db_num_rows($result)) + { + $einheiten = $anzahl; + } + } + if($einheiten>0) + { + $this->lehreinheit_id=$lehreinheit_id; + $this->datum = $datum; + $this->uid = $uid; + $this->anwesend=true; + $this->new=true; + $this->einheiten=$einheiten; + if($this->save()) + return true; + else + { + $this->errormsg = 'Fehler beim Speichern der Daten'; + return true; + } + } + else + { + $this->errormsg = 'Anzahl der Einheiten fuer diesen Tag konnte nicht ermittelt werden'; + return false; + } + } + } + + /** + * Loescht eine Anwesenheit + * @param anwesenheit_id integer ID der Anwesenheit. + * @return boolean true wenn ok , false im fehlerfall + */ + public function delete($anwesenheit_id) + { + $qry = "DELETE FROM campus.tbl_anwesenheit WHERE anwesenheit_id=".$this->db_add_param($anwesenheit_id, FHC_INTEGER).";"; + + if($this->db_query($qry)) + { + return true; + } + else + { + $this->errormsg = 'Fehler beim Löschen der Anwesenheit'; + return false; + } + } +} From 5d668791f937706a9a235f18acff1bbd47753fc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Fri, 14 Apr 2023 14:37:52 +0200 Subject: [PATCH 86/88] =?UTF-8?q?Projektphase=20in=20der=20Zeiterfassung?= =?UTF-8?q?=20werden=20tempor=C3=A4r=207=20Monate=20in=20die=20Vergangenhe?= =?UTF-8?q?it=20anzgezeigt=20um=20die=20Erfassung=20von=20alten=20Eintr?= =?UTF-8?q?=C3=A4gen=20zu=20erm=C3=B6glichen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/projektphase.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/projektphase.class.php b/include/projektphase.class.php index 4e3c38b7c..c1cd8322c 100644 --- a/include/projektphase.class.php +++ b/include/projektphase.class.php @@ -718,10 +718,10 @@ class projektphase extends basis_db ( ( (tbl_projekt.beginn<=now() or tbl_projekt.beginn is null) - AND (tbl_projekt.ende + interval '1 month 1 day' >=now() OR tbl_projekt.ende is null) + AND (tbl_projekt.ende + interval '7 month 1 day' >=now() OR tbl_projekt.ende is null) ) AND ( (tbl_projektphase.start<=now() or tbl_projektphase.start is null) - AND (tbl_projektphase.ende + interval '1 month 1 day' >=now() OR tbl_projektphase.ende is null) + AND (tbl_projektphase.ende + interval '7 month 1 day' >=now() OR tbl_projektphase.ende is null) ) ) AND mitarbeiter_uid=" . $this->db_add_param($mitarbeiter_uid); @@ -787,10 +787,10 @@ class projektphase extends basis_db ( ( (tbl_projekt.beginn<=now() or tbl_projekt.beginn is null) - AND (tbl_projekt.ende + interval '1 month 1 day' >=now() OR tbl_projekt.ende is null) + AND (tbl_projekt.ende + interval '7 month 1 day' >=now() OR tbl_projekt.ende is null) ) AND ( (tbl_projektphase.start<=now() or tbl_projektphase.start is null) - AND (tbl_projektphase.ende + interval '1 month 1 day' >=now() OR tbl_projektphase.ende is null) + AND (tbl_projektphase.ende + interval '7 month 1 day' >=now() OR tbl_projektphase.ende is null) ) ) AND mitarbeiter_uid = ".$this->db_add_param($mitarbeiter_uid)." From 1fa215103ce941ebd0e38f07ff6c86bff3f3e4e6 Mon Sep 17 00:00:00 2001 From: Manfred Date: Wed, 19 Apr 2023 15:42:51 +0200 Subject: [PATCH 87/88] Insert- und Update-Daten bei Prestudentstatus im FAS --- content/student/studentdetailoverlay.xul.php | 20 ++++++++++++++++++++ rdf/prestudentrolle.rdf.php | 4 ++++ 2 files changed, 24 insertions(+) diff --git a/content/student/studentdetailoverlay.xul.php b/content/student/studentdetailoverlay.xul.php index ec72ee756..845d48397 100644 --- a/content/student/studentdetailoverlay.xul.php +++ b/content/student/studentdetailoverlay.xul.php @@ -783,6 +783,22 @@ echo ''; class="sortDirectionIndicator" sort="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#statusgrund" /> +