diff --git a/.gitignore b/.gitignore index 84957a801..7688849af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ documents/ vendor/ +public/vendor /nbproject/ .vscode diff --git a/application/config/abgabe.php b/application/config/abgabe.php index 90aedbd8b..dd059d047 100644 --- a/application/config/abgabe.php +++ b/application/config/abgabe.php @@ -29,7 +29,7 @@ $config['ALLOWED_NOTEN_ABGABETOOL'] = [10, 14]; // tbl_note pk // benotete projektarbeiten sperren weitere terminanlage & bearbeitung, diese noten sind ausnahmen dieser Regel // wie zB "Nicht beurteilt" & "Noch nicht eingetragen" $config['NONFINAL_NOTEN_ABGABETOOL'] = [9]; -$config['beurteilung_link_fallback'] = 'addons/fhtw/content/projektbeurteilung/projektbeurteilungDocumentExport.php?projektarbeit_id=?&betreuerart_kurzbz=?&person_id=?'; +$config['beurteilung_link_fallback'] = 'cis/private/lehre/projektbeurteilungDocumentExport.php?projektarbeit_id=?&betreuerart_kurzbz=?&person_id=?'; $config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter'; $config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ZWEITBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter'; @@ -38,8 +38,19 @@ $config['SIGNATUR_CHECK_PAABGABETYPEN'] = ['end']; // to be used as "https://moodle.technikum-wien.at/course/view.php?idnumber=dl{$stg_kz}" for stg specific moodle routing $config['STG_MOODLE_LINK'] = 'https://moodle.technikum-wien.at/course/view.php?idnumber=dl'; +// TODO: check if these links change if the file changes and how to better retrieve the link? +$config['SIGNATUR_INFO_LINK_GERMAN'] = 'https://cis.technikum-wien.at/cms/dms.php?id=214779'; +$config['SIGNATUR_INFO_LINK_ENGLISH'] = 'https://cis.technikum-wien.at/cms/dms.php?id=264256'; $config['ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'] = true; $config['ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'] = true; $config['BETREUER_SAMMELMAIL_BUTTON_STUDENT'] = true; + +$config['MULTIEDIT_TABLE'] = true; + +$config['STUDENT_EDIT_PROJEKTARBEIT_TITLE'] = true; + +$config['CONFETTI_ON_ENDUPLOAD'] = true; + + diff --git a/application/config/lvverwaltung.php b/application/config/lvverwaltung.php index 4fe09bff3..d315c9b38 100644 --- a/application/config/lvverwaltung.php +++ b/application/config/lvverwaltung.php @@ -8,4 +8,15 @@ $config['lvverwaltung_tags'] = [ ]; */ -$config['lvverwaltung_tags'] = []; \ No newline at end of file +$config['lvverwaltung_tags'] = []; + +# Additional columns: +/* +$config["list_columns"] = [ + 'fieldname' => [ + 'js' => 'path/to/snippet.js', // tabulator config snippet (eg: return { name: 'Name', field: 'fieldname' }; ) + // NOTE: 'default' & 'joins' like in stv.php config are currently not available here + ] +]; +*/ + diff --git a/application/config/navigation.php b/application/config/navigation.php index 4d4dcc22a..cd71b02ca 100644 --- a/application/config/navigation.php +++ b/application/config/navigation.php @@ -170,6 +170,13 @@ $config['navigation_header'] = array( 'expand' => true, 'sort' => 51, 'requiredPermissions' => 'vertrag/mitarbeiter:r' + ), + 'studierendenverwaltung' => array( + 'link' => site_url('studentenverwaltung'), + 'description' => 'Studierendenverwaltung', + 'expand' => true, + 'sort' => 52, + 'requiredPermissions' => ['admin:r', 'assistenz:r'] ) ) ), @@ -378,7 +385,7 @@ $config['navigation_menu']['apps'] = [ ], 'lav' => [ 'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'), - 'description' => 'Lehraufträge', + 'description' => 'Lehrauftragsverwaltung', #'icon' => 'person-chalkboard', 'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:r') ] diff --git a/application/config/routes.php b/application/config/routes.php index aa4ba9db8..bb0b0f65e 100644 --- a/application/config/routes.php +++ b/application/config/routes.php @@ -64,6 +64,9 @@ $route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1'; $route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1'; $route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1'; $route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1'; +$route['Cis/OtherLvPlan/.*'] = 'Cis/OtherLvPlan/index/$1'; +//Route for LV Plan Stg/Semester/Verband/Gruppe +$route['Cis/StgOrgLvPlan/.*'] = 'Cis/StgOrgLvPlan/index/$1'; $route['Abgabetool/Assistenz'] = 'Cis/Abgabetool/Assistenz'; $route['Abgabetool/Assistenz/(:any)'] = 'Cis/Abgabetool/Assistenz/$1'; @@ -72,52 +75,67 @@ $route['Abgabetool/Student'] = 'Cis/Abgabetool/Student'; $route['Abgabetool/Student/(:any)'] = 'Cis/Abgabetool/Student/$1'; $route['Abgabetool/Deadlines'] = 'Cis/Abgabetool/Deadlines'; +// Studierendenverwaltung App Routes +$route['studvw'] = 'studentenverwaltung/index'; +$route['studvw/.*'] = 'studentenverwaltung/index'; +// Old routes +$route['studentenverwaltung'] = 'redirect/301/studvw'; +$route['studentenverwaltung/(:any)'] = 'redirect/301/studvw/stdsem/$1'; +$route['studentenverwaltung/(:any)/(prestudent|student|person|search)/(:any)'] = 'redirect/301/studvw/stdsem/$1/$2/$3'; +$route['studentenverwaltung/(:any)/prestudent/(:any)/tab/:any'] = 'redirect/301/studvw/stdsem/$1/prestudent/$2'; +$route['studentenverwaltung/(:any)/search/(:any)/(:any)'] = 'redirect/301/studvw/stdsem/$1/search/$2/$3'; +$route['studentenverwaltung/(:any)/(:any)'] = 'redirect/301/studvw/stdsem/$1/stg/$2'; + // Studierendenverwaltung List Routes -$route['api/frontend/v1/stv/[sS]tudents/inout'] = 'api/frontend/v1/stv/Students/index'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/index'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/incoming/1'] = 'api/frontend/v1/stv/students/getIncoming/$1'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/outgoing/1'] = 'api/frontend/v1/stv/students/getOutgoing/$1'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/inout/1/shared_studies/1'] = 'api/frontend/v1/stv/students/getGemeinsamestudien/$1'; -// (studiensemester_kurzbz)/inout[/(incoming|outgoing|gemeinsamestudien)] -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout'] = 'api/frontend/v1/stv/Students/index'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/incoming'] = 'api/frontend/v1/stv/Students/getIncoming/$1'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/outgoing'] = 'api/frontend/v1/stv/Students/getOutgoing/$1'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/gemeinsamestudien'] = 'api/frontend/v1/stv/Students/getGemeinsamestudien/$1'; +$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/:any/1/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3'; +$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3'; +$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2/$3'; +$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1/stdsem/(:any)'] = 'api/frontend/v1/stv/students/getPrestudents/$1/$2'; +$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/prestudent/1'] = 'api/frontend/v1/stv/students/getPrestudents/$1'; -// (studiengang_kz)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]] -$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudents/$1'; -$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2'; -$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2/$3'; -$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent/([WS]S[0-9]{4})/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2/$4'; +$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/:any/1/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4'; +$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/:any/1/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4'; +$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)/(:any)/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3/$4'; +$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1/stdsem/(:any)'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2/$3'; +$route['api/frontend/v1/treemenudata/stv/stdsem/:any/stg/(:any)/orgform/(:any)/prestudent/1'] = 'api/frontend/v1/stv/students/getPrestudentsOrgform/$1/$2'; -// (studiengang_kz)/(orgform)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]] -$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2'; -$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3'; -$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3/$4'; -$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3/$5'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/verband/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3/$4/$5'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/verband/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3/$4'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2/$3'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/stv/students/getStudents/$1/$2'; -// (studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe) -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/grp/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsSpezialgruppe/$1/$2/$3/$4'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/verband/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4/$5/$6'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/verband/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4/$5'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3/$4'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgform/$1/$2/$3'; -// (studiensemester_kurzbz)/(studiengang_kz)[/(semester)[/(verband)[/(gruppe)]]] -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/(:any)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3/$4'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/(:num)/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3/$4/$5'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/semester/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsSpezialgruppe/$1/$2/$3/$4'; -// (studiensemester_kurzbz)/(studiengang_kz)/(orgform)/(semester)/grp/(gruppe) -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/grp/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgformSpezialgruppe/$1/$2/$3/$4/$5'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/group/(:any)'] = 'api/frontend/v1/stv/students/getStudentsOrgformSpezialgruppe/$1/$3/$2/$4/$5'; -// (studiensemester_kurzbz)/(studiengang_kz)/(orgform)[/(semester)[/(verband)[/(gruppe)]]] -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4/$5'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(-?[0-9]+)/([A-Z]{2,3})/(:num)/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4/$5/$6'; +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/prestudent/(:any)'] = 'api/frontend/v1/stv/students/getPrestudent/$1/$2'; + +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/student/(:any)'] = 'api/frontend/v1/stv/students/getStudent/$1/$2'; + +$route['api/frontend/v1/treemenudata/stv/stdsem/(:any)/person/(:any)'] = 'api/frontend/v1/stv/students/getPerson/$1/$2'; + +$route['api/frontend/v1/treemenudata/stv/.*'] = 'api/frontend/v1/stv/students/index'; + +// Lvverwaltung List Routes +$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2'; +$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3'; +$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3'; +$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3'; +$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3'; + +$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2'; +$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3'; +$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3'; -// // (studiensemester_kurzbz)/uid/(uid) -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/uid/(:any)'] = 'api/frontend/v1/stv/Students/getStudent/$1/$2'; -// // (studiensemester_kurzbz)/prestudent/(prestudent_id) -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/prestudent/(:num)'] = 'api/frontend/v1/stv/Students/getPrestudent/$1/$2'; -// // (studiensemester_kurzbz)/person/(person_id) -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/person/(:num)'] = 'api/frontend/v1/stv/Students/getPerson/$1/$2'; // load routes from extensions, also look for environment-specific configs $subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT . '/extensions']; diff --git a/application/config/searchcis.php b/application/config/searchcis.php index 12bad025d..6d513c499 100644 --- a/application/config/searchcis.php +++ b/application/config/searchcis.php @@ -22,8 +22,9 @@ unset($config['student']['searchfields']['email']); unset($config['student']['searchfields']['tel']); $config['student']['resultfields'] = [ "s.student_uid AS uid", - "s.matrikelnr", + "s.matrikelnr AS personenkennzeichen", "p.person_id", + "p.matr_nr AS matrikelnummer", "(p.vorname || ' ' || p.nachname) AS name", "ARRAY[s.student_uid || '@' || '" . DOMAIN . "'] AS email", "CASE diff --git a/application/config/studierendenantrag.php b/application/config/studierendenantrag.php index 4e25aef28..9d1e7a1c8 100644 --- a/application/config/studierendenantrag.php +++ b/application/config/studierendenantrag.php @@ -168,3 +168,40 @@ $config['stgkz_blacklist_wiederholung'] = []; * @var array An array of noten ids */ $config['note_blacklist_wiederholung'] = []; + +/** + * Enable/disable the Abmeldung StG process + * + * @var bool + */ +$config['abmeldung_stg_enabled'] = true; + +/** + * Enable/disable the Abmeldung process + * + * @var bool + */ +$config['abmeldung_enabled'] = true; + +/** + * Enable/disable the Unterbrecher process + * + * @var bool + */ +$config['unterbrechung_enabled'] = true; + +/** + * Enable/disable the Wiederholer process + * + * @var bool + */ +$config['wiederholung_enabled'] = true; + +/** + * Modal with Infotext of TLC + * if true, there will be shown an info modal in the studentsView after the first button ABMELDUNG + * + * @var boolean + */ +$config['showInfoModalAbmeldung'] = true; + diff --git a/application/config/stv.php b/application/config/stv.php index 34a30a96e..b12153eda 100644 --- a/application/config/stv.php +++ b/application/config/stv.php @@ -1,6 +1,27 @@ [ + 'js' => 'path/to/snippet.js', // tabulator config snippet (eg: return { name: 'Name', field: 'fieldname' }; ) + 'default' => "SQL SELECT statement for value", + 'joins' => [ + // additional joins needed for the SELECT statement above + [ + 'tablename', + 'join condition', // single fieldname for USING or full condition for ON + 'LEFT|RIGHT', // optional - join type + 'after_xxx|before_xxx|end' // optional - position in query + ] + // ... + ] + ] +]; +*/ + $config['tabs'] = [ 'details' => [ @@ -60,7 +81,13 @@ $config['tabs'] = ], 'notes' => [ //if true, the count of Messages will be shown in the header of the Tab Messages - 'showCountNotes' => true + 'showCountNotes' => true, + + //if true: section with following fields will be displayed: 'verfasser', 'bearbeiter', 'von', 'bis' and 'erledigt' + 'showErweitert' => false, + + //notizlayout: choose of "classicFas", "twoColumnsFormLeft", twoColumnsFormRight, popupModal" + 'notizLayout' => 'popupModal' ], 'combinePeople' => [ //multitab should only be shown with this length of selection @@ -133,13 +160,25 @@ $config['students_tab_order'] = [ $config['stv_prestudent_tags'] = [ 'prioone' => ['readonly' => false], - 'priotwo' => ['readonly' => true], + 'priotwo' => ['readonly' => false], 'hinweis' => ['readonly' => false], - 'hinweis_assistenz' => ['readonly' => true], - 'hinweis_kf' => ['readonly' => true], + 'hinweis_assistenz' => ['readonly' => false], + 'hinweis_kf' => ['readonly' => false], 'hinweis_lehrende' => ['readonly' => false], - 'hinweis_stg_kf' => ['readonly' => true], - 'finished_stg' => ['readonly' => true], - 'finished_kf' => ['readonly' => true], - 'inwork_kf' => ['readonly' => true], + 'hinweis_stg_kf' => ['readonly' => false], + 'finished_stg' => ['readonly' => false], + 'finished_kf' => ['readonly' => false], + 'inwork_kf' => ['readonly' => false], + 'dd_auto' => ['readonly' => true], + 'wh_auto' => ['readonly' => true], + 'prewh_auto' => ['readonly' => true], + 'out_auto' => ['readonly' => true], + 'zgv_auto' => ['readonly' => true], + 'unterbrecher_auto' => ['readonly' => true], + 'stbtr_erh_auto' => ['readonly' => true], + 'jgv_auto' => ['readonly' => true], + 'in_auto' => ['readonly' => true], + 'preabbr_auto' => ['readonly' => true], ]; + +$config['userAutomatedTags'] = 'sftest'; diff --git a/application/config/treemenu.php b/application/config/treemenu.php new file mode 100644 index 000000000..72a02947b --- /dev/null +++ b/application/config/treemenu.php @@ -0,0 +1,29 @@ +. + */ + +if (!defined('BASEPATH')) exit('No direct script access allowed'); + +$config['stv'] = [ + "library" => "treemenu/StudVwLib", + "permissions" => ["admin:r", "assistenz:r"] +]; +$config['lvv'] = [ + "library" => "treemenu/LvVwLib", + "permissions" => ["admin:r", "assistenz:r"] +]; diff --git a/application/config/treemenu/custom/lvvw.php b/application/config/treemenu/custom/lvvw.php new file mode 100644 index 000000000..977c0459e --- /dev/null +++ b/application/config/treemenu/custom/lvvw.php @@ -0,0 +1,32 @@ +. + */ + +if (!defined('BASEPATH')) exit('No direct script access allowed'); + +$config['root'] = [ + 'stg' => [ + 'semester' => [ + 'group', + 'verband' => [ + 'group' + ] + ], + 'orgform' + ] +]; diff --git a/application/config/treemenu/stg_base.php b/application/config/treemenu/stg_base.php new file mode 100644 index 000000000..fcb9748b7 --- /dev/null +++ b/application/config/treemenu/stg_base.php @@ -0,0 +1,65 @@ +. + */ + +if (!defined('BASEPATH')) exit('No direct script access allowed'); + +$config['root'] = [ + 'stg' => [ + 'prestudent' => [ + 'stdsem' => [ + 'interessenten' => [ + 'bewerbungnichtabgeschickt', + 'bewerbungabgeschickt', + 'zgv', + 'statusbestaetigt' => [ + 'statusbestaetigtrtnichtangemeldet', + 'statusbestaetigtrtangemeldet' + ], + 'reihungstestnichtangemeldet', + 'reihungstestangemeldet' + ], + 'bewerber' => [ + 'bewerberrtnichtangemeldet', + 'bewerberrtangemeldet' => [ + 'bewerberrtangemeldetteilgenommen', + 'bewerberrtangemeldetnichtteilgenommen' + ] + ], + 'aufgenommen', + 'warteliste', + 'absage', + 'incoming' + ] + ], + 'semester' => [ + 'group', + 'verband' => [ + 'group' + ] + ] + ], + 'inout' => [ + 'incoming', + 'outgoing', + 'shared_studies' + ] +]; + +// copy stg tree into stg/orgforms +$config['root']['stg']['orgform'] = $config['root']['stg']; diff --git a/application/controllers/Cis/Abgabetool.php b/application/controllers/Cis/Abgabetool.php index 04338b1a9..28414dafa 100644 --- a/application/controllers/Cis/Abgabetool.php +++ b/application/controllers/Cis/Abgabetool.php @@ -31,12 +31,8 @@ class Abgabetool extends Auth_Controller { // TODO: routing from index based on berechtigung? - $viewData = array( - 'uid'=>getAuthUID(), - ); - if(defined('CIS4') && CIS4) { - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']); + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'Abgabetool']); } else { $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']); } @@ -44,12 +40,8 @@ class Abgabetool extends Auth_Controller public function Student($student_uid_prop = '') { - $viewData = array( - 'uid'=>getAuthUID(), - ); - if(defined('CIS4') && CIS4) { - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']); + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'AbgabetoolStudent']); } else { $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]); } @@ -57,12 +49,8 @@ class Abgabetool extends Auth_Controller public function Mitarbeiter() { - $viewData = array( - 'uid'=>getAuthUID(), - ); - if(defined('CIS4') && CIS4) { - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']); + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'AbgabetoolMitarbeiter']); } else { $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']); } @@ -70,13 +58,8 @@ class Abgabetool extends Auth_Controller public function Assistenz($stg_kz_prop = '') { - - $viewData = array( - 'uid'=>getAuthUID(), - ); - if(defined('CIS4') && CIS4) { - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolAssistenz']); + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'AbgabetoolAssistenz']); } else { $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]); } @@ -84,12 +67,8 @@ class Abgabetool extends Auth_Controller public function Deadlines() { - $viewData = array( - 'uid'=>getAuthUID(), - ); - if(defined('CIS4') && CIS4) { - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']); + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'DeadlinesOverview']); } else { $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'DeadlinesOverview']); } diff --git a/application/controllers/Cis/Auth.php b/application/controllers/Cis/Auth.php index 67267ebf6..87ef5d3da 100644 --- a/application/controllers/Cis/Auth.php +++ b/application/controllers/Cis/Auth.php @@ -40,7 +40,7 @@ class Auth extends FHC_Controller if ($this->form_validation->run()) { - redirect($this->authlib->getLandingPage('/CisVue/Dashboard')); + redirect($this->authlib->getLandingPage('/Cis4')); } else { diff --git a/application/controllers/Cis/LvPlan.php b/application/controllers/Cis/LvPlan.php index 884c8a9a0..32e622f5a 100644 --- a/application/controllers/Cis/LvPlan.php +++ b/application/controllers/Cis/LvPlan.php @@ -28,12 +28,6 @@ class LvPlan extends Auth_Controller */ public function index() { - - $viewData = array( - 'uid'=>getAuthUID(), - 'timezone' => $this->config->item('timezone') - ); - - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'LvPlan']); + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'LvPlan']); } } diff --git a/application/controllers/Cis/MyLv.php b/application/controllers/Cis/MyLv.php index 819d56b05..0f24d3a80 100644 --- a/application/controllers/Cis/MyLv.php +++ b/application/controllers/Cis/MyLv.php @@ -26,11 +26,6 @@ class MyLv extends Auth_Controller */ public function index() { - - $viewData = array( - - ); - - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLv']); + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'MyLv']); } } diff --git a/application/controllers/Cis/MyLvPlan.php b/application/controllers/Cis/MyLvPlan.php index 366ce8e65..a7f21aa20 100644 --- a/application/controllers/Cis/MyLvPlan.php +++ b/application/controllers/Cis/MyLvPlan.php @@ -27,13 +27,7 @@ class MyLvPlan extends Auth_Controller * @return void */ public function index() - { - - $viewData = array( - 'uid'=>getAuthUID(), - 'timezone' => $this->config->item('timezone') - ); - - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLvPlan']); + { + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'MyLvPlan']); } } diff --git a/application/controllers/Cis/OtherLvPlan.php b/application/controllers/Cis/OtherLvPlan.php new file mode 100644 index 000000000..e62644dd1 --- /dev/null +++ b/application/controllers/Cis/OtherLvPlan.php @@ -0,0 +1,34 @@ + ['basis/other_lv_plan:r'] + ]); + + // Load Config + $this->load->config('calendar'); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * @return void + */ + public function index() + { + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'OtherLvPlan']); + } +} diff --git a/application/controllers/Cis/Profil.php b/application/controllers/Cis/Profil.php index c287d87d0..dd7963228 100644 --- a/application/controllers/Cis/Profil.php +++ b/application/controllers/Cis/Profil.php @@ -55,15 +55,7 @@ class Profil extends Auth_Controller */ public function index() { - - $this->load->library('ProfilLib'); - $profil_data = $this->profillib->getView(getAuthUID()); - $profil_data = hasData($profil_data) ? getData($profil_data) : null; - $viewData = array( - 'editable'=>true, - 'profil_data' => $profil_data, - ); - $this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'profilIndex']); + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'profilIndex']); } /** @@ -73,23 +65,13 @@ class Profil extends Auth_Controller */ public function View($uid) { - $this->load->library('ProfilLib'); - $profil_data = $this->profillib->getView($uid); - $profil_data = hasData($profil_data) ? getData($profil_data) : null; - $viewData = array ( - 'uid' => $uid, - 'profil_data'=>$profil_data, - ); - if($uid == getAuthUID()){ - $viewData['editable'] = true; - } - $this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'profilViewUid']); + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'profilViewUid']); } /** - * checks whether a specific userID is a mitarbeiter or not (foreword declaration of the function isMitarbeiter in Mitarbeiter_model.php) + * checks whether a specific userID is a student or not (foreword declaration of the function isStudent in Student_model.php) * @access public - * @param $uid the userID used to check if it is a mitarbeiter + * @param $uid the userID used to check if it is a student * @return boolean */ public function isStudent($uid) @@ -119,7 +101,7 @@ class Profil extends Auth_Controller } /** - * gets the adressen that are marked as zustell from the currenlty logged in user + * gets the adressen that are marked as zustell from the currently logged in user * @access public * @return array a list of adresse_id's */ @@ -262,23 +244,23 @@ class Profil extends Auth_Controller $this->GemeindeModel->addDistinct(); $this->GemeindeModel->addSelect(["name"]); if ($nation == "A") { - if (isset($zip) && $zip > 999 && $zip < 32000) { + if (isset($zip) && $zip > 999 && $zip < 32000) { - $gemeinde_res = $this->GemeindeModel->loadWhere(['plz' => $zip]); - if (isError($gemeinde_res)) { - show_error("error while trying to query bis.tbl_gemeinde"); - } - $gemeinde_res = hasData($gemeinde_res) ? getData($gemeinde_res) : null; - $gemeinde_res = array_map(function ($obj) { - return $obj->name; - }, $gemeinde_res); - echo json_encode($gemeinde_res); - - } else { - echo json_encode(error("ortschaftskennziffer code was not valid")); + $gemeinde_res = $this->GemeindeModel->loadWhere(['plz' => $zip]); + if (isError($gemeinde_res)) { + show_error("error while trying to query bis.tbl_gemeinde"); } + $gemeinde_res = hasData($gemeinde_res) ? getData($gemeinde_res) : null; + $gemeinde_res = array_map(function ($obj) { + return $obj->name; + }, $gemeinde_res); + echo json_encode($gemeinde_res); + + } else { + echo json_encode(error("ortschaftskennziffer code was not valid")); + } } else { - echo json_encode(error("Nation was not 'A' (Austria)")); + echo json_encode(error("Nation was not 'A' (Austria)")); } } @@ -750,6 +732,4 @@ class Profil extends Auth_Controller $zutrittskarte_ausgegebenam = str_replace("-", ".", $zutrittskarte_ausgegebenam); return $zutrittskarte_ausgegebenam; } - - } diff --git a/application/controllers/Cis/Raumsuche.php b/application/controllers/Cis/Raumsuche.php index 055038275..f48beb0f3 100644 --- a/application/controllers/Cis/Raumsuche.php +++ b/application/controllers/Cis/Raumsuche.php @@ -25,11 +25,6 @@ class Raumsuche extends Auth_Controller */ public function index() { - - $viewData = array( - 'uid'=>getAuthUID(), - ); - - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Raumsuche']); + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'Raumsuche']); } } diff --git a/application/controllers/Cis/StgOrgLvPlan.php b/application/controllers/Cis/StgOrgLvPlan.php new file mode 100644 index 000000000..bf329fcb8 --- /dev/null +++ b/application/controllers/Cis/StgOrgLvPlan.php @@ -0,0 +1,33 @@ + ['basis/cis:r'] + ]); + + // Load Config + $this->load->config('calendar'); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * @return void + */ + public function index() + { + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'StgOrgLvPlan']); + } +} diff --git a/application/controllers/Cis/Studium.php b/application/controllers/Cis/Studium.php index a298de648..20f323dff 100644 --- a/application/controllers/Cis/Studium.php +++ b/application/controllers/Cis/Studium.php @@ -29,10 +29,7 @@ class Studium extends Auth_Controller */ public function index() { - $viewData = array( - - ); - $this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'studium']); + $this->load->view('CisRouterView/CisRouterView.php',['route' => 'studium']); } diff --git a/application/controllers/Cis4.php b/application/controllers/Cis4.php index b7ba2029d..48fd6c240 100644 --- a/application/controllers/Cis4.php +++ b/application/controllers/Cis4.php @@ -1,6 +1,7 @@ 'basis/cis:r' - ) + array( + 'index' => 'basis/cis:r' + ) ); // Load Config @@ -30,16 +31,6 @@ class Cis4 extends Auth_Controller */ public function index() { - $this->load->model('person/Person_model', 'PersonModel'); - $personData = getData($this->PersonModel->getByUid(getAuthUID()))[0]; - - $viewData = array( - 'uid' => getAuthUID(), - 'name' => $personData->vorname, - 'person_id' => $personData->person_id, - 'timezone' => $this->config->item('timezone') - ); - - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'FhcDashboard']); + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'FhcDashboard']); } } diff --git a/application/controllers/CisVue/Dashboard.php b/application/controllers/CisVue/Dashboard.php deleted file mode 100644 index ee830cb8b..000000000 --- a/application/controllers/CisVue/Dashboard.php +++ /dev/null @@ -1,43 +0,0 @@ - 'dashboard/benutzer:r' - ) - ); - } - - // ----------------------------------------------------------------------------------------------------------------- - // Public methods - - /** - * @return void - */ - public function index() - { - - $this->load->model('person/Person_model','PersonModel'); - $personData = getData($this->PersonModel->getByUid(getAuthUID()))[0]; - - $viewData = array( - 'uid' => getAuthUID(), - 'name' => $personData->vorname, - 'person_id' => $personData->person_id - ); - - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData]); - - } -} \ No newline at end of file diff --git a/application/controllers/Redirect.php b/application/controllers/Redirect.php new file mode 100644 index 000000000..f4a9f4cd7 --- /dev/null +++ b/application/controllers/Redirect.php @@ -0,0 +1,44 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * This controller redirects urls to another location. This is mainly used + * with the $routes config + */ +class Redirect extends CI_Controller +{ + public function __construct() + { + parent::__construct(); + } + + /** + * Main function to handle all redirects. + * + * @param string $method - the redirect code (30x) + * @param array $params - the url to redirect to + * + * @return void + */ + public function _remap($method, $params) + { + redirect($params, 'location', $method); + } +} diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php index 43dc18d1c..759c32d58 100644 --- a/application/controllers/api/frontend/v1/Abgabe.php +++ b/application/controllers/api/frontend/v1/Abgabe.php @@ -35,9 +35,12 @@ class Abgabe extends FHCAPI_Controller 'getStudentProjektabgaben' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'), 'postStudentProjektarbeitZwischenabgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'), 'postStudentProjektarbeitEndupload' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'), + 'postStudentProjektarbeitTitel' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'), 'getMitarbeiterProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), 'postProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'patchProjektarbeitAbgabeMultiple' => array('basis/abgabe_assistenz:rw'), 'deleteProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'deleteProjektarbeitAbgabeMultiple' => array('basis/abgabe_assistenz:rw'), 'postSerientermin' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), 'fetchDeadlines' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), 'getPaAbgabetypen' => self::PERM_LOGGED, @@ -46,7 +49,9 @@ class Abgabe extends FHCAPI_Controller 'getStudiengaenge' => array('basis/abgabe_assistenz:rw'), 'getStudentProjektarbeitAbgabeFile' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'), 'postStudentProjektarbeitZusatzdaten' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'), - 'getSignaturStatusForProjektarbeitAbgaben' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw') + 'getSignaturStatusForProjektarbeitAbgaben' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'), + 'sendZweitbetreuerTokenMail' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'), + 'fetchProjektarbeitenHistory' => array('basis/abgabe_assistenz:rw') ]); $this->load->library('PhrasesLib'); @@ -90,6 +95,7 @@ class Abgabe extends FHCAPI_Controller $ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'); $ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER = $this->config->item('ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'); $BETREUER_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('BETREUER_SAMMELMAIL_BUTTON_STUDENT'); + $MULTIEDIT_TABLE = $this->config->item('MULTIEDIT_TABLE'); $ret = array( 'old_abgabe_beurteilung_link' => $old_abgabe_beurteilung_link, @@ -98,6 +104,7 @@ class Abgabe extends FHCAPI_Controller 'ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT' => $ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT, 'ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER' => $ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER, 'BETREUER_SAMMELMAIL_BUTTON_STUDENT' => $BETREUER_SAMMELMAIL_BUTTON_STUDENT, + 'MULTIEDIT_TABLE' => $MULTIEDIT_TABLE, ); $this->terminateWithSuccess($ret); @@ -107,10 +114,18 @@ class Abgabe extends FHCAPI_Controller * loads config related to abgabetool for students to avoid handing out links reserved for employees */ public function getConfigStudent() { - $moodle_link =$this->config->item('STG_MOODLE_LINK'); - + $moodle_link = $this->config->item('STG_MOODLE_LINK'); + $title_edit_allowed = $this->config->item('STUDENT_EDIT_PROJEKTARBEIT_TITLE'); + $confetti_on_endupload = $this->config->item('CONFETTI_ON_ENDUPLOAD'); + $siginfolink_german = $this->config->item('SIGNATUR_INFO_LINK_GERMAN'); + $siginfolink_english = $this->config->item('SIGNATUR_INFO_LINK_ENGLISH'); + $ret = array( 'moodle_link' => $moodle_link, + 'title_edit_allowed' => $title_edit_allowed, + 'confetti_on_endupload' => $confetti_on_endupload, + 'siginfolink_german' => $siginfolink_german, + 'siginfolink_english' => $siginfolink_english ); $this->terminateWithSuccess($ret); @@ -146,23 +161,26 @@ class Abgabe extends FHCAPI_Controller } $data = getData($res)[0]; $student_uid = $data->uid; - - $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); - if(getAuthUID() == $student_uid || $zugeordnet) { - $projektarbeitIsCurrent = false; - $returnFunc = function ($result) use (&$projektarbeitIsCurrent) { - $projektarbeitIsCurrent = $result; - }; - Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc); - - $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id); - - foreach ($ret->retval as $termin) { - $this->checkAbgabeSignatur($termin, $projektarbeit->student_uid); - } - - $this->terminateWithSuccess(array($ret, $projektarbeitIsCurrent)); + $studiengang_kz = $data->studiengang_kz; + + if(!$this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid])); } + + $projektarbeitIsCurrent = false; + $returnFunc = function ($result) use (&$projektarbeitIsCurrent) { + $projektarbeitIsCurrent = $result; + }; + Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc); + + $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id); + + foreach ($ret->retval as $termin) { + $this->checkAbgabeSignatur($termin, $projektarbeit->student_uid); + } + + $this->terminateWithSuccess(array($ret, $projektarbeitIsCurrent)); + } /** @@ -188,7 +206,7 @@ class Abgabe extends FHCAPI_Controller $result = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer(getAuthUID()); } - $projektarbeiten = getData($result); + $projektarbeiten = hasData($result) ? getData($result) : array(); if(count($projektarbeiten)) { foreach($projektarbeiten as $pa) { @@ -275,6 +293,8 @@ class Abgabe extends FHCAPI_Controller if(count($data) > 0) { $pa->zweitbetreuer = $data[0]; } + + $pa->zweitbetreuer_mail = $this->getProjektbetreuerEmailByPersonID($pa->zweitbetreuer_person_id); } } } @@ -293,55 +313,62 @@ class Abgabe extends FHCAPI_Controller $projektarbeit_id = $this->input->post('projektarbeit_id'); $paabgabe_id = $this->input->post('paabgabe_id'); - $student_uid = $this->input->post('student_uid'); - $bperson_id = $this->input->post('bperson_id'); $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz'); if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '' || $paabgabe_id === NULL || trim((string)$paabgabe_id) === '' - || $student_uid === NULL || trim((string)$student_uid) === '' || $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '') { $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); } $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); + + // load the $student_uid by $projektarbeit_id so we dont need any post params + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + $studiengang_kz = $data->studiengang_kz; - $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); - if(getAuthUID() == $student_uid || $zugeordnet) { + if(!$this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid])); + } + $path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'; - $path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'; - - if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) { - move_uploaded_file($_FILES['file']['tmp_name'], $path); - - if(file_exists($path)) { - - chmod($path, 0640); - - $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); - $res = $this->PaabgabeModel->update($paabgabe_id, array( - 'abgabedatum' => date('Y-m-d'), - 'updatevon' => getAuthUID(), - 'updateamum' => date('Y-m-d H:i:s') - )); - - $this->logLib->logInfoDB(array('zwischenupload',$res, array( - 'abgabedatum' => date('Y-m-d'), - 'updatevon' => getAuthUID(), - 'updateamum' => date('Y-m-d H:i:s') - ), getAuthUID(), getAuthPersonId(), $student_uid)); - - $this->terminateWithSuccess($res); - } else { - $this->terminateWithError('Error moving File', 'general'); - } - + if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) { + move_uploaded_file($_FILES['file']['tmp_name'], $path); + + if(file_exists($path)) { + + chmod($path, 0640); + + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + $res = $this->PaabgabeModel->update($paabgabe_id, array( + 'abgabedatum' => date('Y-m-d'), + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + )); + + $this->logLib->logInfoDB(array('zwischenupload',$res, array( + 'abgabedatum' => date('Y-m-d'), + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId(), $student_uid)); + + $this->terminateWithSuccess($res); } else { - $this->terminateWithError('File missing', 'general'); + $this->terminateWithError('Error moving File', 'general'); } + } else { - $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent')); + $this->terminateWithError('File missing', 'general'); } } @@ -355,7 +382,6 @@ class Abgabe extends FHCAPI_Controller $projektarbeit_id = $this->input->post('projektarbeit_id'); $paabgabe_id = $this->input->post('paabgabe_id'); - $student_uid = $this->input->post('student_uid'); $sprache = $this->input->post('sprache'); $abstract = $this->input->post('abstract'); $abstract_en = $this->input->post('abstract_en'); @@ -367,7 +393,6 @@ class Abgabe extends FHCAPI_Controller if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '' || $paabgabe_id === NULL || trim((string)$paabgabe_id) === '' - || $student_uid === NULL || trim((string)$student_uid) === '' || $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '' || $abstract === NULL || $abstract_en === NULL || $schlagwoerter === NULL || $schlagwoerter_en === NULL @@ -379,76 +404,317 @@ class Abgabe extends FHCAPI_Controller $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); - $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); - if(getAuthUID() == $student_uid || $zugeordnet) { - if ((isset($_FILES) and isset($_FILES['file']) and !$_FILES['file']['error'])) { - move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf'); + // load the $student_uid by $projektarbeit_id so we dont need any post params + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + $studiengang_kz = $data->studiengang_kz; + + if(!$this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid])); + } - if (file_exists(PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf')) { + if ((isset($_FILES) and isset($_FILES['file']) and !$_FILES['file']['error'])) { + move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf'); - $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + if (file_exists(PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf')) { - $result = $this->ProjektarbeitModel->load($projektarbeit_id); - $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general'); + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); - if (count($projektarbeitArr) > 0) { - $projektarbeit = $projektarbeitArr[0]; - } else { - $this->terminateWithError($this->p->t('abgabetool', 'c4projektarbeitNichtGefunden'), 'general'); - } + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general'); - $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); - $result = $this->PaabgabeModel->load($paabgabe_id); - $paabgabeArr = $this->getDataOrTerminateWithError($result, 'general'); - - if (count($paabgabeArr) > 0) { - $paabgabe = $paabgabeArr[0]; - } else { - $this->terminateWithError($this->p->t('abgabetool', 'c4projektabgabeNichtGefunden'), 'general'); - } - - $this->checkAbgabeSignatur($paabgabe, $projektarbeit->student_uid); - $signaturstatus = $paabgabe->signatur; - - // update projektarbeit cols - $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id, $sprache, $abstract, $abstract_en - , $schlagwoerter, $schlagwoerter_en, $seitenanzahl); - - - // update paabgabe datum - $res = $this->PaabgabeModel->update($paabgabe_id, array( - 'abgabedatum' => date('Y-m-d'), - 'updatevon' => getAuthUID(), - 'updateamum' => date('Y-m-d H:i:s') - )); - - $res = $this->PaabgabeModel->load($res->retval); - $abgabe = getData($res)[0]; - $abgabe->signatur = $signaturstatus; - - $this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid); - - $this->logLib->logInfoDB(array('endupload', $res, array( - 'abgabedatum' => date('Y-m-d'), - 'updatevon' => getAuthUID(), - 'updateamum' => date('Y-m-d H:i:s') - ), getAuthUID(), getAuthPersonId(), array($projektarbeit_id, $sprache, $abstract, $abstract_en - , $schlagwoerter, $schlagwoerter_en, $seitenanzahl))); - - $this->terminateWithSuccess($abgabe); + if (count($projektarbeitArr) > 0) { + $projektarbeit = $projektarbeitArr[0]; } else { - $this->terminateWithError('Error moving File', 'general'); + $this->terminateWithError($this->p->t('abgabetool', 'c4projektarbeitNichtGefunden'), 'general'); } + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + $result = $this->PaabgabeModel->load($paabgabe_id); + $paabgabeArr = $this->getDataOrTerminateWithError($result, 'general'); + + if (count($paabgabeArr) > 0) { + $paabgabe = $paabgabeArr[0]; + } else { + $this->terminateWithError($this->p->t('abgabetool', 'c4projektabgabeNichtGefunden'), 'general'); + } + + $this->checkAbgabeSignatur($paabgabe, $projektarbeit->student_uid); + $signaturstatus = $paabgabe->signatur; + + // update projektarbeit cols with zusatzdaten AND abgabedatum! + $this->ProjektarbeitModel->update($projektarbeit->projektarbeit_id, array( + 'sprache' => $sprache, + 'seitenanzahl' => $seitenanzahl, + 'abgabedatum' => date('Y-m-d'), + 'schlagwoerter_en' => $schlagwoerter_en, + 'schlagwoerter' => $schlagwoerter, + 'abstract' => $abstract, + 'abstract_en' => $abstract_en + )); + + + // update paabgabe datum + $res = $this->PaabgabeModel->update($paabgabe_id, array( + 'abgabedatum' => date('Y-m-d'), + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + )); + + $res = $this->PaabgabeModel->load($res->retval); + $abgabe = getData($res)[0]; + $abgabe->signatur = $signaturstatus; + + $this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid); + + $this->logLib->logInfoDB(array('endupload', $res, array( + 'abgabedatum' => date('Y-m-d'), + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId(), array($projektarbeit_id, $sprache, $abstract, $abstract_en + , $schlagwoerter, $schlagwoerter_en, $seitenanzahl))); + + $this->terminateWithSuccess($abgabe); } else { - $this->terminateWithError('File missing', 'general'); + $this->terminateWithError('Error moving File', 'general'); } + } else { - $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent')); + $this->terminateWithError('File missing', 'general'); } } - + + /** + * POST METHOD + * allows a student (or assistenz on their behalf) to update the titel of their own projektarbeit. + * blocked once the projektarbeit has been graded (checkProjektarbeitForFinishedStatus). + */ + public function postStudentProjektarbeitTitel() + { + if(!$this->config->item('STUDENT_EDIT_PROJEKTARBEIT_TITLE')) { + $this->terminateWithError($this->p->t('global', 'c4studentEditNotAllowed'), 'general'); + }; + + $projektarbeit_id = $this->input->post('projektarbeit_id'); + $titel = $this->input->post('titel'); + + if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '' + || $titel === NULL || trim((string)$titel) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + // strip all HTML tags to prevent XSS in mail bodies, table views and Projektarbeitsbenotung + $titel = trim(strip_tags($titel)); + if ($titel === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + // Reject emojis and pictographs + // allows foreign letters, math symbols, accents, and standard punctuation. + $emojiPattern = '/[\x{1F300}-\x{1F5FF}\x{1F600}-\x{1F64F}\x{1F680}-\x{1F6FF}\x{1F900}-\x{1FAFF}\x{23E9}-\x{23EF}\x{2b50}\x{2700}-\x{27BF}]/u'; + + // i would like this much more but our server does not recognize this utf-8 character range this way, so hexcodes it is +// if (preg_match('/\p{Extended_Pictographic}/u', $titel)) { + if (preg_match($emojiPattern, $titel)) { + + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); + + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + // Verify the projektarbeit actually belongs to the supplied student_uid + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if (isError($res) || !hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4projektarbeitNichtGefunden'), 'general'); + } + $assignedStudentUid = getData($res)[0]->uid; + + // A student may only update their own title; assistenz is covered by checkZuordnung + + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + $studiengang_kz = $data->studiengang_kz; + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz); + if (getAuthUID() !== $assignedStudentUid && !$zugeordnet) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + } + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $data = getData($result); + + $oldTitle = $data[0]->titel ?? ''; + + $result = $this->ProjektarbeitModel->update( + $projektarbeit_id, + array( + 'titel' => $titel, + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ) + ); + + $this->getDataOrTerminateWithError($result, 'general'); + + $this->logLib->logInfoDB(array( + 'titelUpdate', + array( + 'projektarbeit_id' => $projektarbeit_id, + 'titel' => $titel, + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ), + getAuthUID(), + getAuthPersonId() + )); + + $this->sendTitelChangedEmail( + $projektarbeit_id, + $titel, + $oldTitle, + $assignedStudentUid + ); + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $titel = hasData($result) ? getData($result)[0]->titel : $titel; + $this->terminateWithSuccess($titel); + } + + /** + * Notifies all betreuer of a projektarbeit and all assistenzen responsible for its studiengang + * when a student updates the titel of their projektarbeit. + * + * Betreuer retrieval mirrors AbgabetoolJob->notifyBetreuerAboutChangedAbgaben. + * Assistenz retrieval mirrors AbgabetoolJob->notifyAssistenzAboutChangedAbgaben. + * + * @param int $projektarbeit_id + * @param string $new_titel The titel as it was saved + * @param string $student_uid + */ + private function sendTitelChangedEmail($projektarbeit_id, $new_titel, $old_titel, $student_uid) + { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); + $this->load->model('person/Person_model', 'PersonModel'); + + $this->load->model('person/Person_model', 'PersonModel'); + $studentNameResult = $this->PersonModel->getFullName($student_uid); + $studentFullName = hasData($studentNameResult) ? getData($studentNameResult) : $student_uid; + + $studentInfoResult = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if (isError($studentInfoResult) || !hasData($studentInfoResult)) { + $this->logLib->logInfoDB(array('sendTitelChangedEmail: student info not found', $projektarbeit_id)); + return; + } + $studentInfo = getData($studentInfoResult)[0]; + $studiengang_kz = $studentInfo->studiengang_kz; + + $stgResult = $this->StudiengangModel->load($studiengang_kz); + $oe_kurzbz = null; + if (!isError($stgResult) && hasData($stgResult)) { + $oe_kurzbz = getData($stgResult)[0]->oe_kurzbz ?? null; + } + + // build shared mail data + $base_mail_data = array( + 'studentFullName' => $studentFullName, + 'new_titel' => $new_titel, + 'old_titel' => $old_titel + ); + + // notify all betreuer + $betreuerResult = $this->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id); + if (!isError($betreuerResult) && hasData($betreuerResult)) { + + $linkAbgabetool = APP_ROOT . $this->config->item('URL_MITARBEITER'); + + foreach (getData($betreuerResult) as $betreuer) { + $email = $betreuer->uid ? $betreuer->uid . '@' . DOMAIN : ($betreuer->private_email ?? null); + if (!$email) { + $this->logLib->logInfoDB(array('sendTitelChangedEmail: no email for betreuer', $betreuer->person_id)); + continue; + } + + $anredeResult = $this->ProjektarbeitModel->getProjektbetreuerAnrede($betreuer->person_id); + $anrede = (!isError($anredeResult) && hasData($anredeResult)) ? getData($anredeResult)[0] : null; + + $mail_data = array_merge($base_mail_data, array( + 'anredeFillString' => ($anrede->anrede ?? '') === 'Herr' ? 'r' : '', + 'anrede' => $anrede->anrede ?? '', + 'fullFormattedNameString' => $anrede->first ?? $email, + 'linkAbgabetool' => $linkAbgabetool, + )); + + sendSanchoMail( + 'PATitleUpdated', + $mail_data, + $email, + $this->p->t('abgabetool', 'c4PATitleChanged') + ); + } + } + + // notify assistenz for the studiengang OE + if (!$oe_kurzbz) { + $this->logLib->logInfoDB(array('sendTitelChangedEmail: no oe_kurzbz resolved, skipping assistenz', $studiengang_kz)); + return; + } + + $assistenzResult = $this->OrganisationseinheitModel->getAssistenzForOE($oe_kurzbz); + if (isError($assistenzResult) || !hasData($assistenzResult)) { + return; + } + + $linkAbgabetool = APP_ROOT . $this->config->item('URL_ASSISTENZ'); + + // similar pattern as job uses via the assistenzMap + $sentTo = []; + foreach (getData($assistenzResult) as $assistenz) { + if (in_array($assistenz->person_id, $sentTo)) { + continue; + } + $sentTo[] = $assistenz->person_id; + + $email = $assistenz->uid . '@' . DOMAIN; + + $mail_data = array_merge($base_mail_data, array( + 'anredeFillString' => $assistenz->anrede === 'Herr' ? 'r' : '', + 'anrede' => $assistenz->anrede ?? '', + 'fullFormattedNameString' => $assistenz->first ?? ($assistenz->uid . '@' . DOMAIN), + 'linkAbgabetool' => $linkAbgabetool, + )); + + sendSanchoMail( + 'PATitleUpdated', + $mail_data, + $email, + $this->p->t('abgabetool', 'c4PATitleChanged') + ); + } + } + + // validate paabgabe deadline against servertime just in case a student spoofs their local clock and thus // unlocks the upload ui private function checkPaabgabeDeadline($paabgabe_id) { @@ -504,7 +770,7 @@ class Abgabe extends FHCAPI_Controller $showAllBool = false; } - $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool); + $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthPersonId(), $showAllBool); $mapFunc = function($projektarbeit) { @@ -519,20 +785,18 @@ class Abgabe extends FHCAPI_Controller forEach($projektarbeiten->retval as $pa) { - $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($pa->betreuer_person_id); - $anredeArr = $this->getDataOrTerminateWithError($result, 'general'); - $pa->betreuer = $anredeArr[0]; - $oldLink = ''; // show this when paIsCurrent == false -> moodle course template $newLink = ''; // get curated path for betreuer type - $returnFunc = function ( $resultOld, $resultNew) use (&$oldLink, &$newLink) { + $returnFunc = function ($resultOld, $resultNew) use (&$oldLink, &$newLink) { $newLink = $resultNew; $oldLink = $resultOld; }; - Events::trigger('projektbeurteilung_formular_link', $pa->betreuerart_kurzbz, APP_ROOT, $pa->projektarbeit_id, $pa->student_uid, $returnFunc); + $own_betreuerart_kurzbz = $pa->betreuer_person_id == getAuthPersonId() ? $pa->betreuer_betreuerart_kurzbz : $pa->zweitbetreuer_betreuerart_kurzbz; + Events::trigger('projektbeurteilung_formular_link', $own_betreuerart_kurzbz, APP_ROOT, $pa->projektarbeit_id, $pa->student_uid, $returnFunc); $pa->beurteilungLinkNew = $newLink; $pa->beurteilungLinkOld = $oldLink; + $pa->betreuerart_kurzbz = $own_betreuerart_kurzbz; // has previously been retrieved via getStudentProjektabgaben but is fetched in advance to avoid having to reload abgaben $projektarbeitIsCurrent = false; @@ -579,9 +843,22 @@ class Abgabe extends FHCAPI_Controller $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); - $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + // load the $student_uid by $projektarbeit_id so we dont need any post params + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + $studiengang_kz = $data->studiengang_kz; + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz); if(!$zugeordnet) { - $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent')); + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid])); } $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); @@ -618,12 +895,22 @@ class Abgabe extends FHCAPI_Controller // load existing entry of paabgabe and check if note has changed to negativ, to avoid sending when // only notiz has changed. - // TODO: what if paabgabe is a qualgate1, is benotet negativ and then its type is changed to gate2? - $existingResult = $this->PaabgabeModel->load($paabgabe_id); $existingPaabgabeArr = getData($existingResult); if(count($existingPaabgabeArr) > 0) $existingPaabgabe = $existingPaabgabeArr[0]; + if($existingPaabgabe->note !== null || $existingPaabgabe->abgabedatum !== null) { + // check if a change of paabgabetyp is being attempted -> not allowed at this point + if($paabgabetyp_kurzbz !== $existingPaabgabe->paabgabetyp_kurzbz) { + $this->terminateWithError($this->p->t('abgabetool', 'c4abgabetypAendernNichtErlaubt')); + } + + // check if a change of deadline aka datum is being attempted -> notallowed at this point + if($datum !== $existingPaabgabe->datum) { + $this->terminateWithError($this->p->t('abgabetool', 'c4datumAendernNichtErlaubt')); + } + } + $result = $this->PaabgabeModel->update( $paabgabe_id, array( @@ -687,6 +974,112 @@ class Abgabe extends FHCAPI_Controller $this->terminateWithSuccess([$paabgabe, $existingPaabgabe]); } + /** + * called by abgabetool/assistenz when bulk-editing multiple abgabetermine via the flat termine table view + * only fields present in the payload are updated - absent fields are left untouched + */ + public function patchProjektarbeitAbgabeMultiple() { + $paabgabe_ids = $this->input->post('paabgabe_ids'); + + if ($paabgabe_ids === NULL || !is_array($paabgabe_ids) || count($paabgabe_ids) === 0) { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + // collect only fields that were actually sent + $updateFields = []; + + $datum = $this->input->post('datum'); + if ($datum !== NULL && trim((string)$datum) !== '') { + $updateFields['datum'] = $datum; + } + + $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz'); + if ($paabgabetyp_kurzbz !== NULL && trim((string)$paabgabetyp_kurzbz) !== '') { + $updateFields['paabgabetyp_kurzbz'] = $paabgabetyp_kurzbz; + } + + $kurzbz = $this->input->post('kurzbz'); + if ($kurzbz !== NULL) { + $updateFields['kurzbz'] = $kurzbz; + } + + // booleans: only include if explicitly posted + $upload_allowed = $this->input->post('upload_allowed'); + if ($upload_allowed !== NULL) { + $updateFields['upload_allowed'] = filter_var($upload_allowed, FILTER_VALIDATE_BOOLEAN); + } + + $fixtermin = $this->input->post('fixtermin'); + if ($fixtermin !== NULL) { + $updateFields['fixtermin'] = filter_var($fixtermin, FILTER_VALIDATE_BOOLEAN); + } + + if (empty($updateFields)) { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + + $results = []; + foreach ($paabgabe_ids as $paabgabe_id) { + $paabgabe_id = trim((string)$paabgabe_id); + + if ($paabgabe_id === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id); + + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); + + // load the $student_uid by $projektarbeit_id so we dont need any post params + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + $studiengang_kz = $data->studiengang_kz; + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz); + if (!$zugeordnet) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + } + + $paabgabeResult = $this->PaabgabeModel->load($paabgabe_id); + $paabgabeArr = $this->getDataOrTerminateWithError($paabgabeResult, 'general'); + + if (count($paabgabeArr) === 0) { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $result = $this->PaabgabeModel->update( + $paabgabe_id, + array_merge($updateFields, [ + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ]) + ); + + $this->getDataOrTerminateWithError($result, 'general'); + $results[] = getData($this->PaabgabeModel->load($paabgabe_id))[0]; + + $this->logLib->logInfoDB(array( + 'paabgabe bulk updated', + $paabgabe_id, + $updateFields, + getAuthUID(), + getAuthPersonId() + )); + } + + $this->terminateWithSuccess($results); + } + /** * called by abgabetool/mitarbeiter in mitarbeiterdetail.js when deleting an abgabetermin * deletion is only possible if user is assistenz OR betreuer deletes their own custom termin @@ -699,12 +1092,28 @@ class Abgabe extends FHCAPI_Controller $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); } - $this->checkProjektarbeitForFinishedStatus($this->getProjektarbeitIDForPaabgabeID($paabgabe_id)); + $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id); + + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); - $zugeordnet = $this->checkZuordnungByPaabgabe($paabgabe_id, getAuthUID()); + + // load the $student_uid by $projektarbeit_id so we dont need any post params + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + $studiengang_kz = $data->studiengang_kz; + + $zugeordnet = $this->checkZuordnungByPaabgabe($paabgabe_id, getAuthUID(), $student_uid, $studiengang_kz); if(!$zugeordnet) { - $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]), 'general'); } $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); @@ -719,11 +1128,69 @@ class Abgabe extends FHCAPI_Controller $result = $this->PaabgabeModel->delete($paabgabe_id); $result = $this->getDataOrTerminateWithError($result, 'general'); - // TODO: consider this in nightly email job $this->logLib->logInfoDB(array($paabgabeArr[0], getAuthUID(), getAuthPersonId())); $this->terminateWithSuccess($result); } + /** + * called by abgabetool/assistenz when deleting multiple abgabetermine via the flat termine table view + */ + public function deleteProjektarbeitAbgabeMultiple() { + $paabgabe_ids = $this->input->post('paabgabe_ids'); + + if ($paabgabe_ids === NULL || !is_array($paabgabe_ids) || count($paabgabe_ids) === 0) { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + + $results = []; + foreach ($paabgabe_ids as $paabgabe_id) { + $paabgabe_id = trim((string)$paabgabe_id); + + if ($paabgabe_id === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->checkProjektarbeitForFinishedStatus($this->getProjektarbeitIDForPaabgabeID($paabgabe_id)); + + $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id); + + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + $studiengang_kz = $data->studiengang_kz; + + $zugeordnet = $this->checkZuordnungByPaabgabe($paabgabe_id, getAuthUID(), $student_uid, $studiengang_kz); + + if (!$zugeordnet) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + } + + $paabgabeResult = $this->PaabgabeModel->load($paabgabe_id); + $paabgabeArr = $this->getDataOrTerminateWithError($paabgabeResult, 'general'); + + if (count($paabgabeArr) == 0) { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $result = $this->PaabgabeModel->delete($paabgabe_id); + $result = $this->getDataOrTerminateWithError($result, 'general'); + $results[] = $result; + + $this->logLib->logInfoDB(array($paabgabeArr[0], getAuthUID(), getAuthPersonId())); + } + + $this->terminateWithSuccess($results); + } + /** * endpoint for adding the same paabgabe for multiple projektarbeiten * can be slow for large n since it queries twice per projektarbeit_id @@ -757,16 +1224,27 @@ class Abgabe extends FHCAPI_Controller // and should never unintentionally happen $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); - - $res = []; + $abgaben = []; foreach ($projektarbeit_ids as $projektarbeit_id) { $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); + + // load the $student_uid by $projektarbeit_id so we dont need any post params + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + $studiengang_kz = $data->studiengang_kz; - $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz); if(!$zugeordnet) { - $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]), 'general'); } $result = $this->PaabgabeModel->insert( @@ -847,10 +1325,10 @@ class Abgabe extends FHCAPI_Controller private function getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id) { $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); $result = $this->ProjektarbeitModel->getProjektbetreuerEmail($projektarbeit_id); - if(count($result->retval) > 0) { + if(hasData($result)) { $email = getData($result); return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email; - } else return ''; + } else return null; } @@ -861,9 +1339,12 @@ class Abgabe extends FHCAPI_Controller private function getProjektbetreuerEmailByPersonID($person_id) { $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); $result = $this->ProjektarbeitModel->getProjektbetreuerEmailByPersonID($person_id); - $email = $this->getDataOrTerminateWithError($result, 'general'); - - return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email; + if(hasData($result)) { + $email = getData($result); + return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email; + } else { + return null; + } } //TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API @@ -1034,30 +1515,34 @@ class Abgabe extends FHCAPI_Controller $projektarbeit_id = $this->input->get('projektarbeit_id'); $paabgabe_id = $this->input->get('paabgabe_id'); - $student_uid = $this->input->get('student_uid'); if ($paabgabe_id === NULL || trim((string)$paabgabe_id) === '' - || $projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '' - || $student_uid === NULL || trim((string)$student_uid) === '') { + || $projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '') { $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); } $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); - - // zuordnung function is supposed for mitarbeiter_uids, students should be allowed to download their own files - // without adapting zuordnung logic - $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); - if(getAuthUID() == $student_uid || $zugeordnet) { - $file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'; - - - if(file_exists($file_path)) { - $this->terminateWithFileOutput('application/octet-stream', file_get_contents($file_path), basename($file_path)); - } else { - $this->terminateWithError('File not found', 'general'); - } + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + $studiengang_kz = $data->studiengang_kz; + + if(!$this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz)){ + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]), 'general'); + } + + $file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'; + + if(file_exists($file_path)) { + $this->terminateWithFileOutput('application/octet-stream', file_get_contents($file_path), basename($file_path)); } else { - $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + $this->terminateWithError('File not found', 'general'); } } @@ -1101,14 +1586,33 @@ class Abgabe extends FHCAPI_Controller $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); - $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + // load the $student_uid by $projektarbeit_id so we dont need any post params + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + $studiengang_kz = $data->studiengang_kz; + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz); if(!$zugeordnet) { - $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent', [getAuthUID(), $student_uid]), 'general'); } - // update projektarbeit cols - $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en - ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl); + // update projektarbeit cols with zusatzdaten only + $this->ProjektarbeitModel->update($projektarbeit_id, array( + 'sprache' => $sprache, + 'seitenanzahl' => $seitenanzahl, + 'schlagwoerter_en' => $schlagwoerter_en, + 'schlagwoerter' => $schlagwoerter, + 'abstract' => $abstract, + 'abstract_en' => $abstract_en + )); $this->logLib->logInfoDB(array('zusatzdatenEditMitarbeiter', array( 'updatevon' => getAuthUID(), @@ -1144,6 +1648,69 @@ class Abgabe extends FHCAPI_Controller $this->terminateWithSuccess($data); } + public function sendZweitbetreuerTokenMail() { + $projektarbeit_id = $this->input->post('projektarbeit_id'); + $bperson_id = $this->input->post('bperson_id'); + + + if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '' + || $bperson_id === NULL || trim((string)$bperson_id) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); + + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + $studiengang_kz = $data->studiengang_kz; + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID(), $student_uid, $studiengang_kz); + if(!$zugeordnet) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent')); + } + + $this->sendUploadEmailZweitbegutachterToken($bperson_id, $projektarbeit_id, $student_uid); + } + + // basically what getStudentProjektarbeiten intends to do for the student page but + // designed for the assistenz timeline component -> more extensive loading upfront + // with every abgabetermin fetched here aswell + public function fetchProjektarbeitenHistory() { + $student_uid = $this->input->post('student_uid'); + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $projektarbeiten = $this->ProjektarbeitModel->getProjektarbeitenForStudent($student_uid); + + $mapFunc = function($projektarbeit) { + return $projektarbeit->projektarbeit_id; + }; + $projektarbeiten_ids = array_map($mapFunc, $projektarbeiten->retval); + + if(count($projektarbeiten_ids) > 0) { + $ret = $this->ProjektarbeitModel->getProjektarbeitenAbgabetermine($projektarbeiten_ids); + $projektabgaben = $this->getDataOrTerminateWithError($ret, 'general'); + } + + forEach($projektarbeiten->retval as $pa) { + + $filterFunc = function($projektabgabe) use ($pa) { + return $projektabgabe->projektarbeit_id == $pa->projektarbeit_id; + }; + + $pa->abgabetermine = array_values(array_filter($projektabgaben, $filterFunc)); + } + + $this->terminateWithSuccess($projektarbeiten->retval); + } + /** * helper function to check the signature status of uploaded files for zwischenabgabe & endupload */ @@ -1206,14 +1773,7 @@ class Abgabe extends FHCAPI_Controller }; Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc); if(!$projektarbeitIsCurrent) { - $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general'); - } - - // Link to Abgabetool - if (defined('CIS4') && CIS4) { - $ci3BootstrapFilePath = "cis.php"; - } else { - $ci3BootstrapFilePath = "index.ci.php"; + $this->terminateWithError($this->p->t('abgabetool','c4fehlerPAIsNotCurrent'), 'general'); } $path = $this->config->item('URL_MITARBEITER'); @@ -1227,7 +1787,6 @@ class Abgabe extends FHCAPI_Controller // 1. Begutachter mail ohne Token $mail_baselink = APP_ROOT.$this->config->item('PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER'); -// $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter"; $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid; $projekttyp_kurzbz = $projektarbeit->projekttyp_kurzbz; $subject = $projektarbeit->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung'; @@ -1247,7 +1806,7 @@ class Abgabe extends FHCAPI_Controller $email = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id); if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general'); - + $mailres = sendSanchoMail( 'ParbeitsbeurteilungEndupload', $maildata, @@ -1265,89 +1824,115 @@ class Abgabe extends FHCAPI_Controller // 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern if ($paabgabetyp_kurzbz == 'end') { - // Zweitbegutachter holen - $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); - $zweitbegutachterRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid)); + $this->sendUploadEmailZweitbegutachterToken($bperson_id, $projektarbeit_id, $studentUser->uid); - if ($zweitbegutachterRetval && count($zweitbegutachterRetval) > 0) - { - - foreach ($zweitbegutachterRetval as $begutachter) - { - // token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft) - $tokenGenRes = $this->ProjektbetreuerModel->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id); - - if (!$tokenGenRes) - { - $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general'); - } - - $begutachterMitTokenRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id)); - - if (!$begutachterMitTokenRetval && count($begutachterMitTokenRetval) <= 0) - { - $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general'); - } - - $begutachterMitToken = $begutachterMitTokenRetval[0]; - - $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter'; - $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path"; - $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid; - $intern = isset($begutachterMitToken->uid); - $mail_link = $intern ? $mail_fulllink : $mail_baselink; - - $zweitbetmaildata = array(); - $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : ""); - $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede; - $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name; - $zweitbetmaildata['student_anrede'] = $maildata['student_anrede']; - $zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name']; - $zweitbetmaildata['abgabetyp'] = $abgabetyp; - $zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : ""; - $zweitbetmaildata['bewertunglink'] = $projektarbeitIsCurrent ? "

Zur Beurteilung der Arbeit

" : ""; - $zweitbetmaildata['token'] = $projektarbeitIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "

Zugangstoken: " . $begutachterMitToken->zugangstoken . "

" : ""; - - $mailres = sendSanchoMail( - 'ParbeitsbeurteilungEndupload', - $zweitbetmaildata, - $begutachterMitToken->email, - $subject, - 'sancho_header_min_bw.jpg', - 'sancho_footer_min_bw.jpg', - get_uid()."@".DOMAIN - ); - - if (!$mailres) - { - $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general'); - } - - } - } } } } - private function checkZuordnung($projektarbeit_id, $betreuer_uid) { + private function sendUploadEmailZweitbegutachterToken($bperson_id, $projektarbeit_id, $student_uid) { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $projektarbeitArr = $this->getDataOrTerminateWithError($this->ProjektarbeitModel->load($projektarbeit_id)); + if(count($projektarbeitArr) > 0) { + $projektarbeit = $projektarbeitArr[0]; + } else { + $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general'); + } + + // Zweitbegutachter holen + $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); + $zweitbegutachterRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $student_uid)); + + $projektarbeitIsCurrent = false; + $returnFunc = function ($result) use (&$projektarbeitIsCurrent) { + $projektarbeitIsCurrent = $result; + }; + Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc); + if(!$projektarbeitIsCurrent) { + $this->terminateWithError($this->p->t('abgabetool','c4fehlerPAIsNotCurrent'), 'general'); + } + + if ($zweitbegutachterRetval && count($zweitbegutachterRetval) > 0) + { + + foreach ($zweitbegutachterRetval as $begutachter) + { + // token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft) + $tokenGenRes = $this->ProjektbetreuerModel->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id); + + if (!$tokenGenRes) + { + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general'); + } + + $begutachterMitTokenRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $student_uid, $begutachter->person_id)); + + if (!$begutachterMitTokenRetval && count($begutachterMitTokenRetval) <= 0) + { + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general'); + } + + $begutachterMitToken = $begutachterMitTokenRetval[0]; + + $studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0]; + + $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter'; + $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path"; + $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$student_uid; + $intern = isset($begutachterMitToken->uid); + $mail_link = $intern ? $mail_fulllink : $mail_baselink; + + // automatic email ensures that, client only exposes this method if that happened already + $paabgabetyp_kurzbz = 'end'; + $abgabetyp = $paabgabetyp_kurzbz == 'end' ? 'Endabgabe' : 'Zwischenabgabe'; + + $path = $this->config->item('URL_MITARBEITER'); + $url = APP_ROOT.$path; + + $subject = $projektarbeit->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung'; + + $zweitbetmaildata = array(); + $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : ""); + $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede; + $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name; + $zweitbetmaildata['student_anrede'] = $studentUser->anrede; + $zweitbetmaildata['student_voller_name'] = trim($studentUser->titelpre." ".$studentUser->vorname." ".$studentUser->nachname." ".$studentUser->titelpost); + $zweitbetmaildata['abgabetyp'] = $abgabetyp; + $zweitbetmaildata['parbeituebersichtlink'] = $intern ? "

Zur Projektarbeitsübersicht

" : ""; + $zweitbetmaildata['bewertunglink'] = $projektarbeitIsCurrent ? "

Zur Beurteilung der Arbeit

" : ""; + $zweitbetmaildata['token'] = $projektarbeitIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "

Zugangstoken: " . $begutachterMitToken->zugangstoken . "

" : ""; + + $this->addMeta('$zweitbetmaildata', $zweitbetmaildata); + + $mailres = sendSanchoMail( + 'ParbeitsbeurteilungEndupload', + $zweitbetmaildata, + $begutachterMitToken->email, + $subject, + 'sancho_header_min_bw.jpg', + 'sancho_footer_min_bw.jpg', + get_uid()."@".DOMAIN + ); + + if (!$mailres) + { + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general'); + } + + } + } + } + + private function checkZuordnung($projektarbeit_id, $auth_uid, $student_uid, $studiengang_kz) { // check if authenticated user is zugewiesen as betreuer to projektarbeit or has admin/assistenz berechtigung // over the studiengang of the student working on that projektarbeit_id - $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); - $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); - if(isError($res)) { - $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); - } + // student itself is always considered zugeordnet towards their own projektarbeit + if($auth_uid == $student_uid) return true; - if(!hasData($res)) { - $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); - } - $data = getData($res)[0]; - $student_uid = $data->uid; - $studiengang_kz = $data->studiengang_kz; - - $res = $this->ProjektarbeitModel->checkZuordnung($student_uid, $betreuer_uid); + // if auth_uid is of a betreuer, look for actual betreuungszuordnung between those ids + $res = $this->ProjektarbeitModel->checkZuordnung($student_uid, $auth_uid); if(isError($res)) { $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingBetreuerStudentZuordnung'), 'general'); } @@ -1394,9 +1979,9 @@ class Abgabe extends FHCAPI_Controller return $data->projektarbeit_id; } - private function checkZuordnungByPaabgabe($paabgabe_id, $betreuer_uid) { + private function checkZuordnungByPaabgabe($paabgabe_id, $auth_uid, $student_uid, $studiengang_kz) { $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id); - return $this->checkZuordnung($projektarbeit_id, $betreuer_uid); + return $this->checkZuordnung($projektarbeit_id, $auth_uid, $student_uid, $studiengang_kz); } // loads a projektarbeit table row by id and looks if a note has been set. A non null note field @@ -1411,7 +1996,13 @@ class Abgabe extends FHCAPI_Controller $data = getData($res)[0]; if($data->note !== NULL) { - $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general'); + // hardcode this error msg cause phrasen arent reliable and people keep bugging why the cant edit old entries they definitely shouldnt update + $message = $this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeitv3'); + if(strpos($message, "<<") === 0) { // phrase could not be loaded + $this->terminateWithError('Die Projektarbeit wurde bereits benotet, Sie dürfen deshalb keine weiteren Termine anlegen oder bearbeiten.', 'general'); + } else { + $this->terminateWithError($message); + } } } diff --git a/application/controllers/api/frontend/v1/Bookmark.php b/application/controllers/api/frontend/v1/Bookmark.php index 3e646bb51..aa45709d4 100644 --- a/application/controllers/api/frontend/v1/Bookmark.php +++ b/application/controllers/api/frontend/v1/Bookmark.php @@ -18,6 +18,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); +use \DateTime as DateTime; + class Bookmark extends FHCAPI_Controller { @@ -28,111 +30,162 @@ class Bookmark extends FHCAPI_Controller { parent::__construct([ 'getBookmarks' => self::PERM_LOGGED, - 'delete' => self::PERM_LOGGED, - 'insert' => self::PERM_LOGGED, + 'delete' => self::PERM_LOGGED, + 'insert' => self::PERM_LOGGED, 'update' => self::PERM_LOGGED, - ]); + 'changeOrder' => self::PERM_LOGGED + ]); $this->load->model('dashboard/Bookmark_model', 'BookmarkModel'); $this->uid = getAuthUID(); $this->pid = getAuthPersonID(); - } //------------------------------------------------------------------------------------------------------------------ // Public methods - /** - * gets the bookmarks associated to a user + /** + * gets the bookmarks associated to a user * @access public * @return void */ public function getBookmarks() { - $this->BookmarkModel->addOrder("bookmark_id"); + $this->BookmarkModel->addOrder("sort"); $bookmarks = $this->BookmarkModel->loadWhere(["uid"=>$this->uid]); - $bookmarks = $this->getDataOrTerminateWithError($bookmarks); + $bookmarks = $this->getDataOrTerminateWithError($bookmarks); - $this->terminateWithSuccess($bookmarks); - } - - /** - * deletes bookmark from associated user - * @access public - * @return void - */ - public function delete($bookmark_id) - { - $bookmark = $this->BookmarkModel->load($bookmark_id); - - $bookmark = current($this->getDataOrTerminateWithError($bookmark)); - - // only delete bookmark if the user is the owner of the bookmark - if($bookmark->uid == $this->uid || $this->permissionlib->isBerechtigt('admin')){ - - $delete_result = $this->BookmarkModel->delete($bookmark_id); - - $delete_result = $this->getDataOrTerminateWithError($delete_result); - - $this->terminateWithSuccess($delete_result); - }else{ - $this->_outputAuthError(['delete' => ['admin:rw']]); - } - } - - /** - * inserts new bookmark into the bookmark table - * @access public - * @return void - */ - public function insert() - { - // form validation - $this->load->library('form_validation'); - $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]'); - $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]'); - if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array()); - - $url = $this->input->post('url',true); - $title = $this->input->post('title',true); - $tag = $this->input->post('tag', true); - - $insert_into_result = $this->BookmarkModel->insert(['uid'=>$this->uid, 'url'=>$url, 'title'=>$title,'tag'=>$tag, 'insertvon'=>$this->uid, 'updateamum'=>NULL, 'updatevon'=>NULL]); - - $insert_into_result = $this->getDataOrTerminateWithError($insert_into_result); - - $this->terminateWithSuccess($insert_into_result); - - } + $this->terminateWithSuccess($bookmarks); + } /** - * updates bookmark in the bookmark table + * deletes bookmark from associated user * @access public * @return void */ - public function update($bookmark_id) + public function delete($bookmark_id) { - // form validation - $this->load->library('form_validation'); - $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]'); - $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]'); - if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array()); + $bookmark = $this->BookmarkModel->load($bookmark_id); - $url = $this->input->post('url',true); - $title = $this->input->post('title',true); + $bookmark = current($this->getDataOrTerminateWithError($bookmark)); + + // only delete bookmark if the user is the owner of the bookmark + if ($bookmark->uid == $this->uid || $this->permissionlib->isBerechtigt('admin')) { + $delete_result = $this->BookmarkModel->delete($bookmark_id); + + $delete_result = $this->getDataOrTerminateWithError($delete_result); + + $this->terminateWithSuccess($delete_result); + } else { + $this->_outputAuthError(['delete' => ['admin:rw']]); + } + } + + /** + * inserts new bookmark into the bookmark table + * @access public + * @return void + */ + public function insert() + { + // form validation + $this->load->library('form_validation'); + $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]'); + $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]'); + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $url = $this->input->post('url', true); + $title = $this->input->post('title', true); + $tag = $this->input->post('tag', true); + if (is_array($tag)) { + $tag = json_encode($tag); // convert PHP array to JSON string + } + $sort = $this->input->post('sort', true); + + $insert_into_result = $this->BookmarkModel->insert([ + 'uid' => $this->uid, + 'url' => $url, + 'title' => $title, + 'tag' => $tag, + 'insertvon' => $this->uid, + 'updateamum' => null, + 'updatevon' => null, + 'sort' => $sort + ]); + + $insert_into_result = $this->getDataOrTerminateWithError($insert_into_result); + + $this->terminateWithSuccess($insert_into_result); + } + + /** + * updates bookmark in the bookmark table + * @access public + * @return void + */ + public function update($bookmark_id) + { + // form validation + $this->load->library('form_validation'); + $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]'); + $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]'); + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $url = $this->input->post('url', true); + $title = $this->input->post('title', true); + $tag = $this->input->post('tag', true); + if (is_array($tag)) { + $tag = json_encode($tag); + } $now = new DateTime(); $now = $now->format('Y-m-d H:i:s'); - $update_result = $this->BookmarkModel->update($bookmark_id,['url'=>$url, 'title'=>$title,'updateamum'=>$now]); + $update_result = $this->BookmarkModel->update($bookmark_id, [ + 'url' => $url, + 'title' => $title, + 'tag' => $tag, + 'updateamum' => $now + ]); - $update_result = $this->getDataOrTerminateWithError($update_result); + $update_result = $this->getDataOrTerminateWithError($update_result); - $this->terminateWithSuccess($update_result); + $this->terminateWithSuccess($update_result); + } - } + /** + * changes sort of two bookmarks in the bookmark table + * @access public + * @return void + */ + public function changeOrder($bookmark_id1, $bookmark_id2) + { + $update_result = []; + + $result1 = $this->BookmarkModel->load($bookmark_id1); + $data1 = $this->getDataOrTerminateWithError($result1); + $sort1 = current($data1)->sort; + + $result2 = $this->BookmarkModel->load(["bookmark_id"=>$bookmark_id2]); + $data2 = $this->getDataOrTerminateWithError($result2); + $sort2 = current($data2)->sort; + + $update_result1 = $this->BookmarkModel->update($bookmark_id1, [ + 'sort' => $sort2 + ]); + $update_result[] = $this->getDataOrTerminateWithError($update_result1); + + $update_result2 = $this->BookmarkModel->update($bookmark_id2, [ + 'sort' => $sort1 + ]); + $update_result[] = $this->getDataOrTerminateWithError($update_result2); + + $this->terminateWithSuccess($update_result); + } } diff --git a/application/controllers/api/frontend/v1/Cis4FhcApi.php b/application/controllers/api/frontend/v1/Cis4FhcApi.php index 372e4bfaa..4d0f906f0 100644 --- a/application/controllers/api/frontend/v1/Cis4FhcApi.php +++ b/application/controllers/api/frontend/v1/Cis4FhcApi.php @@ -27,7 +27,7 @@ class Cis4FhcApi extends FHCAPI_Controller public function __construct() { parent::__construct([ - 'getViewData' => self::PERM_LOGGED, + 'dashboardViewData' => self::PERM_LOGGED, ]); } @@ -36,17 +36,22 @@ class Cis4FhcApi extends FHCAPI_Controller // Public methods /** - * fetches ViewData - */ - public function getViewData() + * retrieves view data for dashboard view + * @access public + * @param $uid the userID for which profile is being viewed, null or missing value implies one's own profile + */ + public function dashboardViewData() { $this->load->model('person/Person_model','PersonModel'); $personData = getData($this->PersonModel->getByUid(getAuthUID()))[0]; + $this->load->config('calendar'); + $viewData = array( 'uid' => getAuthUID(), 'name' => $personData->vorname, - 'person_id' => $personData->person_id + 'person_id' => $personData->person_id, + 'timezone' => $this->config->item('timezone'), ); $this->terminateWithSuccess($viewData); diff --git a/application/controllers/api/frontend/v1/CisMenu.php b/application/controllers/api/frontend/v1/CisMenu.php index 4f4f2573e..163c337ae 100644 --- a/application/controllers/api/frontend/v1/CisMenu.php +++ b/application/controllers/api/frontend/v1/CisMenu.php @@ -16,12 +16,13 @@ * along with this program. If not, see . */ -if (! defined('BASEPATH')) exit('No direct script access allowed'); +if (!defined('BASEPATH')) + exit('No direct script access allowed'); class CisMenu extends FHCAPI_Controller { - + /** * Object initialization */ @@ -31,28 +32,95 @@ class CisMenu extends FHCAPI_Controller 'getMenu' => self::PERM_LOGGED, ]); - + } //------------------------------------------------------------------------------------------------------------------ // Public methods - /** + /** * fetches the menu for CIS from the database based on the userLanguage */ - public function getMenu() + public function getMenu() { $this->load->model('content/Content_model', 'ContentModel'); $this->load->config('cis'); - $cis4_content_id =$this->config->item('cis_menu_root_content_id'); - $result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(),getUserLanguage()); + $cis4_content_id = $this->config->item('cis_menu_root_content_id'); + $result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(), getUserLanguage()); $result = $this->getDataOrTerminateWithError($result); $menu = $result->childs ?? []; - $this->terminateWithSuccess($menu); - } - - + $menu = $this->generateUrlsForMenuItems($menu); + $this->terminateWithSuccess($menu); + } + + private function generateUrlsForMenuItems($menuItems) + { + return array_map( + function ($menuItem) { + return $this->generateUrlForMenuItem($menuItem); + }, + $menuItems + ); + } + + private function generateUrlForMenuItem($menuItem) + { + $menuItem->url = $this->menuItemUrlHelper($menuItem); + unset($menuItem->content); + + if ($menuItem->childs && count($menuItem->childs)) { + $menuItem->childs = $this->generateUrlsForMenuItems($menuItem->childs); + } + + return $menuItem; + } + + private function menuItemUrlHelper($menuItem) + { + if ($menuItem->template_kurzbz !== 'redirect') { + return site_url("/CisVue/Cms/content/" . $menuItem->content_id); + } + + if (!$menuItem->content || !mb_strlen($menuItem->content)) { + return ''; + } + + $doc = new DOMDocument(); + $doc->loadXML($menuItem->content); + $urlElem = $doc->getElementsByTagName('url')->item(0); + + if (!$urlElem) { + return ''; + } + + $url = $urlElem->textContent; + + if (strpos($url, '../cms/news.php') !== false) { + $newsRegex = '/^\.\.\/cms\/news\.php/'; + $url = preg_replace($newsRegex, site_url("/CisVue/Cms/news"), $url); + } + + if (strpos($url, '../cms/content.php?') !== false) { + $contentRegex = '/^\.\.\/cms\/content\.php\?content_id=([0-9]+)/'; + $matches = []; + preg_match($contentRegex, $url, $matches); + $url = site_url('/CisVue/Cms/content/' . $matches[1]); + } + + if (strpos($url, '../index.ci.php') !== false) { + $indexRegex = '/^\.\.\/index\.ci\.php/'; + $url = preg_replace($indexRegex, site_url(), $url); + } + + if (strpos($url, '../') !== false) { + $relativeRegex = '/^\.\.\//'; + $url = preg_replace($relativeRegex, base_url(), $url); + } + + return $url; + } + } diff --git a/application/controllers/api/frontend/v1/stv/Favorites.php b/application/controllers/api/frontend/v1/Favorites.php similarity index 78% rename from application/controllers/api/frontend/v1/stv/Favorites.php rename to application/controllers/api/frontend/v1/Favorites.php index 951eb01a4..787163abb 100644 --- a/application/controllers/api/frontend/v1/stv/Favorites.php +++ b/application/controllers/api/frontend/v1/Favorites.php @@ -20,8 +20,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** * This controller operates between (interface) the JS (GUI) and the back-end - * Provides data to the ajax get calls about favorite verbände - * Listens to ajax post calls to change the favorite verbände data + * Provides data to the ajax get calls about favorite treemenu entries + * Listens to ajax post calls to change the favorite treemenu entries * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON */ class Favorites extends FHCAPI_Controller @@ -29,7 +29,7 @@ class Favorites extends FHCAPI_Controller public function __construct() { parent::__construct([ - 'index' => self::PERM_LOGGED, + 'get' => self::PERM_LOGGED, 'set' => self::PERM_LOGGED ]); @@ -37,19 +37,19 @@ class Favorites extends FHCAPI_Controller $this->load->model('system/Variable_model', 'VariableModel'); } - public function index() + public function get($app) { - $result = $this->VariableModel->getVariables(getAuthUID(), ['stv_favorites']); + $result = $this->VariableModel->getVariables(getAuthUID(), [$app . '_favorites']); $data = $this->getDataOrTerminateWithError($result); if (!$data) $this->terminateWithSuccess(null); else - $this->terminateWithSuccess($data['stv_favorites'] ?? null); + $this->terminateWithSuccess($data[$app . '_favorites'] ?? null); } - public function set() + public function set($app) { $this->load->library('form_validation'); @@ -60,7 +60,7 @@ class Favorites extends FHCAPI_Controller $favorites = $this->input->post('favorites'); - $result = $this->VariableModel->setVariable(getAuthUID(), 'stv_favorites', $favorites); + $result = $this->VariableModel->setVariable(getAuthUID(), $app . '_favorites', $favorites); $this->getDataOrTerminateWithError($result); diff --git a/application/controllers/api/frontend/v1/Lehre.php b/application/controllers/api/frontend/v1/Lehre.php index 10d945a3e..c2ebeb10b 100644 --- a/application/controllers/api/frontend/v1/Lehre.php +++ b/application/controllers/api/frontend/v1/Lehre.php @@ -38,7 +38,8 @@ class Lehre extends FHCAPI_Controller parent::__construct([ 'lvStudentenMail' => self::PERM_LOGGED, 'LV' => self::PERM_LOGGED, - 'Pruefungen' => self::PERM_LOGGED + 'Pruefungen' => self::PERM_LOGGED, + 'semesterAverageGrade' => self::PERM_LOGGED, ]); } @@ -100,5 +101,49 @@ class Lehre extends FHCAPI_Controller $this->terminateWithSuccess($result); } + + /** + * calculates and returns the grade average and weighted average for a specific semester + * @param string $studiensemester_kurzbz + * @return void + */ + + public function semesterAverageGrade($studiensemester_kurzbz) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $semesterLvs = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(getAuthUID(), $studiensemester_kurzbz, getUserLanguage()); + + if (isError($semesterLvs)) + return $this->outputJsonError(getError($semesterLvs)); + + $semesterLvsData = getData($semesterLvs); + + $doGradesExist = false; + $sum = 0; + $count = 0; + $sumWeighted = 0; + $sumEcts = 0; + + foreach ($semesterLvsData as $lv) { + if (!$lv->znote || $lv->znote < 1 || $lv->znote > 5) + continue; + + $doGradesExist = true; + + $sum += $lv->znote; + $count++; + $sumWeighted += $lv->znote * floatval($lv->ects); + $sumEcts += floatval($lv->ects); + } + + $averageGrade = null; + $weightedAverageGrade = null; + if ($doGradesExist) { + $averageGrade = $sum/$count; + $weightedAverageGrade = $sumWeighted/$sumEcts; + } + + $this->terminateWithSuccess(['average_grade' => $averageGrade, 'weighted_average_grade' => $weightedAverageGrade]); + } } diff --git a/application/controllers/api/frontend/v1/Lehrveranstaltung.php b/application/controllers/api/frontend/v1/Lehrveranstaltung.php index 935602391..66bda9ebf 100644 --- a/application/controllers/api/frontend/v1/Lehrveranstaltung.php +++ b/application/controllers/api/frontend/v1/Lehrveranstaltung.php @@ -56,7 +56,9 @@ class Lehrveranstaltung extends FHCAPI_Controller $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); - $lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz); + $studiengang_kz = $this->getStudiengangKz($stg_kz); + + $lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $studiengang_kz); $lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen); $tree = []; @@ -75,15 +77,17 @@ class Lehrveranstaltung extends FHCAPI_Controller $this->terminateWithSuccess($tree); } - public function getByStg($studiensemester_kurzbz = null, $studiengang_kz = null, $semester = null) + public function getByStg($studiensemester_kurzbz = null, $stg_kz = null, $semester = null) { + $studiengang_kz = $this->getStudiengangKz($stg_kz); + if (is_null($studiengang_kz) || !preg_match("/^-?[1-9][0-9]*$/", (string)$studiengang_kz)) $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); $verband = null; if (!is_null($semester) && !is_numeric($semester)) { - $verband = $semester; + $verband = $this->getOrgformKurzbz($semester); $semester = null; } @@ -260,18 +264,53 @@ class Lehrveranstaltung extends FHCAPI_Controller } } + protected function getStudiengangKz($studiengang_typ_kurzbz) + { + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $result = $this->StudiengangModel->loadWhere([ + 'LOWER(CONCAT(typ, kurzbz)) =' => strtolower($studiengang_typ_kurzbz) + ]); + + $data = $this->getDataOrTerminateWithError($result); + + if (!$data) + return null; + + return current($data)->studiengang_kz; + } + private function getStudiensemesterKurzbz($studiensemester_kurzbz = null) { if (!is_null($studiensemester_kurzbz)) { - $studiensemester_result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz); + $studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere([ + 'LOWER(studiensemester_kurzbz)' => strtolower($studiensemester_kurzbz) + ]); if (isError($studiensemester_result) || !hasData($studiensemester_result)) - $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); return getData($studiensemester_result)[0]->studiensemester_kurzbz; } $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); } + + protected function getOrgformKurzbz($orgform_kurzbz) + { + if ($orgform_kurzbz === null) + return null; + + $this->load->model('codex/Orgform_model', 'OrgformModel'); + $result = $this->OrgformModel->loadWhere([ + 'LOWER(orgform_kurzbz) =' => strtolower($orgform_kurzbz) + ]); + + $data = $this->getDataOrTerminateWithError($result); + + if (!$data) + return $orgform_kurzbz; + + return current($data)->orgform_kurzbz; + } } diff --git a/application/controllers/api/frontend/v1/LvPlan.php b/application/controllers/api/frontend/v1/LvPlan.php index 28b48e3f1..f9d2cc3cf 100644 --- a/application/controllers/api/frontend/v1/LvPlan.php +++ b/application/controllers/api/frontend/v1/LvPlan.php @@ -16,7 +16,8 @@ * along with this program. If not, see . */ -if (! defined('BASEPATH')) exit('No direct script access allowed'); +if (!defined('BASEPATH')) + exit('No direct script access allowed'); use CI3_Events as Events; use \DateTime as DateTime; @@ -33,19 +34,27 @@ class LvPlan extends FHCAPI_Controller parent::__construct([ 'getRoomplan' => self::PERM_LOGGED, - 'Stunden' => self::PERM_LOGGED, - 'getReservierungen' => self::PERM_LOGGED, + 'Stunden' => self::PERM_LOGGED, + 'getReservierungen' => self::PERM_LOGGED, 'LvPlanEvents' => self::PERM_LOGGED, 'eventsPersonal' => self::PERM_LOGGED, 'eventsLv' => self::PERM_LOGGED, 'getLehreinheitStudiensemester' => self::PERM_LOGGED, 'studiensemesterDateInterval' => self::PERM_LOGGED, 'getLvPlanForStudiensemester' => self::PERM_LOGGED, - 'getLv' => self::PERM_LOGGED + 'getLv' => self::PERM_LOGGED, + 'eventsStgOrg' => self::PERM_LOGGED, + 'fetchFerienEvents' => self::PERM_LOGGED, + 'getStudiengaenge' => self::PERM_LOGGED, + 'getLehrverband' => self::PERM_LOGGED, + 'permissionOtherLvPlan' => self::PERM_LOGGED, + 'compactibleEventTypes' => self::PERM_LOGGED, + 'getLeEvents' => self::PERM_LOGGED, + 'getLvEvents' => self::PERM_LOGGED, ]); - $this->load->library('LogLib'); - $this->loglib->setConfigs(array( + $this->load->library('LogLib'); + $this->loglib->setConfigs(array( 'classIndex' => 5, 'functionIndex' => 5, 'lineIndex' => 4, @@ -54,16 +63,22 @@ class LvPlan extends FHCAPI_Controller )); $this->load->library('form_validation'); + $this->load->library('PhrasesLib'); + $this->loadPhrases( + array( + 'ui' + ) + ); } //------------------------------------------------------------------------------------------------------------------ // Public methods /** - * fetches LvPlan and Moodle events together - * @access public - * - */ + * fetches LvPlan and Moodle events together + * @access public + * + */ public function LvPlanEvents() { $hasLv = $this->input->post('lv_id'); @@ -83,24 +98,31 @@ class LvPlan extends FHCAPI_Controller // form validation $this->form_validation->set_rules('start_date', "start_date", "required"); $this->form_validation->set_rules('end_date', "end_date", "required"); - + if (!$this->form_validation->run()) $this->terminateWithValidationErrors($this->form_validation->error_array()); // storing the post parameter in local variables $start_date = $this->input->post('start_date', true); $end_date = $this->input->post('end_date', true); + $uid = $this->input->post('uid', true); + + // disallow accessing other user's events if missing permission + if ($uid && $uid !== getAuthUID() && !$this->permissionlib->isBerechtigt('basis/other_lv_plan')) { + $this->terminateWithError("Missing permission to view other users' timetables!"); + } // fetching lvplan events - $result = $this->stundenplanlib->getEventsUser($start_date, $end_date); + $result = $this->stundenplanlib->getEventsUser($start_date, $end_date, $uid); + $lvplanEvents = $this->getDataOrTerminateWithError($result); // fetching moodle events - $moodleEvents = $this->fetchMoodleEvents($start_date, $end_date); + $moodleEvents = $this->fetchMoodleEvents($start_date, $end_date, $uid); // fetching ferien events - $ferienEvents = $this->fetchFerienEvents($start_date, $end_date); - + $ferienEvents = $this->fetchFerienEvents($start_date, $end_date, $uid); + $this->terminateWithSuccess(array_merge( $lvplanEvents, @@ -109,6 +131,45 @@ class LvPlan extends FHCAPI_Controller )); } + /** + * fetches LvPlan for studiengang / semester / verband / gruppe + * + * @access public + */ + public function eventsStgOrg() + { + $this->load->library('StundenplanLib'); + + // form validation + $this->form_validation->set_rules('start_date', "start_date", "required"); + $this->form_validation->set_rules('end_date', "end_date", "required"); + //$this->form_validation->set_rules('stg_kz', "stg_kz", "required"); //no validation show empty calendar + + if (!$this->form_validation->run()) { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + $stgOrgEvents = []; + $ferienEvents = []; + } else { + $start_date = $this->input->post('start_date', true); + $end_date = $this->input->post('end_date', true); + $stg_kz = $this->input->post('stg_kz', true); + $sem = $this->input->post('sem', true); + $verband = $this->input->post('verband', true); + $gruppe = $this->input->post('gruppe', true); + + $result = $this->stundenplanlib->getEventsStgOrg($start_date, $end_date, $stg_kz, $sem, $verband, $gruppe); + $stgOrgEvents = $this->getDataOrTerminateWithError($result); + + $result = $this->stundenplanlib->fetchFerienTageEvents($start_date, $end_date, $stg_kz); + $ferienEvents = $this->getDataOrTerminateWithError($result); + } + + $this->terminateWithSuccess(array_merge( + $stgOrgEvents, + $ferienEvents + )); + } + /** * fetches LvPlan and Ferien events together for the lv * @@ -122,7 +183,7 @@ class LvPlan extends FHCAPI_Controller $this->form_validation->set_rules('start_date', "start_date", "required"); $this->form_validation->set_rules('end_date', "end_date", "required"); $this->form_validation->set_rules('lv_id', "lv_id", "required|integer"); - + if (!$this->form_validation->run()) $this->terminateWithValidationErrors($this->form_validation->error_array()); @@ -137,7 +198,6 @@ class LvPlan extends FHCAPI_Controller // fetching ferien events $ferienEvents = $this->fetchFerienEvents($start_date, $end_date); - $this->terminateWithSuccess(array_merge( $lvplanEvents, @@ -145,41 +205,75 @@ class LvPlan extends FHCAPI_Controller )); } + public function getLeEvents($le_id = null, $start_date = null, $end_date = null, $stundenplan = 'stundenplandev') + { + + if (is_null($le_id) || is_null($start_date) || is_null($end_date)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + if ($stundenplan !== 'stundenplandev' && $stundenplan !== 'stundenplan') + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $this->load->library('StundenplanLib'); + + $result = $this->stundenplanlib->getEventsByLE($le_id, $start_date, $end_date, $stundenplan); + $lvplanEvents = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($lvplanEvents); + } + + public function getLvEvents($lv_id = null, $start_date = null, $end_date = null, $stundenplan = 'stundenplandev') + { + if (is_null($lv_id) || is_null($start_date) || is_null($end_date)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + if ($stundenplan !== 'stundenplandev' && $stundenplan !== 'stundenplan') + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $this->load->library('StundenplanLib'); + + $result = $this->stundenplanlib->getEventsByLV($lv_id, $start_date, $end_date, $stundenplan); + + $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } + //TODO: delete this function if we don't use the old calendar export endpoints anymore - public function studiensemesterDateInterval($date){ - $this->load->model('organisation/Studiensemester_model','StudiensemesterModel'); - $studiensemester =$this->StudiensemesterModel->getByDate(date_format(date_create($date),'Y-m-d')); - $studiensemester =current($this->getDataOrTerminateWithError($studiensemester)); + public function studiensemesterDateInterval($date) + { + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $studiensemester = $this->StudiensemesterModel->getByDate(date_format(date_create($date), 'Y-m-d')); + $studiensemester = current($this->getDataOrTerminateWithError($studiensemester)); $this->terminateWithSuccess($studiensemester); } - public function getLvPlanForStudiensemester($studiensemester,$lvid){ + public function getLvPlanForStudiensemester($studiensemester, $lvid) + { $this->load->library('StundenplanLib'); - $this->load->model('organisation/Studiensemester_model','StudiensemesterModel'); - - $studiensemester_result = $this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz"=>$studiensemester]); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $studiensemester_result = $this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz" => $studiensemester]); $studiensemester_result = current($this->getDataOrTerminateWithError($studiensemester_result)); $timespan_start = new DateTime($studiensemester_result->start); $timespan_ende = new DateTime($studiensemester_result->ende); - $lvplan = $this->stundenplanlib->getStundenplan(date_format($timespan_start, 'Y-m-d'),date_format($timespan_ende, 'Y-m-d'), $lvid); + $lvplan = $this->stundenplanlib->getStundenplan(date_format($timespan_start, 'Y-m-d'), date_format($timespan_ende, 'Y-m-d'), $lvid); $this->terminateWithSuccess($lvplan); - - } - - /** - * fetches Stunden layout from database - * @access public - * - */ - public function Stunden() + } + + + /** + * fetches Stunden layout from database + * @access public + * + */ + public function Stunden() { $this->load->model('ressource/Stunde_model', 'StundeModel'); $this->StundeModel->addOrder('stunde', 'ASC'); $stunden = $this->StundeModel->load(); - $stunden = $this->getDataOrTerminateWithError($stunden); + $stunden = $this->getDataOrTerminateWithError($stunden); $this->terminateWithSuccess($stunden); } @@ -210,10 +304,10 @@ class LvPlan extends FHCAPI_Controller $roomplan_data = $this->stundenplanlib->getRoomplan($ort_kurzbz, $start_date, $end_date); $roomplan_data = $this->getDataOrTerminateWithError($roomplan_data); - + $this->terminateWithSuccess($roomplan_data); } - + /** * gets the reservierungen of a room if the ort_kurzbz parameter is * supplied otherwise gets the reservierungen of the lvplan of a student @@ -226,25 +320,32 @@ class LvPlan extends FHCAPI_Controller { $this->form_validation->set_rules('start_date', "StartDate", "required"); $this->form_validation->set_rules('end_date', "EndDate", "required"); - + if (!$this->form_validation->run()) $this->terminateWithValidationErrors($this->form_validation->error_array()); // storing the post parameter in local variables $start_date = $this->input->post('start_date', true); $end_date = $this->input->post('end_date', true); + $uid = $this->input->post('uid', true); + + // disallow accessing other user's reservierungen if missing permission + if ($uid && $uid !== getAuthUID() && !$this->permissionlib->isBerechtigt('basis/other_lv_plan')) { + $this->terminateWithError("Missing permission to view other users' timetables!"); + } // get data $this->load->library('StundenplanLib'); - $result = $this->stundenplanlib->getReservierungen($start_date, $end_date, $ort_kurzbz); + $result = $this->stundenplanlib->getReservierungen($start_date, $end_date, $ort_kurzbz, $uid); $result = $this->getDataOrTerminateWithError($result); $this->terminateWithSuccess($result); } - public function getLehreinheitStudiensemester($lehreinheit_id){ + public function getLehreinheitStudiensemester($lehreinheit_id) + { $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); $this->LehreinheitModel->addSelect(["studiensemester_kurzbz"]); $result = $this->LehreinheitModel->load($lehreinheit_id); @@ -287,6 +388,68 @@ class LvPlan extends FHCAPI_Controller return $this->terminateWithSuccess(current($result)); } + public function getStudiengaenge() + { + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $this->StudiengangModel->addOrder('typ'); + $this->StudiengangModel->addOrder('kurzbz'); + $result = $this->StudiengangModel->loadWhere([ + 'aktiv' => true + ]); + + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess($data); + } + + public function getLehrverband($studiengang_kz, $semester = null, $verband = null) + { + $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); + + $where = [ + 'aktiv' => true, + 'studiengang_kz' => $studiengang_kz, + ]; + + if ($semester !== null && $semester !== 'null' && $semester !== 'undefined') { + $where['semester'] = $semester; + } + if ($verband !== null && $verband !== 'null' && $verband !== 'undefined') { + $where['verband'] = $verband; + } + + $this->LehrverbandModel->addOrder('studiengang_kz'); + $this->LehrverbandModel->addOrder('semester'); + $this->LehrverbandModel->addOrder('verband'); + $this->LehrverbandModel->addOrder('gruppe'); + $result = $this->LehrverbandModel->loadWhere($where); + + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess($data); + } + + /** + * Checks if the current user has permission to view other users' timetables + * + * @return void + */ + public function permissionOtherLvPlan() + { + $this->terminateWithSuccess($this->permissionlib->isBerechtigt('basis/other_lv_plan')); + } + + /** + * get event types which can be compacted in lv plan display + * + * @return void + */ + public function compactibleEventTypes() + { + $this->terminateWithSuccess(["lehreinheit", "reservierung", "ferien", "moodle"]); + } + /** * fetch moodle events * @@ -294,30 +457,34 @@ class LvPlan extends FHCAPI_Controller * @param string $end_date * @return array */ - private function fetchMoodleEvents($start_date, $end_date) + private function fetchMoodleEvents($start_date, $end_date, $uid = null) { + if ($uid && $uid !== getAuthUID()) { + return []; + } + $this->load->config('calendar'); $tz = new DateTimeZone($this->config->item('timezone')); - + $start = new DateTime($start_date); $start->setTimezone($tz); - + $end = new DateTime($end_date); $end->setTimezone($tz); $end->modify('+1 day -1 second'); - + $moodle_events = []; - + Events::trigger( 'moodleCalendarEvents', - function & () use (&$moodle_events) { + function &() use (&$moodle_events) { return $moodle_events; }, [ 'start_date' => $start->format('c'), 'end_date' => $end->format('c'), - 'username' => getAuthUID() + 'username' => $uid ?? getAuthUID() ] ); @@ -331,23 +498,23 @@ class LvPlan extends FHCAPI_Controller * @param string $end_date * @return array */ - private function fetchFerienEvents($start_date, $end_date) + private function fetchFerienEvents($start_date, $end_date, $uid = null) { $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); $this->load->model('education/Studentlehrverband_model', 'StudentLehrverbandModel'); $currentStudiensemester = $this->StudiensemesterModel->getByDate($start_date); $currentStudiensemester = $this->getDataOrTerminateWithError($currentStudiensemester); - + if ($currentStudiensemester) { $studentsemester_kurzbz = current($currentStudiensemester)->studiensemester_kurzbz; $studiengang = $this->StudentLehrverbandModel->loadWhere([ - "student_uid" => getAuthUID(), + "student_uid" => $uid ?? getAuthUID(), "studiensemester_kurzbz" => $studentsemester_kurzbz ]); $studiengang = $this->getDataOrTerminateWithError($studiengang); - + if ($studiengang) $studiengang_kz = current($studiengang)->studiengang_kz; else @@ -357,7 +524,7 @@ class LvPlan extends FHCAPI_Controller } $ferienEvents = $this->stundenplanlib->fetchFerienTageEvents($start_date, $end_date, $studiengang_kz); - + return $this->getDataOrTerminateWithError($ferienEvents); } } diff --git a/application/controllers/api/frontend/v1/OtherLvPlan.php b/application/controllers/api/frontend/v1/OtherLvPlan.php new file mode 100644 index 000000000..1807f0a4a --- /dev/null +++ b/application/controllers/api/frontend/v1/OtherLvPlan.php @@ -0,0 +1,77 @@ +. + */ + +if (!defined('BASEPATH')) + exit('No direct script access allowed'); + +class OtherLvPlan extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + parent::__construct([ + 'otherLvPlanViewData' => ['basis/other_lv_plan:r'], + ]); + + $this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $this->load->library('ProfilLib'); + + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * retrieves viewData for other lv plan view + * @access public + * @param $uid the userID for which the other lv plan is being viewed + */ + public function otherLvPlanViewData($uid) + { + $isMitarbeiterResult = $this->MitarbeiterModel->isMitarbeiter($uid); + $isMitarbeiter = getData($isMitarbeiterResult); + $isStudent = !$isMitarbeiter; + + $resProfileData = $this->profillib->getView($uid); + $profileData = hasData($resProfileData) ? getData($resProfileData) : null; + + $viewData = [ + "user_data" => [ + "username" => $uid, + "is_student" => $isStudent, + "is_mitarbeiter" => $isMitarbeiter, + "foto" => $profileData->data->foto, + "vorname" => $profileData->data->vorname, + "nachname" => $profileData->data->nachname, + "titel" => $profileData->data->titel, + "postnomen" => $profileData->data->postnomen, + ], + ]; + + $this->terminateWithSuccess($viewData); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + +} + diff --git a/application/controllers/api/frontend/v1/Phrasen.php b/application/controllers/api/frontend/v1/Phrasen.php index 7cc652c71..3e13bb61e 100644 --- a/application/controllers/api/frontend/v1/Phrasen.php +++ b/application/controllers/api/frontend/v1/Phrasen.php @@ -32,6 +32,8 @@ class Phrasen extends FHCAPI_Controller 'setLanguage' => self::PERM_ANONYMOUS, 'getLanguage' => self::PERM_ANONYMOUS, 'getAllLanguages' => self::PERM_ANONYMOUS, + 'getPhrases' => self::PERM_ANONYMOUS, + 'getTabulatorPhrases' => self::PERM_ANONYMOUS, ]); $this->load->helper('hlp_language'); @@ -92,4 +94,59 @@ class Phrasen extends FHCAPI_Controller $this->terminateWithSuccess($langs); } + public function getPhrases() + { + $postParams = $this->getPostJSON(); + + $languages = $postParams->languages; + if (!$languages || !count($languages)) { + $this->load->model('system/Sprache_model', 'sprachenModel'); + $activeLanguages = $this->sprachenModel->loadWhere(array('content' => true)); + $activeLanguagesData = $this->getDataOrTerminateWithError($activeLanguages); + $languages = array_map( + function ($languageData) { + return $languageData->sprache; + }, + $activeLanguagesData + ); + } + + $this->load->model('system/Phrase_model', 'phraseModel'); + $phrasesGroupedByCategory = $postParams->phrasesGroupedByCategory; + $result = []; + foreach ($languages as $language) { + $phrases = $this->phraseModel->getPhrasesByCategoryAndPhrasesAndLanguage($phrasesGroupedByCategory, $language); + $result[$language] = $this->getDataOrTerminateWithError($phrases); + } + + $this->terminateWithSuccess($result); + } + + public function getTabulatorPhrases() + { + $languages = json_decode($this->input->get('languages')); + if (!$languages || !count($languages)) { + $this->load->model('system/Sprache_model', 'sprachenModel'); + $activeLanguages = $this->sprachenModel->loadWhere(array('content' => true)); + $activeLanguagesData = $this->getDataOrTerminateWithError($activeLanguages); + $languages = array_map( + function ($languageData) { + return $languageData->sprache; + }, + $activeLanguagesData + ); + } + + $this->load->model('system/Phrase_model', 'phraseModel'); + $result = []; + foreach ($languages as $language) { + $tabulatorPhrases = $this->phraseModel->getPhrasesByCategoryAndLanguage(['tabulator'], $language); + $result[$language] = $this->getDataOrTerminateWithError($tabulatorPhrases); + } + + header('Pragma: private'); + header('Cache-Control: private, max-age=' . (60 * 60 * 24 * 30)); + $this->terminateWithSuccess($result); + } + } \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/Profil.php b/application/controllers/api/frontend/v1/Profil.php index 3133b107a..96cdea855 100644 --- a/application/controllers/api/frontend/v1/Profil.php +++ b/application/controllers/api/frontend/v1/Profil.php @@ -16,7 +16,8 @@ * along with this program. If not, see . */ -if (! defined('BASEPATH')) exit('No direct script access allowed'); +if (!defined('BASEPATH')) + exit('No direct script access allowed'); class Profil extends FHCAPI_Controller { @@ -27,13 +28,13 @@ class Profil extends FHCAPI_Controller public function __construct() { parent::__construct([ - 'fotoSperre' => self::PERM_LOGGED, + 'fotoSperre' => self::PERM_LOGGED, 'getGemeinden' => self::PERM_LOGGED, 'getAllNationen' => self::PERM_LOGGED, 'isMitarbeiter' => self::PERM_LOGGED, 'profilViewData' => self::PERM_LOGGED, ]); - + $this->load->library('PermissionLib'); $this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel'); @@ -48,28 +49,37 @@ class Profil extends FHCAPI_Controller //------------------------------------------------------------------------------------------------------------------ // Public methods - public function profilViewData($uid=null){ + + /** + * retrieves view data for profile view + * @access public + * @param $uid the userID for which profile is being viewed, null or missing value implies one's own profile + */ + public function profilViewData($uid = null) + { + $authUid = getAuthUID(); + $isProfilOfAuthUser = !$uid || $uid === $authUid; + $this->load->library('ProfilLib'); - $editable = false; - if(isset($uid) && $uid != null){ - $profil_data = $this->profillib->getView($uid); - if($uid == getAuthUID()){ - $editable = true; - } - }else{ - $editable = true; - $profil_data = $this->profillib->getView(getAuthUID()); + $profileData = $this->profillib->getView($uid ?? $authUid); + $profileData = hasData($profileData) ? getData($profileData) : null; + + $viewData = [ + 'editable' => $isProfilOfAuthUser, + 'profil_data' => $profileData, + 'permissions' => [ + 'basis/other_lv_plan' => $this->permissionlib->isBerechtigt(('basis/other_lv_plan')) + ] + ]; + + if ($isProfilOfAuthUser) { + $viewData['calendar_sync_urls'] = $this->getCalendarSyncUrlData(); } - - $profil_data = hasData($profil_data) ? getData($profil_data) : null; - $viewData = array( - 'editable'=>$editable, - 'profil_data' => $profil_data, - ); + $this->terminateWithSuccess($viewData); } - /** + /** * update column foto_sperre in public.tbl_person * @access public * @param boolean $value new value for the column @@ -77,9 +87,9 @@ class Profil extends FHCAPI_Controller */ public function fotoSperre($value) { - if(!isset($value)){ - $this->terminateWithError("Missing parameter", self::ERROR_TYPE_GENERAL); - } + if (!isset($value)) { + $this->terminateWithError("Missing parameter", self::ERROR_TYPE_GENERAL); + } $res = $this->PersonModel->update($this->pid, ["foto_sperre" => $value]); if (isError($res)) { @@ -87,10 +97,10 @@ class Profil extends FHCAPI_Controller } $this->PersonModel->addSelect("foto_sperre"); $res = $this->PersonModel->load($this->pid); - - $res = $this->getDataOrTerminateWithError($res); - - $this->terminateWithSuccess(current($res)); + + $res = $this->getDataOrTerminateWithError($res); + + $this->terminateWithSuccess(current($res)); } /** @@ -109,7 +119,7 @@ class Profil extends FHCAPI_Controller if (isError($nation_res)) { $this->terminateWithError("error while trying to query table codex.tbl_nation", self::ERROR_TYPE_GENERAL); } - + $nation_res = $this->getDataOrTerminateWithError($nation_res); $this->terminateWithSuccess($nation_res); @@ -117,30 +127,30 @@ class Profil extends FHCAPI_Controller public function getGemeinden($nation, $zip) { - if(!isset($nation) || !isset($zip)){ + if (!isset($nation) || !isset($zip)) { echo json_encode(error("Missing parameters")); return; } - + $this->load->model('codex/Gemeinde_model', "GemeindeModel"); - + $gemeinde_res = $this->GemeindeModel->getGemeindeByPlz($zip); - + if (isError($gemeinde_res)) { - $this->terminateWithError(getError($gemeinde_res),self::ERROR_TYPE_GENERAL); + $this->terminateWithError(getError($gemeinde_res), self::ERROR_TYPE_GENERAL); } $gemeinde_res = $this->getDataOrTerminateWithError($gemeinde_res); - + /* $gemeinde_res = array_map(function ($obj) { return $obj->ortschaftsname; }, $gemeinde_res); */ - $this->terminateWithSuccess($gemeinde_res); - + $this->terminateWithSuccess($gemeinde_res); + } - + /** * checks whether a specific userID is a mitarbeiter or not (foreword declaration of the function isMitarbeiter in Mitarbeiter_model.php) * @access public @@ -150,23 +160,48 @@ class Profil extends FHCAPI_Controller public function isMitarbeiter($uid) { - if(!$uid) $this->terminateWithError("No uid provided", self::ERROR_TYPE_GENERAL); - - + if (!$uid) + $this->terminateWithError("No uid provided", self::ERROR_TYPE_GENERAL); + + $result = $this->MitarbeiterModel->isMitarbeiter($uid); - + if (isError($result)) { $this->terminateWithError("error when calling Mitarbeiter_model function isMitarbeiter with uid " . $uid, self::ERROR_TYPE_GENERAL); } $result = $this->getDataOrTerminateWithError($result); - + $this->terminateWithSuccess($result); } // ----------------------------------------------------------------------------------------------------------------- // Private methods - + /** + * gets the identifier, phrase, and url for each calendar sync option + * @access private + * @return array array of arrays, where each child array is a sync option + */ + private function getCalendarSyncUrlData() + { + return [ + [ + "identifier" => "cal_dav", + "labelPhrase" => "profil/calendar_sync_cal_dav", + "url" => APP_ROOT . "webdav/lvplan.php/calendars/" . $this->uid . "/LVPlan-" . $this->uid, + ], + [ + "identifier" => "cal_dav_principal", + "labelPhrase" => "profil/calendar_sync_cal_dav_principal", + "url" => APP_ROOT . "webdav/lvplan.php/principals/" . $this->uid, + ], + [ + "identifier" => "i_cal", + "labelPhrase" => "profil/calendar_sync_i_cal", + "url" => APP_ROOT . "webdav/google.php?cal=" . encryptData($this->uid, LVPLAN_CYPHER_KEY) . "&" . microtime(true), + ], + ]; + } } diff --git a/application/controllers/api/frontend/v1/StgOrgLvPlan.php b/application/controllers/api/frontend/v1/StgOrgLvPlan.php new file mode 100644 index 000000000..ffbf85e57 --- /dev/null +++ b/application/controllers/api/frontend/v1/StgOrgLvPlan.php @@ -0,0 +1,64 @@ +. + */ + +if (!defined('BASEPATH')) + exit('No direct script access allowed'); + +class StgOrgLvPlan extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + parent::__construct([ + 'stgOrgLvPlanViewData' => self::PERM_LOGGED, + ]); + + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * fetches view data for stg org lv plan + * @access public + */ + public function stgOrgLvPlanViewData() + { + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->StudiengangModel->addOrder('typ'); + $this->StudiengangModel->addOrder('kurzbz'); + $result = $this->StudiengangModel->loadWhere([ + 'aktiv' => true + ]); + $studiengaenge = $this->getDataOrTerminateWithError($result); + + $viewData = array( + 'studiengaenge' => $studiengaenge, + ); + + $this->terminateWithSuccess($viewData); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + +} + diff --git a/application/controllers/api/frontend/v1/Studium.php b/application/controllers/api/frontend/v1/Studium.php index d17f0c1a1..f53a4105c 100644 --- a/application/controllers/api/frontend/v1/Studium.php +++ b/application/controllers/api/frontend/v1/Studium.php @@ -62,21 +62,36 @@ class Studium extends FHCAPI_Controller if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){ $studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester->studiensemester_kurzbz]); - $studentLehrverband = current($this->getDataOrTerminateWithError($studentLehrverband)); - - $student_studiensemester = $studentLehrverband->studiensemester_kurzbz; - $student_studiengang = $studentLehrverband->studiengang_kz; - $student_semester = $studentLehrverband->semester; + + //TODO(Manu) check if use Fallback or just comment out all paramschecks? + //add Fallback: if no LehrverbandData of actual semester, get Data of previous one + if(!hasData($studentLehrverband)) + { + $result= $this->StudiensemesterModel->getPreviousFrom($aktuelles_studiensemester->studiensemester_kurzbz); + + $data = $this->getDataOrTerminateWithError($result); + $vorheriges_studiensemester = current($data)->studiensemester_kurzbz; + $studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $vorheriges_studiensemester]); + } + $studentLehrverband = current(getData($studentLehrverband)); + $student_studienplan = $this->getStudienPlanFromPrestudentStatus(getAuthPersonId())->studienplan_id; - if(!isset($parameter_studiensemester)) - $parameter_studiensemester = $student_studiensemester; - if(!isset($parameter_studiengang)) - $parameter_studiengang = $student_studiengang; - if(!isset($parameter_semester)) - $parameter_semester = $student_semester; + if(!isset($parameter_studiensemester)) { + $student_studiensemester = $studentLehrverband->studiensemester_kurzbz; + $parameter_studiensemester = $student_studiensemester; + } + if(!isset($parameter_studiengang)) { + $student_studiengang = $studentLehrverband->studiengang_kz; + $parameter_studiengang = $student_studiengang; + } + if(!isset($parameter_semester)) { + $student_semester = $studentLehrverband->semester; + $parameter_semester = $student_semester; + } if(!isset($parameter_studienplan)) - $parameter_studienplan = $student_studienplan; + $parameter_studienplan = $student_studienplan; + } if(isset($parameter_studiensemester)){ @@ -96,8 +111,7 @@ class Studium extends FHCAPI_Controller // fetch studiensemester $allStudienSemester = $this->getDataOrTerminateWithError($this->StudiensemesterModel->load()); - - + if(isset($parameter_studiensemester) && !empty(array_filter($allStudienSemester, function($studiensemester) use($parameter_studiensemester){ return $studiensemester->studiensemester_kurzbz == $parameter_studiensemester->studiensemester_kurzbz; }))){ @@ -216,6 +230,8 @@ class Studium extends FHCAPI_Controller $studienplaene = array_map(function($studienplan){ $orgform = current($this->getDataOrTerminateWithError($this->OrgformModel->loadWhere(["orgform_kurzbz" => $studienplan->orgform_kurzbz]))); $studienplan->orgform_bezeichnung = $orgform->bezeichnung; + // bezeichnung_mehrsprachig + $studienplan->orgform_bezeichnung_english = $orgform->bezeichnung_mehrsprachig[1]; return $studienplan; },$studienplaene); return $studienplaene; diff --git a/application/controllers/api/frontend/v1/TabulatorPresets.php b/application/controllers/api/frontend/v1/TabulatorPresets.php new file mode 100644 index 000000000..cb8e23ade --- /dev/null +++ b/application/controllers/api/frontend/v1/TabulatorPresets.php @@ -0,0 +1,162 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * This controller operates between (interface) the JS (GUI) and the PhrasesLib (back-end) + * Provides data to the ajax get calls about the Phrasen plugin + * This controller works with JSON calls on the HTTP GET and the output is always JSON + */ +class TabulatorPresets extends FHCAPI_Controller +{ + public function __construct() + { + parent::__construct([ + 'getTabulatorPresets' => self::PERM_LOGGED, + 'createTabulatorPreset' => self::PERM_LOGGED, + 'updateTabulatorPreset' => self::PERM_LOGGED, + 'deleteTabulatorPreset' => self::PERM_LOGGED, + ]); + + $this->load->model('tabulator/Tabulator_preset_model', 'TabulatorPresetModel'); + + $this->loadPhrases([ + 'global', + 'tabulator_presets' + ]); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + public function getTabulatorPresets() + { + $tableName = $this->input->get("tableName"); + if (!$tableName) { + $this->terminateWithError(error($this->p->t("tabulator_presets", "invalid_params_err_msg"))); + } + + $uid = getAuthUID(); + $presets = $this->TabulatorPresetModel->getTabulatorPresetsByUserAndTable($uid, $tableName); + $presetsData = $this->getDataOrTerminateWithError($presets) ?? []; + + $this->terminateWithSuccess($presetsData); + } + + public function createTabulatorPreset() + { + $tableName = $this->input->post("tableName"); + $presetName = $this->input->post("presetName"); + $preset = $this->input->post("preset"); + + if (!$tableName || !$presetName || !$preset) { + $this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400); + } + + $uid = getAuthUID(); + + $existingPresetsResult = $this->TabulatorPresetModel->getTabulatorPresetsByUserAndTable($uid, $tableName); + $existingPresets = $this->getDataOrTerminateWithError($existingPresetsResult) ?? []; + + if (count($existingPresets) > 19) { + $this->terminateWithError($this->p->t("tabulator_presets", "max_presets_count_err_msg"), "general", 409); + } + + $existingPresetNames = array_map(function($presetInfo) { + return $presetInfo->preset_name; + }, $existingPresets); + + if (in_array($presetName, $existingPresetNames)) { + $this->terminateWithError($this->p->t("tabulator_presets", "preset_name_duplicate_err_msg"), "general", 409); + } + + $presetCreationResult = $this->TabulatorPresetModel->createTabulatorPreset($uid, $tableName, $presetName, $preset); + + if (isError($presetCreationResult)) { + $this->terminateWithError($presetCreationResult->retval); + } + + $newPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetCreationResult->retval); + $newPresetArray = $this->getDataOrTerminateWithError($newPresetData) ?? [null]; + $newPreset = $newPresetArray[0]; + + $this->terminateWithSuccess($newPreset); + } + + public function updateTabulatorPreset() + { + $presetId = $this->input->post("presetId"); + $preset = $this->input->post("preset"); + + if (!$presetId || !$preset) { + $this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400); + } + + $existingPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId); + $existingPresetArray = $this->getDataOrTerminateWithError($existingPresetData) ?? [null]; + $existingPreset = $existingPresetArray[0]; + if (!$existingPreset) { + $this->terminateWithError($this->p->t("tabulator_presets", "preset_not_found_err_msg"), "general", 404); + } + + $uid = getAuthUID(); + if ($existingPreset->benutzer_uid !== $uid) { + $this->terminateWithError($this->p->t("tabulator_presets", "preset_not_own_update_err_msg"), "general", 403); + } + + $presetUpdateResult = $this->TabulatorPresetModel->updateTabulatorPreset($presetId, $preset); + if (isError($presetUpdateResult)) { + $this->terminateWithError($presetUpdateResult->retval); + } + + $updatedPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId); + $updatedPresetArray = $this->getDataOrTerminateWithError($updatedPresetData) ?? [null]; + $updatedPreset = $updatedPresetArray[0]; + + $this->terminateWithSuccess($updatedPreset); + } + + public function deleteTabulatorPreset() + { + $presetId = $this->input->post("presetId"); + if (!$presetId) { + $this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400); + } + + $presetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId); + $presetArray = $this->getDataOrTerminateWithError($presetData) ?? [null]; + $preset = $presetArray[0]; + if (!$preset) { + $this->terminateWithError($this->p->t("tabulator_presets", "preset_not_found_err_msg"), "general", 404); + } + + $uid = getAuthUID(); + if ($preset->benutzer_uid !== $uid) { + $this->terminateWithError($this->p->t("tabulator_presets", "preset_not_own_delete_err_msg"), "general", 403); + } + + $presetDeletionResult = $this->TabulatorPresetModel->deleteTabulatorPreset($presetId); + if (isError($presetDeletionResult)) { + $this->terminateWithError($presetDeletionResult->retval); + } + + $this->terminateWithSuccess(); + } + +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/Treemenu.php b/application/controllers/api/frontend/v1/Treemenu.php new file mode 100644 index 000000000..e25610370 --- /dev/null +++ b/application/controllers/api/frontend/v1/Treemenu.php @@ -0,0 +1,148 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +use \ReflectionMethod as ReflectionMethod; +use \ReflectionFunction as ReflectionFunction; + +/** + * This controller operates between (interface) the JS (GUI) and the back-end + * Provides data to the ajax get calls about menues + * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON + */ +class Treemenu extends FHCAPI_Controller +{ + public function __construct() + { + // Load Router + $router = load_class('Router'); + + // Load Config + $config = load_class('Config'); + $config->load('treemenu'); + + // Get Treemenu name & config + $name = $router->method; + $conf = $config->item($name); + + // Get Permissions from config + $permissions = $conf['permissions'] ?? self::PERM_ANONYMOUS; + + // Call constructor + parent::__construct([ + $name => $permissions + ]); + + // Load Library + $libraryName = $conf['library'] ?? null; + $this->load->library($libraryName, null, 'treemenulib'); + } + + /** + * @param string $method + * @param array $params (optional) + * + * @return void + */ + public function _remap($method, $params = []) + { + if (!$this->treemenulib) + show_404(); + + $this->addMeta('ci_method', $method); + $this->addMeta('ci_params', $params); + + $params = $this->uri->uri_to_assoc(6); // 6 = start of $params + $config = $this->treemenulib->config; + + foreach (array_keys($params) as $key) { + if (!isset($config[$key]) || !$config[$key]) + show_404(); + + $config = $config[$key]; + } + + // Prepare aliases + $argumentaliases = []; + if (property_exists($this->treemenulib, 'path_to_argument')) + $argumentaliases = array_flip($this->treemenulib->path_to_argument); + $methodaliases = []; + if (property_exists($this->treemenulib, 'redirect_method')) + $methodaliases = $this->treemenulib->redirect_method; + + $items = []; + foreach ($config as $uripart => $children) { + if (!is_array($children)) { + $uripart = $children; + $children = []; + } + + $methodName = $uripart; + if (isset($methodaliases[$methodName])) { + $methodName = $methodaliases[$methodName]; + } elseif (strpbrk($methodName, ' _-') !== false) { + $methodName = lcfirst(str_replace([' ', '_', '-'], '', ucwords($methodName, " \t\r\n\f\v_-"))); + } + + // Prepare arguments + if (is_callable($methodName, false, $name)) { + if (is_string($methodName) && is_callable([$this->treemenulib, $methodName])) + $callable = [$this->treemenulib, $methodName]; + else + $callable = $methodName; + } else { + $callable = [$this->treemenulib, $methodName]; + } + + if (is_array($callable)) + $reflection = new ReflectionMethod($callable[0], $callable[1]); + elseif (is_string($callable) && strstr($callable, '::')) + $reflection = new ReflectionMethod($callable); + elseif ($name != 'Closure::__invoke' && strstr($name, '::__invoke')) + $reflection = new ReflectionMethod($callable, '__invoke'); + else + $reflection = new ReflectionFunction($callable); + + $arguments = []; + foreach ($reflection->getParameters() as $arg) { + if ($arg->name == 'path_template') { + $path = $params; + $path[$uripart] = '%s'; + $arguments[] = $this->uri->assoc_to_uri($path); + } elseif ($arg->name == 'has_children') { + $arguments[] = $children; + } elseif ($arg->name == 'original_method') { + $arguments[] = $uripart; + } elseif (isset($argumentaliases[$arg->name]) && isset($params[$argumentaliases[$arg->name]])) { + $arguments[] = $params[$argumentaliases[$arg->name]]; + } elseif (isset($params[$arg->name])) { + $arguments[] = $params[$arg->name]; + } else { + $arguments[] = null; + } + } + + // Call function from lib + $items = array_merge($items, call_user_func_array($callable, $arguments)); + } + + $this->terminateWithSuccess($items); + } +} diff --git a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php index 7486f44f0..0ac3c8bca 100644 --- a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php +++ b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php @@ -259,7 +259,7 @@ class BetriebsmittelP extends FHCAPI_Controller $kaution = $this->input->post('kaution'); if($kaution) $kaution = str_replace(',', '.', $kaution); $ausgegebenam = $this->input->post('ausgegebenam'); - $retouram = $this->input->post('retouram'); + $retouram = $this->input->post('retouram') == "" ? null : $this->input->post('retouram'); // NOTE(chris): transform_kartennummer if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer) diff --git a/application/controllers/api/frontend/v1/dashboard/Board.php b/application/controllers/api/frontend/v1/dashboard/Board.php index c50fec128..fdded61e3 100644 --- a/application/controllers/api/frontend/v1/dashboard/Board.php +++ b/application/controllers/api/frontend/v1/dashboard/Board.php @@ -40,11 +40,32 @@ class Board extends FHCAPI_Controller public function list() { + $this->DashboardModel->addSelect('dashboard_id'); + $this->DashboardModel->addSelect('dashboard_kurzbz'); + $this->DashboardModel->addSelect('tbl_dashboard.beschreibung'); + $this->DashboardModel->addSelect("( + SELECT json_agg(w.*) + FROM dashboard.tbl_widget w + JOIN dashboard.tbl_dashboard_widget dw + USING(widget_id) + WHERE dw.dashboard_id=tbl_dashboard.dashboard_id + ) AS \"widgetSetup\""); + $result = $this->DashboardModel->load(); $data = $this->getDataOrTerminateWithError($result); - $this->terminateWithSuccess($result); + $data = array_map(function ($dashboard) { + $tmpSetups = json_decode($dashboard->widgetSetup); + $tmpSetups = array_map(function ($widget) { + $widget->setup->file = absoluteJsImportUrl($widget->setup->file); + return $widget; + }, $tmpSetups); + $dashboard->widgetSetup = $tmpSetups; + return $dashboard; + }, $data); + + $this->terminateWithSuccess($data); } public function create() @@ -82,7 +103,7 @@ class Board extends FHCAPI_Controller $data = $this->getDataOrTerminateWithError($result); - $this->terminateWithSuccess($result); + $this->terminateWithSuccess($data); } public function delete() @@ -116,6 +137,6 @@ class Board extends FHCAPI_Controller $data = $this->getDataOrTerminateWithError($result); - $this->terminateWithSuccess($result); + $this->terminateWithSuccess($data); } } diff --git a/application/controllers/api/frontend/v1/dashboard/Preset.php b/application/controllers/api/frontend/v1/dashboard/Preset.php index 5983d9660..d9be307cf 100644 --- a/application/controllers/api/frontend/v1/dashboard/Preset.php +++ b/application/controllers/api/frontend/v1/dashboard/Preset.php @@ -120,10 +120,7 @@ class Preset extends FHCAPI_Controller $conf = $this->dashboardlib->getPreset($db, $funktion); if ($conf) { $preset = json_decode($conf->preset, true); - if (!isset($preset[$funktion]) || !isset($preset[$funktion]['widgets'])) - $result[$funktion] = []; - else - $result[$funktion] = $preset[$funktion]['widgets']; + $result[$funktion] = $preset; } else { $result[$funktion] = []; } @@ -154,7 +151,7 @@ class Preset extends FHCAPI_Controller $preset_decoded = json_decode($preset->preset, true); - $this->dashboardlib->addWidgetsToWidgets($preset_decoded, $dashboard_kurzbz, $funktion_kurzbz, [$widget]); + $preset_decoded[$widget['widgetid']] = $widget; $preset->preset = json_encode($preset_decoded); @@ -186,8 +183,10 @@ class Preset extends FHCAPI_Controller $preset_decoded = json_decode($preset->preset, true); - if (!$this->dashboardlib->removeWidgetFromWidgets($preset_decoded, $funktion_kurzbz, $widgetid)) + if (!isset($preset_decoded[$widgetid])) show_404(); + + unset($preset_decoded[$widgetid]); $preset->preset = json_encode($preset_decoded); diff --git a/application/controllers/api/frontend/v1/dashboard/User.php b/application/controllers/api/frontend/v1/dashboard/User.php index 9d020649e..e603573ed 100644 --- a/application/controllers/api/frontend/v1/dashboard/User.php +++ b/application/controllers/api/frontend/v1/dashboard/User.php @@ -48,25 +48,9 @@ class User extends FHCAPI_Controller $uid = $this->authlib->getAuthObj()->username; - /*$mergedconfig = $this->dashboardlib->getMergedConfig($dashboard->dashboard_id, $uid); + $mergedconfig = $this->dashboardlib->getMergedUserConfig($dashboard->dashboard_id, $uid); - $this->terminateWithSuccess([ - 'general' => call_user_func_array( - 'array_merge_recursive', - $mergedconfig - ) - ]);*/ - $defaultconfig = $this->dashboardlib->getDefaultConfig($dashboard->dashboard_id); - $userconfig = $this->dashboardlib->getUserConfig($dashboard->dashboard_id, $uid); - - $defaultconfig_squashed = $defaultconfig ? call_user_func_array('array_replace_recursive', $defaultconfig) : []; - $userconfig_squashed = $userconfig ? call_user_func_array('array_replace_recursive', $userconfig) : []; - - $mergedconfig = array_replace_recursive($defaultconfig_squashed, $userconfig_squashed); - - $this->terminateWithSuccess([ - DashboardLib::SECTION_IF_FUNKTION_KURZBZ_IS_NULL => $mergedconfig - ]); + $this->terminateWithSuccess($mergedconfig); } public function addWidget() @@ -86,26 +70,15 @@ class User extends FHCAPI_Controller if (!isset($widget['widgetid'])) $widget['widgetid'] = $this->dashboardlib->generateWidgetId($dashboard_kurzbz); + if (isset($widget['source'])) + unset($widget['source']); + $override = $this->dashboardlib->getOverrideOrCreateEmptyOverride($dashboard_kurzbz, $uid); - + $override_decoded = json_decode($override->override, true); - if (!isset($override_decoded['general']) || !is_array($override_decoded['general'])) - $override_decoded['general'] = []; + $override_decoded[$widget['widgetid']] = $widget; - if (!isset($override_decoded['general']['widgets'])) - $override_decoded['general']['widgets'] = []; - - $override_decoded['general']['widgets'][$widget['widgetid']] = $widget; - - // NOTE(chris): remove doubles in other funktionen - foreach ($override_decoded as $funktion => $array) { - if ($funktion == 'general') - continue; - if (isset($array['widgets']) && isset($array['widgets'][$widget['widgetid']])) - unset($override_decoded[$funktion]['widgets'][$widget['widgetid']]); - } - $override->override = json_encode($override_decoded); $result = $this->dashboardlib->insertOrUpdateOverride($override); @@ -135,18 +108,10 @@ class User extends FHCAPI_Controller $override_decoded = json_decode($override->override, true); - foreach (array_keys($override_decoded) as $k) { - if (!isset($override_decoded[$k]["widgets"])) { - unset($override_decoded[$k]); - continue; - } - if (isset($override_decoded[$k]["widgets"][$widget_id])) { - unset($override_decoded[$k]["widgets"][$widget_id]); - } - if (!$override_decoded[$k]["widgets"]) { - unset($override_decoded[$k]); - } - } + if (!isset($override_decoded[$widget_id])) + show_404(); + + unset($override_decoded[$widget_id]); $override->override = json_encode($override_decoded); diff --git a/application/controllers/api/frontend/v1/detailheader/Detailheader.php b/application/controllers/api/frontend/v1/detailheader/Detailheader.php index ada10c5b6..89e9821eb 100644 --- a/application/controllers/api/frontend/v1/detailheader/Detailheader.php +++ b/application/controllers/api/frontend/v1/detailheader/Detailheader.php @@ -9,9 +9,10 @@ class Detailheader extends FHCAPI_Controller public function __construct() { parent::__construct([ - 'getHeader' => ['vertrag/mitarbeiter:r'], - 'getPersonAbteilung' => ['vertrag/mitarbeiter:r'], - 'getLeitungOrg' => ['vertrag/mitarbeiter:r'], + 'getHeader' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], + 'getPersonAbteilung' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], + 'getLeitungOrg' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], + 'getSemesterStati' => ['admin:r', 'assistenz:r'], ]); } @@ -48,6 +49,17 @@ class Detailheader extends FHCAPI_Controller $this->terminateWithSuccess(current($data)); } + public function getSemesterStati($prestudent_id) + { + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + + $result = $this->PrestudentstatusModel->getAllPrestudentstatiWithStudiensemester($prestudent_id); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + } diff --git a/application/controllers/api/frontend/v1/funktionen/Funktionen.php b/application/controllers/api/frontend/v1/funktionen/Funktionen.php index b2787072b..a3efcdb51 100644 --- a/application/controllers/api/frontend/v1/funktionen/Funktionen.php +++ b/application/controllers/api/frontend/v1/funktionen/Funktionen.php @@ -294,6 +294,10 @@ class Funktionen extends FHCAPI_Controller { $this->terminateWithValidationErrors($this->form_validation->error_array()); } + if($datum_von == '') + $datum_von = null; + if($datum_bis == '') + $datum_bis = null; $result = $this->BenutzerfunktionModel->update( [ diff --git a/application/controllers/api/frontend/v1/lv/Config.php b/application/controllers/api/frontend/v1/lv/Config.php new file mode 100644 index 000000000..4f39c6b8b --- /dev/null +++ b/application/controllers/api/frontend/v1/lv/Config.php @@ -0,0 +1,86 @@ + ['admin:r', 'assistenz:r'], + 'set' => ['admin:r', 'assistenz:r'], + ]); + + $this->_ci = &get_instance(); + $this->_setAuthUID(); + + $this->loadPhrases([ + 'lehre' + ]); + + $this->_ci->load->library('VariableLib', ['uid' => $this->_uid]); + $this->_ci->load->library('PermissionLib'); + + } + + + public function get() + { + if (!($this->permissionlib->isBerechtigt('basis/tempus')) && !($this->permissionlib->isBerechtigt('lv-plan'))) + $this->terminateWithSuccess([]); + + $ignore_kollision = $this->_ci->variablelib->getVar('ignore_kollision'); + $ignore_zeitsperre = $this->_ci->variablelib->getVar('ignore_zeitsperre'); + $ignore_reservierung = $this->_ci->variablelib->getVar('ignore_reservierung'); + + $config['ignore_kollision'] = [ + "type" => "checkbox", + "label" => 'ignore_kollision', + "value" => $ignore_kollision, + ]; + + $config['ignore_zeitsperre'] = [ + "type" => "checkbox", + "label" => 'ignore_zeitsperre', + "value" => $ignore_zeitsperre, + ]; + + $config['ignore_reservierung'] = [ + "type" => "checkbox", + "label" => 'ignore_reservierung', + "value" => $ignore_reservierung, + ]; + + $this->terminateWithSuccess($config); + } + public function set() + { + if (!($this->permissionlib->isBerechtigt('basis/tempus')) && !($this->permissionlib->isBerechtigt('lv-plan'))) + $this->terminateWithSuccess([]); + + $this->load->model('system/Variable_model', 'VariableModel'); + + foreach (['ignore_kollision','ignore_zeitsperre','ignore_reservierung'] as $variable) + { + if ($this->_ci->input->post($variable) !== null) + { + $this->VariableModel->update(array('uid' => $this->_uid, 'name' => $variable), array('wert' => $this->input->post($variable))); + + } + } + + $this->terminateWithSuccess(); + } + + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) + show_error('User authentification failed'); + } +} diff --git a/application/controllers/api/frontend/v1/lv/Favorites.php b/application/controllers/api/frontend/v1/lv/Favorites.php deleted file mode 100644 index 080a4ec6e..000000000 --- a/application/controllers/api/frontend/v1/lv/Favorites.php +++ /dev/null @@ -1,47 +0,0 @@ - self::PERM_LOGGED, - 'set' => self::PERM_LOGGED - ]); - - // Load models - $this->load->model('system/Variable_model', 'VariableModel'); - } - - public function index() - { - $result = $this->VariableModel->getVariables(getAuthUID(), ['lv_favorites']); - - $data = $this->getDataOrTerminateWithError($result); - - if (!$data) - $this->terminateWithSuccess(null); - else - $this->terminateWithSuccess(isset($data['lv_favorites']) ? $data['lv_favorites'] : null); - } - - public function set() - { - $this->load->library('form_validation'); - - $this->form_validation->set_rules('favorites', 'Favorites', 'required'); - - if (!$this->form_validation->run()) - $this->terminateWithValidationErrors($this->form_validation->error_array()); - - $favorites = $this->input->post('favorites'); - - $result = $this->VariableModel->setVariable(getAuthUID(), 'lv_favorites', $favorites); - - $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess(true); - } -} diff --git a/application/controllers/api/frontend/v1/lv/Gruppe.php b/application/controllers/api/frontend/v1/lv/Gruppe.php index daebe8a61..f60d3a99a 100644 --- a/application/controllers/api/frontend/v1/lv/Gruppe.php +++ b/application/controllers/api/frontend/v1/lv/Gruppe.php @@ -15,6 +15,7 @@ class Gruppe extends FHCAPI_Controller 'getBenutzerSearch' => ['admin:r', 'assistenz:r'], 'getAllSearch' => ['admin:r', 'assistenz:r'], 'getByLehreinheit' => ['admin:r', 'assistenz:r'], + 'getGruppe' => ['admin:r', 'assistenz:r'], ]); $this->_ci = &get_instance(); @@ -67,7 +68,7 @@ class Gruppe extends FHCAPI_Controller $this->checkPermission($lehreinheit_id); - $result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, !($lehrverband === 'false')); + $result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, $lehrverband === true || $lehrverband === 'true'); if (isError($result)) $this->terminateWithError(getError($result)); @@ -75,6 +76,71 @@ class Gruppe extends FHCAPI_Controller $this->terminateWithSuccess($result); } + public function getGruppe() + { + $lehrverband = $this->input->post('lehrverband'); + + $gruppen_result = array(); + + if ($lehrverband === false) + { + $gruppen_result = $this->_ci->GruppeModel->loadWhere(array( + 'studiengang_kz' => $this->input->post('stg_kz'), + 'gruppe_kurzbz' => $this->input->post('gruppe_kurzbz'), + 'aktiv' => true + )); + } + else if ($lehrverband === true) + { + + if (!isEmptyString($this->input->post('verband'))) + { + $this->LehrverbandModel->db->where('verband', $this->input->post('verband')); + } + else + { + $this->LehrverbandModel->db->group_start(); + $this->LehrverbandModel->db->where("trim(verband) = ''"); + $this->LehrverbandModel->db->or_where("verband IS NULL"); + $this->LehrverbandModel->db->group_end(); + } + + if (!isEmptyString($this->input->post('gruppe'))) + { + $this->LehrverbandModel->db->where('gruppe', $this->input->post('gruppe')); + } + else + { + $this->LehrverbandModel->db->group_start(); + $this->LehrverbandModel->db->where("trim(gruppe) = ''"); + $this->LehrverbandModel->db->or_where("gruppe IS NULL"); + $this->LehrverbandModel->db->group_end(); + } + + if (!isEmptyString((string)$this->input->post('semester'))) + { + $this->LehrverbandModel->db->where('semester', $this->input->post('semester')); + } + else + { + + $this->LehrverbandModel->db->group_start(); + $this->LehrverbandModel->db->where("semester = ''"); + $this->LehrverbandModel->db->or_where("semester IS NULL"); + $this->LehrverbandModel->db->group_end(); + } + + $gruppen_result = $this->LehrverbandModel->loadWhere(array('studiengang_kz' => $this->input->post('stg_kz'), 'aktiv' => true)); + } + + if (!hasData($gruppen_result)) + return $this->terminateWithError('No group found'); + + $gruppen_array = getData($gruppen_result)[0]; + + $this->terminateWithSuccess($gruppen_array->gid); + } + public function getByLehreinheit($lehreinheit_id = null) { if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id)) diff --git a/application/controllers/api/frontend/v1/lv/Lektor.php b/application/controllers/api/frontend/v1/lv/Lektor.php index cce7f6e8b..64cfd3f1c 100644 --- a/application/controllers/api/frontend/v1/lv/Lektor.php +++ b/application/controllers/api/frontend/v1/lv/Lektor.php @@ -134,9 +134,14 @@ class Lektor extends FHCAPI_Controller $this->terminateWithValidationErrors($this->form_validation->error_array()); } - if (isset($formData['semesterstunden']) && (!is_numeric($formData['semesterstunden']) || $formData['semesterstunden'] === '')) + $nullable_fields = array('semesterstunden', 'stundensatz', 'planstunden'); + + foreach ($nullable_fields as $nullable_field) { - $formData['semesterstunden'] = null; + if (isset($formData[$nullable_field]) && (!is_numeric($formData[$nullable_field]) || $formData[$nullable_field] === '')) + { + $formData[$nullable_field] = null; + } } $lehreinheit_permission = $this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan')); @@ -144,6 +149,9 @@ class Lektor extends FHCAPI_Controller if (!$lehreinheit_permission) $this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess')); + if (!is_null($this->getLektorVertrag($lehreinheit_id, $mitarbeiter_uid)) && (array_key_exists('mitarbeiter_uid', $formData) && $mitarbeiter_uid !== $formData['mitarbeiter_uid'])) + $this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess')); + $result = $this->_ci->lektorlib->updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $formData); if (isError($result)) $this->terminateWithError(getError($result)); @@ -154,7 +162,7 @@ class Lektor extends FHCAPI_Controller { $value = str_replace(',', '.', $value); - if (!is_numeric($value)) + if (!is_numeric($value) && $value !== "") { $this->form_validation->set_message('_check_decimal', 'Das Feld {field} muss eine Zahl sein.'); return false; diff --git a/application/controllers/api/frontend/v1/lv/Noten.php b/application/controllers/api/frontend/v1/lv/Noten.php new file mode 100644 index 000000000..614ee6609 --- /dev/null +++ b/application/controllers/api/frontend/v1/lv/Noten.php @@ -0,0 +1,84 @@ + 'student/noten:r', + 'getTeacherProposal' => 'student/noten:r', + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + + // Load Phrases + $this->loadPhrases([ + 'stv', + 'person', + 'lehre' + ]); + } + + public function getCertificate($lv_id, $studiensemester_kurzbz = null) + { + if (is_null($lv_id) || !ctype_digit((string)$lv_id)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $this->load->model('education/lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $result = $this->LehrveranstaltungModel->loadWhere([ + 'lehrveranstaltung_id' => $lv_id + ]); + + $lehrveranstaltung = $this->getDataOrTerminateWithError($result); + + if (!$lehrveranstaltung) + $this->terminateWithSuccess([]); + + if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } + + $result = $this->ZeugnisnoteModel->getZeugnisnoten(null, $studiensemester_kurzbz, $lehrveranstaltung[0]->lehrveranstaltung_id); + + $grades = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($grades); + } + + public function getTeacherProposal($lv_id, $studiensemester_kurzbz = null) + { + if (is_null($lv_id) || !ctype_digit((string)$lv_id)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $this->load->model('education/lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $result = $this->LehrveranstaltungModel->loadWhere([ + 'lehrveranstaltung_id' => $lv_id + ]); + + $lehrveranstaltung = $this->getDataOrTerminateWithError($result); + + if (!$lehrveranstaltung) + $this->terminateWithSuccess([]); + + if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } + + $result = $this->LvgesamtnoteModel->getLvGesamtNoten($lv_id, null, $studiensemester_kurzbz); + + $grades = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($grades); + } + +} diff --git a/application/controllers/api/frontend/v1/lv/Setup.php b/application/controllers/api/frontend/v1/lv/Setup.php index eea4befa5..4b91b99c1 100644 --- a/application/controllers/api/frontend/v1/lv/Setup.php +++ b/application/controllers/api/frontend/v1/lv/Setup.php @@ -19,6 +19,8 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); +use CI3_Events as Events; + class Setup extends FHCAPI_Controller { private $_ci; @@ -27,7 +29,8 @@ class Setup extends FHCAPI_Controller public function __construct() { parent::__construct([ - 'getTabs' => ['admin:r', 'assistenz:r'], + 'getLETabs' => ['admin:r', 'assistenz:r'], + 'getLVTabs' => ['admin:r', 'assistenz:r'], 'getStudiensemester' => ['admin:r', 'assistenz:r'], 'getSprache' => ['admin:r', 'assistenz:r'], 'getRaumtyp' => ['admin:r', 'assistenz:r'], @@ -41,9 +44,10 @@ class Setup extends FHCAPI_Controller $this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); $this->_ci->load->library('VariableLib', ['uid' => $this->_uid]); + $this->_ci->load->helper('hlp_document'); } - public function getTabs() + public function getLETabs() { $tabs['details'] = array ( 'title' => 'Details', @@ -60,11 +64,43 @@ class Setup extends FHCAPI_Controller 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'), 'config' => [] ); + $tabs['termine'] = array ( + 'title' => 'Termine', + 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Termine.js'), + 'config' => [] + ); $tabs['notiz'] = array ( 'title' => 'Notizen', 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'), 'config' => [] ); + + Events::trigger('lvv_conf_tabs', function & () use (&$tabs) { + return $tabs; + }); + + $this->terminateWithSuccess($tabs); + } + + public function getLVTabs() + { + $tabs['termine'] = array ( + 'title' => 'Termine', + 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/LVTermine.js'), + 'config' => [] + ); + $tabs['noten'] = array ( + 'title' => 'Noten', + 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Noten.js'), + 'config' => [ + 'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE, + 'edit' => 'both', // Possible values: both|header|inline + 'delete' => 'inline', // Possible values: both|header|inline + 'documents' => 'inline', // Possible values: both|header|inline + 'documentslist' => gradesDocumentsList(), + 'semesterSelect' => false + ] + ); $this->terminateWithSuccess($tabs); } diff --git a/application/controllers/api/frontend/v1/lv/StgTree.php b/application/controllers/api/frontend/v1/lv/StgTree.php deleted file mode 100644 index 8272da978..000000000 --- a/application/controllers/api/frontend/v1/lv/StgTree.php +++ /dev/null @@ -1,117 +0,0 @@ -method] = ['admin:r', 'assistenz:r']; - parent::__construct($permissions); - - $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); - } - - public function _remap($method, $params = []) - { - if ($method == '' || $method == 'index') - return $this->getBase(); - - if (!$this->permissionlib->isBerechtigt('assistenz', 's', $method) - && !$this->permissionlib->isBerechtigt('admin', 's', $method) - ) { - return $this->_outputAuthError([$method => ['admin:r', 'assistenz:r']]); - } - - return $this->getStudiengang($method); - show_404(); - } - - protected function getBase() - { - $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); - - $this->StudiengangModel->addDistinct(); - $this->StudiengangModel->addSelect("v.studiengang_kz AS link"); - $this->StudiengangModel->addSelect( - "CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name", - false - ); - $this->StudiengangModel->addSelect('erhalter_kz'); - $this->StudiengangModel->addSelect('typ'); - $this->StudiengangModel->addSelect('kurzbz'); - $this->StudiengangModel->addSelect('studiengang_kz'); - $this->StudiengangModel->addSelect('studiengang_kz AS stg_kz'); - - $this->StudiengangModel->addOrder('erhalter_kz'); - $this->StudiengangModel->addOrder('typ'); - $this->StudiengangModel->addOrder('kurzbz'); - - $stgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: []; - $stgs = array_merge($stgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []); - - if (!$stgs) - $this->terminateWithSuccess([]); - - $this->StudiengangModel->db->where_in('studiengang_kz', $stgs); - - $result = $this->StudiengangModel->loadWhere(['v.aktiv' => true]); - - $list = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess($list); - } - - protected function getStudiengang($studiengang_kz) - { - $link = $studiengang_kz . '/'; - - $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); - - $this->StudiengangModel->addDistinct(); - $this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", semester) AS link", false); - $this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester ORDER BY verband, gruppe LIMIT 1)) AS name", false); - $this->StudiengangModel->addSelect("TRUE AS leaf", false); - - $this->StudiengangModel->addSelect('semester'); - $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false); - - $this->StudiengangModel->addOrder('semester'); - - $result = $this->StudiengangModel->loadWhere([ - 'v.studiengang_kz' => $studiengang_kz, - 'v.aktiv' => true - ]); - $list = $this->getDataOrTerminateWithError($result); - - $result = $this->StudiengangModel->load($studiengang_kz); - $result = $this->getDataOrTerminateWithError($result); - if ($result) - { - if (current($result)->mischform) - { - $this->load->model('organisation/Studienordnung_model', 'StudienordnungModel'); - - $this->StudienordnungModel->addDistinct(); - $this->StudienordnungModel->addSelect("CONCAT(studiengang_kz, '/', p.orgform_kurzbz) AS link"); - $this->StudienordnungModel->addSelect("p.orgform_kurzbz AS name"); - $this->StudienordnungModel->addSelect("TRUE as leaf", false); - - $this->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id'); - - $result = $this->StudienordnungModel->loadWhere([ - 'aktiv' => true, - 'studiengang_kz' => $studiengang_kz, - 'p.orgform_kurzbz !=' => 'DDP' - ]); - $result = $this->getDataOrTerminateWithError($result); - - $list = array_merge($list, $result); - } - } - - $this->terminateWithSuccess($list); - } -} diff --git a/application/controllers/api/frontend/v1/organisation/Studiensemester.php b/application/controllers/api/frontend/v1/organisation/Studiensemester.php index 3c6b72d2f..eaafc6ac5 100644 --- a/application/controllers/api/frontend/v1/organisation/Studiensemester.php +++ b/application/controllers/api/frontend/v1/organisation/Studiensemester.php @@ -26,7 +26,9 @@ class Studiensemester extends FHCAPI_Controller 'getAll' => self::PERM_LOGGED, 'getAktNext' => self::PERM_LOGGED, 'getStudienjahrByStudiensemester' => self::PERM_LOGGED, - 'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED + 'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED, + 'current' => self::PERM_LOGGED, + 'set' => self::PERM_LOGGED ) ); // Load model StudiensemesterModel @@ -166,4 +168,39 @@ class Studiensemester extends FHCAPI_Controller $this->terminateWithSuccess(array($studiensemester, $aktuell)); } + + public function current() + { + $result = $this->StudiensemesterModel->getNearest(); + + $data = $this->getDataOrTerminateWithError($result); + + if (!$data) + $this->terminateWithError('Kein Studiensemester aktiv'); + if (count($data) > 1) + $this->terminateWithError('Mehrere Studiensemester aktiv'); + + $this->terminateWithSuccess(current($data)->studiensemester_kurzbz); + } + + public function set() + { + $this->load->library('AuthLib'); + $this->load->library('form_validation'); + + $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required'); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $stdsem = $this->input->post('studiensemester_kurzbz'); + + $this->load->model('system/Variable_model', 'VariableModel'); + + $result = $this->VariableModel->setVariable(getAuthUID(), 'semester_aktuell', $stdsem); + + $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(true); + } } diff --git a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php index def4f6502..7c1c974e2 100644 --- a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php +++ b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php @@ -246,12 +246,12 @@ class Abschlusspruefung extends FHCAPI_Controller { $searchString = $this->input->get('searchString') ?? ''; - $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->load->model('person/Person_model', 'PersonModel'); - $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid'); + $result = $this->PersonModel->searchPerson($searchString, 'mitMaUid'); if (isError($result)) { - $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); } $this->terminateWithSuccess($result ?: []); @@ -371,6 +371,9 @@ class Abschlusspruefung extends FHCAPI_Controller $this->terminateWithValidationErrors($this->form_validation->error_array()); } + $datum = $formData['datum'] == '' ? null : $formData['datum']; + $sponsion = $formData['sponsion'] == '' ? null : $formData['sponsion']; + $result = $this->AbschlusspruefungModel->update( [ 'abschlusspruefung_id' => $abschlusspruefung_id @@ -382,8 +385,8 @@ class Abschlusspruefung extends FHCAPI_Controller 'vorsitz' => $vorsitz, 'pruefungsantritt_kurzbz' => $formData['pruefungsantritt_kurzbz'], 'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'], - 'datum' => $formData['datum'], - 'sponsion' => $formData['sponsion'], + 'datum' => $datum, + 'sponsion' => $sponsion, 'pruefer1' => $pruefer1, 'pruefer2' => $pruefer2, 'pruefer3' => $pruefer3, diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php index bc1fbebfe..cc6c04430 100644 --- a/application/controllers/api/frontend/v1/stv/Config.php +++ b/application/controllers/api/frontend/v1/stv/Config.php @@ -301,6 +301,7 @@ class Config extends FHCAPI_Controller public function student() { + $this->load->helper('hlp_document'); $result = []; $config = $this->config->item('tabs'); @@ -376,9 +377,9 @@ class Config extends FHCAPI_Controller 'config' => [ 'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE, 'edit' => 'both', // Possible values: both|header|inline - 'delete' => 'both', // Possible values: both|header|inline - 'documents' => 'both', // Possible values: both|header|inline - 'documentslist' => $this->gradesDocumentsList() + 'delete' => 'inline', // Possible values: both|header|inline + 'documents' => 'inline', // Possible values: both|header|inline + 'documentslist' => gradesDocumentsList() ] ]; @@ -622,188 +623,6 @@ class Config extends FHCAPI_Controller ] + $this->kontoColumns(); } - /** - * Helper function to generate the default documentslist config for the - * grades tab. - * - * The resulting array consists of elements which are associative arrays - * that can have the following entries: - * title (required) on the first level this can be HTML code. - * permissioncheck (optional) an URL to an FHCAPI endpoint which returns - * true or false. - * link (optional) an URL that will be called if "action" and - * "children" are not defined. - * action (optional) an associative array that describes an - * POST action that will be called if "children" is - * not defined. - * It can have the following entries: - * - url (required) an URL to an FHCAPI endpoint. - * - post (optional) an associative array with the POST data to - * be sent. - * - response (optional) a string that will be displayed on success. - * children (optional) an array of child elements - * - * All strings that start with { and end with } in the URLs and the - * actions post parameter will be replaced with the corresponding - * attribute of the current dataset (e.G: {uid} will be replaced with the - * uid of the current dataset) - * - * @return array - */ - protected function gradesDocumentsList() - { - $permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}"); - - $title_ger = $this->p->t("global", "deutsch"); - $title_eng = $this->p->t("global", "englisch"); - $title_ff = $this->p->t("stv", "document_certificate"); - $title_lv = $this->p->t("stv", "document_coursecertificate"); - - $link_ff = "documents/export/" . - "zertifikat.rdf.php/" . - "Zertifikat" . - "?stg_kz={studiengang_kz_lv}" . - "&uid={uid}" . - "&ss={studiensemester_kurzbz}" . - "&lvid={lehrveranstaltung_id}"; - $link_lv_ger = "documents/export/" . - "lehrveranstaltungszeugnis.rdf.php/" . - "LVZeugnis" . - "?stg_kz={studiengang_kz}" . - "&uid={uid}" . - "&ss={studiensemester_kurzbz}" . - "&lvid={lehrveranstaltung_id}"; - $link_lv_eng = "documents/export/" . - "lehrveranstaltungszeugnis.rdf.php/" . - "LVZeugnisEng" . - "?stg_kz={studiengang_kz}" . - "&uid={uid}" . - "&ss={studiensemester_kurzbz}" . - "&lvid={lehrveranstaltung_id}"; - - $archive_url = "api/frontend/v1/documents/archiveSigned"; - $archive_response = $this->p->t("stv", "document_signed_and_archived"); - $archive_post_ff = [ - "xml" => "zertifikat.rdf.php", - "xsl" => "Zertifikat", - "stg_kz" => "{studiengang_kz_lv}", - "uid" => "{uid}", - "ss" => "{studiensemester_kurzbz}", - "lvid" => "{lehrveranstaltung_id}" - ]; - $archive_post_lv_ger = [ - "xml" => "lehrveranstaltungszeugnis.rdf.php", - "xsl" => "LVZeugnis", - "stg_kz" => "{studiengang_kz}", - "uid" => "{uid}", - "ss" => "{studiensemester_kurzbz}", - "lvid" => "{lehrveranstaltung_id}" - ]; - $archive_post_lv_eng = [ - "xml" => "lehrveranstaltungszeugnis.rdf.php", - "xsl" => "LVZeugnisEng", - "stg_kz" => "{studiengang_kz}", - "uid" => "{uid}", - "ss" => "{studiensemester_kurzbz}", - "lvid" => "{lehrveranstaltung_id}" - ]; - - $list = [ - [ - 'title' => '', - 'children' => [ - [ - 'title' => $title_ff, - 'link' => site_url($link_ff) - ], - [ - 'title' => $title_lv, - 'children' => [ - [ - 'title' => $title_ger, - 'link' => site_url($link_lv_ger), - 'children' => [ - [ - 'title' => 'PDF', - 'permissioncheck' => $permissioncheck, - 'link' => site_url($link_lv_ger) - ], - [ - 'title' => 'DOC', - 'permissioncheck' => $permissioncheck, - 'link' => site_url($link_lv_ger . "&output=doc") - ], - [ - 'title' => 'ODT', - 'permissioncheck' => $permissioncheck, - 'link' => site_url($link_lv_ger . "&output=odt") - ] - ] - ], - [ - 'title' => $title_eng, - 'link' => site_url($link_lv_eng), - 'children' => [ - [ - 'title' => 'PDF', - 'permissioncheck' => $permissioncheck, - 'link' => site_url($link_lv_eng) - ], - [ - 'title' => 'DOC', - 'permissioncheck' => $permissioncheck, - 'link' => site_url($link_lv_eng . "&output=doc") - ], - [ - 'title' => 'ODT', - 'permissioncheck' => $permissioncheck, - 'link' => site_url($link_lv_eng . "&output=odt") - ] - ] - ] - ] - ] - ] - ], - [ - 'title' => '', - 'children' => [ - [ - 'title' => $title_ff, - 'action' => [ - 'url' => site_url($archive_url), - 'post' => $archive_post_ff, - 'response' => $archive_response - ] - ], - [ - 'title' => $title_lv, - 'children' => [ - [ - 'title' => $title_ger, - 'action' => [ - 'url' => site_url($archive_url), - 'post' => $archive_post_lv_ger, - 'response' => $archive_response - ] - ], - [ - 'title' => $title_eng, - 'action' => [ - 'url' => site_url($archive_url), - 'post' => $archive_post_lv_eng, - 'response' => $archive_response - ] - ] - ] - ] - ] - ] - ]; - - return $list; - } - /** * Sort tab list * diff --git a/application/controllers/api/frontend/v1/stv/Dokumente.php b/application/controllers/api/frontend/v1/stv/Dokumente.php index b8c7830bd..b47a4af87 100644 --- a/application/controllers/api/frontend/v1/stv/Dokumente.php +++ b/application/controllers/api/frontend/v1/stv/Dokumente.php @@ -78,52 +78,32 @@ class Dokumente extends FHCAPI_Controller $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL); $resultPreDoc = $this->_getPrestudentDokumente($prestudent_id); - - $arrayAccepted = []; $person_id = $this->_getPersonId($prestudent_id); - $docNames = array_map(function ($item) { - return $item->dokument_kurzbz; - }, $resultPreDoc); + $mergedArray = []; - foreach($docNames as $doc) + foreach ($resultPreDoc as $pre) { - $result = $this->AkteModel->getAktenFAS($person_id, $doc, $studiengang_kz, $prestudent_id, true); + $result = $this->AkteModel->getAktenFAS($person_id, $pre->dokument_kurzbz, $studiengang_kz, $prestudent_id, true); if (isError($result)) - { return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - } + if (hasData($result)) { - $data = getData($result); - foreach ($data as $value) + foreach (getData($result) as $doc) { - array_push($arrayAccepted, $value); + $merged = clone $doc; + $merged->docdatum = $pre->docdatum; + $merged->insertvonma = $pre->insertvonma; + $merged->bezeichnung = $pre->bezeichnung; + $mergedArray[] = $merged; } } - } - - //Mapping with document_kurzbz - $preDocMap = []; - foreach ($resultPreDoc as $pre) { - $preDocMap[$pre->dokument_kurzbz] = $pre; - } - - $mergedArray = []; - foreach ($arrayAccepted as $doc) { - $merged = clone $doc; - - if (isset($preDocMap[$doc->dokument_kurzbz])) { - $merged->docdatum = $preDocMap[$doc->dokument_kurzbz]->docdatum; - $merged->insertvonma = $preDocMap[$doc->dokument_kurzbz]->insertvonma; - $merged->bezeichnung = $preDocMap[$doc->dokument_kurzbz]->bezeichnung; - } else { - $merged->akzeptiertdatum = null; - $merged->akzeptiertvon = null; + else + { + $mergedArray[] = $pre; } - - $mergedArray[] = $merged; } $this->terminateWithSuccess($mergedArray); @@ -190,6 +170,8 @@ class Dokumente extends FHCAPI_Controller $this->terminateWithValidationErrors($this->form_validation->error_array()); } + $nachgereicht_am = $this->input->post('nachgereicht_am') == '' ? null : $this->input->post('nachgereicht_am'); + $uid = getAuthUID(); $result = $this->AkteModel->update( @@ -200,7 +182,7 @@ class Dokumente extends FHCAPI_Controller 'dokument_kurzbz' => $this->input->post('dokument_kurzbz'), 'anmerkung_intern' => $this->input->post('anmerkung_intern'), 'titel_intern' => $this->input->post('titel_intern'), - 'nachgereicht_am' => $this->input->post('nachgereicht_am'), + 'nachgereicht_am' => $nachgereicht_am, 'updateamum' => date('c'), 'updatevon' => $uid, ] diff --git a/application/controllers/api/frontend/v1/stv/Konto.php b/application/controllers/api/frontend/v1/stv/Konto.php index ecd58671a..2654c18f6 100644 --- a/application/controllers/api/frontend/v1/stv/Konto.php +++ b/application/controllers/api/frontend/v1/stv/Konto.php @@ -48,7 +48,8 @@ class Konto extends FHCAPI_Controller // Load language phrases $this->loadPhrases([ - 'konto' + 'konto', + 'lehre' ]); } @@ -112,7 +113,7 @@ class Konto extends FHCAPI_Controller * * @return void */ - public function getBuchungstypen() + public function getBuchungstypen($studiensemester_kurzbz = null) { $this->load->model('crm/Buchungstyp_model', 'BuchungstypModel'); @@ -122,6 +123,7 @@ class Konto extends FHCAPI_Controller $data = $this->getDataOrTerminateWithError($result); + $this->_getOEHBeitrag($data, $studiensemester_kurzbz); $this->terminateWithSuccess($data); } @@ -427,9 +429,12 @@ class Konto extends FHCAPI_Controller 'updateamum' => date('c'), 'updatevon' => getAuthUID() ]; + foreach ($allowed as $field) if ($this->input->post($field) !== null) $data[$field] = $this->input->post($field); + if($data['buchungsdatum'] == '') + $data['buchungsdatum'] = null; $result = $this->KontoModel->update($id, $data); @@ -494,4 +499,43 @@ class Konto extends FHCAPI_Controller $this->terminateWithSuccess(); } + + private function _getOEHBeitrag(&$data, $studiensemester_kurzbz = null) + { + if (is_null($studiensemester_kurzbz)) + { + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $studiensemester_akt = $this->variablelib->getVar('semester_aktuell'); + } + else + { + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + if ($this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + $studiensemester_akt = $studiensemester_kurzbz; + else + $this->terminateWithError($this->p->t('lehre', 'error_noStudiensemester')); + } + + $this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel'); + $oehBeitrag = $this->OehbeitragModel->getByStudiensemester($studiensemester_akt); + + $oehStandardbetrag = null; + if (hasData($oehBeitrag)) + { + $oeh = getData($oehBeitrag)[0]; + $summe = ($oeh->studierendenbeitrag + $oeh->versicherung) * -1; + $oehStandardbetrag = number_format((float)$summe, 2, '.', ''); + } + + if ($oehStandardbetrag !== null) + { + $data = array_map(function ($buchungstyp) use ($oehStandardbetrag) { + if (isset($buchungstyp->buchungstyp_kurzbz) && (strtolower($buchungstyp->buchungstyp_kurzbz) === 'oeh')) + { + $buchungstyp->standardbetrag = $oehStandardbetrag; + } + return $buchungstyp; + }, $data); + } + } } diff --git a/application/controllers/api/frontend/v1/stv/LvTermine.php b/application/controllers/api/frontend/v1/stv/LvTermine.php index c29f56964..b9e23e77d 100644 --- a/application/controllers/api/frontend/v1/stv/LvTermine.php +++ b/application/controllers/api/frontend/v1/stv/LvTermine.php @@ -34,7 +34,7 @@ class LvTermine extends FHCAPI_Controller //TODO Build own lib or combine with Controller Stundenplan.php //here use of logic of Stundenplan.php, extended with parameters uid, grouping, and used dbTable - public function getStundenplan($uid, $start_date = null, $end_date = null, $groupConsecutiveHours = false, $dbStundenplanTable = "stundenplan") + public function getStundenplan($uid, $start_date = null, $end_date = null, $dbStundenplanTable = "stundenplan", $groupConsecutiveHours = false) { $student_uid = $uid; $semester_range = $this->studienSemesterErmitteln($start_date, $end_date); @@ -80,13 +80,6 @@ class LvTermine extends FHCAPI_Controller $stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? []; $this->terminateWithSuccess($stundenplan_data); - - $this->expand_object_information($stundenplan_data); - - $this->returnObj['$stundenplan_query'] = $stundenplan_query; - $this->returnObj['$student_lehrverband'] = $student_lehrverband; - $this->returnObj['$benutzer_gruppen'] = $benutzer_gruppen; - $this->terminateWithSuccess($stundenplan_data); } public function getStudiensemester() diff --git a/application/controllers/api/frontend/v1/stv/Mobility.php b/application/controllers/api/frontend/v1/stv/Mobility.php index f61816086..5639da549 100644 --- a/application/controllers/api/frontend/v1/stv/Mobility.php +++ b/application/controllers/api/frontend/v1/stv/Mobility.php @@ -237,8 +237,8 @@ class Mobility extends FHCAPI_Controller } $formData = $this->input->post('formData'); - $von = $formData['von'] ?? null; - $bis = $formData['bis'] ?? null; + $von = ($formData['von'] ?? '') ?: null; + $bis = ($formData['bis'] ?? '') ?: null; $nation_code = $formData['nation_code'] ?? null; $mobilitaetsprogramm_code = $formData['mobilitaetsprogramm_code'] ?? null; $herkunftsland_code = $formData['herkunftsland_code'] ?? null; diff --git a/application/controllers/api/frontend/v1/stv/Prestudent.php b/application/controllers/api/frontend/v1/stv/Prestudent.php index d8c8d1ff2..33957872f 100644 --- a/application/controllers/api/frontend/v1/stv/Prestudent.php +++ b/application/controllers/api/frontend/v1/stv/Prestudent.php @@ -193,7 +193,7 @@ class Prestudent extends FHCAPI_Controller } elseif ( $val === '' - && in_array($prop, ['zgvnation', 'zgvmanation', 'zgvdoktornation', 'berufstaetigkeit_code', 'ausbildungcode']) + && in_array($prop, ['zgvnation', 'zgvmanation', 'zgvdoktornation', 'berufstaetigkeit_code', 'ausbildungcode', 'zgvdatum', 'zgvmadatum']) ) { $val = null; diff --git a/application/controllers/api/frontend/v1/stv/Projektarbeit.php b/application/controllers/api/frontend/v1/stv/Projektarbeit.php index 8740ef3d6..d26d6a10c 100644 --- a/application/controllers/api/frontend/v1/stv/Projektarbeit.php +++ b/application/controllers/api/frontend/v1/stv/Projektarbeit.php @@ -90,6 +90,15 @@ class Projektarbeit extends FHCAPI_Controller if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id)) return $this->terminateWithError('Projektarbeit Id missing', self::ERROR_TYPE_GENERAL); + $result = $this->fetchProjektarbeitByID($projektarbeit_id); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + private function fetchProjektarbeitById($projektarbeit_id) { + $this->ProjektarbeitModel->resetQuery(); $this->ProjektarbeitModel->addSelect( 'lehre.tbl_projektarbeit.projektarbeit_id, titel, titel_english, themenbereich, projekttyp_kurzbz, lehrveranstaltung_id, lehreinheit_id, firma_id, beginn, ende, gesperrtbis, note, final, freigegeben, tbl_projektarbeit.anmerkung, fa.name AS firma_name' @@ -97,13 +106,10 @@ class Projektarbeit extends FHCAPI_Controller $this->ProjektarbeitModel->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); $this->ProjektarbeitModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); $this->ProjektarbeitModel->addJoin('public.tbl_firma fa', 'firma_id', 'LEFT'); - $result = $this->ProjektarbeitModel->loadWhere( + return $this->ProjektarbeitModel->loadWhere( array('projektarbeit_id' => $projektarbeit_id) ); - $data = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess(current($data)); } /** @@ -132,7 +138,8 @@ class Projektarbeit extends FHCAPI_Controller ); $data = $this->getDataOrTerminateWithError($result); - + $data = $this->getDataOrTerminateWithError($this->fetchProjektarbeitById($data)); + $this->terminateWithSuccess($data); } @@ -280,10 +287,7 @@ class Projektarbeit extends FHCAPI_Controller */ public function getNoten() { - $this->NoteModel->addOrder('notenwert', 'ASC'); - $this->NoteModel->addOrder('bezeichnung', 'ASC'); - - $result = $this->NoteModel->load(); + $result = $this->NoteModel->getAllActive(); if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); diff --git a/application/controllers/api/frontend/v1/stv/Pruefung.php b/application/controllers/api/frontend/v1/stv/Pruefung.php index 4521c2033..becda03ee 100644 --- a/application/controllers/api/frontend/v1/stv/Pruefung.php +++ b/application/controllers/api/frontend/v1/stv/Pruefung.php @@ -448,8 +448,10 @@ class Pruefung extends FHCAPI_Controller } } + $datum = $this->input->post('datum') == '' ? null : $this->input->post('datum'); if(intval($pruefung_id) > 0) { + $result = $this->PruefungModel->update( [ 'pruefung_id' => $pruefung_id @@ -459,7 +461,7 @@ class Pruefung extends FHCAPI_Controller 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), 'note' => $this->input->post('note'), 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), - 'datum' => $this->input->post('datum'), + 'datum' => $datum, 'anmerkung' => $this->input->post('anmerkung'), 'updatevon' => $authUID, 'updateamum' => date('c'), @@ -472,7 +474,7 @@ class Pruefung extends FHCAPI_Controller 'lehreinheit_id' => $this->input->post('lehreinheit_id'), 'student_uid' => $this->input->post('student_uid'), 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), - 'datum' => $this->input->post('datum'), + 'datum' => $datum, 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), 'note' => $this->input->post('note'), 'anmerkung' => $this->input->post('anmerkung'), @@ -520,7 +522,7 @@ class Pruefung extends FHCAPI_Controller 'studiensemester_kurzbz' => $studiensemester_kurzbz, 'note' => $this->input->post('note'), 'uebernahmedatum' => date('c'), - 'benotungsdatum' => $this->input->post('datum'), + 'benotungsdatum' => $datum, 'insertamum' => date('c'), 'insertvon' => $authUID, 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null @@ -555,7 +557,7 @@ class Pruefung extends FHCAPI_Controller ], [ 'note' => $this->input->post('note'), 'uebernahmedatum' => date('c'), - 'benotungsdatum' => $this->input->post('datum'), + 'benotungsdatum' => $datum, 'updateamum' => date('c'), 'updatevon' => $authUID, 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php index 7694807e7..943df7b91 100644 --- a/application/controllers/api/frontend/v1/stv/Student.php +++ b/application/controllers/api/frontend/v1/stv/Student.php @@ -144,6 +144,7 @@ class Student extends FHCAPI_Controller . $this->PrestudentModel->escape($studiensemester_kurzbz) . ") AS statusofsemester" ); + $this->PrestudentModel->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz'); $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT'); $this->PrestudentModel->addJoin('public.tbl_benutzer b', 'student_uid = uid', 'LEFT'); @@ -296,6 +297,10 @@ class Student extends FHCAPI_Controller $fotoval = ($val == '') ? null : str_replace('data:image/jpeg;base64,', '', $val); $update_person[$prop] = $fotoval; } + else if ($prop == 'gebdatum') + { + $update_person[$prop] = ($val == '') ? null : $val; + } else { $update_person[$prop] = $val; diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php index f87e527e0..39ed72072 100644 --- a/application/controllers/api/frontend/v1/stv/Students.php +++ b/application/controllers/api/frontend/v1/stv/Students.php @@ -25,9 +25,6 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); */ class Students extends FHCAPI_Controller { - private $allowedStgs = []; - - public function __construct() { $permissions = []; @@ -35,16 +32,17 @@ class Students extends FHCAPI_Controller $permissions[$router->method] = ['admin:r', 'assistenz:r']; parent::__construct($permissions); - $this->allowedStgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: []; - $this->allowedStgs = array_merge($this->allowedStgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []); + $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: []; + $allowedStgs = array_merge($allowedStgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []); - if (!$this->allowedStgs) { + if (!$allowedStgs) { $this->_outputAuthError([$router->method => ['admin:r', 'assistenz:r']]); exit; } // Load Libraries $this->load->library('PhrasesLib'); + $this->load->library('stv/StudentListLib', ['allowedStgs' => $allowedStgs]); $this->loadPhrases( array( 'lehre' @@ -111,23 +109,19 @@ class Students extends FHCAPI_Controller ]); - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - - - $this->PrestudentModel->addJoin( + $this->studentlistlib->addJoin( "( SELECT prestudent_id FROM public.tbl_prestudentstatus WHERE status_kurzbz = 'Incoming' AND studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " ) test", - "prestudent_id" + "prestudent_id", + "", + "start" ); - - $this->prepareQuery($studiensemester_kurzbz); - - $this->PrestudentModel->addSelect("COALESCE( + $this->studentlistlib->addSelect("COALESCE( v.semester::text, CASE WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') @@ -135,19 +129,16 @@ class Students extends FHCAPI_Controller ELSE ''::text END ) AS semester", false); - $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)"); - $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)"); - - $this->addSelectPrioRel(); + $this->studentlistlib->addSelect("COALESCE(v.verband::text, ''::text) AS verband"); + $this->studentlistlib->addSelect("COALESCE(v.gruppe::text, ''::text) AS gruppe"); + $this->addFilter($studiensemester_kurzbz); - - $result = $this->PrestudentModel->load(); - + $result = $this->studentlistlib->execute($studiensemester_kurzbz); $data = $this->getDataOrTerminateWithError($result); - + $this->decodeTagsJsonInResult($data); $this->terminateWithSuccess($data); } @@ -164,10 +155,7 @@ class Students extends FHCAPI_Controller ]); - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - - - $this->PrestudentModel->addJoin( + $this->studentlistlib->addJoin( "( SELECT prestudent_id FROM bis.tbl_bisio bis @@ -187,14 +175,12 @@ class Students extends FHCAPI_Controller ) AND stdsem.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " GROUP BY prestudent_id ) test", - "prestudent_id" + "prestudent_id", + "", + "start" ); - - $this->prepareQuery($studiensemester_kurzbz); - - - $this->PrestudentModel->addSelect("COALESCE( + $this->studentlistlib->addSelect("COALESCE( v.semester::text, CASE WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') @@ -202,19 +188,16 @@ class Students extends FHCAPI_Controller ELSE ''::text END ) AS semester", false); - $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)"); - $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)"); - - $this->addSelectPrioRel(); + $this->studentlistlib->addSelect("COALESCE(v.verband::text, ''::text) AS verband"); + $this->studentlistlib->addSelect("COALESCE(v.gruppe::text, ''::text) AS gruppe"); + $this->addFilter($studiensemester_kurzbz); - - $result = $this->PrestudentModel->load(); - + $result = $this->studentlistlib->execute($studiensemester_kurzbz); $data = $this->getDataOrTerminateWithError($result); - + $this->decodeTagsJsonInResult($data); $this->terminateWithSuccess($data); } @@ -231,23 +214,18 @@ class Students extends FHCAPI_Controller ]); - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - - - $this->PrestudentModel->addJoin( + $this->studentlistlib->addJoin( "( SELECT prestudent_id FROM bis.tbl_mobilitaet WHERE studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " ) bis", - "prestudent_id" + "prestudent_id", + "", + "start" ); - - $this->prepareQuery($studiensemester_kurzbz); - - - $this->PrestudentModel->addSelect("COALESCE( + $this->studentlistlib->addSelect("COALESCE( v.semester::text, CASE WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') @@ -255,65 +233,67 @@ class Students extends FHCAPI_Controller ELSE ''::text END ) AS semester", false); - $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)"); - $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)"); - - $this->addSelectPrioRel(); + $this->studentlistlib->addSelect("COALESCE(v.verband::text, ''::text) AS verband"); + $this->studentlistlib->addSelect("COALESCE(v.gruppe::text, ''::text) AS gruppe"); + $this->addFilter($studiensemester_kurzbz); - - $result = $this->PrestudentModel->load(); - + $result = $this->studentlistlib->execute($studiensemester_kurzbz); $data = $this->getDataOrTerminateWithError($result); - + $this->decodeTagsJsonInResult($data); $this->terminateWithSuccess($data); } public function getPrestudents( - $studiengang_kz, + $studiengang_typ_kurzbz, $studiensemester_kurzbz = null, $filter = null ) { $this->addMeta('ci_method', __FUNCTION__); $this->addMeta('ci_params', array( - 'studiengang_kz' => $studiengang_kz, + 'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz, 'studiensemester_kurzbz' => $studiensemester_kurzbz, 'filter' => $filter )); - $this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter); + $this->fetchPrestudents($studiengang_typ_kurzbz, $studiensemester_kurzbz, $filter); } public function getPrestudentsOrgform( - $studiengang_kz, + $studiengang_typ_kurzbz, $orgform_kurzbz, $studiensemester_kurzbz = null, $filter = null ) { $this->addMeta('ci_method', __FUNCTION__); $this->addMeta('ci_params', array( - 'studiengang_kz' => $studiengang_kz, + 'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz, 'studiensemester_kurzbz' => $studiensemester_kurzbz, 'filter' => $filter, 'orgform_kurzbz' => $orgform_kurzbz )); - $this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter, $orgform_kurzbz); + $this->fetchPrestudents($studiengang_typ_kurzbz, $studiensemester_kurzbz, $filter, $orgform_kurzbz); } /** - * @param integer $studiengang_kz + * @param string $studiengang_typ_kurzbz * @param string $studiensemester_kurzbz (optional) * @param string $filter (optional) * @param string $orgform_kurzbz (optional) * * @return void */ - protected function fetchPrestudents($studiengang_kz, $studiensemester_kurzbz = null, $filter = null, $orgform_kurzbz = null) + protected function fetchPrestudents($studiengang_typ_kurzbz, $studiensemester_kurzbz = null, $filter = null, $orgform_kurzbz = null) { - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + $studiengang_kz = $this->getStudiengangKz($studiengang_typ_kurzbz); + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); + $orgform_kurzbz = $this->getOrgformKurzbz($orgform_kurzbz); + + if ($studiengang_kz === null) + show_404(); $stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL'; @@ -331,38 +311,38 @@ class Students extends FHCAPI_Controller AND r.studiensemester_kurzbz=" . $stdsemEsc; - $where = ['tbl_prestudent.studiengang_kz' => $studiengang_kz]; + $this->studentlistlib->addWhere('tbl_prestudent.studiengang_kz', $studiengang_kz); if ($orgform_kurzbz) { - $where['ps.orgform_kurzbz'] = $orgform_kurzbz; + $this->studentlistlib->addWhere('ps.orgform_kurzbz', $orgform_kurzbz); } switch ($filter) { case "interessenten": - $where['ps.status_kurzbz'] = 'Interessent'; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent'); break; case "bewerbungnichtabgeschickt": - $where['ps.status_kurzbz'] = 'Interessent'; - $where['ps.bewerbung_abgeschicktamum'] = null; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent'); + $this->studentlistlib->addWhere('ps.bewerbung_abgeschicktamum IS NULL'); break; case "bewerbungabgeschickt": - $where['ps.status_kurzbz'] = 'Interessent'; - $where['ps.bewerbung_abgeschicktamum IS NOT NULL'] = null; - $where['ps.bestaetigtam'] = null; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent'); + $this->studentlistlib->addWhere('ps.bewerbung_abgeschicktamum IS NOT NULL'); + $this->studentlistlib->addWhere('ps.bestaetigtam IS NULL'); break; case "statusbestaetigt": - $where['ps.status_kurzbz'] = 'Interessent'; - $where['ps.bestaetigtam IS NOT NULL'] = null; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent'); + $this->studentlistlib->addWhere('ps.bestaetigtam IS NOT NULL'); break; case "statusbestaetigtrtnichtangemeldet": - $where['ps.status_kurzbz'] = 'Interessent'; - $where['ps.bestaetigtam IS NOT NULL'] = null; - $this->PrestudentModel->db->where('NOT EXISTS(' . $selectRT . ')', null, false); + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent'); + $this->studentlistlib->addWhere('ps.bestaetigtam IS NOT NULL'); + $this->studentlistlib->addWhere('NOT EXISTS(' . $selectRT . ')', null, false); break; case "statusbestaetigtrtangemeldet": - $where['ps.status_kurzbz'] = 'Interessent'; - $where['ps.bestaetigtam IS NOT NULL'] = null; - $this->PrestudentModel->db->where('EXISTS(' . $selectRT . ')', null, false); + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent'); + $this->studentlistlib->addWhere('ps.bestaetigtam IS NOT NULL'); + $this->studentlistlib->addWhere('EXISTS(' . $selectRT . ')', null, false); break; case "zgv": $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); @@ -374,69 +354,69 @@ class Students extends FHCAPI_Controller $this->terminateWithSuccess([]); $stg = current($stg); - $where['ps.status_kurzbz'] = 'Interessent'; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent'); if ($stg->typ == 'm') { - $where['zgvmas_code IS NOT NULL'] = null; + $this->studentlistlib->addWhere('zgvmas_code IS NOT NULL'); if (defined('ZGV_ERFUELLT_ANZEIGEN') && ZGV_ERFUELLT_ANZEIGEN) - $where['zgvmas_erfuellt'] = true; + $this->studentlistlib->addWhere('zgvmas_erfuellt', true); } elseif ($stg->typ == 'p') { - $where['zgvdoktor_code IS NOT NULL'] = null; + $this->studentlistlib->addWhere('zgvdoktor_code IS NOT NULL'); if (defined('ZGV_DOKTOR_ANZEIGEN') && ZGV_DOKTOR_ANZEIGEN) - $where['zgvdoktor_erfuellt'] = true; + $this->studentlistlib->addWhere('zgvdoktor_erfuellt', true); } else { - $where['zgv_code IS NOT NULL'] = null; + $this->studentlistlib->addWhere('zgv_code IS NOT NULL'); if (defined('ZGV_ERFUELLT_ANZEIGEN') && ZGV_ERFUELLT_ANZEIGEN) - $where['zgv_erfuellt'] = true; + $this->studentlistlib->addWhere('zgv_erfuellt', true); } break; case "reihungstestangemeldet": - $where['ps.status_kurzbz'] = 'Interessent'; - $this->PrestudentModel->db->where('EXISTS(' . $selectRT . ')', null, false); + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent'); + $this->studentlistlib->addWhere('EXISTS(' . $selectRT . ')', null, false); break; case "reihungstestnichtangemeldet": - $where['ps.status_kurzbz'] = 'Interessent'; - $this->PrestudentModel->db->where('NOT EXISTS(' . $selectRT . ')', null, false); + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Interessent'); + $this->studentlistlib->addWhere('NOT EXISTS(' . $selectRT . ')', null, false); break; case "bewerber": - $where['ps.status_kurzbz'] = 'Bewerber'; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Bewerber'); break; case "bewerberrtnichtangemeldet": - $where['ps.status_kurzbz'] = 'Bewerber'; - $this->PrestudentModel->db->where('NOT EXISTS(' . $selectRT . ')', null, false); + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Bewerber'); + $this->studentlistlib->addWhere('NOT EXISTS(' . $selectRT . ')', null, false); break; case "bewerberrtangemeldet": - $where['ps.status_kurzbz'] = 'Bewerber'; - $this->PrestudentModel->db->where('EXISTS(' . $selectRT . ')', null, false); + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Bewerber'); + $this->studentlistlib->addWhere('EXISTS(' . $selectRT . ')', null, false); break; case "bewerberrtangemeldetteilgenommen": - $where['ps.status_kurzbz'] = 'Bewerber'; - $this->PrestudentModel->db->where('EXISTS(' . $selectRT . ')', null, false); - $where['reihungstestangetreten'] = true; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Bewerber'); + $this->studentlistlib->addWhere('EXISTS(' . $selectRT . ')', null, false); + $this->studentlistlib->addWhere('reihungstestangetreten', true); break; case "bewerberrtangemeldetnichtteilgenommen": - $where['ps.status_kurzbz'] = 'Bewerber'; - $this->PrestudentModel->db->where('EXISTS(' . $selectRT . ')', null, false); - $where['reihungstestangetreten'] = false; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Bewerber'); + $this->studentlistlib->addWhere('EXISTS(' . $selectRT . ')', null, false); + $this->studentlistlib->addWhere('reihungstestangetreten', false); break; case "aufgenommen": - $where['ps.status_kurzbz'] = 'Aufgenommener'; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Aufgenommener'); break; case "warteliste": - $where['ps.status_kurzbz'] = 'Wartender'; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Wartender'); break; case "absage": - $where['ps.status_kurzbz'] = 'Abgewiesener'; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Abgewiesener'); break; case "incoming": // NOTE(chris): in FAS it was not filtered for studiengang_kz - $where['ps.status_kurzbz'] = 'Incoming'; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Incoming'); break; case "absolvent": - $where['ps.status_kurzbz'] = 'Absolvent'; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Absolvent'); break; case "diplomand": - $where['ps.status_kurzbz'] = 'Diplomand'; + $this->studentlistlib->addWhere('ps.status_kurzbz', 'Diplomand'); break; default: if (!$studiensemester_kurzbz) { @@ -444,9 +424,9 @@ class Students extends FHCAPI_Controller * show all prestudents in this stg who don't have a status * $orgform_kurzbz does not change the results since orgform is stored in the status table */ - $where['ps.status_kurzbz'] = null; + $this->studentlistlib->addWhere('ps.status_kurzbz IS NULL'); } else { - $this->PrestudentModel->db->where_in('ps.status_kurzbz', [ + $this->studentlistlib->addWhere('ps.status_kurzbz', [ 'Interessent', 'Bewerber', 'Aufgenommener', @@ -457,30 +437,30 @@ class Students extends FHCAPI_Controller break; } - $this->prepareQuery($studiensemester_kurzbz); - - $this->PrestudentModel->addSelect(" + $this->studentlistlib->addSelect(" CASE WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') THEN ps.ausbildungssemester::text ELSE ''::text END AS semester", false); - $this->PrestudentModel->addSelect("'' AS verband"); - $this->PrestudentModel->addSelect("'' AS gruppe"); - $this->addSelectPrioRel(); + $this->studentlistlib->addSelect("'' AS verband"); + $this->studentlistlib->addSelect("'' AS gruppe"); + + $query_studiensemester_kurzbz = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : '\'NULL\''; + $this->studentlistlib->addSelect($query_studiensemester_kurzbz . ' as query_studiensemester_kurzbz'); $this->addFilter($studiensemester_kurzbz); - $result = $this->PrestudentModel->loadWhere($where); + $result = $this->studentlistlib->execute($studiensemester_kurzbz); $data = $this->getDataOrTerminateWithError($result); - + $this->decodeTagsJsonInResult($data); $this->terminateWithSuccess($data); } public function getStudents( $studiensemester_kurzbz, - $studiengang_kz, + $studiengang_typ_kurzbz, $semester = null, $verband = null, $gruppe = null @@ -488,18 +468,18 @@ class Students extends FHCAPI_Controller $this->addMeta('ci_method', __FUNCTION__); $this->addMeta('ci_params', array( 'studiensemester_kurzbz' => $studiensemester_kurzbz, - 'studiengang_kz' => $studiengang_kz, + 'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz, 'semester' => $semester, 'verband' => $verband, 'gruppe' => $gruppe )); - $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, null); + $this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, $verband, $gruppe, null, null); } public function getStudentsOrgform( $studiensemester_kurzbz, - $studiengang_kz, + $studiengang_typ_kurzbz, $orgform_kurzbz, $semester = null, $verband = null, @@ -508,37 +488,37 @@ class Students extends FHCAPI_Controller $this->addMeta('ci_method', __FUNCTION__); $this->addMeta('ci_params', array( 'studiensemester_kurzbz' => $studiensemester_kurzbz, - 'studiengang_kz' => $studiengang_kz, + 'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz, 'orgform_kurzbz' => $orgform_kurzbz, 'semester' => $semester, 'verband' => $verband, 'gruppe' => $gruppe )); - $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, $orgform_kurzbz); + $this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, $verband, $gruppe, null, $orgform_kurzbz); } public function getStudentsSpezialgruppe( $studiensemester_kurzbz, - $studiengang_kz, + $studiengang_typ_kurzbz, $semester, $gruppe_kurzbz ) { $this->addMeta('ci_method', __FUNCTION__); $this->addMeta('ci_params', array( 'studiensemester_kurzbz' => $studiensemester_kurzbz, - 'studiengang_kz' => $studiengang_kz, + 'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz, 'semester' => $semester, 'gruppe_kurzbz' => $gruppe_kurzbz )); - $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, null); + $this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, null, null, $gruppe_kurzbz, null); } public function getStudentsOrgformSpezialgruppe( $studiensemester_kurzbz, $orgform_kurzbz, - $studiengang_kz, + $studiengang_typ_kurzbz, $semester, $gruppe_kurzbz ) { @@ -546,17 +526,17 @@ class Students extends FHCAPI_Controller $this->addMeta('ci_params', array( 'studiensemester_kurzbz' => $studiensemester_kurzbz, 'orgform_kurzbz' => $orgform_kurzbz, - 'studiengang_kz' => $studiengang_kz, + 'studiengang_typ_kurzbz' => $studiengang_typ_kurzbz, 'semester' => $semester, 'gruppe_kurzbz' => $gruppe_kurzbz )); - $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, $orgform_kurzbz); + $this->fetchStudents($studiensemester_kurzbz, $studiengang_typ_kurzbz, $semester, null, null, $gruppe_kurzbz, $orgform_kurzbz); } /** - * @param integer $studiengang_kz * @param string $studiensemester_kurzbz + * @param string $studiengang_typ_kurzbz * @param integer $semester (optional) * @param string $verband (optional) * @param integer $gruppe (optional) @@ -567,14 +547,20 @@ class Students extends FHCAPI_Controller */ protected function fetchStudents( $studiensemester_kurzbz, - $studiengang_kz, + $studiengang_typ_kurzbz, $semester = null, $verband = null, $gruppe = null, $gruppe_kurzbz = null, $orgform_kurzbz = null ) { - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); + $studiengang_kz = $this->getStudiengangKz($studiengang_typ_kurzbz); + $orgform_kurzbz = $this->getOrgformKurzbz($orgform_kurzbz); + + if ($studiengang_kz === null) + show_404(); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) @@ -582,34 +568,30 @@ class Students extends FHCAPI_Controller $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); } - $this->prepareQuery($studiensemester_kurzbz, ''); + // NOTE(chris): overwrite 'LEFT JOIN' with 'JOIN' + $this->studentlistlib->addJoin("public.tbl_student s", "prestudent_id"); - $this->PrestudentModel->addSelect('v.semester'); - $this->PrestudentModel->addSelect('v.verband'); - $this->PrestudentModel->addSelect('v.gruppe'); - $this->PrestudentModel->addSelect("'' AS priorisierung_relativ"); - - - $where = []; + $this->studentlistlib->addSelect("'' AS priorisierung_relativ"); + $this->studentlistlib->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz'); if ($gruppe_kurzbz !== null) { - $this->PrestudentModel->addJoin('public.tbl_benutzergruppe g', 'uid'); - $where['g.gruppe_kurzbz'] = $gruppe_kurzbz; - $where['g.studiensemester_kurzbz'] = $studiensemester_kurzbz; + $this->studentlistlib->addJoin('public.tbl_benutzergruppe g', 'uid', '', 'after_b'); + $this->studentlistlib->addWhere('g.gruppe_kurzbz', $gruppe_kurzbz); + $this->studentlistlib->addWhere('g.studiensemester_kurzbz', $studiensemester_kurzbz); } else { - $where['v.studiengang_kz'] = $studiengang_kz; + $this->studentlistlib->addWhere('v.studiengang_kz', $studiengang_kz); if ($semester !== null) - $where['v.semester'] = $semester; + $this->studentlistlib->addWhere('v.semester', $semester); if ($verband !== null) - $where['v.verband'] = $verband; + $this->studentlistlib->addWhere('v.verband', $verband); if ($gruppe !== null) - $where['v.gruppe'] = $gruppe; + $this->studentlistlib->addWhere('v.gruppe', $gruppe); if (!$verband && !$gruppe && $orgform_kurzbz !== null) { - $this->PrestudentModel->db->where( + $this->studentlistlib->addWhere( "( SELECT orgform_kurzbz FROM public.tbl_prestudentstatus @@ -623,15 +605,28 @@ class Students extends FHCAPI_Controller } } + $this->addFilter($studiensemester_kurzbz); - $result = $this->PrestudentModel->loadWhere($where); + $result = $this->studentlistlib->execute($studiensemester_kurzbz); $data = $this->getDataOrTerminateWithError($result); - + $this->decodeTagsJsonInResult($data); $this->terminateWithSuccess($data); } + protected function decodeTagsJsonInResult(&$data) + { + if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) { + array_walk($data, function($item, $key) { + if(isset($item->tags)) + { + $item->tags = json_decode($item->tags); + } + }); + } + } + /** * @param string $prestudent_id * @@ -645,6 +640,8 @@ class Students extends FHCAPI_Controller 'prestudent_id' => $prestudent_id, )); + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) @@ -652,11 +649,8 @@ class Students extends FHCAPI_Controller $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); } - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - $this->prepareQuery($studiensemester_kurzbz); - - $this->PrestudentModel->addSelect("COALESCE( + $this->studentlistlib->addSelect("COALESCE( v.semester::text, CASE WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') @@ -664,19 +658,18 @@ class Students extends FHCAPI_Controller ELSE ''::text END ) AS semester", false); - $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)"); - $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)"); + $this->studentlistlib->addSelect("COALESCE(v.verband::text, ''::text) AS verband"); + $this->studentlistlib->addSelect("COALESCE(v.gruppe::text, ''::text) AS gruppe"); + + $this->studentlistlib->addWhere('tbl_prestudent.prestudent_id', $prestudent_id); - $this->addSelectPrioRel(); $this->addFilter($studiensemester_kurzbz); - $result = $this->PrestudentModel->loadWhere([ - 'tbl_prestudent.prestudent_id' => $prestudent_id - ]); + $result = $this->studentlistlib->execute($studiensemester_kurzbz); $data = $this->getDataOrTerminateWithError($result); - + $this->decodeTagsJsonInResult($data); $this->terminateWithSuccess($data); } @@ -693,6 +686,8 @@ class Students extends FHCAPI_Controller 'student_uid' => $student_uid, )); + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) @@ -700,26 +695,16 @@ class Students extends FHCAPI_Controller $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); } - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - - $this->prepareQuery($studiensemester_kurzbz); - - $this->PrestudentModel->addSelect('v.semester'); - $this->PrestudentModel->addSelect('v.verband'); - $this->PrestudentModel->addSelect('v.gruppe'); - - $this->addSelectPrioRel(); + $this->studentlistlib->addWhere('s.student_uid', $student_uid); $this->addFilter($studiensemester_kurzbz); - $result = $this->PrestudentModel->loadWhere([ - 's.student_uid' => $student_uid - ]); + $result = $this->studentlistlib->execute($studiensemester_kurzbz); $data = $this->getDataOrTerminateWithError($result); - + $this->decodeTagsJsonInResult($data); $this->terminateWithSuccess($data); } @@ -737,6 +722,8 @@ class Students extends FHCAPI_Controller 'person_id' => $person_id, )); + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) @@ -744,24 +731,16 @@ class Students extends FHCAPI_Controller $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); } - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - $this->prepareQuery($studiensemester_kurzbz); + $this->studentlistlib->addWhere('p.person_id', $person_id); - $this->PrestudentModel->addSelect('v.semester'); - $this->PrestudentModel->addSelect('v.verband'); - $this->PrestudentModel->addSelect('v.gruppe'); - - $this->addSelectPrioRel(); $this->addFilter($studiensemester_kurzbz); - $result = $this->PrestudentModel->loadWhere([ - 'p.person_id' => $person_id - ]); + $result = $this->studentlistlib->execute($studiensemester_kurzbz); $data = $this->getDataOrTerminateWithError($result); - + $this->decodeTagsJsonInResult($data); $this->terminateWithSuccess($data); } @@ -777,6 +756,8 @@ class Students extends FHCAPI_Controller 'studiensemester_kurzbz' => $studiensemester_kurzbz )); + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); + $this->load->library('SearchLib', [ 'config' => 'searchstv' ]); $this->load->library('form_validation'); @@ -790,29 +771,8 @@ class Students extends FHCAPI_Controller $data = $this->getDataOrTerminateWithError($result); - - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - - $this->prepareQuery($studiensemester_kurzbz); - - $this->PrestudentModel->addSelect("COALESCE(v.semester::text, CASE WHEN public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') THEN public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)::text ELSE ''::text END) AS semester", false); - $this->PrestudentModel->addSelect('v.verband'); - $this->PrestudentModel->addSelect('v.gruppe'); - - //add status per semester - $this->PrestudentModel->addSelect( - "public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, " - . $this->PrestudentModel->escape($studiensemester_kurzbz) - . ") AS statusofsemester" - ); - - $this->addSelectPrioRel(); - - $this->addFilter($studiensemester_kurzbz); - $prestudent_ids = []; $student_uids = []; - $this->addMeta('data', $data); foreach ($data as $row) { $dataset = json_decode($row->data); if ($row->type == 'prestudent') { @@ -822,197 +782,39 @@ class Students extends FHCAPI_Controller } } + + $this->studentlistlib->addSelect("COALESCE( + v.semester::text, + CASE + WHEN public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') + THEN public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)::text + ELSE ''::text + END + ) AS semester", false); + + $this->studentlistlib->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz'); + if ($prestudent_ids && $student_uids) { - $this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids); - $this->PrestudentModel->db->or_where_in('s.student_uid', $student_uids); + $this->studentlistlib->addWhere('tbl_prestudent.prestudent_id', $prestudent_ids); + $this->studentlistlib->addOrWhere('s.student_uid', $student_uids); } elseif ($prestudent_ids) { - $this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids); + $this->studentlistlib->addWhere('tbl_prestudent.prestudent_id', $prestudent_ids); } elseif ($student_uids) { - $this->PrestudentModel->db->where_in('s.student_uid', $student_uids); + $this->studentlistlib->addWhere('s.student_uid', $student_uids); } else { $this->terminateWithSuccess([]); } - $result = $this->PrestudentModel->load(); + + $this->addFilter($studiensemester_kurzbz); + + $result = $this->studentlistlib->execute($studiensemester_kurzbz); $data = $this->getDataOrTerminateWithError($result); - + $this->decodeTagsJsonInResult($data); $this->terminateWithSuccess($data); } - /** - * @param string|null $studiensemester_kurzbz - * @param string $type - * - * @return void - */ - protected function prepareQuery($studiensemester_kurzbz, $type = 'LEFT') - { - $stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL'; - - $this->load->config('stv'); - - if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) - { - $tags = $this->config->item('stv_prestudent_tags'); - - $whereTags = ''; - if (is_array($tags) && !isEmptyArray($tags)) { - $tags = array_keys($tags); - - foreach ($tags as $key => $tag) { - $tags[$key] = $this->db->escape($tag); - } - $whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")"; - } - $subQueryTag = " - ( - SELECT - tag.prestudent_id, - COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags - FROM ( - SELECT DISTINCT ON (n.notiz_id) - n.notiz_id AS id, - nt.typ_kurzbz, - array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung, - n.text AS notiz, - nt.style, - n.erledigt AS done, - nz.prestudent_id - FROM public.tbl_notizzuordnung AS nz - JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id - JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz " - . $whereTags . - " - ) AS tag - GROUP BY tag.prestudent_id - ) AS tag_data_agg - "; - } - - $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id'); - $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', $type); - $this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', ' - pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) - AND pls.prestudent_id=tbl_prestudent.prestudent_id - AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL) - AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT'); - $this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid', 'LEFT'); - $this->PrestudentModel->addJoin( - 'public.tbl_studentlehrverband v', - 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz' . ($studiensemester_kurzbz ? '=' . $stdsemEsc : ' IS NULL'), - $type - ); - $this->PrestudentModel->addJoin('public.tbl_prestudentstatus ps', ' - ps.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ') - AND ps.prestudent_id=tbl_prestudent.prestudent_id - AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ') - AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')', 'LEFT'); - - if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) - { - $this->PrestudentModel->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT'); - } - - - $this->PrestudentModel->addSelect("b.uid"); - if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) - { - $this->PrestudentModel->addSelect('tag_data_agg.tags'); - } - $this->PrestudentModel->addSelect('titelpre'); - $this->PrestudentModel->addSelect('nachname'); - $this->PrestudentModel->addSelect('vorname'); - $this->PrestudentModel->addSelect('wahlname'); - $this->PrestudentModel->addSelect('vornamen'); - $this->PrestudentModel->addSelect('titelpost'); - $this->PrestudentModel->addSelect('ersatzkennzeichen'); - $this->PrestudentModel->addSelect('gebdatum'); - $this->PrestudentModel->addSelect('geschlecht'); - $this->PrestudentModel->addSelect('foto'); - $this->PrestudentModel->addSelect('foto_sperre'); - - // semester - // verband - // gruppe - - //add status per semester - $this->PrestudentModel->addSelect( - "public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, " - . $this->PrestudentModel->escape($studiensemester_kurzbz) - . ") AS statusofsemester" - ); - - $this->PrestudentModel->addSelect('UPPER(stg.typ || stg.kurzbz) AS studiengang'); - $this->PrestudentModel->addSelect('tbl_prestudent.studiengang_kz'); - $this->PrestudentModel->addSelect('stg.bezeichnung AS stg_bezeichnung'); - $this->PrestudentModel->addSelect("s.matrikelnr"); - $this->PrestudentModel->addSelect('p.person_id'); - $this->PrestudentModel->addSelect('pls.status_kurzbz AS status'); - $this->PrestudentModel->addSelect('pls.datum AS status_datum'); - $this->PrestudentModel->addSelect('pls.bestaetigtam AS status_bestaetigung'); - $this->PrestudentModel->addSelect( - "(SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id=p.person_id AND zustellung LIMIT 1) AS mail_privat", - false - ); - $this->PrestudentModel->addSelect(" - CASE WHEN b.uid IS NOT NULL AND b.uid<>'' - THEN CONCAT(b.uid, '@', " . $this->PrestudentModel->escape(DOMAIN) . ") - ELSE '' END AS mail_intern", false); - $this->PrestudentModel->addSelect('p.anmerkung AS anmerkungen'); - $this->PrestudentModel->addSelect('tbl_prestudent.anmerkung'); - $this->PrestudentModel->addSelect('pls.orgform_kurzbz'); - $this->PrestudentModel->addSelect('aufmerksamdurch_kurzbz'); - $this->PrestudentModel->addSelect( - "(SELECT rt_gesamtpunkte AS punkte FROM public.tbl_prestudent WHERE prestudent_id=ps.prestudent_id) AS punkte", - false - ); - $this->PrestudentModel->addSelect('tbl_prestudent.aufnahmegruppe_kurzbz'); - $this->PrestudentModel->addSelect('tbl_prestudent.dual'); - $this->PrestudentModel->addSelect('p.matr_nr'); - $this->PrestudentModel->addSelect('sp.bezeichnung AS studienplan_bezeichnung'); - $this->PrestudentModel->addSelect('tbl_prestudent.prestudent_id'); - - // priorisierung_relativ - - $this->PrestudentModel->addSelect('mentor'); - $this->PrestudentModel->addSelect('b.aktiv AS bnaktiv'); - $this->PrestudentModel->addSelect('unruly'); - - $this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs); - - $this->PrestudentModel->addOrder('nachname'); - $this->PrestudentModel->addOrder('vorname'); - } - - /** - * @return void - */ - protected function addSelectPrioRel() - { - $this->PrestudentModel->addSelect("( - SELECT count(*) - FROM ( - SELECT *, public.get_rolle_prestudent(pss.prestudent_id, NULL) AS laststatus - FROM public.tbl_prestudent pss - JOIN public.tbl_prestudentstatus USING (prestudent_id) - WHERE person_id = p.person_id - AND studiensemester_kurzbz = ( - SELECT studiensemester_kurzbz - FROM public.tbl_prestudentstatus - WHERE prestudent_id = tbl_prestudent.prestudent_id - AND status_kurzbz = 'Interessent' - LIMIT 1 - ) - AND status_kurzbz = 'Interessent' - ) prest - WHERE laststatus NOT IN ('Abbrecher', 'Abgewiesener', 'Absolvent') - AND priorisierung <= tbl_prestudent.priorisierung - ) || ' (' || COALESCE(tbl_prestudent.priorisierung::text, ' '::text) || ')' AS priorisierung_relativ", false); - } - /** * Adds additional filters to the query * @@ -1038,4 +840,55 @@ class Students extends FHCAPI_Controller } } } + + protected function getStudiengangKz($studiengang_typ_kurzbz) + { + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $result = $this->StudiengangModel->loadWhere([ + 'LOWER(CONCAT(typ, kurzbz)) =' => strtolower($studiengang_typ_kurzbz) + ]); + + $data = $this->getDataOrTerminateWithError($result); + + if (!$data) + return null; + + return current($data)->studiengang_kz; + } + + protected function getStudiensemesterKurzbz($studiensemester_kurzbz) + { + if ($studiensemester_kurzbz === null) + return null; + + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $result = $this->StudiensemesterModel->loadWhere([ + 'LOWER(studiensemester_kurzbz) =' => strtolower($studiensemester_kurzbz) + ]); + + $data = $this->getDataOrTerminateWithError($result); + + if (!$data) + return $studiensemester_kurzbz; + + return current($data)->studiensemester_kurzbz; + } + + protected function getOrgformKurzbz($orgform_kurzbz) + { + if ($orgform_kurzbz === null) + return null; + + $this->load->model('codex/Orgform_model', 'OrgformModel'); + $result = $this->OrgformModel->loadWhere([ + 'LOWER(orgform_kurzbz) =' => strtolower($orgform_kurzbz) + ]); + + $data = $this->getDataOrTerminateWithError($result); + + if (!$data) + return $orgform_kurzbz; + + return current($data)->orgform_kurzbz; + } } diff --git a/application/controllers/api/frontend/v1/stv/Tags.php b/application/controllers/api/frontend/v1/stv/Tags.php index 3004a1f3b..bd5c61953 100644 --- a/application/controllers/api/frontend/v1/stv/Tags.php +++ b/application/controllers/api/frontend/v1/stv/Tags.php @@ -15,7 +15,9 @@ class Tags extends Tag_Controller 'addTag' => self::BERECHTIGUNG_KURZBZ, 'updateTag' => self::BERECHTIGUNG_KURZBZ, 'doneTag' => self::BERECHTIGUNG_KURZBZ, - 'deleteTag' => self::BERECHTIGUNG_KURZBZ + 'deleteTag' => self::BERECHTIGUNG_KURZBZ, + 'getAllTags' => self::BERECHTIGUNG_KURZBZ, + 'rebuildTagsForTypeId' => self::BERECHTIGUNG_KURZBZ, ]); $this->config->load('stv'); @@ -45,4 +47,5 @@ class Tags extends Tag_Controller { parent::doneTag($this->config->item('stv_prestudent_tags')); } + } diff --git a/application/controllers/api/frontend/v1/stv/Verband.php b/application/controllers/api/frontend/v1/stv/Verband.php deleted file mode 100644 index 32ef30a45..000000000 --- a/application/controllers/api/frontend/v1/stv/Verband.php +++ /dev/null @@ -1,513 +0,0 @@ -. - */ - -if (! defined('BASEPATH')) exit('No direct script access allowed'); - -/** - * This controller operates between (interface) the JS (GUI) and the back-end - * Provides data to the ajax get calls about verbände - * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON - */ -class Verband extends FHCAPI_Controller -{ - public function __construct() - { - $permissions = []; - $router = load_class('Router'); - $permissions[$router->method] = ['admin:r', 'assistenz:r']; - parent::__construct($permissions); - - // Load Models - $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); - } - - /** - * Remap calls: - * / - * /(studiengang_kz) => getStudiengang - * /(studiengang_kz)/(semester) => getSemester - * /(studiengang_kz)/(semester)/(verband) => getVerband - * /(studiengang_kz)/(org_form) => getStudiengang - * /(studiengang_kz)/(org_form)/(semester) => getSemester - * /(studiengang_kz)/(org_form)/(semester)/(verband) => getVerband - * - * @param string $method - * @param array $params (optional) - * - * @return void - */ - public function _remap($method, $params = []) - { - if ($method == '' || $method == 'index') - return $this->getBase(); - - // NOTE(chris): Test if access is allowed ($method is the Studiengang) - if (!$this->permissionlib->isBerechtigt('assistenz', 's', $method) - && !$this->permissionlib->isBerechtigt('admin', 's', $method) - ) { - return $this->_outputAuthError([$method => ['admin:r', 'assistenz:r']]); - } - - $count = count($params); - if (!$count) - return $this->getStudiengang($method); - - if ($count == 1) { - if (is_numeric($params[0])) - return $this->getSemester($method, $params[0]); - elseif ($params[0] == 'prestudent') - return $this->terminateWithSuccess($this->getStdSem($method . '/prestudent/', $method)); - else - return $this->getStudiengang($method, $params[0]); - } - if ($count == 2) { - if (is_numeric($params[0])) - return $this->getVerband($method, $params[0], $params[1]); - elseif ($params[1] == 'prestudent') - return $this->terminateWithSuccess($this->getStdSem($method . '/' . $params[0] . '/prestudent/', $method)); - else - return $this->getSemester($method, $params[1], $params[0]); - } - if ($count == 3 && !is_numeric($params[0]) && is_numeric($params[1]) && !is_numeric($params[2])) - return $this->getVerband($method, $params[1], $params[2], $params[0]); - - show_404(); - } - - /** - * @return void - */ - protected function getBase() - { - $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); - - $this->StudiengangModel->addDistinct(); - $this->StudiengangModel->addSelect("v.studiengang_kz AS link"); - $this->StudiengangModel->addSelect( - "CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name", - false - ); - $this->StudiengangModel->addSelect('erhalter_kz'); - $this->StudiengangModel->addSelect('typ'); - $this->StudiengangModel->addSelect('kurzbz'); - $this->StudiengangModel->addSelect('studiengang_kz'); - $this->StudiengangModel->addSelect('studiengang_kz AS stg_kz'); - - $this->StudiengangModel->addOrder('erhalter_kz'); - $this->StudiengangModel->addOrder('typ'); - $this->StudiengangModel->addOrder('kurzbz'); - - $stgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: []; - $stgs = array_merge($stgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []); - - if (!$stgs) - $this->terminateWithSuccess([]); - - $this->StudiengangModel->db->where_in('studiengang_kz', $stgs); - - $result = $this->StudiengangModel->loadWhere(['v.aktiv' => true]); - - $list = $this->getDataOrTerminateWithError($result); - - if ($this->permissionlib->isBerechtigt('inout/uebersicht')) - $list[] = [ - 'name' => 'International', - 'link' => 'inout', - 'children' => [ - [ - 'name' => 'Incoming', - 'link' => 'inout/incoming', - 'leaf' => true - ], - [ - 'name' => 'Outgoing', - 'link' => 'inout/outgoing', - 'leaf' => true - ], - [ - 'name' => 'Gemeinsame Studien', - 'link' => 'inout/gemeinsamestudien', - 'leaf' => true - ] - ] - ]; - $this->terminateWithSuccess($list); - } - - /** - * @param integer $studiengang_kz - * @param string $orgform (optional) - * - * @return void - */ - protected function getStudiengang($studiengang_kz, $org_form = null) - { - $link = $studiengang_kz . '/'; - if ($org_form !== null) - $link .= $org_form . '/'; - - $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); - - $this->StudiengangModel->addDistinct(); - $this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", semester) AS link", false); - $this->StudiengangModel->addSelect("CONCAT( - UPPER(CONCAT(typ, kurzbz)), - '-', - semester, - ( - SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END - FROM public.tbl_lehrverband - WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester - ORDER BY verband, gruppe LIMIT 1 - ) - ) AS name", false); - - $this->StudiengangModel->addSelect('semester'); - $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false); - - $this->StudiengangModel->addOrder('semester'); - - if ($org_form !== null) { - $this->StudiengangModel->addSelect("v.orgform_kurzbz"); - $this->StudiengangModel->db->group_start(); - $this->StudiengangModel->db->where('v.semester', 0); - $this->StudiengangModel->db->or_where('v.orgform_kurzbz', $org_form); - $this->StudiengangModel->db->group_end(); - } - - $result = $this->StudiengangModel->loadWhere([ - 'v.studiengang_kz' => $studiengang_kz, - 'v.aktiv' => true - ]); - $list = $this->getDataOrTerminateWithError($result); - - array_unshift($list, [ - 'name' => 'PreStudent', - 'link' => $link . 'prestudent', - 'no_sem_reload' => true, - 'stg_kz' => (int)$studiengang_kz, - 'children' => $this->getStdSem($link . 'prestudent/', $studiengang_kz) - ]); - - if ($org_form === null) { - // NOTE(chris): if mischform show orgforms - $result = $this->StudiengangModel->load($studiengang_kz); - $result = $this->getDataOrTerminateWithError($result); - if ($result) { - if (current($result)->mischform) { - $this->load->model('organisation/Studienordnung_model', 'StudienordnungModel'); - - $this->StudienordnungModel->addDistinct(); - $this->StudienordnungModel->addSelect("CONCAT(studiengang_kz, '/', p.orgform_kurzbz) AS link"); - $this->StudienordnungModel->addSelect("p.orgform_kurzbz AS name"); - $this->StudienordnungModel->addSelect("studiengang_kz AS stg_kz"); - - $this->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id'); - - $result = $this->StudienordnungModel->loadWhere([ - 'aktiv' => true, - 'studiengang_kz' => $studiengang_kz, - 'p.orgform_kurzbz !=' => 'DDP' - ]); - $result = $this->getDataOrTerminateWithError($result); - - $list = array_merge($list, $result); - } - } - } - $this->terminateWithSuccess($list); - } - - /** - * @param integer $studiengang_kz - * @param integer $semester - * @param string $orgform - * - * @return void - */ - protected function getSemester($studiengang_kz, $semester, $org_form = null) - { - $link = $studiengang_kz . '/'; - if ($org_form !== null) - $link .= $org_form . '/'; - $link .= $semester . '/'; - - - $this->load->model('organisation/Gruppe_model', 'GruppeModel'); - - $this->GruppeModel->addDistinct(); - $this->GruppeModel->addSelect("CONCAT(" . $this->GruppeModel->escape($link . 'grp/') . ", gruppe_kurzbz) AS link", false); - $this->GruppeModel->addSelect("CONCAT(gruppe_kurzbz, ' (', bezeichnung, ')') AS name", false); - $this->GruppeModel->addSelect("TRUE AS leaf", false); - - $this->GruppeModel->addSelect('sort'); - $this->GruppeModel->addSelect('gruppe_kurzbz'); - $this->GruppeModel->addSelect($this->GruppeModel->escape($studiengang_kz) . '::integer AS stg_kz', false); - - $this->GruppeModel->addOrder('sort'); - $this->GruppeModel->addOrder('gruppe_kurzbz'); - - $where = [ - 'studiengang_kz' => $studiengang_kz, - 'semester' => $semester, - 'lehre' => true, - 'sichtbar' => true, - 'aktiv' => true, - 'direktinskription' => false - ]; - - if ($org_form !== null) - $where['orgform_kurzbz'] = $org_form; - - $result = $this->GruppeModel->loadWhere($where); - - $list = $this->getDataOrTerminateWithError($result); - - $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); - - $this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", verband) AS link", false); - $this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband ORDER BY gruppe LIMIT 1)) AS name", false); - $this->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf"); - - $this->StudiengangModel->addSelect($this->StudiengangModel->escape($semester) . ' AS semester'); - $this->StudiengangModel->addSelect('verband'); - $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false); - - $this->StudiengangModel->addOrder('verband'); - - $this->StudiengangModel->addGroupBy('link, name, verband'); - - $where = [ - 'v.studiengang_kz' => $studiengang_kz, - 'v.semester' => $semester, - 'v.verband !=' => '', - 'v.aktiv' => true - ]; - - if ($org_form !== null && $semester) // NOTE(chris): on semester 0 show all? - $where['v.orgform_kurzbz'] = $org_form; - - $result = $this->StudiengangModel->loadWhere($where); - $result = $this->getDataOrTerminateWithError($result); - - $list = array_merge($list, $result); - - $this->terminateWithSuccess($list); - } - - /** - * @param integer $studiengang_kz - * @param integer $semester - * @param integer $verband - * @param string $orgform - * - * @return void - */ - protected function getVerband($studiengang_kz, $semester, $verband, $org_form = null) - { - $link = $studiengang_kz . '/'; - if ($org_form !== null) - $link .= $org_form . '/'; - $link .= $semester . '/'. $verband . '/'; - - - $this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); - - $this->StudiengangModel->addDistinct(); - $this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", gruppe) AS link", false); - $this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, gruppe, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband AND gruppe=v.gruppe ORDER BY gruppe LIMIT 1)) AS name", false); - $this->StudiengangModel->addSelect("TRUE AS leaf", false); - - $this->StudiengangModel->addSelect('v.semester'); - $this->StudiengangModel->addSelect('v.verband'); - $this->StudiengangModel->addSelect('gruppe'); - $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false); - - $this->StudiengangModel->addOrder('gruppe'); - - $where = [ - 'v.studiengang_kz' => $studiengang_kz, - 'v.semester' => $semester, - 'v.verband' => $verband, - 'v.gruppe !=' => '', - 'v.aktiv' => true - ]; - - if ($org_form !== null && $semester) // NOTE(chris): on semester 0 show all? - $where['v.orgform_kurzbz'] = $org_form; - - $result = $this->StudiengangModel->loadWhere($where); - - $list = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess($list); - } - - /** - * @param string $link - * @param integer $studiengang_kz - * - * @return array - */ - protected function getStdSem($link, $studiengang_kz) - { - $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); - - $this->load->model('system/Variable_model', 'VariableModel'); - $result = $this->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']); - $data = $this->getDataOrTerminateWithError($result); - - $this->load->config('stv'); - $number_displayed_past_studiensemester_default = $this->config->item('number_displayed_past_studiensemester_default'); - - $number_displayed_past_studiensemester = $data['number_displayed_past_studiensemester'] ?? $number_displayed_past_studiensemester_default; - - $this->StudiensemesterModel->addPlusMinus(null, $number_displayed_past_studiensemester); - $this->StudiensemesterModel->addOrder('ende'); - $result = $this->StudiensemesterModel->load(); - - $studiensemester = $this->getDataOrTerminateWithError($result); - $result = []; - - $studiengang_kz = (int)$studiengang_kz; - - foreach ($studiensemester as $sem) { - $semlink = $link . $sem->studiensemester_kurzbz; - $intlink = $semlink . '/interessenten'; - $result[] = [ - 'name' => $sem->studiensemester_kurzbz, - 'link' => $semlink, - 'stg_kz' => $studiengang_kz, - 'children' => [ - [ - 'name' => 'Interessenten', - 'link' => $intlink, - 'stg_kz' => $studiengang_kz, - 'children' => [ - [ - 'name' => 'Bewerbung nicht abgeschickt', - 'link' => $intlink . '/bewerbungnichtabgeschickt', - 'stg_kz' => $studiengang_kz, - 'leaf' => true - ], - [ - 'name' => 'Bewerbung abgeschickt, Status unbestätigt', - 'link' => $intlink . '/bewerbungabgeschickt', - 'stg_kz' => $studiengang_kz, - 'leaf' => true - ], - [ - 'name' => 'ZGV erfüllt', - 'link' => $intlink . '/zgv', - 'stg_kz' => $studiengang_kz, - 'leaf' => true - ], - [ - 'name' => 'Status bestätigt', - 'link' => $intlink . '/statusbestaetigt', - 'stg_kz' => $studiengang_kz, - 'children' => [ - [ - 'name' => 'Nicht zum Reihungstest angemeldet', - 'link' => $intlink . '/statusbestaetigtrtnichtangemeldet', - 'leaf' => true - ], - [ - 'name' => 'Reihungstest angemeldet', - 'link' => $intlink . '/statusbestaetigtrtangemeldet', - 'leaf' => true - ] - ] - ], - [ - 'name' => 'Nicht zum Reihungstest angemeldet', - 'link' => $intlink . '/reihungstestnichtangemeldet', - 'stg_kz' => $studiengang_kz, - 'leaf' => true - ], - [ - 'name' => 'Reihungstest angemeldet', - 'link' => $intlink . '/reihungstestangemeldet', - 'stg_kz' => $studiengang_kz, - 'leaf' => true - ] - ] - ], - [ - 'name' => 'Bewerber', - 'link' => $semlink . '/bewerber', - 'stg_kz' => $studiengang_kz, - 'children' => [ - [ - 'name' => 'Nicht zum Reihungstest angemeldet', - 'link' => $intlink . '/bewerberrtnichtangemeldet', - 'stg_kz' => $studiengang_kz, - 'leaf' => true - ], - [ - 'name' => 'Reihungstest angemeldet', - 'link' => $intlink . '/bewerberrtangemeldet', - 'stg_kz' => $studiengang_kz, - 'children' => [ - [ - 'name' => 'Teilgenommen', - 'link' => $intlink . '/bewerberrtangemeldetteilgenommen', - 'stg_kz' => $studiengang_kz, - 'leaf' => true - ], - [ - 'name' => 'Nicht teilgenommen', - 'link' => $intlink . '/bewerberrtangemeldetnichtteilgenommen', - 'stg_kz' => $studiengang_kz, - 'leaf' => true - ] - ] - ] - ] - ], - [ - 'name' => 'Aufgenommen', - 'link' => $semlink . '/aufgenommen', - 'stg_kz' => $studiengang_kz, - 'leaf' => true - ], - [ - 'name' => 'Warteliste', - 'link' => $semlink . '/warteliste', - 'stg_kz' => $studiengang_kz, - 'leaf' => true - ], - [ - 'name' => 'Absage', - 'link' => $semlink . '/absage', - 'stg_kz' => $studiengang_kz, - 'leaf' => true - ], - [ - 'name' => 'Incoming', - 'link' => $semlink . '/incoming', - 'stg_kz' => $studiengang_kz, - 'leaf' => true - ] - ] - ]; - } - - return $result; - } -} diff --git a/application/controllers/api/v1/system/Tag.php b/application/controllers/api/v1/system/Tag.php index 7ce375217..df3003b44 100644 --- a/application/controllers/api/v1/system/Tag.php +++ b/application/controllers/api/v1/system/Tag.php @@ -37,6 +37,7 @@ class Tag extends API_Controller if (isset($tag)) { + $this->TagModel->addJoin('public.tbl_notiz_typ', 'typ_kurzbz', 'typ_kurzbz'); $result = $this->TagModel->load($tag); $this->response($result, REST_Controller::HTTP_OK); diff --git a/application/controllers/components/Cis/Mylv.php b/application/controllers/components/Cis/Mylv.php index 1fdb7e2a1..30544b647 100644 --- a/application/controllers/components/Cis/Mylv.php +++ b/application/controllers/components/Cis/Mylv.php @@ -14,11 +14,11 @@ class Mylv extends Auth_Controller public function __construct() { parent::__construct([ - 'Student' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions? - 'Studiensemester' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions? - 'Lvs' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions? - 'Info' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions? - 'Pruefungen' => ['student/anrechnung_beantragen:r','user:r'] // TODO(chris): permissions? + 'Student' => self::PERM_LOGGED, + 'Studiensemester' => self::PERM_LOGGED, + 'Lvs' => self::PERM_LOGGED, + 'Info' => self::PERM_LOGGED, + 'Pruefungen' => self::PERM_LOGGED ]); } diff --git a/application/controllers/components/stv/Studiensemester.php b/application/controllers/components/stv/Studiensemester.php deleted file mode 100644 index c3db99686..000000000 --- a/application/controllers/components/stv/Studiensemester.php +++ /dev/null @@ -1,78 +0,0 @@ - self::PERM_LOGGED, - 'now' => self::PERM_LOGGED, - 'set' => self::PERM_LOGGED - ]); - } - - public function index() - { - $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); - - $this->StudiensemesterModel->addOrder('start'); - - $result = $this->StudiensemesterModel->load(); - - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - } - $this->outputJson($result); - } - - public function now() - { - $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); - - $result = $this->StudiensemesterModel->getNearest(); - - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - $this->outputJson(getError($result)); - } - $result = getData($result) ?: []; - - if (count($result) != 1) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - $this->outputJsonError(count($result) ? 'Mehrere Studiensemester aktiv' : 'Kein Studiensemester aktiv'); - } else { - $this->outputJsonSuccess(current($result)->studiensemester_kurzbz); - } - } - - public function set() - { - $this->load->library('AuthLib'); - $this->load->library('form_validation'); - - $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); - - $this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required'); - - if ($this->form_validation->run() == false) { - $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); - return $this->outputJsonError($this->form_validation->error_array()); - } - - $stdsem = $this->input->post('studiensemester'); - - $this->load->model('system/Variable_model', 'VariableModel'); - - $result = $this->VariableModel->setVariable(getAuthUID(), 'semester_aktuell', $stdsem); - - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - return $this->outputJson($result); - } - - $this->outputJsonSuccess(true); - } -} diff --git a/application/controllers/jobs/AbgabetoolJob.php b/application/controllers/jobs/AbgabetoolJob.php index b81053032..2e5c4d7b9 100644 --- a/application/controllers/jobs/AbgabetoolJob.php +++ b/application/controllers/jobs/AbgabetoolJob.php @@ -358,7 +358,8 @@ class AbgabetoolJob extends JOB_Controller foreach($assistenzMap as $assistenz_person_id => $tupelArr) { $abgabenString = '
'; - + $hasContent = false; + foreach($tupelArr as $tupel) { $projektarbeit_id = $tupel[0]; $assistenzRow = $tupel[1]; @@ -377,6 +378,7 @@ class AbgabetoolJob extends JOB_Controller if(count($relevantAbgaben) == 0) { continue; } + $hasContent = true; // Format the Student Name $s = $relevantAbgaben[0]; @@ -447,7 +449,12 @@ class AbgabetoolJob extends JOB_Controller } $abgabenString .= '
'; - + + // skip send entirely + if (!$hasContent) { + continue; + } + // done with building the change list, now send it $assistenzRow = $tupelArr[0][1]; $anrede = $assistenzRow->anrede; diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 8dc4870ea..8bcb898a9 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -40,6 +40,13 @@ class AntragJob extends JOB_Controller */ public function sendStglSammelmail() { + + if ($this->config->item('abmeldung_enabled') !== true && + $this->config->item('abmeldung_stg_enabled') !== true && + $this->config->item('unterbrechung_enabled') !== true && + $this->config->item('wiederholung_enabled') !== true) + return $this->logError('Konnte Job nicht starten: Keine der Configs "abmeldung_stg_enabled", "abmeldung_enabled", "unterbrechung_enabled", "wiederholung_enabled" auf true gesetzt'); + $this->load->model('person/Person_model', 'PersonModel'); $this->logInfo('Start Job sendStglSammelmail'); @@ -47,25 +54,38 @@ class AntragJob extends JOB_Controller $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->StudierendenantragModel->addJoin('public.tbl_prestudent', 'prestudent_id'); - $this->db->group_start(); - $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG); - $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); - $this->db->group_end(); - $this->db->or_group_start(); - $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL); - $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); - $this->db->group_end(); + if ($this->config->item('abmeldung_enabled') === true) + { + $this->db->group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); + } - $this->db->or_group_start(); - $this->db->where('typ', Studierendenantrag_model::TYP_UNTERBRECHUNG); - $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); - $this->db->group_end(); + if ($this->config->item('abmeldung_stg_enabled') === true) + { + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); + } - $this->db->or_group_start(); - $this->db->where('typ', Studierendenantrag_model::TYP_WIEDERHOLUNG); - $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_LVSASSIGNED); - $this->db->group_end(); + if ($this->config->item('unterbrechung_enabled') === true) + { + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_UNTERBRECHUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); + } + + if ($this->config->item('wiederholung_enabled') === true) + { + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_WIEDERHOLUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_LVSASSIGNED); + $this->db->group_end(); + } $result = $this->StudierendenantragModel->load(); if(isError($result)) @@ -105,7 +125,7 @@ class AntragJob extends JOB_Controller $stgLeitungen[$leitung->uid]['stgs'][] = $antrag->studiengang_kz; } - $result = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id); + $result = $this->StudierendenantragModel->getStgAndDetails($antrag->studierendenantrag_id); if (isError($result)) { $this->logError(getError($result)); @@ -206,6 +226,10 @@ class AntragJob extends JOB_Controller public function sendReminderWiedereinstieg() { $now = new DateTime(); + + if ($this->config->item('unterbrechung_enabled') !== true) + return $this->logError('Konnte Job nicht starten: Config "unterbrechung_enabled" nicht auf true gesetzt'); + $modifier = $this->config->item('unterbrechung_job_remind_wiedereinstieg_date_modifier'); if (!$modifier) @@ -363,6 +387,13 @@ class AntragJob extends JOB_Controller { $this->logInfo('Start Job handleWiederholerDeadline'); + if ($this->config->item('wiederholung_enabled') !== true) + { + $this->logError('Config "wiederholung_enabled" nicht auf true gesetzt'); + $this->logInfo('Ende Job handleWiederholerDeadline'); + return; + } + $this->load->library('PrestudentLib'); $insertvon = $this->config->item('antrag_job_systemuser'); @@ -481,6 +512,13 @@ class AntragJob extends JOB_Controller { $this->logInfo('Start Job handleAbmeldungenStglDeadline'); + if ($this->config->item('abmeldung_stg_enabled') !== true) + { + $this->logError('Config "abmeldung_stg_enabled" nicht auf true gesetzt'); + $this->logInfo('Ende Job handleAbmeldungenStglDeadline'); + return; + } + $insertvon = $this->config->item('antrag_job_systemuser'); if (!$insertvon) { $this->logError('Config "antrag_job_systemuser" nicht gesetzt'); @@ -614,6 +652,13 @@ class AntragJob extends JOB_Controller { $this->logInfo('Start Job sendAufforderungWiederholer'); + if ($this->config->item('wiederholung_enabled') !== true) + { + $this->logError('Config "wiederholung_enabled" nicht auf true gesetzt'); + $this->logInfo('Ende Job sendAufforderungWiederholer'); + return; + } + $modifier_request_1 = $this->config->item('wiederholung_job_request_1_date_modifier'); $modifier_request_2 = $this->config->item('wiederholung_job_request_2_date_modifier'); $modifier_deadline = $this->config->item('wiederholung_job_deadline_date_modifier'); diff --git a/application/controllers/jobs/TagJob.php b/application/controllers/jobs/TagJob.php new file mode 100644 index 000000000..ae21883e9 --- /dev/null +++ b/application/controllers/jobs/TagJob.php @@ -0,0 +1,110 @@ +load->config('stv'); + + // Library + $this->load->library('TagLib'); + + // Load Models + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('system/Notiztyp_model', 'NotiztypModel'); + + $this->loadPhrases([ + 'lehre' + ]); + } + + public function rebuildAutomatedTags() + { + $automatedTagsRes = $this->NotiztypModel->loadWhere(array('automatisiert' => true, 'taglib IS NOT NULL' => null)); + $automatedTags = hasData($automatedTagsRes) ? getData($automatedTagsRes) : []; + + + $result = $this->StudiensemesterModel->getAktOrNextSemester(); + if (isError($result)) + { + $this->logInfo('Start Job rebuild Automated Tags'); + $this->logError('Error occurred during retrieving studiensemester'); + return $this->logInfo('End Job rebuild Automated Tags'); + } + + if (empty($result->retval) || !isset($result->retval[0])) { + $this->logInfo('Start Job rebuild Automated Tags'); + $this->logError('No Studiensemester found'); + return $this->logInfo('End Job rebuild Automated Tags'); + } + $studiensemester_kurzbz = $result->retval[0]->studiensemester_kurzbz ?? null; + $params = array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ); + + $this->logInfo('Start Job rebuild Automated Tags ' . $studiensemester_kurzbz); + foreach($automatedTags as $autoTag) + { + // getPath: must not be lost + $filePath = APPPATH . 'libraries/' . $autoTag->taglib . '.php'; // APPPATH = application/ + + if(file_exists($filePath)) { + require_once($filePath); + } else { + $this->logInfo("File not found: " . $filePath); + continue; + } + + $kurz_bz = $autoTag->typ_kurzbz; + // className without PATH (basename) + $className = basename($autoTag->taglib); + + $obj = new $className(); + + $outputArray = $obj->getZuordnungIds($params); + $typeId = $outputArray->typeId; + + $paramsTag = array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'kurzbz' => $kurz_bz, + 'data' => $outputArray->data, + 'typeId' => $typeId + ); + + $result = $this->taglib->updateAutomatedTags($paramsTag); + + if (isError($result)) { + $this->logError('Error occurred during updateAutomatedTags ' . $kurz_bz); + continue; + } + + $data = is_array($result) ? $result['retval'] : $result->retval; + + //SUMMARY + $this->logInfo("Tag " . $result->retval['input']['tag'] . " | type_id " . $typeId . " --" + . " Count Recycled: " . $result->retval['summary']['recycled'] + . " Count Added: ". $result->retval['summary']['added'] + . " Count Deleted: ". $result->retval['summary']['deleted']); + + //DETAILS + if($result->retval['results']['newTags']) + $this->logInfo("Tag " . $result->retval['input']['tag'] . "New tag(s): " . implode(', ', $result->retval['results']['newTags'])); + if($result->retval['results']['deletedTagsIds']) + $this->logInfo("Tag " . $result->retval['input']['tag'] . "Deleted tags(s: " . implode(', ', $result->retval['results']['deletedTagsIds'])); + if ($result->retval['results']['retaggedIds']) + $this->logInfo("Tag " . $result->retval['input']['tag'] . "Recycled tag(s): " . implode(', ', $result->retval['results']['retaggedIds'])); + } + $this->logInfo( "End Job rebuild Automated Tags"); + } +} diff --git a/application/controllers/js/Tabulatorcolumns.php b/application/controllers/js/Tabulatorcolumns.php new file mode 100644 index 000000000..1a4621219 --- /dev/null +++ b/application/controllers/js/Tabulatorcolumns.php @@ -0,0 +1,60 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * This controller generates javascript from snippets for tabulator columns + */ +class Tabulatorcolumns extends Auth_Controller +{ + public function __construct() + { + parent::__construct([ + 'stv' => ['admin:r', 'assistenz:r'], + 'lvverwaltung' => ['admin:r', 'assistenz:r'] + ]); + } + + /** + * Render tabulator columns for config + * + * @param string $config + * + * @return void + */ + public function _remap($config) + { + $this->load->config($config); + $list_columns = $this->config->item('list_columns') ?: []; + + $snippets = [ + 'jssnippets/tabulatorcolumns/' . $config . '.js' + ]; + + foreach ($list_columns as $col) { + $snippets[] = $col['js']; + } + + $this->output->set_content_type('application/javascript'); + + $this->load->view('jssnippets/tabulatorcolumns.js', [ + 'snippets' => $snippets + ]); + } +} diff --git a/application/controllers/lehre/Studierendenantrag.php b/application/controllers/lehre/Studierendenantrag.php index 107c9af96..ad333679d 100644 --- a/application/controllers/lehre/Studierendenantrag.php +++ b/application/controllers/lehre/Studierendenantrag.php @@ -25,10 +25,13 @@ class Studierendenantrag extends FHC_Controller // Load language phrases $this->loadPhrases([ - 'studierendenantrag' + 'studierendenantrag', + 'ui' ]); - if (strtolower($this->router->method) === 'leitung') + $this->load->config('studierendenantrag'); + + if (strtolower($this->router->method) === 'leitung') $this->_isAllowed([ 'leitung' => ['student/studierendenantrag:r', 'student/antragfreigabe:r'] ]); @@ -54,18 +57,27 @@ class Studierendenantrag extends FHC_Controller 'bezeichnungStg' => $antrag->bezeichnung, 'bezeichnungOrgform' => $antrag->orgform ); - - $result = $this->antraglib->getPrestudentWiederholungsBerechtigt($antrag->prestudent_id); - if (getData($result) == 1) - $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Wiederholung'; - $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($antrag->prestudent_id); - if (getData($result) == 1) - $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Unterbrechung'; + if ($this->config->item('wiederholung_enabled') === true) + { + $result = $this->antraglib->getPrestudentWiederholungsBerechtigt($antrag->prestudent_id); + if (getData($result) == 1) + $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Wiederholung'; + } - $result = $this->antraglib->getPrestudentAbmeldeBerechtigt($antrag->prestudent_id); - if (getData($result) == 1) - $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Abmeldung'; + if ($this->config->item('unterbrechung_enabled') === true) + { + $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($antrag->prestudent_id); + if (getData($result) == 1) + $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Unterbrechung'; + } + + if ($this->config->item('abmeldung_enabled') === true) + { + $result = $this->antraglib->getPrestudentAbmeldeBerechtigt($antrag->prestudent_id); + if (getData($result) == 1) + $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Abmeldung'; + } } if ($antrag->studierendenantrag_id == null) continue; @@ -88,45 +100,59 @@ class Studierendenantrag extends FHC_Controller $this->load->view('lehre/Antrag/Leitung/List', [ 'stgA' => $stgA, - 'stgL' => $stgL + 'stgL' => $stgL, + 'abmeldung_enabled' => $this->config->item('abmeldung_stg_enabled') ]); } public function abmeldung($prestudent_id, $studierendenantrag_id = null) { - $this->load->view('lehre/Antrag/Create', [ - 'prestudent_id' => $prestudent_id, - 'studierendenantrag_id' => $studierendenantrag_id, - 'antrag_type' => 'Abmeldung' - ]); + if ($this->config->item('abmeldung_enabled') === true) + { + $this->load->view('lehre/Antrag/Create', [ + 'prestudent_id' => $prestudent_id, + 'studierendenantrag_id' => $studierendenantrag_id, + 'antrag_type' => 'Abmeldung' + ]); + } } public function abmeldungstgl($prestudent_id, $studierendenantrag_id = null) { - $this->load->view('lehre/Antrag/Create', [ - 'prestudent_id' => $prestudent_id, - 'studierendenantrag_id' => $studierendenantrag_id, - 'antrag_type' => 'AbmeldungStgl' - ]); + if ($this->config->item('abmeldung_stg_enabled') === true) + { + $this->load->view('lehre/Antrag/Create', [ + 'prestudent_id' => $prestudent_id, + 'studierendenantrag_id' => $studierendenantrag_id, + 'antrag_type' => 'AbmeldungStgl' + ]); + } } public function unterbrechung($prestudent_id, $studierendenantrag_id = null) { - $this->load->view('lehre/Antrag/Create', [ - 'prestudent_id' => $prestudent_id, - 'studierendenantrag_id' => $studierendenantrag_id, - 'antrag_type' => 'Unterbrechung' - ]); + if ($this->config->item('unterbrechung_enabled') === true) + { + $this->load->view('lehre/Antrag/Create', [ + 'prestudent_id' => $prestudent_id, + 'studierendenantrag_id' => $studierendenantrag_id, + 'antrag_type' => 'Unterbrechung' + ]); + } + } public function wiederholung($prestudent_id, $studierendenantrag_id = null) { - $this->load->view('lehre/Antrag/Create', [ - 'prestudent_id' => $prestudent_id, - 'studierendenantrag_id' => $studierendenantrag_id, - 'antrag_type' => 'Wiederholung' - ]); + if ($this->config->item('wiederholung_enabled') === true) + { + $this->load->view('lehre/Antrag/Create', [ + 'prestudent_id' => $prestudent_id, + 'studierendenantrag_id' => $studierendenantrag_id, + 'antrag_type' => 'Wiederholung' + ]); + } } /** diff --git a/application/controllers/person/Gradelist.php b/application/controllers/person/Gradelist.php index 230c7f67f..d6df2c43a 100644 --- a/application/controllers/person/Gradelist.php +++ b/application/controllers/person/Gradelist.php @@ -198,7 +198,19 @@ class Gradelist extends Auth_Controller if (!isset($row_noten->found)) { $result_lv = $this->LehrveranstaltungModel->load($row_noten->lehrveranstaltung_id); - $result_stg = $this->StudiengangModel->load($result_lv->retval[0]->studiengang_kz); + + $studiengang_kz = null; + + if (!empty($result_lv->retval) && isset($result_lv->retval[0]) && isset($result_lv->retval[0]->studiengang_kz)) + { + $result_stg = $this->StudiengangModel->load($result_lv->retval[0]->studiengang_kz); + + if (!empty($result_stg->retval) && isset($result_stg->retval[0]) && is_object($result_stg->retval[0]) && isset($result_stg->retval[0]->kurzbzlang)) + { + $studiengang_kz = $result_stg->retval[0]->kurzbzlang; + } + } + $courses['semester'][$row_noten->studiensemester_kurzbz]['lvs_nonstpl'][] = array( 'lehrveranstaltung_id' => $row_noten->lehrveranstaltung_id, 'lehrtyp_kurzbz' => $result_lv->retval[0]->lehrtyp_kurzbz, @@ -212,8 +224,8 @@ class Gradelist extends Auth_Controller 'semester' => $result_lv->retval[0]->semester, 'note' => $row_noten->note, 'datum' => $row_noten->benotungsdatum, - 'zugeordnet' => true, - 'studiengang_kurzbz' => $result_stg->retval[0]->kurzbzlang + 'studiengang_kurzbz' => $studiengang_kz, + 'zugeordnet' => true ); if(!isset($courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl'])) $courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl'] = 0; diff --git a/application/core/Notiz_Controller.php b/application/core/Notiz_Controller.php index 923970923..7269c3b09 100644 --- a/application/core/Notiz_Controller.php +++ b/application/core/Notiz_Controller.php @@ -417,6 +417,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller $notiz_id = $this->input->post('notiz_id'); $this->NotizModel->addSelect('campus.tbl_dms_version.*'); + $this->NotizModel->addSelect($this->NotizModel->escape(base_url('content/notizdokdownload.php?id=')) . ' || public.tbl_notiz_dokument.dms_id AS preview'); $this->NotizModel->addJoin('public.tbl_notiz_dokument', 'ON (public.tbl_notiz_dokument.notiz_id = public.tbl_notiz.notiz_id)'); $this->NotizModel->addJoin('campus.tbl_dms_version', 'ON (public.tbl_notiz_dokument.dms_id = campus.tbl_dms_version.dms_id)'); diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php index 5b9bac6c5..c4b6edb81 100644 --- a/application/core/Tag_Controller.php +++ b/application/core/Tag_Controller.php @@ -7,7 +7,7 @@ class Tag_Controller extends FHCAPI_Controller { private $_uid; - const BERECHTIGUNG_KURZBZ = 'admin:rw'; + const BERECHTIGUNG_KURZBZ = ['admin:rw']; public function __construct($permissions) { @@ -15,10 +15,11 @@ class Tag_Controller extends FHCAPI_Controller 'getTag' => self::BERECHTIGUNG_KURZBZ, 'getTags' => self::BERECHTIGUNG_KURZBZ, 'addTag' => self::BERECHTIGUNG_KURZBZ, - 'updateTag' => self::BERECHTIGUNG_KURZBZ, 'doneTag' => self::BERECHTIGUNG_KURZBZ, 'deleteTag' => self::BERECHTIGUNG_KURZBZ, + 'getAllTags' => self::BERECHTIGUNG_KURZBZ, + 'rebuildTagsForTypeId' => self::BERECHTIGUNG_KURZBZ, ]; $merged_permissions = array_merge($default_permissions, $permissions); @@ -26,6 +27,10 @@ class Tag_Controller extends FHCAPI_Controller parent::__construct($merged_permissions); $this->_setAuthUID(); + + // Library + $this->load->library('TagLib'); + $this->load->model('person/Notiz_model', 'NotizModel'); $this->load->model('system/Notiztyp_model', 'NotiztypModel'); $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); @@ -38,6 +43,8 @@ class Tag_Controller extends FHCAPI_Controller public function getTag($readonly_tags = null) { $language = $this->_getLanguageIndex(); + $index_bezeichnung_mehrsprachig = $language - 1; + $id = $this->input->get('id'); if (is_array($readonly_tags) && !isEmptyArray($readonly_tags)) @@ -62,14 +69,18 @@ class Tag_Controller extends FHCAPI_Controller $this->NotizModel->addSelect( "tbl_notiz.titel, tbl_notiz.text, - array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $language. " as bezeichnung, + array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung, tbl_notiz.notiz_id, tbl_notiz_typ.style, + tbl_notiz_typ.automatisiert, + tbl_notiz_typ.prioritaet, tbl_notiz.erledigt as done, tbl_notiz.insertamum, tbl_notiz.updateamum, (verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser, - (bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter + (bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter, + tbl_notiz.start, + tbl_notiz.ende " ); $this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz'); @@ -82,18 +93,24 @@ class Tag_Controller extends FHCAPI_Controller $notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id)); + $this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array()); } public function getTags($tags = null) { + $language = $this->_getLanguageIndex(); + $index_bezeichnung_mehrsprachig = $language - 1; + $this->NotiztypModel->addSelect( - 'typ_kurzbz as tag_typ_kurzbz, - array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung, + "typ_kurzbz as tag_typ_kurzbz, + array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung, style, beschreibung, - tag - ' + tag, + automatisiert, + prioritaet + " ); $this->NotiztypModel->addOrder('prioritaet'); @@ -271,6 +288,90 @@ class Tag_Controller extends FHCAPI_Controller $this->terminateWithSuccess($deleteNotiz); } + public function getAllTags($readonly_tags = false) + { + $language = $this->_getLanguageIndex(); + $index_bezeichnung_mehrsprachig = $language - 1; + $prestudent_id = $this->input->get('prestudent_id'); + + if (is_array($readonly_tags) && !isEmptyArray($readonly_tags)) + { + $readonly_tags = $this->_filterTag($readonly_tags, true); + + foreach ($readonly_tags as $key => $tag) + { + $readonly_tags[$key] = $this->NotizModel->db->escape($tag); + } + $tags = '(' . implode(',', $readonly_tags) . ')'; + + $this->NotizModel->addSelect(" + CASE + WHEN tbl_notiz_typ.typ_kurzbz IN $tags + THEN TRUE + ELSE FALSE + END as readonly + "); + } + $this->NotizModel->addSelect( + "tbl_notiz.titel, + tbl_notiz.text, + array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung, + tbl_notiz.notiz_id, + tbl_notiz_typ.style, + tbl_notiz_typ.automatisiert, + tbl_notiz_typ.prioritaet, + tbl_notiz.erledigt as done, + tbl_notiz.insertamum, + tbl_notiz.updateamum, + (verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser, + (bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter, + tbl_notiz.start, + tbl_notiz.ende + " + ); + $this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz'); + + $this->NotizModel->addJoin('public.tbl_benutzer verfasserbenutzer', 'tbl_notiz.verfasser_uid = verfasserbenutzer.uid', 'LEFT'); + $this->NotizModel->addJoin('public.tbl_person verfasserperson', 'verfasserbenutzer.person_id = verfasserperson.person_id', 'LEFT'); + + $this->NotizModel->addJoin('public.tbl_benutzer bearbeiterbenutzer', 'tbl_notiz.bearbeiter_uid = bearbeiterbenutzer.uid', 'LEFT'); + $this->NotizModel->addJoin('public.tbl_person bearbeiterperson', 'bearbeiterbenutzer.person_id = bearbeiterperson.person_id', 'LEFT'); + + $this->NotizModel->addJoin('public.tbl_notizzuordnung notizzuordnung', 'tbl_notiz.notiz_id = notizzuordnung.notiz_id'); + + $this->NotizModel->addOrder('done'); + $this->NotizModel->addOrder('tbl_notiz_typ.prioritaet'); + $notiz = $this->NotizModel->loadWhere(array('prestudent_id' => $prestudent_id)); + + + $this->terminateWithSuccess(hasData($notiz) ? getData($notiz) : array()); + } + + public function rebuildTagsForTypeId() + { + $ids = $this->input->post('ids'); + $typeId = $this->input->post('typeId'); + $semester = $this->input->post('sem'); + + $idsSuccess = []; + $idsError = []; + $outputResult = []; + + foreach ($ids as $id) + { + $result = $this->taglib->rebuildTagsForTypeId($typeId, $id, $semester); + + if (isError($result)) + $idsError[] = $id; + else + $idsSuccess[] = $id; + + $outputResult[] = $result; + } + + $this->terminateWithSuccess([$outputResult, $idsSuccess, $idsError]); + } + private function _setAuthUID() { $this->_uid = getAuthUID(); @@ -311,4 +412,4 @@ class Tag_Controller extends FHCAPI_Controller )); } -} \ No newline at end of file +} diff --git a/application/helpers/hlp_document_helper.php b/application/helpers/hlp_document_helper.php new file mode 100644 index 000000000..5b457fe82 --- /dev/null +++ b/application/helpers/hlp_document_helper.php @@ -0,0 +1,188 @@ +load->library('PhrasesLib', array('stv'), 'p'); + + $permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}"); + + $title_ger = $ci->p->t("global", "deutsch"); + $title_eng = $ci->p->t("global", "englisch"); + $title_ff = $ci->p->t("stv", "document_certificate"); + $title_lv = $ci->p->t("stv", "document_coursecertificate"); + + $link_ff = "documents/export/" . + "zertifikat.rdf.php/" . + "Zertifikat" . + "?stg_kz={studiengang_kz_lv}" . + "&uid={uid}" . + "&ss={studiensemester_kurzbz}" . + "&lvid={lehrveranstaltung_id}"; + $link_lv_ger = "documents/export/" . + "lehrveranstaltungszeugnis.rdf.php/" . + "LVZeugnis" . + "?stg_kz={studiengang_kz}" . + "&uid={uid}" . + "&ss={studiensemester_kurzbz}" . + "&lvid={lehrveranstaltung_id}"; + $link_lv_eng = "documents/export/" . + "lehrveranstaltungszeugnis.rdf.php/" . + "LVZeugnisEng" . + "?stg_kz={studiengang_kz}" . + "&uid={uid}" . + "&ss={studiensemester_kurzbz}" . + "&lvid={lehrveranstaltung_id}"; + + $archive_url = "api/frontend/v1/documents/archiveSigned"; + $archive_response = $ci->p->t("stv", "document_signed_and_archived"); + $archive_post_ff = [ + "xml" => "zertifikat.rdf.php", + "xsl" => "Zertifikat", + "stg_kz" => "{studiengang_kz_lv}", + "uid" => "{uid}", + "ss" => "{studiensemester_kurzbz}", + "lvid" => "{lehrveranstaltung_id}" + ]; + $archive_post_lv_ger = [ + "xml" => "lehrveranstaltungszeugnis.rdf.php", + "xsl" => "LVZeugnis", + "stg_kz" => "{studiengang_kz}", + "uid" => "{uid}", + "ss" => "{studiensemester_kurzbz}", + "lvid" => "{lehrveranstaltung_id}" + ]; + $archive_post_lv_eng = [ + "xml" => "lehrveranstaltungszeugnis.rdf.php", + "xsl" => "LVZeugnisEng", + "stg_kz" => "{studiengang_kz}", + "uid" => "{uid}", + "ss" => "{studiensemester_kurzbz}", + "lvid" => "{lehrveranstaltung_id}" + ]; + + $list = [ + [ + 'title' => '', + 'children' => [ + [ + 'title' => $title_ff, + 'link' => site_url($link_ff) + ], + [ + 'title' => $title_lv, + 'children' => [ + [ + 'title' => $title_ger, + 'link' => site_url($link_lv_ger), + 'children' => [ + [ + 'title' => 'PDF', + 'permissioncheck' => $permissioncheck, + 'link' => site_url($link_lv_ger) + ], + [ + 'title' => 'DOC', + 'permissioncheck' => $permissioncheck, + 'link' => site_url($link_lv_ger . "&output=doc") + ], + [ + 'title' => 'ODT', + 'permissioncheck' => $permissioncheck, + 'link' => site_url($link_lv_ger . "&output=odt") + ] + ] + ], + [ + 'title' => $title_eng, + 'link' => site_url($link_lv_eng), + 'children' => [ + [ + 'title' => 'PDF', + 'permissioncheck' => $permissioncheck, + 'link' => site_url($link_lv_eng) + ], + [ + 'title' => 'DOC', + 'permissioncheck' => $permissioncheck, + 'link' => site_url($link_lv_eng . "&output=doc") + ], + [ + 'title' => 'ODT', + 'permissioncheck' => $permissioncheck, + 'link' => site_url($link_lv_eng . "&output=odt") + ] + ] + ] + ] + ] + ] + ], + [ + 'title' => '', + 'children' => [ + [ + 'title' => $title_ff, + 'action' => [ + 'url' => site_url($archive_url), + 'post' => $archive_post_ff, + 'response' => $archive_response + ] + ], + [ + 'title' => $title_lv, + 'children' => [ + [ + 'title' => $title_ger, + 'action' => [ + 'url' => site_url($archive_url), + 'post' => $archive_post_lv_ger, + 'response' => $archive_response + ] + ], + [ + 'title' => $title_eng, + 'action' => [ + 'url' => site_url($archive_url), + 'post' => $archive_post_lv_eng, + 'response' => $archive_response + ] + ] + ] + ] + ] + ] + ]; + + return $list; +} diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php index 27dfba5a1..eb2cd9f85 100644 --- a/application/helpers/hlp_header_helper.php +++ b/application/helpers/hlp_header_helper.php @@ -111,7 +111,8 @@ function generateJSDataStorageObject($indexPage, $calledPath, $calledMethod) 'theme' => [ 'name'=>$ci->config->item('theme_name'), 'modes'=>$ci->config->item('theme_modes'), - ] + ], + 'domain' => DOMAIN ); $toPrint = "\n"; @@ -270,6 +271,28 @@ function absoluteJsImportUrl($relurl) return $url; } +/* + * Generate Css File Include if Extension contains file + * + * @param $relativeFilePath path relative to Extension public/css dir + */ +function generateCSSsIncludeIfExtensionCssExists($relativeFilePath) +{ + $fsiterator = new FilesystemIterator(FHCPATH . 'application/extensions'); + foreach ($fsiterator as $fsitem) + { + if(preg_match('/^FHC-Core-/', $fsitem->getBasename())) + { + $extensionfile = 'public/extensions/' . $fsitem->getBasename() + . '/css/' . $relativeFilePath; + if(is_readable(FHCPATH . $extensionfile)) + { + generateCSSsInclude($extensionfile); + } + } + } +} + /* * Manipulate CI views includes Array to load * - public/js/FhcApps.js via customJSs and diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index 3d8a2ea26..35edc826c 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -1657,7 +1657,7 @@ class AntragLib $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere($where); if (isError($result)) - return $result; + return $result; if (!hasData($result)) return error($this->_ci->p->t('studierendenantrag', "error_no_antrag_found", ['id' => $studierendenantrag_id])); @@ -1709,6 +1709,7 @@ class AntragLib $result->statustyp = $antrag->statustyp; $result->status_insertvon = $antrag->status_insertvon; $result->grund = $antrag->grund; + $result->status_grund = $antrag->status_grund; $result->studierendenantrag_id = $antrag->studierendenantrag_id; $result->typ = $antrag->typ; $result->datum = $antrag->datum; diff --git a/application/libraries/LektorLib.php b/application/libraries/LektorLib.php index bbe630eaf..8a60e0aaa 100644 --- a/application/libraries/LektorLib.php +++ b/application/libraries/LektorLib.php @@ -17,7 +17,12 @@ class LektorLib $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); $this->_ci->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel'); $this->_ci->load->model('person/Benutzer_model', 'BenutzerModel'); + $this->_ci->load->model('ressource/Zeitsperre_model', 'ZeitsperreModel'); + $this->_ci->load->model('ressource/Reservierung_model', 'ReservierungModel'); + $this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel'); + $this->_ci->load->library('PhrasesLib', array('lehre')); + $this->_ci->load->library('VariableLib', ['uid' => getAuthUID()]); } public function addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid) @@ -78,10 +83,13 @@ class LektorLib public function updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $new_data) { + $old_uid = $mitarbeiter_uid; + $new_uid = isset($new_data['mitarbeiter_uid']) ? $new_data['mitarbeiter_uid'] : $mitarbeiter_uid; + $this->_ci->LehreinheitmitarbeiterModel->addSelect('lehre.tbl_lehreinheitmitarbeiter.*, lehre.tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.studiengang_kz'); $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id'); $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id'); - $lehreinheit_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid)); + $lehreinheit_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $old_uid)); if (isError($lehreinheit_result)) return $lehreinheit_result; @@ -89,27 +97,47 @@ class LektorLib $lehreinheit = getData($lehreinheit_result)[0]; + $semesterstunden_alt = $lehreinheit->semesterstunden; + $semesterstunden_neu = isset($new_data['semesterstunden']) ? $new_data['semesterstunden'] : $semesterstunden_alt; + $bismelden_neu = isset($new_data['bismelden']) ? $new_data['bismelden'] : $lehreinheit->bismelden; + $neue_stunden_eingerechnet = (bool)$bismelden_neu; + $alte_stunden_eingerechnet = (bool)$lehreinheit->bismelden; + $stundenplan_update = false; - //TODO kollision check, wird vorerst nicht implementiert -> nur über das FAS möglich - if (isset($new_data['mitarbeiter_uid']) && $new_data['mitarbeiter_uid'] !== $mitarbeiter_uid) + if ($old_uid !== $new_uid) { - $this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel'); - $this->_ci->StundenplandevModel->addGroupBy('stundenplandev_id'); - $this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid'); - $this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid'); - $verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid)); - - if (hasData($verplant)) - return error($this->_ci->phraseslib->t("lehre", "lektorbereitsverplant")); - - $lehreinheit_data = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $new_data['mitarbeiter_uid'], 'lehreinheit_id' => $lehreinheit_id)); + $lehreinheit_data = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $new_uid, 'lehreinheit_id' => $lehreinheit_id)); if (hasData($lehreinheit_data)) return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt")); + $this->_ci->StundenplandevModel->addGroupBy('stundenplandev_id'); + $this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid'); + $verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $old_uid)); + + if (hasData($verplant)) + { + $kollision = $this->hasKollision(getData($verplant), $new_uid); + + $ignore_kollision = $this->_ci->variablelib->getVar('ignore_kollision'); + + if ($kollision === false || $ignore_kollision == 'true') + { + $stundenplan_update = true; + } + else if (is_array($kollision)) + { + return error( "Änderung fehlgeschlagen! Die Änderung des Lektors führt zu ".count($kollision)." Kollision(en) im LV-Plan. Deaktivieren Sie die Kollisionspruefung oder wenden Sie sich an die LV-Planung!\n zB. $kollision[0]"); + } + else + { + return error($kollision); + } + } } + $warning = ''; - if (isset($new_data['semesterstunden'])) + if (($semesterstunden_neu !== '' && $semesterstunden_alt !== '') && (($semesterstunden_neu > $semesterstunden_alt) || $neue_stunden_eingerechnet)) { $studiengang_result = $this->_ci->StudiengangModel->loadWhere(array('studiengang_kz' => $lehreinheit->studiengang_kz)); if (isError($studiengang_result)) return $studiengang_result; @@ -120,7 +148,7 @@ class LektorLib if (isError($studiensemester_result)) return $studiensemester_result; $studiensemester = getData($studiensemester_result)[0]; - $echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'echterdv'); + $echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($new_uid, $studiensemester->start, $studiensemester->ende, 'echterdv'); $echter_dv = false; @@ -129,83 +157,81 @@ class LektorLib $echter_dv = true; } - $neue_stunden_eingerechnet = isset($new_data['bismelden']) ? $new_data['bismelden'] : $lehreinheit->bismelden; - $alte_stunden_eingerechnet = $lehreinheit->bismelden; + $stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv); + if (isError($stundengrenze_result)) return $stundengrenze_result; - if (($new_data['semesterstunden'] > $lehreinheit->semesterstunden) || $neue_stunden_eingerechnet) + $stundengrenze = getData($stundengrenze_result)[0]; + + $oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz); + $oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array(); + + $semesterstunden_alt_sql = is_null($semesterstunden_alt) ? 0 : $semesterstunden_alt; + $semesterstunden_neu_sql = is_null($semesterstunden_neu) ? 0 : $semesterstunden_neu; + + if ($alte_stunden_eingerechnet && $neue_stunden_eingerechnet) + $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($semesterstunden_alt_sql) + {$this->_ci->LehreinheitmitarbeiterModel->db->escape($semesterstunden_neu_sql)}) as summe"); + else if ($alte_stunden_eingerechnet && !$neue_stunden_eingerechnet) + $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($semesterstunden_alt_sql)) as summe"); + else if (!$alte_stunden_eingerechnet && $neue_stunden_eingerechnet) + $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) + ({$this->_ci->LehreinheitmitarbeiterModel->db->escape($semesterstunden_neu_sql)})) as summe"); + else if (!$alte_stunden_eingerechnet && !$neue_stunden_eingerechnet) + $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden)) as summe"); + + $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id'); + $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id'); + $this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz'); + + $this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', $new_uid); + $this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $lehreinheit->studiensemester_kurzbz); + $this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true); + $this->_ci->LehreinheitmitarbeiterModel->db->where('lower(mitarbeiter_uid) NOT LIKE', '_dummy%'); + + if (count($oe_array) > 0) { - $stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv); - if (isError($stundengrenze_result)) return $stundengrenze_result; - - $stundengrenze = getData($stundengrenze_result)[0]; - - $oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz); - $oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array(''); - - if ($alte_stunden_eingerechnet && $neue_stunden_eingerechnet) - $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($lehreinheit->semesterstunden) + {$this->_ci->LehreinheitmitarbeiterModel->db->escape($new_data['semesterstunden'])}) as summe"); - else if ($alte_stunden_eingerechnet && !$neue_stunden_eingerechnet) - $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($lehreinheit->semesterstunden)) as summe"); - else if (!$alte_stunden_eingerechnet && $neue_stunden_eingerechnet) - $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) + ({$this->_ci->LehreinheitmitarbeiterModel->db->escape($new_data['semesterstunden'])})) as summe"); - else if (!$alte_stunden_eingerechnet && !$neue_stunden_eingerechnet) - $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden)) as summe"); - - $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id'); - $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id'); - $this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz'); - - $this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', (isset($new_data['mitarbeiter_uid']) ? $new_data['mitarbeiter_uid'] : $mitarbeiter_uid)); - $this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $lehreinheit->studiensemester_kurzbz); - $this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true); - $this->_ci->LehreinheitmitarbeiterModel->db->where('lower(mitarbeiter_uid) NOT LIKE', '_dummy%'); - $this->_ci->LehreinheitmitarbeiterModel->db->where_in('tbl_studiengang.oe_kurzbz', $oe_array); + } + if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE') + && is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) + && count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) > 0) + { + $this->_ci->LehreinheitmitarbeiterModel->db->where_not_in('tbl_studiengang.oe_kurzbz', FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE); + } - if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE') - && is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) - && count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) > 0) + $summe_result = $this->_ci->LehreinheitmitarbeiterModel->load(); + + if (isError($summe_result)) return $summe_result; + + if (!hasData($summe_result)) return error('Fehler beim Ermitteln der Gesamtstunden'); + + $summe = getData($summe_result)[0]->summe; + + if ($summe > $stundengrenze->stunden) + { + if (!$echter_dv && (!$this->_ci->permissionlib->isBerechtigt('admin'))) { - $this->_ci->LehreinheitmitarbeiterModel->db->where_not_in('tbl_studiengang.oe_kurzbz', FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE); + if (!$this->LehrauftragAufFirma($new_uid)) + return error("ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden NICHT gespeichert!\n\n"); + } + else + { + $warning .= "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden gespeichert!\n\n"; } - $summe_result = $this->_ci->LehreinheitmitarbeiterModel->load(); + $stunden_limit_result = $this->getStundenInstitut($new_uid, $lehreinheit->studiensemester_kurzbz, $oe_array); - if (isError($summe_result)) return $summe_result; - - if (!hasData($summe_result)) return error('Fehler beim Ermitteln der Gesamtstunden'); - - $summe = getData($summe_result)[0]->summe; - - if ($summe > $stundengrenze->stunden) + if (hasData($stunden_limit_result)) { - - if (!$echter_dv && (!$this->_ci->permissionlib->isBerechtigt('admin'))) + $stunden_limit_array = getData($stunden_limit_result); + foreach ($stunden_limit_array as $stunden_limit) { - if (!$this->LehrauftragAufFirma(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid)) - return error("ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden NICHT gespeichert!\n\n"); - } - else - { - $warning .= "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden gespeichert!\n\n"; - } - - $stunden_limit_result = $this->getStundenInstitut($mitarbeiter_uid, $lehreinheit->studiensemester_kurzbz, $oe_array); - - if (hasData($stunden_limit_result)) - { - $stunden_limit_array = getData($stunden_limit_result); - foreach ($stunden_limit_array as $stunden_limit) - { - $warning .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n"; - } + $warning .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n"; } } } } - $benutzer_result = $this->_ci->BenutzerModel->load(array(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid)); + $benutzer_result = $this->_ci->BenutzerModel->load(array($new_uid)); if (isError($benutzer_result)) return $benutzer_result; @@ -227,12 +253,23 @@ class LektorLib 'bismelden' ); + $nullable_fields = array('stundensatz', 'semesterstunden', 'planstunden'); + $updateData = array(); foreach ($updatableFields as $field) { - $value = isset($new_data[$field]) ? $new_data[$field] : null; + if (!array_key_exists($field, $new_data)) + { + continue; + } - if ($value !== null) + $value = $new_data[$field]; + + if (in_array($field, $nullable_fields)) + { + $updateData[$field] = $value; + } + elseif ($value !== null) { $updateData[$field] = $value; } @@ -240,10 +277,24 @@ class LektorLib $updateData['updatevon'] = getAuthUID(); $updateData['updateamum'] = date('Y-m-d H:i:s'); - $result = $this->_ci->LehreinheitmitarbeiterModel->update(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid), $updateData); + $result = $this->_ci->LehreinheitmitarbeiterModel->update(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $old_uid), $updateData); if (isError($result)) return $result; + if ($stundenplan_update) + { + $update_result = $this->_ci->StundenplandevModel->update([ + 'lehreinheit_id' => $lehreinheit_id, + 'mitarbeiter_uid' => $old_uid, + ], [ + 'mitarbeiter_uid' => $new_uid, + 'updateamum' => date('Y-m-d H:i:s'), + 'updatevon' => getAuthUID() + ]); + + if (isError($update_result)) return $update_result; + } + if ($warning !== '') return success(['warning' => $warning]); return success('Erfolgreich geupdated'); @@ -347,4 +398,52 @@ class LektorLib $this->_ci->LehreinheitmitarbeiterModel->addGroupBy('tbl_studiengang.bezeichnung'); return $this->_ci->LehreinheitmitarbeiterModel->load(); } + + private function hasKollision($stunden, $mitarbeiter) + { + $kollision = array(); + + $ignore_zeitsperre = $this->_ci->variablelib->getVar('ignore_zeitsperre'); + $ignore_reservierung = $this->_ci->variablelib->getVar('ignore_reservierung'); + + foreach ($stunden as $stunde) + { + $stundenplan_result = $this->_ci->StundenplandevModel->lektorHasStundenplandevEintrag($mitarbeiter, $stunde->datum, $stunde->stunde); + + if (isError($stundenplan_result)) + return $stundenplan_result; + + if (hasData($stundenplan_result)) + { + $stundenplan_result = getData($stundenplan_result)[0]; + $kollision[] = "Kollision stundenplandev: $stundenplan_result->stundenplandev_id|$stundenplan_result->lektor|$stundenplan_result->ort_kurzbz|$stundenplan_result->stg_kurzbz-$stundenplan_result->semester$stundenplan_result->verband$stundenplan_result->gruppe$stundenplan_result->gruppe_kurzbz - $stundenplan_result->datum/$stundenplan_result->stunde"; + } + else + { + if ($ignore_zeitsperre == 'false' && (!defined('KOLLISIONSFREIE_USER') || !in_array($mitarbeiter, unserialize(KOLLISIONSFREIE_USER)))) + { + $zeitsperre_result = $this->_ci->ZeitsperreModel->checkIfZeitsperreExists($mitarbeiter, $stunde->datum, $stunde->stunde); + + if (hasData($zeitsperre_result)) + { + $zeitsperre_result = getData($zeitsperre_result)[0]; + $kollision[] = "Kollision (Zeitsperre): $zeitsperre_result->zeitsperre_id|$zeitsperre_result->mitarbeiter_uid|$zeitsperre_result->zeitsperretyp_kurzbz - $zeitsperre_result->vondatum/$zeitsperre_result->vonstunde|$zeitsperre_result->bisdatum/$zeitsperre_result->bisstunde"; + } + } + + if ($ignore_reservierung == 'false' && (!defined('KOLLISIONSFREIE_USER') || !in_array($mitarbeiter, unserialize(KOLLISIONSFREIE_USER)))) + { + $reservierung_result = $this->_ci->ReservierungModel->lektorHasReservierung($mitarbeiter, $stunde->datum, $stunde->stunde); + + if (hasData($reservierung_result)) + { + $reservierung_result = getData($reservierung_result)[0]; + $kollision[] = "Kollision (Reservierung): $reservierung_result->reservierung_id|$reservierung_result->uid|$reservierung_result->ort_kurzbz|$reservierung_result->stg_kurzbz-$reservierung_result->semester$reservierung_result->verband$reservierung_result->gruppe$reservierung_result->gruppe_kurzbz - $reservierung_result->datum/$reservierung_result->stunde"; + } + } + } + } + + return isEmptyArray($kollision) ? false : $kollision; + } } diff --git a/application/libraries/ProfilLib.php b/application/libraries/ProfilLib.php index 97cb8ce5d..43a110b85 100644 --- a/application/libraries/ProfilLib.php +++ b/application/libraries/ProfilLib.php @@ -263,6 +263,59 @@ class ProfilLib{ $element->mailto = "mailto:" . $element->gruppe_kurzbz . "@" . DOMAIN; return $element; }, $mailverteiler_res); + + $this->ci->load->model("crm/Student_model", "StudentModel"); + $this->ci->StudentModel->addJoin("tbl_benutzer", "tbl_benutzer.uid = tbl_student.student_uid"); + $this->ci->StudentModel->addJoin("tbl_person", "tbl_benutzer.person_id = tbl_person.person_id"); + $this->ci->StudentModel->addJoin("tbl_studiengang", "tbl_student.studiengang_kz = tbl_studiengang.studiengang_kz"); + $this->ci->StudentModel->addSelect("matr_nr, semester, verband, gruppe, kurzbzlang"); + + $studentResult = $this->ci->StudentModel->loadWhere(["student_uid" => $uid]); + if (isError($studentResult)) { + return error(getData($studentResult)); + } + + $studentResultData = getData($studentResult); + $studentData = null; + if (is_array($studentResultData) && count($studentResultData)) { + $studentData = $studentResultData[0]; + } + + if ($studentData && $studentData->matr_nr) { + $this->ci->load->library("phrasesLib", ["profil"], "phrases"); + $standardCourseVerteiler = trim($studentData->kurzbzlang) . "_STD"; + $mailverteiler_res[] = [ + "beschreibung" => $this->ci->phrases->t('profil', 'alleStudentenVon') . " " . $standardCourseVerteiler, + "gruppe_kurzbz" => $standardCourseVerteiler, + "mailto" => "mailto:" . strtolower($standardCourseVerteiler) . "@" . DOMAIN, + ]; + + $semesterVerteiler = trim($studentData->kurzbzlang) . trim($studentData->semester); + $mailverteiler_res[] = [ + "beschreibung" => $this->ci->phrases->t('profil', 'alleStudentenVon') . " " . $semesterVerteiler, + "gruppe_kurzbz" => $semesterVerteiler, + "mailto" => "mailto:" . strtolower($semesterVerteiler) . "@" . DOMAIN, + ]; + + if ($studentData->verband && strlen(trim($studentData->verband))) { + $verbandVerteiler = $semesterVerteiler . trim($studentData->verband); + $mailverteiler_res[] = [ + "beschreibung" => $this->ci->phrases->t('profil', 'alleStudentenVon') . " " . $verbandVerteiler, + "gruppe_kurzbz" => $verbandVerteiler, + "mailto" => "mailto:" . strtolower($verbandVerteiler) . "@" . DOMAIN, + ]; + + if ($studentData->gruppe && strlen(trim($studentData->gruppe))) { + $gruppeVerteiler = $verbandVerteiler . trim($studentData->gruppe); + $mailverteiler_res[] = [ + "beschreibung" => $this->ci->phrases->t('profil', 'alleStudentenVon') . " " . $gruppeVerteiler, + "gruppe_kurzbz" => $gruppeVerteiler, + "mailto" => "mailto:" . strtolower($gruppeVerteiler) . "@" . DOMAIN, + ]; + } + } + } + return $mailverteiler_res; } diff --git a/application/libraries/StundenplanLib.php b/application/libraries/StundenplanLib.php index 7ed64da2c..2c13a29d9 100644 --- a/application/libraries/StundenplanLib.php +++ b/application/libraries/StundenplanLib.php @@ -40,13 +40,16 @@ class StundenplanLib * @return stdClass * @access public */ - public function getEventsUser($start, $end) + public function getEventsUser($start, $end, $uid = null) { $this->_ci =& get_instance(); $this->_ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); - $uid = getAuthUID(); + if (!$uid) { + $uid = getAuthUID(); + } + if (is_null($uid)) return error("No UID"); @@ -77,10 +80,12 @@ class StundenplanLib if (isError($semester_range)) return $semester_range; $semester_range = getData($semester_range); + $this->_ci->addMeta('semester_range', $semester_range); $this->sortStudienSemester($semester_range); $function_error = $this->applyLoadUeberSemesterHaelfte($semester_range); + $this->_ci->addMeta('nach_apply_semester_range', $semester_range); if ($function_error) return $function_error; @@ -89,13 +94,13 @@ class StundenplanLib if (isError($benutzer_gruppen)) return $benutzer_gruppen; $benutzer_gruppen = getData($benutzer_gruppen); - + $this->_ci->addMeta('spezialgruppen', $benutzer_gruppen); // getting the student_lehrverbaende of the student in the different studiensemester $student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range); if (isError($student_lehrverband)) return $student_lehrverband; $student_lehrverband = getData($student_lehrverband); - + $this->_ci->addMeta('studentlehrvebaende', $student_lehrverband); $stundenplan_query = $this->_ci->StundenplanModel->getStundenplanQuery( $start, $end, @@ -181,6 +186,21 @@ class StundenplanLib return success($stundenplan_data); } + public function getEventsByLE($lehreinheit_id, $start, $end, $stundenplan) + { + $this->_ci =& get_instance(); + + $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + return $this->_ci->StundenplanModel->getStundenplanLE($lehreinheit_id, $start, $end, $stundenplan); + } + + public function getEventsByLV($lehrveranstaltung_id, $start, $end, $stundenplan) + { + $this->_ci =& get_instance(); + + $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + return $this->_ci->StundenplanModel->getStundenplanLV($lehrveranstaltung_id, $start, $end, $stundenplan); + } /** * Get stundenplan for a room * @@ -217,7 +237,7 @@ class StundenplanLib * @param string $ort_kurzbz * @return stdClass */ - public function getReservierungen($start_date, $end_date, $ort_kurzbz = '') + public function getReservierungen($start_date, $end_date, $ort_kurzbz = '', $uid = null) { $this->_ci =& get_instance(); @@ -228,14 +248,14 @@ class StundenplanLib $this->_ci->load->model('ressource/Reservierung_model', 'ReservierungModel'); $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); - $is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter(getAuthUID())); + $is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter($uid ?? getAuthUID())); if ($is_mitarbeiter && empty($ort_kurzbz)) { // request for personal lvplan show only reservations of logged in user - $reservierungen = $this->_ci->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date); + $reservierungen = $this->_ci->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date, $uid); } else { // querying the reservierungen - $reservierungen = $this->_ci->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz); + $reservierungen = $this->_ci->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz, $uid); } if (isError($reservierungen)) @@ -357,7 +377,10 @@ class StundenplanLib if (isError($ort_content_object)) { return error(getData($ort_content_object)); } - $ort_content_object = getData($ort_content_object)[0]; + $ort_content_object_data = getData($ort_content_object); + $ort_content_object = (is_array($ort_content_object_data) && count($ort_content_object_data) > 0) + ? $ort_content_object_data[0] + : null; if($ort_content_object) { $item->ort_content_id = $ort_content_object->content_id; } @@ -445,6 +468,24 @@ class StundenplanLib return success($ferienEventsFlattened); } + public function getEventsStgOrg( $start, $end, $stg_kz, $sem, $verband, $gruppe) + { + $this->_ci =& get_instance(); + + $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + + $stundenplan_data = $this->_ci->StundenplanModel->getStundenplanStudiengang($start, $end, $stg_kz, $sem, $verband, $gruppe); + if (isError($stundenplan_data)) + return $stundenplan_data; + $stundenplan_data = getData($stundenplan_data) ?? []; + + $function_error = $this->expandObjectInformation($stundenplan_data); + if ($function_error) + return $function_error; + + return success($stundenplan_data); + } + // start of the private functions ######################################################################################################## // function used to sort an array of studiensemester strings @@ -591,6 +632,7 @@ class StundenplanLib $result->semester = $item->semester; $result->verband = $item->verband; $result->gruppe = $item->gruppe; + $result->studiensemester_kurzbz = $item->studiensemester_kurzbz; return $result; }, $lehrverband_query_result); @@ -760,7 +802,8 @@ class StundenplanLib $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); // gets all studiensemester from the student from start_date to end_date - $semester_range = $this->_ci->StudiensemesterModel->getByDateRange($start_date, $end_date); + //$semester_range = $this->_ci->StudiensemesterModel->getByDateRange($start_date, $end_date); + $semester_range = $this->_ci->StudiensemesterModel->getContainingOrNearestByDateRange($start_date, $end_date); if (isError($semester_range)) return $semester_range; diff --git a/application/libraries/TagLib.php b/application/libraries/TagLib.php new file mode 100644 index 000000000..637431360 --- /dev/null +++ b/application/libraries/TagLib.php @@ -0,0 +1,392 @@ +_ci =& get_instance(); + + // Configs + $this->_ci->load->config('stv'); + + // Models + $this->_ci->load->model('person/Notiz_model', 'NotizModel'); + $this->_ci->load->model('system/Notiztyp_model', 'NotiztypModel'); + $this->_ci->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); + $this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + // Libraries + $this->_ci->load->library('PermissionLib'); + $this->_ci->load->library('PrestudentLib'); + + $this->batchUser = $this->_ci->config->item('userAutomatedTags'); + } + + public function updateAutomatedTags($paramsTag) + { + // --------------------------------- + // check params + // --------------------------------- + $required = ['kurzbz', 'data', 'typeId']; + + foreach ($required as $key) { + if (!isset($paramsTag[$key])) { + return error('Missing Parameter: ' . $key); + } + } + + $studiensemester_kurzbz = (isset ($paramsTag['studiensemester_kurzbz']) ? $paramsTag['studiensemester_kurzbz'] : null); + $tag = $paramsTag['kurzbz']; + $inputData = $paramsTag['data']; + $typeId = $paramsTag['typeId']; + + // --------------------------------- + // prepare input + // --------------------------------- + $zeitraum = []; + $arrayIds = []; + + foreach ($inputData as $item) { + $id = $item['id']; + $arrayIds[] = $id; + + $zeitraum[$id] = [ + 'von' => $item['von'] ?? null, + 'bis' => $item['bis'] ?? null + ]; + } + $arrayIds = array_unique($arrayIds); + + $result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz); + if (isError($result)) { + return $result; + } + $data = $result->retval[0] ?? null; + + $von = $data->start ?? null; + $bis = $data->ende ?? null; + + // --------------------------------- + // load existing tags + // --------------------------------- + $allTags = []; + $resultAllTags = $this->_ci->NotizModel->getAllTags($tag, $von, $bis); + if (isError($resultAllTags)) { + return $resultAllTags; + } + $allTagsData = getData($resultAllTags); + + if (!empty($allTagsData)) { + foreach ($allTagsData as $item) { + $allTags[$item->$typeId] = $item->notiz_id; + } + } + + // --------------------------------- + // map the data + // --------------------------------- + $toRecycle = []; + $toAdd = []; + $toDelete = []; + + foreach ($arrayIds as $id) { + if (isset($allTags[$id])) { + $toRecycle[$id] = $allTags[$id]; + } else { + $toAdd[] = $id; + } + } + + foreach ($allTags as $id => $notizId) { + if (!in_array($id, $arrayIds)) { + $toDelete[$id] = $notizId; + + } + } + + // --------------------------------- + // recycle (update existing) + // --------------------------------- + $countRecycled = 0; + $retagged = []; + + foreach ($toRecycle as $id => $notizId) + { + $this->_updateTag($notizId, $zeitraum[$id]['von'], $zeitraum[$id]['bis']); + + $countRecycled++; + $retagged[] = $id; + } + + // --------------------------------- + // ADD + // --------------------------------- + $countAdded = 0; + $tagged = []; + + foreach ($toAdd as $id) + { + $this->_insertTag($typeId, $id, $tag, $zeitraum[$id]['von'], $zeitraum[$id]['bis']); + $countAdded++; + + $tagged[] = $id; + } + + // --------------------------------- + // delete + // --------------------------------- + $countDeleted = 0; + $deleted = []; + + foreach ($toDelete as $id => $notizId) + { + $result = $this->_deleteTag($notizId); + + if (isError($result)) { + return $result; + } + + $countDeleted++; + $deleted[] = $id; + } + + // --------------------------------- + // return + // --------------------------------- + return success([ + 'input' => [ + 'tag' => $tag, + 'arrayIds' => $arrayIds + ], + 'summary' => [ + 'recycled' => $countRecycled, + 'added' => $countAdded, + 'deleted' => $countDeleted + ], + 'details' => [ + 'existingTags' => $allTags, + 'toAdd' => $toAdd, + 'toRecycle' => $toRecycle, + 'toDelete' => $toDelete + ], + 'results' => [ + 'retaggedIds' => $retagged, + 'newTags' => $tagged, + 'deletedTagsIds' => $deleted + ] + ]); + } + + public function updateAutomatedTagsForTypeId(array $params) + { + $return = null; + $notiz_id = null; + + $von = $params['von']; + $bis = $params['bis']; + $tag = $params['kurzbz']; + $id = $params['id']; + $typeId = $params['typeId']; + + $this->_ci->NotizModel->addSelect('nz.notiz_id'); + $this->_ci->NotizModel->addSelect($typeId); + $this->_ci->NotizModel->addJoin('public.tbl_notizzuordnung nz', 'notiz_id'); + $resultAllTags = $this->_ci->NotizModel->loadWhere([ + 'typ' => $tag, + $typeId => $id + ]); + if(hasData($resultAllTags)) + { + $notiz_id = $resultAllTags->retval[0]->notiz_id; + } + + //RECYCLE + if ($notiz_id !== null) + { + $resultUpdateNotiz = $this->_updateTag($notiz_id, $von, $bis); + $return = ['recycled' => $resultUpdateNotiz]; + } + else + //ADD + { + $resultInsertNotiz = $this->_insertTag($typeId, $id, $tag, $von, $bis); + $return = ['added' => $resultInsertNotiz]; + } + return success($return); + } + + /* + * main function for rebuild Tags for typeId + * */ + public function rebuildTagsForTypeId($typeId, $id, $studiensemester_kurzbz) + { + $automatedTagsRes = $this->_ci->NotiztypModel->loadWhere(array('automatisiert' => true, 'taglib IS NOT NULL' => null)); + $automatedTags = hasData($automatedTagsRes) ? getData($automatedTagsRes) : []; + + $result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz); + if (isError($result)) + return error('Error occurred during retrieving studiensemester'); + if (empty($result->retval) || !isset($result->retval[0])) { + return error('No studiensemester found'); + } + + $startSem = $result->retval[0]->start ?? null; + $endeSem = $result->retval[0]->ende ?? null; + $return = []; + + foreach ($automatedTags as $autoTag) + { + // getPath: must not be lost + $filePath = APPPATH . 'libraries/' . $autoTag->taglib . '.php'; // APPPATH = application/ + + if (file_exists($filePath)) { + require_once($filePath); + } else { + echo "File not found: " . $filePath; + continue; + } + + $className = basename($autoTag->taglib); + $kurz_bz = $autoTag->typ_kurzbz; + + $obj = new $className(); + + $criteriaIsSet = $obj->isCriteriaSetFor([ + 'typeId' => $typeId, + 'id' => $id, + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ]); + + if (hasData($criteriaIsSet)) + { + $von = isset($criteriaIsSet->retval[0]->von) ? $criteriaIsSet->retval[0]->von : ''; + $bis = isset($criteriaIsSet->retval[0]->bis) ? $criteriaIsSet->retval[0]->bis : ''; + + $params = [ + 'von' => $von, + 'bis' => $bis, + 'kurzbz' => $autoTag->typ_kurzbz, + 'typeId' => $typeId, + 'id' => $id, + ]; + + $result = $this->updateAutomatedTagsForTypeId($params); + if (isError($result)) + return error('Error occurred during updateAutomatedTags' . $kurz_bz); + + $return[$kurz_bz] = $result; + } + else + { + //CHECK FOR DELETE + $params = [ + 'von' => $startSem, + 'bis' => $endeSem, + 'kurzbz' => $autoTag->typ_kurzbz, + 'typeId' => $typeId, + 'id' => $id, + ]; + $result = $this->_ci->NotizModel->checkIfExistingTag($kurz_bz, $typeId, $id, $startSem, $endeSem); + if (hasData($result)) + { + $notizId = $result->retval[0]->notiz_id; + $this->_deleteTag($notizId); + $return[$kurz_bz] = ['deleted' => $notizId]; + } + } + } + return success($return); + } + + private function _insertTag($typeId, $id, $tag, $von, $bis) + { + $resultInsert = $this->_ci->NotizModel->insert([ + 'titel' => 'TAG', + 'text' => 'AUTOMATED TAG', + 'verfasser_uid' => $this->batchUser, + 'erledigt' => false, + 'insertamum' => date('Y-m-d H:i:s'), + 'insertvon' => 'BatchJobTagAdd', + 'typ' => $tag, + 'start' => $von, + 'ende' => $bis + ]); + + if (isError($resultInsert)) { + return error('Error inserting tag for ' . $typeId . ': ' . $id); + } + + $notizId = $resultInsert->retval; + + $resultZuordnung = $this->_ci->NotizzuordnungModel->insert([ + 'notiz_id' => $notizId, + $typeId => $id + ]); + + if (isError($resultZuordnung)) { + return error('Error inserting relation for ' . $typeId . ': ' . $id); + } + + return $notizId; + } + + private function _updateTag($notiz_id, $von, $bis) + { + $resultUpdateNotiz = $this->_ci->NotizModel->update( + [ + 'notiz_id' => $notiz_id + ], + array( + 'updateamum' => date('Y-m-d H:i:s'), + 'updatevon' => 'BatchJobTagUpdate', + 'start' => $von, + 'ende' => $bis + )); + + + if (isError($resultUpdateNotiz)) + return error ('Error occurred during Update ' . $notiz_id); + + return $notiz_id; + } + + private function _deleteTag($notiz_id) + { + $result = $this->_ci->NotizzuordnungModel->delete([ + 'notiz_id' => $notiz_id + ]); + if (isError($result)) { + return error('Error occurred during delete Notizzuordnung ' . $notiz_id); + } + + $result = $this->_ci->NotizModel->delete([ + 'notiz_id' => $notiz_id + ]); + if (isError($result)) { + return error('Error occurred during delete Notiz ' . $notiz_id); + } + + return success([ + 'deleted' => $notiz_id + ]); + } + +} diff --git a/application/libraries/dashboard/DashboardLib.php b/application/libraries/dashboard/DashboardLib.php index 1c3983108..c9838f0e7 100644 --- a/application/libraries/dashboard/DashboardLib.php +++ b/application/libraries/dashboard/DashboardLib.php @@ -37,7 +37,9 @@ class DashboardLib public function getDashboardByKurzbz($dashboard_kurzbz) { - $result = $this->_ci->DashboardModel->getDashboardByKurzbz($dashboard_kurzbz); + $result = $this->_ci->DashboardModel->loadWhere([ + 'dashboard_kurzbz' => $dashboard_kurzbz + ]); if (hasData($result)) { @@ -47,17 +49,21 @@ class DashboardLib return null; } - public function getMergedConfig($dashboard_id, $uid) + public function getMergedUserConfig($dashboard_id, $uid) { - $defaultconfig = $this->getDefaultConfig($dashboard_id); - $userconfig = $this->getUserConfig($dashboard_id, $uid); + $defaultconfig = $this->getUserBaseConfig($dashboard_id); + $userconfig = $this->getUserOverrideConfig($dashboard_id, $uid); - $mergedconfig = array_replace_recursive($defaultconfig, $userconfig); + $sourceconfig = array_map(function ($value) { + return ['source' => $value['source']]; + }, $defaultconfig); + + $mergedconfig = array_replace_recursive($defaultconfig, $userconfig, $sourceconfig); return $mergedconfig; } - public function getDefaultConfig($dashboard_id) + protected function getUserBaseConfig($dashboard_id) { $funktion_kurzbzs = []; $rights = $this->_ci->permissionlib->getAccessRights(); @@ -87,7 +93,11 @@ class DashboardLib $preset = json_decode($presetobj->preset, true); if (null !== $preset) { - $defaultconfig = array_replace_recursive($defaultconfig, $preset); + $preset = array_map(function ($value) use ($presetobj) { + $value['source'] = $presetobj->funktion_kurzbz ?: self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL; + return $value; + }, $preset); + $defaultconfig = array_merge_recursive($defaultconfig, $preset); } } } @@ -95,7 +105,7 @@ class DashboardLib return $defaultconfig; } - public function getUserConfig($dashboard_id, $uid) + protected function getUserOverrideConfig($dashboard_id, $uid) { $res_userconfig = $this->_ci->DashboardOverrideModel->getOverride($dashboard_id, $uid); @@ -124,7 +134,7 @@ class DashboardLib $emptyoverride = new stdClass(); $emptyoverride->dashboard_id = $dashboard->dashboard_id; $emptyoverride->uid = $uid; - $emptyoverride->override = '{"' . self::USEROVERRIDE_SECTION . '": {"widgets":{}}, "custom": { "widgets" : {}}}'; + $emptyoverride->override = '[]'; return $emptyoverride; } @@ -143,8 +153,7 @@ class DashboardLib $emptypreset = new stdClass(); $emptypreset->dashboard_id = $dashboard->dashboard_id; $emptypreset->funktion_kurzbz = $funktion_kurzbz; - $section = ($funktion_kurzbz !== null) ? $funktion_kurzbz : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL; - $emptypreset->preset = '{"' . $section . '": { "widgets" : {}},"custom": { "widgets" : {}}}'; + $emptypreset->preset = '[]'; return $emptypreset; } @@ -209,44 +218,4 @@ class DashboardLib return $result; } - - public function addWidgetsToWidgets(&$widgets, $dashboard_kurzbz, $section, $addwigets) - { - foreach ($addwigets as $widget) - { - if(!isset($widget['widgetid'])) - { - $widget['widgetid'] = $this->generateWidgetId($dashboard_kurzbz); - } - $this->addWidgetToWidgets($widgets, $section, $widget, $widget['widgetid']); - } - } - - public function addWidgetToWidgets(&$widgets, $section, $widget, $widgetid) - { - $section = ($section !== null) ? $section : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL; - if (!isset($widgets[$section]) || !isset($widgets[$section]["widgets"]) || !is_array($widgets[$section])) - { - $widgets[$section] = array(); - $widgets[$section]["widgets"] = array(); - } - - $widgets[$section]["widgets"][$widgetid] = $widget; - } - - public function removeWidgetFromWidgets(&$widgets, $section, $widgetid) - { - $section = ($section !== null) ? $section : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL; - if (isset($widgets[$section]) && isset($widgets[$section]["widgets"][$widgetid])) - { - unset($widgets[$section]["widgets"][$widgetid]); - if(empty($widgets[$section]["widgets"]) && $section !== self::USEROVERRIDE_SECTION) { - unset($widgets[$section]); - } - return true; - } - else { - return false; - } - } } diff --git a/application/libraries/stv/StudentListLib.php b/application/libraries/stv/StudentListLib.php new file mode 100644 index 000000000..9365ddc9a --- /dev/null +++ b/application/libraries/stv/StudentListLib.php @@ -0,0 +1,424 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * This generates a list of students and or prestudents used for Studierendenverwaltung + */ +class StudentListLib +{ + private $_ci; // Code igniter instance + + private $_allowedStgs = []; + private $_selects = []; + private $_joins = []; + private $_wheres = []; + + /** + * Gets the CI instance, loads model and prepares default values + * + * @param array $params + * + * @return void + */ + public function __construct($params = null) + { + $this->_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->config('stv'); + + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + + if (isset($params['allowedStgs'])) + $this->_allowedStgs = $params['allowedStgs']; + + // Add default SELECTs + $this->addSelect("b.uid"); + $this->addSelect('titelpre'); + $this->addSelect('nachname'); + $this->addSelect('vorname'); + $this->addSelect('wahlname'); + $this->addSelect('vornamen'); + $this->addSelect('titelpost'); + $this->addSelect('ersatzkennzeichen'); + $this->addSelect('gebdatum'); + $this->addSelect('geschlecht'); + $this->addSelect('foto'); + $this->addSelect('foto_sperre'); + $this->addSelect('v.semester'); + $this->addSelect('v.verband'); + $this->addSelect('v.gruppe'); + $this->addSelect("statusofsemester"); // Will be replaced later + $this->addSelect('UPPER(stg.typ || stg.kurzbz) AS studiengang'); + $this->addSelect('tbl_prestudent.studiengang_kz'); + $this->addSelect('stg.bezeichnung AS stg_bezeichnung'); + $this->addSelect("s.matrikelnr"); + $this->addSelect('p.person_id'); + $this->addSelect('pls.status_kurzbz AS status'); + $this->addSelect('pls.datum AS status_datum'); + $this->addSelect('pls.bestaetigtam AS status_bestaetigung'); + $this->addSelect(" + CASE + WHEN pls.status_kurzbz IN ('Interessent','Aufgenommener','Bewerber','Wartender') + THEN pls.ausbildungssemester + ELSE v.semester + END AS semester_berechnet + "); + $this->addSelect( + "(SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id=p.person_id AND zustellung LIMIT 1) AS mail_privat", + false + ); + $this->addSelect(" + CASE WHEN b.uid IS NOT NULL AND b.uid<>'' + THEN CONCAT(b.uid, '@', " . $this->_ci->PrestudentModel->escape(DOMAIN) . ") + ELSE '' END AS mail_intern", false); + $this->addSelect('p.anmerkung AS anmerkungen'); + $this->addSelect('tbl_prestudent.anmerkung'); + $this->addSelect('pls.orgform_kurzbz'); + $this->addSelect('aufmerksamdurch_kurzbz'); + $this->addSelect( + "(SELECT rt_gesamtpunkte AS punkte FROM public.tbl_prestudent WHERE prestudent_id=ps.prestudent_id) AS punkte", + false + ); + $this->addSelect('tbl_prestudent.aufnahmegruppe_kurzbz'); + $this->addSelect('tbl_prestudent.dual'); + $this->addSelect('p.matr_nr'); + $this->addSelect('sp.bezeichnung AS studienplan_bezeichnung'); + $this->addSelect('tbl_prestudent.prestudent_id'); + $this->addSelect("( + SELECT count(*) + FROM ( + SELECT *, public.get_rolle_prestudent(pss.prestudent_id, NULL) AS laststatus + FROM public.tbl_prestudent pss + JOIN public.tbl_prestudentstatus USING (prestudent_id) + WHERE person_id = p.person_id + AND studiensemester_kurzbz = ( + SELECT studiensemester_kurzbz + FROM public.tbl_prestudentstatus + WHERE prestudent_id = tbl_prestudent.prestudent_id + AND status_kurzbz = 'Interessent' + LIMIT 1 + ) + AND status_kurzbz = 'Interessent' + ) prest + WHERE laststatus NOT IN ('Abbrecher', 'Abgewiesener', 'Absolvent') + AND priorisierung <= tbl_prestudent.priorisierung + ) || ' (' || COALESCE(tbl_prestudent.priorisierung::text, ' '::text) || ')' AS priorisierung_relativ", false); + $this->addSelect('mentor'); + $this->addSelect('b.aktiv AS bnaktiv'); + $this->addSelect('unruly'); + + // Add default JOINs + $this->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT'); + $this->addJoin('public.tbl_person p', 'person_id'); + $this->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT'); + $this->addJoin('public.tbl_prestudentstatus pls', ' + pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) + AND pls.prestudent_id=tbl_prestudent.prestudent_id + AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL) + AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT'); + $this->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT'); + $this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid', 'LEFT'); + $this->addJoin("v", "", ""); // Will be replaced later + $this->addJoin("ps", "", ""); // Will be replaced later + + // Add SELECTs and JOINs from config + $config = $this->_ci->config->item('list_columns') ?: []; + foreach ($config as $conf) { + $this->addSelect($conf['default']); + if (isset($conf['joins'])) + foreach ($conf['joins'] as $join) + call_user_func_array([$this, 'addJoin'], $join); + } + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * Adds a SELECT statement to the query. + * + * @param string|array $select + * @param boolean $escape (optional) + * + * @return void + */ + public function addSelect($select, $escape = true) + { + if (is_array($select)) { + foreach ($select as $s) + $this->addSelect($s, $escape); + return; + } + $alias = $this->getAliasFromSelect($select); + $this->_selects[$alias] = [$select, $escape]; + } + + /** + * Joins a table to the query. + * + * @param string $table + * @param string $cond + * @param string $type (optional) + * @param string $position (optional) + * + * @return void + */ + public function addJoin($table, $cond, $type = '', $position = 'end') + { + $alias = $this->getAliasFromTable($table); + + if ($position == 'end') { + return $this->_joins[$alias] = [$table, $cond, $type]; + } + + if ($position == 'start') { + return $this->_joins = [$alias => [$table, $cond, $type]] + $this->_joins; + } + + if (substr($position, 0, 7) == 'before_') { + $ref = substr($position, 7); + $index = 0; + } elseif (substr($position, 0, 6) == 'after_') { + $ref = substr($position, 6); + $index = 1; + } else { + return $this->addJoin($table, $cond, $type); + } + if (!isset($this->_joins[$ref])) + return $this->addJoin($table, $cond, $type); + + $key_indeces = array_flip(array_keys($this->_joins)); + $index += $key_indeces[$ref]; + + if (!$index) + return $this->addJoin($table, $cond, $type, 'start'); + + $front_part = array_slice($this->_joins, 0, $index, true); + $back_part = array_slice($this->_joins, $index, null, true); + + if (isset($front_part[$alias])) { + unset($front_part[$alias]); + } + + $this->_joins = $front_part + [$alias => [$table, $cond, $type]] + $back_part; + } + + /** + * Adds a WHERE clause to the query. + * + * @param string|array $key + * @param string|array $value + * @param boolean $escape + * + * @return void + */ + public function addWhere($key, $value = null, $escape = true) + { + $this->_wheres[] = [$key, $value, $escape, false]; + } + + /** + * Adds a OR WHERE clause to the query. + * + * @param string|array $key + * @param string|array $value + * @param boolean $escape + * + * @return void + */ + public function addOrWhere($key, $value = null, $escape = true) + { + $this->_wheres[] = [$key, $value, $escape, true]; + } + + /** + * Generates the query and executes it. + * + * @param string|null $studiensemester_kurzbz + * + * @return stdClass result of the query + */ + public function execute($studiensemester_kurzbz) + { + $this->addSelectAndJoinForTagsIfConfigured($studiensemester_kurzbz); + + $stdsemEsc = $studiensemester_kurzbz ? $this->_ci->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL'; + + $this->addSelect( + "public.get_rolle_prestudent( + public.tbl_prestudent.prestudent_id, + " . $this->_ci->PrestudentModel->escape($studiensemester_kurzbz) . " + ) AS statusofsemester" + ); + $this->addJoin( + 'public.tbl_studentlehrverband v', + 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz' . ($studiensemester_kurzbz ? '=' . $stdsemEsc : ' IS NULL'), + 'LEFT' + ); + $this->addJoin( + 'public.tbl_prestudentstatus ps', + 'ps.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ') + AND ps.prestudent_id=tbl_prestudent.prestudent_id + AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ') + AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ') + ', + 'LEFT' + ); + + $this->addWhere('tbl_prestudent.studiengang_kz', $this->_allowedStgs); + + foreach ($this->_joins as $join) + $this->_ci->PrestudentModel->addJoin($join[0], $join[1], $join[2]); + + foreach ($this->_selects as $select) + $this->_ci->PrestudentModel->addSelect($select[0], $select[1]); + + foreach ($this->_wheres as $where) { + if (!is_array($where[0]) && is_array($where[1])) { + if ($where[3]) + $this->_ci->PrestudentModel->db->or_where_in($where[0], $where[1], $where[2]); + else + $this->_ci->PrestudentModel->db->where_in($where[0], $where[1], $where[2]); + } else { + if ($where[3]) + $this->_ci->PrestudentModel->db->or_where($where[0], $where[1], $where[2]); + else + $this->_ci->PrestudentModel->db->where($where[0], $where[1], $where[2]); + } + } + + $this->_ci->PrestudentModel->addOrder('nachname'); + $this->_ci->PrestudentModel->addOrder('vorname'); + + return $this->_ci->PrestudentModel->load(); + } + + + //------------------------------------------------------------------------------------------------------------------ + // Protected methods + + /** + * Add Select and Join for Tags if configured + * + * @param string studiensemester_kurzbz + * + */ + protected function addSelectAndJoinForTagsIfConfigured($studiensemester_kurzbz) + { + if (defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) { + $this->_ci->load->config('stv'); + $tags = $this->_ci->config->item('stv_prestudent_tags'); + + $whereTags = ''; + if (is_array($tags) && !isEmptyArray($tags)) { + $tags = array_keys($tags); + + foreach ($tags as $key => $tag) { + $tags[$key] = $this->_ci->PrestudentModel->escape($tag); + } + $whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")"; + } + $studiensemester_kurzbz_escaped = $this->_ci->PrestudentModel->escape($studiensemester_kurzbz); + $subQueryTag = "( + SELECT + tag.prestudent_id, + COALESCE(json_agg(tag ORDER BY tag.done, tag.prioritaet), '[]'::json) AS tags + FROM ( + SELECT DISTINCT ON (n.notiz_id) + n.notiz_id AS id, + nt.typ_kurzbz, + nt.bezeichnung_mehrsprachig[( + SELECT index + FROM tbl_sprache + WHERE sprache=" . $this->_ci->PrestudentModel->escape(getUserLanguage()) . " + )] AS beschreibung, + n.text AS notiz, + nt.style, + n.erledigt AS done, + nt.prioritaet AS prioritaet, + nt.automatisiert AS automatisiert, + nz.prestudent_id, + n.start, + n.ende + FROM public.tbl_notizzuordnung AS nz + JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id AND nz.prestudent_id IS NOT NULL + JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz " . $whereTags . " + WHERE + COALESCE(n.start, '1970-01-01') <= ( + SELECT + ende + FROM + public.tbl_studiensemester + WHERE + studiensemester_kurzbz = " . $studiensemester_kurzbz_escaped . " + ) + AND COALESCE(n.ende, '2170-12-31') >= ( + SELECT + start + FROM + public.tbl_studiensemester + WHERE + studiensemester_kurzbz = " . $studiensemester_kurzbz_escaped . " + ) + ) AS tag + GROUP BY tag.prestudent_id + ) AS tag_data_agg"; + + $this->addSelect('tag_data_agg.tags'); + $this->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT'); + } + } + + /** + * Get alias of a table or select statement + * + * @param string $select + * + * @return string + */ + final protected function getAliasFromSelect($select) + { + if (strpos($select, ' ') !== false) { + return trim(strrchr($select, ' ')); + } + + if (strpos($select, '.') !== false) { + return substr(strrchr($select, '.'), 1); + } + + return $select; + } + + /** + * Get alias of a table or select statement + * + * @param string|array $table + * + * @return string|array + */ + final protected function getAliasFromTable($table) + { + if (strpos($table, ' ') !== false) { + return trim(strrchr($table, ' ')); + } + + return $table; + } +} diff --git a/application/libraries/tags/CoreDoubleDegreeTagLib.php b/application/libraries/tags/CoreDoubleDegreeTagLib.php new file mode 100644 index 000000000..13b113a21 --- /dev/null +++ b/application/libraries/tags/CoreDoubleDegreeTagLib.php @@ -0,0 +1,81 @@ +ci = get_instance(); + $this->ci->load->model('codex/Mobilitaet_model', 'MobilitaetModel'); + } + + public function getZuordnungIds(array $params) + { + if(!isset($params['studiensemester_kurzbz'])) + { + return (object) array( + 'idArray' => [] + ); + } + + $semester = $params['studiensemester_kurzbz']; + + $this->ci->MobilitaetModel->addJoin('bis.tbl_gsprogramm', 'gsprogramm_id'); + $this->ci->MobilitaetModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + + $result = $this->ci->MobilitaetModel-> loadWhere(array( + 'gsprogrammtyp_kurzbz' => 'Double', + 'studiensemester_kurzbz' => $semester + )); + $data = $result->retval; + + $doubledegree_data = array_map(function($item) { + return [ + 'id' => $item->prestudent_id, + 'von' => $item->start, + 'bis' => $item->ende + ]; + }, $data); + + return (object) array( + 'data' => $doubledegree_data, + 'typeId' => 'prestudent_id' + ); + } + + public function isCriteriaSetFor(array $params) + { + if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id') + return false; + + $semester = $params['studiensemester_kurzbz']; + $prestudent_id = $params['id']; + + $this->ci->MobilitaetModel->addSelect('prestudent_id'); + $this->ci->MobilitaetModel->addSelect('start as von'); + $this->ci->MobilitaetModel->addSelect('ende as bis'); + + $this->ci->MobilitaetModel->addJoin('bis.tbl_gsprogramm', 'gsprogramm_id'); + $this->ci->MobilitaetModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + + $result = $this->ci->MobilitaetModel->loadWhere(array( + 'gsprogrammtyp_kurzbz' => 'Double', + 'studiensemester_kurzbz' => $semester, + 'prestudent_id' => $prestudent_id + )); + + if(hasData($result)) + { + //array mit prestudent_id, von und bis + return $result; + } + else + return null; + } + +} diff --git a/application/libraries/tags/CoreFiftyFiveTagLib.php b/application/libraries/tags/CoreFiftyFiveTagLib.php new file mode 100644 index 000000000..4e2738e8b --- /dev/null +++ b/application/libraries/tags/CoreFiftyFiveTagLib.php @@ -0,0 +1,81 @@ +ci = get_instance(); + $this->ci->load->model('person/Person_model', 'PersonModel'); + $this->ci-> load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + } + + public function getZuordnungIds(array $params) + { + if(!isset($params['studiensemester_kurzbz'])) + { + return (object) array( + 'person_id' => [] + ); + } + + $semester = $params['studiensemester_kurzbz']; + + $result = $this->ci->StudiensemesterModel->loadWhere(array( + 'studiensemester_kurzbz' => $semester + )); + $data = $result->retval[0]; + + $semVon = $data->start; + $semBis = $data->ende; + $result = $this->ci->PersonModel->getFiftyFivers($semVon, $semBis); + + $data = $result->retval; + $fiftyFiveData = array_map(function($item) { + return [ + 'id' => $item->person_id + ]; + }, $data); + + return (object) array( + 'data' => $fiftyFiveData, + 'typeId' => 'person_id' + ); + } + + public function isCriteriaSetFor(array $params) + { + if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'person_id') + return false; + + $semester = $params['studiensemester_kurzbz']; + $person_id = $params['id']; + $typeId = $params['typeId']; + + + $result = $this->ci->StudiensemesterModel->loadWhere(array( + 'studiensemester_kurzbz' => $semester + )); + $data = $result->retval[0]; + + $semVon = $data->start; + $semBis = $data->ende; + $result = $this->ci->PersonModel->isFiftyFive($semVon, $semBis, $person_id); + + + if(hasData($result)) + { + return $result; + } + else + return null; + } + +} + diff --git a/application/libraries/tags/CoreIncomingTagLib.php b/application/libraries/tags/CoreIncomingTagLib.php new file mode 100644 index 000000000..26d7dad0b --- /dev/null +++ b/application/libraries/tags/CoreIncomingTagLib.php @@ -0,0 +1,63 @@ +ci = get_instance(); + $this->ci->load->model('codex/Bisio_model', 'BisioModel'); + } + + public function getZuordnungIds(array $params) + { + if(!isset($params['studiensemester_kurzbz'])) + { + return (object) array( + 'idArray' => [] + ); + } + + $semester = $params['studiensemester_kurzbz']; + + $result = $this->ci->BisioModel->getIncomingsOfSemester($semester); + + $data = $result->retval; + + $outgoing_data = array_map(function($item) { + return [ + 'id' => $item->prestudent_id, + 'von' => $item->von, + 'bis' => $item->bis + ]; + }, $data); + + return (object) array( + 'data' => $outgoing_data, + 'typeId' => 'prestudent_id', + ); + } + + public function isCriteriaSetFor(array $params) + { + if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id') + return false; + + $semester = $params['studiensemester_kurzbz']; + $prestudent_id = $params['id']; + + $result = $this->ci->BisioModel->isPrestudentIncoming($semester, $prestudent_id); + + if (hasData($result)) { + return $result; + } + else + return null; + } + +} diff --git a/application/libraries/tags/CoreJgvTagLib.php b/application/libraries/tags/CoreJgvTagLib.php new file mode 100644 index 000000000..15e77dc98 --- /dev/null +++ b/application/libraries/tags/CoreJgvTagLib.php @@ -0,0 +1,64 @@ +ci = get_instance(); + $this->ci->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + } + + public function getZuordnungIds(array $params) + { + if(!isset($params['studiensemester_kurzbz'])) + { + return (object) array( + 'idArray' => [] + ); + } + + $semester = $params['studiensemester_kurzbz']; + + $result = $this->ci->BenutzerfunktionModel->getPrestudentsOfJgv($semester); + + $data = $result->retval; + + $jgv_data = array_map(function($item) { + return [ + 'id' => $item->prestudent_id, + 'von' => $item->datum_von, + 'bis' => $item->datum_bis + ]; + }, $data); + + return (object) array( + 'data' => $jgv_data, + 'typeId' => 'prestudent_id' + ); + } + + public function isCriteriaSetFor(array $params) + { + if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id') + return false; + + $semester = $params['studiensemester_kurzbz']; + $prestudent_id = $params['id']; + + $result = $this->ci->BenutzerfunktionModel->isJgv($semester, $prestudent_id); + + if(hasData($result)) + { + return $result; + } + else + return null; + } + +} diff --git a/application/libraries/tags/CoreMissingZgvTagLib.php b/application/libraries/tags/CoreMissingZgvTagLib.php new file mode 100644 index 000000000..2d5df0ffc --- /dev/null +++ b/application/libraries/tags/CoreMissingZgvTagLib.php @@ -0,0 +1,112 @@ +ci = get_instance(); + $this->ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + } + + public function getZuordnungIds(array $params) + { + if(!isset($params['studiensemester_kurzbz'])) + { + return (object) array( + 'idArray' => [] + ); + } + + $semester = $params['studiensemester_kurzbz']; + + $this->ci->PrestudentModel->addJoin('public.tbl_prestudentstatus', 'prestudent_id'); + $this->ci->PrestudentModel->addJoin('public.tbl_benutzer bn', 'person_id'); + $this->ci->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz'); + + $this->ci->PrestudentModel->db->group_start(); + + $this->ci->PrestudentModel->db->where('zgvdatum', null); + $this->ci->PrestudentModel->db->where('typ', 'b'); + + $this->ci->PrestudentModel->db->or_group_start(); + $this->ci->PrestudentModel->db->where('zgvmadatum', null); + $this->ci->PrestudentModel->db->where('typ', 'm'); + $this->ci->PrestudentModel->db->group_end(); + + $this->ci->PrestudentModel->db->group_end(); + + $result = $this->ci->PrestudentModel-> loadWhere(array( + 'bn.aktiv' => true, + 'studiensemester_kurzbz' => $semester + )); + + $data = $result->retval; + + $zgvmissing_data = array_map(function($item) { + return [ + 'id' => $item->prestudent_id, + 'von' => null, + 'bis' => null + ]; + }, $data); + + return (object) array( + 'typeId' => 'prestudent_id', + 'data' => $zgvmissing_data + ); + + } + + public function isCriteriaSetFor(array $params) + { + if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id') + return false; + + $semester = $params['studiensemester_kurzbz']; + $prestudent_id = $params['id']; + + $this->ci->PrestudentModel->addSelect('prestudent_id'); + $this->ci->PrestudentModel->addSelect('start as von'); + $this->ci->PrestudentModel->addSelect('ende as bis'); + $this->ci->PrestudentModel->addJoin('public.tbl_prestudentstatus', 'prestudent_id'); + + //add studiensemester also here for manual rebuild + $this->ci->PrestudentModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + + $this->ci->PrestudentModel->addJoin('public.tbl_benutzer bn', 'person_id'); + $this->ci->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz'); + + $this->ci->PrestudentModel->db->group_start(); + + $this->ci->PrestudentModel->db->where('zgvdatum', null); + $this->ci->PrestudentModel->db->where('typ', 'b'); + + $this->ci->PrestudentModel->db->or_group_start(); + $this->ci->PrestudentModel->db->where('zgvmadatum', null); + $this->ci->PrestudentModel->db->where('typ', 'm'); + $this->ci->PrestudentModel->db->group_end(); + + $this->ci->PrestudentModel->db->group_end(); + $this->ci->PrestudentModel->db->limit(1); + + $result = $this->ci->PrestudentModel-> loadWhere(array( + 'bn.aktiv' => true, + 'studiensemester_kurzbz' => $semester, + 'prestudent_id' => $prestudent_id + )); + + if(hasData($result)) + { + return $result; + } + else + return null; + } + +} diff --git a/application/libraries/tags/CoreOutgoingTagLib.php b/application/libraries/tags/CoreOutgoingTagLib.php new file mode 100644 index 000000000..904839dee --- /dev/null +++ b/application/libraries/tags/CoreOutgoingTagLib.php @@ -0,0 +1,63 @@ +ci = get_instance(); + $this->ci->load->model('codex/Bisio_model', 'BisioModel'); + } + + public function getZuordnungIds(array $params) + { + if(!isset($params['studiensemester_kurzbz'])) + { + return (object) array( + 'idArray' => [] + ); + } + + $semester = $params['studiensemester_kurzbz']; + + $result = $this->ci->BisioModel->getOutgoingsOfSemester($semester); + + $data = $result->retval; + + $outgoing_data = array_map(function($item) { + return [ + 'id' => $item->prestudent_id, + 'von' => $item->von, + 'bis' => $item->bis + ]; + }, $data); + + return (object) array( + 'data' => $outgoing_data, + 'typeId' => 'prestudent_id', + ); + } + + public function isCriteriaSetFor(array $params) + { + if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id') + return false; + + $semester = $params['studiensemester_kurzbz']; + $prestudent_id = $params['id']; + + $result = $this->ci->BisioModel->isPrestudentOutgoing($semester, $prestudent_id); + + if (hasData($result)) { + return $result; + } + else + return null; + } + +} diff --git a/application/libraries/tags/CorePreabbrecherTagLib.php b/application/libraries/tags/CorePreabbrecherTagLib.php new file mode 100644 index 000000000..41712ac3b --- /dev/null +++ b/application/libraries/tags/CorePreabbrecherTagLib.php @@ -0,0 +1,80 @@ +ci = get_instance(); + $this->ci->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + } + + public function getZuordnungIds(array $params) + { + if(!isset($params['studiensemester_kurzbz'])) + { + return (object) array( + 'idArray' => [] + ); + } + + $semester = $params['studiensemester_kurzbz']; + + $this->ci->StudierendenantragModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + $this->ci->StudierendenantragModel->db->where_in('typ', self::TYP_ABMELDUNG); + $this->ci->StudierendenantragModel->db->where('studiensemester_kurzbz', $semester); + $result = $this->ci->StudierendenantragModel->getWithLastStatusWhere([ + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED + ]); + + $data = $result->retval; + + $prewiederholer_data = array_map(function($item) { + return [ + 'id' => $item->prestudent_id, + 'von' => $item->start, + 'bis' => $item->ende + ]; + }, $data); + + return (object) array( + 'data' => $prewiederholer_data, + 'typeId' => 'prestudent_id', + ); + } + + public function isCriteriaSetFor(array $params) + { + if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id') + return false; + + $semester = $params['studiensemester_kurzbz']; + $prestudent_id = $params['id']; + + $this->ci->StudierendenantragModel->addSelect('prestudent_id'); + $this->ci->StudierendenantragModel->addSelect('start as von'); + $this->ci->StudierendenantragModel->addSelect('ende as bis'); + + $this->ci->StudierendenantragModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + $this->ci->StudierendenantragModel->db->where_in('typ', self::TYP_ABMELDUNG); + $this->ci->StudierendenantragModel->db->where('studiensemester_kurzbz', $semester); + $this->ci->StudierendenantragModel->db->where('prestudent_id', $prestudent_id); + $result = $this->ci->StudierendenantragModel->getWithLastStatusWhere([ + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED + ]); + + if(hasData($result)) + { + return $result; + } + else + return null; + } + +} diff --git a/application/libraries/tags/CorePrewiederholerTagLib.php b/application/libraries/tags/CorePrewiederholerTagLib.php new file mode 100644 index 000000000..8b7037b07 --- /dev/null +++ b/application/libraries/tags/CorePrewiederholerTagLib.php @@ -0,0 +1,76 @@ +ci = get_instance(); + $this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + } + + public function getZuordnungIds(array $params) + { + if(!isset($params['studiensemester_kurzbz'])) + { + return (object) array( + 'idArray' => [] + ); + } + + $semester = $params['studiensemester_kurzbz']; + + $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + $result = $this->ci->PrestudentstatusModel-> loadWhere(array( + 'statusgrund_id' => 15, + 'studiensemester_kurzbz' => $semester + )); + $data = $result->retval; + + $prewiederholer_data = array_map(function($item) { + return [ + 'id' => $item->prestudent_id, + 'von' => $item->start, + 'bis' => $item->ende + ]; + }, $data); + + return (object) array( + 'data' => $prewiederholer_data, + 'typeId' => 'prestudent_id', + ); + } + + public function isCriteriaSetFor(array $params) + { + if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id') + return false; + + $semester = $params['studiensemester_kurzbz']; + $prestudent_id = $params['id']; + + $this->ci->PrestudentstatusModel->addSelect('prestudent_id'); + $this->ci->PrestudentstatusModel->addSelect('start as von'); + $this->ci->PrestudentstatusModel->addSelect('ende as bis'); + + $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + + $result = $this->ci->PrestudentstatusModel->loadWhere(array( + 'statusgrund_id' => 15, + 'studiensemester_kurzbz' => $semester, + 'prestudent_id' => $prestudent_id + )); + if(hasData($result)) + { + return $result; + } + else + return null; + } + +} diff --git a/application/libraries/tags/CoreStbErhoehtTagLib.php b/application/libraries/tags/CoreStbErhoehtTagLib.php new file mode 100644 index 000000000..886aff468 --- /dev/null +++ b/application/libraries/tags/CoreStbErhoehtTagLib.php @@ -0,0 +1,79 @@ +ci = get_instance(); + $this->ci->load->model('crm/Konto_model', 'KontoModel'); + } + + public function getZuordnungIds(array $params) + { + if(!isset($params['studiensemester_kurzbz'])) + { + return (object) array( + 'idArray' => [] + ); + } + + $semester = $params['studiensemester_kurzbz']; + + $this->ci->KontoModel->addJoin('public.tbl_prestudent', 'person_id'); + $this->ci->KontoModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + + $result = $this->ci->KontoModel-> loadWhere(array( + 'buchungstyp_kurzbz' => 'StudiengebuehrErhoeht', + 'studiensemester_kurzbz' => $semester + )); + $data = $result->retval; + + $konto_data = array_map(function($item) { + return [ + 'id' => $item->prestudent_id, + 'von' => $item->start, + 'bis' => $item->ende + ]; + }, $data); + + return (object) array( + 'data' => $konto_data, + 'typeId' => 'prestudent_id' + ); + } + + public function isCriteriaSetFor(array $params) + { + if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id') + return false; + + $semester = $params['studiensemester_kurzbz']; + $prestudent_id = $params['id']; + + $this->ci->KontoModel->addSelect('prestudent_id'); + $this->ci->KontoModel->addSelect('start as von'); + $this->ci->KontoModel->addSelect('ende as bis'); + $this->ci->KontoModel->addJoin('public.tbl_prestudent', 'person_id'); + $this->ci->KontoModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + + $result = $this->ci->KontoModel-> loadWhere(array( + 'buchungstyp_kurzbz' => 'StudiengebuehrErhoeht', + 'studiensemester_kurzbz' => $semester, + 'prestudent_id' => $prestudent_id + )); + + if(hasData($result)) + { + return $result; + } + else + return null; + } + +} diff --git a/application/libraries/tags/CoreUnterbrecherTagLib.php b/application/libraries/tags/CoreUnterbrecherTagLib.php new file mode 100644 index 000000000..ddf8f33cd --- /dev/null +++ b/application/libraries/tags/CoreUnterbrecherTagLib.php @@ -0,0 +1,76 @@ +ci = get_instance(); + $this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + } + + public function getZuordnungIds(array $params) + { + if(!isset($params['studiensemester_kurzbz'])) + { + return (object) array( + 'idArray' => [] + ); + } + + $semester = $params['studiensemester_kurzbz']; + $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + + $result = $this->ci->PrestudentstatusModel-> loadWhere(array( + 'status_kurzbz' => 'Unterbrecher', + 'studiensemester_kurzbz' => $semester + )); + $data = $result->retval; + + $unterbrecher_data = array_map(function($item) { + return [ + 'id' => $item->prestudent_id, + 'von' => $item->start, + 'bis' => $item->ende + ]; + }, $data); + + return (object) array( + 'data' => $unterbrecher_data, + 'typeId' => 'prestudent_id' + ); + } + + public function isCriteriaSetFor(array $params) + { + if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id') + return false; + + $semester = $params['studiensemester_kurzbz']; + $prestudent_id = $params['id']; + + $this->ci->PrestudentstatusModel->addSelect('prestudent_id'); + $this->ci->PrestudentstatusModel->addSelect('start as von'); + $this->ci->PrestudentstatusModel->addSelect('ende as bis'); + + $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + $result = $this->ci->PrestudentstatusModel-> loadWhere(array( + 'status_kurzbz' => 'Unterbrecher', + 'studiensemester_kurzbz' => $semester, + 'prestudent_id' => $prestudent_id + )); + + if(hasData($result)) + { + return $result; + } + else + return null; + } + +} diff --git a/application/libraries/tags/CoreWiederholerTagLib.php b/application/libraries/tags/CoreWiederholerTagLib.php new file mode 100644 index 000000000..8f4eb1dd7 --- /dev/null +++ b/application/libraries/tags/CoreWiederholerTagLib.php @@ -0,0 +1,76 @@ +ci = get_instance(); + $this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + } + + public function getZuordnungIds(array $params) + { + if(!isset($params['studiensemester_kurzbz'])) + { + return (object) array( + 'idArray' => [] + ); + } + + $semester = $params['studiensemester_kurzbz']; + + $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + $result = $this->ci->PrestudentstatusModel-> loadWhere(array( + 'statusgrund_id' => 16, + 'studiensemester_kurzbz' => $semester + )); + $data = $result->retval; + + $wiederholer_data = array_map(function($item) { + return [ + 'id' => $item->prestudent_id, + 'von' => $item->start, + 'bis' => $item->ende + ]; + }, $data); + + return (object) array( + 'typeId' => 'prestudent_id', + 'data' => $wiederholer_data + ); + } + + public function isCriteriaSetFor(array $params) + { + if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id') + return false; + + $semester = $params['studiensemester_kurzbz']; + $prestudent_id = $params['id']; + + $this->ci->PrestudentstatusModel->addSelect('prestudent_id'); + $this->ci->PrestudentstatusModel->addSelect('start as von'); + $this->ci->PrestudentstatusModel->addSelect('ende as bis'); + + $this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + + $result = $this->ci->PrestudentstatusModel->loadWhere(array( + 'statusgrund_id' => 16, + 'studiensemester_kurzbz' => $semester, + 'prestudent_id' => $prestudent_id, + )); + + if(hasData($result)) + { + return $result; + } + else + return null; + } +} diff --git a/application/libraries/treemenu/LvVwLib.php b/application/libraries/treemenu/LvVwLib.php new file mode 100644 index 000000000..d3c91a196 --- /dev/null +++ b/application/libraries/treemenu/LvVwLib.php @@ -0,0 +1,192 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * LvVw Menu library + */ +class LvVwLib +{ + protected $_ci = null; + + public $config = []; + + public function __construct() + { + // Get code igniter instance + $this->_ci =& get_instance(); + + // Load Tree-config + $this->_ci->load->config('treemenu/custom/lvvw'); + $this->config = $this->_ci->config->item('root'); + + // Load Libraries + $this->_ci->load->library('treemenu/base/StgLib'); + + // Load Model + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + } + + public function stg($path_template) + { + $permittedStgs = $this->getPermittedStudiengangKzs(); + + if (!$permittedStgs) + return []; + + $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" . + '"type": "verband",' . + '"id": "lv/%1$s",' . + '"gruppe_kurzbz": null,' . + '"semester": null,' . + '"verband": null,' . + '"gruppe": null,' . + '"lehrverband": true,' . + '"stg_kz": "%1$s"' . + "}', studiengang_kz)] AS draggable", false); + + return $this->_ci->stglib->studiengang($path_template, $permittedStgs); + } + + public function semester($path_template, $has_children, $stg) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + if (!$has_children) + $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false); + $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" . + '"type": "verband",' . + '"id": "lv/%1$s/%2$s",' . + '"gruppe_kurzbz": null,' . + '"semester": "%2$s",' . + '"verband": null,' . + '"gruppe": null,' . + '"lehrverband": true,' . + '"stg_kz": "%1$s"' . + "}', v.studiengang_kz, v.semester)] AS draggable", false); + + return $this->_ci->stglib->semester($path_template, $stg->studiengang_kz); + } + + public function verband($path_template, $stg, $semester) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + $this->_ci->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf"); + $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" . + '"type": "verband",' . + '"id": "lv/%1$s/%2$s/%3$s",' . + '"gruppe_kurzbz": null,' . + '"semester": "%2$s",' . + '"verband": "%3$s",' . + '"gruppe": null,' . + '"lehrverband": true,' . + '"stg_kz": "%1$s"' . + "}', v.studiengang_kz, v.semester, v.verband)] AS draggable", false); + $this->_ci->StudiengangModel->addGroupBy('v.studiengang_kz, v.semester'); + + return $this->_ci->stglib->verband($path_template, $stg->studiengang_kz, $semester); + } + + public function group($path_template, $stg, $semester, $verband) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false); + + if ($verband === null) { + $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" . + '"type": "verband",' . + '"id": "grp/%1$s/%2$s/%3$s",' . + '"gruppe_kurzbz": "%3$s",' . + '"semester": "%2$s",' . + '"verband": null,' . + '"gruppe": null,' . + '"lehrverband": false,' . + '"stg_kz": "%1$s"' . + "}', studiengang_kz, semester, gruppe_kurzbz)] AS draggable", false); + + return $this->_ci->stglib->group($path_template, $stg->studiengang_kz, $semester); + } + + $this->_ci->StudiengangModel->addSelect("ARRAY['link', FORMAT('{" . + '"type": "verband",' . + '"id": "lv/%1$s/%2$s/%3$s/%4$s",' . + '"gruppe_kurzbz": null,' . + '"semester": "%2$s",' . + '"verband": "%3$s",' . + '"gruppe": "%4$s",' . + '"lehrverband": true,' . + '"stg_kz": "%1$s"' . + "}', v.studiengang_kz, v.semester, v.verband, v.gruppe)] AS draggable", false); + + return $this->_ci->stglib->verbandsgroup($path_template, $stg->studiengang_kz, $semester, $verband); + } + + public function orgform($path_template, $stg) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + if (!$stg->mischform) + return []; + + $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false); + + return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz); + } + + protected function getPermittedStudiengangKzs() + { + $permittedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('admin') ?: []; + $permittedStgs = array_merge($permittedStgs, $this->_ci->permissionlib->getSTG_isEntitledFor('assistenz') ?: []); + + return $permittedStgs; + } + + protected function getStgFromUrl($stg) + { + $permittedStgs = $this->getPermittedStudiengangKzs(); + + if (!$permittedStgs) + return null; + + $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $permittedStgs); + $stg = $this->_ci->StudiengangModel->loadWhere([ + 'LOWER(CONCAT(typ, kurzbz)) =' => $stg + ]); + + if (!hasData($stg)) + return null; + + return current(getData($stg)); + } +} diff --git a/application/libraries/treemenu/StudVwLib.php b/application/libraries/treemenu/StudVwLib.php new file mode 100644 index 000000000..ee3e2cbdc --- /dev/null +++ b/application/libraries/treemenu/StudVwLib.php @@ -0,0 +1,257 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * StudVw Menu library + */ +class StudVwLib +{ + protected $_ci = null; + + public $config = []; + + public $redirect_method = [ + 'interessenten' => 'filter', + 'bewerbungnichtabgeschickt' => 'filter', + 'bewerbungabgeschickt' => 'filter', + 'zgv' => 'filter', + 'statusbestaetigt' => 'filter', + 'statusbestaetigtrtnichtangemeldet' => 'filter', + 'statusbestaetigtrtangemeldet' => 'filter', + 'reihungstestnichtangemeldet' => 'filter', + 'reihungstestangemeldet' => 'filter', + 'bewerber' => 'filter', + 'bewerberrtnichtangemeldet' => 'filter', + 'bewerberrtangemeldet' => 'filter', + 'bewerberrtangemeldetteilgenommen' => 'filter', + 'bewerberrtangemeldetnichtteilgenommen' => 'filter', + 'aufgenommen' => 'filter', + 'warteliste' => 'filter', + 'absage' => 'filter', + 'outgoing' => 'inout', + 'shared_studies' => 'inout' + ]; + + public function __construct() + { + // Get code igniter instance + $this->_ci =& get_instance(); + + // Load Tree-config + $this->_ci->load->config('treemenu/stg_base'); + $this->config = $this->_ci->config->item('root'); + + // Load Libraries + $this->_ci->load->library('treemenu/base/StgLib'); + + // Load Model + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + } + + public function stg($path_template) + { + $permittedStgs = $this->getPermittedStudiengangKzs(); + + if (!$permittedStgs) + return []; + + return $this->_ci->stglib->studiengang($path_template, $permittedStgs); + } + + public function prestudent($path_template, $stg) + { + // Check permission + if ($this->getStgFromUrl($stg) === null) + return []; + + return [ + [ + 'path' => sprintf($path_template, '1'), + 'name' => ['lehre', 'prestudent'], + 'no_sem_reload' => true + ] + ]; + } + + public function stdsem($path_template, $stg) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + return $this->_ci->stglib->studiensemester($path_template, $stg->studiengang_kz); + } + + public function semester($path_template, $stg, $orgform) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + if ($orgform !== null) { + $orgform = $this->getOrgform($orgform); + if ($orgform === null) + return []; + $orgform = $orgform->orgform_kurzbz; + } + + return $this->_ci->stglib->semester($path_template, $stg->studiengang_kz, $orgform); + } + + public function verband($path_template, $stg, $semester, $orgform) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + if ($orgform !== null) { + $orgform = $this->getOrgform($orgform); + if ($orgform === null) + return []; + $orgform = $orgform->orgform_kurzbz; + } + + $this->_ci->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf"); + + return $this->_ci->stglib->verband($path_template, $stg->studiengang_kz, $semester, $orgform); + } + + public function group($path_template, $stg, $semester, $verband, $orgform) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + if ($orgform !== null) { + $orgform = $this->getOrgform($orgform); + if ($orgform === null) + return []; + $orgform = $orgform->orgform_kurzbz; + } + + $this->_ci->StudiengangModel->db->select('TRUE AS leaf', false); + + if ($verband === null) + return $this->_ci->stglib->group($path_template, $stg->studiengang_kz, $semester, $orgform); + + return $this->_ci->stglib->verbandsgroup($path_template, $stg->studiengang_kz, $semester, $verband, $orgform); + } + + public function orgform($path_template, $stg) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + if (!$stg->mischform) + return []; + + return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz); + } + + public function incoming($has_children, $path_template, $stg) + { + if ($stg === null) + return $this->inout('incoming', $has_children, $path_template); + + return $this->filter('incoming', $has_children, $path_template, $stg); + } + + public function filter($original_method, $has_children, $path_template, $stg) + { + $stg = $this->getStgFromUrl($stg); + + if ($stg === null) + return []; + + // TODO(chris): phrasen + $item = [ + 'path' => sprintf($path_template, '1'), + 'name' => ['treemenu', 'filter_' . $original_method] + ]; + + if (!$has_children) + $item['leaf'] = true; + + return [ $item ]; + } + + public function inout($original_method, $has_children, $path_template) + { + if (!$this->_ci->permissionlib->isBerechtigt('inout/uebersicht')) + return []; + + // TODO(chris): phrasen + $item = [ + 'path' => sprintf($path_template, '1'), + 'name' => ['treemenu', 'inout_' . $original_method] + ]; + + if (!$has_children) + $item['leaf'] = true; + + return [ $item ]; + } + + protected function getOrgform($orgform) + { + $this->_ci->load->model('codex/Orgform_model', 'OrgformModel'); + $orgform = $this->_ci->OrgformModel->loadWhere([ + 'LOWER(orgform_kurzbz) =' => $orgform + ]); + + if (!hasData($orgform)) + return null; + + return current(getData($orgform)); + } + + protected function getPermittedStudiengangKzs() + { + $permittedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('admin') ?: []; + $permittedStgs = array_merge($permittedStgs, $this->_ci->permissionlib->getSTG_isEntitledFor('assistenz') ?: []); + + return $permittedStgs; + } + + protected function getStgFromUrl($stg) + { + $permittedStgs = $this->getPermittedStudiengangKzs(); + + if (!$permittedStgs) + return null; + + $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $permittedStgs); + $stg = $this->_ci->StudiengangModel->loadWhere([ + 'LOWER(CONCAT(typ, kurzbz)) =' => $stg + ]); + + if (!hasData($stg)) + return null; + + return current(getData($stg)); + } +} diff --git a/application/libraries/treemenu/base/StgLib.php b/application/libraries/treemenu/base/StgLib.php new file mode 100644 index 000000000..84665639d --- /dev/null +++ b/application/libraries/treemenu/base/StgLib.php @@ -0,0 +1,313 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * Stg Base library + */ +class StgLib +{ + protected $_ci = null; + + public function __construct() + { + // Get code igniter instance + $this->_ci =& get_instance(); + } + + public function studiengang($path_template, $permittedStgs = []) + { + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); + + $this->_ci->StudiengangModel->addDistinct(); + $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($path_template) . ", LOWER(CONCAT(typ, kurzbz))) AS path"); + $this->_ci->StudiengangModel->addSelect( + "CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name", + false + ); + $this->_ci->StudiengangModel->addSelect("studiengang_kz AS title"); + $this->_ci->StudiengangModel->addSelect("studiengang_kz AS search"); + $this->_ci->StudiengangModel->addSelect('erhalter_kz'); + $this->_ci->StudiengangModel->addSelect('typ'); + $this->_ci->StudiengangModel->addSelect('kurzbz'); + $this->_ci->StudiengangModel->addSelect('studiengang_kz'); + $this->_ci->StudiengangModel->addSelect('studiengang_kz AS stg_kz'); + + $this->_ci->StudiengangModel->addOrder('erhalter_kz'); + $this->_ci->StudiengangModel->addOrder('typ'); + $this->_ci->StudiengangModel->addOrder('kurzbz'); + + if ($permittedStgs) + $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $permittedStgs); + + $result = $this->_ci->StudiengangModel->loadWhere(['v.aktiv' => true]); + + return getData($result) ?: []; + } + + public function semester($path_template, $studiengang_kz, $orgform_kurzbz = null) + { + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); + + $this->_ci->StudiengangModel->addDistinct(); + $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($path_template) . ", semester) AS path", false); + $this->_ci->StudiengangModel->addSelect("CONCAT( + UPPER(CONCAT(typ, kurzbz)), + '-', + semester, + ( + SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END + FROM public.tbl_lehrverband + WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester + ORDER BY verband, gruppe LIMIT 1 + ) + ) AS name", false); + + $this->_ci->StudiengangModel->addSelect('semester'); + $this->_ci->StudiengangModel->addSelect('v.studiengang_kz AS stg_kz'); + $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink"); + + $this->_ci->StudiengangModel->addOrder('semester'); + + if ($orgform_kurzbz !== null) { + $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($orgform_kurzbz) . " AS orgform_kurzbz", false); + $this->_ci->StudiengangModel->addDistinct(); + $this->_ci->StudiengangModel->db->group_start(); + $this->_ci->StudiengangModel->db->where('v.semester', 0); + $this->_ci->StudiengangModel->db->or_where('v.orgform_kurzbz', $orgform_kurzbz); + $this->_ci->StudiengangModel->db->group_end(); + } + + $result = $this->_ci->StudiengangModel->loadWhere([ + 'studiengang_kz' => $studiengang_kz, + 'v.aktiv' => true + ]); + + + return getData($result) ?: []; + } + + public function group($path_template, $studiengang_kz, $semester, $orgform_kurzbz = null) + { + $this->_ci->load->model('organisation/Gruppe_model', 'GruppeModel'); + + $this->_ci->GruppeModel->addDistinct(); + $this->_ci->GruppeModel->addSelect("FORMAT(" . $this->_ci->GruppeModel->escape($path_template) . ", gruppe_kurzbz) AS path", false); + $this->_ci->GruppeModel->addSelect("CONCAT(gruppe_kurzbz, ' (', bezeichnung, ')') AS name", false); + + $this->_ci->GruppeModel->addSelect('sort'); + $this->_ci->GruppeModel->addSelect('gruppe_kurzbz'); + $this->_ci->GruppeModel->addSelect($this->_ci->GruppeModel->escape($studiengang_kz) . '::integer AS stg_kz', false); + $this->_ci->GruppeModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink"); + + $this->_ci->GruppeModel->addOrder('sort'); + $this->_ci->GruppeModel->addOrder('gruppe_kurzbz'); + + $where = [ + 'studiengang_kz' => $studiengang_kz, + 'semester' => $semester, + 'lehre' => true, + 'sichtbar' => true, + 'aktiv' => true, + 'direktinskription' => false + ]; + + if ($orgform_kurzbz !== null) + $where['orgform_kurzbz'] = $orgform_kurzbz; + + $result = $this->_ci->GruppeModel->loadWhere($where); + + return getData($result) ?: []; + } + + public function verband($path_template, $studiengang_kz, $semester, $orgform_kurzbz = null) + { + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); + + $this->_ci->StudiengangModel->addSelect("FORMAT(" . $this->_ci->StudiengangModel->escape($path_template) . ", verband) AS path", false); + $this->_ci->StudiengangModel->addSelect("CONCAT( + UPPER(CONCAT(typ, kurzbz)), + '-', + semester, + verband, + ( + SELECT + CASE + WHEN bezeichnung IS NULL OR bezeichnung='' + THEN ''::TEXT + ELSE CONCAT(' (', bezeichnung, ')') + END + FROM public.tbl_lehrverband + WHERE studiengang_kz=v.studiengang_kz + AND semester=v.semester + AND verband=v.verband + ORDER BY gruppe + LIMIT 1 + ) + ) AS name", false); + + $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($semester) . ' AS semester'); + $this->_ci->StudiengangModel->addSelect('verband'); + $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false); + $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink"); + + $this->_ci->StudiengangModel->addOrder('verband'); + + $this->_ci->StudiengangModel->addGroupBy('path, name, verband'); + + $where = [ + 'v.studiengang_kz' => $studiengang_kz, + 'v.semester' => $semester, + 'v.verband !=' => '', + 'v.aktiv' => true + ]; + + if ($orgform_kurzbz !== null && $semester) // NOTE(chris): on semester 0 show all? + $where['v.orgform_kurzbz'] = $orgform_kurzbz; + + $result = $this->_ci->StudiengangModel->loadWhere($where); + + return getData($result) ?: []; + } + + public function verbandsgroup($path_template, $studiengang_kz, $semester, $verband, $orgform_kurzbz = null) + { + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $this->_ci->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz'); + + $this->_ci->StudiengangModel->addDistinct(); + $this->_ci->StudiengangModel->addSelect("FORMAT( + " . $this->_ci->StudiengangModel->escape($path_template) . ", + gruppe + ) AS path", false); + $this->_ci->StudiengangModel->addSelect("CONCAT( + UPPER(CONCAT(typ, kurzbz)), + '-', + semester, + verband, + gruppe, + ( + SELECT + CASE + WHEN bezeichnung IS NULL OR bezeichnung='' + THEN ''::TEXT + ELSE CONCAT(' (', bezeichnung, ')') + END + FROM public.tbl_lehrverband + WHERE studiengang_kz=v.studiengang_kz + AND semester=v.semester + AND verband=v.verband + AND gruppe=v.gruppe + ORDER BY gruppe + LIMIT 1 + ) + ) AS name", false); + + $this->_ci->StudiengangModel->addSelect('v.semester'); + $this->_ci->StudiengangModel->addSelect('v.verband'); + $this->_ci->StudiengangModel->addSelect('gruppe'); + $this->_ci->StudiengangModel->addSelect($this->_ci->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false); + $this->_ci->StudiengangModel->addSelect("ARRAY['link-strict', 'student-collection'] AS droplink"); + + $this->_ci->StudiengangModel->addOrder('gruppe'); + + $where = [ + 'v.studiengang_kz' => $studiengang_kz, + 'v.semester' => $semester, + 'v.verband' => $verband, + 'v.gruppe !=' => '', + 'v.aktiv' => true + ]; + + if ($orgform_kurzbz !== null && $semester) // NOTE(chris): on semester 0 show all? + $where['v.orgform_kurzbz'] = $orgform_kurzbz; + + $result = $this->_ci->StudiengangModel->loadWhere($where); + + return getData($result) ?: []; + } + + public function orgform($path_template, $studiengang_kz) + { + $this->_ci->load->model('organisation/Studienordnung_model', 'StudienordnungModel'); + + $this->_ci->StudienordnungModel->addDistinct(); + $this->_ci->StudienordnungModel->addSelect("FORMAT( + " . $this->_ci->StudienordnungModel->escape($path_template) . ", + LOWER(p.orgform_kurzbz) + ) AS path"); + $this->_ci->StudienordnungModel->addSelect("p.orgform_kurzbz AS name"); + $this->_ci->StudienordnungModel->addSelect("studiengang_kz AS stg_kz"); + + $this->_ci->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id'); + + $result = $this->_ci->StudienordnungModel->loadWhere([ + 'aktiv' => true, + 'studiengang_kz' => $studiengang_kz, + 'p.orgform_kurzbz !=' => 'DDP' + ]); + + + return getData($result) ?: []; + } + + public function studiensemester($path_template, $studiengang_kz) + { + $number_displayed_past_studiensemester = null; + + $this->_ci->load->model('system/Variable_model', 'VariableModel'); + + $result = $this->_ci->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']); + if (isError($result)) + return []; + + $data = getData($result); + if ($data && isset($data['number_displayed_past_studiensemester'])) { + $number_displayed_past_studiensemester = $data['number_displayed_past_studiensemester']; + } else { + $this->_ci->load->config('stv'); + $number_displayed_past_studiensemester = $this->_ci->config->item('number_displayed_past_studiensemester_default'); + } + + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $this->_ci->StudiensemesterModel->addPlusMinus(null, $number_displayed_past_studiensemester); + + $this->_ci->StudiensemesterModel->addSelect("studiensemester_kurzbz AS name"); + $this->_ci->StudiensemesterModel->addSelect("FORMAT( + " . $this->_ci->StudiensemesterModel->escape($path_template) . ", + LOWER(studiensemester_kurzbz) + ) AS path", false); + $this->_ci->StudiensemesterModel->addSelect($this->_ci->StudiensemesterModel->escape($studiengang_kz) . " AS stg_kz", false); + + $this->_ci->StudiensemesterModel->addOrder('ende'); + + $result = $this->_ci->StudiensemesterModel->load(); + + return getData($result) ?: []; + } +} diff --git a/application/libraries/vertragsbestandteil/AbstractBestandteil.php b/application/libraries/vertragsbestandteil/AbstractBestandteil.php index ccd05f5e2..4e1e8b9d0 100644 --- a/application/libraries/vertragsbestandteil/AbstractBestandteil.php +++ b/application/libraries/vertragsbestandteil/AbstractBestandteil.php @@ -40,7 +40,9 @@ abstract class AbstractBestandteil implements IValidation if( is_bool($new_value) && ($old_value !== $new_value) ) { $this->modifiedcolumns[$columnname] = $columnname; - } else if($old_value != $new_value) { + } else if(is_null($old_value) xor is_null($new_value)) { + $this->modifiedcolumns[$columnname] = $columnname; + } else if($old_value != $new_value) { $this->modifiedcolumns[$columnname] = $columnname; } } diff --git a/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php b/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php index 95bbdd908..869ed1c2b 100644 --- a/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php +++ b/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php @@ -13,6 +13,7 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl protected $dienstverhaeltnis_id; protected $vertragsbestandteil_id; protected $gehaltstyp_kurzbz; + protected $gehaltsanpassungtyp_kurzbz = ''; protected $von; protected $bis; protected $anmerkung; @@ -21,6 +22,7 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl protected $valorisierungssperre; protected $valorisierung; protected $auszahlungen; + protected $gehaltstyp_bezeichnung; protected $insertamum; protected $insertvon; @@ -39,6 +41,10 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl isset($data->dienstverhaeltnis_id) && $this->setDienstverhaeltnis_id($data->dienstverhaeltnis_id); isset($data->vertragsbestandteil_id) && $this->setVertragsbestandteil_id($data->vertragsbestandteil_id); isset($data->gehaltstyp_kurzbz) && $this->setGehaltstyp_kurzbz($data->gehaltstyp_kurzbz); + //isset($data->gehaltsanpassungtyp_kurzbz) && $this->setGehaltsanpassungtyp_kurzbz($data->gehaltsanpassungtyp_kurzbz); + if (!empty($data->gehaltsanpassungtyp_kurzbz)) { + $this->setGehaltsanpassungtyp_kurzbz($data->gehaltsanpassungtyp_kurzbz); + } isset($data->von) && $this->setVon($data->von); isset($data->bis) && $this->setBis($data->bis); isset($data->anmerkung) && $this->setAnmerkung($data->anmerkung); @@ -47,7 +53,8 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl isset($data->valorisierungssperre) && $this->setValorisierungssperre($data->valorisierungssperre); isset($data->valorisierung) && $this->setValorisierung($data->valorisierung); isset($data->auszahlungen) && $this->setAuszahlungen($data->auszahlungen); - + isset($data->gehaltstyp_bezeichnung) && $this->setGehaltstyp_bezeichnung($data->gehaltstyp_bezeichnung); + isset($data->insertamum) && $this->setInsertamum($data->insertamum); isset($data->insertvon) && $this->setInsertvon($data->insertvon); isset($data->updateamum) && $this->setUpdateamum($data->updateamum); @@ -75,6 +82,11 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl return $this->gehaltstyp_kurzbz; } + public function getGehaltsanpassungtyp_kurzbz() + { + return $this->gehaltsanpassungtyp_kurzbz; + } + public function getVon() { return $this->von; @@ -178,6 +190,13 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl return $this; } + public function setGehaltsanpassungtyp_kurzbz($gehaltsanpassungtyp_kurzbz) + { + $this->markDirty('gehaltsanpassungtyp_kurzbz', $this->gehaltsanpassungtyp_kurzbz, $gehaltsanpassungtyp_kurzbz); + $this->gehaltsanpassungtyp_kurzbz = $gehaltsanpassungtyp_kurzbz; + return $this; + } + public function setVon($von) { $this->markDirty('von', $this->von, $von); @@ -206,6 +225,10 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl $grundbetrag = number_format($grundbetrag, 2, '.', ''); } $this->markDirty('grundbetrag', $this->grundbetrag, $grundbetrag); + if(in_array('grundbetrag', $this->modifiedcolumns)) + { + $this->setBetrag_valorisiert($grundbetrag); + } $this->grundbetrag = $grundbetrag; return $this; } @@ -242,6 +265,13 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl return $this; } + public function setGehaltstyp_bezeichnung($gehaltstyp_bezeichnung) + { + $this->markDirty('gehaltstyp_bezeichnung', $this->gehaltstyp_bezeichnung, $gehaltstyp_bezeichnung); + $this->gehaltstyp_bezeichnung = $gehaltstyp_bezeichnung; + return $this; + } + public function setInsertamum($insertamum) { $this->markDirty('insertamum', $this->insertamum, $insertamum); @@ -284,6 +314,7 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl 'dienstverhaeltnis_id' => $this->getDienstverhaeltnis_id(), 'vertragsbestandteil_id' => $this->getVertragsbestandteil_id(), 'gehaltstyp_kurzbz' => $this->getGehaltstyp_kurzbz(), + 'gehaltsanpassungtyp_kurzbz' => $this->getGehaltsanpassungtyp_kurzbz(), 'von' => $this->getVon(), 'bis' => $this->getBis(), 'anmerkung' => $this->getAnmerkung(), @@ -312,6 +343,7 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl dienstverhaeltnis_id: {$this->getDienstverhaeltnis_id()} vertragsbestandteil_id: {$this->getVertragsbestandteil_id()} gehaltstyp_kurzbz: {$this->getGehaltstyp_kurzbz()} + gehaltsanpassungtyp_kurzbz: {$this->getGehaltsanpassungtyp_kurzbz()} von: {$this->getVon()} bis: {$this->getBis()} anmerkung: {$this->getAnmerkung()} diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php index 0e071f36b..71104fa91 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php @@ -137,19 +137,25 @@ EOTXT; return parent::__toString() . $txt; } - /* public function validate() + public function validate() { - if( !(filter_var($this->tage, FILTER_VALIDATE_INT, - array( - 'options' => array( - 'min_range' => 1, - 'max_range' => 50 - ) - ) - )) ) { - $this->validationerrors[] = 'Urlaubsanspruch muss eine Tagesanzahl im Bereich 1 bis 50 sein.'; + $value = $this->vordienstzeit; + + if ($value === null || $value === '') { + $result = null; // allow null value + } else { + $result = filter_var($value, FILTER_VALIDATE_INT, [ + 'options' => [ + 'min_range' => 0, + 'max_range' => 100 + ] + ]); + + if ($result === false) { + $this->validationerrors[] = 'Vordienstjahre muss eine ganze Zahl (0 bis 100) enthalten oder leer sein.'; + } } return parent::validate(); - } */ + } } diff --git a/application/models/codex/Bisio_model.php b/application/models/codex/Bisio_model.php index 1cff1dc54..972661c8b 100644 --- a/application/models/codex/Bisio_model.php +++ b/application/models/codex/Bisio_model.php @@ -44,4 +44,110 @@ class Bisio_model extends DB_Model else return success("Bisio not found"); } + + /** + * Gets outgoing students of certain Semester + * @param String studiensemester_kurzbz + * @return array of prestudent_ids + */ + public function getOutgoingsOfSemester($studiensemester_kurzbz) + { + $query = " + SELECT DISTINCT ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis + FROM bis.tbl_bisio + JOIN public.tbl_student USING (student_uid) + JOIN public.tbl_prestudent ps USING (prestudent_id) + JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id) + JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz) + WHERE ss.studiensemester_kurzbz = ? + AND nation_code <> 'A' + AND ( + tbl_bisio.von <= ss.ende + AND ( + tbl_bisio.bis >= ss.start + OR tbl_bisio.bis IS NULL + ) + ) + "; + + return $this->execQuery($query, array($studiensemester_kurzbz)); + } + + /** + * Gets incoming students of certain Semester + * @param String studiensemester_kurzbz + * @return array of prestudent_ids + */ + public function getIncomingsOfSemester($studiensemester_kurzbz) + { + $query = " + SELECT DISTINCT ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis + FROM bis.tbl_bisio + JOIN public.tbl_student USING (student_uid) + JOIN public.tbl_prestudent ps USING (prestudent_id) + JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id) + JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz) + WHERE ss.studiensemester_kurzbz = ? + AND nation_code = 'A' + AND ( + tbl_bisio.von <= ss.ende + AND ( + tbl_bisio.bis >= ss.start + OR tbl_bisio.bis IS NULL + ) + ) + "; + + return $this->execQuery($query, array($studiensemester_kurzbz)); + } + + public function isPrestudentOutgoing($studiensemester_kurzbz, $prestudent_id) + { + $query = " + SELECT + ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis + FROM bis.tbl_bisio + JOIN public.tbl_student USING (student_uid) + JOIN public.tbl_prestudent ps USING (prestudent_id) + JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id) + JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz) + WHERE ss.studiensemester_kurzbz = ? + AND nation_code <> 'A' + AND ( + tbl_bisio.von <= ss.ende + AND ( + tbl_bisio.bis >= ss.start + OR tbl_bisio.bis IS NULL + ) + ) + AND ps.prestudent_id = ? + "; + + return $this->execQuery($query, array($studiensemester_kurzbz, $prestudent_id)); + } + + public function isPrestudentIncoming($studiensemester_kurzbz, $prestudent_id) + { + $query = " + SELECT + ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis + FROM bis.tbl_bisio + JOIN public.tbl_student USING (student_uid) + JOIN public.tbl_prestudent ps USING (prestudent_id) + JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id) + JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz) + WHERE ss.studiensemester_kurzbz = ? + AND nation_code = 'A' + AND ( + tbl_bisio.von <= ss.ende + AND ( + tbl_bisio.bis >= ss.start + OR tbl_bisio.bis IS NULL + ) + ) + AND ps.prestudent_id = ? + "; + + return $this->execQuery($query, array($studiensemester_kurzbz, $prestudent_id)); + } } diff --git a/application/models/content/Content_model.php b/application/models/content/Content_model.php index 278022b59..48a155cb2 100644 --- a/application/models/content/Content_model.php +++ b/application/models/content/Content_model.php @@ -234,9 +234,9 @@ class Content_model extends DB_Model FROM campus.tbl_content c1 LEFT JOIN - campus.tbl_contentsprache s1 ON c1.content_id=s1.content_id AND s1.sprache=? + campus.tbl_contentsprache s1 ON c1.content_id=s1.content_id AND s1.sprache=? AND sichtbar=true WHERE - sichtbar=true + c1.aktiv = true ) s2 LEFT JOIN campus.tbl_contentsprache s3 USING(content_id, sprache) @@ -277,7 +277,7 @@ class Content_model extends DB_Model JOIN campus.tbl_contentsprache s USING(contentsprache_id) LEFT JOIN - campus.tbl_contentchild k ON(m.content_id=k.content_id) + campus.tbl_contentchild k ON(m.content_id=k.content_id) and c.aktiv = true WHERE EXISTS ( SELECT 1 FROM campus.tbl_contentgruppe diff --git a/application/models/crm/Dokument_model.php b/application/models/crm/Dokument_model.php index 8008202c1..d292068d8 100644 --- a/application/models/crm/Dokument_model.php +++ b/application/models/crm/Dokument_model.php @@ -57,7 +57,7 @@ class Dokument_model extends DB_Model $qry = " SELECT a.akte_id, - a.bezeichnung, + dok.bezeichnung, a.dokument_kurzbz, a.titel_intern, a.anmerkung_intern, @@ -83,6 +83,7 @@ class Dokument_model extends DB_Model inhalt FROM public.tbl_akte a + JOIN public.tbl_dokument dok ON (dok.dokument_kurzbz = a.dokument_kurzbz) WHERE a.person_id = ? AND a.dokument_kurzbz NOT IN ( diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php index ab073996f..df8c1f983 100644 --- a/application/models/crm/Student_model.php +++ b/application/models/crm/Student_model.php @@ -204,7 +204,7 @@ class Student_model extends DB_Model Events::trigger( 'generate_student_uid', - function ($value) use ($uid) { + function ($value) use (&$uid) { $uid = $value; }, $stgkzl, diff --git a/application/models/dashboard/Bookmark_model.php b/application/models/dashboard/Bookmark_model.php index 5efacc26b..d9756294e 100644 --- a/application/models/dashboard/Bookmark_model.php +++ b/application/models/dashboard/Bookmark_model.php @@ -11,8 +11,4 @@ class Bookmark_model extends DB_Model $this->dbTable = 'dashboard.tbl_bookmark'; $this->pk = 'bookmark_id'; } - - - - } diff --git a/application/models/dashboard/Dashboard_model.php b/application/models/dashboard/Dashboard_model.php index 88946ed83..78f6b1100 100644 --- a/application/models/dashboard/Dashboard_model.php +++ b/application/models/dashboard/Dashboard_model.php @@ -11,15 +11,4 @@ class Dashboard_model extends DB_Model $this->dbTable = 'dashboard.tbl_dashboard'; $this->pk = 'dashboard_id'; } - - - /** - * Get Dashboard by kurzbz. - * @param string dashboard_kurzbz - * @return array - */ - public function getDashboardByKurzbz($dashboard_kurzbz) - { - return $this->loadWhere(array('dashboard_kurzbz' => $dashboard_kurzbz)); - } } diff --git a/application/models/education/Lehreinheit_model.php b/application/models/education/Lehreinheit_model.php index 2f955c295..808c4e443 100644 --- a/application/models/education/Lehreinheit_model.php +++ b/application/models/education/Lehreinheit_model.php @@ -719,7 +719,7 @@ EOSQL; return "tag_data_agg AS ( SELECT lehreinheit_id, - COALESCE(json_agg(tag ORDER BY done), '[]'::json) AS tags + COALESCE(json_agg(tag ORDER BY done, prioritaet), '[]'::json) AS tags FROM ( SELECT DISTINCT ON (public.tbl_notiz.notiz_id) tbl_notiz.notiz_id AS id, @@ -728,7 +728,9 @@ EOSQL; text AS notiz, style, erledigt AS done, - lehreinheit_id + lehreinheit_id, + prioritaet, + automatisiert FROM public.tbl_notizzuordnung JOIN public.tbl_notiz ON tbl_notizzuordnung.notiz_id = tbl_notiz.notiz_id JOIN public.tbl_notiz_typ ON tbl_notiz.typ = tbl_notiz_typ.typ_kurzbz diff --git a/application/models/education/Lehreinheitgruppe_model.php b/application/models/education/Lehreinheitgruppe_model.php index dee8bbfe1..139d639cb 100644 --- a/application/models/education/Lehreinheitgruppe_model.php +++ b/application/models/education/Lehreinheitgruppe_model.php @@ -341,7 +341,7 @@ class Lehreinheitgruppe_model extends DB_Model $this->db->where('lehreinheit_id', $lehreinheit_id); $this->db->where('studiengang_kz', $gruppen_array->studiengang_kz); - if (!isEmptyString($gruppen_array->semester)) + if (!isEmptyString((string)$gruppen_array->semester)) { $this->db->where('semester', $gruppen_array->semester); } @@ -444,30 +444,37 @@ class Lehreinheitgruppe_model extends DB_Model ) ELSE tbl_gruppe.beschreibung END AS beschreibung"); - $this->addSelect("CASE - WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN - ( - SELECT EXISTS ( - SELECT 1 - FROM lehre.tbl_stundenplandev - WHERE lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id - AND studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz - AND semester = tbl_lehreinheitgruppe.semester - AND TRIM(COALESCE(verband, '')) = TRIM(tbl_lehreinheitgruppe.verband) - AND TRIM(COALESCE(gruppe, '')) = TRIM(tbl_lehreinheitgruppe.gruppe) - AND (gruppe_kurzbz IS NULL OR gruppe_kurzbz = '') - ) - ) - ELSE + $this->addSelect(" + CASE + WHEN trim(COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, '')) = '' THEN ( SELECT EXISTS ( SELECT 1 - FROM lehre.tbl_stundenplandev - WHERE lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id - AND gruppe_kurzbz = tbl_lehreinheitgruppe.gruppe_kurzbz + FROM lehre.tbl_stundenplandev sp + WHERE sp.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id + AND sp.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz + AND sp.semester = tbl_lehreinheitgruppe.semester + AND trim(COALESCE(sp.verband, '')) = trim(COALESCE(tbl_lehreinheitgruppe.verband, '')) + AND trim(COALESCE(sp.gruppe, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe, '')) + AND trim(COALESCE(sp.gruppe_kurzbz, '')) = '' ) ) - END AS verplant"); + ELSE + ( + SELECT EXISTS ( + SELECT 1 + FROM lehre.tbl_stundenplandev sp + WHERE sp.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id + AND sp.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz + AND sp.semester = tbl_lehreinheitgruppe.semester + AND trim(COALESCE(sp.verband, '')) = trim(COALESCE(tbl_lehreinheitgruppe.verband, '')) + AND trim(COALESCE(sp.gruppe, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe, '')) + AND trim(COALESCE(sp.gruppe_kurzbz, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, '')) + ) + ) + END AS verplant + "); + $this->addJoin('tbl_studiengang', 'studiengang_kz', 'LEFT'); $this->addJoin('public.tbl_gruppe', 'gruppe_kurzbz', 'LEFT'); diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index 5422c290e..bea676b98 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -1245,7 +1245,7 @@ class Lehrveranstaltung_model extends DB_Model { return " SELECT - lehrveranstaltung_id, tbl_lehrveranstaltung.kurzbz as lv_kurzbz, tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, bezeichnung_english as lv_bezeichnung_english, studiengang_kz, + distinct on (lehrveranstaltung_id) lehrveranstaltung_id, tbl_lehrveranstaltung.kurzbz as lv_kurzbz, tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, bezeichnung_english as lv_bezeichnung_english, studiengang_kz, tbl_studienplan_lehrveranstaltung.semester, tbl_lehrveranstaltung.sprache, ects as lv_ects, semesterstunden, anmerkung, lehre, lehreverzeichnis as lv_lehreverzeichnis, tbl_lehrveranstaltung.aktiv, planfaktor as lv_planfaktor, planlektoren as lv_planlektoren, planpersonalkosten as lv_planpersonalkosten, diff --git a/application/models/education/Lvgesamtnote_model.php b/application/models/education/Lvgesamtnote_model.php index c30045ff0..0a7638869 100644 --- a/application/models/education/Lvgesamtnote_model.php +++ b/application/models/education/Lvgesamtnote_model.php @@ -29,10 +29,14 @@ class Lvgesamtnote_model extends DB_Model $this->addSelect("lv.bezeichnung AS lehrveranstaltung_bezeichnung"); $this->addSelect("lv.studiengang_kz"); $this->addSelect("UPPER(stg.typ || stg.kurzbz) AS studiengang"); + $this->addSelect("person.vorname"); + $this->addSelect("person.nachname"); $this->addJoin("lehre.tbl_note n", "note"); $this->addJoin("lehre.tbl_lehrveranstaltung lv", "lehrveranstaltung_id"); $this->addJoin("public.tbl_studiengang stg", "studiengang_kz"); + $this->addJoin("public.tbl_benutzer benutzer", "uid = student_uid", "LEFT"); + $this->addJoin("public.tbl_person person", "person_id", "LEFT"); $this->db->where($this->dbTable . ".freigabedatum <", "NOW()", false); diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php index 3b1ea55e5..0fc3710f0 100644 --- a/application/models/education/Projektarbeit_model.php +++ b/application/models/education/Projektarbeit_model.php @@ -187,7 +187,10 @@ class Projektarbeit_model extends DB_Model campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabetyp.benotbar, campus.tbl_paabgabe.abgabedatum, - campus.tbl_paabgabe.insertvon + campus.tbl_paabgabe.insertvon, + campus.tbl_paabgabe.insertamum, + campus.tbl_paabgabe.updatevon, + campus.tbl_paabgabe.updateamum FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz) WHERE campus.tbl_paabgabe.projektarbeit_id = ? ORDER BY campus.tbl_paabgabe.datum"; @@ -207,7 +210,18 @@ class Projektarbeit_model extends DB_Model campus.tbl_paabgabetyp.paabgabetyp_kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum, - campus.tbl_paabgabe.insertvon + campus.tbl_paabgabe.insertvon, + campus.tbl_paabgabe.updatevon, + campus.tbl_paabgabe.insertamum, + campus.tbl_paabgabe.updateamum, + (SELECT p.vorname || ' ' || p.nachname + FROM public.tbl_benutzer b + JOIN public.tbl_person p USING(person_id) + WHERE b.uid = campus.tbl_paabgabe.insertvon) AS insertvon_fullname, + (SELECT p.vorname || ' ' || p.nachname + FROM public.tbl_benutzer b + JOIN public.tbl_person p USING(person_id) + WHERE b.uid = campus.tbl_paabgabe.updatevon) AS updatevon_fullname FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz) WHERE campus.tbl_paabgabe.projektarbeit_id IN ? ORDER BY campus.tbl_paabgabe.datum"; @@ -240,7 +254,8 @@ class Projektarbeit_model extends DB_Model LEFT JOIN public.tbl_benutzer ben USING (person_id) LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid WHERE (ben.aktiv OR ben.aktiv IS NULL) - AND projektarbeit_id = ?"; + AND projektarbeit_id = ? + AND lehre.tbl_projektbetreuer.betreuerart_kurzbz = ANY('{Begutachter, Betreuer, Erstbetreuer,Erstbegutachter,Senatsvorsitz}')"; return $this->execReadOnlyQuery($qry, [$projektarbeit_id]); } @@ -294,34 +309,142 @@ class Projektarbeit_model extends DB_Model * Get a List of Projektarbeiten of a mitarbeiter with zuordnung * used by the mitarbeiter cis4 abgabetool. */ - public function getMitarbeiterProjektarbeiten($uid, $showAll){ - $qry = "SELECT - * - FROM - (SELECT tbl_person.vorname, tbl_person.nachname, tbl_studiengang.typ, tbl_studiengang.kurzbz, - tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id, tbl_projektarbeit.note, - tbl_projektbetreuer.person_id as betreuer_person_id, tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung, - tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, public.tbl_student.student_uid - FROM lehre.tbl_projektarbeit - LEFT JOIN lehre.tbl_projektbetreuer using(projektarbeit_id) - LEFT JOIN lehre.tbl_betreuerart using(betreuerart_kurzbz) - LEFT JOIN public.tbl_benutzer on(uid=student_uid) - LEFT JOIN public.tbl_student on(public.tbl_benutzer.uid=public.tbl_student.student_uid) - LEFT JOIN public.tbl_person on(tbl_benutzer.person_id=tbl_person.person_id) - LEFT JOIN lehre.tbl_lehreinheit using(lehreinheit_id) - LEFT JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id) - LEFT JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz=public.tbl_studiengang.studiengang_kz) - LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) - WHERE (projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom') - AND tbl_projektbetreuer.person_id IN (SELECT person_id FROM public.tbl_benutzer - WHERE public.tbl_benutzer.person_id=lehre.tbl_projektbetreuer.person_id - AND public.tbl_benutzer.uid= ? ) - ".($showAll?'':' AND public.tbl_benutzer.aktiv AND lehre.tbl_projektarbeit.note IS NULL ')." + public function getMitarbeiterProjektarbeiten($person_id, $showAll){ + $qry = "WITH secondary_betreuer AS ( + SELECT DISTINCT ON (pb.projektarbeit_id) + pb.projektarbeit_id, + pb.person_id AS zweitbetreuer_person_id, + b.uid AS zweitbetreuer_benutzer_uid, + pb.betreuerart_kurzbz AS zweitbetreuer_betreuerart_kurzbz, + ba.beschreibung AS zweitbetreuer_betreuerart_beschreibung, + p.titelpre AS zweitbetreuer_titelpre, + p.vorname AS zweitbetreuer_vorname, + p.nachname AS zweitbetreuer_nachname, + p.titelpost AS zweitbetreuer_titelpost, + trim( + COALESCE(p.titelpre, '') || ' ' || + COALESCE(p.vorname, '') || ' ' || + COALESCE(p.nachname, '') || ' ' || + COALESCE(p.titelpost, '') + ) AS zweitbetreuer_full_name + FROM lehre.tbl_projektbetreuer pb + JOIN public.tbl_person p ON p.person_id = pb.person_id + LEFT JOIN public.tbl_benutzer b ON b.person_id = p.person_id + LEFT JOIN lehre.tbl_betreuerart ba ON ba.betreuerart_kurzbz = pb.betreuerart_kurzbz + WHERE pb.betreuerart_kurzbz = ANY('{Zweitbetreuer,Zweitbegutachter,Senatsmitglied}') + ORDER BY pb.projektarbeit_id + ), + primary_betreuer AS ( + SELECT DISTINCT ON (pb.projektarbeit_id) + pb.projektarbeit_id, + pb.person_id AS betreuer_person_id, + pb.betreuerart_kurzbz AS betreuer_betreuerart_kurzbz, + ba.beschreibung AS betreuer_betreuerart_beschreibung, + p.titelpre AS betreuer_titelpre, + p.vorname AS betreuer_vorname, + p.nachname AS betreuer_nachname, + p.titelpost AS betreuer_titelpost, + trim( + COALESCE(p.titelpre, '') || ' ' || + COALESCE(p.vorname, '') || ' ' || + COALESCE(p.nachname, '') || ' ' || + COALESCE(p.titelpost, '') + ) AS betreuer_full_name + FROM lehre.tbl_projektbetreuer pb + JOIN public.tbl_person p ON p.person_id = pb.person_id + LEFT JOIN public.tbl_benutzer b ON b.person_id = p.person_id + LEFT JOIN lehre.tbl_betreuerart ba ON ba.betreuerart_kurzbz = pb.betreuerart_kurzbz + WHERE pb.betreuerart_kurzbz = ANY('{Begutachter, Betreuer, Erstbetreuer,Erstbegutachter,Senatsvorsitz}') + ORDER BY pb.projektarbeit_id + ) + + SELECT + * + FROM + (SELECT DISTINCT ON (tbl_projektarbeit.projektarbeit_id) + student_person.vorname, student_person.nachname, + tbl_studiengang.typ, tbl_studiengang.kurzbz, + tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, + tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id, tbl_projektarbeit.note, + student_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, public.tbl_student.student_uid, + + lehre.tbl_projektarbeit.sprache, + lehre.tbl_projektarbeit.seitenanzahl, + lehre.tbl_projektarbeit.kontrollschlagwoerter, + lehre.tbl_projektarbeit.schlagwoerter, + lehre.tbl_projektarbeit.schlagwoerter_en, + lehre.tbl_projektarbeit.abstract, + lehre.tbl_projektarbeit.abstract_en, + lehre.tbl_projektarbeit.insertamum, + + ( + SELECT orgform_kurzbz + FROM public.tbl_prestudentstatus + WHERE prestudent_id = ( + SELECT prestudent_id FROM public.tbl_student + WHERE student_uid = student_benutzer.uid LIMIT 1 + ) + ORDER BY datum DESC, insertamum DESC, ext_id DESC + LIMIT 1 + ) AS organisationsform, + ( + SELECT COALESCE(tbl_studienplan.orgform_kurzbz, + tbl_prestudentstatus.orgform_kurzbz, + tbl_studiengang.orgform_kurzbz) + FROM public.tbl_prestudent + JOIN public.tbl_prestudentstatus USING (prestudent_id) + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) + JOIN public.tbl_studiengang USING (studiengang_kz) + LEFT JOIN lehre.tbl_studienplan USING (studienplan_id) + WHERE prestudent_id = public.tbl_student.prestudent_id + ORDER BY tbl_prestudentstatus.datum DESC + LIMIT 1 + ) AS orgform, + ( + SELECT status_kurzbz + FROM public.tbl_prestudentstatus + WHERE prestudent_id = public.tbl_student.prestudent_id + ORDER BY datum DESC, insertamum DESC, ext_id DESC + LIMIT 1 + ) AS studienstatus, + + pb.betreuer_person_id, + pb.betreuer_betreuerart_kurzbz, + pb.betreuer_betreuerart_beschreibung, + pb.betreuer_titelpre, + pb.betreuer_vorname, + pb.betreuer_nachname, + pb.betreuer_titelpost, + pb.betreuer_full_name, + + sb.zweitbetreuer_person_id, + sb.zweitbetreuer_benutzer_uid, + sb.zweitbetreuer_betreuerart_kurzbz, + sb.zweitbetreuer_betreuerart_beschreibung, + sb.zweitbetreuer_titelpre, + sb.zweitbetreuer_vorname, + sb.zweitbetreuer_nachname, + sb.zweitbetreuer_titelpost, + sb.zweitbetreuer_full_name + FROM lehre.tbl_projektarbeit + LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid + LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id + LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid + LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) + LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) + LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz + LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) + LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + LEFT JOIN primary_betreuer pb ON pb.projektarbeit_id = tbl_projektarbeit.projektarbeit_id + LEFT JOIN secondary_betreuer sb ON sb.projektarbeit_id = tbl_projektarbeit.projektarbeit_id + WHERE (projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom') + AND (pb.betreuer_person_id = ? OR sb.zweitbetreuer_person_id = ?) + ".($showAll?'':' AND student_benutzer.aktiv AND lehre.tbl_projektarbeit.note IS NULL ')." AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Zweitbegutachter', 'Erstbetreuer', 'Senatsvorsitz', 'Senatsmitglied') - ORDER BY tbl_projektarbeit.projektarbeit_id, betreuerart_kurzbz desc) as xy + ORDER BY tbl_projektarbeit.projektarbeit_id, betreuerart_kurzbz desc) as xy ORDER BY nachname;"; - return $this->execReadOnlyQuery($qry, array($uid)); + return $this->execReadOnlyQuery($qry, array($person_id, $person_id)); } /** @@ -341,176 +464,257 @@ class Projektarbeit_model extends DB_Model public function getProjektarbeitenForStudiengang($studiengang_kz, $benotet) { - $new_qry = "SELECT DISTINCT ON(tmp.projektarbeit_id) *, campus.get_betreuer_details(tmp.zweitbetreuer_person_id) as zweitbetreuer_full_name, campus.get_betreuer_details(tmp.betreuer_person_id) as erstbetreuer_full_name - FROM( - SELECT - DISTINCT ON(tbl_projektarbeit.projektarbeit_id) - tbl_projektarbeit.projekttyp_kurzbz, - tbl_projektarbeit.titel, - tbl_projektarbeit.projektarbeit_id, - tbl_studiengang.typ, tbl_studiengang.kurzbz, - student_benutzer.uid as student_uid, - student_person.vorname as student_vorname, - student_person.nachname as student_nachname, - tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, - betreuer_benutzer.uid as betreuer_benutzer_uid, - betreuer_person.titelpre as betreuer_titelpre, - betreuer_person.vorname as betreuer_vorname, - betreuer_person.nachname as betreuer_nachname, - betreuer_person.titelpost as betreuer_titelpost, - lehre.tbl_projektbetreuer.betreuerart_kurzbz as betreuerart, - lehre.tbl_projektbetreuer.person_id as betreuer_person_id, - lehre.tbl_projektarbeit.sprache as sprache, - lehre.tbl_projektarbeit.seitenanzahl as seitenanzahl, - lehre.tbl_projektarbeit.kontrollschlagwoerter as kontrollschlagwoerter, - lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter, - lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en, - lehre.tbl_projektarbeit.abstract as abstract, - lehre.tbl_projektarbeit.abstract_en as abstract_en, - lehre.tbl_projektarbeit.insertamum as insertamum, - lehre.tbl_projektarbeit.note as note, - ( - SELECT orgform_kurzbz - FROM tbl_prestudentstatus - WHERE prestudent_id = (SELECT prestudent_id - FROM tbl_student - WHERE student_uid = student_benutzer.uid - LIMIT 1) - ORDER BY datum DESC, insertamum DESC, ext_id DESC - LIMIT 1 - ) - as organisationsform, - ( - SELECT person_id - FROM lehre.tbl_projektbetreuer - WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') - LIMIT 1 - ) - AS zweitbetreuer_person_id, - ( - SELECT betreuerart_kurzbz - FROM lehre.tbl_projektbetreuer - WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') - LIMIT 1 - ) - AS zweitbetreuer_betreuerart_kurzbz, - ( - SELECT tbl_betreuerart.beschreibung - FROM lehre.tbl_projektbetreuer - JOIN lehre.tbl_betreuerart USING (betreuerart_kurzbz) - WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') - LIMIT 1 - ) - AS zweitbetreuer_betreuerart_beschreibung, - ( - SELECT trim(COALESCE(titelpre, '') || ' ' || COALESCE(vorname, '') || ' ' || COALESCE(nachname, '') || ' ' || - COALESCE(titelpost, '')) - FROM public.tbl_person - JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) - LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) - LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) - WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') - LIMIT 1 - ) - as zweitbetreuer_full_name, - ( - SELECT titelpre - FROM public.tbl_person - JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) - LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) - LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) - WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') - LIMIT 1 - ) - as zweitbetreuer_titelpre, - ( - SELECT vorname - FROM public.tbl_person - JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) - LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) - LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) - WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') - LIMIT 1 - ) - as zweitbetreuer_vorname, - ( - SELECT nachname - FROM public.tbl_person - JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) - LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) - LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) - WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') - LIMIT 1 - ) - as zweitbetreuer_nachname, - ( - SELECT titelpost - FROM public.tbl_person - JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) - LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) - LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) - WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') - LIMIT 1 - ) - as zweitbetreuer_titelpost, - ( - SELECT - COALESCE(tbl_studienplan.orgform_kurzbz, - tbl_prestudentstatus.orgform_kurzbz, tbl_studiengang.orgform_kurzbz) as - orgform - FROM - public.tbl_prestudent - JOIN public.tbl_prestudentstatus USING(prestudent_id) - JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) - JOIN public.tbl_studiengang USING(studiengang_kz) - LEFT JOIN lehre.tbl_studienplan USING(studienplan_id) - WHERE - prestudent_id=tbl_student.prestudent_id - ORDER BY tbl_prestudentstatus.datum DESC LIMIT 1 - ) as orgform, - (SELECT status_kurzbz FROM public.tbl_prestudentstatus - WHERE prestudent_id=tbl_student.prestudent_id - ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as studienstatus - FROM lehre.tbl_projektarbeit - LEFT JOIN public.tbl_benutzer student_benutzer ON (student_benutzer.uid = lehre.tbl_projektarbeit.student_uid) - LEFT JOIN public.tbl_person student_person ON (student_benutzer.person_id = student_person.person_id) - LEFT JOIN public.tbl_student on(student_benutzer.uid = public.tbl_student.student_uid) - LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) - LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) - LEFT JOIN public.tbl_studiengang ON (public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz) - LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) - LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) - LEFT JOIN public.tbl_person betreuer_person ON (betreuer_person.person_id = lehre.tbl_projektbetreuer.person_id) - LEFT JOIN public.tbl_benutzer betreuer_benutzer ON (betreuer_person.person_id = betreuer_benutzer.person_id) - WHERE (projekttyp_kurzbz = 'Bachelor' OR projekttyp_kurzbz = 'Diplom') - AND student_benutzer.aktiv AND ( - lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbegutachter' - OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Begutachter' - OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Betreuer' - OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbetreuer' - OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Senatsvorsitz' - ) - AND public.tbl_studiengang.studiengang_kz = ?"; + $new_qry = "WITH secondary_betreuer AS ( + SELECT DISTINCT ON (pb.projektarbeit_id) + pb.projektarbeit_id, + pb.person_id AS zweitbetreuer_person_id, + pb.betreuerart_kurzbz AS zweitbetreuer_betreuerart_kurzbz, + ba.beschreibung AS zweitbetreuer_betreuerart_beschreibung, + p.titelpre AS zweitbetreuer_titelpre, + p.vorname AS zweitbetreuer_vorname, + p.nachname AS zweitbetreuer_nachname, + p.titelpost AS zweitbetreuer_titelpost, + trim( + COALESCE(p.titelpre, '') || ' ' || + COALESCE(p.vorname, '') || ' ' || + COALESCE(p.nachname, '') || ' ' || + COALESCE(p.titelpost, '') + ) AS zweitbetreuer_full_name + FROM lehre.tbl_projektbetreuer pb + JOIN public.tbl_person p ON p.person_id = pb.person_id + LEFT JOIN public.tbl_benutzer b ON b.person_id = p.person_id + LEFT JOIN lehre.tbl_betreuerart ba ON ba.betreuerart_kurzbz = pb.betreuerart_kurzbz + WHERE pb.betreuerart_kurzbz = ANY('{Zweitbetreuer,Zweitbegutachter,Senatsmitglied}') + ORDER BY pb.projektarbeit_id -- DISTINCT ON needs this to be deterministic + ) - if($benotet == 0) { - $new_qry .= " AND lehre.tbl_projektarbeit.note IS NULL "; - } else if ($benotet == 1) { - $new_qry .= " AND lehre.tbl_projektarbeit.note IS NOT NULL "; - } - - $new_qry .= " ORDER BY tbl_projektarbeit.projektarbeit_id DESC, student_person.nachname ASC + SELECT DISTINCT ON (tmp.projektarbeit_id) + *, + campus.get_betreuer_details(tmp.zweitbetreuer_person_id) AS zweitbetreuer_full_name, + campus.get_betreuer_details(tmp.betreuer_person_id) AS erstbetreuer_full_name + FROM ( + SELECT DISTINCT ON (tbl_projektarbeit.projektarbeit_id) + tbl_projektarbeit.projekttyp_kurzbz, + tbl_projektarbeit.titel, + tbl_projektarbeit.projektarbeit_id, + tbl_studiengang.typ, + tbl_studiengang.kurzbz, + student_benutzer.uid AS student_uid, + student_person.vorname AS student_vorname, + student_person.nachname AS student_nachname, + public.tbl_student.matrikelnr, + tbl_lehreinheit.studiensemester_kurzbz, + betreuer_benutzer.uid AS betreuer_benutzer_uid, + betreuer_person.titelpre AS betreuer_titelpre, + betreuer_person.vorname AS betreuer_vorname, + betreuer_person.nachname AS betreuer_nachname, + betreuer_person.titelpost AS betreuer_titelpost, + lehre.tbl_projektbetreuer.betreuerart_kurzbz AS betreuerart, + lehre.tbl_projektbetreuer.person_id AS betreuer_person_id, + lehre.tbl_projektarbeit.sprache, + lehre.tbl_projektarbeit.seitenanzahl, + lehre.tbl_projektarbeit.kontrollschlagwoerter, + lehre.tbl_projektarbeit.schlagwoerter, + lehre.tbl_projektarbeit.schlagwoerter_en, + lehre.tbl_projektarbeit.abstract, + lehre.tbl_projektarbeit.abstract_en, + lehre.tbl_projektarbeit.insertamum, + lehre.tbl_projektarbeit.note, + + sb.zweitbetreuer_person_id, + sb.zweitbetreuer_betreuerart_kurzbz, + sb.zweitbetreuer_betreuerart_beschreibung, + sb.zweitbetreuer_full_name, + sb.zweitbetreuer_titelpre, + sb.zweitbetreuer_vorname, + sb.zweitbetreuer_nachname, + sb.zweitbetreuer_titelpost, + + ( + SELECT orgform_kurzbz + FROM public.tbl_prestudentstatus + WHERE prestudent_id = ( + SELECT prestudent_id FROM public.tbl_student + WHERE student_uid = student_benutzer.uid LIMIT 1 + ) + ORDER BY datum DESC, insertamum DESC, ext_id DESC + LIMIT 1 + ) AS organisationsform, + ( + SELECT COALESCE(tbl_studienplan.orgform_kurzbz, + tbl_prestudentstatus.orgform_kurzbz, + tbl_studiengang.orgform_kurzbz) + FROM public.tbl_prestudent + JOIN public.tbl_prestudentstatus USING (prestudent_id) + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) + JOIN public.tbl_studiengang USING (studiengang_kz) + LEFT JOIN lehre.tbl_studienplan USING (studienplan_id) + WHERE prestudent_id = public.tbl_student.prestudent_id + ORDER BY tbl_prestudentstatus.datum DESC + LIMIT 1 + ) AS orgform, + ( + SELECT status_kurzbz + FROM public.tbl_prestudentstatus + WHERE prestudent_id = public.tbl_student.prestudent_id + ORDER BY datum DESC, insertamum DESC, ext_id DESC + LIMIT 1 + ) AS studienstatus + + FROM lehre.tbl_projektarbeit + LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid + LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id + LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid + LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) + LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) + LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz + LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) + LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + LEFT JOIN public.tbl_person betreuer_person ON betreuer_person.person_id = lehre.tbl_projektbetreuer.person_id + LEFT JOIN public.tbl_benutzer betreuer_benutzer ON betreuer_person.person_id = betreuer_benutzer.person_id + LEFT JOIN secondary_betreuer sb ON sb.projektarbeit_id = tbl_projektarbeit.projektarbeit_id + + WHERE (projekttyp_kurzbz = 'Bachelor' OR projekttyp_kurzbz = 'Diplom') + AND student_benutzer.aktiv + AND lehre.tbl_projektbetreuer.betreuerart_kurzbz IN ( + 'Erstbegutachter', 'Begutachter', 'Betreuer', 'Erstbetreuer', 'Senatsvorsitz' + ) + AND public.tbl_studiengang.studiengang_kz = ?"; + + if($benotet == 0) { + $new_qry .= " AND lehre.tbl_projektarbeit.note IS NULL "; + } else if ($benotet == 1) { + $new_qry .= " AND lehre.tbl_projektarbeit.note IS NOT NULL "; + } + + $new_qry .= " ORDER BY tbl_projektarbeit.projektarbeit_id DESC, student_person.nachname ASC ) as tmp"; return $this->execReadOnlyQuery($new_qry, array($studiengang_kz)); } + + public function getProjektarbeitenForStudent($student_uid) { + $new_qry = "WITH secondary_betreuer AS ( + SELECT DISTINCT ON (pb.projektarbeit_id) + pb.projektarbeit_id, + pb.person_id AS zweitbetreuer_person_id, + pb.betreuerart_kurzbz AS zweitbetreuer_betreuerart_kurzbz, + ba.beschreibung AS zweitbetreuer_betreuerart_beschreibung, + p.titelpre AS zweitbetreuer_titelpre, + p.vorname AS zweitbetreuer_vorname, + p.nachname AS zweitbetreuer_nachname, + p.titelpost AS zweitbetreuer_titelpost, + trim( + COALESCE(p.titelpre, '') || ' ' || + COALESCE(p.vorname, '') || ' ' || + COALESCE(p.nachname, '') || ' ' || + COALESCE(p.titelpost, '') + ) AS zweitbetreuer_full_name + FROM lehre.tbl_projektbetreuer pb + JOIN public.tbl_person p ON p.person_id = pb.person_id + LEFT JOIN public.tbl_benutzer b ON b.person_id = p.person_id + LEFT JOIN lehre.tbl_betreuerart ba ON ba.betreuerart_kurzbz = pb.betreuerart_kurzbz + WHERE pb.betreuerart_kurzbz = ANY('{Zweitbetreuer,Zweitbegutachter,Senatsmitglied}') + ORDER BY pb.projektarbeit_id -- DISTINCT ON needs this to be deterministic + ) + + SELECT DISTINCT ON (tmp.projektarbeit_id) + *, + campus.get_betreuer_details(tmp.zweitbetreuer_person_id) AS zweitbetreuer_full_name, + campus.get_betreuer_details(tmp.betreuer_person_id) AS erstbetreuer_full_name + FROM ( + SELECT DISTINCT ON (tbl_projektarbeit.projektarbeit_id) + tbl_projektarbeit.projekttyp_kurzbz, + tbl_projektarbeit.titel, + tbl_projektarbeit.projektarbeit_id, + tbl_studiengang.typ, + tbl_studiengang.kurzbz, + student_benutzer.uid AS student_uid, + student_person.vorname AS student_vorname, + student_person.nachname AS student_nachname, + public.tbl_student.matrikelnr, + tbl_lehreinheit.studiensemester_kurzbz, + betreuer_benutzer.uid AS betreuer_benutzer_uid, + betreuer_person.titelpre AS betreuer_titelpre, + betreuer_person.vorname AS betreuer_vorname, + betreuer_person.nachname AS betreuer_nachname, + betreuer_person.titelpost AS betreuer_titelpost, + lehre.tbl_projektbetreuer.betreuerart_kurzbz AS betreuerart, + lehre.tbl_projektbetreuer.person_id AS betreuer_person_id, + lehre.tbl_projektarbeit.sprache, + lehre.tbl_projektarbeit.seitenanzahl, + lehre.tbl_projektarbeit.kontrollschlagwoerter, + lehre.tbl_projektarbeit.schlagwoerter, + lehre.tbl_projektarbeit.schlagwoerter_en, + lehre.tbl_projektarbeit.abstract, + lehre.tbl_projektarbeit.abstract_en, + lehre.tbl_projektarbeit.insertamum, + lehre.tbl_projektarbeit.note, + + sb.zweitbetreuer_person_id, + sb.zweitbetreuer_betreuerart_kurzbz, + sb.zweitbetreuer_betreuerart_beschreibung, + sb.zweitbetreuer_full_name, + sb.zweitbetreuer_titelpre, + sb.zweitbetreuer_vorname, + sb.zweitbetreuer_nachname, + sb.zweitbetreuer_titelpost, + + ( + SELECT orgform_kurzbz + FROM public.tbl_prestudentstatus + WHERE prestudent_id = ( + SELECT prestudent_id FROM public.tbl_student + WHERE student_uid = student_benutzer.uid LIMIT 1 + ) + ORDER BY datum DESC, insertamum DESC, ext_id DESC + LIMIT 1 + ) AS organisationsform, + ( + SELECT COALESCE(tbl_studienplan.orgform_kurzbz, + tbl_prestudentstatus.orgform_kurzbz, + tbl_studiengang.orgform_kurzbz) + FROM public.tbl_prestudent + JOIN public.tbl_prestudentstatus USING (prestudent_id) + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) + JOIN public.tbl_studiengang USING (studiengang_kz) + LEFT JOIN lehre.tbl_studienplan USING (studienplan_id) + WHERE prestudent_id = public.tbl_student.prestudent_id + ORDER BY tbl_prestudentstatus.datum DESC + LIMIT 1 + ) AS orgform, + ( + SELECT status_kurzbz + FROM public.tbl_prestudentstatus + WHERE prestudent_id = public.tbl_student.prestudent_id + ORDER BY datum DESC, insertamum DESC, ext_id DESC + LIMIT 1 + ) AS studienstatus + + FROM lehre.tbl_projektarbeit + LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid + LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id + LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid + LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) + LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) + LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz + LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) + LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + LEFT JOIN public.tbl_person betreuer_person ON betreuer_person.person_id = lehre.tbl_projektbetreuer.person_id + LEFT JOIN public.tbl_benutzer betreuer_benutzer ON betreuer_person.person_id = betreuer_benutzer.person_id + LEFT JOIN secondary_betreuer sb ON sb.projektarbeit_id = tbl_projektarbeit.projektarbeit_id + + WHERE (projekttyp_kurzbz = 'Bachelor' OR projekttyp_kurzbz = 'Diplom') + AND student_benutzer.aktiv + AND lehre.tbl_projektbetreuer.betreuerart_kurzbz IN ( + 'Erstbegutachter', 'Begutachter', 'Betreuer', 'Erstbetreuer', 'Senatsvorsitz' + ) + AND public.tbl_student.student_uid = ? + ORDER BY tbl_projektarbeit.projektarbeit_id DESC, student_person.nachname ASC + ) as tmp"; + + return $this->execReadOnlyQuery($new_qry, array($student_uid)); + } /** * diff --git a/application/models/education/Studierendenantrag_model.php b/application/models/education/Studierendenantrag_model.php index 677d01f04..c18d18053 100644 --- a/application/models/education/Studierendenantrag_model.php +++ b/application/models/education/Studierendenantrag_model.php @@ -149,6 +149,7 @@ class Studierendenantrag_model extends DB_Model $this->addSelect($this->dbTable . '.grund AS grund'); $this->addSelect('s.studierendenantrag_statustyp_kurzbz status'); $this->addSelect('s.insertvon status_insertvon'); + $this->addSelect('s.grund AS status_grund'); $this->addSelect('t.bezeichnung[(' . $lang . ')] statustyp'); $this->addSelect('p.unruly AS unruly'); $this->addSelect($this->dbTable . '.insertamum AS insertamum'); @@ -187,6 +188,7 @@ class Studierendenantrag_model extends DB_Model * Get the studiengang and ausbildungssemester the student was in * for the studiensemester the antrag was committed for * + * * @param integer $antrag_id * * @return stdClass @@ -241,6 +243,28 @@ class Studierendenantrag_model extends DB_Model ); } + /** + * Get the studiengang and the studienplan the student is in + * + * @param integer $antrag_id + * + * @return stdClass + */ + public function getStgAndDetails($antrag_id) + { + $this->addSelect('p.studiengang_kz'); + $this->addSelect('stg.orgform_kurzbz'); + $this->addSelect('stg.bezeichnung'); + $this->addJoin('public.tbl_prestudent p', 'prestudent_id'); + $this->addJoin('public.tbl_studiengang stg', 'studiengang_kz'); + + $this->addLimit(1); + + return $this->load( + $antrag_id + ); + } + public function getStgEmail($antrag_id) { $this->addJoin('public.tbl_prestudent p', 'prestudent_id'); @@ -269,6 +293,7 @@ class Studierendenantrag_model extends DB_Model $this->addSelect($this->dbTable . '.grund'); $this->addSelect($this->dbTable . '.dms_id'); $this->addSelect('s.insertvon AS status_insertvon'); + $this->addSelect('s.grund AS status_grund'); $this->addSelect( "(SELECT count(1) FROM campus.tbl_studierendenantrag_status WHERE studierendenantrag_id = " . $this->dbTable . diff --git a/application/models/education/Studierendenantragstatus_model.php b/application/models/education/Studierendenantragstatus_model.php index cf9cce1be..354af7491 100644 --- a/application/models/education/Studierendenantragstatus_model.php +++ b/application/models/education/Studierendenantragstatus_model.php @@ -50,7 +50,7 @@ class Studierendenantragstatus_model extends DB_Model $this->addSelect('bezeichnung[(' . $lang . ')] AS typ'); $this->addJoin('campus.tbl_studierendenantrag_statustyp', 'studierendenantrag_statustyp_kurzbz'); - + $this->addOrder($this->dbTable. '.insertamum', 'DESC'); return $this->loadWhere($where); } diff --git a/application/models/education/Zeugnisnote_model.php b/application/models/education/Zeugnisnote_model.php index f32713dec..694c5d5c0 100644 --- a/application/models/education/Zeugnisnote_model.php +++ b/application/models/education/Zeugnisnote_model.php @@ -148,7 +148,7 @@ class Zeugnisnote_model extends DB_Model * * @return object */ - public function getZeugnisnoten($student_uid, $studiensemester_kurzbz) + public function getZeugnisnoten($student_uid, $studiensemester_kurzbz, $lehrveranstaltung_id = null) { $params = array(); $where=''; @@ -163,6 +163,11 @@ class Zeugnisnote_model extends DB_Model $where.=" AND vw_student_lehrveranstaltung.studiensemester_kurzbz= ?"; $params[] = $studiensemester_kurzbz; } + if($lehrveranstaltung_id != null) + { + $where .= " AND vw_student_lehrveranstaltung.lehrveranstaltung_id = ?"; + $params[] = $lehrveranstaltung_id; + } $where2=''; @@ -176,6 +181,11 @@ class Zeugnisnote_model extends DB_Model $where2 .= " AND studiensemester_kurzbz= ?"; $params[] = $studiensemester_kurzbz; } + if($lehrveranstaltung_id != null) + { + $where2 .=" AND lehrveranstaltung_id = ?"; + $params[] = $lehrveranstaltung_id; + } $qry = "SELECT a.*, @@ -188,7 +198,10 @@ class Zeugnisnote_model extends DB_Model lv.semester AS semester_lv, lv.ects AS ects_lv, lv.zeugnis, - lv.bezeichnung_english AS lehrveranstaltung_bezeichnung_english + lv.bezeichnung_english AS lehrveranstaltung_bezeichnung_english, + s.verband, + person.vorname, + person.nachname FROM ( SELECT vw_student_lehrveranstaltung.lehrveranstaltung_id, uid, vw_student_lehrveranstaltung.studiensemester_kurzbz, note, punkte, uebernahmedatum, benotungsdatum, @@ -231,6 +244,8 @@ class Zeugnisnote_model extends DB_Model ORDER BY sort ) a LEFT JOIN public.tbl_student s ON (a.uid = s.student_uid) + LEFT JOIN public.tbl_benutzer benutzer ON benutzer.uid = s.student_uid + LEFT JOIN public.tbl_person person ON benutzer.person_id = person.person_id LEFT JOIN public.tbl_studiengang stg1 ON (s.studiengang_kz = stg1.studiengang_kz) LEFT JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) LEFT JOIN public.tbl_studiengang stg2 ON (lv.studiengang_kz = stg2.studiengang_kz)"; diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index 1db658596..db0996319 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -457,6 +457,7 @@ class Studiengang_model extends DB_Model */ public function getLeitung($studiengang_kz = null) { + $this->addDistinct(); $this->addSelect('uid, studiengang_kz, oe_kurzbz, vorname, nachname, email, titelpre, titelpost, alias'); $this->addJoin('public.tbl_benutzerfunktion', 'oe_kurzbz'); $this->addJoin('public.tbl_benutzer', 'uid'); diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index 5fa6ffb14..1b480771f 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -122,6 +122,47 @@ class Studiensemester_model extends DB_Model return $this->execQuery($query, array($studiensemester_kurzbz, $limit)); } + + /** + * Returns the current study semester and the previous semesters of the same type (SS/WS). + * + * Example: + * - SS2026, limit 3: SS2026, SS2025, SS2024 + * - WS2025, limit 2: WS2025, WS2024 + * + * @param $studiensemester_kurzbz + * @param $limit + */ + public function getPreviousSameSemesterFrom($studiensemester_kurzbz, $limit = 1) + { + $qry = ' + SELECT + studiensemester_kurzbz, + start, + ende + FROM + public.tbl_studiensemester + WHERE + SUBSTRING(studiensemester_kurzbz FROM 1 FOR 2) = SUBSTRING(? FROM 1 FOR 2) + AND start <= ( + SELECT start + FROM public.tbl_studiensemester + WHERE studiensemester_kurzbz = ? + ) + ORDER BY + start DESC + LIMIT ? + '; + + return $this->execQuery($qry, + [ + $studiensemester_kurzbz, + $studiensemester_kurzbz, + $limit + ] + ); + } + /** * getNearest */ @@ -188,6 +229,82 @@ class Studiensemester_model extends DB_Model return $this->execQuery($query, array($date,$date,$date,$date)); } + /** + * Gets all Studiensemester where the range dates are contained + * or the nearest if date is not contained + * @param $from + * @param $to + * @return array|null + */ + public function getContainingOrNearestByDateRange($from, $to) + { + if (date_format(date_create($from), 'Y-m-d') > (date_format(date_create($to), 'Y-m-d'))) + return success(array()); + + $query = <<db->escape($from)}::date BETWEEN s.start AND s.ende + ORDER BY + s.start DESC + LIMIT 1 + ), + semester_interval_enddate AS ( + SELECT + s.* + FROM + public.tbl_studiensemester s + WHERE + {$this->db->escape($to)}::date BETWEEN s.start AND s.ende + ORDER BY + s.start DESC + LIMIT 1 + ), + nearest_semester_interval_startdate AS ( + SELECT + LEAST(ABS(s.start - {$this->db->escape($from)}::date), ABS(s.ende - {$this->db->escape($from)}::date)) AS mindiff, + s.* + FROM + public.tbl_studiensemester s + WHERE + s.ende < {$this->db->escape($from)}::date + ORDER BY + 1 ASC + LIMIT 1 + ), + nearest_semester_interval_enddate AS ( + SELECT + LEAST(ABS(s.start - {$this->db->escape($to)}::date), ABS(s.ende - {$this->db->escape($to)}::date)) AS mindiff, + s.* + FROM + public.tbl_studiensemester s + WHERE + s.start > {$this->db->escape($to)}::date + ORDER BY + 1 ASC + LIMIT 1 + ) + SELECT + COALESCE( + (SELECT studiensemester_kurzbz FROM semester_interval_startdate), + (SELECT studiensemester_kurzbz FROM nearest_semester_interval_startdate) + ) AS studiensemester_kurzbz + UNION + SELECT + COALESCE( + (SELECT studiensemester_kurzbz FROM semester_interval_enddate), + (SELECT studiensemester_kurzbz FROM nearest_semester_interval_enddate) + ) AS studiensemester_kurzbz + +EOSQL; + + return $this->execReadonlyQuery($query); + } + /** * Gets all Studiensemester between two dates * @param $from diff --git a/application/models/person/Benutzerfunktion_model.php b/application/models/person/Benutzerfunktion_model.php index dff422b7d..52236ba7c 100644 --- a/application/models/person/Benutzerfunktion_model.php +++ b/application/models/person/Benutzerfunktion_model.php @@ -260,7 +260,6 @@ class Benutzerfunktion_model extends DB_Model return $this->execQuery($query, $parameters_array); } - /** * Get active Kompetenzfeldleitung bei UID. * @@ -296,7 +295,6 @@ class Benutzerfunktion_model extends DB_Model return $this->execQuery($query, $parameters_array); } - public function insertBenutzerfunktion($Json) { unset($Json['benutzerfunktion_id']); @@ -350,5 +348,64 @@ class Benutzerfunktion_model extends DB_Model return success($funktionJson); } + /** + * Gets all Prestudents with details for a given Benutzerfunktion and optionally semester + * + * @param String $studiensemester_kurzbz + * @return object |null + */ + public function getPrestudentsOfJgv($semester) + { + $query = " + SELECT DISTINCT ps.prestudent_id, bf.datum_von, bf.datum_bis + FROM public.tbl_benutzerfunktion bf + JOIN public.tbl_benutzer bn USING (uid) + JOIN public.tbl_prestudent ps USING (person_id) + JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id) + JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz) + WHERE ss.studiensemester_kurzbz = ? + AND bf.funktion_kurzbz = 'jgv' + AND ( + bf.datum_von <= ss.ende + AND ( + bf.datum_bis >= ss.start + OR bf.datum_bis IS NULL + ) + ) + "; + + return $this->execQuery($query, array($semester)); + } + + /** + * Checks if a certain prestudent has the Benutzerfunktion jgv for a certain semester + * + * @param String $studiensemester_kurzbz + * @param $prestudent_id + * @return object |null + */ + public function isJgv($semester, $prestudent_id) + { + $query = " + SELECT ps.prestudent_id, ss.start as von, ss.ende as bis + FROM public.tbl_benutzerfunktion bf + JOIN public.tbl_benutzer bn USING (uid) + JOIN public.tbl_prestudent ps USING (person_id) + JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id) + JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz) + WHERE ss.studiensemester_kurzbz = ? + AND bf.funktion_kurzbz = 'jgv' + AND ( + bf.datum_von <= ss.ende + AND ( + bf.datum_bis >= ss.start + OR bf.datum_bis IS NULL + ) + ) + AND ps.prestudent_id = ? + "; + + return $this->execQuery($query, array($semester, $prestudent_id)); + } } diff --git a/application/models/person/Notiz_model.php b/application/models/person/Notiz_model.php index 64fce8944..1dc09caaf 100644 --- a/application/models/person/Notiz_model.php +++ b/application/models/person/Notiz_model.php @@ -296,4 +296,59 @@ class Notiz_model extends DB_Model return $this->loadWhere(array('anrechnung_id' => $anrechnung_id)); } + + /** + * check if a given Tag for a certain notizzuordnung id is valid + * + * @param $tag typ_kurzbz to check + * @param $typeId typeId to check + * @param $id id to check + * @param $von start of time period or NULL + * @param $bis end of time period or NULL + * + * @return array + */ + public function checkIfExistingTag($tag, $typeId, $id, $von=null, $bis=null) + { + $query = " + SELECT * + FROM public.tbl_notiz + JOIN public.tbl_notizzuordnung nz USING (notiz_id) + WHERE typ = ? + AND {$typeId} = ? + AND ( + start IS NULL + OR ende IS NULL + OR (start <= ? AND ende >= ?) + ) + "; + + return $this->execQuery($query, [$tag, $id, $bis, $von]); + } + + /** + * returns all existing tags of a certain tag within a time period + * + * @param $tag typ_kurzbz of tag + * @param $von start of time period or NULL + * @param $bis end of time period or NULL + * + * @return array + */ + public function getAllTags($tag, $von=null, $bis=null) + { + $query = " + SELECT * + FROM public.tbl_notiz + JOIN public.tbl_notizzuordnung nz USING (notiz_id) + WHERE typ = ? + AND ( + start IS NULL + OR ende IS NULL + OR (start <= ? AND ende >= ?) + ); + "; + + return $this->execQuery($query, array($tag, $bis, $von)); + } } diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php index e72b24de4..c893c51de 100644 --- a/application/models/person/Person_model.php +++ b/application/models/person/Person_model.php @@ -149,7 +149,7 @@ class Person_model extends DB_Model * @param $filter Term to search for. * @return DB-result */ - public function searchPerson($filter) + public function searchPerson($filter, $mode=null) { $this->addSelect('vorname, nachname, gebdatum, person_id, titelpre, titelpost'); $this->addSelect("CASE @@ -161,6 +161,26 @@ class Person_model extends DB_Model THEN 'Student' ELSE 'Person' END AS status"); + + if($mode == 'mitMaUid') + { + $this->addSelect("( + SELECT m.mitarbeiter_uid + FROM public.tbl_benutzer b + JOIN public.tbl_mitarbeiter m + ON b.uid = m.mitarbeiter_uid + WHERE b.person_id = tbl_person.person_id + LIMIT 1 + ) + AS uid"); + $this->addOrder('uid, lower(nachname), lower(vorname)'); + } + else + { + $this->addOrder('lower(nachname), lower(vorname)'); + } + + $result = $this->loadWhere( 'lower(nachname) like '.$this->db->escape('%'.mb_strtolower($filter).'%')." OR lower(vorname) like ".$this->db->escape('%'.$filter.'%')." @@ -433,4 +453,33 @@ class Person_model extends DB_Model return $this->execReadOnlyQuery($qry, [$person_id]); } + + //just a test function for a person_id tag + //alle personen die innerhalb dieses Zeitraumens 55 werden + public function getFiftyFivers($von, $bis) + { + $qry = " + SELECT + p.person_id + FROM public.tbl_person p + WHERE p.gebdatum >= DATE ? - INTERVAL '55 years' + AND p.gebdatum <= DATE ? - INTERVAL '55 years'; + "; + return $this->execReadOnlyQuery($qry, [$von, $bis]); + } + + //just a test function for a person_id tag + //check if Person gets 55 in this time + public function isFiftyFive($von, $bis, $person_id) + { + $qry = " + SELECT + p.person_id + FROM public.tbl_person p + WHERE p.gebdatum >= DATE ? - INTERVAL '55 years' + AND p.gebdatum <= DATE ? - INTERVAL '55 years' + AND p.persond_id = ?; + "; + return $this->execReadOnlyQuery($qry, [$von, $bis, $person_id]); + } } diff --git a/application/models/ressource/Reservierung_model.php b/application/models/ressource/Reservierung_model.php index 0c391ea20..d96fe2f6f 100644 --- a/application/models/ressource/Reservierung_model.php +++ b/application/models/ressource/Reservierung_model.php @@ -18,10 +18,10 @@ class Reservierung_model extends DB_Model * * @return stdClass */ - public function getReservierungen($start_date, $end_date, $ort_kurzbz = null) + public function getReservierungen($start_date, $end_date, $ort_kurzbz = null, $uid = null) { - - $lvplan_reservierungen_query="SELECT r.* , stund.beginn, stund.ende, + + $lvplan_reservierungen_query = "SELECT r.* , stund.beginn, stund.ende, CASE WHEN r.gruppe_kurzbz IS NOT NULL THEN r.gruppe_kurzbz ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(r.semester AS varchar),'/'),COALESCE(CAST(r.verband AS varchar),'/')) @@ -35,7 +35,7 @@ class Reservierung_model extends DB_Model LEFT JOIN public.tbl_studiensemester ss2 ON slv.studiensemester_kurzbz = ss2.studiensemester_kurzbz AND ss2.start <=r.datum AND ss2.ende >= r.datum WHERE datum >= ? AND datum <= ? AND (ss1.studiensemester_kurzbz IS NOT NULL OR ss2.studiensemester_kurzbz IS NOT NULL)"; - + $raum_reservierungen_query = "SELECT res.*, beginn, ende, CASE WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz @@ -46,9 +46,9 @@ class Reservierung_model extends DB_Model JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde WHERE res.ort_kurzbz = ? AND datum >= ? AND datum <= ?"; - $subquery = is_null($ort_kurzbz)? $lvplan_reservierungen_query:$raum_reservierungen_query; - - $query_result= $this->execReadOnlyQuery(" + $subquery = is_null($ort_kurzbz) ? $lvplan_reservierungen_query : $raum_reservierungen_query; + + $query_result = $this->execReadOnlyQuery(" SELECT 'reservierung' as type, beginn, ende, datum, COALESCE(titel, beschreibung) as topic, @@ -59,15 +59,15 @@ class Reservierung_model extends DB_Model FROM ( - ". $subquery ." + " . $subquery . " ) AS subquery GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung ORDER BY datum, beginn - ", is_null($ort_kurzbz) ?[getAuthUID(), getAuthUID(),$start_date,$end_date]: [$ort_kurzbz, $start_date, $end_date]); + ", is_null($ort_kurzbz) ? [$uid ?? getAuthUID(), $uid ?? getAuthUID(), $start_date, $end_date] : [$ort_kurzbz, $start_date, $end_date]); + - return $query_result; } @@ -76,7 +76,7 @@ class Reservierung_model extends DB_Model * * @return stdClass */ - public function getReservierungenMitarbeiter($start_date, $end_date) + public function getReservierungenMitarbeiter($start_date, $end_date, $uid = null) { $raum_reservierungen_query = "SELECT res.*, beginn, ende, @@ -91,8 +91,8 @@ class Reservierung_model extends DB_Model $subquery = $raum_reservierungen_query; - - $query_result= $this->execReadOnlyQuery(" + + $query_result = $this->execReadOnlyQuery(" SELECT 'reservierung' as type, beginn, ende, datum, COALESCE(titel, beschreibung) as topic, @@ -103,13 +103,13 @@ class Reservierung_model extends DB_Model FROM ( - ". $subquery ." + " . $subquery . " ) AS subquery GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung ORDER BY datum, beginn - ", [getAuthUID(), $start_date, $end_date]); + ", [$uid ?? getAuthUID(), $start_date, $end_date]); return $query_result; @@ -129,10 +129,21 @@ class Reservierung_model extends DB_Model $this->addJoin('public.tbl_studiensemester ss2', 'slv.studiensemester_kurzbz=ss2.studiensemester_kurzbz AND ss2.start<=r.datum AND ss2.ende>=r.datum', 'LEFT'); $this->db->or_where('ss1.studiensemester_kurzbz IS NOT NULL', null, false); $this->db->or_where('ss2.studiensemester_kurzbz IS NOT NULL', null, false); - + $query = $this->db->get_compiled_select('campus.vw_reservierung r'); - + return $this->execQuery($query, [$uid, $uid]); } + public function lektorHasReservierung($uid, $datum, $stunde) + { + $qry = "SELECT reservierung_id, uid, stg_kurzbz, ort_kurzbz, semester, verband, gruppe, gruppe_kurzbz, datum, stunde + FROM lehre.vw_reservierung + WHERE uid = ? + AND datum = ? + AND stunde = ?"; + + return $this->execReadOnlyQuery($qry, [$uid, $datum, $stunde]); + } + } diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index d0a97ed9d..0f51e4b71 100644 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -333,6 +333,68 @@ class Stundenplan_model extends DB_Model ", [$start_date, $end_date, $lv_id]); } + public function getStundenplanLE($lehreinheit, $start_date, $end_date, $stundenplan) + { + $qry = " + WITH lehreinheiten AS ( + SELECT lehreinheit_id FROM lehre.tbl_lehreinheit WHERE lehreinheit_id = ? + ), " . $this->getStundenplanCTE($stundenplan) . " + SELECT * + FROM stundenplanentries + "; + + return $this->execReadOnlyQuery($qry, array($lehreinheit, $start_date, $end_date)); + } + + public function getStundenplanLV($lehrveranstaltung_id, $start_date, $end_date, $stundenplan) + { + $qry = " + WITH lehreinheiten AS ( + SELECT lehreinheit_id + FROM lehre.tbl_lehreinheit + JOIN tbl_studiensemester USING(studiensemester_kurzbz) + WHERE lehrveranstaltung_id = ? + AND tbl_studiensemester.start >= ? AND tbl_studiensemester.ende <= ? + ), " . $this->getStundenplanCTE($stundenplan) . " + SELECT * + FROM stundenplanentries + "; + + return $this->execReadOnlyQuery($qry, array($lehrveranstaltung_id, $start_date, $end_date, $start_date, $end_date)); + } + + private function getStundenplanCTE($stundenplan) + { + return "entries AS ( + SELECT + datum, min(stunde) as stunde_beginn, max(stunde) as stunde_ende, + array_agg(DISTINCT( + CASE WHEN gruppe_kurzbz is not null THEN gruppe_kurzbz + ELSE (UPPER(stg_typ || stg_kurzbz) || COALESCE(semester,'0') || COALESCE(verband,'') || COALESCE(gruppe,'')) + END)) as gruppen_kuerzel, + array_agg(DISTINCT CONCAT(vorname || ' ' || nachname)) as lektorname, + array_agg(DISTINCT stundenplan.ort_kurzbz) as ort_kurzbz, + array_agg(DISTINCT titel) as titel, + lehrfach_bez, stundenplan.lehreinheit_id, lehrveranstaltung_id + FROM lehre.vw_$stundenplan as stundenplan + JOIN public.tbl_mitarbeiter ON stundenplan.uid = tbl_mitarbeiter.mitarbeiter_uid + JOIN tbl_benutzer ON tbl_mitarbeiter.mitarbeiter_uid = tbl_benutzer.uid + JOIN tbl_person USING(person_id) + JOIN lehreinheiten ON stundenplan.lehreinheit_id = lehreinheiten.lehreinheit_id + WHERE datum >= ? AND datum <= ? + GROUP BY datum, unr, stundenplan.lehreinheit_id, lehrveranstaltung_id, lehrfach_bez, lehrfach_bez + ORDER BY datum, min(stunde), unr, lehreinheit_id + ), + stundenplanentries AS ( + SELECT + entries.*, + stundeb.beginn AS beginn, + stundee.ende AS ende + FROM entries + JOIN lehre.tbl_stunde stundeb ON stundeb.stunde = entries.stunde_beginn + JOIN lehre.tbl_stunde stundee ON stundee.stunde = entries.stunde_ende + )"; + } /** * queries Stundenplan and filters by assigned ma_kurzbz, very similar to get by LVA * @@ -388,6 +450,84 @@ class Stundenplan_model extends DB_Model ORDER BY datum, beginn", [$start_date, $end_date, $ma_uid]); } + + /** + * queries Stundenplan and filters by studiengang, semester, verband gruppe + * + * @return void + */ + public function getStundenplanStudiengang($start_date, $end_date, $stg_kz, $sem, $verband, $gruppe) { + + $qry_params = [$start_date, $end_date, $stg_kz]; + + $qry = " + SELECT + 'lehreinheit' as type, beginn, ende, datum, + CONCAT(lehrfach,'-',lehrform) as topic, + array_agg(DISTINCT lektor) as lektor, + array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe, + string_agg(DISTINCT ort_kurzbz, '/') as ort_kurzbz, + array_agg(DISTINCT lehreinheit_id) as lehreinheit_id, + titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id + FROM + ( + SELECT unr,datum,beginn, ende, + CASE + WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz + ELSE sp.lektor + END as lektor, + CASE + WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz + ELSE CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/')) + END as gruppen_kuerzel, + (SELECT bezeichnung + FROM public.tbl_organisationseinheit + WHERE oe_kurzbz IN( + SELECT oe_kurzbz + FROM lehre.tbl_lehrveranstaltung + WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id + )) as organisationseinheit, + sp.ort_kurzbz, sp.studiengang_kz, sp.titel,sp.lehreinheit_id,sp.lehrfach_id,sp.anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz + FROM ( + SELECT sp.* + FROM lehre.vw_stundenplan sp + WHERE + sp.datum >= ? + AND sp.datum <= ? + ) sp + JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde + WHERE studiengang_kz = ? "; + + if($sem != NULL) + { + $qry_params[] = $sem; + $qry .= " AND (semester = ? OR semester IS NULL)"; + } + if($verband != NULL) + { + $qry_params[] = $verband; + $qry .= " AND (verband = ? OR verband IS NULL OR verband = '0' OR verband = '')"; + } + if($gruppe != NULL) + { + $qry_params[] = $gruppe; + $qry .= " AND (gruppe = ? OR gruppe IS NULL OR gruppe = '0' OR gruppe = '') "; + } + $qry.= " AND ( + gruppe_kurzbz is null OR EXISTS( + SELECT 1 + FROM + public.tbl_gruppe WHERE gruppe_kurzbz = sp.gruppe_kurzbz AND direktinskription = false + ) + )"; + + $qry.= " ) as subquery + + GROUP BY unr, datum, beginn, ende, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id + ORDER BY datum, beginn; "; + + return $this->execReadOnlyQuery($qry, $qry_params); + } /** * NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester. @@ -464,11 +604,17 @@ class Stundenplan_model extends DB_Model { foreach($semester_date_range as $sem_date => $sem_date_range) { - if(!array_key_exists($sem_date,$studentlehrverbaende) || count($studentlehrverbaende[$sem_date]) == 0) + if(!array_key_exists($sem,$studentlehrverbaende) || count($studentlehrverbaende[$sem]) == 0) { continue; } - foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband) + $studlvbds = array_filter( + $studentlehrverbaende[$sem], + function($value) use ($sem_date) { + return $value->studiensemester_kurzbz === $sem_date; + } + ); + foreach($studlvbds as $key=>$lehrverband) { $query .= "(((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")"; // Eintraege fuer den ganzen Verband diff --git a/application/models/ressource/Stundenplandev_model.php b/application/models/ressource/Stundenplandev_model.php index e718ba073..355283b90 100644 --- a/application/models/ressource/Stundenplandev_model.php +++ b/application/models/ressource/Stundenplandev_model.php @@ -241,4 +241,15 @@ class Stundenplandev_model extends DB_Model return $this->delete(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid)); } + + public function lektorHasStundenplandevEintrag($uid, $datum, $stunde) + { + $qry = "SELECT stundenplandev_id, lektor, stg_kurzbz, ort_kurzbz, semester, verband, gruppe, gruppe_kurzbz, datum, stunde + FROM lehre.vw_stundenplandev + WHERE uid = ? + AND datum = ? + AND stunde = ?"; + + return $this->execReadOnlyQuery($qry, [$uid, $datum, $stunde]); + } } diff --git a/application/models/ressource/Zeitsperre_model.php b/application/models/ressource/Zeitsperre_model.php index 078d29d8b..50ba4cb1d 100644 --- a/application/models/ressource/Zeitsperre_model.php +++ b/application/models/ressource/Zeitsperre_model.php @@ -61,4 +61,40 @@ class Zeitsperre_model extends DB_Model return $this->execQuery($qry); } + + public function checkIfZeitsperreExists($uid, $datum, $stunde) + { + $this->db->select("*"); + + $this->db->where('mitarbeiter_uid', $uid); + $this->db->where('zeitsperretyp_kurzbz !=', 'ZVerfueg'); + + $this->db->group_start(); + + $this->db->where('vondatum <', $datum); + $this->db->or_group_start(); + $this->db->where('vondatum', $datum); + $this->db->group_start(); + $this->db->where('vonstunde <=', $stunde); + $this->db->or_where('vonstunde IS NULL', null, false); + $this->db->group_end(); + $this->db->group_end(); + $this->db->group_end(); + + + $this->db->group_start(); + $this->db->where('bisdatum >', $datum); + $this->db->or_group_start(); + $this->db->where('bisdatum', $datum); + $this->db->group_start(); + $this->db->where('bisstunde >=', $stunde); + $this->db->or_where('bisstunde IS NULL', null, false); + $this->db->group_end(); + + $this->db->group_end(); + $this->db->group_end(); + + return $this->load(); + + } } diff --git a/application/models/tabulator/Tabulator_preset_model.php b/application/models/tabulator/Tabulator_preset_model.php new file mode 100644 index 000000000..a3c45739d --- /dev/null +++ b/application/models/tabulator/Tabulator_preset_model.php @@ -0,0 +1,83 @@ +dbTable = 'public.tbl_tabulator_presets'; + $this->pk = ['preset_id']; + $this->hasSequence = true; + + + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + } + + public function getTabulatorPreset($presetId) + { + $query = " + SELECT * + FROM public.tbl_tabulator_presets + WHERE preset_id = ? + LIMIT 1 + "; + return $this->execQuery($query, array($presetId)); + } + + public function getTabulatorPresetsByUserAndTable($uid, $tableName) + { + $query = ' + SELECT * + FROM public.tbl_tabulator_presets + WHERE benutzer_uid = ? + AND table_name = ? + ORDER BY preset_id ASC + '; + return $this->execQuery($query, array($uid, $tableName)); + } + + public function createTabulatorPreset($uid, $tableName, $presetName, $preset) + { + $presetCreationResult = $this->insert([ + "benutzer_uid" => $uid, + "table_name" => $tableName, + "preset_name" => $presetName, + "preset_json" => json_encode($preset), + ]); + + if (isError($presetCreationResult)) + { + return error('Something went wrong during preset creation!'); + } + + return success($presetCreationResult->retval); + } + + public function updateTabulatorPreset($presetId, $preset) + { + $presetUpdateResult = $this->update(["preset_id" => $presetId], ["preset_json" => json_encode($preset)]); + + if (isError($presetUpdateResult)) + { + return error('Something went wrong during preset update!'); + } + + return success($presetUpdateResult->retval); + } + + public function deleteTabulatorPreset($presetId) + { + $presetDeletionReseult = $this->delete(["preset_id" => $presetId]); + + if (isError($presetDeletionReseult)) + { + return error('Something went wrong during preset deletion!'); + } + + return success($presetDeletionReseult->retval); + } + +} diff --git a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php index 2669105a1..3918e98e1 100644 --- a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php @@ -41,6 +41,7 @@ with gbt as ( gb.anmerkung, gb.dienstverhaeltnis_id, gb.gehaltstyp_kurzbz, + gb.gehaltsanpassungtyp_kurzbz, gb.valorisierungssperre, gb.valorisierung, gb.grundbetrag as grund_betrag_decrypted, @@ -76,11 +77,13 @@ select gbt.anmerkung, gbt.dienstverhaeltnis_id, gbt.gehaltstyp_kurzbz, + gbt.gehaltsanpassungtyp_kurzbz, gbt.valorisierungssperre, gbt.valorisierung, gbt.grund_betrag_decrypted, gbt.betrag_val_decrypted, gt.bezeichnung as gehaltstyp_bezeichnung, + ga.bezeichnung as gehaltsanpassungtyp_bezeichnung, vb.vertragsbestandteiltyp_kurzbz, bf.funktion_kurzbz, bf.oe_kurzbz, @@ -93,6 +96,8 @@ from gbt LEFT JOIN hr.tbl_gehaltstyp gt using(gehaltstyp_kurzbz) +LEFT JOIN + hr.tbl_gehaltsanpassungtyp ga using(gehaltsanpassungtyp_kurzbz) LEFT JOIN hr.tbl_vertragsbestandteil vb using(vertragsbestandteil_id) LEFT JOIN @@ -177,7 +182,8 @@ LEFT JOIN $stichtagclause .= ')'; } - $this->addSelect('*'); + $this->addSelect('tbl_gehaltsbestandteil.*, tbl_gehaltstyp.bezeichnung AS gehaltstyp_bezeichnung'); + $this->addJoin('hr.tbl_gehaltstyp', 'gehaltstyp_kurzbz'); $where = <<escape($dienstverhaeltnis_id)} {$stichtagclause} @@ -202,6 +208,7 @@ SELECT g.dienstverhaeltnis_id, g.vertragsbestandteil_id, g.gehaltstyp_kurzbz, + g.gehaltsanpassungtyp_kurzbz, g.von, g.bis, g.anmerkung, @@ -213,9 +220,11 @@ SELECT g.updateamum, g.updatevon, g.valorisierung, - g.auszahlungen + g.auszahlungen, + gt.bezeichnung AS gehaltstyp_bezeichnung FROM - hr.tbl_gehaltsbestandteil g + hr.tbl_gehaltsbestandteil g + JOIN hr.tbl_gehaltstyp gt USING (gehaltstyp_kurzbz) LEFT JOIN hr.tbl_valorisierung_historie vh ON vh.gehaltsbestandteil_id = g.gehaltsbestandteil_id AND vh.valorisierungsdatum = ( SELECT @@ -263,7 +272,7 @@ EOSQL; // Note: replaced gb.betrag_valorisiert with vh.betrag_valorisiert! $qry = " SELECT - gb.gehaltsbestandteil_id,gb.dienstverhaeltnis_id,gb.vertragsbestandteil_id,gb.gehaltstyp_kurzbz, + gb.gehaltsbestandteil_id,gb.dienstverhaeltnis_id,gb.vertragsbestandteil_id,gb.gehaltstyp_kurzbz,gb.gehaltsanpassungtyp_kurzbz, gb.von,gb.bis,gb.anmerkung,gb.grundbetrag as grundbetrag,gb.valorisierungssperre,gb.insertamum, gb.insertvon,gb.updateamum,gb.updatevon,gb.valorisierung,gb.auszahlungen, vh.valorisierungsdatum, vh.betrag_valorisiert as betrag_valorisiert diff --git a/application/views/Cis/Abgabetool.php b/application/views/Cis/Abgabetool.php index 86e8721f2..469bc8110 100644 --- a/application/views/Cis/Abgabetool.php +++ b/application/views/Cis/Abgabetool.php @@ -38,7 +38,7 @@ $includesArray = array( $this->load->view('templates/FHC-Header', $includesArray); ?> -
+
uid= student_uid_prop="" stg_kz_prop="" diff --git a/application/views/CisRouterView/CisRouterView.php b/application/views/CisRouterView/CisRouterView.php index 6ff428362..c51ca40c3 100644 --- a/application/views/CisRouterView/CisRouterView.php +++ b/application/views/CisRouterView/CisRouterView.php @@ -23,12 +23,14 @@ $includesArray = array( 'public/css/components/FormUnderline.css', 'public/css/components/abgabetool/abgabe.css', 'public/css/Cis4/Cms.css', - 'public/css/Cis4/Studium.css', + 'public/css/Cis4/Studium.css' ), 'customJSs' => array( 'vendor/npm-asset/primevue/accordion/accordion.min.js', 'vendor/npm-asset/primevue/accordiontab/accordiontab.min.js', 'vendor/npm-asset/primevue/checkbox/checkbox.min.js', + 'vendor/npm-asset/primevue/chips/chips.min.js', + 'vendor/npm-asset/primevue/multiselect/multiselect.min.js', 'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js', 'vendor/npm-asset/primevue/speeddial/speeddial.min.js', 'vendor/npm-asset/primevue/textarea/textarea.min.js', @@ -39,7 +41,7 @@ $includesArray = array( 'vendor/moment/luxonjs/luxon.min.js' ), 'customJSModules' => array( - 'public/js/apps/Dashboard/Fhc.js', + 'public/js/apps/Cis/Cis.js', ), ); @@ -47,8 +49,6 @@ $includesArray = array( $this->load->view('templates/CISVUE-Header', $includesArray); ?>
> - +
load->view('templates/CISVUE-Footer', $includesArray); ?> 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="" :permissions="" :config="" + avatar-url="" + logout-url="" > 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/Leitung/List.php b/application/views/lehre/Antrag/Leitung/List.php index 1225b16b6..e7d3a47f1 100644 --- a/application/views/lehre/Antrag/Leitung/List.php +++ b/application/views/lehre/Antrag/Leitung/List.php @@ -44,6 +44,7 @@ $this->load->view( diff --git a/application/views/lehre/Antrag/Student/List.php b/application/views/lehre/Antrag/Student/List.php index 6d769dafe..884d1f391 100644 --- a/application/views/lehre/Antrag/Student/List.php +++ b/application/views/lehre/Antrag/Student/List.php @@ -30,6 +30,12 @@ if(defined('CIS4')){ } ?> +load->config('studierendenantrag'); + $showInfoModalAbmeldung = $this->config->item('showInfoModalAbmeldung'); +?> +
@@ -43,17 +49,75 @@ if(defined('CIS4')){

()

+
-

p->t('studierendenantrag', 'calltoaction_' . $type); ?>

-
- - p->t('studierendenantrag', 'antrag_typ_' . $type); ?> - +

p->t('studierendenantrag', 'calltoaction_' . $type); ?>

+
+ + + + data-bs-toggle="modal" + + > + p->t('studierendenantrag', 'antrag_typ_' . $type); ?> + + + +
- + + + + @@ -205,7 +269,7 @@ if(defined('CIS4')){ p->t('studierendenantrag', 'my_lvs'); ?> diff --git a/application/views/system/infocenter/infocenterData.php b/application/views/system/infocenter/infocenterData.php index ebfd1db37..d1ce87422 100644 --- a/application/views/system/infocenter/infocenterData.php +++ b/application/views/system/infocenter/infocenterData.php @@ -315,22 +315,15 @@ WHERE tpl.app = '.$APP.' ) pl USING(person_id) LEFT JOIN ( - SELECT + SELECT DISTINCT ON (tbl_rueckstellung.person_id) tbl_rueckstellung.person_id, tbl_rueckstellung.datum_bis, tbl_rueckstellung.status_kurzbz, array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung FROM public.tbl_rueckstellung JOIN public.tbl_rueckstellung_status USING(status_kurzbz) - JOIN public.tbl_person sp ON tbl_rueckstellung.person_id = sp.person_id - WHERE tbl_rueckstellung.rueckstellung_id = - ( - SELECT srueck.rueckstellung_id - FROM public.tbl_rueckstellung srueck - WHERE srueck.person_id = tbl_rueckstellung.person_id - AND datum_bis >= NOW() - ORDER BY srueck.datum_bis DESC LIMIT 1 - ) + WHERE tbl_rueckstellung.datum_bis >= NOW() + ORDER BY tbl_rueckstellung.person_id, tbl_rueckstellung.datum_bis DESC ) rueck ON rueck.person_id = p.person_id WHERE EXISTS ( diff --git a/application/views/system/infocenter/onboardingData.php b/application/views/system/infocenter/onboardingData.php index 5ee66fdde..bf126f283 100644 --- a/application/views/system/infocenter/onboardingData.php +++ b/application/views/system/infocenter/onboardingData.php @@ -24,22 +24,15 @@ $query = ' WHERE tpl.app = '.$APP.' ) pl ON p.person_id = pl.person_id LEFT JOIN ( - SELECT + SELECT DISTINCT ON (tbl_rueckstellung.person_id) tbl_rueckstellung.person_id, tbl_rueckstellung.datum_bis, tbl_rueckstellung.status_kurzbz, array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung FROM public.tbl_rueckstellung - JOIN public.tbl_rueckstellung_status USING(status_kurzbz) - JOIN public.tbl_person sp ON tbl_rueckstellung.person_id = sp.person_id - WHERE tbl_rueckstellung.rueckstellung_id = - ( - SELECT srueck.rueckstellung_id - FROM public.tbl_rueckstellung srueck - WHERE srueck.person_id = tbl_rueckstellung.person_id - AND datum_bis >= NOW() - ORDER BY srueck.datum_bis DESC LIMIT 1 - ) + JOIN public.tbl_rueckstellung_status USING(status_kurzbz) + WHERE tbl_rueckstellung.datum_bis >= NOW() + ORDER BY tbl_rueckstellung.person_id, tbl_rueckstellung.datum_bis DESC ) rueck ON rueck.person_id = p.person_id WHERE p.person_id NOT IN (SELECT person_id FROM public.tbl_prestudent)'; diff --git a/application/views/templates/CISVUE-Footer.php b/application/views/templates/CISVUE-Footer.php index d7c1de24c..eae2a94ff 100644 --- a/application/views/templates/CISVUE-Footer.php +++ b/application/views/templates/CISVUE-Footer.php @@ -6,7 +6,7 @@ $includesArray = array( 'fontawesome6' => true, 'axios027' => true, 'customJSModules' => array_merge([ - 'public/js/apps/Cis.js' + 'public/js/apps/Cis/Menu.js' ], $customJSModules ?? []), 'customCSSs' => array_merge([ 'public/css/Cis4/Cis.css' diff --git a/application/views/templates/CISVUE-Header.php b/application/views/templates/CISVUE-Header.php index 804a43821..d98cbc9cd 100644 --- a/application/views/templates/CISVUE-Header.php +++ b/application/views/templates/CISVUE-Header.php @@ -8,7 +8,7 @@ $includesArray = array( 'axios027' => true, 'primevue3' => true, 'customJSModules' => array_merge([ - 'public/js/apps/Cis.js' + 'public/js/apps/Cis/Menu.js' ], $customJSModules ?? []), 'customCSSs' => array_merge([ 'public/css/Cis4/Cis.css', diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index d2eb229f1..66ed4bd51 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -154,6 +154,7 @@ generateJSsInclude('vendor/npm-asset/primevue/confirmdialog/confirmdialog.min.js'); generateJSsInclude('vendor/npm-asset/primevue/confirmationservice/confirmationservice.min.js'); generateJSsInclude('vendor/npm-asset/primevue/tieredmenu/tieredmenu.min.js'); + generateJSsInclude('vendor/npm-asset/primevue/progressbar/progressbar.min.js'); } if($vuedatepicker11) generateJSsInclude('vendor/vuejs/vuedatepicker_js11/vue-datepicker.iife.js'); diff --git a/application/views/templates/FHC-Header.php b/application/views/templates/FHC-Header.php index 7b53cbf5d..4203aa571 100644 --- a/application/views/templates/FHC-Header.php +++ b/application/views/templates/FHC-Header.php @@ -132,7 +132,11 @@ if ($cis === true) generateCSSsInclude(defined('CIS4') ? 'public/css/cis4.css' : 'public/css/cis_bs5.css'); //Tags - if ($tags === true) generateCSSsInclude('public/css/tags.css'); + if ($tags === true) + { + generateCSSsInclude('public/css/tags.css'); + generateCSSsIncludeIfExtensionCssExists('tags.css'); + } $extapphelper = ExtendableAppsHelper::getInstance(); $extapphelper->init($customCSSs, $customJSs, $customJSModules); diff --git a/cis/private/lehre/notenliste.xls.php b/cis/private/lehre/notenliste.xls.php index 25f353c12..52b18b056 100644 --- a/cis/private/lehre/notenliste.xls.php +++ b/cis/private/lehre/notenliste.xls.php @@ -36,6 +36,7 @@ require_once('../../../include/notenschluessel.class.php'); require_once('../../../include/Excel/excel.php'); require_once('../../../include/phrasen.class.php'); require_once('../../../include/pruefung.class.php'); +require_once('../../../include/benutzerberechtigung.class.php'); $uid = get_uid(); @@ -44,7 +45,7 @@ $uid = get_uid(); $sprache = getSprache(); $p = new phrasen($sprache); -if(!check_lektor($uid)) +if (!check_lektor($uid)) die('Sie haben keine Berechtigung fuer diese Seite'); if (!$db = new basis_db()) @@ -90,6 +91,21 @@ if(isset($_GET['lehreinheit_id'])) else $lehreinheit_id = ''; +// Permissions +$berechtigung = new benutzerberechtigung(); +$berechtigung->getBerechtigungen($uid); + +// LV load +$lvobj = new lehrveranstaltung($lvid); + +// Check permissions +if (!$berechtigung->isBerechtigt('admin') + && !$berechtigung->isBerechtigt('assistenz') + && !$berechtigung->isBerechtigt('lehre', $lvobj->oe_kurzbz, 's') + && !check_lektor_lehrveranstaltung($uid, $lvid, $stsem) +) + die('Sie haben keine Berechtigung fuer diese Seite'); + /* * Create Excel File */ @@ -143,8 +159,6 @@ else // let's merge $format_title->setAlign('merge'); - $lvobj = new lehrveranstaltung($lvid); - $worksheet->write(0,0,$p->t('anwesenheitsliste/notenliste')." ".($sprache=='English'?$lvobj->bezeichnung_english:$lvobj->bezeichnung),$format_bold); $stg_obj = new studiengang($stg); diff --git a/cis/testtool/frage.php b/cis/testtool/frage.php index a5f4100c9..5a5aaaa18 100644 --- a/cis/testtool/frage.php +++ b/cis/testtool/frage.php @@ -80,9 +80,17 @@ echo ' + + +