diff --git a/application/config/abgabe.php b/application/config/abgabe.php
index 90aedbd8b..dd059d047 100644
--- a/application/config/abgabe.php
+++ b/application/config/abgabe.php
@@ -29,7 +29,7 @@ $config['ALLOWED_NOTEN_ABGABETOOL'] = [10, 14]; // tbl_note pk
// benotete projektarbeiten sperren weitere terminanlage & bearbeitung, diese noten sind ausnahmen dieser Regel
// wie zB "Nicht beurteilt" & "Noch nicht eingetragen"
$config['NONFINAL_NOTEN_ABGABETOOL'] = [9];
-$config['beurteilung_link_fallback'] = 'addons/fhtw/content/projektbeurteilung/projektbeurteilungDocumentExport.php?projektarbeit_id=?&betreuerart_kurzbz=?&person_id=?';
+$config['beurteilung_link_fallback'] = 'cis/private/lehre/projektbeurteilungDocumentExport.php?projektarbeit_id=?&betreuerart_kurzbz=?&person_id=?';
$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter';
$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ZWEITBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter';
@@ -38,8 +38,19 @@ $config['SIGNATUR_CHECK_PAABGABETYPEN'] = ['end'];
// to be used as "https://moodle.technikum-wien.at/course/view.php?idnumber=dl{$stg_kz}" for stg specific moodle routing
$config['STG_MOODLE_LINK'] = 'https://moodle.technikum-wien.at/course/view.php?idnumber=dl';
+// TODO: check if these links change if the file changes and how to better retrieve the link?
+$config['SIGNATUR_INFO_LINK_GERMAN'] = 'https://cis.technikum-wien.at/cms/dms.php?id=214779';
+$config['SIGNATUR_INFO_LINK_ENGLISH'] = 'https://cis.technikum-wien.at/cms/dms.php?id=264256';
$config['ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'] = true;
$config['ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'] = true;
$config['BETREUER_SAMMELMAIL_BUTTON_STUDENT'] = true;
+
+$config['MULTIEDIT_TABLE'] = true;
+
+$config['STUDENT_EDIT_PROJEKTARBEIT_TITLE'] = true;
+
+$config['CONFETTI_ON_ENDUPLOAD'] = true;
+
+
diff --git a/application/config/routes.php b/application/config/routes.php
index aa4ba9db8..8024f449a 100644
--- a/application/config/routes.php
+++ b/application/config/routes.php
@@ -64,6 +64,9 @@ $route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1';
$route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1';
$route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1';
$route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1';
+$route['Cis/OtherLvPlan/.*'] = 'Cis/OtherLvPlan/index/$1';
+//Route for LV Plan Stg/Semester/Verband/Gruppe
+$route['Cis/StgOrgLvPlan/.*'] = 'Cis/StgOrgLvPlan/index/$1';
$route['Abgabetool/Assistenz'] = 'Cis/Abgabetool/Assistenz';
$route['Abgabetool/Assistenz/(:any)'] = 'Cis/Abgabetool/Assistenz/$1';
diff --git a/application/config/searchcis.php b/application/config/searchcis.php
index 12bad025d..6d513c499 100644
--- a/application/config/searchcis.php
+++ b/application/config/searchcis.php
@@ -22,8 +22,9 @@ unset($config['student']['searchfields']['email']);
unset($config['student']['searchfields']['tel']);
$config['student']['resultfields'] = [
"s.student_uid AS uid",
- "s.matrikelnr",
+ "s.matrikelnr AS personenkennzeichen",
"p.person_id",
+ "p.matr_nr AS matrikelnummer",
"(p.vorname || ' ' || p.nachname) AS name",
"ARRAY[s.student_uid || '@' || '" . DOMAIN . "'] AS email",
"CASE
diff --git a/application/config/studierendenantrag.php b/application/config/studierendenantrag.php
index 4e25aef28..ef2098aca 100644
--- a/application/config/studierendenantrag.php
+++ b/application/config/studierendenantrag.php
@@ -168,3 +168,32 @@ $config['stgkz_blacklist_wiederholung'] = [];
* @var array An array of noten ids
*/
$config['note_blacklist_wiederholung'] = [];
+
+/**
+ * Enable/disable the Abmeldung StG process
+ *
+ * @var bool
+ */
+$config['abmeldung_stg_enabled'] = true;
+
+/**
+ * Enable/disable the Abmeldung process
+ *
+ * @var bool
+ */
+$config['abmeldung_enabled'] = true;
+
+/**
+ * Enable/disable the Unterbrecher process
+ *
+ * @var bool
+ */
+$config['unterbrechung_enabled'] = true;
+
+/**
+ * Enable/disable the Wiederholer process
+ *
+ * @var bool
+ */
+$config['wiederholung_enabled'] = true;
+
diff --git a/application/controllers/Cis/Abgabetool.php b/application/controllers/Cis/Abgabetool.php
index 04338b1a9..28414dafa 100644
--- a/application/controllers/Cis/Abgabetool.php
+++ b/application/controllers/Cis/Abgabetool.php
@@ -31,12 +31,8 @@ class Abgabetool extends Auth_Controller
{
// TODO: routing from index based on berechtigung?
- $viewData = array(
- 'uid'=>getAuthUID(),
- );
-
if(defined('CIS4') && CIS4) {
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'Abgabetool']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']);
}
@@ -44,12 +40,8 @@ class Abgabetool extends Auth_Controller
public function Student($student_uid_prop = '')
{
- $viewData = array(
- 'uid'=>getAuthUID(),
- );
-
if(defined('CIS4') && CIS4) {
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'AbgabetoolStudent']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]);
}
@@ -57,12 +49,8 @@ class Abgabetool extends Auth_Controller
public function Mitarbeiter()
{
- $viewData = array(
- 'uid'=>getAuthUID(),
- );
-
if(defined('CIS4') && CIS4) {
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'AbgabetoolMitarbeiter']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']);
}
@@ -70,13 +58,8 @@ class Abgabetool extends Auth_Controller
public function Assistenz($stg_kz_prop = '')
{
-
- $viewData = array(
- 'uid'=>getAuthUID(),
- );
-
if(defined('CIS4') && CIS4) {
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolAssistenz']);
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'AbgabetoolAssistenz']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]);
}
@@ -84,12 +67,8 @@ class Abgabetool extends Auth_Controller
public function Deadlines()
{
- $viewData = array(
- 'uid'=>getAuthUID(),
- );
-
if(defined('CIS4') && CIS4) {
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'DeadlinesOverview']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'DeadlinesOverview']);
}
diff --git a/application/controllers/Cis/Auth.php b/application/controllers/Cis/Auth.php
index 67267ebf6..87ef5d3da 100644
--- a/application/controllers/Cis/Auth.php
+++ b/application/controllers/Cis/Auth.php
@@ -40,7 +40,7 @@ class Auth extends FHC_Controller
if ($this->form_validation->run())
{
- redirect($this->authlib->getLandingPage('/CisVue/Dashboard'));
+ redirect($this->authlib->getLandingPage('/Cis4'));
}
else
{
diff --git a/application/controllers/Cis/LvPlan.php b/application/controllers/Cis/LvPlan.php
index 884c8a9a0..32e622f5a 100644
--- a/application/controllers/Cis/LvPlan.php
+++ b/application/controllers/Cis/LvPlan.php
@@ -28,12 +28,6 @@ class LvPlan extends Auth_Controller
*/
public function index()
{
-
- $viewData = array(
- 'uid'=>getAuthUID(),
- 'timezone' => $this->config->item('timezone')
- );
-
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'LvPlan']);
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'LvPlan']);
}
}
diff --git a/application/controllers/Cis/MyLv.php b/application/controllers/Cis/MyLv.php
index 819d56b05..0f24d3a80 100644
--- a/application/controllers/Cis/MyLv.php
+++ b/application/controllers/Cis/MyLv.php
@@ -26,11 +26,6 @@ class MyLv extends Auth_Controller
*/
public function index()
{
-
- $viewData = array(
-
- );
-
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLv']);
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'MyLv']);
}
}
diff --git a/application/controllers/Cis/MyLvPlan.php b/application/controllers/Cis/MyLvPlan.php
index 366ce8e65..a7f21aa20 100644
--- a/application/controllers/Cis/MyLvPlan.php
+++ b/application/controllers/Cis/MyLvPlan.php
@@ -27,13 +27,7 @@ class MyLvPlan extends Auth_Controller
* @return void
*/
public function index()
- {
-
- $viewData = array(
- 'uid'=>getAuthUID(),
- 'timezone' => $this->config->item('timezone')
- );
-
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLvPlan']);
+ {
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'MyLvPlan']);
}
}
diff --git a/application/controllers/Cis/OtherLvPlan.php b/application/controllers/Cis/OtherLvPlan.php
new file mode 100644
index 000000000..e62644dd1
--- /dev/null
+++ b/application/controllers/Cis/OtherLvPlan.php
@@ -0,0 +1,34 @@
+ ['basis/other_lv_plan:r']
+ ]);
+
+ // Load Config
+ $this->load->config('calendar');
+ }
+
+ // -----------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * @return void
+ */
+ public function index()
+ {
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'OtherLvPlan']);
+ }
+}
diff --git a/application/controllers/Cis/Profil.php b/application/controllers/Cis/Profil.php
index c287d87d0..dd7963228 100644
--- a/application/controllers/Cis/Profil.php
+++ b/application/controllers/Cis/Profil.php
@@ -55,15 +55,7 @@ class Profil extends Auth_Controller
*/
public function index()
{
-
- $this->load->library('ProfilLib');
- $profil_data = $this->profillib->getView(getAuthUID());
- $profil_data = hasData($profil_data) ? getData($profil_data) : null;
- $viewData = array(
- 'editable'=>true,
- 'profil_data' => $profil_data,
- );
- $this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'profilIndex']);
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'profilIndex']);
}
/**
@@ -73,23 +65,13 @@ class Profil extends Auth_Controller
*/
public function View($uid)
{
- $this->load->library('ProfilLib');
- $profil_data = $this->profillib->getView($uid);
- $profil_data = hasData($profil_data) ? getData($profil_data) : null;
- $viewData = array (
- 'uid' => $uid,
- 'profil_data'=>$profil_data,
- );
- if($uid == getAuthUID()){
- $viewData['editable'] = true;
- }
- $this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'profilViewUid']);
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'profilViewUid']);
}
/**
- * checks whether a specific userID is a mitarbeiter or not (foreword declaration of the function isMitarbeiter in Mitarbeiter_model.php)
+ * checks whether a specific userID is a student or not (foreword declaration of the function isStudent in Student_model.php)
* @access public
- * @param $uid the userID used to check if it is a mitarbeiter
+ * @param $uid the userID used to check if it is a student
* @return boolean
*/
public function isStudent($uid)
@@ -119,7 +101,7 @@ class Profil extends Auth_Controller
}
/**
- * gets the adressen that are marked as zustell from the currenlty logged in user
+ * gets the adressen that are marked as zustell from the currently logged in user
* @access public
* @return array a list of adresse_id's
*/
@@ -262,23 +244,23 @@ class Profil extends Auth_Controller
$this->GemeindeModel->addDistinct();
$this->GemeindeModel->addSelect(["name"]);
if ($nation == "A") {
- if (isset($zip) && $zip > 999 && $zip < 32000) {
+ if (isset($zip) && $zip > 999 && $zip < 32000) {
- $gemeinde_res = $this->GemeindeModel->loadWhere(['plz' => $zip]);
- if (isError($gemeinde_res)) {
- show_error("error while trying to query bis.tbl_gemeinde");
- }
- $gemeinde_res = hasData($gemeinde_res) ? getData($gemeinde_res) : null;
- $gemeinde_res = array_map(function ($obj) {
- return $obj->name;
- }, $gemeinde_res);
- echo json_encode($gemeinde_res);
-
- } else {
- echo json_encode(error("ortschaftskennziffer code was not valid"));
+ $gemeinde_res = $this->GemeindeModel->loadWhere(['plz' => $zip]);
+ if (isError($gemeinde_res)) {
+ show_error("error while trying to query bis.tbl_gemeinde");
}
+ $gemeinde_res = hasData($gemeinde_res) ? getData($gemeinde_res) : null;
+ $gemeinde_res = array_map(function ($obj) {
+ return $obj->name;
+ }, $gemeinde_res);
+ echo json_encode($gemeinde_res);
+
+ } else {
+ echo json_encode(error("ortschaftskennziffer code was not valid"));
+ }
} else {
- echo json_encode(error("Nation was not 'A' (Austria)"));
+ echo json_encode(error("Nation was not 'A' (Austria)"));
}
}
@@ -750,6 +732,4 @@ class Profil extends Auth_Controller
$zutrittskarte_ausgegebenam = str_replace("-", ".", $zutrittskarte_ausgegebenam);
return $zutrittskarte_ausgegebenam;
}
-
-
}
diff --git a/application/controllers/Cis/Raumsuche.php b/application/controllers/Cis/Raumsuche.php
index 055038275..f48beb0f3 100644
--- a/application/controllers/Cis/Raumsuche.php
+++ b/application/controllers/Cis/Raumsuche.php
@@ -25,11 +25,6 @@ class Raumsuche extends Auth_Controller
*/
public function index()
{
-
- $viewData = array(
- 'uid'=>getAuthUID(),
- );
-
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Raumsuche']);
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'Raumsuche']);
}
}
diff --git a/application/controllers/Cis/StgOrgLvPlan.php b/application/controllers/Cis/StgOrgLvPlan.php
new file mode 100644
index 000000000..bf329fcb8
--- /dev/null
+++ b/application/controllers/Cis/StgOrgLvPlan.php
@@ -0,0 +1,33 @@
+ ['basis/cis:r']
+ ]);
+
+ // Load Config
+ $this->load->config('calendar');
+ }
+
+ // -----------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * @return void
+ */
+ public function index()
+ {
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'StgOrgLvPlan']);
+ }
+}
diff --git a/application/controllers/Cis/Studium.php b/application/controllers/Cis/Studium.php
index a298de648..20f323dff 100644
--- a/application/controllers/Cis/Studium.php
+++ b/application/controllers/Cis/Studium.php
@@ -29,10 +29,7 @@ class Studium extends Auth_Controller
*/
public function index()
{
- $viewData = array(
-
- );
- $this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'studium']);
+ $this->load->view('CisRouterView/CisRouterView.php',['route' => 'studium']);
}
diff --git a/application/controllers/Cis4.php b/application/controllers/Cis4.php
index b7ba2029d..48fd6c240 100644
--- a/application/controllers/Cis4.php
+++ b/application/controllers/Cis4.php
@@ -1,6 +1,7 @@
'basis/cis:r'
- )
+ array(
+ 'index' => 'basis/cis:r'
+ )
);
// Load Config
@@ -30,16 +31,6 @@ class Cis4 extends Auth_Controller
*/
public function index()
{
- $this->load->model('person/Person_model', 'PersonModel');
- $personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
-
- $viewData = array(
- 'uid' => getAuthUID(),
- 'name' => $personData->vorname,
- 'person_id' => $personData->person_id,
- 'timezone' => $this->config->item('timezone')
- );
-
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'FhcDashboard']);
+ $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'FhcDashboard']);
}
}
diff --git a/application/controllers/CisVue/Dashboard.php b/application/controllers/CisVue/Dashboard.php
deleted file mode 100644
index ee830cb8b..000000000
--- a/application/controllers/CisVue/Dashboard.php
+++ /dev/null
@@ -1,43 +0,0 @@
- 'dashboard/benutzer:r'
- )
- );
- }
-
- // -----------------------------------------------------------------------------------------------------------------
- // Public methods
-
- /**
- * @return void
- */
- public function index()
- {
-
- $this->load->model('person/Person_model','PersonModel');
- $personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
-
- $viewData = array(
- 'uid' => getAuthUID(),
- 'name' => $personData->vorname,
- 'person_id' => $personData->person_id
- );
-
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData]);
-
- }
-}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php
index 43dc18d1c..759c32d58 100644
--- a/application/controllers/api/frontend/v1/Abgabe.php
+++ b/application/controllers/api/frontend/v1/Abgabe.php
@@ -35,9 +35,12 @@ class Abgabe extends FHCAPI_Controller
'getStudentProjektabgaben' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'),
'postStudentProjektarbeitZwischenabgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'),
'postStudentProjektarbeitEndupload' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'),
+ 'postStudentProjektarbeitTitel' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'),
'getMitarbeiterProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
'postProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
+ 'patchProjektarbeitAbgabeMultiple' => array('basis/abgabe_assistenz:rw'),
'deleteProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
+ 'deleteProjektarbeitAbgabeMultiple' => array('basis/abgabe_assistenz:rw'),
'postSerientermin' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
'fetchDeadlines' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
'getPaAbgabetypen' => self::PERM_LOGGED,
@@ -46,7 +49,9 @@ class Abgabe extends FHCAPI_Controller
'getStudiengaenge' => array('basis/abgabe_assistenz:rw'),
'getStudentProjektarbeitAbgabeFile' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
'postStudentProjektarbeitZusatzdaten' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
- 'getSignaturStatusForProjektarbeitAbgaben' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw')
+ 'getSignaturStatusForProjektarbeitAbgaben' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
+ 'sendZweitbetreuerTokenMail' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
+ 'fetchProjektarbeitenHistory' => array('basis/abgabe_assistenz:rw')
]);
$this->load->library('PhrasesLib');
@@ -90,6 +95,7 @@ class Abgabe extends FHCAPI_Controller
$ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT');
$ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER = $this->config->item('ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER');
$BETREUER_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('BETREUER_SAMMELMAIL_BUTTON_STUDENT');
+ $MULTIEDIT_TABLE = $this->config->item('MULTIEDIT_TABLE');
$ret = array(
'old_abgabe_beurteilung_link' => $old_abgabe_beurteilung_link,
@@ -98,6 +104,7 @@ class Abgabe extends FHCAPI_Controller
'ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT' => $ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT,
'ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER' => $ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER,
'BETREUER_SAMMELMAIL_BUTTON_STUDENT' => $BETREUER_SAMMELMAIL_BUTTON_STUDENT,
+ 'MULTIEDIT_TABLE' => $MULTIEDIT_TABLE,
);
$this->terminateWithSuccess($ret);
@@ -107,10 +114,18 @@ class Abgabe extends FHCAPI_Controller
* loads config related to abgabetool for students to avoid handing out links reserved for employees
*/
public function getConfigStudent() {
- $moodle_link =$this->config->item('STG_MOODLE_LINK');
-
+ $moodle_link = $this->config->item('STG_MOODLE_LINK');
+ $title_edit_allowed = $this->config->item('STUDENT_EDIT_PROJEKTARBEIT_TITLE');
+ $confetti_on_endupload = $this->config->item('CONFETTI_ON_ENDUPLOAD');
+ $siginfolink_german = $this->config->item('SIGNATUR_INFO_LINK_GERMAN');
+ $siginfolink_english = $this->config->item('SIGNATUR_INFO_LINK_ENGLISH');
+
$ret = array(
'moodle_link' => $moodle_link,
+ 'title_edit_allowed' => $title_edit_allowed,
+ 'confetti_on_endupload' => $confetti_on_endupload,
+ 'siginfolink_german' => $siginfolink_german,
+ 'siginfolink_english' => $siginfolink_english
);
$this->terminateWithSuccess($ret);
@@ -146,23 +161,26 @@ class Abgabe extends FHCAPI_Controller
}
$data = getData($res)[0];
$student_uid = $data->uid;
-
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
- if(getAuthUID() == $student_uid || $zugeordnet) {
- $projektarbeitIsCurrent = false;
- $returnFunc = function ($result) use (&$projektarbeitIsCurrent) {
- $projektarbeitIsCurrent = $result;
- };
- Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc);
-
- $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id);
-
- foreach ($ret->retval as $termin) {
- $this->checkAbgabeSignatur($termin, $projektarbeit->student_uid);
- }
-
- $this->terminateWithSuccess(array($ret, $projektarbeitIsCurrent));
+ $studiengang_kz = $data->studiengang_kz;
+
+ if(!$this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]));
}
+
+ $projektarbeitIsCurrent = false;
+ $returnFunc = function ($result) use (&$projektarbeitIsCurrent) {
+ $projektarbeitIsCurrent = $result;
+ };
+ Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc);
+
+ $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id);
+
+ foreach ($ret->retval as $termin) {
+ $this->checkAbgabeSignatur($termin, $projektarbeit->student_uid);
+ }
+
+ $this->terminateWithSuccess(array($ret, $projektarbeitIsCurrent));
+
}
/**
@@ -188,7 +206,7 @@ class Abgabe extends FHCAPI_Controller
$result = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer(getAuthUID());
}
- $projektarbeiten = getData($result);
+ $projektarbeiten = hasData($result) ? getData($result) : array();
if(count($projektarbeiten)) {
foreach($projektarbeiten as $pa) {
@@ -275,6 +293,8 @@ class Abgabe extends FHCAPI_Controller
if(count($data) > 0) {
$pa->zweitbetreuer = $data[0];
}
+
+ $pa->zweitbetreuer_mail = $this->getProjektbetreuerEmailByPersonID($pa->zweitbetreuer_person_id);
}
}
}
@@ -293,55 +313,62 @@ class Abgabe extends FHCAPI_Controller
$projektarbeit_id = $this->input->post('projektarbeit_id');
$paabgabe_id = $this->input->post('paabgabe_id');
- $student_uid = $this->input->post('student_uid');
- $bperson_id = $this->input->post('bperson_id');
$paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz');
if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
|| $paabgabe_id === NULL || trim((string)$paabgabe_id) === ''
- || $student_uid === NULL || trim((string)$student_uid) === ''
|| $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '') {
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
}
$this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
- if(getAuthUID() == $student_uid || $zugeordnet) {
+ if(!$this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]));
+ }
+ $path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
- $path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
-
- if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) {
- move_uploaded_file($_FILES['file']['tmp_name'], $path);
-
- if(file_exists($path)) {
-
- chmod($path, 0640);
-
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
- $res = $this->PaabgabeModel->update($paabgabe_id, array(
- 'abgabedatum' => date('Y-m-d'),
- 'updatevon' => getAuthUID(),
- 'updateamum' => date('Y-m-d H:i:s')
- ));
-
- $this->logLib->logInfoDB(array('zwischenupload',$res, array(
- 'abgabedatum' => date('Y-m-d'),
- 'updatevon' => getAuthUID(),
- 'updateamum' => date('Y-m-d H:i:s')
- ), getAuthUID(), getAuthPersonId(), $student_uid));
-
- $this->terminateWithSuccess($res);
- } else {
- $this->terminateWithError('Error moving File', 'general');
- }
-
+ if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) {
+ move_uploaded_file($_FILES['file']['tmp_name'], $path);
+
+ if(file_exists($path)) {
+
+ chmod($path, 0640);
+
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+ $res = $this->PaabgabeModel->update($paabgabe_id, array(
+ 'abgabedatum' => date('Y-m-d'),
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ));
+
+ $this->logLib->logInfoDB(array('zwischenupload',$res, array(
+ 'abgabedatum' => date('Y-m-d'),
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ), getAuthUID(), getAuthPersonId(), $student_uid));
+
+ $this->terminateWithSuccess($res);
} else {
- $this->terminateWithError('File missing', 'general');
+ $this->terminateWithError('Error moving File', 'general');
}
+
} else {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'));
+ $this->terminateWithError('File missing', 'general');
}
}
@@ -355,7 +382,6 @@ class Abgabe extends FHCAPI_Controller
$projektarbeit_id = $this->input->post('projektarbeit_id');
$paabgabe_id = $this->input->post('paabgabe_id');
- $student_uid = $this->input->post('student_uid');
$sprache = $this->input->post('sprache');
$abstract = $this->input->post('abstract');
$abstract_en = $this->input->post('abstract_en');
@@ -367,7 +393,6 @@ class Abgabe extends FHCAPI_Controller
if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
|| $paabgabe_id === NULL || trim((string)$paabgabe_id) === ''
- || $student_uid === NULL || trim((string)$student_uid) === ''
|| $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === ''
|| $abstract === NULL || $abstract_en === NULL
|| $schlagwoerter === NULL || $schlagwoerter_en === NULL
@@ -379,76 +404,317 @@ class Abgabe extends FHCAPI_Controller
$this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
- if(getAuthUID() == $student_uid || $zugeordnet) {
- if ((isset($_FILES) and isset($_FILES['file']) and !$_FILES['file']['error'])) {
- move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf');
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ if(!$this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]));
+ }
- if (file_exists(PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf')) {
+ if ((isset($_FILES) and isset($_FILES['file']) and !$_FILES['file']['error'])) {
+ move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf');
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ if (file_exists(PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf')) {
- $result = $this->ProjektarbeitModel->load($projektarbeit_id);
- $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general');
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
- if (count($projektarbeitArr) > 0) {
- $projektarbeit = $projektarbeitArr[0];
- } else {
- $this->terminateWithError($this->p->t('abgabetool', 'c4projektarbeitNichtGefunden'), 'general');
- }
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+ $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general');
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
- $result = $this->PaabgabeModel->load($paabgabe_id);
- $paabgabeArr = $this->getDataOrTerminateWithError($result, 'general');
-
- if (count($paabgabeArr) > 0) {
- $paabgabe = $paabgabeArr[0];
- } else {
- $this->terminateWithError($this->p->t('abgabetool', 'c4projektabgabeNichtGefunden'), 'general');
- }
-
- $this->checkAbgabeSignatur($paabgabe, $projektarbeit->student_uid);
- $signaturstatus = $paabgabe->signatur;
-
- // update projektarbeit cols
- $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id, $sprache, $abstract, $abstract_en
- , $schlagwoerter, $schlagwoerter_en, $seitenanzahl);
-
-
- // update paabgabe datum
- $res = $this->PaabgabeModel->update($paabgabe_id, array(
- 'abgabedatum' => date('Y-m-d'),
- 'updatevon' => getAuthUID(),
- 'updateamum' => date('Y-m-d H:i:s')
- ));
-
- $res = $this->PaabgabeModel->load($res->retval);
- $abgabe = getData($res)[0];
- $abgabe->signatur = $signaturstatus;
-
- $this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
-
- $this->logLib->logInfoDB(array('endupload', $res, array(
- 'abgabedatum' => date('Y-m-d'),
- 'updatevon' => getAuthUID(),
- 'updateamum' => date('Y-m-d H:i:s')
- ), getAuthUID(), getAuthPersonId(), array($projektarbeit_id, $sprache, $abstract, $abstract_en
- , $schlagwoerter, $schlagwoerter_en, $seitenanzahl)));
-
- $this->terminateWithSuccess($abgabe);
+ if (count($projektarbeitArr) > 0) {
+ $projektarbeit = $projektarbeitArr[0];
} else {
- $this->terminateWithError('Error moving File', 'general');
+ $this->terminateWithError($this->p->t('abgabetool', 'c4projektarbeitNichtGefunden'), 'general');
}
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+ $result = $this->PaabgabeModel->load($paabgabe_id);
+ $paabgabeArr = $this->getDataOrTerminateWithError($result, 'general');
+
+ if (count($paabgabeArr) > 0) {
+ $paabgabe = $paabgabeArr[0];
+ } else {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4projektabgabeNichtGefunden'), 'general');
+ }
+
+ $this->checkAbgabeSignatur($paabgabe, $projektarbeit->student_uid);
+ $signaturstatus = $paabgabe->signatur;
+
+ // update projektarbeit cols with zusatzdaten AND abgabedatum!
+ $this->ProjektarbeitModel->update($projektarbeit->projektarbeit_id, array(
+ 'sprache' => $sprache,
+ 'seitenanzahl' => $seitenanzahl,
+ 'abgabedatum' => date('Y-m-d'),
+ 'schlagwoerter_en' => $schlagwoerter_en,
+ 'schlagwoerter' => $schlagwoerter,
+ 'abstract' => $abstract,
+ 'abstract_en' => $abstract_en
+ ));
+
+
+ // update paabgabe datum
+ $res = $this->PaabgabeModel->update($paabgabe_id, array(
+ 'abgabedatum' => date('Y-m-d'),
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ));
+
+ $res = $this->PaabgabeModel->load($res->retval);
+ $abgabe = getData($res)[0];
+ $abgabe->signatur = $signaturstatus;
+
+ $this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
+
+ $this->logLib->logInfoDB(array('endupload', $res, array(
+ 'abgabedatum' => date('Y-m-d'),
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ), getAuthUID(), getAuthPersonId(), array($projektarbeit_id, $sprache, $abstract, $abstract_en
+ , $schlagwoerter, $schlagwoerter_en, $seitenanzahl)));
+
+ $this->terminateWithSuccess($abgabe);
} else {
- $this->terminateWithError('File missing', 'general');
+ $this->terminateWithError('Error moving File', 'general');
}
+
} else {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'));
+ $this->terminateWithError('File missing', 'general');
}
}
-
+
+ /**
+ * POST METHOD
+ * allows a student (or assistenz on their behalf) to update the titel of their own projektarbeit.
+ * blocked once the projektarbeit has been graded (checkProjektarbeitForFinishedStatus).
+ */
+ public function postStudentProjektarbeitTitel()
+ {
+ if(!$this->config->item('STUDENT_EDIT_PROJEKTARBEIT_TITLE')) {
+ $this->terminateWithError($this->p->t('global', 'c4studentEditNotAllowed'), 'general');
+ };
+
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+ $titel = $this->input->post('titel');
+
+ if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
+ || $titel === NULL || trim((string)$titel) === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ // strip all HTML tags to prevent XSS in mail bodies, table views and Projektarbeitsbenotung
+ $titel = trim(strip_tags($titel));
+ if ($titel === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ // Reject emojis and pictographs
+ // allows foreign letters, math symbols, accents, and standard punctuation.
+ $emojiPattern = '/[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F900}-\x{1FAFF}\x{23E9}-\x{23EF}\x{2b50}\x{2700}-\x{27BF}]/u';
+
+ // i would like this much more but our server does not recognize this utf-8 character range this way, so hexcodes it is
+// if (preg_match('/\p{Extended_Pictographic}/u', $titel)) {
+ if (preg_match($emojiPattern, $titel)) {
+
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ // Verify the projektarbeit actually belongs to the supplied student_uid
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if (isError($res) || !hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4projektarbeitNichtGefunden'), 'general');
+ }
+ $assignedStudentUid = getData($res)[0]->uid;
+
+ // A student may only update their own title; assistenz is covered by checkZuordnung
+
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz);
+ if (getAuthUID() !== $assignedStudentUid && !$zugeordnet) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ }
+
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+ $data = getData($result);
+
+ $oldTitle = $data[0]->titel ?? '';
+
+ $result = $this->ProjektarbeitModel->update(
+ $projektarbeit_id,
+ array(
+ 'titel' => $titel,
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ )
+ );
+
+ $this->getDataOrTerminateWithError($result, 'general');
+
+ $this->logLib->logInfoDB(array(
+ 'titelUpdate',
+ array(
+ 'projektarbeit_id' => $projektarbeit_id,
+ 'titel' => $titel,
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ),
+ getAuthUID(),
+ getAuthPersonId()
+ ));
+
+ $this->sendTitelChangedEmail(
+ $projektarbeit_id,
+ $titel,
+ $oldTitle,
+ $assignedStudentUid
+ );
+
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+ $titel = hasData($result) ? getData($result)[0]->titel : $titel;
+ $this->terminateWithSuccess($titel);
+ }
+
+ /**
+ * Notifies all betreuer of a projektarbeit and all assistenzen responsible for its studiengang
+ * when a student updates the titel of their projektarbeit.
+ *
+ * Betreuer retrieval mirrors AbgabetoolJob->notifyBetreuerAboutChangedAbgaben.
+ * Assistenz retrieval mirrors AbgabetoolJob->notifyAssistenzAboutChangedAbgaben.
+ *
+ * @param int $projektarbeit_id
+ * @param string $new_titel The titel as it was saved
+ * @param string $student_uid
+ */
+ private function sendTitelChangedEmail($projektarbeit_id, $new_titel, $old_titel, $student_uid)
+ {
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
+ $this->load->model('person/Person_model', 'PersonModel');
+
+ $this->load->model('person/Person_model', 'PersonModel');
+ $studentNameResult = $this->PersonModel->getFullName($student_uid);
+ $studentFullName = hasData($studentNameResult) ? getData($studentNameResult) : $student_uid;
+
+ $studentInfoResult = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if (isError($studentInfoResult) || !hasData($studentInfoResult)) {
+ $this->logLib->logInfoDB(array('sendTitelChangedEmail: student info not found', $projektarbeit_id));
+ return;
+ }
+ $studentInfo = getData($studentInfoResult)[0];
+ $studiengang_kz = $studentInfo->studiengang_kz;
+
+ $stgResult = $this->StudiengangModel->load($studiengang_kz);
+ $oe_kurzbz = null;
+ if (!isError($stgResult) && hasData($stgResult)) {
+ $oe_kurzbz = getData($stgResult)[0]->oe_kurzbz ?? null;
+ }
+
+ // build shared mail data
+ $base_mail_data = array(
+ 'studentFullName' => $studentFullName,
+ 'new_titel' => $new_titel,
+ 'old_titel' => $old_titel
+ );
+
+ // notify all betreuer
+ $betreuerResult = $this->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id);
+ if (!isError($betreuerResult) && hasData($betreuerResult)) {
+
+ $linkAbgabetool = APP_ROOT . $this->config->item('URL_MITARBEITER');
+
+ foreach (getData($betreuerResult) as $betreuer) {
+ $email = $betreuer->uid ? $betreuer->uid . '@' . DOMAIN : ($betreuer->private_email ?? null);
+ if (!$email) {
+ $this->logLib->logInfoDB(array('sendTitelChangedEmail: no email for betreuer', $betreuer->person_id));
+ continue;
+ }
+
+ $anredeResult = $this->ProjektarbeitModel->getProjektbetreuerAnrede($betreuer->person_id);
+ $anrede = (!isError($anredeResult) && hasData($anredeResult)) ? getData($anredeResult)[0] : null;
+
+ $mail_data = array_merge($base_mail_data, array(
+ 'anredeFillString' => ($anrede->anrede ?? '') === 'Herr' ? 'r' : '',
+ 'anrede' => $anrede->anrede ?? '',
+ 'fullFormattedNameString' => $anrede->first ?? $email,
+ 'linkAbgabetool' => $linkAbgabetool,
+ ));
+
+ sendSanchoMail(
+ 'PATitleUpdated',
+ $mail_data,
+ $email,
+ $this->p->t('abgabetool', 'c4PATitleChanged')
+ );
+ }
+ }
+
+ // notify assistenz for the studiengang OE
+ if (!$oe_kurzbz) {
+ $this->logLib->logInfoDB(array('sendTitelChangedEmail: no oe_kurzbz resolved, skipping assistenz', $studiengang_kz));
+ return;
+ }
+
+ $assistenzResult = $this->OrganisationseinheitModel->getAssistenzForOE($oe_kurzbz);
+ if (isError($assistenzResult) || !hasData($assistenzResult)) {
+ return;
+ }
+
+ $linkAbgabetool = APP_ROOT . $this->config->item('URL_ASSISTENZ');
+
+ // similar pattern as job uses via the assistenzMap
+ $sentTo = [];
+ foreach (getData($assistenzResult) as $assistenz) {
+ if (in_array($assistenz->person_id, $sentTo)) {
+ continue;
+ }
+ $sentTo[] = $assistenz->person_id;
+
+ $email = $assistenz->uid . '@' . DOMAIN;
+
+ $mail_data = array_merge($base_mail_data, array(
+ 'anredeFillString' => $assistenz->anrede === 'Herr' ? 'r' : '',
+ 'anrede' => $assistenz->anrede ?? '',
+ 'fullFormattedNameString' => $assistenz->first ?? ($assistenz->uid . '@' . DOMAIN),
+ 'linkAbgabetool' => $linkAbgabetool,
+ ));
+
+ sendSanchoMail(
+ 'PATitleUpdated',
+ $mail_data,
+ $email,
+ $this->p->t('abgabetool', 'c4PATitleChanged')
+ );
+ }
+ }
+
+
// validate paabgabe deadline against servertime just in case a student spoofs their local clock and thus
// unlocks the upload ui
private function checkPaabgabeDeadline($paabgabe_id) {
@@ -504,7 +770,7 @@ class Abgabe extends FHCAPI_Controller
$showAllBool = false;
}
- $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool);
+ $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthPersonId(), $showAllBool);
$mapFunc = function($projektarbeit) {
@@ -519,20 +785,18 @@ class Abgabe extends FHCAPI_Controller
forEach($projektarbeiten->retval as $pa) {
- $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($pa->betreuer_person_id);
- $anredeArr = $this->getDataOrTerminateWithError($result, 'general');
- $pa->betreuer = $anredeArr[0];
-
$oldLink = ''; // show this when paIsCurrent == false -> moodle course template
$newLink = ''; // get curated path for betreuer type
- $returnFunc = function ( $resultOld, $resultNew) use (&$oldLink, &$newLink) {
+ $returnFunc = function ($resultOld, $resultNew) use (&$oldLink, &$newLink) {
$newLink = $resultNew;
$oldLink = $resultOld;
};
- Events::trigger('projektbeurteilung_formular_link', $pa->betreuerart_kurzbz, APP_ROOT, $pa->projektarbeit_id, $pa->student_uid, $returnFunc);
+ $own_betreuerart_kurzbz = $pa->betreuer_person_id == getAuthPersonId() ? $pa->betreuer_betreuerart_kurzbz : $pa->zweitbetreuer_betreuerart_kurzbz;
+ Events::trigger('projektbeurteilung_formular_link', $own_betreuerart_kurzbz, APP_ROOT, $pa->projektarbeit_id, $pa->student_uid, $returnFunc);
$pa->beurteilungLinkNew = $newLink;
$pa->beurteilungLinkOld = $oldLink;
+ $pa->betreuerart_kurzbz = $own_betreuerart_kurzbz;
// has previously been retrieved via getStudentProjektabgaben but is fetched in advance to avoid having to reload abgaben
$projektarbeitIsCurrent = false;
@@ -579,9 +843,22 @@ class Abgabe extends FHCAPI_Controller
$this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz);
if(!$zugeordnet) {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'));
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]));
}
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
@@ -618,12 +895,22 @@ class Abgabe extends FHCAPI_Controller
// load existing entry of paabgabe and check if note has changed to negativ, to avoid sending when
// only notiz has changed.
- // TODO: what if paabgabe is a qualgate1, is benotet negativ and then its type is changed to gate2?
-
$existingResult = $this->PaabgabeModel->load($paabgabe_id);
$existingPaabgabeArr = getData($existingResult);
if(count($existingPaabgabeArr) > 0) $existingPaabgabe = $existingPaabgabeArr[0];
+ if($existingPaabgabe->note !== null || $existingPaabgabe->abgabedatum !== null) {
+ // check if a change of paabgabetyp is being attempted -> not allowed at this point
+ if($paabgabetyp_kurzbz !== $existingPaabgabe->paabgabetyp_kurzbz) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4abgabetypAendernNichtErlaubt'));
+ }
+
+ // check if a change of deadline aka datum is being attempted -> notallowed at this point
+ if($datum !== $existingPaabgabe->datum) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4datumAendernNichtErlaubt'));
+ }
+ }
+
$result = $this->PaabgabeModel->update(
$paabgabe_id,
array(
@@ -687,6 +974,112 @@ class Abgabe extends FHCAPI_Controller
$this->terminateWithSuccess([$paabgabe, $existingPaabgabe]);
}
+ /**
+ * called by abgabetool/assistenz when bulk-editing multiple abgabetermine via the flat termine table view
+ * only fields present in the payload are updated - absent fields are left untouched
+ */
+ public function patchProjektarbeitAbgabeMultiple() {
+ $paabgabe_ids = $this->input->post('paabgabe_ids');
+
+ if ($paabgabe_ids === NULL || !is_array($paabgabe_ids) || count($paabgabe_ids) === 0) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ // collect only fields that were actually sent
+ $updateFields = [];
+
+ $datum = $this->input->post('datum');
+ if ($datum !== NULL && trim((string)$datum) !== '') {
+ $updateFields['datum'] = $datum;
+ }
+
+ $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz');
+ if ($paabgabetyp_kurzbz !== NULL && trim((string)$paabgabetyp_kurzbz) !== '') {
+ $updateFields['paabgabetyp_kurzbz'] = $paabgabetyp_kurzbz;
+ }
+
+ $kurzbz = $this->input->post('kurzbz');
+ if ($kurzbz !== NULL) {
+ $updateFields['kurzbz'] = $kurzbz;
+ }
+
+ // booleans: only include if explicitly posted
+ $upload_allowed = $this->input->post('upload_allowed');
+ if ($upload_allowed !== NULL) {
+ $updateFields['upload_allowed'] = filter_var($upload_allowed, FILTER_VALIDATE_BOOLEAN);
+ }
+
+ $fixtermin = $this->input->post('fixtermin');
+ if ($fixtermin !== NULL) {
+ $updateFields['fixtermin'] = filter_var($fixtermin, FILTER_VALIDATE_BOOLEAN);
+ }
+
+ if (empty($updateFields)) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+
+ $results = [];
+ foreach ($paabgabe_ids as $paabgabe_id) {
+ $paabgabe_id = trim((string)$paabgabe_id);
+
+ if ($paabgabe_id === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id);
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz);
+ if (!$zugeordnet) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ }
+
+ $paabgabeResult = $this->PaabgabeModel->load($paabgabe_id);
+ $paabgabeArr = $this->getDataOrTerminateWithError($paabgabeResult, 'general');
+
+ if (count($paabgabeArr) === 0) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $result = $this->PaabgabeModel->update(
+ $paabgabe_id,
+ array_merge($updateFields, [
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ])
+ );
+
+ $this->getDataOrTerminateWithError($result, 'general');
+ $results[] = getData($this->PaabgabeModel->load($paabgabe_id))[0];
+
+ $this->logLib->logInfoDB(array(
+ 'paabgabe bulk updated',
+ $paabgabe_id,
+ $updateFields,
+ getAuthUID(),
+ getAuthPersonId()
+ ));
+ }
+
+ $this->terminateWithSuccess($results);
+ }
+
/**
* called by abgabetool/mitarbeiter in mitarbeiterdetail.js when deleting an abgabetermin
* deletion is only possible if user is assistenz OR betreuer deletes their own custom termin
@@ -699,12 +1092,28 @@ class Abgabe extends FHCAPI_Controller
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
}
- $this->checkProjektarbeitForFinishedStatus($this->getProjektarbeitIDForPaabgabeID($paabgabe_id));
+ $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id);
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
- $zugeordnet = $this->checkZuordnungByPaabgabe($paabgabe_id, getAuthUID());
+
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnungByPaabgabe($paabgabe_id, getAuthUID(), $student_uid, $studiengang_kz);
if(!$zugeordnet) {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]), 'general');
}
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
@@ -719,11 +1128,69 @@ class Abgabe extends FHCAPI_Controller
$result = $this->PaabgabeModel->delete($paabgabe_id);
$result = $this->getDataOrTerminateWithError($result, 'general');
- // TODO: consider this in nightly email job
$this->logLib->logInfoDB(array($paabgabeArr[0], getAuthUID(), getAuthPersonId()));
$this->terminateWithSuccess($result);
}
+ /**
+ * called by abgabetool/assistenz when deleting multiple abgabetermine via the flat termine table view
+ */
+ public function deleteProjektarbeitAbgabeMultiple() {
+ $paabgabe_ids = $this->input->post('paabgabe_ids');
+
+ if ($paabgabe_ids === NULL || !is_array($paabgabe_ids) || count($paabgabe_ids) === 0) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+
+ $results = [];
+ foreach ($paabgabe_ids as $paabgabe_id) {
+ $paabgabe_id = trim((string)$paabgabe_id);
+
+ if ($paabgabe_id === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->checkProjektarbeitForFinishedStatus($this->getProjektarbeitIDForPaabgabeID($paabgabe_id));
+
+ $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id);
+
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnungByPaabgabe($paabgabe_id, getAuthUID(), $student_uid, $studiengang_kz);
+
+ if (!$zugeordnet) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ }
+
+ $paabgabeResult = $this->PaabgabeModel->load($paabgabe_id);
+ $paabgabeArr = $this->getDataOrTerminateWithError($paabgabeResult, 'general');
+
+ if (count($paabgabeArr) == 0) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $result = $this->PaabgabeModel->delete($paabgabe_id);
+ $result = $this->getDataOrTerminateWithError($result, 'general');
+ $results[] = $result;
+
+ $this->logLib->logInfoDB(array($paabgabeArr[0], getAuthUID(), getAuthPersonId()));
+ }
+
+ $this->terminateWithSuccess($results);
+ }
+
/**
* endpoint for adding the same paabgabe for multiple projektarbeiten
* can be slow for large n since it queries twice per projektarbeit_id
@@ -757,16 +1224,27 @@ class Abgabe extends FHCAPI_Controller
// and should never unintentionally happen
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- $res = [];
+
$abgaben = [];
foreach ($projektarbeit_ids as $projektarbeit_id) {
$this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz);
if(!$zugeordnet) {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]), 'general');
}
$result = $this->PaabgabeModel->insert(
@@ -847,10 +1325,10 @@ class Abgabe extends FHCAPI_Controller
private function getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id) {
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$result = $this->ProjektarbeitModel->getProjektbetreuerEmail($projektarbeit_id);
- if(count($result->retval) > 0) {
+ if(hasData($result)) {
$email = getData($result);
return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email;
- } else return '';
+ } else return null;
}
@@ -861,9 +1339,12 @@ class Abgabe extends FHCAPI_Controller
private function getProjektbetreuerEmailByPersonID($person_id) {
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$result = $this->ProjektarbeitModel->getProjektbetreuerEmailByPersonID($person_id);
- $email = $this->getDataOrTerminateWithError($result, 'general');
-
- return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email;
+ if(hasData($result)) {
+ $email = getData($result);
+ return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email;
+ } else {
+ return null;
+ }
}
//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API
@@ -1034,30 +1515,34 @@ class Abgabe extends FHCAPI_Controller
$projektarbeit_id = $this->input->get('projektarbeit_id');
$paabgabe_id = $this->input->get('paabgabe_id');
- $student_uid = $this->input->get('student_uid');
if ($paabgabe_id === NULL || trim((string)$paabgabe_id) === ''
- || $projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
- || $student_uid === NULL || trim((string)$student_uid) === '') {
+ || $projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '') {
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
}
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- // zuordnung function is supposed for mitarbeiter_uids, students should be allowed to download their own files
- // without adapting zuordnung logic
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
- if(getAuthUID() == $student_uid || $zugeordnet) {
- $file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
-
-
- if(file_exists($file_path)) {
- $this->terminateWithFileOutput('application/octet-stream', file_get_contents($file_path), basename($file_path));
- } else {
- $this->terminateWithError('File not found', 'general');
- }
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ if(!$this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz)){
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]), 'general');
+ }
+
+ $file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
+
+ if(file_exists($file_path)) {
+ $this->terminateWithFileOutput('application/octet-stream', file_get_contents($file_path), basename($file_path));
} else {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ $this->terminateWithError('File not found', 'general');
}
}
@@ -1101,14 +1586,33 @@ class Abgabe extends FHCAPI_Controller
$this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz);
if(!$zugeordnet) {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]), 'general');
}
- // update projektarbeit cols
- $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en
- ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl);
+ // update projektarbeit cols with zusatzdaten only
+ $this->ProjektarbeitModel->update($projektarbeit_id, array(
+ 'sprache' => $sprache,
+ 'seitenanzahl' => $seitenanzahl,
+ 'schlagwoerter_en' => $schlagwoerter_en,
+ 'schlagwoerter' => $schlagwoerter,
+ 'abstract' => $abstract,
+ 'abstract_en' => $abstract_en
+ ));
$this->logLib->logInfoDB(array('zusatzdatenEditMitarbeiter', array(
'updatevon' => getAuthUID(),
@@ -1144,6 +1648,69 @@ class Abgabe extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
+ public function sendZweitbetreuerTokenMail() {
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+ $bperson_id = $this->input->post('bperson_id');
+
+
+ if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
+ || $bperson_id === NULL || trim((string)$bperson_id) === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz);
+ if(!$zugeordnet) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'));
+ }
+
+ $this->sendUploadEmailZweitbegutachterToken($bperson_id, $projektarbeit_id, $student_uid);
+ }
+
+ // basically what getStudentProjektarbeiten intends to do for the student page but
+ // designed for the assistenz timeline component -> more extensive loading upfront
+ // with every abgabetermin fetched here aswell
+ public function fetchProjektarbeitenHistory() {
+ $student_uid = $this->input->post('student_uid');
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ $projektarbeiten = $this->ProjektarbeitModel->getProjektarbeitenForStudent($student_uid);
+
+ $mapFunc = function($projektarbeit) {
+ return $projektarbeit->projektarbeit_id;
+ };
+ $projektarbeiten_ids = array_map($mapFunc, $projektarbeiten->retval);
+
+ if(count($projektarbeiten_ids) > 0) {
+ $ret = $this->ProjektarbeitModel->getProjektarbeitenAbgabetermine($projektarbeiten_ids);
+ $projektabgaben = $this->getDataOrTerminateWithError($ret, 'general');
+ }
+
+ forEach($projektarbeiten->retval as $pa) {
+
+ $filterFunc = function($projektabgabe) use ($pa) {
+ return $projektabgabe->projektarbeit_id == $pa->projektarbeit_id;
+ };
+
+ $pa->abgabetermine = array_values(array_filter($projektabgaben, $filterFunc));
+ }
+
+ $this->terminateWithSuccess($projektarbeiten->retval);
+ }
+
/**
* helper function to check the signature status of uploaded files for zwischenabgabe & endupload
*/
@@ -1206,14 +1773,7 @@ class Abgabe extends FHCAPI_Controller
};
Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc);
if(!$projektarbeitIsCurrent) {
- $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general');
- }
-
- // Link to Abgabetool
- if (defined('CIS4') && CIS4) {
- $ci3BootstrapFilePath = "cis.php";
- } else {
- $ci3BootstrapFilePath = "index.ci.php";
+ $this->terminateWithError($this->p->t('abgabetool','c4fehlerPAIsNotCurrent'), 'general');
}
$path = $this->config->item('URL_MITARBEITER');
@@ -1227,7 +1787,6 @@ class Abgabe extends FHCAPI_Controller
// 1. Begutachter mail ohne Token
$mail_baselink = APP_ROOT.$this->config->item('PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER');
-// $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter";
$mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
$projekttyp_kurzbz = $projektarbeit->projekttyp_kurzbz;
$subject = $projektarbeit->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung';
@@ -1247,7 +1806,7 @@ class Abgabe extends FHCAPI_Controller
$email = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id);
if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
-
+
$mailres = sendSanchoMail(
'ParbeitsbeurteilungEndupload',
$maildata,
@@ -1265,89 +1824,115 @@ class Abgabe extends FHCAPI_Controller
// 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern
if ($paabgabetyp_kurzbz == 'end')
{
- // Zweitbegutachter holen
- $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
- $zweitbegutachterRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid));
+ $this->sendUploadEmailZweitbegutachterToken($bperson_id, $projektarbeit_id, $studentUser->uid);
- if ($zweitbegutachterRetval && count($zweitbegutachterRetval) > 0)
- {
-
- foreach ($zweitbegutachterRetval as $begutachter)
- {
- // token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft)
- $tokenGenRes = $this->ProjektbetreuerModel->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id);
-
- if (!$tokenGenRes)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
- }
-
- $begutachterMitTokenRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id));
-
- if (!$begutachterMitTokenRetval && count($begutachterMitTokenRetval) <= 0)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
- }
-
- $begutachterMitToken = $begutachterMitTokenRetval[0];
-
- $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter';
- $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path";
- $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
- $intern = isset($begutachterMitToken->uid);
- $mail_link = $intern ? $mail_fulllink : $mail_baselink;
-
- $zweitbetmaildata = array();
- $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : "");
- $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede;
- $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name;
- $zweitbetmaildata['student_anrede'] = $maildata['student_anrede'];
- $zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name'];
- $zweitbetmaildata['abgabetyp'] = $abgabetyp;
- $zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : "";
- $zweitbetmaildata['bewertunglink'] = $projektarbeitIsCurrent ? "
Zur Beurteilung der Arbeit
" : "";
- $zweitbetmaildata['token'] = $projektarbeitIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "Zugangstoken: " . $begutachterMitToken->zugangstoken . "
" : "";
-
- $mailres = sendSanchoMail(
- 'ParbeitsbeurteilungEndupload',
- $zweitbetmaildata,
- $begutachterMitToken->email,
- $subject,
- 'sancho_header_min_bw.jpg',
- 'sancho_footer_min_bw.jpg',
- get_uid()."@".DOMAIN
- );
-
- if (!$mailres)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
- }
-
- }
- }
}
}
}
- private function checkZuordnung($projektarbeit_id, $betreuer_uid) {
+ private function sendUploadEmailZweitbegutachterToken($bperson_id, $projektarbeit_id, $student_uid) {
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $projektarbeitArr = $this->getDataOrTerminateWithError($this->ProjektarbeitModel->load($projektarbeit_id));
+ if(count($projektarbeitArr) > 0) {
+ $projektarbeit = $projektarbeitArr[0];
+ } else {
+ $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general');
+ }
+
+ // Zweitbegutachter holen
+ $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
+ $zweitbegutachterRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $student_uid));
+
+ $projektarbeitIsCurrent = false;
+ $returnFunc = function ($result) use (&$projektarbeitIsCurrent) {
+ $projektarbeitIsCurrent = $result;
+ };
+ Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc);
+ if(!$projektarbeitIsCurrent) {
+ $this->terminateWithError($this->p->t('abgabetool','c4fehlerPAIsNotCurrent'), 'general');
+ }
+
+ if ($zweitbegutachterRetval && count($zweitbegutachterRetval) > 0)
+ {
+
+ foreach ($zweitbegutachterRetval as $begutachter)
+ {
+ // token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft)
+ $tokenGenRes = $this->ProjektbetreuerModel->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id);
+
+ if (!$tokenGenRes)
+ {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
+ }
+
+ $begutachterMitTokenRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $student_uid, $begutachter->person_id));
+
+ if (!$begutachterMitTokenRetval && count($begutachterMitTokenRetval) <= 0)
+ {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
+ }
+
+ $begutachterMitToken = $begutachterMitTokenRetval[0];
+
+ $studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0];
+
+ $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter';
+ $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path";
+ $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$student_uid;
+ $intern = isset($begutachterMitToken->uid);
+ $mail_link = $intern ? $mail_fulllink : $mail_baselink;
+
+ // automatic email ensures that, client only exposes this method if that happened already
+ $paabgabetyp_kurzbz = 'end';
+ $abgabetyp = $paabgabetyp_kurzbz == 'end' ? 'Endabgabe' : 'Zwischenabgabe';
+
+ $path = $this->config->item('URL_MITARBEITER');
+ $url = APP_ROOT.$path;
+
+ $subject = $projektarbeit->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung';
+
+ $zweitbetmaildata = array();
+ $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : "");
+ $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede;
+ $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name;
+ $zweitbetmaildata['student_anrede'] = $studentUser->anrede;
+ $zweitbetmaildata['student_voller_name'] = trim($studentUser->titelpre." ".$studentUser->vorname." ".$studentUser->nachname." ".$studentUser->titelpost);
+ $zweitbetmaildata['abgabetyp'] = $abgabetyp;
+ $zweitbetmaildata['parbeituebersichtlink'] = $intern ? "Zur Projektarbeitsübersicht
" : "";
+ $zweitbetmaildata['bewertunglink'] = $projektarbeitIsCurrent ? "Zur Beurteilung der Arbeit
" : "";
+ $zweitbetmaildata['token'] = $projektarbeitIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "Zugangstoken: " . $begutachterMitToken->zugangstoken . "
" : "";
+
+ $this->addMeta('$zweitbetmaildata', $zweitbetmaildata);
+
+ $mailres = sendSanchoMail(
+ 'ParbeitsbeurteilungEndupload',
+ $zweitbetmaildata,
+ $begutachterMitToken->email,
+ $subject,
+ 'sancho_header_min_bw.jpg',
+ 'sancho_footer_min_bw.jpg',
+ get_uid()."@".DOMAIN
+ );
+
+ if (!$mailres)
+ {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
+ }
+
+ }
+ }
+ }
+
+ private function checkZuordnung($projektarbeit_id, $auth_uid, $student_uid, $studiengang_kz) {
// check if authenticated user is zugewiesen as betreuer to projektarbeit or has admin/assistenz berechtigung
// over the studiengang of the student working on that projektarbeit_id
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
- $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
- if(isError($res)) {
- $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
- }
+ // student itself is always considered zugeordnet towards their own projektarbeit
+ if($auth_uid == $student_uid) return true;
- if(!hasData($res)) {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
- }
- $data = getData($res)[0];
- $student_uid = $data->uid;
- $studiengang_kz = $data->studiengang_kz;
-
- $res = $this->ProjektarbeitModel->checkZuordnung($student_uid, $betreuer_uid);
+ // if auth_uid is of a betreuer, look for actual betreuungszuordnung between those ids
+ $res = $this->ProjektarbeitModel->checkZuordnung($student_uid, $auth_uid);
if(isError($res)) {
$this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingBetreuerStudentZuordnung'), 'general');
}
@@ -1394,9 +1979,9 @@ class Abgabe extends FHCAPI_Controller
return $data->projektarbeit_id;
}
- private function checkZuordnungByPaabgabe($paabgabe_id, $betreuer_uid) {
+ private function checkZuordnungByPaabgabe($paabgabe_id, $auth_uid, $student_uid, $studiengang_kz) {
$projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id);
- return $this->checkZuordnung($projektarbeit_id, $betreuer_uid);
+ return $this->checkZuordnung($projektarbeit_id, $auth_uid, $student_uid, $studiengang_kz);
}
// loads a projektarbeit table row by id and looks if a note has been set. A non null note field
@@ -1411,7 +1996,13 @@ class Abgabe extends FHCAPI_Controller
$data = getData($res)[0];
if($data->note !== NULL) {
- $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general');
+ // hardcode this error msg cause phrasen arent reliable and people keep bugging why the cant edit old entries they definitely shouldnt update
+ $message = $this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeitv3');
+ if(strpos($message, "<<") === 0) { // phrase could not be loaded
+ $this->terminateWithError('Die Projektarbeit wurde bereits benotet, Sie dürfen deshalb keine weiteren Termine anlegen oder bearbeiten.', 'general');
+ } else {
+ $this->terminateWithError($message);
+ }
}
}
diff --git a/application/controllers/api/frontend/v1/Bookmark.php b/application/controllers/api/frontend/v1/Bookmark.php
index 3e646bb51..aa45709d4 100644
--- a/application/controllers/api/frontend/v1/Bookmark.php
+++ b/application/controllers/api/frontend/v1/Bookmark.php
@@ -18,6 +18,8 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
+use \DateTime as DateTime;
+
class Bookmark extends FHCAPI_Controller
{
@@ -28,111 +30,162 @@ class Bookmark extends FHCAPI_Controller
{
parent::__construct([
'getBookmarks' => self::PERM_LOGGED,
- 'delete' => self::PERM_LOGGED,
- 'insert' => self::PERM_LOGGED,
+ 'delete' => self::PERM_LOGGED,
+ 'insert' => self::PERM_LOGGED,
'update' => self::PERM_LOGGED,
- ]);
+ 'changeOrder' => self::PERM_LOGGED
+ ]);
$this->load->model('dashboard/Bookmark_model', 'BookmarkModel');
$this->uid = getAuthUID();
$this->pid = getAuthPersonID();
-
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
- /**
- * gets the bookmarks associated to a user
+ /**
+ * gets the bookmarks associated to a user
* @access public
* @return void
*/
public function getBookmarks()
{
- $this->BookmarkModel->addOrder("bookmark_id");
+ $this->BookmarkModel->addOrder("sort");
$bookmarks = $this->BookmarkModel->loadWhere(["uid"=>$this->uid]);
- $bookmarks = $this->getDataOrTerminateWithError($bookmarks);
+ $bookmarks = $this->getDataOrTerminateWithError($bookmarks);
- $this->terminateWithSuccess($bookmarks);
- }
-
- /**
- * deletes bookmark from associated user
- * @access public
- * @return void
- */
- public function delete($bookmark_id)
- {
- $bookmark = $this->BookmarkModel->load($bookmark_id);
-
- $bookmark = current($this->getDataOrTerminateWithError($bookmark));
-
- // only delete bookmark if the user is the owner of the bookmark
- if($bookmark->uid == $this->uid || $this->permissionlib->isBerechtigt('admin')){
-
- $delete_result = $this->BookmarkModel->delete($bookmark_id);
-
- $delete_result = $this->getDataOrTerminateWithError($delete_result);
-
- $this->terminateWithSuccess($delete_result);
- }else{
- $this->_outputAuthError(['delete' => ['admin:rw']]);
- }
- }
-
- /**
- * inserts new bookmark into the bookmark table
- * @access public
- * @return void
- */
- public function insert()
- {
- // form validation
- $this->load->library('form_validation');
- $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
- $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
- if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
-
- $url = $this->input->post('url',true);
- $title = $this->input->post('title',true);
- $tag = $this->input->post('tag', true);
-
- $insert_into_result = $this->BookmarkModel->insert(['uid'=>$this->uid, 'url'=>$url, 'title'=>$title,'tag'=>$tag, 'insertvon'=>$this->uid, 'updateamum'=>NULL, 'updatevon'=>NULL]);
-
- $insert_into_result = $this->getDataOrTerminateWithError($insert_into_result);
-
- $this->terminateWithSuccess($insert_into_result);
-
- }
+ $this->terminateWithSuccess($bookmarks);
+ }
/**
- * updates bookmark in the bookmark table
+ * deletes bookmark from associated user
* @access public
* @return void
*/
- public function update($bookmark_id)
+ public function delete($bookmark_id)
{
- // form validation
- $this->load->library('form_validation');
- $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
- $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
- if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
+ $bookmark = $this->BookmarkModel->load($bookmark_id);
- $url = $this->input->post('url',true);
- $title = $this->input->post('title',true);
+ $bookmark = current($this->getDataOrTerminateWithError($bookmark));
+
+ // only delete bookmark if the user is the owner of the bookmark
+ if ($bookmark->uid == $this->uid || $this->permissionlib->isBerechtigt('admin')) {
+ $delete_result = $this->BookmarkModel->delete($bookmark_id);
+
+ $delete_result = $this->getDataOrTerminateWithError($delete_result);
+
+ $this->terminateWithSuccess($delete_result);
+ } else {
+ $this->_outputAuthError(['delete' => ['admin:rw']]);
+ }
+ }
+
+ /**
+ * inserts new bookmark into the bookmark table
+ * @access public
+ * @return void
+ */
+ public function insert()
+ {
+ // form validation
+ $this->load->library('form_validation');
+ $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
+ $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $url = $this->input->post('url', true);
+ $title = $this->input->post('title', true);
+ $tag = $this->input->post('tag', true);
+ if (is_array($tag)) {
+ $tag = json_encode($tag); // convert PHP array to JSON string
+ }
+ $sort = $this->input->post('sort', true);
+
+ $insert_into_result = $this->BookmarkModel->insert([
+ 'uid' => $this->uid,
+ 'url' => $url,
+ 'title' => $title,
+ 'tag' => $tag,
+ 'insertvon' => $this->uid,
+ 'updateamum' => null,
+ 'updatevon' => null,
+ 'sort' => $sort
+ ]);
+
+ $insert_into_result = $this->getDataOrTerminateWithError($insert_into_result);
+
+ $this->terminateWithSuccess($insert_into_result);
+ }
+
+ /**
+ * updates bookmark in the bookmark table
+ * @access public
+ * @return void
+ */
+ public function update($bookmark_id)
+ {
+ // form validation
+ $this->load->library('form_validation');
+ $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
+ $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $url = $this->input->post('url', true);
+ $title = $this->input->post('title', true);
+ $tag = $this->input->post('tag', true);
+ if (is_array($tag)) {
+ $tag = json_encode($tag);
+ }
$now = new DateTime();
$now = $now->format('Y-m-d H:i:s');
- $update_result = $this->BookmarkModel->update($bookmark_id,['url'=>$url, 'title'=>$title,'updateamum'=>$now]);
+ $update_result = $this->BookmarkModel->update($bookmark_id, [
+ 'url' => $url,
+ 'title' => $title,
+ 'tag' => $tag,
+ 'updateamum' => $now
+ ]);
- $update_result = $this->getDataOrTerminateWithError($update_result);
+ $update_result = $this->getDataOrTerminateWithError($update_result);
- $this->terminateWithSuccess($update_result);
+ $this->terminateWithSuccess($update_result);
+ }
- }
+ /**
+ * changes sort of two bookmarks in the bookmark table
+ * @access public
+ * @return void
+ */
+ public function changeOrder($bookmark_id1, $bookmark_id2)
+ {
+ $update_result = [];
+
+ $result1 = $this->BookmarkModel->load($bookmark_id1);
+ $data1 = $this->getDataOrTerminateWithError($result1);
+ $sort1 = current($data1)->sort;
+
+ $result2 = $this->BookmarkModel->load(["bookmark_id"=>$bookmark_id2]);
+ $data2 = $this->getDataOrTerminateWithError($result2);
+ $sort2 = current($data2)->sort;
+
+ $update_result1 = $this->BookmarkModel->update($bookmark_id1, [
+ 'sort' => $sort2
+ ]);
+ $update_result[] = $this->getDataOrTerminateWithError($update_result1);
+
+ $update_result2 = $this->BookmarkModel->update($bookmark_id2, [
+ 'sort' => $sort1
+ ]);
+ $update_result[] = $this->getDataOrTerminateWithError($update_result2);
+
+ $this->terminateWithSuccess($update_result);
+ }
}
diff --git a/application/controllers/api/frontend/v1/Cis4FhcApi.php b/application/controllers/api/frontend/v1/Cis4FhcApi.php
index 372e4bfaa..4d0f906f0 100644
--- a/application/controllers/api/frontend/v1/Cis4FhcApi.php
+++ b/application/controllers/api/frontend/v1/Cis4FhcApi.php
@@ -27,7 +27,7 @@ class Cis4FhcApi extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
- 'getViewData' => self::PERM_LOGGED,
+ 'dashboardViewData' => self::PERM_LOGGED,
]);
}
@@ -36,17 +36,22 @@ class Cis4FhcApi extends FHCAPI_Controller
// Public methods
/**
- * fetches ViewData
- */
- public function getViewData()
+ * retrieves view data for dashboard view
+ * @access public
+ * @param $uid the userID for which profile is being viewed, null or missing value implies one's own profile
+ */
+ public function dashboardViewData()
{
$this->load->model('person/Person_model','PersonModel');
$personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
+ $this->load->config('calendar');
+
$viewData = array(
'uid' => getAuthUID(),
'name' => $personData->vorname,
- 'person_id' => $personData->person_id
+ 'person_id' => $personData->person_id,
+ 'timezone' => $this->config->item('timezone'),
);
$this->terminateWithSuccess($viewData);
diff --git a/application/controllers/api/frontend/v1/CisMenu.php b/application/controllers/api/frontend/v1/CisMenu.php
index 4f4f2573e..163c337ae 100644
--- a/application/controllers/api/frontend/v1/CisMenu.php
+++ b/application/controllers/api/frontend/v1/CisMenu.php
@@ -16,12 +16,13 @@
* along with this program. If not, see .
*/
-if (! defined('BASEPATH')) exit('No direct script access allowed');
+if (!defined('BASEPATH'))
+ exit('No direct script access allowed');
class CisMenu extends FHCAPI_Controller
{
-
+
/**
* Object initialization
*/
@@ -31,28 +32,95 @@ class CisMenu extends FHCAPI_Controller
'getMenu' => self::PERM_LOGGED,
]);
-
+
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
- /**
+ /**
* fetches the menu for CIS from the database based on the userLanguage
*/
- public function getMenu()
+ public function getMenu()
{
$this->load->model('content/Content_model', 'ContentModel');
$this->load->config('cis');
- $cis4_content_id =$this->config->item('cis_menu_root_content_id');
- $result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(),getUserLanguage());
+ $cis4_content_id = $this->config->item('cis_menu_root_content_id');
+ $result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(), getUserLanguage());
$result = $this->getDataOrTerminateWithError($result);
$menu = $result->childs ?? [];
- $this->terminateWithSuccess($menu);
- }
-
-
+ $menu = $this->generateUrlsForMenuItems($menu);
+ $this->terminateWithSuccess($menu);
+ }
+
+ private function generateUrlsForMenuItems($menuItems)
+ {
+ return array_map(
+ function ($menuItem) {
+ return $this->generateUrlForMenuItem($menuItem);
+ },
+ $menuItems
+ );
+ }
+
+ private function generateUrlForMenuItem($menuItem)
+ {
+ $menuItem->url = $this->menuItemUrlHelper($menuItem);
+ unset($menuItem->content);
+
+ if ($menuItem->childs && count($menuItem->childs)) {
+ $menuItem->childs = $this->generateUrlsForMenuItems($menuItem->childs);
+ }
+
+ return $menuItem;
+ }
+
+ private function menuItemUrlHelper($menuItem)
+ {
+ if ($menuItem->template_kurzbz !== 'redirect') {
+ return site_url("/CisVue/Cms/content/" . $menuItem->content_id);
+ }
+
+ if (!$menuItem->content || !mb_strlen($menuItem->content)) {
+ return '';
+ }
+
+ $doc = new DOMDocument();
+ $doc->loadXML($menuItem->content);
+ $urlElem = $doc->getElementsByTagName('url')->item(0);
+
+ if (!$urlElem) {
+ return '';
+ }
+
+ $url = $urlElem->textContent;
+
+ if (strpos($url, '../cms/news.php') !== false) {
+ $newsRegex = '/^\.\.\/cms\/news\.php/';
+ $url = preg_replace($newsRegex, site_url("/CisVue/Cms/news"), $url);
+ }
+
+ if (strpos($url, '../cms/content.php?') !== false) {
+ $contentRegex = '/^\.\.\/cms\/content\.php\?content_id=([0-9]+)/';
+ $matches = [];
+ preg_match($contentRegex, $url, $matches);
+ $url = site_url('/CisVue/Cms/content/' . $matches[1]);
+ }
+
+ if (strpos($url, '../index.ci.php') !== false) {
+ $indexRegex = '/^\.\.\/index\.ci\.php/';
+ $url = preg_replace($indexRegex, site_url(), $url);
+ }
+
+ if (strpos($url, '../') !== false) {
+ $relativeRegex = '/^\.\.\//';
+ $url = preg_replace($relativeRegex, base_url(), $url);
+ }
+
+ return $url;
+ }
+
}
diff --git a/application/controllers/api/frontend/v1/Lehre.php b/application/controllers/api/frontend/v1/Lehre.php
index 10d945a3e..c2ebeb10b 100644
--- a/application/controllers/api/frontend/v1/Lehre.php
+++ b/application/controllers/api/frontend/v1/Lehre.php
@@ -38,7 +38,8 @@ class Lehre extends FHCAPI_Controller
parent::__construct([
'lvStudentenMail' => self::PERM_LOGGED,
'LV' => self::PERM_LOGGED,
- 'Pruefungen' => self::PERM_LOGGED
+ 'Pruefungen' => self::PERM_LOGGED,
+ 'semesterAverageGrade' => self::PERM_LOGGED,
]);
}
@@ -100,5 +101,49 @@ class Lehre extends FHCAPI_Controller
$this->terminateWithSuccess($result);
}
+
+ /**
+ * calculates and returns the grade average and weighted average for a specific semester
+ * @param string $studiensemester_kurzbz
+ * @return void
+ */
+
+ public function semesterAverageGrade($studiensemester_kurzbz)
+ {
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+ $semesterLvs = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(getAuthUID(), $studiensemester_kurzbz, getUserLanguage());
+
+ if (isError($semesterLvs))
+ return $this->outputJsonError(getError($semesterLvs));
+
+ $semesterLvsData = getData($semesterLvs);
+
+ $doGradesExist = false;
+ $sum = 0;
+ $count = 0;
+ $sumWeighted = 0;
+ $sumEcts = 0;
+
+ foreach ($semesterLvsData as $lv) {
+ if (!$lv->znote || $lv->znote < 1 || $lv->znote > 5)
+ continue;
+
+ $doGradesExist = true;
+
+ $sum += $lv->znote;
+ $count++;
+ $sumWeighted += $lv->znote * floatval($lv->ects);
+ $sumEcts += floatval($lv->ects);
+ }
+
+ $averageGrade = null;
+ $weightedAverageGrade = null;
+ if ($doGradesExist) {
+ $averageGrade = $sum/$count;
+ $weightedAverageGrade = $sumWeighted/$sumEcts;
+ }
+
+ $this->terminateWithSuccess(['average_grade' => $averageGrade, 'weighted_average_grade' => $weightedAverageGrade]);
+ }
}
diff --git a/application/controllers/api/frontend/v1/LvPlan.php b/application/controllers/api/frontend/v1/LvPlan.php
index 28b48e3f1..69cbeca54 100644
--- a/application/controllers/api/frontend/v1/LvPlan.php
+++ b/application/controllers/api/frontend/v1/LvPlan.php
@@ -16,7 +16,8 @@
* along with this program. If not, see .
*/
-if (! defined('BASEPATH')) exit('No direct script access allowed');
+if (!defined('BASEPATH'))
+ exit('No direct script access allowed');
use CI3_Events as Events;
use \DateTime as DateTime;
@@ -33,19 +34,25 @@ class LvPlan extends FHCAPI_Controller
parent::__construct([
'getRoomplan' => self::PERM_LOGGED,
- 'Stunden' => self::PERM_LOGGED,
- 'getReservierungen' => self::PERM_LOGGED,
+ 'Stunden' => self::PERM_LOGGED,
+ 'getReservierungen' => self::PERM_LOGGED,
'LvPlanEvents' => self::PERM_LOGGED,
'eventsPersonal' => self::PERM_LOGGED,
'eventsLv' => self::PERM_LOGGED,
'getLehreinheitStudiensemester' => self::PERM_LOGGED,
'studiensemesterDateInterval' => self::PERM_LOGGED,
'getLvPlanForStudiensemester' => self::PERM_LOGGED,
- 'getLv' => self::PERM_LOGGED
+ 'getLv' => self::PERM_LOGGED,
+ 'eventsStgOrg' => self::PERM_LOGGED,
+ 'fetchFerienEvents' => self::PERM_LOGGED,
+ 'getStudiengaenge' => self::PERM_LOGGED,
+ 'getLehrverband' => self::PERM_LOGGED,
+ 'permissionOtherLvPlan' => self::PERM_LOGGED,
+ 'compactibleEventTypes' => self::PERM_LOGGED,
]);
- $this->load->library('LogLib');
- $this->loglib->setConfigs(array(
+ $this->load->library('LogLib');
+ $this->loglib->setConfigs(array(
'classIndex' => 5,
'functionIndex' => 5,
'lineIndex' => 4,
@@ -53,17 +60,17 @@ class LvPlan extends FHCAPI_Controller
'dbExecuteUser' => 'RESTful API'
));
- $this->load->library('form_validation');
+ $this->load->library('form_validation');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
- * fetches LvPlan and Moodle events together
- * @access public
- *
- */
+ * fetches LvPlan and Moodle events together
+ * @access public
+ *
+ */
public function LvPlanEvents()
{
$hasLv = $this->input->post('lv_id');
@@ -83,24 +90,30 @@ class LvPlan extends FHCAPI_Controller
// form validation
$this->form_validation->set_rules('start_date', "start_date", "required");
$this->form_validation->set_rules('end_date', "end_date", "required");
-
+
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
// storing the post parameter in local variables
$start_date = $this->input->post('start_date', true);
$end_date = $this->input->post('end_date', true);
+ $uid = $this->input->post('uid', true);
+
+ // disallow accessing other user's events if missing permission
+ if ($uid && $uid !== getAuthUID() && !$this->permissionlib->isBerechtigt('basis/other_lv_plan')) {
+ $this->terminateWithError("Missing permission to view other users' timetables!");
+ }
// fetching lvplan events
- $result = $this->stundenplanlib->getEventsUser($start_date, $end_date);
+ $result = $this->stundenplanlib->getEventsUser($start_date, $end_date, $uid);
$lvplanEvents = $this->getDataOrTerminateWithError($result);
// fetching moodle events
- $moodleEvents = $this->fetchMoodleEvents($start_date, $end_date);
+ $moodleEvents = $this->fetchMoodleEvents($start_date, $end_date, $uid);
// fetching ferien events
- $ferienEvents = $this->fetchFerienEvents($start_date, $end_date);
-
+ $ferienEvents = $this->fetchFerienEvents($start_date, $end_date, $uid);
+
$this->terminateWithSuccess(array_merge(
$lvplanEvents,
@@ -109,6 +122,45 @@ class LvPlan extends FHCAPI_Controller
));
}
+ /**
+ * fetches LvPlan for studiengang / semester / verband / gruppe
+ *
+ * @access public
+ */
+ public function eventsStgOrg()
+ {
+ $this->load->library('StundenplanLib');
+
+ // form validation
+ $this->form_validation->set_rules('start_date', "start_date", "required");
+ $this->form_validation->set_rules('end_date', "end_date", "required");
+ //$this->form_validation->set_rules('stg_kz', "stg_kz", "required"); //no validation show empty calendar
+
+ if (!$this->form_validation->run()) {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ $stgOrgEvents = [];
+ $ferienEvents = [];
+ } else {
+ $start_date = $this->input->post('start_date', true);
+ $end_date = $this->input->post('end_date', true);
+ $stg_kz = $this->input->post('stg_kz', true);
+ $sem = $this->input->post('sem', true);
+ $verband = $this->input->post('verband', true);
+ $gruppe = $this->input->post('gruppe', true);
+
+ $result = $this->stundenplanlib->getEventsStgOrg($start_date, $end_date, $stg_kz, $sem, $verband, $gruppe);
+ $stgOrgEvents = $this->getDataOrTerminateWithError($result);
+
+ $result = $this->stundenplanlib->fetchFerienTageEvents($start_date, $end_date, $stg_kz);
+ $ferienEvents = $this->getDataOrTerminateWithError($result);
+ }
+
+ $this->terminateWithSuccess(array_merge(
+ $stgOrgEvents,
+ $ferienEvents
+ ));
+ }
+
/**
* fetches LvPlan and Ferien events together for the lv
*
@@ -122,7 +174,7 @@ class LvPlan extends FHCAPI_Controller
$this->form_validation->set_rules('start_date', "start_date", "required");
$this->form_validation->set_rules('end_date', "end_date", "required");
$this->form_validation->set_rules('lv_id', "lv_id", "required|integer");
-
+
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
@@ -137,7 +189,6 @@ class LvPlan extends FHCAPI_Controller
// fetching ferien events
$ferienEvents = $this->fetchFerienEvents($start_date, $end_date);
-
$this->terminateWithSuccess(array_merge(
$lvplanEvents,
@@ -146,40 +197,42 @@ class LvPlan extends FHCAPI_Controller
}
//TODO: delete this function if we don't use the old calendar export endpoints anymore
- public function studiensemesterDateInterval($date){
- $this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
- $studiensemester =$this->StudiensemesterModel->getByDate(date_format(date_create($date),'Y-m-d'));
- $studiensemester =current($this->getDataOrTerminateWithError($studiensemester));
+ public function studiensemesterDateInterval($date)
+ {
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ $studiensemester = $this->StudiensemesterModel->getByDate(date_format(date_create($date), 'Y-m-d'));
+ $studiensemester = current($this->getDataOrTerminateWithError($studiensemester));
$this->terminateWithSuccess($studiensemester);
}
- public function getLvPlanForStudiensemester($studiensemester,$lvid){
+ public function getLvPlanForStudiensemester($studiensemester, $lvid)
+ {
$this->load->library('StundenplanLib');
- $this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
-
- $studiensemester_result = $this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz"=>$studiensemester]);
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ $studiensemester_result = $this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz" => $studiensemester]);
$studiensemester_result = current($this->getDataOrTerminateWithError($studiensemester_result));
$timespan_start = new DateTime($studiensemester_result->start);
$timespan_ende = new DateTime($studiensemester_result->ende);
- $lvplan = $this->stundenplanlib->getStundenplan(date_format($timespan_start, 'Y-m-d'),date_format($timespan_ende, 'Y-m-d'), $lvid);
+ $lvplan = $this->stundenplanlib->getStundenplan(date_format($timespan_start, 'Y-m-d'), date_format($timespan_ende, 'Y-m-d'), $lvid);
$this->terminateWithSuccess($lvplan);
-
- }
-
- /**
- * fetches Stunden layout from database
- * @access public
- *
- */
- public function Stunden()
+ }
+
+
+ /**
+ * fetches Stunden layout from database
+ * @access public
+ *
+ */
+ public function Stunden()
{
$this->load->model('ressource/Stunde_model', 'StundeModel');
$this->StundeModel->addOrder('stunde', 'ASC');
$stunden = $this->StundeModel->load();
- $stunden = $this->getDataOrTerminateWithError($stunden);
+ $stunden = $this->getDataOrTerminateWithError($stunden);
$this->terminateWithSuccess($stunden);
}
@@ -210,10 +263,10 @@ class LvPlan extends FHCAPI_Controller
$roomplan_data = $this->stundenplanlib->getRoomplan($ort_kurzbz, $start_date, $end_date);
$roomplan_data = $this->getDataOrTerminateWithError($roomplan_data);
-
+
$this->terminateWithSuccess($roomplan_data);
}
-
+
/**
* gets the reservierungen of a room if the ort_kurzbz parameter is
* supplied otherwise gets the reservierungen of the lvplan of a student
@@ -226,25 +279,32 @@ class LvPlan extends FHCAPI_Controller
{
$this->form_validation->set_rules('start_date', "StartDate", "required");
$this->form_validation->set_rules('end_date', "EndDate", "required");
-
+
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
// storing the post parameter in local variables
$start_date = $this->input->post('start_date', true);
$end_date = $this->input->post('end_date', true);
+ $uid = $this->input->post('uid', true);
+
+ // disallow accessing other user's reservierungen if missing permission
+ if ($uid && $uid !== getAuthUID() && !$this->permissionlib->isBerechtigt('basis/other_lv_plan')) {
+ $this->terminateWithError("Missing permission to view other users' timetables!");
+ }
// get data
$this->load->library('StundenplanLib');
- $result = $this->stundenplanlib->getReservierungen($start_date, $end_date, $ort_kurzbz);
+ $result = $this->stundenplanlib->getReservierungen($start_date, $end_date, $ort_kurzbz, $uid);
$result = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($result);
}
- public function getLehreinheitStudiensemester($lehreinheit_id){
+ public function getLehreinheitStudiensemester($lehreinheit_id)
+ {
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->LehreinheitModel->addSelect(["studiensemester_kurzbz"]);
$result = $this->LehreinheitModel->load($lehreinheit_id);
@@ -287,6 +347,68 @@ class LvPlan extends FHCAPI_Controller
return $this->terminateWithSuccess(current($result));
}
+ public function getStudiengaenge()
+ {
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $this->StudiengangModel->addOrder('typ');
+ $this->StudiengangModel->addOrder('kurzbz');
+ $result = $this->StudiengangModel->loadWhere([
+ 'aktiv' => true
+ ]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($data);
+ }
+
+ public function getLehrverband($studiengang_kz, $semester = null, $verband = null)
+ {
+ $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
+
+ $where = [
+ 'aktiv' => true,
+ 'studiengang_kz' => $studiengang_kz,
+ ];
+
+ if ($semester !== null && $semester !== 'null' && $semester !== 'undefined') {
+ $where['semester'] = $semester;
+ }
+ if ($verband !== null && $verband !== 'null' && $verband !== 'undefined') {
+ $where['verband'] = $verband;
+ }
+
+ $this->LehrverbandModel->addOrder('studiengang_kz');
+ $this->LehrverbandModel->addOrder('semester');
+ $this->LehrverbandModel->addOrder('verband');
+ $this->LehrverbandModel->addOrder('gruppe');
+ $result = $this->LehrverbandModel->loadWhere($where);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($data);
+ }
+
+ /**
+ * Checks if the current user has permission to view other users' timetables
+ *
+ * @return void
+ */
+ public function permissionOtherLvPlan()
+ {
+ $this->terminateWithSuccess($this->permissionlib->isBerechtigt('basis/other_lv_plan'));
+ }
+
+ /**
+ * get event types which can be compacted in lv plan display
+ *
+ * @return void
+ */
+ public function compactibleEventTypes()
+ {
+ $this->terminateWithSuccess(["lehreinheit", "reservierung", "ferien", "moodle"]);
+ }
+
/**
* fetch moodle events
*
@@ -294,30 +416,30 @@ class LvPlan extends FHCAPI_Controller
* @param string $end_date
* @return array
*/
- private function fetchMoodleEvents($start_date, $end_date)
+ private function fetchMoodleEvents($start_date, $end_date, $uid = null)
{
$this->load->config('calendar');
$tz = new DateTimeZone($this->config->item('timezone'));
-
+
$start = new DateTime($start_date);
$start->setTimezone($tz);
-
+
$end = new DateTime($end_date);
$end->setTimezone($tz);
$end->modify('+1 day -1 second');
-
+
$moodle_events = [];
-
+
Events::trigger(
'moodleCalendarEvents',
- function & () use (&$moodle_events) {
+ function &() use (&$moodle_events) {
return $moodle_events;
},
[
'start_date' => $start->format('c'),
'end_date' => $end->format('c'),
- 'username' => getAuthUID()
+ 'username' => $uid ?? getAuthUID()
]
);
@@ -331,23 +453,23 @@ class LvPlan extends FHCAPI_Controller
* @param string $end_date
* @return array
*/
- private function fetchFerienEvents($start_date, $end_date)
+ private function fetchFerienEvents($start_date, $end_date, $uid = null)
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->model('education/Studentlehrverband_model', 'StudentLehrverbandModel');
$currentStudiensemester = $this->StudiensemesterModel->getByDate($start_date);
$currentStudiensemester = $this->getDataOrTerminateWithError($currentStudiensemester);
-
+
if ($currentStudiensemester) {
$studentsemester_kurzbz = current($currentStudiensemester)->studiensemester_kurzbz;
$studiengang = $this->StudentLehrverbandModel->loadWhere([
- "student_uid" => getAuthUID(),
+ "student_uid" => $uid ?? getAuthUID(),
"studiensemester_kurzbz" => $studentsemester_kurzbz
]);
$studiengang = $this->getDataOrTerminateWithError($studiengang);
-
+
if ($studiengang)
$studiengang_kz = current($studiengang)->studiengang_kz;
else
@@ -357,7 +479,7 @@ class LvPlan extends FHCAPI_Controller
}
$ferienEvents = $this->stundenplanlib->fetchFerienTageEvents($start_date, $end_date, $studiengang_kz);
-
+
return $this->getDataOrTerminateWithError($ferienEvents);
}
}
diff --git a/application/controllers/api/frontend/v1/OtherLvPlan.php b/application/controllers/api/frontend/v1/OtherLvPlan.php
new file mode 100644
index 000000000..cad654f12
--- /dev/null
+++ b/application/controllers/api/frontend/v1/OtherLvPlan.php
@@ -0,0 +1,76 @@
+.
+ */
+
+if (!defined('BASEPATH'))
+ exit('No direct script access allowed');
+
+class OtherLvPlan extends FHCAPI_Controller
+{
+
+ /**
+ * Object initialization
+ */
+ public function __construct()
+ {
+ parent::__construct([
+ 'otherLvPlanViewData' => ['basis/other_lv_plan:r'],
+ ]);
+
+ $this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
+ $this->load->model('person/Benutzer_model', 'BenutzerModel');
+
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * retrieves viewData for other lv plan view
+ * @access public
+ * @param $uid the userID for which the other lv plan is being viewed
+ */
+ public function otherLvPlanViewData($uid)
+ {
+ $isMitarbeiterResult = $this->MitarbeiterModel->isMitarbeiter($uid);
+ $isMitarbeiter = getData($isMitarbeiterResult);
+ $isStudent = !$isMitarbeiter;
+
+ $this->BenutzerModel->addSelect(["foto", "vorname", "nachname"]);
+ $this->BenutzerModel->addJoin("tbl_person", "person_id");
+ $personResult = $this->BenutzerModel->load([$uid]);
+ $person = hasData($personResult) ? getData($personResult) : null;
+
+ $viewData = [
+ "user_data" => [
+ "username" => $uid,
+ "is_student" => $isStudent,
+ "is_mitarbeiter" => $isMitarbeiter,
+ "foto" => $person[0]->foto,
+ "vorname" => $person[0]->vorname,
+ "nachname" => $person[0]->nachname,
+ ],
+ ];
+
+ $this->terminateWithSuccess($viewData);
+ }
+
+ // -----------------------------------------------------------------------------------------------------------------
+ // Private methods
+
+}
+
diff --git a/application/controllers/api/frontend/v1/Phrasen.php b/application/controllers/api/frontend/v1/Phrasen.php
index 7cc652c71..3e13bb61e 100644
--- a/application/controllers/api/frontend/v1/Phrasen.php
+++ b/application/controllers/api/frontend/v1/Phrasen.php
@@ -32,6 +32,8 @@ class Phrasen extends FHCAPI_Controller
'setLanguage' => self::PERM_ANONYMOUS,
'getLanguage' => self::PERM_ANONYMOUS,
'getAllLanguages' => self::PERM_ANONYMOUS,
+ 'getPhrases' => self::PERM_ANONYMOUS,
+ 'getTabulatorPhrases' => self::PERM_ANONYMOUS,
]);
$this->load->helper('hlp_language');
@@ -92,4 +94,59 @@ class Phrasen extends FHCAPI_Controller
$this->terminateWithSuccess($langs);
}
+ public function getPhrases()
+ {
+ $postParams = $this->getPostJSON();
+
+ $languages = $postParams->languages;
+ if (!$languages || !count($languages)) {
+ $this->load->model('system/Sprache_model', 'sprachenModel');
+ $activeLanguages = $this->sprachenModel->loadWhere(array('content' => true));
+ $activeLanguagesData = $this->getDataOrTerminateWithError($activeLanguages);
+ $languages = array_map(
+ function ($languageData) {
+ return $languageData->sprache;
+ },
+ $activeLanguagesData
+ );
+ }
+
+ $this->load->model('system/Phrase_model', 'phraseModel');
+ $phrasesGroupedByCategory = $postParams->phrasesGroupedByCategory;
+ $result = [];
+ foreach ($languages as $language) {
+ $phrases = $this->phraseModel->getPhrasesByCategoryAndPhrasesAndLanguage($phrasesGroupedByCategory, $language);
+ $result[$language] = $this->getDataOrTerminateWithError($phrases);
+ }
+
+ $this->terminateWithSuccess($result);
+ }
+
+ public function getTabulatorPhrases()
+ {
+ $languages = json_decode($this->input->get('languages'));
+ if (!$languages || !count($languages)) {
+ $this->load->model('system/Sprache_model', 'sprachenModel');
+ $activeLanguages = $this->sprachenModel->loadWhere(array('content' => true));
+ $activeLanguagesData = $this->getDataOrTerminateWithError($activeLanguages);
+ $languages = array_map(
+ function ($languageData) {
+ return $languageData->sprache;
+ },
+ $activeLanguagesData
+ );
+ }
+
+ $this->load->model('system/Phrase_model', 'phraseModel');
+ $result = [];
+ foreach ($languages as $language) {
+ $tabulatorPhrases = $this->phraseModel->getPhrasesByCategoryAndLanguage(['tabulator'], $language);
+ $result[$language] = $this->getDataOrTerminateWithError($tabulatorPhrases);
+ }
+
+ header('Pragma: private');
+ header('Cache-Control: private, max-age=' . (60 * 60 * 24 * 30));
+ $this->terminateWithSuccess($result);
+ }
+
}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/Profil.php b/application/controllers/api/frontend/v1/Profil.php
index 3133b107a..96cdea855 100644
--- a/application/controllers/api/frontend/v1/Profil.php
+++ b/application/controllers/api/frontend/v1/Profil.php
@@ -16,7 +16,8 @@
* along with this program. If not, see .
*/
-if (! defined('BASEPATH')) exit('No direct script access allowed');
+if (!defined('BASEPATH'))
+ exit('No direct script access allowed');
class Profil extends FHCAPI_Controller
{
@@ -27,13 +28,13 @@ class Profil extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
- 'fotoSperre' => self::PERM_LOGGED,
+ 'fotoSperre' => self::PERM_LOGGED,
'getGemeinden' => self::PERM_LOGGED,
'getAllNationen' => self::PERM_LOGGED,
'isMitarbeiter' => self::PERM_LOGGED,
'profilViewData' => self::PERM_LOGGED,
]);
-
+
$this->load->library('PermissionLib');
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
@@ -48,28 +49,37 @@ class Profil extends FHCAPI_Controller
//------------------------------------------------------------------------------------------------------------------
// Public methods
- public function profilViewData($uid=null){
+
+ /**
+ * retrieves view data for profile view
+ * @access public
+ * @param $uid the userID for which profile is being viewed, null or missing value implies one's own profile
+ */
+ public function profilViewData($uid = null)
+ {
+ $authUid = getAuthUID();
+ $isProfilOfAuthUser = !$uid || $uid === $authUid;
+
$this->load->library('ProfilLib');
- $editable = false;
- if(isset($uid) && $uid != null){
- $profil_data = $this->profillib->getView($uid);
- if($uid == getAuthUID()){
- $editable = true;
- }
- }else{
- $editable = true;
- $profil_data = $this->profillib->getView(getAuthUID());
+ $profileData = $this->profillib->getView($uid ?? $authUid);
+ $profileData = hasData($profileData) ? getData($profileData) : null;
+
+ $viewData = [
+ 'editable' => $isProfilOfAuthUser,
+ 'profil_data' => $profileData,
+ 'permissions' => [
+ 'basis/other_lv_plan' => $this->permissionlib->isBerechtigt(('basis/other_lv_plan'))
+ ]
+ ];
+
+ if ($isProfilOfAuthUser) {
+ $viewData['calendar_sync_urls'] = $this->getCalendarSyncUrlData();
}
-
- $profil_data = hasData($profil_data) ? getData($profil_data) : null;
- $viewData = array(
- 'editable'=>$editable,
- 'profil_data' => $profil_data,
- );
+
$this->terminateWithSuccess($viewData);
}
- /**
+ /**
* update column foto_sperre in public.tbl_person
* @access public
* @param boolean $value new value for the column
@@ -77,9 +87,9 @@ class Profil extends FHCAPI_Controller
*/
public function fotoSperre($value)
{
- if(!isset($value)){
- $this->terminateWithError("Missing parameter", self::ERROR_TYPE_GENERAL);
- }
+ if (!isset($value)) {
+ $this->terminateWithError("Missing parameter", self::ERROR_TYPE_GENERAL);
+ }
$res = $this->PersonModel->update($this->pid, ["foto_sperre" => $value]);
if (isError($res)) {
@@ -87,10 +97,10 @@ class Profil extends FHCAPI_Controller
}
$this->PersonModel->addSelect("foto_sperre");
$res = $this->PersonModel->load($this->pid);
-
- $res = $this->getDataOrTerminateWithError($res);
-
- $this->terminateWithSuccess(current($res));
+
+ $res = $this->getDataOrTerminateWithError($res);
+
+ $this->terminateWithSuccess(current($res));
}
/**
@@ -109,7 +119,7 @@ class Profil extends FHCAPI_Controller
if (isError($nation_res)) {
$this->terminateWithError("error while trying to query table codex.tbl_nation", self::ERROR_TYPE_GENERAL);
}
-
+
$nation_res = $this->getDataOrTerminateWithError($nation_res);
$this->terminateWithSuccess($nation_res);
@@ -117,30 +127,30 @@ class Profil extends FHCAPI_Controller
public function getGemeinden($nation, $zip)
{
- if(!isset($nation) || !isset($zip)){
+ if (!isset($nation) || !isset($zip)) {
echo json_encode(error("Missing parameters"));
return;
}
-
+
$this->load->model('codex/Gemeinde_model', "GemeindeModel");
-
+
$gemeinde_res = $this->GemeindeModel->getGemeindeByPlz($zip);
-
+
if (isError($gemeinde_res)) {
- $this->terminateWithError(getError($gemeinde_res),self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError(getError($gemeinde_res), self::ERROR_TYPE_GENERAL);
}
$gemeinde_res = $this->getDataOrTerminateWithError($gemeinde_res);
-
+
/* $gemeinde_res = array_map(function ($obj) {
return $obj->ortschaftsname;
}, $gemeinde_res); */
- $this->terminateWithSuccess($gemeinde_res);
-
+ $this->terminateWithSuccess($gemeinde_res);
+
}
-
+
/**
* checks whether a specific userID is a mitarbeiter or not (foreword declaration of the function isMitarbeiter in Mitarbeiter_model.php)
* @access public
@@ -150,23 +160,48 @@ class Profil extends FHCAPI_Controller
public function isMitarbeiter($uid)
{
- if(!$uid) $this->terminateWithError("No uid provided", self::ERROR_TYPE_GENERAL);
-
-
+ if (!$uid)
+ $this->terminateWithError("No uid provided", self::ERROR_TYPE_GENERAL);
+
+
$result = $this->MitarbeiterModel->isMitarbeiter($uid);
-
+
if (isError($result)) {
$this->terminateWithError("error when calling Mitarbeiter_model function isMitarbeiter with uid " . $uid, self::ERROR_TYPE_GENERAL);
}
$result = $this->getDataOrTerminateWithError($result);
-
+
$this->terminateWithSuccess($result);
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
-
+ /**
+ * gets the identifier, phrase, and url for each calendar sync option
+ * @access private
+ * @return array array of arrays, where each child array is a sync option
+ */
+ private function getCalendarSyncUrlData()
+ {
+ return [
+ [
+ "identifier" => "cal_dav",
+ "labelPhrase" => "profil/calendar_sync_cal_dav",
+ "url" => APP_ROOT . "webdav/lvplan.php/calendars/" . $this->uid . "/LVPlan-" . $this->uid,
+ ],
+ [
+ "identifier" => "cal_dav_principal",
+ "labelPhrase" => "profil/calendar_sync_cal_dav_principal",
+ "url" => APP_ROOT . "webdav/lvplan.php/principals/" . $this->uid,
+ ],
+ [
+ "identifier" => "i_cal",
+ "labelPhrase" => "profil/calendar_sync_i_cal",
+ "url" => APP_ROOT . "webdav/google.php?cal=" . encryptData($this->uid, LVPLAN_CYPHER_KEY) . "&" . microtime(true),
+ ],
+ ];
+ }
}
diff --git a/application/controllers/api/frontend/v1/StgOrgLvPlan.php b/application/controllers/api/frontend/v1/StgOrgLvPlan.php
new file mode 100644
index 000000000..ffbf85e57
--- /dev/null
+++ b/application/controllers/api/frontend/v1/StgOrgLvPlan.php
@@ -0,0 +1,64 @@
+.
+ */
+
+if (!defined('BASEPATH'))
+ exit('No direct script access allowed');
+
+class StgOrgLvPlan extends FHCAPI_Controller
+{
+
+ /**
+ * Object initialization
+ */
+ public function __construct()
+ {
+ parent::__construct([
+ 'stgOrgLvPlanViewData' => self::PERM_LOGGED,
+ ]);
+
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * fetches view data for stg org lv plan
+ * @access public
+ */
+ public function stgOrgLvPlanViewData()
+ {
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $this->StudiengangModel->addOrder('typ');
+ $this->StudiengangModel->addOrder('kurzbz');
+ $result = $this->StudiengangModel->loadWhere([
+ 'aktiv' => true
+ ]);
+ $studiengaenge = $this->getDataOrTerminateWithError($result);
+
+ $viewData = array(
+ 'studiengaenge' => $studiengaenge,
+ );
+
+ $this->terminateWithSuccess($viewData);
+ }
+
+ // -----------------------------------------------------------------------------------------------------------------
+ // Private methods
+
+}
+
diff --git a/application/controllers/api/frontend/v1/Studium.php b/application/controllers/api/frontend/v1/Studium.php
index d17f0c1a1..f53a4105c 100644
--- a/application/controllers/api/frontend/v1/Studium.php
+++ b/application/controllers/api/frontend/v1/Studium.php
@@ -62,21 +62,36 @@ class Studium extends FHCAPI_Controller
if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester->studiensemester_kurzbz]);
- $studentLehrverband = current($this->getDataOrTerminateWithError($studentLehrverband));
-
- $student_studiensemester = $studentLehrverband->studiensemester_kurzbz;
- $student_studiengang = $studentLehrverband->studiengang_kz;
- $student_semester = $studentLehrverband->semester;
+
+ //TODO(Manu) check if use Fallback or just comment out all paramschecks?
+ //add Fallback: if no LehrverbandData of actual semester, get Data of previous one
+ if(!hasData($studentLehrverband))
+ {
+ $result= $this->StudiensemesterModel->getPreviousFrom($aktuelles_studiensemester->studiensemester_kurzbz);
+
+ $data = $this->getDataOrTerminateWithError($result);
+ $vorheriges_studiensemester = current($data)->studiensemester_kurzbz;
+ $studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $vorheriges_studiensemester]);
+ }
+ $studentLehrverband = current(getData($studentLehrverband));
+
$student_studienplan = $this->getStudienPlanFromPrestudentStatus(getAuthPersonId())->studienplan_id;
- if(!isset($parameter_studiensemester))
- $parameter_studiensemester = $student_studiensemester;
- if(!isset($parameter_studiengang))
- $parameter_studiengang = $student_studiengang;
- if(!isset($parameter_semester))
- $parameter_semester = $student_semester;
+ if(!isset($parameter_studiensemester)) {
+ $student_studiensemester = $studentLehrverband->studiensemester_kurzbz;
+ $parameter_studiensemester = $student_studiensemester;
+ }
+ if(!isset($parameter_studiengang)) {
+ $student_studiengang = $studentLehrverband->studiengang_kz;
+ $parameter_studiengang = $student_studiengang;
+ }
+ if(!isset($parameter_semester)) {
+ $student_semester = $studentLehrverband->semester;
+ $parameter_semester = $student_semester;
+ }
if(!isset($parameter_studienplan))
- $parameter_studienplan = $student_studienplan;
+ $parameter_studienplan = $student_studienplan;
+
}
if(isset($parameter_studiensemester)){
@@ -96,8 +111,7 @@ class Studium extends FHCAPI_Controller
// fetch studiensemester
$allStudienSemester = $this->getDataOrTerminateWithError($this->StudiensemesterModel->load());
-
-
+
if(isset($parameter_studiensemester) && !empty(array_filter($allStudienSemester, function($studiensemester) use($parameter_studiensemester){
return $studiensemester->studiensemester_kurzbz == $parameter_studiensemester->studiensemester_kurzbz;
}))){
@@ -216,6 +230,8 @@ class Studium extends FHCAPI_Controller
$studienplaene = array_map(function($studienplan){
$orgform = current($this->getDataOrTerminateWithError($this->OrgformModel->loadWhere(["orgform_kurzbz" => $studienplan->orgform_kurzbz])));
$studienplan->orgform_bezeichnung = $orgform->bezeichnung;
+ // bezeichnung_mehrsprachig
+ $studienplan->orgform_bezeichnung_english = $orgform->bezeichnung_mehrsprachig[1];
return $studienplan;
},$studienplaene);
return $studienplaene;
diff --git a/application/controllers/api/frontend/v1/dashboard/Board.php b/application/controllers/api/frontend/v1/dashboard/Board.php
index c50fec128..fdded61e3 100644
--- a/application/controllers/api/frontend/v1/dashboard/Board.php
+++ b/application/controllers/api/frontend/v1/dashboard/Board.php
@@ -40,11 +40,32 @@ class Board extends FHCAPI_Controller
public function list()
{
+ $this->DashboardModel->addSelect('dashboard_id');
+ $this->DashboardModel->addSelect('dashboard_kurzbz');
+ $this->DashboardModel->addSelect('tbl_dashboard.beschreibung');
+ $this->DashboardModel->addSelect("(
+ SELECT json_agg(w.*)
+ FROM dashboard.tbl_widget w
+ JOIN dashboard.tbl_dashboard_widget dw
+ USING(widget_id)
+ WHERE dw.dashboard_id=tbl_dashboard.dashboard_id
+ ) AS \"widgetSetup\"");
+
$result = $this->DashboardModel->load();
$data = $this->getDataOrTerminateWithError($result);
- $this->terminateWithSuccess($result);
+ $data = array_map(function ($dashboard) {
+ $tmpSetups = json_decode($dashboard->widgetSetup);
+ $tmpSetups = array_map(function ($widget) {
+ $widget->setup->file = absoluteJsImportUrl($widget->setup->file);
+ return $widget;
+ }, $tmpSetups);
+ $dashboard->widgetSetup = $tmpSetups;
+ return $dashboard;
+ }, $data);
+
+ $this->terminateWithSuccess($data);
}
public function create()
@@ -82,7 +103,7 @@ class Board extends FHCAPI_Controller
$data = $this->getDataOrTerminateWithError($result);
- $this->terminateWithSuccess($result);
+ $this->terminateWithSuccess($data);
}
public function delete()
@@ -116,6 +137,6 @@ class Board extends FHCAPI_Controller
$data = $this->getDataOrTerminateWithError($result);
- $this->terminateWithSuccess($result);
+ $this->terminateWithSuccess($data);
}
}
diff --git a/application/controllers/api/frontend/v1/dashboard/Preset.php b/application/controllers/api/frontend/v1/dashboard/Preset.php
index 5983d9660..d9be307cf 100644
--- a/application/controllers/api/frontend/v1/dashboard/Preset.php
+++ b/application/controllers/api/frontend/v1/dashboard/Preset.php
@@ -120,10 +120,7 @@ class Preset extends FHCAPI_Controller
$conf = $this->dashboardlib->getPreset($db, $funktion);
if ($conf) {
$preset = json_decode($conf->preset, true);
- if (!isset($preset[$funktion]) || !isset($preset[$funktion]['widgets']))
- $result[$funktion] = [];
- else
- $result[$funktion] = $preset[$funktion]['widgets'];
+ $result[$funktion] = $preset;
} else {
$result[$funktion] = [];
}
@@ -154,7 +151,7 @@ class Preset extends FHCAPI_Controller
$preset_decoded = json_decode($preset->preset, true);
- $this->dashboardlib->addWidgetsToWidgets($preset_decoded, $dashboard_kurzbz, $funktion_kurzbz, [$widget]);
+ $preset_decoded[$widget['widgetid']] = $widget;
$preset->preset = json_encode($preset_decoded);
@@ -186,8 +183,10 @@ class Preset extends FHCAPI_Controller
$preset_decoded = json_decode($preset->preset, true);
- if (!$this->dashboardlib->removeWidgetFromWidgets($preset_decoded, $funktion_kurzbz, $widgetid))
+ if (!isset($preset_decoded[$widgetid]))
show_404();
+
+ unset($preset_decoded[$widgetid]);
$preset->preset = json_encode($preset_decoded);
diff --git a/application/controllers/api/frontend/v1/dashboard/User.php b/application/controllers/api/frontend/v1/dashboard/User.php
index 9d020649e..e603573ed 100644
--- a/application/controllers/api/frontend/v1/dashboard/User.php
+++ b/application/controllers/api/frontend/v1/dashboard/User.php
@@ -48,25 +48,9 @@ class User extends FHCAPI_Controller
$uid = $this->authlib->getAuthObj()->username;
- /*$mergedconfig = $this->dashboardlib->getMergedConfig($dashboard->dashboard_id, $uid);
+ $mergedconfig = $this->dashboardlib->getMergedUserConfig($dashboard->dashboard_id, $uid);
- $this->terminateWithSuccess([
- 'general' => call_user_func_array(
- 'array_merge_recursive',
- $mergedconfig
- )
- ]);*/
- $defaultconfig = $this->dashboardlib->getDefaultConfig($dashboard->dashboard_id);
- $userconfig = $this->dashboardlib->getUserConfig($dashboard->dashboard_id, $uid);
-
- $defaultconfig_squashed = $defaultconfig ? call_user_func_array('array_replace_recursive', $defaultconfig) : [];
- $userconfig_squashed = $userconfig ? call_user_func_array('array_replace_recursive', $userconfig) : [];
-
- $mergedconfig = array_replace_recursive($defaultconfig_squashed, $userconfig_squashed);
-
- $this->terminateWithSuccess([
- DashboardLib::SECTION_IF_FUNKTION_KURZBZ_IS_NULL => $mergedconfig
- ]);
+ $this->terminateWithSuccess($mergedconfig);
}
public function addWidget()
@@ -86,26 +70,15 @@ class User extends FHCAPI_Controller
if (!isset($widget['widgetid']))
$widget['widgetid'] = $this->dashboardlib->generateWidgetId($dashboard_kurzbz);
+ if (isset($widget['source']))
+ unset($widget['source']);
+
$override = $this->dashboardlib->getOverrideOrCreateEmptyOverride($dashboard_kurzbz, $uid);
-
+
$override_decoded = json_decode($override->override, true);
- if (!isset($override_decoded['general']) || !is_array($override_decoded['general']))
- $override_decoded['general'] = [];
+ $override_decoded[$widget['widgetid']] = $widget;
- if (!isset($override_decoded['general']['widgets']))
- $override_decoded['general']['widgets'] = [];
-
- $override_decoded['general']['widgets'][$widget['widgetid']] = $widget;
-
- // NOTE(chris): remove doubles in other funktionen
- foreach ($override_decoded as $funktion => $array) {
- if ($funktion == 'general')
- continue;
- if (isset($array['widgets']) && isset($array['widgets'][$widget['widgetid']]))
- unset($override_decoded[$funktion]['widgets'][$widget['widgetid']]);
- }
-
$override->override = json_encode($override_decoded);
$result = $this->dashboardlib->insertOrUpdateOverride($override);
@@ -135,18 +108,10 @@ class User extends FHCAPI_Controller
$override_decoded = json_decode($override->override, true);
- foreach (array_keys($override_decoded) as $k) {
- if (!isset($override_decoded[$k]["widgets"])) {
- unset($override_decoded[$k]);
- continue;
- }
- if (isset($override_decoded[$k]["widgets"][$widget_id])) {
- unset($override_decoded[$k]["widgets"][$widget_id]);
- }
- if (!$override_decoded[$k]["widgets"]) {
- unset($override_decoded[$k]);
- }
- }
+ if (!isset($override_decoded[$widget_id]))
+ show_404();
+
+ unset($override_decoded[$widget_id]);
$override->override = json_encode($override_decoded);
diff --git a/application/controllers/api/frontend/v1/stv/Projektarbeit.php b/application/controllers/api/frontend/v1/stv/Projektarbeit.php
index 8740ef3d6..d26d6a10c 100644
--- a/application/controllers/api/frontend/v1/stv/Projektarbeit.php
+++ b/application/controllers/api/frontend/v1/stv/Projektarbeit.php
@@ -90,6 +90,15 @@ class Projektarbeit extends FHCAPI_Controller
if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id)) return $this->terminateWithError('Projektarbeit Id missing', self::ERROR_TYPE_GENERAL);
+ $result = $this->fetchProjektarbeitByID($projektarbeit_id);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(current($data));
+ }
+
+ private function fetchProjektarbeitById($projektarbeit_id) {
+ $this->ProjektarbeitModel->resetQuery();
$this->ProjektarbeitModel->addSelect(
'lehre.tbl_projektarbeit.projektarbeit_id, titel, titel_english, themenbereich, projekttyp_kurzbz, lehrveranstaltung_id, lehreinheit_id,
firma_id, beginn, ende, gesperrtbis, note, final, freigegeben, tbl_projektarbeit.anmerkung, fa.name AS firma_name'
@@ -97,13 +106,10 @@ class Projektarbeit extends FHCAPI_Controller
$this->ProjektarbeitModel->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
$this->ProjektarbeitModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
$this->ProjektarbeitModel->addJoin('public.tbl_firma fa', 'firma_id', 'LEFT');
- $result = $this->ProjektarbeitModel->loadWhere(
+ return $this->ProjektarbeitModel->loadWhere(
array('projektarbeit_id' => $projektarbeit_id)
);
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess(current($data));
}
/**
@@ -132,7 +138,8 @@ class Projektarbeit extends FHCAPI_Controller
);
$data = $this->getDataOrTerminateWithError($result);
-
+ $data = $this->getDataOrTerminateWithError($this->fetchProjektarbeitById($data));
+
$this->terminateWithSuccess($data);
}
@@ -280,10 +287,7 @@ class Projektarbeit extends FHCAPI_Controller
*/
public function getNoten()
{
- $this->NoteModel->addOrder('notenwert', 'ASC');
- $this->NoteModel->addOrder('bezeichnung', 'ASC');
-
- $result = $this->NoteModel->load();
+ $result = $this->NoteModel->getAllActive();
if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php
index f87e527e0..047652452 100644
--- a/application/controllers/api/frontend/v1/stv/Students.php
+++ b/application/controllers/api/frontend/v1/stv/Students.php
@@ -25,9 +25,6 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
*/
class Students extends FHCAPI_Controller
{
- private $allowedStgs = [];
-
-
public function __construct()
{
$permissions = [];
@@ -35,16 +32,17 @@ class Students extends FHCAPI_Controller
$permissions[$router->method] = ['admin:r', 'assistenz:r'];
parent::__construct($permissions);
- $this->allowedStgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: [];
- $this->allowedStgs = array_merge($this->allowedStgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
+ $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: [];
+ $allowedStgs = array_merge($allowedStgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
- if (!$this->allowedStgs) {
+ if (!$allowedStgs) {
$this->_outputAuthError([$router->method => ['admin:r', 'assistenz:r']]);
exit;
}
// Load Libraries
$this->load->library('PhrasesLib');
+ $this->load->library('stv/StudentListLib', ['allowedStgs' => $allowedStgs]);
$this->loadPhrases(
array(
'lehre'
@@ -111,23 +109,19 @@ class Students extends FHCAPI_Controller
]);
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
-
-
- $this->PrestudentModel->addJoin(
+ $this->studentlistlib->addJoin(
"(
SELECT prestudent_id
FROM public.tbl_prestudentstatus
WHERE status_kurzbz = 'Incoming'
AND studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
) test",
- "prestudent_id"
+ "prestudent_id",
+ "",
+ "start"
);
-
- $this->prepareQuery($studiensemester_kurzbz);
-
- $this->PrestudentModel->addSelect("COALESCE(
+ $this->studentlistlib->addSelect("COALESCE(
v.semester::text,
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
@@ -135,16 +129,13 @@ class Students extends FHCAPI_Controller
ELSE ''::text
END
) AS semester", false);
- $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)");
- $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)");
-
- $this->addSelectPrioRel();
+ $this->studentlistlib->addSelect("COALESCE(v.verband::text, ''::text) AS verband");
+ $this->studentlistlib->addSelect("COALESCE(v.gruppe::text, ''::text) AS gruppe");
+
$this->addFilter($studiensemester_kurzbz);
-
- $result = $this->PrestudentModel->load();
-
+ $result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
@@ -164,10 +155,7 @@ class Students extends FHCAPI_Controller
]);
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
-
-
- $this->PrestudentModel->addJoin(
+ $this->studentlistlib->addJoin(
"(
SELECT prestudent_id
FROM bis.tbl_bisio bis
@@ -187,14 +175,12 @@ class Students extends FHCAPI_Controller
) AND stdsem.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
GROUP BY prestudent_id
) test",
- "prestudent_id"
+ "prestudent_id",
+ "",
+ "start"
);
-
- $this->prepareQuery($studiensemester_kurzbz);
-
-
- $this->PrestudentModel->addSelect("COALESCE(
+ $this->studentlistlib->addSelect("COALESCE(
v.semester::text,
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
@@ -202,16 +188,13 @@ class Students extends FHCAPI_Controller
ELSE ''::text
END
) AS semester", false);
- $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)");
- $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)");
+ $this->studentlistlib->addSelect("COALESCE(v.verband::text, ''::text) AS verband");
+ $this->studentlistlib->addSelect("COALESCE(v.gruppe::text, ''::text) AS gruppe");
- $this->addSelectPrioRel();
$this->addFilter($studiensemester_kurzbz);
-
- $result = $this->PrestudentModel->load();
-
+ $result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
@@ -231,23 +214,18 @@ class Students extends FHCAPI_Controller
]);
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
-
-
- $this->PrestudentModel->addJoin(
+ $this->studentlistlib->addJoin(
"(
SELECT prestudent_id
FROM bis.tbl_mobilitaet
WHERE studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
) bis",
- "prestudent_id"
+ "prestudent_id",
+ "",
+ "start"
);
-
- $this->prepareQuery($studiensemester_kurzbz);
-
-
- $this->PrestudentModel->addSelect("COALESCE(
+ $this->studentlistlib->addSelect("COALESCE(
v.semester::text,
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
@@ -255,16 +233,13 @@ class Students extends FHCAPI_Controller
ELSE ''::text
END
) AS semester", false);
- $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)");
- $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)");
+ $this->studentlistlib->addSelect("COALESCE(v.verband::text, ''::text) AS verband");
+ $this->studentlistlib->addSelect("COALESCE(v.gruppe::text, ''::text) AS gruppe");
- $this->addSelectPrioRel();
$this->addFilter($studiensemester_kurzbz);
-
- $result = $this->PrestudentModel->load();
-
+ $result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
@@ -313,8 +288,6 @@ class Students extends FHCAPI_Controller
*/
protected function fetchPrestudents($studiengang_kz, $studiensemester_kurzbz = null, $filter = null, $orgform_kurzbz = null)
{
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
-
$stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
$selectRT = "
@@ -331,38 +304,38 @@ class Students extends FHCAPI_Controller
AND r.studiensemester_kurzbz=" . $stdsemEsc;
- $where = ['tbl_prestudent.studiengang_kz' => $studiengang_kz];
+ $this->studentlistlib->addWhere('tbl_prestudent.studiengang_kz', $studiengang_kz);
if ($orgform_kurzbz) {
- $where['ps.orgform_kurzbz'] = $orgform_kurzbz;
+ $this->studentlistlib->addWhere('ps.orgform_kurzbz', $orgform_kurzbz);
}
switch ($filter) {
case "interessenten":
- $where['ps.status_kurzbz'] = 'Interessent';
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent');
break;
case "bewerbungnichtabgeschickt":
- $where['ps.status_kurzbz'] = 'Interessent';
- $where['ps.bewerbung_abgeschicktamum'] = null;
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent');
+ $this->studentlistlib->addWhere('ps.bewerbung_abgeschicktamum IS NULL');
break;
case "bewerbungabgeschickt":
- $where['ps.status_kurzbz'] = 'Interessent';
- $where['ps.bewerbung_abgeschicktamum IS NOT NULL'] = null;
- $where['ps.bestaetigtam'] = null;
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent');
+ $this->studentlistlib->addWhere('ps.bewerbung_abgeschicktamum IS NOT NULL');
+ $this->studentlistlib->addWhere('ps.bestaetigtam IS NULL');
break;
case "statusbestaetigt":
- $where['ps.status_kurzbz'] = 'Interessent';
- $where['ps.bestaetigtam IS NOT NULL'] = null;
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent');
+ $this->studentlistlib->addWhere('ps.bestaetigtam IS NOT NULL');
break;
case "statusbestaetigtrtnichtangemeldet":
- $where['ps.status_kurzbz'] = 'Interessent';
- $where['ps.bestaetigtam IS NOT NULL'] = null;
- $this->PrestudentModel->db->where('NOT EXISTS(' . $selectRT . ')', null, false);
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent');
+ $this->studentlistlib->addWhere('ps.bestaetigtam IS NOT NULL');
+ $this->studentlistlib->addWhere('NOT EXISTS(' . $selectRT . ')', null, false);
break;
case "statusbestaetigtrtangemeldet":
- $where['ps.status_kurzbz'] = 'Interessent';
- $where['ps.bestaetigtam IS NOT NULL'] = null;
- $this->PrestudentModel->db->where('EXISTS(' . $selectRT . ')', null, false);
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent');
+ $this->studentlistlib->addWhere('ps.bestaetigtam IS NOT NULL');
+ $this->studentlistlib->addWhere('EXISTS(' . $selectRT . ')', null, false);
break;
case "zgv":
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
@@ -374,69 +347,69 @@ class Students extends FHCAPI_Controller
$this->terminateWithSuccess([]);
$stg = current($stg);
- $where['ps.status_kurzbz'] = 'Interessent';
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent');
if ($stg->typ == 'm') {
- $where['zgvmas_code IS NOT NULL'] = null;
+ $this->studentlistlib->addWhere('zgvmas_code IS NOT NULL');
if (defined('ZGV_ERFUELLT_ANZEIGEN') && ZGV_ERFUELLT_ANZEIGEN)
- $where['zgvmas_erfuellt'] = true;
+ $this->studentlistlib->addWhere('zgvmas_erfuellt', true);
} elseif ($stg->typ == 'p') {
- $where['zgvdoktor_code IS NOT NULL'] = null;
+ $this->studentlistlib->addWhere('zgvdoktor_code IS NOT NULL');
if (defined('ZGV_DOKTOR_ANZEIGEN') && ZGV_DOKTOR_ANZEIGEN)
- $where['zgvdoktor_erfuellt'] = true;
+ $this->studentlistlib->addWhere('zgvdoktor_erfuellt', true);
} else {
- $where['zgv_code IS NOT NULL'] = null;
+ $this->studentlistlib->addWhere('zgv_code IS NOT NULL');
if (defined('ZGV_ERFUELLT_ANZEIGEN') && ZGV_ERFUELLT_ANZEIGEN)
- $where['zgv_erfuellt'] = true;
+ $this->studentlistlib->addWhere('zgv_erfuellt', true);
}
break;
case "reihungstestangemeldet":
- $where['ps.status_kurzbz'] = 'Interessent';
- $this->PrestudentModel->db->where('EXISTS(' . $selectRT . ')', null, false);
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent');
+ $this->studentlistlib->addWhere('EXISTS(' . $selectRT . ')', null, false);
break;
case "reihungstestnichtangemeldet":
- $where['ps.status_kurzbz'] = 'Interessent';
- $this->PrestudentModel->db->where('NOT EXISTS(' . $selectRT . ')', null, false);
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent');
+ $this->studentlistlib->addWhere('NOT EXISTS(' . $selectRT . ')', null, false);
break;
case "bewerber":
- $where['ps.status_kurzbz'] = 'Bewerber';
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Bewerber');
break;
case "bewerberrtnichtangemeldet":
- $where['ps.status_kurzbz'] = 'Bewerber';
- $this->PrestudentModel->db->where('NOT EXISTS(' . $selectRT . ')', null, false);
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Bewerber');
+ $this->studentlistlib->addWhere('NOT EXISTS(' . $selectRT . ')', null, false);
break;
case "bewerberrtangemeldet":
- $where['ps.status_kurzbz'] = 'Bewerber';
- $this->PrestudentModel->db->where('EXISTS(' . $selectRT . ')', null, false);
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Bewerber');
+ $this->studentlistlib->addWhere('EXISTS(' . $selectRT . ')', null, false);
break;
case "bewerberrtangemeldetteilgenommen":
- $where['ps.status_kurzbz'] = 'Bewerber';
- $this->PrestudentModel->db->where('EXISTS(' . $selectRT . ')', null, false);
- $where['reihungstestangetreten'] = true;
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Bewerber');
+ $this->studentlistlib->addWhere('EXISTS(' . $selectRT . ')', null, false);
+ $this->studentlistlib->addWhere('reihungstestangetreten', true);
break;
case "bewerberrtangemeldetnichtteilgenommen":
- $where['ps.status_kurzbz'] = 'Bewerber';
- $this->PrestudentModel->db->where('EXISTS(' . $selectRT . ')', null, false);
- $where['reihungstestangetreten'] = false;
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Bewerber');
+ $this->studentlistlib->addWhere('EXISTS(' . $selectRT . ')', null, false);
+ $this->studentlistlib->addWhere('reihungstestangetreten', false);
break;
case "aufgenommen":
- $where['ps.status_kurzbz'] = 'Aufgenommener';
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Aufgenommener');
break;
case "warteliste":
- $where['ps.status_kurzbz'] = 'Wartender';
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Wartender');
break;
case "absage":
- $where['ps.status_kurzbz'] = 'Abgewiesener';
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Abgewiesener');
break;
case "incoming":
// NOTE(chris): in FAS it was not filtered for studiengang_kz
- $where['ps.status_kurzbz'] = 'Incoming';
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Incoming');
break;
case "absolvent":
- $where['ps.status_kurzbz'] = 'Absolvent';
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Absolvent');
break;
case "diplomand":
- $where['ps.status_kurzbz'] = 'Diplomand';
+ $this->studentlistlib->addWhere('ps.status_kurzbz', 'Diplomand');
break;
default:
if (!$studiensemester_kurzbz) {
@@ -444,9 +417,9 @@ class Students extends FHCAPI_Controller
* show all prestudents in this stg who don't have a status
* $orgform_kurzbz does not change the results since orgform is stored in the status table
*/
- $where['ps.status_kurzbz'] = null;
+ $this->studentlistlib->addWhere('ps.status_kurzbz IS NULL');
} else {
- $this->PrestudentModel->db->where_in('ps.status_kurzbz', [
+ $this->studentlistlib->addWhere('ps.status_kurzbz', [
'Interessent',
'Bewerber',
'Aufgenommener',
@@ -457,21 +430,19 @@ class Students extends FHCAPI_Controller
break;
}
- $this->prepareQuery($studiensemester_kurzbz);
-
- $this->PrestudentModel->addSelect("
+ $this->studentlistlib->addSelect("
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
THEN ps.ausbildungssemester::text
ELSE ''::text
END AS semester", false);
- $this->PrestudentModel->addSelect("'' AS verband");
- $this->PrestudentModel->addSelect("'' AS gruppe");
- $this->addSelectPrioRel();
+ $this->studentlistlib->addSelect("'' AS verband");
+ $this->studentlistlib->addSelect("'' AS gruppe");
+
$this->addFilter($studiensemester_kurzbz);
- $result = $this->PrestudentModel->loadWhere($where);
+ $result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
@@ -574,7 +545,6 @@ class Students extends FHCAPI_Controller
$gruppe_kurzbz = null,
$orgform_kurzbz = null
) {
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
@@ -582,34 +552,29 @@ class Students extends FHCAPI_Controller
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
- $this->prepareQuery($studiensemester_kurzbz, '');
+ // NOTE(chris): overwrite 'LEFT JOIN' with 'JOIN'
+ $this->studentlistlib->addJoin("public.tbl_student s", "prestudent_id");
- $this->PrestudentModel->addSelect('v.semester');
- $this->PrestudentModel->addSelect('v.verband');
- $this->PrestudentModel->addSelect('v.gruppe');
- $this->PrestudentModel->addSelect("'' AS priorisierung_relativ");
-
-
- $where = [];
+ $this->studentlistlib->addSelect("'' AS priorisierung_relativ");
if ($gruppe_kurzbz !== null) {
- $this->PrestudentModel->addJoin('public.tbl_benutzergruppe g', 'uid');
- $where['g.gruppe_kurzbz'] = $gruppe_kurzbz;
- $where['g.studiensemester_kurzbz'] = $studiensemester_kurzbz;
+ $this->studentlistlib->addJoin('public.tbl_benutzergruppe g', 'uid', '', 'after_b');
+ $this->studentlistlib->addWhere('g.gruppe_kurzbz', $gruppe_kurzbz);
+ $this->studentlistlib->addWhere('g.studiensemester_kurzbz', $studiensemester_kurzbz);
} else {
- $where['v.studiengang_kz'] = $studiengang_kz;
+ $this->studentlistlib->addWhere('v.studiengang_kz', $studiengang_kz);
if ($semester !== null)
- $where['v.semester'] = $semester;
+ $this->studentlistlib->addWhere('v.semester', $semester);
if ($verband !== null)
- $where['v.verband'] = $verband;
+ $this->studentlistlib->addWhere('v.verband', $verband);
if ($gruppe !== null)
- $where['v.gruppe'] = $gruppe;
+ $this->studentlistlib->addWhere('v.gruppe', $gruppe);
if (!$verband && !$gruppe && $orgform_kurzbz !== null) {
- $this->PrestudentModel->db->where(
+ $this->studentlistlib->addWhere(
"(
SELECT orgform_kurzbz
FROM public.tbl_prestudentstatus
@@ -623,9 +588,10 @@ class Students extends FHCAPI_Controller
}
}
+
$this->addFilter($studiensemester_kurzbz);
- $result = $this->PrestudentModel->loadWhere($where);
+ $result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
@@ -652,11 +618,8 @@ class Students extends FHCAPI_Controller
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
-
- $this->prepareQuery($studiensemester_kurzbz);
-
- $this->PrestudentModel->addSelect("COALESCE(
+
+ $this->studentlistlib->addSelect("COALESCE(
v.semester::text,
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
@@ -664,16 +627,15 @@ class Students extends FHCAPI_Controller
ELSE ''::text
END
) AS semester", false);
- $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)");
- $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)");
+ $this->studentlistlib->addSelect("COALESCE(v.verband::text, ''::text) AS verband");
+ $this->studentlistlib->addSelect("COALESCE(v.gruppe::text, ''::text) AS gruppe");
+
+ $this->studentlistlib->addWhere('tbl_prestudent.prestudent_id', $prestudent_id);
- $this->addSelectPrioRel();
$this->addFilter($studiensemester_kurzbz);
- $result = $this->PrestudentModel->loadWhere([
- 'tbl_prestudent.prestudent_id' => $prestudent_id
- ]);
+ $result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
@@ -700,23 +662,13 @@ class Students extends FHCAPI_Controller
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
-
- $this->prepareQuery($studiensemester_kurzbz);
-
- $this->PrestudentModel->addSelect('v.semester');
- $this->PrestudentModel->addSelect('v.verband');
- $this->PrestudentModel->addSelect('v.gruppe');
-
- $this->addSelectPrioRel();
-
+ $this->studentlistlib->addWhere('s.student_uid', $student_uid);
+
$this->addFilter($studiensemester_kurzbz);
- $result = $this->PrestudentModel->loadWhere([
- 's.student_uid' => $student_uid
- ]);
+ $result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
@@ -744,21 +696,13 @@ class Students extends FHCAPI_Controller
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
- $this->prepareQuery($studiensemester_kurzbz);
-
- $this->PrestudentModel->addSelect('v.semester');
- $this->PrestudentModel->addSelect('v.verband');
- $this->PrestudentModel->addSelect('v.gruppe');
-
- $this->addSelectPrioRel();
+ $this->studentlistlib->addWhere('p.person_id', $person_id);
+
$this->addFilter($studiensemester_kurzbz);
- $result = $this->PrestudentModel->loadWhere([
- 'p.person_id' => $person_id
- ]);
+ $result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
@@ -790,29 +734,8 @@ class Students extends FHCAPI_Controller
$data = $this->getDataOrTerminateWithError($result);
-
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
-
- $this->prepareQuery($studiensemester_kurzbz);
-
- $this->PrestudentModel->addSelect("COALESCE(v.semester::text, CASE WHEN public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') THEN public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)::text ELSE ''::text END) AS semester", false);
- $this->PrestudentModel->addSelect('v.verband');
- $this->PrestudentModel->addSelect('v.gruppe');
-
- //add status per semester
- $this->PrestudentModel->addSelect(
- "public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
- . $this->PrestudentModel->escape($studiensemester_kurzbz)
- . ") AS statusofsemester"
- );
-
- $this->addSelectPrioRel();
-
- $this->addFilter($studiensemester_kurzbz);
-
$prestudent_ids = [];
$student_uids = [];
- $this->addMeta('data', $data);
foreach ($data as $row) {
$dataset = json_decode($row->data);
if ($row->type == 'prestudent') {
@@ -822,197 +745,38 @@ class Students extends FHCAPI_Controller
}
}
+
+ $this->studentlistlib->addSelect("COALESCE(
+ v.semester::text,
+ CASE
+ WHEN public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
+ THEN public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)::text
+ ELSE ''::text
+ END
+ ) AS semester", false);
+
+
if ($prestudent_ids && $student_uids) {
- $this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids);
- $this->PrestudentModel->db->or_where_in('s.student_uid', $student_uids);
+ $this->studentlistlib->addWhere('tbl_prestudent.prestudent_id', $prestudent_ids);
+ $this->studentlistlib->addOrWhere('s.student_uid', $student_uids);
} elseif ($prestudent_ids) {
- $this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids);
+ $this->studentlistlib->addWhere('tbl_prestudent.prestudent_id', $prestudent_ids);
} elseif ($student_uids) {
- $this->PrestudentModel->db->where_in('s.student_uid', $student_uids);
+ $this->studentlistlib->addWhere('s.student_uid', $student_uids);
} else {
$this->terminateWithSuccess([]);
}
- $result = $this->PrestudentModel->load();
+
+ $this->addFilter($studiensemester_kurzbz);
+
+ $result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
- /**
- * @param string|null $studiensemester_kurzbz
- * @param string $type
- *
- * @return void
- */
- protected function prepareQuery($studiensemester_kurzbz, $type = 'LEFT')
- {
- $stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
-
- $this->load->config('stv');
-
- if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED)
- {
- $tags = $this->config->item('stv_prestudent_tags');
-
- $whereTags = '';
- if (is_array($tags) && !isEmptyArray($tags)) {
- $tags = array_keys($tags);
-
- foreach ($tags as $key => $tag) {
- $tags[$key] = $this->db->escape($tag);
- }
- $whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")";
- }
- $subQueryTag = "
- (
- SELECT
- tag.prestudent_id,
- COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags
- FROM (
- SELECT DISTINCT ON (n.notiz_id)
- n.notiz_id AS id,
- nt.typ_kurzbz,
- array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung,
- n.text AS notiz,
- nt.style,
- n.erledigt AS done,
- nz.prestudent_id
- FROM public.tbl_notizzuordnung AS nz
- JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id
- JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz "
- . $whereTags .
- "
- ) AS tag
- GROUP BY tag.prestudent_id
- ) AS tag_data_agg
- ";
- }
-
- $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
- $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
- $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', $type);
- $this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', '
- pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL)
- AND pls.prestudent_id=tbl_prestudent.prestudent_id
- AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL)
- AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT');
- $this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT');
- $this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid', 'LEFT');
- $this->PrestudentModel->addJoin(
- 'public.tbl_studentlehrverband v',
- 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz' . ($studiensemester_kurzbz ? '=' . $stdsemEsc : ' IS NULL'),
- $type
- );
- $this->PrestudentModel->addJoin('public.tbl_prestudentstatus ps', '
- ps.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
- AND ps.prestudent_id=tbl_prestudent.prestudent_id
- AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
- AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')', 'LEFT');
-
- if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED)
- {
- $this->PrestudentModel->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT');
- }
-
-
- $this->PrestudentModel->addSelect("b.uid");
- if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED)
- {
- $this->PrestudentModel->addSelect('tag_data_agg.tags');
- }
- $this->PrestudentModel->addSelect('titelpre');
- $this->PrestudentModel->addSelect('nachname');
- $this->PrestudentModel->addSelect('vorname');
- $this->PrestudentModel->addSelect('wahlname');
- $this->PrestudentModel->addSelect('vornamen');
- $this->PrestudentModel->addSelect('titelpost');
- $this->PrestudentModel->addSelect('ersatzkennzeichen');
- $this->PrestudentModel->addSelect('gebdatum');
- $this->PrestudentModel->addSelect('geschlecht');
- $this->PrestudentModel->addSelect('foto');
- $this->PrestudentModel->addSelect('foto_sperre');
-
- // semester
- // verband
- // gruppe
-
- //add status per semester
- $this->PrestudentModel->addSelect(
- "public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
- . $this->PrestudentModel->escape($studiensemester_kurzbz)
- . ") AS statusofsemester"
- );
-
- $this->PrestudentModel->addSelect('UPPER(stg.typ || stg.kurzbz) AS studiengang');
- $this->PrestudentModel->addSelect('tbl_prestudent.studiengang_kz');
- $this->PrestudentModel->addSelect('stg.bezeichnung AS stg_bezeichnung');
- $this->PrestudentModel->addSelect("s.matrikelnr");
- $this->PrestudentModel->addSelect('p.person_id');
- $this->PrestudentModel->addSelect('pls.status_kurzbz AS status');
- $this->PrestudentModel->addSelect('pls.datum AS status_datum');
- $this->PrestudentModel->addSelect('pls.bestaetigtam AS status_bestaetigung');
- $this->PrestudentModel->addSelect(
- "(SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id=p.person_id AND zustellung LIMIT 1) AS mail_privat",
- false
- );
- $this->PrestudentModel->addSelect("
- CASE WHEN b.uid IS NOT NULL AND b.uid<>''
- THEN CONCAT(b.uid, '@', " . $this->PrestudentModel->escape(DOMAIN) . ")
- ELSE '' END AS mail_intern", false);
- $this->PrestudentModel->addSelect('p.anmerkung AS anmerkungen');
- $this->PrestudentModel->addSelect('tbl_prestudent.anmerkung');
- $this->PrestudentModel->addSelect('pls.orgform_kurzbz');
- $this->PrestudentModel->addSelect('aufmerksamdurch_kurzbz');
- $this->PrestudentModel->addSelect(
- "(SELECT rt_gesamtpunkte AS punkte FROM public.tbl_prestudent WHERE prestudent_id=ps.prestudent_id) AS punkte",
- false
- );
- $this->PrestudentModel->addSelect('tbl_prestudent.aufnahmegruppe_kurzbz');
- $this->PrestudentModel->addSelect('tbl_prestudent.dual');
- $this->PrestudentModel->addSelect('p.matr_nr');
- $this->PrestudentModel->addSelect('sp.bezeichnung AS studienplan_bezeichnung');
- $this->PrestudentModel->addSelect('tbl_prestudent.prestudent_id');
-
- // priorisierung_relativ
-
- $this->PrestudentModel->addSelect('mentor');
- $this->PrestudentModel->addSelect('b.aktiv AS bnaktiv');
- $this->PrestudentModel->addSelect('unruly');
-
- $this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs);
-
- $this->PrestudentModel->addOrder('nachname');
- $this->PrestudentModel->addOrder('vorname');
- }
-
- /**
- * @return void
- */
- protected function addSelectPrioRel()
- {
- $this->PrestudentModel->addSelect("(
- SELECT count(*)
- FROM (
- SELECT *, public.get_rolle_prestudent(pss.prestudent_id, NULL) AS laststatus
- FROM public.tbl_prestudent pss
- JOIN public.tbl_prestudentstatus USING (prestudent_id)
- WHERE person_id = p.person_id
- AND studiensemester_kurzbz = (
- SELECT studiensemester_kurzbz
- FROM public.tbl_prestudentstatus
- WHERE prestudent_id = tbl_prestudent.prestudent_id
- AND status_kurzbz = 'Interessent'
- LIMIT 1
- )
- AND status_kurzbz = 'Interessent'
- ) prest
- WHERE laststatus NOT IN ('Abbrecher', 'Abgewiesener', 'Absolvent')
- AND priorisierung <= tbl_prestudent.priorisierung
- ) || ' (' || COALESCE(tbl_prestudent.priorisierung::text, ' '::text) || ')' AS priorisierung_relativ", false);
- }
-
/**
* Adds additional filters to the query
*
diff --git a/application/controllers/jobs/AbgabetoolJob.php b/application/controllers/jobs/AbgabetoolJob.php
index b81053032..2e5c4d7b9 100644
--- a/application/controllers/jobs/AbgabetoolJob.php
+++ b/application/controllers/jobs/AbgabetoolJob.php
@@ -358,7 +358,8 @@ class AbgabetoolJob extends JOB_Controller
foreach($assistenzMap as $assistenz_person_id => $tupelArr) {
$abgabenString = '';
-
+ $hasContent = false;
+
foreach($tupelArr as $tupel) {
$projektarbeit_id = $tupel[0];
$assistenzRow = $tupel[1];
@@ -377,6 +378,7 @@ class AbgabetoolJob extends JOB_Controller
if(count($relevantAbgaben) == 0) {
continue;
}
+ $hasContent = true;
// Format the Student Name
$s = $relevantAbgaben[0];
@@ -447,7 +449,12 @@ class AbgabetoolJob extends JOB_Controller
}
$abgabenString .= '
';
-
+
+ // skip send entirely
+ if (!$hasContent) {
+ continue;
+ }
+
// done with building the change list, now send it
$assistenzRow = $tupelArr[0][1];
$anrede = $assistenzRow->anrede;
diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php
index 8dc4870ea..5b72518d2 100644
--- a/application/controllers/jobs/AntragJob.php
+++ b/application/controllers/jobs/AntragJob.php
@@ -40,6 +40,13 @@ class AntragJob extends JOB_Controller
*/
public function sendStglSammelmail()
{
+
+ if ($this->config->item('abmeldung_enabled') !== true &&
+ $this->config->item('abmeldung_stg_enabled') !== true &&
+ $this->config->item('unterbrechung_enabled') !== true &&
+ $this->config->item('wiederholung_enabled') !== true)
+ return $this->logError('Konnte Job nicht starten: Keine der Configs "abmeldung_stg_enabled", "abmeldung_enabled", "unterbrechung_enabled", "wiederholung_enabled" auf true gesetzt');
+
$this->load->model('person/Person_model', 'PersonModel');
$this->logInfo('Start Job sendStglSammelmail');
@@ -47,25 +54,38 @@ class AntragJob extends JOB_Controller
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->StudierendenantragModel->addJoin('public.tbl_prestudent', 'prestudent_id');
- $this->db->group_start();
- $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG);
- $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED);
- $this->db->group_end();
- $this->db->or_group_start();
- $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL);
- $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED);
- $this->db->group_end();
+ if ($this->config->item('abmeldung_enabled') === true)
+ {
+ $this->db->group_start();
+ $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG);
+ $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED);
+ $this->db->group_end();
+ }
- $this->db->or_group_start();
- $this->db->where('typ', Studierendenantrag_model::TYP_UNTERBRECHUNG);
- $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED);
- $this->db->group_end();
+ if ($this->config->item('abmeldung_stg_enabled') === true)
+ {
+ $this->db->or_group_start();
+ $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL);
+ $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED);
+ $this->db->group_end();
+ }
- $this->db->or_group_start();
- $this->db->where('typ', Studierendenantrag_model::TYP_WIEDERHOLUNG);
- $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_LVSASSIGNED);
- $this->db->group_end();
+ if ($this->config->item('unterbrechung_enabled') === true)
+ {
+ $this->db->or_group_start();
+ $this->db->where('typ', Studierendenantrag_model::TYP_UNTERBRECHUNG);
+ $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED);
+ $this->db->group_end();
+ }
+
+ if ($this->config->item('wiederholung_enabled') === true)
+ {
+ $this->db->or_group_start();
+ $this->db->where('typ', Studierendenantrag_model::TYP_WIEDERHOLUNG);
+ $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_LVSASSIGNED);
+ $this->db->group_end();
+ }
$result = $this->StudierendenantragModel->load();
if(isError($result))
@@ -206,6 +226,10 @@ class AntragJob extends JOB_Controller
public function sendReminderWiedereinstieg()
{
$now = new DateTime();
+
+ if ($this->config->item('unterbrechung_enabled') !== true)
+ return $this->logError('Konnte Job nicht starten: Config "unterbrechung_enabled" nicht auf true gesetzt');
+
$modifier = $this->config->item('unterbrechung_job_remind_wiedereinstieg_date_modifier');
if (!$modifier)
@@ -363,6 +387,13 @@ class AntragJob extends JOB_Controller
{
$this->logInfo('Start Job handleWiederholerDeadline');
+ if ($this->config->item('wiederholung_enabled') !== true)
+ {
+ $this->logError('Config "wiederholung_enabled" nicht auf true gesetzt');
+ $this->logInfo('Ende Job handleWiederholerDeadline');
+ return;
+ }
+
$this->load->library('PrestudentLib');
$insertvon = $this->config->item('antrag_job_systemuser');
@@ -481,6 +512,13 @@ class AntragJob extends JOB_Controller
{
$this->logInfo('Start Job handleAbmeldungenStglDeadline');
+ if ($this->config->item('abmeldung_stg_enabled') !== true)
+ {
+ $this->logError('Config "abmeldung_stg_enabled" nicht auf true gesetzt');
+ $this->logInfo('Ende Job handleAbmeldungenStglDeadline');
+ return;
+ }
+
$insertvon = $this->config->item('antrag_job_systemuser');
if (!$insertvon) {
$this->logError('Config "antrag_job_systemuser" nicht gesetzt');
@@ -614,6 +652,13 @@ class AntragJob extends JOB_Controller
{
$this->logInfo('Start Job sendAufforderungWiederholer');
+ if ($this->config->item('wiederholung_enabled') !== true)
+ {
+ $this->logError('Config "wiederholung_enabled" nicht auf true gesetzt');
+ $this->logInfo('Ende Job sendAufforderungWiederholer');
+ return;
+ }
+
$modifier_request_1 = $this->config->item('wiederholung_job_request_1_date_modifier');
$modifier_request_2 = $this->config->item('wiederholung_job_request_2_date_modifier');
$modifier_deadline = $this->config->item('wiederholung_job_deadline_date_modifier');
diff --git a/application/controllers/lehre/Studierendenantrag.php b/application/controllers/lehre/Studierendenantrag.php
index 107c9af96..ebc1d2eaa 100644
--- a/application/controllers/lehre/Studierendenantrag.php
+++ b/application/controllers/lehre/Studierendenantrag.php
@@ -28,7 +28,9 @@ class Studierendenantrag extends FHC_Controller
'studierendenantrag'
]);
- if (strtolower($this->router->method) === 'leitung')
+ $this->load->config('studierendenantrag');
+
+ if (strtolower($this->router->method) === 'leitung')
$this->_isAllowed([
'leitung' => ['student/studierendenantrag:r', 'student/antragfreigabe:r']
]);
@@ -54,18 +56,27 @@ class Studierendenantrag extends FHC_Controller
'bezeichnungStg' => $antrag->bezeichnung,
'bezeichnungOrgform' => $antrag->orgform
);
-
- $result = $this->antraglib->getPrestudentWiederholungsBerechtigt($antrag->prestudent_id);
- if (getData($result) == 1)
- $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Wiederholung';
- $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($antrag->prestudent_id);
- if (getData($result) == 1)
- $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Unterbrechung';
+ if ($this->config->item('wiederholung_enabled') === true)
+ {
+ $result = $this->antraglib->getPrestudentWiederholungsBerechtigt($antrag->prestudent_id);
+ if (getData($result) == 1)
+ $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Wiederholung';
+ }
- $result = $this->antraglib->getPrestudentAbmeldeBerechtigt($antrag->prestudent_id);
- if (getData($result) == 1)
- $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Abmeldung';
+ if ($this->config->item('unterbrechung_enabled') === true)
+ {
+ $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($antrag->prestudent_id);
+ if (getData($result) == 1)
+ $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Unterbrechung';
+ }
+
+ if ($this->config->item('abmeldung_enabled') === true)
+ {
+ $result = $this->antraglib->getPrestudentAbmeldeBerechtigt($antrag->prestudent_id);
+ if (getData($result) == 1)
+ $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Abmeldung';
+ }
}
if ($antrag->studierendenantrag_id == null)
continue;
@@ -88,45 +99,59 @@ class Studierendenantrag extends FHC_Controller
$this->load->view('lehre/Antrag/Leitung/List', [
'stgA' => $stgA,
- 'stgL' => $stgL
+ 'stgL' => $stgL,
+ 'abmeldung_enabled' => $this->config->item('abmeldung_stg_enabled')
]);
}
public function abmeldung($prestudent_id, $studierendenantrag_id = null)
{
- $this->load->view('lehre/Antrag/Create', [
- 'prestudent_id' => $prestudent_id,
- 'studierendenantrag_id' => $studierendenantrag_id,
- 'antrag_type' => 'Abmeldung'
- ]);
+ if ($this->config->item('abmeldung_enabled') === true)
+ {
+ $this->load->view('lehre/Antrag/Create', [
+ 'prestudent_id' => $prestudent_id,
+ 'studierendenantrag_id' => $studierendenantrag_id,
+ 'antrag_type' => 'Abmeldung'
+ ]);
+ }
}
public function abmeldungstgl($prestudent_id, $studierendenantrag_id = null)
{
- $this->load->view('lehre/Antrag/Create', [
- 'prestudent_id' => $prestudent_id,
- 'studierendenantrag_id' => $studierendenantrag_id,
- 'antrag_type' => 'AbmeldungStgl'
- ]);
+ if ($this->config->item('abmeldung_stg_enabled') === true)
+ {
+ $this->load->view('lehre/Antrag/Create', [
+ 'prestudent_id' => $prestudent_id,
+ 'studierendenantrag_id' => $studierendenantrag_id,
+ 'antrag_type' => 'AbmeldungStgl'
+ ]);
+ }
}
public function unterbrechung($prestudent_id, $studierendenantrag_id = null)
{
- $this->load->view('lehre/Antrag/Create', [
- 'prestudent_id' => $prestudent_id,
- 'studierendenantrag_id' => $studierendenantrag_id,
- 'antrag_type' => 'Unterbrechung'
- ]);
+ if ($this->config->item('unterbrechung_enabled') === true)
+ {
+ $this->load->view('lehre/Antrag/Create', [
+ 'prestudent_id' => $prestudent_id,
+ 'studierendenantrag_id' => $studierendenantrag_id,
+ 'antrag_type' => 'Unterbrechung'
+ ]);
+ }
+
}
public function wiederholung($prestudent_id, $studierendenantrag_id = null)
{
- $this->load->view('lehre/Antrag/Create', [
- 'prestudent_id' => $prestudent_id,
- 'studierendenantrag_id' => $studierendenantrag_id,
- 'antrag_type' => 'Wiederholung'
- ]);
+ if ($this->config->item('wiederholung_enabled') === true)
+ {
+ $this->load->view('lehre/Antrag/Create', [
+ 'prestudent_id' => $prestudent_id,
+ 'studierendenantrag_id' => $studierendenantrag_id,
+ 'antrag_type' => 'Wiederholung'
+ ]);
+ }
}
/**
diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php
index 3d8a2ea26..35edc826c 100644
--- a/application/libraries/AntragLib.php
+++ b/application/libraries/AntragLib.php
@@ -1657,7 +1657,7 @@ class AntragLib
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere($where);
if (isError($result))
- return $result;
+ return $result;
if (!hasData($result))
return error($this->_ci->p->t('studierendenantrag', "error_no_antrag_found", ['id' => $studierendenantrag_id]));
@@ -1709,6 +1709,7 @@ class AntragLib
$result->statustyp = $antrag->statustyp;
$result->status_insertvon = $antrag->status_insertvon;
$result->grund = $antrag->grund;
+ $result->status_grund = $antrag->status_grund;
$result->studierendenantrag_id = $antrag->studierendenantrag_id;
$result->typ = $antrag->typ;
$result->datum = $antrag->datum;
diff --git a/application/libraries/StundenplanLib.php b/application/libraries/StundenplanLib.php
index 7ed64da2c..a7bec61ec 100644
--- a/application/libraries/StundenplanLib.php
+++ b/application/libraries/StundenplanLib.php
@@ -40,13 +40,16 @@ class StundenplanLib
* @return stdClass
* @access public
*/
- public function getEventsUser($start, $end)
+ public function getEventsUser($start, $end, $uid = null)
{
$this->_ci =& get_instance();
$this->_ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
- $uid = getAuthUID();
+ if (!$uid) {
+ $uid = getAuthUID();
+ }
+
if (is_null($uid))
return error("No UID");
@@ -217,7 +220,7 @@ class StundenplanLib
* @param string $ort_kurzbz
* @return stdClass
*/
- public function getReservierungen($start_date, $end_date, $ort_kurzbz = '')
+ public function getReservierungen($start_date, $end_date, $ort_kurzbz = '', $uid = null)
{
$this->_ci =& get_instance();
@@ -228,14 +231,14 @@ class StundenplanLib
$this->_ci->load->model('ressource/Reservierung_model', 'ReservierungModel');
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
- $is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter(getAuthUID()));
+ $is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter($uid ?? getAuthUID()));
if ($is_mitarbeiter && empty($ort_kurzbz)) {
// request for personal lvplan show only reservations of logged in user
- $reservierungen = $this->_ci->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date);
+ $reservierungen = $this->_ci->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date, $uid);
} else {
// querying the reservierungen
- $reservierungen = $this->_ci->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz);
+ $reservierungen = $this->_ci->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz, $uid);
}
if (isError($reservierungen))
@@ -357,7 +360,10 @@ class StundenplanLib
if (isError($ort_content_object)) {
return error(getData($ort_content_object));
}
- $ort_content_object = getData($ort_content_object)[0];
+ $ort_content_object_data = getData($ort_content_object);
+ $ort_content_object = (is_array($ort_content_object_data) && count($ort_content_object_data) > 0)
+ ? $ort_content_object_data[0]
+ : null;
if($ort_content_object) {
$item->ort_content_id = $ort_content_object->content_id;
}
@@ -445,6 +451,24 @@ class StundenplanLib
return success($ferienEventsFlattened);
}
+ public function getEventsStgOrg( $start, $end, $stg_kz, $sem, $verband, $gruppe)
+ {
+ $this->_ci =& get_instance();
+
+ $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
+
+ $stundenplan_data = $this->_ci->StundenplanModel->getStundenplanStudiengang($start, $end, $stg_kz, $sem, $verband, $gruppe);
+ if (isError($stundenplan_data))
+ return $stundenplan_data;
+ $stundenplan_data = getData($stundenplan_data) ?? [];
+
+ $function_error = $this->expandObjectInformation($stundenplan_data);
+ if ($function_error)
+ return $function_error;
+
+ return success($stundenplan_data);
+ }
+
// start of the private functions ########################################################################################################
// function used to sort an array of studiensemester strings
diff --git a/application/libraries/dashboard/DashboardLib.php b/application/libraries/dashboard/DashboardLib.php
index 1c3983108..c9838f0e7 100644
--- a/application/libraries/dashboard/DashboardLib.php
+++ b/application/libraries/dashboard/DashboardLib.php
@@ -37,7 +37,9 @@ class DashboardLib
public function getDashboardByKurzbz($dashboard_kurzbz)
{
- $result = $this->_ci->DashboardModel->getDashboardByKurzbz($dashboard_kurzbz);
+ $result = $this->_ci->DashboardModel->loadWhere([
+ 'dashboard_kurzbz' => $dashboard_kurzbz
+ ]);
if (hasData($result))
{
@@ -47,17 +49,21 @@ class DashboardLib
return null;
}
- public function getMergedConfig($dashboard_id, $uid)
+ public function getMergedUserConfig($dashboard_id, $uid)
{
- $defaultconfig = $this->getDefaultConfig($dashboard_id);
- $userconfig = $this->getUserConfig($dashboard_id, $uid);
+ $defaultconfig = $this->getUserBaseConfig($dashboard_id);
+ $userconfig = $this->getUserOverrideConfig($dashboard_id, $uid);
- $mergedconfig = array_replace_recursive($defaultconfig, $userconfig);
+ $sourceconfig = array_map(function ($value) {
+ return ['source' => $value['source']];
+ }, $defaultconfig);
+
+ $mergedconfig = array_replace_recursive($defaultconfig, $userconfig, $sourceconfig);
return $mergedconfig;
}
- public function getDefaultConfig($dashboard_id)
+ protected function getUserBaseConfig($dashboard_id)
{
$funktion_kurzbzs = [];
$rights = $this->_ci->permissionlib->getAccessRights();
@@ -87,7 +93,11 @@ class DashboardLib
$preset = json_decode($presetobj->preset, true);
if (null !== $preset)
{
- $defaultconfig = array_replace_recursive($defaultconfig, $preset);
+ $preset = array_map(function ($value) use ($presetobj) {
+ $value['source'] = $presetobj->funktion_kurzbz ?: self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL;
+ return $value;
+ }, $preset);
+ $defaultconfig = array_merge_recursive($defaultconfig, $preset);
}
}
}
@@ -95,7 +105,7 @@ class DashboardLib
return $defaultconfig;
}
- public function getUserConfig($dashboard_id, $uid)
+ protected function getUserOverrideConfig($dashboard_id, $uid)
{
$res_userconfig = $this->_ci->DashboardOverrideModel->getOverride($dashboard_id, $uid);
@@ -124,7 +134,7 @@ class DashboardLib
$emptyoverride = new stdClass();
$emptyoverride->dashboard_id = $dashboard->dashboard_id;
$emptyoverride->uid = $uid;
- $emptyoverride->override = '{"' . self::USEROVERRIDE_SECTION . '": {"widgets":{}}, "custom": { "widgets" : {}}}';
+ $emptyoverride->override = '[]';
return $emptyoverride;
}
@@ -143,8 +153,7 @@ class DashboardLib
$emptypreset = new stdClass();
$emptypreset->dashboard_id = $dashboard->dashboard_id;
$emptypreset->funktion_kurzbz = $funktion_kurzbz;
- $section = ($funktion_kurzbz !== null) ? $funktion_kurzbz : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL;
- $emptypreset->preset = '{"' . $section . '": { "widgets" : {}},"custom": { "widgets" : {}}}';
+ $emptypreset->preset = '[]';
return $emptypreset;
}
@@ -209,44 +218,4 @@ class DashboardLib
return $result;
}
-
- public function addWidgetsToWidgets(&$widgets, $dashboard_kurzbz, $section, $addwigets)
- {
- foreach ($addwigets as $widget)
- {
- if(!isset($widget['widgetid']))
- {
- $widget['widgetid'] = $this->generateWidgetId($dashboard_kurzbz);
- }
- $this->addWidgetToWidgets($widgets, $section, $widget, $widget['widgetid']);
- }
- }
-
- public function addWidgetToWidgets(&$widgets, $section, $widget, $widgetid)
- {
- $section = ($section !== null) ? $section : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL;
- if (!isset($widgets[$section]) || !isset($widgets[$section]["widgets"]) || !is_array($widgets[$section]))
- {
- $widgets[$section] = array();
- $widgets[$section]["widgets"] = array();
- }
-
- $widgets[$section]["widgets"][$widgetid] = $widget;
- }
-
- public function removeWidgetFromWidgets(&$widgets, $section, $widgetid)
- {
- $section = ($section !== null) ? $section : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL;
- if (isset($widgets[$section]) && isset($widgets[$section]["widgets"][$widgetid]))
- {
- unset($widgets[$section]["widgets"][$widgetid]);
- if(empty($widgets[$section]["widgets"]) && $section !== self::USEROVERRIDE_SECTION) {
- unset($widgets[$section]);
- }
- return true;
- }
- else {
- return false;
- }
- }
}
diff --git a/application/libraries/stv/StudentListLib.php b/application/libraries/stv/StudentListLib.php
new file mode 100644
index 000000000..bb44c8bb0
--- /dev/null
+++ b/application/libraries/stv/StudentListLib.php
@@ -0,0 +1,363 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * This generates a list of students and or prestudents used for Studierendenverwaltung
+ */
+class StudentListLib
+{
+ private $_ci; // Code igniter instance
+
+ private $_allowedStgs = [];
+ private $_selects = [];
+ private $_joins = [];
+
+ /**
+ * Gets the CI instance, loads model and prepares default values
+ *
+ * @param array $params
+ *
+ * @return void
+ */
+ public function __construct($params = null)
+ {
+ $this->_ci =& get_instance(); // get code igniter instance
+
+ $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel');
+
+ if (isset($params['allowedStgs']))
+ $this->_allowedStgs = $params['allowedStgs'];
+
+ // Add default SELECTs
+ $this->addSelect("b.uid");
+ if (defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED)
+ $this->addSelect('tag_data_agg.tags');
+ $this->addSelect('titelpre');
+ $this->addSelect('nachname');
+ $this->addSelect('vorname');
+ $this->addSelect('wahlname');
+ $this->addSelect('vornamen');
+ $this->addSelect('titelpost');
+ $this->addSelect('ersatzkennzeichen');
+ $this->addSelect('gebdatum');
+ $this->addSelect('geschlecht');
+ $this->addSelect('foto');
+ $this->addSelect('foto_sperre');
+ $this->addSelect('v.semester');
+ $this->addSelect('v.verband');
+ $this->addSelect('v.gruppe');
+ $this->addSelect("statusofsemester"); // Will be replaced later
+ $this->addSelect('UPPER(stg.typ || stg.kurzbz) AS studiengang');
+ $this->addSelect('tbl_prestudent.studiengang_kz');
+ $this->addSelect('stg.bezeichnung AS stg_bezeichnung');
+ $this->addSelect("s.matrikelnr");
+ $this->addSelect('p.person_id');
+ $this->addSelect('pls.status_kurzbz AS status');
+ $this->addSelect('pls.datum AS status_datum');
+ $this->addSelect('pls.bestaetigtam AS status_bestaetigung');
+ $this->addSelect(
+ "(SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id=p.person_id AND zustellung LIMIT 1) AS mail_privat",
+ false
+ );
+ $this->addSelect("
+ CASE WHEN b.uid IS NOT NULL AND b.uid<>''
+ THEN CONCAT(b.uid, '@', " . $this->_ci->PrestudentModel->escape(DOMAIN) . ")
+ ELSE '' END AS mail_intern", false);
+ $this->addSelect('p.anmerkung AS anmerkungen');
+ $this->addSelect('tbl_prestudent.anmerkung');
+ $this->addSelect('pls.orgform_kurzbz');
+ $this->addSelect('aufmerksamdurch_kurzbz');
+ $this->addSelect(
+ "(SELECT rt_gesamtpunkte AS punkte FROM public.tbl_prestudent WHERE prestudent_id=ps.prestudent_id) AS punkte",
+ false
+ );
+ $this->addSelect('tbl_prestudent.aufnahmegruppe_kurzbz');
+ $this->addSelect('tbl_prestudent.dual');
+ $this->addSelect('p.matr_nr');
+ $this->addSelect('sp.bezeichnung AS studienplan_bezeichnung');
+ $this->addSelect('tbl_prestudent.prestudent_id');
+ $this->addSelect("(
+ SELECT count(*)
+ FROM (
+ SELECT *, public.get_rolle_prestudent(pss.prestudent_id, NULL) AS laststatus
+ FROM public.tbl_prestudent pss
+ JOIN public.tbl_prestudentstatus USING (prestudent_id)
+ WHERE person_id = p.person_id
+ AND studiensemester_kurzbz = (
+ SELECT studiensemester_kurzbz
+ FROM public.tbl_prestudentstatus
+ WHERE prestudent_id = tbl_prestudent.prestudent_id
+ AND status_kurzbz = 'Interessent'
+ LIMIT 1
+ )
+ AND status_kurzbz = 'Interessent'
+ ) prest
+ WHERE laststatus NOT IN ('Abbrecher', 'Abgewiesener', 'Absolvent')
+ AND priorisierung <= tbl_prestudent.priorisierung
+ ) || ' (' || COALESCE(tbl_prestudent.priorisierung::text, ' '::text) || ')' AS priorisierung_relativ", false); // TODO(chris): overwrite in fetchStudents
+ $this->addSelect('mentor');
+ $this->addSelect('b.aktiv AS bnaktiv');
+ $this->addSelect('unruly');
+
+ // Add default JOINs
+ $this->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
+ $this->addJoin('public.tbl_person p', 'person_id');
+ $this->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT'); // TODO(chris): overwrite in fetchStudents
+ $this->addJoin('public.tbl_prestudentstatus pls', '
+ pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL)
+ AND pls.prestudent_id=tbl_prestudent.prestudent_id
+ AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL)
+ AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT');
+ $this->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT');
+ $this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid', 'LEFT');
+ $this->addJoin("v", "", ""); // Will be replaced later
+ $this->addJoin("ps", "", ""); // Will be replaced later
+ if (defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) {
+ $this->_ci->load->config('stv');
+ $tags = $this->_ci->config->item('stv_prestudent_tags');
+
+ $whereTags = '';
+ if (is_array($tags) && !isEmptyArray($tags)) {
+ $tags = array_keys($tags);
+
+ foreach ($tags as $key => $tag) {
+ $tags[$key] = $this->_ci->PrestudentModel->escape($tag);
+ }
+ $whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")";
+ }
+ $subQueryTag = "(
+ SELECT
+ tag.prestudent_id,
+ COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags
+ FROM (
+ SELECT DISTINCT ON (n.notiz_id)
+ n.notiz_id AS id,
+ nt.typ_kurzbz,
+ array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung,
+ n.text AS notiz,
+ nt.style,
+ n.erledigt AS done,
+ nz.prestudent_id
+ FROM public.tbl_notizzuordnung AS nz
+ JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id
+ JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz " . $whereTags . "
+ ) AS tag
+ GROUP BY tag.prestudent_id
+ ) AS tag_data_agg";
+
+ $this->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT');
+ }
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Adds a SELECT statement to the query.
+ *
+ * @param string|array $select
+ * @param boolean $escape (optional)
+ *
+ * @return void
+ */
+ public function addSelect($select, $escape = true)
+ {
+ if (is_array($select)) {
+ foreach ($select as $s)
+ $this->addSelect($s, $escape);
+ return;
+ }
+ $alias = $this->getAliasFromSelect($select);
+ $this->_selects[$alias] = [$select, $escape];
+ }
+
+ /**
+ * Joins a table to the query.
+ *
+ * @param string $table
+ * @param string $cond
+ * @param string $type (optional)
+ * @param string $position (optional)
+ *
+ * @return void
+ */
+ public function addJoin($table, $cond, $type = '', $position = 'end')
+ {
+ $alias = $this->getAliasFromTable($table);
+
+ if ($position == 'end') {
+ return $this->_joins[$alias] = [$table, $cond, $type];
+ }
+
+ if ($position == 'start') {
+ return $this->_joins = [$alias => [$table, $cond, $type]] + $this->_joins;
+ }
+
+ if (substr($position, 0, 7) == 'before_') {
+ $ref = substr($position, 7);
+ $index = 0;
+ } elseif (substr($position, 0, 6) == 'after_') {
+ $ref = substr($position, 6);
+ $index = 1;
+ } else {
+ return $this->addJoin($table, $cond, $type);
+ }
+ if (!isset($this->_joins[$ref]))
+ return $this->addJoin($table, $cond, $type);
+
+ $key_indeces = array_flip(array_keys($this->_joins));
+ $index += $key_indeces[$ref];
+
+ if (!$index)
+ return $this->addJoin($table, $cond, $type, 'start');
+
+ $front_part = array_slice($this->_joins, 0, $index, true);
+ $back_part = array_slice($this->_joins, $index, null, true);
+
+ if (isset($front_part[$alias])) {
+ unset($front_part[$alias]);
+ }
+
+ $this->_joins = $front_part + [$alias => [$table, $cond, $type]] + $back_part;
+ }
+
+ /**
+ * Adds a WHERE clause to the query.
+ *
+ * @param string|array $key
+ * @param string|array $value
+ * @param boolean $escape
+ *
+ * @return void
+ */
+ public function addWhere($key, $value = null, $escape = true)
+ {
+ if (!is_array($key) && is_array($value)) {
+ $this->_ci->PrestudentModel->db->where_in($key, $value, $escape);
+ } else {
+ $this->_ci->PrestudentModel->db->where($key, $value, $escape);
+ }
+ }
+
+ /**
+ * Adds a OR WHERE clause to the query.
+ *
+ * @param string|array $key
+ * @param string|array $value
+ * @param boolean $escape
+ *
+ * @return void
+ */
+ public function addOrWhere($key, $value = null, $escape = true)
+ {
+ if (!is_array($key) && is_array($value)) {
+ $this->_ci->PrestudentModel->db->or_where_in($key, $value, $escape);
+ } else {
+ $this->_ci->PrestudentModel->db->or_where($key, $value, $escape);
+ }
+ }
+
+ /**
+ * Generates the query and executes it.
+ *
+ * @param string|null $studiensemester_kurzbz
+ *
+ * @return stdClass result of the query
+ */
+ public function execute($studiensemester_kurzbz)
+ {
+ $stdsemEsc = $studiensemester_kurzbz ? $this->_ci->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
+
+
+ $this->addSelect(
+ "public.get_rolle_prestudent(
+ public.tbl_prestudent.prestudent_id,
+ " . $this->_ci->PrestudentModel->escape($studiensemester_kurzbz) . "
+ ) AS statusofsemester"
+ );
+ $this->addJoin(
+ 'public.tbl_studentlehrverband v',
+ 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz' . ($studiensemester_kurzbz ? '=' . $stdsemEsc : ' IS NULL'),
+ 'LEFT'
+ );
+ $this->addJoin(
+ 'public.tbl_prestudentstatus ps',
+ 'ps.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
+ AND ps.prestudent_id=tbl_prestudent.prestudent_id
+ AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
+ AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
+ ',
+ 'LEFT'
+ );
+
+ $this->addWhere('tbl_prestudent.studiengang_kz', $this->_allowedStgs);
+
+ foreach ($this->_joins as $join)
+ $this->_ci->PrestudentModel->addJoin($join[0], $join[1], $join[2]);
+
+ foreach ($this->_selects as $select)
+ $this->_ci->PrestudentModel->addSelect($select[0], $select[1]);
+
+ $this->_ci->PrestudentModel->addOrder('nachname');
+ $this->_ci->PrestudentModel->addOrder('vorname');
+
+ return $this->_ci->PrestudentModel->load();
+ }
+
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Protected methods
+
+ /**
+ * Get alias of a table or select statement
+ *
+ * @param string $select
+ *
+ * @return string
+ */
+ final protected function getAliasFromSelect($select)
+ {
+ if (strpos($select, ' ') !== false) {
+ return trim(strrchr($select, ' '));
+ }
+
+ if (strpos($select, '.') !== false) {
+ return substr(strrchr($select, '.'), 1);
+ }
+
+ return $select;
+ }
+
+ /**
+ * Get alias of a table or select statement
+ *
+ * @param string|array $table
+ *
+ * @return string|array
+ */
+ final protected function getAliasFromTable($table)
+ {
+ if (strpos($table, ' ') !== false) {
+ return trim(strrchr($table, ' '));
+ }
+
+ return $table;
+ }
+}
diff --git a/application/libraries/vertragsbestandteil/AbstractBestandteil.php b/application/libraries/vertragsbestandteil/AbstractBestandteil.php
index ccd05f5e2..4e1e8b9d0 100644
--- a/application/libraries/vertragsbestandteil/AbstractBestandteil.php
+++ b/application/libraries/vertragsbestandteil/AbstractBestandteil.php
@@ -40,7 +40,9 @@ abstract class AbstractBestandteil implements IValidation
if( is_bool($new_value) && ($old_value !== $new_value) ) {
$this->modifiedcolumns[$columnname] = $columnname;
- } else if($old_value != $new_value) {
+ } else if(is_null($old_value) xor is_null($new_value)) {
+ $this->modifiedcolumns[$columnname] = $columnname;
+ } else if($old_value != $new_value) {
$this->modifiedcolumns[$columnname] = $columnname;
}
}
diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php
index 0e071f36b..71104fa91 100644
--- a/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php
+++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php
@@ -137,19 +137,25 @@ EOTXT;
return parent::__toString() . $txt;
}
- /* public function validate()
+ public function validate()
{
- if( !(filter_var($this->tage, FILTER_VALIDATE_INT,
- array(
- 'options' => array(
- 'min_range' => 1,
- 'max_range' => 50
- )
- )
- )) ) {
- $this->validationerrors[] = 'Urlaubsanspruch muss eine Tagesanzahl im Bereich 1 bis 50 sein.';
+ $value = $this->vordienstzeit;
+
+ if ($value === null || $value === '') {
+ $result = null; // allow null value
+ } else {
+ $result = filter_var($value, FILTER_VALIDATE_INT, [
+ 'options' => [
+ 'min_range' => 0,
+ 'max_range' => 100
+ ]
+ ]);
+
+ if ($result === false) {
+ $this->validationerrors[] = 'Vordienstjahre muss eine ganze Zahl (0 bis 100) enthalten oder leer sein.';
+ }
}
return parent::validate();
- } */
+ }
}
diff --git a/application/models/content/Content_model.php b/application/models/content/Content_model.php
index 278022b59..48a155cb2 100644
--- a/application/models/content/Content_model.php
+++ b/application/models/content/Content_model.php
@@ -234,9 +234,9 @@ class Content_model extends DB_Model
FROM
campus.tbl_content c1
LEFT JOIN
- campus.tbl_contentsprache s1 ON c1.content_id=s1.content_id AND s1.sprache=?
+ campus.tbl_contentsprache s1 ON c1.content_id=s1.content_id AND s1.sprache=? AND sichtbar=true
WHERE
- sichtbar=true
+ c1.aktiv = true
) s2
LEFT JOIN
campus.tbl_contentsprache s3 USING(content_id, sprache)
@@ -277,7 +277,7 @@ class Content_model extends DB_Model
JOIN
campus.tbl_contentsprache s USING(contentsprache_id)
LEFT JOIN
- campus.tbl_contentchild k ON(m.content_id=k.content_id)
+ campus.tbl_contentchild k ON(m.content_id=k.content_id) and c.aktiv = true
WHERE EXISTS (
SELECT 1
FROM campus.tbl_contentgruppe
diff --git a/application/models/dashboard/Bookmark_model.php b/application/models/dashboard/Bookmark_model.php
index 5efacc26b..d9756294e 100644
--- a/application/models/dashboard/Bookmark_model.php
+++ b/application/models/dashboard/Bookmark_model.php
@@ -11,8 +11,4 @@ class Bookmark_model extends DB_Model
$this->dbTable = 'dashboard.tbl_bookmark';
$this->pk = 'bookmark_id';
}
-
-
-
-
}
diff --git a/application/models/dashboard/Dashboard_model.php b/application/models/dashboard/Dashboard_model.php
index 88946ed83..78f6b1100 100644
--- a/application/models/dashboard/Dashboard_model.php
+++ b/application/models/dashboard/Dashboard_model.php
@@ -11,15 +11,4 @@ class Dashboard_model extends DB_Model
$this->dbTable = 'dashboard.tbl_dashboard';
$this->pk = 'dashboard_id';
}
-
-
- /**
- * Get Dashboard by kurzbz.
- * @param string dashboard_kurzbz
- * @return array
- */
- public function getDashboardByKurzbz($dashboard_kurzbz)
- {
- return $this->loadWhere(array('dashboard_kurzbz' => $dashboard_kurzbz));
- }
}
diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php
index 3b1ea55e5..0fc3710f0 100644
--- a/application/models/education/Projektarbeit_model.php
+++ b/application/models/education/Projektarbeit_model.php
@@ -187,7 +187,10 @@ class Projektarbeit_model extends DB_Model
campus.tbl_paabgabetyp.bezeichnung,
campus.tbl_paabgabetyp.benotbar,
campus.tbl_paabgabe.abgabedatum,
- campus.tbl_paabgabe.insertvon
+ campus.tbl_paabgabe.insertvon,
+ campus.tbl_paabgabe.insertamum,
+ campus.tbl_paabgabe.updatevon,
+ campus.tbl_paabgabe.updateamum
FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz)
WHERE campus.tbl_paabgabe.projektarbeit_id = ?
ORDER BY campus.tbl_paabgabe.datum";
@@ -207,7 +210,18 @@ class Projektarbeit_model extends DB_Model
campus.tbl_paabgabetyp.paabgabetyp_kurzbz,
campus.tbl_paabgabetyp.bezeichnung,
campus.tbl_paabgabe.abgabedatum,
- campus.tbl_paabgabe.insertvon
+ campus.tbl_paabgabe.insertvon,
+ campus.tbl_paabgabe.updatevon,
+ campus.tbl_paabgabe.insertamum,
+ campus.tbl_paabgabe.updateamum,
+ (SELECT p.vorname || ' ' || p.nachname
+ FROM public.tbl_benutzer b
+ JOIN public.tbl_person p USING(person_id)
+ WHERE b.uid = campus.tbl_paabgabe.insertvon) AS insertvon_fullname,
+ (SELECT p.vorname || ' ' || p.nachname
+ FROM public.tbl_benutzer b
+ JOIN public.tbl_person p USING(person_id)
+ WHERE b.uid = campus.tbl_paabgabe.updatevon) AS updatevon_fullname
FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz)
WHERE campus.tbl_paabgabe.projektarbeit_id IN ?
ORDER BY campus.tbl_paabgabe.datum";
@@ -240,7 +254,8 @@ class Projektarbeit_model extends DB_Model
LEFT JOIN public.tbl_benutzer ben USING (person_id)
LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid
WHERE (ben.aktiv OR ben.aktiv IS NULL)
- AND projektarbeit_id = ?";
+ AND projektarbeit_id = ?
+ AND lehre.tbl_projektbetreuer.betreuerart_kurzbz = ANY('{Begutachter, Betreuer, Erstbetreuer,Erstbegutachter,Senatsvorsitz}')";
return $this->execReadOnlyQuery($qry, [$projektarbeit_id]);
}
@@ -294,34 +309,142 @@ class Projektarbeit_model extends DB_Model
* Get a List of Projektarbeiten of a mitarbeiter with zuordnung
* used by the mitarbeiter cis4 abgabetool.
*/
- public function getMitarbeiterProjektarbeiten($uid, $showAll){
- $qry = "SELECT
- *
- FROM
- (SELECT tbl_person.vorname, tbl_person.nachname, tbl_studiengang.typ, tbl_studiengang.kurzbz,
- tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id, tbl_projektarbeit.note,
- tbl_projektbetreuer.person_id as betreuer_person_id, tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
- tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, public.tbl_student.student_uid
- FROM lehre.tbl_projektarbeit
- LEFT JOIN lehre.tbl_projektbetreuer using(projektarbeit_id)
- LEFT JOIN lehre.tbl_betreuerart using(betreuerart_kurzbz)
- LEFT JOIN public.tbl_benutzer on(uid=student_uid)
- LEFT JOIN public.tbl_student on(public.tbl_benutzer.uid=public.tbl_student.student_uid)
- LEFT JOIN public.tbl_person on(tbl_benutzer.person_id=tbl_person.person_id)
- LEFT JOIN lehre.tbl_lehreinheit using(lehreinheit_id)
- LEFT JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id)
- LEFT JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz=public.tbl_studiengang.studiengang_kz)
- LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
- WHERE (projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom')
- AND tbl_projektbetreuer.person_id IN (SELECT person_id FROM public.tbl_benutzer
- WHERE public.tbl_benutzer.person_id=lehre.tbl_projektbetreuer.person_id
- AND public.tbl_benutzer.uid= ? )
- ".($showAll?'':' AND public.tbl_benutzer.aktiv AND lehre.tbl_projektarbeit.note IS NULL ')."
+ public function getMitarbeiterProjektarbeiten($person_id, $showAll){
+ $qry = "WITH secondary_betreuer AS (
+ SELECT DISTINCT ON (pb.projektarbeit_id)
+ pb.projektarbeit_id,
+ pb.person_id AS zweitbetreuer_person_id,
+ b.uid AS zweitbetreuer_benutzer_uid,
+ pb.betreuerart_kurzbz AS zweitbetreuer_betreuerart_kurzbz,
+ ba.beschreibung AS zweitbetreuer_betreuerart_beschreibung,
+ p.titelpre AS zweitbetreuer_titelpre,
+ p.vorname AS zweitbetreuer_vorname,
+ p.nachname AS zweitbetreuer_nachname,
+ p.titelpost AS zweitbetreuer_titelpost,
+ trim(
+ COALESCE(p.titelpre, '') || ' ' ||
+ COALESCE(p.vorname, '') || ' ' ||
+ COALESCE(p.nachname, '') || ' ' ||
+ COALESCE(p.titelpost, '')
+ ) AS zweitbetreuer_full_name
+ FROM lehre.tbl_projektbetreuer pb
+ JOIN public.tbl_person p ON p.person_id = pb.person_id
+ LEFT JOIN public.tbl_benutzer b ON b.person_id = p.person_id
+ LEFT JOIN lehre.tbl_betreuerart ba ON ba.betreuerart_kurzbz = pb.betreuerart_kurzbz
+ WHERE pb.betreuerart_kurzbz = ANY('{Zweitbetreuer,Zweitbegutachter,Senatsmitglied}')
+ ORDER BY pb.projektarbeit_id
+ ),
+ primary_betreuer AS (
+ SELECT DISTINCT ON (pb.projektarbeit_id)
+ pb.projektarbeit_id,
+ pb.person_id AS betreuer_person_id,
+ pb.betreuerart_kurzbz AS betreuer_betreuerart_kurzbz,
+ ba.beschreibung AS betreuer_betreuerart_beschreibung,
+ p.titelpre AS betreuer_titelpre,
+ p.vorname AS betreuer_vorname,
+ p.nachname AS betreuer_nachname,
+ p.titelpost AS betreuer_titelpost,
+ trim(
+ COALESCE(p.titelpre, '') || ' ' ||
+ COALESCE(p.vorname, '') || ' ' ||
+ COALESCE(p.nachname, '') || ' ' ||
+ COALESCE(p.titelpost, '')
+ ) AS betreuer_full_name
+ FROM lehre.tbl_projektbetreuer pb
+ JOIN public.tbl_person p ON p.person_id = pb.person_id
+ LEFT JOIN public.tbl_benutzer b ON b.person_id = p.person_id
+ LEFT JOIN lehre.tbl_betreuerart ba ON ba.betreuerart_kurzbz = pb.betreuerart_kurzbz
+ WHERE pb.betreuerart_kurzbz = ANY('{Begutachter, Betreuer, Erstbetreuer,Erstbegutachter,Senatsvorsitz}')
+ ORDER BY pb.projektarbeit_id
+ )
+
+ SELECT
+ *
+ FROM
+ (SELECT DISTINCT ON (tbl_projektarbeit.projektarbeit_id)
+ student_person.vorname, student_person.nachname,
+ tbl_studiengang.typ, tbl_studiengang.kurzbz,
+ tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung,
+ tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id, tbl_projektarbeit.note,
+ student_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, public.tbl_student.student_uid,
+
+ lehre.tbl_projektarbeit.sprache,
+ lehre.tbl_projektarbeit.seitenanzahl,
+ lehre.tbl_projektarbeit.kontrollschlagwoerter,
+ lehre.tbl_projektarbeit.schlagwoerter,
+ lehre.tbl_projektarbeit.schlagwoerter_en,
+ lehre.tbl_projektarbeit.abstract,
+ lehre.tbl_projektarbeit.abstract_en,
+ lehre.tbl_projektarbeit.insertamum,
+
+ (
+ SELECT orgform_kurzbz
+ FROM public.tbl_prestudentstatus
+ WHERE prestudent_id = (
+ SELECT prestudent_id FROM public.tbl_student
+ WHERE student_uid = student_benutzer.uid LIMIT 1
+ )
+ ORDER BY datum DESC, insertamum DESC, ext_id DESC
+ LIMIT 1
+ ) AS organisationsform,
+ (
+ SELECT COALESCE(tbl_studienplan.orgform_kurzbz,
+ tbl_prestudentstatus.orgform_kurzbz,
+ tbl_studiengang.orgform_kurzbz)
+ FROM public.tbl_prestudent
+ JOIN public.tbl_prestudentstatus USING (prestudent_id)
+ JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
+ JOIN public.tbl_studiengang USING (studiengang_kz)
+ LEFT JOIN lehre.tbl_studienplan USING (studienplan_id)
+ WHERE prestudent_id = public.tbl_student.prestudent_id
+ ORDER BY tbl_prestudentstatus.datum DESC
+ LIMIT 1
+ ) AS orgform,
+ (
+ SELECT status_kurzbz
+ FROM public.tbl_prestudentstatus
+ WHERE prestudent_id = public.tbl_student.prestudent_id
+ ORDER BY datum DESC, insertamum DESC, ext_id DESC
+ LIMIT 1
+ ) AS studienstatus,
+
+ pb.betreuer_person_id,
+ pb.betreuer_betreuerart_kurzbz,
+ pb.betreuer_betreuerart_beschreibung,
+ pb.betreuer_titelpre,
+ pb.betreuer_vorname,
+ pb.betreuer_nachname,
+ pb.betreuer_titelpost,
+ pb.betreuer_full_name,
+
+ sb.zweitbetreuer_person_id,
+ sb.zweitbetreuer_benutzer_uid,
+ sb.zweitbetreuer_betreuerart_kurzbz,
+ sb.zweitbetreuer_betreuerart_beschreibung,
+ sb.zweitbetreuer_titelpre,
+ sb.zweitbetreuer_vorname,
+ sb.zweitbetreuer_nachname,
+ sb.zweitbetreuer_titelpost,
+ sb.zweitbetreuer_full_name
+ FROM lehre.tbl_projektarbeit
+ LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid
+ LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id
+ LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid
+ LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
+ LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
+ LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz
+ LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
+ LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
+ LEFT JOIN primary_betreuer pb ON pb.projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ LEFT JOIN secondary_betreuer sb ON sb.projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ WHERE (projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom')
+ AND (pb.betreuer_person_id = ? OR sb.zweitbetreuer_person_id = ?)
+ ".($showAll?'':' AND student_benutzer.aktiv AND lehre.tbl_projektarbeit.note IS NULL ')."
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Zweitbegutachter', 'Erstbetreuer', 'Senatsvorsitz', 'Senatsmitglied')
- ORDER BY tbl_projektarbeit.projektarbeit_id, betreuerart_kurzbz desc) as xy
+ ORDER BY tbl_projektarbeit.projektarbeit_id, betreuerart_kurzbz desc) as xy
ORDER BY nachname;";
- return $this->execReadOnlyQuery($qry, array($uid));
+ return $this->execReadOnlyQuery($qry, array($person_id, $person_id));
}
/**
@@ -341,176 +464,257 @@ class Projektarbeit_model extends DB_Model
public function getProjektarbeitenForStudiengang($studiengang_kz, $benotet) {
- $new_qry = "SELECT DISTINCT ON(tmp.projektarbeit_id) *, campus.get_betreuer_details(tmp.zweitbetreuer_person_id) as zweitbetreuer_full_name, campus.get_betreuer_details(tmp.betreuer_person_id) as erstbetreuer_full_name
- FROM(
- SELECT
- DISTINCT ON(tbl_projektarbeit.projektarbeit_id)
- tbl_projektarbeit.projekttyp_kurzbz,
- tbl_projektarbeit.titel,
- tbl_projektarbeit.projektarbeit_id,
- tbl_studiengang.typ, tbl_studiengang.kurzbz,
- student_benutzer.uid as student_uid,
- student_person.vorname as student_vorname,
- student_person.nachname as student_nachname,
- tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz,
- betreuer_benutzer.uid as betreuer_benutzer_uid,
- betreuer_person.titelpre as betreuer_titelpre,
- betreuer_person.vorname as betreuer_vorname,
- betreuer_person.nachname as betreuer_nachname,
- betreuer_person.titelpost as betreuer_titelpost,
- lehre.tbl_projektbetreuer.betreuerart_kurzbz as betreuerart,
- lehre.tbl_projektbetreuer.person_id as betreuer_person_id,
- lehre.tbl_projektarbeit.sprache as sprache,
- lehre.tbl_projektarbeit.seitenanzahl as seitenanzahl,
- lehre.tbl_projektarbeit.kontrollschlagwoerter as kontrollschlagwoerter,
- lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter,
- lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
- lehre.tbl_projektarbeit.abstract as abstract,
- lehre.tbl_projektarbeit.abstract_en as abstract_en,
- lehre.tbl_projektarbeit.insertamum as insertamum,
- lehre.tbl_projektarbeit.note as note,
- (
- SELECT orgform_kurzbz
- FROM tbl_prestudentstatus
- WHERE prestudent_id = (SELECT prestudent_id
- FROM tbl_student
- WHERE student_uid = student_benutzer.uid
- LIMIT 1)
- ORDER BY datum DESC, insertamum DESC, ext_id DESC
- LIMIT 1
- )
- as organisationsform,
- (
- SELECT person_id
- FROM lehre.tbl_projektbetreuer
- WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
- AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
- LIMIT 1
- )
- AS zweitbetreuer_person_id,
- (
- SELECT betreuerart_kurzbz
- FROM lehre.tbl_projektbetreuer
- WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
- AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
- LIMIT 1
- )
- AS zweitbetreuer_betreuerart_kurzbz,
- (
- SELECT tbl_betreuerart.beschreibung
- FROM lehre.tbl_projektbetreuer
- JOIN lehre.tbl_betreuerart USING (betreuerart_kurzbz)
- WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
- AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
- LIMIT 1
- )
- AS zweitbetreuer_betreuerart_beschreibung,
- (
- SELECT trim(COALESCE(titelpre, '') || ' ' || COALESCE(vorname, '') || ' ' || COALESCE(nachname, '') || ' ' ||
- COALESCE(titelpost, ''))
- FROM public.tbl_person
- JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
- LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
- LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
- WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
- AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
- LIMIT 1
- )
- as zweitbetreuer_full_name,
- (
- SELECT titelpre
- FROM public.tbl_person
- JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
- LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
- LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
- WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
- AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
- LIMIT 1
- )
- as zweitbetreuer_titelpre,
- (
- SELECT vorname
- FROM public.tbl_person
- JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
- LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
- LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
- WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
- AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
- LIMIT 1
- )
- as zweitbetreuer_vorname,
- (
- SELECT nachname
- FROM public.tbl_person
- JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
- LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
- LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
- WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
- AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
- LIMIT 1
- )
- as zweitbetreuer_nachname,
- (
- SELECT titelpost
- FROM public.tbl_person
- JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
- LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
- LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
- WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
- AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
- LIMIT 1
- )
- as zweitbetreuer_titelpost,
- (
- SELECT
- COALESCE(tbl_studienplan.orgform_kurzbz,
- tbl_prestudentstatus.orgform_kurzbz, tbl_studiengang.orgform_kurzbz) as
- orgform
- FROM
- public.tbl_prestudent
- JOIN public.tbl_prestudentstatus USING(prestudent_id)
- JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
- JOIN public.tbl_studiengang USING(studiengang_kz)
- LEFT JOIN lehre.tbl_studienplan USING(studienplan_id)
- WHERE
- prestudent_id=tbl_student.prestudent_id
- ORDER BY tbl_prestudentstatus.datum DESC LIMIT 1
- ) as orgform,
- (SELECT status_kurzbz FROM public.tbl_prestudentstatus
- WHERE prestudent_id=tbl_student.prestudent_id
- ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as studienstatus
- FROM lehre.tbl_projektarbeit
- LEFT JOIN public.tbl_benutzer student_benutzer ON (student_benutzer.uid = lehre.tbl_projektarbeit.student_uid)
- LEFT JOIN public.tbl_person student_person ON (student_benutzer.person_id = student_person.person_id)
- LEFT JOIN public.tbl_student on(student_benutzer.uid = public.tbl_student.student_uid)
- LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
- LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
- LEFT JOIN public.tbl_studiengang ON (public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz)
- LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
- LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
- LEFT JOIN public.tbl_person betreuer_person ON (betreuer_person.person_id = lehre.tbl_projektbetreuer.person_id)
- LEFT JOIN public.tbl_benutzer betreuer_benutzer ON (betreuer_person.person_id = betreuer_benutzer.person_id)
- WHERE (projekttyp_kurzbz = 'Bachelor' OR projekttyp_kurzbz = 'Diplom')
- AND student_benutzer.aktiv AND (
- lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbegutachter'
- OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Begutachter'
- OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Betreuer'
- OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbetreuer'
- OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Senatsvorsitz'
- )
- AND public.tbl_studiengang.studiengang_kz = ?";
+ $new_qry = "WITH secondary_betreuer AS (
+ SELECT DISTINCT ON (pb.projektarbeit_id)
+ pb.projektarbeit_id,
+ pb.person_id AS zweitbetreuer_person_id,
+ pb.betreuerart_kurzbz AS zweitbetreuer_betreuerart_kurzbz,
+ ba.beschreibung AS zweitbetreuer_betreuerart_beschreibung,
+ p.titelpre AS zweitbetreuer_titelpre,
+ p.vorname AS zweitbetreuer_vorname,
+ p.nachname AS zweitbetreuer_nachname,
+ p.titelpost AS zweitbetreuer_titelpost,
+ trim(
+ COALESCE(p.titelpre, '') || ' ' ||
+ COALESCE(p.vorname, '') || ' ' ||
+ COALESCE(p.nachname, '') || ' ' ||
+ COALESCE(p.titelpost, '')
+ ) AS zweitbetreuer_full_name
+ FROM lehre.tbl_projektbetreuer pb
+ JOIN public.tbl_person p ON p.person_id = pb.person_id
+ LEFT JOIN public.tbl_benutzer b ON b.person_id = p.person_id
+ LEFT JOIN lehre.tbl_betreuerart ba ON ba.betreuerart_kurzbz = pb.betreuerart_kurzbz
+ WHERE pb.betreuerart_kurzbz = ANY('{Zweitbetreuer,Zweitbegutachter,Senatsmitglied}')
+ ORDER BY pb.projektarbeit_id -- DISTINCT ON needs this to be deterministic
+ )
- if($benotet == 0) {
- $new_qry .= " AND lehre.tbl_projektarbeit.note IS NULL ";
- } else if ($benotet == 1) {
- $new_qry .= " AND lehre.tbl_projektarbeit.note IS NOT NULL ";
- }
-
- $new_qry .= " ORDER BY tbl_projektarbeit.projektarbeit_id DESC, student_person.nachname ASC
+ SELECT DISTINCT ON (tmp.projektarbeit_id)
+ *,
+ campus.get_betreuer_details(tmp.zweitbetreuer_person_id) AS zweitbetreuer_full_name,
+ campus.get_betreuer_details(tmp.betreuer_person_id) AS erstbetreuer_full_name
+ FROM (
+ SELECT DISTINCT ON (tbl_projektarbeit.projektarbeit_id)
+ tbl_projektarbeit.projekttyp_kurzbz,
+ tbl_projektarbeit.titel,
+ tbl_projektarbeit.projektarbeit_id,
+ tbl_studiengang.typ,
+ tbl_studiengang.kurzbz,
+ student_benutzer.uid AS student_uid,
+ student_person.vorname AS student_vorname,
+ student_person.nachname AS student_nachname,
+ public.tbl_student.matrikelnr,
+ tbl_lehreinheit.studiensemester_kurzbz,
+ betreuer_benutzer.uid AS betreuer_benutzer_uid,
+ betreuer_person.titelpre AS betreuer_titelpre,
+ betreuer_person.vorname AS betreuer_vorname,
+ betreuer_person.nachname AS betreuer_nachname,
+ betreuer_person.titelpost AS betreuer_titelpost,
+ lehre.tbl_projektbetreuer.betreuerart_kurzbz AS betreuerart,
+ lehre.tbl_projektbetreuer.person_id AS betreuer_person_id,
+ lehre.tbl_projektarbeit.sprache,
+ lehre.tbl_projektarbeit.seitenanzahl,
+ lehre.tbl_projektarbeit.kontrollschlagwoerter,
+ lehre.tbl_projektarbeit.schlagwoerter,
+ lehre.tbl_projektarbeit.schlagwoerter_en,
+ lehre.tbl_projektarbeit.abstract,
+ lehre.tbl_projektarbeit.abstract_en,
+ lehre.tbl_projektarbeit.insertamum,
+ lehre.tbl_projektarbeit.note,
+
+ sb.zweitbetreuer_person_id,
+ sb.zweitbetreuer_betreuerart_kurzbz,
+ sb.zweitbetreuer_betreuerart_beschreibung,
+ sb.zweitbetreuer_full_name,
+ sb.zweitbetreuer_titelpre,
+ sb.zweitbetreuer_vorname,
+ sb.zweitbetreuer_nachname,
+ sb.zweitbetreuer_titelpost,
+
+ (
+ SELECT orgform_kurzbz
+ FROM public.tbl_prestudentstatus
+ WHERE prestudent_id = (
+ SELECT prestudent_id FROM public.tbl_student
+ WHERE student_uid = student_benutzer.uid LIMIT 1
+ )
+ ORDER BY datum DESC, insertamum DESC, ext_id DESC
+ LIMIT 1
+ ) AS organisationsform,
+ (
+ SELECT COALESCE(tbl_studienplan.orgform_kurzbz,
+ tbl_prestudentstatus.orgform_kurzbz,
+ tbl_studiengang.orgform_kurzbz)
+ FROM public.tbl_prestudent
+ JOIN public.tbl_prestudentstatus USING (prestudent_id)
+ JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
+ JOIN public.tbl_studiengang USING (studiengang_kz)
+ LEFT JOIN lehre.tbl_studienplan USING (studienplan_id)
+ WHERE prestudent_id = public.tbl_student.prestudent_id
+ ORDER BY tbl_prestudentstatus.datum DESC
+ LIMIT 1
+ ) AS orgform,
+ (
+ SELECT status_kurzbz
+ FROM public.tbl_prestudentstatus
+ WHERE prestudent_id = public.tbl_student.prestudent_id
+ ORDER BY datum DESC, insertamum DESC, ext_id DESC
+ LIMIT 1
+ ) AS studienstatus
+
+ FROM lehre.tbl_projektarbeit
+ LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid
+ LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id
+ LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid
+ LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
+ LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
+ LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz
+ LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
+ LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
+ LEFT JOIN public.tbl_person betreuer_person ON betreuer_person.person_id = lehre.tbl_projektbetreuer.person_id
+ LEFT JOIN public.tbl_benutzer betreuer_benutzer ON betreuer_person.person_id = betreuer_benutzer.person_id
+ LEFT JOIN secondary_betreuer sb ON sb.projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+
+ WHERE (projekttyp_kurzbz = 'Bachelor' OR projekttyp_kurzbz = 'Diplom')
+ AND student_benutzer.aktiv
+ AND lehre.tbl_projektbetreuer.betreuerart_kurzbz IN (
+ 'Erstbegutachter', 'Begutachter', 'Betreuer', 'Erstbetreuer', 'Senatsvorsitz'
+ )
+ AND public.tbl_studiengang.studiengang_kz = ?";
+
+ if($benotet == 0) {
+ $new_qry .= " AND lehre.tbl_projektarbeit.note IS NULL ";
+ } else if ($benotet == 1) {
+ $new_qry .= " AND lehre.tbl_projektarbeit.note IS NOT NULL ";
+ }
+
+ $new_qry .= " ORDER BY tbl_projektarbeit.projektarbeit_id DESC, student_person.nachname ASC
) as tmp";
return $this->execReadOnlyQuery($new_qry, array($studiengang_kz));
}
+
+ public function getProjektarbeitenForStudent($student_uid) {
+ $new_qry = "WITH secondary_betreuer AS (
+ SELECT DISTINCT ON (pb.projektarbeit_id)
+ pb.projektarbeit_id,
+ pb.person_id AS zweitbetreuer_person_id,
+ pb.betreuerart_kurzbz AS zweitbetreuer_betreuerart_kurzbz,
+ ba.beschreibung AS zweitbetreuer_betreuerart_beschreibung,
+ p.titelpre AS zweitbetreuer_titelpre,
+ p.vorname AS zweitbetreuer_vorname,
+ p.nachname AS zweitbetreuer_nachname,
+ p.titelpost AS zweitbetreuer_titelpost,
+ trim(
+ COALESCE(p.titelpre, '') || ' ' ||
+ COALESCE(p.vorname, '') || ' ' ||
+ COALESCE(p.nachname, '') || ' ' ||
+ COALESCE(p.titelpost, '')
+ ) AS zweitbetreuer_full_name
+ FROM lehre.tbl_projektbetreuer pb
+ JOIN public.tbl_person p ON p.person_id = pb.person_id
+ LEFT JOIN public.tbl_benutzer b ON b.person_id = p.person_id
+ LEFT JOIN lehre.tbl_betreuerart ba ON ba.betreuerart_kurzbz = pb.betreuerart_kurzbz
+ WHERE pb.betreuerart_kurzbz = ANY('{Zweitbetreuer,Zweitbegutachter,Senatsmitglied}')
+ ORDER BY pb.projektarbeit_id -- DISTINCT ON needs this to be deterministic
+ )
+
+ SELECT DISTINCT ON (tmp.projektarbeit_id)
+ *,
+ campus.get_betreuer_details(tmp.zweitbetreuer_person_id) AS zweitbetreuer_full_name,
+ campus.get_betreuer_details(tmp.betreuer_person_id) AS erstbetreuer_full_name
+ FROM (
+ SELECT DISTINCT ON (tbl_projektarbeit.projektarbeit_id)
+ tbl_projektarbeit.projekttyp_kurzbz,
+ tbl_projektarbeit.titel,
+ tbl_projektarbeit.projektarbeit_id,
+ tbl_studiengang.typ,
+ tbl_studiengang.kurzbz,
+ student_benutzer.uid AS student_uid,
+ student_person.vorname AS student_vorname,
+ student_person.nachname AS student_nachname,
+ public.tbl_student.matrikelnr,
+ tbl_lehreinheit.studiensemester_kurzbz,
+ betreuer_benutzer.uid AS betreuer_benutzer_uid,
+ betreuer_person.titelpre AS betreuer_titelpre,
+ betreuer_person.vorname AS betreuer_vorname,
+ betreuer_person.nachname AS betreuer_nachname,
+ betreuer_person.titelpost AS betreuer_titelpost,
+ lehre.tbl_projektbetreuer.betreuerart_kurzbz AS betreuerart,
+ lehre.tbl_projektbetreuer.person_id AS betreuer_person_id,
+ lehre.tbl_projektarbeit.sprache,
+ lehre.tbl_projektarbeit.seitenanzahl,
+ lehre.tbl_projektarbeit.kontrollschlagwoerter,
+ lehre.tbl_projektarbeit.schlagwoerter,
+ lehre.tbl_projektarbeit.schlagwoerter_en,
+ lehre.tbl_projektarbeit.abstract,
+ lehre.tbl_projektarbeit.abstract_en,
+ lehre.tbl_projektarbeit.insertamum,
+ lehre.tbl_projektarbeit.note,
+
+ sb.zweitbetreuer_person_id,
+ sb.zweitbetreuer_betreuerart_kurzbz,
+ sb.zweitbetreuer_betreuerart_beschreibung,
+ sb.zweitbetreuer_full_name,
+ sb.zweitbetreuer_titelpre,
+ sb.zweitbetreuer_vorname,
+ sb.zweitbetreuer_nachname,
+ sb.zweitbetreuer_titelpost,
+
+ (
+ SELECT orgform_kurzbz
+ FROM public.tbl_prestudentstatus
+ WHERE prestudent_id = (
+ SELECT prestudent_id FROM public.tbl_student
+ WHERE student_uid = student_benutzer.uid LIMIT 1
+ )
+ ORDER BY datum DESC, insertamum DESC, ext_id DESC
+ LIMIT 1
+ ) AS organisationsform,
+ (
+ SELECT COALESCE(tbl_studienplan.orgform_kurzbz,
+ tbl_prestudentstatus.orgform_kurzbz,
+ tbl_studiengang.orgform_kurzbz)
+ FROM public.tbl_prestudent
+ JOIN public.tbl_prestudentstatus USING (prestudent_id)
+ JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
+ JOIN public.tbl_studiengang USING (studiengang_kz)
+ LEFT JOIN lehre.tbl_studienplan USING (studienplan_id)
+ WHERE prestudent_id = public.tbl_student.prestudent_id
+ ORDER BY tbl_prestudentstatus.datum DESC
+ LIMIT 1
+ ) AS orgform,
+ (
+ SELECT status_kurzbz
+ FROM public.tbl_prestudentstatus
+ WHERE prestudent_id = public.tbl_student.prestudent_id
+ ORDER BY datum DESC, insertamum DESC, ext_id DESC
+ LIMIT 1
+ ) AS studienstatus
+
+ FROM lehre.tbl_projektarbeit
+ LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid
+ LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id
+ LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid
+ LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
+ LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
+ LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz
+ LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
+ LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
+ LEFT JOIN public.tbl_person betreuer_person ON betreuer_person.person_id = lehre.tbl_projektbetreuer.person_id
+ LEFT JOIN public.tbl_benutzer betreuer_benutzer ON betreuer_person.person_id = betreuer_benutzer.person_id
+ LEFT JOIN secondary_betreuer sb ON sb.projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+
+ WHERE (projekttyp_kurzbz = 'Bachelor' OR projekttyp_kurzbz = 'Diplom')
+ AND student_benutzer.aktiv
+ AND lehre.tbl_projektbetreuer.betreuerart_kurzbz IN (
+ 'Erstbegutachter', 'Begutachter', 'Betreuer', 'Erstbetreuer', 'Senatsvorsitz'
+ )
+ AND public.tbl_student.student_uid = ?
+ ORDER BY tbl_projektarbeit.projektarbeit_id DESC, student_person.nachname ASC
+ ) as tmp";
+
+ return $this->execReadOnlyQuery($new_qry, array($student_uid));
+ }
/**
*
diff --git a/application/models/education/Studierendenantrag_model.php b/application/models/education/Studierendenantrag_model.php
index 677d01f04..40224ffc9 100644
--- a/application/models/education/Studierendenantrag_model.php
+++ b/application/models/education/Studierendenantrag_model.php
@@ -149,6 +149,7 @@ class Studierendenantrag_model extends DB_Model
$this->addSelect($this->dbTable . '.grund AS grund');
$this->addSelect('s.studierendenantrag_statustyp_kurzbz status');
$this->addSelect('s.insertvon status_insertvon');
+ $this->addSelect('s.grund AS status_grund');
$this->addSelect('t.bezeichnung[(' . $lang . ')] statustyp');
$this->addSelect('p.unruly AS unruly');
$this->addSelect($this->dbTable . '.insertamum AS insertamum');
@@ -269,6 +270,7 @@ class Studierendenantrag_model extends DB_Model
$this->addSelect($this->dbTable . '.grund');
$this->addSelect($this->dbTable . '.dms_id');
$this->addSelect('s.insertvon AS status_insertvon');
+ $this->addSelect('s.grund AS status_grund');
$this->addSelect(
"(SELECT count(1) FROM campus.tbl_studierendenantrag_status WHERE studierendenantrag_id = " .
$this->dbTable .
diff --git a/application/models/education/Studierendenantragstatus_model.php b/application/models/education/Studierendenantragstatus_model.php
index cf9cce1be..354af7491 100644
--- a/application/models/education/Studierendenantragstatus_model.php
+++ b/application/models/education/Studierendenantragstatus_model.php
@@ -50,7 +50,7 @@ class Studierendenantragstatus_model extends DB_Model
$this->addSelect('bezeichnung[(' . $lang . ')] AS typ');
$this->addJoin('campus.tbl_studierendenantrag_statustyp', 'studierendenantrag_statustyp_kurzbz');
-
+ $this->addOrder($this->dbTable. '.insertamum', 'DESC');
return $this->loadWhere($where);
}
diff --git a/application/models/ressource/Reservierung_model.php b/application/models/ressource/Reservierung_model.php
index 0c391ea20..cf5f1e4f9 100644
--- a/application/models/ressource/Reservierung_model.php
+++ b/application/models/ressource/Reservierung_model.php
@@ -18,10 +18,10 @@ class Reservierung_model extends DB_Model
*
* @return stdClass
*/
- public function getReservierungen($start_date, $end_date, $ort_kurzbz = null)
+ public function getReservierungen($start_date, $end_date, $ort_kurzbz = null, $uid = null)
{
-
- $lvplan_reservierungen_query="SELECT r.* , stund.beginn, stund.ende,
+
+ $lvplan_reservierungen_query = "SELECT r.* , stund.beginn, stund.ende,
CASE
WHEN r.gruppe_kurzbz IS NOT NULL THEN r.gruppe_kurzbz
ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(r.semester AS varchar),'/'),COALESCE(CAST(r.verband AS varchar),'/'))
@@ -35,7 +35,7 @@ class Reservierung_model extends DB_Model
LEFT JOIN public.tbl_studiensemester ss2 ON slv.studiensemester_kurzbz = ss2.studiensemester_kurzbz AND ss2.start <=r.datum AND ss2.ende >= r.datum
WHERE datum >= ? AND datum <= ? AND (ss1.studiensemester_kurzbz IS NOT NULL
OR ss2.studiensemester_kurzbz IS NOT NULL)";
-
+
$raum_reservierungen_query = "SELECT res.*, beginn, ende,
CASE
WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz
@@ -46,9 +46,9 @@ class Reservierung_model extends DB_Model
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde
WHERE res.ort_kurzbz = ? AND datum >= ? AND datum <= ?";
- $subquery = is_null($ort_kurzbz)? $lvplan_reservierungen_query:$raum_reservierungen_query;
-
- $query_result= $this->execReadOnlyQuery("
+ $subquery = is_null($ort_kurzbz) ? $lvplan_reservierungen_query : $raum_reservierungen_query;
+
+ $query_result = $this->execReadOnlyQuery("
SELECT
'reservierung' as type, beginn, ende, datum,
COALESCE(titel, beschreibung) as topic,
@@ -59,15 +59,15 @@ class Reservierung_model extends DB_Model
FROM
(
- ". $subquery ."
+ " . $subquery . "
) AS subquery
GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung
ORDER BY datum, beginn
- ", is_null($ort_kurzbz) ?[getAuthUID(), getAuthUID(),$start_date,$end_date]: [$ort_kurzbz, $start_date, $end_date]);
+ ", is_null($ort_kurzbz) ? [$uid ?? getAuthUID(), $uid ?? getAuthUID(), $start_date, $end_date] : [$ort_kurzbz, $start_date, $end_date]);
+
-
return $query_result;
}
@@ -76,7 +76,7 @@ class Reservierung_model extends DB_Model
*
* @return stdClass
*/
- public function getReservierungenMitarbeiter($start_date, $end_date)
+ public function getReservierungenMitarbeiter($start_date, $end_date, $uid = null)
{
$raum_reservierungen_query = "SELECT res.*, beginn, ende,
@@ -91,8 +91,8 @@ class Reservierung_model extends DB_Model
$subquery = $raum_reservierungen_query;
-
- $query_result= $this->execReadOnlyQuery("
+
+ $query_result = $this->execReadOnlyQuery("
SELECT
'reservierung' as type, beginn, ende, datum,
COALESCE(titel, beschreibung) as topic,
@@ -103,13 +103,13 @@ class Reservierung_model extends DB_Model
FROM
(
- ". $subquery ."
+ " . $subquery . "
) AS subquery
GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung
ORDER BY datum, beginn
- ", [getAuthUID(), $start_date, $end_date]);
+ ", [$uid ?? getAuthUID(), $start_date, $end_date]);
return $query_result;
@@ -129,9 +129,9 @@ class Reservierung_model extends DB_Model
$this->addJoin('public.tbl_studiensemester ss2', 'slv.studiensemester_kurzbz=ss2.studiensemester_kurzbz AND ss2.start<=r.datum AND ss2.ende>=r.datum', 'LEFT');
$this->db->or_where('ss1.studiensemester_kurzbz IS NOT NULL', null, false);
$this->db->or_where('ss2.studiensemester_kurzbz IS NOT NULL', null, false);
-
+
$query = $this->db->get_compiled_select('campus.vw_reservierung r');
-
+
return $this->execQuery($query, [$uid, $uid]);
}
diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php
index d0a97ed9d..997451243 100644
--- a/application/models/ressource/Stundenplan_model.php
+++ b/application/models/ressource/Stundenplan_model.php
@@ -388,6 +388,84 @@ class Stundenplan_model extends DB_Model
ORDER BY datum, beginn", [$start_date, $end_date, $ma_uid]);
}
+
+ /**
+ * queries Stundenplan and filters by studiengang, semester, verband gruppe
+ *
+ * @return void
+ */
+ public function getStundenplanStudiengang($start_date, $end_date, $stg_kz, $sem, $verband, $gruppe) {
+
+ $qry_params = [$start_date, $end_date, $stg_kz];
+
+ $qry = "
+ SELECT
+ 'lehreinheit' as type, beginn, ende, datum,
+ CONCAT(lehrfach,'-',lehrform) as topic,
+ array_agg(DISTINCT lektor) as lektor,
+ array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
+ string_agg(DISTINCT ort_kurzbz, '/') as ort_kurzbz,
+ array_agg(DISTINCT lehreinheit_id) as lehreinheit_id,
+ titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
+ FROM
+ (
+ SELECT unr,datum,beginn, ende,
+ CASE
+ WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
+ ELSE sp.lektor
+ END as lektor,
+ CASE
+ WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz
+ ELSE CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/'))
+ END as gruppen_kuerzel,
+ (SELECT bezeichnung
+ FROM public.tbl_organisationseinheit
+ WHERE oe_kurzbz IN(
+ SELECT oe_kurzbz
+ FROM lehre.tbl_lehrveranstaltung
+ WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id
+ )) as organisationseinheit,
+ sp.ort_kurzbz, sp.studiengang_kz, sp.titel,sp.lehreinheit_id,sp.lehrfach_id,sp.anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz
+ FROM (
+ SELECT sp.*
+ FROM lehre.vw_stundenplan sp
+ WHERE
+ sp.datum >= ?
+ AND sp.datum <= ?
+ ) sp
+ JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde
+ WHERE studiengang_kz = ? ";
+
+ if($sem != NULL)
+ {
+ $qry_params[] = $sem;
+ $qry .= " AND (semester = ? OR semester IS NULL)";
+ }
+ if($verband != NULL)
+ {
+ $qry_params[] = $verband;
+ $qry .= " AND (verband = ? OR verband IS NULL OR verband = '0' OR verband = '')";
+ }
+ if($gruppe != NULL)
+ {
+ $qry_params[] = $gruppe;
+ $qry .= " AND (gruppe = ? OR gruppe IS NULL OR gruppe = '0' OR gruppe = '') ";
+ }
+ $qry.= " AND (
+ gruppe_kurzbz is null OR EXISTS(
+ SELECT 1
+ FROM
+ public.tbl_gruppe WHERE gruppe_kurzbz = sp.gruppe_kurzbz AND direktinskription = false
+ )
+ )";
+
+ $qry.= " ) as subquery
+
+ GROUP BY unr, datum, beginn, ende, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
+ ORDER BY datum, beginn; ";
+
+ return $this->execReadOnlyQuery($qry, $qry_params);
+ }
/**
* NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester.
diff --git a/application/views/Cis/Abgabetool.php b/application/views/Cis/Abgabetool.php
index 86e8721f2..469bc8110 100644
--- a/application/views/Cis/Abgabetool.php
+++ b/application/views/Cis/Abgabetool.php
@@ -38,7 +38,7 @@ $includesArray = array(
$this->load->view('templates/FHC-Header', $includesArray);
?>
-