From 2a8b61c07fe60d031d0af852c045b52dbbfbeac7 Mon Sep 17 00:00:00 2001 From: Paolo Date: Wed, 11 May 2022 18:29:10 +0200 Subject: [PATCH 001/126] - Added new library application/libraries/SignatureLib.php - Changed configs for the signature server in config/vilesci.config-default.inc.php - Changed include/dokument_export.class.php to make use of the new configs --- application/libraries/SignatureLib.php | 76 ++++++++++++++++++++++++++ config/vilesci.config-default.inc.php | 11 +++- include/dokument_export.class.php | 2 +- 3 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 application/libraries/SignatureLib.php diff --git a/application/libraries/SignatureLib.php b/application/libraries/SignatureLib.php new file mode 100644 index 000000000..b8c4374a3 --- /dev/null +++ b/application/libraries/SignatureLib.php @@ -0,0 +1,76 @@ +sendsJson() + ->authenticateWith(SIGNATUR_USER, SIGNATUR_PASSWORD) + ->body('{"filename": "'.basename($inputFileName).'", "content": "'.base64_encode($inputFileContent).'"}') + ->expectsJson() + ->send(); + } + } + catch(\Httpful\Exception\ConnectionErrorException $cee) // Httpful exception + { + $resultList = $cee->getMessage(); + } + catch (Exception $e) // any other exception + { + $resultList = $e->getMessage(); + } + + // If the response is fine + if (isset($resultPost->body) && is_object($resultPost->body) && isset($resultPost->body->retval)) + { + return $resultPost->body->retval; + } + + return $resultList; + } +} + diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php index 5285eef3b..a3e4cbece 100644 --- a/config/vilesci.config-default.inc.php +++ b/config/vilesci.config-default.inc.php @@ -186,11 +186,16 @@ define('FHC_REST_PASSWORD', 'password'); * Signatur * DEFAULT: https://signatur.example.com/api/sign */ -define('SIGNATUR_URL', 'https://signatur.example.com/api/sign'); +// Generic URL +define('SIGNATUR_URL', 'https://signatur.dev.technikum-wien.at/api'); +// Sign API +define('SIGNATUR_SIGN_API', 'sign'); +// List API +define('SIGNATUR_LIST_API', 'list'); // User für Zugriff auf Signaturserver -define('SIGNATUR_USER', 'username'); +define('SIGNATUR_USER', 'fhcomplete'); // Passwort für Zugriff auf Signaturserver -define('SIGNATUR_PASSWORD', 'password'); +define('SIGNATUR_PASSWORD', 'Fhcomplet3Signature!'); // Signaturprofil das verwendet werden soll define('SIGNATUR_DEFAULT_PROFILE', 'FHC_AMT_GROSS_DE'); diff --git a/include/dokument_export.class.php b/include/dokument_export.class.php index 4f23a7dcd..3a6e57657 100644 --- a/include/dokument_export.class.php +++ b/include/dokument_export.class.php @@ -527,7 +527,7 @@ class dokument_export $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, SIGNATUR_URL); + curl_setopt($ch, CURLOPT_URL, SIGNATUR_URL.'/'.SIGNATUR_SIGN_API); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 7); curl_setopt($ch, CURLOPT_USERAGENT, "FH-Complete"); From d4042228d9114502fd0151510df15effa43b21e2 Mon Sep 17 00:00:00 2001 From: Paolo Date: Fri, 13 May 2022 20:11:31 +0200 Subject: [PATCH 002/126] - Better code and comments in application/libraries/SignatureLib->list - cis/private/lehre/abgabe_lektor_details.php and cis/private/lehre/abgabe_student_details.php check if the uploaded document contains digital signares and display a phrase - Added new phrase to locale/de-AT/abgabetool.php and locale/en-US/abgabetool.php --- application/libraries/SignatureLib.php | 15 +++--- cis/private/lehre/abgabe_lektor_details.php | 25 +++++++++- cis/private/lehre/abgabe_student_details.php | 49 ++++++++++++++++---- locale/de-AT/abgabetool.php | 1 + locale/en-US/abgabetool.php | 1 + 5 files changed, 73 insertions(+), 18 deletions(-) diff --git a/application/libraries/SignatureLib.php b/application/libraries/SignatureLib.php index b8c4374a3..132545219 100644 --- a/application/libraries/SignatureLib.php +++ b/application/libraries/SignatureLib.php @@ -33,16 +33,13 @@ class SignatureLib */ public static function list($inputFileName) { - // Generic error occurred - $resultList = 'Generic error occurred'; - try { // Get the content of the given file $inputFileContent = file_get_contents($inputFileName); if ($inputFileContent === false) // if failed { - $resultList = 'An error occurred while getting the content from: '.$inputFileName; + error_log('An error occurred while getting the content from: '.$inputFileName); } else { @@ -57,20 +54,22 @@ class SignatureLib } catch(\Httpful\Exception\ConnectionErrorException $cee) // Httpful exception { - $resultList = $cee->getMessage(); + error_log($cee->getMessage()); } catch (Exception $e) // any other exception { - $resultList = $e->getMessage(); + error_log($e->getMessage()); } // If the response is fine - if (isset($resultPost->body) && is_object($resultPost->body) && isset($resultPost->body->retval)) + if (isset($resultPost->body) && is_object($resultPost->body) + && isset($resultPost->body->retval) && is_array($resultPost->body->retval)) { return $resultPost->body->retval; } - return $resultList; + // Otherwise return a null as error + return null; } } diff --git a/cis/private/lehre/abgabe_lektor_details.php b/cis/private/lehre/abgabe_lektor_details.php index a508de098..e1b47369d 100644 --- a/cis/private/lehre/abgabe_lektor_details.php +++ b/cis/private/lehre/abgabe_lektor_details.php @@ -37,6 +37,7 @@ require_once('../../../include/phrasen.class.php'); require_once('../../../include/projektarbeit.class.php'); require_once('../../../include/projektbetreuer.class.php'); require_once('../../../include/sancho.inc.php'); +require_once('../../../application/libraries/SignatureLib.php'); if (!$db = new basis_db()) $db=false; @@ -642,7 +643,29 @@ $result=@$db->db_query($qry); } if(file_exists(PAABGABE_PATH.$row->paabgabe_id.'_'.$uid.'.pdf')) { - $htmlstr .= " PDF"; + $uploadedDocumentSigned = null; + + // Check if the document is signed + $signList = SignatureLib::list(PAABGABE_PATH.$row->paabgabe_id.'_'.$uid.'.pdf'); + if (is_array($signList) && count($signList) > 0) + { + // The document is signed + } + elseif ($signList === null) + { + $uploadedDocumentSigned = 'WARNING: signature server error'; + } + else + { + $uploadedDocumentSigned = $p->t('abgabetool/uploadedDocumentNotSigned'); + } + + $htmlstr .= " + + PDF + + ".$uploadedDocumentSigned." + "; } else { diff --git a/cis/private/lehre/abgabe_student_details.php b/cis/private/lehre/abgabe_student_details.php index 29d74ab66..b8a8f158e 100644 --- a/cis/private/lehre/abgabe_student_details.php +++ b/cis/private/lehre/abgabe_student_details.php @@ -36,6 +36,7 @@ require_once('../../../include/phrasen.class.php'); require_once('../../../include/projektarbeit.class.php'); require_once('../../../include/projektbetreuer.class.php'); require_once('../../../include/sancho.inc.php'); +require_once('../../../application/libraries/SignatureLib.php'); $anzeigesprache = getSprache(); $p = new phrasen($anzeigesprache); @@ -111,6 +112,7 @@ $titel = $projektarbeit_obj->titel; $person = new person(); $person->load($bid); $betreuer = $person->titelpre.' '.$person->vorname.' '.$person->nachname.' '.$person->titelpost; +$uploadedDocumentSigned = null; if($uid!=$user) { @@ -286,15 +288,20 @@ if($command=="update" && $error!=true) move_uploaded_file($_FILES['datei']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'); if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf')) { - exec('chmod 640 "'.PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'.'"'); - - $qry="UPDATE campus.tbl_paabgabe SET - abgabedatum = now(), - updatevon = ".$db->db_add_param($user).", - updateamum = now() - WHERE paabgabe_id=".$db->db_add_param($paabgabe_id, FHC_INTEGER); - $result=$db->db_query($qry); - echo $p->t('global/dateiErfolgreichHochgeladen'); + // Check if the document is signed + $signList = SignatureLib::list(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'); + if (is_array($signList) && count($signList) > 0) + { + // The document is signed + } + elseif ($signList === null) + { + $uploadedDocumentSigned = 'WARNING: signature server error'; + } + else + { + $uploadedDocumentSigned = $p->t('abgabetool/uploadedDocumentNotSigned'); + } } else { @@ -311,6 +318,21 @@ if($command=="update" && $error!=true) } if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf')) { + // Check if the document is signed + $signList = SignatureLib::list(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'); + if (is_array($signList) && count($signList) > 0) + { + // The document is signed + } + elseif ($signList === null) + { + $uploadedDocumentSigned = 'WARNING: signature server error'; + } + else + { + $uploadedDocumentSigned = $p->t('abgabetool/uploadedDocumentNotSigned'); + } + /*$qry="UPDATE campus.tbl_paabgabe SET abgabedatum = now(), updatevon = '".$user."', @@ -339,6 +361,15 @@ if($command=="update" && $error!=true) $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; + + // If there are info about the signed document + if ($uploadedDocumentSigned != null) + { + $htmlstr .= "\n"; + $htmlstr .= "".$uploadedDocumentSigned.""; + $htmlstr .= "\n"; + } + $htmlstr .= "\n"; $htmlstr .= "".$p->t('abgabetool/spracheDerArbeit').":"; $sprache = @$db->db_query("SELECT sprache FROM public.tbl_sprache"); diff --git a/locale/de-AT/abgabetool.php b/locale/de-AT/abgabetool.php index c4b17318b..6d1eb923f 100644 --- a/locale/de-AT/abgabetool.php +++ b/locale/de-AT/abgabetool.php @@ -91,4 +91,5 @@ $this->phrasen['abgabetool/projektbeurteilungDownload']='Projektbeurteilung heru $this->phrasen['abgabetool/projektbeurteilungErstDownload']='Erst-/Begutachter'; $this->phrasen['abgabetool/projektbeurteilungZweitDownload']='Zweitbegutachter'; $this->phrasen['abgabetool/fehlerErmittelnEndabgabeProjektarbeit']='Fehler beim Ermitteln des Enduplaods der Projektarbeit'; +$this->phrasen['abgabetool/uploadedDocumentNotSigned']='The uploaded document is not signed DE'; ?> diff --git a/locale/en-US/abgabetool.php b/locale/en-US/abgabetool.php index b05456faa..c782dedcc 100644 --- a/locale/en-US/abgabetool.php +++ b/locale/en-US/abgabetool.php @@ -91,4 +91,5 @@ $this->phrasen['abgabetool/projektbeurteilungDownload']='Thesis-Assessment downl $this->phrasen['abgabetool/projektbeurteilungErstDownload']='First-/Assessor'; $this->phrasen['abgabetool/projektbeurteilungZweitDownload']='Second Assessor'; $this->phrasen['abgabetool/fehlerErmittelnEndabgabeProjektarbeit']='Error when getting endupload of project work'; +$this->phrasen['abgabetool/uploadedDocumentNotSigned']='The uploaded document is not signed EN'; ?> From 22bba685ffcacdbb0ee1b2847cea3eab8b3c8a65 Mon Sep 17 00:00:00 2001 From: Paolo Date: Mon, 16 May 2022 16:15:48 +0200 Subject: [PATCH 003/126] Added new style to the warning --- cis/private/lehre/abgabe_lektor_details.php | 27 ++++++++++++-------- cis/private/lehre/abgabe_student_details.php | 24 ++++++++++------- locale/de-AT/abgabetool.php | 2 +- locale/en-US/abgabetool.php | 2 +- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/cis/private/lehre/abgabe_lektor_details.php b/cis/private/lehre/abgabe_lektor_details.php index e1b47369d..29a1221af 100644 --- a/cis/private/lehre/abgabe_lektor_details.php +++ b/cis/private/lehre/abgabe_lektor_details.php @@ -641,6 +641,14 @@ $result=@$db->db_query($qry); { $htmlstr .= "               "; } + if($row->abgabedatum && $row->paabgabetyp_kurzbz=="end") + { + $htmlstr .= " zusätzliche Daten"; + } + else + { + $htmlstr .= "     "; + } if(file_exists(PAABGABE_PATH.$row->paabgabe_id.'_'.$uid.'.pdf')) { $uploadedDocumentSigned = null; @@ -663,17 +671,14 @@ $result=@$db->db_query($qry); $htmlstr .= " PDF - - ".$uploadedDocumentSigned." - "; - } - else - { - $htmlstr .= "     "; - } - if($row->abgabedatum && $row->paabgabetyp_kurzbz=="end") - { - $htmlstr .= " zusätzliche Daten"; + "; + if ($uploadedDocumentSigned != null) + { + $htmlstr .= '
+ '.$uploadedDocumentSigned.' +
'; + } + $htmlstr .= ""; } else { diff --git a/cis/private/lehre/abgabe_student_details.php b/cis/private/lehre/abgabe_student_details.php index b8a8f158e..949749a3b 100644 --- a/cis/private/lehre/abgabe_student_details.php +++ b/cis/private/lehre/abgabe_student_details.php @@ -361,15 +361,6 @@ if($command=="update" && $error!=true) $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; - - // If there are info about the signed document - if ($uploadedDocumentSigned != null) - { - $htmlstr .= "\n"; - $htmlstr .= "".$uploadedDocumentSigned.""; - $htmlstr .= "\n"; - } - $htmlstr .= "\n"; $htmlstr .= "".$p->t('abgabetool/spracheDerArbeit').":"; $sprache = @$db->db_query("SELECT sprache FROM public.tbl_sprache"); @@ -403,6 +394,21 @@ if($command=="update" && $error!=true) $htmlstr .= ''.$p->t('abgabetool/seitenanzahl').':* '."\n"; $htmlstr .=" \n"; + + // If there are info about the signed document + if ($uploadedDocumentSigned != null) + { + $htmlstr .= "\n"; + $htmlstr .= ""; + $htmlstr .= '
+ + '.$uploadedDocumentSigned.' +
'; + $htmlstr .= ""; + $htmlstr .= "\n"; + } + + $htmlstr .=" \n"; $htmlstr .="

