diff --git a/.gitignore b/.gitignore
index 84957a801..7688849af 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
documents/
vendor/
+public/vendor
/nbproject/
.vscode
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/lvverwaltung.php b/application/config/lvverwaltung.php
index 4fe09bff3..d315c9b38 100644
--- a/application/config/lvverwaltung.php
+++ b/application/config/lvverwaltung.php
@@ -8,4 +8,15 @@ $config['lvverwaltung_tags'] = [
];
*/
-$config['lvverwaltung_tags'] = [];
\ No newline at end of file
+$config['lvverwaltung_tags'] = [];
+
+# Additional columns:
+/*
+$config["list_columns"] = [
+ 'fieldname' => [
+ 'js' => 'path/to/snippet.js', // tabulator config snippet (eg: return { name: 'Name', field: 'fieldname' }; )
+ // NOTE: 'default' & 'joins' like in stv.php config are currently not available here
+ ]
+];
+*/
+
diff --git a/application/config/navigation.php b/application/config/navigation.php
index 4d4dcc22a..cd71b02ca 100644
--- a/application/config/navigation.php
+++ b/application/config/navigation.php
@@ -170,6 +170,13 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 51,
'requiredPermissions' => 'vertrag/mitarbeiter:r'
+ ),
+ 'studierendenverwaltung' => array(
+ 'link' => site_url('studentenverwaltung'),
+ 'description' => 'Studierendenverwaltung',
+ 'expand' => true,
+ 'sort' => 52,
+ 'requiredPermissions' => ['admin:r', 'assistenz:r']
)
)
),
@@ -378,7 +385,7 @@ $config['navigation_menu']['apps'] = [
],
'lav' => [
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
- 'description' => 'Lehraufträge',
+ 'description' => 'Lehrauftragsverwaltung',
#'icon' => 'person-chalkboard',
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:r')
]
diff --git a/application/config/routes.php b/application/config/routes.php
index aa4ba9db8..bb0b0f65e 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';
@@ -72,52 +75,67 @@ $route['Abgabetool/Student'] = 'Cis/Abgabetool/Student';
$route['Abgabetool/Student/(:any)'] = 'Cis/Abgabetool/Student/$1';
$route['Abgabetool/Deadlines'] = 'Cis/Abgabetool/Deadlines';
+// Studierendenverwaltung App Routes
+$route['studvw'] = 'studentenverwaltung/index';
+$route['studvw/.*'] = 'studentenverwaltung/index';
+// Old routes
+$route['studentenverwaltung'] = 'redirect/301/studvw';
+$route['studentenverwaltung/(:any)'] = 'redirect/301/studvw/stdsem/$1';
+$route['studentenverwaltung/(:any)/(prestudent|student|person|search)/(:any)'] = 'redirect/301/studvw/stdsem/$1/$2/$3';
+$route['studentenverwaltung/(:any)/prestudent/(:any)/tab/:any'] = 'redirect/301/studvw/stdsem/$1/prestudent/$2';
+$route['studentenverwaltung/(:any)/search/(:any)/(:any)'] = 'redirect/301/studvw/stdsem/$1/search/$2/$3';
+$route['studentenverwaltung/(:any)/(:any)'] = 'redirect/301/studvw/stdsem/$1/stg/$2';
+
// Studierendenverwaltung List Routes
-$route['api/frontend/v1/stv/[sS]tudents/inout'] = 'api/frontend/v1/stv/Students/index';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/index';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/incoming/1'] = 'api/frontend/v1/stv/students/getIncoming/$1';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/outgoing/1'] = 'api/frontend/v1/stv/students/getOutgoing/$1';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/shared_studies/1'] = 'api/frontend/v1/stv/students/getGemeinsamestudien/$1';
-// (studiensemester_kurzbz)/inout[/(incoming|outgoing|gemeinsamestudien)]
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout'] = 'api/frontend/v1/stv/Students/index';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/incoming'] = 'api/frontend/v1/stv/Students/getIncoming/$1';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/outgoing'] = 'api/frontend/v1/stv/Students/getOutgoing/$1';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/gemeinsamestudien'] = 'api/frontend/v1/stv/Students/getGemeinsamestudien/$1';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/:any/1/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1';
-// (studiengang_kz)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]]
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudents/$1';
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2';
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2/$3';
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/:any/1/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2';
-// (studiengang_kz)/(orgform)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]]
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2';
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3';
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3/$4';
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3/$5';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/verband/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3/$4/$5';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/verband/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2';
-// (studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe)
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/grp/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsSpezialgruppe/$1/$2/$3/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/verband/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4/$5/$6';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/verband/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4/$5';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3';
-// (studiensemester_kurzbz)/(studiengang_kz)[/(semester)[/(verband)[/(gruppe)]]]
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/(:any)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3/$4';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3/$4/$5';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsSpezialgruppe/$1/$2/$3/$4';
-// (studiensemester_kurzbz)/(studiengang_kz)/(orgform)/(semester)/grp/(gruppe)
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/grp/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgformSpezialgruppe/$1/$2/$3/$4/$5';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgformSpezialgruppe/$1/$3/$2/$4/$5';
-// (studiensemester_kurzbz)/(studiengang_kz)/(orgform)[/(semester)[/(verband)[/(gruppe)]]]
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4/$5';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4/$5/$6';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/prestudent/(:any)'] = 'api/frontend/v1/stv/students/getPrestudent/$1/$2';
+
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/student/(:any)'] = 'api/frontend/v1/stv/students/getStudent/$1/$2';
+
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/person/(:any)'] = 'api/frontend/v1/stv/students/getPerson/$1/$2';
+
+$route['api/frontend/v1/treemenudata/stv/.*'] = 'api/frontend/v1/stv/students/index';
+
+// Lvverwaltung List Routes
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2';
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
+
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2';
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
-// // (studiensemester_kurzbz)/uid/(uid)
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/uid/(:any)'] = 'api/frontend/v1/stv/Students/getStudent/$1/$2';
-// // (studiensemester_kurzbz)/prestudent/(prestudent_id)
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/prestudent/(:num)'] = 'api/frontend/v1/stv/Students/getPrestudent/$1/$2';
-// // (studiensemester_kurzbz)/person/(person_id)
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/person/(:num)'] = 'api/frontend/v1/stv/Students/getPerson/$1/$2';
// load routes from extensions, also look for environment-specific configs
$subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT . '/extensions'];
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..9d1e7a1c8 100644
--- a/application/config/studierendenantrag.php
+++ b/application/config/studierendenantrag.php
@@ -168,3 +168,40 @@ $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;
+
+/**
+ * Modal with Infotext of TLC
+ * if true, there will be shown an info modal in the studentsView after the first button ABMELDUNG
+ *
+ * @var boolean
+ */
+$config['showInfoModalAbmeldung'] = true;
+
diff --git a/application/config/stv.php b/application/config/stv.php
index 34a30a96e..b12153eda 100644
--- a/application/config/stv.php
+++ b/application/config/stv.php
@@ -1,6 +1,27 @@
[
+ 'js' => 'path/to/snippet.js', // tabulator config snippet (eg: return { name: 'Name', field: 'fieldname' }; )
+ 'default' => "SQL SELECT statement for value",
+ 'joins' => [
+ // additional joins needed for the SELECT statement above
+ [
+ 'tablename',
+ 'join condition', // single fieldname for USING or full condition for ON
+ 'LEFT|RIGHT', // optional - join type
+ 'after_xxx|before_xxx|end' // optional - position in query
+ ]
+ // ...
+ ]
+ ]
+];
+*/
+
$config['tabs'] =
[
'details' => [
@@ -60,7 +81,13 @@ $config['tabs'] =
],
'notes' => [
//if true, the count of Messages will be shown in the header of the Tab Messages
- 'showCountNotes' => true
+ 'showCountNotes' => true,
+
+ //if true: section with following fields will be displayed: 'verfasser', 'bearbeiter', 'von', 'bis' and 'erledigt'
+ 'showErweitert' => false,
+
+ //notizlayout: choose of "classicFas", "twoColumnsFormLeft", twoColumnsFormRight, popupModal"
+ 'notizLayout' => 'popupModal'
],
'combinePeople' => [
//multitab should only be shown with this length of selection
@@ -133,13 +160,25 @@ $config['students_tab_order'] = [
$config['stv_prestudent_tags'] = [
'prioone' => ['readonly' => false],
- 'priotwo' => ['readonly' => true],
+ 'priotwo' => ['readonly' => false],
'hinweis' => ['readonly' => false],
- 'hinweis_assistenz' => ['readonly' => true],
- 'hinweis_kf' => ['readonly' => true],
+ 'hinweis_assistenz' => ['readonly' => false],
+ 'hinweis_kf' => ['readonly' => false],
'hinweis_lehrende' => ['readonly' => false],
- 'hinweis_stg_kf' => ['readonly' => true],
- 'finished_stg' => ['readonly' => true],
- 'finished_kf' => ['readonly' => true],
- 'inwork_kf' => ['readonly' => true],
+ 'hinweis_stg_kf' => ['readonly' => false],
+ 'finished_stg' => ['readonly' => false],
+ 'finished_kf' => ['readonly' => false],
+ 'inwork_kf' => ['readonly' => false],
+ 'dd_auto' => ['readonly' => true],
+ 'wh_auto' => ['readonly' => true],
+ 'prewh_auto' => ['readonly' => true],
+ 'out_auto' => ['readonly' => true],
+ 'zgv_auto' => ['readonly' => true],
+ 'unterbrecher_auto' => ['readonly' => true],
+ 'stbtr_erh_auto' => ['readonly' => true],
+ 'jgv_auto' => ['readonly' => true],
+ 'in_auto' => ['readonly' => true],
+ 'preabbr_auto' => ['readonly' => true],
];
+
+$config['userAutomatedTags'] = 'sftest';
diff --git a/application/config/treemenu.php b/application/config/treemenu.php
new file mode 100644
index 000000000..72a02947b
--- /dev/null
+++ b/application/config/treemenu.php
@@ -0,0 +1,29 @@
+.
+ */
+
+if (!defined('BASEPATH')) exit('No direct script access allowed');
+
+$config['stv'] = [
+ "library" => "treemenu/StudVwLib",
+ "permissions" => ["admin:r", "assistenz:r"]
+];
+$config['lvv'] = [
+ "library" => "treemenu/LvVwLib",
+ "permissions" => ["admin:r", "assistenz:r"]
+];
diff --git a/application/config/treemenu/custom/lvvw.php b/application/config/treemenu/custom/lvvw.php
new file mode 100644
index 000000000..977c0459e
--- /dev/null
+++ b/application/config/treemenu/custom/lvvw.php
@@ -0,0 +1,32 @@
+.
+ */
+
+if (!defined('BASEPATH')) exit('No direct script access allowed');
+
+$config['root'] = [
+ 'stg' => [
+ 'semester' => [
+ 'group',
+ 'verband' => [
+ 'group'
+ ]
+ ],
+ 'orgform'
+ ]
+];
diff --git a/application/config/treemenu/stg_base.php b/application/config/treemenu/stg_base.php
new file mode 100644
index 000000000..fcb9748b7
--- /dev/null
+++ b/application/config/treemenu/stg_base.php
@@ -0,0 +1,65 @@
+.
+ */
+
+if (!defined('BASEPATH')) exit('No direct script access allowed');
+
+$config['root'] = [
+ 'stg' => [
+ 'prestudent' => [
+ 'stdsem' => [
+ 'interessenten' => [
+ 'bewerbungnichtabgeschickt',
+ 'bewerbungabgeschickt',
+ 'zgv',
+ 'statusbestaetigt' => [
+ 'statusbestaetigtrtnichtangemeldet',
+ 'statusbestaetigtrtangemeldet'
+ ],
+ 'reihungstestnichtangemeldet',
+ 'reihungstestangemeldet'
+ ],
+ 'bewerber' => [
+ 'bewerberrtnichtangemeldet',
+ 'bewerberrtangemeldet' => [
+ 'bewerberrtangemeldetteilgenommen',
+ 'bewerberrtangemeldetnichtteilgenommen'
+ ]
+ ],
+ 'aufgenommen',
+ 'warteliste',
+ 'absage',
+ 'incoming'
+ ]
+ ],
+ 'semester' => [
+ 'group',
+ 'verband' => [
+ 'group'
+ ]
+ ]
+ ],
+ 'inout' => [
+ 'incoming',
+ 'outgoing',
+ 'shared_studies'
+ ]
+];
+
+// copy stg tree into stg/orgforms
+$config['root']['stg']['orgform'] = $config['root']['stg'];
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/Redirect.php b/application/controllers/Redirect.php
new file mode 100644
index 000000000..f4a9f4cd7
--- /dev/null
+++ b/application/controllers/Redirect.php
@@ -0,0 +1,44 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * This controller redirects urls to another location. This is mainly used
+ * with the $routes config
+ */
+class Redirect extends CI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct();
+ }
+
+ /**
+ * Main function to handle all redirects.
+ *
+ * @param string $method - the redirect code (30x)
+ * @param array $params - the url to redirect to
+ *
+ * @return void
+ */
+ public function _remap($method, $params)
+ {
+ redirect($params, 'location', $method);
+ }
+}
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/stv/Favorites.php b/application/controllers/api/frontend/v1/Favorites.php
similarity index 78%
rename from application/controllers/api/frontend/v1/stv/Favorites.php
rename to application/controllers/api/frontend/v1/Favorites.php
index 951eb01a4..787163abb 100644
--- a/application/controllers/api/frontend/v1/stv/Favorites.php
+++ b/application/controllers/api/frontend/v1/Favorites.php
@@ -20,8 +20,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the back-end
- * Provides data to the ajax get calls about favorite verbände
- * Listens to ajax post calls to change the favorite verbände data
+ * Provides data to the ajax get calls about favorite treemenu entries
+ * Listens to ajax post calls to change the favorite treemenu entries
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Favorites extends FHCAPI_Controller
@@ -29,7 +29,7 @@ class Favorites extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
- 'index' => self::PERM_LOGGED,
+ 'get' => self::PERM_LOGGED,
'set' => self::PERM_LOGGED
]);
@@ -37,19 +37,19 @@ class Favorites extends FHCAPI_Controller
$this->load->model('system/Variable_model', 'VariableModel');
}
- public function index()
+ public function get($app)
{
- $result = $this->VariableModel->getVariables(getAuthUID(), ['stv_favorites']);
+ $result = $this->VariableModel->getVariables(getAuthUID(), [$app . '_favorites']);
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
$this->terminateWithSuccess(null);
else
- $this->terminateWithSuccess($data['stv_favorites'] ?? null);
+ $this->terminateWithSuccess($data[$app . '_favorites'] ?? null);
}
- public function set()
+ public function set($app)
{
$this->load->library('form_validation');
@@ -60,7 +60,7 @@ class Favorites extends FHCAPI_Controller
$favorites = $this->input->post('favorites');
- $result = $this->VariableModel->setVariable(getAuthUID(), 'stv_favorites', $favorites);
+ $result = $this->VariableModel->setVariable(getAuthUID(), $app . '_favorites', $favorites);
$this->getDataOrTerminateWithError($result);
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/Lehrveranstaltung.php b/application/controllers/api/frontend/v1/Lehrveranstaltung.php
index 935602391..66bda9ebf 100644
--- a/application/controllers/api/frontend/v1/Lehrveranstaltung.php
+++ b/application/controllers/api/frontend/v1/Lehrveranstaltung.php
@@ -56,7 +56,9 @@ class Lehrveranstaltung extends FHCAPI_Controller
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
- $lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz);
+ $studiengang_kz = $this->getStudiengangKz($stg_kz);
+
+ $lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $studiengang_kz);
$lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen);
$tree = [];
@@ -75,15 +77,17 @@ class Lehrveranstaltung extends FHCAPI_Controller
$this->terminateWithSuccess($tree);
}
- public function getByStg($studiensemester_kurzbz = null, $studiengang_kz = null, $semester = null)
+ public function getByStg($studiensemester_kurzbz = null, $stg_kz = null, $semester = null)
{
+ $studiengang_kz = $this->getStudiengangKz($stg_kz);
+
if (is_null($studiengang_kz) || !preg_match("/^-?[1-9][0-9]*$/", (string)$studiengang_kz))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$verband = null;
if (!is_null($semester) && !is_numeric($semester))
{
- $verband = $semester;
+ $verband = $this->getOrgformKurzbz($semester);
$semester = null;
}
@@ -260,18 +264,53 @@ class Lehrveranstaltung extends FHCAPI_Controller
}
}
+ protected function getStudiengangKz($studiengang_typ_kurzbz)
+ {
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $result = $this->StudiengangModel->loadWhere([
+ 'LOWER(CONCAT(typ, kurzbz)) =' => strtolower($studiengang_typ_kurzbz)
+ ]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if (!$data)
+ return null;
+
+ return current($data)->studiengang_kz;
+ }
+
private function getStudiensemesterKurzbz($studiensemester_kurzbz = null)
{
if (!is_null($studiensemester_kurzbz))
{
- $studiensemester_result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
+ $studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere([
+ 'LOWER(studiensemester_kurzbz)' => strtolower($studiensemester_kurzbz)
+ ]);
if (isError($studiensemester_result) || !hasData($studiensemester_result))
- $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
return getData($studiensemester_result)[0]->studiensemester_kurzbz;
}
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
}
+
+ protected function getOrgformKurzbz($orgform_kurzbz)
+ {
+ if ($orgform_kurzbz === null)
+ return null;
+
+ $this->load->model('codex/Orgform_model', 'OrgformModel');
+ $result = $this->OrgformModel->loadWhere([
+ 'LOWER(orgform_kurzbz) =' => strtolower($orgform_kurzbz)
+ ]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if (!$data)
+ return $orgform_kurzbz;
+
+ return current($data)->orgform_kurzbz;
+ }
}
diff --git a/application/controllers/api/frontend/v1/LvPlan.php b/application/controllers/api/frontend/v1/LvPlan.php
index 28b48e3f1..f9d2cc3cf 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,27 @@ 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,
+ 'getLeEvents' => self::PERM_LOGGED,
+ 'getLvEvents' => 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,
@@ -54,16 +63,22 @@ class LvPlan extends FHCAPI_Controller
));
$this->load->library('form_validation');
+ $this->load->library('PhrasesLib');
+ $this->loadPhrases(
+ array(
+ 'ui'
+ )
+ );
}
//------------------------------------------------------------------------------------------------------------------
// 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 +98,31 @@ 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 +131,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 +183,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 +198,6 @@ class LvPlan extends FHCAPI_Controller
// fetching ferien events
$ferienEvents = $this->fetchFerienEvents($start_date, $end_date);
-
$this->terminateWithSuccess(array_merge(
$lvplanEvents,
@@ -145,41 +205,75 @@ class LvPlan extends FHCAPI_Controller
));
}
+ public function getLeEvents($le_id = null, $start_date = null, $end_date = null, $stundenplan = 'stundenplandev')
+ {
+
+ if (is_null($le_id) || is_null($start_date) || is_null($end_date))
+ $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ if ($stundenplan !== 'stundenplandev' && $stundenplan !== 'stundenplan')
+ $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ $this->load->library('StundenplanLib');
+
+ $result = $this->stundenplanlib->getEventsByLE($le_id, $start_date, $end_date, $stundenplan);
+ $lvplanEvents = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($lvplanEvents);
+ }
+
+ public function getLvEvents($lv_id = null, $start_date = null, $end_date = null, $stundenplan = 'stundenplandev')
+ {
+ if (is_null($lv_id) || is_null($start_date) || is_null($end_date))
+ $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ if ($stundenplan !== 'stundenplandev' && $stundenplan !== 'stundenplan')
+ $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ $this->load->library('StundenplanLib');
+
+ $result = $this->stundenplanlib->getEventsByLV($lv_id, $start_date, $end_date, $stundenplan);
+
+ $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
//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 +304,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 +320,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 +388,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 +457,34 @@ 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)
{
+ if ($uid && $uid !== getAuthUID()) {
+ return [];
+ }
+
$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 +498,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 +524,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..1807f0a4a
--- /dev/null
+++ b/application/controllers/api/frontend/v1/OtherLvPlan.php
@@ -0,0 +1,77 @@
+.
+ */
+
+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');
+ $this->load->library('ProfilLib');
+
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // 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;
+
+ $resProfileData = $this->profillib->getView($uid);
+ $profileData = hasData($resProfileData) ? getData($resProfileData) : null;
+
+ $viewData = [
+ "user_data" => [
+ "username" => $uid,
+ "is_student" => $isStudent,
+ "is_mitarbeiter" => $isMitarbeiter,
+ "foto" => $profileData->data->foto,
+ "vorname" => $profileData->data->vorname,
+ "nachname" => $profileData->data->nachname,
+ "titel" => $profileData->data->titel,
+ "postnomen" => $profileData->data->postnomen,
+ ],
+ ];
+
+ $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..4794bedd3 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;
}))){
@@ -153,7 +167,9 @@ class Studium extends FHCAPI_Controller
if($aktuelles_studienplan){
$lehrveranstaltungen = $this->computeStudienplanLehrveranstaltungen($aktuelles_studienplan->studienplan_id, $aktuelles_semester);
foreach($lehrveranstaltungen as $lehrv){
- foreach($lehrv->lehrveranstaltungen as $lv){
+ // a lehrveranstaltung without a modul has no children and gets its lektoren directly
+ $lvs = isset($lehrv->lehrveranstaltungen) ? $lehrv->lehrveranstaltungen : [$lehrv];
+ foreach($lvs as $lv){
$lvLektoren =$this->computeLektorenFromLehrveranstaltung($lv->lehrveranstaltung_id,$aktuelles_semester, $aktuelles_studiengang->studiengang_kz, $aktuelles_studiensemester->studiensemester_kurzbz);
$lv->lektoren = $lvLektoren;
}
@@ -216,6 +232,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;
@@ -270,6 +288,7 @@ SELECT tbl_lehrveranstaltung.*,
$lehrveranstaltungen = $this->LehrveranstaltungModel->execReadOnlyQuery($query,[$studienplan_id, $semester]);
$lehrveranstaltungen = $this->getDataOrTerminateWithError($lehrveranstaltungen);
+
usort($lehrveranstaltungen, function($a, $b){
if($a->lehrtyp_kurzbz == "modul"){
return -1;
@@ -286,12 +305,17 @@ SELECT tbl_lehrveranstaltung.*,
}
else{
$parent =array_filter($carry, function($item)use($lehrv){
- return $item->studienplan_lehrveranstaltung_id == $lehrv->studienplan_lehrveranstaltung_id_parent;
+ return isset($item->lehrveranstaltungen)
+ && $item->studienplan_lehrveranstaltung_id == $lehrv->studienplan_lehrveranstaltung_id_parent;
});
$parent = current($parent);
if($parent){
$parent->lehrveranstaltungen[] = $lehrv;
}
+ else{
+ // lehrveranstaltung without a modul: keep it on the top level
+ array_push($carry, $lehrv);
+ }
}
return $carry;
}, []);
diff --git a/application/controllers/api/frontend/v1/TabulatorPresets.php b/application/controllers/api/frontend/v1/TabulatorPresets.php
new file mode 100644
index 000000000..cb8e23ade
--- /dev/null
+++ b/application/controllers/api/frontend/v1/TabulatorPresets.php
@@ -0,0 +1,162 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * This controller operates between (interface) the JS (GUI) and the PhrasesLib (back-end)
+ * Provides data to the ajax get calls about the Phrasen plugin
+ * This controller works with JSON calls on the HTTP GET and the output is always JSON
+ */
+class TabulatorPresets extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'getTabulatorPresets' => self::PERM_LOGGED,
+ 'createTabulatorPreset' => self::PERM_LOGGED,
+ 'updateTabulatorPreset' => self::PERM_LOGGED,
+ 'deleteTabulatorPreset' => self::PERM_LOGGED,
+ ]);
+
+ $this->load->model('tabulator/Tabulator_preset_model', 'TabulatorPresetModel');
+
+ $this->loadPhrases([
+ 'global',
+ 'tabulator_presets'
+ ]);
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ public function getTabulatorPresets()
+ {
+ $tableName = $this->input->get("tableName");
+ if (!$tableName) {
+ $this->terminateWithError(error($this->p->t("tabulator_presets", "invalid_params_err_msg")));
+ }
+
+ $uid = getAuthUID();
+ $presets = $this->TabulatorPresetModel->getTabulatorPresetsByUserAndTable($uid, $tableName);
+ $presetsData = $this->getDataOrTerminateWithError($presets) ?? [];
+
+ $this->terminateWithSuccess($presetsData);
+ }
+
+ public function createTabulatorPreset()
+ {
+ $tableName = $this->input->post("tableName");
+ $presetName = $this->input->post("presetName");
+ $preset = $this->input->post("preset");
+
+ if (!$tableName || !$presetName || !$preset) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400);
+ }
+
+ $uid = getAuthUID();
+
+ $existingPresetsResult = $this->TabulatorPresetModel->getTabulatorPresetsByUserAndTable($uid, $tableName);
+ $existingPresets = $this->getDataOrTerminateWithError($existingPresetsResult) ?? [];
+
+ if (count($existingPresets) > 19) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "max_presets_count_err_msg"), "general", 409);
+ }
+
+ $existingPresetNames = array_map(function($presetInfo) {
+ return $presetInfo->preset_name;
+ }, $existingPresets);
+
+ if (in_array($presetName, $existingPresetNames)) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "preset_name_duplicate_err_msg"), "general", 409);
+ }
+
+ $presetCreationResult = $this->TabulatorPresetModel->createTabulatorPreset($uid, $tableName, $presetName, $preset);
+
+ if (isError($presetCreationResult)) {
+ $this->terminateWithError($presetCreationResult->retval);
+ }
+
+ $newPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetCreationResult->retval);
+ $newPresetArray = $this->getDataOrTerminateWithError($newPresetData) ?? [null];
+ $newPreset = $newPresetArray[0];
+
+ $this->terminateWithSuccess($newPreset);
+ }
+
+ public function updateTabulatorPreset()
+ {
+ $presetId = $this->input->post("presetId");
+ $preset = $this->input->post("preset");
+
+ if (!$presetId || !$preset) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400);
+ }
+
+ $existingPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId);
+ $existingPresetArray = $this->getDataOrTerminateWithError($existingPresetData) ?? [null];
+ $existingPreset = $existingPresetArray[0];
+ if (!$existingPreset) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "preset_not_found_err_msg"), "general", 404);
+ }
+
+ $uid = getAuthUID();
+ if ($existingPreset->benutzer_uid !== $uid) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "preset_not_own_update_err_msg"), "general", 403);
+ }
+
+ $presetUpdateResult = $this->TabulatorPresetModel->updateTabulatorPreset($presetId, $preset);
+ if (isError($presetUpdateResult)) {
+ $this->terminateWithError($presetUpdateResult->retval);
+ }
+
+ $updatedPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId);
+ $updatedPresetArray = $this->getDataOrTerminateWithError($updatedPresetData) ?? [null];
+ $updatedPreset = $updatedPresetArray[0];
+
+ $this->terminateWithSuccess($updatedPreset);
+ }
+
+ public function deleteTabulatorPreset()
+ {
+ $presetId = $this->input->post("presetId");
+ if (!$presetId) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400);
+ }
+
+ $presetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId);
+ $presetArray = $this->getDataOrTerminateWithError($presetData) ?? [null];
+ $preset = $presetArray[0];
+ if (!$preset) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "preset_not_found_err_msg"), "general", 404);
+ }
+
+ $uid = getAuthUID();
+ if ($preset->benutzer_uid !== $uid) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "preset_not_own_delete_err_msg"), "general", 403);
+ }
+
+ $presetDeletionResult = $this->TabulatorPresetModel->deleteTabulatorPreset($presetId);
+ if (isError($presetDeletionResult)) {
+ $this->terminateWithError($presetDeletionResult->retval);
+ }
+
+ $this->terminateWithSuccess();
+ }
+
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/Treemenu.php b/application/controllers/api/frontend/v1/Treemenu.php
new file mode 100644
index 000000000..e25610370
--- /dev/null
+++ b/application/controllers/api/frontend/v1/Treemenu.php
@@ -0,0 +1,148 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+use \ReflectionMethod as ReflectionMethod;
+use \ReflectionFunction as ReflectionFunction;
+
+/**
+ * This controller operates between (interface) the JS (GUI) and the back-end
+ * Provides data to the ajax get calls about menues
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Treemenu extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ // Load Router
+ $router = load_class('Router');
+
+ // Load Config
+ $config = load_class('Config');
+ $config->load('treemenu');
+
+ // Get Treemenu name & config
+ $name = $router->method;
+ $conf = $config->item($name);
+
+ // Get Permissions from config
+ $permissions = $conf['permissions'] ?? self::PERM_ANONYMOUS;
+
+ // Call constructor
+ parent::__construct([
+ $name => $permissions
+ ]);
+
+ // Load Library
+ $libraryName = $conf['library'] ?? null;
+ $this->load->library($libraryName, null, 'treemenulib');
+ }
+
+ /**
+ * @param string $method
+ * @param array $params (optional)
+ *
+ * @return void
+ */
+ public function _remap($method, $params = [])
+ {
+ if (!$this->treemenulib)
+ show_404();
+
+ $this->addMeta('ci_method', $method);
+ $this->addMeta('ci_params', $params);
+
+ $params = $this->uri->uri_to_assoc(6); // 6 = start of $params
+ $config = $this->treemenulib->config;
+
+ foreach (array_keys($params) as $key) {
+ if (!isset($config[$key]) || !$config[$key])
+ show_404();
+
+ $config = $config[$key];
+ }
+
+ // Prepare aliases
+ $argumentaliases = [];
+ if (property_exists($this->treemenulib, 'path_to_argument'))
+ $argumentaliases = array_flip($this->treemenulib->path_to_argument);
+ $methodaliases = [];
+ if (property_exists($this->treemenulib, 'redirect_method'))
+ $methodaliases = $this->treemenulib->redirect_method;
+
+ $items = [];
+ foreach ($config as $uripart => $children) {
+ if (!is_array($children)) {
+ $uripart = $children;
+ $children = [];
+ }
+
+ $methodName = $uripart;
+ if (isset($methodaliases[$methodName])) {
+ $methodName = $methodaliases[$methodName];
+ } elseif (strpbrk($methodName, ' _-') !== false) {
+ $methodName = lcfirst(str_replace([' ', '_', '-'], '', ucwords($methodName, " \t\r\n\f\v_-")));
+ }
+
+ // Prepare arguments
+ if (is_callable($methodName, false, $name)) {
+ if (is_string($methodName) && is_callable([$this->treemenulib, $methodName]))
+ $callable = [$this->treemenulib, $methodName];
+ else
+ $callable = $methodName;
+ } else {
+ $callable = [$this->treemenulib, $methodName];
+ }
+
+ if (is_array($callable))
+ $reflection = new ReflectionMethod($callable[0], $callable[1]);
+ elseif (is_string($callable) && strstr($callable, '::'))
+ $reflection = new ReflectionMethod($callable);
+ elseif ($name != 'Closure::__invoke' && strstr($name, '::__invoke'))
+ $reflection = new ReflectionMethod($callable, '__invoke');
+ else
+ $reflection = new ReflectionFunction($callable);
+
+ $arguments = [];
+ foreach ($reflection->getParameters() as $arg) {
+ if ($arg->name == 'path_template') {
+ $path = $params;
+ $path[$uripart] = '%s';
+ $arguments[] = $this->uri->assoc_to_uri($path);
+ } elseif ($arg->name == 'has_children') {
+ $arguments[] = $children;
+ } elseif ($arg->name == 'original_method') {
+ $arguments[] = $uripart;
+ } elseif (isset($argumentaliases[$arg->name]) && isset($params[$argumentaliases[$arg->name]])) {
+ $arguments[] = $params[$argumentaliases[$arg->name]];
+ } elseif (isset($params[$arg->name])) {
+ $arguments[] = $params[$arg->name];
+ } else {
+ $arguments[] = null;
+ }
+ }
+
+ // Call function from lib
+ $items = array_merge($items, call_user_func_array($callable, $arguments));
+ }
+
+ $this->terminateWithSuccess($items);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php
index 7486f44f0..0ac3c8bca 100644
--- a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php
+++ b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php
@@ -259,7 +259,7 @@ class BetriebsmittelP extends FHCAPI_Controller
$kaution = $this->input->post('kaution');
if($kaution) $kaution = str_replace(',', '.', $kaution);
$ausgegebenam = $this->input->post('ausgegebenam');
- $retouram = $this->input->post('retouram');
+ $retouram = $this->input->post('retouram') == "" ? null : $this->input->post('retouram');
// NOTE(chris): transform_kartennummer
if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer)
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/detailheader/Detailheader.php b/application/controllers/api/frontend/v1/detailheader/Detailheader.php
index ada10c5b6..89e9821eb 100644
--- a/application/controllers/api/frontend/v1/detailheader/Detailheader.php
+++ b/application/controllers/api/frontend/v1/detailheader/Detailheader.php
@@ -9,9 +9,10 @@ class Detailheader extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
- 'getHeader' => ['vertrag/mitarbeiter:r'],
- 'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
- 'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
+ 'getHeader' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
+ 'getPersonAbteilung' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
+ 'getLeitungOrg' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
+ 'getSemesterStati' => ['admin:r', 'assistenz:r'],
]);
}
@@ -48,6 +49,17 @@ class Detailheader extends FHCAPI_Controller
$this->terminateWithSuccess(current($data));
}
+ public function getSemesterStati($prestudent_id)
+ {
+ $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+
+ $result = $this->PrestudentstatusModel->getAllPrestudentstatiWithStudiensemester($prestudent_id);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
}
diff --git a/application/controllers/api/frontend/v1/funktionen/Funktionen.php b/application/controllers/api/frontend/v1/funktionen/Funktionen.php
index b2787072b..a3efcdb51 100644
--- a/application/controllers/api/frontend/v1/funktionen/Funktionen.php
+++ b/application/controllers/api/frontend/v1/funktionen/Funktionen.php
@@ -294,6 +294,10 @@ class Funktionen extends FHCAPI_Controller
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
+ if($datum_von == '')
+ $datum_von = null;
+ if($datum_bis == '')
+ $datum_bis = null;
$result = $this->BenutzerfunktionModel->update(
[
diff --git a/application/controllers/api/frontend/v1/lv/Config.php b/application/controllers/api/frontend/v1/lv/Config.php
new file mode 100644
index 000000000..4f39c6b8b
--- /dev/null
+++ b/application/controllers/api/frontend/v1/lv/Config.php
@@ -0,0 +1,86 @@
+ ['admin:r', 'assistenz:r'],
+ 'set' => ['admin:r', 'assistenz:r'],
+ ]);
+
+ $this->_ci = &get_instance();
+ $this->_setAuthUID();
+
+ $this->loadPhrases([
+ 'lehre'
+ ]);
+
+ $this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
+ $this->_ci->load->library('PermissionLib');
+
+ }
+
+
+ public function get()
+ {
+ if (!($this->permissionlib->isBerechtigt('basis/tempus')) && !($this->permissionlib->isBerechtigt('lv-plan')))
+ $this->terminateWithSuccess([]);
+
+ $ignore_kollision = $this->_ci->variablelib->getVar('ignore_kollision');
+ $ignore_zeitsperre = $this->_ci->variablelib->getVar('ignore_zeitsperre');
+ $ignore_reservierung = $this->_ci->variablelib->getVar('ignore_reservierung');
+
+ $config['ignore_kollision'] = [
+ "type" => "checkbox",
+ "label" => 'ignore_kollision',
+ "value" => $ignore_kollision,
+ ];
+
+ $config['ignore_zeitsperre'] = [
+ "type" => "checkbox",
+ "label" => 'ignore_zeitsperre',
+ "value" => $ignore_zeitsperre,
+ ];
+
+ $config['ignore_reservierung'] = [
+ "type" => "checkbox",
+ "label" => 'ignore_reservierung',
+ "value" => $ignore_reservierung,
+ ];
+
+ $this->terminateWithSuccess($config);
+ }
+ public function set()
+ {
+ if (!($this->permissionlib->isBerechtigt('basis/tempus')) && !($this->permissionlib->isBerechtigt('lv-plan')))
+ $this->terminateWithSuccess([]);
+
+ $this->load->model('system/Variable_model', 'VariableModel');
+
+ foreach (['ignore_kollision','ignore_zeitsperre','ignore_reservierung'] as $variable)
+ {
+ if ($this->_ci->input->post($variable) !== null)
+ {
+ $this->VariableModel->update(array('uid' => $this->_uid, 'name' => $variable), array('wert' => $this->input->post($variable)));
+
+ }
+ }
+
+ $this->terminateWithSuccess();
+ }
+
+ private function _setAuthUID()
+ {
+ $this->_uid = getAuthUID();
+
+ if (!$this->_uid)
+ show_error('User authentification failed');
+ }
+}
diff --git a/application/controllers/api/frontend/v1/lv/Favorites.php b/application/controllers/api/frontend/v1/lv/Favorites.php
deleted file mode 100644
index 080a4ec6e..000000000
--- a/application/controllers/api/frontend/v1/lv/Favorites.php
+++ /dev/null
@@ -1,47 +0,0 @@
- self::PERM_LOGGED,
- 'set' => self::PERM_LOGGED
- ]);
-
- // Load models
- $this->load->model('system/Variable_model', 'VariableModel');
- }
-
- public function index()
- {
- $result = $this->VariableModel->getVariables(getAuthUID(), ['lv_favorites']);
-
- $data = $this->getDataOrTerminateWithError($result);
-
- if (!$data)
- $this->terminateWithSuccess(null);
- else
- $this->terminateWithSuccess(isset($data['lv_favorites']) ? $data['lv_favorites'] : null);
- }
-
- public function set()
- {
- $this->load->library('form_validation');
-
- $this->form_validation->set_rules('favorites', 'Favorites', 'required');
-
- if (!$this->form_validation->run())
- $this->terminateWithValidationErrors($this->form_validation->error_array());
-
- $favorites = $this->input->post('favorites');
-
- $result = $this->VariableModel->setVariable(getAuthUID(), 'lv_favorites', $favorites);
-
- $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess(true);
- }
-}
diff --git a/application/controllers/api/frontend/v1/lv/Gruppe.php b/application/controllers/api/frontend/v1/lv/Gruppe.php
index daebe8a61..f60d3a99a 100644
--- a/application/controllers/api/frontend/v1/lv/Gruppe.php
+++ b/application/controllers/api/frontend/v1/lv/Gruppe.php
@@ -15,6 +15,7 @@ class Gruppe extends FHCAPI_Controller
'getBenutzerSearch' => ['admin:r', 'assistenz:r'],
'getAllSearch' => ['admin:r', 'assistenz:r'],
'getByLehreinheit' => ['admin:r', 'assistenz:r'],
+ 'getGruppe' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
@@ -67,7 +68,7 @@ class Gruppe extends FHCAPI_Controller
$this->checkPermission($lehreinheit_id);
- $result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, !($lehrverband === 'false'));
+ $result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, $lehrverband === true || $lehrverband === 'true');
if (isError($result))
$this->terminateWithError(getError($result));
@@ -75,6 +76,71 @@ class Gruppe extends FHCAPI_Controller
$this->terminateWithSuccess($result);
}
+ public function getGruppe()
+ {
+ $lehrverband = $this->input->post('lehrverband');
+
+ $gruppen_result = array();
+
+ if ($lehrverband === false)
+ {
+ $gruppen_result = $this->_ci->GruppeModel->loadWhere(array(
+ 'studiengang_kz' => $this->input->post('stg_kz'),
+ 'gruppe_kurzbz' => $this->input->post('gruppe_kurzbz'),
+ 'aktiv' => true
+ ));
+ }
+ else if ($lehrverband === true)
+ {
+
+ if (!isEmptyString($this->input->post('verband')))
+ {
+ $this->LehrverbandModel->db->where('verband', $this->input->post('verband'));
+ }
+ else
+ {
+ $this->LehrverbandModel->db->group_start();
+ $this->LehrverbandModel->db->where("trim(verband) = ''");
+ $this->LehrverbandModel->db->or_where("verband IS NULL");
+ $this->LehrverbandModel->db->group_end();
+ }
+
+ if (!isEmptyString($this->input->post('gruppe')))
+ {
+ $this->LehrverbandModel->db->where('gruppe', $this->input->post('gruppe'));
+ }
+ else
+ {
+ $this->LehrverbandModel->db->group_start();
+ $this->LehrverbandModel->db->where("trim(gruppe) = ''");
+ $this->LehrverbandModel->db->or_where("gruppe IS NULL");
+ $this->LehrverbandModel->db->group_end();
+ }
+
+ if (!isEmptyString((string)$this->input->post('semester')))
+ {
+ $this->LehrverbandModel->db->where('semester', $this->input->post('semester'));
+ }
+ else
+ {
+
+ $this->LehrverbandModel->db->group_start();
+ $this->LehrverbandModel->db->where("semester = ''");
+ $this->LehrverbandModel->db->or_where("semester IS NULL");
+ $this->LehrverbandModel->db->group_end();
+ }
+
+ $gruppen_result = $this->LehrverbandModel->loadWhere(array('studiengang_kz' => $this->input->post('stg_kz'), 'aktiv' => true));
+ }
+
+ if (!hasData($gruppen_result))
+ return $this->terminateWithError('No group found');
+
+ $gruppen_array = getData($gruppen_result)[0];
+
+ $this->terminateWithSuccess($gruppen_array->gid);
+ }
+
public function getByLehreinheit($lehreinheit_id = null)
{
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id))
diff --git a/application/controllers/api/frontend/v1/lv/Lektor.php b/application/controllers/api/frontend/v1/lv/Lektor.php
index cce7f6e8b..64cfd3f1c 100644
--- a/application/controllers/api/frontend/v1/lv/Lektor.php
+++ b/application/controllers/api/frontend/v1/lv/Lektor.php
@@ -134,9 +134,14 @@ class Lektor extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
- if (isset($formData['semesterstunden']) && (!is_numeric($formData['semesterstunden']) || $formData['semesterstunden'] === ''))
+ $nullable_fields = array('semesterstunden', 'stundensatz', 'planstunden');
+
+ foreach ($nullable_fields as $nullable_field)
{
- $formData['semesterstunden'] = null;
+ if (isset($formData[$nullable_field]) && (!is_numeric($formData[$nullable_field]) || $formData[$nullable_field] === ''))
+ {
+ $formData[$nullable_field] = null;
+ }
}
$lehreinheit_permission = $this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan'));
@@ -144,6 +149,9 @@ class Lektor extends FHCAPI_Controller
if (!$lehreinheit_permission)
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
+ if (!is_null($this->getLektorVertrag($lehreinheit_id, $mitarbeiter_uid)) && (array_key_exists('mitarbeiter_uid', $formData) && $mitarbeiter_uid !== $formData['mitarbeiter_uid']))
+ $this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
+
$result = $this->_ci->lektorlib->updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $formData);
if (isError($result)) $this->terminateWithError(getError($result));
@@ -154,7 +162,7 @@ class Lektor extends FHCAPI_Controller
{
$value = str_replace(',', '.', $value);
- if (!is_numeric($value))
+ if (!is_numeric($value) && $value !== "")
{
$this->form_validation->set_message('_check_decimal', 'Das Feld {field} muss eine Zahl sein.');
return false;
diff --git a/application/controllers/api/frontend/v1/lv/Noten.php b/application/controllers/api/frontend/v1/lv/Noten.php
new file mode 100644
index 000000000..614ee6609
--- /dev/null
+++ b/application/controllers/api/frontend/v1/lv/Noten.php
@@ -0,0 +1,84 @@
+ 'student/noten:r',
+ 'getTeacherProposal' => 'student/noten:r',
+ ]);
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ // Load Phrases
+ $this->loadPhrases([
+ 'stv',
+ 'person',
+ 'lehre'
+ ]);
+ }
+
+ public function getCertificate($lv_id, $studiensemester_kurzbz = null)
+ {
+ if (is_null($lv_id) || !ctype_digit((string)$lv_id))
+ $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ $this->load->model('education/lehrveranstaltung_model', 'LehrveranstaltungModel');
+ $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ $result = $this->LehrveranstaltungModel->loadWhere([
+ 'lehrveranstaltung_id' => $lv_id
+ ]);
+
+ $lehrveranstaltung = $this->getDataOrTerminateWithError($result);
+
+ if (!$lehrveranstaltung)
+ $this->terminateWithSuccess([]);
+
+ if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
+ {
+ $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
+ }
+
+ $result = $this->ZeugnisnoteModel->getZeugnisnoten(null, $studiensemester_kurzbz, $lehrveranstaltung[0]->lehrveranstaltung_id);
+
+ $grades = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($grades);
+ }
+
+ public function getTeacherProposal($lv_id, $studiensemester_kurzbz = null)
+ {
+ if (is_null($lv_id) || !ctype_digit((string)$lv_id))
+ $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ $this->load->model('education/lehrveranstaltung_model', 'LehrveranstaltungModel');
+ $this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel');
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ $result = $this->LehrveranstaltungModel->loadWhere([
+ 'lehrveranstaltung_id' => $lv_id
+ ]);
+
+ $lehrveranstaltung = $this->getDataOrTerminateWithError($result);
+
+ if (!$lehrveranstaltung)
+ $this->terminateWithSuccess([]);
+
+ if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
+ {
+ $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
+ }
+
+ $result = $this->LvgesamtnoteModel->getLvGesamtNoten($lv_id, null, $studiensemester_kurzbz);
+
+ $grades = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($grades);
+ }
+
+}
diff --git a/application/controllers/api/frontend/v1/lv/Setup.php b/application/controllers/api/frontend/v1/lv/Setup.php
index eea4befa5..4b91b99c1 100644
--- a/application/controllers/api/frontend/v1/lv/Setup.php
+++ b/application/controllers/api/frontend/v1/lv/Setup.php
@@ -19,6 +19,8 @@
if (!defined('BASEPATH'))
exit('No direct script access allowed');
+use CI3_Events as Events;
+
class Setup extends FHCAPI_Controller
{
private $_ci;
@@ -27,7 +29,8 @@ class Setup extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
- 'getTabs' => ['admin:r', 'assistenz:r'],
+ 'getLETabs' => ['admin:r', 'assistenz:r'],
+ 'getLVTabs' => ['admin:r', 'assistenz:r'],
'getStudiensemester' => ['admin:r', 'assistenz:r'],
'getSprache' => ['admin:r', 'assistenz:r'],
'getRaumtyp' => ['admin:r', 'assistenz:r'],
@@ -41,9 +44,10 @@ class Setup extends FHCAPI_Controller
$this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
+ $this->_ci->load->helper('hlp_document');
}
- public function getTabs()
+ public function getLETabs()
{
$tabs['details'] = array (
'title' => 'Details',
@@ -60,11 +64,43 @@ class Setup extends FHCAPI_Controller
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'),
'config' => []
);
+ $tabs['termine'] = array (
+ 'title' => 'Termine',
+ 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Termine.js'),
+ 'config' => []
+ );
$tabs['notiz'] = array (
'title' => 'Notizen',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'),
'config' => []
);
+
+ Events::trigger('lvv_conf_tabs', function & () use (&$tabs) {
+ return $tabs;
+ });
+
+ $this->terminateWithSuccess($tabs);
+ }
+
+ public function getLVTabs()
+ {
+ $tabs['termine'] = array (
+ 'title' => 'Termine',
+ 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/LVTermine.js'),
+ 'config' => []
+ );
+ $tabs['noten'] = array (
+ 'title' => 'Noten',
+ 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Noten.js'),
+ 'config' => [
+ 'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE,
+ 'edit' => 'both', // Possible values: both|header|inline
+ 'delete' => 'inline', // Possible values: both|header|inline
+ 'documents' => 'inline', // Possible values: both|header|inline
+ 'documentslist' => gradesDocumentsList(),
+ 'semesterSelect' => false
+ ]
+ );
$this->terminateWithSuccess($tabs);
}
diff --git a/application/controllers/api/frontend/v1/lv/StgTree.php b/application/controllers/api/frontend/v1/lv/StgTree.php
deleted file mode 100644
index 8272da978..000000000
--- a/application/controllers/api/frontend/v1/lv/StgTree.php
+++ /dev/null
@@ -1,117 +0,0 @@
-method] = ['admin:r', 'assistenz:r'];
- parent::__construct($permissions);
-
- $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
- }
-
- public function _remap($method, $params = [])
- {
- if ($method == '' || $method == 'index')
- return $this->getBase();
-
- if (!$this->permissionlib->isBerechtigt('assistenz', 's', $method)
- && !$this->permissionlib->isBerechtigt('admin', 's', $method)
- ) {
- return $this->_outputAuthError([$method => ['admin:r', 'assistenz:r']]);
- }
-
- return $this->getStudiengang($method);
- show_404();
- }
-
- protected function getBase()
- {
- $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
-
- $this->StudiengangModel->addDistinct();
- $this->StudiengangModel->addSelect("v.studiengang_kz AS link");
- $this->StudiengangModel->addSelect(
- "CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name",
- false
- );
- $this->StudiengangModel->addSelect('erhalter_kz');
- $this->StudiengangModel->addSelect('typ');
- $this->StudiengangModel->addSelect('kurzbz');
- $this->StudiengangModel->addSelect('studiengang_kz');
- $this->StudiengangModel->addSelect('studiengang_kz AS stg_kz');
-
- $this->StudiengangModel->addOrder('erhalter_kz');
- $this->StudiengangModel->addOrder('typ');
- $this->StudiengangModel->addOrder('kurzbz');
-
- $stgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: [];
- $stgs = array_merge($stgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
-
- if (!$stgs)
- $this->terminateWithSuccess([]);
-
- $this->StudiengangModel->db->where_in('studiengang_kz', $stgs);
-
- $result = $this->StudiengangModel->loadWhere(['v.aktiv' => true]);
-
- $list = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess($list);
- }
-
- protected function getStudiengang($studiengang_kz)
- {
- $link = $studiengang_kz . '/';
-
- $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
-
- $this->StudiengangModel->addDistinct();
- $this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", semester) AS link", false);
- $this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester ORDER BY verband, gruppe LIMIT 1)) AS name", false);
- $this->StudiengangModel->addSelect("TRUE AS leaf", false);
-
- $this->StudiengangModel->addSelect('semester');
- $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
-
- $this->StudiengangModel->addOrder('semester');
-
- $result = $this->StudiengangModel->loadWhere([
- 'v.studiengang_kz' => $studiengang_kz,
- 'v.aktiv' => true
- ]);
- $list = $this->getDataOrTerminateWithError($result);
-
- $result = $this->StudiengangModel->load($studiengang_kz);
- $result = $this->getDataOrTerminateWithError($result);
- if ($result)
- {
- if (current($result)->mischform)
- {
- $this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
-
- $this->StudienordnungModel->addDistinct();
- $this->StudienordnungModel->addSelect("CONCAT(studiengang_kz, '/', p.orgform_kurzbz) AS link");
- $this->StudienordnungModel->addSelect("p.orgform_kurzbz AS name");
- $this->StudienordnungModel->addSelect("TRUE as leaf", false);
-
- $this->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id');
-
- $result = $this->StudienordnungModel->loadWhere([
- 'aktiv' => true,
- 'studiengang_kz' => $studiengang_kz,
- 'p.orgform_kurzbz !=' => 'DDP'
- ]);
- $result = $this->getDataOrTerminateWithError($result);
-
- $list = array_merge($list, $result);
- }
- }
-
- $this->terminateWithSuccess($list);
- }
-}
diff --git a/application/controllers/api/frontend/v1/organisation/Studiensemester.php b/application/controllers/api/frontend/v1/organisation/Studiensemester.php
index 3c6b72d2f..eaafc6ac5 100644
--- a/application/controllers/api/frontend/v1/organisation/Studiensemester.php
+++ b/application/controllers/api/frontend/v1/organisation/Studiensemester.php
@@ -26,7 +26,9 @@ class Studiensemester extends FHCAPI_Controller
'getAll' => self::PERM_LOGGED,
'getAktNext' => self::PERM_LOGGED,
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
- 'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED
+ 'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED,
+ 'current' => self::PERM_LOGGED,
+ 'set' => self::PERM_LOGGED
)
);
// Load model StudiensemesterModel
@@ -166,4 +168,39 @@ class Studiensemester extends FHCAPI_Controller
$this->terminateWithSuccess(array($studiensemester, $aktuell));
}
+
+ public function current()
+ {
+ $result = $this->StudiensemesterModel->getNearest();
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if (!$data)
+ $this->terminateWithError('Kein Studiensemester aktiv');
+ if (count($data) > 1)
+ $this->terminateWithError('Mehrere Studiensemester aktiv');
+
+ $this->terminateWithSuccess(current($data)->studiensemester_kurzbz);
+ }
+
+ public function set()
+ {
+ $this->load->library('AuthLib');
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $stdsem = $this->input->post('studiensemester_kurzbz');
+
+ $this->load->model('system/Variable_model', 'VariableModel');
+
+ $result = $this->VariableModel->setVariable(getAuthUID(), 'semester_aktuell', $stdsem);
+
+ $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(true);
+ }
}
diff --git a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
index def4f6502..7c1c974e2 100644
--- a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
+++ b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
@@ -246,12 +246,12 @@ class Abschlusspruefung extends FHCAPI_Controller
{
$searchString = $this->input->get('searchString') ?? '';
- $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
+ $this->load->model('person/Person_model', 'PersonModel');
- $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid');
+ $result = $this->PersonModel->searchPerson($searchString, 'mitMaUid');
if (isError($result)) {
- $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess($result ?: []);
@@ -371,6 +371,9 @@ class Abschlusspruefung extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
+ $datum = $formData['datum'] == '' ? null : $formData['datum'];
+ $sponsion = $formData['sponsion'] == '' ? null : $formData['sponsion'];
+
$result = $this->AbschlusspruefungModel->update(
[
'abschlusspruefung_id' => $abschlusspruefung_id
@@ -382,8 +385,8 @@ class Abschlusspruefung extends FHCAPI_Controller
'vorsitz' => $vorsitz,
'pruefungsantritt_kurzbz' => $formData['pruefungsantritt_kurzbz'],
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
- 'datum' => $formData['datum'],
- 'sponsion' => $formData['sponsion'],
+ 'datum' => $datum,
+ 'sponsion' => $sponsion,
'pruefer1' => $pruefer1,
'pruefer2' => $pruefer2,
'pruefer3' => $pruefer3,
diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php
index bc1fbebfe..cc6c04430 100644
--- a/application/controllers/api/frontend/v1/stv/Config.php
+++ b/application/controllers/api/frontend/v1/stv/Config.php
@@ -301,6 +301,7 @@ class Config extends FHCAPI_Controller
public function student()
{
+ $this->load->helper('hlp_document');
$result = [];
$config = $this->config->item('tabs');
@@ -376,9 +377,9 @@ class Config extends FHCAPI_Controller
'config' => [
'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE,
'edit' => 'both', // Possible values: both|header|inline
- 'delete' => 'both', // Possible values: both|header|inline
- 'documents' => 'both', // Possible values: both|header|inline
- 'documentslist' => $this->gradesDocumentsList()
+ 'delete' => 'inline', // Possible values: both|header|inline
+ 'documents' => 'inline', // Possible values: both|header|inline
+ 'documentslist' => gradesDocumentsList()
]
];
@@ -622,188 +623,6 @@ class Config extends FHCAPI_Controller
] + $this->kontoColumns();
}
- /**
- * Helper function to generate the default documentslist config for the
- * grades tab.
- *
- * The resulting array consists of elements which are associative arrays
- * that can have the following entries:
- * title (required) on the first level this can be HTML code.
- * permissioncheck (optional) an URL to an FHCAPI endpoint which returns
- * true or false.
- * link (optional) an URL that will be called if "action" and
- * "children" are not defined.
- * action (optional) an associative array that describes an
- * POST action that will be called if "children" is
- * not defined.
- * It can have the following entries:
- * - url (required) an URL to an FHCAPI endpoint.
- * - post (optional) an associative array with the POST data to
- * be sent.
- * - response (optional) a string that will be displayed on success.
- * children (optional) an array of child elements
- *
- * All strings that start with { and end with } in the URLs and the
- * actions post parameter will be replaced with the corresponding
- * attribute of the current dataset (e.G: {uid} will be replaced with the
- * uid of the current dataset)
- *
- * @return array
- */
- protected function gradesDocumentsList()
- {
- $permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}");
-
- $title_ger = $this->p->t("global", "deutsch");
- $title_eng = $this->p->t("global", "englisch");
- $title_ff = $this->p->t("stv", "document_certificate");
- $title_lv = $this->p->t("stv", "document_coursecertificate");
-
- $link_ff = "documents/export/" .
- "zertifikat.rdf.php/" .
- "Zertifikat" .
- "?stg_kz={studiengang_kz_lv}" .
- "&uid={uid}" .
- "&ss={studiensemester_kurzbz}" .
- "&lvid={lehrveranstaltung_id}";
- $link_lv_ger = "documents/export/" .
- "lehrveranstaltungszeugnis.rdf.php/" .
- "LVZeugnis" .
- "?stg_kz={studiengang_kz}" .
- "&uid={uid}" .
- "&ss={studiensemester_kurzbz}" .
- "&lvid={lehrveranstaltung_id}";
- $link_lv_eng = "documents/export/" .
- "lehrveranstaltungszeugnis.rdf.php/" .
- "LVZeugnisEng" .
- "?stg_kz={studiengang_kz}" .
- "&uid={uid}" .
- "&ss={studiensemester_kurzbz}" .
- "&lvid={lehrveranstaltung_id}";
-
- $archive_url = "api/frontend/v1/documents/archiveSigned";
- $archive_response = $this->p->t("stv", "document_signed_and_archived");
- $archive_post_ff = [
- "xml" => "zertifikat.rdf.php",
- "xsl" => "Zertifikat",
- "stg_kz" => "{studiengang_kz_lv}",
- "uid" => "{uid}",
- "ss" => "{studiensemester_kurzbz}",
- "lvid" => "{lehrveranstaltung_id}"
- ];
- $archive_post_lv_ger = [
- "xml" => "lehrveranstaltungszeugnis.rdf.php",
- "xsl" => "LVZeugnis",
- "stg_kz" => "{studiengang_kz}",
- "uid" => "{uid}",
- "ss" => "{studiensemester_kurzbz}",
- "lvid" => "{lehrveranstaltung_id}"
- ];
- $archive_post_lv_eng = [
- "xml" => "lehrveranstaltungszeugnis.rdf.php",
- "xsl" => "LVZeugnisEng",
- "stg_kz" => "{studiengang_kz}",
- "uid" => "{uid}",
- "ss" => "{studiensemester_kurzbz}",
- "lvid" => "{lehrveranstaltung_id}"
- ];
-
- $list = [
- [
- 'title' => '',
- 'children' => [
- [
- 'title' => $title_ff,
- 'link' => site_url($link_ff)
- ],
- [
- 'title' => $title_lv,
- 'children' => [
- [
- 'title' => $title_ger,
- 'link' => site_url($link_lv_ger),
- 'children' => [
- [
- 'title' => 'PDF',
- 'permissioncheck' => $permissioncheck,
- 'link' => site_url($link_lv_ger)
- ],
- [
- 'title' => 'DOC',
- 'permissioncheck' => $permissioncheck,
- 'link' => site_url($link_lv_ger . "&output=doc")
- ],
- [
- 'title' => 'ODT',
- 'permissioncheck' => $permissioncheck,
- 'link' => site_url($link_lv_ger . "&output=odt")
- ]
- ]
- ],
- [
- 'title' => $title_eng,
- 'link' => site_url($link_lv_eng),
- 'children' => [
- [
- 'title' => 'PDF',
- 'permissioncheck' => $permissioncheck,
- 'link' => site_url($link_lv_eng)
- ],
- [
- 'title' => 'DOC',
- 'permissioncheck' => $permissioncheck,
- 'link' => site_url($link_lv_eng . "&output=doc")
- ],
- [
- 'title' => 'ODT',
- 'permissioncheck' => $permissioncheck,
- 'link' => site_url($link_lv_eng . "&output=odt")
- ]
- ]
- ]
- ]
- ]
- ]
- ],
- [
- 'title' => '',
- 'children' => [
- [
- 'title' => $title_ff,
- 'action' => [
- 'url' => site_url($archive_url),
- 'post' => $archive_post_ff,
- 'response' => $archive_response
- ]
- ],
- [
- 'title' => $title_lv,
- 'children' => [
- [
- 'title' => $title_ger,
- 'action' => [
- 'url' => site_url($archive_url),
- 'post' => $archive_post_lv_ger,
- 'response' => $archive_response
- ]
- ],
- [
- 'title' => $title_eng,
- 'action' => [
- 'url' => site_url($archive_url),
- 'post' => $archive_post_lv_eng,
- 'response' => $archive_response
- ]
- ]
- ]
- ]
- ]
- ]
- ];
-
- return $list;
- }
-
/**
* Sort tab list
*
diff --git a/application/controllers/api/frontend/v1/stv/Dokumente.php b/application/controllers/api/frontend/v1/stv/Dokumente.php
index b8c7830bd..b47a4af87 100644
--- a/application/controllers/api/frontend/v1/stv/Dokumente.php
+++ b/application/controllers/api/frontend/v1/stv/Dokumente.php
@@ -78,52 +78,32 @@ class Dokumente extends FHCAPI_Controller
$this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL);
$resultPreDoc = $this->_getPrestudentDokumente($prestudent_id);
-
- $arrayAccepted = [];
$person_id = $this->_getPersonId($prestudent_id);
- $docNames = array_map(function ($item) {
- return $item->dokument_kurzbz;
- }, $resultPreDoc);
+ $mergedArray = [];
- foreach($docNames as $doc)
+ foreach ($resultPreDoc as $pre)
{
- $result = $this->AkteModel->getAktenFAS($person_id, $doc, $studiengang_kz, $prestudent_id, true);
+ $result = $this->AkteModel->getAktenFAS($person_id, $pre->dokument_kurzbz, $studiengang_kz, $prestudent_id, true);
if (isError($result))
- {
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
- }
+
if (hasData($result))
{
- $data = getData($result);
- foreach ($data as $value)
+ foreach (getData($result) as $doc)
{
- array_push($arrayAccepted, $value);
+ $merged = clone $doc;
+ $merged->docdatum = $pre->docdatum;
+ $merged->insertvonma = $pre->insertvonma;
+ $merged->bezeichnung = $pre->bezeichnung;
+ $mergedArray[] = $merged;
}
}
- }
-
- //Mapping with document_kurzbz
- $preDocMap = [];
- foreach ($resultPreDoc as $pre) {
- $preDocMap[$pre->dokument_kurzbz] = $pre;
- }
-
- $mergedArray = [];
- foreach ($arrayAccepted as $doc) {
- $merged = clone $doc;
-
- if (isset($preDocMap[$doc->dokument_kurzbz])) {
- $merged->docdatum = $preDocMap[$doc->dokument_kurzbz]->docdatum;
- $merged->insertvonma = $preDocMap[$doc->dokument_kurzbz]->insertvonma;
- $merged->bezeichnung = $preDocMap[$doc->dokument_kurzbz]->bezeichnung;
- } else {
- $merged->akzeptiertdatum = null;
- $merged->akzeptiertvon = null;
+ else
+ {
+ $mergedArray[] = $pre;
}
-
- $mergedArray[] = $merged;
}
$this->terminateWithSuccess($mergedArray);
@@ -190,6 +170,8 @@ class Dokumente extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
+ $nachgereicht_am = $this->input->post('nachgereicht_am') == '' ? null : $this->input->post('nachgereicht_am');
+
$uid = getAuthUID();
$result = $this->AkteModel->update(
@@ -200,7 +182,7 @@ class Dokumente extends FHCAPI_Controller
'dokument_kurzbz' => $this->input->post('dokument_kurzbz'),
'anmerkung_intern' => $this->input->post('anmerkung_intern'),
'titel_intern' => $this->input->post('titel_intern'),
- 'nachgereicht_am' => $this->input->post('nachgereicht_am'),
+ 'nachgereicht_am' => $nachgereicht_am,
'updateamum' => date('c'),
'updatevon' => $uid,
]
diff --git a/application/controllers/api/frontend/v1/stv/Konto.php b/application/controllers/api/frontend/v1/stv/Konto.php
index ecd58671a..2654c18f6 100644
--- a/application/controllers/api/frontend/v1/stv/Konto.php
+++ b/application/controllers/api/frontend/v1/stv/Konto.php
@@ -48,7 +48,8 @@ class Konto extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
- 'konto'
+ 'konto',
+ 'lehre'
]);
}
@@ -112,7 +113,7 @@ class Konto extends FHCAPI_Controller
*
* @return void
*/
- public function getBuchungstypen()
+ public function getBuchungstypen($studiensemester_kurzbz = null)
{
$this->load->model('crm/Buchungstyp_model', 'BuchungstypModel');
@@ -122,6 +123,7 @@ class Konto extends FHCAPI_Controller
$data = $this->getDataOrTerminateWithError($result);
+ $this->_getOEHBeitrag($data, $studiensemester_kurzbz);
$this->terminateWithSuccess($data);
}
@@ -427,9 +429,12 @@ class Konto extends FHCAPI_Controller
'updateamum' => date('c'),
'updatevon' => getAuthUID()
];
+
foreach ($allowed as $field)
if ($this->input->post($field) !== null)
$data[$field] = $this->input->post($field);
+ if($data['buchungsdatum'] == '')
+ $data['buchungsdatum'] = null;
$result = $this->KontoModel->update($id, $data);
@@ -494,4 +499,43 @@ class Konto extends FHCAPI_Controller
$this->terminateWithSuccess();
}
+
+ private function _getOEHBeitrag(&$data, $studiensemester_kurzbz = null)
+ {
+ if (is_null($studiensemester_kurzbz))
+ {
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+ $studiensemester_akt = $this->variablelib->getVar('semester_aktuell');
+ }
+ else
+ {
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ if ($this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
+ $studiensemester_akt = $studiensemester_kurzbz;
+ else
+ $this->terminateWithError($this->p->t('lehre', 'error_noStudiensemester'));
+ }
+
+ $this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel');
+ $oehBeitrag = $this->OehbeitragModel->getByStudiensemester($studiensemester_akt);
+
+ $oehStandardbetrag = null;
+ if (hasData($oehBeitrag))
+ {
+ $oeh = getData($oehBeitrag)[0];
+ $summe = ($oeh->studierendenbeitrag + $oeh->versicherung) * -1;
+ $oehStandardbetrag = number_format((float)$summe, 2, '.', '');
+ }
+
+ if ($oehStandardbetrag !== null)
+ {
+ $data = array_map(function ($buchungstyp) use ($oehStandardbetrag) {
+ if (isset($buchungstyp->buchungstyp_kurzbz) && (strtolower($buchungstyp->buchungstyp_kurzbz) === 'oeh'))
+ {
+ $buchungstyp->standardbetrag = $oehStandardbetrag;
+ }
+ return $buchungstyp;
+ }, $data);
+ }
+ }
}
diff --git a/application/controllers/api/frontend/v1/stv/LvTermine.php b/application/controllers/api/frontend/v1/stv/LvTermine.php
index c29f56964..b9e23e77d 100644
--- a/application/controllers/api/frontend/v1/stv/LvTermine.php
+++ b/application/controllers/api/frontend/v1/stv/LvTermine.php
@@ -34,7 +34,7 @@ class LvTermine extends FHCAPI_Controller
//TODO Build own lib or combine with Controller Stundenplan.php
//here use of logic of Stundenplan.php, extended with parameters uid, grouping, and used dbTable
- public function getStundenplan($uid, $start_date = null, $end_date = null, $groupConsecutiveHours = false, $dbStundenplanTable = "stundenplan")
+ public function getStundenplan($uid, $start_date = null, $end_date = null, $dbStundenplanTable = "stundenplan", $groupConsecutiveHours = false)
{
$student_uid = $uid;
$semester_range = $this->studienSemesterErmitteln($start_date, $end_date);
@@ -80,13 +80,6 @@ class LvTermine extends FHCAPI_Controller
$stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? [];
$this->terminateWithSuccess($stundenplan_data);
-
- $this->expand_object_information($stundenplan_data);
-
- $this->returnObj['$stundenplan_query'] = $stundenplan_query;
- $this->returnObj['$student_lehrverband'] = $student_lehrverband;
- $this->returnObj['$benutzer_gruppen'] = $benutzer_gruppen;
- $this->terminateWithSuccess($stundenplan_data);
}
public function getStudiensemester()
diff --git a/application/controllers/api/frontend/v1/stv/Mobility.php b/application/controllers/api/frontend/v1/stv/Mobility.php
index f61816086..5639da549 100644
--- a/application/controllers/api/frontend/v1/stv/Mobility.php
+++ b/application/controllers/api/frontend/v1/stv/Mobility.php
@@ -237,8 +237,8 @@ class Mobility extends FHCAPI_Controller
}
$formData = $this->input->post('formData');
- $von = $formData['von'] ?? null;
- $bis = $formData['bis'] ?? null;
+ $von = ($formData['von'] ?? '') ?: null;
+ $bis = ($formData['bis'] ?? '') ?: null;
$nation_code = $formData['nation_code'] ?? null;
$mobilitaetsprogramm_code = $formData['mobilitaetsprogramm_code'] ?? null;
$herkunftsland_code = $formData['herkunftsland_code'] ?? null;
diff --git a/application/controllers/api/frontend/v1/stv/Prestudent.php b/application/controllers/api/frontend/v1/stv/Prestudent.php
index d8c8d1ff2..33957872f 100644
--- a/application/controllers/api/frontend/v1/stv/Prestudent.php
+++ b/application/controllers/api/frontend/v1/stv/Prestudent.php
@@ -193,7 +193,7 @@ class Prestudent extends FHCAPI_Controller
}
elseif (
$val === ''
- && in_array($prop, ['zgvnation', 'zgvmanation', 'zgvdoktornation', 'berufstaetigkeit_code', 'ausbildungcode'])
+ && in_array($prop, ['zgvnation', 'zgvmanation', 'zgvdoktornation', 'berufstaetigkeit_code', 'ausbildungcode', 'zgvdatum', 'zgvmadatum'])
)
{
$val = null;
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/Pruefung.php b/application/controllers/api/frontend/v1/stv/Pruefung.php
index 4521c2033..becda03ee 100644
--- a/application/controllers/api/frontend/v1/stv/Pruefung.php
+++ b/application/controllers/api/frontend/v1/stv/Pruefung.php
@@ -448,8 +448,10 @@ class Pruefung extends FHCAPI_Controller
}
}
+ $datum = $this->input->post('datum') == '' ? null : $this->input->post('datum');
if(intval($pruefung_id) > 0)
{
+
$result = $this->PruefungModel->update(
[
'pruefung_id' => $pruefung_id
@@ -459,7 +461,7 @@ class Pruefung extends FHCAPI_Controller
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
'note' => $this->input->post('note'),
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
- 'datum' => $this->input->post('datum'),
+ 'datum' => $datum,
'anmerkung' => $this->input->post('anmerkung'),
'updatevon' => $authUID,
'updateamum' => date('c'),
@@ -472,7 +474,7 @@ class Pruefung extends FHCAPI_Controller
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
- 'datum' => $this->input->post('datum'),
+ 'datum' => $datum,
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
'note' => $this->input->post('note'),
'anmerkung' => $this->input->post('anmerkung'),
@@ -520,7 +522,7 @@ class Pruefung extends FHCAPI_Controller
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'note' => $this->input->post('note'),
'uebernahmedatum' => date('c'),
- 'benotungsdatum' => $this->input->post('datum'),
+ 'benotungsdatum' => $datum,
'insertamum' => date('c'),
'insertvon' => $authUID,
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
@@ -555,7 +557,7 @@ class Pruefung extends FHCAPI_Controller
], [
'note' => $this->input->post('note'),
'uebernahmedatum' => date('c'),
- 'benotungsdatum' => $this->input->post('datum'),
+ 'benotungsdatum' => $datum,
'updateamum' => date('c'),
'updatevon' => $authUID,
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php
index 7694807e7..943df7b91 100644
--- a/application/controllers/api/frontend/v1/stv/Student.php
+++ b/application/controllers/api/frontend/v1/stv/Student.php
@@ -144,6 +144,7 @@ class Student extends FHCAPI_Controller
. $this->PrestudentModel->escape($studiensemester_kurzbz)
. ") AS statusofsemester"
);
+ $this->PrestudentModel->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_benutzer b', 'student_uid = uid', 'LEFT');
@@ -296,6 +297,10 @@ class Student extends FHCAPI_Controller
$fotoval = ($val == '') ? null : str_replace('data:image/jpeg;base64,', '', $val);
$update_person[$prop] = $fotoval;
}
+ else if ($prop == 'gebdatum')
+ {
+ $update_person[$prop] = ($val == '') ? null : $val;
+ }
else
{
$update_person[$prop] = $val;
diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php
index f87e527e0..6427df0ac 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'
@@ -110,24 +108,21 @@ class Students extends FHCAPI_Controller
'studiensemester_kurzbz' => $studiensemester_kurzbz
]);
+ $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
- $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,19 +130,16 @@ 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);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -162,12 +154,10 @@ class Students extends FHCAPI_Controller
$this->addMeta('ci_params', [
'studiensemester_kurzbz' => $studiensemester_kurzbz
]);
-
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
+ $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
-
- $this->PrestudentModel->addJoin(
+ $this->studentlistlib->addJoin(
"(
SELECT prestudent_id
FROM bis.tbl_bisio bis
@@ -187,14 +177,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,19 +190,16 @@ 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);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -230,24 +215,20 @@ class Students extends FHCAPI_Controller
'studiensemester_kurzbz' => $studiensemester_kurzbz
]);
+ $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
- $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,65 +236,67 @@ 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);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
public function getPrestudents(
- $studiengang_kz,
+ $studiengang_typ_kurzbz,
$studiensemester_kurzbz = null,
$filter = null
) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
- 'studiengang_kz' => $studiengang_kz,
+ 'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'filter' => $filter
));
- $this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter);
+ $this->fetchPrestudents($studiengang_typ_kurzbz, $studiensemester_kurzbz, $filter);
}
public function getPrestudentsOrgform(
- $studiengang_kz,
+ $studiengang_typ_kurzbz,
$orgform_kurzbz,
$studiensemester_kurzbz = null,
$filter = null
) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
- 'studiengang_kz' => $studiengang_kz,
+ 'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'filter' => $filter,
'orgform_kurzbz' => $orgform_kurzbz
));
- $this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter, $orgform_kurzbz);
+ $this->fetchPrestudents($studiengang_typ_kurzbz, $studiensemester_kurzbz, $filter, $orgform_kurzbz);
}
/**
- * @param integer $studiengang_kz
+ * @param string $studiengang_typ_kurzbz
* @param string $studiensemester_kurzbz (optional)
* @param string $filter (optional)
* @param string $orgform_kurzbz (optional)
*
* @return void
*/
- protected function fetchPrestudents($studiengang_kz, $studiensemester_kurzbz = null, $filter = null, $orgform_kurzbz = null)
+ protected function fetchPrestudents($studiengang_typ_kurzbz, $studiensemester_kurzbz = null, $filter = null, $orgform_kurzbz = null)
{
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
+ $studiengang_kz = $this->getStudiengangKz($studiengang_typ_kurzbz);
+ $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
+ $orgform_kurzbz = $this->getOrgformKurzbz($orgform_kurzbz);
+
+ if ($studiengang_kz === null)
+ show_404();
$stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
@@ -331,38 +314,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 +357,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 +427,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,30 +440,30 @@ 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");
+
+ $query_studiensemester_kurzbz = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : '\'NULL\'';
+ $this->studentlistlib->addSelect($query_studiensemester_kurzbz . ' as query_studiensemester_kurzbz');
$this->addFilter($studiensemester_kurzbz);
- $result = $this->PrestudentModel->loadWhere($where);
+ $result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
public function getStudents(
$studiensemester_kurzbz,
- $studiengang_kz,
+ $studiengang_typ_kurzbz,
$semester = null,
$verband = null,
$gruppe = null
@@ -488,18 +471,18 @@ class Students extends FHCAPI_Controller
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
- 'studiengang_kz' => $studiengang_kz,
+ 'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
'semester' => $semester,
'verband' => $verband,
'gruppe' => $gruppe
));
- $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, null);
+ $this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, $verband, $gruppe, null, null);
}
public function getStudentsOrgform(
$studiensemester_kurzbz,
- $studiengang_kz,
+ $studiengang_typ_kurzbz,
$orgform_kurzbz,
$semester = null,
$verband = null,
@@ -508,37 +491,37 @@ class Students extends FHCAPI_Controller
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
- 'studiengang_kz' => $studiengang_kz,
+ 'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
'orgform_kurzbz' => $orgform_kurzbz,
'semester' => $semester,
'verband' => $verband,
'gruppe' => $gruppe
));
- $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, $orgform_kurzbz);
+ $this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, $verband, $gruppe, null, $orgform_kurzbz);
}
public function getStudentsSpezialgruppe(
$studiensemester_kurzbz,
- $studiengang_kz,
+ $studiengang_typ_kurzbz,
$semester,
$gruppe_kurzbz
) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
- 'studiengang_kz' => $studiengang_kz,
+ 'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
'semester' => $semester,
'gruppe_kurzbz' => $gruppe_kurzbz
));
- $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, null);
+ $this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, null, null, $gruppe_kurzbz, null);
}
public function getStudentsOrgformSpezialgruppe(
$studiensemester_kurzbz,
$orgform_kurzbz,
- $studiengang_kz,
+ $studiengang_typ_kurzbz,
$semester,
$gruppe_kurzbz
) {
@@ -546,17 +529,17 @@ class Students extends FHCAPI_Controller
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'orgform_kurzbz' => $orgform_kurzbz,
- 'studiengang_kz' => $studiengang_kz,
+ 'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz,
'semester' => $semester,
'gruppe_kurzbz' => $gruppe_kurzbz
));
- $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, $orgform_kurzbz);
+ $this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, null, null, $gruppe_kurzbz, $orgform_kurzbz);
}
/**
- * @param integer $studiengang_kz
* @param string $studiensemester_kurzbz
+ * @param string $studiengang_typ_kurzbz
* @param integer $semester (optional)
* @param string $verband (optional)
* @param integer $gruppe (optional)
@@ -567,14 +550,20 @@ class Students extends FHCAPI_Controller
*/
protected function fetchStudents(
$studiensemester_kurzbz,
- $studiengang_kz,
+ $studiengang_typ_kurzbz,
$semester = null,
$verband = null,
$gruppe = null,
$gruppe_kurzbz = null,
$orgform_kurzbz = null
) {
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
+ $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
+ $studiengang_kz = $this->getStudiengangKz($studiengang_typ_kurzbz);
+ $orgform_kurzbz = $this->getOrgformKurzbz($orgform_kurzbz);
+
+ if ($studiengang_kz === null)
+ show_404();
+
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
@@ -582,34 +571,30 @@ 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");
+ $this->studentlistlib->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
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,15 +608,28 @@ class Students extends FHCAPI_Controller
}
}
+
$this->addFilter($studiensemester_kurzbz);
- $result = $this->PrestudentModel->loadWhere($where);
+ $result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
+ protected function decodeTagsJsonInResult(&$data)
+ {
+ if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) {
+ array_walk($data, function($item, $key) {
+ if(isset($item->tags))
+ {
+ $item->tags = json_decode($item->tags);
+ }
+ });
+ }
+ }
+
/**
* @param string $prestudent_id
*
@@ -645,6 +643,8 @@ class Students extends FHCAPI_Controller
'prestudent_id' => $prestudent_id,
));
+ $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
+
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
@@ -652,11 +652,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,19 +661,18 @@ 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);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -693,6 +689,8 @@ class Students extends FHCAPI_Controller
'student_uid' => $student_uid,
));
+ $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
+
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
@@ -700,26 +698,16 @@ 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);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -737,6 +725,8 @@ class Students extends FHCAPI_Controller
'person_id' => $person_id,
));
+ $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
+
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
@@ -744,24 +734,16 @@ 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->studentlistlib->addWhere('p.person_id', $person_id);
- $this->PrestudentModel->addSelect('v.semester');
- $this->PrestudentModel->addSelect('v.verband');
- $this->PrestudentModel->addSelect('v.gruppe');
-
- $this->addSelectPrioRel();
$this->addFilter($studiensemester_kurzbz);
- $result = $this->PrestudentModel->loadWhere([
- 'p.person_id' => $person_id
- ]);
+ $result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -777,6 +759,8 @@ class Students extends FHCAPI_Controller
'studiensemester_kurzbz' => $studiensemester_kurzbz
));
+ $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
+
$this->load->library('SearchLib', [ 'config' => 'searchstv' ]);
$this->load->library('form_validation');
@@ -790,29 +774,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 +785,39 @@ 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);
+
+ $this->studentlistlib->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
+
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->decodeTagsJsonInResult($data);
$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
*
@@ -1038,4 +843,55 @@ class Students extends FHCAPI_Controller
}
}
}
+
+ protected function getStudiengangKz($studiengang_typ_kurzbz)
+ {
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $result = $this->StudiengangModel->loadWhere([
+ 'LOWER(CONCAT(typ, kurzbz)) =' => strtolower($studiengang_typ_kurzbz)
+ ]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if (!$data)
+ return null;
+
+ return current($data)->studiengang_kz;
+ }
+
+ protected function getStudiensemesterKurzbz($studiensemester_kurzbz)
+ {
+ if ($studiensemester_kurzbz === null)
+ return null;
+
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ $result = $this->StudiensemesterModel->loadWhere([
+ 'LOWER(studiensemester_kurzbz) =' => strtolower($studiensemester_kurzbz)
+ ]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if (!$data)
+ return $studiensemester_kurzbz;
+
+ return current($data)->studiensemester_kurzbz;
+ }
+
+ protected function getOrgformKurzbz($orgform_kurzbz)
+ {
+ if ($orgform_kurzbz === null)
+ return null;
+
+ $this->load->model('codex/Orgform_model', 'OrgformModel');
+ $result = $this->OrgformModel->loadWhere([
+ 'LOWER(orgform_kurzbz) =' => strtolower($orgform_kurzbz)
+ ]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if (!$data)
+ return $orgform_kurzbz;
+
+ return current($data)->orgform_kurzbz;
+ }
}
diff --git a/application/controllers/api/frontend/v1/stv/Tags.php b/application/controllers/api/frontend/v1/stv/Tags.php
index 3004a1f3b..bd5c61953 100644
--- a/application/controllers/api/frontend/v1/stv/Tags.php
+++ b/application/controllers/api/frontend/v1/stv/Tags.php
@@ -15,7 +15,9 @@ class Tags extends Tag_Controller
'addTag' => self::BERECHTIGUNG_KURZBZ,
'updateTag' => self::BERECHTIGUNG_KURZBZ,
'doneTag' => self::BERECHTIGUNG_KURZBZ,
- 'deleteTag' => self::BERECHTIGUNG_KURZBZ
+ 'deleteTag' => self::BERECHTIGUNG_KURZBZ,
+ 'getAllTags' => self::BERECHTIGUNG_KURZBZ,
+ 'rebuildTagsForTypeId' => self::BERECHTIGUNG_KURZBZ,
]);
$this->config->load('stv');
@@ -45,4 +47,5 @@ class Tags extends Tag_Controller
{
parent::doneTag($this->config->item('stv_prestudent_tags'));
}
+
}
diff --git a/application/controllers/api/frontend/v1/stv/Verband.php b/application/controllers/api/frontend/v1/stv/Verband.php
deleted file mode 100644
index 32ef30a45..000000000
--- a/application/controllers/api/frontend/v1/stv/Verband.php
+++ /dev/null
@@ -1,513 +0,0 @@
-.
- */
-
-if (! defined('BASEPATH')) exit('No direct script access allowed');
-
-/**
- * This controller operates between (interface) the JS (GUI) and the back-end
- * Provides data to the ajax get calls about verbände
- * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
- */
-class Verband extends FHCAPI_Controller
-{
- public function __construct()
- {
- $permissions = [];
- $router = load_class('Router');
- $permissions[$router->method] = ['admin:r', 'assistenz:r'];
- parent::__construct($permissions);
-
- // Load Models
- $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
- }
-
- /**
- * Remap calls:
- * /
- * /(studiengang_kz) => getStudiengang
- * /(studiengang_kz)/(semester) => getSemester
- * /(studiengang_kz)/(semester)/(verband) => getVerband
- * /(studiengang_kz)/(org_form) => getStudiengang
- * /(studiengang_kz)/(org_form)/(semester) => getSemester
- * /(studiengang_kz)/(org_form)/(semester)/(verband) => getVerband
- *
- * @param string $method
- * @param array $params (optional)
- *
- * @return void
- */
- public function _remap($method, $params = [])
- {
- if ($method == '' || $method == 'index')
- return $this->getBase();
-
- // NOTE(chris): Test if access is allowed ($method is the Studiengang)
- if (!$this->permissionlib->isBerechtigt('assistenz', 's', $method)
- && !$this->permissionlib->isBerechtigt('admin', 's', $method)
- ) {
- return $this->_outputAuthError([$method => ['admin:r', 'assistenz:r']]);
- }
-
- $count = count($params);
- if (!$count)
- return $this->getStudiengang($method);
-
- if ($count == 1) {
- if (is_numeric($params[0]))
- return $this->getSemester($method, $params[0]);
- elseif ($params[0] == 'prestudent')
- return $this->terminateWithSuccess($this->getStdSem($method . '/prestudent/', $method));
- else
- return $this->getStudiengang($method, $params[0]);
- }
- if ($count == 2) {
- if (is_numeric($params[0]))
- return $this->getVerband($method, $params[0], $params[1]);
- elseif ($params[1] == 'prestudent')
- return $this->terminateWithSuccess($this->getStdSem($method . '/' . $params[0] . '/prestudent/', $method));
- else
- return $this->getSemester($method, $params[1], $params[0]);
- }
- if ($count == 3 && !is_numeric($params[0]) && is_numeric($params[1]) && !is_numeric($params[2]))
- return $this->getVerband($method, $params[1], $params[2], $params[0]);
-
- show_404();
- }
-
- /**
- * @return void
- */
- protected function getBase()
- {
- $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
-
- $this->StudiengangModel->addDistinct();
- $this->StudiengangModel->addSelect("v.studiengang_kz AS link");
- $this->StudiengangModel->addSelect(
- "CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name",
- false
- );
- $this->StudiengangModel->addSelect('erhalter_kz');
- $this->StudiengangModel->addSelect('typ');
- $this->StudiengangModel->addSelect('kurzbz');
- $this->StudiengangModel->addSelect('studiengang_kz');
- $this->StudiengangModel->addSelect('studiengang_kz AS stg_kz');
-
- $this->StudiengangModel->addOrder('erhalter_kz');
- $this->StudiengangModel->addOrder('typ');
- $this->StudiengangModel->addOrder('kurzbz');
-
- $stgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: [];
- $stgs = array_merge($stgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
-
- if (!$stgs)
- $this->terminateWithSuccess([]);
-
- $this->StudiengangModel->db->where_in('studiengang_kz', $stgs);
-
- $result = $this->StudiengangModel->loadWhere(['v.aktiv' => true]);
-
- $list = $this->getDataOrTerminateWithError($result);
-
- if ($this->permissionlib->isBerechtigt('inout/uebersicht'))
- $list[] = [
- 'name' => 'International',
- 'link' => 'inout',
- 'children' => [
- [
- 'name' => 'Incoming',
- 'link' => 'inout/incoming',
- 'leaf' => true
- ],
- [
- 'name' => 'Outgoing',
- 'link' => 'inout/outgoing',
- 'leaf' => true
- ],
- [
- 'name' => 'Gemeinsame Studien',
- 'link' => 'inout/gemeinsamestudien',
- 'leaf' => true
- ]
- ]
- ];
- $this->terminateWithSuccess($list);
- }
-
- /**
- * @param integer $studiengang_kz
- * @param string $orgform (optional)
- *
- * @return void
- */
- protected function getStudiengang($studiengang_kz, $org_form = null)
- {
- $link = $studiengang_kz . '/';
- if ($org_form !== null)
- $link .= $org_form . '/';
-
- $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
-
- $this->StudiengangModel->addDistinct();
- $this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", semester) AS link", false);
- $this->StudiengangModel->addSelect("CONCAT(
- UPPER(CONCAT(typ, kurzbz)),
- '-',
- semester,
- (
- SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END
- FROM public.tbl_lehrverband
- WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester
- ORDER BY verband, gruppe LIMIT 1
- )
- ) AS name", false);
-
- $this->StudiengangModel->addSelect('semester');
- $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
-
- $this->StudiengangModel->addOrder('semester');
-
- if ($org_form !== null) {
- $this->StudiengangModel->addSelect("v.orgform_kurzbz");
- $this->StudiengangModel->db->group_start();
- $this->StudiengangModel->db->where('v.semester', 0);
- $this->StudiengangModel->db->or_where('v.orgform_kurzbz', $org_form);
- $this->StudiengangModel->db->group_end();
- }
-
- $result = $this->StudiengangModel->loadWhere([
- 'v.studiengang_kz' => $studiengang_kz,
- 'v.aktiv' => true
- ]);
- $list = $this->getDataOrTerminateWithError($result);
-
- array_unshift($list, [
- 'name' => 'PreStudent',
- 'link' => $link . 'prestudent',
- 'no_sem_reload' => true,
- 'stg_kz' => (int)$studiengang_kz,
- 'children' => $this->getStdSem($link . 'prestudent/', $studiengang_kz)
- ]);
-
- if ($org_form === null) {
- // NOTE(chris): if mischform show orgforms
- $result = $this->StudiengangModel->load($studiengang_kz);
- $result = $this->getDataOrTerminateWithError($result);
- if ($result) {
- if (current($result)->mischform) {
- $this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
-
- $this->StudienordnungModel->addDistinct();
- $this->StudienordnungModel->addSelect("CONCAT(studiengang_kz, '/', p.orgform_kurzbz) AS link");
- $this->StudienordnungModel->addSelect("p.orgform_kurzbz AS name");
- $this->StudienordnungModel->addSelect("studiengang_kz AS stg_kz");
-
- $this->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id');
-
- $result = $this->StudienordnungModel->loadWhere([
- 'aktiv' => true,
- 'studiengang_kz' => $studiengang_kz,
- 'p.orgform_kurzbz !=' => 'DDP'
- ]);
- $result = $this->getDataOrTerminateWithError($result);
-
- $list = array_merge($list, $result);
- }
- }
- }
- $this->terminateWithSuccess($list);
- }
-
- /**
- * @param integer $studiengang_kz
- * @param integer $semester
- * @param string $orgform
- *
- * @return void
- */
- protected function getSemester($studiengang_kz, $semester, $org_form = null)
- {
- $link = $studiengang_kz . '/';
- if ($org_form !== null)
- $link .= $org_form . '/';
- $link .= $semester . '/';
-
-
- $this->load->model('organisation/Gruppe_model', 'GruppeModel');
-
- $this->GruppeModel->addDistinct();
- $this->GruppeModel->addSelect("CONCAT(" . $this->GruppeModel->escape($link . 'grp/') . ", gruppe_kurzbz) AS link", false);
- $this->GruppeModel->addSelect("CONCAT(gruppe_kurzbz, ' (', bezeichnung, ')') AS name", false);
- $this->GruppeModel->addSelect("TRUE AS leaf", false);
-
- $this->GruppeModel->addSelect('sort');
- $this->GruppeModel->addSelect('gruppe_kurzbz');
- $this->GruppeModel->addSelect($this->GruppeModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
-
- $this->GruppeModel->addOrder('sort');
- $this->GruppeModel->addOrder('gruppe_kurzbz');
-
- $where = [
- 'studiengang_kz' => $studiengang_kz,
- 'semester' => $semester,
- 'lehre' => true,
- 'sichtbar' => true,
- 'aktiv' => true,
- 'direktinskription' => false
- ];
-
- if ($org_form !== null)
- $where['orgform_kurzbz'] = $org_form;
-
- $result = $this->GruppeModel->loadWhere($where);
-
- $list = $this->getDataOrTerminateWithError($result);
-
- $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
-
- $this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", verband) AS link", false);
- $this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband ORDER BY gruppe LIMIT 1)) AS name", false);
- $this->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf");
-
- $this->StudiengangModel->addSelect($this->StudiengangModel->escape($semester) . ' AS semester');
- $this->StudiengangModel->addSelect('verband');
- $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
-
- $this->StudiengangModel->addOrder('verband');
-
- $this->StudiengangModel->addGroupBy('link, name, verband');
-
- $where = [
- 'v.studiengang_kz' => $studiengang_kz,
- 'v.semester' => $semester,
- 'v.verband !=' => '',
- 'v.aktiv' => true
- ];
-
- if ($org_form !== null && $semester) // NOTE(chris): on semester 0 show all?
- $where['v.orgform_kurzbz'] = $org_form;
-
- $result = $this->StudiengangModel->loadWhere($where);
- $result = $this->getDataOrTerminateWithError($result);
-
- $list = array_merge($list, $result);
-
- $this->terminateWithSuccess($list);
- }
-
- /**
- * @param integer $studiengang_kz
- * @param integer $semester
- * @param integer $verband
- * @param string $orgform
- *
- * @return void
- */
- protected function getVerband($studiengang_kz, $semester, $verband, $org_form = null)
- {
- $link = $studiengang_kz . '/';
- if ($org_form !== null)
- $link .= $org_form . '/';
- $link .= $semester . '/'. $verband . '/';
-
-
- $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
-
- $this->StudiengangModel->addDistinct();
- $this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", gruppe) AS link", false);
- $this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, gruppe, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband AND gruppe=v.gruppe ORDER BY gruppe LIMIT 1)) AS name", false);
- $this->StudiengangModel->addSelect("TRUE AS leaf", false);
-
- $this->StudiengangModel->addSelect('v.semester');
- $this->StudiengangModel->addSelect('v.verband');
- $this->StudiengangModel->addSelect('gruppe');
- $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
-
- $this->StudiengangModel->addOrder('gruppe');
-
- $where = [
- 'v.studiengang_kz' => $studiengang_kz,
- 'v.semester' => $semester,
- 'v.verband' => $verband,
- 'v.gruppe !=' => '',
- 'v.aktiv' => true
- ];
-
- if ($org_form !== null && $semester) // NOTE(chris): on semester 0 show all?
- $where['v.orgform_kurzbz'] = $org_form;
-
- $result = $this->StudiengangModel->loadWhere($where);
-
- $list = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess($list);
- }
-
- /**
- * @param string $link
- * @param integer $studiengang_kz
- *
- * @return array
- */
- protected function getStdSem($link, $studiengang_kz)
- {
- $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
-
- $this->load->model('system/Variable_model', 'VariableModel');
- $result = $this->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']);
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->load->config('stv');
- $number_displayed_past_studiensemester_default = $this->config->item('number_displayed_past_studiensemester_default');
-
- $number_displayed_past_studiensemester = $data['number_displayed_past_studiensemester'] ?? $number_displayed_past_studiensemester_default;
-
- $this->StudiensemesterModel->addPlusMinus(null, $number_displayed_past_studiensemester);
- $this->StudiensemesterModel->addOrder('ende');
- $result = $this->StudiensemesterModel->load();
-
- $studiensemester = $this->getDataOrTerminateWithError($result);
- $result = [];
-
- $studiengang_kz = (int)$studiengang_kz;
-
- foreach ($studiensemester as $sem) {
- $semlink = $link . $sem->studiensemester_kurzbz;
- $intlink = $semlink . '/interessenten';
- $result[] = [
- 'name' => $sem->studiensemester_kurzbz,
- 'link' => $semlink,
- 'stg_kz' => $studiengang_kz,
- 'children' => [
- [
- 'name' => 'Interessenten',
- 'link' => $intlink,
- 'stg_kz' => $studiengang_kz,
- 'children' => [
- [
- 'name' => 'Bewerbung nicht abgeschickt',
- 'link' => $intlink . '/bewerbungnichtabgeschickt',
- 'stg_kz' => $studiengang_kz,
- 'leaf' => true
- ],
- [
- 'name' => 'Bewerbung abgeschickt, Status unbestätigt',
- 'link' => $intlink . '/bewerbungabgeschickt',
- 'stg_kz' => $studiengang_kz,
- 'leaf' => true
- ],
- [
- 'name' => 'ZGV erfüllt',
- 'link' => $intlink . '/zgv',
- 'stg_kz' => $studiengang_kz,
- 'leaf' => true
- ],
- [
- 'name' => 'Status bestätigt',
- 'link' => $intlink . '/statusbestaetigt',
- 'stg_kz' => $studiengang_kz,
- 'children' => [
- [
- 'name' => 'Nicht zum Reihungstest angemeldet',
- 'link' => $intlink . '/statusbestaetigtrtnichtangemeldet',
- 'leaf' => true
- ],
- [
- 'name' => 'Reihungstest angemeldet',
- 'link' => $intlink . '/statusbestaetigtrtangemeldet',
- 'leaf' => true
- ]
- ]
- ],
- [
- 'name' => 'Nicht zum Reihungstest angemeldet',
- 'link' => $intlink . '/reihungstestnichtangemeldet',
- 'stg_kz' => $studiengang_kz,
- 'leaf' => true
- ],
- [
- 'name' => 'Reihungstest angemeldet',
- 'link' => $intlink . '/reihungstestangemeldet',
- 'stg_kz' => $studiengang_kz,
- 'leaf' => true
- ]
- ]
- ],
- [
- 'name' => 'Bewerber',
- 'link' => $semlink . '/bewerber',
- 'stg_kz' => $studiengang_kz,
- 'children' => [
- [
- 'name' => 'Nicht zum Reihungstest angemeldet',
- 'link' => $intlink . '/bewerberrtnichtangemeldet',
- 'stg_kz' => $studiengang_kz,
- 'leaf' => true
- ],
- [
- 'name' => 'Reihungstest angemeldet',
- 'link' => $intlink . '/bewerberrtangemeldet',
- 'stg_kz' => $studiengang_kz,
- 'children' => [
- [
- 'name' => 'Teilgenommen',
- 'link' => $intlink . '/bewerberrtangemeldetteilgenommen',
- 'stg_kz' => $studiengang_kz,
- 'leaf' => true
- ],
- [
- 'name' => 'Nicht teilgenommen',
- 'link' => $intlink . '/bewerberrtangemeldetnichtteilgenommen',
- 'stg_kz' => $studiengang_kz,
- 'leaf' => true
- ]
- ]
- ]
- ]
- ],
- [
- 'name' => 'Aufgenommen',
- 'link' => $semlink . '/aufgenommen',
- 'stg_kz' => $studiengang_kz,
- 'leaf' => true
- ],
- [
- 'name' => 'Warteliste',
- 'link' => $semlink . '/warteliste',
- 'stg_kz' => $studiengang_kz,
- 'leaf' => true
- ],
- [
- 'name' => 'Absage',
- 'link' => $semlink . '/absage',
- 'stg_kz' => $studiengang_kz,
- 'leaf' => true
- ],
- [
- 'name' => 'Incoming',
- 'link' => $semlink . '/incoming',
- 'stg_kz' => $studiengang_kz,
- 'leaf' => true
- ]
- ]
- ];
- }
-
- return $result;
- }
-}
diff --git a/application/controllers/api/v1/system/Tag.php b/application/controllers/api/v1/system/Tag.php
index 7ce375217..df3003b44 100644
--- a/application/controllers/api/v1/system/Tag.php
+++ b/application/controllers/api/v1/system/Tag.php
@@ -37,6 +37,7 @@ class Tag extends API_Controller
if (isset($tag))
{
+ $this->TagModel->addJoin('public.tbl_notiz_typ', 'typ_kurzbz', 'typ_kurzbz');
$result = $this->TagModel->load($tag);
$this->response($result, REST_Controller::HTTP_OK);
diff --git a/application/controllers/components/Cis/Mylv.php b/application/controllers/components/Cis/Mylv.php
index 1fdb7e2a1..30544b647 100644
--- a/application/controllers/components/Cis/Mylv.php
+++ b/application/controllers/components/Cis/Mylv.php
@@ -14,11 +14,11 @@ class Mylv extends Auth_Controller
public function __construct()
{
parent::__construct([
- 'Student' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
- 'Studiensemester' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
- 'Lvs' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
- 'Info' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
- 'Pruefungen' => ['student/anrechnung_beantragen:r','user:r'] // TODO(chris): permissions?
+ 'Student' => self::PERM_LOGGED,
+ 'Studiensemester' => self::PERM_LOGGED,
+ 'Lvs' => self::PERM_LOGGED,
+ 'Info' => self::PERM_LOGGED,
+ 'Pruefungen' => self::PERM_LOGGED
]);
}
diff --git a/application/controllers/components/stv/Studiensemester.php b/application/controllers/components/stv/Studiensemester.php
deleted file mode 100644
index c3db99686..000000000
--- a/application/controllers/components/stv/Studiensemester.php
+++ /dev/null
@@ -1,78 +0,0 @@
- self::PERM_LOGGED,
- 'now' => self::PERM_LOGGED,
- 'set' => self::PERM_LOGGED
- ]);
- }
-
- public function index()
- {
- $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
-
- $this->StudiensemesterModel->addOrder('start');
-
- $result = $this->StudiensemesterModel->load();
-
- if (isError($result)) {
- $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
- }
- $this->outputJson($result);
- }
-
- public function now()
- {
- $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
-
- $result = $this->StudiensemesterModel->getNearest();
-
- if (isError($result)) {
- $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
- $this->outputJson(getError($result));
- }
- $result = getData($result) ?: [];
-
- if (count($result) != 1) {
- $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
- $this->outputJsonError(count($result) ? 'Mehrere Studiensemester aktiv' : 'Kein Studiensemester aktiv');
- } else {
- $this->outputJsonSuccess(current($result)->studiensemester_kurzbz);
- }
- }
-
- public function set()
- {
- $this->load->library('AuthLib');
- $this->load->library('form_validation');
-
- $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
-
- $this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required');
-
- if ($this->form_validation->run() == false) {
- $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST);
- return $this->outputJsonError($this->form_validation->error_array());
- }
-
- $stdsem = $this->input->post('studiensemester');
-
- $this->load->model('system/Variable_model', 'VariableModel');
-
- $result = $this->VariableModel->setVariable(getAuthUID(), 'semester_aktuell', $stdsem);
-
- if (isError($result)) {
- $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
- return $this->outputJson($result);
- }
-
- $this->outputJsonSuccess(true);
- }
-}
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..8bcb898a9 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))
@@ -105,7 +125,7 @@ class AntragJob extends JOB_Controller
$stgLeitungen[$leitung->uid]['stgs'][] = $antrag->studiengang_kz;
}
- $result = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
+ $result = $this->StudierendenantragModel->getStgAndDetails($antrag->studierendenantrag_id);
if (isError($result))
{
$this->logError(getError($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/jobs/TagJob.php b/application/controllers/jobs/TagJob.php
new file mode 100644
index 000000000..ae21883e9
--- /dev/null
+++ b/application/controllers/jobs/TagJob.php
@@ -0,0 +1,110 @@
+load->config('stv');
+
+ // Library
+ $this->load->library('TagLib');
+
+ // Load Models
+ $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ $this->load->model('system/Notiztyp_model', 'NotiztypModel');
+
+ $this->loadPhrases([
+ 'lehre'
+ ]);
+ }
+
+ public function rebuildAutomatedTags()
+ {
+ $automatedTagsRes = $this->NotiztypModel->loadWhere(array('automatisiert' => true, 'taglib IS NOT NULL' => null));
+ $automatedTags = hasData($automatedTagsRes) ? getData($automatedTagsRes) : [];
+
+
+ $result = $this->StudiensemesterModel->getAktOrNextSemester();
+ if (isError($result))
+ {
+ $this->logInfo('Start Job rebuild Automated Tags');
+ $this->logError('Error occurred during retrieving studiensemester');
+ return $this->logInfo('End Job rebuild Automated Tags');
+ }
+
+ if (empty($result->retval) || !isset($result->retval[0])) {
+ $this->logInfo('Start Job rebuild Automated Tags');
+ $this->logError('No Studiensemester found');
+ return $this->logInfo('End Job rebuild Automated Tags');
+ }
+ $studiensemester_kurzbz = $result->retval[0]->studiensemester_kurzbz ?? null;
+ $params = array(
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz
+ );
+
+ $this->logInfo('Start Job rebuild Automated Tags ' . $studiensemester_kurzbz);
+ foreach($automatedTags as $autoTag)
+ {
+ // getPath: must not be lost
+ $filePath = APPPATH . 'libraries/' . $autoTag->taglib . '.php'; // APPPATH = application/
+
+ if(file_exists($filePath)) {
+ require_once($filePath);
+ } else {
+ $this->logInfo("File not found: " . $filePath);
+ continue;
+ }
+
+ $kurz_bz = $autoTag->typ_kurzbz;
+ // className without PATH (basename)
+ $className = basename($autoTag->taglib);
+
+ $obj = new $className();
+
+ $outputArray = $obj->getZuordnungIds($params);
+ $typeId = $outputArray->typeId;
+
+ $paramsTag = array(
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'kurzbz' => $kurz_bz,
+ 'data' => $outputArray->data,
+ 'typeId' => $typeId
+ );
+
+ $result = $this->taglib->updateAutomatedTags($paramsTag);
+
+ if (isError($result)) {
+ $this->logError('Error occurred during updateAutomatedTags ' . $kurz_bz);
+ continue;
+ }
+
+ $data = is_array($result) ? $result['retval'] : $result->retval;
+
+ //SUMMARY
+ $this->logInfo("Tag " . $result->retval['input']['tag'] . " | type_id " . $typeId . " --"
+ . " Count Recycled: " . $result->retval['summary']['recycled']
+ . " Count Added: ". $result->retval['summary']['added']
+ . " Count Deleted: ". $result->retval['summary']['deleted']);
+
+ //DETAILS
+ if($result->retval['results']['newTags'])
+ $this->logInfo("Tag " . $result->retval['input']['tag'] . "New tag(s): " . implode(', ', $result->retval['results']['newTags']));
+ if($result->retval['results']['deletedTagsIds'])
+ $this->logInfo("Tag " . $result->retval['input']['tag'] . "Deleted tags(s: " . implode(', ', $result->retval['results']['deletedTagsIds']));
+ if ($result->retval['results']['retaggedIds'])
+ $this->logInfo("Tag " . $result->retval['input']['tag'] . "Recycled tag(s): " . implode(', ', $result->retval['results']['retaggedIds']));
+ }
+ $this->logInfo( "End Job rebuild Automated Tags");
+ }
+}
diff --git a/application/controllers/js/Tabulatorcolumns.php b/application/controllers/js/Tabulatorcolumns.php
new file mode 100644
index 000000000..1a4621219
--- /dev/null
+++ b/application/controllers/js/Tabulatorcolumns.php
@@ -0,0 +1,60 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * This controller generates javascript from snippets for tabulator columns
+ */
+class Tabulatorcolumns extends Auth_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'stv' => ['admin:r', 'assistenz:r'],
+ 'lvverwaltung' => ['admin:r', 'assistenz:r']
+ ]);
+ }
+
+ /**
+ * Render tabulator columns for config
+ *
+ * @param string $config
+ *
+ * @return void
+ */
+ public function _remap($config)
+ {
+ $this->load->config($config);
+ $list_columns = $this->config->item('list_columns') ?: [];
+
+ $snippets = [
+ 'jssnippets/tabulatorcolumns/' . $config . '.js'
+ ];
+
+ foreach ($list_columns as $col) {
+ $snippets[] = $col['js'];
+ }
+
+ $this->output->set_content_type('application/javascript');
+
+ $this->load->view('jssnippets/tabulatorcolumns.js', [
+ 'snippets' => $snippets
+ ]);
+ }
+}
diff --git a/application/controllers/lehre/Studierendenantrag.php b/application/controllers/lehre/Studierendenantrag.php
index 107c9af96..ad333679d 100644
--- a/application/controllers/lehre/Studierendenantrag.php
+++ b/application/controllers/lehre/Studierendenantrag.php
@@ -25,10 +25,13 @@ class Studierendenantrag extends FHC_Controller
// Load language phrases
$this->loadPhrases([
- 'studierendenantrag'
+ 'studierendenantrag',
+ 'ui'
]);
- 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 +57,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 +100,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/controllers/person/Gradelist.php b/application/controllers/person/Gradelist.php
index 230c7f67f..d6df2c43a 100644
--- a/application/controllers/person/Gradelist.php
+++ b/application/controllers/person/Gradelist.php
@@ -198,7 +198,19 @@ class Gradelist extends Auth_Controller
if (!isset($row_noten->found))
{
$result_lv = $this->LehrveranstaltungModel->load($row_noten->lehrveranstaltung_id);
- $result_stg = $this->StudiengangModel->load($result_lv->retval[0]->studiengang_kz);
+
+ $studiengang_kz = null;
+
+ if (!empty($result_lv->retval) && isset($result_lv->retval[0]) && isset($result_lv->retval[0]->studiengang_kz))
+ {
+ $result_stg = $this->StudiengangModel->load($result_lv->retval[0]->studiengang_kz);
+
+ if (!empty($result_stg->retval) && isset($result_stg->retval[0]) && is_object($result_stg->retval[0]) && isset($result_stg->retval[0]->kurzbzlang))
+ {
+ $studiengang_kz = $result_stg->retval[0]->kurzbzlang;
+ }
+ }
+
$courses['semester'][$row_noten->studiensemester_kurzbz]['lvs_nonstpl'][] = array(
'lehrveranstaltung_id' => $row_noten->lehrveranstaltung_id,
'lehrtyp_kurzbz' => $result_lv->retval[0]->lehrtyp_kurzbz,
@@ -212,8 +224,8 @@ class Gradelist extends Auth_Controller
'semester' => $result_lv->retval[0]->semester,
'note' => $row_noten->note,
'datum' => $row_noten->benotungsdatum,
- 'zugeordnet' => true,
- 'studiengang_kurzbz' => $result_stg->retval[0]->kurzbzlang
+ 'studiengang_kurzbz' => $studiengang_kz,
+ 'zugeordnet' => true
);
if(!isset($courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl']))
$courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl'] = 0;
diff --git a/application/core/Notiz_Controller.php b/application/core/Notiz_Controller.php
index 923970923..7269c3b09 100644
--- a/application/core/Notiz_Controller.php
+++ b/application/core/Notiz_Controller.php
@@ -417,6 +417,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$notiz_id = $this->input->post('notiz_id');
$this->NotizModel->addSelect('campus.tbl_dms_version.*');
+ $this->NotizModel->addSelect($this->NotizModel->escape(base_url('content/notizdokdownload.php?id=')) . ' || public.tbl_notiz_dokument.dms_id AS preview');
$this->NotizModel->addJoin('public.tbl_notiz_dokument', 'ON (public.tbl_notiz_dokument.notiz_id = public.tbl_notiz.notiz_id)');
$this->NotizModel->addJoin('campus.tbl_dms_version', 'ON (public.tbl_notiz_dokument.dms_id = campus.tbl_dms_version.dms_id)');
diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php
index 5b9bac6c5..c4b6edb81 100644
--- a/application/core/Tag_Controller.php
+++ b/application/core/Tag_Controller.php
@@ -7,7 +7,7 @@ class Tag_Controller extends FHCAPI_Controller
{
private $_uid;
- const BERECHTIGUNG_KURZBZ = 'admin:rw';
+ const BERECHTIGUNG_KURZBZ = ['admin:rw'];
public function __construct($permissions)
{
@@ -15,10 +15,11 @@ class Tag_Controller extends FHCAPI_Controller
'getTag' => self::BERECHTIGUNG_KURZBZ,
'getTags' => self::BERECHTIGUNG_KURZBZ,
'addTag' => self::BERECHTIGUNG_KURZBZ,
-
'updateTag' => self::BERECHTIGUNG_KURZBZ,
'doneTag' => self::BERECHTIGUNG_KURZBZ,
'deleteTag' => self::BERECHTIGUNG_KURZBZ,
+ 'getAllTags' => self::BERECHTIGUNG_KURZBZ,
+ 'rebuildTagsForTypeId' => self::BERECHTIGUNG_KURZBZ,
];
$merged_permissions = array_merge($default_permissions, $permissions);
@@ -26,6 +27,10 @@ class Tag_Controller extends FHCAPI_Controller
parent::__construct($merged_permissions);
$this->_setAuthUID();
+
+ // Library
+ $this->load->library('TagLib');
+
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
@@ -38,6 +43,8 @@ class Tag_Controller extends FHCAPI_Controller
public function getTag($readonly_tags = null)
{
$language = $this->_getLanguageIndex();
+ $index_bezeichnung_mehrsprachig = $language - 1;
+
$id = $this->input->get('id');
if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
@@ -62,14 +69,18 @@ class Tag_Controller extends FHCAPI_Controller
$this->NotizModel->addSelect(
"tbl_notiz.titel,
tbl_notiz.text,
- array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $language. " as bezeichnung,
+ array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
tbl_notiz.notiz_id,
tbl_notiz_typ.style,
+ tbl_notiz_typ.automatisiert,
+ tbl_notiz_typ.prioritaet,
tbl_notiz.erledigt as done,
tbl_notiz.insertamum,
tbl_notiz.updateamum,
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
- (bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter
+ (bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter,
+ tbl_notiz.start,
+ tbl_notiz.ende
"
);
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
@@ -82,18 +93,24 @@ class Tag_Controller extends FHCAPI_Controller
$notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id));
+
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array());
}
public function getTags($tags = null)
{
+ $language = $this->_getLanguageIndex();
+ $index_bezeichnung_mehrsprachig = $language - 1;
+
$this->NotiztypModel->addSelect(
- 'typ_kurzbz as tag_typ_kurzbz,
- array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
+ "typ_kurzbz as tag_typ_kurzbz,
+ array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
style,
beschreibung,
- tag
- '
+ tag,
+ automatisiert,
+ prioritaet
+ "
);
$this->NotiztypModel->addOrder('prioritaet');
@@ -271,6 +288,90 @@ class Tag_Controller extends FHCAPI_Controller
$this->terminateWithSuccess($deleteNotiz);
}
+ public function getAllTags($readonly_tags = false)
+ {
+ $language = $this->_getLanguageIndex();
+ $index_bezeichnung_mehrsprachig = $language - 1;
+ $prestudent_id = $this->input->get('prestudent_id');
+
+ if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
+ {
+ $readonly_tags = $this->_filterTag($readonly_tags, true);
+
+ foreach ($readonly_tags as $key => $tag)
+ {
+ $readonly_tags[$key] = $this->NotizModel->db->escape($tag);
+ }
+ $tags = '(' . implode(',', $readonly_tags) . ')';
+
+ $this->NotizModel->addSelect("
+ CASE
+ WHEN tbl_notiz_typ.typ_kurzbz IN $tags
+ THEN TRUE
+ ELSE FALSE
+ END as readonly
+ ");
+ }
+ $this->NotizModel->addSelect(
+ "tbl_notiz.titel,
+ tbl_notiz.text,
+ array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
+ tbl_notiz.notiz_id,
+ tbl_notiz_typ.style,
+ tbl_notiz_typ.automatisiert,
+ tbl_notiz_typ.prioritaet,
+ tbl_notiz.erledigt as done,
+ tbl_notiz.insertamum,
+ tbl_notiz.updateamum,
+ (verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
+ (bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter,
+ tbl_notiz.start,
+ tbl_notiz.ende
+ "
+ );
+ $this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
+
+ $this->NotizModel->addJoin('public.tbl_benutzer verfasserbenutzer', 'tbl_notiz.verfasser_uid = verfasserbenutzer.uid', 'LEFT');
+ $this->NotizModel->addJoin('public.tbl_person verfasserperson', 'verfasserbenutzer.person_id = verfasserperson.person_id', 'LEFT');
+
+ $this->NotizModel->addJoin('public.tbl_benutzer bearbeiterbenutzer', 'tbl_notiz.bearbeiter_uid = bearbeiterbenutzer.uid', 'LEFT');
+ $this->NotizModel->addJoin('public.tbl_person bearbeiterperson', 'bearbeiterbenutzer.person_id = bearbeiterperson.person_id', 'LEFT');
+
+ $this->NotizModel->addJoin('public.tbl_notizzuordnung notizzuordnung', 'tbl_notiz.notiz_id = notizzuordnung.notiz_id');
+
+ $this->NotizModel->addOrder('done');
+ $this->NotizModel->addOrder('tbl_notiz_typ.prioritaet');
+ $notiz = $this->NotizModel->loadWhere(array('prestudent_id' => $prestudent_id));
+
+
+ $this->terminateWithSuccess(hasData($notiz) ? getData($notiz) : array());
+ }
+
+ public function rebuildTagsForTypeId()
+ {
+ $ids = $this->input->post('ids');
+ $typeId = $this->input->post('typeId');
+ $semester = $this->input->post('sem');
+
+ $idsSuccess = [];
+ $idsError = [];
+ $outputResult = [];
+
+ foreach ($ids as $id)
+ {
+ $result = $this->taglib->rebuildTagsForTypeId($typeId, $id, $semester);
+
+ if (isError($result))
+ $idsError[] = $id;
+ else
+ $idsSuccess[] = $id;
+
+ $outputResult[] = $result;
+ }
+
+ $this->terminateWithSuccess([$outputResult, $idsSuccess, $idsError]);
+ }
+
private function _setAuthUID()
{
$this->_uid = getAuthUID();
@@ -311,4 +412,4 @@ class Tag_Controller extends FHCAPI_Controller
));
}
-}
\ No newline at end of file
+}
diff --git a/application/helpers/hlp_document_helper.php b/application/helpers/hlp_document_helper.php
new file mode 100644
index 000000000..5b457fe82
--- /dev/null
+++ b/application/helpers/hlp_document_helper.php
@@ -0,0 +1,188 @@
+load->library('PhrasesLib', array('stv'), 'p');
+
+ $permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}");
+
+ $title_ger = $ci->p->t("global", "deutsch");
+ $title_eng = $ci->p->t("global", "englisch");
+ $title_ff = $ci->p->t("stv", "document_certificate");
+ $title_lv = $ci->p->t("stv", "document_coursecertificate");
+
+ $link_ff = "documents/export/" .
+ "zertifikat.rdf.php/" .
+ "Zertifikat" .
+ "?stg_kz={studiengang_kz_lv}" .
+ "&uid={uid}" .
+ "&ss={studiensemester_kurzbz}" .
+ "&lvid={lehrveranstaltung_id}";
+ $link_lv_ger = "documents/export/" .
+ "lehrveranstaltungszeugnis.rdf.php/" .
+ "LVZeugnis" .
+ "?stg_kz={studiengang_kz}" .
+ "&uid={uid}" .
+ "&ss={studiensemester_kurzbz}" .
+ "&lvid={lehrveranstaltung_id}";
+ $link_lv_eng = "documents/export/" .
+ "lehrveranstaltungszeugnis.rdf.php/" .
+ "LVZeugnisEng" .
+ "?stg_kz={studiengang_kz}" .
+ "&uid={uid}" .
+ "&ss={studiensemester_kurzbz}" .
+ "&lvid={lehrveranstaltung_id}";
+
+ $archive_url = "api/frontend/v1/documents/archiveSigned";
+ $archive_response = $ci->p->t("stv", "document_signed_and_archived");
+ $archive_post_ff = [
+ "xml" => "zertifikat.rdf.php",
+ "xsl" => "Zertifikat",
+ "stg_kz" => "{studiengang_kz_lv}",
+ "uid" => "{uid}",
+ "ss" => "{studiensemester_kurzbz}",
+ "lvid" => "{lehrveranstaltung_id}"
+ ];
+ $archive_post_lv_ger = [
+ "xml" => "lehrveranstaltungszeugnis.rdf.php",
+ "xsl" => "LVZeugnis",
+ "stg_kz" => "{studiengang_kz}",
+ "uid" => "{uid}",
+ "ss" => "{studiensemester_kurzbz}",
+ "lvid" => "{lehrveranstaltung_id}"
+ ];
+ $archive_post_lv_eng = [
+ "xml" => "lehrveranstaltungszeugnis.rdf.php",
+ "xsl" => "LVZeugnisEng",
+ "stg_kz" => "{studiengang_kz}",
+ "uid" => "{uid}",
+ "ss" => "{studiensemester_kurzbz}",
+ "lvid" => "{lehrveranstaltung_id}"
+ ];
+
+ $list = [
+ [
+ 'title' => '',
+ 'children' => [
+ [
+ 'title' => $title_ff,
+ 'link' => site_url($link_ff)
+ ],
+ [
+ 'title' => $title_lv,
+ 'children' => [
+ [
+ 'title' => $title_ger,
+ 'link' => site_url($link_lv_ger),
+ 'children' => [
+ [
+ 'title' => 'PDF',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_ger)
+ ],
+ [
+ 'title' => 'DOC',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_ger . "&output=doc")
+ ],
+ [
+ 'title' => 'ODT',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_ger . "&output=odt")
+ ]
+ ]
+ ],
+ [
+ 'title' => $title_eng,
+ 'link' => site_url($link_lv_eng),
+ 'children' => [
+ [
+ 'title' => 'PDF',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_eng)
+ ],
+ [
+ 'title' => 'DOC',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_eng . "&output=doc")
+ ],
+ [
+ 'title' => 'ODT',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_eng . "&output=odt")
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ],
+ [
+ 'title' => '',
+ 'children' => [
+ [
+ 'title' => $title_ff,
+ 'action' => [
+ 'url' => site_url($archive_url),
+ 'post' => $archive_post_ff,
+ 'response' => $archive_response
+ ]
+ ],
+ [
+ 'title' => $title_lv,
+ 'children' => [
+ [
+ 'title' => $title_ger,
+ 'action' => [
+ 'url' => site_url($archive_url),
+ 'post' => $archive_post_lv_ger,
+ 'response' => $archive_response
+ ]
+ ],
+ [
+ 'title' => $title_eng,
+ 'action' => [
+ 'url' => site_url($archive_url),
+ 'post' => $archive_post_lv_eng,
+ 'response' => $archive_response
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ];
+
+ return $list;
+}
diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php
index 27dfba5a1..eb2cd9f85 100644
--- a/application/helpers/hlp_header_helper.php
+++ b/application/helpers/hlp_header_helper.php
@@ -111,7 +111,8 @@ function generateJSDataStorageObject($indexPage, $calledPath, $calledMethod)
'theme' => [
'name'=>$ci->config->item('theme_name'),
'modes'=>$ci->config->item('theme_modes'),
- ]
+ ],
+ 'domain' => DOMAIN
);
$toPrint = "\n";
@@ -270,6 +271,28 @@ function absoluteJsImportUrl($relurl)
return $url;
}
+/*
+ * Generate Css File Include if Extension contains file
+ *
+ * @param $relativeFilePath path relative to Extension public/css dir
+ */
+function generateCSSsIncludeIfExtensionCssExists($relativeFilePath)
+{
+ $fsiterator = new FilesystemIterator(FHCPATH . 'application/extensions');
+ foreach ($fsiterator as $fsitem)
+ {
+ if(preg_match('/^FHC-Core-/', $fsitem->getBasename()))
+ {
+ $extensionfile = 'public/extensions/' . $fsitem->getBasename()
+ . '/css/' . $relativeFilePath;
+ if(is_readable(FHCPATH . $extensionfile))
+ {
+ generateCSSsInclude($extensionfile);
+ }
+ }
+ }
+}
+
/*
* Manipulate CI views includes Array to load
* - public/js/FhcApps.js via customJSs and
diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php
index d90a98241..35edc826c 100644
--- a/application/libraries/AntragLib.php
+++ b/application/libraries/AntragLib.php
@@ -128,7 +128,7 @@ class AntragLib
return $this->_ci->StudierendenantragstatusModel->resumeAntraegeForAbmeldungStgl($antrag_id);
}
// NOTE(chris): get last status that is not pause
- $this->_ci->StudierendenantragstatusModel->addOrder('insertamum');
+ $this->_ci->StudierendenantragstatusModel->addOrder('insertamum', 'DESC');
$this->_ci->StudierendenantragstatusModel->addLimit(1);
$result = $this->_ci->StudierendenantragstatusModel->loadWhere([
'studierendenantrag_id' => $antrag_id,
@@ -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/LektorLib.php b/application/libraries/LektorLib.php
index bbe630eaf..8a60e0aaa 100644
--- a/application/libraries/LektorLib.php
+++ b/application/libraries/LektorLib.php
@@ -17,7 +17,12 @@ class LektorLib
$this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->_ci->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
+ $this->_ci->load->model('ressource/Zeitsperre_model', 'ZeitsperreModel');
+ $this->_ci->load->model('ressource/Reservierung_model', 'ReservierungModel');
+ $this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
+
$this->_ci->load->library('PhrasesLib', array('lehre'));
+ $this->_ci->load->library('VariableLib', ['uid' => getAuthUID()]);
}
public function addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid)
@@ -78,10 +83,13 @@ class LektorLib
public function updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $new_data)
{
+ $old_uid = $mitarbeiter_uid;
+ $new_uid = isset($new_data['mitarbeiter_uid']) ? $new_data['mitarbeiter_uid'] : $mitarbeiter_uid;
+
$this->_ci->LehreinheitmitarbeiterModel->addSelect('lehre.tbl_lehreinheitmitarbeiter.*, lehre.tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.studiengang_kz');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
- $lehreinheit_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
+ $lehreinheit_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $old_uid));
if (isError($lehreinheit_result)) return $lehreinheit_result;
@@ -89,27 +97,47 @@ class LektorLib
$lehreinheit = getData($lehreinheit_result)[0];
+ $semesterstunden_alt = $lehreinheit->semesterstunden;
+ $semesterstunden_neu = isset($new_data['semesterstunden']) ? $new_data['semesterstunden'] : $semesterstunden_alt;
+ $bismelden_neu = isset($new_data['bismelden']) ? $new_data['bismelden'] : $lehreinheit->bismelden;
+ $neue_stunden_eingerechnet = (bool)$bismelden_neu;
+ $alte_stunden_eingerechnet = (bool)$lehreinheit->bismelden;
+ $stundenplan_update = false;
- //TODO kollision check, wird vorerst nicht implementiert -> nur über das FAS möglich
- if (isset($new_data['mitarbeiter_uid']) && $new_data['mitarbeiter_uid'] !== $mitarbeiter_uid)
+ if ($old_uid !== $new_uid)
{
- $this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
- $this->_ci->StundenplandevModel->addGroupBy('stundenplandev_id');
- $this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
- $this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
- $verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
-
- if (hasData($verplant))
- return error($this->_ci->phraseslib->t("lehre", "lektorbereitsverplant"));
-
- $lehreinheit_data = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $new_data['mitarbeiter_uid'], 'lehreinheit_id' => $lehreinheit_id));
+ $lehreinheit_data = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $new_uid, 'lehreinheit_id' => $lehreinheit_id));
if (hasData($lehreinheit_data))
return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt"));
+ $this->_ci->StundenplandevModel->addGroupBy('stundenplandev_id');
+ $this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
+ $verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $old_uid));
+
+ if (hasData($verplant))
+ {
+ $kollision = $this->hasKollision(getData($verplant), $new_uid);
+
+ $ignore_kollision = $this->_ci->variablelib->getVar('ignore_kollision');
+
+ if ($kollision === false || $ignore_kollision == 'true')
+ {
+ $stundenplan_update = true;
+ }
+ else if (is_array($kollision))
+ {
+ return error( "Änderung fehlgeschlagen! Die Änderung des Lektors führt zu ".count($kollision)." Kollision(en) im LV-Plan. Deaktivieren Sie die Kollisionspruefung oder wenden Sie sich an die LV-Planung!\n zB. $kollision[0]");
+ }
+ else
+ {
+ return error($kollision);
+ }
+ }
}
+
$warning = '';
- if (isset($new_data['semesterstunden']))
+ if (($semesterstunden_neu !== '' && $semesterstunden_alt !== '') && (($semesterstunden_neu > $semesterstunden_alt) || $neue_stunden_eingerechnet))
{
$studiengang_result = $this->_ci->StudiengangModel->loadWhere(array('studiengang_kz' => $lehreinheit->studiengang_kz));
if (isError($studiengang_result)) return $studiengang_result;
@@ -120,7 +148,7 @@ class LektorLib
if (isError($studiensemester_result)) return $studiensemester_result;
$studiensemester = getData($studiensemester_result)[0];
- $echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'echterdv');
+ $echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($new_uid, $studiensemester->start, $studiensemester->ende, 'echterdv');
$echter_dv = false;
@@ -129,83 +157,81 @@ class LektorLib
$echter_dv = true;
}
- $neue_stunden_eingerechnet = isset($new_data['bismelden']) ? $new_data['bismelden'] : $lehreinheit->bismelden;
- $alte_stunden_eingerechnet = $lehreinheit->bismelden;
+ $stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv);
+ if (isError($stundengrenze_result)) return $stundengrenze_result;
- if (($new_data['semesterstunden'] > $lehreinheit->semesterstunden) || $neue_stunden_eingerechnet)
+ $stundengrenze = getData($stundengrenze_result)[0];
+
+ $oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz);
+ $oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array();
+
+ $semesterstunden_alt_sql = is_null($semesterstunden_alt) ? 0 : $semesterstunden_alt;
+ $semesterstunden_neu_sql = is_null($semesterstunden_neu) ? 0 : $semesterstunden_neu;
+
+ if ($alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
+ $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($semesterstunden_alt_sql) + {$this->_ci->LehreinheitmitarbeiterModel->db->escape($semesterstunden_neu_sql)}) as summe");
+ else if ($alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
+ $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($semesterstunden_alt_sql)) as summe");
+ else if (!$alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
+ $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) + ({$this->_ci->LehreinheitmitarbeiterModel->db->escape($semesterstunden_neu_sql)})) as summe");
+ else if (!$alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
+ $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden)) as summe");
+
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
+
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', $new_uid);
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $lehreinheit->studiensemester_kurzbz);
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true);
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('lower(mitarbeiter_uid) NOT LIKE', '_dummy%');
+
+ if (count($oe_array) > 0)
{
- $stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv);
- if (isError($stundengrenze_result)) return $stundengrenze_result;
-
- $stundengrenze = getData($stundengrenze_result)[0];
-
- $oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz);
- $oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array('');
-
- if ($alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
- $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($lehreinheit->semesterstunden) + {$this->_ci->LehreinheitmitarbeiterModel->db->escape($new_data['semesterstunden'])}) as summe");
- else if ($alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
- $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($lehreinheit->semesterstunden)) as summe");
- else if (!$alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
- $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) + ({$this->_ci->LehreinheitmitarbeiterModel->db->escape($new_data['semesterstunden'])})) as summe");
- else if (!$alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
- $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden)) as summe");
-
- $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
- $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
- $this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
-
- $this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', (isset($new_data['mitarbeiter_uid']) ? $new_data['mitarbeiter_uid'] : $mitarbeiter_uid));
- $this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $lehreinheit->studiensemester_kurzbz);
- $this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true);
- $this->_ci->LehreinheitmitarbeiterModel->db->where('lower(mitarbeiter_uid) NOT LIKE', '_dummy%');
-
$this->_ci->LehreinheitmitarbeiterModel->db->where_in('tbl_studiengang.oe_kurzbz', $oe_array);
+ }
+ if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE')
+ && is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE)
+ && count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) > 0)
+ {
+ $this->_ci->LehreinheitmitarbeiterModel->db->where_not_in('tbl_studiengang.oe_kurzbz', FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE);
+ }
- if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE')
- && is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE)
- && count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) > 0)
+ $summe_result = $this->_ci->LehreinheitmitarbeiterModel->load();
+
+ if (isError($summe_result)) return $summe_result;
+
+ if (!hasData($summe_result)) return error('Fehler beim Ermitteln der Gesamtstunden');
+
+ $summe = getData($summe_result)[0]->summe;
+
+ if ($summe > $stundengrenze->stunden)
+ {
+ if (!$echter_dv && (!$this->_ci->permissionlib->isBerechtigt('admin')))
{
- $this->_ci->LehreinheitmitarbeiterModel->db->where_not_in('tbl_studiengang.oe_kurzbz', FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE);
+ if (!$this->LehrauftragAufFirma($new_uid))
+ return error("ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden NICHT gespeichert!\n\n");
+ }
+ else
+ {
+ $warning .= "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden gespeichert!\n\n";
}
- $summe_result = $this->_ci->LehreinheitmitarbeiterModel->load();
+ $stunden_limit_result = $this->getStundenInstitut($new_uid, $lehreinheit->studiensemester_kurzbz, $oe_array);
- if (isError($summe_result)) return $summe_result;
-
- if (!hasData($summe_result)) return error('Fehler beim Ermitteln der Gesamtstunden');
-
- $summe = getData($summe_result)[0]->summe;
-
- if ($summe > $stundengrenze->stunden)
+ if (hasData($stunden_limit_result))
{
-
- if (!$echter_dv && (!$this->_ci->permissionlib->isBerechtigt('admin')))
+ $stunden_limit_array = getData($stunden_limit_result);
+ foreach ($stunden_limit_array as $stunden_limit)
{
- if (!$this->LehrauftragAufFirma(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid))
- return error("ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden NICHT gespeichert!\n\n");
- }
- else
- {
- $warning .= "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden gespeichert!\n\n";
- }
-
- $stunden_limit_result = $this->getStundenInstitut($mitarbeiter_uid, $lehreinheit->studiensemester_kurzbz, $oe_array);
-
- if (hasData($stunden_limit_result))
- {
- $stunden_limit_array = getData($stunden_limit_result);
- foreach ($stunden_limit_array as $stunden_limit)
- {
- $warning .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n";
- }
+ $warning .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n";
}
}
}
}
- $benutzer_result = $this->_ci->BenutzerModel->load(array(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid));
+ $benutzer_result = $this->_ci->BenutzerModel->load(array($new_uid));
if (isError($benutzer_result)) return $benutzer_result;
@@ -227,12 +253,23 @@ class LektorLib
'bismelden'
);
+ $nullable_fields = array('stundensatz', 'semesterstunden', 'planstunden');
+
$updateData = array();
foreach ($updatableFields as $field)
{
- $value = isset($new_data[$field]) ? $new_data[$field] : null;
+ if (!array_key_exists($field, $new_data))
+ {
+ continue;
+ }
- if ($value !== null)
+ $value = $new_data[$field];
+
+ if (in_array($field, $nullable_fields))
+ {
+ $updateData[$field] = $value;
+ }
+ elseif ($value !== null)
{
$updateData[$field] = $value;
}
@@ -240,10 +277,24 @@ class LektorLib
$updateData['updatevon'] = getAuthUID();
$updateData['updateamum'] = date('Y-m-d H:i:s');
- $result = $this->_ci->LehreinheitmitarbeiterModel->update(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid), $updateData);
+ $result = $this->_ci->LehreinheitmitarbeiterModel->update(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $old_uid), $updateData);
if (isError($result)) return $result;
+ if ($stundenplan_update)
+ {
+ $update_result = $this->_ci->StundenplandevModel->update([
+ 'lehreinheit_id' => $lehreinheit_id,
+ 'mitarbeiter_uid' => $old_uid,
+ ], [
+ 'mitarbeiter_uid' => $new_uid,
+ 'updateamum' => date('Y-m-d H:i:s'),
+ 'updatevon' => getAuthUID()
+ ]);
+
+ if (isError($update_result)) return $update_result;
+ }
+
if ($warning !== '') return success(['warning' => $warning]);
return success('Erfolgreich geupdated');
@@ -347,4 +398,52 @@ class LektorLib
$this->_ci->LehreinheitmitarbeiterModel->addGroupBy('tbl_studiengang.bezeichnung');
return $this->_ci->LehreinheitmitarbeiterModel->load();
}
+
+ private function hasKollision($stunden, $mitarbeiter)
+ {
+ $kollision = array();
+
+ $ignore_zeitsperre = $this->_ci->variablelib->getVar('ignore_zeitsperre');
+ $ignore_reservierung = $this->_ci->variablelib->getVar('ignore_reservierung');
+
+ foreach ($stunden as $stunde)
+ {
+ $stundenplan_result = $this->_ci->StundenplandevModel->lektorHasStundenplandevEintrag($mitarbeiter, $stunde->datum, $stunde->stunde);
+
+ if (isError($stundenplan_result))
+ return $stundenplan_result;
+
+ if (hasData($stundenplan_result))
+ {
+ $stundenplan_result = getData($stundenplan_result)[0];
+ $kollision[] = "Kollision stundenplandev: $stundenplan_result->stundenplandev_id|$stundenplan_result->lektor|$stundenplan_result->ort_kurzbz|$stundenplan_result->stg_kurzbz-$stundenplan_result->semester$stundenplan_result->verband$stundenplan_result->gruppe$stundenplan_result->gruppe_kurzbz - $stundenplan_result->datum/$stundenplan_result->stunde";
+ }
+ else
+ {
+ if ($ignore_zeitsperre == 'false' && (!defined('KOLLISIONSFREIE_USER') || !in_array($mitarbeiter, unserialize(KOLLISIONSFREIE_USER))))
+ {
+ $zeitsperre_result = $this->_ci->ZeitsperreModel->checkIfZeitsperreExists($mitarbeiter, $stunde->datum, $stunde->stunde);
+
+ if (hasData($zeitsperre_result))
+ {
+ $zeitsperre_result = getData($zeitsperre_result)[0];
+ $kollision[] = "Kollision (Zeitsperre): $zeitsperre_result->zeitsperre_id|$zeitsperre_result->mitarbeiter_uid|$zeitsperre_result->zeitsperretyp_kurzbz - $zeitsperre_result->vondatum/$zeitsperre_result->vonstunde|$zeitsperre_result->bisdatum/$zeitsperre_result->bisstunde";
+ }
+ }
+
+ if ($ignore_reservierung == 'false' && (!defined('KOLLISIONSFREIE_USER') || !in_array($mitarbeiter, unserialize(KOLLISIONSFREIE_USER))))
+ {
+ $reservierung_result = $this->_ci->ReservierungModel->lektorHasReservierung($mitarbeiter, $stunde->datum, $stunde->stunde);
+
+ if (hasData($reservierung_result))
+ {
+ $reservierung_result = getData($reservierung_result)[0];
+ $kollision[] = "Kollision (Reservierung): $reservierung_result->reservierung_id|$reservierung_result->uid|$reservierung_result->ort_kurzbz|$reservierung_result->stg_kurzbz-$reservierung_result->semester$reservierung_result->verband$reservierung_result->gruppe$reservierung_result->gruppe_kurzbz - $reservierung_result->datum/$reservierung_result->stunde";
+ }
+ }
+ }
+ }
+
+ return isEmptyArray($kollision) ? false : $kollision;
+ }
}
diff --git a/application/libraries/ProfilLib.php b/application/libraries/ProfilLib.php
index 97cb8ce5d..43a110b85 100644
--- a/application/libraries/ProfilLib.php
+++ b/application/libraries/ProfilLib.php
@@ -263,6 +263,59 @@ class ProfilLib{
$element->mailto = "mailto:" . $element->gruppe_kurzbz . "@" . DOMAIN;
return $element;
}, $mailverteiler_res);
+
+ $this->ci->load->model("crm/Student_model", "StudentModel");
+ $this->ci->StudentModel->addJoin("tbl_benutzer", "tbl_benutzer.uid = tbl_student.student_uid");
+ $this->ci->StudentModel->addJoin("tbl_person", "tbl_benutzer.person_id = tbl_person.person_id");
+ $this->ci->StudentModel->addJoin("tbl_studiengang", "tbl_student.studiengang_kz = tbl_studiengang.studiengang_kz");
+ $this->ci->StudentModel->addSelect("matr_nr, semester, verband, gruppe, kurzbzlang");
+
+ $studentResult = $this->ci->StudentModel->loadWhere(["student_uid" => $uid]);
+ if (isError($studentResult)) {
+ return error(getData($studentResult));
+ }
+
+ $studentResultData = getData($studentResult);
+ $studentData = null;
+ if (is_array($studentResultData) && count($studentResultData)) {
+ $studentData = $studentResultData[0];
+ }
+
+ if ($studentData && $studentData->matr_nr) {
+ $this->ci->load->library("phrasesLib", ["profil"], "phrases");
+ $standardCourseVerteiler = trim($studentData->kurzbzlang) . "_STD";
+ $mailverteiler_res[] = [
+ "beschreibung" => $this->ci->phrases->t('profil', 'alleStudentenVon') . " " . $standardCourseVerteiler,
+ "gruppe_kurzbz" => $standardCourseVerteiler,
+ "mailto" => "mailto:" . strtolower($standardCourseVerteiler) . "@" . DOMAIN,
+ ];
+
+ $semesterVerteiler = trim($studentData->kurzbzlang) . trim($studentData->semester);
+ $mailverteiler_res[] = [
+ "beschreibung" => $this->ci->phrases->t('profil', 'alleStudentenVon') . " " . $semesterVerteiler,
+ "gruppe_kurzbz" => $semesterVerteiler,
+ "mailto" => "mailto:" . strtolower($semesterVerteiler) . "@" . DOMAIN,
+ ];
+
+ if ($studentData->verband && strlen(trim($studentData->verband))) {
+ $verbandVerteiler = $semesterVerteiler . trim($studentData->verband);
+ $mailverteiler_res[] = [
+ "beschreibung" => $this->ci->phrases->t('profil', 'alleStudentenVon') . " " . $verbandVerteiler,
+ "gruppe_kurzbz" => $verbandVerteiler,
+ "mailto" => "mailto:" . strtolower($verbandVerteiler) . "@" . DOMAIN,
+ ];
+
+ if ($studentData->gruppe && strlen(trim($studentData->gruppe))) {
+ $gruppeVerteiler = $verbandVerteiler . trim($studentData->gruppe);
+ $mailverteiler_res[] = [
+ "beschreibung" => $this->ci->phrases->t('profil', 'alleStudentenVon') . " " . $gruppeVerteiler,
+ "gruppe_kurzbz" => $gruppeVerteiler,
+ "mailto" => "mailto:" . strtolower($gruppeVerteiler) . "@" . DOMAIN,
+ ];
+ }
+ }
+ }
+
return $mailverteiler_res;
}
diff --git a/application/libraries/StundenplanLib.php b/application/libraries/StundenplanLib.php
index 7ed64da2c..2c13a29d9 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");
@@ -77,10 +80,12 @@ class StundenplanLib
if (isError($semester_range))
return $semester_range;
$semester_range = getData($semester_range);
+ $this->_ci->addMeta('semester_range', $semester_range);
$this->sortStudienSemester($semester_range);
$function_error = $this->applyLoadUeberSemesterHaelfte($semester_range);
+ $this->_ci->addMeta('nach_apply_semester_range', $semester_range);
if ($function_error)
return $function_error;
@@ -89,13 +94,13 @@ class StundenplanLib
if (isError($benutzer_gruppen))
return $benutzer_gruppen;
$benutzer_gruppen = getData($benutzer_gruppen);
-
+ $this->_ci->addMeta('spezialgruppen', $benutzer_gruppen);
// getting the student_lehrverbaende of the student in the different studiensemester
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range);
if (isError($student_lehrverband))
return $student_lehrverband;
$student_lehrverband = getData($student_lehrverband);
-
+ $this->_ci->addMeta('studentlehrvebaende', $student_lehrverband);
$stundenplan_query = $this->_ci->StundenplanModel->getStundenplanQuery(
$start,
$end,
@@ -181,6 +186,21 @@ class StundenplanLib
return success($stundenplan_data);
}
+ public function getEventsByLE($lehreinheit_id, $start, $end, $stundenplan)
+ {
+ $this->_ci =& get_instance();
+
+ $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
+ return $this->_ci->StundenplanModel->getStundenplanLE($lehreinheit_id, $start, $end, $stundenplan);
+ }
+
+ public function getEventsByLV($lehrveranstaltung_id, $start, $end, $stundenplan)
+ {
+ $this->_ci =& get_instance();
+
+ $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
+ return $this->_ci->StundenplanModel->getStundenplanLV($lehrveranstaltung_id, $start, $end, $stundenplan);
+ }
/**
* Get stundenplan for a room
*
@@ -217,7 +237,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 +248,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 +377,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 +468,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
@@ -591,6 +632,7 @@ class StundenplanLib
$result->semester = $item->semester;
$result->verband = $item->verband;
$result->gruppe = $item->gruppe;
+ $result->studiensemester_kurzbz = $item->studiensemester_kurzbz;
return $result;
},
$lehrverband_query_result);
@@ -760,7 +802,8 @@ class StundenplanLib
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
// gets all studiensemester from the student from start_date to end_date
- $semester_range = $this->_ci->StudiensemesterModel->getByDateRange($start_date, $end_date);
+ //$semester_range = $this->_ci->StudiensemesterModel->getByDateRange($start_date, $end_date);
+ $semester_range = $this->_ci->StudiensemesterModel->getContainingOrNearestByDateRange($start_date, $end_date);
if (isError($semester_range))
return $semester_range;
diff --git a/application/libraries/TagLib.php b/application/libraries/TagLib.php
new file mode 100644
index 000000000..637431360
--- /dev/null
+++ b/application/libraries/TagLib.php
@@ -0,0 +1,392 @@
+_ci =& get_instance();
+
+ // Configs
+ $this->_ci->load->config('stv');
+
+ // Models
+ $this->_ci->load->model('person/Notiz_model', 'NotizModel');
+ $this->_ci->load->model('system/Notiztyp_model', 'NotiztypModel');
+ $this->_ci->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
+ $this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+ $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ // Libraries
+ $this->_ci->load->library('PermissionLib');
+ $this->_ci->load->library('PrestudentLib');
+
+ $this->batchUser = $this->_ci->config->item('userAutomatedTags');
+ }
+
+ public function updateAutomatedTags($paramsTag)
+ {
+ // ---------------------------------
+ // check params
+ // ---------------------------------
+ $required = ['kurzbz', 'data', 'typeId'];
+
+ foreach ($required as $key) {
+ if (!isset($paramsTag[$key])) {
+ return error('Missing Parameter: ' . $key);
+ }
+ }
+
+ $studiensemester_kurzbz = (isset ($paramsTag['studiensemester_kurzbz']) ? $paramsTag['studiensemester_kurzbz'] : null);
+ $tag = $paramsTag['kurzbz'];
+ $inputData = $paramsTag['data'];
+ $typeId = $paramsTag['typeId'];
+
+ // ---------------------------------
+ // prepare input
+ // ---------------------------------
+ $zeitraum = [];
+ $arrayIds = [];
+
+ foreach ($inputData as $item) {
+ $id = $item['id'];
+ $arrayIds[] = $id;
+
+ $zeitraum[$id] = [
+ 'von' => $item['von'] ?? null,
+ 'bis' => $item['bis'] ?? null
+ ];
+ }
+ $arrayIds = array_unique($arrayIds);
+
+ $result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
+ if (isError($result)) {
+ return $result;
+ }
+ $data = $result->retval[0] ?? null;
+
+ $von = $data->start ?? null;
+ $bis = $data->ende ?? null;
+
+ // ---------------------------------
+ // load existing tags
+ // ---------------------------------
+ $allTags = [];
+ $resultAllTags = $this->_ci->NotizModel->getAllTags($tag, $von, $bis);
+ if (isError($resultAllTags)) {
+ return $resultAllTags;
+ }
+ $allTagsData = getData($resultAllTags);
+
+ if (!empty($allTagsData)) {
+ foreach ($allTagsData as $item) {
+ $allTags[$item->$typeId] = $item->notiz_id;
+ }
+ }
+
+ // ---------------------------------
+ // map the data
+ // ---------------------------------
+ $toRecycle = [];
+ $toAdd = [];
+ $toDelete = [];
+
+ foreach ($arrayIds as $id) {
+ if (isset($allTags[$id])) {
+ $toRecycle[$id] = $allTags[$id];
+ } else {
+ $toAdd[] = $id;
+ }
+ }
+
+ foreach ($allTags as $id => $notizId) {
+ if (!in_array($id, $arrayIds)) {
+ $toDelete[$id] = $notizId;
+
+ }
+ }
+
+ // ---------------------------------
+ // recycle (update existing)
+ // ---------------------------------
+ $countRecycled = 0;
+ $retagged = [];
+
+ foreach ($toRecycle as $id => $notizId)
+ {
+ $this->_updateTag($notizId, $zeitraum[$id]['von'], $zeitraum[$id]['bis']);
+
+ $countRecycled++;
+ $retagged[] = $id;
+ }
+
+ // ---------------------------------
+ // ADD
+ // ---------------------------------
+ $countAdded = 0;
+ $tagged = [];
+
+ foreach ($toAdd as $id)
+ {
+ $this->_insertTag($typeId, $id, $tag, $zeitraum[$id]['von'], $zeitraum[$id]['bis']);
+ $countAdded++;
+
+ $tagged[] = $id;
+ }
+
+ // ---------------------------------
+ // delete
+ // ---------------------------------
+ $countDeleted = 0;
+ $deleted = [];
+
+ foreach ($toDelete as $id => $notizId)
+ {
+ $result = $this->_deleteTag($notizId);
+
+ if (isError($result)) {
+ return $result;
+ }
+
+ $countDeleted++;
+ $deleted[] = $id;
+ }
+
+ // ---------------------------------
+ // return
+ // ---------------------------------
+ return success([
+ 'input' => [
+ 'tag' => $tag,
+ 'arrayIds' => $arrayIds
+ ],
+ 'summary' => [
+ 'recycled' => $countRecycled,
+ 'added' => $countAdded,
+ 'deleted' => $countDeleted
+ ],
+ 'details' => [
+ 'existingTags' => $allTags,
+ 'toAdd' => $toAdd,
+ 'toRecycle' => $toRecycle,
+ 'toDelete' => $toDelete
+ ],
+ 'results' => [
+ 'retaggedIds' => $retagged,
+ 'newTags' => $tagged,
+ 'deletedTagsIds' => $deleted
+ ]
+ ]);
+ }
+
+ public function updateAutomatedTagsForTypeId(array $params)
+ {
+ $return = null;
+ $notiz_id = null;
+
+ $von = $params['von'];
+ $bis = $params['bis'];
+ $tag = $params['kurzbz'];
+ $id = $params['id'];
+ $typeId = $params['typeId'];
+
+ $this->_ci->NotizModel->addSelect('nz.notiz_id');
+ $this->_ci->NotizModel->addSelect($typeId);
+ $this->_ci->NotizModel->addJoin('public.tbl_notizzuordnung nz', 'notiz_id');
+ $resultAllTags = $this->_ci->NotizModel->loadWhere([
+ 'typ' => $tag,
+ $typeId => $id
+ ]);
+ if(hasData($resultAllTags))
+ {
+ $notiz_id = $resultAllTags->retval[0]->notiz_id;
+ }
+
+ //RECYCLE
+ if ($notiz_id !== null)
+ {
+ $resultUpdateNotiz = $this->_updateTag($notiz_id, $von, $bis);
+ $return = ['recycled' => $resultUpdateNotiz];
+ }
+ else
+ //ADD
+ {
+ $resultInsertNotiz = $this->_insertTag($typeId, $id, $tag, $von, $bis);
+ $return = ['added' => $resultInsertNotiz];
+ }
+ return success($return);
+ }
+
+ /*
+ * main function for rebuild Tags for typeId
+ * */
+ public function rebuildTagsForTypeId($typeId, $id, $studiensemester_kurzbz)
+ {
+ $automatedTagsRes = $this->_ci->NotiztypModel->loadWhere(array('automatisiert' => true, 'taglib IS NOT NULL' => null));
+ $automatedTags = hasData($automatedTagsRes) ? getData($automatedTagsRes) : [];
+
+ $result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
+ if (isError($result))
+ return error('Error occurred during retrieving studiensemester');
+ if (empty($result->retval) || !isset($result->retval[0])) {
+ return error('No studiensemester found');
+ }
+
+ $startSem = $result->retval[0]->start ?? null;
+ $endeSem = $result->retval[0]->ende ?? null;
+ $return = [];
+
+ foreach ($automatedTags as $autoTag)
+ {
+ // getPath: must not be lost
+ $filePath = APPPATH . 'libraries/' . $autoTag->taglib . '.php'; // APPPATH = application/
+
+ if (file_exists($filePath)) {
+ require_once($filePath);
+ } else {
+ echo "File not found: " . $filePath;
+ continue;
+ }
+
+ $className = basename($autoTag->taglib);
+ $kurz_bz = $autoTag->typ_kurzbz;
+
+ $obj = new $className();
+
+ $criteriaIsSet = $obj->isCriteriaSetFor([
+ 'typeId' => $typeId,
+ 'id' => $id,
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz
+ ]);
+
+ if (hasData($criteriaIsSet))
+ {
+ $von = isset($criteriaIsSet->retval[0]->von) ? $criteriaIsSet->retval[0]->von : '';
+ $bis = isset($criteriaIsSet->retval[0]->bis) ? $criteriaIsSet->retval[0]->bis : '';
+
+ $params = [
+ 'von' => $von,
+ 'bis' => $bis,
+ 'kurzbz' => $autoTag->typ_kurzbz,
+ 'typeId' => $typeId,
+ 'id' => $id,
+ ];
+
+ $result = $this->updateAutomatedTagsForTypeId($params);
+ if (isError($result))
+ return error('Error occurred during updateAutomatedTags' . $kurz_bz);
+
+ $return[$kurz_bz] = $result;
+ }
+ else
+ {
+ //CHECK FOR DELETE
+ $params = [
+ 'von' => $startSem,
+ 'bis' => $endeSem,
+ 'kurzbz' => $autoTag->typ_kurzbz,
+ 'typeId' => $typeId,
+ 'id' => $id,
+ ];
+ $result = $this->_ci->NotizModel->checkIfExistingTag($kurz_bz, $typeId, $id, $startSem, $endeSem);
+ if (hasData($result))
+ {
+ $notizId = $result->retval[0]->notiz_id;
+ $this->_deleteTag($notizId);
+ $return[$kurz_bz] = ['deleted' => $notizId];
+ }
+ }
+ }
+ return success($return);
+ }
+
+ private function _insertTag($typeId, $id, $tag, $von, $bis)
+ {
+ $resultInsert = $this->_ci->NotizModel->insert([
+ 'titel' => 'TAG',
+ 'text' => 'AUTOMATED TAG',
+ 'verfasser_uid' => $this->batchUser,
+ 'erledigt' => false,
+ 'insertamum' => date('Y-m-d H:i:s'),
+ 'insertvon' => 'BatchJobTagAdd',
+ 'typ' => $tag,
+ 'start' => $von,
+ 'ende' => $bis
+ ]);
+
+ if (isError($resultInsert)) {
+ return error('Error inserting tag for ' . $typeId . ': ' . $id);
+ }
+
+ $notizId = $resultInsert->retval;
+
+ $resultZuordnung = $this->_ci->NotizzuordnungModel->insert([
+ 'notiz_id' => $notizId,
+ $typeId => $id
+ ]);
+
+ if (isError($resultZuordnung)) {
+ return error('Error inserting relation for ' . $typeId . ': ' . $id);
+ }
+
+ return $notizId;
+ }
+
+ private function _updateTag($notiz_id, $von, $bis)
+ {
+ $resultUpdateNotiz = $this->_ci->NotizModel->update(
+ [
+ 'notiz_id' => $notiz_id
+ ],
+ array(
+ 'updateamum' => date('Y-m-d H:i:s'),
+ 'updatevon' => 'BatchJobTagUpdate',
+ 'start' => $von,
+ 'ende' => $bis
+ ));
+
+
+ if (isError($resultUpdateNotiz))
+ return error ('Error occurred during Update ' . $notiz_id);
+
+ return $notiz_id;
+ }
+
+ private function _deleteTag($notiz_id)
+ {
+ $result = $this->_ci->NotizzuordnungModel->delete([
+ 'notiz_id' => $notiz_id
+ ]);
+ if (isError($result)) {
+ return error('Error occurred during delete Notizzuordnung ' . $notiz_id);
+ }
+
+ $result = $this->_ci->NotizModel->delete([
+ 'notiz_id' => $notiz_id
+ ]);
+ if (isError($result)) {
+ return error('Error occurred during delete Notiz ' . $notiz_id);
+ }
+
+ return success([
+ 'deleted' => $notiz_id
+ ]);
+ }
+
+}
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..9365ddc9a
--- /dev/null
+++ b/application/libraries/stv/StudentListLib.php
@@ -0,0 +1,424 @@
+.
+ */
+
+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 = [];
+ private $_wheres = [];
+
+ /**
+ * 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->config('stv');
+
+ $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel');
+
+ if (isset($params['allowedStgs']))
+ $this->_allowedStgs = $params['allowedStgs'];
+
+ // Add default SELECTs
+ $this->addSelect("b.uid");
+ $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("
+ CASE
+ WHEN pls.status_kurzbz IN ('Interessent','Aufgenommener','Bewerber','Wartender')
+ THEN pls.ausbildungssemester
+ ELSE v.semester
+ END AS semester_berechnet
+ ");
+ $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);
+ $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');
+ $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
+
+ // Add SELECTs and JOINs from config
+ $config = $this->_ci->config->item('list_columns') ?: [];
+ foreach ($config as $conf) {
+ $this->addSelect($conf['default']);
+ if (isset($conf['joins']))
+ foreach ($conf['joins'] as $join)
+ call_user_func_array([$this, 'addJoin'], $join);
+ }
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // 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)
+ {
+ $this->_wheres[] = [$key, $value, $escape, false];
+ }
+
+ /**
+ * 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)
+ {
+ $this->_wheres[] = [$key, $value, $escape, true];
+ }
+
+ /**
+ * Generates the query and executes it.
+ *
+ * @param string|null $studiensemester_kurzbz
+ *
+ * @return stdClass result of the query
+ */
+ public function execute($studiensemester_kurzbz)
+ {
+ $this->addSelectAndJoinForTagsIfConfigured($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]);
+
+ foreach ($this->_wheres as $where) {
+ if (!is_array($where[0]) && is_array($where[1])) {
+ if ($where[3])
+ $this->_ci->PrestudentModel->db->or_where_in($where[0], $where[1], $where[2]);
+ else
+ $this->_ci->PrestudentModel->db->where_in($where[0], $where[1], $where[2]);
+ } else {
+ if ($where[3])
+ $this->_ci->PrestudentModel->db->or_where($where[0], $where[1], $where[2]);
+ else
+ $this->_ci->PrestudentModel->db->where($where[0], $where[1], $where[2]);
+ }
+ }
+
+ $this->_ci->PrestudentModel->addOrder('nachname');
+ $this->_ci->PrestudentModel->addOrder('vorname');
+
+ return $this->_ci->PrestudentModel->load();
+ }
+
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Protected methods
+
+ /**
+ * Add Select and Join for Tags if configured
+ *
+ * @param string studiensemester_kurzbz
+ *
+ */
+ protected function addSelectAndJoinForTagsIfConfigured($studiensemester_kurzbz)
+ {
+ 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) . ")";
+ }
+ $studiensemester_kurzbz_escaped = $this->_ci->PrestudentModel->escape($studiensemester_kurzbz);
+ $subQueryTag = "(
+ SELECT
+ tag.prestudent_id,
+ COALESCE(json_agg(tag ORDER BY tag.done, tag.prioritaet), '[]'::json) AS tags
+ FROM (
+ SELECT DISTINCT ON (n.notiz_id)
+ n.notiz_id AS id,
+ nt.typ_kurzbz,
+ nt.bezeichnung_mehrsprachig[(
+ SELECT index
+ FROM tbl_sprache
+ WHERE sprache=" . $this->_ci->PrestudentModel->escape(getUserLanguage()) . "
+ )] AS beschreibung,
+ n.text AS notiz,
+ nt.style,
+ n.erledigt AS done,
+ nt.prioritaet AS prioritaet,
+ nt.automatisiert AS automatisiert,
+ nz.prestudent_id,
+ n.start,
+ n.ende
+ FROM public.tbl_notizzuordnung AS nz
+ JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id AND nz.prestudent_id IS NOT NULL
+ JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz " . $whereTags . "
+ WHERE
+ COALESCE(n.start, '1970-01-01') <= (
+ SELECT
+ ende
+ FROM
+ public.tbl_studiensemester
+ WHERE
+ studiensemester_kurzbz = " . $studiensemester_kurzbz_escaped . "
+ )
+ AND COALESCE(n.ende, '2170-12-31') >= (
+ SELECT
+ start
+ FROM
+ public.tbl_studiensemester
+ WHERE
+ studiensemester_kurzbz = " . $studiensemester_kurzbz_escaped . "
+ )
+ ) AS tag
+ GROUP BY tag.prestudent_id
+ ) AS tag_data_agg";
+
+ $this->addSelect('tag_data_agg.tags');
+ $this->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT');
+ }
+ }
+
+ /**
+ * 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/tags/CoreDoubleDegreeTagLib.php b/application/libraries/tags/CoreDoubleDegreeTagLib.php
new file mode 100644
index 000000000..13b113a21
--- /dev/null
+++ b/application/libraries/tags/CoreDoubleDegreeTagLib.php
@@ -0,0 +1,81 @@
+ci = get_instance();
+ $this->ci->load->model('codex/Mobilitaet_model', 'MobilitaetModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $this->ci->MobilitaetModel->addJoin('bis.tbl_gsprogramm', 'gsprogramm_id');
+ $this->ci->MobilitaetModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $result = $this->ci->MobilitaetModel-> loadWhere(array(
+ 'gsprogrammtyp_kurzbz' => 'Double',
+ 'studiensemester_kurzbz' => $semester
+ ));
+ $data = $result->retval;
+
+ $doubledegree_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->start,
+ 'bis' => $item->ende
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $doubledegree_data,
+ 'typeId' => 'prestudent_id'
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->MobilitaetModel->addSelect('prestudent_id');
+ $this->ci->MobilitaetModel->addSelect('start as von');
+ $this->ci->MobilitaetModel->addSelect('ende as bis');
+
+ $this->ci->MobilitaetModel->addJoin('bis.tbl_gsprogramm', 'gsprogramm_id');
+ $this->ci->MobilitaetModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $result = $this->ci->MobilitaetModel->loadWhere(array(
+ 'gsprogrammtyp_kurzbz' => 'Double',
+ 'studiensemester_kurzbz' => $semester,
+ 'prestudent_id' => $prestudent_id
+ ));
+
+ if(hasData($result))
+ {
+ //array mit prestudent_id, von und bis
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CoreFiftyFiveTagLib.php b/application/libraries/tags/CoreFiftyFiveTagLib.php
new file mode 100644
index 000000000..4e2738e8b
--- /dev/null
+++ b/application/libraries/tags/CoreFiftyFiveTagLib.php
@@ -0,0 +1,81 @@
+ci = get_instance();
+ $this->ci->load->model('person/Person_model', 'PersonModel');
+ $this->ci-> load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'person_id' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $result = $this->ci->StudiensemesterModel->loadWhere(array(
+ 'studiensemester_kurzbz' => $semester
+ ));
+ $data = $result->retval[0];
+
+ $semVon = $data->start;
+ $semBis = $data->ende;
+ $result = $this->ci->PersonModel->getFiftyFivers($semVon, $semBis);
+
+ $data = $result->retval;
+ $fiftyFiveData = array_map(function($item) {
+ return [
+ 'id' => $item->person_id
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $fiftyFiveData,
+ 'typeId' => 'person_id'
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'person_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $person_id = $params['id'];
+ $typeId = $params['typeId'];
+
+
+ $result = $this->ci->StudiensemesterModel->loadWhere(array(
+ 'studiensemester_kurzbz' => $semester
+ ));
+ $data = $result->retval[0];
+
+ $semVon = $data->start;
+ $semBis = $data->ende;
+ $result = $this->ci->PersonModel->isFiftyFive($semVon, $semBis, $person_id);
+
+
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
+
diff --git a/application/libraries/tags/CoreIncomingTagLib.php b/application/libraries/tags/CoreIncomingTagLib.php
new file mode 100644
index 000000000..26d7dad0b
--- /dev/null
+++ b/application/libraries/tags/CoreIncomingTagLib.php
@@ -0,0 +1,63 @@
+ci = get_instance();
+ $this->ci->load->model('codex/Bisio_model', 'BisioModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $result = $this->ci->BisioModel->getIncomingsOfSemester($semester);
+
+ $data = $result->retval;
+
+ $outgoing_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->von,
+ 'bis' => $item->bis
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $outgoing_data,
+ 'typeId' => 'prestudent_id',
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $result = $this->ci->BisioModel->isPrestudentIncoming($semester, $prestudent_id);
+
+ if (hasData($result)) {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CoreJgvTagLib.php b/application/libraries/tags/CoreJgvTagLib.php
new file mode 100644
index 000000000..15e77dc98
--- /dev/null
+++ b/application/libraries/tags/CoreJgvTagLib.php
@@ -0,0 +1,64 @@
+ci = get_instance();
+ $this->ci->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $result = $this->ci->BenutzerfunktionModel->getPrestudentsOfJgv($semester);
+
+ $data = $result->retval;
+
+ $jgv_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->datum_von,
+ 'bis' => $item->datum_bis
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $jgv_data,
+ 'typeId' => 'prestudent_id'
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $result = $this->ci->BenutzerfunktionModel->isJgv($semester, $prestudent_id);
+
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CoreMissingZgvTagLib.php b/application/libraries/tags/CoreMissingZgvTagLib.php
new file mode 100644
index 000000000..2d5df0ffc
--- /dev/null
+++ b/application/libraries/tags/CoreMissingZgvTagLib.php
@@ -0,0 +1,112 @@
+ci = get_instance();
+ $this->ci->load->model('crm/Prestudent_model', 'PrestudentModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $this->ci->PrestudentModel->addJoin('public.tbl_prestudentstatus', 'prestudent_id');
+ $this->ci->PrestudentModel->addJoin('public.tbl_benutzer bn', 'person_id');
+ $this->ci->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
+
+ $this->ci->PrestudentModel->db->group_start();
+
+ $this->ci->PrestudentModel->db->where('zgvdatum', null);
+ $this->ci->PrestudentModel->db->where('typ', 'b');
+
+ $this->ci->PrestudentModel->db->or_group_start();
+ $this->ci->PrestudentModel->db->where('zgvmadatum', null);
+ $this->ci->PrestudentModel->db->where('typ', 'm');
+ $this->ci->PrestudentModel->db->group_end();
+
+ $this->ci->PrestudentModel->db->group_end();
+
+ $result = $this->ci->PrestudentModel-> loadWhere(array(
+ 'bn.aktiv' => true,
+ 'studiensemester_kurzbz' => $semester
+ ));
+
+ $data = $result->retval;
+
+ $zgvmissing_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => null,
+ 'bis' => null
+ ];
+ }, $data);
+
+ return (object) array(
+ 'typeId' => 'prestudent_id',
+ 'data' => $zgvmissing_data
+ );
+
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->PrestudentModel->addSelect('prestudent_id');
+ $this->ci->PrestudentModel->addSelect('start as von');
+ $this->ci->PrestudentModel->addSelect('ende as bis');
+ $this->ci->PrestudentModel->addJoin('public.tbl_prestudentstatus', 'prestudent_id');
+
+ //add studiensemester also here for manual rebuild
+ $this->ci->PrestudentModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $this->ci->PrestudentModel->addJoin('public.tbl_benutzer bn', 'person_id');
+ $this->ci->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
+
+ $this->ci->PrestudentModel->db->group_start();
+
+ $this->ci->PrestudentModel->db->where('zgvdatum', null);
+ $this->ci->PrestudentModel->db->where('typ', 'b');
+
+ $this->ci->PrestudentModel->db->or_group_start();
+ $this->ci->PrestudentModel->db->where('zgvmadatum', null);
+ $this->ci->PrestudentModel->db->where('typ', 'm');
+ $this->ci->PrestudentModel->db->group_end();
+
+ $this->ci->PrestudentModel->db->group_end();
+ $this->ci->PrestudentModel->db->limit(1);
+
+ $result = $this->ci->PrestudentModel-> loadWhere(array(
+ 'bn.aktiv' => true,
+ 'studiensemester_kurzbz' => $semester,
+ 'prestudent_id' => $prestudent_id
+ ));
+
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CoreOutgoingTagLib.php b/application/libraries/tags/CoreOutgoingTagLib.php
new file mode 100644
index 000000000..904839dee
--- /dev/null
+++ b/application/libraries/tags/CoreOutgoingTagLib.php
@@ -0,0 +1,63 @@
+ci = get_instance();
+ $this->ci->load->model('codex/Bisio_model', 'BisioModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $result = $this->ci->BisioModel->getOutgoingsOfSemester($semester);
+
+ $data = $result->retval;
+
+ $outgoing_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->von,
+ 'bis' => $item->bis
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $outgoing_data,
+ 'typeId' => 'prestudent_id',
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $result = $this->ci->BisioModel->isPrestudentOutgoing($semester, $prestudent_id);
+
+ if (hasData($result)) {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CorePreabbrecherTagLib.php b/application/libraries/tags/CorePreabbrecherTagLib.php
new file mode 100644
index 000000000..41712ac3b
--- /dev/null
+++ b/application/libraries/tags/CorePreabbrecherTagLib.php
@@ -0,0 +1,80 @@
+ci = get_instance();
+ $this->ci->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $this->ci->StudierendenantragModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $this->ci->StudierendenantragModel->db->where_in('typ', self::TYP_ABMELDUNG);
+ $this->ci->StudierendenantragModel->db->where('studiensemester_kurzbz', $semester);
+ $result = $this->ci->StudierendenantragModel->getWithLastStatusWhere([
+ 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED
+ ]);
+
+ $data = $result->retval;
+
+ $prewiederholer_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->start,
+ 'bis' => $item->ende
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $prewiederholer_data,
+ 'typeId' => 'prestudent_id',
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->StudierendenantragModel->addSelect('prestudent_id');
+ $this->ci->StudierendenantragModel->addSelect('start as von');
+ $this->ci->StudierendenantragModel->addSelect('ende as bis');
+
+ $this->ci->StudierendenantragModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $this->ci->StudierendenantragModel->db->where_in('typ', self::TYP_ABMELDUNG);
+ $this->ci->StudierendenantragModel->db->where('studiensemester_kurzbz', $semester);
+ $this->ci->StudierendenantragModel->db->where('prestudent_id', $prestudent_id);
+ $result = $this->ci->StudierendenantragModel->getWithLastStatusWhere([
+ 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED
+ ]);
+
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CorePrewiederholerTagLib.php b/application/libraries/tags/CorePrewiederholerTagLib.php
new file mode 100644
index 000000000..8b7037b07
--- /dev/null
+++ b/application/libraries/tags/CorePrewiederholerTagLib.php
@@ -0,0 +1,76 @@
+ci = get_instance();
+ $this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $result = $this->ci->PrestudentstatusModel-> loadWhere(array(
+ 'statusgrund_id' => 15,
+ 'studiensemester_kurzbz' => $semester
+ ));
+ $data = $result->retval;
+
+ $prewiederholer_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->start,
+ 'bis' => $item->ende
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $prewiederholer_data,
+ 'typeId' => 'prestudent_id',
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->PrestudentstatusModel->addSelect('prestudent_id');
+ $this->ci->PrestudentstatusModel->addSelect('start as von');
+ $this->ci->PrestudentstatusModel->addSelect('ende as bis');
+
+ $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $result = $this->ci->PrestudentstatusModel->loadWhere(array(
+ 'statusgrund_id' => 15,
+ 'studiensemester_kurzbz' => $semester,
+ 'prestudent_id' => $prestudent_id
+ ));
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CoreStbErhoehtTagLib.php b/application/libraries/tags/CoreStbErhoehtTagLib.php
new file mode 100644
index 000000000..886aff468
--- /dev/null
+++ b/application/libraries/tags/CoreStbErhoehtTagLib.php
@@ -0,0 +1,79 @@
+ci = get_instance();
+ $this->ci->load->model('crm/Konto_model', 'KontoModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $this->ci->KontoModel->addJoin('public.tbl_prestudent', 'person_id');
+ $this->ci->KontoModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $result = $this->ci->KontoModel-> loadWhere(array(
+ 'buchungstyp_kurzbz' => 'StudiengebuehrErhoeht',
+ 'studiensemester_kurzbz' => $semester
+ ));
+ $data = $result->retval;
+
+ $konto_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->start,
+ 'bis' => $item->ende
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $konto_data,
+ 'typeId' => 'prestudent_id'
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->KontoModel->addSelect('prestudent_id');
+ $this->ci->KontoModel->addSelect('start as von');
+ $this->ci->KontoModel->addSelect('ende as bis');
+ $this->ci->KontoModel->addJoin('public.tbl_prestudent', 'person_id');
+ $this->ci->KontoModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $result = $this->ci->KontoModel-> loadWhere(array(
+ 'buchungstyp_kurzbz' => 'StudiengebuehrErhoeht',
+ 'studiensemester_kurzbz' => $semester,
+ 'prestudent_id' => $prestudent_id
+ ));
+
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CoreUnterbrecherTagLib.php b/application/libraries/tags/CoreUnterbrecherTagLib.php
new file mode 100644
index 000000000..ddf8f33cd
--- /dev/null
+++ b/application/libraries/tags/CoreUnterbrecherTagLib.php
@@ -0,0 +1,76 @@
+ci = get_instance();
+ $this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+ $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $result = $this->ci->PrestudentstatusModel-> loadWhere(array(
+ 'status_kurzbz' => 'Unterbrecher',
+ 'studiensemester_kurzbz' => $semester
+ ));
+ $data = $result->retval;
+
+ $unterbrecher_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->start,
+ 'bis' => $item->ende
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $unterbrecher_data,
+ 'typeId' => 'prestudent_id'
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->PrestudentstatusModel->addSelect('prestudent_id');
+ $this->ci->PrestudentstatusModel->addSelect('start as von');
+ $this->ci->PrestudentstatusModel->addSelect('ende as bis');
+
+ $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $result = $this->ci->PrestudentstatusModel-> loadWhere(array(
+ 'status_kurzbz' => 'Unterbrecher',
+ 'studiensemester_kurzbz' => $semester,
+ 'prestudent_id' => $prestudent_id
+ ));
+
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CoreWiederholerTagLib.php b/application/libraries/tags/CoreWiederholerTagLib.php
new file mode 100644
index 000000000..8f4eb1dd7
--- /dev/null
+++ b/application/libraries/tags/CoreWiederholerTagLib.php
@@ -0,0 +1,76 @@
+ci = get_instance();
+ $this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $result = $this->ci->PrestudentstatusModel-> loadWhere(array(
+ 'statusgrund_id' => 16,
+ 'studiensemester_kurzbz' => $semester
+ ));
+ $data = $result->retval;
+
+ $wiederholer_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->start,
+ 'bis' => $item->ende
+ ];
+ }, $data);
+
+ return (object) array(
+ 'typeId' => 'prestudent_id',
+ 'data' => $wiederholer_data
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->PrestudentstatusModel->addSelect('prestudent_id');
+ $this->ci->PrestudentstatusModel->addSelect('start as von');
+ $this->ci->PrestudentstatusModel->addSelect('ende as bis');
+
+ $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $result = $this->ci->PrestudentstatusModel->loadWhere(array(
+ 'statusgrund_id' => 16,
+ 'studiensemester_kurzbz' => $semester,
+ 'prestudent_id' => $prestudent_id,
+ ));
+
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+}
diff --git a/application/libraries/treemenu/LvVwLib.php b/application/libraries/treemenu/LvVwLib.php
new file mode 100644
index 000000000..d3c91a196
--- /dev/null
+++ b/application/libraries/treemenu/LvVwLib.php
@@ -0,0 +1,192 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * LvVw Menu library
+ */
+class LvVwLib
+{
+ protected $_ci = null;
+
+ public $config = [];
+
+ public function __construct()
+ {
+ // Get code igniter instance
+ $this->_ci =& get_instance();
+
+ // Load Tree-config
+ $this->_ci->load->config('treemenu/custom/lvvw');
+ $this->config = $this->_ci->config->item('root');
+
+ // Load Libraries
+ $this->_ci->load->library('treemenu/base/StgLib');
+
+ // Load Model
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ }
+
+ public function stg($path_template)
+ {
+ $permittedStgs = $this->getPermittedStudiengangKzs();
+
+ if (!$permittedStgs)
+ return [];
+
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" .
+ '"type": "verband",' .
+ '"id": "lv/%1$s",' .
+ '"gruppe_kurzbz": null,' .
+ '"semester": null,' .
+ '"verband": null,' .
+ '"gruppe": null,' .
+ '"lehrverband": true,' .
+ '"stg_kz": "%1$s"' .
+ "}', studiengang_kz)] AS draggable", false);
+
+ return $this->_ci->stglib->studiengang($path_template, $permittedStgs);
+ }
+
+ public function semester($path_template, $has_children, $stg)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ if (!$has_children)
+ $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" .
+ '"type": "verband",' .
+ '"id": "lv/%1$s/%2$s",' .
+ '"gruppe_kurzbz": null,' .
+ '"semester": "%2$s",' .
+ '"verband": null,' .
+ '"gruppe": null,' .
+ '"lehrverband": true,' .
+ '"stg_kz": "%1$s"' .
+ "}', v.studiengang_kz, v.semester)] AS draggable", false);
+
+ return $this->_ci->stglib->semester($path_template, $stg->studiengang_kz);
+ }
+
+ public function verband($path_template, $stg, $semester)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ $this->_ci->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf");
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" .
+ '"type": "verband",' .
+ '"id": "lv/%1$s/%2$s/%3$s",' .
+ '"gruppe_kurzbz": null,' .
+ '"semester": "%2$s",' .
+ '"verband": "%3$s",' .
+ '"gruppe": null,' .
+ '"lehrverband": true,' .
+ '"stg_kz": "%1$s"' .
+ "}', v.studiengang_kz, v.semester, v.verband)] AS draggable", false);
+ $this->_ci->StudiengangModel->addGroupBy('v.studiengang_kz, v.semester');
+
+ return $this->_ci->stglib->verband($path_template, $stg->studiengang_kz, $semester);
+ }
+
+ public function group($path_template, $stg, $semester, $verband)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
+
+ if ($verband === null) {
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" .
+ '"type": "verband",' .
+ '"id": "grp/%1$s/%2$s/%3$s",' .
+ '"gruppe_kurzbz": "%3$s",' .
+ '"semester": "%2$s",' .
+ '"verband": null,' .
+ '"gruppe": null,' .
+ '"lehrverband": false,' .
+ '"stg_kz": "%1$s"' .
+ "}', studiengang_kz, semester, gruppe_kurzbz)] AS draggable", false);
+
+ return $this->_ci->stglib->group($path_template, $stg->studiengang_kz, $semester);
+ }
+
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" .
+ '"type": "verband",' .
+ '"id": "lv/%1$s/%2$s/%3$s/%4$s",' .
+ '"gruppe_kurzbz": null,' .
+ '"semester": "%2$s",' .
+ '"verband": "%3$s",' .
+ '"gruppe": "%4$s",' .
+ '"lehrverband": true,' .
+ '"stg_kz": "%1$s"' .
+ "}', v.studiengang_kz, v.semester, v.verband, v.gruppe)] AS draggable", false);
+
+ return $this->_ci->stglib->verbandsgroup($path_template, $stg->studiengang_kz, $semester, $verband);
+ }
+
+ public function orgform($path_template, $stg)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ if (!$stg->mischform)
+ return [];
+
+ $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
+
+ return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz);
+ }
+
+ protected function getPermittedStudiengangKzs()
+ {
+ $permittedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('admin') ?: [];
+ $permittedStgs = array_merge($permittedStgs, $this->_ci->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
+
+ return $permittedStgs;
+ }
+
+ protected function getStgFromUrl($stg)
+ {
+ $permittedStgs = $this->getPermittedStudiengangKzs();
+
+ if (!$permittedStgs)
+ return null;
+
+ $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $permittedStgs);
+ $stg = $this->_ci->StudiengangModel->loadWhere([
+ 'LOWER(CONCAT(typ, kurzbz)) =' => $stg
+ ]);
+
+ if (!hasData($stg))
+ return null;
+
+ return current(getData($stg));
+ }
+}
diff --git a/application/libraries/treemenu/StudVwLib.php b/application/libraries/treemenu/StudVwLib.php
new file mode 100644
index 000000000..ee3e2cbdc
--- /dev/null
+++ b/application/libraries/treemenu/StudVwLib.php
@@ -0,0 +1,257 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * StudVw Menu library
+ */
+class StudVwLib
+{
+ protected $_ci = null;
+
+ public $config = [];
+
+ public $redirect_method = [
+ 'interessenten' => 'filter',
+ 'bewerbungnichtabgeschickt' => 'filter',
+ 'bewerbungabgeschickt' => 'filter',
+ 'zgv' => 'filter',
+ 'statusbestaetigt' => 'filter',
+ 'statusbestaetigtrtnichtangemeldet' => 'filter',
+ 'statusbestaetigtrtangemeldet' => 'filter',
+ 'reihungstestnichtangemeldet' => 'filter',
+ 'reihungstestangemeldet' => 'filter',
+ 'bewerber' => 'filter',
+ 'bewerberrtnichtangemeldet' => 'filter',
+ 'bewerberrtangemeldet' => 'filter',
+ 'bewerberrtangemeldetteilgenommen' => 'filter',
+ 'bewerberrtangemeldetnichtteilgenommen' => 'filter',
+ 'aufgenommen' => 'filter',
+ 'warteliste' => 'filter',
+ 'absage' => 'filter',
+ 'outgoing' => 'inout',
+ 'shared_studies' => 'inout'
+ ];
+
+ public function __construct()
+ {
+ // Get code igniter instance
+ $this->_ci =& get_instance();
+
+ // Load Tree-config
+ $this->_ci->load->config('treemenu/stg_base');
+ $this->config = $this->_ci->config->item('root');
+
+ // Load Libraries
+ $this->_ci->load->library('treemenu/base/StgLib');
+
+ // Load Model
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ }
+
+ public function stg($path_template)
+ {
+ $permittedStgs = $this->getPermittedStudiengangKzs();
+
+ if (!$permittedStgs)
+ return [];
+
+ return $this->_ci->stglib->studiengang($path_template, $permittedStgs);
+ }
+
+ public function prestudent($path_template, $stg)
+ {
+ // Check permission
+ if ($this->getStgFromUrl($stg) === null)
+ return [];
+
+ return [
+ [
+ 'path' => sprintf($path_template, '1'),
+ 'name' => ['lehre', 'prestudent'],
+ 'no_sem_reload' => true
+ ]
+ ];
+ }
+
+ public function stdsem($path_template, $stg)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ return $this->_ci->stglib->studiensemester($path_template, $stg->studiengang_kz);
+ }
+
+ public function semester($path_template, $stg, $orgform)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ if ($orgform !== null) {
+ $orgform = $this->getOrgform($orgform);
+ if ($orgform === null)
+ return [];
+ $orgform = $orgform->orgform_kurzbz;
+ }
+
+ return $this->_ci->stglib->semester($path_template, $stg->studiengang_kz, $orgform);
+ }
+
+ public function verband($path_template, $stg, $semester, $orgform)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ if ($orgform !== null) {
+ $orgform = $this->getOrgform($orgform);
+ if ($orgform === null)
+ return [];
+ $orgform = $orgform->orgform_kurzbz;
+ }
+
+ $this->_ci->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf");
+
+ return $this->_ci->stglib->verband($path_template, $stg->studiengang_kz, $semester, $orgform);
+ }
+
+ public function group($path_template, $stg, $semester, $verband, $orgform)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ if ($orgform !== null) {
+ $orgform = $this->getOrgform($orgform);
+ if ($orgform === null)
+ return [];
+ $orgform = $orgform->orgform_kurzbz;
+ }
+
+ $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
+
+ if ($verband === null)
+ return $this->_ci->stglib->group($path_template, $stg->studiengang_kz, $semester, $orgform);
+
+ return $this->_ci->stglib->verbandsgroup($path_template, $stg->studiengang_kz, $semester, $verband, $orgform);
+ }
+
+ public function orgform($path_template, $stg)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ if (!$stg->mischform)
+ return [];
+
+ return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz);
+ }
+
+ public function incoming($has_children, $path_template, $stg)
+ {
+ if ($stg === null)
+ return $this->inout('incoming', $has_children, $path_template);
+
+ return $this->filter('incoming', $has_children, $path_template, $stg);
+ }
+
+ public function filter($original_method, $has_children, $path_template, $stg)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ // TODO(chris): phrasen
+ $item = [
+ 'path' => sprintf($path_template, '1'),
+ 'name' => ['treemenu', 'filter_' . $original_method]
+ ];
+
+ if (!$has_children)
+ $item['leaf'] = true;
+
+ return [ $item ];
+ }
+
+ public function inout($original_method, $has_children, $path_template)
+ {
+ if (!$this->_ci->permissionlib->isBerechtigt('inout/uebersicht'))
+ return [];
+
+ // TODO(chris): phrasen
+ $item = [
+ 'path' => sprintf($path_template, '1'),
+ 'name' => ['treemenu', 'inout_' . $original_method]
+ ];
+
+ if (!$has_children)
+ $item['leaf'] = true;
+
+ return [ $item ];
+ }
+
+ protected function getOrgform($orgform)
+ {
+ $this->_ci->load->model('codex/Orgform_model', 'OrgformModel');
+ $orgform = $this->_ci->OrgformModel->loadWhere([
+ 'LOWER(orgform_kurzbz) =' => $orgform
+ ]);
+
+ if (!hasData($orgform))
+ return null;
+
+ return current(getData($orgform));
+ }
+
+ protected function getPermittedStudiengangKzs()
+ {
+ $permittedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('admin') ?: [];
+ $permittedStgs = array_merge($permittedStgs, $this->_ci->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
+
+ return $permittedStgs;
+ }
+
+ protected function getStgFromUrl($stg)
+ {
+ $permittedStgs = $this->getPermittedStudiengangKzs();
+
+ if (!$permittedStgs)
+ return null;
+
+ $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $permittedStgs);
+ $stg = $this->_ci->StudiengangModel->loadWhere([
+ 'LOWER(CONCAT(typ, kurzbz)) =' => $stg
+ ]);
+
+ if (!hasData($stg))
+ return null;
+
+ return current(getData($stg));
+ }
+}
diff --git a/application/libraries/treemenu/base/StgLib.php b/application/libraries/treemenu/base/StgLib.php
new file mode 100644
index 000000000..84665639d
--- /dev/null
+++ b/application/libraries/treemenu/base/StgLib.php
@@ -0,0 +1,313 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * Stg Base library
+ */
+class StgLib
+{
+ protected $_ci = null;
+
+ public function __construct()
+ {
+ // Get code igniter instance
+ $this->_ci =& get_instance();
+ }
+
+ public function studiengang($path_template, $permittedStgs = [])
+ {
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
+
+ $this->_ci->StudiengangModel->addDistinct();
+ $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($path_template) . ", LOWER(CONCAT(typ, kurzbz))) AS path");
+ $this->_ci->StudiengangModel->addSelect(
+ "CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name",
+ false
+ );
+ $this->_ci->StudiengangModel->addSelect("studiengang_kz AS title");
+ $this->_ci->StudiengangModel->addSelect("studiengang_kz AS search");
+ $this->_ci->StudiengangModel->addSelect('erhalter_kz');
+ $this->_ci->StudiengangModel->addSelect('typ');
+ $this->_ci->StudiengangModel->addSelect('kurzbz');
+ $this->_ci->StudiengangModel->addSelect('studiengang_kz');
+ $this->_ci->StudiengangModel->addSelect('studiengang_kz AS stg_kz');
+
+ $this->_ci->StudiengangModel->addOrder('erhalter_kz');
+ $this->_ci->StudiengangModel->addOrder('typ');
+ $this->_ci->StudiengangModel->addOrder('kurzbz');
+
+ if ($permittedStgs)
+ $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $permittedStgs);
+
+ $result = $this->_ci->StudiengangModel->loadWhere(['v.aktiv' => true]);
+
+ return getData($result) ?: [];
+ }
+
+ public function semester($path_template, $studiengang_kz, $orgform_kurzbz = null)
+ {
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
+
+ $this->_ci->StudiengangModel->addDistinct();
+ $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($path_template) . ", semester) AS path", false);
+ $this->_ci->StudiengangModel->addSelect("CONCAT(
+ UPPER(CONCAT(typ, kurzbz)),
+ '-',
+ semester,
+ (
+ SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END
+ FROM public.tbl_lehrverband
+ WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester
+ ORDER BY verband, gruppe LIMIT 1
+ )
+ ) AS name", false);
+
+ $this->_ci->StudiengangModel->addSelect('semester');
+ $this->_ci->StudiengangModel->addSelect('v.studiengang_kz AS stg_kz');
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink");
+
+ $this->_ci->StudiengangModel->addOrder('semester');
+
+ if ($orgform_kurzbz !== null) {
+ $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($orgform_kurzbz) . " AS orgform_kurzbz", false);
+ $this->_ci->StudiengangModel->addDistinct();
+ $this->_ci->StudiengangModel->db->group_start();
+ $this->_ci->StudiengangModel->db->where('v.semester', 0);
+ $this->_ci->StudiengangModel->db->or_where('v.orgform_kurzbz', $orgform_kurzbz);
+ $this->_ci->StudiengangModel->db->group_end();
+ }
+
+ $result = $this->_ci->StudiengangModel->loadWhere([
+ 'studiengang_kz' => $studiengang_kz,
+ 'v.aktiv' => true
+ ]);
+
+
+ return getData($result) ?: [];
+ }
+
+ public function group($path_template, $studiengang_kz, $semester, $orgform_kurzbz = null)
+ {
+ $this->_ci->load->model('organisation/Gruppe_model', 'GruppeModel');
+
+ $this->_ci->GruppeModel->addDistinct();
+ $this->_ci->GruppeModel->addSelect("FORMAT(" . $this->_ci->GruppeModel->escape($path_template) . ", gruppe_kurzbz) AS path", false);
+ $this->_ci->GruppeModel->addSelect("CONCAT(gruppe_kurzbz, ' (', bezeichnung, ')') AS name", false);
+
+ $this->_ci->GruppeModel->addSelect('sort');
+ $this->_ci->GruppeModel->addSelect('gruppe_kurzbz');
+ $this->_ci->GruppeModel->addSelect($this->_ci->GruppeModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
+ $this->_ci->GruppeModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink");
+
+ $this->_ci->GruppeModel->addOrder('sort');
+ $this->_ci->GruppeModel->addOrder('gruppe_kurzbz');
+
+ $where = [
+ 'studiengang_kz' => $studiengang_kz,
+ 'semester' => $semester,
+ 'lehre' => true,
+ 'sichtbar' => true,
+ 'aktiv' => true,
+ 'direktinskription' => false
+ ];
+
+ if ($orgform_kurzbz !== null)
+ $where['orgform_kurzbz'] = $orgform_kurzbz;
+
+ $result = $this->_ci->GruppeModel->loadWhere($where);
+
+ return getData($result) ?: [];
+ }
+
+ public function verband($path_template, $studiengang_kz, $semester, $orgform_kurzbz = null)
+ {
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
+
+ $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($path_template) . ", verband) AS path", false);
+ $this->_ci->StudiengangModel->addSelect("CONCAT(
+ UPPER(CONCAT(typ, kurzbz)),
+ '-',
+ semester,
+ verband,
+ (
+ SELECT
+ CASE
+ WHEN bezeichnung IS NULL OR bezeichnung=''
+ THEN ''::TEXT
+ ELSE CONCAT(' (', bezeichnung, ')')
+ END
+ FROM public.tbl_lehrverband
+ WHERE studiengang_kz=v.studiengang_kz
+ AND semester=v.semester
+ AND verband=v.verband
+ ORDER BY gruppe
+ LIMIT 1
+ )
+ ) AS name", false);
+
+ $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($semester) . ' AS semester');
+ $this->_ci->StudiengangModel->addSelect('verband');
+ $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink");
+
+ $this->_ci->StudiengangModel->addOrder('verband');
+
+ $this->_ci->StudiengangModel->addGroupBy('path, name, verband');
+
+ $where = [
+ 'v.studiengang_kz' => $studiengang_kz,
+ 'v.semester' => $semester,
+ 'v.verband !=' => '',
+ 'v.aktiv' => true
+ ];
+
+ if ($orgform_kurzbz !== null && $semester) // NOTE(chris): on semester 0 show all?
+ $where['v.orgform_kurzbz'] = $orgform_kurzbz;
+
+ $result = $this->_ci->StudiengangModel->loadWhere($where);
+
+ return getData($result) ?: [];
+ }
+
+ public function verbandsgroup($path_template, $studiengang_kz, $semester, $verband, $orgform_kurzbz = null)
+ {
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
+
+ $this->_ci->StudiengangModel->addDistinct();
+ $this->_ci->StudiengangModel->addSelect("FORMAT(
+ " . $this->_ci->StudiengangModel->escape($path_template) . ",
+ gruppe
+ ) AS path", false);
+ $this->_ci->StudiengangModel->addSelect("CONCAT(
+ UPPER(CONCAT(typ, kurzbz)),
+ '-',
+ semester,
+ verband,
+ gruppe,
+ (
+ SELECT
+ CASE
+ WHEN bezeichnung IS NULL OR bezeichnung=''
+ THEN ''::TEXT
+ ELSE CONCAT(' (', bezeichnung, ')')
+ END
+ FROM public.tbl_lehrverband
+ WHERE studiengang_kz=v.studiengang_kz
+ AND semester=v.semester
+ AND verband=v.verband
+ AND gruppe=v.gruppe
+ ORDER BY gruppe
+ LIMIT 1
+ )
+ ) AS name", false);
+
+ $this->_ci->StudiengangModel->addSelect('v.semester');
+ $this->_ci->StudiengangModel->addSelect('v.verband');
+ $this->_ci->StudiengangModel->addSelect('gruppe');
+ $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink");
+
+ $this->_ci->StudiengangModel->addOrder('gruppe');
+
+ $where = [
+ 'v.studiengang_kz' => $studiengang_kz,
+ 'v.semester' => $semester,
+ 'v.verband' => $verband,
+ 'v.gruppe !=' => '',
+ 'v.aktiv' => true
+ ];
+
+ if ($orgform_kurzbz !== null && $semester) // NOTE(chris): on semester 0 show all?
+ $where['v.orgform_kurzbz'] = $orgform_kurzbz;
+
+ $result = $this->_ci->StudiengangModel->loadWhere($where);
+
+ return getData($result) ?: [];
+ }
+
+ public function orgform($path_template, $studiengang_kz)
+ {
+ $this->_ci->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
+
+ $this->_ci->StudienordnungModel->addDistinct();
+ $this->_ci->StudienordnungModel->addSelect("FORMAT(
+ " . $this->_ci->StudienordnungModel->escape($path_template) . ",
+ LOWER(p.orgform_kurzbz)
+ ) AS path");
+ $this->_ci->StudienordnungModel->addSelect("p.orgform_kurzbz AS name");
+ $this->_ci->StudienordnungModel->addSelect("studiengang_kz AS stg_kz");
+
+ $this->_ci->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id');
+
+ $result = $this->_ci->StudienordnungModel->loadWhere([
+ 'aktiv' => true,
+ 'studiengang_kz' => $studiengang_kz,
+ 'p.orgform_kurzbz !=' => 'DDP'
+ ]);
+
+
+ return getData($result) ?: [];
+ }
+
+ public function studiensemester($path_template, $studiengang_kz)
+ {
+ $number_displayed_past_studiensemester = null;
+
+ $this->_ci->load->model('system/Variable_model', 'VariableModel');
+
+ $result = $this->_ci->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']);
+ if (isError($result))
+ return [];
+
+ $data = getData($result);
+ if ($data && isset($data['number_displayed_past_studiensemester'])) {
+ $number_displayed_past_studiensemester = $data['number_displayed_past_studiensemester'];
+ } else {
+ $this->_ci->load->config('stv');
+ $number_displayed_past_studiensemester = $this->_ci->config->item('number_displayed_past_studiensemester_default');
+ }
+
+ $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ $this->_ci->StudiensemesterModel->addPlusMinus(null, $number_displayed_past_studiensemester);
+
+ $this->_ci->StudiensemesterModel->addSelect("studiensemester_kurzbz AS name");
+ $this->_ci->StudiensemesterModel->addSelect("FORMAT(
+ " . $this->_ci->StudiensemesterModel->escape($path_template) . ",
+ LOWER(studiensemester_kurzbz)
+ ) AS path", false);
+ $this->_ci->StudiensemesterModel->addSelect($this->_ci->StudiensemesterModel->escape($studiengang_kz) . " AS stg_kz", false);
+
+ $this->_ci->StudiensemesterModel->addOrder('ende');
+
+ $result = $this->_ci->StudiensemesterModel->load();
+
+ return getData($result) ?: [];
+ }
+}
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/Gehaltsbestandteil.php b/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php
index 95bbdd908..869ed1c2b 100644
--- a/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php
+++ b/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php
@@ -13,6 +13,7 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
protected $dienstverhaeltnis_id;
protected $vertragsbestandteil_id;
protected $gehaltstyp_kurzbz;
+ protected $gehaltsanpassungtyp_kurzbz = '';
protected $von;
protected $bis;
protected $anmerkung;
@@ -21,6 +22,7 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
protected $valorisierungssperre;
protected $valorisierung;
protected $auszahlungen;
+ protected $gehaltstyp_bezeichnung;
protected $insertamum;
protected $insertvon;
@@ -39,6 +41,10 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
isset($data->dienstverhaeltnis_id) && $this->setDienstverhaeltnis_id($data->dienstverhaeltnis_id);
isset($data->vertragsbestandteil_id) && $this->setVertragsbestandteil_id($data->vertragsbestandteil_id);
isset($data->gehaltstyp_kurzbz) && $this->setGehaltstyp_kurzbz($data->gehaltstyp_kurzbz);
+ //isset($data->gehaltsanpassungtyp_kurzbz) && $this->setGehaltsanpassungtyp_kurzbz($data->gehaltsanpassungtyp_kurzbz);
+ if (!empty($data->gehaltsanpassungtyp_kurzbz)) {
+ $this->setGehaltsanpassungtyp_kurzbz($data->gehaltsanpassungtyp_kurzbz);
+ }
isset($data->von) && $this->setVon($data->von);
isset($data->bis) && $this->setBis($data->bis);
isset($data->anmerkung) && $this->setAnmerkung($data->anmerkung);
@@ -47,7 +53,8 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
isset($data->valorisierungssperre) && $this->setValorisierungssperre($data->valorisierungssperre);
isset($data->valorisierung) && $this->setValorisierung($data->valorisierung);
isset($data->auszahlungen) && $this->setAuszahlungen($data->auszahlungen);
-
+ isset($data->gehaltstyp_bezeichnung) && $this->setGehaltstyp_bezeichnung($data->gehaltstyp_bezeichnung);
+
isset($data->insertamum) && $this->setInsertamum($data->insertamum);
isset($data->insertvon) && $this->setInsertvon($data->insertvon);
isset($data->updateamum) && $this->setUpdateamum($data->updateamum);
@@ -75,6 +82,11 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
return $this->gehaltstyp_kurzbz;
}
+ public function getGehaltsanpassungtyp_kurzbz()
+ {
+ return $this->gehaltsanpassungtyp_kurzbz;
+ }
+
public function getVon()
{
return $this->von;
@@ -178,6 +190,13 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
return $this;
}
+ public function setGehaltsanpassungtyp_kurzbz($gehaltsanpassungtyp_kurzbz)
+ {
+ $this->markDirty('gehaltsanpassungtyp_kurzbz', $this->gehaltsanpassungtyp_kurzbz, $gehaltsanpassungtyp_kurzbz);
+ $this->gehaltsanpassungtyp_kurzbz = $gehaltsanpassungtyp_kurzbz;
+ return $this;
+ }
+
public function setVon($von)
{
$this->markDirty('von', $this->von, $von);
@@ -206,6 +225,10 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
$grundbetrag = number_format($grundbetrag, 2, '.', '');
}
$this->markDirty('grundbetrag', $this->grundbetrag, $grundbetrag);
+ if(in_array('grundbetrag', $this->modifiedcolumns))
+ {
+ $this->setBetrag_valorisiert($grundbetrag);
+ }
$this->grundbetrag = $grundbetrag;
return $this;
}
@@ -242,6 +265,13 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
return $this;
}
+ public function setGehaltstyp_bezeichnung($gehaltstyp_bezeichnung)
+ {
+ $this->markDirty('gehaltstyp_bezeichnung', $this->gehaltstyp_bezeichnung, $gehaltstyp_bezeichnung);
+ $this->gehaltstyp_bezeichnung = $gehaltstyp_bezeichnung;
+ return $this;
+ }
+
public function setInsertamum($insertamum)
{
$this->markDirty('insertamum', $this->insertamum, $insertamum);
@@ -284,6 +314,7 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
'dienstverhaeltnis_id' => $this->getDienstverhaeltnis_id(),
'vertragsbestandteil_id' => $this->getVertragsbestandteil_id(),
'gehaltstyp_kurzbz' => $this->getGehaltstyp_kurzbz(),
+ 'gehaltsanpassungtyp_kurzbz' => $this->getGehaltsanpassungtyp_kurzbz(),
'von' => $this->getVon(),
'bis' => $this->getBis(),
'anmerkung' => $this->getAnmerkung(),
@@ -312,6 +343,7 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
dienstverhaeltnis_id: {$this->getDienstverhaeltnis_id()}
vertragsbestandteil_id: {$this->getVertragsbestandteil_id()}
gehaltstyp_kurzbz: {$this->getGehaltstyp_kurzbz()}
+ gehaltsanpassungtyp_kurzbz: {$this->getGehaltsanpassungtyp_kurzbz()}
von: {$this->getVon()}
bis: {$this->getBis()}
anmerkung: {$this->getAnmerkung()}
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/codex/Bisio_model.php b/application/models/codex/Bisio_model.php
index 1cff1dc54..972661c8b 100644
--- a/application/models/codex/Bisio_model.php
+++ b/application/models/codex/Bisio_model.php
@@ -44,4 +44,110 @@ class Bisio_model extends DB_Model
else
return success("Bisio not found");
}
+
+ /**
+ * Gets outgoing students of certain Semester
+ * @param String studiensemester_kurzbz
+ * @return array of prestudent_ids
+ */
+ public function getOutgoingsOfSemester($studiensemester_kurzbz)
+ {
+ $query = "
+ SELECT DISTINCT ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis
+ FROM bis.tbl_bisio
+ JOIN public.tbl_student USING (student_uid)
+ JOIN public.tbl_prestudent ps USING (prestudent_id)
+ JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
+ JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
+ WHERE ss.studiensemester_kurzbz = ?
+ AND nation_code <> 'A'
+ AND (
+ tbl_bisio.von <= ss.ende
+ AND (
+ tbl_bisio.bis >= ss.start
+ OR tbl_bisio.bis IS NULL
+ )
+ )
+ ";
+
+ return $this->execQuery($query, array($studiensemester_kurzbz));
+ }
+
+ /**
+ * Gets incoming students of certain Semester
+ * @param String studiensemester_kurzbz
+ * @return array of prestudent_ids
+ */
+ public function getIncomingsOfSemester($studiensemester_kurzbz)
+ {
+ $query = "
+ SELECT DISTINCT ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis
+ FROM bis.tbl_bisio
+ JOIN public.tbl_student USING (student_uid)
+ JOIN public.tbl_prestudent ps USING (prestudent_id)
+ JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
+ JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
+ WHERE ss.studiensemester_kurzbz = ?
+ AND nation_code = 'A'
+ AND (
+ tbl_bisio.von <= ss.ende
+ AND (
+ tbl_bisio.bis >= ss.start
+ OR tbl_bisio.bis IS NULL
+ )
+ )
+ ";
+
+ return $this->execQuery($query, array($studiensemester_kurzbz));
+ }
+
+ public function isPrestudentOutgoing($studiensemester_kurzbz, $prestudent_id)
+ {
+ $query = "
+ SELECT
+ ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis
+ FROM bis.tbl_bisio
+ JOIN public.tbl_student USING (student_uid)
+ JOIN public.tbl_prestudent ps USING (prestudent_id)
+ JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
+ JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
+ WHERE ss.studiensemester_kurzbz = ?
+ AND nation_code <> 'A'
+ AND (
+ tbl_bisio.von <= ss.ende
+ AND (
+ tbl_bisio.bis >= ss.start
+ OR tbl_bisio.bis IS NULL
+ )
+ )
+ AND ps.prestudent_id = ?
+ ";
+
+ return $this->execQuery($query, array($studiensemester_kurzbz, $prestudent_id));
+ }
+
+ public function isPrestudentIncoming($studiensemester_kurzbz, $prestudent_id)
+ {
+ $query = "
+ SELECT
+ ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis
+ FROM bis.tbl_bisio
+ JOIN public.tbl_student USING (student_uid)
+ JOIN public.tbl_prestudent ps USING (prestudent_id)
+ JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
+ JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
+ WHERE ss.studiensemester_kurzbz = ?
+ AND nation_code = 'A'
+ AND (
+ tbl_bisio.von <= ss.ende
+ AND (
+ tbl_bisio.bis >= ss.start
+ OR tbl_bisio.bis IS NULL
+ )
+ )
+ AND ps.prestudent_id = ?
+ ";
+
+ return $this->execQuery($query, array($studiensemester_kurzbz, $prestudent_id));
+ }
}
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/crm/Dokument_model.php b/application/models/crm/Dokument_model.php
index 8008202c1..d292068d8 100644
--- a/application/models/crm/Dokument_model.php
+++ b/application/models/crm/Dokument_model.php
@@ -57,7 +57,7 @@ class Dokument_model extends DB_Model
$qry = " SELECT
a.akte_id,
- a.bezeichnung,
+ dok.bezeichnung,
a.dokument_kurzbz,
a.titel_intern,
a.anmerkung_intern,
@@ -83,6 +83,7 @@ class Dokument_model extends DB_Model
inhalt
FROM
public.tbl_akte a
+ JOIN public.tbl_dokument dok ON (dok.dokument_kurzbz = a.dokument_kurzbz)
WHERE
a.person_id = ?
AND a.dokument_kurzbz NOT IN (
diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php
index ab073996f..df8c1f983 100644
--- a/application/models/crm/Student_model.php
+++ b/application/models/crm/Student_model.php
@@ -204,7 +204,7 @@ class Student_model extends DB_Model
Events::trigger(
'generate_student_uid',
- function ($value) use ($uid) {
+ function ($value) use (&$uid) {
$uid = $value;
},
$stgkzl,
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/Lehreinheit_model.php b/application/models/education/Lehreinheit_model.php
index 2f955c295..808c4e443 100644
--- a/application/models/education/Lehreinheit_model.php
+++ b/application/models/education/Lehreinheit_model.php
@@ -719,7 +719,7 @@ EOSQL;
return "tag_data_agg AS (
SELECT
lehreinheit_id,
- COALESCE(json_agg(tag ORDER BY done), '[]'::json) AS tags
+ COALESCE(json_agg(tag ORDER BY done, prioritaet), '[]'::json) AS tags
FROM (
SELECT DISTINCT ON (public.tbl_notiz.notiz_id)
tbl_notiz.notiz_id AS id,
@@ -728,7 +728,9 @@ EOSQL;
text AS notiz,
style,
erledigt AS done,
- lehreinheit_id
+ lehreinheit_id,
+ prioritaet,
+ automatisiert
FROM public.tbl_notizzuordnung
JOIN public.tbl_notiz ON tbl_notizzuordnung.notiz_id = tbl_notiz.notiz_id
JOIN public.tbl_notiz_typ ON tbl_notiz.typ = tbl_notiz_typ.typ_kurzbz
diff --git a/application/models/education/Lehreinheitgruppe_model.php b/application/models/education/Lehreinheitgruppe_model.php
index dee8bbfe1..139d639cb 100644
--- a/application/models/education/Lehreinheitgruppe_model.php
+++ b/application/models/education/Lehreinheitgruppe_model.php
@@ -341,7 +341,7 @@ class Lehreinheitgruppe_model extends DB_Model
$this->db->where('lehreinheit_id', $lehreinheit_id);
$this->db->where('studiengang_kz', $gruppen_array->studiengang_kz);
- if (!isEmptyString($gruppen_array->semester))
+ if (!isEmptyString((string)$gruppen_array->semester))
{
$this->db->where('semester', $gruppen_array->semester);
}
@@ -444,30 +444,37 @@ class Lehreinheitgruppe_model extends DB_Model
)
ELSE tbl_gruppe.beschreibung
END AS beschreibung");
- $this->addSelect("CASE
- WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN
- (
- SELECT EXISTS (
- SELECT 1
- FROM lehre.tbl_stundenplandev
- WHERE lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
- AND studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
- AND semester = tbl_lehreinheitgruppe.semester
- AND TRIM(COALESCE(verband, '')) = TRIM(tbl_lehreinheitgruppe.verband)
- AND TRIM(COALESCE(gruppe, '')) = TRIM(tbl_lehreinheitgruppe.gruppe)
- AND (gruppe_kurzbz IS NULL OR gruppe_kurzbz = '')
- )
- )
- ELSE
+ $this->addSelect("
+ CASE
+ WHEN trim(COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, '')) = '' THEN
(
SELECT EXISTS (
SELECT 1
- FROM lehre.tbl_stundenplandev
- WHERE lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
- AND gruppe_kurzbz = tbl_lehreinheitgruppe.gruppe_kurzbz
+ FROM lehre.tbl_stundenplandev sp
+ WHERE sp.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
+ AND sp.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
+ AND sp.semester = tbl_lehreinheitgruppe.semester
+ AND trim(COALESCE(sp.verband, '')) = trim(COALESCE(tbl_lehreinheitgruppe.verband, ''))
+ AND trim(COALESCE(sp.gruppe, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe, ''))
+ AND trim(COALESCE(sp.gruppe_kurzbz, '')) = ''
)
)
- END AS verplant");
+ ELSE
+ (
+ SELECT EXISTS (
+ SELECT 1
+ FROM lehre.tbl_stundenplandev sp
+ WHERE sp.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
+ AND sp.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
+ AND sp.semester = tbl_lehreinheitgruppe.semester
+ AND trim(COALESCE(sp.verband, '')) = trim(COALESCE(tbl_lehreinheitgruppe.verband, ''))
+ AND trim(COALESCE(sp.gruppe, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe, ''))
+ AND trim(COALESCE(sp.gruppe_kurzbz, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, ''))
+ )
+ )
+ END AS verplant
+ ");
+
$this->addJoin('tbl_studiengang', 'studiengang_kz', 'LEFT');
$this->addJoin('public.tbl_gruppe', 'gruppe_kurzbz', 'LEFT');
diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php
index 5422c290e..bea676b98 100644
--- a/application/models/education/Lehrveranstaltung_model.php
+++ b/application/models/education/Lehrveranstaltung_model.php
@@ -1245,7 +1245,7 @@ class Lehrveranstaltung_model extends DB_Model
{
return "
SELECT
- lehrveranstaltung_id, tbl_lehrveranstaltung.kurzbz as lv_kurzbz, tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, bezeichnung_english as lv_bezeichnung_english, studiengang_kz,
+ distinct on (lehrveranstaltung_id) lehrveranstaltung_id, tbl_lehrveranstaltung.kurzbz as lv_kurzbz, tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, bezeichnung_english as lv_bezeichnung_english, studiengang_kz,
tbl_studienplan_lehrveranstaltung.semester, tbl_lehrveranstaltung.sprache,
ects as lv_ects, semesterstunden, anmerkung, lehre, lehreverzeichnis as lv_lehreverzeichnis, tbl_lehrveranstaltung.aktiv,
planfaktor as lv_planfaktor, planlektoren as lv_planlektoren, planpersonalkosten as lv_planpersonalkosten,
diff --git a/application/models/education/Lvgesamtnote_model.php b/application/models/education/Lvgesamtnote_model.php
index c30045ff0..0a7638869 100644
--- a/application/models/education/Lvgesamtnote_model.php
+++ b/application/models/education/Lvgesamtnote_model.php
@@ -29,10 +29,14 @@ class Lvgesamtnote_model extends DB_Model
$this->addSelect("lv.bezeichnung AS lehrveranstaltung_bezeichnung");
$this->addSelect("lv.studiengang_kz");
$this->addSelect("UPPER(stg.typ || stg.kurzbz) AS studiengang");
+ $this->addSelect("person.vorname");
+ $this->addSelect("person.nachname");
$this->addJoin("lehre.tbl_note n", "note");
$this->addJoin("lehre.tbl_lehrveranstaltung lv", "lehrveranstaltung_id");
$this->addJoin("public.tbl_studiengang stg", "studiengang_kz");
+ $this->addJoin("public.tbl_benutzer benutzer", "uid = student_uid", "LEFT");
+ $this->addJoin("public.tbl_person person", "person_id", "LEFT");
$this->db->where($this->dbTable . ".freigabedatum <", "NOW()", false);
diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php
index be42b7660..99b9b75f1 100644
--- a/application/models/education/Paabgabe_model.php
+++ b/application/models/education/Paabgabe_model.php
@@ -79,10 +79,10 @@ class Paabgabe_model extends DB_Model
JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
JOIN public.tbl_person USING (person_id)
- WHERE (campus.tbl_paabgabe.insertamum >= NOW() - INTERVAL ?
- OR campus.tbl_paabgabe.updateamum >= NOW() - INTERVAL ?)
- AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
-
+ WHERE (campus.tbl_paabgabe.insertamum::date = CURRENT_DATE - INTERVAL ?
+ OR campus.tbl_paabgabe.updateamum::date = CURRENT_DATE - INTERVAL ?)
+ AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
+
return $this->execQuery($query, [$interval, $interval, $relevantTypes]);
}
@@ -108,7 +108,7 @@ class Paabgabe_model extends DB_Model
JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL
- AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ?";
+ AND campus.tbl_paabgabe.abgabedatum = CURRENT_DATE - INTERVAL ?";
if($relevantTypes !== null) {
$query .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
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..c18d18053 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');
@@ -187,6 +188,7 @@ class Studierendenantrag_model extends DB_Model
* Get the studiengang and ausbildungssemester the student was in
* for the studiensemester the antrag was committed for
*
+ *
* @param integer $antrag_id
*
* @return stdClass
@@ -241,6 +243,28 @@ class Studierendenantrag_model extends DB_Model
);
}
+ /**
+ * Get the studiengang and the studienplan the student is in
+ *
+ * @param integer $antrag_id
+ *
+ * @return stdClass
+ */
+ public function getStgAndDetails($antrag_id)
+ {
+ $this->addSelect('p.studiengang_kz');
+ $this->addSelect('stg.orgform_kurzbz');
+ $this->addSelect('stg.bezeichnung');
+ $this->addJoin('public.tbl_prestudent p', 'prestudent_id');
+ $this->addJoin('public.tbl_studiengang stg', 'studiengang_kz');
+
+ $this->addLimit(1);
+
+ return $this->load(
+ $antrag_id
+ );
+ }
+
public function getStgEmail($antrag_id)
{
$this->addJoin('public.tbl_prestudent p', 'prestudent_id');
@@ -269,6 +293,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/education/Zeugnisnote_model.php b/application/models/education/Zeugnisnote_model.php
index f32713dec..694c5d5c0 100644
--- a/application/models/education/Zeugnisnote_model.php
+++ b/application/models/education/Zeugnisnote_model.php
@@ -148,7 +148,7 @@ class Zeugnisnote_model extends DB_Model
*
* @return object
*/
- public function getZeugnisnoten($student_uid, $studiensemester_kurzbz)
+ public function getZeugnisnoten($student_uid, $studiensemester_kurzbz, $lehrveranstaltung_id = null)
{
$params = array();
$where='';
@@ -163,6 +163,11 @@ class Zeugnisnote_model extends DB_Model
$where.=" AND vw_student_lehrveranstaltung.studiensemester_kurzbz= ?";
$params[] = $studiensemester_kurzbz;
}
+ if($lehrveranstaltung_id != null)
+ {
+ $where .= " AND vw_student_lehrveranstaltung.lehrveranstaltung_id = ?";
+ $params[] = $lehrveranstaltung_id;
+ }
$where2='';
@@ -176,6 +181,11 @@ class Zeugnisnote_model extends DB_Model
$where2 .= " AND studiensemester_kurzbz= ?";
$params[] = $studiensemester_kurzbz;
}
+ if($lehrveranstaltung_id != null)
+ {
+ $where2 .=" AND lehrveranstaltung_id = ?";
+ $params[] = $lehrveranstaltung_id;
+ }
$qry = "SELECT
a.*,
@@ -188,7 +198,10 @@ class Zeugnisnote_model extends DB_Model
lv.semester AS semester_lv,
lv.ects AS ects_lv,
lv.zeugnis,
- lv.bezeichnung_english AS lehrveranstaltung_bezeichnung_english
+ lv.bezeichnung_english AS lehrveranstaltung_bezeichnung_english,
+ s.verband,
+ person.vorname,
+ person.nachname
FROM (
SELECT vw_student_lehrveranstaltung.lehrveranstaltung_id, uid,
vw_student_lehrveranstaltung.studiensemester_kurzbz, note, punkte, uebernahmedatum, benotungsdatum,
@@ -231,6 +244,8 @@ class Zeugnisnote_model extends DB_Model
ORDER BY sort
) a
LEFT JOIN public.tbl_student s ON (a.uid = s.student_uid)
+ LEFT JOIN public.tbl_benutzer benutzer ON benutzer.uid = s.student_uid
+ LEFT JOIN public.tbl_person person ON benutzer.person_id = person.person_id
LEFT JOIN public.tbl_studiengang stg1 ON (s.studiengang_kz = stg1.studiengang_kz)
LEFT JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
LEFT JOIN public.tbl_studiengang stg2 ON (lv.studiengang_kz = stg2.studiengang_kz)";
diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php
index 1db658596..db0996319 100644
--- a/application/models/organisation/Studiengang_model.php
+++ b/application/models/organisation/Studiengang_model.php
@@ -457,6 +457,7 @@ class Studiengang_model extends DB_Model
*/
public function getLeitung($studiengang_kz = null)
{
+ $this->addDistinct();
$this->addSelect('uid, studiengang_kz, oe_kurzbz, vorname, nachname, email, titelpre, titelpost, alias');
$this->addJoin('public.tbl_benutzerfunktion', 'oe_kurzbz');
$this->addJoin('public.tbl_benutzer', 'uid');
diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php
index 5fa6ffb14..1b480771f 100644
--- a/application/models/organisation/Studiensemester_model.php
+++ b/application/models/organisation/Studiensemester_model.php
@@ -122,6 +122,47 @@ class Studiensemester_model extends DB_Model
return $this->execQuery($query, array($studiensemester_kurzbz, $limit));
}
+
+ /**
+ * Returns the current study semester and the previous semesters of the same type (SS/WS).
+ *
+ * Example:
+ * - SS2026, limit 3: SS2026, SS2025, SS2024
+ * - WS2025, limit 2: WS2025, WS2024
+ *
+ * @param $studiensemester_kurzbz
+ * @param $limit
+ */
+ public function getPreviousSameSemesterFrom($studiensemester_kurzbz, $limit = 1)
+ {
+ $qry = '
+ SELECT
+ studiensemester_kurzbz,
+ start,
+ ende
+ FROM
+ public.tbl_studiensemester
+ WHERE
+ SUBSTRING(studiensemester_kurzbz FROM 1 FOR 2) = SUBSTRING(? FROM 1 FOR 2)
+ AND start <= (
+ SELECT start
+ FROM public.tbl_studiensemester
+ WHERE studiensemester_kurzbz = ?
+ )
+ ORDER BY
+ start DESC
+ LIMIT ?
+ ';
+
+ return $this->execQuery($qry,
+ [
+ $studiensemester_kurzbz,
+ $studiensemester_kurzbz,
+ $limit
+ ]
+ );
+ }
+
/**
* getNearest
*/
@@ -188,6 +229,82 @@ class Studiensemester_model extends DB_Model
return $this->execQuery($query, array($date,$date,$date,$date));
}
+ /**
+ * Gets all Studiensemester where the range dates are contained
+ * or the nearest if date is not contained
+ * @param $from
+ * @param $to
+ * @return array|null
+ */
+ public function getContainingOrNearestByDateRange($from, $to)
+ {
+ if (date_format(date_create($from), 'Y-m-d') > (date_format(date_create($to), 'Y-m-d')))
+ return success(array());
+
+ $query = <<db->escape($from)}::date BETWEEN s.start AND s.ende
+ ORDER BY
+ s.start DESC
+ LIMIT 1
+ ),
+ semester_interval_enddate AS (
+ SELECT
+ s.*
+ FROM
+ public.tbl_studiensemester s
+ WHERE
+ {$this->db->escape($to)}::date BETWEEN s.start AND s.ende
+ ORDER BY
+ s.start DESC
+ LIMIT 1
+ ),
+ nearest_semester_interval_startdate AS (
+ SELECT
+ LEAST(ABS(s.start - {$this->db->escape($from)}::date), ABS(s.ende - {$this->db->escape($from)}::date)) AS mindiff,
+ s.*
+ FROM
+ public.tbl_studiensemester s
+ WHERE
+ s.ende < {$this->db->escape($from)}::date
+ ORDER BY
+ 1 ASC
+ LIMIT 1
+ ),
+ nearest_semester_interval_enddate AS (
+ SELECT
+ LEAST(ABS(s.start - {$this->db->escape($to)}::date), ABS(s.ende - {$this->db->escape($to)}::date)) AS mindiff,
+ s.*
+ FROM
+ public.tbl_studiensemester s
+ WHERE
+ s.start > {$this->db->escape($to)}::date
+ ORDER BY
+ 1 ASC
+ LIMIT 1
+ )
+ SELECT
+ COALESCE(
+ (SELECT studiensemester_kurzbz FROM semester_interval_startdate),
+ (SELECT studiensemester_kurzbz FROM nearest_semester_interval_startdate)
+ ) AS studiensemester_kurzbz
+ UNION
+ SELECT
+ COALESCE(
+ (SELECT studiensemester_kurzbz FROM semester_interval_enddate),
+ (SELECT studiensemester_kurzbz FROM nearest_semester_interval_enddate)
+ ) AS studiensemester_kurzbz
+
+EOSQL;
+
+ return $this->execReadonlyQuery($query);
+ }
+
/**
* Gets all Studiensemester between two dates
* @param $from
diff --git a/application/models/person/Benutzerfunktion_model.php b/application/models/person/Benutzerfunktion_model.php
index dff422b7d..52236ba7c 100644
--- a/application/models/person/Benutzerfunktion_model.php
+++ b/application/models/person/Benutzerfunktion_model.php
@@ -260,7 +260,6 @@ class Benutzerfunktion_model extends DB_Model
return $this->execQuery($query, $parameters_array);
}
-
/**
* Get active Kompetenzfeldleitung bei UID.
*
@@ -296,7 +295,6 @@ class Benutzerfunktion_model extends DB_Model
return $this->execQuery($query, $parameters_array);
}
-
public function insertBenutzerfunktion($Json)
{
unset($Json['benutzerfunktion_id']);
@@ -350,5 +348,64 @@ class Benutzerfunktion_model extends DB_Model
return success($funktionJson);
}
+ /**
+ * Gets all Prestudents with details for a given Benutzerfunktion and optionally semester
+ *
+ * @param String $studiensemester_kurzbz
+ * @return object |null
+ */
+ public function getPrestudentsOfJgv($semester)
+ {
+ $query = "
+ SELECT DISTINCT ps.prestudent_id, bf.datum_von, bf.datum_bis
+ FROM public.tbl_benutzerfunktion bf
+ JOIN public.tbl_benutzer bn USING (uid)
+ JOIN public.tbl_prestudent ps USING (person_id)
+ JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
+ JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
+ WHERE ss.studiensemester_kurzbz = ?
+ AND bf.funktion_kurzbz = 'jgv'
+ AND (
+ bf.datum_von <= ss.ende
+ AND (
+ bf.datum_bis >= ss.start
+ OR bf.datum_bis IS NULL
+ )
+ )
+ ";
+
+ return $this->execQuery($query, array($semester));
+ }
+
+ /**
+ * Checks if a certain prestudent has the Benutzerfunktion jgv for a certain semester
+ *
+ * @param String $studiensemester_kurzbz
+ * @param $prestudent_id
+ * @return object |null
+ */
+ public function isJgv($semester, $prestudent_id)
+ {
+ $query = "
+ SELECT ps.prestudent_id, ss.start as von, ss.ende as bis
+ FROM public.tbl_benutzerfunktion bf
+ JOIN public.tbl_benutzer bn USING (uid)
+ JOIN public.tbl_prestudent ps USING (person_id)
+ JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
+ JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
+ WHERE ss.studiensemester_kurzbz = ?
+ AND bf.funktion_kurzbz = 'jgv'
+ AND (
+ bf.datum_von <= ss.ende
+ AND (
+ bf.datum_bis >= ss.start
+ OR bf.datum_bis IS NULL
+ )
+ )
+ AND ps.prestudent_id = ?
+ ";
+
+ return $this->execQuery($query, array($semester, $prestudent_id));
+ }
}
diff --git a/application/models/person/Notiz_model.php b/application/models/person/Notiz_model.php
index 6a7533a8f..de3900d2b 100644
--- a/application/models/person/Notiz_model.php
+++ b/application/models/person/Notiz_model.php
@@ -303,4 +303,59 @@ class Notiz_model extends DB_Model
return $this->loadWhere(array('anrechnung_id' => $anrechnung_id));
}
+
+ /**
+ * check if a given Tag for a certain notizzuordnung id is valid
+ *
+ * @param $tag typ_kurzbz to check
+ * @param $typeId typeId to check
+ * @param $id id to check
+ * @param $von start of time period or NULL
+ * @param $bis end of time period or NULL
+ *
+ * @return array
+ */
+ public function checkIfExistingTag($tag, $typeId, $id, $von=null, $bis=null)
+ {
+ $query = "
+ SELECT *
+ FROM public.tbl_notiz
+ JOIN public.tbl_notizzuordnung nz USING (notiz_id)
+ WHERE typ = ?
+ AND {$typeId} = ?
+ AND (
+ start IS NULL
+ OR ende IS NULL
+ OR (start <= ? AND ende >= ?)
+ )
+ ";
+
+ return $this->execQuery($query, [$tag, $id, $bis, $von]);
+ }
+
+ /**
+ * returns all existing tags of a certain tag within a time period
+ *
+ * @param $tag typ_kurzbz of tag
+ * @param $von start of time period or NULL
+ * @param $bis end of time period or NULL
+ *
+ * @return array
+ */
+ public function getAllTags($tag, $von=null, $bis=null)
+ {
+ $query = "
+ SELECT *
+ FROM public.tbl_notiz
+ JOIN public.tbl_notizzuordnung nz USING (notiz_id)
+ WHERE typ = ?
+ AND (
+ start IS NULL
+ OR ende IS NULL
+ OR (start <= ? AND ende >= ?)
+ );
+ ";
+
+ return $this->execQuery($query, array($tag, $bis, $von));
+ }
}
diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php
index e72b24de4..c893c51de 100644
--- a/application/models/person/Person_model.php
+++ b/application/models/person/Person_model.php
@@ -149,7 +149,7 @@ class Person_model extends DB_Model
* @param $filter Term to search for.
* @return DB-result
*/
- public function searchPerson($filter)
+ public function searchPerson($filter, $mode=null)
{
$this->addSelect('vorname, nachname, gebdatum, person_id, titelpre, titelpost');
$this->addSelect("CASE
@@ -161,6 +161,26 @@ class Person_model extends DB_Model
THEN 'Student'
ELSE 'Person'
END AS status");
+
+ if($mode == 'mitMaUid')
+ {
+ $this->addSelect("(
+ SELECT m.mitarbeiter_uid
+ FROM public.tbl_benutzer b
+ JOIN public.tbl_mitarbeiter m
+ ON b.uid = m.mitarbeiter_uid
+ WHERE b.person_id = tbl_person.person_id
+ LIMIT 1
+ )
+ AS uid");
+ $this->addOrder('uid, lower(nachname), lower(vorname)');
+ }
+ else
+ {
+ $this->addOrder('lower(nachname), lower(vorname)');
+ }
+
+
$result = $this->loadWhere(
'lower(nachname) like '.$this->db->escape('%'.mb_strtolower($filter).'%')."
OR lower(vorname) like ".$this->db->escape('%'.$filter.'%')."
@@ -433,4 +453,33 @@ class Person_model extends DB_Model
return $this->execReadOnlyQuery($qry, [$person_id]);
}
+
+ //just a test function for a person_id tag
+ //alle personen die innerhalb dieses Zeitraumens 55 werden
+ public function getFiftyFivers($von, $bis)
+ {
+ $qry = "
+ SELECT
+ p.person_id
+ FROM public.tbl_person p
+ WHERE p.gebdatum >= DATE ? - INTERVAL '55 years'
+ AND p.gebdatum <= DATE ? - INTERVAL '55 years';
+ ";
+ return $this->execReadOnlyQuery($qry, [$von, $bis]);
+ }
+
+ //just a test function for a person_id tag
+ //check if Person gets 55 in this time
+ public function isFiftyFive($von, $bis, $person_id)
+ {
+ $qry = "
+ SELECT
+ p.person_id
+ FROM public.tbl_person p
+ WHERE p.gebdatum >= DATE ? - INTERVAL '55 years'
+ AND p.gebdatum <= DATE ? - INTERVAL '55 years'
+ AND p.persond_id = ?;
+ ";
+ return $this->execReadOnlyQuery($qry, [$von, $bis, $person_id]);
+ }
}
diff --git a/application/models/ressource/Reservierung_model.php b/application/models/ressource/Reservierung_model.php
index 0c391ea20..d96fe2f6f 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,10 +129,21 @@ 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]);
}
+ public function lektorHasReservierung($uid, $datum, $stunde)
+ {
+ $qry = "SELECT reservierung_id, uid, stg_kurzbz, ort_kurzbz, semester, verband, gruppe, gruppe_kurzbz, datum, stunde
+ FROM lehre.vw_reservierung
+ WHERE uid = ?
+ AND datum = ?
+ AND stunde = ?";
+
+ return $this->execReadOnlyQuery($qry, [$uid, $datum, $stunde]);
+ }
+
}
diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php
index d0a97ed9d..0f51e4b71 100644
--- a/application/models/ressource/Stundenplan_model.php
+++ b/application/models/ressource/Stundenplan_model.php
@@ -333,6 +333,68 @@ class Stundenplan_model extends DB_Model
", [$start_date, $end_date, $lv_id]);
}
+ public function getStundenplanLE($lehreinheit, $start_date, $end_date, $stundenplan)
+ {
+ $qry = "
+ WITH lehreinheiten AS (
+ SELECT lehreinheit_id FROM lehre.tbl_lehreinheit WHERE lehreinheit_id = ?
+ ), " . $this->getStundenplanCTE($stundenplan) . "
+ SELECT *
+ FROM stundenplanentries
+ ";
+
+ return $this->execReadOnlyQuery($qry, array($lehreinheit, $start_date, $end_date));
+ }
+
+ public function getStundenplanLV($lehrveranstaltung_id, $start_date, $end_date, $stundenplan)
+ {
+ $qry = "
+ WITH lehreinheiten AS (
+ SELECT lehreinheit_id
+ FROM lehre.tbl_lehreinheit
+ JOIN tbl_studiensemester USING(studiensemester_kurzbz)
+ WHERE lehrveranstaltung_id = ?
+ AND tbl_studiensemester.start >= ? AND tbl_studiensemester.ende <= ?
+ ), " . $this->getStundenplanCTE($stundenplan) . "
+ SELECT *
+ FROM stundenplanentries
+ ";
+
+ return $this->execReadOnlyQuery($qry, array($lehrveranstaltung_id, $start_date, $end_date, $start_date, $end_date));
+ }
+
+ private function getStundenplanCTE($stundenplan)
+ {
+ return "entries AS (
+ SELECT
+ datum, min(stunde) as stunde_beginn, max(stunde) as stunde_ende,
+ array_agg(DISTINCT(
+ CASE WHEN gruppe_kurzbz is not null THEN gruppe_kurzbz
+ ELSE (UPPER(stg_typ || stg_kurzbz) || COALESCE(semester,'0') || COALESCE(verband,'') || COALESCE(gruppe,''))
+ END)) as gruppen_kuerzel,
+ array_agg(DISTINCT CONCAT(vorname || ' ' || nachname)) as lektorname,
+ array_agg(DISTINCT stundenplan.ort_kurzbz) as ort_kurzbz,
+ array_agg(DISTINCT titel) as titel,
+ lehrfach_bez, stundenplan.lehreinheit_id, lehrveranstaltung_id
+ FROM lehre.vw_$stundenplan as stundenplan
+ JOIN public.tbl_mitarbeiter ON stundenplan.uid = tbl_mitarbeiter.mitarbeiter_uid
+ JOIN tbl_benutzer ON tbl_mitarbeiter.mitarbeiter_uid = tbl_benutzer.uid
+ JOIN tbl_person USING(person_id)
+ JOIN lehreinheiten ON stundenplan.lehreinheit_id = lehreinheiten.lehreinheit_id
+ WHERE datum >= ? AND datum <= ?
+ GROUP BY datum, unr, stundenplan.lehreinheit_id, lehrveranstaltung_id, lehrfach_bez, lehrfach_bez
+ ORDER BY datum, min(stunde), unr, lehreinheit_id
+ ),
+ stundenplanentries AS (
+ SELECT
+ entries.*,
+ stundeb.beginn AS beginn,
+ stundee.ende AS ende
+ FROM entries
+ JOIN lehre.tbl_stunde stundeb ON stundeb.stunde = entries.stunde_beginn
+ JOIN lehre.tbl_stunde stundee ON stundee.stunde = entries.stunde_ende
+ )";
+ }
/**
* queries Stundenplan and filters by assigned ma_kurzbz, very similar to get by LVA
*
@@ -388,6 +450,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.
@@ -464,11 +604,17 @@ class Stundenplan_model extends DB_Model
{
foreach($semester_date_range as $sem_date => $sem_date_range)
{
- if(!array_key_exists($sem_date,$studentlehrverbaende) || count($studentlehrverbaende[$sem_date]) == 0)
+ if(!array_key_exists($sem,$studentlehrverbaende) || count($studentlehrverbaende[$sem]) == 0)
{
continue;
}
- foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband)
+ $studlvbds = array_filter(
+ $studentlehrverbaende[$sem],
+ function($value) use ($sem_date) {
+ return $value->studiensemester_kurzbz === $sem_date;
+ }
+ );
+ foreach($studlvbds as $key=>$lehrverband)
{
$query .= "(((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
// Eintraege fuer den ganzen Verband
diff --git a/application/models/ressource/Stundenplandev_model.php b/application/models/ressource/Stundenplandev_model.php
index e718ba073..355283b90 100644
--- a/application/models/ressource/Stundenplandev_model.php
+++ b/application/models/ressource/Stundenplandev_model.php
@@ -241,4 +241,15 @@ class Stundenplandev_model extends DB_Model
return $this->delete(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
}
+
+ public function lektorHasStundenplandevEintrag($uid, $datum, $stunde)
+ {
+ $qry = "SELECT stundenplandev_id, lektor, stg_kurzbz, ort_kurzbz, semester, verband, gruppe, gruppe_kurzbz, datum, stunde
+ FROM lehre.vw_stundenplandev
+ WHERE uid = ?
+ AND datum = ?
+ AND stunde = ?";
+
+ return $this->execReadOnlyQuery($qry, [$uid, $datum, $stunde]);
+ }
}
diff --git a/application/models/ressource/Zeitsperre_model.php b/application/models/ressource/Zeitsperre_model.php
index 078d29d8b..50ba4cb1d 100644
--- a/application/models/ressource/Zeitsperre_model.php
+++ b/application/models/ressource/Zeitsperre_model.php
@@ -61,4 +61,40 @@ class Zeitsperre_model extends DB_Model
return $this->execQuery($qry);
}
+
+ public function checkIfZeitsperreExists($uid, $datum, $stunde)
+ {
+ $this->db->select("*");
+
+ $this->db->where('mitarbeiter_uid', $uid);
+ $this->db->where('zeitsperretyp_kurzbz !=', 'ZVerfueg');
+
+ $this->db->group_start();
+
+ $this->db->where('vondatum <', $datum);
+ $this->db->or_group_start();
+ $this->db->where('vondatum', $datum);
+ $this->db->group_start();
+ $this->db->where('vonstunde <=', $stunde);
+ $this->db->or_where('vonstunde IS NULL', null, false);
+ $this->db->group_end();
+ $this->db->group_end();
+ $this->db->group_end();
+
+
+ $this->db->group_start();
+ $this->db->where('bisdatum >', $datum);
+ $this->db->or_group_start();
+ $this->db->where('bisdatum', $datum);
+ $this->db->group_start();
+ $this->db->where('bisstunde >=', $stunde);
+ $this->db->or_where('bisstunde IS NULL', null, false);
+ $this->db->group_end();
+
+ $this->db->group_end();
+ $this->db->group_end();
+
+ return $this->load();
+
+ }
}
diff --git a/application/models/tabulator/Tabulator_preset_model.php b/application/models/tabulator/Tabulator_preset_model.php
new file mode 100644
index 000000000..a3c45739d
--- /dev/null
+++ b/application/models/tabulator/Tabulator_preset_model.php
@@ -0,0 +1,83 @@
+dbTable = 'public.tbl_tabulator_presets';
+ $this->pk = ['preset_id'];
+ $this->hasSequence = true;
+
+
+ $this->load->model('person/Benutzer_model', 'BenutzerModel');
+ }
+
+ public function getTabulatorPreset($presetId)
+ {
+ $query = "
+ SELECT *
+ FROM public.tbl_tabulator_presets
+ WHERE preset_id = ?
+ LIMIT 1
+ ";
+ return $this->execQuery($query, array($presetId));
+ }
+
+ public function getTabulatorPresetsByUserAndTable($uid, $tableName)
+ {
+ $query = '
+ SELECT *
+ FROM public.tbl_tabulator_presets
+ WHERE benutzer_uid = ?
+ AND table_name = ?
+ ORDER BY preset_id ASC
+ ';
+ return $this->execQuery($query, array($uid, $tableName));
+ }
+
+ public function createTabulatorPreset($uid, $tableName, $presetName, $preset)
+ {
+ $presetCreationResult = $this->insert([
+ "benutzer_uid" => $uid,
+ "table_name" => $tableName,
+ "preset_name" => $presetName,
+ "preset_json" => json_encode($preset),
+ ]);
+
+ if (isError($presetCreationResult))
+ {
+ return error('Something went wrong during preset creation!');
+ }
+
+ return success($presetCreationResult->retval);
+ }
+
+ public function updateTabulatorPreset($presetId, $preset)
+ {
+ $presetUpdateResult = $this->update(["preset_id" => $presetId], ["preset_json" => json_encode($preset)]);
+
+ if (isError($presetUpdateResult))
+ {
+ return error('Something went wrong during preset update!');
+ }
+
+ return success($presetUpdateResult->retval);
+ }
+
+ public function deleteTabulatorPreset($presetId)
+ {
+ $presetDeletionReseult = $this->delete(["preset_id" => $presetId]);
+
+ if (isError($presetDeletionReseult))
+ {
+ return error('Something went wrong during preset deletion!');
+ }
+
+ return success($presetDeletionReseult->retval);
+ }
+
+}
diff --git a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php
index 2669105a1..3918e98e1 100644
--- a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php
+++ b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php
@@ -41,6 +41,7 @@ with gbt as (
gb.anmerkung,
gb.dienstverhaeltnis_id,
gb.gehaltstyp_kurzbz,
+ gb.gehaltsanpassungtyp_kurzbz,
gb.valorisierungssperre,
gb.valorisierung,
gb.grundbetrag as grund_betrag_decrypted,
@@ -76,11 +77,13 @@ select
gbt.anmerkung,
gbt.dienstverhaeltnis_id,
gbt.gehaltstyp_kurzbz,
+ gbt.gehaltsanpassungtyp_kurzbz,
gbt.valorisierungssperre,
gbt.valorisierung,
gbt.grund_betrag_decrypted,
gbt.betrag_val_decrypted,
gt.bezeichnung as gehaltstyp_bezeichnung,
+ ga.bezeichnung as gehaltsanpassungtyp_bezeichnung,
vb.vertragsbestandteiltyp_kurzbz,
bf.funktion_kurzbz,
bf.oe_kurzbz,
@@ -93,6 +96,8 @@ from
gbt
LEFT JOIN
hr.tbl_gehaltstyp gt using(gehaltstyp_kurzbz)
+LEFT JOIN
+ hr.tbl_gehaltsanpassungtyp ga using(gehaltsanpassungtyp_kurzbz)
LEFT JOIN
hr.tbl_vertragsbestandteil vb using(vertragsbestandteil_id)
LEFT JOIN
@@ -177,7 +182,8 @@ LEFT JOIN
$stichtagclause .= ')';
}
- $this->addSelect('*');
+ $this->addSelect('tbl_gehaltsbestandteil.*, tbl_gehaltstyp.bezeichnung AS gehaltstyp_bezeichnung');
+ $this->addJoin('hr.tbl_gehaltstyp', 'gehaltstyp_kurzbz');
$where = <<escape($dienstverhaeltnis_id)}
{$stichtagclause}
@@ -202,6 +208,7 @@ SELECT
g.dienstverhaeltnis_id,
g.vertragsbestandteil_id,
g.gehaltstyp_kurzbz,
+ g.gehaltsanpassungtyp_kurzbz,
g.von,
g.bis,
g.anmerkung,
@@ -213,9 +220,11 @@ SELECT
g.updateamum,
g.updatevon,
g.valorisierung,
- g.auszahlungen
+ g.auszahlungen,
+ gt.bezeichnung AS gehaltstyp_bezeichnung
FROM
- hr.tbl_gehaltsbestandteil g
+ hr.tbl_gehaltsbestandteil g
+ JOIN hr.tbl_gehaltstyp gt USING (gehaltstyp_kurzbz)
LEFT JOIN
hr.tbl_valorisierung_historie vh ON vh.gehaltsbestandteil_id = g.gehaltsbestandteil_id AND vh.valorisierungsdatum = (
SELECT
@@ -263,7 +272,7 @@ EOSQL;
// Note: replaced gb.betrag_valorisiert with vh.betrag_valorisiert!
$qry = "
SELECT
- gb.gehaltsbestandteil_id,gb.dienstverhaeltnis_id,gb.vertragsbestandteil_id,gb.gehaltstyp_kurzbz,
+ gb.gehaltsbestandteil_id,gb.dienstverhaeltnis_id,gb.vertragsbestandteil_id,gb.gehaltstyp_kurzbz,gb.gehaltsanpassungtyp_kurzbz,
gb.von,gb.bis,gb.anmerkung,gb.grundbetrag as grundbetrag,gb.valorisierungssperre,gb.insertamum,
gb.insertvon,gb.updateamum,gb.updatevon,gb.valorisierung,gb.auszahlungen,
vh.valorisierungsdatum, vh.betrag_valorisiert as betrag_valorisiert
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);
?>
-
+
diff --git a/application/views/jssnippets/tabulatorcolumns.js b/application/views/jssnippets/tabulatorcolumns.js
new file mode 100644
index 000000000..44667e45b
--- /dev/null
+++ b/application/views/jssnippets/tabulatorcolumns.js
@@ -0,0 +1,19 @@
+let result = [];
+let current;
+
+
+
+current = (tabulatorcolumns => {
+load->view($path); ?>
+})(result);
+
+if (current) {
+ if (Array.isArray(current))
+ result = result.concat(current);
+ else
+ result.push(current);
+}
+
+
+
+export default result;
\ No newline at end of file
diff --git a/application/views/jssnippets/tabulatorcolumns/lvverwaltung.js b/application/views/jssnippets/tabulatorcolumns/lvverwaltung.js
new file mode 100644
index 000000000..9b7c44212
--- /dev/null
+++ b/application/views/jssnippets/tabulatorcolumns/lvverwaltung.js
@@ -0,0 +1,264 @@
+return [
+ {
+ title: 'kurzbz',
+ titlePhrase: 'lehre/kurzbz',
+ field: "lv_kurzbz",
+ headerFilterFuncParams: { field: 'lv_kurzbz' },
+ headerFilter: true,
+ formatter(cell, formatterParams) {
+ const rowData = cell.getRow().getData();
+ const iconKey = (rowData.lehrtyp_kurzbz || '').toLowerCase();
+ const lvkurzbz = (cell.getValue()).toUpperCase();
+
+ const parentspan = document.createElement('span');
+ const span = document.createElement('span');
+
+ span.classList.add('lv_table_icon', `icon-${iconKey}`);
+ span.title = iconKey || 'LV-Teil';
+
+ parentspan.appendChild(span);
+ parentspan.appendChild(document.createTextNode(` ${lvkurzbz}`));
+
+ return parentspan;
+ },
+ cellClick(e, cell) {
+ cell.getRow().treeToggle();
+ }
+ },
+ {
+ title: 'Tags',
+ field: 'tags',
+ tooltip: false,
+ headerFilter: "input",
+ headerFilterFunc: "tagHeaderFilter",
+ headerFilterFuncParams: { field: 'tags' },
+ formatter: "tagFormatter",
+ width: 150,
+ },
+ {
+ title: 'lehrveranstaltung_id',
+ titlePhrase: 'lehre/lehrveranstaltung_id',
+ field: "lehrveranstaltung_id",
+ headerFilterFuncParams: { field: 'lehrveranstaltung_id' },
+ headerFilter: true,
+ visible: false
+ },
+ {
+ title: 'bezeichnung',
+ titlePhrase: 'ui/bezeichnung',
+ field: "lv_bezeichnung",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'lv_bezeichnung' }
+ },
+ {
+ title: 'bezeichnungeng',
+ titlePhrase: 'lehre/bezeichnungeng',
+ field: "lv_bezeichnung_english",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'lv_bezeichnung_english' },
+ visible: false
+ },
+ {
+ title: 'studiengangskennzahlLehre',
+ titlePhrase: 'lehre/studiengangskennzahlLehre',
+ field: "lv_studiengang_kz",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'lv_studiengang_kz' },
+ visible: false
+ },
+ {
+ title: 'studiengang',
+ titlePhrase: 'lehre/studiengang',
+ field: "studiengang",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'studiengang' },
+ visible: false
+ },
+ {
+ title: 'semester',
+ titlePhrase: 'lehre/semester',
+ field: "semester",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'semester' }
+ },
+ {
+ title: 'sprache',
+ titlePhrase: 'global/sprache',
+ field: "sprache",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'sprache' },
+ visible: false
+ },
+ {
+ title: 'ects',
+ titlePhrase: 'lehre/ects',
+ field: "lv_ects",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'lv_ects' },
+ visible: false
+ },
+ {
+ title: 'semesterstunden',
+ titlePhrase: 'lehre/semesterstunden',
+ field: "semesterstunden",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'semesterstunden' },
+ visible: false
+ },
+ {
+ title: 'anmerkung',
+ titlePhrase: 'global/anmerkung',
+ field: "anmerkung",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'anmerkung' },
+ visible: false
+ },
+ {
+ title: 'lehre',
+ titlePhrase: 'lehre/lehre',
+ field: "lehre",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'lehre' },
+ formatter: 'ja_nein',
+ visible: false
+ },
+ {
+ title: 'aktiv',
+ titlePhrase: 'person/aktiv',
+ field: "aktiv",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'aktiv' },
+ formatter: 'ja_nein',
+ visible: false
+ },
+ {
+ title: 'organisationsform',
+ titlePhrase: 'lehre/organisationsform',
+ field: "orgform_kurzbz",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'orgform_kurzbz' }
+ },
+ {
+ title: 'studienplan_id',
+ titlePhrase: 'ui/studienplan_id',
+ field: "studienplan_id",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'studienplan_id' },
+ visible: false
+ },
+ {
+ title: 'studienplan',
+ titlePhrase: 'lehre/studienplan',
+ field: "studienplan_bezeichnung",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'studienplan_bezeichnung' },
+ visible: false
+ },
+ {
+ title: 'lehrtyp',
+ titlePhrase: 'lehre/lehrtyp',
+ field: "lehrtyp_kurzbz",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'lehrtyp_kurzbz' },
+ visible: false
+ },
+ {
+ title: 'lehrform',
+ titlePhrase: 'lehre/lehrform',
+ field: "lehrform_kurzbz",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'lehrform_kurzbz'} },
+ {
+ title: 'leplanstunden',
+ titlePhrase: 'lehre/leplanstunden',
+ field: "le_planstunden",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'le_planstunden' },
+ visible: false
+ },
+ {
+ title: 'lehreinheit_id',
+ titlePhrase: 'lehre/lehreinheit_id',
+ field: "lehreinheit_id",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'lehreinheit_id' },
+ visible: false
+ },
+ {
+ title: 'studiensemester',
+ titlePhrase: 'lehre/studiensemester',
+ field: "studiensemester_kurzbz",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'studiensemester_kurzbz' },
+ visible: false
+ },
+ {
+ title: 'unr',
+ titlePhrase: 'lehre/unr',
+ field: "unr",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'unr' },
+ visible: false
+ },
+ {
+ title: 'organisationseinheit',
+ titlePhrase: 'lehre/organisationseinheit',
+ field: "fachbereich",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'fachbereich' },
+ visible: false
+ },
+ {
+ title: 'stundenblockung',
+ titlePhrase: 'lehre/stundenblockung',
+ field: "stundenblockung",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'stundenblockung' },
+ visible: false
+ },
+ {
+ title: 'wochenrhythmus',
+ titlePhrase: 'lehre/wochenrhythmus',
+ field: "wochenrythmus",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'wochenrythmus' },
+ visible: false
+ },
+ {
+ title: 'startkw',
+ titlePhrase: 'lehre/startkw',
+ field: "start_kw",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'startkw' },
+ visible: false
+ },
+ {
+ title: 'raumtyp',
+ titlePhrase: 'lehre/raumtyp',
+ field: "raumtyp",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'raumtyp' },
+ visible: false
+ },
+ {
+ title: 'raumtypalternativ',
+ titlePhrase: 'lehre/raumtypalternativ',
+ field: "raumtypalternativ",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'raumtypalternativ' },
+ visible: false
+ },
+ {
+ title: 'gruppen',
+ titlePhrase: 'lehre/gruppen',
+ field: "gruppen",
+ headerFilter: true,
+ headerFilterFuncParams: { field: 'gruppen'} },
+ {
+ title: 'lehrende',
+ titlePhrase: 'lehre/lehrende',
+ field: "lektoren",
+ headerFilter: true,
+ headerFilterFuncParams: { field: ['lektoren', 'vorname', 'nachname'] }
+ },
+];
diff --git a/application/views/jssnippets/tabulatorcolumns/stv.js b/application/views/jssnippets/tabulatorcolumns/stv.js
new file mode 100644
index 000000000..8270defe1
--- /dev/null
+++ b/application/views/jssnippets/tabulatorcolumns/stv.js
@@ -0,0 +1,343 @@
+return [
+ {
+ title: "UID",
+ titlePhrase: 'person/uid',
+ field: "uid",
+ headerFilter: true
+ },
+ {
+ title: "TitelPre",
+ titlePhrase: 'person/titelpre',
+ field: "titelpre",
+ headerFilter: "list",
+ headerFilterParams: {
+ valuesLookup: true,
+ listOnEmpty: true,
+ autocomplete: true,
+ sort: "asc"
+ }
+ },
+ {
+ title: "Nachname",
+ titlePhrase: 'person/nachname',
+ field: "nachname",
+ headerFilter: true
+ },
+ {
+ title: "Vorname",
+ titlePhrase: 'person/vorname',
+ field: "vorname",
+ headerFilter: true
+ },
+ {
+ title: "Wahlname",
+ titlePhrase: 'person/wahlname',
+ field: "wahlname",
+ visible: false,
+ headerFilter: true
+ },
+ {
+ title: "Vornamen",
+ titlePhrase: 'person/vornamen',
+ field: "vornamen",
+ visible: false,
+ headerFilter: true
+ },
+ {
+ title: "TitelPost",
+ titlePhrase: 'person/titelpost',
+ field: "titelpost",
+ headerFilter: "list",
+ headerFilterParams: {
+ valuesLookup: true,
+ listOnEmpty: true,
+ autocomplete: true,
+ sort: "asc"
+ }
+ },
+ {
+ title: "Ersatzkennzeichen",
+ titlePhrase: 'person/ersatzkennzeichen',
+ field: "ersatzkennzeichen",
+ headerFilter: true
+ },
+ {
+ title: "Geburtsdatum",
+ titlePhrase: 'person/geburtsdatum',
+ field: "gebdatum",
+ formatter: 'datetime',
+ formatterParams: {
+ inputFormat: "iso",
+ outputFormat: "dd.MM.yyyy",
+ invalidPlaceholder: " ",
+ timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone
+ },
+ headerFilter: 'input',
+ headerFilterFunc: 'dateinput'
+ },
+ {
+ title: "Geschlecht",
+ titlePhrase: 'person/geschlecht',
+ field: "geschlecht",
+ headerFilter: "list",
+ headerFilterParams: {
+ values: {
+ 'm': 'männlich',
+ 'w': 'weiblich',
+ 'x': 'divers',
+ 'u': 'unbekannt'
+ },
+ listOnEmpty: true,
+ autocomplete: true
+ }
+ },
+ {
+ title: "Sem.",
+ titlePhrase: 'lehre/sem',
+ field: "semester_berechnet",
+ headerFilter: "list",
+ headerFilterParams: {
+ valuesLookup: true,
+ listOnEmpty: true,
+ autocomplete: true,
+ sort: "asc"
+ }
+ },
+ {
+ title: "Verb.",
+ titlePhrase: 'lehre/verb',
+ field: "verband",
+ headerFilter: "list",
+ headerFilterParams: {
+ valuesLookup: true,
+ listOnEmpty: true,
+ autocomplete: true,
+ sort: "asc"
+ }
+ },
+ {
+ title: "Grp.",
+ titlePhrase: 'lehre/grp',
+ field: "gruppe",
+ headerFilter: "list",
+ headerFilterParams: {
+ valuesLookup: true,
+ listOnEmpty: true,
+ autocomplete: true,
+ sort: "asc"
+ }
+ },
+ {
+ title: "Studiengang",
+ titlePhrase: 'lehre/studiengang',
+ field: "studiengang",
+ headerFilter: "list",
+ headerFilterParams: {
+ valuesLookup: true,
+ listOnEmpty: true,
+ autocomplete: true,
+ sort: "asc"
+ }
+ },
+ {
+ title: "Studiengang_kz",
+ titlePhrase: 'lehre/studiengang_kz',
+ field: "studiengang_kz",
+ visible: false,
+ headerFilter: true
+ },
+ {
+ title: "Personenkennzeichen",
+ titlePhrase: 'person/personenkennzeichen',
+ field: "matrikelnr",
+ headerFilter: true
+ },
+ {
+ title: "PersonID",
+ titlePhrase: 'person/person_id',
+ field: "person_id",
+ headerFilter: true
+ },
+ {
+ title: "Status",
+ titlePhrase: 'global/status',
+ field: "status",
+ headerFilter: "list",
+ headerFilterParams: {
+ valuesLookup: true,
+ listOnEmpty: true,
+ autocomplete: true,
+ sort: "asc"
+ }
+ },
+ {
+ title: "Status Datum",
+ titlePhrase: 'profilUpdate/statusDate',
+ field: "status_datum",
+ visible: false,
+ formatter: 'datetime',
+ formatterParams: {
+ inputFormat: "iso",
+ outputFormat: "dd.MM.yyyy",
+ invalidPlaceholder: " ",
+ timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone
+ }
+ },
+ {
+ title: "Status Bestaetigung",
+ titlePhrase: 'global/status_bestaetigung',
+ field: "status_bestaetigung",
+ visible: false,
+ formatter: 'datetime',
+ formatterParams: {
+ inputFormat: "iso",
+ outputFormat: "dd.MM.yyyy",
+ invalidPlaceholder: " ",
+ timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone
+ },
+ headerFilter: 'input',
+ headerFilterFunc: 'dateinput'
+ },
+ {
+ title: "EMail (Privat)",
+ titlePhrase: 'person/email_private',
+ field: "mail_privat",
+ visible: false,
+ headerFilter: true
+ },
+ {
+ title: "EMail (Intern)",
+ titlePhrase: 'person/email_intern',
+ field: "mail_intern",
+ visible: false,
+ headerFilter: true
+ },
+ {
+ title: "Anmerkungen",
+ titlePhrase: 'stv/notes_person',
+ field: "anmerkungen",
+ visible: false,
+ headerFilter: true
+ },
+ {
+ title: "AnmerkungPre",
+ titlePhrase: 'stv/notes_prestudent',
+ field: "anmerkung",
+ visible: false,
+ headerFilter: true
+ },
+ {
+ title: "OrgForm",
+ titlePhrase: 'lehre/orgform',
+ field: "orgform_kurzbz",
+ headerFilter: "list",
+ headerFilterParams: {
+ valuesLookup: true,
+ listOnEmpty: true,
+ autocomplete: true,
+ sort: "asc"
+ }
+ },
+ {
+ title: "Aufmerksamdurch",
+ titlePhrase: 'person/aufmerksamDurch',
+ field: "aufmerksamdurch_kurzbz",
+ visible: false
+ },
+ {
+ title: "Gesamtpunkte",
+ titlePhrase: 'admission/gesamtpunkte',
+ field: "punkte",
+ visible: false
+ },
+ {
+ title: "Aufnahmegruppe",
+ titlePhrase: 'stv/aufnahmegruppe_kurzbz',
+ field: "aufnahmegruppe_kurzbz",
+ visible: false
+ },
+ {
+ title: "Dual",
+ titlePhrase: 'lehre/dual_short',
+ field: "dual",
+ visible: false,
+ formatter: 'tickCross',
+ formatterParams: {
+ tickElement: '
',
+ crossElement: '
'
+ },
+ headerFilter: "tickCross",
+ headerFilterParams: {
+ tristate: true,
+ elementAttributes: {
+ value: "true"
+ }
+ },
+ headerFilterEmptyCheck(value) {
+ return value === null
+ }
+ },
+ {
+ title: "Matrikelnummer",
+ titlePhrase: 'person/matrikelnummer',
+ field: "matr_nr",
+ visible: false,
+ headerFilter: true
+ },
+ {
+ title: "Studienplan",
+ titlePhrase: 'lehre/studienplan',
+ field: "studienplan_bezeichnung",
+ headerFilter: "list",
+ headerFilterParams: {
+ valuesLookup: true,
+ listOnEmpty: true,
+ autocomplete: true,
+ sort: "asc"
+ }
+ },
+ {
+ title: "PreStudentInnenID",
+ titlePhrase: 'ui/prestudent_id',
+ field: "prestudent_id",
+ headerFilter: true
+ },
+ {
+ title: "Priorität",
+ titlePhrase: 'lehre/prioritaet',
+ field: "priorisierung_relativ"
+ },
+ {
+ title: "Mentor",
+ titlePhrase: 'stv/mentor',
+ field: "mentor",
+ visible: false
+ },
+ {
+ title: "Aktiv",
+ titlePhrase: 'person/aktiv',
+ field: "bnaktiv",
+ visible: false,
+ formatter: 'tickCross',
+ formatterParams: {
+ allowEmpty: true,
+ tickElement: '
',
+ crossElement: '
'
+ },
+ headerFilter: "tickCross",
+ headerFilterParams: {
+ tristate: true,
+ elementAttributes: {
+ value: "true"
+ }
+ },
+ headerFilterEmptyCheck(value) {
+ return value === null
+ }
+ },
+ {
+ title: "Unruly",
+ field: "unruly",
+ visible: false
+ }
+];
diff --git a/application/views/lehre/Antrag/Leitung/List.php b/application/views/lehre/Antrag/Leitung/List.php
index 1225b16b6..e7d3a47f1 100644
--- a/application/views/lehre/Antrag/Leitung/List.php
+++ b/application/views/lehre/Antrag/Leitung/List.php
@@ -44,6 +44,7 @@ $this->load->view(
diff --git a/application/views/lehre/Antrag/Student/List.php b/application/views/lehre/Antrag/Student/List.php
index 6d769dafe..884d1f391 100644
--- a/application/views/lehre/Antrag/Student/List.php
+++ b/application/views/lehre/Antrag/Student/List.php
@@ -30,6 +30,12 @@ if(defined('CIS4')){
}
?>
+load->config('studierendenantrag');
+ $showInfoModalAbmeldung = $this->config->item('showInfoModalAbmeldung');
+?>
+