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/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 0eb2839cd..975537dc4 100644
--- a/application/config/routes.php
+++ b/application/config/routes.php
@@ -76,52 +76,67 @@ $route['Abgabetool/Student'] = 'Cis/Abgabetool/Student';
$route['Abgabetool/Student/(:any)'] = 'Cis/Abgabetool/Student/$1';
$route['Abgabetool/Deadlines'] = 'Cis/Abgabetool/Deadlines';
+// Studierendenverwaltung App Routes
+$route['studvw'] = 'studentenverwaltung/index';
+$route['studvw/.*'] = 'studentenverwaltung/index';
+// Old routes
+$route['studentenverwaltung'] = 'redirect/301/studvw';
+$route['studentenverwaltung/(:any)'] = 'redirect/301/studvw/stdsem/$1';
+$route['studentenverwaltung/(:any)/(prestudent|student|person|search)/(:any)'] = 'redirect/301/studvw/stdsem/$1/$2/$3';
+$route['studentenverwaltung/(:any)/prestudent/(:any)/tab/:any'] = 'redirect/301/studvw/stdsem/$1/prestudent/$2';
+$route['studentenverwaltung/(:any)/search/(:any)/(:any)'] = 'redirect/301/studvw/stdsem/$1/search/$2/$3';
+$route['studentenverwaltung/(:any)/(:any)'] = 'redirect/301/studvw/stdsem/$1/stg/$2';
+
// Studierendenverwaltung List Routes
-$route['api/frontend/v1/stv/[sS]tudents/inout'] = 'api/frontend/v1/stv/Students/index';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/index';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/incoming/1'] = 'api/frontend/v1/stv/students/getIncoming/$1';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/outgoing/1'] = 'api/frontend/v1/stv/students/getOutgoing/$1';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/shared_studies/1'] = 'api/frontend/v1/stv/students/getGemeinsamestudien/$1';
-// (studiensemester_kurzbz)/inout[/(incoming|outgoing|gemeinsamestudien)]
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout'] = 'api/frontend/v1/stv/Students/index';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/incoming'] = 'api/frontend/v1/stv/Students/getIncoming/$1';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/outgoing'] = 'api/frontend/v1/stv/Students/getOutgoing/$1';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/gemeinsamestudien'] = 'api/frontend/v1/stv/Students/getGemeinsamestudien/$1';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/:any/1/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1';
-// (studiengang_kz)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]]
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudents/$1';
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2';
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2/$3';
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/:any/1/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2';
-// (studiengang_kz)/(orgform)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]]
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2';
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3';
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3/$4';
-$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3/$5';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/verband/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3/$4/$5';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/verband/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2';
-// (studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe)
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/grp/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsSpezialgruppe/$1/$2/$3/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/verband/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4/$5/$6';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/verband/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4/$5';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3';
-// (studiensemester_kurzbz)/(studiengang_kz)[/(semester)[/(verband)[/(gruppe)]]]
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/(:any)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3/$4';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3/$4/$5';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsSpezialgruppe/$1/$2/$3/$4';
-// (studiensemester_kurzbz)/(studiengang_kz)/(orgform)/(semester)/grp/(gruppe)
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/grp/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgformSpezialgruppe/$1/$2/$3/$4/$5';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgformSpezialgruppe/$1/$3/$2/$4/$5';
-// (studiensemester_kurzbz)/(studiengang_kz)/(orgform)[/(semester)[/(verband)[/(gruppe)]]]
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4/$5';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4/$5/$6';
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/prestudent/(:any)'] = 'api/frontend/v1/stv/students/getPrestudent/$1/$2';
+
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/student/(:any)'] = 'api/frontend/v1/stv/students/getStudent/$1/$2';
+
+$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/person/(:any)'] = 'api/frontend/v1/stv/students/getPerson/$1/$2';
+
+$route['api/frontend/v1/treemenudata/stv/.*'] = 'api/frontend/v1/stv/students/index';
+
+// Lvverwaltung List Routes
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2';
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
+
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2';
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
+$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
-// // (studiensemester_kurzbz)/uid/(uid)
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/uid/(:any)'] = 'api/frontend/v1/stv/Students/getStudent/$1/$2';
-// // (studiensemester_kurzbz)/prestudent/(prestudent_id)
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/prestudent/(:num)'] = 'api/frontend/v1/stv/Students/getPrestudent/$1/$2';
-// // (studiensemester_kurzbz)/person/(person_id)
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/person/(:num)'] = 'api/frontend/v1/stv/Students/getPerson/$1/$2';
// load routes from extensions, also look for environment-specific configs
$subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT . '/extensions'];
diff --git a/application/config/studierendenantrag.php b/application/config/studierendenantrag.php
index ef2098aca..9d1e7a1c8 100644
--- a/application/config/studierendenantrag.php
+++ b/application/config/studierendenantrag.php
@@ -197,3 +197,11 @@ $config['unterbrechung_enabled'] = true;
*/
$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/public/js/api/factory/stv/verband.js b/application/config/treemenu.php
similarity index 60%
rename from public/js/api/factory/stv/verband.js
rename to application/config/treemenu.php
index 114931e4c..72a02947b 100644
--- a/public/js/api/factory/stv/verband.js
+++ b/application/config/treemenu.php
@@ -1,5 +1,7 @@
+.
*/
-export default {
- get(path) {
- let url = 'api/frontend/v1/stv/verband';
- if (path)
- url += '/' + path;
- return {
- method: 'get',
- url
- };
- },
- favorites: {
- get() {
- return {
- method: 'get',
- url: 'api/frontend/v1/stv/favorites'
- };
- },
- set(favorites) {
- return {
- method: 'post',
- url: 'api/frontend/v1/stv/favorites/set',
- params: { favorites }
- };
- }
- }
-};
\ No newline at end of file
+if (!defined('BASEPATH')) exit('No direct script access allowed');
+
+$config['stv'] = [
+ "library" => "treemenu/StudVwLib",
+ "permissions" => ["admin:r", "assistenz:r"]
+];
+$config['lvv'] = [
+ "library" => "treemenu/LvVwLib",
+ "permissions" => ["admin:r", "assistenz:r"]
+];
diff --git a/application/config/treemenu/custom/lvvw.php b/application/config/treemenu/custom/lvvw.php
new file mode 100644
index 000000000..977c0459e
--- /dev/null
+++ b/application/config/treemenu/custom/lvvw.php
@@ -0,0 +1,32 @@
+.
+ */
+
+if (!defined('BASEPATH')) exit('No direct script access allowed');
+
+$config['root'] = [
+ 'stg' => [
+ 'semester' => [
+ 'group',
+ 'verband' => [
+ 'group'
+ ]
+ ],
+ 'orgform'
+ ]
+];
diff --git a/application/config/treemenu/stg_base.php b/application/config/treemenu/stg_base.php
new file mode 100644
index 000000000..fcb9748b7
--- /dev/null
+++ b/application/config/treemenu/stg_base.php
@@ -0,0 +1,65 @@
+.
+ */
+
+if (!defined('BASEPATH')) exit('No direct script access allowed');
+
+$config['root'] = [
+ 'stg' => [
+ 'prestudent' => [
+ 'stdsem' => [
+ 'interessenten' => [
+ 'bewerbungnichtabgeschickt',
+ 'bewerbungabgeschickt',
+ 'zgv',
+ 'statusbestaetigt' => [
+ 'statusbestaetigtrtnichtangemeldet',
+ 'statusbestaetigtrtangemeldet'
+ ],
+ 'reihungstestnichtangemeldet',
+ 'reihungstestangemeldet'
+ ],
+ 'bewerber' => [
+ 'bewerberrtnichtangemeldet',
+ 'bewerberrtangemeldet' => [
+ 'bewerberrtangemeldetteilgenommen',
+ 'bewerberrtangemeldetnichtteilgenommen'
+ ]
+ ],
+ 'aufgenommen',
+ 'warteliste',
+ 'absage',
+ 'incoming'
+ ]
+ ],
+ 'semester' => [
+ 'group',
+ 'verband' => [
+ 'group'
+ ]
+ ]
+ ],
+ 'inout' => [
+ 'incoming',
+ 'outgoing',
+ 'shared_studies'
+ ]
+];
+
+// copy stg tree into stg/orgforms
+$config['root']['stg']['orgform'] = $config['root']['stg'];
diff --git a/application/controllers/Redirect.php b/application/controllers/Redirect.php
new file mode 100644
index 000000000..f4a9f4cd7
--- /dev/null
+++ b/application/controllers/Redirect.php
@@ -0,0 +1,44 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * This controller redirects urls to another location. This is mainly used
+ * with the $routes config
+ */
+class Redirect extends CI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct();
+ }
+
+ /**
+ * Main function to handle all redirects.
+ *
+ * @param string $method - the redirect code (30x)
+ * @param array $params - the url to redirect to
+ *
+ * @return void
+ */
+ public function _remap($method, $params)
+ {
+ redirect($params, 'location', $method);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/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/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 2a900e92d..36054003c 100644
--- a/application/controllers/api/frontend/v1/LvPlan.php
+++ b/application/controllers/api/frontend/v1/LvPlan.php
@@ -49,6 +49,8 @@ class LvPlan extends FHCAPI_Controller
'getLehrverband' => self::PERM_LOGGED,
'permissionOtherLvPlan' => self::PERM_LOGGED,
'compactibleEventTypes' => self::PERM_LOGGED,
+ 'getLeEvents' => self::PERM_LOGGED,
+ 'getLvEvents' => self::PERM_LOGGED,
]);
$this->load->library('LogLib');
@@ -60,7 +62,13 @@ class LvPlan extends FHCAPI_Controller
'dbExecuteUser' => 'RESTful API'
));
- $this->load->library('form_validation');
+ $this->load->library('form_validation');
+ $this->load->library('PhrasesLib');
+ $this->loadPhrases(
+ array(
+ 'ui'
+ )
+ );
}
//------------------------------------------------------------------------------------------------------------------
@@ -196,6 +204,38 @@ 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)
{
diff --git a/application/controllers/api/frontend/v1/OtherLvPlan.php b/application/controllers/api/frontend/v1/OtherLvPlan.php
index cad654f12..af075fbc3 100644
--- a/application/controllers/api/frontend/v1/OtherLvPlan.php
+++ b/application/controllers/api/frontend/v1/OtherLvPlan.php
@@ -17,60 +17,59 @@
*/
if (!defined('BASEPATH'))
- exit('No direct script access allowed');
+ exit('No direct script access allowed');
class OtherLvPlan extends FHCAPI_Controller
{
- /**
- * Object initialization
- */
- public function __construct()
- {
- parent::__construct([
- 'otherLvPlanViewData' => ['basis/other_lv_plan:r'],
- ]);
+ /**
+ * 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->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
+ $this->load->model('person/Benutzer_model', 'BenutzerModel');
+ $this->load->library('ProfilLib');
- }
+ }
- //------------------------------------------------------------------------------------------------------------------
- // Public methods
+ //------------------------------------------------------------------------------------------------------------------
+ // 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;
+ /**
+ * retrieves viewData for other lv plan view
+ * @access public
+ * @param $uid the userID for which the other lv plan is being viewed
+ */
+ public function otherLvPlanViewData($uid)
+ {
+ $isMitarbeiterResult = $this->MitarbeiterModel->isMitarbeiter($uid);
+ $isMitarbeiter = getData($isMitarbeiterResult);
+ $isStudent = !$isMitarbeiter;
- $this->BenutzerModel->addSelect(["foto", "vorname", "nachname"]);
- $this->BenutzerModel->addJoin("tbl_person", "person_id");
- $personResult = $this->BenutzerModel->load([$uid]);
- $person = hasData($personResult) ? getData($personResult) : null;
+ $resProfileData = $this->profillib->getView($uid);
+ $profileData = hasData($resProfileData) ? getData($resProfileData) : null;
- $viewData = [
- "user_data" => [
- "username" => $uid,
- "is_student" => $isStudent,
- "is_mitarbeiter" => $isMitarbeiter,
- "foto" => $person[0]->foto,
- "vorname" => $person[0]->vorname,
- "nachname" => $person[0]->nachname,
- ],
- ];
+ $viewData = [
+ "user_data" => [
+ "username" => $uid,
+ "is_student" => $isStudent,
+ "is_mitarbeiter" => $isMitarbeiter,
+ "foto" => $profileData->data->foto,
+ "vorname" => $profileData->data->vorname,
+ "nachname" => $profileData->data->nachname,
+ ],
+ ];
- $this->terminateWithSuccess($viewData);
- }
+ $this->terminateWithSuccess($viewData);
+ }
- // -----------------------------------------------------------------------------------------------------------------
- // Private methods
+ // -----------------------------------------------------------------------------------------------------------------
+ // Private methods
}
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/detailheader/Detailheader.php b/application/controllers/api/frontend/v1/detailheader/Detailheader.php
index ada10c5b6..89e9821eb 100644
--- a/application/controllers/api/frontend/v1/detailheader/Detailheader.php
+++ b/application/controllers/api/frontend/v1/detailheader/Detailheader.php
@@ -9,9 +9,10 @@ class Detailheader extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
- 'getHeader' => ['vertrag/mitarbeiter:r'],
- 'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
- 'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
+ 'getHeader' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
+ 'getPersonAbteilung' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
+ 'getLeitungOrg' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
+ 'getSemesterStati' => ['admin:r', 'assistenz:r'],
]);
}
@@ -48,6 +49,17 @@ class Detailheader extends FHCAPI_Controller
$this->terminateWithSuccess(current($data));
}
+ public function getSemesterStati($prestudent_id)
+ {
+ $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+
+ $result = $this->PrestudentstatusModel->getAllPrestudentstatiWithStudiensemester($prestudent_id);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
}
diff --git a/application/controllers/api/frontend/v1/funktionen/Funktionen.php b/application/controllers/api/frontend/v1/funktionen/Funktionen.php
index b2787072b..a3efcdb51 100644
--- a/application/controllers/api/frontend/v1/funktionen/Funktionen.php
+++ b/application/controllers/api/frontend/v1/funktionen/Funktionen.php
@@ -294,6 +294,10 @@ class Funktionen extends FHCAPI_Controller
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
+ if($datum_von == '')
+ $datum_von = null;
+ if($datum_bis == '')
+ $datum_bis = null;
$result = $this->BenutzerfunktionModel->update(
[
diff --git a/application/controllers/api/frontend/v1/lv/Config.php b/application/controllers/api/frontend/v1/lv/Config.php
new file mode 100644
index 000000000..4f39c6b8b
--- /dev/null
+++ b/application/controllers/api/frontend/v1/lv/Config.php
@@ -0,0 +1,86 @@
+ ['admin:r', 'assistenz:r'],
+ 'set' => ['admin:r', 'assistenz:r'],
+ ]);
+
+ $this->_ci = &get_instance();
+ $this->_setAuthUID();
+
+ $this->loadPhrases([
+ 'lehre'
+ ]);
+
+ $this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
+ $this->_ci->load->library('PermissionLib');
+
+ }
+
+
+ public function get()
+ {
+ if (!($this->permissionlib->isBerechtigt('basis/tempus')) && !($this->permissionlib->isBerechtigt('lv-plan')))
+ $this->terminateWithSuccess([]);
+
+ $ignore_kollision = $this->_ci->variablelib->getVar('ignore_kollision');
+ $ignore_zeitsperre = $this->_ci->variablelib->getVar('ignore_zeitsperre');
+ $ignore_reservierung = $this->_ci->variablelib->getVar('ignore_reservierung');
+
+ $config['ignore_kollision'] = [
+ "type" => "checkbox",
+ "label" => 'ignore_kollision',
+ "value" => $ignore_kollision,
+ ];
+
+ $config['ignore_zeitsperre'] = [
+ "type" => "checkbox",
+ "label" => 'ignore_zeitsperre',
+ "value" => $ignore_zeitsperre,
+ ];
+
+ $config['ignore_reservierung'] = [
+ "type" => "checkbox",
+ "label" => 'ignore_reservierung',
+ "value" => $ignore_reservierung,
+ ];
+
+ $this->terminateWithSuccess($config);
+ }
+ public function set()
+ {
+ if (!($this->permissionlib->isBerechtigt('basis/tempus')) && !($this->permissionlib->isBerechtigt('lv-plan')))
+ $this->terminateWithSuccess([]);
+
+ $this->load->model('system/Variable_model', 'VariableModel');
+
+ foreach (['ignore_kollision','ignore_zeitsperre','ignore_reservierung'] as $variable)
+ {
+ if ($this->_ci->input->post($variable) !== null)
+ {
+ $this->VariableModel->update(array('uid' => $this->_uid, 'name' => $variable), array('wert' => $this->input->post($variable)));
+
+ }
+ }
+
+ $this->terminateWithSuccess();
+ }
+
+ private function _setAuthUID()
+ {
+ $this->_uid = getAuthUID();
+
+ if (!$this->_uid)
+ show_error('User authentification failed');
+ }
+}
diff --git a/application/controllers/api/frontend/v1/lv/Favorites.php b/application/controllers/api/frontend/v1/lv/Favorites.php
deleted file mode 100644
index 080a4ec6e..000000000
--- a/application/controllers/api/frontend/v1/lv/Favorites.php
+++ /dev/null
@@ -1,47 +0,0 @@
- self::PERM_LOGGED,
- 'set' => self::PERM_LOGGED
- ]);
-
- // Load models
- $this->load->model('system/Variable_model', 'VariableModel');
- }
-
- public function index()
- {
- $result = $this->VariableModel->getVariables(getAuthUID(), ['lv_favorites']);
-
- $data = $this->getDataOrTerminateWithError($result);
-
- if (!$data)
- $this->terminateWithSuccess(null);
- else
- $this->terminateWithSuccess(isset($data['lv_favorites']) ? $data['lv_favorites'] : null);
- }
-
- public function set()
- {
- $this->load->library('form_validation');
-
- $this->form_validation->set_rules('favorites', 'Favorites', 'required');
-
- if (!$this->form_validation->run())
- $this->terminateWithValidationErrors($this->form_validation->error_array());
-
- $favorites = $this->input->post('favorites');
-
- $result = $this->VariableModel->setVariable(getAuthUID(), 'lv_favorites', $favorites);
-
- $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess(true);
- }
-}
diff --git a/application/controllers/api/frontend/v1/lv/Gruppe.php b/application/controllers/api/frontend/v1/lv/Gruppe.php
index daebe8a61..f60d3a99a 100644
--- a/application/controllers/api/frontend/v1/lv/Gruppe.php
+++ b/application/controllers/api/frontend/v1/lv/Gruppe.php
@@ -15,6 +15,7 @@ class Gruppe extends FHCAPI_Controller
'getBenutzerSearch' => ['admin:r', 'assistenz:r'],
'getAllSearch' => ['admin:r', 'assistenz:r'],
'getByLehreinheit' => ['admin:r', 'assistenz:r'],
+ 'getGruppe' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
@@ -67,7 +68,7 @@ class Gruppe extends FHCAPI_Controller
$this->checkPermission($lehreinheit_id);
- $result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, !($lehrverband === 'false'));
+ $result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, $lehrverband === true || $lehrverband === 'true');
if (isError($result))
$this->terminateWithError(getError($result));
@@ -75,6 +76,71 @@ class Gruppe extends FHCAPI_Controller
$this->terminateWithSuccess($result);
}
+ public function getGruppe()
+ {
+ $lehrverband = $this->input->post('lehrverband');
+
+ $gruppen_result = array();
+
+ if ($lehrverband === false)
+ {
+ $gruppen_result = $this->_ci->GruppeModel->loadWhere(array(
+ 'studiengang_kz' => $this->input->post('stg_kz'),
+ 'gruppe_kurzbz' => $this->input->post('gruppe_kurzbz'),
+ 'aktiv' => true
+ ));
+ }
+ else if ($lehrverband === true)
+ {
+
+ if (!isEmptyString($this->input->post('verband')))
+ {
+ $this->LehrverbandModel->db->where('verband', $this->input->post('verband'));
+ }
+ else
+ {
+ $this->LehrverbandModel->db->group_start();
+ $this->LehrverbandModel->db->where("trim(verband) = ''");
+ $this->LehrverbandModel->db->or_where("verband IS NULL");
+ $this->LehrverbandModel->db->group_end();
+ }
+
+ if (!isEmptyString($this->input->post('gruppe')))
+ {
+ $this->LehrverbandModel->db->where('gruppe', $this->input->post('gruppe'));
+ }
+ else
+ {
+ $this->LehrverbandModel->db->group_start();
+ $this->LehrverbandModel->db->where("trim(gruppe) = ''");
+ $this->LehrverbandModel->db->or_where("gruppe IS NULL");
+ $this->LehrverbandModel->db->group_end();
+ }
+
+ if (!isEmptyString((string)$this->input->post('semester')))
+ {
+ $this->LehrverbandModel->db->where('semester', $this->input->post('semester'));
+ }
+ else
+ {
+
+ $this->LehrverbandModel->db->group_start();
+ $this->LehrverbandModel->db->where("semester = ''");
+ $this->LehrverbandModel->db->or_where("semester IS NULL");
+ $this->LehrverbandModel->db->group_end();
+ }
+
+ $gruppen_result = $this->LehrverbandModel->loadWhere(array('studiengang_kz' => $this->input->post('stg_kz'), 'aktiv' => true));
+ }
+
+ if (!hasData($gruppen_result))
+ return $this->terminateWithError('No group found');
+
+ $gruppen_array = getData($gruppen_result)[0];
+
+ $this->terminateWithSuccess($gruppen_array->gid);
+ }
+
public function getByLehreinheit($lehreinheit_id = null)
{
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id))
diff --git a/application/controllers/api/frontend/v1/lv/Lektor.php b/application/controllers/api/frontend/v1/lv/Lektor.php
index cce7f6e8b..64cfd3f1c 100644
--- a/application/controllers/api/frontend/v1/lv/Lektor.php
+++ b/application/controllers/api/frontend/v1/lv/Lektor.php
@@ -134,9 +134,14 @@ class Lektor extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
- if (isset($formData['semesterstunden']) && (!is_numeric($formData['semesterstunden']) || $formData['semesterstunden'] === ''))
+ $nullable_fields = array('semesterstunden', 'stundensatz', 'planstunden');
+
+ foreach ($nullable_fields as $nullable_field)
{
- $formData['semesterstunden'] = null;
+ if (isset($formData[$nullable_field]) && (!is_numeric($formData[$nullable_field]) || $formData[$nullable_field] === ''))
+ {
+ $formData[$nullable_field] = null;
+ }
}
$lehreinheit_permission = $this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan'));
@@ -144,6 +149,9 @@ class Lektor extends FHCAPI_Controller
if (!$lehreinheit_permission)
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
+ if (!is_null($this->getLektorVertrag($lehreinheit_id, $mitarbeiter_uid)) && (array_key_exists('mitarbeiter_uid', $formData) && $mitarbeiter_uid !== $formData['mitarbeiter_uid']))
+ $this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
+
$result = $this->_ci->lektorlib->updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $formData);
if (isError($result)) $this->terminateWithError(getError($result));
@@ -154,7 +162,7 @@ class Lektor extends FHCAPI_Controller
{
$value = str_replace(',', '.', $value);
- if (!is_numeric($value))
+ if (!is_numeric($value) && $value !== "")
{
$this->form_validation->set_message('_check_decimal', 'Das Feld {field} muss eine Zahl sein.');
return false;
diff --git a/application/controllers/api/frontend/v1/lv/Noten.php b/application/controllers/api/frontend/v1/lv/Noten.php
new file mode 100644
index 000000000..614ee6609
--- /dev/null
+++ b/application/controllers/api/frontend/v1/lv/Noten.php
@@ -0,0 +1,84 @@
+ 'student/noten:r',
+ 'getTeacherProposal' => 'student/noten:r',
+ ]);
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ // Load Phrases
+ $this->loadPhrases([
+ 'stv',
+ 'person',
+ 'lehre'
+ ]);
+ }
+
+ public function getCertificate($lv_id, $studiensemester_kurzbz = null)
+ {
+ if (is_null($lv_id) || !ctype_digit((string)$lv_id))
+ $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ $this->load->model('education/lehrveranstaltung_model', 'LehrveranstaltungModel');
+ $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ $result = $this->LehrveranstaltungModel->loadWhere([
+ 'lehrveranstaltung_id' => $lv_id
+ ]);
+
+ $lehrveranstaltung = $this->getDataOrTerminateWithError($result);
+
+ if (!$lehrveranstaltung)
+ $this->terminateWithSuccess([]);
+
+ if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
+ {
+ $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
+ }
+
+ $result = $this->ZeugnisnoteModel->getZeugnisnoten(null, $studiensemester_kurzbz, $lehrveranstaltung[0]->lehrveranstaltung_id);
+
+ $grades = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($grades);
+ }
+
+ public function getTeacherProposal($lv_id, $studiensemester_kurzbz = null)
+ {
+ if (is_null($lv_id) || !ctype_digit((string)$lv_id))
+ $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ $this->load->model('education/lehrveranstaltung_model', 'LehrveranstaltungModel');
+ $this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel');
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ $result = $this->LehrveranstaltungModel->loadWhere([
+ 'lehrveranstaltung_id' => $lv_id
+ ]);
+
+ $lehrveranstaltung = $this->getDataOrTerminateWithError($result);
+
+ if (!$lehrveranstaltung)
+ $this->terminateWithSuccess([]);
+
+ if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
+ {
+ $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
+ }
+
+ $result = $this->LvgesamtnoteModel->getLvGesamtNoten($lv_id, null, $studiensemester_kurzbz);
+
+ $grades = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($grades);
+ }
+
+}
diff --git a/application/controllers/api/frontend/v1/lv/Setup.php b/application/controllers/api/frontend/v1/lv/Setup.php
index eea4befa5..4b91b99c1 100644
--- a/application/controllers/api/frontend/v1/lv/Setup.php
+++ b/application/controllers/api/frontend/v1/lv/Setup.php
@@ -19,6 +19,8 @@
if (!defined('BASEPATH'))
exit('No direct script access allowed');
+use CI3_Events as Events;
+
class Setup extends FHCAPI_Controller
{
private $_ci;
@@ -27,7 +29,8 @@ class Setup extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
- 'getTabs' => ['admin:r', 'assistenz:r'],
+ 'getLETabs' => ['admin:r', 'assistenz:r'],
+ 'getLVTabs' => ['admin:r', 'assistenz:r'],
'getStudiensemester' => ['admin:r', 'assistenz:r'],
'getSprache' => ['admin:r', 'assistenz:r'],
'getRaumtyp' => ['admin:r', 'assistenz:r'],
@@ -41,9 +44,10 @@ class Setup extends FHCAPI_Controller
$this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
+ $this->_ci->load->helper('hlp_document');
}
- public function getTabs()
+ public function getLETabs()
{
$tabs['details'] = array (
'title' => 'Details',
@@ -60,11 +64,43 @@ class Setup extends FHCAPI_Controller
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'),
'config' => []
);
+ $tabs['termine'] = array (
+ 'title' => 'Termine',
+ 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Termine.js'),
+ 'config' => []
+ );
$tabs['notiz'] = array (
'title' => 'Notizen',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'),
'config' => []
);
+
+ Events::trigger('lvv_conf_tabs', function & () use (&$tabs) {
+ return $tabs;
+ });
+
+ $this->terminateWithSuccess($tabs);
+ }
+
+ public function getLVTabs()
+ {
+ $tabs['termine'] = array (
+ 'title' => 'Termine',
+ 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/LVTermine.js'),
+ 'config' => []
+ );
+ $tabs['noten'] = array (
+ 'title' => 'Noten',
+ 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Noten.js'),
+ 'config' => [
+ 'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE,
+ 'edit' => 'both', // Possible values: both|header|inline
+ 'delete' => 'inline', // Possible values: both|header|inline
+ 'documents' => 'inline', // Possible values: both|header|inline
+ 'documentslist' => gradesDocumentsList(),
+ 'semesterSelect' => false
+ ]
+ );
$this->terminateWithSuccess($tabs);
}
diff --git a/application/controllers/api/frontend/v1/lv/StgTree.php b/application/controllers/api/frontend/v1/lv/StgTree.php
deleted file mode 100644
index 8272da978..000000000
--- a/application/controllers/api/frontend/v1/lv/StgTree.php
+++ /dev/null
@@ -1,117 +0,0 @@
-method] = ['admin:r', 'assistenz:r'];
- parent::__construct($permissions);
-
- $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
- }
-
- public function _remap($method, $params = [])
- {
- if ($method == '' || $method == 'index')
- return $this->getBase();
-
- if (!$this->permissionlib->isBerechtigt('assistenz', 's', $method)
- && !$this->permissionlib->isBerechtigt('admin', 's', $method)
- ) {
- return $this->_outputAuthError([$method => ['admin:r', 'assistenz:r']]);
- }
-
- return $this->getStudiengang($method);
- show_404();
- }
-
- protected function getBase()
- {
- $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
-
- $this->StudiengangModel->addDistinct();
- $this->StudiengangModel->addSelect("v.studiengang_kz AS link");
- $this->StudiengangModel->addSelect(
- "CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name",
- false
- );
- $this->StudiengangModel->addSelect('erhalter_kz');
- $this->StudiengangModel->addSelect('typ');
- $this->StudiengangModel->addSelect('kurzbz');
- $this->StudiengangModel->addSelect('studiengang_kz');
- $this->StudiengangModel->addSelect('studiengang_kz AS stg_kz');
-
- $this->StudiengangModel->addOrder('erhalter_kz');
- $this->StudiengangModel->addOrder('typ');
- $this->StudiengangModel->addOrder('kurzbz');
-
- $stgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: [];
- $stgs = array_merge($stgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
-
- if (!$stgs)
- $this->terminateWithSuccess([]);
-
- $this->StudiengangModel->db->where_in('studiengang_kz', $stgs);
-
- $result = $this->StudiengangModel->loadWhere(['v.aktiv' => true]);
-
- $list = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess($list);
- }
-
- protected function getStudiengang($studiengang_kz)
- {
- $link = $studiengang_kz . '/';
-
- $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
-
- $this->StudiengangModel->addDistinct();
- $this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", semester) AS link", false);
- $this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester ORDER BY verband, gruppe LIMIT 1)) AS name", false);
- $this->StudiengangModel->addSelect("TRUE AS leaf", false);
-
- $this->StudiengangModel->addSelect('semester');
- $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
-
- $this->StudiengangModel->addOrder('semester');
-
- $result = $this->StudiengangModel->loadWhere([
- 'v.studiengang_kz' => $studiengang_kz,
- 'v.aktiv' => true
- ]);
- $list = $this->getDataOrTerminateWithError($result);
-
- $result = $this->StudiengangModel->load($studiengang_kz);
- $result = $this->getDataOrTerminateWithError($result);
- if ($result)
- {
- if (current($result)->mischform)
- {
- $this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
-
- $this->StudienordnungModel->addDistinct();
- $this->StudienordnungModel->addSelect("CONCAT(studiengang_kz, '/', p.orgform_kurzbz) AS link");
- $this->StudienordnungModel->addSelect("p.orgform_kurzbz AS name");
- $this->StudienordnungModel->addSelect("TRUE as leaf", false);
-
- $this->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id');
-
- $result = $this->StudienordnungModel->loadWhere([
- 'aktiv' => true,
- 'studiengang_kz' => $studiengang_kz,
- 'p.orgform_kurzbz !=' => 'DDP'
- ]);
- $result = $this->getDataOrTerminateWithError($result);
-
- $list = array_merge($list, $result);
- }
- }
-
- $this->terminateWithSuccess($list);
- }
-}
diff --git a/application/controllers/api/frontend/v1/organisation/Studiensemester.php b/application/controllers/api/frontend/v1/organisation/Studiensemester.php
index 3c6b72d2f..eaafc6ac5 100644
--- a/application/controllers/api/frontend/v1/organisation/Studiensemester.php
+++ b/application/controllers/api/frontend/v1/organisation/Studiensemester.php
@@ -26,7 +26,9 @@ class Studiensemester extends FHCAPI_Controller
'getAll' => self::PERM_LOGGED,
'getAktNext' => self::PERM_LOGGED,
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
- 'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED
+ 'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED,
+ 'current' => self::PERM_LOGGED,
+ 'set' => self::PERM_LOGGED
)
);
// Load model StudiensemesterModel
@@ -166,4 +168,39 @@ class Studiensemester extends FHCAPI_Controller
$this->terminateWithSuccess(array($studiensemester, $aktuell));
}
+
+ public function current()
+ {
+ $result = $this->StudiensemesterModel->getNearest();
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if (!$data)
+ $this->terminateWithError('Kein Studiensemester aktiv');
+ if (count($data) > 1)
+ $this->terminateWithError('Mehrere Studiensemester aktiv');
+
+ $this->terminateWithSuccess(current($data)->studiensemester_kurzbz);
+ }
+
+ public function set()
+ {
+ $this->load->library('AuthLib');
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $stdsem = $this->input->post('studiensemester_kurzbz');
+
+ $this->load->model('system/Variable_model', 'VariableModel');
+
+ $result = $this->VariableModel->setVariable(getAuthUID(), 'semester_aktuell', $stdsem);
+
+ $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(true);
+ }
}
diff --git a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
index def4f6502..7c1c974e2 100644
--- a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
+++ b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
@@ -246,12 +246,12 @@ class Abschlusspruefung extends FHCAPI_Controller
{
$searchString = $this->input->get('searchString') ?? '';
- $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
+ $this->load->model('person/Person_model', 'PersonModel');
- $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid');
+ $result = $this->PersonModel->searchPerson($searchString, 'mitMaUid');
if (isError($result)) {
- $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess($result ?: []);
@@ -371,6 +371,9 @@ class Abschlusspruefung extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
+ $datum = $formData['datum'] == '' ? null : $formData['datum'];
+ $sponsion = $formData['sponsion'] == '' ? null : $formData['sponsion'];
+
$result = $this->AbschlusspruefungModel->update(
[
'abschlusspruefung_id' => $abschlusspruefung_id
@@ -382,8 +385,8 @@ class Abschlusspruefung extends FHCAPI_Controller
'vorsitz' => $vorsitz,
'pruefungsantritt_kurzbz' => $formData['pruefungsantritt_kurzbz'],
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
- 'datum' => $formData['datum'],
- 'sponsion' => $formData['sponsion'],
+ 'datum' => $datum,
+ 'sponsion' => $sponsion,
'pruefer1' => $pruefer1,
'pruefer2' => $pruefer2,
'pruefer3' => $pruefer3,
diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php
index bc1fbebfe..cc6c04430 100644
--- a/application/controllers/api/frontend/v1/stv/Config.php
+++ b/application/controllers/api/frontend/v1/stv/Config.php
@@ -301,6 +301,7 @@ class Config extends FHCAPI_Controller
public function student()
{
+ $this->load->helper('hlp_document');
$result = [];
$config = $this->config->item('tabs');
@@ -376,9 +377,9 @@ class Config extends FHCAPI_Controller
'config' => [
'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE,
'edit' => 'both', // Possible values: both|header|inline
- 'delete' => 'both', // Possible values: both|header|inline
- 'documents' => 'both', // Possible values: both|header|inline
- 'documentslist' => $this->gradesDocumentsList()
+ 'delete' => 'inline', // Possible values: both|header|inline
+ 'documents' => 'inline', // Possible values: both|header|inline
+ 'documentslist' => gradesDocumentsList()
]
];
@@ -622,188 +623,6 @@ class Config extends FHCAPI_Controller
] + $this->kontoColumns();
}
- /**
- * Helper function to generate the default documentslist config for the
- * grades tab.
- *
- * The resulting array consists of elements which are associative arrays
- * that can have the following entries:
- * title (required) on the first level this can be HTML code.
- * permissioncheck (optional) an URL to an FHCAPI endpoint which returns
- * true or false.
- * link (optional) an URL that will be called if "action" and
- * "children" are not defined.
- * action (optional) an associative array that describes an
- * POST action that will be called if "children" is
- * not defined.
- * It can have the following entries:
- * - url (required) an URL to an FHCAPI endpoint.
- * - post (optional) an associative array with the POST data to
- * be sent.
- * - response (optional) a string that will be displayed on success.
- * children (optional) an array of child elements
- *
- * All strings that start with { and end with } in the URLs and the
- * actions post parameter will be replaced with the corresponding
- * attribute of the current dataset (e.G: {uid} will be replaced with the
- * uid of the current dataset)
- *
- * @return array
- */
- protected function gradesDocumentsList()
- {
- $permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}");
-
- $title_ger = $this->p->t("global", "deutsch");
- $title_eng = $this->p->t("global", "englisch");
- $title_ff = $this->p->t("stv", "document_certificate");
- $title_lv = $this->p->t("stv", "document_coursecertificate");
-
- $link_ff = "documents/export/" .
- "zertifikat.rdf.php/" .
- "Zertifikat" .
- "?stg_kz={studiengang_kz_lv}" .
- "&uid={uid}" .
- "&ss={studiensemester_kurzbz}" .
- "&lvid={lehrveranstaltung_id}";
- $link_lv_ger = "documents/export/" .
- "lehrveranstaltungszeugnis.rdf.php/" .
- "LVZeugnis" .
- "?stg_kz={studiengang_kz}" .
- "&uid={uid}" .
- "&ss={studiensemester_kurzbz}" .
- "&lvid={lehrveranstaltung_id}";
- $link_lv_eng = "documents/export/" .
- "lehrveranstaltungszeugnis.rdf.php/" .
- "LVZeugnisEng" .
- "?stg_kz={studiengang_kz}" .
- "&uid={uid}" .
- "&ss={studiensemester_kurzbz}" .
- "&lvid={lehrveranstaltung_id}";
-
- $archive_url = "api/frontend/v1/documents/archiveSigned";
- $archive_response = $this->p->t("stv", "document_signed_and_archived");
- $archive_post_ff = [
- "xml" => "zertifikat.rdf.php",
- "xsl" => "Zertifikat",
- "stg_kz" => "{studiengang_kz_lv}",
- "uid" => "{uid}",
- "ss" => "{studiensemester_kurzbz}",
- "lvid" => "{lehrveranstaltung_id}"
- ];
- $archive_post_lv_ger = [
- "xml" => "lehrveranstaltungszeugnis.rdf.php",
- "xsl" => "LVZeugnis",
- "stg_kz" => "{studiengang_kz}",
- "uid" => "{uid}",
- "ss" => "{studiensemester_kurzbz}",
- "lvid" => "{lehrveranstaltung_id}"
- ];
- $archive_post_lv_eng = [
- "xml" => "lehrveranstaltungszeugnis.rdf.php",
- "xsl" => "LVZeugnisEng",
- "stg_kz" => "{studiengang_kz}",
- "uid" => "{uid}",
- "ss" => "{studiensemester_kurzbz}",
- "lvid" => "{lehrveranstaltung_id}"
- ];
-
- $list = [
- [
- 'title' => '',
- 'children' => [
- [
- 'title' => $title_ff,
- 'link' => site_url($link_ff)
- ],
- [
- 'title' => $title_lv,
- 'children' => [
- [
- 'title' => $title_ger,
- 'link' => site_url($link_lv_ger),
- 'children' => [
- [
- 'title' => 'PDF',
- 'permissioncheck' => $permissioncheck,
- 'link' => site_url($link_lv_ger)
- ],
- [
- 'title' => 'DOC',
- 'permissioncheck' => $permissioncheck,
- 'link' => site_url($link_lv_ger . "&output=doc")
- ],
- [
- 'title' => 'ODT',
- 'permissioncheck' => $permissioncheck,
- 'link' => site_url($link_lv_ger . "&output=odt")
- ]
- ]
- ],
- [
- 'title' => $title_eng,
- 'link' => site_url($link_lv_eng),
- 'children' => [
- [
- 'title' => 'PDF',
- 'permissioncheck' => $permissioncheck,
- 'link' => site_url($link_lv_eng)
- ],
- [
- 'title' => 'DOC',
- 'permissioncheck' => $permissioncheck,
- 'link' => site_url($link_lv_eng . "&output=doc")
- ],
- [
- 'title' => 'ODT',
- 'permissioncheck' => $permissioncheck,
- 'link' => site_url($link_lv_eng . "&output=odt")
- ]
- ]
- ]
- ]
- ]
- ]
- ],
- [
- 'title' => '',
- 'children' => [
- [
- 'title' => $title_ff,
- 'action' => [
- 'url' => site_url($archive_url),
- 'post' => $archive_post_ff,
- 'response' => $archive_response
- ]
- ],
- [
- 'title' => $title_lv,
- 'children' => [
- [
- 'title' => $title_ger,
- 'action' => [
- 'url' => site_url($archive_url),
- 'post' => $archive_post_lv_ger,
- 'response' => $archive_response
- ]
- ],
- [
- 'title' => $title_eng,
- 'action' => [
- 'url' => site_url($archive_url),
- 'post' => $archive_post_lv_eng,
- 'response' => $archive_response
- ]
- ]
- ]
- ]
- ]
- ]
- ];
-
- return $list;
- }
-
/**
* Sort tab list
*
diff --git a/application/controllers/api/frontend/v1/stv/Dokumente.php b/application/controllers/api/frontend/v1/stv/Dokumente.php
index 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/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 047652452..39ed72072 100644
--- a/application/controllers/api/frontend/v1/stv/Students.php
+++ b/application/controllers/api/frontend/v1/stv/Students.php
@@ -138,7 +138,7 @@ class Students extends FHCAPI_Controller
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -190,14 +190,14 @@ class Students extends FHCAPI_Controller
) AS semester", false);
$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->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -235,59 +235,66 @@ class Students extends FHCAPI_Controller
) AS semester", false);
$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->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)
{
+ $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';
$selectRT = "
@@ -439,19 +446,21 @@ class Students extends FHCAPI_Controller
$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->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
@@ -459,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,
@@ -479,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
) {
@@ -517,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)
@@ -538,13 +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
) {
+ $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))
@@ -556,6 +572,7 @@ class Students extends FHCAPI_Controller
$this->studentlistlib->addJoin("public.tbl_student s", "prestudent_id");
$this->studentlistlib->addSelect("'' AS priorisierung_relativ");
+ $this->studentlistlib->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
if ($gruppe_kurzbz !== null) {
$this->studentlistlib->addJoin('public.tbl_benutzergruppe g', 'uid', '', 'after_b');
@@ -594,10 +611,22 @@ class Students extends FHCAPI_Controller
$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
*
@@ -611,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))
@@ -618,7 +649,7 @@ class Students extends FHCAPI_Controller
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
-
+
$this->studentlistlib->addSelect("COALESCE(
v.semester::text,
CASE
@@ -638,7 +669,7 @@ class Students extends FHCAPI_Controller
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -655,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))
@@ -664,14 +697,14 @@ class Students extends FHCAPI_Controller
$this->studentlistlib->addWhere('s.student_uid', $student_uid);
-
+
$this->addFilter($studiensemester_kurzbz);
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -689,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))
@@ -699,13 +734,13 @@ class Students extends FHCAPI_Controller
$this->studentlistlib->addWhere('p.person_id', $person_id);
-
+
$this->addFilter($studiensemester_kurzbz);
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -721,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');
@@ -755,6 +792,7 @@ class Students extends FHCAPI_Controller
END
) AS semester", false);
+ $this->studentlistlib->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
if ($prestudent_ids && $student_uids) {
$this->studentlistlib->addWhere('tbl_prestudent.prestudent_id', $prestudent_ids);
@@ -773,7 +811,7 @@ class Students extends FHCAPI_Controller
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
-
+ $this->decodeTagsJsonInResult($data);
$this->terminateWithSuccess($data);
}
@@ -802,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/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 b6d10931c..c632baa39 100644
--- a/application/controllers/components/Cis/Mylv.php
+++ b/application/controllers/components/Cis/Mylv.php
@@ -15,11 +15,11 @@ class Mylv extends Auth_Controller
{
parent::__construct([
- 'Student' => ['student/anrechnung_beantragen:r','user:r', 'basis/cis:r'], // TODO(chris): permissions?
- 'Studiensemester' => ['student/anrechnung_beantragen:r','user:r', 'basis/cis:r'], // TODO(chris): permissions?
- 'Lvs' => ['student/anrechnung_beantragen:r','user:r', 'basis/cis:r'], // TODO(chris): permissions?
- 'Info' => ['student/anrechnung_beantragen:r','user:r', 'basis/cis:r'], // TODO(chris): permissions?
- 'Pruefungen' => ['student/anrechnung_beantragen:r','user:r', 'basis/cis: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/AntragJob.php b/application/controllers/jobs/AntragJob.php
index 5b72518d2..8bcb898a9 100644
--- a/application/controllers/jobs/AntragJob.php
+++ b/application/controllers/jobs/AntragJob.php
@@ -125,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));
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 ebc1d2eaa..ad333679d 100644
--- a/application/controllers/lehre/Studierendenantrag.php
+++ b/application/controllers/lehre/Studierendenantrag.php
@@ -25,7 +25,8 @@ class Studierendenantrag extends FHC_Controller
// Load language phrases
$this->loadPhrases([
- 'studierendenantrag'
+ 'studierendenantrag',
+ 'ui'
]);
$this->load->config('studierendenantrag');
diff --git a/application/controllers/person/Gradelist.php b/application/controllers/person/Gradelist.php
index 230c7f67f..d6df2c43a 100644
--- a/application/controllers/person/Gradelist.php
+++ b/application/controllers/person/Gradelist.php
@@ -198,7 +198,19 @@ class Gradelist extends Auth_Controller
if (!isset($row_noten->found))
{
$result_lv = $this->LehrveranstaltungModel->load($row_noten->lehrveranstaltung_id);
- $result_stg = $this->StudiengangModel->load($result_lv->retval[0]->studiengang_kz);
+
+ $studiengang_kz = null;
+
+ if (!empty($result_lv->retval) && isset($result_lv->retval[0]) && isset($result_lv->retval[0]->studiengang_kz))
+ {
+ $result_stg = $this->StudiengangModel->load($result_lv->retval[0]->studiengang_kz);
+
+ if (!empty($result_stg->retval) && isset($result_stg->retval[0]) && is_object($result_stg->retval[0]) && isset($result_stg->retval[0]->kurzbzlang))
+ {
+ $studiengang_kz = $result_stg->retval[0]->kurzbzlang;
+ }
+ }
+
$courses['semester'][$row_noten->studiensemester_kurzbz]['lvs_nonstpl'][] = array(
'lehrveranstaltung_id' => $row_noten->lehrveranstaltung_id,
'lehrtyp_kurzbz' => $result_lv->retval[0]->lehrtyp_kurzbz,
@@ -212,8 +224,8 @@ class Gradelist extends Auth_Controller
'semester' => $result_lv->retval[0]->semester,
'note' => $row_noten->note,
'datum' => $row_noten->benotungsdatum,
- 'zugeordnet' => true,
- 'studiengang_kurzbz' => $result_stg->retval[0]->kurzbzlang
+ 'studiengang_kurzbz' => $studiengang_kz,
+ 'zugeordnet' => true
);
if(!isset($courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl']))
$courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl'] = 0;
diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php
index 5b9bac6c5..c4b6edb81 100644
--- a/application/core/Tag_Controller.php
+++ b/application/core/Tag_Controller.php
@@ -7,7 +7,7 @@ class Tag_Controller extends FHCAPI_Controller
{
private $_uid;
- const BERECHTIGUNG_KURZBZ = 'admin:rw';
+ const BERECHTIGUNG_KURZBZ = ['admin:rw'];
public function __construct($permissions)
{
@@ -15,10 +15,11 @@ class Tag_Controller extends FHCAPI_Controller
'getTag' => self::BERECHTIGUNG_KURZBZ,
'getTags' => self::BERECHTIGUNG_KURZBZ,
'addTag' => self::BERECHTIGUNG_KURZBZ,
-
'updateTag' => self::BERECHTIGUNG_KURZBZ,
'doneTag' => self::BERECHTIGUNG_KURZBZ,
'deleteTag' => self::BERECHTIGUNG_KURZBZ,
+ 'getAllTags' => self::BERECHTIGUNG_KURZBZ,
+ 'rebuildTagsForTypeId' => self::BERECHTIGUNG_KURZBZ,
];
$merged_permissions = array_merge($default_permissions, $permissions);
@@ -26,6 +27,10 @@ class Tag_Controller extends FHCAPI_Controller
parent::__construct($merged_permissions);
$this->_setAuthUID();
+
+ // Library
+ $this->load->library('TagLib');
+
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
@@ -38,6 +43,8 @@ class Tag_Controller extends FHCAPI_Controller
public function getTag($readonly_tags = null)
{
$language = $this->_getLanguageIndex();
+ $index_bezeichnung_mehrsprachig = $language - 1;
+
$id = $this->input->get('id');
if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
@@ -62,14 +69,18 @@ class Tag_Controller extends FHCAPI_Controller
$this->NotizModel->addSelect(
"tbl_notiz.titel,
tbl_notiz.text,
- array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $language. " as bezeichnung,
+ array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
tbl_notiz.notiz_id,
tbl_notiz_typ.style,
+ tbl_notiz_typ.automatisiert,
+ tbl_notiz_typ.prioritaet,
tbl_notiz.erledigt as done,
tbl_notiz.insertamum,
tbl_notiz.updateamum,
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
- (bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter
+ (bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter,
+ tbl_notiz.start,
+ tbl_notiz.ende
"
);
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
@@ -82,18 +93,24 @@ class Tag_Controller extends FHCAPI_Controller
$notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id));
+
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array());
}
public function getTags($tags = null)
{
+ $language = $this->_getLanguageIndex();
+ $index_bezeichnung_mehrsprachig = $language - 1;
+
$this->NotiztypModel->addSelect(
- 'typ_kurzbz as tag_typ_kurzbz,
- array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
+ "typ_kurzbz as tag_typ_kurzbz,
+ array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
style,
beschreibung,
- tag
- '
+ tag,
+ automatisiert,
+ prioritaet
+ "
);
$this->NotiztypModel->addOrder('prioritaet');
@@ -271,6 +288,90 @@ class Tag_Controller extends FHCAPI_Controller
$this->terminateWithSuccess($deleteNotiz);
}
+ public function getAllTags($readonly_tags = false)
+ {
+ $language = $this->_getLanguageIndex();
+ $index_bezeichnung_mehrsprachig = $language - 1;
+ $prestudent_id = $this->input->get('prestudent_id');
+
+ if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
+ {
+ $readonly_tags = $this->_filterTag($readonly_tags, true);
+
+ foreach ($readonly_tags as $key => $tag)
+ {
+ $readonly_tags[$key] = $this->NotizModel->db->escape($tag);
+ }
+ $tags = '(' . implode(',', $readonly_tags) . ')';
+
+ $this->NotizModel->addSelect("
+ CASE
+ WHEN tbl_notiz_typ.typ_kurzbz IN $tags
+ THEN TRUE
+ ELSE FALSE
+ END as readonly
+ ");
+ }
+ $this->NotizModel->addSelect(
+ "tbl_notiz.titel,
+ tbl_notiz.text,
+ array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
+ tbl_notiz.notiz_id,
+ tbl_notiz_typ.style,
+ tbl_notiz_typ.automatisiert,
+ tbl_notiz_typ.prioritaet,
+ tbl_notiz.erledigt as done,
+ tbl_notiz.insertamum,
+ tbl_notiz.updateamum,
+ (verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
+ (bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter,
+ tbl_notiz.start,
+ tbl_notiz.ende
+ "
+ );
+ $this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
+
+ $this->NotizModel->addJoin('public.tbl_benutzer verfasserbenutzer', 'tbl_notiz.verfasser_uid = verfasserbenutzer.uid', 'LEFT');
+ $this->NotizModel->addJoin('public.tbl_person verfasserperson', 'verfasserbenutzer.person_id = verfasserperson.person_id', 'LEFT');
+
+ $this->NotizModel->addJoin('public.tbl_benutzer bearbeiterbenutzer', 'tbl_notiz.bearbeiter_uid = bearbeiterbenutzer.uid', 'LEFT');
+ $this->NotizModel->addJoin('public.tbl_person bearbeiterperson', 'bearbeiterbenutzer.person_id = bearbeiterperson.person_id', 'LEFT');
+
+ $this->NotizModel->addJoin('public.tbl_notizzuordnung notizzuordnung', 'tbl_notiz.notiz_id = notizzuordnung.notiz_id');
+
+ $this->NotizModel->addOrder('done');
+ $this->NotizModel->addOrder('tbl_notiz_typ.prioritaet');
+ $notiz = $this->NotizModel->loadWhere(array('prestudent_id' => $prestudent_id));
+
+
+ $this->terminateWithSuccess(hasData($notiz) ? getData($notiz) : array());
+ }
+
+ public function rebuildTagsForTypeId()
+ {
+ $ids = $this->input->post('ids');
+ $typeId = $this->input->post('typeId');
+ $semester = $this->input->post('sem');
+
+ $idsSuccess = [];
+ $idsError = [];
+ $outputResult = [];
+
+ foreach ($ids as $id)
+ {
+ $result = $this->taglib->rebuildTagsForTypeId($typeId, $id, $semester);
+
+ if (isError($result))
+ $idsError[] = $id;
+ else
+ $idsSuccess[] = $id;
+
+ $outputResult[] = $result;
+ }
+
+ $this->terminateWithSuccess([$outputResult, $idsSuccess, $idsError]);
+ }
+
private function _setAuthUID()
{
$this->_uid = getAuthUID();
@@ -311,4 +412,4 @@ class Tag_Controller extends FHCAPI_Controller
));
}
-}
\ No newline at end of file
+}
diff --git a/application/helpers/hlp_document_helper.php b/application/helpers/hlp_document_helper.php
new file mode 100644
index 000000000..5b457fe82
--- /dev/null
+++ b/application/helpers/hlp_document_helper.php
@@ -0,0 +1,188 @@
+load->library('PhrasesLib', array('stv'), 'p');
+
+ $permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}");
+
+ $title_ger = $ci->p->t("global", "deutsch");
+ $title_eng = $ci->p->t("global", "englisch");
+ $title_ff = $ci->p->t("stv", "document_certificate");
+ $title_lv = $ci->p->t("stv", "document_coursecertificate");
+
+ $link_ff = "documents/export/" .
+ "zertifikat.rdf.php/" .
+ "Zertifikat" .
+ "?stg_kz={studiengang_kz_lv}" .
+ "&uid={uid}" .
+ "&ss={studiensemester_kurzbz}" .
+ "&lvid={lehrveranstaltung_id}";
+ $link_lv_ger = "documents/export/" .
+ "lehrveranstaltungszeugnis.rdf.php/" .
+ "LVZeugnis" .
+ "?stg_kz={studiengang_kz}" .
+ "&uid={uid}" .
+ "&ss={studiensemester_kurzbz}" .
+ "&lvid={lehrveranstaltung_id}";
+ $link_lv_eng = "documents/export/" .
+ "lehrveranstaltungszeugnis.rdf.php/" .
+ "LVZeugnisEng" .
+ "?stg_kz={studiengang_kz}" .
+ "&uid={uid}" .
+ "&ss={studiensemester_kurzbz}" .
+ "&lvid={lehrveranstaltung_id}";
+
+ $archive_url = "api/frontend/v1/documents/archiveSigned";
+ $archive_response = $ci->p->t("stv", "document_signed_and_archived");
+ $archive_post_ff = [
+ "xml" => "zertifikat.rdf.php",
+ "xsl" => "Zertifikat",
+ "stg_kz" => "{studiengang_kz_lv}",
+ "uid" => "{uid}",
+ "ss" => "{studiensemester_kurzbz}",
+ "lvid" => "{lehrveranstaltung_id}"
+ ];
+ $archive_post_lv_ger = [
+ "xml" => "lehrveranstaltungszeugnis.rdf.php",
+ "xsl" => "LVZeugnis",
+ "stg_kz" => "{studiengang_kz}",
+ "uid" => "{uid}",
+ "ss" => "{studiensemester_kurzbz}",
+ "lvid" => "{lehrveranstaltung_id}"
+ ];
+ $archive_post_lv_eng = [
+ "xml" => "lehrveranstaltungszeugnis.rdf.php",
+ "xsl" => "LVZeugnisEng",
+ "stg_kz" => "{studiengang_kz}",
+ "uid" => "{uid}",
+ "ss" => "{studiensemester_kurzbz}",
+ "lvid" => "{lehrveranstaltung_id}"
+ ];
+
+ $list = [
+ [
+ 'title' => '',
+ 'children' => [
+ [
+ 'title' => $title_ff,
+ 'link' => site_url($link_ff)
+ ],
+ [
+ 'title' => $title_lv,
+ 'children' => [
+ [
+ 'title' => $title_ger,
+ 'link' => site_url($link_lv_ger),
+ 'children' => [
+ [
+ 'title' => 'PDF',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_ger)
+ ],
+ [
+ 'title' => 'DOC',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_ger . "&output=doc")
+ ],
+ [
+ 'title' => 'ODT',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_ger . "&output=odt")
+ ]
+ ]
+ ],
+ [
+ 'title' => $title_eng,
+ 'link' => site_url($link_lv_eng),
+ 'children' => [
+ [
+ 'title' => 'PDF',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_eng)
+ ],
+ [
+ 'title' => 'DOC',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_eng . "&output=doc")
+ ],
+ [
+ 'title' => 'ODT',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_eng . "&output=odt")
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ],
+ [
+ 'title' => '',
+ 'children' => [
+ [
+ 'title' => $title_ff,
+ 'action' => [
+ 'url' => site_url($archive_url),
+ 'post' => $archive_post_ff,
+ 'response' => $archive_response
+ ]
+ ],
+ [
+ 'title' => $title_lv,
+ 'children' => [
+ [
+ 'title' => $title_ger,
+ 'action' => [
+ 'url' => site_url($archive_url),
+ 'post' => $archive_post_lv_ger,
+ 'response' => $archive_response
+ ]
+ ],
+ [
+ 'title' => $title_eng,
+ 'action' => [
+ 'url' => site_url($archive_url),
+ 'post' => $archive_post_lv_eng,
+ 'response' => $archive_response
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ];
+
+ return $list;
+}
diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php
index 27dfba5a1..eb2cd9f85 100644
--- a/application/helpers/hlp_header_helper.php
+++ b/application/helpers/hlp_header_helper.php
@@ -111,7 +111,8 @@ function generateJSDataStorageObject($indexPage, $calledPath, $calledMethod)
'theme' => [
'name'=>$ci->config->item('theme_name'),
'modes'=>$ci->config->item('theme_modes'),
- ]
+ ],
+ 'domain' => DOMAIN
);
$toPrint = "\n";
@@ -270,6 +271,28 @@ function absoluteJsImportUrl($relurl)
return $url;
}
+/*
+ * Generate Css File Include if Extension contains file
+ *
+ * @param $relativeFilePath path relative to Extension public/css dir
+ */
+function generateCSSsIncludeIfExtensionCssExists($relativeFilePath)
+{
+ $fsiterator = new FilesystemIterator(FHCPATH . 'application/extensions');
+ foreach ($fsiterator as $fsitem)
+ {
+ if(preg_match('/^FHC-Core-/', $fsitem->getBasename()))
+ {
+ $extensionfile = 'public/extensions/' . $fsitem->getBasename()
+ . '/css/' . $relativeFilePath;
+ if(is_readable(FHCPATH . $extensionfile))
+ {
+ generateCSSsInclude($extensionfile);
+ }
+ }
+ }
+}
+
/*
* Manipulate CI views includes Array to load
* - public/js/FhcApps.js via customJSs and
diff --git a/application/libraries/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/StundenplanLib.php b/application/libraries/StundenplanLib.php
index a2f8bbfe6..0a460079b 100644
--- a/application/libraries/StundenplanLib.php
+++ b/application/libraries/StundenplanLib.php
@@ -80,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;
@@ -185,6 +187,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
*
@@ -1024,7 +1041,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/stv/StudentListLib.php b/application/libraries/stv/StudentListLib.php
index bb44c8bb0..9365ddc9a 100644
--- a/application/libraries/stv/StudentListLib.php
+++ b/application/libraries/stv/StudentListLib.php
@@ -28,6 +28,7 @@ class StudentListLib
private $_allowedStgs = [];
private $_selects = [];
private $_joins = [];
+ private $_wheres = [];
/**
* Gets the CI instance, loads model and prepares default values
@@ -40,6 +41,8 @@ class StudentListLib
{
$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']))
@@ -47,8 +50,6 @@ class StudentListLib
// Add default SELECTs
$this->addSelect("b.uid");
- if (defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED)
- $this->addSelect('tag_data_agg.tags');
$this->addSelect('titelpre');
$this->addSelect('nachname');
$this->addSelect('vorname');
@@ -72,6 +73,13 @@ class StudentListLib
$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
@@ -111,7 +119,7 @@ class StudentListLib
) prest
WHERE laststatus NOT IN ('Abbrecher', 'Abgewiesener', 'Absolvent')
AND priorisierung <= tbl_prestudent.priorisierung
- ) || ' (' || COALESCE(tbl_prestudent.priorisierung::text, ' '::text) || ')' AS priorisierung_relativ", false); // TODO(chris): overwrite in fetchStudents
+ ) || ' (' || COALESCE(tbl_prestudent.priorisierung::text, ' '::text) || ')' AS priorisierung_relativ", false);
$this->addSelect('mentor');
$this->addSelect('b.aktiv AS bnaktiv');
$this->addSelect('unruly');
@@ -119,7 +127,7 @@ class StudentListLib
// Add default JOINs
$this->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
$this->addJoin('public.tbl_person p', 'person_id');
- $this->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT'); // TODO(chris): overwrite in fetchStudents
+ $this->addJoin('public.tbl_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
@@ -129,40 +137,14 @@ class StudentListLib
$this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid', 'LEFT');
$this->addJoin("v", "", ""); // Will be replaced later
$this->addJoin("ps", "", ""); // Will be replaced later
- if (defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) {
- $this->_ci->load->config('stv');
- $tags = $this->_ci->config->item('stv_prestudent_tags');
- $whereTags = '';
- if (is_array($tags) && !isEmptyArray($tags)) {
- $tags = array_keys($tags);
-
- foreach ($tags as $key => $tag) {
- $tags[$key] = $this->_ci->PrestudentModel->escape($tag);
- }
- $whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")";
- }
- $subQueryTag = "(
- SELECT
- tag.prestudent_id,
- COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags
- FROM (
- SELECT DISTINCT ON (n.notiz_id)
- n.notiz_id AS id,
- nt.typ_kurzbz,
- array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung,
- n.text AS notiz,
- nt.style,
- n.erledigt AS done,
- nz.prestudent_id
- FROM public.tbl_notizzuordnung AS nz
- JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id
- JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz " . $whereTags . "
- ) AS tag
- GROUP BY tag.prestudent_id
- ) AS tag_data_agg";
-
- $this->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT');
+ // 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);
}
}
@@ -249,11 +231,7 @@ class StudentListLib
*/
public function addWhere($key, $value = null, $escape = true)
{
- if (!is_array($key) && is_array($value)) {
- $this->_ci->PrestudentModel->db->where_in($key, $value, $escape);
- } else {
- $this->_ci->PrestudentModel->db->where($key, $value, $escape);
- }
+ $this->_wheres[] = [$key, $value, $escape, false];
}
/**
@@ -267,11 +245,7 @@ class StudentListLib
*/
public function addOrWhere($key, $value = null, $escape = true)
{
- if (!is_array($key) && is_array($value)) {
- $this->_ci->PrestudentModel->db->or_where_in($key, $value, $escape);
- } else {
- $this->_ci->PrestudentModel->db->or_where($key, $value, $escape);
- }
+ $this->_wheres[] = [$key, $value, $escape, true];
}
/**
@@ -283,8 +257,9 @@ class StudentListLib
*/
public function execute($studiensemester_kurzbz)
{
- $stdsemEsc = $studiensemester_kurzbz ? $this->_ci->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
+ $this->addSelectAndJoinForTagsIfConfigured($studiensemester_kurzbz);
+ $stdsemEsc = $studiensemester_kurzbz ? $this->_ci->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
$this->addSelect(
"public.get_rolle_prestudent(
@@ -315,6 +290,20 @@ class StudentListLib
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');
@@ -325,6 +314,78 @@ class StudentListLib
//------------------------------------------------------------------------------------------------------------------
// 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
*
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..e25aed4cc
--- /dev/null
+++ b/application/libraries/tags/CoreMissingZgvTagLib.php
@@ -0,0 +1,81 @@
+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');
+ $result = $this->ci->PrestudentModel-> loadWhere(array(
+ 'bn.aktiv' => true, //check if necessary
+ 'zgvdatum' => null,
+ 'typ' => 'b',
+ '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->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');
+ $result = $this->ci->PrestudentModel->loadWhere(array(
+ 'bn.aktiv' => true, //check if necessary
+ 'zgvdatum' => null,
+ 'typ' => 'b',
+ 'studiensemester_kurzbz' => $semester,
+ 'prestudent_id' => $prestudent_id
+ ));
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CoreOutgoingTagLib.php b/application/libraries/tags/CoreOutgoingTagLib.php
new file mode 100644
index 000000000..904839dee
--- /dev/null
+++ b/application/libraries/tags/CoreOutgoingTagLib.php
@@ -0,0 +1,63 @@
+ci = get_instance();
+ $this->ci->load->model('codex/Bisio_model', 'BisioModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $result = $this->ci->BisioModel->getOutgoingsOfSemester($semester);
+
+ $data = $result->retval;
+
+ $outgoing_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->von,
+ 'bis' => $item->bis
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $outgoing_data,
+ 'typeId' => 'prestudent_id',
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $result = $this->ci->BisioModel->isPrestudentOutgoing($semester, $prestudent_id);
+
+ if (hasData($result)) {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CorePreabbrecherTagLib.php b/application/libraries/tags/CorePreabbrecherTagLib.php
new file mode 100644
index 000000000..41712ac3b
--- /dev/null
+++ b/application/libraries/tags/CorePreabbrecherTagLib.php
@@ -0,0 +1,80 @@
+ci = get_instance();
+ $this->ci->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $this->ci->StudierendenantragModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $this->ci->StudierendenantragModel->db->where_in('typ', self::TYP_ABMELDUNG);
+ $this->ci->StudierendenantragModel->db->where('studiensemester_kurzbz', $semester);
+ $result = $this->ci->StudierendenantragModel->getWithLastStatusWhere([
+ 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED
+ ]);
+
+ $data = $result->retval;
+
+ $prewiederholer_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->start,
+ 'bis' => $item->ende
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $prewiederholer_data,
+ 'typeId' => 'prestudent_id',
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->StudierendenantragModel->addSelect('prestudent_id');
+ $this->ci->StudierendenantragModel->addSelect('start as von');
+ $this->ci->StudierendenantragModel->addSelect('ende as bis');
+
+ $this->ci->StudierendenantragModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $this->ci->StudierendenantragModel->db->where_in('typ', self::TYP_ABMELDUNG);
+ $this->ci->StudierendenantragModel->db->where('studiensemester_kurzbz', $semester);
+ $this->ci->StudierendenantragModel->db->where('prestudent_id', $prestudent_id);
+ $result = $this->ci->StudierendenantragModel->getWithLastStatusWhere([
+ 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED
+ ]);
+
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CorePrewiederholerTagLib.php b/application/libraries/tags/CorePrewiederholerTagLib.php
new file mode 100644
index 000000000..8b7037b07
--- /dev/null
+++ b/application/libraries/tags/CorePrewiederholerTagLib.php
@@ -0,0 +1,76 @@
+ci = get_instance();
+ $this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $result = $this->ci->PrestudentstatusModel-> loadWhere(array(
+ 'statusgrund_id' => 15,
+ 'studiensemester_kurzbz' => $semester
+ ));
+ $data = $result->retval;
+
+ $prewiederholer_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->start,
+ 'bis' => $item->ende
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $prewiederholer_data,
+ 'typeId' => 'prestudent_id',
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->PrestudentstatusModel->addSelect('prestudent_id');
+ $this->ci->PrestudentstatusModel->addSelect('start as von');
+ $this->ci->PrestudentstatusModel->addSelect('ende as bis');
+
+ $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $result = $this->ci->PrestudentstatusModel->loadWhere(array(
+ 'statusgrund_id' => 15,
+ 'studiensemester_kurzbz' => $semester,
+ 'prestudent_id' => $prestudent_id
+ ));
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CoreStbErhoehtTagLib.php b/application/libraries/tags/CoreStbErhoehtTagLib.php
new file mode 100644
index 000000000..886aff468
--- /dev/null
+++ b/application/libraries/tags/CoreStbErhoehtTagLib.php
@@ -0,0 +1,79 @@
+ci = get_instance();
+ $this->ci->load->model('crm/Konto_model', 'KontoModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $this->ci->KontoModel->addJoin('public.tbl_prestudent', 'person_id');
+ $this->ci->KontoModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $result = $this->ci->KontoModel-> loadWhere(array(
+ 'buchungstyp_kurzbz' => 'StudiengebuehrErhoeht',
+ 'studiensemester_kurzbz' => $semester
+ ));
+ $data = $result->retval;
+
+ $konto_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->start,
+ 'bis' => $item->ende
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $konto_data,
+ 'typeId' => 'prestudent_id'
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->KontoModel->addSelect('prestudent_id');
+ $this->ci->KontoModel->addSelect('start as von');
+ $this->ci->KontoModel->addSelect('ende as bis');
+ $this->ci->KontoModel->addJoin('public.tbl_prestudent', 'person_id');
+ $this->ci->KontoModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $result = $this->ci->KontoModel-> loadWhere(array(
+ 'buchungstyp_kurzbz' => 'StudiengebuehrErhoeht',
+ 'studiensemester_kurzbz' => $semester,
+ 'prestudent_id' => $prestudent_id
+ ));
+
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CoreUnterbrecherTagLib.php b/application/libraries/tags/CoreUnterbrecherTagLib.php
new file mode 100644
index 000000000..ddf8f33cd
--- /dev/null
+++ b/application/libraries/tags/CoreUnterbrecherTagLib.php
@@ -0,0 +1,76 @@
+ci = get_instance();
+ $this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+ $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $result = $this->ci->PrestudentstatusModel-> loadWhere(array(
+ 'status_kurzbz' => 'Unterbrecher',
+ 'studiensemester_kurzbz' => $semester
+ ));
+ $data = $result->retval;
+
+ $unterbrecher_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->start,
+ 'bis' => $item->ende
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $unterbrecher_data,
+ 'typeId' => 'prestudent_id'
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->PrestudentstatusModel->addSelect('prestudent_id');
+ $this->ci->PrestudentstatusModel->addSelect('start as von');
+ $this->ci->PrestudentstatusModel->addSelect('ende as bis');
+
+ $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $result = $this->ci->PrestudentstatusModel-> loadWhere(array(
+ 'status_kurzbz' => 'Unterbrecher',
+ 'studiensemester_kurzbz' => $semester,
+ 'prestudent_id' => $prestudent_id
+ ));
+
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CoreWiederholerTagLib.php b/application/libraries/tags/CoreWiederholerTagLib.php
new file mode 100644
index 000000000..8f4eb1dd7
--- /dev/null
+++ b/application/libraries/tags/CoreWiederholerTagLib.php
@@ -0,0 +1,76 @@
+ci = get_instance();
+ $this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $result = $this->ci->PrestudentstatusModel-> loadWhere(array(
+ 'statusgrund_id' => 16,
+ 'studiensemester_kurzbz' => $semester
+ ));
+ $data = $result->retval;
+
+ $wiederholer_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->start,
+ 'bis' => $item->ende
+ ];
+ }, $data);
+
+ return (object) array(
+ 'typeId' => 'prestudent_id',
+ 'data' => $wiederholer_data
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->PrestudentstatusModel->addSelect('prestudent_id');
+ $this->ci->PrestudentstatusModel->addSelect('start as von');
+ $this->ci->PrestudentstatusModel->addSelect('ende as bis');
+
+ $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+
+ $result = $this->ci->PrestudentstatusModel->loadWhere(array(
+ 'statusgrund_id' => 16,
+ 'studiensemester_kurzbz' => $semester,
+ 'prestudent_id' => $prestudent_id,
+ ));
+
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+}
diff --git a/application/libraries/treemenu/LvVwLib.php b/application/libraries/treemenu/LvVwLib.php
new file mode 100644
index 000000000..d3c91a196
--- /dev/null
+++ b/application/libraries/treemenu/LvVwLib.php
@@ -0,0 +1,192 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * LvVw Menu library
+ */
+class LvVwLib
+{
+ protected $_ci = null;
+
+ public $config = [];
+
+ public function __construct()
+ {
+ // Get code igniter instance
+ $this->_ci =& get_instance();
+
+ // Load Tree-config
+ $this->_ci->load->config('treemenu/custom/lvvw');
+ $this->config = $this->_ci->config->item('root');
+
+ // Load Libraries
+ $this->_ci->load->library('treemenu/base/StgLib');
+
+ // Load Model
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ }
+
+ public function stg($path_template)
+ {
+ $permittedStgs = $this->getPermittedStudiengangKzs();
+
+ if (!$permittedStgs)
+ return [];
+
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" .
+ '"type": "verband",' .
+ '"id": "lv/%1$s",' .
+ '"gruppe_kurzbz": null,' .
+ '"semester": null,' .
+ '"verband": null,' .
+ '"gruppe": null,' .
+ '"lehrverband": true,' .
+ '"stg_kz": "%1$s"' .
+ "}', studiengang_kz)] AS draggable", false);
+
+ return $this->_ci->stglib->studiengang($path_template, $permittedStgs);
+ }
+
+ public function semester($path_template, $has_children, $stg)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ if (!$has_children)
+ $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" .
+ '"type": "verband",' .
+ '"id": "lv/%1$s/%2$s",' .
+ '"gruppe_kurzbz": null,' .
+ '"semester": "%2$s",' .
+ '"verband": null,' .
+ '"gruppe": null,' .
+ '"lehrverband": true,' .
+ '"stg_kz": "%1$s"' .
+ "}', v.studiengang_kz, v.semester)] AS draggable", false);
+
+ return $this->_ci->stglib->semester($path_template, $stg->studiengang_kz);
+ }
+
+ public function verband($path_template, $stg, $semester)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ $this->_ci->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf");
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" .
+ '"type": "verband",' .
+ '"id": "lv/%1$s/%2$s/%3$s",' .
+ '"gruppe_kurzbz": null,' .
+ '"semester": "%2$s",' .
+ '"verband": "%3$s",' .
+ '"gruppe": null,' .
+ '"lehrverband": true,' .
+ '"stg_kz": "%1$s"' .
+ "}', v.studiengang_kz, v.semester, v.verband)] AS draggable", false);
+ $this->_ci->StudiengangModel->addGroupBy('v.studiengang_kz, v.semester');
+
+ return $this->_ci->stglib->verband($path_template, $stg->studiengang_kz, $semester);
+ }
+
+ public function group($path_template, $stg, $semester, $verband)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
+
+ if ($verband === null) {
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" .
+ '"type": "verband",' .
+ '"id": "grp/%1$s/%2$s/%3$s",' .
+ '"gruppe_kurzbz": "%3$s",' .
+ '"semester": "%2$s",' .
+ '"verband": null,' .
+ '"gruppe": null,' .
+ '"lehrverband": false,' .
+ '"stg_kz": "%1$s"' .
+ "}', studiengang_kz, semester, gruppe_kurzbz)] AS draggable", false);
+
+ return $this->_ci->stglib->group($path_template, $stg->studiengang_kz, $semester);
+ }
+
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" .
+ '"type": "verband",' .
+ '"id": "lv/%1$s/%2$s/%3$s/%4$s",' .
+ '"gruppe_kurzbz": null,' .
+ '"semester": "%2$s",' .
+ '"verband": "%3$s",' .
+ '"gruppe": "%4$s",' .
+ '"lehrverband": true,' .
+ '"stg_kz": "%1$s"' .
+ "}', v.studiengang_kz, v.semester, v.verband, v.gruppe)] AS draggable", false);
+
+ return $this->_ci->stglib->verbandsgroup($path_template, $stg->studiengang_kz, $semester, $verband);
+ }
+
+ public function orgform($path_template, $stg)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ if (!$stg->mischform)
+ return [];
+
+ $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
+
+ return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz);
+ }
+
+ protected function getPermittedStudiengangKzs()
+ {
+ $permittedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('admin') ?: [];
+ $permittedStgs = array_merge($permittedStgs, $this->_ci->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
+
+ return $permittedStgs;
+ }
+
+ protected function getStgFromUrl($stg)
+ {
+ $permittedStgs = $this->getPermittedStudiengangKzs();
+
+ if (!$permittedStgs)
+ return null;
+
+ $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $permittedStgs);
+ $stg = $this->_ci->StudiengangModel->loadWhere([
+ 'LOWER(CONCAT(typ, kurzbz)) =' => $stg
+ ]);
+
+ if (!hasData($stg))
+ return null;
+
+ return current(getData($stg));
+ }
+}
diff --git a/application/libraries/treemenu/StudVwLib.php b/application/libraries/treemenu/StudVwLib.php
new file mode 100644
index 000000000..ee3e2cbdc
--- /dev/null
+++ b/application/libraries/treemenu/StudVwLib.php
@@ -0,0 +1,257 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * StudVw Menu library
+ */
+class StudVwLib
+{
+ protected $_ci = null;
+
+ public $config = [];
+
+ public $redirect_method = [
+ 'interessenten' => 'filter',
+ 'bewerbungnichtabgeschickt' => 'filter',
+ 'bewerbungabgeschickt' => 'filter',
+ 'zgv' => 'filter',
+ 'statusbestaetigt' => 'filter',
+ 'statusbestaetigtrtnichtangemeldet' => 'filter',
+ 'statusbestaetigtrtangemeldet' => 'filter',
+ 'reihungstestnichtangemeldet' => 'filter',
+ 'reihungstestangemeldet' => 'filter',
+ 'bewerber' => 'filter',
+ 'bewerberrtnichtangemeldet' => 'filter',
+ 'bewerberrtangemeldet' => 'filter',
+ 'bewerberrtangemeldetteilgenommen' => 'filter',
+ 'bewerberrtangemeldetnichtteilgenommen' => 'filter',
+ 'aufgenommen' => 'filter',
+ 'warteliste' => 'filter',
+ 'absage' => 'filter',
+ 'outgoing' => 'inout',
+ 'shared_studies' => 'inout'
+ ];
+
+ public function __construct()
+ {
+ // Get code igniter instance
+ $this->_ci =& get_instance();
+
+ // Load Tree-config
+ $this->_ci->load->config('treemenu/stg_base');
+ $this->config = $this->_ci->config->item('root');
+
+ // Load Libraries
+ $this->_ci->load->library('treemenu/base/StgLib');
+
+ // Load Model
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ }
+
+ public function stg($path_template)
+ {
+ $permittedStgs = $this->getPermittedStudiengangKzs();
+
+ if (!$permittedStgs)
+ return [];
+
+ return $this->_ci->stglib->studiengang($path_template, $permittedStgs);
+ }
+
+ public function prestudent($path_template, $stg)
+ {
+ // Check permission
+ if ($this->getStgFromUrl($stg) === null)
+ return [];
+
+ return [
+ [
+ 'path' => sprintf($path_template, '1'),
+ 'name' => ['lehre', 'prestudent'],
+ 'no_sem_reload' => true
+ ]
+ ];
+ }
+
+ public function stdsem($path_template, $stg)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ return $this->_ci->stglib->studiensemester($path_template, $stg->studiengang_kz);
+ }
+
+ public function semester($path_template, $stg, $orgform)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ if ($orgform !== null) {
+ $orgform = $this->getOrgform($orgform);
+ if ($orgform === null)
+ return [];
+ $orgform = $orgform->orgform_kurzbz;
+ }
+
+ return $this->_ci->stglib->semester($path_template, $stg->studiengang_kz, $orgform);
+ }
+
+ public function verband($path_template, $stg, $semester, $orgform)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ if ($orgform !== null) {
+ $orgform = $this->getOrgform($orgform);
+ if ($orgform === null)
+ return [];
+ $orgform = $orgform->orgform_kurzbz;
+ }
+
+ $this->_ci->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf");
+
+ return $this->_ci->stglib->verband($path_template, $stg->studiengang_kz, $semester, $orgform);
+ }
+
+ public function group($path_template, $stg, $semester, $verband, $orgform)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ if ($orgform !== null) {
+ $orgform = $this->getOrgform($orgform);
+ if ($orgform === null)
+ return [];
+ $orgform = $orgform->orgform_kurzbz;
+ }
+
+ $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
+
+ if ($verband === null)
+ return $this->_ci->stglib->group($path_template, $stg->studiengang_kz, $semester, $orgform);
+
+ return $this->_ci->stglib->verbandsgroup($path_template, $stg->studiengang_kz, $semester, $verband, $orgform);
+ }
+
+ public function orgform($path_template, $stg)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ if (!$stg->mischform)
+ return [];
+
+ return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz);
+ }
+
+ public function incoming($has_children, $path_template, $stg)
+ {
+ if ($stg === null)
+ return $this->inout('incoming', $has_children, $path_template);
+
+ return $this->filter('incoming', $has_children, $path_template, $stg);
+ }
+
+ public function filter($original_method, $has_children, $path_template, $stg)
+ {
+ $stg = $this->getStgFromUrl($stg);
+
+ if ($stg === null)
+ return [];
+
+ // TODO(chris): phrasen
+ $item = [
+ 'path' => sprintf($path_template, '1'),
+ 'name' => ['treemenu', 'filter_' . $original_method]
+ ];
+
+ if (!$has_children)
+ $item['leaf'] = true;
+
+ return [ $item ];
+ }
+
+ public function inout($original_method, $has_children, $path_template)
+ {
+ if (!$this->_ci->permissionlib->isBerechtigt('inout/uebersicht'))
+ return [];
+
+ // TODO(chris): phrasen
+ $item = [
+ 'path' => sprintf($path_template, '1'),
+ 'name' => ['treemenu', 'inout_' . $original_method]
+ ];
+
+ if (!$has_children)
+ $item['leaf'] = true;
+
+ return [ $item ];
+ }
+
+ protected function getOrgform($orgform)
+ {
+ $this->_ci->load->model('codex/Orgform_model', 'OrgformModel');
+ $orgform = $this->_ci->OrgformModel->loadWhere([
+ 'LOWER(orgform_kurzbz) =' => $orgform
+ ]);
+
+ if (!hasData($orgform))
+ return null;
+
+ return current(getData($orgform));
+ }
+
+ protected function getPermittedStudiengangKzs()
+ {
+ $permittedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('admin') ?: [];
+ $permittedStgs = array_merge($permittedStgs, $this->_ci->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
+
+ return $permittedStgs;
+ }
+
+ protected function getStgFromUrl($stg)
+ {
+ $permittedStgs = $this->getPermittedStudiengangKzs();
+
+ if (!$permittedStgs)
+ return null;
+
+ $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $permittedStgs);
+ $stg = $this->_ci->StudiengangModel->loadWhere([
+ 'LOWER(CONCAT(typ, kurzbz)) =' => $stg
+ ]);
+
+ if (!hasData($stg))
+ return null;
+
+ return current(getData($stg));
+ }
+}
diff --git a/application/libraries/treemenu/base/StgLib.php b/application/libraries/treemenu/base/StgLib.php
new file mode 100644
index 000000000..84665639d
--- /dev/null
+++ b/application/libraries/treemenu/base/StgLib.php
@@ -0,0 +1,313 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * Stg Base library
+ */
+class StgLib
+{
+ protected $_ci = null;
+
+ public function __construct()
+ {
+ // Get code igniter instance
+ $this->_ci =& get_instance();
+ }
+
+ public function studiengang($path_template, $permittedStgs = [])
+ {
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
+
+ $this->_ci->StudiengangModel->addDistinct();
+ $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($path_template) . ", LOWER(CONCAT(typ, kurzbz))) AS path");
+ $this->_ci->StudiengangModel->addSelect(
+ "CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name",
+ false
+ );
+ $this->_ci->StudiengangModel->addSelect("studiengang_kz AS title");
+ $this->_ci->StudiengangModel->addSelect("studiengang_kz AS search");
+ $this->_ci->StudiengangModel->addSelect('erhalter_kz');
+ $this->_ci->StudiengangModel->addSelect('typ');
+ $this->_ci->StudiengangModel->addSelect('kurzbz');
+ $this->_ci->StudiengangModel->addSelect('studiengang_kz');
+ $this->_ci->StudiengangModel->addSelect('studiengang_kz AS stg_kz');
+
+ $this->_ci->StudiengangModel->addOrder('erhalter_kz');
+ $this->_ci->StudiengangModel->addOrder('typ');
+ $this->_ci->StudiengangModel->addOrder('kurzbz');
+
+ if ($permittedStgs)
+ $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $permittedStgs);
+
+ $result = $this->_ci->StudiengangModel->loadWhere(['v.aktiv' => true]);
+
+ return getData($result) ?: [];
+ }
+
+ public function semester($path_template, $studiengang_kz, $orgform_kurzbz = null)
+ {
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
+
+ $this->_ci->StudiengangModel->addDistinct();
+ $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($path_template) . ", semester) AS path", false);
+ $this->_ci->StudiengangModel->addSelect("CONCAT(
+ UPPER(CONCAT(typ, kurzbz)),
+ '-',
+ semester,
+ (
+ SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END
+ FROM public.tbl_lehrverband
+ WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester
+ ORDER BY verband, gruppe LIMIT 1
+ )
+ ) AS name", false);
+
+ $this->_ci->StudiengangModel->addSelect('semester');
+ $this->_ci->StudiengangModel->addSelect('v.studiengang_kz AS stg_kz');
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink");
+
+ $this->_ci->StudiengangModel->addOrder('semester');
+
+ if ($orgform_kurzbz !== null) {
+ $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($orgform_kurzbz) . " AS orgform_kurzbz", false);
+ $this->_ci->StudiengangModel->addDistinct();
+ $this->_ci->StudiengangModel->db->group_start();
+ $this->_ci->StudiengangModel->db->where('v.semester', 0);
+ $this->_ci->StudiengangModel->db->or_where('v.orgform_kurzbz', $orgform_kurzbz);
+ $this->_ci->StudiengangModel->db->group_end();
+ }
+
+ $result = $this->_ci->StudiengangModel->loadWhere([
+ 'studiengang_kz' => $studiengang_kz,
+ 'v.aktiv' => true
+ ]);
+
+
+ return getData($result) ?: [];
+ }
+
+ public function group($path_template, $studiengang_kz, $semester, $orgform_kurzbz = null)
+ {
+ $this->_ci->load->model('organisation/Gruppe_model', 'GruppeModel');
+
+ $this->_ci->GruppeModel->addDistinct();
+ $this->_ci->GruppeModel->addSelect("FORMAT(" . $this->_ci->GruppeModel->escape($path_template) . ", gruppe_kurzbz) AS path", false);
+ $this->_ci->GruppeModel->addSelect("CONCAT(gruppe_kurzbz, ' (', bezeichnung, ')') AS name", false);
+
+ $this->_ci->GruppeModel->addSelect('sort');
+ $this->_ci->GruppeModel->addSelect('gruppe_kurzbz');
+ $this->_ci->GruppeModel->addSelect($this->_ci->GruppeModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
+ $this->_ci->GruppeModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink");
+
+ $this->_ci->GruppeModel->addOrder('sort');
+ $this->_ci->GruppeModel->addOrder('gruppe_kurzbz');
+
+ $where = [
+ 'studiengang_kz' => $studiengang_kz,
+ 'semester' => $semester,
+ 'lehre' => true,
+ 'sichtbar' => true,
+ 'aktiv' => true,
+ 'direktinskription' => false
+ ];
+
+ if ($orgform_kurzbz !== null)
+ $where['orgform_kurzbz'] = $orgform_kurzbz;
+
+ $result = $this->_ci->GruppeModel->loadWhere($where);
+
+ return getData($result) ?: [];
+ }
+
+ public function verband($path_template, $studiengang_kz, $semester, $orgform_kurzbz = null)
+ {
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
+
+ $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($path_template) . ", verband) AS path", false);
+ $this->_ci->StudiengangModel->addSelect("CONCAT(
+ UPPER(CONCAT(typ, kurzbz)),
+ '-',
+ semester,
+ verband,
+ (
+ SELECT
+ CASE
+ WHEN bezeichnung IS NULL OR bezeichnung=''
+ THEN ''::TEXT
+ ELSE CONCAT(' (', bezeichnung, ')')
+ END
+ FROM public.tbl_lehrverband
+ WHERE studiengang_kz=v.studiengang_kz
+ AND semester=v.semester
+ AND verband=v.verband
+ ORDER BY gruppe
+ LIMIT 1
+ )
+ ) AS name", false);
+
+ $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($semester) . ' AS semester');
+ $this->_ci->StudiengangModel->addSelect('verband');
+ $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink");
+
+ $this->_ci->StudiengangModel->addOrder('verband');
+
+ $this->_ci->StudiengangModel->addGroupBy('path, name, verband');
+
+ $where = [
+ 'v.studiengang_kz' => $studiengang_kz,
+ 'v.semester' => $semester,
+ 'v.verband !=' => '',
+ 'v.aktiv' => true
+ ];
+
+ if ($orgform_kurzbz !== null && $semester) // NOTE(chris): on semester 0 show all?
+ $where['v.orgform_kurzbz'] = $orgform_kurzbz;
+
+ $result = $this->_ci->StudiengangModel->loadWhere($where);
+
+ return getData($result) ?: [];
+ }
+
+ public function verbandsgroup($path_template, $studiengang_kz, $semester, $verband, $orgform_kurzbz = null)
+ {
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
+
+ $this->_ci->StudiengangModel->addDistinct();
+ $this->_ci->StudiengangModel->addSelect("FORMAT(
+ " . $this->_ci->StudiengangModel->escape($path_template) . ",
+ gruppe
+ ) AS path", false);
+ $this->_ci->StudiengangModel->addSelect("CONCAT(
+ UPPER(CONCAT(typ, kurzbz)),
+ '-',
+ semester,
+ verband,
+ gruppe,
+ (
+ SELECT
+ CASE
+ WHEN bezeichnung IS NULL OR bezeichnung=''
+ THEN ''::TEXT
+ ELSE CONCAT(' (', bezeichnung, ')')
+ END
+ FROM public.tbl_lehrverband
+ WHERE studiengang_kz=v.studiengang_kz
+ AND semester=v.semester
+ AND verband=v.verband
+ AND gruppe=v.gruppe
+ ORDER BY gruppe
+ LIMIT 1
+ )
+ ) AS name", false);
+
+ $this->_ci->StudiengangModel->addSelect('v.semester');
+ $this->_ci->StudiengangModel->addSelect('v.verband');
+ $this->_ci->StudiengangModel->addSelect('gruppe');
+ $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
+ $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink");
+
+ $this->_ci->StudiengangModel->addOrder('gruppe');
+
+ $where = [
+ 'v.studiengang_kz' => $studiengang_kz,
+ 'v.semester' => $semester,
+ 'v.verband' => $verband,
+ 'v.gruppe !=' => '',
+ 'v.aktiv' => true
+ ];
+
+ if ($orgform_kurzbz !== null && $semester) // NOTE(chris): on semester 0 show all?
+ $where['v.orgform_kurzbz'] = $orgform_kurzbz;
+
+ $result = $this->_ci->StudiengangModel->loadWhere($where);
+
+ return getData($result) ?: [];
+ }
+
+ public function orgform($path_template, $studiengang_kz)
+ {
+ $this->_ci->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
+
+ $this->_ci->StudienordnungModel->addDistinct();
+ $this->_ci->StudienordnungModel->addSelect("FORMAT(
+ " . $this->_ci->StudienordnungModel->escape($path_template) . ",
+ LOWER(p.orgform_kurzbz)
+ ) AS path");
+ $this->_ci->StudienordnungModel->addSelect("p.orgform_kurzbz AS name");
+ $this->_ci->StudienordnungModel->addSelect("studiengang_kz AS stg_kz");
+
+ $this->_ci->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id');
+
+ $result = $this->_ci->StudienordnungModel->loadWhere([
+ 'aktiv' => true,
+ 'studiengang_kz' => $studiengang_kz,
+ 'p.orgform_kurzbz !=' => 'DDP'
+ ]);
+
+
+ return getData($result) ?: [];
+ }
+
+ public function studiensemester($path_template, $studiengang_kz)
+ {
+ $number_displayed_past_studiensemester = null;
+
+ $this->_ci->load->model('system/Variable_model', 'VariableModel');
+
+ $result = $this->_ci->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']);
+ if (isError($result))
+ return [];
+
+ $data = getData($result);
+ if ($data && isset($data['number_displayed_past_studiensemester'])) {
+ $number_displayed_past_studiensemester = $data['number_displayed_past_studiensemester'];
+ } else {
+ $this->_ci->load->config('stv');
+ $number_displayed_past_studiensemester = $this->_ci->config->item('number_displayed_past_studiensemester_default');
+ }
+
+ $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ $this->_ci->StudiensemesterModel->addPlusMinus(null, $number_displayed_past_studiensemester);
+
+ $this->_ci->StudiensemesterModel->addSelect("studiensemester_kurzbz AS name");
+ $this->_ci->StudiensemesterModel->addSelect("FORMAT(
+ " . $this->_ci->StudiensemesterModel->escape($path_template) . ",
+ LOWER(studiensemester_kurzbz)
+ ) AS path", false);
+ $this->_ci->StudiensemesterModel->addSelect($this->_ci->StudiensemesterModel->escape($studiengang_kz) . " AS stg_kz", false);
+
+ $this->_ci->StudiensemesterModel->addOrder('ende');
+
+ $result = $this->_ci->StudiensemesterModel->load();
+
+ return getData($result) ?: [];
+ }
+}
diff --git a/application/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/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/education/Lehreinheit_model.php b/application/models/education/Lehreinheit_model.php
index fed5b9d23..8a242cf2a 100644
--- a/application/models/education/Lehreinheit_model.php
+++ b/application/models/education/Lehreinheit_model.php
@@ -719,7 +719,7 @@ EOSQL;
return "tag_data_agg AS (
SELECT
lehreinheit_id,
- COALESCE(json_agg(tag ORDER BY done), '[]'::json) AS tags
+ COALESCE(json_agg(tag ORDER BY done, prioritaet), '[]'::json) AS tags
FROM (
SELECT DISTINCT ON (public.tbl_notiz.notiz_id)
tbl_notiz.notiz_id AS id,
@@ -728,7 +728,9 @@ EOSQL;
text AS notiz,
style,
erledigt AS done,
- lehreinheit_id
+ lehreinheit_id,
+ prioritaet,
+ automatisiert
FROM public.tbl_notizzuordnung
JOIN public.tbl_notiz ON tbl_notizzuordnung.notiz_id = tbl_notiz.notiz_id
JOIN public.tbl_notiz_typ ON tbl_notiz.typ = tbl_notiz_typ.typ_kurzbz
diff --git a/application/models/education/Lehreinheitgruppe_model.php b/application/models/education/Lehreinheitgruppe_model.php
index dee8bbfe1..139d639cb 100644
--- a/application/models/education/Lehreinheitgruppe_model.php
+++ b/application/models/education/Lehreinheitgruppe_model.php
@@ -341,7 +341,7 @@ class Lehreinheitgruppe_model extends DB_Model
$this->db->where('lehreinheit_id', $lehreinheit_id);
$this->db->where('studiengang_kz', $gruppen_array->studiengang_kz);
- if (!isEmptyString($gruppen_array->semester))
+ if (!isEmptyString((string)$gruppen_array->semester))
{
$this->db->where('semester', $gruppen_array->semester);
}
@@ -444,30 +444,37 @@ class Lehreinheitgruppe_model extends DB_Model
)
ELSE tbl_gruppe.beschreibung
END AS beschreibung");
- $this->addSelect("CASE
- WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN
- (
- SELECT EXISTS (
- SELECT 1
- FROM lehre.tbl_stundenplandev
- WHERE lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
- AND studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
- AND semester = tbl_lehreinheitgruppe.semester
- AND TRIM(COALESCE(verband, '')) = TRIM(tbl_lehreinheitgruppe.verband)
- AND TRIM(COALESCE(gruppe, '')) = TRIM(tbl_lehreinheitgruppe.gruppe)
- AND (gruppe_kurzbz IS NULL OR gruppe_kurzbz = '')
- )
- )
- ELSE
+ $this->addSelect("
+ CASE
+ WHEN trim(COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, '')) = '' THEN
(
SELECT EXISTS (
SELECT 1
- FROM lehre.tbl_stundenplandev
- WHERE lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
- AND gruppe_kurzbz = tbl_lehreinheitgruppe.gruppe_kurzbz
+ FROM lehre.tbl_stundenplandev sp
+ WHERE sp.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
+ AND sp.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
+ AND sp.semester = tbl_lehreinheitgruppe.semester
+ AND trim(COALESCE(sp.verband, '')) = trim(COALESCE(tbl_lehreinheitgruppe.verband, ''))
+ AND trim(COALESCE(sp.gruppe, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe, ''))
+ AND trim(COALESCE(sp.gruppe_kurzbz, '')) = ''
)
)
- END AS verplant");
+ ELSE
+ (
+ SELECT EXISTS (
+ SELECT 1
+ FROM lehre.tbl_stundenplandev sp
+ WHERE sp.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
+ AND sp.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
+ AND sp.semester = tbl_lehreinheitgruppe.semester
+ AND trim(COALESCE(sp.verband, '')) = trim(COALESCE(tbl_lehreinheitgruppe.verband, ''))
+ AND trim(COALESCE(sp.gruppe, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe, ''))
+ AND trim(COALESCE(sp.gruppe_kurzbz, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, ''))
+ )
+ )
+ END AS verplant
+ ");
+
$this->addJoin('tbl_studiengang', 'studiengang_kz', 'LEFT');
$this->addJoin('public.tbl_gruppe', 'gruppe_kurzbz', 'LEFT');
diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php
index 9e08e0d56..3b94ab3bd 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 44645e75b..c7d9ea3df 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/Studierendenantrag_model.php b/application/models/education/Studierendenantrag_model.php
index 40224ffc9..c18d18053 100644
--- a/application/models/education/Studierendenantrag_model.php
+++ b/application/models/education/Studierendenantrag_model.php
@@ -188,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
@@ -242,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');
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/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php
index e9c7f06d3..8aee8f65e 100644
--- a/application/models/organisation/Studiensemester_model.php
+++ b/application/models/organisation/Studiensemester_model.php
@@ -229,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 dfed7c332..52236ba7c 100644
--- a/application/models/person/Benutzerfunktion_model.php
+++ b/application/models/person/Benutzerfunktion_model.php
@@ -348,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/Reservierung_model.php b/application/models/ressource/Reservierung_model.php
index 461a009b0..d1c4e683b 100644
--- a/application/models/ressource/Reservierung_model.php
+++ b/application/models/ressource/Reservierung_model.php
@@ -137,4 +137,15 @@ class Reservierung_model extends DB_Model
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 997451243..1eddd2e2f 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
*
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 c7dc9dfff..d67ab361c 100644
--- a/application/models/ressource/Zeitsperre_model.php
+++ b/application/models/ressource/Zeitsperre_model.php
@@ -187,4 +187,39 @@ class Zeitsperre_model extends DB_Model
return $result;
}
+
+ 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/views/LVVerwaltung.php b/application/views/LVVerwaltung.php
index 4cebae839..42d4631f1 100644
--- a/application/views/LVVerwaltung.php
+++ b/application/views/LVVerwaltung.php
@@ -31,6 +31,8 @@
lv-root="= site_url('LVVerwaltung'); ?>"
:permissions="= htmlspecialchars(json_encode($permissions));?>"
:config="= htmlspecialchars(json_encode($configs)); ?>"
+ avatar-url="= site_url('Cis/Pub/bild/person/' . getAuthPersonId()); ?>"
+ logout-url="= site_url('Cis/Auth/logout'); ?>"
>
diff --git a/application/views/Studentenverwaltung.php b/application/views/Studentenverwaltung.php
index 8dd2dd93d..5b6138ff8 100644
--- a/application/views/Studentenverwaltung.php
+++ b/application/views/Studentenverwaltung.php
@@ -56,12 +56,13 @@ $configArray = [
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/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');
+?>
+