".$p->t('abgabetool/eidesstattlicheErklaerung')."

\n"; $htmlstr .= "".$p->t('abgabetool/gelesenUndAkzeptiert').":* "; $htmlstr .=" * ".$p->t('abgabetool/pflichtfeld')." diff --git a/locale/de-AT/abgabetool.php b/locale/de-AT/abgabetool.php index 6d1eb923f..093b56255 100644 --- a/locale/de-AT/abgabetool.php +++ b/locale/de-AT/abgabetool.php @@ -91,5 +91,5 @@ $this->phrasen['abgabetool/projektbeurteilungDownload']='Projektbeurteilung heru $this->phrasen['abgabetool/projektbeurteilungErstDownload']='Erst-/Begutachter'; $this->phrasen['abgabetool/projektbeurteilungZweitDownload']='Zweitbegutachter'; $this->phrasen['abgabetool/fehlerErmittelnEndabgabeProjektarbeit']='Fehler beim Ermitteln des Enduplaods der Projektarbeit'; -$this->phrasen['abgabetool/uploadedDocumentNotSigned']='The uploaded document is not signed DE'; +$this->phrasen['abgabetool/uploadedDocumentNotSigned']='Warning! The uploaded document is not signed DE'; ?> diff --git a/locale/en-US/abgabetool.php b/locale/en-US/abgabetool.php index c782dedcc..333e21272 100644 --- a/locale/en-US/abgabetool.php +++ b/locale/en-US/abgabetool.php @@ -91,5 +91,5 @@ $this->phrasen['abgabetool/projektbeurteilungDownload']='Thesis-Assessment downl $this->phrasen['abgabetool/projektbeurteilungErstDownload']='First-/Assessor'; $this->phrasen['abgabetool/projektbeurteilungZweitDownload']='Second Assessor'; $this->phrasen['abgabetool/fehlerErmittelnEndabgabeProjektarbeit']='Error when getting endupload of project work'; -$this->phrasen['abgabetool/uploadedDocumentNotSigned']='The uploaded document is not signed EN'; +$this->phrasen['abgabetool/uploadedDocumentNotSigned']='Warning! The uploaded document is not signed'; ?> From 2d2383639617fe349f8263927d607556afb7d6e7 Mon Sep 17 00:00:00 2001 From: Paolo Date: Mon, 16 May 2022 16:23:15 +0200 Subject: [PATCH 004/126] Translated german phrase --- locale/de-AT/abgabetool.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/de-AT/abgabetool.php b/locale/de-AT/abgabetool.php index 093b56255..378544811 100644 --- a/locale/de-AT/abgabetool.php +++ b/locale/de-AT/abgabetool.php @@ -91,5 +91,5 @@ $this->phrasen['abgabetool/projektbeurteilungDownload']='Projektbeurteilung heru $this->phrasen['abgabetool/projektbeurteilungErstDownload']='Erst-/Begutachter'; $this->phrasen['abgabetool/projektbeurteilungZweitDownload']='Zweitbegutachter'; $this->phrasen['abgabetool/fehlerErmittelnEndabgabeProjektarbeit']='Fehler beim Ermitteln des Enduplaods der Projektarbeit'; -$this->phrasen['abgabetool/uploadedDocumentNotSigned']='Warning! The uploaded document is not signed DE'; +$this->phrasen['abgabetool/uploadedDocumentNotSigned']='Warnung! Das hochgeladene Dokument ist nicht signiert'; ?> From 94a1534c14e3ec3781adef1be5db921b0e29c68e Mon Sep 17 00:00:00 2001 From: Paolo Date: Mon, 23 May 2022 14:42:59 +0200 Subject: [PATCH 005/126] - Warning Wrap on small Screens in Leturer side - Perform Signatur Check only on Files from Type Endupload --- cis/private/lehre/abgabe_lektor_details.php | 57 ++++++++++++-------- cis/private/lehre/abgabe_student_details.php | 28 +++------- 2 files changed, 40 insertions(+), 45 deletions(-) diff --git a/cis/private/lehre/abgabe_lektor_details.php b/cis/private/lehre/abgabe_lektor_details.php index 29a1221af..f0a19c89a 100644 --- a/cis/private/lehre/abgabe_lektor_details.php +++ b/cis/private/lehre/abgabe_lektor_details.php @@ -548,6 +548,8 @@ $htmlstr .= " $result=@$db->db_query($qry); while ($row=@$db->db_fetch_object($result)) { + $uploadedDocumentSigned = null; + $htmlstr .= "
\n"; $htmlstr .= "\n"; $htmlstr .= "\n"; @@ -649,43 +651,52 @@ $result=@$db->db_query($qry); { $htmlstr .= "     "; } - if(file_exists(PAABGABE_PATH.$row->paabgabe_id.'_'.$uid.'.pdf')) - { - $uploadedDocumentSigned = null; - // Check if the document is signed - $signList = SignatureLib::list(PAABGABE_PATH.$row->paabgabe_id.'_'.$uid.'.pdf'); - if (is_array($signList) && count($signList) > 0) + if (file_exists(PAABGABE_PATH.$row->paabgabe_id.'_'.$uid.'.pdf')) + { + if ($row->paabgabetyp_kurzbz == 'end') { - // The document is signed - } - elseif ($signList === null) - { - $uploadedDocumentSigned = 'WARNING: signature server error'; - } - else - { - $uploadedDocumentSigned = $p->t('abgabetool/uploadedDocumentNotSigned'); + // Check if the document is signed + $signList = SignatureLib::list(PAABGABE_PATH.$row->paabgabe_id.'_'.$uid.'.pdf'); + if (is_array($signList) && count($signList) > 0) + { + // The document is signed + } + elseif ($signList === null) + { + $uploadedDocumentSigned = 'WARNING: signature server error'; + } + else + { + $uploadedDocumentSigned = $p->t('abgabetool/uploadedDocumentNotSigned'); + } } $htmlstr .= " PDF - "; - if ($uploadedDocumentSigned != null) - { - $htmlstr .= '
- '.$uploadedDocumentSigned.' -
'; - } - $htmlstr .= ""; + + "; } else { $htmlstr .= "     "; } + $htmlstr .= " \n"; + if ($uploadedDocumentSigned != null) + { + $htmlstr .= ' + + + +
+ '.$uploadedDocumentSigned.' +
+ + '; + } $htmlstr .= "
\n"; } diff --git a/cis/private/lehre/abgabe_student_details.php b/cis/private/lehre/abgabe_student_details.php index 949749a3b..ed29519ff 100644 --- a/cis/private/lehre/abgabe_student_details.php +++ b/cis/private/lehre/abgabe_student_details.php @@ -282,41 +282,25 @@ if($command=="update" && $error!=true) $extensions = explode(".", $_FILES['datei']['name']); if(strtoupper(end($extensions))=='PDF') { - if($paabgabetyp_kurzbz!='end') + if ($paabgabetyp_kurzbz != 'end') { //"normaler" Upload move_uploaded_file($_FILES['datei']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'); - if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf')) - { - // Check if the document is signed - $signList = SignatureLib::list(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'); - if (is_array($signList) && count($signList) > 0) - { - // The document is signed - } - elseif ($signList === null) - { - $uploadedDocumentSigned = 'WARNING: signature server error'; - } - else - { - $uploadedDocumentSigned = $p->t('abgabetool/uploadedDocumentNotSigned'); - } - } - else + if (!file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf')) { echo $p->t('global/dateiNichtErfolgreichHochgeladen'); } } - else + else // endupload type { //Upload der Endabgabe - Eingabe der Zusatzdaten $command='add'; - if(!$error) + if (!$error) { move_uploaded_file($_FILES['datei']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'); } - if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf')) + + if (file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf')) { // Check if the document is signed $signList = SignatureLib::list(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'); From c354c69e212be33093bf27000ca9efa54a891e44 Mon Sep 17 00:00:00 2001 From: Paolo Date: Tue, 24 May 2022 11:23:48 +0200 Subject: [PATCH 006/126] Fixed Zwischenabgabe file upload --- cis/private/lehre/abgabe_student_details.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/cis/private/lehre/abgabe_student_details.php b/cis/private/lehre/abgabe_student_details.php index ed29519ff..f91f410ab 100644 --- a/cis/private/lehre/abgabe_student_details.php +++ b/cis/private/lehre/abgabe_student_details.php @@ -286,7 +286,19 @@ if($command=="update" && $error!=true) { //"normaler" Upload move_uploaded_file($_FILES['datei']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'); - if (!file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf')) + if (file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf')) + { + exec('chmod 640 "'.PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'.'"'); + + $qry="UPDATE campus.tbl_paabgabe SET + abgabedatum = now(), + updatevon = ".$db->db_add_param($user).", + updateamum = now() + WHERE paabgabe_id=".$db->db_add_param($paabgabe_id, FHC_INTEGER); + $result=$db->db_query($qry); + echo $p->t('global/dateiErfolgreichHochgeladen'); + } + else { echo $p->t('global/dateiNichtErfolgreichHochgeladen'); } From 7f2025c41405f261fa103ea4a242730c056f1c0f Mon Sep 17 00:00:00 2001 From: Paolo Date: Tue, 24 May 2022 11:27:24 +0200 Subject: [PATCH 007/126] Added signature config entries to config/cis.config-default.inc.php --- config/cis.config-default.inc.php | 17 +++++++++++++++++ config/vilesci.config-default.inc.php | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/config/cis.config-default.inc.php b/config/cis.config-default.inc.php index 9d31548f6..d6f920259 100644 --- a/config/cis.config-default.inc.php +++ b/config/cis.config-default.inc.php @@ -204,6 +204,23 @@ define('TABLE_ID','_id'); define('TABLE_BEGIN','tbl_'); define('VIEW_BEGIN','vw_'); +/** + * Signatur + * DEFAULT: https://signatur.example.com/api/sign + */ +// Generic URL +define('SIGNATUR_URL', 'https://signatur.dev.technikum-wien.at/api'); +// Sign API +define('SIGNATUR_SIGN_API', 'sign'); +// List API +define('SIGNATUR_LIST_API', 'list'); +// User für Zugriff auf Signaturserver +define('SIGNATUR_USER', 'fhcomplete'); +// Passwort für Zugriff auf Signaturserver +define('SIGNATUR_PASSWORD', 'supersecretpassword'); +// Signaturprofil das verwendet werden soll +define('SIGNATUR_DEFAULT_PROFILE', 'FHC_AMT_GROSS_DE'); + //Gibt an, ob das Studienbuchblatt im CIS gedruckt werden kann define('CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN',true); diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php index a3e4cbece..c4232b020 100644 --- a/config/vilesci.config-default.inc.php +++ b/config/vilesci.config-default.inc.php @@ -195,7 +195,7 @@ define('SIGNATUR_LIST_API', 'list'); // User für Zugriff auf Signaturserver define('SIGNATUR_USER', 'fhcomplete'); // Passwort für Zugriff auf Signaturserver -define('SIGNATUR_PASSWORD', 'Fhcomplet3Signature!'); +define('SIGNATUR_PASSWORD', 'supersecretpassword'); // Signaturprofil das verwendet werden soll define('SIGNATUR_DEFAULT_PROFILE', 'FHC_AMT_GROSS_DE'); From 8880e07bf20d1332455a4a598e5cd44a4d42be8d Mon Sep 17 00:00:00 2001 From: Paolo Date: Tue, 24 May 2022 12:22:30 +0200 Subject: [PATCH 008/126] include/dokument_export.class.php now checks the new signature server response structure --- include/dokument_export.class.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/include/dokument_export.class.php b/include/dokument_export.class.php index 3a6e57657..7d797cb21 100644 --- a/include/dokument_export.class.php +++ b/include/dokument_export.class.php @@ -559,18 +559,19 @@ class dokument_export curl_close($ch); $resultdata = json_decode($result); - if (isset($resultdata->success) && $resultdata->success == 'true') + // If it is success + if (isset($resultdata->error) && $resultdata->error == 0) { $this->signed_filename = $this->temp_folder .'/signed.pdf'; - file_put_contents($this->signed_filename, base64_decode($resultdata->document)); + file_put_contents($this->signed_filename, base64_decode($resultdata->retval)); return true; } - else + else // otherwise if it is an error { - if(isset($resultdata->errormsg)) - $this->errormsg = $resultdata->errormsg; + if(isset($resultdata->retval)) + $this->errormsg = $resultdata->retval; else - $this->errormsg = 'Unknown Error:'.print_r($resultdata,true); + $this->errormsg = 'Unknown Error:'.print_r($resultdata, true); return false; } } From 450b0b64339db9316e196676c474eccf981a1ea8 Mon Sep 17 00:00:00 2001 From: Manfred Date: Wed, 14 Sep 2022 15:55:07 +0200 Subject: [PATCH 009/126] 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 c7f477555c4e1aada684fde19b6068fbadd1daf7 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Thu, 27 Oct 2022 15:17:29 +0200 Subject: [PATCH 016/126] Adaptierungen DB und Dropdowns Fas Lehrveranstaltungen --- .../lehrveranstaltungdetailoverlay.xul.php | 50 +++++++++++++------ include/raumtyp.class.php | 8 ++- rdf/raumtyp.rdf.php | 3 +- system/dbupdate_3.3.php | 16 +++++- 4 files changed, 58 insertions(+), 19 deletions(-) diff --git a/content/lvplanung/lehrveranstaltungdetailoverlay.xul.php b/content/lvplanung/lehrveranstaltungdetailoverlay.xul.php index e18407e72..ed13e1e63 100644 --- a/content/lvplanung/lehrveranstaltungdetailoverlay.xul.php +++ b/content/lvplanung/lehrveranstaltungdetailoverlay.xul.php @@ -199,26 +199,46 @@ $p = new phrasen($sprache); - '; + '; if ($stsem_zahlung != FALSE && $stsem == $stsem_zahlung) { $path = "../pdfExport.php?xsl=Inskription&xml=student.rdf.php&ss=".$stsem."&uid=".$uid."&xsl_stg_kz=".$xsl_stg_kz; - echo ''; - echo ''; + echo ''; + echo ''; + + $patheng = "../pdfExport.php?xsl=InskriptionEng&xml=student.rdf.php&ss=".$stsem."&uid=".$uid."&xsl_stg_kz=".$xsl_stg_kz; + echo ''; + echo ''; } else { - echo ''; + echo ''; } - echo '
art ?> beschreibung ?> - + entfernen '.$p->t('global/name').'
'.$p->t('tools/inskriptionsbestaetigung').' '.$stsem.'
'.$p->t('tools/inskriptionsbestaetigung').' '.$stsem.' ' . $p->t('global/deutsch'). '
'.$p->t('tools/inskriptionsbestaetigung').' '.$stsem.' ' . $p->t('global/englisch'). '
'.$p->t('tools/studienbeitragFuerSSNochNichtBezahlt',array($stsem)).'
'.$p->t('tools/studienbeitragFuerSSNochNichtBezahlt',array($stsem)).'
'; + echo ''; if (defined('CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN') && CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN) { diff --git a/content/fas.xul.php b/content/fas.xul.php index 449f917b7..80efdb2f9 100644 --- a/content/fas.xul.php +++ b/content/fas.xul.php @@ -125,7 +125,8 @@ foreach($addon_obj->result as $addon) - + + @@ -513,6 +514,12 @@ foreach($addon_obj->result as $addon) label = "&menu-dokumente-inskriptionsbestaetigung.label;" command = "menu-dokumente-inskriptionsbestaetigung:command" accesskey = "&menu-dokumente-inskriptionsbestaetigung.accesskey;"/> + 0) - window.open('content/pdfExport.php?xml=student.rdf.php&xsl=Inskription&stg_kz='+stg_kz+'&uid='+paramList+'&ss='+stsem+'&output='+output,'Inskriptionsbestaetigung', 'height=200,width=350,left=0,top=0,hotkeys=0,resizable=yes,status=no,scrollbars=yes,toolbar=no,location=no,menubar=no,dependent=yes'); + window.open('content/pdfExport.php?xml=student.rdf.php&xsl='+ xsl +'&stg_kz='+stg_kz+'&uid='+paramList+'&ss='+stsem+'&output='+output,'Inskriptionsbestaetigung', 'height=200,width=350,left=0,top=0,hotkeys=0,resizable=yes,status=no,scrollbars=yes,toolbar=no,location=no,menubar=no,dependent=yes'); else alert('Bitte einen Studenten auswaehlen'); } diff --git a/locale/de-AT/fas.dtd b/locale/de-AT/fas.dtd index df6180904..c3d420ede 100644 --- a/locale/de-AT/fas.dtd +++ b/locale/de-AT/fas.dtd @@ -187,6 +187,10 @@ + + + + diff --git a/rdf/student.rdf.php b/rdf/student.rdf.php index af0bbe82d..6eb9a967e 100644 --- a/rdf/student.rdf.php +++ b/rdf/student.rdf.php @@ -1218,6 +1218,7 @@ else bezeichnung.']]> bezeichnung.']]> + english.']]> typ.']]> orgform_kurzbz.']]> diff --git a/system/vorlage_zip/Inskription.odt b/system/vorlage_zip/Inskription.odt index d1933cdcb62b745b19287a5a29eacfe5a786f433..6471c5cc2bd6b81776a4e9172079222313ede67e 100644 GIT binary patch literal 12858 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

QPA)-><$EXMi5Q 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 diff --git a/system/vorlage_zip/InskriptionEng.odt b/system/vorlage_zip/InskriptionEng.odt new file mode 100644 index 0000000000000000000000000000000000000000..e26be218e03bf872113f94ac7236f90f0dd11dcb GIT binary patch literal 13220 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 literal 0 HcmV?d00001 diff --git a/system/xsl/inskriptioneng_0.xml b/system/xsl/inskriptioneng_0.xml new file mode 100644 index 000000000..c2080a5ec --- /dev/null +++ b/system/xsl/inskriptioneng_0.xml @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + + + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + + + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + + + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + + + + + + Certificate of Enrolment University of Applied Sciences Demo + + + + + + To be submitted to (place where the certificate is to be submitted and its reference number, e.g. social security number). + + + Student number + + + + + + + + + + + + + + + + + + born on , is enrolled as a regular student in + (beginning ) + in the + + + Bachelor Degree program + + + Master Degree program + + + Degree Program + + + + + + + + + + + + (), + + st + nd + rd + th + + semester (beginning , ). + + + + + + + + Date: + + + Rector: + + + + + \ No newline at end of file From a412db7356eb9e6ed64d1637b1617be5d38a1ff5 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Fri, 11 Nov 2022 14:27:06 +0100 Subject: [PATCH 018/126] Attribut raumtyp_aktiv als boolean parsen --- include/raumtyp.class.php | 6 ++---- rdf/raumtyp.rdf.php | 10 +++++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/include/raumtyp.class.php b/include/raumtyp.class.php index 6aa54254e..ec274df7a 100644 --- a/include/raumtyp.class.php +++ b/include/raumtyp.class.php @@ -68,8 +68,7 @@ class raumtyp extends basis_db $raumtyp_obj->beschreibung = $row->beschreibung; $raumtyp_obj->raumtyp_kurzbz = $row->raumtyp_kurzbz; - $raumtyp_obj->aktiv = $row->aktiv; - + $raumtyp_obj->aktiv = $this->db_parse_bool($row->aktiv); $this->result[] = $raumtyp_obj; } @@ -101,8 +100,7 @@ class raumtyp extends basis_db { $this->beschreibung = $row->beschreibung; $this->raumtyp_kurzbz = $row->kurzbz; - $this->aktiv = $row->aktiv; - + $this->aktiv = $this->db_parse_bool($row->aktiv); } else { diff --git a/rdf/raumtyp.rdf.php b/rdf/raumtyp.rdf.php index 56da76b5b..1f7289747 100644 --- a/rdf/raumtyp.rdf.php +++ b/rdf/raumtyp.rdf.php @@ -56,11 +56,11 @@ foreach ($raumtypDAO->result as $rt) { ?> - - raumtyp_kurzbz ?> - beschreibung ?> - aktiv=='t'?'true':'false') ?> - + + raumtyp_kurzbz ?> + beschreibung ?> + aktiv ? "true" : "false") ?> + Date: Fri, 18 Nov 2022 10:01:39 +0100 Subject: [PATCH 019/126] =?UTF-8?q?Studierende=20k=C3=B6nnen=20sich=20fr?= =?UTF-8?q?=C3=BChestens=202=20Monate=20vor=20Pr=C3=BCfung=20anmelden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cis/private/lehre/pruefung/pruefung.js.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cis/private/lehre/pruefung/pruefung.js.php b/cis/private/lehre/pruefung/pruefung.js.php index f2435828d..6dda6e0fe 100644 --- a/cis/private/lehre/pruefung/pruefung.js.php +++ b/cis/private/lehre/pruefung/pruefung.js.php @@ -353,10 +353,9 @@ function writePruefungsTable(e, data, anmeldung) var time = termin[1].substring(0,5); termin = termin[0].split("-"); - // Wie viele Monate vor Prüfungen dürfen sich Studierende anmelden? - // Sperre "deaktiviert" indem man sich 24 Monate vorher anmelden darf + // Studierende dürfen sich 2 Monate vor Prüfungen anmelden? var minimumFrist = new Date(termin[0], termin[1]-1,termin[2]); - minimumFrist.setMonth(minimumFrist.getMonth() - 24); + minimumFrist.setMonth(minimumFrist.getMonth() - 2); termin = new Date(termin[0], termin[1]-1,termin[2]); var frist = termin; From 1ec742b8fe1f8fa366e69f371b40faf0b38df44d Mon Sep 17 00:00:00 2001 From: Nikolaus Krondraf Date: Fri, 18 Nov 2022 10:05:38 +0100 Subject: [PATCH 020/126] typo --- cis/private/lehre/pruefung/pruefung.js.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cis/private/lehre/pruefung/pruefung.js.php b/cis/private/lehre/pruefung/pruefung.js.php index 6dda6e0fe..f1bafe192 100644 --- a/cis/private/lehre/pruefung/pruefung.js.php +++ b/cis/private/lehre/pruefung/pruefung.js.php @@ -353,7 +353,7 @@ function writePruefungsTable(e, data, anmeldung) var time = termin[1].substring(0,5); termin = termin[0].split("-"); - // Studierende dürfen sich 2 Monate vor Prüfungen anmelden? + // Studierende dürfen sich 2 Monate vor Prüfungen anmelden var minimumFrist = new Date(termin[0], termin[1]-1,termin[2]); minimumFrist.setMonth(minimumFrist.getMonth() - 2); From 7cdb7688c4cb858c0fca8044c0ea4cc53276db89 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 28 Nov 2022 17:27:39 +0100 Subject: [PATCH 021/126] =?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 022/126] 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 023/126] 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 024/126] 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 025/126] 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 026/126] 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 027/126] 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 028/126] 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 029/126] 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 030/126] 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 031/126] 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 032/126] 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 033/126] 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 034/126] 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 035/126] 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 036/126] 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 037/126] =?UTF-8?q?Added:=20LektorInnen=20sehen=20jetzt=20?= =?UTF-8?q?nur=20Anrechnungen,=20f=C3=BCr=20die=20sie=20eine=20Empfehlung?= =?UTF-8?q?=20abgeben=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 038/126] =?UTF-8?q?Added:=20STGLs=20sehen=20jetzt=20nur=20?= =?UTF-8?q?Anrechnungen=20von=20STGs,=20f=C3=BCr=20die=20sie=20eine=20Bere?= =?UTF-8?q?chtigung=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 039/126] 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 040/126] 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 041/126] 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 042/126] 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 043/126] 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 44bfe52529c22ea33953d3ecb7e597a2abc8cb91 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Thu, 26 Jan 2023 11:35:22 +0100 Subject: [PATCH 044/126] - fas filter hinzugefuegt --- include/prestudent.class.php | 36 +++++++++++++++++++++++++ rdf/lehrverbandsgruppe.rdf.php | 48 ++++++++++++++++++++++++++++++++-- rdf/student.rdf.php | 2 +- 3 files changed, 83 insertions(+), 3 deletions(-) diff --git a/include/prestudent.class.php b/include/prestudent.class.php index 3bd7cd733..13f3e5e00 100644 --- a/include/prestudent.class.php +++ b/include/prestudent.class.php @@ -834,6 +834,42 @@ class prestudent extends person case "statusbestaetigt": $qry.=" AND a.rolle='Interessent' AND bestaetigtam is not null"; break; + case "statusbestaetigtrtnichtangemeldet": + $qry.=" AND a.rolle='Interessent' AND bestaetigtam is not null + AND NOT EXISTS ( + SELECT + 1 + FROM + public.tbl_rt_person + JOIN public.tbl_reihungstest ON (rt_id = reihungstest_id) + WHERE + person_id=a.person_id + AND studienplan_id IN ( + SELECT studienplan_id FROM lehre.tbl_studienplan + JOIN lehre.tbl_studienordnung USING(studienordnung_id) + WHERE tbl_studienordnung.studiengang_kz=a.studiengang_kz + ) + AND tbl_reihungstest.studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)." + )"; + break; + case "statusbestaetigtrtangemeldet": + $qry.=" AND a.rolle='Interessent' AND bestaetigtam is not null + AND EXISTS ( + SELECT + 1 + FROM + public.tbl_rt_person + JOIN public.tbl_reihungstest ON (rt_id = reihungstest_id) + WHERE + person_id=a.person_id + AND studienplan_id IN ( + SELECT studienplan_id FROM lehre.tbl_studienplan + JOIN lehre.tbl_studienordnung USING(studienordnung_id) + WHERE tbl_studienordnung.studiengang_kz=a.studiengang_kz + ) + AND tbl_reihungstest.studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)." + )"; + break; case "zgv": $stg_obj = new studiengang(); $stg_obj->load($studiengang_kz); diff --git a/rdf/lehrverbandsgruppe.rdf.php b/rdf/lehrverbandsgruppe.rdf.php index 79ac0c948..20956d279 100644 --- a/rdf/lehrverbandsgruppe.rdf.php +++ b/rdf/lehrverbandsgruppe.rdf.php @@ -246,6 +246,24 @@ function draw_orgformsubmenu($stg_kz, $orgform) + + Nicht zum Reihungstest angemeldet + + + studiensemester_kurzbz.']]> + statusbestaetigtrtnichtangemeldet + + + + + Reihungstest angemeldet + + + studiensemester_kurzbz.']]> + statusbestaetigtrtangemeldet + + + Nicht zum Reihungstest angemeldet @@ -316,7 +334,12 @@ function draw_orgformsubmenu($stg_kz, $orgform) $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/bewerbungnichtabgeschickt\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/bewerbungabgeschickt\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/zgv\" />\n"; - $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt\" />\n"; + $orgform_sequence[$stg_kz].= "\t\t\t"; + $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt\">\n"; + $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt/reihungstestnichtangemeldet\" />\n"; + $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt/reihungstestangemeldet\" />\n"; + $orgform_sequence[$stg_kz].= "\t\t\t\t"; + $orgform_sequence[$stg_kz].= "\n\t\t\t\n"; $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/reihungstestnichtangemeldet\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/reihungstestangemeldet\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\t\t"; @@ -561,6 +584,22 @@ while ($row=$dbo->db_fetch_object()) + + + ]]> + studiengang_kz; ?>]]> + studiensemester_kurzbz; ?>]]> + + + + + + ]]> + studiengang_kz; ?>]]> + studiensemester_kurzbz; ?>]]> + + + ]]> @@ -783,7 +822,12 @@ draw_orgformpart($stg_kz); echo "\t\t\t\tstudiensemester_kurzbz/interessenten/bewerbungnichtabgeschickt\" />\n"; echo "\t\t\t\tstudiensemester_kurzbz/interessenten/bewerbungabgeschickt\" />\n"; echo "\t\t\t\tstudiensemester_kurzbz/interessenten/zgv\" />\n"; - echo "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt\" />\n"; + echo "\t\t\t"; + echo "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt\">\n"; + echo "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt/reihungstestnichtangemeldet\" />\n"; + echo "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt/reihungstestangemeldet\" />\n"; + echo "\t\t\t\t"; + echo "\n\t\t\t\n"; echo "\t\t\t\tstudiensemester_kurzbz/interessenten/reihungstestnichtangemeldet\" />\n"; echo "\t\t\t\tstudiensemester_kurzbz/interessenten/reihungstestangemeldet\" />\n"; echo "\t\t\t\t"; diff --git a/rdf/student.rdf.php b/rdf/student.rdf.php index af0bbe82d..5e0c9d1c5 100644 --- a/rdf/student.rdf.php +++ b/rdf/student.rdf.php @@ -737,7 +737,7 @@ if($xmlformat=='rdf') } elseif(in_array($typ, array('prestudent', 'interessenten', 'bewerber', 'aufgenommen', 'warteliste', 'absage', 'zgv', 'reihungstestangemeldet', 'reihungstestnichtangemeldet', 'absolvent', - 'diplomand', 'bewerbungnichtabgeschickt', 'bewerbungabgeschickt', 'statusbestaetigt'))) + 'diplomand', 'bewerbungnichtabgeschickt', 'bewerbungabgeschickt', 'statusbestaetigt', 'statusbestaetigtrtnichtangemeldet', 'statusbestaetigtrtangemeldet'))) { $prestd = new prestudent(); From feb14a9f39ae9192a011373ecf4e7c822278ec58 Mon Sep 17 00:00:00 2001 From: Manfred Date: Mon, 13 Feb 2023 11:27:54 +0100 Subject: [PATCH 045/126] 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'])) Gültig ab Gültig bis Anmerkung - Info - "; @@ -641,7 +655,7 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) //Anmerkung $htmlstr .= " "; - $htmlstr .= " "; + $htmlstr .= " "; $htmlstr .= "
"; $htmlstr .= " "; @@ -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'])) + - + - + - + - Lehrveranstaltungen - Übersicht - - - - -   - - - - - - - - - - - -
-  Lehrveranstaltungen - Übersicht ('.$stsem->studiensemester_kurzbz.') -
 
