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 31cc7b027..b0e96989c 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';
$route['api/frontend/v1/lvplan/calendar-events'] = 'api/frontend/v1/LvPlanCalendarEvents/getCalendarData';
@@ -127,6 +145,8 @@ $route['lvplan/caldav/.*'] = 'LvPlanCalDAV';
// load routes from extensions, also look for environment-specific configs
$subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT . '/extensions'];
+$route['api/frontend/v1/tempus/Tags/getTagsByCalendar/(:num)'] = 'api/frontend/v1/tempus/Tags/getTagsByCalendar/$1';
+
foreach($subdirs as $subdir)
{
if(is_dir($subdir))
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/tempus.php b/application/config/tempus.php
index e3e18b954..833f5655f 100644
--- a/application/config/tempus.php
+++ b/application/config/tempus.php
@@ -2,4 +2,11 @@
$config['send_update_mails'] = false;
$config['calendar_start'] = 7;
-$config['calendar_end'] = 23;
\ No newline at end of file
+$config['calendar_end'] = 23;
+
+
+$config['tempus_tags'] = [
+ 'prioone' => ['readonly' => false],
+ 'priotwo' => ['readonly' => true],
+ 'hinweis' => ['readonly' => false],
+];
\ No newline at end of file
diff --git a/application/config/treemenu.php b/application/config/treemenu.php
new file mode 100644
index 000000000..d2ee26546
--- /dev/null
+++ b/application/config/treemenu.php
@@ -0,0 +1,34 @@
+.
+ */
+
+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"]
+];
+
+$config['tempus'] = [
+ "library" => "treemenu/TempusLib",
+ "permissions" => ["admin:r", "assistenz:r", "lehre/lvplan: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/custom/tempus.php b/application/config/treemenu/custom/tempus.php
new file mode 100644
index 000000000..977c0459e
--- /dev/null
+++ b/application/config/treemenu/custom/tempus.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/Tempus.php b/application/controllers/Tempus.php
index 139f0b690..f0e2623c3 100644
--- a/application/controllers/Tempus.php
+++ b/application/controllers/Tempus.php
@@ -16,25 +16,54 @@ class Tempus extends Auth_Controller
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
-
+
// Load Config
$this->load->config('calendar');
}
- /**
- * @return void
- */
- public function _remap()
+ public function index()
{
+ $this->_loadView();
+ }
+ public function sync()
+ {
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ $this->load->model('organisation/Studienplan_model', 'StudienplanModel');
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
+ $this->load->model('ressource/Kalenderstatus_model', 'KalenderStatusModel');
+
+ $this->OrganisationseinheitModel->addJoin('tbl_studiengang', 'oe_kurzbz', 'LEFT');
+
+ $this->OrganisationseinheitModel->addSelect('public.tbl_organisationseinheit.organisationseinheittyp_kurzbz,
+ public.tbl_organisationseinheit.bezeichnung,
+ public.tbl_studiengang.studiengang_kz,
+ public.tbl_organisationseinheit.oe_kurzbz,
+ tbl_studiengang.typ,
+ COALESCE(public.tbl_studiengang.bezeichnung, \'\') as stgbezeichnung');
+ $this->OrganisationseinheitModel->addOrder('tbl_organisationseinheit.aktiv', 'DESC');
+ $this->OrganisationseinheitModel->addOrder('tbl_organisationseinheit.organisationseinheittyp_kurzbz');
+ $organisationen = getData($this->OrganisationseinheitModel->loadWhere(array("tbl_organisationseinheit.aktiv" => true)));
+
+
+ $this->StudiensemesterModel->addOrder('start', 'DESC');
+ $studiensemestern = getData($this->StudiensemesterModel->load());
+
+ $this->_loadView(array('organisationen' => $organisationen, 'studiensemestern' => $studiensemestern));
+ }
+
+ private function _loadView($extraVariables = [])
+ {
$this->load->view('Tempus', [
'permissions' => [
- 'admin' => $this->permissionlib->isBerechtigt('admin')
+ 'admin' => $this->permissionlib->isBerechtigt('admin'),
+ 'stundenraster' => $this->permissionlib->isBerechtigt('basis/tempus_stundenraster'),
],
- 'variables' => [
+ 'variables' => array_merge([
'semester_aktuell' => $this->variablelib->getVar('semester_aktuell'),
'timezone' => $this->config->item('timezone')
- ]
+ ], $extraVariables)
]);
}
-}
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php
index 43dc18d1c..759c32d58 100644
--- a/application/controllers/api/frontend/v1/Abgabe.php
+++ b/application/controllers/api/frontend/v1/Abgabe.php
@@ -35,9 +35,12 @@ class Abgabe extends FHCAPI_Controller
'getStudentProjektabgaben' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'),
'postStudentProjektarbeitZwischenabgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'),
'postStudentProjektarbeitEndupload' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'),
+ 'postStudentProjektarbeitTitel' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'),
'getMitarbeiterProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
'postProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
+ 'patchProjektarbeitAbgabeMultiple' => array('basis/abgabe_assistenz:rw'),
'deleteProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
+ 'deleteProjektarbeitAbgabeMultiple' => array('basis/abgabe_assistenz:rw'),
'postSerientermin' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
'fetchDeadlines' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
'getPaAbgabetypen' => self::PERM_LOGGED,
@@ -46,7 +49,9 @@ class Abgabe extends FHCAPI_Controller
'getStudiengaenge' => array('basis/abgabe_assistenz:rw'),
'getStudentProjektarbeitAbgabeFile' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
'postStudentProjektarbeitZusatzdaten' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
- 'getSignaturStatusForProjektarbeitAbgaben' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw')
+ 'getSignaturStatusForProjektarbeitAbgaben' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
+ 'sendZweitbetreuerTokenMail' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
+ 'fetchProjektarbeitenHistory' => array('basis/abgabe_assistenz:rw')
]);
$this->load->library('PhrasesLib');
@@ -90,6 +95,7 @@ class Abgabe extends FHCAPI_Controller
$ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT');
$ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER = $this->config->item('ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER');
$BETREUER_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('BETREUER_SAMMELMAIL_BUTTON_STUDENT');
+ $MULTIEDIT_TABLE = $this->config->item('MULTIEDIT_TABLE');
$ret = array(
'old_abgabe_beurteilung_link' => $old_abgabe_beurteilung_link,
@@ -98,6 +104,7 @@ class Abgabe extends FHCAPI_Controller
'ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT' => $ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT,
'ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER' => $ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER,
'BETREUER_SAMMELMAIL_BUTTON_STUDENT' => $BETREUER_SAMMELMAIL_BUTTON_STUDENT,
+ 'MULTIEDIT_TABLE' => $MULTIEDIT_TABLE,
);
$this->terminateWithSuccess($ret);
@@ -107,10 +114,18 @@ class Abgabe extends FHCAPI_Controller
* loads config related to abgabetool for students to avoid handing out links reserved for employees
*/
public function getConfigStudent() {
- $moodle_link =$this->config->item('STG_MOODLE_LINK');
-
+ $moodle_link = $this->config->item('STG_MOODLE_LINK');
+ $title_edit_allowed = $this->config->item('STUDENT_EDIT_PROJEKTARBEIT_TITLE');
+ $confetti_on_endupload = $this->config->item('CONFETTI_ON_ENDUPLOAD');
+ $siginfolink_german = $this->config->item('SIGNATUR_INFO_LINK_GERMAN');
+ $siginfolink_english = $this->config->item('SIGNATUR_INFO_LINK_ENGLISH');
+
$ret = array(
'moodle_link' => $moodle_link,
+ 'title_edit_allowed' => $title_edit_allowed,
+ 'confetti_on_endupload' => $confetti_on_endupload,
+ 'siginfolink_german' => $siginfolink_german,
+ 'siginfolink_english' => $siginfolink_english
);
$this->terminateWithSuccess($ret);
@@ -146,23 +161,26 @@ class Abgabe extends FHCAPI_Controller
}
$data = getData($res)[0];
$student_uid = $data->uid;
-
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
- if(getAuthUID() == $student_uid || $zugeordnet) {
- $projektarbeitIsCurrent = false;
- $returnFunc = function ($result) use (&$projektarbeitIsCurrent) {
- $projektarbeitIsCurrent = $result;
- };
- Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc);
-
- $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id);
-
- foreach ($ret->retval as $termin) {
- $this->checkAbgabeSignatur($termin, $projektarbeit->student_uid);
- }
-
- $this->terminateWithSuccess(array($ret, $projektarbeitIsCurrent));
+ $studiengang_kz = $data->studiengang_kz;
+
+ if(!$this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]));
}
+
+ $projektarbeitIsCurrent = false;
+ $returnFunc = function ($result) use (&$projektarbeitIsCurrent) {
+ $projektarbeitIsCurrent = $result;
+ };
+ Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc);
+
+ $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id);
+
+ foreach ($ret->retval as $termin) {
+ $this->checkAbgabeSignatur($termin, $projektarbeit->student_uid);
+ }
+
+ $this->terminateWithSuccess(array($ret, $projektarbeitIsCurrent));
+
}
/**
@@ -188,7 +206,7 @@ class Abgabe extends FHCAPI_Controller
$result = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer(getAuthUID());
}
- $projektarbeiten = getData($result);
+ $projektarbeiten = hasData($result) ? getData($result) : array();
if(count($projektarbeiten)) {
foreach($projektarbeiten as $pa) {
@@ -275,6 +293,8 @@ class Abgabe extends FHCAPI_Controller
if(count($data) > 0) {
$pa->zweitbetreuer = $data[0];
}
+
+ $pa->zweitbetreuer_mail = $this->getProjektbetreuerEmailByPersonID($pa->zweitbetreuer_person_id);
}
}
}
@@ -293,55 +313,62 @@ class Abgabe extends FHCAPI_Controller
$projektarbeit_id = $this->input->post('projektarbeit_id');
$paabgabe_id = $this->input->post('paabgabe_id');
- $student_uid = $this->input->post('student_uid');
- $bperson_id = $this->input->post('bperson_id');
$paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz');
if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
|| $paabgabe_id === NULL || trim((string)$paabgabe_id) === ''
- || $student_uid === NULL || trim((string)$student_uid) === ''
|| $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '') {
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
}
$this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
- if(getAuthUID() == $student_uid || $zugeordnet) {
+ if(!$this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]));
+ }
+ $path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
- $path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
-
- if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) {
- move_uploaded_file($_FILES['file']['tmp_name'], $path);
-
- if(file_exists($path)) {
-
- chmod($path, 0640);
-
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
- $res = $this->PaabgabeModel->update($paabgabe_id, array(
- 'abgabedatum' => date('Y-m-d'),
- 'updatevon' => getAuthUID(),
- 'updateamum' => date('Y-m-d H:i:s')
- ));
-
- $this->logLib->logInfoDB(array('zwischenupload',$res, array(
- 'abgabedatum' => date('Y-m-d'),
- 'updatevon' => getAuthUID(),
- 'updateamum' => date('Y-m-d H:i:s')
- ), getAuthUID(), getAuthPersonId(), $student_uid));
-
- $this->terminateWithSuccess($res);
- } else {
- $this->terminateWithError('Error moving File', 'general');
- }
-
+ if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) {
+ move_uploaded_file($_FILES['file']['tmp_name'], $path);
+
+ if(file_exists($path)) {
+
+ chmod($path, 0640);
+
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+ $res = $this->PaabgabeModel->update($paabgabe_id, array(
+ 'abgabedatum' => date('Y-m-d'),
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ));
+
+ $this->logLib->logInfoDB(array('zwischenupload',$res, array(
+ 'abgabedatum' => date('Y-m-d'),
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ), getAuthUID(), getAuthPersonId(), $student_uid));
+
+ $this->terminateWithSuccess($res);
} else {
- $this->terminateWithError('File missing', 'general');
+ $this->terminateWithError('Error moving File', 'general');
}
+
} else {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'));
+ $this->terminateWithError('File missing', 'general');
}
}
@@ -355,7 +382,6 @@ class Abgabe extends FHCAPI_Controller
$projektarbeit_id = $this->input->post('projektarbeit_id');
$paabgabe_id = $this->input->post('paabgabe_id');
- $student_uid = $this->input->post('student_uid');
$sprache = $this->input->post('sprache');
$abstract = $this->input->post('abstract');
$abstract_en = $this->input->post('abstract_en');
@@ -367,7 +393,6 @@ class Abgabe extends FHCAPI_Controller
if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
|| $paabgabe_id === NULL || trim((string)$paabgabe_id) === ''
- || $student_uid === NULL || trim((string)$student_uid) === ''
|| $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === ''
|| $abstract === NULL || $abstract_en === NULL
|| $schlagwoerter === NULL || $schlagwoerter_en === NULL
@@ -379,76 +404,317 @@ class Abgabe extends FHCAPI_Controller
$this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
- if(getAuthUID() == $student_uid || $zugeordnet) {
- if ((isset($_FILES) and isset($_FILES['file']) and !$_FILES['file']['error'])) {
- move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf');
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ if(!$this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]));
+ }
- if (file_exists(PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf')) {
+ if ((isset($_FILES) and isset($_FILES['file']) and !$_FILES['file']['error'])) {
+ move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf');
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ if (file_exists(PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf')) {
- $result = $this->ProjektarbeitModel->load($projektarbeit_id);
- $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general');
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
- if (count($projektarbeitArr) > 0) {
- $projektarbeit = $projektarbeitArr[0];
- } else {
- $this->terminateWithError($this->p->t('abgabetool', 'c4projektarbeitNichtGefunden'), 'general');
- }
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+ $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general');
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
- $result = $this->PaabgabeModel->load($paabgabe_id);
- $paabgabeArr = $this->getDataOrTerminateWithError($result, 'general');
-
- if (count($paabgabeArr) > 0) {
- $paabgabe = $paabgabeArr[0];
- } else {
- $this->terminateWithError($this->p->t('abgabetool', 'c4projektabgabeNichtGefunden'), 'general');
- }
-
- $this->checkAbgabeSignatur($paabgabe, $projektarbeit->student_uid);
- $signaturstatus = $paabgabe->signatur;
-
- // update projektarbeit cols
- $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id, $sprache, $abstract, $abstract_en
- , $schlagwoerter, $schlagwoerter_en, $seitenanzahl);
-
-
- // update paabgabe datum
- $res = $this->PaabgabeModel->update($paabgabe_id, array(
- 'abgabedatum' => date('Y-m-d'),
- 'updatevon' => getAuthUID(),
- 'updateamum' => date('Y-m-d H:i:s')
- ));
-
- $res = $this->PaabgabeModel->load($res->retval);
- $abgabe = getData($res)[0];
- $abgabe->signatur = $signaturstatus;
-
- $this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
-
- $this->logLib->logInfoDB(array('endupload', $res, array(
- 'abgabedatum' => date('Y-m-d'),
- 'updatevon' => getAuthUID(),
- 'updateamum' => date('Y-m-d H:i:s')
- ), getAuthUID(), getAuthPersonId(), array($projektarbeit_id, $sprache, $abstract, $abstract_en
- , $schlagwoerter, $schlagwoerter_en, $seitenanzahl)));
-
- $this->terminateWithSuccess($abgabe);
+ if (count($projektarbeitArr) > 0) {
+ $projektarbeit = $projektarbeitArr[0];
} else {
- $this->terminateWithError('Error moving File', 'general');
+ $this->terminateWithError($this->p->t('abgabetool', 'c4projektarbeitNichtGefunden'), 'general');
}
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+ $result = $this->PaabgabeModel->load($paabgabe_id);
+ $paabgabeArr = $this->getDataOrTerminateWithError($result, 'general');
+
+ if (count($paabgabeArr) > 0) {
+ $paabgabe = $paabgabeArr[0];
+ } else {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4projektabgabeNichtGefunden'), 'general');
+ }
+
+ $this->checkAbgabeSignatur($paabgabe, $projektarbeit->student_uid);
+ $signaturstatus = $paabgabe->signatur;
+
+ // update projektarbeit cols with zusatzdaten AND abgabedatum!
+ $this->ProjektarbeitModel->update($projektarbeit->projektarbeit_id, array(
+ 'sprache' => $sprache,
+ 'seitenanzahl' => $seitenanzahl,
+ 'abgabedatum' => date('Y-m-d'),
+ 'schlagwoerter_en' => $schlagwoerter_en,
+ 'schlagwoerter' => $schlagwoerter,
+ 'abstract' => $abstract,
+ 'abstract_en' => $abstract_en
+ ));
+
+
+ // update paabgabe datum
+ $res = $this->PaabgabeModel->update($paabgabe_id, array(
+ 'abgabedatum' => date('Y-m-d'),
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ));
+
+ $res = $this->PaabgabeModel->load($res->retval);
+ $abgabe = getData($res)[0];
+ $abgabe->signatur = $signaturstatus;
+
+ $this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
+
+ $this->logLib->logInfoDB(array('endupload', $res, array(
+ 'abgabedatum' => date('Y-m-d'),
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ), getAuthUID(), getAuthPersonId(), array($projektarbeit_id, $sprache, $abstract, $abstract_en
+ , $schlagwoerter, $schlagwoerter_en, $seitenanzahl)));
+
+ $this->terminateWithSuccess($abgabe);
} else {
- $this->terminateWithError('File missing', 'general');
+ $this->terminateWithError('Error moving File', 'general');
}
+
} else {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'));
+ $this->terminateWithError('File missing', 'general');
}
}
-
+
+ /**
+ * POST METHOD
+ * allows a student (or assistenz on their behalf) to update the titel of their own projektarbeit.
+ * blocked once the projektarbeit has been graded (checkProjektarbeitForFinishedStatus).
+ */
+ public function postStudentProjektarbeitTitel()
+ {
+ if(!$this->config->item('STUDENT_EDIT_PROJEKTARBEIT_TITLE')) {
+ $this->terminateWithError($this->p->t('global', 'c4studentEditNotAllowed'), 'general');
+ };
+
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+ $titel = $this->input->post('titel');
+
+ if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
+ || $titel === NULL || trim((string)$titel) === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ // strip all HTML tags to prevent XSS in mail bodies, table views and Projektarbeitsbenotung
+ $titel = trim(strip_tags($titel));
+ if ($titel === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ // Reject emojis and pictographs
+ // allows foreign letters, math symbols, accents, and standard punctuation.
+ $emojiPattern = '/[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F900}-\x{1FAFF}\x{23E9}-\x{23EF}\x{2b50}\x{2700}-\x{27BF}]/u';
+
+ // i would like this much more but our server does not recognize this utf-8 character range this way, so hexcodes it is
+// if (preg_match('/\p{Extended_Pictographic}/u', $titel)) {
+ if (preg_match($emojiPattern, $titel)) {
+
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ // Verify the projektarbeit actually belongs to the supplied student_uid
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if (isError($res) || !hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4projektarbeitNichtGefunden'), 'general');
+ }
+ $assignedStudentUid = getData($res)[0]->uid;
+
+ // A student may only update their own title; assistenz is covered by checkZuordnung
+
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz);
+ if (getAuthUID() !== $assignedStudentUid && !$zugeordnet) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ }
+
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+ $data = getData($result);
+
+ $oldTitle = $data[0]->titel ?? '';
+
+ $result = $this->ProjektarbeitModel->update(
+ $projektarbeit_id,
+ array(
+ 'titel' => $titel,
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ )
+ );
+
+ $this->getDataOrTerminateWithError($result, 'general');
+
+ $this->logLib->logInfoDB(array(
+ 'titelUpdate',
+ array(
+ 'projektarbeit_id' => $projektarbeit_id,
+ 'titel' => $titel,
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ),
+ getAuthUID(),
+ getAuthPersonId()
+ ));
+
+ $this->sendTitelChangedEmail(
+ $projektarbeit_id,
+ $titel,
+ $oldTitle,
+ $assignedStudentUid
+ );
+
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+ $titel = hasData($result) ? getData($result)[0]->titel : $titel;
+ $this->terminateWithSuccess($titel);
+ }
+
+ /**
+ * Notifies all betreuer of a projektarbeit and all assistenzen responsible for its studiengang
+ * when a student updates the titel of their projektarbeit.
+ *
+ * Betreuer retrieval mirrors AbgabetoolJob->notifyBetreuerAboutChangedAbgaben.
+ * Assistenz retrieval mirrors AbgabetoolJob->notifyAssistenzAboutChangedAbgaben.
+ *
+ * @param int $projektarbeit_id
+ * @param string $new_titel The titel as it was saved
+ * @param string $student_uid
+ */
+ private function sendTitelChangedEmail($projektarbeit_id, $new_titel, $old_titel, $student_uid)
+ {
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
+ $this->load->model('person/Person_model', 'PersonModel');
+
+ $this->load->model('person/Person_model', 'PersonModel');
+ $studentNameResult = $this->PersonModel->getFullName($student_uid);
+ $studentFullName = hasData($studentNameResult) ? getData($studentNameResult) : $student_uid;
+
+ $studentInfoResult = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if (isError($studentInfoResult) || !hasData($studentInfoResult)) {
+ $this->logLib->logInfoDB(array('sendTitelChangedEmail: student info not found', $projektarbeit_id));
+ return;
+ }
+ $studentInfo = getData($studentInfoResult)[0];
+ $studiengang_kz = $studentInfo->studiengang_kz;
+
+ $stgResult = $this->StudiengangModel->load($studiengang_kz);
+ $oe_kurzbz = null;
+ if (!isError($stgResult) && hasData($stgResult)) {
+ $oe_kurzbz = getData($stgResult)[0]->oe_kurzbz ?? null;
+ }
+
+ // build shared mail data
+ $base_mail_data = array(
+ 'studentFullName' => $studentFullName,
+ 'new_titel' => $new_titel,
+ 'old_titel' => $old_titel
+ );
+
+ // notify all betreuer
+ $betreuerResult = $this->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id);
+ if (!isError($betreuerResult) && hasData($betreuerResult)) {
+
+ $linkAbgabetool = APP_ROOT . $this->config->item('URL_MITARBEITER');
+
+ foreach (getData($betreuerResult) as $betreuer) {
+ $email = $betreuer->uid ? $betreuer->uid . '@' . DOMAIN : ($betreuer->private_email ?? null);
+ if (!$email) {
+ $this->logLib->logInfoDB(array('sendTitelChangedEmail: no email for betreuer', $betreuer->person_id));
+ continue;
+ }
+
+ $anredeResult = $this->ProjektarbeitModel->getProjektbetreuerAnrede($betreuer->person_id);
+ $anrede = (!isError($anredeResult) && hasData($anredeResult)) ? getData($anredeResult)[0] : null;
+
+ $mail_data = array_merge($base_mail_data, array(
+ 'anredeFillString' => ($anrede->anrede ?? '') === 'Herr' ? 'r' : '',
+ 'anrede' => $anrede->anrede ?? '',
+ 'fullFormattedNameString' => $anrede->first ?? $email,
+ 'linkAbgabetool' => $linkAbgabetool,
+ ));
+
+ sendSanchoMail(
+ 'PATitleUpdated',
+ $mail_data,
+ $email,
+ $this->p->t('abgabetool', 'c4PATitleChanged')
+ );
+ }
+ }
+
+ // notify assistenz for the studiengang OE
+ if (!$oe_kurzbz) {
+ $this->logLib->logInfoDB(array('sendTitelChangedEmail: no oe_kurzbz resolved, skipping assistenz', $studiengang_kz));
+ return;
+ }
+
+ $assistenzResult = $this->OrganisationseinheitModel->getAssistenzForOE($oe_kurzbz);
+ if (isError($assistenzResult) || !hasData($assistenzResult)) {
+ return;
+ }
+
+ $linkAbgabetool = APP_ROOT . $this->config->item('URL_ASSISTENZ');
+
+ // similar pattern as job uses via the assistenzMap
+ $sentTo = [];
+ foreach (getData($assistenzResult) as $assistenz) {
+ if (in_array($assistenz->person_id, $sentTo)) {
+ continue;
+ }
+ $sentTo[] = $assistenz->person_id;
+
+ $email = $assistenz->uid . '@' . DOMAIN;
+
+ $mail_data = array_merge($base_mail_data, array(
+ 'anredeFillString' => $assistenz->anrede === 'Herr' ? 'r' : '',
+ 'anrede' => $assistenz->anrede ?? '',
+ 'fullFormattedNameString' => $assistenz->first ?? ($assistenz->uid . '@' . DOMAIN),
+ 'linkAbgabetool' => $linkAbgabetool,
+ ));
+
+ sendSanchoMail(
+ 'PATitleUpdated',
+ $mail_data,
+ $email,
+ $this->p->t('abgabetool', 'c4PATitleChanged')
+ );
+ }
+ }
+
+
// validate paabgabe deadline against servertime just in case a student spoofs their local clock and thus
// unlocks the upload ui
private function checkPaabgabeDeadline($paabgabe_id) {
@@ -504,7 +770,7 @@ class Abgabe extends FHCAPI_Controller
$showAllBool = false;
}
- $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool);
+ $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthPersonId(), $showAllBool);
$mapFunc = function($projektarbeit) {
@@ -519,20 +785,18 @@ class Abgabe extends FHCAPI_Controller
forEach($projektarbeiten->retval as $pa) {
- $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($pa->betreuer_person_id);
- $anredeArr = $this->getDataOrTerminateWithError($result, 'general');
- $pa->betreuer = $anredeArr[0];
-
$oldLink = ''; // show this when paIsCurrent == false -> moodle course template
$newLink = ''; // get curated path for betreuer type
- $returnFunc = function ( $resultOld, $resultNew) use (&$oldLink, &$newLink) {
+ $returnFunc = function ($resultOld, $resultNew) use (&$oldLink, &$newLink) {
$newLink = $resultNew;
$oldLink = $resultOld;
};
- Events::trigger('projektbeurteilung_formular_link', $pa->betreuerart_kurzbz, APP_ROOT, $pa->projektarbeit_id, $pa->student_uid, $returnFunc);
+ $own_betreuerart_kurzbz = $pa->betreuer_person_id == getAuthPersonId() ? $pa->betreuer_betreuerart_kurzbz : $pa->zweitbetreuer_betreuerart_kurzbz;
+ Events::trigger('projektbeurteilung_formular_link', $own_betreuerart_kurzbz, APP_ROOT, $pa->projektarbeit_id, $pa->student_uid, $returnFunc);
$pa->beurteilungLinkNew = $newLink;
$pa->beurteilungLinkOld = $oldLink;
+ $pa->betreuerart_kurzbz = $own_betreuerart_kurzbz;
// has previously been retrieved via getStudentProjektabgaben but is fetched in advance to avoid having to reload abgaben
$projektarbeitIsCurrent = false;
@@ -579,9 +843,22 @@ class Abgabe extends FHCAPI_Controller
$this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz);
if(!$zugeordnet) {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'));
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]));
}
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
@@ -618,12 +895,22 @@ class Abgabe extends FHCAPI_Controller
// load existing entry of paabgabe and check if note has changed to negativ, to avoid sending when
// only notiz has changed.
- // TODO: what if paabgabe is a qualgate1, is benotet negativ and then its type is changed to gate2?
-
$existingResult = $this->PaabgabeModel->load($paabgabe_id);
$existingPaabgabeArr = getData($existingResult);
if(count($existingPaabgabeArr) > 0) $existingPaabgabe = $existingPaabgabeArr[0];
+ if($existingPaabgabe->note !== null || $existingPaabgabe->abgabedatum !== null) {
+ // check if a change of paabgabetyp is being attempted -> not allowed at this point
+ if($paabgabetyp_kurzbz !== $existingPaabgabe->paabgabetyp_kurzbz) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4abgabetypAendernNichtErlaubt'));
+ }
+
+ // check if a change of deadline aka datum is being attempted -> notallowed at this point
+ if($datum !== $existingPaabgabe->datum) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4datumAendernNichtErlaubt'));
+ }
+ }
+
$result = $this->PaabgabeModel->update(
$paabgabe_id,
array(
@@ -687,6 +974,112 @@ class Abgabe extends FHCAPI_Controller
$this->terminateWithSuccess([$paabgabe, $existingPaabgabe]);
}
+ /**
+ * called by abgabetool/assistenz when bulk-editing multiple abgabetermine via the flat termine table view
+ * only fields present in the payload are updated - absent fields are left untouched
+ */
+ public function patchProjektarbeitAbgabeMultiple() {
+ $paabgabe_ids = $this->input->post('paabgabe_ids');
+
+ if ($paabgabe_ids === NULL || !is_array($paabgabe_ids) || count($paabgabe_ids) === 0) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ // collect only fields that were actually sent
+ $updateFields = [];
+
+ $datum = $this->input->post('datum');
+ if ($datum !== NULL && trim((string)$datum) !== '') {
+ $updateFields['datum'] = $datum;
+ }
+
+ $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz');
+ if ($paabgabetyp_kurzbz !== NULL && trim((string)$paabgabetyp_kurzbz) !== '') {
+ $updateFields['paabgabetyp_kurzbz'] = $paabgabetyp_kurzbz;
+ }
+
+ $kurzbz = $this->input->post('kurzbz');
+ if ($kurzbz !== NULL) {
+ $updateFields['kurzbz'] = $kurzbz;
+ }
+
+ // booleans: only include if explicitly posted
+ $upload_allowed = $this->input->post('upload_allowed');
+ if ($upload_allowed !== NULL) {
+ $updateFields['upload_allowed'] = filter_var($upload_allowed, FILTER_VALIDATE_BOOLEAN);
+ }
+
+ $fixtermin = $this->input->post('fixtermin');
+ if ($fixtermin !== NULL) {
+ $updateFields['fixtermin'] = filter_var($fixtermin, FILTER_VALIDATE_BOOLEAN);
+ }
+
+ if (empty($updateFields)) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+
+ $results = [];
+ foreach ($paabgabe_ids as $paabgabe_id) {
+ $paabgabe_id = trim((string)$paabgabe_id);
+
+ if ($paabgabe_id === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id);
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz);
+ if (!$zugeordnet) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ }
+
+ $paabgabeResult = $this->PaabgabeModel->load($paabgabe_id);
+ $paabgabeArr = $this->getDataOrTerminateWithError($paabgabeResult, 'general');
+
+ if (count($paabgabeArr) === 0) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $result = $this->PaabgabeModel->update(
+ $paabgabe_id,
+ array_merge($updateFields, [
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ])
+ );
+
+ $this->getDataOrTerminateWithError($result, 'general');
+ $results[] = getData($this->PaabgabeModel->load($paabgabe_id))[0];
+
+ $this->logLib->logInfoDB(array(
+ 'paabgabe bulk updated',
+ $paabgabe_id,
+ $updateFields,
+ getAuthUID(),
+ getAuthPersonId()
+ ));
+ }
+
+ $this->terminateWithSuccess($results);
+ }
+
/**
* called by abgabetool/mitarbeiter in mitarbeiterdetail.js when deleting an abgabetermin
* deletion is only possible if user is assistenz OR betreuer deletes their own custom termin
@@ -699,12 +1092,28 @@ class Abgabe extends FHCAPI_Controller
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
}
- $this->checkProjektarbeitForFinishedStatus($this->getProjektarbeitIDForPaabgabeID($paabgabe_id));
+ $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id);
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
- $zugeordnet = $this->checkZuordnungByPaabgabe($paabgabe_id, getAuthUID());
+
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnungByPaabgabe($paabgabe_id, getAuthUID(), $student_uid, $studiengang_kz);
if(!$zugeordnet) {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]), 'general');
}
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
@@ -719,11 +1128,69 @@ class Abgabe extends FHCAPI_Controller
$result = $this->PaabgabeModel->delete($paabgabe_id);
$result = $this->getDataOrTerminateWithError($result, 'general');
- // TODO: consider this in nightly email job
$this->logLib->logInfoDB(array($paabgabeArr[0], getAuthUID(), getAuthPersonId()));
$this->terminateWithSuccess($result);
}
+ /**
+ * called by abgabetool/assistenz when deleting multiple abgabetermine via the flat termine table view
+ */
+ public function deleteProjektarbeitAbgabeMultiple() {
+ $paabgabe_ids = $this->input->post('paabgabe_ids');
+
+ if ($paabgabe_ids === NULL || !is_array($paabgabe_ids) || count($paabgabe_ids) === 0) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+
+ $results = [];
+ foreach ($paabgabe_ids as $paabgabe_id) {
+ $paabgabe_id = trim((string)$paabgabe_id);
+
+ if ($paabgabe_id === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->checkProjektarbeitForFinishedStatus($this->getProjektarbeitIDForPaabgabeID($paabgabe_id));
+
+ $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id);
+
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnungByPaabgabe($paabgabe_id, getAuthUID(), $student_uid, $studiengang_kz);
+
+ if (!$zugeordnet) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ }
+
+ $paabgabeResult = $this->PaabgabeModel->load($paabgabe_id);
+ $paabgabeArr = $this->getDataOrTerminateWithError($paabgabeResult, 'general');
+
+ if (count($paabgabeArr) == 0) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $result = $this->PaabgabeModel->delete($paabgabe_id);
+ $result = $this->getDataOrTerminateWithError($result, 'general');
+ $results[] = $result;
+
+ $this->logLib->logInfoDB(array($paabgabeArr[0], getAuthUID(), getAuthPersonId()));
+ }
+
+ $this->terminateWithSuccess($results);
+ }
+
/**
* endpoint for adding the same paabgabe for multiple projektarbeiten
* can be slow for large n since it queries twice per projektarbeit_id
@@ -757,16 +1224,27 @@ class Abgabe extends FHCAPI_Controller
// and should never unintentionally happen
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- $res = [];
+
$abgaben = [];
foreach ($projektarbeit_ids as $projektarbeit_id) {
$this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz);
if(!$zugeordnet) {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]), 'general');
}
$result = $this->PaabgabeModel->insert(
@@ -847,10 +1325,10 @@ class Abgabe extends FHCAPI_Controller
private function getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id) {
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$result = $this->ProjektarbeitModel->getProjektbetreuerEmail($projektarbeit_id);
- if(count($result->retval) > 0) {
+ if(hasData($result)) {
$email = getData($result);
return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email;
- } else return '';
+ } else return null;
}
@@ -861,9 +1339,12 @@ class Abgabe extends FHCAPI_Controller
private function getProjektbetreuerEmailByPersonID($person_id) {
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$result = $this->ProjektarbeitModel->getProjektbetreuerEmailByPersonID($person_id);
- $email = $this->getDataOrTerminateWithError($result, 'general');
-
- return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email;
+ if(hasData($result)) {
+ $email = getData($result);
+ return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email;
+ } else {
+ return null;
+ }
}
//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API
@@ -1034,30 +1515,34 @@ class Abgabe extends FHCAPI_Controller
$projektarbeit_id = $this->input->get('projektarbeit_id');
$paabgabe_id = $this->input->get('paabgabe_id');
- $student_uid = $this->input->get('student_uid');
if ($paabgabe_id === NULL || trim((string)$paabgabe_id) === ''
- || $projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
- || $student_uid === NULL || trim((string)$student_uid) === '') {
+ || $projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '') {
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
}
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- // zuordnung function is supposed for mitarbeiter_uids, students should be allowed to download their own files
- // without adapting zuordnung logic
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
- if(getAuthUID() == $student_uid || $zugeordnet) {
- $file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
-
-
- if(file_exists($file_path)) {
- $this->terminateWithFileOutput('application/octet-stream', file_get_contents($file_path), basename($file_path));
- } else {
- $this->terminateWithError('File not found', 'general');
- }
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ if(!$this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz)){
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]), 'general');
+ }
+
+ $file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
+
+ if(file_exists($file_path)) {
+ $this->terminateWithFileOutput('application/octet-stream', file_get_contents($file_path), basename($file_path));
} else {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ $this->terminateWithError('File not found', 'general');
}
}
@@ -1101,14 +1586,33 @@ class Abgabe extends FHCAPI_Controller
$this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
- $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ // load the $student_uid by $projektarbeit_id so we dont need any post params
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz);
if(!$zugeordnet) {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]), 'general');
}
- // update projektarbeit cols
- $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en
- ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl);
+ // update projektarbeit cols with zusatzdaten only
+ $this->ProjektarbeitModel->update($projektarbeit_id, array(
+ 'sprache' => $sprache,
+ 'seitenanzahl' => $seitenanzahl,
+ 'schlagwoerter_en' => $schlagwoerter_en,
+ 'schlagwoerter' => $schlagwoerter,
+ 'abstract' => $abstract,
+ 'abstract_en' => $abstract_en
+ ));
$this->logLib->logInfoDB(array('zusatzdatenEditMitarbeiter', array(
'updatevon' => getAuthUID(),
@@ -1144,6 +1648,69 @@ class Abgabe extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
+ public function sendZweitbetreuerTokenMail() {
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+ $bperson_id = $this->input->post('bperson_id');
+
+
+ if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
+ || $bperson_id === NULL || trim((string)$bperson_id) === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz);
+ if(!$zugeordnet) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'));
+ }
+
+ $this->sendUploadEmailZweitbegutachterToken($bperson_id, $projektarbeit_id, $student_uid);
+ }
+
+ // basically what getStudentProjektarbeiten intends to do for the student page but
+ // designed for the assistenz timeline component -> more extensive loading upfront
+ // with every abgabetermin fetched here aswell
+ public function fetchProjektarbeitenHistory() {
+ $student_uid = $this->input->post('student_uid');
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ $projektarbeiten = $this->ProjektarbeitModel->getProjektarbeitenForStudent($student_uid);
+
+ $mapFunc = function($projektarbeit) {
+ return $projektarbeit->projektarbeit_id;
+ };
+ $projektarbeiten_ids = array_map($mapFunc, $projektarbeiten->retval);
+
+ if(count($projektarbeiten_ids) > 0) {
+ $ret = $this->ProjektarbeitModel->getProjektarbeitenAbgabetermine($projektarbeiten_ids);
+ $projektabgaben = $this->getDataOrTerminateWithError($ret, 'general');
+ }
+
+ forEach($projektarbeiten->retval as $pa) {
+
+ $filterFunc = function($projektabgabe) use ($pa) {
+ return $projektabgabe->projektarbeit_id == $pa->projektarbeit_id;
+ };
+
+ $pa->abgabetermine = array_values(array_filter($projektabgaben, $filterFunc));
+ }
+
+ $this->terminateWithSuccess($projektarbeiten->retval);
+ }
+
/**
* helper function to check the signature status of uploaded files for zwischenabgabe & endupload
*/
@@ -1206,14 +1773,7 @@ class Abgabe extends FHCAPI_Controller
};
Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc);
if(!$projektarbeitIsCurrent) {
- $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general');
- }
-
- // Link to Abgabetool
- if (defined('CIS4') && CIS4) {
- $ci3BootstrapFilePath = "cis.php";
- } else {
- $ci3BootstrapFilePath = "index.ci.php";
+ $this->terminateWithError($this->p->t('abgabetool','c4fehlerPAIsNotCurrent'), 'general');
}
$path = $this->config->item('URL_MITARBEITER');
@@ -1227,7 +1787,6 @@ class Abgabe extends FHCAPI_Controller
// 1. Begutachter mail ohne Token
$mail_baselink = APP_ROOT.$this->config->item('PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER');
-// $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter";
$mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
$projekttyp_kurzbz = $projektarbeit->projekttyp_kurzbz;
$subject = $projektarbeit->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung';
@@ -1247,7 +1806,7 @@ class Abgabe extends FHCAPI_Controller
$email = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id);
if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
-
+
$mailres = sendSanchoMail(
'ParbeitsbeurteilungEndupload',
$maildata,
@@ -1265,89 +1824,115 @@ class Abgabe extends FHCAPI_Controller
// 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern
if ($paabgabetyp_kurzbz == 'end')
{
- // Zweitbegutachter holen
- $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
- $zweitbegutachterRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid));
+ $this->sendUploadEmailZweitbegutachterToken($bperson_id, $projektarbeit_id, $studentUser->uid);
- if ($zweitbegutachterRetval && count($zweitbegutachterRetval) > 0)
- {
-
- foreach ($zweitbegutachterRetval as $begutachter)
- {
- // token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft)
- $tokenGenRes = $this->ProjektbetreuerModel->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id);
-
- if (!$tokenGenRes)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
- }
-
- $begutachterMitTokenRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id));
-
- if (!$begutachterMitTokenRetval && count($begutachterMitTokenRetval) <= 0)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
- }
-
- $begutachterMitToken = $begutachterMitTokenRetval[0];
-
- $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter';
- $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path";
- $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
- $intern = isset($begutachterMitToken->uid);
- $mail_link = $intern ? $mail_fulllink : $mail_baselink;
-
- $zweitbetmaildata = array();
- $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : "");
- $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede;
- $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name;
- $zweitbetmaildata['student_anrede'] = $maildata['student_anrede'];
- $zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name'];
- $zweitbetmaildata['abgabetyp'] = $abgabetyp;
- $zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : "";
- $zweitbetmaildata['bewertunglink'] = $projektarbeitIsCurrent ? "
Zur Beurteilung der Arbeit
" : "";
- $zweitbetmaildata['token'] = $projektarbeitIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "Zugangstoken: " . $begutachterMitToken->zugangstoken . "
" : "";
-
- $mailres = sendSanchoMail(
- 'ParbeitsbeurteilungEndupload',
- $zweitbetmaildata,
- $begutachterMitToken->email,
- $subject,
- 'sancho_header_min_bw.jpg',
- 'sancho_footer_min_bw.jpg',
- get_uid()."@".DOMAIN
- );
-
- if (!$mailres)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
- }
-
- }
- }
}
}
}
- private function checkZuordnung($projektarbeit_id, $betreuer_uid) {
+ private function sendUploadEmailZweitbegutachterToken($bperson_id, $projektarbeit_id, $student_uid) {
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $projektarbeitArr = $this->getDataOrTerminateWithError($this->ProjektarbeitModel->load($projektarbeit_id));
+ if(count($projektarbeitArr) > 0) {
+ $projektarbeit = $projektarbeitArr[0];
+ } else {
+ $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general');
+ }
+
+ // Zweitbegutachter holen
+ $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
+ $zweitbegutachterRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $student_uid));
+
+ $projektarbeitIsCurrent = false;
+ $returnFunc = function ($result) use (&$projektarbeitIsCurrent) {
+ $projektarbeitIsCurrent = $result;
+ };
+ Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc);
+ if(!$projektarbeitIsCurrent) {
+ $this->terminateWithError($this->p->t('abgabetool','c4fehlerPAIsNotCurrent'), 'general');
+ }
+
+ if ($zweitbegutachterRetval && count($zweitbegutachterRetval) > 0)
+ {
+
+ foreach ($zweitbegutachterRetval as $begutachter)
+ {
+ // token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft)
+ $tokenGenRes = $this->ProjektbetreuerModel->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id);
+
+ if (!$tokenGenRes)
+ {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
+ }
+
+ $begutachterMitTokenRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $student_uid, $begutachter->person_id));
+
+ if (!$begutachterMitTokenRetval && count($begutachterMitTokenRetval) <= 0)
+ {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
+ }
+
+ $begutachterMitToken = $begutachterMitTokenRetval[0];
+
+ $studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0];
+
+ $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter';
+ $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path";
+ $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$student_uid;
+ $intern = isset($begutachterMitToken->uid);
+ $mail_link = $intern ? $mail_fulllink : $mail_baselink;
+
+ // automatic email ensures that, client only exposes this method if that happened already
+ $paabgabetyp_kurzbz = 'end';
+ $abgabetyp = $paabgabetyp_kurzbz == 'end' ? 'Endabgabe' : 'Zwischenabgabe';
+
+ $path = $this->config->item('URL_MITARBEITER');
+ $url = APP_ROOT.$path;
+
+ $subject = $projektarbeit->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung';
+
+ $zweitbetmaildata = array();
+ $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : "");
+ $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede;
+ $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name;
+ $zweitbetmaildata['student_anrede'] = $studentUser->anrede;
+ $zweitbetmaildata['student_voller_name'] = trim($studentUser->titelpre." ".$studentUser->vorname." ".$studentUser->nachname." ".$studentUser->titelpost);
+ $zweitbetmaildata['abgabetyp'] = $abgabetyp;
+ $zweitbetmaildata['parbeituebersichtlink'] = $intern ? "Zur Projektarbeitsübersicht
" : "";
+ $zweitbetmaildata['bewertunglink'] = $projektarbeitIsCurrent ? "Zur Beurteilung der Arbeit
" : "";
+ $zweitbetmaildata['token'] = $projektarbeitIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "Zugangstoken: " . $begutachterMitToken->zugangstoken . "
" : "";
+
+ $this->addMeta('$zweitbetmaildata', $zweitbetmaildata);
+
+ $mailres = sendSanchoMail(
+ 'ParbeitsbeurteilungEndupload',
+ $zweitbetmaildata,
+ $begutachterMitToken->email,
+ $subject,
+ 'sancho_header_min_bw.jpg',
+ 'sancho_footer_min_bw.jpg',
+ get_uid()."@".DOMAIN
+ );
+
+ if (!$mailres)
+ {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
+ }
+
+ }
+ }
+ }
+
+ private function checkZuordnung($projektarbeit_id, $auth_uid, $student_uid, $studiengang_kz) {
// check if authenticated user is zugewiesen as betreuer to projektarbeit or has admin/assistenz berechtigung
// over the studiengang of the student working on that projektarbeit_id
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
- $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
- if(isError($res)) {
- $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
- }
+ // student itself is always considered zugeordnet towards their own projektarbeit
+ if($auth_uid == $student_uid) return true;
- if(!hasData($res)) {
- $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
- }
- $data = getData($res)[0];
- $student_uid = $data->uid;
- $studiengang_kz = $data->studiengang_kz;
-
- $res = $this->ProjektarbeitModel->checkZuordnung($student_uid, $betreuer_uid);
+ // if auth_uid is of a betreuer, look for actual betreuungszuordnung between those ids
+ $res = $this->ProjektarbeitModel->checkZuordnung($student_uid, $auth_uid);
if(isError($res)) {
$this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingBetreuerStudentZuordnung'), 'general');
}
@@ -1394,9 +1979,9 @@ class Abgabe extends FHCAPI_Controller
return $data->projektarbeit_id;
}
- private function checkZuordnungByPaabgabe($paabgabe_id, $betreuer_uid) {
+ private function checkZuordnungByPaabgabe($paabgabe_id, $auth_uid, $student_uid, $studiengang_kz) {
$projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id);
- return $this->checkZuordnung($projektarbeit_id, $betreuer_uid);
+ return $this->checkZuordnung($projektarbeit_id, $auth_uid, $student_uid, $studiengang_kz);
}
// loads a projektarbeit table row by id and looks if a note has been set. A non null note field
@@ -1411,7 +1996,13 @@ class Abgabe extends FHCAPI_Controller
$data = getData($res)[0];
if($data->note !== NULL) {
- $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general');
+ // hardcode this error msg cause phrasen arent reliable and people keep bugging why the cant edit old entries they definitely shouldnt update
+ $message = $this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeitv3');
+ if(strpos($message, "<<") === 0) { // phrase could not be loaded
+ $this->terminateWithError('Die Projektarbeit wurde bereits benotet, Sie dürfen deshalb keine weiteren Termine anlegen oder bearbeiten.', 'general');
+ } else {
+ $this->terminateWithError($message);
+ }
}
}
diff --git a/application/controllers/api/frontend/v1/Bookmark.php b/application/controllers/api/frontend/v1/Bookmark.php
index 3e646bb51..aa45709d4 100644
--- a/application/controllers/api/frontend/v1/Bookmark.php
+++ b/application/controllers/api/frontend/v1/Bookmark.php
@@ -18,6 +18,8 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
+use \DateTime as DateTime;
+
class Bookmark extends FHCAPI_Controller
{
@@ -28,111 +30,162 @@ class Bookmark extends FHCAPI_Controller
{
parent::__construct([
'getBookmarks' => self::PERM_LOGGED,
- 'delete' => self::PERM_LOGGED,
- 'insert' => self::PERM_LOGGED,
+ 'delete' => self::PERM_LOGGED,
+ 'insert' => self::PERM_LOGGED,
'update' => self::PERM_LOGGED,
- ]);
+ 'changeOrder' => self::PERM_LOGGED
+ ]);
$this->load->model('dashboard/Bookmark_model', 'BookmarkModel');
$this->uid = getAuthUID();
$this->pid = getAuthPersonID();
-
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
- /**
- * gets the bookmarks associated to a user
+ /**
+ * gets the bookmarks associated to a user
* @access public
* @return void
*/
public function getBookmarks()
{
- $this->BookmarkModel->addOrder("bookmark_id");
+ $this->BookmarkModel->addOrder("sort");
$bookmarks = $this->BookmarkModel->loadWhere(["uid"=>$this->uid]);
- $bookmarks = $this->getDataOrTerminateWithError($bookmarks);
+ $bookmarks = $this->getDataOrTerminateWithError($bookmarks);
- $this->terminateWithSuccess($bookmarks);
- }
-
- /**
- * deletes bookmark from associated user
- * @access public
- * @return void
- */
- public function delete($bookmark_id)
- {
- $bookmark = $this->BookmarkModel->load($bookmark_id);
-
- $bookmark = current($this->getDataOrTerminateWithError($bookmark));
-
- // only delete bookmark if the user is the owner of the bookmark
- if($bookmark->uid == $this->uid || $this->permissionlib->isBerechtigt('admin')){
-
- $delete_result = $this->BookmarkModel->delete($bookmark_id);
-
- $delete_result = $this->getDataOrTerminateWithError($delete_result);
-
- $this->terminateWithSuccess($delete_result);
- }else{
- $this->_outputAuthError(['delete' => ['admin:rw']]);
- }
- }
-
- /**
- * inserts new bookmark into the bookmark table
- * @access public
- * @return void
- */
- public function insert()
- {
- // form validation
- $this->load->library('form_validation');
- $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
- $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
- if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
-
- $url = $this->input->post('url',true);
- $title = $this->input->post('title',true);
- $tag = $this->input->post('tag', true);
-
- $insert_into_result = $this->BookmarkModel->insert(['uid'=>$this->uid, 'url'=>$url, 'title'=>$title,'tag'=>$tag, 'insertvon'=>$this->uid, 'updateamum'=>NULL, 'updatevon'=>NULL]);
-
- $insert_into_result = $this->getDataOrTerminateWithError($insert_into_result);
-
- $this->terminateWithSuccess($insert_into_result);
-
- }
+ $this->terminateWithSuccess($bookmarks);
+ }
/**
- * updates bookmark in the bookmark table
+ * deletes bookmark from associated user
* @access public
* @return void
*/
- public function update($bookmark_id)
+ public function delete($bookmark_id)
{
- // form validation
- $this->load->library('form_validation');
- $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
- $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
- if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
+ $bookmark = $this->BookmarkModel->load($bookmark_id);
- $url = $this->input->post('url',true);
- $title = $this->input->post('title',true);
+ $bookmark = current($this->getDataOrTerminateWithError($bookmark));
+
+ // only delete bookmark if the user is the owner of the bookmark
+ if ($bookmark->uid == $this->uid || $this->permissionlib->isBerechtigt('admin')) {
+ $delete_result = $this->BookmarkModel->delete($bookmark_id);
+
+ $delete_result = $this->getDataOrTerminateWithError($delete_result);
+
+ $this->terminateWithSuccess($delete_result);
+ } else {
+ $this->_outputAuthError(['delete' => ['admin:rw']]);
+ }
+ }
+
+ /**
+ * inserts new bookmark into the bookmark table
+ * @access public
+ * @return void
+ */
+ public function insert()
+ {
+ // form validation
+ $this->load->library('form_validation');
+ $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
+ $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $url = $this->input->post('url', true);
+ $title = $this->input->post('title', true);
+ $tag = $this->input->post('tag', true);
+ if (is_array($tag)) {
+ $tag = json_encode($tag); // convert PHP array to JSON string
+ }
+ $sort = $this->input->post('sort', true);
+
+ $insert_into_result = $this->BookmarkModel->insert([
+ 'uid' => $this->uid,
+ 'url' => $url,
+ 'title' => $title,
+ 'tag' => $tag,
+ 'insertvon' => $this->uid,
+ 'updateamum' => null,
+ 'updatevon' => null,
+ 'sort' => $sort
+ ]);
+
+ $insert_into_result = $this->getDataOrTerminateWithError($insert_into_result);
+
+ $this->terminateWithSuccess($insert_into_result);
+ }
+
+ /**
+ * updates bookmark in the bookmark table
+ * @access public
+ * @return void
+ */
+ public function update($bookmark_id)
+ {
+ // form validation
+ $this->load->library('form_validation');
+ $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
+ $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $url = $this->input->post('url', true);
+ $title = $this->input->post('title', true);
+ $tag = $this->input->post('tag', true);
+ if (is_array($tag)) {
+ $tag = json_encode($tag);
+ }
$now = new DateTime();
$now = $now->format('Y-m-d H:i:s');
- $update_result = $this->BookmarkModel->update($bookmark_id,['url'=>$url, 'title'=>$title,'updateamum'=>$now]);
+ $update_result = $this->BookmarkModel->update($bookmark_id, [
+ 'url' => $url,
+ 'title' => $title,
+ 'tag' => $tag,
+ 'updateamum' => $now
+ ]);
- $update_result = $this->getDataOrTerminateWithError($update_result);
+ $update_result = $this->getDataOrTerminateWithError($update_result);
- $this->terminateWithSuccess($update_result);
+ $this->terminateWithSuccess($update_result);
+ }
- }
+ /**
+ * changes sort of two bookmarks in the bookmark table
+ * @access public
+ * @return void
+ */
+ public function changeOrder($bookmark_id1, $bookmark_id2)
+ {
+ $update_result = [];
+
+ $result1 = $this->BookmarkModel->load($bookmark_id1);
+ $data1 = $this->getDataOrTerminateWithError($result1);
+ $sort1 = current($data1)->sort;
+
+ $result2 = $this->BookmarkModel->load(["bookmark_id"=>$bookmark_id2]);
+ $data2 = $this->getDataOrTerminateWithError($result2);
+ $sort2 = current($data2)->sort;
+
+ $update_result1 = $this->BookmarkModel->update($bookmark_id1, [
+ 'sort' => $sort2
+ ]);
+ $update_result[] = $this->getDataOrTerminateWithError($update_result1);
+
+ $update_result2 = $this->BookmarkModel->update($bookmark_id2, [
+ 'sort' => $sort1
+ ]);
+ $update_result[] = $this->getDataOrTerminateWithError($update_result2);
+
+ $this->terminateWithSuccess($update_result);
+ }
}
diff --git a/application/controllers/api/frontend/v1/Cis4FhcApi.php b/application/controllers/api/frontend/v1/Cis4FhcApi.php
index 372e4bfaa..4d0f906f0 100644
--- a/application/controllers/api/frontend/v1/Cis4FhcApi.php
+++ b/application/controllers/api/frontend/v1/Cis4FhcApi.php
@@ -27,7 +27,7 @@ class Cis4FhcApi extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
- 'getViewData' => self::PERM_LOGGED,
+ 'dashboardViewData' => self::PERM_LOGGED,
]);
}
@@ -36,17 +36,22 @@ class Cis4FhcApi extends FHCAPI_Controller
// Public methods
/**
- * fetches ViewData
- */
- public function getViewData()
+ * retrieves view data for dashboard view
+ * @access public
+ * @param $uid the userID for which profile is being viewed, null or missing value implies one's own profile
+ */
+ public function dashboardViewData()
{
$this->load->model('person/Person_model','PersonModel');
$personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
+ $this->load->config('calendar');
+
$viewData = array(
'uid' => getAuthUID(),
'name' => $personData->vorname,
- 'person_id' => $personData->person_id
+ 'person_id' => $personData->person_id,
+ 'timezone' => $this->config->item('timezone'),
);
$this->terminateWithSuccess($viewData);
diff --git a/application/controllers/api/frontend/v1/CisMenu.php b/application/controllers/api/frontend/v1/CisMenu.php
index 4f4f2573e..163c337ae 100644
--- a/application/controllers/api/frontend/v1/CisMenu.php
+++ b/application/controllers/api/frontend/v1/CisMenu.php
@@ -16,12 +16,13 @@
* along with this program. If not, see .
*/
-if (! defined('BASEPATH')) exit('No direct script access allowed');
+if (!defined('BASEPATH'))
+ exit('No direct script access allowed');
class CisMenu extends FHCAPI_Controller
{
-
+
/**
* Object initialization
*/
@@ -31,28 +32,95 @@ class CisMenu extends FHCAPI_Controller
'getMenu' => self::PERM_LOGGED,
]);
-
+
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
- /**
+ /**
* fetches the menu for CIS from the database based on the userLanguage
*/
- public function getMenu()
+ public function getMenu()
{
$this->load->model('content/Content_model', 'ContentModel');
$this->load->config('cis');
- $cis4_content_id =$this->config->item('cis_menu_root_content_id');
- $result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(),getUserLanguage());
+ $cis4_content_id = $this->config->item('cis_menu_root_content_id');
+ $result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(), getUserLanguage());
$result = $this->getDataOrTerminateWithError($result);
$menu = $result->childs ?? [];
- $this->terminateWithSuccess($menu);
- }
-
-
+ $menu = $this->generateUrlsForMenuItems($menu);
+ $this->terminateWithSuccess($menu);
+ }
+
+ private function generateUrlsForMenuItems($menuItems)
+ {
+ return array_map(
+ function ($menuItem) {
+ return $this->generateUrlForMenuItem($menuItem);
+ },
+ $menuItems
+ );
+ }
+
+ private function generateUrlForMenuItem($menuItem)
+ {
+ $menuItem->url = $this->menuItemUrlHelper($menuItem);
+ unset($menuItem->content);
+
+ if ($menuItem->childs && count($menuItem->childs)) {
+ $menuItem->childs = $this->generateUrlsForMenuItems($menuItem->childs);
+ }
+
+ return $menuItem;
+ }
+
+ private function menuItemUrlHelper($menuItem)
+ {
+ if ($menuItem->template_kurzbz !== 'redirect') {
+ return site_url("/CisVue/Cms/content/" . $menuItem->content_id);
+ }
+
+ if (!$menuItem->content || !mb_strlen($menuItem->content)) {
+ return '';
+ }
+
+ $doc = new DOMDocument();
+ $doc->loadXML($menuItem->content);
+ $urlElem = $doc->getElementsByTagName('url')->item(0);
+
+ if (!$urlElem) {
+ return '';
+ }
+
+ $url = $urlElem->textContent;
+
+ if (strpos($url, '../cms/news.php') !== false) {
+ $newsRegex = '/^\.\.\/cms\/news\.php/';
+ $url = preg_replace($newsRegex, site_url("/CisVue/Cms/news"), $url);
+ }
+
+ if (strpos($url, '../cms/content.php?') !== false) {
+ $contentRegex = '/^\.\.\/cms\/content\.php\?content_id=([0-9]+)/';
+ $matches = [];
+ preg_match($contentRegex, $url, $matches);
+ $url = site_url('/CisVue/Cms/content/' . $matches[1]);
+ }
+
+ if (strpos($url, '../index.ci.php') !== false) {
+ $indexRegex = '/^\.\.\/index\.ci\.php/';
+ $url = preg_replace($indexRegex, site_url(), $url);
+ }
+
+ if (strpos($url, '../') !== false) {
+ $relativeRegex = '/^\.\.\//';
+ $url = preg_replace($relativeRegex, base_url(), $url);
+ }
+
+ return $url;
+ }
+
}
diff --git a/application/controllers/api/frontend/v1/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..f53a4105c 100644
--- a/application/controllers/api/frontend/v1/Studium.php
+++ b/application/controllers/api/frontend/v1/Studium.php
@@ -62,21 +62,36 @@ class Studium extends FHCAPI_Controller
if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester->studiensemester_kurzbz]);
- $studentLehrverband = current($this->getDataOrTerminateWithError($studentLehrverband));
-
- $student_studiensemester = $studentLehrverband->studiensemester_kurzbz;
- $student_studiengang = $studentLehrverband->studiengang_kz;
- $student_semester = $studentLehrverband->semester;
+
+ //TODO(Manu) check if use Fallback or just comment out all paramschecks?
+ //add Fallback: if no LehrverbandData of actual semester, get Data of previous one
+ if(!hasData($studentLehrverband))
+ {
+ $result= $this->StudiensemesterModel->getPreviousFrom($aktuelles_studiensemester->studiensemester_kurzbz);
+
+ $data = $this->getDataOrTerminateWithError($result);
+ $vorheriges_studiensemester = current($data)->studiensemester_kurzbz;
+ $studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $vorheriges_studiensemester]);
+ }
+ $studentLehrverband = current(getData($studentLehrverband));
+
$student_studienplan = $this->getStudienPlanFromPrestudentStatus(getAuthPersonId())->studienplan_id;
- if(!isset($parameter_studiensemester))
- $parameter_studiensemester = $student_studiensemester;
- if(!isset($parameter_studiengang))
- $parameter_studiengang = $student_studiengang;
- if(!isset($parameter_semester))
- $parameter_semester = $student_semester;
+ if(!isset($parameter_studiensemester)) {
+ $student_studiensemester = $studentLehrverband->studiensemester_kurzbz;
+ $parameter_studiensemester = $student_studiensemester;
+ }
+ if(!isset($parameter_studiengang)) {
+ $student_studiengang = $studentLehrverband->studiengang_kz;
+ $parameter_studiengang = $student_studiengang;
+ }
+ if(!isset($parameter_semester)) {
+ $student_semester = $studentLehrverband->semester;
+ $parameter_semester = $student_semester;
+ }
if(!isset($parameter_studienplan))
- $parameter_studienplan = $student_studienplan;
+ $parameter_studienplan = $student_studienplan;
+
}
if(isset($parameter_studiensemester)){
@@ -96,8 +111,7 @@ class Studium extends FHCAPI_Controller
// fetch studiensemester
$allStudienSemester = $this->getDataOrTerminateWithError($this->StudiensemesterModel->load());
-
-
+
if(isset($parameter_studiensemester) && !empty(array_filter($allStudienSemester, function($studiensemester) use($parameter_studiensemester){
return $studiensemester->studiensemester_kurzbz == $parameter_studiensemester->studiensemester_kurzbz;
}))){
@@ -216,6 +230,8 @@ class Studium extends FHCAPI_Controller
$studienplaene = array_map(function($studienplan){
$orgform = current($this->getDataOrTerminateWithError($this->OrgformModel->loadWhere(["orgform_kurzbz" => $studienplan->orgform_kurzbz])));
$studienplan->orgform_bezeichnung = $orgform->bezeichnung;
+ // bezeichnung_mehrsprachig
+ $studienplan->orgform_bezeichnung_english = $orgform->bezeichnung_mehrsprachig[1];
return $studienplan;
},$studienplaene);
return $studienplaene;
diff --git a/application/controllers/api/frontend/v1/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/Gruppe.php b/application/controllers/api/frontend/v1/lv/Gruppe.php
index b94f1f604..a0a2db86d 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 913a57dc4..b47a4af87 100644
--- a/application/controllers/api/frontend/v1/stv/Dokumente.php
+++ b/application/controllers/api/frontend/v1/stv/Dokumente.php
@@ -170,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(
@@ -180,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 d59bc76b0..2654c18f6 100644
--- a/application/controllers/api/frontend/v1/stv/Konto.php
+++ b/application/controllers/api/frontend/v1/stv/Konto.php
@@ -429,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);
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..39ed72072 100644
--- a/application/controllers/api/frontend/v1/stv/Students.php
+++ b/application/controllers/api/frontend/v1/stv/Students.php
@@ -25,9 +25,6 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
*/
class Students extends FHCAPI_Controller
{
- private $allowedStgs = [];
-
-
public function __construct()
{
$permissions = [];
@@ -35,16 +32,17 @@ class Students extends FHCAPI_Controller
$permissions[$router->method] = ['admin:r', 'assistenz:r'];
parent::__construct($permissions);
- $this->allowedStgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: [];
- $this->allowedStgs = array_merge($this->allowedStgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
+ $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: [];
+ $allowedStgs = array_merge($allowedStgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
- if (!$this->allowedStgs) {
+ if (!$allowedStgs) {
$this->_outputAuthError([$router->method => ['admin:r', 'assistenz:r']]);
exit;
}
// Load Libraries
$this->load->library('PhrasesLib');
+ $this->load->library('stv/StudentListLib', ['allowedStgs' => $allowedStgs]);
$this->loadPhrases(
array(
'lehre'
@@ -111,23 +109,19 @@ class Students extends FHCAPI_Controller
]);
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
-
-
- $this->PrestudentModel->addJoin(
+ $this->studentlistlib->addJoin(
"(
SELECT prestudent_id
FROM public.tbl_prestudentstatus
WHERE status_kurzbz = 'Incoming'
AND studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
) test",
- "prestudent_id"
+ "prestudent_id",
+ "",
+ "start"
);
-
- $this->prepareQuery($studiensemester_kurzbz);
-
- $this->PrestudentModel->addSelect("COALESCE(
+ $this->studentlistlib->addSelect("COALESCE(
v.semester::text,
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
@@ -135,19 +129,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);
}
@@ -164,10 +155,7 @@ class Students extends FHCAPI_Controller
]);
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
-
-
- $this->PrestudentModel->addJoin(
+ $this->studentlistlib->addJoin(
"(
SELECT prestudent_id
FROM bis.tbl_bisio bis
@@ -187,14 +175,12 @@ class Students extends FHCAPI_Controller
) AND stdsem.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
GROUP BY prestudent_id
) test",
- "prestudent_id"
+ "prestudent_id",
+ "",
+ "start"
);
-
- $this->prepareQuery($studiensemester_kurzbz);
-
-
- $this->PrestudentModel->addSelect("COALESCE(
+ $this->studentlistlib->addSelect("COALESCE(
v.semester::text,
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
@@ -202,19 +188,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);
}
@@ -231,23 +214,18 @@ class Students extends FHCAPI_Controller
]);
- $this->load->model('crm/Prestudent_model', 'PrestudentModel');
-
-
- $this->PrestudentModel->addJoin(
+ $this->studentlistlib->addJoin(
"(
SELECT prestudent_id
FROM bis.tbl_mobilitaet
WHERE studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
) bis",
- "prestudent_id"
+ "prestudent_id",
+ "",
+ "start"
);
-
- $this->prepareQuery($studiensemester_kurzbz);
-
-
- $this->PrestudentModel->addSelect("COALESCE(
+ $this->studentlistlib->addSelect("COALESCE(
v.semester::text,
CASE
WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
@@ -255,65 +233,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 +311,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 +354,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 +424,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 +437,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 +468,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 +488,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 +526,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 +547,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 +568,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 +605,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 +640,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 +649,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 +658,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 +686,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 +695,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 +722,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 +731,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 +756,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 +771,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 +782,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 +840,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/frontend/v1/tempus/Config.php b/application/controllers/api/frontend/v1/tempus/Config.php
index 0e7e4e20e..69711d455 100644
--- a/application/controllers/api/frontend/v1/tempus/Config.php
+++ b/application/controllers/api/frontend/v1/tempus/Config.php
@@ -11,9 +11,10 @@ class Config extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
- 'get' => ['admin:r', 'assistenz:r'],
- 'getHeader' => ['admin:r', 'assistenz:r'],
- 'set' => ['admin:r', 'assistenz:r'],
+ 'get' => ['admin:r', 'assistenz:rw', 'lehre/lvplan:rw'],
+ 'getHeader' => ['admin:r', 'assistenz:rw', 'lehre/lvplan:rw'],
+ 'set' => ['admin:r', 'assistenz:rw', 'lehre/lvplan:rw'],
+ 'updateCollision' => ['admin:r', 'assistenz:rw', 'lehre/lvplan:rw'],
]);
// Load Phrases
@@ -23,15 +24,25 @@ class Config extends FHCAPI_Controller
$this->_ci = &get_instance();
$this->_ci->load->model('ressource/Kalenderstatus_model', 'KalenderStatusModel');
+ $this->_ci->load->model('system/Variable_model', 'VariableModel');
+ $this->_ci->load->library('VariableLib', array('uid' => getAuthUID()));
}
public function get()
{
- $this->_ci->load->model('system/Variable_model', 'VariableModel');
-
$config = [];
- $result = $this->_ci->VariableModel->getVariables(getAuthUID(), ['ignore_kollision', 'kollision_student', 'ignore_reservierung', 'ignore_zeitsperre', 'ignore_resources_collisions']);
+ $var_array = array(
+ 'ignore_kollision',
+ 'kollision_student',
+ 'ignore_reservierung',
+ 'ignore_zeitsperre',
+ 'ignore_resources_collisions',
+ 'roomless_planning',
+ 'priority_room_planning',
+ 'dialog_room_planning'
+ );
+ $result = $this->_ci->VariableModel->getVariables(getAuthUID(), $var_array);
$data = $this->getDataOrTerminateWithError($result);
$config['ignore_kollision'] = [
@@ -66,6 +77,25 @@ class Config extends FHCAPI_Controller
"value" => ($data['ignore_resources_collisions'] ?? 'false') === 'true'
];
+ $config['roomless_planning'] = [
+ "type" => "checkbox",
+ "label" => $this->p->t('ui', 'roomless_planning'),
+ "value" => ($data['roomless_planning'] ?? 'false') === 'true'
+ ];
+
+ $config['priority_room_planning'] = [
+ "type" => "checkbox",
+ "label" => $this->p->t('ui', 'priority_room_planning'),
+ "value" => ($data['priority_room_planning'] ?? 'false') === 'true'
+ ];
+
+ $config['dialog_room_planning'] = [
+ "type" => "checkbox",
+ "label" => $this->p->t('ui', 'dialog_room_planning'),
+ "value" => ($data['dialog_room_planning'] ?? 'false') === 'true'
+ ];
+
+
$this->terminateWithSuccess($config);
}
public function getHeader()
@@ -91,35 +121,37 @@ class Config extends FHCAPI_Controller
public function set()
{
- $this->_ci->load->model('system/Variable_model', 'VariableModel');
-
- $this->_ci->VariableModel->setVariable(
- getAuthUID(),
+ $configs = array(
'ignore_kollision',
- $this->input->post('ignore_kollision') === true ? 'true' : 'false'
- );
- $this->_ci->VariableModel->setVariable(
- getAuthUID(),
'kollision_student',
- $this->input->post('kollision_student') === true ? 'true' : 'false'
- );
- $this->_ci->VariableModel->setVariable(
- getAuthUID(),
'ignore_reservierung',
- $this->input->post('ignore_reservierung') === true ? 'true' : 'false'
- );
- $this->_ci->VariableModel->setVariable(
- getAuthUID(),
'ignore_zeitsperre',
- $this->input->post('ignore_zeitsperre') === true ? 'true' : 'false'
- );
- $this->_ci->VariableModel->setVariable(
- getAuthUID(),
'ignore_resources_collisions',
- $this->input->post('ignore_resources_collisions') === true ? 'true' : 'false'
+ 'roomless_planning',
+ 'priority_room_planning',
+ 'dialog_room_planning'
);
+
+ foreach ($configs as $config)
+ {
+ $this->_ci->VariableModel->setVariable(
+ getAuthUID(),
+ $config,
+ $this->input->post($config) === true ? 'true' : 'false'
+ );
+ }
+
$this->terminateWithSuccess();
}
+ public function updateCollision()
+ {
+ $original_ignore = $this->_ci->variablelib->getVar('ignore_kollision');
+ $this->_ci->VariableModel->setVariable(
+ getAuthUID(),
+ 'ignore_kollision',
+ $original_ignore === 'true' ? 'false' : 'true'
+ );
+ }
}
diff --git a/application/controllers/api/frontend/v1/tempus/Coursepicker.php b/application/controllers/api/frontend/v1/tempus/Coursepicker.php
index 73414c75e..28b10920f 100644
--- a/application/controllers/api/frontend/v1/tempus/Coursepicker.php
+++ b/application/controllers/api/frontend/v1/tempus/Coursepicker.php
@@ -5,11 +5,13 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
class Coursepicker extends FHCAPI_Controller
{
private $_ci;
+
+ const ALLOWED_COURSE_FILTER = ['uid', 'stg'];
+
public function __construct()
{
parent::__construct([
- 'search' => self::PERM_LOGGED,
- 'getByStg' => self::PERM_LOGGED
+ 'getCourses' => 'lehre/lvplan:rw',
]);
$this->_ci = &get_instance();
@@ -22,88 +24,42 @@ class Coursepicker extends FHCAPI_Controller
$this->loadPhrases(['ui']);
}
- public function search()
+ public function getCourses()
{
- $query = $this->input->get('query');
- if (is_null($query))
- $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+ $this->_ci->form_validation->set_data($_POST);
+ $this->_ci->form_validation->set_rules('studiensemester_kurzbz',"studiensemester_kurzbz","required");
- $query_words = explode(' ', $query);
+ if($this->_ci->form_validation->run() === FALSE)
+ $this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
- //TODO Where weiter anpassen z.B. Fachbereich
- $this->_ci->LehreinheitModel->addSelect('tbl_lehreinheit.lehreinheit_id,
- tbl_lehreinheit.unr,
- tbl_lehreinheit.lvnr,
- tbl_lehreinheit.lehrfach_id,
- lehrfach.kurzbz AS lehrfach,
- lehrfach.bezeichnung AS lehrfach_bez,
- lehrfach.farbe AS lehrfach_farbe,
- tbl_lehreinheit.lehrform_kurzbz AS lehrform,
- lema.mitarbeiter_uid AS lektor_uid,
- tbl_mitarbeiter.kurzbz AS lektor,
- tbl_studiengang.studiengang_kz,
- upper(tbl_studiengang.typ::character varying::text || tbl_studiengang.kurzbz::text) AS studiengang,
- lvb.semester,
- lvb.verband,
- lvb.gruppe,
- lvb.gruppe_kurzbz,
- tbl_lehreinheit.raumtyp,
- tbl_lehreinheit.raumtypalternativ,
- tbl_lehreinheit.stundenblockung,
- tbl_lehreinheit.wochenrythmus,
- lema.semesterstunden,
- lema.planstunden,
- tbl_lehreinheit.start_kw,
- tbl_lehreinheit.anmerkung,
- tbl_lehreinheit.studiensemester_kurzbz');
+ $studiensemester_kurzbz = $this->_ci->input->post('studiensemester_kurzbz', TRUE);
- $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehreinheitmitarbeiter lema', 'tbl_lehreinheit.lehreinheit_id = lema.lehreinheit_id');
- $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehreinheitgruppe lvb', 'tbl_lehreinheit.lehreinheit_id = lvb.lehreinheit_id');
- $this->_ci->LehreinheitModel->addJoin('public.tbl_studiengang', 'lvb.studiengang_kz = tbl_studiengang.studiengang_kz');
- $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung lehrfach', 'tbl_lehreinheit.lehrfach_id = lehrfach.lehrveranstaltung_id');
- $this->_ci->LehreinheitModel->addJoin('public.tbl_mitarbeiter', 'lema.mitarbeiter_uid = tbl_mitarbeiter.mitarbeiter_uid');
- $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrform', 'tbl_lehrform.lehrform_kurzbz = tbl_lehreinheit.lehrform_kurzbz');
+ $filter = $this->_checkFilter(self::ALLOWED_COURSE_FILTER);
- $this->_ci->MitarbeiterModel->db->group_start();
+ $this->_getBasePlan($studiensemester_kurzbz);
- foreach ($query_words as $word)
+ $this->_ci->LehreinheitModel->db->group_start();
+ if (isset($filter->stg))
+ $this->_addStgWhere($filter->stg);
+
+ if (isset($filter->uid))
{
- $this->_ci->LehreinheitModel->db->group_start();
- $this->_ci->LehreinheitModel->db->where('lema.mitarbeiter_uid ILIKE', "%" . $word . "%");
- $this->_ci->LehreinheitModel->db->or_where('lvb.gruppe_kurzbz ILIKE', "%" . $word . "%");
- $this->_ci->LehreinheitModel->db->or_where('tbl_studiengang.kurzbzlang ILIKE', "%" . $word . "%");
- $this->_ci->LehreinheitModel->db->or_where('lvb.verband ILIKE', "%" . $word . "%");
- $this->_ci->LehreinheitModel->db->or_where('lvb.gruppe ILIKE', "%" . $word . "%");
- $this->_ci->LehreinheitModel->db->or_where('lehrfach.bezeichnung ILIKE', "%" . $word . "%");
-
- if (is_numeric($word))
- {
- $this->_ci->LehreinheitModel->db->or_where('tbl_studiengang.studiengang_kz', $word);
- $this->_ci->LehreinheitModel->db->or_where('lvb.semester', $word);
- }
- $this->_ci->LehreinheitModel->db->group_end();
-
+ $uid_array = (array) $filter->uid;
+ $this->_ci->LehreinheitModel->db->or_where_in('tbl_benutzer.uid', $uid_array);
}
+
$this->_ci->LehreinheitModel->db->group_end();
- $this->_ci->LehreinheitModel->db->where('tbl_lehreinheit.studiensemester_kurzbz = \'SS2025\'');
- $this->_ci->LehreinheitModel->db->where(array('tbl_lehrform.verplanen' => true));
+ $this->_ci->LehreinheitModel->addOrder('lehreinheit_id');
$result = $this->_ci->LehreinheitModel->load();
-
- $this->terminateWithSuccess(hasData($result) ? getData($result) : array());
+ $result = hasData($result) ? getData($result) : array();
+ $this->terminateWithSuccess($this->_mapEvents($result));
}
- public function getByStg()
+ private function _getBasePlan($studiensemester_kurzbz)
{
- //TODO check einbauen ob studiensemester und stg vorhanden ist
- $stg = $this->input->get('stg');
- $studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz');
- if (is_null($stg) || is_null($studiensemester_kurzbz))
- $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
-
$this->_ci->LehreinheitModel->addSelect('
tbl_lehreinheit.lehreinheit_id,
- tbl_lehreinheit.unr,
tbl_lehreinheit.lvnr,
tbl_lehreinheit.lehrfach_id,
lehrfach.kurzbz AS lehrfach,
@@ -133,28 +89,72 @@ class Coursepicker extends FHCAPI_Controller
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehreinheitmitarbeiter lema', 'tbl_lehreinheit.lehreinheit_id = lema.lehreinheit_id');
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehreinheitgruppe lvb', 'tbl_lehreinheit.lehreinheit_id = lvb.lehreinheit_id');
$this->_ci->LehreinheitModel->addJoin('public.tbl_studiengang', 'lvb.studiengang_kz = tbl_studiengang.studiengang_kz');
+ $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung', 'tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id');
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung lehrfach', 'tbl_lehreinheit.lehrfach_id = lehrfach.lehrveranstaltung_id');
$this->_ci->LehreinheitModel->addJoin('public.tbl_mitarbeiter ma', 'lema.mitarbeiter_uid = ma.mitarbeiter_uid');
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrform', 'tbl_lehrform.lehrform_kurzbz = tbl_lehreinheit.lehrform_kurzbz');
$this->_ci->LehreinheitModel->addJoin('public.tbl_benutzer', 'ma.mitarbeiter_uid = tbl_benutzer.uid');
$this->_ci->LehreinheitModel->addJoin('public.tbl_person', 'tbl_benutzer.person_id = tbl_person.person_id');
- $result = $this->_ci->LehreinheitModel->loadWhere(array(
- 'tbl_lehrform.verplanen' => true,
- 'tbl_studiengang.studiengang_kz' => $stg,
- 'tbl_lehreinheit.studiensemester_kurzbz' => $studiensemester_kurzbz
- ));
+ $this->_ci->LehreinheitModel->db->group_start();
+ $this->_ci->LehreinheitModel->db->where('tbl_lehrform.verplanen', true);
+ $this->_ci->LehreinheitModel->db->where('tbl_lehreinheit.studiensemester_kurzbz', $studiensemester_kurzbz);
+ $this->_ci->LehreinheitModel->db->group_end();
+
+ }
+
+ private function _addStgWhere($studiengaenge)
+ {
+ $this->_ci->LehreinheitModel->db->group_start();
+ $first = true;
+ foreach ($studiengaenge as $studiengang)
+ {
+ if ($first)
+ $this->_ci->LehreinheitModel->db->group_start();
+ else
+ {
+ $this->_ci->LehreinheitModel->db->or_group_start();
+ }
+ $first = false;
+
+ $this->_ci->LehreinheitModel->db->where('tbl_lehrveranstaltung.studiengang_kz', $studiengang['stg_kz']);
+
+ if (isset($studiengang['semester']))
+ $this->_ci->LehreinheitModel->db->where('tbl_lehrveranstaltung.semester', $studiengang['semester']);
+
+ if (isset($studiengang['orgform_kurzbz']))
+ $this->_ci->LehreinheitModel->db->where('tbl_lehrveranstaltung.orgform_kurzbz', $studiengang['orgform_kurzbz']);
+
+ $this->_ci->LehreinheitModel->db->group_end();
+ }
+ $this->_ci->LehreinheitModel->db->group_end();
+ }
+
+ private function _mapEvents($result)
+ {
+ $lehreinheit_ids = array_values(array_unique(array_column($result, 'lehreinheit_id')));
+
+ $offen_map = array();
+ if (!empty($lehreinheit_ids))
+ {
+ $offen_result = $this->_ci->LehreinheitModel->getOffeneStunden($lehreinheit_ids);
+ if (hasData($offen_result))
+ {
+ foreach (getData($offen_result) as $row)
+ {
+ $offen_map[$row->lehreinheit_id . '_' . $row->mitarbeiter_uid] = $row;
+ }
+ }
+ }
- $result = hasData($result) ? getData($result) : array();
$grouped = array();
foreach ($result as $row)
{
- $unr = $row->unr;
- if (!isset($grouped[$unr]))
+ $lehreinheit_id = $row->lehreinheit_id;
+ if (!isset($grouped[$lehreinheit_id]))
{
- $grouped[$unr] = (object)array(
- 'unr' => $row->unr,
+ $grouped[$lehreinheit_id] = (object)array(
'lehrfach_id' => $row->lehrfach_id,
'lehrfach_bez' => $row->lehrfach_bez,
'lehrfach_farbe' => $row->lehrfach_farbe,
@@ -170,7 +170,7 @@ class Coursepicker extends FHCAPI_Controller
'studiensemester_kurzbz' => $row->studiensemester_kurzbz,
'fachbereich_kurzbz' => isset($row->fachbereich_kurzbz) ? $row->fachbereich_kurzbz : null,
'lektoren' => array(),
- 'lehreinheit_id' => array(),
+ 'lehreinheit_id' => $lehreinheit_id,
'lvnr' => array(),
'lehrfach' => array(),
'lehrform' => array(),
@@ -186,7 +186,7 @@ class Coursepicker extends FHCAPI_Controller
);
}
- $group = $grouped[$unr];
+ $group = $grouped[$lehreinheit_id];
$group->lektoren[$row->lektor_uid] = (object)array(
'uid' => $row->lektor_uid,
@@ -194,7 +194,6 @@ class Coursepicker extends FHCAPI_Controller
'name' => $row->vorname . ' ' . $row->nachname,
);
- $group->lehreinheit_id[] = $row->lehreinheit_id;
$group->lvnr[] = $row->lvnr;
$group->lehrfach[] = $row->lehrfach;
$group->lehrform[] = $row->lehrform;
@@ -202,9 +201,15 @@ class Coursepicker extends FHCAPI_Controller
$group->wochenrythmus[] = $row->wochenrythmus;
$group->planstunden[] = $row->planstunden;
$group->start_kw[] = $row->start_kw;
- $group->verplant[] = isset($row->verplant) ? $row->verplant : 0;
- $group->offenestunden[] = isset($row->offenestunden) ? $row->offenestunden : 0;
- $group->verplant_gesamt += isset($row->verplant) ? $row->verplant : 0;
+
+ $offen_key = $lehreinheit_id . '_' . $row->lektor_uid;
+ $offen = isset($offen_map[$offen_key]) ? $offen_map[$offen_key] : null;
+ $verplant_wert = $offen ? $offen->verplant : 0;
+ $offenestunden_wert = $offen ? $offen->offenestunden : 0;
+
+ $group->verplant[] = $verplant_wert;
+ $group->offenestunden[] = $offenestunden_wert;
+ $group->verplant_gesamt += $verplant_wert;
$lvb = $row->studiengang . '-' . $row->semester;
@@ -235,20 +240,37 @@ class Coursepicker extends FHCAPI_Controller
$group->verplant = $this->_formatArr($group->verplant);
$group->offenestunden = $this->_formatArr($group->offenestunden);
}
-
- $this->terminateWithSuccess(array_values($grouped));
+ return array_values($grouped);
}
-
private function _formatArr($arr)
{
$values = array_values(array_unique($arr));
$formatted = implode(' ', $values);
- if (count($formatted) > 1)
+ if (count($values) > 1)
$formatted .= ' ?';
return $formatted;
}
+ private function _checkFilter($filters)
+ {
+ $filter_valid = false;
+ $filter_object = new stdClass();
+ foreach ($filters as $filter)
+ {
+ if ($this->_ci->input->post($filter))
+ {
+ $filter_valid = true;
+ $filter_object->$filter = $this->_ci->input->post($filter);
+ }
+ }
+
+ if (!$filter_valid)
+ $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ return $filter_object;
+ }
+
}
diff --git a/application/controllers/api/frontend/v1/lv/Favorites.php b/application/controllers/api/frontend/v1/tempus/Favorites.php
similarity index 70%
rename from application/controllers/api/frontend/v1/lv/Favorites.php
rename to application/controllers/api/frontend/v1/tempus/Favorites.php
index 080a4ec6e..3bfb5b9c1 100644
--- a/application/controllers/api/frontend/v1/lv/Favorites.php
+++ b/application/controllers/api/frontend/v1/tempus/Favorites.php
@@ -7,8 +7,8 @@ class Favorites extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
- 'index' => self::PERM_LOGGED,
- 'set' => self::PERM_LOGGED
+ 'index' => 'lehre/lvplan:rw',
+ 'set' => 'lehre/lvplan:rw'
]);
// Load models
@@ -17,14 +17,14 @@ class Favorites extends FHCAPI_Controller
public function index()
{
- $result = $this->VariableModel->getVariables(getAuthUID(), ['lv_favorites']);
+ $result = $this->VariableModel->getVariables(getAuthUID(), ['tempus_favorites']);
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
$this->terminateWithSuccess(null);
else
- $this->terminateWithSuccess(isset($data['lv_favorites']) ? $data['lv_favorites'] : null);
+ $this->terminateWithSuccess(isset($data['tempus_favorites']) ? $data['tempus_favorites'] : null);
}
public function set()
@@ -38,7 +38,7 @@ class Favorites extends FHCAPI_Controller
$favorites = $this->input->post('favorites');
- $result = $this->VariableModel->setVariable(getAuthUID(), 'lv_favorites', $favorites);
+ $result = $this->VariableModel->setVariable(getAuthUID(), 'tempus_favorites', $favorites);
$this->getDataOrTerminateWithError($result);
diff --git a/application/controllers/api/frontend/v1/tempus/Info.php b/application/controllers/api/frontend/v1/tempus/Info.php
new file mode 100644
index 000000000..9ef71da3e
--- /dev/null
+++ b/application/controllers/api/frontend/v1/tempus/Info.php
@@ -0,0 +1,37 @@
+ 'lehre/lvplan:rw',
+ ]);
+
+ $this->_ci =& get_instance();
+
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $this->loadPhrases([
+ 'ui'
+ ]);
+
+ }
+
+ public function getStudiengaenge()
+ {
+ $this->_ci->StudiengangModel->addDistinct();
+ $this->_ci->StudiengangModel->addSelect('studiengang_kz');
+ $this->_ci->StudiengangModel->addSelect("CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name");
+
+ $result = $this->getDataOrTerminateWithError($this->_ci->StudiengangModel->load());
+ $this->terminateWithSuccess($result);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/tempus/Kalender.php b/application/controllers/api/frontend/v1/tempus/Kalender.php
index d6050c65c..e2c8a0e70 100644
--- a/application/controllers/api/frontend/v1/tempus/Kalender.php
+++ b/application/controllers/api/frontend/v1/tempus/Kalender.php
@@ -8,29 +8,35 @@ class Kalender extends FHCAPI_Controller
const ALLOWED_PLAN_FILTER = ['ort', 'uid', 'stg'];
const ALLOWED_ROOM_FILTER = ['lehreinheit_id', 'kalender_id'];
- const ALLOWED_TO_UPDATE = ['start_time', 'end_time', 'ort_kurzbz'];
+ const ALLOWED_TO_UPDATE = ['start_time', 'end_time', 'orte'];
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
- 'getStunden' => self::PERM_LOGGED,
- 'getCalendarHours' => self::PERM_LOGGED,
- 'getPlan' => self::PERM_LOGGED,
- 'getPlanByOrt' => self::PERM_LOGGED,
- 'getRaumvorschlag' => self::PERM_LOGGED,
+ 'getStunden' => 'lehre/lvplan:rw',
+ 'getCalendarHours' => 'lehre/lvplan:rw',
+ 'getPlan' => 'lehre/lvplan:rw',
+ 'getPlanByOrt' => 'lehre/lvplan:rw',
+ 'getRaumvorschlag' => 'lehre/lvplan:rw',
+ 'getRaumvorschlagSlots' => 'lehre/lvplan:rw',
+ 'getLehreinheiten' => 'lehre/lvplan:rw',
'getHistory' => 'lehre/lvplan:rw',
'deleteEntry' => 'lehre/lvplan:rw',
'syncToLecturer' => 'lehre/lvplan:rw',
'syncToStudent' => 'lehre/lvplan:rw',
'getPlanLecturer' =>'lehre/lvplan:rw',
'getPlanStudent' => 'lehre/lvplan:rw',
- 'getZeitwuensche' => self::PERM_LOGGED,
- 'getZeitsperren' => self::PERM_LOGGED,
+ 'getZeitwuensche' => 'lehre/lvplan:rw',
+ 'getZeitsperren' => 'lehre/lvplan:rw',
'updateKalenderEvent' => 'lehre/lvplan:rw',
+ 'deleteOrtEntry' => 'lehre/lvplan:rw',
+ 'deleteFromKalenderEvent' => 'lehre/lvplan:rw',
'addKalenderEvent' => 'lehre/lvplan:rw',
- 'addReservierung' => 'lehre/lvplan:rw',
+ 'calculateMultiWeekPlan' => 'lehre/lvplan:rw',
+ 'confirmMultiWeekPlan' => 'lehre/lvplan:rw',
+ 'addToKalenderEvent' => 'lehre/lvplan:rw',
'sync' => 'lehre/lvplan:rw',
]);
@@ -39,6 +45,7 @@ class Kalender extends FHCAPI_Controller
$this->_ci->load->library('LogLib');
$this->_ci->load->library('form_validation');
$this->_ci->load->library('KalenderLib', ["uid" => getAuthUID()]);
+ $this->_ci->load->library('KalenderSyncLib');
$this->_ci->load->library('RaumvorschlagLib', ["uid" => getAuthUID()]);
$this->loadPhrases([
'ui'
@@ -87,15 +94,15 @@ class Kalender extends FHCAPI_Controller
public function getPlan()
{
- $this->_ci->form_validation->set_data($_GET);
+ $this->_ci->form_validation->set_data($_POST);
$this->_ci->form_validation->set_rules('start_date',"start_date","required");
$this->_ci->form_validation->set_rules('end_date',"end_date","required");
if($this->_ci->form_validation->run() === FALSE)
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
- $start_date = $this->_ci->input->get('start_date', TRUE);
- $end_date = $this->_ci->input->get('end_date', TRUE);
+ $start_date = $this->_ci->input->post('start_date', TRUE);
+ $end_date = $this->_ci->input->post('end_date', TRUE);
$filter = $this->_checkFilter(self::ALLOWED_PLAN_FILTER);
@@ -217,7 +224,24 @@ class Kalender extends FHCAPI_Controller
$updateFields = $this->_checkUpdate($this->_ci->input->post('updatedInfos', TRUE));
$kalender_id = $this->_ci->input->post('kalender_id', TRUE);
- $result = $this->_ci->kalenderlib->updateKalenderEvent($kalender_id, $updateFields->ort_kurzbz ?? null, $updateFields->start_time ?? null, $updateFields->end_time ?? null);
+ $result = $this->_ci->kalenderlib->updateKalenderEvent($kalender_id, $updateFields->orte ?? null, $updateFields->start_time ?? null, $updateFields->end_time ?? null, $updateFields->location ?? null);
+
+ if (isError($result))
+ $this->terminateWithError(getError($result), $result->code);
+
+ $this->terminateWithSuccess(getData($result));
+ }
+
+ public function deleteOrtEntry()
+ {
+ $this->_ci->form_validation->set_data($_POST);
+ $this->_ci->form_validation->set_rules('kalender_id',"kalender_id","required");
+
+ if($this->_ci->form_validation->run() === FALSE)
+ $this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
+
+ $kalender_id = $this->_ci->input->post('kalender_id', TRUE);
+ $result = $this->_ci->kalenderlib->updateOrt($kalender_id, []);
if (isError($result))
$this->terminateWithError(getError($result), $result->code);
@@ -227,12 +251,41 @@ class Kalender extends FHCAPI_Controller
public function getRaumvorschlag()
{
- $this->_ci->form_validation->set_data($_GET);
+ $this->_ci->form_validation->set_data($_POST);
$filter = $this->_checkFilter(self::ALLOWED_ROOM_FILTER);
$this->terminateWithSuccess($this->_ci->raumvorschlaglib->getVorschlaege($filter->kalender_id));
}
+ public function getRaumvorschlagSlots()
+ {
+ $this->_ci->form_validation->set_data($_GET);
+ $this->_ci->form_validation->set_rules('lehreinheit_id',"lehreinheit_id","required");
+ $this->_ci->form_validation->set_rules('start_date',"start_date","required");
+ $this->_ci->form_validation->set_rules('end_date',"end_date","required");
+
+ if($this->_ci->form_validation->run() === FALSE)
+ $this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
+
+ $lehreinheit_id = $this->_ci->input->get('lehreinheit_id', TRUE);
+ $start_date = $this->_ci->input->get('start_date', TRUE);
+ $end_date = $this->_ci->input->get('end_date', TRUE);
+ $this->terminateWithSuccess(getData($this->_ci->raumvorschlaglib->getVorschlaegeSlots($lehreinheit_id, $start_date, $end_date)));
+ }
+
+ public function getLehreinheiten()
+ {
+ $this->_ci->form_validation->set_data($_GET);
+ $this->_ci->form_validation->set_rules('kalender_id', "kalender_id", "required");
+ $kalender_id = $this->_ci->input->get('kalender_id', TRUE);
+ $result = $this->_ci->kalenderlib->getLehreinheiten($kalender_id);
+
+ if (isError($result))
+ $this->terminateWithError(getError($result));
+
+ $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
public function getHistory()
{
$this->_ci->form_validation->set_data($_GET);
@@ -271,7 +324,7 @@ class Kalender extends FHCAPI_Controller
public function sync()
{
- $result = $this->_ci->kalenderlib->sync();
+ $result = $this->_ci->kalendersynclib->sync();
$this->terminateWithSuccess(getData($result));
}
public function syncToLecturer()
@@ -322,8 +375,6 @@ class Kalender extends FHCAPI_Controller
$ort_kurzbz = $this->_ci->input->post('ort_kurzbz', TRUE);
$start_date = $this->_ci->input->post('start_date', TRUE);
$end_date = $this->_ci->input->post('end_date', TRUE);
-
-
$result = $this->_ci->kalenderlib->addKalenderEvent($start_date, $end_date, $lehreinheit_id, $ort_kurzbz);
if (isError($result))
@@ -332,26 +383,22 @@ class Kalender extends FHCAPI_Controller
$this->terminateWithSuccess(getData($result));
}
- public function addReservierung()
+ public function calculateMultiWeekPlan()
{
$this->_ci->form_validation->set_data($_POST);
- $this->_ci->form_validation->set_rules('titel',"titel","required");
- $this->_ci->form_validation->set_rules('beschreibung',"beschreibung","required");
- $this->_ci->form_validation->set_rules('ort_kurzbz',"ort_kurzbz","required");
+ $this->_ci->form_validation->set_rules('lehreinheit_id',"lehreinheit_id","required");
$this->_ci->form_validation->set_rules('start_date',"start_date","required");
$this->_ci->form_validation->set_rules('end_date',"end_date","required");
if($this->_ci->form_validation->run() === FALSE)
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
- $titel = $this->_ci->input->post('titel', TRUE);
- $beschreibung = $this->_ci->input->post('beschreibung', TRUE);
+ $lehreinheit_id = $this->_ci->input->post('lehreinheit_id', TRUE);
$ort_kurzbz = $this->_ci->input->post('ort_kurzbz', TRUE);
$start_date = $this->_ci->input->post('start_date', TRUE);
$end_date = $this->_ci->input->post('end_date', TRUE);
-
- $result = $this->_ci->kalenderlib->addReservierung($titel, $beschreibung, $ort_kurzbz, $start_date, $end_date);
+ $result = $this->_ci->kalenderlib->calculateMultiWeekPlan($start_date, $end_date, $lehreinheit_id, $ort_kurzbz);
if (isError($result))
$this->terminateWithError(getError($result));
@@ -359,16 +406,78 @@ class Kalender extends FHCAPI_Controller
$this->terminateWithSuccess(getData($result));
}
+ public function confirmMultiWeekPlan()
+ {
+ $this->_ci->form_validation->set_data($_POST);
+ $this->_ci->form_validation->set_rules('plan[]',"plan","required");
+ $this->_ci->form_validation->set_rules('lehreinheit_id',"lehreinheit_id","required");
+
+ if($this->_ci->form_validation->run() === FALSE)
+ $this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
+
+ $plan = $this->_ci->input->post('plan', TRUE);
+ $lehreinheit_id = $this->_ci->input->post('lehreinheit_id', TRUE);
+
+ $result = $this->_ci->kalenderlib->confirmMultiWeekPlan($plan, $lehreinheit_id);
+
+ if (isError($result))
+ $this->terminateWithError(getError($result));
+
+ $this->terminateWithSuccess(getData($result));
+ }
+
+ public function addToKalenderEvent()
+ {
+ $this->_ci->form_validation->set_data($_POST);
+ $this->_ci->form_validation->set_rules('target_kalender_id',"target_kalender_id","required");
+ $this->_ci->form_validation->set_rules('lehreinheit_id',"lehreinheit_id","required");
+
+ if($this->_ci->form_validation->run() === FALSE)
+ $this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
+
+ $target_kalender_id = $this->_ci->input->post('target_kalender_id', TRUE);
+ $lehreinheit_id = $this->_ci->input->post('lehreinheit_id', TRUE);
+
+ $result = $this->_ci->kalenderlib->addToKalenderEvent($target_kalender_id, $lehreinheit_id);
+
+ if (isError($result))
+ $this->terminateWithError(getError($result));
+
+ $this->terminateWithSuccess(getData($result));
+ }
+
+ public function deleteFromKalenderEvent()
+ {
+ $this->_ci->form_validation->set_data($_POST);
+ $this->_ci->form_validation->set_rules('kalender_id',"kalender_id","required");
+ $this->_ci->form_validation->set_rules('lehreinheit_ids[]',"lehreinheit_ids","required");
+
+
+ if($this->_ci->form_validation->run() === FALSE)
+ $this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
+
+ $kalender_id = $this->_ci->input->post('kalender_id', TRUE);
+ $lehreinheit_ids = $this->_ci->input->post('lehreinheit_ids', TRUE);
+
+ $result = $this->_ci->kalenderlib->deleteFromKalenderEvent($kalender_id, $lehreinheit_ids);
+
+ if (isError($result))
+ $this->terminateWithError(getError($result));
+
+ $this->terminateWithSuccess(getData($result));
+ }
+
+
private function _checkFilter($filters)
{
$filter_valid = true;
$filter_object = new stdClass();
foreach ($filters as $filter)
{
- if ($this->_ci->input->get($filter))
+ if ($this->_ci->input->post($filter))
{
$filter_valid = true;
- $filter_object->$filter = $this->_ci->input->get($filter);
+ $filter_object->$filter = $this->_ci->input->post($filter);
}
}
diff --git a/application/controllers/api/frontend/v1/tempus/KalenderSync.php b/application/controllers/api/frontend/v1/tempus/KalenderSync.php
new file mode 100644
index 000000000..13e4cc012
--- /dev/null
+++ b/application/controllers/api/frontend/v1/tempus/KalenderSync.php
@@ -0,0 +1,304 @@
+ ['admin:r', 'assistenz:r'],
+ 'loadSync' => ['admin:r', 'assistenz:r'],
+ 'add' => ['admin:r', 'assistenz:r'],
+ 'start' => ['admin:r', 'assistenz:r'],
+ 'delete' => ['admin:r', 'assistenz:r'],
+ 'updateSync' => ['admin:r', 'assistenz:r'],
+ 'getStudienplan' => ['admin:r', 'assistenz:r'],
+ 'getSyncStatus' => ['admin:r', 'assistenz:r'],
+ ]);
+
+ $this->loadPhrases([
+ 'lehre',
+ ]);
+
+ $this->_ci = &get_instance();
+ $this->_ci->load->library('form_validation');
+ $this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $this->_ci->load->model('ressource/Kalendersyncstatus_model', 'KalendersyncstatusModel');
+ $this->_ci->load->model('ressource/Kalenderstatus_model', 'KalenderStatusModel');
+ $this->_ci->load->library('KalenderSyncLib');
+ }
+
+ public function getSyncs()
+ {
+ $this->_ci->form_validation->set_data($_GET);
+ $this->_ci->form_validation->set_rules('studiensemester_kurzbz',"studiensemester_kurzbz","required");
+
+ if($this->_ci->form_validation->run() === FALSE)
+ $this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
+ $studiensemester_kurzbz = $this->_ci->input->get('studiensemester_kurzbz', TRUE);
+
+ $language = getUserLanguage() == 'German' ? 0 : 1;
+
+ $this->_ci->KalenderStatusModel->addSelect('tbl_kalender_syncstatus.*, array_to_json(bezeichnung_mehrsprachig::varchar[])->>' . $language .' AS sync_status, tbl_organisationseinheit.bezeichnung as oebezeichnung, tbl_studienplan.bezeichnung as studienplanbezeichnung');
+ $this->_ci->KalenderStatusModel->addJoin('lehre.tbl_kalender_status', 'tbl_kalender_syncstatus.sync_status_kurzbz = tbl_kalender_status.status_kurzbz');
+ $this->_ci->KalenderStatusModel->addJoin('public.tbl_organisationseinheit', 'tbl_kalender_syncstatus.oe_kurzbz = tbl_organisationseinheit.oe_kurzbz');
+ $this->_ci->KalenderStatusModel->addJoin('lehre.tbl_studienplan', 'tbl_kalender_syncstatus.studienplan_id = tbl_studienplan.studienplan_id', 'LEFT');
+ $this->_ci->KalenderStatusModel->addJoin('public.tbl_studiensemester', 'tbl_kalender_syncstatus.studiensemester_kurzbz = tbl_studiensemester.studiensemester_kurzbz');
+ $this->_ci->KalenderStatusModel->addOrder('public.tbl_studiensemester.start', 'DESC');
+
+
+ if ($studiensemester_kurzbz === 'all')
+ $data = $this->_ci->KalendersyncstatusModel->load();
+ else
+ $data = $this->_ci->KalendersyncstatusModel->loadWhere(array('tbl_kalender_syncstatus.studiensemester_kurzbz' => $studiensemester_kurzbz));
+
+ if (isError($data))
+ $this->terminateWithError(getError($data));
+
+ $this->terminateWithSuccess(getData($data));
+ }
+
+ public function delete()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('kalender_syncstatus_id', 'kalender_syncstatus_id', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $kalender_syncstatus_id = $this->input->post('kalender_syncstatus_id');
+
+ $result = $this->_ci->KalendersyncstatusModel->load($kalender_syncstatus_id);
+
+ if (isError($result))
+ $this->terminateWithError(getError($result));
+
+ if (!hasData($result))
+ $this->terminateWithError($this->p->t('lehre', 'errorDeleting'));
+
+ $del_result = $this->_ci->KalendersyncstatusModel->delete(getData($result)[0]->kalender_syncstatus_id);
+
+ if (isError($del_result))
+ $this->terminateWithError(getError($del_result));
+ $this->terminateWithSuccess($del_result);
+ }
+
+ public function loadSync()
+ {
+ $this->_ci->form_validation->set_data($_GET);
+ $this->_ci->form_validation->set_rules('kalender_syncstatus_id',"kalender_syncstatus_id","required");
+
+ if($this->_ci->form_validation->run() === FALSE)
+ $this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
+ $kalender_syncstatus_id = $this->_ci->input->get('kalender_syncstatus_id', TRUE);
+ $data = $this->_ci->KalendersyncstatusModel->loadWhere(array('kalender_syncstatus_id' => $kalender_syncstatus_id));
+ if (isError($data))
+ $this->terminateWithError(getError($data));
+
+ $this->terminateWithSuccess(getData($data)[0]);
+ }
+
+ public function getSyncStatus()
+ {
+ $language = getUserLanguage() == 'German' ? 0 : 1;
+
+ $this->_ci->KalenderStatusModel->addSelect('*, array_to_json(bezeichnung_mehrsprachig::varchar[])->>' . $language .' AS bezeichnung, status_kurzbz');
+ $this->_ci->KalenderStatusModel->db->where_in('status_kurzbz', self::ALLOWED_STATUS);
+ $data = $this->_ci->KalenderStatusModel->load();
+
+ if (isError($data))
+ $this->terminateWithError(getError($data));
+
+ $this->terminateWithSuccess(getData($data));
+ }
+
+
+ public function add()
+ {
+ $formData = $this->input->post('formData');
+
+ $this->_ci->form_validation->set_data($formData);
+
+ $this->_ci->form_validation->set_rules('oe_kurzbz',"oe_kurzbz","required");
+ $this->_ci->form_validation->set_rules('studiensemester_kurzbz',"studiensemester_kurzbz","required");
+ $this->_ci->form_validation->set_rules('sync_status_kurzbz',"sync_status_kurzbz","required");
+
+ if($this->_ci->form_validation->run() === FALSE)
+ $this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
+
+ $ausbildungssemester = isEmptyString($formData['ausbildungssemester']) ? null : $formData['ausbildungssemester'];
+ $studienplan_id = isEmptyString($formData['studienplan_id']) ? null : $formData['studienplan_id'];
+
+ $existing = $this->_checkIfExist(
+ $formData['oe_kurzbz'],
+ $formData['studiensemester_kurzbz'],
+ $ausbildungssemester,
+ $studienplan_id
+ );
+
+ if (isError($existing))
+ $this->terminateWithError(getError($existing));
+
+ if (hasData($existing))
+ {
+ $this->terminateWithError('Es existiert bereits ein Eintrag.');
+ }
+
+ $result = $this->_ci->KalendersyncstatusModel->insert(
+ array(
+ 'oe_kurzbz' => $formData['oe_kurzbz'],
+ 'studiensemester_kurzbz' => $formData['studiensemester_kurzbz'],
+ 'datum_bis' => $formData['datum_bis'],
+ 'studienplan_id' => $studienplan_id,
+ 'ausbildungssemester' => $ausbildungssemester,
+ 'sync_status_kurzbz' => $formData['sync_status_kurzbz'],
+ 'mail' => $formData['mail'],
+ 'insertvon' => getAuthUID()
+ )
+ );
+
+ $this->terminateWithSuccess($result);
+ }
+
+
+ public function start()
+ {
+ $formData = $this->input->post('formData');
+
+ $this->_ci->form_validation->set_data($formData);
+
+ $this->_ci->form_validation->set_rules('oe_kurzbz',"oe_kurzbz","required");
+ $this->_ci->form_validation->set_rules('studiensemester_kurzbz',"studiensemester_kurzbz","required");
+ $this->_ci->form_validation->set_rules('sync_status_kurzbz',"sync_status_kurzbz","required");
+
+ if($this->_ci->form_validation->run() === FALSE)
+ $this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
+
+ $result = $this->_ci->kalendersynclib->runManual($formData['oe_kurzbz'], $formData['studiensemester_kurzbz'], $formData['ausbildungssemester'], $formData['studienplan_id'], $formData['mail'], $formData['datum_bis'], $formData['sync_status_kurzbz']);
+
+ if (isError($result))
+ $this->terminateWithError(getError($result));
+
+ $this->terminateWithSuccess($result);
+ }
+ public function updateSync()
+ {
+ $formData = $this->input->post('formData');
+
+ $this->_ci->form_validation->set_data($formData);
+
+ $this->_ci->form_validation->set_rules('kalender_syncstatus_id',"kalender_syncstatus_id","required");
+ $this->_ci->form_validation->set_rules('oe_kurzbz',"oe_kurzbz","required");
+ $this->_ci->form_validation->set_rules('studiensemester_kurzbz',"studiensemester_kurzbz","required");
+ $this->_ci->form_validation->set_rules('sync_status_kurzbz',"sync_status_kurzbz","required");
+
+ if($this->_ci->form_validation->run() === FALSE)
+ $this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
+
+ $ausbildungssemester = isEmptyString($formData['ausbildungssemester']) ? null : $formData['ausbildungssemester'];
+ $studienplan_id = isEmptyString($formData['studienplan_id']) ? null : $formData['studienplan_id'];
+
+ $existing = $this->_checkIfExist(
+ $formData['oe_kurzbz'],
+ $formData['studiensemester_kurzbz'],
+ $ausbildungssemester,
+ $studienplan_id,
+ $formData['kalender_syncstatus_id']
+ );
+
+ if (isError($existing))
+ $this->terminateWithError(getError($existing));
+
+ if (hasData($existing))
+ {
+ $this->terminateWithError('Es existiert bereits ein Eintrag.');
+ }
+
+ $this->_ci->KalendersyncstatusModel->update(
+ array('kalender_syncstatus_id' => $formData['kalender_syncstatus_id']),
+ array(
+ 'oe_kurzbz' => $formData['oe_kurzbz'],
+ 'studiensemester_kurzbz' => $formData['studiensemester_kurzbz'],
+ 'datum_bis' => $formData['datum_bis'],
+ 'studienplan_id' => $studienplan_id,
+ 'ausbildungssemester' => $ausbildungssemester,
+ 'sync_status_kurzbz' => $formData['sync_status_kurzbz'],
+ 'mail' => $formData['mail'],
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('c'),
+ )
+ );
+ }
+ public function getStudienplan()
+ {
+ $this->_ci->form_validation->set_data($_GET);
+ $this->_ci->form_validation->set_rules('oe_kurzbz',"oe_kurzbz","required");
+
+ if($this->_ci->form_validation->run() === FALSE)
+ $this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
+
+ $oe_kurzbz = $this->_ci->input->get('oe_kurzbz', TRUE);
+ $studiensemester_kurzbz = $this->_ci->input->get('studiensemester_kurzbz', TRUE);
+ $ausbildungssemester = $this->_ci->input->get('ausbildungssemester', TRUE);
+
+ $this->_ci->StudiengangModel->addJoin('tbl_organisationseinheit', 'oe_kurzbz');
+ $is_studiengang = $this->_ci->StudiengangModel->loadWhere(array('oe_kurzbz' => $oe_kurzbz));
+
+ if (hasData($is_studiengang) && !isEmptyString($studiensemester_kurzbz))
+ {
+ $studiengang = getData($is_studiengang)[0];
+
+ $studienplaene = $this->_ci->StudienplanModel->getStudienplaeneBySemester(
+ $studiengang->studiengang_kz,
+ $studiensemester_kurzbz,
+ isEmptyString($ausbildungssemester) ? null : $ausbildungssemester
+ );
+
+
+ $data = $this->getDataOrTerminateWithError($studienplaene);
+
+ $unique = array();
+ foreach ($data as $row)
+ {
+ $unique[$row->studienplan_id] = (object) array(
+ 'studienplan_id' => $row->studienplan_id,
+ 'studienordnung_id' => $row->studienordnung_id,
+ 'bezeichnung' => $row->bezeichnung,
+ 'orgform_kurzbz' => $row->orgform_kurzbz
+ );
+ }
+
+ $this->terminateWithSuccess(array_values($unique));
+ }
+ $this->terminateWithSuccess();
+ }
+
+ private function _checkIfExist($oe_kurzbz, $studiensemester_kurzbz, $ausbildungssemester, $studienplan_id, $kalender_syncstatus_id = null)
+ {
+ $this->_ci->KalendersyncstatusModel->db->where('oe_kurzbz', $oe_kurzbz);
+ $this->_ci->KalendersyncstatusModel->db->where('studiensemester_kurzbz', $studiensemester_kurzbz);
+
+ if (is_null($ausbildungssemester))
+ $this->_ci->KalendersyncstatusModel->db->where('ausbildungssemester IS NULL', null, false);
+ else
+ $this->_ci->KalendersyncstatusModel->db->where('ausbildungssemester', $ausbildungssemester);
+
+ if (is_null($studienplan_id))
+ $this->_ci->KalendersyncstatusModel->db->where('studienplan_id IS NULL', null, false);
+ else
+ $this->_ci->KalendersyncstatusModel->db->where('studienplan_id', $studienplan_id);
+
+ if (!is_null($kalender_syncstatus_id))
+ $this->_ci->KalendersyncstatusModel->db->where('kalender_syncstatus_id !=', $kalender_syncstatus_id);
+ return $this->_ci->KalendersyncstatusModel->load();
+ }
+
+}
diff --git a/application/controllers/api/frontend/v1/tempus/OperationalResourceToCalenderAPI.php b/application/controllers/api/frontend/v1/tempus/OperationalResourceToCalenderAPI.php
index b1f0302b0..ed91a09a5 100644
--- a/application/controllers/api/frontend/v1/tempus/OperationalResourceToCalenderAPI.php
+++ b/application/controllers/api/frontend/v1/tempus/OperationalResourceToCalenderAPI.php
@@ -9,9 +9,9 @@ class OperationalResourceToCalenderAPI extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
- 'getAssignedResourcesByCalender' => ['admin:r', 'assistenz:r'],
- 'storeResourcesToCalendarRelationship' => ['admin:w', 'assistenz:w'],
- 'getSchedulableResourcesByCalendar' => ['admin:r', 'assistenz:r'],
+ 'getAssignedResourcesByCalender' => ['admin:r', 'assistenz:r', 'lehre/lvplan:rw'],
+ 'storeResourcesToCalendarRelationship' => ['admin:w', 'assistenz:w', 'lehre/lvplan:rw'],
+ 'getSchedulableResourcesByCalendar' => ['admin:r', 'assistenz:r', 'lehre/lvplan:rw'],
]);
$this->load->model('ressource/BetriebsmittelKalender_model', 'BetriebsmittelKalenderModel');
diff --git a/application/controllers/api/frontend/v1/tempus/Reservierung.php b/application/controllers/api/frontend/v1/tempus/Reservierung.php
index 0215bcc8e..88ea32a27 100644
--- a/application/controllers/api/frontend/v1/tempus/Reservierung.php
+++ b/application/controllers/api/frontend/v1/tempus/Reservierung.php
@@ -154,21 +154,23 @@ class Reservierung extends FHCAPI_Controller
}
public function addReservierung()
{
+ $this->_ci->form_validation->set_rules('titel', "titel", "required", ['required' => $this->p->t('ui', 'error_fieldRequired')]);
+ $this->_ci->form_validation->set_rules('beschreibung', "beschreibung", "required", ['required' => $this->p->t('ui', 'error_fieldRequired')]);
+ $this->_ci->form_validation->set_rules('start_date', "start_date", "required", ['required' => $this->p->t('ui', 'error_fieldRequired')]);
+ $this->_ci->form_validation->set_rules('end_date', "end_date", "required", ['required' => $this->p->t('ui', 'error_fieldRequired')]);
- $this->_ci->form_validation->set_data($_POST);
- $this->_ci->form_validation->set_rules('titel',"titel","required");
- $this->_ci->form_validation->set_rules('beschreibung',"beschreibung","required");
- $this->_ci->form_validation->set_rules('ort_kurzbz',"ort_kurzbz","required");
- $this->_ci->form_validation->set_rules('start_date',"start_date","required");
- $this->_ci->form_validation->set_rules('end_date',"end_date","required");
-
-
- if($this->_ci->form_validation->run() === FALSE)
+ if ($this->_ci->form_validation->run() === FALSE)
$this->terminateWithValidationErrors($this->_ci->form_validation->error_array());
+ $orte = $this->_ci->input->post('orte', TRUE);
+
+ if (empty($orte) || (empty($orte['ort_kurzbz']) && empty($orte['location'])))
+ {
+ $this->terminateWithValidationErrors(['ort_kurzbz' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Raum'])]);
+ }
+
$titel = $this->_ci->input->post('titel', TRUE);
$beschreibung = $this->_ci->input->post('beschreibung', TRUE);
- $ort_kurzbz = $this->_ci->input->post('ort_kurzbz', TRUE);
$start_date = $this->_ci->input->post('start_date', TRUE);
$end_date = $this->_ci->input->post('end_date', TRUE);
$teilnehmer = $this->_ci->input->post('teilnehmer', TRUE);
@@ -187,7 +189,7 @@ class Reservierung extends FHCAPI_Controller
$teilnehmer[] = array('uid' => getAuthUID(), 'rolle' => 'organisator');
- $result = $this->_ci->kalenderlib->addReservierung($titel, $beschreibung, $ort_kurzbz, $start_date, $end_date, $teilnehmer, $specialFinalGroups, $specialGroups, $groups);
+ $result = $this->_ci->kalenderlib->addReservierung($titel, $beschreibung, $orte, $start_date, $end_date, $teilnehmer, $specialFinalGroups, $specialGroups, $groups);
if (isError($result))
diff --git a/application/controllers/api/frontend/v1/tempus/Tags.php b/application/controllers/api/frontend/v1/tempus/Tags.php
new file mode 100644
index 000000000..8e9d45788
--- /dev/null
+++ b/application/controllers/api/frontend/v1/tempus/Tags.php
@@ -0,0 +1,102 @@
+ self::BERECHTIGUNG_KURZBZ,
+ 'getTags' => self::BERECHTIGUNG_KURZBZ,
+ 'getTagsByCalendar' => self::BERECHTIGUNG_KURZBZ,
+ 'addTag' => self::BERECHTIGUNG_KURZBZ,
+ 'updateTag' => self::BERECHTIGUNG_KURZBZ,
+ 'doneTag' => self::BERECHTIGUNG_KURZBZ,
+ 'deleteTag' => self::BERECHTIGUNG_KURZBZ
+ ]);
+
+ $this->config->load('tempus');
+ $this->load->model('ressource/KalenderNotiz_model', 'KalenderNotizModel');
+ }
+
+ public function getTag($readonly_tags = null)
+ {
+ parent::getTag($this->config->item('tempus_tags'));
+ }
+ public function getTags($tags = null)
+ {
+ parent::getTags($this->config->item('tempus_tags'));
+ }
+
+ public function getTagsByCalendar($eindeutige_kalender_gruppen_id)
+ {
+ $language = $this->_getLanguageIndex();
+ $index_bezeichnung_mehrsprachig = $language - 1;
+
+ $this->KalenderNotizModel->addSelect(
+ 'tbl_kalender_notiz.notiz_id as notiz_id,
+ typ_kurzbz as tag_typ_kurzbz,
+ array_to_json(bezeichnung_mehrsprachig::varchar[])->>'. $index_bezeichnung_mehrsprachig. ' as bezeichnung,
+ style,
+ beschreibung,
+ tag,
+ tbl_notiz.erledigt as done
+ '
+ );
+
+ $this->KalenderNotizModel->addJoin('public.tbl_notiz', 'tbl_kalender_notiz.notiz_id = public.tbl_notiz.notiz_id');
+ $this->KalenderNotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
+
+ $this->KalenderNotizModel->addOrder('prioritaet');
+
+ $notiztypen = $this->KalenderNotizModel->loadWhere(array('aktiv' => true, 'eindeutige_kalender_gruppen_id' => $eindeutige_kalender_gruppen_id));
+ $this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array());
+ }
+
+ public function addTag($withZuordnung = true, $updatable_tags = null)
+ {
+ $postData = $this->getPostJson();
+
+ $return = array();
+ foreach ($postData->values as $value)
+ {
+ $insertResult = parent::addTag(false, $this->config->item('tempus_tags'));
+
+ $insertZuordnung = $this->KalenderNotizModel->insert(array(
+ 'eindeutige_kalender_gruppen_id' => $value,
+ 'notiz_id' => $insertResult,
+ ));
+
+ if (isError($insertZuordnung))
+ $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
+ $return[] = ['eindeutige_kalender_gruppen_id' => $value, 'id' => $insertResult];
+ }
+ $this->terminateWithSuccess($return);
+ }
+
+ public function updateTag($updatable_tags = null)
+ {
+ parent::updateTag($this->config->item('tempus_tags'));
+ }
+ public function deleteTag($withZuordnung = true, $updatable_tags = null)
+ {
+ parent::deleteTag(true, $this->config->item('tempus_tags'));
+ }
+ public function doneTag($updatable_tags = null)
+ {
+ parent::doneTag($this->config->item('tempus_tags'));
+ }
+
+ public function _getLanguageIndex()
+ {
+ $this->load->model('system/Sprache_model', 'SpracheModel');
+ $this->SpracheModel->addSelect('index');
+ $result = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage()));
+
+ return hasData($result) ? getData($result)[0]->index : 1;
+ }
+}
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/controllers/system/MigrateKalender.php b/application/controllers/system/MigrateKalender.php
index acb289061..2185da07a 100644
--- a/application/controllers/system/MigrateKalender.php
+++ b/application/controllers/system/MigrateKalender.php
@@ -8,7 +8,7 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
-class MigrateKalender extends Auth_Controller
+class MigrateKalender extends CLI_Controller
{
/**
@@ -16,11 +16,8 @@ class MigrateKalender extends Auth_Controller
*/
public function __construct()
{
- parent::__construct(array(
- 'migrateStundenplan' => ['admin:rw'],
- 'migrateReservierung' => ['admin:rw'],
- 'migrateStundenplanBetriebsmittelEntries' => ['admin:rw']
- ));
+ parent::__construct();
+
$this->load->model('ressource/Kalender_model', 'KalenderModel');
$this->load->model('ressource/Kalender_Lehreinheit_model', 'KalenderLehreinheitModel');
$this->load->model('ressource/Kalender_Ort_model', 'KalenderOrtModel');
@@ -35,8 +32,50 @@ class MigrateKalender extends Auth_Controller
/**
* Everything has a beginning
*/
- public function migrateStundenplan($von = null, $bis = null, $studiengang_kz = null)
+ public function refreshTablesAndFullMigrateOfStundenplanReservierung($von, $bis = null, $studiengang_kz = null, $ort_kurzbz = null)
{
+ if (defined('CI_ENVIRONMENT') && CI_ENVIRONMENT === 'production')
+ {
+ echo "This script is not allowed to run in production environment.\n";
+ return;
+ }
+
+ echo "Refreshing calendar related tables...\n";
+ $this->resetBeforeNewStundenplanReservierungImport();
+ echo "Calendar related tables refreshed successfully.\n\n";
+
+ echo "Starting full migration of Stundenplan and Reservierung from $von to " . ($bis ?? '2100-12-31') . "...\n";
+ $this->fullMigrateOfStundenplanReservierung($von, $bis, $studiengang_kz, $ort_kurzbz);
+ echo "Full migration of Stundenplan and Reservierung completed successfully.\n";
+ }
+
+ public function fullMigrateOfStundenplanReservierung($von, $bis = null, $studiengang_kz = null, $ort_kurzbz = null)
+ {
+ echo "Starting migration of Stundenplan from $von to " . ($bis ?? '2100-12-31') . "...\n";
+ $this->migrateStundenplan($von, $bis, $studiengang_kz);
+ echo "Stundenplan migration completed successfully.\n\n";
+
+ echo "Starting migration of Reservierung from $von to " . ($bis ?? '2100-12-31') . "...\n";
+ $this->migrateReservierung($von, $bis, $ort_kurzbz);
+ echo "Reservierung migration completed successfully.\n\n";
+
+ echo "Starting migration of Stundenplan Betriebsmittel entries...\n";
+ $this->migrateStundenplanBetriebsmittelEntries();
+ echo "Stundenplan Betriebsmittel entries migration completed successfully.\n\n";
+
+ echo "Starting to add title values as tags to calendar entries...\n";
+ $this->addTitleValuesAsTagsToKalenderEntries();
+ echo "Adding title values as tags to calendar entries completed successfully.\n\n";
+ }
+
+ public function migrateStundenplan($von, $bis = null, $studiengang_kz = null)
+ {
+ if (is_null($von))
+ return error('Parameter "von" ist erforderlich');
+
+ if (is_null($bis))
+ $bis = '2100-12-31';
+
$db = new DB_Model();
$stpldevsql = '
@@ -71,8 +110,8 @@ class MigrateKalender extends Auth_Controller
bk.block_nr,
MIN(bk.stunde) AS stunde_von,
MAX(bk.stunde) AS stunde_bis,
- MIN(sp.lehreinheit_id) AS lehreinheit_id,
- MIN(sp.ort_kurzbz) AS ort_kurzbz,
+ array_agg(DISTINCT sp.lehreinheit_id) AS lehreinheit_id,
+ array_agg(DISTINCT sp.ort_kurzbz) AS ort_kurzbz,
array_agg(sp.stundenplandev_id ORDER BY bk.stunde) AS stundenplandev_ids,
MIN(sp.insertamum) AS insertamum,
(array_agg(sp.insertvon ORDER BY sp.insertamum ASC))[1] AS insertvon,
@@ -118,7 +157,14 @@ class MigrateKalender extends Auth_Controller
$ids = is_array($block->stundenplandev_ids) ? $block->stundenplandev_ids : explode(',', $block->stundenplandev_ids);
/*$ids = array_map('intval', $ids);*/
- $this->SyncModel->db->where('stundenplandev_id IN (' . implode(',', $ids) . ')');
+ $this->SyncModel->db->group_start();
+ $where_ids_chunks = array_chunk($ids,25);
+ foreach($where_ids_chunks as $where_ids)
+ {
+ $this->SyncModel->db->or_where_in('stundenplandev_id', $where_ids);
+ }
+ $this->SyncModel->db->group_end();
+
$sync_result = $this->SyncModel->load();
if (!hasData($sync_result))
@@ -152,8 +198,14 @@ class MigrateKalender extends Auth_Controller
}
}
- public function migrateReservierung($von = null, $bis = null, $ort_kurzbz = null)
+ public function migrateReservierung($von, $bis = null, $ort_kurzbz = null)
{
+ if (is_null($von))
+ return error('Parameter "von" ist erforderlich');
+
+ if (is_null($bis))
+ $bis = '2100-12-31';
+
$db = new DB_Model();
$qry = "WITH eindeutige_stunden AS (
@@ -170,43 +222,42 @@ class MigrateKalender extends Auth_Controller
}
$qry .= "),
- block_keys AS (
+ block_keys AS (
+ SELECT
+ titel, beschreibung, datum, stunde,
+ stunde - ROW_NUMBER() OVER (PARTITION BY titel, beschreibung, datum ORDER BY stunde) AS block_nr
+ FROM eindeutige_stunden
+ ),
+ blocks AS (
SELECT
- titel, beschreibung, datum, stunde,
- stunde - ROW_NUMBER() OVER (PARTITION BY titel, beschreibung, datum ORDER BY stunde) AS block_nr
- FROM eindeutige_stunden
- ),
- blocks AS (
- SELECT
- bk.titel,
- bk.beschreibung,
- bk.datum,
- bk.block_nr,
- MIN(bk.stunde) AS stunde_von,
- MAX(bk.stunde) AS stunde_bis,
- array_agg(DISTINCT r.reservierung_id::text) AS reservierung_ids,
- array_agg(DISTINCT r.uid) AS uids,
- array_agg(DISTINCT r.gruppe_kurzbz) AS gruppen_kurzbz,
- array_agg(DISTINCT ROW(r.semester, r.verband, r.gruppe)::text) AS svg_kombis,
- array_agg(DISTINCT r.ort_kurzbz) AS orte_kurzbz,
- MIN(r.studiengang_kz) AS studiengang_kz,
- MIN(r.veranstaltung_id) AS veranstaltung_id,
- MIN(r.reservierung_id) AS reservierung_id,
- MAX(r.insertamum) AS insertamum,
- (array_agg(r.insertvon ORDER BY r.insertamum ASC))[1] AS insertvon
- FROM block_keys bk
- JOIN campus.tbl_reservierung r
- ON r.titel = bk.titel AND r.beschreibung = bk.beschreibung AND r.datum = bk.datum AND r.stunde = bk.stunde
- WHERE r.datum >= ? AND r.datum <= ?
- GROUP BY bk.titel, bk.beschreibung, bk.datum, bk.block_nr
- )
+ bk.titel,
+ bk.beschreibung,
+ bk.datum,
+ bk.block_nr,
+ MIN(bk.stunde) AS stunde_von,
+ MAX(bk.stunde) AS stunde_bis,
+ array_agg(DISTINCT r.reservierung_id::text) AS reservierung_ids,
+ array_agg(DISTINCT r.uid) AS uids,
+ array_agg(DISTINCT r.gruppe_kurzbz) AS gruppen_kurzbz,
+ array_agg(DISTINCT ROW(r.semester, r.verband, r.gruppe, r.studiengang_kz)::text) AS svg_kombis,
+ array_agg(DISTINCT r.ort_kurzbz) AS ort_kurzbz,
+ MIN(r.studiengang_kz) AS studiengang_kz,
+ MIN(r.reservierung_id) AS reservierung_id,
+ MAX(r.insertamum) AS insertamum,
+ (array_agg(r.insertvon ORDER BY r.insertamum ASC))[1] AS insertvon
+ FROM block_keys bk
+ JOIN campus.tbl_reservierung r
+ ON r.titel = bk.titel AND r.beschreibung = bk.beschreibung AND r.datum = bk.datum AND r.stunde = bk.stunde
+ WHERE r.datum >= ? AND r.datum <= ?
+ GROUP BY bk.titel, bk.beschreibung, bk.datum, bk.block_nr
+ )
SELECT
b.*,
(b.datum + s_von.beginn) AS von,
- (b.datum + s_bis.ende) AS bis
+ (b.datum + s_bis.ende) AS bis
FROM blocks b
- JOIN lehre.tbl_stunde s_von ON s_von.stunde = b.stunde_von
- JOIN lehre.tbl_stunde s_bis ON s_bis.stunde = b.stunde_bis
+ JOIN lehre.tbl_stunde s_von ON s_von.stunde = b.stunde_von
+ JOIN lehre.tbl_stunde s_bis ON s_bis.stunde = b.stunde_bis
ORDER BY b.reservierung_id DESC;";
array_push($params, $von, $bis);
@@ -222,7 +273,14 @@ class MigrateKalender extends Auth_Controller
$ids = is_array($block->reservierung_ids) ? $block->reservierung_ids : explode(',', $block->reservierung_ids);
- $this->SyncReservierungModel->db->where('reservierung_id IN (' . implode(',', $ids) . ')');
+ $this->SyncReservierungModel->db->group_start();
+ $where_ids_chunks = array_chunk($ids,25);
+ foreach($where_ids_chunks as $where_ids)
+ {
+ $this->SyncReservierungModel->db->or_where_in('reservierung_id', $where_ids);
+ }
+ $this->SyncReservierungModel->db->group_end();
+
$sync_result = $this->SyncReservierungModel->load();
if (!hasData($sync_result))
@@ -311,6 +369,121 @@ class MigrateKalender extends Auth_Controller
$dbModel->db->query($query);
}
+ public function addTitleValuesAsTagsToKalenderEntries() {
+ $dbModel = new DB_Model();
+
+
+ $query = "SELECT
+ k.eindeutige_kalender_gruppen_id,
+ ARRAY_AGG(DISTINCT(spd.titel) ORDER BY spd.titel) AS titel,
+ MAX(spd.updateamum) AS updateamum
+ FROM lehre.tbl_stundenplandev spd
+ JOIN sync.tbl_stundenplandev_kalender spdk ON spd.stundenplandev_id = spdk.stundenplandev_id
+ JOIN lehre.tbl_kalender k ON k.kalender_id = spdk.kalender_id
+ WHERE k.typ = 'lehreinheit' AND k.eindeutige_kalender_gruppen_id IS NOT NULL AND spd.titel IS NOT NULL
+ GROUP BY k.eindeutige_kalender_gruppen_id";
+
+ $result = $dbModel->execReadOnlyQuery($query);
+
+ if (isError($result)) {
+ error("Error while fetching title values for adding as tags: " . getError($result));
+ return;
+ }
+ if (!hasData($result)) {
+ error("No title values found for adding as tags.");
+ return;
+ }
+
+ $data = getData($result);
+
+ foreach($data as $block) {
+ $eindeutige_kalender_gruppen_id = $block->eindeutige_kalender_gruppen_id;
+ $notizText = implode(' - ', array_filter($block->titel, function($titel) {
+ return !empty(trim($titel));
+ }));
+
+ if (!empty($notizText)) {
+ $this->addTag($eindeutige_kalender_gruppen_id, $notizText, $block->updateamum);
+ }
+ }
+ }
+
+ private function resetBeforeNewStundenplanReservierungImport()
+ {
+ if (defined('CI_ENVIRONMENT') && CI_ENVIRONMENT === 'production')
+ {
+ echo "This script is not allowed to run in production environment.\n";
+ return;
+ }
+
+ $db = new DB_Model();
+
+ $db->db->trans_start();
+
+ $db->db->query('DELETE FROM sync.tbl_stundenplandev_kalender');
+ $db->db->query('DELETE FROM sync.tbl_reservierung_kalender');
+
+ $db->db->query("DELETE FROM lehre.tbl_kalender_event_teilnehmer
+ WHERE kalender_id IN (
+ SELECT kalender_id
+ FROM lehre.tbl_kalender
+ WHERE typ = 'reservierung'
+ )");
+
+ $db->db->query("DELETE FROM lehre.tbl_kalender_event
+ WHERE kalender_id IN (
+ SELECT kalender_id
+ FROM lehre.tbl_kalender
+ WHERE typ = 'reservierung'
+ )");
+
+ $db->db->query("DELETE FROM lehre.tbl_kalender_lehreinheit
+ WHERE kalender_id IN (
+ SELECT kalender_id
+ FROM lehre.tbl_kalender
+ WHERE typ = 'lehreinheit' OR typ = 'reservierung'
+ )");
+
+ $db->db->query("DELETE FROM lehre.tbl_kalender_ort
+ WHERE kalender_id IN (
+ SELECT kalender_id
+ FROM lehre.tbl_kalender
+ WHERE typ IN ('lehreinheit', 'reservierung')
+ )");
+
+ $db->db->query("DELETE FROM public.tbl_notiz
+ WHERE notiz_id IN (
+ SELECT notiz_id
+ FROM lehre.tbl_kalender_notiz
+ WHERE eindeutige_kalender_gruppen_id IN (
+ SELECT eindeutige_kalender_gruppen_id
+ FROM lehre.tbl_kalender
+ )
+ )");
+
+ $db->db->query("DELETE FROM lehre.tbl_kalender_notiz
+ WHERE eindeutige_kalender_gruppen_id IN (
+ SELECT eindeutige_kalender_gruppen_id
+ FROM lehre.tbl_kalender
+ )");
+
+ $db->db->query("DELETE FROM lehre.tbl_betriebsmittel_kalender
+ WHERE eindeutige_kalender_gruppen_id IN (
+ SELECT eindeutige_kalender_gruppen_id
+ FROM lehre.tbl_kalender
+ )");
+
+ $db->db->query("DELETE FROM lehre.tbl_kalender
+ WHERE typ IN ('lehreinheit', 'reservierung')");
+
+ $db->db->trans_complete();
+
+ if ($db->db->trans_status() === false)
+ return error('Reset before new import failed');
+
+ return success('Migration data reset successfully');
+ }
+
private function setKalendarEntriesGroupIDs() {
$dbModel = new DB_Model();
@@ -357,7 +530,7 @@ class MigrateKalender extends Auth_Controller
$dbModel->db->query($query);
}
-
+
private function _insertKalender($block, $typ)
{
$result = $this->KalenderModel->insert(
@@ -379,21 +552,30 @@ class MigrateKalender extends Auth_Controller
if ($typ === 'lehreinheit')
{
- $this->KalenderLehreinheitModel->insert(
- array (
- 'kalender_id' => $kalender_id,
- 'lehreinheit_id'=> $block->lehreinheit_id
- )
- );
+ $lehreinheit_ids = is_array($block->lehreinheit_id) ? $block->lehreinheit_id : explode(',', $block->lehreinheit_id);
+ foreach ($lehreinheit_ids as $lehreinheit_id)
+ {
+ $leResult = $this->KalenderLehreinheitModel->insert(
+ array (
+ 'kalender_id' => $kalender_id,
+ 'lehreinheit_id'=> $lehreinheit_id
+ )
+ );
+
+ if (!isSuccess($leResult))
+ return null;
+ }
}
else if ($typ === 'reservierung')
{
- $this->KalenderEventModel->insert(array(
+ $eventResult = $this->KalenderEventModel->insert(array(
'kalender_id' => $kalender_id,
'titel' => $block->titel,
'beschreibung' => $block->beschreibung
));
+ if (!isSuccess($eventResult))
+ return null;
if ($block->insertvon)
{
@@ -420,7 +602,10 @@ class MigrateKalender extends Auth_Controller
}
$semester_range = $this->StudiensemesterModel->getByDateRange($block->von, $block->bis);
- if (isError($semester_range)) return $semester_range;
+
+ if (isError($semester_range))
+ return null;
+
$studiensemester_kurzbz = getData($semester_range)[0]->studiensemester_kurzbz ?? null;
$gruppen = is_array($block->gruppen_kurzbz) ? $block->gruppen_kurzbz : explode(',', $block->gruppen_kurzbz ?? '');
@@ -458,18 +643,19 @@ class MigrateKalender extends Auth_Controller
foreach ($block->svg_kombis as $kombi_str)
{
$kombi_str = trim($kombi_str, '()');
- list($sem, $verb, $grp) = explode(',', $kombi_str);
+ list($sem, $verb, $grp, $stg_kz) = explode(',', $kombi_str);
$sem = trim($sem) === '' ? null : trim($sem);
$verb = trim($verb) === '' ? null : trim($verb);
$grp = trim($grp) === '' ? null : trim($grp);
+ $stg_kz = trim($stg_kz) === '' ? null : trim($stg_kz);
- if (is_null($sem) && is_null($verb) && is_null($grp))
+ if (is_null($sem) && is_null($verb) && is_null($grp) && is_null($stg_kz))
continue;
$this->KalenderEventTeilnehmerModel->insert(array(
'kalender_id' => $kalender_id,
- 'studiengang_kz' => $block->studiengang_kz,
+ 'studiengang_kz' => $stg_kz,
'semester' => $sem,
'verband' => $verb,
'gruppe' => $grp,
@@ -479,6 +665,22 @@ class MigrateKalender extends Auth_Controller
}
}
+ $orte = is_array($block->ort_kurzbz) ? $block->ort_kurzbz : explode(',', $block->ort_kurzbz ?? '');
+
+ foreach ($orte as $ort)
+ {
+ $ort = trim($ort);
+ if (!empty($ort))
+ {
+ $this->KalenderOrtModel->insert(
+ array (
+ 'kalender_id' => $kalender_id,
+ 'ort_kurzbz' => $ort
+ )
+ );
+ }
+ }
+
return $kalender_id;
}
@@ -523,6 +725,21 @@ class MigrateKalender extends Auth_Controller
'updatevon' => $block->updatevon
)
);
+
+ $orte = is_array($block->ort_kurzbz) ? $block->ort_kurzbz : explode(',', $block->ort_kurzbz ?? '');
+ $orte = array_filter(array_map('trim', $orte));
+
+ $this->KalenderOrtModel->delete(array('kalender_id' => $kalender_id));
+
+ foreach ($orte as $ort)
+ {
+ $this->KalenderOrtModel->insert(
+ array (
+ 'kalender_id' => $kalender_id,
+ 'ort_kurzbz' => $ort
+ )
+ );
+ }
}
private function _updateSync($ids, $kalender_id)
@@ -556,4 +773,129 @@ class MigrateKalender extends Auth_Controller
);
}
}
+
+ private function addTag($eindeutige_kalender_gruppen_id, $notizText, $lastUpdatedInOldSystem): bool
+ {
+ $notizType = 'hinweis';
+ $insertvonMockUser = 'oldToNewTempusMigration';
+
+ if (is_null($eindeutige_kalender_gruppen_id) || empty($eindeutige_kalender_gruppen_id)) {
+ var_dump("Error: eindeutige_kalender_gruppen_id is null or empty.");
+ return false;
+ }
+
+ $this->load->model('person/Notiz_model', 'NotizModel');
+ $this->load->model('system/Notiztyp_model', 'NotiztypModel');
+ $this->load->model('ressource/KalenderNotiz_model', 'KalenderNotizModel');
+
+ $checkTyp = $this->NotiztypModel->loadWhere(array('typ_kurzbz' => $notizType));
+
+ if (isError($checkTyp))
+ {
+ error("Error occurred while checking Notiztyp: " . $checkTyp->message);
+ return false;
+ }
+
+ if (!hasData($checkTyp))
+ {
+ error("Notiztyp 'hinweis' does not exist. Please create it before adding tags.");
+ return false;
+ }
+
+
+ $this->KalenderNotizModel->addJoin('tbl_notiz', 'tbl_notiz.notiz_id = tbl_kalender_notiz.notiz_id', 'LEFT');
+ $this->KalenderNotizModel->db->where('tbl_notiz.typ', $notizType);
+ $this->KalenderNotizModel->db->where('tbl_notiz.insertvon', $insertvonMockUser);
+ $oldKalenderNotiz = $this->KalenderNotizModel->loadWhere(array('eindeutige_kalender_gruppen_id' => $eindeutige_kalender_gruppen_id));
+ if (isError($oldKalenderNotiz))
+ {
+ error("Error occurred while checking KalenderNotiz: " . $oldKalenderNotiz->message);
+ return false;
+ }
+ if (hasData($oldKalenderNotiz))
+ {
+ return $this->updateTag($eindeutige_kalender_gruppen_id, $notizText, $lastUpdatedInOldSystem);
+ }
+
+
+ $insertResult = $this->NotizModel->insert(array(
+ 'titel' => 'TAG',
+ 'text' => $notizText,
+ 'verfasser_uid' => null,
+ 'erledigt' => false,
+ 'insertamum' => date('Y-m-d H:i:s'),
+ 'insertvon' => $insertvonMockUser,
+ 'typ' => $notizType
+ ));
+
+ if (isError($insertResult))
+ {
+ error("Error occurred while inserting Notiz: " . $insertResult->message);
+ return false;
+ }
+
+ $insertKalenderNotiz = $this->KalenderNotizModel->insert(array(
+ 'notiz_id' => $insertResult->retval,
+ 'eindeutige_kalender_gruppen_id' => $eindeutige_kalender_gruppen_id
+ ));
+
+ if (isError($insertKalenderNotiz))
+ {
+ error("Error occurred while inserting KalenderNotiz: " . $insertKalenderNotiz->message);
+ return false;
+ }
+
+ return true;
+ }
+
+ private function updateTag($eindeutige_kalender_gruppen_id, $notizText, $lastUpdatedInOldSystem)
+ {
+ $notizType = 'hinweis';
+ $insertvonMockUser = 'oldToNewTempusMigration';
+
+ $this->KalenderNotizModel->addJoin('tbl_notiz', 'tbl_notiz.notiz_id = tbl_kalender_notiz.notiz_id', 'LEFT');
+ $this->KalenderNotizModel->db->where('tbl_notiz.typ', $notizType);
+ $this->KalenderNotizModel->db->where('tbl_notiz.insertvon', $insertvonMockUser);
+ $kalenderNotizRes = $this->KalenderNotizModel->loadWhere(array('eindeutige_kalender_gruppen_id' => $eindeutige_kalender_gruppen_id));
+ if (isError($kalenderNotizRes))
+ {
+ error("Error occurred while loading KalenderNotiz: " . $kalenderNotizRes->message);
+ return false;
+ }
+
+
+ $tag = $this->NotizModel->loadWhere(array('notiz_id' => $kalenderNotizRes->retval[0]->notiz_id));
+ if (isError($tag))
+ {
+ error("Error occurred while loading Notiz: " . $tag->message);
+ return false;
+ }
+
+ if (!hasData($tag))
+ {
+ error("Error occurred while loading KalenderNotiz: " . $tag->message);
+ return false;
+ }
+
+ $adjustedLastUpdatedInOldSystem = date('Y-m-d H:i:s', strtotime($lastUpdatedInOldSystem) + 5);
+ if ($tag->retval[0]->updateamum >= $adjustedLastUpdatedInOldSystem)
+ {
+ return true;
+ }
+
+ $updateData = $this->NotizModel->update(array('notiz_id' => $tag->retval[0]->notiz_id),
+ array('text' => $notizText,
+ 'updateamum' => date('Y-m-d H:i:s'),
+ 'updatevon' => $insertvonMockUser,
+ 'bearbeiter_uid' => null,
+ )
+ );
+ if (isError($updateData))
+ {
+ error("Error occurred while updating Notiz: " . $updateData->message);
+ return false;
+ }
+
+ return true;
+ }
}
diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php
index 5b9bac6c5..8e9566ae9 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,10 +27,14 @@ 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');
-
+
$this->loadPhrases([
'ui'
]);
@@ -38,6 +43,7 @@ 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 +68,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 +92,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');
@@ -126,7 +142,7 @@ class Tag_Controller extends FHCAPI_Controller
if (!in_array($postData->tag_typ_kurzbz, $tags))
$this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
}
-
+
if ($withZuordnung)
{
$return = array();
@@ -135,7 +151,7 @@ class Tag_Controller extends FHCAPI_Controller
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
$values = array_unique($postData->values);
-
+
foreach ($values as $value)
{
$insertResult = $this->addNotiz($postData);
@@ -271,6 +287,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 +411,4 @@ class Tag_Controller extends FHCAPI_Controller
));
}
-}
\ No newline at end of file
+}
diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php
index d932a8243..d4bf33baf 100644
--- a/application/helpers/hlp_common_helper.php
+++ b/application/helpers/hlp_common_helper.php
@@ -580,4 +580,3 @@ function generateUUID()
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
-
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 3d8a2ea26..35edc826c 100644
--- a/application/libraries/AntragLib.php
+++ b/application/libraries/AntragLib.php
@@ -1657,7 +1657,7 @@ class AntragLib
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere($where);
if (isError($result))
- return $result;
+ return $result;
if (!hasData($result))
return error($this->_ci->p->t('studierendenantrag', "error_no_antrag_found", ['id' => $studierendenantrag_id]));
@@ -1709,6 +1709,7 @@ class AntragLib
$result->statustyp = $antrag->statustyp;
$result->status_insertvon = $antrag->status_insertvon;
$result->grund = $antrag->grund;
+ $result->status_grund = $antrag->status_grund;
$result->studierendenantrag_id = $antrag->studierendenantrag_id;
$result->typ = $antrag->typ;
$result->datum = $antrag->datum;
diff --git a/application/libraries/KalenderLib.php b/application/libraries/KalenderLib.php
index 76bdfb3e5..cc439704b 100644
--- a/application/libraries/KalenderLib.php
+++ b/application/libraries/KalenderLib.php
@@ -25,75 +25,108 @@ class KalenderLib
$this->_ci->load->model('ressource/BetriebsmittelKalender_model', 'BetriebsmittelKalenderModel');
$this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
- $this->_ci->load->model('education/LehreinheitMitarbeiter_model', 'LehreinheitMitarbeiterModel');
$this->_ci->load->model('ressource/Ort_model', 'OrtModel');
$this->_ci->load->model('organisation/gruppe_model', 'GruppeModel');
$this->_ci->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
+ $this->_ci->load->model('ressource/Stunde_model', 'StundeModel');
+ $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ $this->_ci->load->model('system/Variable_model', 'VariableModel');
+ $this->_ci->load->model('system/Sprache_model', 'SpracheModel');
+ $this->_ci->load->model('organisation/Ferien_model', 'FerienModel');
+
$this->_ci->load->library('CollisionChecker', ['uid' => $this->_uid]);
$this->_ci->load->library('PhrasesLib', array('ui'));
+ $this->_ci->load->library('VariableLib', array('uid' => getAuthUID()));
+
}
- private function _getBasePlan($start_date, $end_date)
+ private function _buildFilteredKalenderCte($start_date, $end_date)
{
$end_date = date('Y-m-d', strtotime($end_date . ' +1 day'));
+ return sprintf(
+ 'WITH filtered_kalender AS MATERIALIZED (
+ SELECT *
+ FROM lehre.tbl_kalender
+ WHERE von >= timestamp %s
+ AND bis < timestamp %s
+ )',
+ $this->_ci->KalenderModel->db->escape(date('Y-m-d H:i:s', strtotime($start_date))),
+ $this->_ci->KalenderModel->db->escape(date('Y-m-d H:i:s', strtotime($end_date)))
+ );
+ }
+
+ private function _buildBasePlanQuery()
+ {
+ $language = $this->getLanguageIndex();
+ $index_bezeichnung_mehrsprachig = $language - 1;
+
$this->_ci->KalenderModel->addSelect('tbl_kalender.kalender_id,
- tbl_kalender.eindeutige_kalender_gruppen_id,
- tbl_kalender.status_kurzbz,
- tbl_kalender.typ,
- tbl_kalender.von,
- tbl_kalender.bis,
- tbl_kalender_ort.ort_kurzbz,
- tbl_kalender_ort.ort_kurzbz as ko_ort_kurzbz,
- tbl_kalender_ort.location as ko_location,
- tbl_lehreinheit.lehreinheit_id,
- tbl_lehreinheit.lehrveranstaltung_id,
- tbl_lehreinheit.lehrfach_id,
- tbl_lehreinheit.lehrform_kurzbz,
- tbl_lehrveranstaltung.oe_kurzbz,
- lehrfach.kurzbz AS lehrfach_kurzbz,
- lehrfach.bezeichnung AS lehrfach_bezeichnung,
- lehrfach.farbe,
- COALESCE(orginasator.uid, tbl_lehreinheitmitarbeiter.mitarbeiter_uid) as mitarbeiter_uid,
- COALESCE(reservierung_person.vorname, tbl_person.vorname) as vorname,
- COALESCE(reservierung_person.nachname, tbl_person.nachname) as nachname,
- COALESCE(reservierung_ma.kurzbz, tbl_mitarbeiter.kurzbz) AS ma_kurzbz,
- teilnehmergruppe.gruppe_kurzbz as teilnehmerg_grp,
- COALESCE (
- UPPER(tbl_studiengang.typ || tbl_studiengang.kurzbz) ||
- COALESCE(verbandgruppe.semester::varchar, \'\') ||
- COALESCE(verbandgruppe.verband::varchar, \'\') ||
- COALESCE(verbandgruppe.gruppe, \'\'),
- \'\') as verband_grp,
- tbl_kalender_event.beschreibung,
- tbl_kalender_event.titel,
- teilmitarbeiter.kurzbz as teilnehmer_kurzbz,
- teilperson.vorname as teilnehmer_vorname,
- teilperson.nachname as teilnehmer_nachname,
-
- teilbenutzer.uid as teilnehmer_uid,
-
- CASE
- WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN
- COALESCE(
- UPPER(le_studiengang.typ || le_studiengang.kurzbz) ||
- COALESCE(tbl_lehreinheitgruppe.semester::varchar, \'\') ||
- COALESCE(tbl_lehreinheitgruppe.verband::varchar, \'\') ||
- COALESCE(tbl_lehreinheitgruppe.gruppe, \'\'),
- \'\')
- ELSE tbl_lehreinheitgruppe.gruppe_kurzbz
- END AS lehreinheit_gruppe_bezeichnung,
- tbl_lehreinheitgruppe.gruppe_kurzbz as le_gruppe_kurzbz,
- tbl_lehreinheitgruppe.studiengang_kz as le_studiengang_kz,
- tbl_lehreinheitgruppe.semester as le_semester,
- tbl_lehreinheitgruppe.verband as le_verband,
- tbl_lehreinheitgruppe.gruppe as le_gruppe,
- le_gruppe.direktinskription as le_direktinskription,
-
-
- ');
+ tbl_kalender.eindeutige_kalender_gruppen_id,
+ tbl_kalender.status_kurzbz,
+ tbl_kalender.typ,
+ tbl_kalender.von,
+ tbl_kalender.bis,
+ tbl_kalender_ort.location,
+ tbl_kalender_ort.ort_kurzbz,
+ tbl_lehreinheit.lehreinheit_id,
+ tbl_lehreinheit.lehrveranstaltung_id,
+ tbl_lehreinheit.lehrfach_id,
+ tbl_lehreinheit.lehrform_kurzbz,
+ tbl_lehrveranstaltung.oe_kurzbz,
+ lehrfach.kurzbz AS lehrfach_kurzbz,
+ lehrfach.bezeichnung AS lehrfach_bezeichnung,
+ lehrfach.farbe,
+ COALESCE(orginasator.uid, tbl_lehreinheitmitarbeiter.mitarbeiter_uid) as mitarbeiter_uid,
+ COALESCE(reservierung_person.vorname, tbl_person.vorname) as vorname,
+ COALESCE(reservierung_person.nachname, tbl_person.nachname) as nachname,
+ COALESCE(reservierung_ma.kurzbz, tbl_mitarbeiter.kurzbz) AS ma_kurzbz,
+ teilnehmergruppe.gruppe_kurzbz as teilnehmerg_grp,
+ COALESCE (
+ UPPER(tbl_studiengang.typ || tbl_studiengang.kurzbz) ||
+ COALESCE(verbandgruppe.semester::varchar, \'\') ||
+ COALESCE(verbandgruppe.verband::varchar, \'\') ||
+ COALESCE(verbandgruppe.gruppe, \'\'),
+ \'\') as verband_grp,
+ tbl_kalender_event.beschreibung,
+ tbl_kalender_event.titel,
+ teilmitarbeiter.kurzbz as teilnehmer_kurzbz,
+ teilperson.vorname as teilnehmer_vorname,
+ teilperson.nachname as teilnehmer_nachname,
+ teilbenutzer.uid as teilnehmer_uid,
+ CASE
+ WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN
+ COALESCE(
+ UPPER(le_studiengang.typ || le_studiengang.kurzbz) ||
+ COALESCE(tbl_lehreinheitgruppe.semester::varchar, \'\') ||
+ COALESCE(tbl_lehreinheitgruppe.verband::varchar, \'\') ||
+ COALESCE(tbl_lehreinheitgruppe.gruppe, \'\'),
+ \'\')
+ ELSE tbl_lehreinheitgruppe.gruppe_kurzbz
+ END AS lehreinheit_gruppe_bezeichnung,
+ tbl_lehreinheitgruppe.gruppe_kurzbz as le_gruppe_kurzbz,
+ tbl_lehreinheitgruppe.studiengang_kz as le_studiengang_kz,
+ tbl_lehreinheitgruppe.semester as le_semester,
+ tbl_lehreinheitgruppe.verband as le_verband,
+ tbl_lehreinheitgruppe.gruppe as le_gruppe,
+ le_gruppe.direktinskription as le_direktinskription,
+ tag_data_agg.tags as tags,
+ resource_data_agg.resources as resources,
+ CASE
+ WHEN vonstunde.stunde IS NOT NULL AND bisstunde.stunde IS NOT NULL
+ THEN bisstunde.stunde - vonstunde.stunde + 1
+ ELSE ROUND(
+ COALESCE(
+ (
+ SELECT SUM(EXTRACT(EPOCH FROM (LEAST(stunde.ende, tbl_kalender.bis::time) - GREATEST(stunde.beginn, tbl_kalender.von::time))) / 60) / 45
+ FROM lehre.tbl_stunde stunde
+ WHERE stunde.beginn < tbl_kalender.bis::time AND stunde.ende > tbl_kalender.von::time)
+ ,0)
+ ,2
+ ) END AS verplante_stunden
+ ');
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit', 'tbl_kalender.kalender_id = tbl_kalender_lehreinheit.kalender_id', 'LEFT');
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event', 'tbl_kalender.kalender_id = tbl_kalender_event.kalender_id', 'LEFT');
@@ -128,6 +161,7 @@ class KalenderLib
$this->_ci->KalenderModel->addJoin('public.tbl_benutzer resevierung_benutzer', 'reservierung_ma.mitarbeiter_uid = resevierung_benutzer.uid', 'LEFT');
$this->_ci->KalenderModel->addJoin('public.tbl_person reservierung_person', 'reservierung_person.person_id = resevierung_benutzer.person_id', 'LEFT');
+
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitgruppe', 'tbl_lehreinheit.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id', 'LEFT');
$this->_ci->KalenderModel->addJoin('public.tbl_gruppe le_gruppe', 'tbl_lehreinheitgruppe.gruppe_kurzbz = le_gruppe.gruppe_kurzbz', 'LEFT');
$this->_ci->KalenderModel->addJoin('public.tbl_lehrverband le_lehrverband',
@@ -139,12 +173,83 @@ class KalenderLib
);
$this->_ci->KalenderModel->addJoin('public.tbl_studiengang le_studiengang', 'le_lehrverband.studiengang_kz = le_studiengang.studiengang_kz', 'LEFT');
- $this->_ci->KalenderModel->db->where('tbl_kalender.von >=', $start_date);
- $this->_ci->KalenderModel->db->where('tbl_kalender.bis <', $end_date);
+ // Include tags in the query
+ $this->_ci->load->config('tempus');
+ $tags = $this->_ci->config->item('tempus_tags');
+
+ $whereTags = '';
+ if (is_array($tags) && !isEmptyArray($tags)) {
+ $tags = array_keys($tags);
+
+ foreach ($tags as $key => $tag) {
+ $tags[$key] = $this->_ci->KalenderModel->escape($tag);
+ }
+ $whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")";
+ }
+ $subQueryTag = "(
+ SELECT
+ tag.eindeutige_kalender_gruppen_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,
+ array_to_json(nt.bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig. " as beschreibung,
+ n.text AS notiz,
+ nt.style,
+ n.erledigt AS done,
+ nt.prioritaet AS prioritaet,
+ nz.eindeutige_kalender_gruppen_id
+ FROM lehre.tbl_kalender_notiz 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.eindeutige_kalender_gruppen_id
+ ) AS tag_data_agg";
+
+ $this->_ci->KalenderModel->addJoin($subQueryTag, 'tag_data_agg.eindeutige_kalender_gruppen_id = tbl_kalender.eindeutige_kalender_gruppen_id', 'LEFT');
+ // End of tags inclusion
+
+ // Include assigned operational resources in the query
+ $subQueryResource = "(
+ SELECT
+ resource.eindeutige_kalender_gruppen_id,
+ COALESCE(json_agg(resource ORDER BY resource.beschreibung), '[]'::json) AS resources
+ FROM (
+ SELECT
+ betriebsmittel_kalender.*,
+ betriebsmittel.beschreibung,
+ betriebsmittel.verplanen
+ FROM lehre.tbl_betriebsmittel_kalender AS betriebsmittel_kalender
+ JOIN wawi.tbl_betriebsmittel AS betriebsmittel
+ ON betriebsmittel.betriebsmittel_id = betriebsmittel_kalender.betriebsmittel_id
+ WHERE betriebsmittel.verplanen = TRUE
+ ) AS resource
+ GROUP BY resource.eindeutige_kalender_gruppen_id
+ ) AS resource_data_agg";
+
+ $this->_ci->KalenderModel->addJoin(
+ $subQueryResource,
+ 'resource_data_agg.eindeutige_kalender_gruppen_id = tbl_kalender.eindeutige_kalender_gruppen_id',
+ 'LEFT'
+ );
+ // End of operational resources inclusion
+
+
+ $this->_ci->KalenderModel->db->join('lehre.tbl_stunde vonstunde', 'tbl_kalender.von::time = vonstunde.beginn', 'LEFT', FALSE);
+ $this->_ci->KalenderModel->db->join('lehre.tbl_stunde bisstunde', 'tbl_kalender.bis::time = bisstunde.ende', 'LEFT', FALSE);
$this->_ci->KalenderModel->addOrder('tbl_kalender.eindeutige_kalender_gruppen_id', 'DESC');
}
+ private function _loadFilteredBasePlan($start_date, $end_date)
+ {
+ $query = $this->_buildFilteredKalenderCte($start_date, $end_date) . "\n" .
+ $this->_ci->KalenderModel->db->get_compiled_select('filtered_kalender AS tbl_kalender');
+
+ return $this->_ci->KalenderModel->execReadOnlyQuery($query);
+ }
+
private function _mapEvents($data, $collisionCheck = true)
{
$stundenplan_data = [];
@@ -162,6 +267,8 @@ class KalenderLib
{
$von = new DateTime($row->von);
$bis = new DateTime($row->bis);
+ $resources = isset($row->resources) ? $row->resources : [];
+ $parsedResources = is_string($resources) ? json_decode($resources, true) : $resources;
$events[$id] = (object) [
'kalender_id' => $id,
@@ -174,14 +281,14 @@ class KalenderLib
'isoend' => $bis->format('c'),
'tooltip' => 'tip',
'status_kurzbz' => $row->status_kurzbz,
- 'ort_kurzbz' => isset($row->ort_kurzbz) ? $row->ort_kurzbz : '',
- 'ko_ort_kurzbz' => isset($row->ko_ort_kurzbz) ? $row->ko_ort_kurzbz : '',
- 'ko_location' => isset($row->ko_location) ? $row->ko_location : '',
+ 'ort_kurzbz' => [],
+ 'location' => null,
'lehrform' => isset($row->lehrform_kurzbz) ? $row->lehrform_kurzbz : '',
'lehrfach' => isset($row->lehrfach_kurzbz) ? $row->lehrfach_kurzbz : '',
'lehrfach_bez' => isset($row->lehrfach_bezeichnung) ? $row->lehrfach_bezeichnung : '',
'farbe' => isset($row->farbe) ? $row->farbe : '',
'lehrveranstaltung_id' => $row->lehrveranstaltung_id,
+ 'verplante_stunden' => $row->verplante_stunden,
'organisationseinheit' => isset($row->oe_kurzbz) ? $row->oe_kurzbz : '',
'lehreinheit_id' => [],
'lektor' => [],
@@ -190,9 +297,11 @@ class KalenderLib
'gruppe' => [],
'titel' => isset($row->titel) ? $row->titel : '',
'beschreibung' => isset($row->beschreibung) ? $row->beschreibung : '',
- 'topic' => (isset($row->lehrfach_kurzbz) ? $row->lehrfach_kurzbz : '').' '.(isset($row->lehrform_kurzbz) ? $row->lehrform_kurzbz : ''),
+ 'topic' => [],
'collisions' => false,
- 'has_assigned_resources' => isset($row->has_assigned_resources) ? $row->has_assigned_resources : false,
+ 'has_assigned_resources' => !empty($parsedResources),
+ 'resources' => is_array($parsedResources) ? $parsedResources : [],
+ 'tags' => isset($row->tags) ? $row->tags : [],
'updateamum' => isset($row->updateamum) ? $row->updateamum : null,
];
}
@@ -200,6 +309,16 @@ class KalenderLib
if ($row->lehreinheit_id && !in_array($row->lehreinheit_id, $events[$id]->lehreinheit_id))
$events[$id]->lehreinheit_id[] = $row->lehreinheit_id;
+ if (isset($row->ort_kurzbz) && $row->ort_kurzbz !== '' && !in_array($row->ort_kurzbz, $events[$id]->ort_kurzbz))
+ $events[$id]->ort_kurzbz[] = $row->ort_kurzbz;
+
+ if (isset($row->location) && $row->location !== '' && is_null($events[$id]->location))
+ $events[$id]->location = $row->location;
+
+ $topic = trim((isset($row->lehrfach_kurzbz) ? $row->lehrfach_kurzbz : '').' '.(isset($row->lehrform_kurzbz) ? $row->lehrform_kurzbz : ''));
+ if ($topic !== '' && !in_array($topic, $events[$id]->topic))
+ $events[$id]->topic[] = $topic;
+
if ($row->mitarbeiter_uid)
{
if (!in_array($row->mitarbeiter_uid, array_column($events[$id]->lektor, 'mitarbeiter_uid')))
@@ -279,22 +398,20 @@ class KalenderLib
}
public function getPlanByOrt($start_date, $end_date, $ort)
{
- $this->_getBasePlan($start_date, $end_date);
+ $this->_buildBasePlanQuery();
$this->_ci->KalenderModel->db->where('tbl_kalender_ort.ort_kurzbz', $ort);
- $data = $this->_ci->KalenderModel->load();
+ $data = $this->_loadFilteredBasePlan($start_date, $end_date);
return $this->_mapEvents($data);
}
-
-
public function getForRaumvorschlag($start_date, $end_date, $lektor_uids = [], $gruppen_kurzbz = [], $lehrverband_gruppen = [])
{
$start_date = date('Y-m-d', strtotime($start_date));
$end_date = date('Y-m-d', strtotime($end_date . ' +1 day'));
- $this->_getBasePlan($start_date, $end_date);
+ $this->_buildBasePlanQuery();
$this->_ci->KalenderModel->db->where('NOT EXISTS (
SELECT 1 FROM lehre.tbl_kalender nachfolger
@@ -314,6 +431,7 @@ class KalenderLib
foreach ($lehrverband_gruppen as $lvg)
{
+ $lvg = (array) $lvg;
$this->_ci->KalenderModel->db->or_group_start();
$this->_ci->KalenderModel->db->where('tbl_lehreinheitgruppe.studiengang_kz', $lvg['studiengang_kz']);
$this->_ci->KalenderModel->db->where('tbl_lehreinheitgruppe.semester', $lvg['semester']);
@@ -325,7 +443,7 @@ class KalenderLib
$this->_ci->KalenderModel->db->group_end();
}
- $data = $this->_ci->KalenderModel->load();
+ $data = $this->_loadFilteredBasePlan($start_date, $end_date);
return $this->_mapEvents($data, false);
}
@@ -341,23 +459,102 @@ class KalenderLib
$kalender_entry = getData($kalender_entry)[0];
- $this->_getBasePlan($kalender_entry->von, $kalender_entry->bis);
+ $this->_buildBasePlanQuery();
$this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id', $kalender_entry->kalender_id);
- $data = $this->_ci->KalenderModel->load();
+ $data = $this->_loadFilteredBasePlan($kalender_entry->von, $kalender_entry->bis);
return $this->_mapEvents($data);
}
- public function getPlanForPlanner($start_date, $end_date, $ort = null, $uids = null, $stg = null)
+ public function getPlanForPlanner($start_date, $end_date, $ort = null, $uids = null, $studiengaenge = null)
{
- $this->_getBasePlan($start_date, $end_date);
+ $this->_buildBasePlanQuery();
if (!is_null($ort))
- $this->_ci->KalenderModel->db->where('tbl_kalender_ort.ort_kurzbz', $ort);
+ {
+ $ort_array = (array) $ort;
+ $escaped_orte = array();
+
+ foreach ($ort_array as $ort)
+ {
+ $escaped_orte[] = $this->_ci->KalenderModel->db->escape($ort);
+ }
+ $in_list = '(' . implode(',', $escaped_orte) . ')';
+
+ $this->_ci->KalenderModel->db->where(
+ "(EXISTS (
+ SELECT 1
+ FROM lehre.tbl_kalender_ort filter_ort
+ WHERE filter_ort.kalender_id = tbl_kalender.kalender_id
+ AND filter_ort.ort_kurzbz IN $in_list
+ ))"
+ );
+ }
if (!is_null($uids))
- $this->_ci->KalenderModel->db->where_in('tbl_lehreinheitmitarbeiter.mitarbeiter_uid', $uids);
+ {
+ $uid_array = (array) $uids;
+ $db = $this->_ci->KalenderModel->db;
- if (!is_null($stg))
- $this->_ci->KalenderModel->db->where('tbl_lehrveranstaltung.studiengang_kz', $stg);
+ $escaped_uids = array();
+ foreach ($uid_array as $uid)
+ $escaped_uids[] = $db->escape($uid);
+ $in_list = '(' . implode(',', $escaped_uids) . ')';
+
+ $this->_ci->KalenderModel->db->where(
+ "(EXISTS (
+ SELECT 1
+ FROM lehre.tbl_lehreinheitmitarbeiter filter_lem
+ WHERE filter_lem.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
+ AND filter_lem.mitarbeiter_uid IN $in_list
+ )
+ OR EXISTS (
+ SELECT 1
+ FROM lehre.tbl_kalender_event_teilnehmer filter_org
+ WHERE filter_org.kalender_id = tbl_kalender.kalender_id
+ AND filter_org.rolle_kurzbz = 'organisator'
+ AND filter_org.uid IN $in_list
+ )
+ OR EXISTS (
+ SELECT 1
+ FROM lehre.tbl_kalender_event_teilnehmer filter_teil
+ WHERE filter_teil.kalender_id = tbl_kalender.kalender_id
+ AND filter_teil.rolle_kurzbz = 'teilnehmer'
+ AND filter_teil.uid IN $in_list
+ ))"
+ );
+ }
+
+ if (!is_null($studiengaenge))
+ {
+ $db = $this->_ci->KalenderModel->db;
+ $or_conditions = array();
+
+ foreach ($studiengaenge as $studiengang)
+ {
+ $conditions = array();
+ $conditions[] = 'filter_lv.studiengang_kz = ' . $db->escape($studiengang['stg_kz']);
+
+ if (isset($studiengang['semester']))
+ $conditions[] = 'filter_lv.semester = ' . $db->escape($studiengang['semester']);
+
+ if (isset($studiengang['orgform_kurzbz']))
+ $conditions[] = 'filter_lv.orgform_kurzbz = ' . $db->escape($studiengang['orgform_kurzbz']);
+
+ $or_conditions[] = '(' . implode(' AND ', $conditions) . ')';
+ }
+
+ $or_block = implode(' OR ', $or_conditions);
+
+ $this->_ci->KalenderModel->db->where(
+ "(EXISTS (
+ SELECT 1
+ FROM lehre.tbl_kalender_lehreinheit filter_kl
+ JOIN lehre.tbl_lehreinheit filter_le ON filter_le.lehreinheit_id = filter_kl.lehreinheit_id
+ JOIN lehre.tbl_lehrveranstaltung filter_lv ON filter_lv.lehrveranstaltung_id = filter_le.lehrveranstaltung_id
+ WHERE filter_kl.kalender_id = tbl_kalender.kalender_id
+ AND ($or_block)
+ ))"
+ );
+ }
$this->_ci->KalenderModel->db->where('NOT EXISTS (
SELECT 1 FROM lehre.tbl_kalender nachfolger
@@ -371,27 +568,26 @@ class KalenderLib
WHERE tbl_betriebsmittel_kalender.eindeutige_kalender_gruppen_id = tbl_kalender.eindeutige_kalender_gruppen_id
) AS has_assigned_resources"
]);
-
- $data = $this->_ci->KalenderModel->load();
+
+ $data = $this->_loadFilteredBasePlan($start_date, $end_date);
return $this->_mapEvents($data);
}
public function getPlanForStudent($start_date, $end_date)
{
- $this->_getBasePlan($start_date, $end_date);
+ $this->_buildBasePlanQuery();
-
- $this->_ci->KalenderModel->db->where('status_kurzbz', 'live');
+ $this->_ci->KalenderModel->db->where_in('status_kurzbz', array('live', 'to_delete_live'));
- $data = $this->_ci->KalenderModel->load();
+ $data = $this->_loadFilteredBasePlan($start_date, $end_date);
return $this->_mapEvents($data);
}
public function getPlanForStudentByStudent($start_date, $end_date, $userUID)
{
- $this->_getBasePlan($start_date, $end_date);
+ $this->_buildBasePlanQuery();
$escapedUserUID = $this->_ci->KalenderModel->db->escape($userUID);
@@ -510,14 +706,14 @@ class KalenderLib
$this->_ci->KalenderModel->db->or_where($lehreinheitStudentlehrverbandExists, null, false);
$this->_ci->KalenderModel->db->group_end();
- $data = $this->_ci->KalenderModel->load();
+ $data = $this->_loadFilteredBasePlan($start_date, $end_date);
return $this->_mapEvents($data);
}
public function getPlanForLecturer($start_date, $end_date)
{
- $this->_getBasePlan($start_date, $end_date);
+ $this->_buildBasePlanQuery();
$this->_ci->KalenderModel->addJoin(
'lehre.tbl_kalender neuerer',
@@ -529,14 +725,14 @@ class KalenderLib
OR (tbl_kalender.status_kurzbz = 'preview' AND neuerer.kalender_id IS NULL)
OR (tbl_kalender.status_kurzbz = 'live' AND neuerer.kalender_id IS NULL)
)", NULL, FALSE);
- $data = $this->_ci->KalenderModel->load();
+ $data = $this->_loadFilteredBasePlan($start_date, $end_date);
return $this->_mapEvents($data);
}
public function getPlanForLecturerByLecturer($start_date, $end_date, $userUID)
{
- $this->_getBasePlan($start_date, $end_date);
+ $this->_buildBasePlanQuery();
$escapedUserUID = $this->_ci->KalenderModel->db->escape($userUID);
@@ -579,8 +775,7 @@ class KalenderLib
$this->_ci->KalenderModel->db->or_where($eventBenutzergruppeExists, null, false);
$this->_ci->KalenderModel->db->group_end();
- $data = $this->_ci->KalenderModel->load();
-
+ $data = $this->_loadFilteredBasePlan($start_date, $end_date);
return $this->_mapEvents($data);
}
@@ -689,10 +884,145 @@ class KalenderLib
return $zeitwuensche_array;
}
- public function addKalenderEvent($start_date, $end_date, $lehreinheit_id, $ort_kurzbz)
- {
- $this->_ci->KalenderModel->db->trans_start();
+ private function _checkCollisionForLehreinheit($start_date, $end_date, $lehreinheit_id, $ort_kurzbz)
+ {
+ $checkerData = new stdClass();
+ $checkerData->von = $start_date;
+ $checkerData->bis = $end_date;
+ $checkerData->lehreinheit_id = $lehreinheit_id;
+ $checkerData->ort_kurzbz = $ort_kurzbz;
+
+ return $this->_ci->collisionchecker->run($checkerData);
+ }
+
+ public function addToKalenderEvent($target_kalender_id, $lehreinheit_id)
+ {
+ $entryResult = $this->_loadKalenderEntry($target_kalender_id);
+ if (isError($entryResult)) return $entryResult;
+
+ $kalender_entry = getData($entryResult);
+
+ if (!$this->_checkPermission($kalender_entry->lehreinheit_id))
+ {
+ return error([
+ 'message' => $this->_ci->phraseslib->t('ui', 'keineBerechtigung'),
+ 'errorCode' => 'not_allowed'
+ ]);
+ }
+
+ if (in_array($kalender_entry->status_kurzbz, array('to_delete', 'to_delete_live', 'to_delete_preview', 'deleted')))
+ {
+ return error([
+ 'message' => $this->_ci->phraseslib->t('ui', 'entry_not_editable'),
+ 'errorCode' => 'entry_not_editable'
+ ]);
+ }
+
+ if (in_array($lehreinheit_id, $kalender_entry->lehreinheit_id))
+ {
+ return error([
+ 'message' => $this->_ci->phraseslib->t('ui', 'already_present'),
+ 'errorCode' => 'already_present'
+ ]);
+ }
+
+ $lehreinheit_ids = $kalender_entry->lehreinheit_id;
+ $lehreinheit_ids[] = $lehreinheit_id;
+
+ if (in_array($kalender_entry->status_kurzbz, array('live', 'preview')))
+ return success($this->_createHistoryEntry($kalender_entry, null, null, null, $lehreinheit_ids));
+
+ $kalenderlehreinheitresult = $this->_ci->KalenderLehreinheitModel->insert(
+ array(
+ 'kalender_id' => $target_kalender_id,
+ 'lehreinheit_id' => $lehreinheit_id
+ )
+ );
+
+ if (isError($kalenderlehreinheitresult))
+ return $kalenderlehreinheitresult;
+
+ return success($target_kalender_id);
+ }
+
+
+ public function deleteFromKalenderEvent($kalender_id, $lehreinheit_ids)
+ {
+ $entryResult = $this->_loadKalenderEntry($kalender_id);
+ if (isError($entryResult)) return $entryResult;
+
+ $kalender_entry = getData($entryResult);
+
+ if (!$this->_checkPermission($kalender_entry->lehreinheit_id))
+ {
+ return error([
+ 'message' => $this->_ci->phraseslib->t('ui', 'keineBerechtigung'),
+ 'errorCode' => 'not_allowed'
+ ]);
+ }
+
+ if (in_array($kalender_entry->status_kurzbz, array('to_delete', 'to_delete_live', 'to_delete_preview', 'deleted')))
+ {
+ return error([
+ 'message' => $this->_ci->phraseslib->t('ui', 'entry_not_editable'),
+ 'errorCode' => 'entry_not_editable'
+ ]);
+ }
+
+ $remaining_ids = array_values(array_diff($kalender_entry->lehreinheit_id, $lehreinheit_ids));
+
+ if (in_array($kalender_entry->status_kurzbz, array('live', 'preview')))
+ return success($this->_createHistoryEntry($kalender_entry, null, null, null, $remaining_ids));
+
+ $count = 0;
+ foreach ($lehreinheit_ids as $lehreinheit_id)
+ {
+ $check = $this->_ci->KalenderLehreinheitModel->loadWhere(array('kalender_id' => $kalender_id, 'lehreinheit_id' => $lehreinheit_id));
+
+ if (hasData($check))
+ {
+ $kalenderlehreinheitresult = $this->_ci->KalenderLehreinheitModel->delete(
+ array(
+ 'kalender_id' => $kalender_id,
+ 'lehreinheit_id' => $lehreinheit_id
+ )
+ );
+
+ if (isError($kalenderlehreinheitresult))
+ return $kalenderlehreinheitresult;
+
+ $count++;
+ }
+ }
+ return success($count);
+ }
+
+ private function _addWeeks($date_str, $weeks)
+ {
+ $d = new DateTime($date_str);
+ $d->modify('+' . $weeks . ' week');
+ return $d->format('Y-m-d');
+ }
+
+ //TODO (david) studiengang_kz übergeben
+ private function _isFerien($date_str)
+ {
+ $this->_ci->FerienModel->db->where('vondatum <=', $date_str);
+ $this->_ci->FerienModel->db->where('bisdatum >=', $date_str);
+ $this->_ci->FerienModel->db->where('studiengang_kz =', 0);
+
+ $ferien_result = $this->_ci->FerienModel->load();
+
+ if (isError($ferien_result))
+ return false;
+
+ if (hasData($ferien_result))
+ return true;
+ }
+
+ private function _insertKalenderEventRaw($start_date, $end_date, $lehreinheit_id, $ort_kurzbz)
+ {
$kalenderresult = $this->_ci->KalenderModel->insert(
array (
'von' => $start_date,
@@ -705,63 +1035,278 @@ class KalenderLib
)
);
- if (isSuccess($kalenderresult) && hasData($kalenderresult))
+ if (!isSuccess($kalenderresult) || !hasData($kalenderresult))
+ return ['kalender_id' => null, 'result' => $kalenderresult];
+
+ $kalender_id = getData($kalenderresult);
+
+ $kalenderlehreinheitresult = $this->_ci->KalenderLehreinheitModel->insert(
+ array (
+ 'kalender_id' => $kalender_id,
+ 'lehreinheit_id' => $lehreinheit_id
+ )
+ );
+
+ if (isSuccess($kalenderlehreinheitresult) && !is_null($ort_kurzbz))
{
- $kalender_id = getData($kalenderresult);
-
- $kalenderlehreinheitresult = $this->_ci->KalenderLehreinheitModel->insert(
- array (
- 'kalender_id' => $kalender_id,
- 'lehreinheit_id' => $lehreinheit_id
- )
- );
-
- if (isSuccess($kalenderlehreinheitresult) && !is_null($ort_kurzbz))
- {
- $ortresult = $this->_addKalenderOrt($kalender_id, $ort_kurzbz);
- if (isError($ortresult))
- {
- $this->_ci->KalenderModel->db->trans_rollback();
- return $ortresult;
- }
- }
-
- $entryResult = $this->_loadKalenderEntry($kalender_id);
-
- if (isError($entryResult))
- {
- $this->_ci->KalenderModel->db->trans_rollback();
- return $entryResult;
- }
-
- $kalender_entry = getData($entryResult);
-
- $errors = $this->_ci->collisionchecker->run($kalender_entry);
-
- if (!empty($errors))
- {
- $this->_ci->KalenderModel->db->trans_rollback();
- return error($errors);
- }
-
- $this->_ci->KalenderModel->db->trans_complete();
- return $kalenderlehreinheitresult;
+ $ortresult = $this->_addKalenderOrt($kalender_id, $ort_kurzbz);
+ if (isError($ortresult))
+ return ['kalender_id' => $kalender_id, 'result' => $ortresult];
}
- $this->_ci->KalenderModel->db->trans_rollback();
- return $kalenderresult;
+
+ return ['kalender_id' => $kalender_id, 'result' => $kalenderlehreinheitresult];
}
- public function addReservierung($titel, $beschreibung, $ort_kurzbz, $start_date, $end_date, $teilnehmer, $specialFinalGroups, $specialGroups, $groups)
+ public function calculateMultiWeekPlan($start_date, $end_date, $lehreinheit_id, $ort_kurzbz)
+ {
+ $this->_ci->load->library('RaumvorschlagLib');
+ $le_result = $this->_ci->LehreinheitModel->load($lehreinheit_id);
+
+ if (!hasData($le_result))
+ return error('Lehreinheit nicht gefunden');
+ $le = getData($le_result)[0];
+
+ $block = $le->stundenblockung;
+ $wochenrythmus = $le->wochenrythmus;
+ $studiensemester_kurzbz = $le->studiensemester_kurzbz;
+
+ if ($block <= 0)
+ return error('Stundenblockung ist ungültig');
+ if ($wochenrythmus <= 0)
+ return error('Wochenrythmus ist ungültig');
+
+ $offen_result = $this->_ci->LehreinheitModel->getOffeneStunden([$lehreinheit_id]);
+ if (!hasData($offen_result))
+ return error('Offene Stunden nicht gefunden');
+
+ $rows = getData($offen_result);
+ $offenestunden_werte = array_values(array_unique(array_column($rows, 'offenestunden')));
+
+ if (count($offenestunden_werte) > 1)
+ return error('Offene Stunden sind nicht eindeutig');
+
+ $rest = $offenestunden_werte[0];
+
+ if ($rest <= 0)
+ return error('Es sind bereits alle Stunden verplant');
+
+ $studiensemester = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $studiensemester_kurzbz));
+ if (!hasData($studiensemester))
+ return error('Studiensemester nicht gefunden');
+ $semesterende = getData($studiensemester)[0]->ende;
+
+ $start_time = (new DateTime($start_date))->format('H:i:s');
+ $start_stunde_result = $this->_ci->StundeModel->loadWhere(array('beginn' => $start_time));
+
+ if (!hasData($start_stunde_result))
+ return error('Startzeit entspricht keinem gültigen Raster');
+
+ $start_stunde_nr = getData($start_stunde_result)[0]->stunde;
+
+ $current_date = (new DateTime($start_date))->format('Y-m-d');
+ $ende = new DateTime($semesterende);
+
+ $plan = [];
+ $skipped_weeks = [];
+ $errors = [];
+
+ $original_ignore = $this->_ci->variablelib->getVar('ignore_kollision');
+
+ $this->_ci->VariableModel->setVariable(
+ getAuthUID(),
+ 'ignore_kollision',
+ 'false'
+ );
+
+ while ($rest > 0 && new DateTime($current_date) < $ende)
+ {
+ $max_skip = 52;
+ $skip_count = 0;
+ while ($this->_isFerien($current_date) && $skip_count < $max_skip)
+ {
+ $skipped_weeks[] = $current_date;
+ $current_date = $this->_addWeeks($current_date, $wochenrythmus);
+ $skip_count++;
+ }
+
+ if ($skip_count >= $max_skip)
+ {
+ $errors[] = ['message' => 'Keine ferienfreie Woche bis Semesterende gefunden.'];
+ break;
+ }
+
+ if (new DateTime($current_date) >= $ende)
+ break;
+
+ $current_block = ($rest < $block) ? $rest : $block;
+
+ $end_stunde_nr = $start_stunde_nr + $current_block - 1;
+ $end_stunde_result = $this->_ci->StundeModel->loadWhere(array('stunde' => $end_stunde_nr));
+
+ if (!hasData($end_stunde_result))
+ {
+ $errors[] = [
+ 'datum' => $current_date,
+ 'message' => 'Endzeit entspricht keinem gültigen Raster',
+ ];
+ $current_date = $this->_addWeeks($current_date, $wochenrythmus);
+ continue;
+ }
+
+ $end_time = getData($end_stunde_result)[0]->ende;
+
+ $start_str = $current_date . ' ' . $start_time;
+ $end_str = $current_date . ' ' . $end_time;
+
+ $collisions = $this->_checkCollisionForLehreinheit($start_str, $end_str, $lehreinheit_id, $ort_kurzbz);
+
+ $raum_vorschlaege = $this->_ci->raumvorschlaglib->getVorschlaegeByLehreinheit($lehreinheit_id, $start_str, $end_str);
+
+ $plan[] = [
+ 'datum' => $current_date,
+ 'start' => $start_str,
+ 'ende' => $end_str,
+ 'block' => $current_block,
+ 'ort_kurzbz' => $ort_kurzbz,
+ 'collisions' => $collisions,
+ 'raum_vorschlaege' => is_array($raum_vorschlaege) ? $raum_vorschlaege : [],
+ ];
+
+ $rest -= $current_block;
+ $current_date = $this->_addWeeks($current_date, $wochenrythmus);
+ }
+
+
+ $this->_ci->VariableModel->setVariable(
+ getAuthUID(),
+ 'ignore_kollision',
+ $original_ignore
+ );
+
+ return success([
+ 'plan' => $plan,
+ 'skipped_weeks' => $skipped_weeks,
+ 'errors' => $errors,
+ 'rest_offen' => max(0, $rest),
+ 'lehreinheit_id' => $lehreinheit_id,
+ 'ort_kurzbz' => $ort_kurzbz,
+ ]);
+ }
+
+ public function confirmMultiWeekPlan($plan, $lehreinheit_id)
+ {
+ $created = [];
+ $errors = [];
+
+ $original_ignore = $this->_ci->variablelib->getVar('ignore_kollision');
+ $this->_ci->VariableModel->setVariable(
+ getAuthUID(),
+ 'ignore_kollision',
+ 'true'
+ );
+ foreach ($plan as $termin)
+ {
+ $ort_kurzbz = $termin['selected_ort_kurzbz'] ?? $termin['ort_kurzbz'];
+
+ $result = $this->addKalenderEvent($termin['start'], $termin['ende'], $lehreinheit_id, $ort_kurzbz);
+
+ if (isError($result))
+ {
+ $errors[] = [
+ 'datum' => $termin['datum'],
+ 'message' => getError($result),
+ ];
+ }
+ else
+ {
+ $created[] = getData($result);
+ }
+ }
+
+ $this->_ci->VariableModel->setVariable(
+ getAuthUID(),
+ 'ignore_kollision',
+ $original_ignore
+ );
+
+ return success([
+ 'created' => $created,
+ 'errors' => $errors,
+ ]);
+ }
+
+
+ public function addKalenderEvent($start_date, $end_date, $lehreinheit_id, $ort_kurzbz)
+ {
+ if (!$this->_checkPermission((array)$lehreinheit_id))
+ {
+ return error([
+ 'message' => $this->_ci->phraseslib->t('ui', 'keineBerechtigung'),
+ 'errorCode' => 'not_allowed'
+ ]);
+ }
+
+ if (isEmptyString($ort_kurzbz))
+ {
+ $errors = $this->_checkCollisionForLehreinheit($start_date, $end_date, $lehreinheit_id, $ort_kurzbz);
+
+ if (!empty($errors))
+ return error($errors);
+
+ $raum_vorschlaege = $this->_ci->raumvorschlaglib->getVorschlaegeByLehreinheit($lehreinheit_id, $start_date, $end_date);
+
+ if (($this->_ci->variablelib->getVar('dialog_room_planning') ?? 'false') === 'true')
+ {
+ return success([
+ 'needs_room_selection' => true,
+ 'raum_vorschlaege' => is_array($raum_vorschlaege) ? $raum_vorschlaege : [],
+ ]);
+ }
+
+ if (($this->_ci->variablelib->getVar('priority_room_planning') ?? 'false') === 'true')
+ {
+ $ort_kurzbz = (is_array($raum_vorschlaege)) ? $raum_vorschlaege[0]['ort_kurzbz'] : null;
+ }
+ else if (!(($this->_ci->variablelib->getVar('roomless_planning') ?? 'false') === 'true'))
+ {
+ return error([
+ 'message' => $this->_ci->phraseslib->t('ui', 'roomless_planning_error'),
+ 'errorCode' => 'roomless_planning_error'
+ ]);
+ }
+ }
+
+ $errors = $this->_checkCollisionForLehreinheit($start_date, $end_date, $lehreinheit_id, $ort_kurzbz);
+
+ if (!empty($errors))
+ return error($errors);
+
+ $this->_ci->KalenderModel->db->trans_start();
+
+ $insert = $this->_insertKalenderEventRaw($start_date, $end_date, $lehreinheit_id, $ort_kurzbz);
+ $result = $insert['result'];
+
+ if (isError($result))
+ {
+ $this->_ci->KalenderModel->db->trans_rollback();
+ return $result;
+ }
+
+ $this->_ci->KalenderModel->db->trans_complete();
+ return $result;
+ }
+
+ public function addReservierung($titel, $beschreibung, $orte, $start_date, $end_date, $teilnehmer, $specialFinalGroups, $specialGroups, $groups)
{
- if (!is_null($ort_kurzbz))
+ if (!is_null($orte) && !isEmptyArray($orte['ort_kurzbz']))
{
$this->_ci->KalenderModel->addSelect('1');
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'kalender_id');
+ $this->_ci->KalenderModel->db->where_in('ort_kurzbz', $orte['ort_kurzbz']);
$reservierung_vorhanden = $this->_ci->KalenderModel->load(array (
'von <=' => $end_date,
'bis >=' => $start_date,
- 'ort_kurzbz' => $ort_kurzbz,
));
if (hasData($reservierung_vorhanden) && !$this->_ci->permissionlib->isBerechtigt('lehre/reservierungAdvanced'))
@@ -820,19 +1365,25 @@ class KalenderLib
}
}
- /* foreach ($specialGroups as $group)
+ if (isSuccess($kalendereventresult) && !isEmptyArray($orte['ort_kurzbz']))
{
- $this->_addSpecialGroupToEvent($kalender_id, $group['gruppe_kurzbz'], $group['rolle']);
+ $ortresult = $this->_addKalenderOrt($kalender_id, $orte['ort_kurzbz']);
+ if (isError($ortresult))
+ {
+ $this->_ci->KalenderModel->db->trans_rollback();
+ return $ortresult;
+ }
}
- foreach ($groups as $group)
+ if (isSuccess($kalendereventresult) && !is_null($orte['location']))
{
- $this->_addGroupToEvent($kalender_id, $group['stg_kz'], $group['semester'], $group['verband'], $group['gruppe'], $group['rolle']);
- }*/
+ $ortresult = $this->_ci->KalenderOrtModel->insert(
+ array (
+ 'kalender_id' => $kalender_id,
+ 'location' => $orte['location']
+ )
+ );
- if (isSuccess($kalendereventresult) && !is_null($ort_kurzbz))
- {
- $ortresult = $this->_addKalenderOrt($kalender_id, $ort_kurzbz);
if (isError($ortresult))
{
$this->_ci->KalenderModel->db->trans_rollback();
@@ -1016,15 +1567,23 @@ class KalenderLib
}
private function _addKalenderOrt($kalender_id, $ort_kurzbz)
{
- return $this->_ci->KalenderOrtModel->insert(
- array (
- 'kalender_id' => $kalender_id,
- 'ort_kurzbz' => $ort_kurzbz
- )
- );
+ foreach ((array) $ort_kurzbz as $ort)
+ {
+ $ortresult = $this->_ci->KalenderOrtModel->insert(
+ array (
+ 'kalender_id' => $kalender_id,
+ 'ort_kurzbz' => $ort
+ )
+ );
+
+ if (!isSuccess($ortresult))
+ return $ortresult;
+ }
+
+ return success();
}
- public function updateKalenderEvent($kalender_id, $ort_kurzbz = null, $start_time = null, $end_time = null)
+ public function updateKalenderEvent($kalender_id, $orte = null, $start_time = null, $end_time = null)
{
$entryResult = $this->_loadKalenderEntry($kalender_id);
if (isError($entryResult)) return $entryResult;
@@ -1043,8 +1602,32 @@ class KalenderLib
}, getData($calendarResources));
}
- $kalender_entry->ort_kurzbz = $ort_kurzbz ?? $kalender_entry->ort_kurzbz;
+ if (!$this->_checkPermission($kalender_entry->lehreinheit_id))
+ {
+ return error([
+ 'message' => $this->_ci->phraseslib->t('ui', 'keineBerechtigung'),
+ 'errorCode' => 'not_allowed'
+ ]);
+ }
+
+ $calendarResources = $this->_ci->BetriebsmittelKalenderModel->loadWhere(['eindeutige_kalender_gruppen_id' => $kalender_entry->eindeutige_kalender_gruppen_id]);
+ if (isError($calendarResources)) return $calendarResources;
+
+ $calendarResourcesItems = getData($calendarResources);
+ $calendarResourcesIDs = [];
+ if (is_array($calendarResourcesItems)) {
+ $calendarResourcesIDs = array_map(function($resource) {
+ return $resource->betriebsmittel_id;
+ }, getData($calendarResources));
+ }
+
$kalender_entry->betriebsmittel_ids = $calendarResourcesIDs;
+
+ if (!is_null($orte))
+ {
+ $kalender_entry->ort_kurbz = !isEmptyArray($orte['ort_kurzbz'] ?? null) ? (array) $orte['ort_kurzbz'] : $kalender_entry->ort_kurzbz;
+ $kalender_entry->location = array_key_exists('location', $orte) && !is_null($orte['location']) ? $orte['location'] : $kalender_entry->location;
+ }
$kalender_entry->von = $start_time ?? $kalender_entry->von;
$kalender_entry->bis = $end_time ?? $kalender_entry->bis;
@@ -1052,9 +1635,11 @@ class KalenderLib
if (!empty($errors)) return error($errors);
- if (!is_null($ort_kurzbz) && !isEmptyString($ort_kurzbz))
+ $result = $kalender_entry;
+
+ if (!is_null($orte))
{
- $result = $this->updateOrt($kalender_id, $ort_kurzbz);
+ $result = $this->updateOrt($kalender_id, $orte);
if (isError($result)) return $result;
if (hasData($result))
@@ -1081,7 +1666,7 @@ class KalenderLib
if ($kalender_entry->typ === 'lehreinheit')
{
- if (in_array($kalender_entry->status_kurzbz, array('todelete', 'deleted')))
+ if (in_array($kalender_entry->status_kurzbz, array('to_delete', 'to_delete_live', 'to_delete_preview', 'deleted')))
{
return error([
'message' => $this->_ci->phraseslib->t('ui', 'entry_not_editable'),
@@ -1104,16 +1689,60 @@ class KalenderLib
);
}
- public function updateOrt($kalender_id, $ort_kurzbz)
+ public function getLehreinheiten($kalender_id)
{
$entryResult = $this->_loadKalenderEntry($kalender_id);
if (isError($entryResult)) return $entryResult;
+ $entryResult = getData($entryResult);
+
+ $result = [];
+
+ foreach ($entryResult->lehreinheit_id as $lehreinheit_id)
+ {
+ $this->_ci->LehreinheitModel->addSelect('lehrfach.kurzbz AS lehrfach_kurzbz,
+ tbl_lehreinheit.lehrform_kurzbz,
+ lehrfach.bezeichnung AS lehrfach_bezeichnung');
+ $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung', 'tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id', 'LEFT');
+ $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung lehrfach', 'tbl_lehreinheit.lehrfach_id = lehrfach.lehrveranstaltung_id', 'LEFT');
+ $lehreinheit = $this->_ci->LehreinheitModel->load($lehreinheit_id);
+
+ if (!hasData($lehreinheit))
+ return error('Lehreinheit nicht gefunden');
+ $lehreinheit = getData($lehreinheit)[0];
+
+ $topic = trim((isset($lehreinheit->lehrfach_kurzbz) ? $lehreinheit->lehrfach_kurzbz : '').' '.(isset($lehreinheit->lehrform_kurzbz) ? $lehreinheit->lehrform_kurzbz : ''));
+
+ $result[] = (object)[
+ 'lehreinheit_id' => $lehreinheit_id,
+ 'title' => $topic,
+ ];
+ }
+
+ return success($result);
+ }
+
+ public function updateOrt($kalender_id, $orte_array)
+ {
+ $ort_kurzbz_neu = (array)($orte_array['ort_kurzbz'] ?? []);
+ $location_neu = $orte_array['location'] ?? null;
+
+ $entryResult = $this->_loadKalenderEntry($kalender_id);
+ if (isError($entryResult)) return $entryResult;
+
$kalender_entry = getData($entryResult);
if ($kalender_entry->typ === 'lehreinheit')
{
- if (in_array($kalender_entry->status_kurzbz, array('todelete', 'deleted')))
+ if (!$this->_checkPermission($kalender_entry->lehreinheit_id))
+ {
+ return error([
+ 'message' => $this->_ci->phraseslib->t('ui', 'keineBerechtigung'),
+ 'errorCode' => 'not_allowed'
+ ]);
+ }
+
+ if (in_array($kalender_entry->status_kurzbz, array('to_delete', 'to_delete_live', 'to_delete_preview', 'deleted')))
{
return error([
'message' => $this->_ci->phraseslib->t('ui', 'entry_not_editable'),
@@ -1122,21 +1751,67 @@ class KalenderLib
}
if (in_array($kalender_entry->status_kurzbz, array('live', 'preview')))
- return $this->_createHistoryEntry($kalender_entry, null, null, $ort_kurzbz);
+ return $this->_createHistoryEntry($kalender_entry, null, null, $orte_array);
}
- $exist = $this->_ci->KalenderOrtModel->load(array('kalender_id' => $kalender_id));
- if (hasData($exist))
+ $bestehende = $this->_ci->KalenderOrtModel->load(array('kalender_id' => $kalender_id));
+ $alte_orte = hasData($bestehende) ? getData($bestehende) : [];
+
+
+ $alte_orte_kurzbz = array_values(array_filter(array_map(function ($ort) {
+ return $ort->ort_kurzbz;
+ }, $alte_orte)));
+
+ $alte_location = null;
+
+ foreach ($alte_orte as $ort)
{
- return $this->_ci->KalenderOrtModel->update(
- array('kalender_id' => $kalender_id),
- array('ort_kurzbz' => $ort_kurzbz)
- );
+ if (!is_null($ort->location))
+ {
+ $alte_location = $ort->location;
+ break;
+ }
}
- else
+
+ $zu_loeschen = array_diff($alte_orte_kurzbz, $ort_kurzbz_neu);
+ $neu_anzulegen = array_diff($ort_kurzbz_neu, $alte_orte_kurzbz);
+
+ if (!empty($zu_loeschen))
{
- return $this->_addKalenderOrt($kalender_id, $ort_kurzbz);
+ $this->_ci->KalenderOrtModel->db->where('kalender_id', $kalender_id);
+ $this->_ci->KalenderOrtModel->db->where_in('ort_kurzbz', $zu_loeschen);
+ $this->_ci->KalenderOrtModel->db->delete('lehre.tbl_kalender_ort');
}
+
+ foreach ($neu_anzulegen as $ort)
+ {
+ $result = $this->_addKalenderOrt($kalender_id, $ort);
+ if (isError($result)) return $result;
+ }
+
+ if ($alte_location !== $location_neu)
+ {
+ if (!is_null($alte_location))
+ {
+ $this->_ci->KalenderOrtModel->db->where('kalender_id', $kalender_id);
+ $this->_ci->KalenderOrtModel->db->where('ort_kurzbz IS NULL', null, false);
+ $this->_ci->KalenderOrtModel->db->delete('lehre.tbl_kalender_ort');
+ }
+
+ if (!isEmptyString($location_neu))
+ {
+ $ortresult = $this->_ci->KalenderOrtModel->insert(
+ array (
+ 'kalender_id' => $kalender_id,
+ 'location' => $location_neu
+ )
+ );
+
+ if (isError($ortresult)) return $ortresult;
+ }
+ }
+
+ return success();
}
public function updateStatus($kalender_id, $status_kurzbz)
@@ -1146,6 +1821,14 @@ class KalenderLib
$kalender_entry = getData($entryResult);
+ if (!$this->_checkPermission($kalender_entry->lehreinheit_id))
+ {
+ return error([
+ 'message' => $this->_ci->phraseslib->t('ui', 'keineBerechtigung'),
+ 'errorCode' => 'not_allowed'
+ ]);
+ }
+
$allowed = array(
'planning' => array('sync_preview', 'sync_live'),
'sync_preview' => array('sync_live'),
@@ -1171,7 +1854,7 @@ class KalenderLib
return success();
}
- private function _createHistoryEntry($kalender_entry, $start_date = null, $end_date = null, $ort_kurzbz = null)
+ private function _createHistoryEntry($kalender_entry, $start_date = null, $end_date = null, $ort_kurzbz_array = null, $lehreinheit_id_array = null)
{
$old_id = $kalender_entry->kalender_id;
@@ -1193,24 +1876,38 @@ class KalenderLib
$new_kalender_id = getData($kalenderresult);
- $kalenderlehreinheitresult = $this->_ci->KalenderLehreinheitModel->insert(
- array(
- 'kalender_id' => $new_kalender_id,
- 'lehreinheit_id' => $kalender_entry->lehreinheit_id
- )
- );
+ $lehreinheit_ids = !is_null($lehreinheit_id_array) ? $lehreinheit_id_array : $kalender_entry->lehreinheit_id;
- if (!isSuccess($kalenderlehreinheitresult))
- return $kalenderlehreinheitresult;
+ foreach ($lehreinheit_ids as $lehreinheit_id)
+ {
+ $kalenderlehreinheitresult = $this->_ci->KalenderLehreinheitModel->insert(
+ array(
+ 'kalender_id' => $new_kalender_id,
+ 'lehreinheit_id' => $lehreinheit_id
+ )
+ );
- $new_ort = $ort_kurzbz ? $ort_kurzbz : $kalender_entry->ort_kurzbz;
- if (!is_null($new_ort) || !is_null($kalender_entry->location))
+ if (!isSuccess($kalenderlehreinheitresult))
+ return $kalenderlehreinheitresult;
+ }
+
+ if (!is_null($ort_kurzbz_array))
+ {
+ $new_orte = (array) ($ort_kurzbz_array['ort_kurzbz'] ?? []);
+ $new_locations = $ort_kurzbz_array['location'] ?? null;
+ }
+ else
+ {
+ $new_orte = (array) $kalender_entry->ort_kurzbz;
+ $new_locations = $kalender_entry->location;
+ }
+
+ foreach ($new_orte as $ort)
{
$ortresult = $this->_ci->KalenderOrtModel->insert(
array(
'kalender_id' => $new_kalender_id,
- 'ort_kurzbz' => $new_ort,
- 'location' => $kalender_entry->location
+ 'ort_kurzbz' => $ort
)
);
@@ -1218,14 +1915,48 @@ class KalenderLib
return $ortresult;
}
+ if (!is_null($new_locations))
+ {
+ $locresult = $this->_ci->KalenderOrtModel->insert(
+ array(
+ 'kalender_id' => $new_kalender_id,
+ 'location' => $new_locations
+ )
+ );
+
+ if (!isSuccess($locresult))
+ return $locresult;
+ }
+
return success($new_kalender_id);
}
-
private function _loadKalenderEntry($kalender_id)
{
- $this->_ci->KalenderModel->addSelect('tbl_kalender.*, tbl_kalender_lehreinheit.lehreinheit_id, tbl_kalender_ort.ort_kurzbz, tbl_kalender_ort.location');
- $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit', 'tbl_kalender.kalender_id = tbl_kalender_lehreinheit.kalender_id', 'LEFT');
- $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'tbl_kalender.kalender_id = tbl_kalender_ort.kalender_id', 'LEFT');
+ $this->_ci->KalenderModel->addSelect('
+ tbl_kalender.*,
+ le.lehreinheit_id,
+ orte.ort_kurzbz,
+ orte.location
+ ');
+
+ $this->_ci->KalenderModel->addJoin(
+ '(SELECT kalender_id,
+ array_agg(lehreinheit_id) AS lehreinheit_id
+ FROM lehre.tbl_kalender_lehreinheit
+ GROUP BY kalender_id) le',
+ 'tbl_kalender.kalender_id = le.kalender_id',
+ 'LEFT'
+ );
+
+ $this->_ci->KalenderModel->addJoin(
+ '(SELECT kalender_id,
+ array_agg(ort_kurzbz ORDER BY ort_kurzbz) FILTER(WHERE ort_kurzbz is NOT NULL) AS ort_kurzbz,
+ MAX(location) AS location
+ FROM lehre.tbl_kalender_ort
+ GROUP BY kalender_id) orte',
+ 'tbl_kalender.kalender_id = orte.kalender_id',
+ 'LEFT'
+ );
$result = $this->_ci->KalenderModel->load(array('tbl_kalender.kalender_id' => $kalender_id));
@@ -1233,7 +1964,12 @@ class KalenderLib
if (!hasData($result))
return error(['message' => 'Not found', 'errorCode' => 'not_found']);
- return success(getData($result)[0]);
+ $entry = getData($result)[0];
+ $entry->lehreinheit_id = $entry->lehreinheit_id ?? [];
+ $entry->ort_kurzbz = $entry->ort_kurzbz ?? [];
+ $entry->location = $entry->location ?? null;
+
+ return success($entry);
}
@@ -1286,44 +2022,76 @@ class KalenderLib
private function _deleteTypLehreinheit($entry)
{
- $result_lehreinheit = $this->_ci->KalenderLehreinheitModel->loadWhere(array('kalender_id' => $entry->kalender_id));
- if (isError($result_lehreinheit)) return $result_lehreinheit;
- $has_lehreinheit = hasData($result_lehreinheit) ? getData($result_lehreinheit)[0] : false;
+ $entryResult = $this->_loadKalenderEntry($entry->kalender_id);
- $result_ort = $this->_ci->KalenderOrtModel->loadWhere(array('kalender_id' => $entry->kalender_id));
- if (isError($result_ort)) return $result_ort;
- $has_ort = hasData($result_ort) ? getData($result_ort)[0] : false;
- if ($entry->status_kurzbz === 'planning')
+ if (isError($entryResult)) return $entryResult;
+
+ $kalender_entry = getData($entryResult);
+
+ if (!$this->_checkPermission($kalender_entry->lehreinheit_id))
{
- if ($has_ort)
- $this->_deleteOrtEntry($has_ort);
-
- if ($has_lehreinheit)
- $this->_deleteLehreinheitEntry($has_lehreinheit);
-
- $this->_ci->KalenderModel->delete(array('tbl_kalender.kalender_id' => $entry->kalender_id));
+ return error([
+ 'message' => $this->_ci->phraseslib->t('ui', 'keineBerechtigung'),
+ 'errorCode' => 'not_allowed'
+ ]);
}
- else if ($entry->status_kurzbz === 'sync_preview' || $entry->status_kurzbz === 'sync_live')
+
+
+ if ($kalender_entry->status_kurzbz === 'sync_preview' || $kalender_entry->status_kurzbz === 'sync_live' || $kalender_entry->status_kurzbz === 'planning')
{
- $history = $this->getHistory($entry->kalender_id);
- $history = hasData($history) ? getData($history) : false;
+ $history = $this->getHistory($kalender_entry->kalender_id, false, false);
- if ($has_ort)
- $result = $this->_deleteOrtEntry($has_ort);
+ $history = hasData($history) && getData($history);
- if ($has_lehreinheit)
- $result = $this->_deleteLehreinheitEntry($has_lehreinheit);
+ if ($history)
+ {
+ $result = $this->_ci->KalenderModel->update(
+ array('kalender_id' => $kalender_entry->kalender_id),
+ array('status_kurzbz' => 'to_delete','status_kurzbz_max' => 'planning')
+ );
- $this->_ci->KalenderModel->delete(array('tbl_kalender.kalender_id' => $entry->kalender_id));
+ if (isError($result))
+ return error($result);
+ }
+ else
+ {
+
+ if (!isEmptyArray($kalender_entry->ort_kurzbz) || !isEmptyString($kalender_entry->location))
+ {
+ $result = $this->_deleteOrtEntry($kalender_entry);
+ if (isError($result))
+ return error($result);
+ }
+
+
+ if (!isEmptyArray($kalender_entry->lehreinheit_id))
+ {
+ $result = $this->_deleteLehreinheitEntry($kalender_entry);
+ if (isError($result))
+ return error($result);
+ }
+
+ $result = $this->_ci->KalenderModel->delete(array('tbl_kalender.kalender_id' => $kalender_entry->kalender_id));
+
+ if (isError($result))
+ return error($result);
+ }
}
- else if ($entry->status_kurzbz === 'preview' || $entry->status_kurzbz === 'live')
+ else if ($kalender_entry->status_kurzbz === 'preview' || $kalender_entry->status_kurzbz === 'live')
{
- //TODO (david) überprüfen ob sinnvoll, verschwindet direkt in den ansichten (student, lecturer)
+ if ($kalender_entry->status_kurzbz === 'preview')
+ $new_status = 'to_delete_preview';
+ else
+ $new_status = 'to_delete_live';
+
$result = $this->_ci->KalenderModel->update(
- array('kalender_id' => $entry->kalender_id),
- array('status_kurzbz' => 'todelete')
+ array('kalender_id' => $kalender_entry->kalender_id),
+ array('status_kurzbz' => $new_status)
);
+
+ if (isError($result))
+ return error($result);
}
return success();
@@ -1348,11 +2116,11 @@ class KalenderLib
return $this->_ci->KalenderEventModel->delete(array('kalender_id' => $entry->kalender_id));
}
- public function getHistory($kalender_id, $only_previous = false)
+ public function getHistory($kalender_id, $only_previous = false, $include_self = true)
{
$dbModel = new DB_Model();
- $history_entries = $dbModel->execReadOnlyQuery('
- WITH RECURSIVE
+ $history_sql ="
+ WITH RECURSIVE
vorgaenger(kalender_id, vorgaenger_kalender_id) AS (
SELECT kalender_id, vorgaenger_kalender_id
FROM lehre.tbl_kalender
@@ -1374,107 +2142,72 @@ class KalenderLib
SELECT k.kalender_id, k.vorgaenger_kalender_id
FROM lehre.tbl_kalender k
JOIN nachfolger ON k.vorgaenger_kalender_id = nachfolger.kalender_id
+ ),
+ orte AS (
+ SELECT kalender_id,
+ STRING_AGG(COALESCE(ort_kurzbz, location), ', ' ORDER BY ort_kurzbz) AS ort
+ FROM lehre.tbl_kalender_ort
+ GROUP BY kalender_id
)
SELECT tbl_kalender.*,
- TO_CHAR(von, \'DD.MM.YYYY HH24:MI:SS\') as von,
- TO_CHAR(bis, \'DD.MM.YYYY HH24:MI:SS\') as bis,
- COALESCE(tbl_kalender_ort.ort_kurzbz, location) as ort
+ TO_CHAR(von, 'DD.MM.YYYY HH24:MI:SS') as von,
+ TO_CHAR(bis, 'DD.MM.YYYY HH24:MI:SS') as bis,
+ orte.ort
FROM (
SELECT kalender_id FROM vorgaenger
UNION
SELECT kalender_id FROM nachfolger
) combined
JOIN lehre.tbl_kalender USING(kalender_id)
- LEFT JOIN lehre.tbl_kalender_ort USING(kalender_id)
- ORDER BY kalender_id DESC
-
- ' . ($only_previous ? ' LIMIT 1' : ''), array($kalender_id, $kalender_id));
+ LEFT JOIN orte USING(kalender_id)";
- return $history_entries;
+ $params = array($kalender_id, $kalender_id);
+
+ if (!$include_self)
+ {
+ $history_sql .= " WHERE kalender_id != ?";
+ $params[] = $kalender_id;
+ }
+
+ $history_sql .= " ORDER BY kalender_id DESC" . ($only_previous ? ' LIMIT 1' : '');
+
+ return $dbModel->execReadOnlyQuery($history_sql, $params);
}
- //TODO in eine eigen Lib?
- public function sync()
+ private function _checkPermission($lehreinheit_ids)
{
- $this->_ci->load->model('ressource/Kalender_model', 'KalenderModel');
+ if (isEmptyArray($lehreinheit_ids))
+ return true;
- $this->_ci->KalenderModel->addSelect('tbl_kalender.*, tbl_kalender_ort.ort_kurzbz, tbl_kalender_ort.location');
- $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'tbl_kalender.kalender_id = tbl_kalender_ort.kalender_id', 'LEFT');
- $this->_ci->KalenderModel->db->where_in('status_kurzbz', array('sync_live', 'sync_preview', 'todelete', 'planning', 'preview'));
- $this->_ci->KalenderModel->addOrder('tbl_kalender.kalender_id', 'DESC');
- $to_update = $this->_ci->KalenderModel->load();
+ $allowed = false;
- if (!hasData($to_update))
- return success();
+ $this->_ci->LehreinheitModel->addSelect('studiengang_kz');
+ $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung', 'tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id');
+ $this->_ci->LehreinheitModel->db->where_in('lehreinheit_id', $lehreinheit_ids);
- $mail_infos = [];
+ $lehreinheit = $this->_ci->LehreinheitModel->load();
+ if (!hasData($lehreinheit))
+ return error('Lehreinheit nicht gefunden');
- foreach (getData($to_update) as $entry)
+ $studiengaenge = array_unique(array_column(getData($lehreinheit), 'studiengang_kz'));
+
+ foreach ($studiengaenge as $studiengang_kz)
{
- if ($entry->status_kurzbz === 'todelete')
+ if ($this->_ci->permissionlib->isBerechtigt('lehre/lvplan', 'suid', $studiengang_kz))
{
- $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'deleted'));
- $mail_infos[] = array('entry' => $entry, 'new_status' => 'deleted', 'notify' => array('lektor', 'student'));
- }
-
- if ($entry->status_kurzbz === 'sync_preview')
- {
- $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'preview'));
- $this->_archiveVorgaenger($entry->vorgaenger_kalender_id, true);
- $mail_infos[] = array('entry' => $entry, 'new_status' => 'preview', 'notify' => array('lektor'));
- }
-
- if ($entry->status_kurzbz === 'sync_live' || $entry->status_kurzbz === 'planning')
- {
- $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'live'));
- $this->_archiveVorgaenger($entry->vorgaenger_kalender_id, false);
- $mail_infos[] = array('entry' => $entry, 'new_status' => 'live', 'notify' => array('lektor', 'student'));
- }
-
- if ($entry->status_kurzbz === 'preview')
- {
- $current = getData($this->_ci->KalenderModel->load(array('kalender_id' => $entry->kalender_id)))[0];
- if ($current->status_kurzbz === 'archived')
- continue;
-
- $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'live'));
- $this->_archiveVorgaenger($entry->vorgaenger_kalender_id, false);
- $mail_infos[] = array('entry' => $entry, 'new_status' => 'live', 'notify' => array('lektor', 'student'));
+ $allowed = true;
+ break;
}
}
- $this->_ci->load->library('KalenderNotificationLib');
- $this->_ci->kalendernotificationlib->sendMails($mail_infos);
- return success();
-
+ return $allowed;
}
- private function _archiveVorgaenger($vorgaenger_kalender_id, $stop_at_live = false)
+ private function getLanguageIndex()
{
- if (!$vorgaenger_kalender_id) return;
+ $this->_ci->SpracheModel->addSelect('index');
+ $result = $this->_ci->SpracheModel->loadWhere(array('sprache' => getUserLanguage()));
- $current_id = $vorgaenger_kalender_id;
-
- while ($current_id)
- {
- $vorgaenger = $this->_ci->KalenderModel->load(array('kalender_id' => $current_id));
- if (!hasData($vorgaenger)) return;
-
- $vorgaenger = getData($vorgaenger)[0];
-
- if ($stop_at_live && $vorgaenger->status_kurzbz === 'live')
- return;
-
- if (in_array($vorgaenger->status_kurzbz, array('preview', 'live')))
- {
- $this->_ci->KalenderModel->update(
- array('kalender_id' => $current_id),
- array('status_kurzbz' => 'archived')
- );
- }
-
- $current_id = $vorgaenger->vorgaenger_kalender_id;
- }
+ return hasData($result) ? getData($result)[0]->index : 1;
}
-
}
diff --git a/application/libraries/KalenderNotificationLib.php b/application/libraries/KalenderNotificationLib.php
index d611eb247..acf14bae7 100644
--- a/application/libraries/KalenderNotificationLib.php
+++ b/application/libraries/KalenderNotificationLib.php
@@ -10,7 +10,7 @@ class KalenderNotificationLib
$this->_ci =& get_instance();
$this->_ci->load->library('MailLib');
$this->_ci->load->config('tempus');
-
+ $this->_ci->load->model('ressource/Kalender_model', 'KalenderModel');
}
public function sendMails($mail_infos)
@@ -90,6 +90,7 @@ class KalenderNotificationLib
if (!empty($student_deleted))
$student_entries .= $this->_addToList($student_deleted, 'gelöscht') . '
';
+ //TODO (david) richtigen Empfänger
if (!empty($lektor_entries))
$this->_ci->maillib->send('', 'ma0048@technikum-wien.at', 'Lektor Tempus Update', $lektor_entries);
if (!empty($student_entries))
diff --git a/application/libraries/KalenderSyncLib.php b/application/libraries/KalenderSyncLib.php
new file mode 100644
index 000000000..fce0ecd5d
--- /dev/null
+++ b/application/libraries/KalenderSyncLib.php
@@ -0,0 +1,429 @@
+ array('planning', 'sync_preview'),
+ 'live' => array('planning', 'sync_preview', 'preview', 'sync_live')
+ );
+
+ public function __construct()
+ {
+ $this->_ci =& get_instance();
+
+ $this->_ci->load->model('ressource/Kalender_model', 'KalenderModel');
+ $this->_ci->load->model('ressource/Kalendersyncstatus_model', 'KalendersyncstatusModel');
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
+ $this->_ci->load->library('KalenderLib');
+ }
+
+ public function run($studiensemester_kurzbz)
+ {
+ $this->_ci->KalendersyncstatusModel->db->where('studiensemester_kurzbz', $studiensemester_kurzbz);
+
+ $configs = $this->_ci->KalendersyncstatusModel->load();
+
+ if (isError($configs))
+ return $configs;
+
+ if (!hasData($configs))
+ return success([]);
+
+ $results = [];
+ $mail_infos_gesamt = [];
+
+ foreach (getData($configs) as $config)
+ {
+
+ $ziel_status = isEmptyString($config->sync_status_kurzbz) ? 'live' : $config->sync_status_kurzbz;
+
+ $relevante_stati = array_merge($this->status_map[$ziel_status], array('to_delete', 'to_delete_live', 'to_delete_preview'));
+
+ $kalender_ids_result = $this->getKalenderIds(
+ $config->oe_kurzbz,
+ $config->studiensemester_kurzbz,
+ $relevante_stati,
+ $config->ausbildungssemester,
+ $config->studienplan_id,
+ $config->datum_bis
+ );
+
+ if (isError($kalender_ids_result))
+ return $kalender_ids_result;
+
+ $kalender_ids = getData($kalender_ids_result);
+
+ $sync_result = $this->_syncKalenderIds($kalender_ids, $ziel_status);
+
+ if (isError($sync_result))
+ return $sync_result;
+
+ $sync_data = getData($sync_result);
+
+ if ((bool) $config->mail)
+ $mail_infos_gesamt = array_merge($mail_infos_gesamt, $sync_data['mail_infos']);
+
+ $results[] = [
+ 'kalender_syncstatus_id' => $config->kalender_syncstatus_id,
+ 'oe_kurzbz' => $config->oe_kurzbz,
+ 'ausbildungssemester' => $config->ausbildungssemester,
+ 'studienplan_id' => $config->studienplan_id,
+ 'ziel_status' => $ziel_status,
+ 'mail' => (bool) $config->mail,
+ 'synced' => $sync_data['synced']
+ ];
+ }
+
+ if (!empty($mail_infos_gesamt))
+ {
+ $this->_ci->load->library('KalenderNotificationLib');
+ $this->_ci->kalendernotificationlib->sendMails($mail_infos_gesamt);
+ }
+
+ return success($results);
+ }
+
+ public function runManual($oe_kurzbz, $studiensemester_kurzbz, $ausbildungssemester = null, $studienplan_id = null, $mail = true, $datum_bis = null, $ziel_status = 'live')
+ {
+ $relevante_stati = array_merge($this->status_map[$ziel_status], array('to_delete', 'to_delete_live', 'to_delete_preview'));
+
+ $kalender_ids_result = $this->getKalenderIds(
+ $oe_kurzbz,
+ $studiensemester_kurzbz,
+ $relevante_stati,
+ $ausbildungssemester,
+ $studienplan_id,
+ $datum_bis
+ );
+
+ if (isError($kalender_ids_result))
+ return $kalender_ids_result;
+
+ $kalender_ids = getData($kalender_ids_result);
+
+ $sync_result = $this->_syncKalenderIds($kalender_ids, $ziel_status);
+
+ if (isError($sync_result))
+ return $sync_result;
+
+ $sync_data = getData($sync_result);
+
+ if ($mail && !empty($sync_data['mail_infos']))
+ {
+ $this->_ci->load->library('KalenderNotificationLib');
+ $this->_ci->kalendernotificationlib->sendMails($sync_data['mail_infos']);
+ }
+
+ return success(['synced' => $sync_data['synced']]);
+ }
+
+ public function sync()
+ {
+ $mail_infos_gesamt = [];
+ $synced_gesamt = 0;
+
+ $todelete_ids_result = $this->_getManuallySetStatus(array('to_delete', 'to_delete_live', 'to_delete_preview'));
+
+ if (isError($todelete_ids_result))
+ return $todelete_ids_result;
+
+ $todelete_result = $this->_syncKalenderIds(getData($todelete_ids_result), null);
+
+ if (isError($todelete_result))
+ return $todelete_result;
+
+ $todelete_data = getData($todelete_result);
+ $mail_infos_gesamt = array_merge($mail_infos_gesamt, $todelete_data['mail_infos']);
+ $synced_gesamt += $todelete_data['synced'];
+
+ $preview_ids_result = $this->_getManuallySetStatus(array('sync_preview'));
+
+ if (isError($preview_ids_result))
+ return $preview_ids_result;
+
+ $preview_result = $this->_syncKalenderIds(getData($preview_ids_result), 'preview');
+
+ if (isError($preview_result))
+ return $preview_result;
+
+ $preview_data = getData($preview_result);
+ $mail_infos_gesamt = array_merge($mail_infos_gesamt, $preview_data['mail_infos']);
+ $synced_gesamt += $preview_data['synced'];
+
+ $live_ids_result = $this->_getManuallySetStatus(array('sync_live'));
+
+ if (isError($live_ids_result))
+ return $live_ids_result;
+
+ $live_result = $this->_syncKalenderIds(getData($live_ids_result), 'live');
+
+ if (isError($live_result))
+ return $live_result;
+
+ $live_data = getData($live_result);
+ $mail_infos_gesamt = array_merge($mail_infos_gesamt, $live_data['mail_infos']);
+ $synced_gesamt += $live_data['synced'];
+
+ if (!empty($mail_infos_gesamt))
+ {
+ $this->_ci->load->library('KalenderNotificationLib');
+ $this->_ci->kalendernotificationlib->sendMails($mail_infos_gesamt);
+ }
+
+ return success(['synced' => $synced_gesamt]);
+ }
+
+ private function _getManuallySetStatus($status_kurzbz_list)
+ {
+ if (empty($status_kurzbz_list))
+ return success([]);
+
+ $this->_ci->KalenderModel->addSelect('tbl_kalender.kalender_id');
+ $this->_ci->KalenderModel->db->where_in('status_kurzbz', $status_kurzbz_list);
+ $result = $this->_ci->KalenderModel->load();
+
+ if (isError($result))
+ return $result;
+
+ if (!hasData($result))
+ return success([]);
+
+ return success(array_column(getData($result), 'kalender_id'));
+ }
+
+ public function getKalenderIds($oe_kurzbz, $studiensemester_kurzbz, $status_kurzbz_list, $ausbildungssemester = null, $studienplan_id = null, $datum_bis = null)
+ {
+ if (empty($status_kurzbz_list))
+ return success([]);
+
+ $studiengang_result = $this->_getStudiengang($oe_kurzbz);
+
+ if (isError($studiengang_result))
+ return $studiengang_result;
+
+ $studiengang_kz = getData($studiengang_result);
+
+ if (!hasData($studiengang_result))
+ {
+ $organisationseinheiten = $this->_ci->OrganisationseinheitModel->getChilds($oe_kurzbz);
+ $oe_kurzbz = hasData($organisationseinheiten) ? array_column(getData($organisationseinheiten), 'oe_kurzbz') : [];
+ }
+
+ $this->_ci->KalenderModel->addDistinct('tbl_kalender.kalender_id');
+ $this->_ci->KalenderModel->addSelect('tbl_kalender.kalender_id');
+ $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit', 'tbl_kalender.kalender_id = tbl_kalender_lehreinheit.kalender_id');
+ $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheit', 'tbl_kalender_lehreinheit.lehreinheit_id = tbl_lehreinheit.lehreinheit_id');
+ $this->_ci->KalenderModel->addJoin('lehre.tbl_lehrveranstaltung', 'tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id');
+
+ if (!is_null($studiengang_kz))
+ {
+ $this->_ci->KalenderModel->db->where('tbl_lehrveranstaltung.studiengang_kz', $studiengang_kz);
+ }
+ else
+ {
+ $this->_ci->KalenderModel->db->where_in('tbl_lehrveranstaltung.oe_kurzbz', $oe_kurzbz);
+ }
+
+ $this->_ci->KalenderModel->db->where('tbl_lehreinheit.studiensemester_kurzbz', $studiensemester_kurzbz);
+ $this->_ci->KalenderModel->db->where_in('tbl_kalender.status_kurzbz', $status_kurzbz_list);
+
+ $this->_ci->KalenderModel->db->where('NOT EXISTS (
+ SELECT 1 FROM lehre.tbl_kalender nachfolger
+ WHERE nachfolger.vorgaenger_kalender_id = tbl_kalender.kalender_id)', null, false);
+
+ if (!is_null($studienplan_id))
+ {
+ $this->_ci->KalenderModel->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_studienplan_lehrveranstaltung.lehrveranstaltung_id');
+ $this->_ci->KalenderModel->db->where('tbl_studienplan_lehrveranstaltung.studienplan_id', $studienplan_id);
+ }
+
+ if (!is_null($ausbildungssemester))
+ $this->_ci->KalenderModel->db->where('tbl_lehrveranstaltung.semester', $ausbildungssemester);
+
+ if (!is_null($datum_bis))
+ {
+ $end_date = date('Y-m-d', strtotime($datum_bis . ' +1 day'));
+ $this->_ci->KalenderModel->db->where('tbl_kalender.von <', $end_date);
+ }
+
+ $result = $this->_ci->KalenderModel->load();
+
+ if (isError($result))
+ return $result;
+
+ if (!hasData($result))
+ return success([]);
+
+ return success(array_column(getData($result), 'kalender_id'));
+ }
+
+
+ private function _archiveVorgaenger($vorgaenger_kalender_id, $stop_at_live = false)
+ {
+ $return_array = array();
+ if (!$vorgaenger_kalender_id) return success($return_array);
+
+ $current_id = $vorgaenger_kalender_id;
+
+ while ($current_id)
+ {
+ $vorgaenger = $this->_ci->KalenderModel->load(array('kalender_id' => $current_id));
+ if (!hasData($vorgaenger)) return success($return_array);
+
+ $vorgaenger = getData($vorgaenger)[0];
+
+ if ($stop_at_live && $vorgaenger->status_kurzbz === 'live')
+ return success($return_array);
+
+ if (in_array($vorgaenger->status_kurzbz, array('preview', 'live')))
+ {
+ $this->_ci->KalenderModel->update(
+ array('kalender_id' => $current_id),
+ array('status_kurzbz' => 'archived', 'status_kurzbz_max' => $vorgaenger->status_kurzbz)
+ );
+
+ $return_array[] = $vorgaenger;
+ }
+
+ $current_id = $vorgaenger->vorgaenger_kalender_id;
+ }
+ return success($return_array);
+ }
+
+ private function _syncKalenderIds($kalender_ids, $ziel_status)
+ {
+ if (empty($kalender_ids))
+ return success(['synced' => 0, 'mail_infos' => []]);
+
+ $this->_ci->KalenderModel->addSelect('tbl_kalender.*, tbl_kalender_ort.ort_kurzbz, tbl_kalender_ort.location');
+ $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'tbl_kalender.kalender_id = tbl_kalender_ort.kalender_id', 'LEFT');
+ $this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids);
+ $this->_ci->KalenderModel->addOrder('tbl_kalender.kalender_id', 'DESC');
+ $to_update = $this->_ci->KalenderModel->load();
+
+ if (isError($to_update))
+ return $to_update;
+
+ if (!hasData($to_update))
+ return success(['synced' => 0, 'mail_infos' => []]);
+
+ $mail_infos = [];
+ $synced = 0;
+
+ foreach (getData($to_update) as $entry)
+ {
+ if (in_array($entry->status_kurzbz, array('to_delete', 'to_delete_live', 'to_delete_preview')))
+ {
+ $notify = array();
+ if ($entry->status_kurzbz === 'to_delete_live')
+ {
+ $status_max = 'live';
+ $notify = array('lektor', 'student');
+ }
+ else if ($entry->status_kurzbz === 'to_delete_preview')
+ {
+ $status_max = 'preview';
+ $notify = array('lektor');
+ }
+ else if ($entry->status_kurzbz === 'to_delete')
+ {
+ $status_max = 'planning';
+ }
+
+ $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'deleted', 'status_kurzbz_max' => $status_max));
+ $mail_infos[] = array('entry' => $entry, 'new_status' => 'deleted', 'notify' => $notify);
+
+ $vorgaenger_array = $this->_archiveVorgaenger($entry->vorgaenger_kalender_id);
+
+
+
+ if (hasData($vorgaenger_array))
+ {
+ foreach(getData($vorgaenger_array) as $vorgaenger)
+ {
+ $archive_notify = array();
+
+ if ($vorgaenger->status_kurzbz === 'preview')
+ $archive_notify = array('lektor');
+ else if ($vorgaenger->status_kurzbz === 'live')
+ {
+ $archive_notify = array('student', 'lektor');
+
+ $history = $this->_ci->kalenderlib->getHistory($vorgaenger->kalender_id, false, false);
+ if (hasData($history))
+ {
+ $history = getData($history);
+
+ foreach ($history as $entry)
+ {
+ if ($entry->status_kurzbz === 'deleted' && $entry->status_kurzbz_max === 'preview')
+ {
+ $archive_notify = array('student');
+ break;
+ }
+ }
+ }
+ }
+
+ $mail_infos[] = array('entry' => $vorgaenger, 'new_status' => 'deleted', 'notify' => $archive_notify);
+ }
+ }
+
+ $synced++;
+ continue;
+ }
+
+ if ($ziel_status === 'preview' && in_array($entry->status_kurzbz, array('planning', 'sync_preview')))
+ {
+ $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'preview'));
+ $this->_archiveVorgaenger($entry->vorgaenger_kalender_id, true);
+ $mail_infos[] = array('entry' => $entry, 'new_status' => 'preview', 'notify' => array('lektor'));
+ $synced++;
+ continue;
+ }
+
+ if ($ziel_status === 'live' && in_array($entry->status_kurzbz, array('planning', 'sync_preview', 'sync_live')))
+ {
+ $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'live'));
+ $this->_archiveVorgaenger($entry->vorgaenger_kalender_id, false);
+ $mail_infos[] = array('entry' => $entry, 'new_status' => 'live', 'notify' => array('lektor', 'student'));
+ $synced++;
+ continue;
+ }
+
+ if ($ziel_status === 'live' && $entry->status_kurzbz === 'preview')
+ {
+ $current = getData($this->_ci->KalenderModel->load(array('kalender_id' => $entry->kalender_id)))[0];
+ if ($current->status_kurzbz === 'archived')
+ continue;
+
+ $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'live'));
+ $this->_archiveVorgaenger($entry->vorgaenger_kalender_id, false);
+ $mail_infos[] = array('entry' => $entry, 'new_status' => 'live', 'notify' => array('lektor', 'student'));
+ $synced++;
+ }
+ }
+
+ return success(['synced' => $synced, 'mail_infos' => $mail_infos]);
+ }
+
+
+ private function _getStudiengang($oe_kurzbz)
+ {
+ $this->_ci->StudiengangModel->addJoin('tbl_organisationseinheit', 'oe_kurzbz');
+ $result = $this->_ci->StudiengangModel->loadWhere(array('oe_kurzbz' => $oe_kurzbz));
+
+ if (isError($result))
+ return $result;
+
+ if (!hasData($result))
+ return success(null);
+
+ return success(getData($result)[0]->studiengang_kz);
+ }
+}
\ No newline at end of file
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/RaumvorschlagLib.php b/application/libraries/RaumvorschlagLib.php
index fbdf7db3a..a5eb5f77c 100644
--- a/application/libraries/RaumvorschlagLib.php
+++ b/application/libraries/RaumvorschlagLib.php
@@ -30,13 +30,14 @@ class RaumvorschlagLib
$this->_ci->load->model('ressource/Ort_model', 'OrtModel');
$this->_ci->load->model('organisation/gruppe_model', 'GruppeModel');
$this->_ci->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
-
- $this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel');
+ $this->_ci->load->model('ressource/Zeitsperre_model', 'ZeitsperreModel');
+ $this->_ci->load->model('ressource/Stunde_model', 'StundeModel');
$this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel');
$this->_ci->load->library('CollisionChecker', ["uid" => getAuthUID()]);
$this->_ci->load->library('KalenderLib', ["uid" => getAuthUID()]);
$this->_ci->load->library('PhrasesLib', array('ui'));
+ $this->_ci->load->library('VariableLib', array('uid' => getAuthUID()));
}
@@ -44,39 +45,295 @@ class RaumvorschlagLib
{
$event = $this->_ci->kalenderlib->getByKalenderId($kalender_id);
$event = $event[0];
+ return $this->_getVorschlaegeForEvent($event);
+ }
- $lektor_uids = array_column($event->lektor, 'mitarbeiter_uid');
- $gruppen_kurzbz = array_values(array_filter(array_column($event->gruppe, 'gruppe_kurzbz')));
+ public function getVorschlaegeByLehreinheit($lehreinheit_id, $von, $bis)
+ {
+ $teilnehmer = $this->_getLehreinheitTeilnehmer($lehreinheit_id);
- $lehrverband_gruppen = array_values(array_filter($event->gruppe, function($gruppe)
+ $event = (object) [
+ 'kalender_id' => null,
+ 'lehreinheit_id' => [$lehreinheit_id],
+ 'isostart' => (new DateTime($von))->format('c'),
+ 'isoend' => (new DateTime($bis))->format('c'),
+ 'datum' => (new DateTime($von))->format('Y-m-d'),
+ 'lektor' => $teilnehmer->lektor_data,
+ 'gruppe' => $teilnehmer->gruppen_data,
+ ];
+
+ return $this->_getVorschlaegeForEvent($event);
+ }
+
+ public function getVorschlaegeSlots($lehreinheit_id, $start_date, $end_date)
+ {
+ $lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id);
+ if (!hasData($lehreinheit_result))
+ return error('Lehreinheit nicht gefunden');
+ $lehreinheit = getData($lehreinheit_result)[0];
+
+ $block = $lehreinheit->stundenblockung;
+ if ($block <= 0)
+ return error('Stundenblockung ist ungültig');
+
+ $this->_ci->StundeModel->addOrder('stunde', 'ASC');
+ $stunden_result = $this->_ci->StundeModel->load();
+ $stunden = hasData($stunden_result) ? array_values(getData($stunden_result)) : [];
+
+ if (empty($stunden))
+ return error('Kein Stunden-Raster gefunden');
+
+ $teilnehmer = $this->_getLehreinheitTeilnehmer($lehreinheit_id);
+ $grp = $this->_splitGruppen($teilnehmer->gruppen_data);
+ $lektor_uids = array_column($teilnehmer->lektor_data, 'mitarbeiter_uid');
+
+ $verplante_events = $this->_ci->kalenderlib->getForRaumvorschlag(
+ $start_date,
+ $end_date,
+ $lektor_uids,
+ $grp->gruppen_kurzbz,
+ $grp->lehrverband_gruppen
+ );
+
+ $start_day = strtotime($start_date);
+ $end_day = strtotime($end_date);
+
+ $moegliche_slots = array();
+
+ $verplante_zeitsperren = $this->_getZeitsperen($start_date, $end_date, $lektor_uids);
+ while ($start_day <= $end_day)
+ {
+ $tag = date('Y-m-d', $start_day);
+
+ $verplante_tages_events = array_values(array_filter($verplante_events, function($event) use ($tag)
+ {
+ return $event->datum === $tag;
+ }));
+
+ foreach ($stunden as $index => $start_stunde)
+ {
+ if (!isset($stunden[$index + $block - 1]))
+ continue;
+
+ $end_stunde = $stunden[$index + $block - 1];
+
+ $slot_start = $tag . ' ' . $start_stunde->beginn;
+ $slot_end = $tag . ' ' . $end_stunde->ende;
+
+ if (!$this->_isFrei($slot_start, $slot_end, $verplante_zeitsperren, $lektor_uids, 'lektor'))
+ continue;
+
+ if (!$this->_isFrei($slot_start, $slot_end, $verplante_tages_events, $lektor_uids, 'lektor'))
+ continue;
+
+ if (!$this->_isFrei($slot_start, $slot_end, $verplante_tages_events, $grp->gruppen_kurzbz, 'gruppe'))
+ continue;
+
+ if (!$this->_isFrei($slot_start, $slot_end, $verplante_tages_events, $grp->lehrverband_gruppen_bezeichnung, 'lehrverband'))
+ continue;
+
+ $moegliche_slots[] = [
+ 'isostart' => (new DateTime($slot_start))->format('c'),
+ 'isoend' => (new DateTime($slot_end))->format('c'),
+ 'marker_isoend' => (new DateTime($tag . ' ' . $start_stunde->ende))->format('c'),
+ ];
+ }
+
+ $start_day = strtotime('+1 day', $start_day);
+ }
+
+
+ $slots = [];
+ foreach ($moegliche_slots as $slot)
+ {
+ $event_obj = (object) [
+ 'kalender_id' => null,
+ 'lehreinheit_id' => [$lehreinheit_id],
+ 'isostart' => $slot['isostart'],
+ 'isoend' => $slot['isoend'],
+ ];
+
+ $raumkandidaten = $this->_getRaumkandidaten($event_obj);
+
+ if (empty($raumkandidaten))
+ continue;
+
+ $ratings = $this->_getRatings($verplante_events, $slot, $raumkandidaten, $lektor_uids, $grp->gruppen_kurzbz, $grp->lehrverband_gruppen_bezeichnung);
+ $best = $ratings[0];
+ $anzahl_weitere = count($ratings) - 1;
+
+ $slots[] = [
+ 'isostart' => $slot['isostart'],
+ 'isoend' => $slot['isoend'],
+ 'marker_isoend' => $slot['marker_isoend'],
+ 'rating' => $this->_scoreToRating($best['score']),
+ 'label' => $anzahl_weitere > 0 ? $best['ort_kurzbz'] . ' (' . $best['score'] . ') + ' . $anzahl_weitere . ' weitere' : $best['ort_kurzbz'] . ' (' . $best['score'] . ')',
+ 'raeume' => $ratings,
+ ];
+ }
+ return success($slots);
+ }
+
+ private function _getZeitsperen($start_date, $end_date, $uids)
+ {
+
+ if (empty($uids)) return [];
+
+ if (($this->_ci->variablelib->getVar('ignore_kollision') === 'true') || ($this->_ci->variablelib->getVar('ignore_zeitsperre') === 'true')) return [];
+
+
+ $this->_ci->ZeitsperreModel->addSelect('mitarbeiter_uid, vondatum, vonstunde_z.beginn as von_beginn, bisdatum, bisstunde_z.ende as bis_ende');
+ $this->_ci->ZeitsperreModel->addJoin('lehre.tbl_stunde vonstunde_z', 'vonstunde_z.stunde = tbl_zeitsperre.vonstunde', 'LEFT');
+ $this->_ci->ZeitsperreModel->addJoin('lehre.tbl_stunde bisstunde_z', 'bisstunde_z.stunde = tbl_zeitsperre.bisstunde', 'LEFT');
+ $this->_ci->ZeitsperreModel->db->where('zeitsperretyp_kurzbz !=', 'ZVerfueg');
+ $this->_ci->ZeitsperreModel->db->where('(tbl_zeitsperre.vondatum + COALESCE(vonstunde_z.beginn, \'00:00\'))::timestamp <', $end_date);
+ $this->_ci->ZeitsperreModel->db->where('(tbl_zeitsperre.bisdatum + COALESCE(bisstunde_z.ende, \'23:59\'))::timestamp >', $start_date);
+
+ $this->_ci->ZeitsperreModel->db->where_in('mitarbeiter_uid', $uids);
+ $result = $this->_ci->ZeitsperreModel->load();
+
+ if (!hasData($result)) return [];
+
+ $events = [];
+ foreach (getData($result) as $row)
+ {
+ $von = new DateTime($row->vondatum . ' ' . ($row->von_beginn ?? '00:00'));
+ $bis = new DateTime($row->bisdatum . ' ' . ($row->bis_ende ?? '23:59'));
+
+ $events[] = (object)[
+ 'isostart' => $von->format('c'),
+ 'isoend' => $bis->format('c'),
+ 'lektor' => [['mitarbeiter_uid' => $row->mitarbeiter_uid]]
+ ];
+ }
+ return $events;
+ }
+
+ private function _getLehreinheitTeilnehmer($lehreinheit_id)
+ {
+ $lektoren_result = $this->_ci->LehreinheitMitarbeiterModel->loadWhere(['lehreinheit_id' => $lehreinheit_id]);
+ $lektor_data = [];
+ if (hasData($lektoren_result))
+ {
+ $lektor_data = getData($lektoren_result);
+ }
+
+ $gruppen_result = $this->_ci->LehreinheitgruppeModel->getByLehreinheit($lehreinheit_id);
+ $gruppen_data = [];
+ if (hasData($gruppen_result))
+ {
+ $gruppen_rows = getData($gruppen_result);
+
+ foreach ($gruppen_rows as $gruppe)
+ {
+ $gruppen_data[] = (array) $gruppe;
+ }
+ }
+
+
+ return (object)[
+ 'lektor_data' => $lektor_data,
+ 'gruppen_data' => $gruppen_data,
+ ];
+
+ }
+
+ private function _splitGruppen($gruppen_data)
+ {
+ $gruppen_kurzbz = array_values(array_filter(array_column($gruppen_data, 'gruppe_kurzbz')));
+ $lehrverband_gruppen = array_values(array_filter($gruppen_data, function($gruppe)
{
return empty($gruppe['gruppe_kurzbz']);
}));
+ $lehrverband_gruppen_bezeichnung = array_column($lehrverband_gruppen, 'bezeichnung');
+
+ return (object)[
+ 'gruppen_kurzbz' => $gruppen_kurzbz,
+ 'lehrverband_gruppen' => $lehrverband_gruppen,
+ 'lehrverband_gruppen_bezeichnung' => $lehrverband_gruppen_bezeichnung
+ ];
+
+ }
+ //TODO (david) umbauen auf CollisionChecks
+ private function _isFrei($slot_start, $slot_end, $events, $check_array, $type)
+ {
+ if (empty($check_array)) return true;
+
+ $slot_start_ts = strtotime($slot_start);
+ $slot_end_ts = strtotime($slot_end);
+
+ foreach ($events as $event)
+ {
+ $event_start_ts = strtotime($event->isostart);
+ $event_end_ts = strtotime($event->isoend);
+
+ if ($event_end_ts <= $slot_start_ts || $event_start_ts >= $slot_end_ts)
+ continue;
+
+ $event_uids = $this->_getIds($event, $type);
+
+ if (!empty(array_intersect($event_uids, $check_array)))
+ return false;
+ }
+
+ return true;
+ }
+
+ private function _scoreToRating($score)
+ {
+ if ($score >= 90)
+ return 'good';
+ if ($score >= 60)
+ return 'mid';
+ return 'bad';
+ }
+ private function _getVorschlaegeForEvent($event)
+ {
+ $raumkandidaten = $this->_getRaumkandidaten($event);
+ if (empty($raumkandidaten)) return [];
+
+ $lektor_uids = array_column($event->lektor, 'mitarbeiter_uid');
+ $grp = $this->_splitGruppen($event->gruppe);
$tages_events = $this->_ci->kalenderlib->getForRaumvorschlag(
$event->datum,
$event->datum,
$lektor_uids,
- $gruppen_kurzbz,
- $lehrverband_gruppen
+ $grp->gruppen_kurzbz,
+ $grp->lehrverband_gruppen
);
- $lektor_davor = $this->_getEventDavor($tages_events, $event->isostart, $lektor_uids, 'lektor');
- $gruppen_davor = $this->_getEventDavor($tages_events, $event->isostart, $gruppen_kurzbz, 'gruppe');
+ return $this->_getRatings($tages_events, $event, $raumkandidaten, $lektor_uids, $grp->gruppen_kurzbz, $grp->lehrverband_gruppen_bezeichnung);
+ }
+ private function _getRatings($events, $event, $raumkandidaten, $lektor_uids, $gruppen_kurzbz, $lehrverband_gruppen_bezeichnung)
+ {
+ $event = (object)$event;
+ $lektor_davor = $this->_getEventDavor($events, $event->isostart, $lektor_uids, 'lektor');
+ $gruppen_davor = $this->_getEventDavor($events, $event->isostart, $gruppen_kurzbz, 'gruppe');
+ $lehrverband_davor = $this->_getEventDavor($events, $event->isostart, $lehrverband_gruppen_bezeichnung, 'lehrverband');
$lektor_davor_ort = $lektor_davor ? $this->_getOrtDetails($lektor_davor->ort_kurzbz) : null;
$gruppen_davor_ort = $gruppen_davor ? $this->_getOrtDetails($gruppen_davor->ort_kurzbz) : null;
+ $lehrverband_davor_ort = $lehrverband_davor ? $this->_getOrtDetails($lehrverband_davor->ort_kurzbz) : null;
- $kandidaten = $this->_getRaumkandidaten($event);
- if (empty($kandidaten)) return [];
+ $unique = [];
+
+ foreach ($raumkandidaten as $raum)
+ {
+ $unique[$raum->ort_kurzbz] = $raum;
+ }
+
+ $kandidaten = array_values($unique);
$ratings = [];
foreach ($kandidaten as $raum)
{
- $rating = ['ort_kurzbz' => $raum->ort_kurzbz, 'score' => 100, 'details' => []];
+ $rating = ['ort_kurzbz' => $raum->ort_kurzbz, 'score' => 100, 'details' => [],
+ 'raumtyp_kurzbz' => $raum->raumtyp_kurzbz, 'max_person' => $raum->max_person];
$this->_rateLektor($rating, $raum, $lektor_davor_ort);
$this->_rateGruppen($rating, $raum, $gruppen_davor_ort);
+ $this->_rateGruppen($rating, $raum, $lehrverband_davor_ort);
Events::trigger('room_rating',
function & () use (&$rating) {
@@ -90,69 +347,102 @@ class RaumvorschlagLib
usort($ratings, function($a, $b)
{
- return $b['score'] - $a['score'];
+ return $b['score'] <=> $a['score'];
});
return $ratings;
}
- private function _getOrtDetails($ort_kurzbz)
+ private function _getOrtDetails($ort_kurzbz_array)
{
+ $ort_kurzbz_array = (array) $ort_kurzbz_array;
+ if (empty($ort_kurzbz_array)) return [];
$this->_ci->OrtModel->addSelect('ort_kurzbz, stockwerk, standort_id');
- $this->_ci->OrtModel->db->where('ort_kurzbz', $ort_kurzbz);
+ $this->_ci->OrtModel->db->where_in('ort_kurzbz', $ort_kurzbz_array);
$result = $this->_ci->OrtModel->load();
- return hasData($result) ? getData($result)[0] : null;
+
+ return hasData($result) ? getData($result) : [];
}
- private function _rateLektor(&$rating, $raum, $lektor_davor_ort)
+ private function _rateLektor(&$rating, $raum, $lektor_davor_orte)
{
- if (!$lektor_davor_ort) return;
+ if (empty($lektor_davor_orte)) return;
- if ($lektor_davor_ort->ort_kurzbz === $raum->ort_kurzbz)
+ foreach ($lektor_davor_orte as $ort)
{
- $rating['score'] += 20;
- $rating['details'][] = '+20 ' . $this->_ci->phraseslib->t('ui', 'lecturer_already_here');
- return;
+ if ($ort->ort_kurzbz === $raum->ort_kurzbz)
+ {
+ $rating['score'] += 20;
+ $rating['details'][] = '+20 ' . $this->_ci->phraseslib->t('ui', 'lecturer_already_here');
+ return;
+ }
}
- if ($lektor_davor_ort->standort_id !== $raum->standort_id)
+ $gleiches_gebaeude = array_filter($lektor_davor_orte, function($ort) use ($raum)
+ {
+ return $ort->standort_id === $raum->standort_id;
+ });
+
+ if (empty($gleiches_gebaeude))
{
$rating['score'] -= 20;
$rating['details'][] = '-20 '. $this->_ci->phraseslib->t('ui', 'lecturer_building_change');
+ return;
}
- elseif ($lektor_davor_ort->stockwerk !== $raum->stockwerk)
+
+ $diffs = array_map(function($ort) use ($raum)
+ {
+ return abs($ort->stockwerk - $raum->stockwerk);
+ }, $gleiches_gebaeude);
+
+ $diff = min($diffs);
+
+ if ($diff > 0)
{
- $diff = abs($lektor_davor_ort->stockwerk - $raum->stockwerk);
$rating['score'] -= $diff * 5;
$rating['details'][] = '-' . ($diff * 5) . ' ' . $this->_ci->phraseslib->t('ui', 'lecturer_floor_change');
}
}
- private function _rateGruppen(&$rating, $raum, $gruppen_davor_ort)
+ private function _rateGruppen(&$rating, $raum, $gruppen_davor_orte)
{
- if (!$gruppen_davor_ort) return;
+ if (empty($gruppen_davor_orte)) return;
- if ($gruppen_davor_ort->ort_kurzbz === $raum->ort_kurzbz)
+ foreach ($gruppen_davor_orte as $ort)
{
- $rating['score'] += 10;
- $rating['details'][] = '+10 ' . $this->_ci->phraseslib->t('ui', 'student_already_here');
- return;
+ if ($ort->ort_kurzbz === $raum->ort_kurzbz)
+ {
+ $rating['score'] += 10;
+ $rating['details'][] = '+10 ' . $this->_ci->phraseslib->t('ui', 'student_already_here');
+ return;
+ }
}
- if ($gruppen_davor_ort->standort_id !== $raum->standort_id)
+ $gleiches_gebaeude = array_filter($gruppen_davor_orte, function($ort) use ($raum)
+ {
+ return $ort->standort_id === $raum->standort_id;
+ });
+
+ if (empty($gleiches_gebaeude))
{
$rating['score'] -= 20;
$rating['details'][] = '-20 '. $this->_ci->phraseslib->t('ui', 'student_building_change');
+ return;
}
- elseif ($gruppen_davor_ort->stockwerk !== $raum->stockwerk)
+
+ $diffs = array_map(function($ort) use ($raum)
+ {
+ return abs($ort->stockwerk - $raum->stockwerk);
+ }, $gleiches_gebaeude);
+
+ $diff = min($diffs);
+
+ if ($diff > 0)
{
- $diff = abs($gruppen_davor_ort->stockwerk - $raum->stockwerk);
$rating['score'] -= $diff * 5;
$rating['details'][] = '-' . ($diff * 5) . ' '. $this->_ci->phraseslib->t('ui', 'student_floor_change');
}
-
-
}
private function _getEventDavor($events, $von, $uids, $type)
@@ -171,10 +461,7 @@ class RaumvorschlagLib
if (empty($event->ort_kurzbz))
continue;
- if ($type === 'lektor')
- $event_uids = array_column($event->lektor, 'mitarbeiter_uid');
- else
- $event_uids = array_column($event->gruppe, 'gruppe_kurzbz');
+ $event_uids = $this->_getIds($event, $type);
if (empty(array_intersect($event_uids, $uids)))
continue;
@@ -186,23 +473,59 @@ class RaumvorschlagLib
return $kandidat;
}
+ private function _getIds($event, $type)
+ {
+ $event_uids = array();
+
+ if ($type === 'lektor')
+ $event_uids = array_column($event->lektor, 'mitarbeiter_uid');
+ else if ($type === 'gruppe')
+ $event_uids = array_column($event->gruppe, 'gruppe_kurzbz');
+ else if ($type === 'lehrverband')
+ $event_uids = array_column($event->gruppe, 'bezeichnung');
+
+ return $event_uids;
+ }
+
private function _getRaumkandidaten($event)
{
- $lehreinheit = $this->_ci->LehreinheitModel->load($event->lehreinheit_id[0]);
- if (!hasData($lehreinheit)) return [];
- $lehreinheit = getData($lehreinheit)[0];
+ $raumtyp = null;
+ $raumtypalternativ = null;
+ if (!empty($event->lehreinheit_id))
+ {
+ $lehreinheit = $this->_ci->LehreinheitModel->load($event->lehreinheit_id[0]);
+ if (hasData($lehreinheit))
+ {
+ $lehreinheit = getData($lehreinheit)[0];
+ $raumtyp = $lehreinheit->raumtyp ?? null;
+ $raumtypalternativ = $lehreinheit->raumtypalternativ ?? null;
+ }
+ }
+
+ $this->_ci->KalenderModel->addDistinct('tbl_kalender_ort.ort_kurzbz');
$this->_ci->KalenderModel->addSelect('tbl_kalender_ort.ort_kurzbz');
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'tbl_kalender.kalender_id = tbl_kalender_ort.kalender_id');
$this->_ci->KalenderModel->db->where('tbl_kalender.von <', $event->isoend);
$this->_ci->KalenderModel->db->where('tbl_kalender.bis >', $event->isostart);
- $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['deleted']);
+ if (!is_null($event->kalender_id))
+ {
+ $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $event->kalender_id);
+ }
+ $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['deleted', 'to_delete', 'to_delete_live', 'to_delete_preview', 'archived']);
$this->_ci->KalenderModel->db->where('tbl_kalender_ort.ort_kurzbz IS NOT NULL', null, false);
+ $this->_ci->KalenderModel->db->where(
+ 'NOT EXISTS (
+ SELECT 1 FROM lehre.tbl_kalender nachfolger
+ WHERE nachfolger.vorgaenger_kalender_id = tbl_kalender.kalender_id
+ )', null, false
+ );
+
$belegte = $this->_ci->KalenderModel->load();
$belegte_orte = hasData($belegte) ? array_column(getData($belegte), 'ort_kurzbz') : [];
- if (empty($lehreinheit->raumtyp))
+ if (empty($raumtyp))
{
$raeume = $this->_getFreieRaeume(null, $belegte_orte);
return hasData($raeume) ? getData($raeume) : [];
@@ -210,14 +533,14 @@ class RaumvorschlagLib
$vorschlaege = [];
- $raeume = $this->_getFreieRaeume($lehreinheit->raumtyp, $belegte_orte);
+ $raeume = $this->_getFreieRaeume($raumtyp, $belegte_orte);
if (hasData($raeume))
$vorschlaege = getData($raeume);
- if (count($vorschlaege) < 5 && !empty($lehreinheit->raumtypalternativ))
+ if (count($vorschlaege) < 5 && !empty($raumtypalternativ))
{
$bereits_gefunden = array_merge($belegte_orte, array_column($vorschlaege, 'ort_kurzbz'));
- $alternativ = $this->_getFreieRaeume($lehreinheit->raumtypalternativ, $bereits_gefunden);
+ $alternativ = $this->_getFreieRaeume($raumtypalternativ, $bereits_gefunden);
if (!isError($alternativ) && hasData($alternativ))
$vorschlaege = array_merge($vorschlaege, getData($alternativ));
@@ -228,9 +551,14 @@ class RaumvorschlagLib
private function _getFreieRaeume($raumtyp, $belegte_orte)
{
- $this->_ci->OrtModel->addSelect('ort_kurzbz, stockwerk, standort_id');
+ $this->_ci->OrtModel->addSelect('ort_kurzbz, stockwerk, standort_id, max_person, raumtyp_kurzbz');
$this->_ci->OrtModel->addJoin('public.tbl_ortraumtyp', 'ort_kurzbz');
- $this->_ci->OrtModel->db->where('raumtyp_kurzbz', $raumtyp);
+
+ if (!empty($raumtyp))
+ $this->_ci->OrtModel->db->where('raumtyp_kurzbz', $raumtyp);
+ else
+ $this->_ci->OrtModel->db->where('reservieren', true);
+
$this->_ci->OrtModel->db->where('aktiv', true);
$this->_ci->OrtModel->db->where("ort_kurzbz NOT LIKE '\_%'", null, false);
@@ -240,11 +568,4 @@ class RaumvorschlagLib
return $this->_ci->OrtModel->load();
}
-
-
-
-
-
-
-
}
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/collision/checks/LectureCollisionCheck.php b/application/libraries/collision/checks/LectureCollisionCheck.php
index 34d26a09b..4e5a2dc25 100644
--- a/application/libraries/collision/checks/LectureCollisionCheck.php
+++ b/application/libraries/collision/checks/LectureCollisionCheck.php
@@ -17,8 +17,9 @@ class LectureCollisionCheck implements ICollisionCheck
}
$this->_ci->load->model('ressource/Kalender_model', 'KalenderModel');
- $this->_ci->load->model('ressource/zeitsperre_model', 'ZeitsperreModel');
- $this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
+ $this->_ci->load->model('ressource/Zeitsperre_model', 'ZeitsperreModel');
+ $this->_ci->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
+ $this->_ci->load->library('VariableLib', array('uid' => getAuthUID()));
$this->_ci->load->library('PhrasesLib', array('ui'));
}
@@ -30,11 +31,17 @@ class LectureCollisionCheck implements ICollisionCheck
public function check($data)
{
- if (!isset($data->von, $data->bis, $data->kalender_id)) return [];
+ if (!isset($data->von, $data->bis)) return [];
+ if (empty($data->kalender_id) && empty($data->lehreinheit_id) && empty($data->uids)) return [];
if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return [];
- $uids = $this->_getUids($data->kalender_id);
+ if (!empty($data->kalender_id))
+ $uids = $this->_getUids($data->kalender_id);
+ else if (!empty($data->lehreinheit_id))
+ $uids = $this->_getUidsFromLehreinheit($data->lehreinheit_id);
+ else
+ $uids = $data->uids;
if (empty($uids)) return [];
@@ -66,9 +73,17 @@ class LectureCollisionCheck implements ICollisionCheck
$this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false);
$this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false);
$this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false);
- $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']);
+ $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview'));
$this->_ci->KalenderModel->db->where_not_in('current_lehreinheit_ma.mitarbeiter_uid', $kollisionsfreie_user);
- $this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids);
+
+ $this->_ci->KalenderModel->db->group_start();
+ $where_ids_chunks = array_chunk($kalender_ids,25);
+ foreach($where_ids_chunks as $where_ids)
+ {
+ $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids);
+ }
+ $this->_ci->KalenderModel->db->group_end();
+
$this->_ci->KalenderModel->db->where(
'other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)',
null, false
@@ -93,9 +108,17 @@ class LectureCollisionCheck implements ICollisionCheck
$this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false);
$this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false);
$this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false);
- $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']);
+ $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview']);
$this->_ci->KalenderModel->db->where_not_in('current_lehreinheit_ma.mitarbeiter_uid', $kollisionsfreie_user);
- $this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids);
+
+ $this->_ci->KalenderModel->db->group_start();
+ $where_ids_chunks = array_chunk($kalender_ids,25);
+ foreach($where_ids_chunks as $where_ids)
+ {
+ $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids);
+ }
+ $this->_ci->KalenderModel->db->group_end();
+
$this->_ci->KalenderModel->db->where(
'other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)',
null, false
@@ -122,7 +145,13 @@ class LectureCollisionCheck implements ICollisionCheck
$this->_ci->KalenderModel->db->where('(z.vondatum + COALESCE(vonstunde_z.beginn, \'00:00\'))::timestamp < tbl_kalender.bis', null, false);
$this->_ci->KalenderModel->db->where('(z.bisdatum + COALESCE(bisstunde_z.ende, \'23:59\'))::timestamp > tbl_kalender.von', null, false);
$this->_ci->KalenderModel->db->where_not_in('current_lehreinheit_ma.mitarbeiter_uid', $kollisionsfreie_user);
- $this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids);
+ $this->_ci->KalenderModel->db->group_start();
+ $where_ids_chunks = array_chunk($kalender_ids,25);
+ foreach($where_ids_chunks as $where_ids)
+ {
+ $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids);
+ }
+ $this->_ci->KalenderModel->db->group_end();
$result = $this->_ci->KalenderModel->load();
@@ -167,6 +196,20 @@ class LectureCollisionCheck implements ICollisionCheck
return array_unique(array_merge($mitarbeiter_uids, $event_teilnehmer));
}
+ private function _getUidsFromLehreinheit($lehreinheit_id)
+ {
+ $kollisionsfreie_user = unserialize(KOLLISIONSFREIE_USER);
+
+ $result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
+
+ if (isError($result) || !hasData($result)) return [];
+
+ $uids = array_column(getData($result), 'mitarbeiter_uid');
+ $uids = array_diff(array_filter($uids), $kollisionsfreie_user);
+
+ return array_values(array_unique($uids));
+ }
+
private function _checkLehreinheit($uids, $data)
{
$kollisionsfreie_user = unserialize(KOLLISIONSFREIE_USER);
@@ -178,8 +221,9 @@ class LectureCollisionCheck implements ICollisionCheck
$this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter', 'lehreinheit_id', 'LEFT');
$this->_ci->KalenderModel->db->where_in('mitarbeiter_uid', $uids);
- $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id);
- $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete'));
+ if (!empty($data->kalender_id))
+ $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id);
+ $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview'));
$this->_ci->KalenderModel->db->where_not_in('mitarbeiter_uid', $kollisionsfreie_user);
$this->_ci->KalenderModel->db->where(
'tbl_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)',
@@ -215,8 +259,9 @@ class LectureCollisionCheck implements ICollisionCheck
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event_teilnehmer', 'tbl_kalender_event.kalender_id = tbl_kalender_event_teilnehmer.kalender_id', 'LEFT');
$this->_ci->KalenderModel->db->where_in('tbl_kalender_event_teilnehmer.uid', $uids);
- $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id);
- $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete'));
+ if (!empty($data->kalender_id))
+ $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id);
+ $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview'));
$this->_ci->KalenderModel->db->where_not_in('uid', $kollisionsfreie_user);
$this->_ci->KalenderModel->db->where(
'tbl_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)',
diff --git a/application/libraries/collision/checks/ResourcesCollisionCheck.php b/application/libraries/collision/checks/ResourcesCollisionCheck.php
index d05dcc3c0..3ce21219a 100644
--- a/application/libraries/collision/checks/ResourcesCollisionCheck.php
+++ b/application/libraries/collision/checks/ResourcesCollisionCheck.php
@@ -39,9 +39,10 @@ class ResourcesCollisionCheck implements ICollisionCheck
$this->_ci->KalenderModel->addJoin('lehre.tbl_betriebsmittel_kalender bk', 'bk.eindeutige_kalender_gruppen_id = tbl_kalender.eindeutige_kalender_gruppen_id');
$this->_ci->KalenderModel->addJoin('wawi.tbl_betriebsmittel bm', 'bm.betriebsmittel_id = bk.betriebsmittel_id');
- $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id);
+ if (!empty($data->kalender_id))
+ $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id);
$this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false);
- $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']);
+ $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview']);
$this->_ci->KalenderModel->db->where_in('bk.betriebsmittel_id', $data->betriebsmittel_ids);
@@ -74,8 +75,16 @@ class ResourcesCollisionCheck implements ICollisionCheck
$this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false);
$this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false);
$this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false);
- $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']);
- $this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids);
+ $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview']);
+
+ $this->_ci->KalenderModel->db->group_start();
+ $where_ids_chunks = array_chunk($kalender_ids,25);
+ foreach($where_ids_chunks as $where_ids)
+ {
+ $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids);
+ }
+ $this->_ci->KalenderModel->db->group_end();
+
$this->_ci->KalenderModel->db->where('other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false);
$result = $this->_ci->KalenderModel->load();
diff --git a/application/libraries/collision/checks/RoomCollisionCheck.php b/application/libraries/collision/checks/RoomCollisionCheck.php
index f16891107..428cd08a2 100644
--- a/application/libraries/collision/checks/RoomCollisionCheck.php
+++ b/application/libraries/collision/checks/RoomCollisionCheck.php
@@ -28,21 +28,22 @@ class RoomCollisionCheck implements ICollisionCheck
public function check($data)
{
- if (!isset($data->ort_kurzbz, $data->von, $data->bis, $data->kalender_id)) return [];
+ if (!isset($data->ort_kurzbz, $data->von, $data->bis) || isEmptyArray($data->ort_kurzbz)) return [];
if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return [];
$this->_ci->KalenderModel->addSelect('kalender_id, ort_kurzbz, von, bis');
$this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'kalender_id');
- $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id);
+ if (!empty($data->kalender_id))
+ $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id);
$this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false);
- $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']);
+ $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview'));
+ $this->_ci->KalenderModel->db->where_in('ort_kurzbz', $data->ort_kurzbz);
$result = $this->_ci->KalenderModel->loadWhere(array(
'von <' => $data->bis,
'bis >' => $data->von,
- 'ort_kurzbz' => $data->ort_kurzbz,
));
if (isError($result)) return [];
@@ -69,12 +70,21 @@ class RoomCollisionCheck implements ICollisionCheck
$this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false);
$this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false);
$this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false);
- $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']);
- $this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids);
+ $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview'));
+
+ $this->_ci->KalenderModel->db->group_start();
+ $where_ids_chunks = array_chunk($kalender_ids,25);
+ foreach($where_ids_chunks as $where_ids)
+ {
+ $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids);
+ }
+ $this->_ci->KalenderModel->db->group_end();
+
$this->_ci->KalenderModel->db->where('other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false);
$result = $this->_ci->KalenderModel->load();
+
if (isError($result) || !hasData($result)) return [];
$grouped = [];
diff --git a/application/libraries/collision/checks/StudentCollisionCheck.php b/application/libraries/collision/checks/StudentCollisionCheck.php
index 96a62b237..ac0264942 100644
--- a/application/libraries/collision/checks/StudentCollisionCheck.php
+++ b/application/libraries/collision/checks/StudentCollisionCheck.php
@@ -27,7 +27,8 @@ class StudentCollisionCheck implements ICollisionCheck
public function check($data)
{
- if (!isset($data->von, $data->bis, $data->kalender_id)) return [];
+ if (!isset($data->von, $data->bis)) return [];
+ if (!isset($data->kalender_id) && !isset($data->lehreinheit_id)) return [];
if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return [];
if ($this->_ci->variablelib->getVar('kollision_student') !== 'true') return [];
@@ -38,7 +39,9 @@ class StudentCollisionCheck implements ICollisionCheck
$dbModel = new DB_Model();
- $qry1 = "
+ if (isset($data->kalender_id))
+ {
+ $qry1 = "
SELECT DISTINCT tbl_benutzergruppe.uid
FROM lehre.tbl_kalender
JOIN lehre.tbl_kalender_lehreinheit USING(kalender_id)
@@ -68,13 +71,48 @@ class StudentCollisionCheck implements ICollisionCheck
AND (tbl_lehreinheitgruppe.gruppe = tbl_studentlehrverband.gruppe OR tbl_lehreinheitgruppe.gruppe IS NULL OR btrim(tbl_lehreinheitgruppe.gruppe::text) = '' OR tbl_studentlehrverband.gruppe IS NULL)
WHERE tbl_kalender.kalender_id = ?
AND tbl_studentlehrverband.student_uid NOT IN ($placeholders)
+ ";
- ";
+ $qry_1_param = $data->kalender_id;
+ }
+ else
+ {
+ $qry1 = "
+ SELECT DISTINCT tbl_benutzergruppe.uid
+ FROM lehre.tbl_lehreinheit
+ JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
+ JOIN public.tbl_gruppe
+ ON tbl_gruppe.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
+ AND tbl_gruppe.semester = tbl_lehreinheitgruppe.semester
+ AND tbl_gruppe.gruppe_kurzbz = tbl_lehreinheitgruppe.gruppe_kurzbz
+ JOIN public.tbl_benutzergruppe ON tbl_benutzergruppe.gruppe_kurzbz = tbl_gruppe.gruppe_kurzbz
+ AND tbl_benutzergruppe.studiensemester_kurzbz = tbl_lehreinheit.studiensemester_kurzbz
+
+ WHERE tbl_lehreinheit.lehreinheit_id = ?
+ AND tbl_benutzergruppe.uid NOT IN ($placeholders)
+
+ UNION ALL
+
+ SELECT DISTINCT tbl_studentlehrverband.student_uid AS uid
+ FROM lehre.tbl_lehreinheit
+ JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
+ JOIN public.tbl_studentlehrverband
+ ON tbl_studentlehrverband.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
+ AND tbl_studentlehrverband.semester = tbl_lehreinheitgruppe.semester
+ AND tbl_studentlehrverband.studiensemester_kurzbz = tbl_lehreinheit.studiensemester_kurzbz
+ AND (tbl_lehreinheitgruppe.verband = tbl_studentlehrverband.verband OR tbl_lehreinheitgruppe.verband IS NULL OR btrim(tbl_lehreinheitgruppe.verband::text) = '' OR tbl_studentlehrverband.verband IS NULL)
+ AND (tbl_lehreinheitgruppe.gruppe = tbl_studentlehrverband.gruppe OR tbl_lehreinheitgruppe.gruppe IS NULL OR btrim(tbl_lehreinheitgruppe.gruppe::text) = '' OR tbl_studentlehrverband.gruppe IS NULL)
+ WHERE tbl_lehreinheit.lehreinheit_id = ?
+ AND tbl_studentlehrverband.student_uid NOT IN ($placeholders)
+ ";
+
+ $qry_1_param = $data->lehreinheit_id;
+ }
$result1 = $dbModel->execReadOnlyQuery($qry1, array_merge(
- [$data->kalender_id],
+ [$qry_1_param],
$kollisionsfreie_user,
- [$data->kalender_id],
+ [$qry_1_param],
$kollisionsfreie_user
));
@@ -82,6 +120,9 @@ class StudentCollisionCheck implements ICollisionCheck
$curUids = array_flip(array_column(getData($result1), 'uid'));
+ $exclude_kalender = isset($data->kalender_id) ? "AND tbl_kalender.kalender_id != ?" : "";
+ $exclude_kalender_param = isset($data->kalender_id) ? [$data->kalender_id] : [];
+
$qry2 = "
SELECT DISTINCT tbl_kalender.kalender_id, tbl_kalender.von, tbl_kalender.bis, tbl_benutzergruppe.uid
FROM lehre.tbl_kalender
@@ -96,8 +137,8 @@ class StudentCollisionCheck implements ICollisionCheck
AND tbl_benutzergruppe.studiensemester_kurzbz = tbl_lehreinheit.studiensemester_kurzbz
WHERE tbl_kalender.von < ?
AND tbl_kalender.bis > ?
- AND tbl_kalender.kalender_id != ?
- AND tbl_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
+ $exclude_kalender
+ AND tbl_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')
AND tbl_benutzergruppe.uid NOT IN ($placeholders)
AND NOT EXISTS (
SELECT 1 FROM lehre.tbl_kalender vorgaenger
@@ -105,7 +146,7 @@ class StudentCollisionCheck implements ICollisionCheck
)
UNION ALL
-
+
SELECT DISTINCT tbl_kalender.kalender_id, tbl_kalender.von, tbl_kalender.bis, tbl_studentlehrverband.student_uid AS uid
FROM lehre.tbl_kalender
JOIN lehre.tbl_kalender_lehreinheit ON tbl_kalender_lehreinheit.kalender_id = tbl_kalender.kalender_id
@@ -119,8 +160,8 @@ class StudentCollisionCheck implements ICollisionCheck
AND (tbl_lehreinheitgruppe.gruppe = tbl_studentlehrverband.gruppe OR tbl_lehreinheitgruppe.gruppe IS NULL OR btrim(tbl_lehreinheitgruppe.gruppe::text) = '' OR tbl_studentlehrverband.gruppe IS NULL)
WHERE tbl_kalender.von < ?
AND tbl_kalender.bis > ?
- AND tbl_kalender.kalender_id != ?
- AND tbl_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
+ $exclude_kalender
+ AND tbl_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')
AND tbl_studentlehrverband.student_uid NOT IN ($placeholders)
AND NOT EXISTS (
SELECT 1 FROM lehre.tbl_kalender vorgaenger
@@ -129,10 +170,8 @@ class StudentCollisionCheck implements ICollisionCheck
";
$result2 = $dbModel->execReadOnlyQuery($qry2, array_merge(
- [$data->bis, $data->von, $data->kalender_id],
- $kollisionsfreie_user,
- [$data->bis, $data->von, $data->kalender_id],
- $kollisionsfreie_user
+ [$data->bis, $data->von], $exclude_kalender_param, $kollisionsfreie_user,
+ [$data->bis, $data->von], $exclude_kalender_param, $kollisionsfreie_user
));
if (isError($result2) || !hasData($result2)) return [];
@@ -183,7 +222,7 @@ class StudentCollisionCheck implements ICollisionCheck
ON other_kalender.kalender_id != current_kalender.kalender_id
AND other_kalender.von < current_kalender.bis
AND other_kalender.bis > current_kalender.von
- AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
+ AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')
AND NOT EXISTS (
SELECT 1 FROM lehre.tbl_kalender vorgaenger
WHERE vorgaenger.vorgaenger_kalender_id = other_kalender.kalender_id
@@ -221,7 +260,7 @@ class StudentCollisionCheck implements ICollisionCheck
ON other_kalender.kalender_id != current_kalender.kalender_id
AND other_kalender.von < current_kalender.bis
AND other_kalender.bis > current_kalender.von
- AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
+ AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')
AND NOT EXISTS (
SELECT 1 FROM lehre.tbl_kalender vorgaenger
WHERE vorgaenger.vorgaenger_kalender_id = other_kalender.kalender_id
diff --git a/application/libraries/collision/checks/VerbandCollisionCheck.php b/application/libraries/collision/checks/VerbandCollisionCheck.php
index 9284312b5..302eff370 100644
--- a/application/libraries/collision/checks/VerbandCollisionCheck.php
+++ b/application/libraries/collision/checks/VerbandCollisionCheck.php
@@ -29,18 +29,58 @@ class VerbandCollisionCheck implements ICollisionCheck
public function check($data)
{
- if (!isset($data->von, $data->bis, $data->kalender_id)) return [];
+ if (!isset($data->von, $data->bis)) return [];
+ if (!isset($data->kalender_id) && !isset($data->lehreinheit_id)) return [];
if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return [];
$kollision_student = $this->_ci->variablelib->getVar('kollision_student') === 'false';
$kollision_reservierung = $this->_ci->variablelib->getVar('ignore_reservierung') === 'false';
+ if (!isset($data->kalender_id)) $kollision_reservierung = false;
+
if (!$kollision_student && !$kollision_reservierung) return [];
$dbModel = new DB_Model();
$collisions = [];
+ $group_matching_qry = "
+ (
+ (
+ current_lehreinheitguppe.gruppe_kurzbz IS NULL
+ AND other_lehreinheitguppe.gruppe_kurzbz IS NULL
+ AND (
+ current_lehreinheitguppe.verband IS NULL
+ OR (
+ current_lehreinheitguppe.verband = other_lehreinheitguppe.verband
+ AND (current_lehreinheitguppe.gruppe IS NULL OR other_lehreinheitguppe.gruppe IS NULL OR current_lehreinheitguppe.gruppe = other_lehreinheitguppe.gruppe)
+ )
+ )
+ )
+ OR
+ (
+ current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
+ AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
+ AND current_gruppe.direktinskription IS NOT TRUE
+ AND other_gruppe.direktinskription IS NOT TRUE
+ )
+ OR
+ (
+ (
+ current_lehreinheitguppe.gruppe_kurzbz IS NULL
+ AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
+ AND other_gruppe.direktinskription IS NOT TRUE
+ )
+ OR
+ (
+ current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
+ AND other_lehreinheitguppe.gruppe_kurzbz IS NULL
+ AND current_gruppe.direktinskription IS NOT TRUE
+ )
+ )
+ )
+ ";
+
if ($kollision_student)
{
$union_event = "";
@@ -55,100 +95,111 @@ class VerbandCollisionCheck implements ICollisionCheck
";
}
- $sql_gruppen = "
- SELECT
- other_kalender.von,
- other_kalender.bis,
- COALESCE(
- other_lehreinheitguppe.gruppe_kurzbz,
- UPPER(stg.typ::text || stg.kurzbz::text) || '-' || other_lehreinheitguppe.semester ||
- COALESCE(other_lehreinheitguppe.verband::text, '') ||
- COALESCE(other_lehreinheitguppe.gruppe::text, '')
- ) AS gruppenname
- FROM lehre.tbl_kalender current_kalender
+ $other_lehreinheitgruppe_subquery = "
+ SELECT tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester, tbl_lehreinheitgruppe.verband, tbl_lehreinheitgruppe.gruppe,
+ tbl_lehreinheitgruppe.gruppe_kurzbz, tbl_kalender_lehreinheit.kalender_id
+ FROM lehre.tbl_kalender_lehreinheit
+ JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id
+ JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
+ ". $union_event ."
+ ";
- JOIN (
- SELECT tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester, tbl_lehreinheitgruppe.verband, tbl_lehreinheitgruppe.gruppe,
- tbl_lehreinheitgruppe.gruppe_kurzbz, tbl_kalender_lehreinheit.kalender_id
- FROM lehre.tbl_kalender_lehreinheit
- JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id
- JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
- ". $union_event ."
- ) current_lehreinheitguppe ON current_lehreinheitguppe.kalender_id = current_kalender.kalender_id
-
- LEFT JOIN public.tbl_gruppe current_gruppe
- ON current_gruppe.gruppe_kurzbz = current_lehreinheitguppe.gruppe_kurzbz
-
- JOIN lehre.tbl_kalender other_kalender
- ON other_kalender.kalender_id != current_kalender.kalender_id
- AND other_kalender.von < ?
- AND other_kalender.bis > ?
-
- JOIN (
- SELECT tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester, tbl_lehreinheitgruppe.verband, tbl_lehreinheitgruppe.gruppe,
- tbl_lehreinheitgruppe.gruppe_kurzbz, tbl_kalender_lehreinheit.kalender_id
- FROM lehre.tbl_kalender_lehreinheit
- JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id
- JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id
- ". $union_event ."
- ) other_lehreinheitguppe ON other_lehreinheitguppe.kalender_id = other_kalender.kalender_id
-
- LEFT JOIN public.tbl_gruppe other_gruppe
- ON other_gruppe.gruppe_kurzbz = other_lehreinheitguppe.gruppe_kurzbz
-
- LEFT JOIN public.tbl_studiengang stg
- ON stg.studiengang_kz = other_lehreinheitguppe.studiengang_kz
-
- WHERE current_kalender.kalender_id = ?
- AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
- AND current_lehreinheitguppe.studiengang_kz = other_lehreinheitguppe.studiengang_kz
- AND current_lehreinheitguppe.semester = other_lehreinheitguppe.semester
- AND (
- (
- current_lehreinheitguppe.gruppe_kurzbz IS NULL
- AND other_lehreinheitguppe.gruppe_kurzbz IS NULL
- AND (
- current_lehreinheitguppe.verband IS NULL
- OR (
- current_lehreinheitguppe.verband = other_lehreinheitguppe.verband
- AND (current_lehreinheitguppe.gruppe IS NULL OR other_lehreinheitguppe.gruppe IS NULL OR current_lehreinheitguppe.gruppe = other_lehreinheitguppe.gruppe)
- )
- )
+ if (isset($data->kalender_id))
+ {
+ $sql_gruppen = "
+ SELECT
+ other_kalender.von,
+ other_kalender.bis,
+ COALESCE(
+ other_lehreinheitguppe.gruppe_kurzbz,
+ UPPER(stg.typ::text || stg.kurzbz::text) || '-' || other_lehreinheitguppe.semester ||
+ COALESCE(other_lehreinheitguppe.verband::text, '') ||
+ COALESCE(other_lehreinheitguppe.gruppe::text, '')
+ ) AS gruppenname
+ FROM lehre.tbl_kalender current_kalender
+
+ JOIN (
+ ". $other_lehreinheitgruppe_subquery ."
+ ) current_lehreinheitguppe ON current_lehreinheitguppe.kalender_id = current_kalender.kalender_id
+
+ LEFT JOIN public.tbl_gruppe current_gruppe
+ ON current_gruppe.gruppe_kurzbz = current_lehreinheitguppe.gruppe_kurzbz
+
+ JOIN lehre.tbl_kalender other_kalender
+ ON other_kalender.kalender_id != current_kalender.kalender_id
+ AND other_kalender.von < ?
+ AND other_kalender.bis > ?
+
+ JOIN (
+ ". $other_lehreinheitgruppe_subquery ."
+ ) other_lehreinheitguppe ON other_lehreinheitguppe.kalender_id = other_kalender.kalender_id
+
+ LEFT JOIN public.tbl_gruppe other_gruppe
+ ON other_gruppe.gruppe_kurzbz = other_lehreinheitguppe.gruppe_kurzbz
+
+ LEFT JOIN public.tbl_studiengang stg
+ ON stg.studiengang_kz = other_lehreinheitguppe.studiengang_kz
+
+ WHERE current_kalender.kalender_id = ?
+ AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')
+ AND current_lehreinheitguppe.studiengang_kz = other_lehreinheitguppe.studiengang_kz
+ AND current_lehreinheitguppe.semester = other_lehreinheitguppe.semester
+ AND ". $group_matching_qry ."
+ AND other_kalender.kalender_id NOT IN (
+ SELECT vorgaenger_kalender_id
+ FROM lehre.tbl_kalender
+ WHERE vorgaenger_kalender_id IS NOT NULL
)
- OR
- (
- current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
- AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
- AND current_gruppe.direktinskription IS NOT TRUE
- AND other_gruppe.direktinskription IS NOT TRUE
- )
- OR
- (
- (
- current_lehreinheitguppe.gruppe_kurzbz IS NULL
- AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
- AND other_gruppe.direktinskription IS NOT TRUE
- )
- OR
- (
- current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL
- AND other_lehreinheitguppe.gruppe_kurzbz IS NULL
- AND current_gruppe.direktinskription IS NOT TRUE
- )
- )
- )
- AND other_kalender.kalender_id NOT IN (
- SELECT vorgaenger_kalender_id
- FROM lehre.tbl_kalender
- WHERE vorgaenger_kalender_id IS NOT NULL
- )
- ";
+ ";
- $result = $dbModel->execReadOnlyQuery($sql_gruppen, [
- $data->bis,
- $data->von,
- $data->kalender_id,
- ]);
+ $params = [$data->bis, $data->von, $data->kalender_id];
+ }
+ else
+ {
+ $sql_gruppen = "
+ SELECT
+ other_kalender.von,
+ other_kalender.bis,
+ COALESCE(
+ other_lehreinheitguppe.gruppe_kurzbz,
+ UPPER(stg.typ::text || stg.kurzbz::text) || '-' || other_lehreinheitguppe.semester ||
+ COALESCE(other_lehreinheitguppe.verband::text, '') ||
+ COALESCE(other_lehreinheitguppe.gruppe::text, '')
+ ) AS gruppenname
+ FROM lehre.tbl_lehreinheitgruppe current_lehreinheitguppe
+ LEFT JOIN public.tbl_gruppe current_gruppe
+ ON current_gruppe.gruppe_kurzbz = current_lehreinheitguppe.gruppe_kurzbz
+
+ JOIN lehre.tbl_kalender other_kalender
+ ON other_kalender.von < ?
+ AND other_kalender.bis > ?
+
+ JOIN (
+ ". $other_lehreinheitgruppe_subquery ."
+ ) other_lehreinheitguppe ON other_lehreinheitguppe.kalender_id = other_kalender.kalender_id
+
+ LEFT JOIN public.tbl_gruppe other_gruppe
+ ON other_gruppe.gruppe_kurzbz = other_lehreinheitguppe.gruppe_kurzbz
+
+ LEFT JOIN public.tbl_studiengang stg
+ ON stg.studiengang_kz = other_lehreinheitguppe.studiengang_kz
+
+ WHERE current_lehreinheitguppe.lehreinheit_id = ?
+ AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')
+ AND current_lehreinheitguppe.studiengang_kz = other_lehreinheitguppe.studiengang_kz
+ AND current_lehreinheitguppe.semester = other_lehreinheitguppe.semester
+ AND ". $group_matching_qry ."
+ AND other_kalender.kalender_id NOT IN (
+ SELECT vorgaenger_kalender_id
+ FROM lehre.tbl_kalender
+ WHERE vorgaenger_kalender_id IS NOT NULL
+ )
+ ";
+
+ $params = [$data->bis, $data->von, $data->lehreinheit_id];
+ }
+
+ $result = $dbModel->execReadOnlyQuery($sql_gruppen, $params);
if (!isError($result) && hasData($result))
{
@@ -195,7 +246,7 @@ class VerbandCollisionCheck implements ICollisionCheck
WHERE current_event_teilnehmer.kalender_id = ?
AND current_event_teilnehmer.rolle_kurzbz = 'teilnehmer'
- AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
+ AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')
AND current_event_teilnehmer.studiengang_kz = other_event_teilnehmer.studiengang_kz
AND current_event_teilnehmer.semester = other_event_teilnehmer.semester
AND (
@@ -309,7 +360,7 @@ class VerbandCollisionCheck implements ICollisionCheck
ON other_gruppe.gruppe_kurzbz = other_lehreinheitguppe.gruppe_kurzbz
WHERE current_kalender.kalender_id IN ({$placeholders})
- AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete')
+ AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')
AND current_lehreinheitguppe.studiengang_kz = other_lehreinheitguppe.studiengang_kz
AND current_lehreinheitguppe.semester = other_lehreinheitguppe.semester
AND (
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/TempusLib.php b/application/libraries/treemenu/TempusLib.php
new file mode 100644
index 000000000..75a8b2b1b
--- /dev/null
+++ b/application/libraries/treemenu/TempusLib.php
@@ -0,0 +1,148 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * Tempus Menu library
+ */
+class TempusLib
+{
+ 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/tempus');
+ $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 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);
+
+ 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->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->load->model('organisation/Gruppe_model', 'GruppeModel');
+ $this->_ci->GruppeModel->addSelect('semester');
+
+ return $this->_ci->stglib->group($path_template, $stg->studiengang_kz, $semester);
+ }
+
+
+ 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);
+
+ $this->_ci->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
+ $this->_ci->StudienordnungModel->addSelect("p.orgform_kurzbz");
+
+ 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') ?: []);
+ $permittedStgs = array_merge($permittedStgs, $this->_ci->permissionlib->getSTG_isEntitledFor('lehre/lvplan') ?: []);
+ 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/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/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..bbca9836b 100644
--- a/application/models/education/Lehreinheit_model.php
+++ b/application/models/education/Lehreinheit_model.php
@@ -395,6 +395,80 @@ EOSQL;
return $this->execReadOnlyQuery($qry, $params);
}
+ public function getOffeneStunden($lehreinheit_ids)
+ {
+ if (!is_array($lehreinheit_ids))
+ $lehreinheit_ids = [$lehreinheit_ids];
+
+ if (empty($lehreinheit_ids))
+ return success([]);
+
+ $db = new DB_Model();
+ $placeholders = implode(',', array_fill(0, count($lehreinheit_ids), '?'));
+
+ $qry = "WITH eventdauer AS (
+ SELECT
+ tbl_kalender_lehreinheit.lehreinheit_id,
+ tbl_kalender.von,
+ tbl_kalender.bis,
+ tbl_kalender.kalender_id
+ FROM lehre.tbl_lehreinheit
+ JOIN lehre.tbl_kalender_lehreinheit USING(lehreinheit_id)
+ JOIN lehre.tbl_kalender USING(kalender_id)
+ WHERE tbl_lehreinheit.lehreinheit_id IN ($placeholders)
+ AND NOT EXISTS (SELECT 1 FROM lehre.tbl_kalender nachfolger
+ WHERE nachfolger.vorgaenger_kalender_id = tbl_kalender.kalender_id)
+ AND tbl_kalender.status_kurzbz NOT IN ('deleted', 'todelete', 'archived')
+ GROUP BY tbl_kalender_lehreinheit.lehreinheit_id, tbl_kalender.von, tbl_kalender.bis, tbl_kalender.kalender_id
+ ),
+ raster AS (
+ SELECT
+ eventdauer.lehreinheit_id,
+ eventdauer.kalender_id,
+ eventdauer.von,
+ eventdauer.bis,
+ vonstunde.stunde AS vonstunde_nr,
+ bisstunde.stunde AS bisstunde_nr
+ FROM eventdauer
+ LEFT JOIN lehre.tbl_stunde vonstunde ON eventdauer.von::time = vonstunde.beginn
+ LEFT JOIN lehre.tbl_stunde bisstunde ON eventdauer.bis::time = bisstunde.ende
+ ),
+ unterrichtsdauer AS (
+ SELECT
+ raster.lehreinheit_id,
+ raster.kalender_id,
+ sum(EXTRACT(EPOCH FROM (LEAST(stunde.ende, raster.bis::time) - GREATEST(stunde.beginn, raster.von::time))) / 60) AS minuten
+ FROM raster JOIN lehre.tbl_stunde stunde ON stunde.beginn < raster.bis::time AND stunde.ende > raster.von::time
+ WHERE raster.vonstunde_nr IS NULL OR raster.bisstunde_nr IS NULL
+ GROUP BY raster.lehreinheit_id, raster.kalender_id
+ ),
+ verplantestunden AS (
+ SELECT raster.lehreinheit_id, raster.kalender_id,
+ CASE
+ WHEN raster.vonstunde_nr IS NOT NULL AND raster.bisstunde_nr IS NOT NULL
+ THEN (raster.bisstunde_nr - raster.vonstunde_nr + 1)
+ ELSE coalesce(unterrichtsdauer.minuten, 0) / 45
+ END AS verplantestunde
+ FROM raster LEFT JOIN unterrichtsdauer ON unterrichtsdauer.lehreinheit_id = raster.lehreinheit_id AND unterrichtsdauer.kalender_id = raster.kalender_id
+ ),
+ verplant_gesamt AS (
+ SELECT lehreinheit_id, SUM(verplantestunde) AS verplant
+ FROM verplantestunden
+ GROUP BY lehreinheit_id
+ )
+ SELECT
+ lema.lehreinheit_id,
+ lema.mitarbeiter_uid,
+ lema.planstunden,
+ ROUND(coalesce(verplant_gesamt.verplant, 0), 2) AS verplant,
+ ROUND((lema.planstunden - coalesce(verplant_gesamt.verplant, 0)), 2) AS offenestunden
+ FROM lehre.tbl_lehreinheitmitarbeiter lema
+ LEFT JOIN verplant_gesamt ON verplant_gesamt.lehreinheit_id = lema.lehreinheit_id
+ WHERE lema.lehreinheit_id IN ($placeholders)";
+
+ return $db->execReadOnlyQuery($qry, array_merge($lehreinheit_ids, $lehreinheit_ids));
+ }
+
private function getLVTmp($stg_kz = null)
{
$qry = "SELECT DISTINCT ON(lehrveranstaltung_id) *,
@@ -719,7 +793,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 +802,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/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 64fce8944..1dc09caaf 100644
--- a/application/models/person/Notiz_model.php
+++ b/application/models/person/Notiz_model.php
@@ -296,4 +296,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/Betriebsmittel_model.php b/application/models/ressource/Betriebsmittel_model.php
index 23468b9f8..2d41754a7 100644
--- a/application/models/ressource/Betriebsmittel_model.php
+++ b/application/models/ressource/Betriebsmittel_model.php
@@ -46,11 +46,11 @@ class Betriebsmittel_model extends DB_Model
JOIN lehre.tbl_kalender ON tbl_kalender.eindeutige_kalender_gruppen_id = tbl_betriebsmittel_kalender.eindeutige_kalender_gruppen_id
WHERE
betriebsmittel_id=tbl_betriebsmittel.betriebsmittel_id
- AND tbl_kalender.von <= ?
- AND tbl_kalender.bis >= ?
+ AND tbl_kalender.von < ?
+ AND tbl_kalender.bis > ?
)";
- return $this->execQuery($qry, array($from, $to));
+ return $this->execQuery($qry, array($to, $from));
}
}
diff --git a/application/models/ressource/KalenderNotiz_model.php b/application/models/ressource/KalenderNotiz_model.php
new file mode 100644
index 000000000..63cb5b100
--- /dev/null
+++ b/application/models/ressource/KalenderNotiz_model.php
@@ -0,0 +1,14 @@
+dbTable = 'lehre.tbl_kalender_notiz';
+ $this->pk = array('eindeutige_kalender_gruppen_id', 'notiz_id');
+ }
+}
diff --git a/application/models/ressource/Kalendersyncstatus_model.php b/application/models/ressource/Kalendersyncstatus_model.php
new file mode 100644
index 000000000..f1cd8aedf
--- /dev/null
+++ b/application/models/ressource/Kalendersyncstatus_model.php
@@ -0,0 +1,14 @@
+dbTable = 'lehre.tbl_kalender_syncstatus';
+ $this->pk = 'kalender_syncstatus_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/Tempus.php b/application/views/Tempus.php
index f390cdb86..31abd2d7c 100644
--- a/application/views/Tempus.php
+++ b/application/views/Tempus.php
@@ -7,12 +7,15 @@
'vue3' => true,
'primevue3' => true,
'tabulator5' => true,
+ 'filtercomponent' => true,
+ 'navigationcomponent' => true,
'vuedatepicker11' => true,
'momentjs2' => true,
+ 'tags' => true,
'phrases' => array(
'global',
'ui',
- 'notiz',
+ 'lehre'
),
'customCSSs' => [
'public/css/components/vue-datepicker.css',
@@ -23,9 +26,8 @@
'public/css/components/function.css'
],
'customJSs' => [
- #'vendor/npm-asset/primevue/tree/tree.min.js',
- #'vendor/npm-asset/primevue/toast/toast.min.js'
- 'vendor/moment/luxonjs/luxon.min.js'
+ 'vendor/moment/luxonjs/luxon.min.js',
+ 'vendor/npm-asset/primevue/listbox/listbox.min.js'
],
'customJSModules' => [
'public/js/apps/Tempus.js'
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');
+?>
+
`,
}
\ No newline at end of file
diff --git a/public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js b/public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js
index 2447c4f61..181ef29bd 100644
--- a/public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js
+++ b/public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js
@@ -3,6 +3,11 @@ export default {
event: {
type: Object,
required: true
+ },
+ timeSlotDisplayBehavior: {
+ type: String,
+ default: "default",
+ // options: default, always, never
}
},
computed: {
@@ -50,21 +55,33 @@ export default {
return luxon.Duration
.fromISOTime(this.event.ende)
.toISOTime({ suppressSeconds: true });
- }
+ },
+ timeSlotDisplayClasses() {
+ switch (this.$props.timeSlotDisplayBehavior) {
+ case "always":
+ return "d-grid";
+ case "never":
+ return "d-none";
+ default:
+ return "d-none d-xl-grid";
+ }
+ },
},
template: /* html */`
{{ start }}
{{ end }}
{{ event.topic }}
+ {{ event.ort_kurzbz }}
... +{{ event.lektor.length - 3 }}
- {{ event.ort_kurzbz }}
`,
diff --git a/public/js/components/Cis/Studium/Studium.js b/public/js/components/Cis/Studium/Studium.js
index 1b7aff81b..721fec8ad 100644
--- a/public/js/components/Cis/Studium/Studium.js
+++ b/public/js/components/Cis/Studium/Studium.js
@@ -1,5 +1,6 @@
import LvUebersicht from "../Mylv/LvUebersicht.js";
+import ApiCisStudium from '../../../api/factory/cis/studium.js';
export default {
data(){
@@ -26,6 +27,7 @@ export default {
}
},
+ name: "OverviewStudiengaenge",
components: {
LvUebersicht,
},
@@ -88,6 +90,27 @@ export default {
studienordnung.selectedIndex = newSelectIndex;
this.changeSelectedStudienPlan(studienordnung.value);
},
+ onStudiensemesterChange(event) {
+ const value = event.target.value;
+ this.setHash(value);
+ this.changeSelectedStudienSemester(value);
+
+ },
+ onStudiengangChange(event) {
+ const value = event.target.value;
+ this.setHash(value);
+ this.changeSelectedStudienGang(value);
+ },
+ onSemesterChange(event) {
+ const value = event.target.value;
+ this.setHash(value);
+ this.changeSelectedSemester(value);
+ },
+ onStudienordnungChange(event) {
+ const value = event.target.value;
+ this.setHash(value);
+ this.changeSelectedStudienPlan(value);
+ },
storeDataToLocalStorage(key,value){
localStorage.setItem(key, value);
@@ -97,28 +120,32 @@ export default {
return value;
},
changeSelectedStudienSemester(studiensemester_kurzbz) {
- this.$fhcApi.factory.studium.getAllStudienSemester(studiensemester_kurzbz, this.selectedStudiengang, this.selectedSemester, this.selectedStudienordnung)
+ return this.$api
+ .call(ApiCisStudium.getAllStudienSemester(studiensemester_kurzbz, this.selectedStudiengang, this.selectedSemester, this.selectedStudienordnung))
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
},
changeSelectedStudienGang(studiengang_kz) {
- this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, studiengang_kz, this.selectedSemester, this.selectedStudienordnung)
+ return this.$api
+ .call(ApiCisStudium.getAllStudienSemester(this.selectedStudiensemester, studiengang_kz, this.selectedSemester, this.selectedStudienordnung))
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
},
changeSelectedSemester(semester) {
- this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, semester, this.selectedStudienordnung)
+ return this.$api
+ .call(ApiCisStudium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, semester, this.selectedStudienordnung))
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
},
changeSelectedStudienPlan(studienplan_id) {
- this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, this.selectedSemester, studienplan_id)
+ return this.$api
+ .call(ApiCisStudium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, this.selectedSemester, studienplan_id))
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
@@ -160,6 +187,7 @@ export default {
this.studiengaenge = studiengang.all;
this.selectedStudiengang = studiengang.preselected?.studiengang_kz;
+
this.semester = semester.all;
this.selectedSemester = semester?.preselected;
@@ -195,7 +223,11 @@ export default {
},
studiengangTitel(studiengang) {
if (!studiengang) return "";
- return `${studiengang?.kurzbzlang} (${studiengang?.bezeichnung})`;
+ if(this.isGermanLanguage){
+ return `${studiengang?.kurzbzlang} (${studiengang?.bezeichnung})`;
+ }else{
+ return `${studiengang?.kurzbzlang} (${studiengang?.english})`;
+ }
},
studiensemesterTitel(studiensemester){
if (!studiensemester) return "";
@@ -213,9 +245,12 @@ export default {
},
computed:{
+ isGermanLanguage(){
+ return this.$p.user_language.value == "German"
+ },
selectedLehrveranstaltungTitel(){
const studiengang = this.studiengaenge.find((studiengang) => studiengang.studiengang_kz == this.selectedStudiengang);
- return `${this.selectedLehrveranstaltung?.bezeichnung} ${this.selectedLehrveranstaltung?.lehrform_kurzbz} / ${studiengang.kurzbzlang}-${this.selectedSemester} ${this.selectedLehrveranstaltung?.orgform_kurzbz} (${this.selectedStudiensemester})`;
+ return `${this.isGermanLanguage ? this.selectedLehrveranstaltung?.bezeichnung : this.selectedLehrveranstaltung?.bezeichnung_english} ${this.selectedLehrveranstaltung?.lehrform_kurzbz} / ${studiengang.kurzbzlang}-${this.selectedSemester} ${this.selectedLehrveranstaltung?.orgform_kurzbz} (${this.selectedStudiensemester})`;
},
computedStudienOrdnung(){
if(!this.studienOrdnung) return null;
@@ -232,14 +267,14 @@ export default {
let result = [];
Object.entries(this.computedStudienOrdnung).forEach(([key,value])=>{
result.push({
- bezeichnung: `Studienordnung: ${key}`,
+ bezeichnung: `${this.$p.t('studium', 'studienordnung') }: ${key}`,
disabled: true,
});
value.forEach((studienplan)=>{
result.push({
studienplan:studienplan,
diabled: false,
- bezeichnung: `${studienplan?.bezeichnung}-${studienplan?.orgform_kurzbz} ( ${studienplan?.orgform_bezeichnung}, ${studienplan?.sprache} )`
+ bezeichnung: `${studienplan?.bezeichnung}-${studienplan?.orgform_kurzbz} ( ${this.isGermanLanguage ? studienplan?.orgform_bezeichnung : studienplan?.orgform_bezeichnung_english}, ${studienplan?.sprache} )`
});
})
@@ -256,22 +291,23 @@ export default {
const studienordnung = JSON.parse(this.getDataFromLocalStorage("studienordnung")) ?? undefined;
// only fetch default data if no data is stored in the local storage
-
- this.$fhcApi.factory.studium.getAllStudienSemester(studiensemester, studiengang, semester, studienordnung)
- .then(data => data.data)
- .then(res => {
- this.extractPropertyValues(res);
- })
+
+ this.$api
+ .call(ApiCisStudium.getAllStudienSemester(studiensemester, studiengang, semester, studienordnung))
+ .then(data => data.data)
+ .then(res => {
+ this.extractPropertyValues(res);
+ })
},
- template: `
+ template: /*html*/`
-
Studium
+
{{$p.t('studium','studium')}}
Menu:
@@ -279,13 +315,13 @@ export default {
-
Studiensemester:
+
{{$p.t('studium','studiensemester')}}:
-
-
Studiengang:
+
{{$p.t('lehre','studiengang')}}:
-
-
+
+
-
Semester:
+
{{$p.t('lehre','semester')}}:
-
-
+
+
-
Studienordnung:
+
{{$p.t('studium','studienordnung')}}: