From 7cdb7688c4cb858c0fca8044c0ea4cc53276db89 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 28 Nov 2022 17:27:39 +0100 Subject: [PATCH 01/65] =?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 02/65] 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 03/65] 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 04/65] 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 05/65] 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 06/65] 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 07/65] 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 08/65] 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 09/65] 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 10/65] 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 11/65] 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 12/65] 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 13/65] 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 14/65] 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 15/65] 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 16/65] 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 17/65] =?UTF-8?q?Added:=20LektorInnen=20sehen=20jetzt=20nu?= =?UTF-8?q?r=20Anrechnungen,=20f=C3=BCr=20die=20sie=20eine=20Empfehlung=20?= =?UTF-8?q?abgeben=20d=C3=BCrfen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Es gibt eine neue Spalte 'empfehlungsberechtigt' in der Anrechnungentabelle. Defaultmäßig werden nur 'empfehlungsberechtigt' Anrechnungen angezeigt, wo LektorIn: - LV Leitung der LV ist ODER - die LV keine LV-Leitung hat Über den Filter können aber auch alle angezeigt werden. --- .../reviewAnrechnungUebersichtData.php | 41 ++++++++++++++++--- .../anrechnung/reviewAnrechnungUebersicht.js | 12 +++++- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php index d48018171..aa28d7fc0 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php @@ -46,16 +46,40 @@ $query = ' LEFT JOIN campus.tbl_dms_version AS dmsversion USING (dms_id) JOIN lehre.tbl_anrechnung_anrechnungstatus USING (anrechnung_id) JOIN lehre.tbl_anrechnung_begruendung AS begruendung USING (begruendung_id) - ) + WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + ), + tbl_lvleitungen AS + ( + SELECT DISTINCT ON (benutzer.uid, lehrveranstaltung_id) lehrveranstaltung_id, uid, + CASE WHEN lehrfunktion_kurzbz = \'LV-Leitung\' THEN TRUE + ELSE FALSE + END AS lvleiter + FROM lehre.tbl_lehreinheit + JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) + JOIN public.tbl_benutzer benutzer ON lema.mitarbeiter_uid = benutzer.uid + JOIN public.tbl_person USING (person_id) + JOIN lehre.tbl_anrechnung USING (lehrveranstaltung_id) + WHERE tbl_lehreinheit.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND benutzer.aktiv = TRUE + AND tbl_person.aktiv = TRUE + ORDER BY lehrveranstaltung_id, benutzer.uid, lehrfunktion_kurzbz DESC + ) SELECT DISTINCT ON (anrechnungen.*, lema.mitarbeiter_uid) anrechnungen.*, - array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung" + array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung", + CASE + -- erst prüfen, ob es überhaupt eine LV Leitung gibt (wenn nicht, dann immer empfehlungsberechtigt) + WHEN EXISTS (SELECT 1 FROM tbl_lvleitungen WHERE lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id AND lvleiter = TRUE) + -- wenn ja, return true, wenn user LV Leitung ist oder false, wenn nicht + THEN (SELECT EXISTS (SELECT 1 FROM tbl_lvleitungen WHERE lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id AND lvleiter = TRUE AND uid = \'' . $LEKTOR_UID . '\')) + -- wenn es keine LV Leitung, return immer true + ELSE TRUE + END AS empfehlungsberechtigt FROM anrechnungen JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz) JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id) JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) - WHERE anrechnungen.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' - AND le.studiensemester_kurzbz = anrechnungen.studiensemester_kurzbz + WHERE le.studiensemester_kurzbz = anrechnungen.studiensemester_kurzbz AND lema.mitarbeiter_uid = \'' . $LEKTOR_UID . '\' AND le.lehre = TRUE AND EXISTS ( @@ -89,7 +113,8 @@ $filterWidgetArray = array( ucfirst($this->p->t('anrechnung', 'antragdatum')), ucfirst($this->p->t('anrechnung', 'empfehlung')), 'status_kurzbz', - 'Status' + 'Status', + 'empfehlungsberechtigt' ), 'datasetRepOptions' => '{ height: func_height(this), @@ -98,6 +123,7 @@ $filterWidgetArray = array( persistentSort:true, autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated headerFilterPlaceholder: " ", + initialHeaderFilter: [{field:"empfehlungsberechtigt", value: true}], index: "anrechnung_id", // assign specific column as unique id (important for row indexing) selectable: true, // allow row selection selectableRangeMode: "click", // allow range selection using shift end click on end of range @@ -139,7 +165,10 @@ $filterWidgetArray = array( antragsdatum: {align:"center", headerFilter:"input", mutator: mut_formatStringDate}, empfehlung_anrechnung: {headerFilter:"input", align:"center", formatter: format_empfehlung_anrechnung, headerFilterFunc: hf_filterTrueFalse}, status_kurzbz: {visible: false, headerFilter:"input"}, - status_bezeichnung: {headerFilter:"input"} + status_bezeichnung: {headerFilter:"input"}, + empfehlungsberechtigt: {formatter:"tickCross", align:"center", + headerFilter:"tickCross", headerFilterParams:{"tristate": true, "initial": true}, headerFilterFunc: hf_empfehlungsberechtigt + } }', // col properties ); diff --git a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js index 47b2a2dc5..b948ecab4 100644 --- a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js @@ -51,6 +51,12 @@ function hf_filterTrueFalse(headerValue, rowValue){ } } +// Filters empfehlungsberechtigt boolean values +function hf_empfehlungsberechtigt(headerValue, rowValue){ + + return rowValue == headerValue.toString(); +} + // Adds column details function func_tableBuilt(table) { table.addColumn( @@ -74,9 +80,10 @@ function func_tableBuilt(table) { // Formats the rows function func_rowFormatter(row){ let status_kurzbz = row.getData().status_kurzbz; + let empfehlungsberechtigt = row.getData().empfehlungsberechtigt; row.getCells().forEach(function(cell){ - if (status_kurzbz != ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR) + if (status_kurzbz != ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR || empfehlungsberechtigt == "false") { row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default } @@ -86,9 +93,10 @@ function func_rowFormatter(row){ // Formats row selectable/unselectable function func_selectableCheck(row){ let status_kurzbz = row.getData().status_kurzbz; + let empfehlungsberechtigt = row.getData().empfehlungsberechtigt; return ( - status_kurzbz == ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR + status_kurzbz == ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR || empfehlungsberechtigt == "false" ); } From d1319a23ad7f608f7a4b6cb184bb2c6d145e6c10 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 11 Jan 2023 13:47:23 +0100 Subject: [PATCH 18/65] =?UTF-8?q?Added:=20STGLs=20sehen=20jetzt=20nur=20An?= =?UTF-8?q?rechnungen=20von=20STGs,=20f=C3=BCr=20die=20sie=20eine=20Berech?= =?UTF-8?q?tigung=20haben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Es gibt eine neue Spalte 'schreibberechtigt' in der Anrechnungentabelle. Defaultmäßig werden nur 'schreibberechtigte' Anrechnungen angezeigt, wo STGL die Berechtigung auf die OE hat. Über den Filter können aber auch alle angezeigt werden. --- .../ApproveAnrechnungUebersicht.php | 16 +++++++++- .../approveAnrechnungUebersichtData.php | 14 ++++++++- .../anrechnung/approveAnrechnungUebersicht.js | 29 ++++++++++++------- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php index 77ee5bb40..7e1853b47 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php @@ -81,6 +81,19 @@ class approveAnrechnungUebersicht extends Auth_Controller show_error(getError($studiengang_kz_arr)); } + // Get oes the user is entitled for + $oe_kurzbz_arr_schreibberechtigt = array(); + if ($oe_arr = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN)) + { + foreach($oe_arr as $oe) + { + $berechtigt = $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $oe); + + if ($berechtigt) $oe_kurzbz_arr_schreibberechtigt[]= $oe; + } + } + + // Check if permission is readonly $hasReadOnlyAccess = $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's') && !$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid'); @@ -90,7 +103,8 @@ class approveAnrechnungUebersicht extends Auth_Controller $viewData = array( 'studiensemester_selected' => $studiensemester_kurzbz, - 'studiengaenge_entitled' => $studiengang_kz_arr, + 'studiengaenge_entitled' => $studiengang_kz_arr, // alle STG mit Lese- und Schreibberechtigung + 'oes_schreibberechtigt' => $oe_kurzbz_arr_schreibberechtigt, // alle STG nur mit Schreibberechtigung 'hasReadOnlyAccess' => $hasReadOnlyAccess, 'hasCreateAnrechnungAccess' => $hasCreateAnrechnungAccess ); diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php index 1eade50d2..87ba57b6f 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php @@ -3,7 +3,8 @@ const ANRECHNUNGSTATUS_PROGRESSED_BY_STGL = 'inProgressDP'; const ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR = 'inProgressLektor'; $STUDIENSEMESTER = $studiensemester_selected; -$STUDIENGAENGE_ENTITLED = implode(', ', $studiengaenge_entitled); +$STUDIENGAENGE_ENTITLED = implode(', ', $studiengaenge_entitled); // alle STG mit Lese- und Schreibberechtigung +$ORGANISATIONSEINHEITEN_SCHREIBBERECHTIGT = "'". implode(', ', $oes_schreibberechtigt). "'"; // alle STG nur mit Schreibberechtigung $LANGUAGE_INDEX = getUserLanguage() == 'German' ? '0' : '1'; $query = ' @@ -14,6 +15,10 @@ $query = ' anrechnung.lehrveranstaltung_id, anrechnung.begruendung_id, anrechnung.dms_id, + CASE + WHEN stg.typ || stg.kurzbz IN (' . $ORGANISATIONSEINHEITEN_SCHREIBBERECHTIGT . ') THEN TRUE + ELSE FALSE + END "schreibberechtigt", anrechnung.studiensemester_kurzbz, stg.studiengang_kz, stg.bezeichnung AS stg_bezeichnung, @@ -71,6 +76,7 @@ $query = ' anrechnungen.lehrveranstaltung_id, anrechnungen.begruendung_id, anrechnungen.dms_id, + anrechnungen.schreibberechtigt, anrechnungen.studiensemester_kurzbz, anrechnungen.studiengang_kz, anrechnungen.stg_bezeichnung, @@ -141,6 +147,7 @@ $filterWidgetArray = array( 'lehrveranstaltung_id', 'begruendung_id', 'dms_id', + 'schreibberechtigt', 'studiensemester_kurzbz', 'studiengang_kz', ucfirst($this->p->t('lehre', 'studiengang')), @@ -172,6 +179,7 @@ $filterWidgetArray = array( persistentFilter:true, autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated headerFilterPlaceholder: " ", + initialHeaderFilter: [{field:"schreibberechtigt", value: true}], index: "anrechnung_id", // assign specific column as unique id (important for row indexing) selectable: true, // allow row selection selectableRangeMode: "click", // allow range selection using shift end click on end of range @@ -200,6 +208,10 @@ $filterWidgetArray = array( lehrveranstaltung_id: {visible: false, headerFilter:"input"}, begruendung_id: {visible: false, headerFilter:"input"}, dms_id: {visible: false, headerFilter:"input"}, + schreibberechtigt: { + formatter:"tickCross", align:"center", + headerFilter:"tickCross", headerFilterParams:{"tristate": true, "initial": true}, headerFilterFunc: hf_schreibberechtigt + }, studiensemester_kurzbz: {visible: false, headerFilter:"input"}, studiengang_kz: {visible: false, headerFilter:"input"}, stg_bezeichnung: {headerFilter:"input"}, diff --git a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js index 395937950..c2a115961 100644 --- a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js @@ -57,6 +57,12 @@ function hf_filterTrueFalse(headerValue, rowValue){ } } +// Filters schreibberechtigt boolean values +function hf_schreibberechtigt(headerValue, rowValue){ + + return rowValue == headerValue.toString(); +} + // Adds column details // Sets focus on filterbutton, if table starts with stored filter. function func_tableBuilt(table) { @@ -173,19 +179,22 @@ function func_selectableCheck(row){ // data = selected data, rows = selected rows function func_rowSelectionChanged(data, rows){ - // Sum up over all anzurechnenden LV-ECTS by Prestudent - selectedPrestudentWithAccumulatedLvEcts = approveAnrechnung.getSumLvEctsByPreStudent(data); + if (tabulator != null) + { + // Sum up over all anzurechnenden LV-ECTS by Prestudent + selectedPrestudentWithAccumulatedLvEcts = approveAnrechnung.getSumLvEctsByPreStudent(data); - // Loop through all active rows - var rowManager = tabulator.rowManager; - for (var i = 0; i < rowManager.activeRows.length; i++) { + // Loop through all active rows + var rowManager = tabulator.rowManager; + for (var i = 0; i < rowManager.activeRows.length; i++) { - // Reinitialize row -> triggers formatters. - rowManager.activeRows[i].reinitialize(); + // Reinitialize row -> triggers formatters. + rowManager.activeRows[i].reinitialize(); + } + + // Show number of selected rows. + approveAnrechnung.showNumberSelectedRows(rows); } - - // Show number of selected rows. - approveAnrechnung.showNumberSelectedRows(rows); } // Returns tooltip From fb4f9981f0493918413ce1e9b013239523a65bfc Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 11 Jan 2023 13:52:44 +0100 Subject: [PATCH 19/65] 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 20/65] 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 21/65] 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 22/65] 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 35c68d98a141929579b565d11ad8b57e9e7dd99c Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 6 Mar 2023 13:15:16 +0100 Subject: [PATCH 23/65] Created lehre.tbl_anrechnungszeitraum --- system/dbupdate_3.4.php | 2 + ...27388_anrechnungen_zeitfenster_pflegen.php | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 system/dbupdate_3.4/27388_anrechnungen_zeitfenster_pflegen.php diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index c33f184a1..3644be124 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -31,6 +31,7 @@ require_once('dbupdate_3.4/example2.php'); require_once('dbupdate_3.4/26173_index_webservicelog.php'); require_once('dbupdate_3.4/24682_reihungstest_zugangscode_fuer_login.php'); require_once('dbupdate_3.4/17512_fehlercode_constraints.php'); +require_once('dbupdate_3.4/27388_anrechnungen_zeitfenster_pflegen.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -145,6 +146,7 @@ $tabellen=array( "lehre.tbl_anrechnungstatus" => array("status_kurzbz", "bezeichnung_mehrsprachig"), "lehre.tbl_anrechnung_anrechnungstatus" => array("anrechnungstatus_id", "anrechnung_id", "status_kurzbz", "datum", "insertamum", "insertvon"), "lehre.tbl_anrechnung_begruendung" => array("begruendung_id","bezeichnung"), + "lehre.tbl_anrechnungszeitraum" => array("anrechnungszeitraum_id","studiensemester_kurzbz","anrechnungstart","anrechnungende", "insertamum", "insertvon"), "lehre.tbl_betreuerart" => array("betreuerart_kurzbz","beschreibung","aktiv"), "lehre.tbl_ferien" => array("bezeichnung","studiengang_kz","vondatum","bisdatum"), "lehre.tbl_lehreinheit" => array("lehreinheit_id","lehrveranstaltung_id","studiensemester_kurzbz","lehrfach_id","lehrform_kurzbz","stundenblockung","wochenrythmus","start_kw","raumtyp","raumtypalternativ","sprache","lehre","anmerkung","unr","lvnr","updateamum","updatevon","insertamum","insertvon","ext_id","lehrfach_id_old","gewicht"), diff --git a/system/dbupdate_3.4/27388_anrechnungen_zeitfenster_pflegen.php b/system/dbupdate_3.4/27388_anrechnungen_zeitfenster_pflegen.php new file mode 100644 index 000000000..8f3164696 --- /dev/null +++ b/system/dbupdate_3.4/27388_anrechnungen_zeitfenster_pflegen.php @@ -0,0 +1,43 @@ +db_query('SELECT 1 FROM lehre.tbl_anrechnungszeitraum LIMIT 1')) +{ + $qry = 'CREATE TABLE lehre.tbl_anrechnungszeitraum + ( + anrechnungszeitraum_id integer, + studiensemester_kurzbz varchar(16) NOT NULL, + anrechnungstart date, + anrechnungende date, + insertamum timestamp default NOW(), + insertvon varchar(32) + ); + + COMMENT ON TABLE lehre.tbl_anrechnungszeitraum IS \'Zeitfenster fuer Anrechnungen pro Studiensemester\'; + COMMENT ON COLUMN lehre.tbl_anrechnungszeitraum.anrechnungstart IS \'Zeitfenster Startdatum\'; + COMMENT ON COLUMN lehre.tbl_anrechnungszeitraum.anrechnungende IS \'Zeitfenster Enddatum\'; + + ALTER TABLE lehre.tbl_anrechnungszeitraum ADD CONSTRAINT pk_anrechnungszeitraum PRIMARY KEY (anrechnungszeitraum_id); + ALTER TABLE lehre.tbl_anrechnungszeitraum ADD CONSTRAINT fk_anrechnungszeitraum_studiensemester_kurzbz FOREIGN KEY (studiensemester_kurzbz) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT; + + CREATE SEQUENCE lehre.seq_anrechnungszeitraum_anrechnungszeitraum_id + START WITH 1 + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + ALTER TABLE lehre.tbl_anrechnungszeitraum ALTER COLUMN anrechnungszeitraum_id SET DEFAULT nextval(\'lehre.seq_anrechnungszeitraum_anrechnungszeitraum_id\'); + + GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.tbl_anrechnungszeitraum TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.tbl_anrechnungszeitraum TO vilesci; + GRANT SELECT, UPDATE ON lehre.seq_anrechnungszeitraum_anrechnungszeitraum_id TO vilesci; + GRANT SELECT, UPDATE ON lehre.seq_anrechnungszeitraum_anrechnungszeitraum_id TO web; + '; + + if(!$db->db_query($qry)) + echo 'lehre.tbl_anrechnungszeitraum: '.$db->db_last_error().'
'; + else + echo ' lehre.tbl_anrechnungszeitraum: Tabelle hinzugefuegt
'; +} \ No newline at end of file From 87a1b3647d93ae38ffeb60b4727d7796a45e4c98 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 6 Mar 2023 13:16:27 +0100 Subject: [PATCH 24/65] Created Controller AdminAnrechnung to admin Anrechnungszeitraume Add / Update / Delete Anrechnungszeitraume --- .../lehre/anrechnung/AdminAnrechnung.php | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 application/controllers/lehre/anrechnung/AdminAnrechnung.php diff --git a/application/controllers/lehre/anrechnung/AdminAnrechnung.php b/application/controllers/lehre/anrechnung/AdminAnrechnung.php new file mode 100644 index 000000000..2836acb63 --- /dev/null +++ b/application/controllers/lehre/anrechnung/AdminAnrechnung.php @@ -0,0 +1,189 @@ + 'admin:rw', + 'save' => 'admin:rw', + 'edit' => 'admin:rw', + 'delete' => 'admin:rw' + ) + ); + + // Load models + $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); + $this->load->model('education/Anrechnungszeitraum_model', 'AnrechnungszeitraumModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + // Load libraries + $this->load->library('WidgetLib'); + $this->load->library('PermissionLib'); + $this->load->library('AnrechnungLib'); + + + // Load language phrases + $this->loadPhrases( + array( + 'global', + 'ui', + 'lehre', + 'anrechnung' + ) + ); + + // Load configs + $this->load->config('anrechnung'); + + $this->_setAuthUID(); + + $this->setControllerId(); + } + + public function index() + { + // Set nearest Studiensemester as default + $result = $this->StudiensemesterModel->getNearest(); + $studiensemester_kurzbz = hasData($result) ? getData($result)[0]->studiensemester_kurzbz : ''; + + // Get existing Anrechnungszeitraeume + $this->AnrechnungszeitraumModel->addOrder('anrechnungszeitraum_id', 'DESC'); + $result = $this->AnrechnungszeitraumModel->load(); + $anrechnungszeitraum_arr = hasData($result) ? getData($result) : array(); + + $viewData = array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'anrechnungszeitraum_arr' => $anrechnungszeitraum_arr + ); + + $this->load->view('lehre/anrechnung/adminAnrechnung.php', $viewData); + } + + /** + * Save new Anrechnungszeitraum. + */ + public function save() + { + $this->_validate($this->input->post()); + + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + $anrechnungstart = $this->input->post('anrechnungstart'); + $anrechnungende = $this->input->post('anrechnungende'); + + $result = $this->AnrechnungszeitraumModel->insertAzr($studiensemester_kurzbz, $anrechnungstart, $anrechnungende); + + if (isError($result)) + { + $this->terminateWithJsonError(getError($result)); + } + + if (hasData($result)) + { + $this->outputJsonSuccess(array('anrechnungszeitraum_id' => getData($result))); + } + } + + /** + * Edit Anrechnungszeitraum. + */ + public function edit() + { + $this->_validate($this->input->post()); + + $anrechnungszeitraum_id = $this->input->post('anrechnungszeitraum_id'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + $anrechnungstart = $this->input->post('anrechnungstart'); + $anrechnungende = $this->input->post('anrechnungende'); + + $result = $this->AnrechnungszeitraumModel->updateAzr( + $anrechnungszeitraum_id, + $studiensemester_kurzbz, + $anrechnungstart, + $anrechnungende + ); + + if (isError($result)) + { + $this->terminateWithJsonError(getError($result)); + } + + if (hasData($result)) + { + $this->outputJsonSuccess(array('anrechnungszeitraum_id' => getData($result))); + } + } + + /** + * Delete Anrechnungszeitraum. + */ + public function delete() + { + $anrechnungszeitraum_id = $this->input->post('anrechnungszeitraum_id'); + + $result = $this->AnrechnungszeitraumModel->deleteAzr($anrechnungszeitraum_id); + + if (isError($result)) + { + $this->terminateWithJsonError(getError($result)); + } + + if (hasData($result)) + { + $this->outputJsonSuccess(array('anrechnungszeitraum_id' => getData($result))); + } + } + + /** + * Validates post parameters. + * + * @param $post + */ + private function _validate($post) + { + $studiensemester_kurzbz = $post['studiensemester_kurzbz']; + $anrechnungstart = $post['anrechnungstart']; + $anrechnungende = $post['anrechnungende']; + + if (isEmptyString($studiensemester_kurzbz) + || isEmptyString($anrechnungstart) + || isEmptyString($anrechnungende)) + { + $this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen')); + } + + if ($anrechnungstart > $anrechnungende) + { + $this->terminateWithJsonError($this->p->t('ui', 'errorStartdatumNachEndedatum')); + } + + $result = $this->StudiensemesterModel->load($studiensemester_kurzbz); + $studiensemester = getData($result)[0]; + + if ($anrechnungstart < $studiensemester->start || $anrechnungstart > $studiensemester->ende) + { + $this->terminateWithJsonError($this->p->t('ui', 'errorStartdatumNichtInStudiensemester')); + } + + if ($anrechnungende < $studiensemester->start || $anrechnungende > $studiensemester->ende) + { + $this->terminateWithJsonError($this->p->t('ui', 'errorEndedatumNichtInStudiensemester')); + } + + + } + + /** + * Retrieve the UID of the logged user and checks if it is valid + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } +} \ No newline at end of file From 727d0b58762990aaa9785114812c856b2b884d30 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 6 Mar 2023 13:17:06 +0100 Subject: [PATCH 25/65] Created GUI to admin Anrechnungszeitraume Add / Update / Delete Anrechnungszeitraume --- .../lehre/anrechnung/adminAnrechnung.php | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 application/views/lehre/anrechnung/adminAnrechnung.php diff --git a/application/views/lehre/anrechnung/adminAnrechnung.php b/application/views/lehre/anrechnung/adminAnrechnung.php new file mode 100644 index 000000000..bc167eae3 --- /dev/null +++ b/application/views/lehre/anrechnung/adminAnrechnung.php @@ -0,0 +1,132 @@ + $this->p->t('anrechnung', 'neueAnrechnung'), + 'jquery3' => true, + 'jqueryui1' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'tablesorter2' => true, + 'tabulator4' => true, + 'tablewidget' => true, + 'phrases' => array( + 'anrechnung' => array( + 'anrechnungenVerwalten', + 'anrechnungszeitraumFestlegen', + 'anrechnungszeitraumHinzufuegen', + 'anrechnungszeitraumSpeichern', + 'anrechnungszeitraumStart', + 'anrechnungszeitraumEnde' + ), + 'ui' => array( + 'aktion', + 'geloescht', + 'gespeichert', + 'frageSicherLoeschen' + ), + 'lehre' => array('studiensemester') + ), + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/anrechnung/adminAnrechnung.js' + ), + 'customCSSs' => array( + 'public/css/sbadmin2/tablesort_bootstrap.css' + ) +); + +$this->load->view('templates/FHC-Header', $includesArray); +?> + + +
+
+ + + + + +

p->t('anrechnung', 'anrechnungszeitraumFestlegen'); ?>

+ +
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + +
p->t('lehre', 'studiensemester'); ?>p->t('anrechnung', 'anrechnungszeitraumStart'); ?>p->t('anrechnung', 'anrechnungszeitraumEnde'); ?>p->t('ui', 'aktion'); ?>
studiensemester_kurzbz ?>anrechnungstart ?>anrechnungende ?> + + +
+
+ + + +
+
+ +load->view('templates/FHC-Footer', $includesArray); ?> + From d3f88597d973e89aec027c68360d4dcfd43ebdb8 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 6 Mar 2023 13:19:15 +0100 Subject: [PATCH 26/65] Created Model Anrechnungszeitraum_model Inserts / Updates / Deletes Anrechnungszeitraum --- .../education/Anrechnungszeitraum_model.php | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 application/models/education/Anrechnungszeitraum_model.php diff --git a/application/models/education/Anrechnungszeitraum_model.php b/application/models/education/Anrechnungszeitraum_model.php new file mode 100644 index 000000000..e6f0f13d3 --- /dev/null +++ b/application/models/education/Anrechnungszeitraum_model.php @@ -0,0 +1,87 @@ +dbTable = 'lehre.tbl_anrechnungszeitraum'; + $this->pk = 'anrechnungszeitraum_id'; + } + + /** + * Save new Anrechnungszeitraum. + * + * @param $studiensemester_kurzbz + * @param $anrechnungstart + * @param $anrechnungende + * @return array|stdClass + */ + public function insertAzr($studiensemester_kurzbz, $anrechnungstart, $anrechnungende) + { + $result = $this->insert(array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'anrechnungstart' => $anrechnungstart, + 'anrechnungende' => $anrechnungende, + 'insertvon' => getAuthUID() + )); + + if (isError($result)) + { + return error('Fehler bei Anrechnungszeitraum speichern.'); + } + + // Return new anrechnungszeitraum_id + return success($result->retval); + } + + /** + * Delete Anrechnungszeitraum. + * + * @param $anrechnungszeitraum_id + * @return array|stdClass + */ + public function deleteAzr($anrechnungszeitraum_id) + { + $result = $this->delete(array('anrechnungszeitraum_id' => $anrechnungszeitraum_id)); + + if (isError($result)) + { + return error('Fehler bei Anrechnungszeitraum löschen.'); + } + + return success($result->retval); + } + + /** + * Update existing Anrechnungszeitraum. + * + * @param $anrechnungszeitraum_id + * @param $studiensemester_kurzbz + * @param $anrechnungstart + * @param $anrechnungende + * @return array|stdClass + */ + public function updateAzr($anrechnungszeitraum_id, $studiensemester_kurzbz, $anrechnungstart, $anrechnungende) + { + $result = $this->update( + $anrechnungszeitraum_id, + array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'anrechnungstart' => $anrechnungstart, + 'anrechnungende' => $anrechnungende + ) + ); + + if (isError($result)) + { + return error('Fehler bei Anrechnungszeitraum update.'); + } + + return success($result->retval); + } + +} From f8fb59e80600265cd908e726692f14f59342bc09 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 6 Mar 2023 13:21:37 +0100 Subject: [PATCH 27/65] Created js to handle Anrechnungszeitraum Handle: . modals to add / update Anrechnungszeitraume . AJAX calls to add / update / delete --- public/js/lehre/anrechnung/adminAnrechnung.js | 219 ++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 public/js/lehre/anrechnung/adminAnrechnung.js diff --git a/public/js/lehre/anrechnung/adminAnrechnung.js b/public/js/lehre/anrechnung/adminAnrechnung.js new file mode 100644 index 000000000..aae91fa02 --- /dev/null +++ b/public/js/lehre/anrechnung/adminAnrechnung.js @@ -0,0 +1,219 @@ +$(function () { + + // Open Modal and set values for insert or update Anrechnungszeitraum + $(document).on('click', '.azrOpenModal', function(){ + + // Open Modal + $('#azrModal').modal('show'); + + // insert or update + let mode = this.value; + + if (mode === 'insert') + { + let defaultStudiensemester_kurzbz = $('.modal-body #defaultStudiensemester_kurzbz').val(); + + $('.modal-header #azrModalLabel').text('Anrechnungszeitraum hinzufügen'); + + $(".modal").show(); + + $('.modal-body #anrechnungszeitraum_id').val(''); + $('.modal-body #studiensemester').val(defaultStudiensemester_kurzbz).change(); + $('.modal-body #azrStart').val(''); + $('.modal-body #azrEnde').val(''); + + $('.modal-footer #azrInsertOrUpdateBtn').val('insert'); + } + + if (mode === 'update') + { + let row = $(this).closest('tr'); + var anrechnungszeitraum_id = row.data('anrechnungszeitraum_id'); + var studiensemester_kurzbz = row.find('.studiensemester_kurzbz').text(); + var anrechnungstart = row.find('.anrechnungstart').text(); + var anrechnungende = row.find('.anrechnungende').text(); + + $('.modal-header #azrModalLabel').text('Anrechnungszeitraum bearbeiten'); + + $('.modal-body #anrechnungszeitraum_id').val(anrechnungszeitraum_id); + $('.modal-body #studiensemester').val(studiensemester_kurzbz).change(); + $('.modal-body #azrStart').val(anrechnungstart); + $('.modal-body #azrEnde').val(anrechnungende); + + $('.modal-footer #azrInsertOrUpdateBtn').val('update'); + } + }); + + // Insert or update Anrechnungszeitraum + $(document).on('click', '#azrInsertOrUpdateBtn', function(){ + + var anrechnungszeitraum_id = $('.modal-body #anrechnungszeitraum_id').val(); + var studiensemester_kurzbz = $('.modal-body #studiensemester').val(); + var anrechnungstart = $('.modal-body #azrStart').val(); + var anrechnungende = $('.modal-body #azrEnde').val(); + + // insert or update + let mode = this.value; + + if (mode === 'insert') + { + // Insert Anrechnungszeitraum + adminAnrechnung.insertAzr(studiensemester_kurzbz, anrechnungstart, anrechnungende); + } + + if (mode === 'update') + { + // Update Anrechnungszeitraum + adminAnrechnung.updateAzr(anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende); + } + }); + + // Delete Anrechnungszeitraum + $('#azrTable').on('click', '.azrDeleteBtn', function(){ + + if(!confirm(FHC_PhrasesLib.t("ui", "frageSicherLoeschen"))) + { + return; + } + + var anrechnungszeitraum_id = $(this).closest('tr').data('anrechnungszeitraum_id'); + var row = $(this).closest('tr'); + + // Delete Anrechnungszeitraum + adminAnrechnung.deleteAzr(anrechnungszeitraum_id); + + // Remove row + row.remove(); + }); + +}) + +var adminAnrechnung = { + insertAzr: function(studiensemester_kurzbz, anrechnungstart, anrechnungende){ + FHC_AjaxClient.ajaxCallPost( + FHC_JS_DATA_STORAGE_OBJECT.called_path + "/save", + { + studiensemester_kurzbz: studiensemester_kurzbz, + anrechnungstart: anrechnungstart, + anrechnungende: anrechnungende + }, + { + successCallback: function (data, textStatus, jqXHR) + { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data)); + } + + if (FHC_AjaxClient.hasData(data)) + { + data = FHC_AjaxClient.getData(data); + + // Add row on top + adminAnrechnung.prependRow( + data.anrechnungszeitraum_id, + studiensemester_kurzbz, + anrechnungstart, + anrechnungende + ); + + // Close Modal + $('#azrModal').modal('hide'); + + // Success message + FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "gespeichert")); + } + }, + errorCallback: function (jqXHR, textStatus, errorThrown) + { + FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler")); + } + } + ); + }, + prependRow: function (anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende) { + $('#azrTable').prepend($( + '' + + '' + anrechnungszeitraum_id + '' + + '' + studiensemester_kurzbz + '' + + '' + anrechnungstart + '' + + '' + anrechnungende + '' + + '' + + '' + + '' + + '' + + '' + )) + }, + updateAzr: function (anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende) { + FHC_AjaxClient.ajaxCallPost( + FHC_JS_DATA_STORAGE_OBJECT.called_path + "/edit", + { + anrechnungszeitraum_id: anrechnungszeitraum_id, + studiensemester_kurzbz: studiensemester_kurzbz, + anrechnungstart: anrechnungstart, + anrechnungende: anrechnungende + }, + { + successCallback: function (data, textStatus, jqXHR) + { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data)); + } + + if (FHC_AjaxClient.hasData(data)) + { + // Update row + adminAnrechnung.updateRow(anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende); + + // Close Modal + $('#azrModal').modal('hide'); + + // Success message + FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "gespeichert")); + + } + }, + errorCallback: function (jqXHR, textStatus, errorThrown) + { + FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler")); + } + } + ); + }, + updateRow: function (anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende){ + let row = $('#azrTable').find('tr').filter('[data-anrechnungszeitraum_id=' + anrechnungszeitraum_id + ']'); + row.find('.studiensemester_kurzbz').text(studiensemester_kurzbz); + row.find('.anrechnungstart').text(anrechnungstart); + row.find('.anrechnungende').text(anrechnungende); + }, + deleteAzr: function(anrechnungszeitraum_id){ + FHC_AjaxClient.ajaxCallPost( + FHC_JS_DATA_STORAGE_OBJECT.called_path + "/delete", + { + anrechnungszeitraum_id: anrechnungszeitraum_id + }, + { + successCallback: function (data, textStatus, jqXHR) + { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data)); + } + + if (FHC_AjaxClient.hasData(data)) + { + // Success message + FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "geloescht")); + + } + }, + errorCallback: function (jqXHR, textStatus, errorThrown) + { + FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler")); + } + } + ); + } +} \ No newline at end of file From 9c85877d3d0f0f46fecedbfa035419c12a75b9e9 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 6 Mar 2023 13:24:03 +0100 Subject: [PATCH 28/65] Added new phrases .anrechnungenVerwalten .anrechnungszeitraumFestlegen .anrechnungszeitraumHinzufuegen .anrechnungszeitraumSpeichern .anrechnungszeitraumStart .anrechnungszeitraumEnde .errorStartdatumNichtInStudiensemester .errorEndedatumNichtInStudiensemester .errorStartdatumNachEndedatum .frageSicherLoeschen --- system/phrasesupdate.php | 200 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index aa87e4cf6..b3c01518a 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -11969,6 +11969,206 @@ Any unusual occurrences ) ) ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungenVerwalten', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnungen verwalten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Administration of applications.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungszeitraumFestlegen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnungszeitraum festlegen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Set appplication period', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungszeitraumHinzufuegen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnungszeitraum hinzufügen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Add appplication period', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungszeitraumSpeichern', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnungszeitraum speichern', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Save application period', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungszeitraumStart', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnungszeitraum Start', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Startdate application', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungszeitraumEnde', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnungszeitraum Ende', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Enddate application', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'errorStartdatumNichtInStudiensemester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Startdatum liegt außerhalb des gewählten Studiensemesters.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The startdate is not within the selected study semester.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'errorEndedatumNichtInStudiensemester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Endedatum liegt außerhalb des gewählten Studiensemesters.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The enddate is not within the selected study semester.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'errorStartdatumNachEndedatum', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Startdatum muss VOR dem Endedatum liegen.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The startdate must be BEFORE the enddate.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'frageSicherLoeschen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Sicher löschen?", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Definitely delete?", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'ui', From 9e15668c3770ece554d81b6ca111ffdb49925136 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 6 Mar 2023 13:25:14 +0100 Subject: [PATCH 29/65] Created page-header class page-header class was dropped since Bootstrap 4. Therefore added to css style --- public/css/sbadmin2/tablesort_bootstrap.css | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/public/css/sbadmin2/tablesort_bootstrap.css b/public/css/sbadmin2/tablesort_bootstrap.css index 3e2574241..1365baf92 100644 --- a/public/css/sbadmin2/tablesort_bootstrap.css +++ b/public/css/sbadmin2/tablesort_bootstrap.css @@ -66,3 +66,10 @@ table.tablesort-hover tr:hover, .tablesort-active { #ui-datepicker-div { z-index: 9999 !important; } + + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} From 043f09892a1f0c479a670a72f5f28ee1576f4f03 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 6 Mar 2023 15:22:56 +0100 Subject: [PATCH 30/65] Deleted hidden testing field --- public/js/lehre/anrechnung/adminAnrechnung.js | 1 - 1 file changed, 1 deletion(-) diff --git a/public/js/lehre/anrechnung/adminAnrechnung.js b/public/js/lehre/anrechnung/adminAnrechnung.js index aae91fa02..8d63ab1fb 100644 --- a/public/js/lehre/anrechnung/adminAnrechnung.js +++ b/public/js/lehre/anrechnung/adminAnrechnung.js @@ -134,7 +134,6 @@ var adminAnrechnung = { prependRow: function (anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende) { $('#azrTable').prepend($( '' + - '' + anrechnungszeitraum_id + '' + '' + studiensemester_kurzbz + '' + '' + anrechnungstart + '' + '' + anrechnungende + '' + From 479feea8aa154e200cac71789fe910d6f1779976 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 6 Mar 2023 15:26:12 +0100 Subject: [PATCH 31/65] =?UTF-8?q?Changed=20way=20of=20check=C3=ADng=20Anre?= =?UTF-8?q?chnungszeitraum?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changed function isExpired to check Anrechnungszeitraeume of tbl_anrechnungszeitraum instead of using config entries. --- .../lehre/anrechnung/RequestAnrechnung.php | 46 ++++++++----------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/application/controllers/lehre/anrechnung/RequestAnrechnung.php b/application/controllers/lehre/anrechnung/RequestAnrechnung.php index fbaac9b3e..7a8ef3eb6 100644 --- a/application/controllers/lehre/anrechnung/RequestAnrechnung.php +++ b/application/controllers/lehre/anrechnung/RequestAnrechnung.php @@ -80,11 +80,7 @@ class requestAnrechnung extends Auth_Controller $prestudent_id = getData($result)[0]->prestudent_id; // Check if application deadline is expired - $is_expired = self::_isExpired( - $this->config->item('submit_application_start'), - $this->config->item('submit_application_end'), - $studiensemester_kurzbz - ); + $is_expired = $this->_isExpired($studiensemester_kurzbz); // Check if Lehrveranstaltung was already graded with application blocking grades $is_blocked = self::_LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id); @@ -234,32 +230,30 @@ class requestAnrechnung extends Auth_Controller * @return bool True if deadline is expired * @throws Exception */ - private function _isExpired($start, $ende, $studiensemester_kurzbz) + private function _isExpired($studiensemester_kurzbz) { - $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $today = new DateTime('today midnight'); - // If start is not given, set to Semesterstart. - if (!isset($start) || isEmptyString($start)) - { - $this->StudiensemesterModel->addSelect('start'); - $result = $this->StudiensemesterModel->load($studiensemester_kurzbz); - $start = getData($result)[0]->start; - } + // Load all Anrechnungszeitfenster for this Studiensemester + $this->load->model('education/Anrechnungszeitraum_model', 'AnrechnungszeitraumModel'); + $result = $this->AnrechnungszeitraumModel->loadWhere(array('studiensemester_kurzbz' => $studiensemester_kurzbz)); - // If ende is not given, set to Semesterende. - if (!isset($ende) || isEmptyString($ende)) - { - $this->StudiensemesterModel->addSelect('ende'); - $result = $this->StudiensemesterModel->load($studiensemester_kurzbz); - $ende = getData($result)[0]->ende; - } + if (hasData($result)) + { + // Loop through Anrechnungszeitfenster + foreach (getData($result) as $azrObj) + { + $start = new DateTime($azrObj->anrechnungstart); + $ende = new DateTime($azrObj->anrechnungende); - $today = new DateTime('today midnight'); - $start = new DateTime($start); - $ende = new DateTime($ende); + // Return false if today is at least within one Anrechnungszeitraum + if (($today >= $start && $today <= $ende)) return false; - // True if expired - return ($today < $start || $today > $ende); + } + } + + // Return true if today is in none Anrechnungszeitraum + return true; } /** From ba31a0b5b0a727271bb2eb9ae50b0c96742df77e Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 7 Mar 2023 14:06:00 +0100 Subject: [PATCH 32/65] Changed HTML table to Tablewidget --- .../lehre/anrechnung/adminAnrechnung.php | 32 +--- .../lehre/anrechnung/adminAnrechnungData.php | 45 +++++ public/js/lehre/anrechnung/adminAnrechnung.js | 180 ++++++++++-------- 3 files changed, 152 insertions(+), 105 deletions(-) create mode 100644 application/views/lehre/anrechnung/adminAnrechnungData.php diff --git a/application/views/lehre/anrechnung/adminAnrechnung.php b/application/views/lehre/anrechnung/adminAnrechnung.php index bc167eae3..f333b0cdc 100644 --- a/application/views/lehre/anrechnung/adminAnrechnung.php +++ b/application/views/lehre/anrechnung/adminAnrechnung.php @@ -57,31 +57,11 @@ $this->load->view('templates/FHC-Header', $includesArray); - -
- - - - - - - - - - - - - - - - - - - -
p->t('lehre', 'studiensemester'); ?>p->t('anrechnung', 'anrechnungszeitraumStart'); ?>p->t('anrechnung', 'anrechnungszeitraumEnde'); ?>p->t('ui', 'aktion'); ?>
studiensemester_kurzbz ?>anrechnungstart ?>anrechnungende ?> - - -
+ +
+
+ load->view('lehre/anrechnung/adminAnrechnungData.php'); ?> +
@@ -120,7 +100,7 @@ $this->load->view('templates/FHC-Header', $includesArray);
diff --git a/application/views/lehre/anrechnung/adminAnrechnungData.php b/application/views/lehre/anrechnung/adminAnrechnungData.php new file mode 100644 index 000000000..1129fdbbf --- /dev/null +++ b/application/views/lehre/anrechnung/adminAnrechnungData.php @@ -0,0 +1,45 @@ + $query, + 'tableUniqueId' => 'adminAnrechnung', + 'requiredPermissions' => 'admin', + 'datasetRepresentation' => 'tabulator', + 'columnsAliases' => array( + 'AzrID', + ucfirst($this->p->t('lehre', 'studiensemester')), + ucfirst($this->p->t('anrechnung', 'anrechnungszeitraumStart')), + ucfirst($this->p->t('anrechnung', 'anrechnungszeitraumEnde')), + ucfirst($this->p->t('ui', 'bearbeitetAm')), + ucfirst($this->p->t('ui', 'bearbeitetVon')), + ), + 'datasetRepOptions' => '{ + height: func_height(this), + layout: "fitColumns", // fit columns to width of table + //persistentLayout:true, + autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated + headerFilterPlaceholder: " ", + index: "anrechnungszeitraum_id", // assign specific column as unique id (important for row indexing) + selectable: false, // allow row selection + //tableWidgetHeader: true, + tableBuilt: function(){ + func_tableBuilt(this); + }, + }', + 'datasetRepFieldsDefs' => '{ + anrechnungszeitraum_id: {visible: false, headerFilter:"input"}, + studiensemester_kurzbz: {headerFilter:"input"}, + anrechnungstart: {headerFilter:"input"}, + anrechnungende: {headerFilter:"input"}, + insertamum: {visible: false, headerFilter:"input"}, + insertvon: {visible: false, headerFilter:"input"} + }' +); + +echo $this->widgetlib->widget('TableWidget', $filterWidgetArray); \ No newline at end of file diff --git a/public/js/lehre/anrechnung/adminAnrechnung.js b/public/js/lehre/anrechnung/adminAnrechnung.js index 8d63ab1fb..c6beaa568 100644 --- a/public/js/lehre/anrechnung/adminAnrechnung.js +++ b/public/js/lehre/anrechnung/adminAnrechnung.js @@ -1,8 +1,61 @@ +// Adds column details +function func_tableBuilt(table) { + table.addColumn( + { + title: "Aktion", + align: "center", + width: 150, + formatter: addActionButtons, + }, false // place column right + ); + +} + +// Returns relative height (depending on screen size) +function func_height(table){ + return $(window).height() * 0.50; +} + +var addActionButtons = function(cell) { + + // Create edit button + var editBtn = document.createElement("button"); + editBtn.type = "button"; + editBtn.innerHTML = ""; + editBtn.classList.add("azrEditBtn"); + editBtn.classList.add("btn"); + editBtn.classList.add("btn-outline-secondary"); + editBtn.addEventListener("click", function(){ + adminAnrechnung.editRow(cell); + }); + + + + // Create delete button + var delBtn= document.createElement("button"); + delBtn.type = "button"; + delBtn.innerHTML = ""; + delBtn.classList.add("azrDeleteBtn"); + delBtn.classList.add("btn"); + delBtn.classList.add("btn-outline-secondary"); + delBtn.classList.add("ms-1"); + delBtn.addEventListener("click", function(){ + adminAnrechnung.deleteRow(cell); + }); + + // Add buttons to cell + var buttonHolder = document.createElement("span"); + buttonHolder.appendChild(editBtn); + buttonHolder.appendChild(delBtn); + + return buttonHolder; +} + $(function () { // Open Modal and set values for insert or update Anrechnungszeitraum $(document).on('click', '.azrOpenModal', function(){ - + // Open Modal $('#azrModal').modal('show'); @@ -25,66 +78,18 @@ $(function () { $('.modal-footer #azrInsertOrUpdateBtn').val('insert'); } - if (mode === 'update') - { - let row = $(this).closest('tr'); - var anrechnungszeitraum_id = row.data('anrechnungszeitraum_id'); - var studiensemester_kurzbz = row.find('.studiensemester_kurzbz').text(); - var anrechnungstart = row.find('.anrechnungstart').text(); - var anrechnungende = row.find('.anrechnungende').text(); - - $('.modal-header #azrModalLabel').text('Anrechnungszeitraum bearbeiten'); - - $('.modal-body #anrechnungszeitraum_id').val(anrechnungszeitraum_id); - $('.modal-body #studiensemester').val(studiensemester_kurzbz).change(); - $('.modal-body #azrStart').val(anrechnungstart); - $('.modal-body #azrEnde').val(anrechnungende); - - $('.modal-footer #azrInsertOrUpdateBtn').val('update'); - } }); - // Insert or update Anrechnungszeitraum - $(document).on('click', '#azrInsertOrUpdateBtn', function(){ - - var anrechnungszeitraum_id = $('.modal-body #anrechnungszeitraum_id').val(); + // Insert Anrechnungszeitraum + $(document).on('click', '#azrInsertBtn', function(){ var studiensemester_kurzbz = $('.modal-body #studiensemester').val(); var anrechnungstart = $('.modal-body #azrStart').val(); var anrechnungende = $('.modal-body #azrEnde').val(); - // insert or update - let mode = this.value; - - if (mode === 'insert') - { - // Insert Anrechnungszeitraum - adminAnrechnung.insertAzr(studiensemester_kurzbz, anrechnungstart, anrechnungende); - } - - if (mode === 'update') - { - // Update Anrechnungszeitraum - adminAnrechnung.updateAzr(anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende); - } + // Insert Anrechnungszeitraum + adminAnrechnung.insertAzr(studiensemester_kurzbz, anrechnungstart, anrechnungende); }); - // Delete Anrechnungszeitraum - $('#azrTable').on('click', '.azrDeleteBtn', function(){ - - if(!confirm(FHC_PhrasesLib.t("ui", "frageSicherLoeschen"))) - { - return; - } - - var anrechnungszeitraum_id = $(this).closest('tr').data('anrechnungszeitraum_id'); - var row = $(this).closest('tr'); - - // Delete Anrechnungszeitraum - adminAnrechnung.deleteAzr(anrechnungszeitraum_id); - - // Remove row - row.remove(); - }); }) @@ -109,13 +114,13 @@ var adminAnrechnung = { { data = FHC_AjaxClient.getData(data); - // Add row on top - adminAnrechnung.prependRow( - data.anrechnungszeitraum_id, - studiensemester_kurzbz, - anrechnungstart, - anrechnungende - ); + // Update row + $('#tableWidgetTabulator').tabulator('addData', [{ + anrechnungszeitraum_id: data.anrechnungszeitraum_id, + studiensemester_kurzbz: studiensemester_kurzbz, + anrechnungstart: anrechnungstart, + anrechnungende: anrechnungende + }], true); // true to add row on top // Close Modal $('#azrModal').modal('hide'); @@ -131,18 +136,24 @@ var adminAnrechnung = { } ); }, - prependRow: function (anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende) { - $('#azrTable').prepend($( - '' + - '' + studiensemester_kurzbz + '' + - '' + anrechnungstart + '' + - '' + anrechnungende + '' + - '' + - '' + - '' + - '' + - '' - )) + editRow: function (cell){ + // Open Modal + $('#azrModal').modal('show'); + + let row = cell.getRow(); + var anrechnungszeitraum_id = row.getData().anrechnungszeitraum_id; + var studiensemester_kurzbz = row.getData().studiensemester_kurzbz; + var anrechnungstart = row.getData().anrechnungstart; + var anrechnungende = row.getData().anrechnungende; + + $('.modal-header #azrModalLabel').text('Anrechnungszeitraum bearbeiten'); + + $('.modal-body #anrechnungszeitraum_id').val(anrechnungszeitraum_id); + $('.modal-body #studiensemester').val(studiensemester_kurzbz).change(); + $('.modal-body #azrStart').val(anrechnungstart); + $('.modal-body #azrEnde').val(anrechnungende); + + $('.modal-footer #azrInsertOrUpdateBtn').val('update'); }, updateAzr: function (anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende) { FHC_AjaxClient.ajaxCallPost( @@ -164,7 +175,12 @@ var adminAnrechnung = { if (FHC_AjaxClient.hasData(data)) { // Update row - adminAnrechnung.updateRow(anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende); + $('#tableWidgetTabulator').tabulator('updateData', [{ + anrechnungszeitraum_id: anrechnungszeitraum_id, + studiensemester_kurzbz: studiensemester_kurzbz, + anrechnungstart: anrechnungstart, + anrechnungende: anrechnungende + }]); // Close Modal $('#azrModal').modal('hide'); @@ -181,12 +197,6 @@ var adminAnrechnung = { } ); }, - updateRow: function (anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende){ - let row = $('#azrTable').find('tr').filter('[data-anrechnungszeitraum_id=' + anrechnungszeitraum_id + ']'); - row.find('.studiensemester_kurzbz').text(studiensemester_kurzbz); - row.find('.anrechnungstart').text(anrechnungstart); - row.find('.anrechnungende').text(anrechnungende); - }, deleteAzr: function(anrechnungszeitraum_id){ FHC_AjaxClient.ajaxCallPost( FHC_JS_DATA_STORAGE_OBJECT.called_path + "/delete", @@ -203,6 +213,9 @@ var adminAnrechnung = { if (FHC_AjaxClient.hasData(data)) { + let row = $('#tableWidgetTabulator').tabulator('getRow', anrechnungszeitraum_id); + row.delete(anrechnungszeitraum_id); + // Success message FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "geloescht")); @@ -214,5 +227,14 @@ var adminAnrechnung = { } } ); + }, + deleteRow: function (cell){ + if(!confirm(FHC_PhrasesLib.t("ui", "frageSicherLoeschen"))) + { + return; + } + + // Delete Anrechnungszeitraum + adminAnrechnung.deleteAzr(cell.getRow().getData().anrechnungszeitraum_id); } } \ No newline at end of file From c78e715c3e6f0f07a7c86a5bd0d518085d04c96f Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 7 Mar 2023 14:07:14 +0100 Subject: [PATCH 33/65] Added phrases 'bearbeitetVon', 'bearbeitetAm' --- system/phrasesupdate.php | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index b3c01518a..1518aee59 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -13185,6 +13185,46 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'bearbeitetVon', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "bearbeitet von", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "edited by", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'bearbeitetAm', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "bearbeitet am", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "edited on", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'global', From f8349a2a9b649e53ba9146d45d7b4987cbb7a89b Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 7 Mar 2023 17:18:21 +0100 Subject: [PATCH 34/65] Changed Bootstrap 5 -> Bootstrap 3 Tablewidget is not working fine with Bootstrap 5 by now. --- .../lehre/anrechnung/adminAnrechnung.php | 75 ++++++++++--------- public/css/sbadmin2/tablesort_bootstrap.css | 9 +-- public/js/lehre/anrechnung/adminAnrechnung.js | 6 +- 3 files changed, 43 insertions(+), 47 deletions(-) diff --git a/application/views/lehre/anrechnung/adminAnrechnung.php b/application/views/lehre/anrechnung/adminAnrechnung.php index f333b0cdc..5b62bbda2 100644 --- a/application/views/lehre/anrechnung/adminAnrechnung.php +++ b/application/views/lehre/anrechnung/adminAnrechnung.php @@ -3,7 +3,7 @@ $includesArray = array( 'title' => $this->p->t('anrechnung', 'neueAnrechnung'), 'jquery3' => true, 'jqueryui1' => true, - 'bootstrap5' => true, + 'bootstrap3' => true, 'fontawesome6' => true, 'ajaxlib' => true, 'dialoglib' => true, @@ -23,7 +23,8 @@ $includesArray = array( 'aktion', 'geloescht', 'gespeichert', - 'frageSicherLoeschen' + 'frageSicherLoeschen', + 'spaltenEinstellen' ), 'lehre' => array('studiensemester') ), @@ -46,57 +47,59 @@ $this->load->view('templates/FHC-Header', $includesArray); +
-

p->t('anrechnung', 'anrechnungszeitraumFestlegen'); ?>

+

p->t('anrechnung', 'anrechnungszeitraumFestlegen'); ?>


-
-
-
+
load->view('lehre/anrechnung/adminAnrechnungData.php'); ?>
-