- '; - - $qry = "SELECT - tbl_lehrveranstaltung.lehrveranstaltung_id, tbl_lehrveranstaltung.studiengang_kz, - tbl_lehrveranstaltung.bezeichnung, tbl_lehrveranstaltung.semester, - tbl_lehrveranstaltung.bezeichnung_english, tbl_lehrveranstaltung.incoming, - tbl_lehrveranstaltung.sprache, - ( - SELECT - count(*) - FROM - campus.vw_student_lehrveranstaltung - JOIN public.tbl_student ON(uid=student_uid) - JOIN public.tbl_prestudentstatus USING(prestudent_id) - WHERE - lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND - lehreinheit_id in (SELECT lehreinheit_id FROM lehre.tbl_lehreinheit - WHERE lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id - AND tbl_lehreinheit.studiensemester_kurzbz='$stsem->studiensemester_kurzbz') - AND tbl_prestudentstatus.status_kurzbz='Incoming' - AND tbl_prestudentstatus.status_kurzbz='$stsem->studiensemester_kurzbz' - GROUP BY uid - ) as anzahlincoming - FROM - lehre.tbl_lehrveranstaltung JOIN public.tbl_studiengang USING(studiengang_kz) - WHERE - tbl_lehrveranstaltung.incoming>0 AND - tbl_lehrveranstaltung.aktiv AND - tbl_lehrveranstaltung.lehre - AND tbl_lehrveranstaltung.studiengang_kz>0 AND tbl_lehrveranstaltung.studiengang_kz<10000 - AND tbl_studiengang.aktiv - "; - - echo ' - - - - - - - - - - - - - - '; - if($result = $db->db_query($qry)) - { - $i=0; - while($row = $db->db_fetch_object($result)) - { - $freieplaetze = $row->incoming - $row->anzahlincoming; - if($freieplaetze<0) - $freieplaetze=0; - - $i++; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - } - echo '
IDStudiengangSemesterSpracheLehrveranstaltungLehrveranstaltung EnglischLV-InfoPlätze gesamtFreie Plätze
',$row->lehrveranstaltung_id,'',$stg->kuerzel_arr[$row->studiengang_kz],'',$row->semester,'',$row->sprache,'',$row->bezeichnung,'',$row->bezeichnung_english,' - Deutsch  - Englisch - ',$row->incoming,'',$freieplaetze,'
'; -?> -
- - - - - - diff --git a/include/tw/cis_menu_lv.inc.php b/include/tw/cis_menu_lv.inc.php index 4b3005c07..16abdc48a 100644 --- a/include/tw/cis_menu_lv.inc.php +++ b/include/tw/cis_menu_lv.inc.php @@ -68,29 +68,8 @@ function checkZeilenUmbruch() if(!defined('CIS_LEHRVERANSTALTUNG_LVINFO_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_LVINFO_ANZEIGEN) { $text=''; - - $qry = "SELECT * FROM campus.tbl_lvinfo WHERE lehrveranstaltung_id=".$db->db_add_param($lvid, FHC_INTEGER)." AND genehmigt=true AND sprache='".ATTR_SPRACHE_DE."' AND aktiv=true"; $need_br=false; - if($result=$db->db_query($qry)) - { - if($db->db_num_rows($result)>0) - { - $text.= "".$p->t('global/deutsch')." "; - $need_br=true; - } - } - $qry = "SELECT * FROM campus.tbl_lvinfo WHERE lehrveranstaltung_id=".$db->db_add_param($lvid, FHC_INTEGER)." AND genehmigt=true AND sprache='".ATTR_SPRACHE_EN."' AND aktiv=true"; - if($result=$db->db_query($qry)) - { - if($db->db_num_rows($result)>0) - { - $row1=$db->db_fetch_object($result); - $text.= "".$p->t('global/englisch').""; - $need_br=true; - } - } - // Bearbeiten Button anzeigen wenn Lektor der LV und bearbeiten fuer Lektoren aktiviert ist // Oder Berechtigung zum Bearbeiten eingetragen ist if((!defined('CIS_LEHRVERANSTALTUNG_LVINFO_LEKTOR_EDIT') && $lektor_der_lv) From 7bb340a4158bf54a1554da9d8416afa2101ac957 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 1 Mar 2023 10:44:47 +0100 Subject: [PATCH 050/126] - checksystem auf 3.4 umgebaut - vilesci raumtypen inaktive raumtypen werden markiert - tempus karteireiter ort zeigt nur aktive raumtypen an - raumsuche auf aktive raumtypen eingeschraenkt --- cis/private/lvplan/raumsuche.php | 12 ++++++------ include/raumtyp.class.php | 8 ++++++-- rdf/ort.rdf.php | 6 ++++-- system/dbupdate_3.3.php | 14 -------------- system/dbupdate_3.4.php | 1 + ...24913_tabelle_raumtyp_neues_attribut_aktiv.php | 15 +++++++++++++++ vilesci/lehre/lehrveranstaltung_details.php | 7 ++++++- vilesci/stammdaten/raum_details.php | 6 +++++- 8 files changed, 43 insertions(+), 26 deletions(-) create mode 100644 system/dbupdate_3.4/24913_tabelle_raumtyp_neues_attribut_aktiv.php diff --git a/cis/private/lvplan/raumsuche.php b/cis/private/lvplan/raumsuche.php index 0cb9677d4..7be028be8 100644 --- a/cis/private/lvplan/raumsuche.php +++ b/cis/private/lvplan/raumsuche.php @@ -47,11 +47,11 @@ echo ' - - - - - + + + + + "; + +} + 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'])) ?> - +