diff --git a/application/config/Events.php b/application/config/Events.php index 191a1eb98..80a8f03b3 100644 --- a/application/config/Events.php +++ b/application/config/Events.php @@ -3,12 +3,35 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); use CI3_Events as Events; -/** - * NOTE(chris): example: - Events::on('stv_conf_student', function (&$res) { - $res['test'] = [ - 'title' => 'TEST', - 'component' => './Stv/Studentenverwaltung/Details/Notizen.js' - ]; - }); - */ +Events::on('loadRenderers', function ($renderers) { + $fhc_core_renderers =& $renderers(); + $fhc_core_renderers["lehreinheit"] = array( + 'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js'), + 'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js'), + 'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalContent.js'), + 'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css' + ); +}); + +Events::on('loadRenderers', function ($renderers) { + $fhc_core_renderers =& $renderers(); + $fhc_core_renderers["reservierung"] = array( + 'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js'), + 'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalTitle.js'), + 'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalContent.js'), + 'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css' + ); +}); + +Events::on('loadRenderers', function ($renderers) { + $fhc_core_renderers =& $renderers(); + $fhc_core_renderers["ferien"] = array( + 'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/calendarEvent.js'), + 'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalTitle.js'), + 'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalContent.js'), + 'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css' + ); +}); + + + diff --git a/application/config/abgabe.php b/application/config/abgabe.php new file mode 100644 index 000000000..82782b043 --- /dev/null +++ b/application/config/abgabe.php @@ -0,0 +1,43 @@ + cis4 +$config['URL_STUDENTS'] = 'cis.php/Cis/Abgabetool/Student'; +// used as APP_ROOT.URL_MITARBEITER -> old cis +$config['URL_MITARBEITER'] = 'index.ci.php/Cis/Abgabetool/Mitarbeiter'; +// used as APP_ROOT.URL_MITARBEITER -> old cis +$config['URL_ASSISTENZ'] = 'index.ci.php/Cis/Abgabetool/Assistenz'; + +// lehre.tbl_paabgabetyp bezeichnung +//$config['ALLOWED_ABGABETYPEN_BETREUER'] = ['Zwischenabgabe', 'Quality Gate 1', 'Quality Gate 2']; +$config['ALLOWED_ABGABETYPEN_BETREUER'] = ['abstract','zwischen', 'qualgate1', 'qualgate2']; // tbl_paabgabetyp pk +// paabgabetypen for which betreuer is benachrichtigt via sammelmail +$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_BETREUER'] = ['qualgate1', 'qualgate2', 'end']; +// paabgabetypen for which assistenz is benachrichtigt via sammelmail +$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'] = ['end']; +// paabgabetypen for which student is benachrichtigt via sammelmail -> basically all of them but still defined for consistency +$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_STUDENT'] = ['qualgate1', 'qualgate2', 'zwischen', 'note', 'abstract', 'end', 'enda']; +//$config['ALLOWED_NOTEN_ABGABETOOL'] = ['Bestanden', 'Nicht bestanden']; +$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['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'; + +$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'; + +$config['ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'] = true; +$config['ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'] = true; diff --git a/application/config/calendar.php b/application/config/calendar.php new file mode 100644 index 000000000..99bb9b2c6 --- /dev/null +++ b/application/config/calendar.php @@ -0,0 +1,6 @@ +/public/.htaccess_sample for details +$config['use_fhcomplete_build_version_in_path'] = false; diff --git a/application/config/lvverwaltung.php b/application/config/lvverwaltung.php new file mode 100644 index 000000000..4fe09bff3 --- /dev/null +++ b/application/config/lvverwaltung.php @@ -0,0 +1,11 @@ + ['readonly' => false], + 'tag_1' => ['readonly' => true] +]; +*/ + +$config['lvverwaltung_tags'] = []; \ No newline at end of file diff --git a/application/config/navigation.php b/application/config/navigation.php index 2327513ad..f7ba8dca3 100644 --- a/application/config/navigation.php +++ b/application/config/navigation.php @@ -64,7 +64,7 @@ $config['navigation_header'] = array( 'lehrveranstaltungen' => array( 'link' => site_url('lehre/lvplanung/LvTemplateUebersicht'), 'icon' => '', - 'description' => 'Lehrveranstaltungen', + 'description' => 'Lehrveranstaltungen Templates', 'sort' => 15 ), 'reihungstest' => array( @@ -81,6 +81,16 @@ $config['navigation_header'] = array( 'sort' => 30, 'requiredPermissions' => 'infocenter:r' ), + 'lvverwaltung' => array( + 'link' => site_url('LVVerwaltung'), + 'icon' => '', + 'description' => 'LV Verwaltung', + 'requiredPermissions' => array( + 'admin:r', + 'assistenz:r' + ), + 'sort' => 35 + ), 'lehrauftrag' => array( 'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'), 'description' => 'Lehrauftrag', @@ -93,7 +103,7 @@ $config['navigation_header'] = array( ), 'zverfueg' => array( 'link' => site_url('lehre/lvplanung/AdminZeitverfuegbarkeit'), - 'description' => 'Zeitverfügbarkeit', + 'description' => 'Zeitverfügbarkeit', 'expand' => true, 'sort' => 45, 'requiredPermissions' => array( @@ -325,4 +335,25 @@ $config['navigation_menu']['system/issues/Issues/*'] = array( 'target' => '_blank', 'requiredPermissions' => array('admin:rw') ), -); \ No newline at end of file +); + +$config['navigation_menu']['apps'] = [ + 'stv' => [ + 'link' => site_url('studentenverwaltung'), + 'description' => 'Studierendenverwaltung', + #'icon' => 'users', + 'requiredPermissions' => array('admin:r', 'assistenz:r') + ], + 'lvv' => [ + 'link' => site_url('lVVerwaltung'), + 'description' => 'LV Verwaltung', + #'icon' => 'person-chalkboard', + 'requiredPermissions' => array('admin:r', 'assistenz:r') + ], + 'lav' => [ + 'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'), + 'description' => 'Lehraufträge', + #'icon' => 'person-chalkboard', + 'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:r') + ] +]; diff --git a/application/config/raumsuche.php b/application/config/raumsuche.php new file mode 100644 index 000000000..afc4beaf8 --- /dev/null +++ b/application/config/raumsuche.php @@ -0,0 +1,25 @@ + my_controller/my_method */ $route['default_controller'] = defined('CIS4') && CIS4 ? 'Cis4' : 'Vilesci'; -$route['translate_uri_dashes'] = FALSE; +$route['translate_uri_dashes'] = false; // Class name conflicts $route['api/v1/organisation/[S|s]tudiengang/(:any)'] = 'api/v1/organisation/studiengang2/$1'; @@ -61,26 +61,88 @@ $route['api/v1/organisation/[O|o]rganisationseinheit/(:any)'] = 'api/v1/organisa $route['api/v1/ressource/[B|b]etriebsmittelperson/(:any)'] = 'api/v1/ressource/betriebsmittelperson2/$1'; $route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1'; -$route['Cis/Stundenplan/.*'] = 'Cis/Stundenplan/index/$1'; +$route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1'; +$route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1'; +$route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1'; -// load routes from extensions -$subdir = 'application/config/extensions'; -$dirlist = scandir($subdir); +$route['Abgabetool/Assistenz'] = 'Cis/Abgabetool/Assistenz'; +$route['Abgabetool/Assistenz/(:any)'] = 'Cis/Abgabetool/Assistenz/$1'; +$route['Abgabetool/Mitarbeiter'] = 'Cis/Abgabetool/Mitarbeiter'; +$route['Abgabetool/Student'] = 'Cis/Abgabetool/Student'; +$route['Abgabetool/Student/(:any)'] = 'Cis/Abgabetool/Student/$1'; +$route['Abgabetool/Deadlines'] = 'Cis/Abgabetool/Deadlines'; -if ($dirlist) +// 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'; + +// (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'; + +// (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'; + +// (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'; + +// (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'; + +// (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'; + +// (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'; + +// (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'; + +// // (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']; + +foreach($subdirs as $subdir) { - $files = array_diff($dirlist, array('.','..')); - - foreach ($files as &$item) + if(is_dir($subdir)) { - if (is_dir($subdir . DIRECTORY_SEPARATOR . $item)) + $dirlist = scandir($subdir); + if ($dirlist) { - $routes_file = $subdir . DIRECTORY_SEPARATOR . $item . DIRECTORY_SEPARATOR . 'routes.php'; + $files = array_diff($dirlist, array('.','..')); - if (file_exists($routes_file)) + foreach ($files as &$item) { - require($routes_file); + if (is_dir($subdir . DIRECTORY_SEPARATOR . $item)) + { + $routes_file = $subdir . DIRECTORY_SEPARATOR . $item . DIRECTORY_SEPARATOR . 'routes.php'; + + if (file_exists($routes_file)) + { + require($routes_file); + } + } } } } -} \ No newline at end of file +} diff --git a/application/config/search.php b/application/config/search.php new file mode 100644 index 000000000..bedf8d888 --- /dev/null +++ b/application/config/search.php @@ -0,0 +1,874 @@ + 'person_id', + 'table' => 'public.tbl_person', + 'searchfields' => [ + 'uid' => [ + 'comparison' => 'equals', + 'field' => 'uid', + 'join' => [ + 'table' => "public.tbl_benutzer", + 'using' => "person_id" + ], + '1-n' => true + ], + 'vorname' => [ + 'alias' => ['firstname'], + 'comparison' => 'similar', + 'field' => 'vorname' + ], + 'nachname' => [ + 'alias' => ['lastname', 'surename'], + 'comparison' => 'similar', + 'field' => 'nachname' + ], + 'name' => [ + 'comparison' => 'similar', + 'field' => "(vorname || ' ' || nachname)" + ], + 'email' => [ + 'comparison' => 'similar', + 'field' => 'kontakt', + 'join' => [ + 'table' => "public.tbl_kontakt", + 'on' => "kontakttyp = 'email' AND tbl_kontakt.person_id = tbl_person.person_id" + ], + "1-n" => true + ], + 'tel' => [ + 'alias' => ['phone', 'telefon'], + 'comparison' => 'similar', + 'field' => 'kontakt', + 'join' => [ + 'table' => "public.tbl_kontakt", + 'on' => "kontakttyp IN ('telefon', 'so.tel', 'mobil') AND tbl_kontakt.person_id = tbl_person.person_id" + ], + "1-n" => true + ], + 'preid' => [ + 'alias' => ['prestudent_id'], + 'comparison' => 'equal-int', + 'field' => 'prestudent_id', + 'join' => [ + 'table' => "public.tbl_prestudent", + 'using' => "person_id" + ], + '1-n' => true + ], + 'pid' => [ + 'alias' => ['person_id'], + 'comparison' => 'equal-int', + 'field' => 'person_id' + ] + ], + 'resultfields' => [ + "ARRAY( SELECT uid FROM public.tbl_benutzer WHERE person_id = p.person_id ) AS uids", + "p.person_id", + "(p.vorname || ' ' || p.nachname) AS name", + "ARRAY( SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp = 'email' AND person_id=p.person_id ) AS email", + "CASE + WHEN p.foto IS NOT NULL THEN 'data:image/jpeg' || CONVERT_FROM(DECODE('3b','hex'), 'UTF8') || 'base64,' || p.foto + ELSE NULL END + AS photo_url" + ], + 'resultjoin' => " + JOIN public.tbl_person p USING (person_id)" +]; + +$config['student'] = [ + 'primarykey' => 'student_uid', + 'table' => 'public.tbl_student', + 'searchfields' => [ + 'uid' => [ + 'comparison' => 'equals', + 'field' => 'student_uid' + ], + 'vorname' => [ + 'alias' => ['firstname'], + 'comparison' => 'similar', + 'field' => 'vorname', + 'join' => [ + [ + 'table' => "public.tbl_prestudent", + 'using' => "prestudent_id" + ], + [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] + ] + ], + 'nachname' => [ + 'alias' => ['lastname', 'surename'], + 'comparison' => 'similar', + 'field' => 'nachname', + 'join' => [ + [ + 'table' => "public.tbl_prestudent", + 'using' => "prestudent_id" + ], + [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] + ] + ], + 'name' => [ + 'comparison' => 'similar', + 'field' => "(vorname || ' ' || nachname)", + 'join' => [ + [ + 'table' => "public.tbl_prestudent", + 'using' => "prestudent_id" + ], + [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] + ] + ], + 'email' => [ + 'comparison' => 'similar', + 'field' => 'kontakt', + 'join' => [ + [ + 'table' => "public.tbl_prestudent", + 'using' => "prestudent_id" + ], + [ + 'table' => "public.tbl_kontakt", + 'on' => "kontakttyp = 'email' AND tbl_kontakt.person_id = tbl_prestudent.person_id" + ] + ], + "1-n" => true + ], + 'tel' => [ + 'alias' => ['phone', 'telefon'], + 'comparison' => 'similar', + 'field' => 'kontakt', + 'join' => [ + [ + 'table' => "public.tbl_prestudent", + 'using' => "prestudent_id" + ], + [ + 'table' => "public.tbl_kontakt", + 'on' => "kontakttyp IN ('telefon', 'so.tel', 'mobil') AND tbl_kontakt.person_id = tbl_prestudent.person_id" + ] + ], + "1-n" => true + ], + 'stg' => [ + 'alias' => ['studiengang'], + 'comparison' => 'equals', + 'field' => "typ || kurzbz", + 'join' => [ + [ + 'table' => "public.tbl_prestudent", + 'using' => "prestudent_id" + ], + [ + 'table' => "public.tbl_studiengang", + 'on' => "tbl_studiengang.studiengang_kz = tbl_prestudent.studiengang_kz" + ] + ] + ], + 'preid' => [ + 'alias' => ['prestudent_id'], + 'comparison' => 'equal-int', + 'field' => 'prestudent_id' + ], + 'pid' => [ + 'alias' => ['person_id'], + 'comparison' => 'equal-int', + 'field' => 'person_id', + 'join' => [ + 'table' => "public.tbl_prestudent", + 'using' => "prestudent_id" + ] + ] + ], + 'resultfields' => [ + "s.student_uid AS uid", + "s.matrikelnr", + "p.person_id", + "(p.vorname || ' ' || p.nachname) AS name", + "(s.student_uid || '@" . DOMAIN . "') || ARRAY( SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp = 'email' AND person_id=p.person_id ) AS email", + "CASE + WHEN p.foto IS NOT NULL THEN 'data:image/jpeg' || CONVERT_FROM(DECODE('3b','hex'), 'UTF8') || 'base64,' || p.foto + ELSE NULL END + AS photo_url", + "b.aktiv" + ], + 'resultjoin' => " + JOIN public.tbl_student s USING (student_uid) + JOIN public.tbl_benutzer b ON(b.uid = s.student_uid) + JOIN public.tbl_person p USING(person_id)" +]; + +$prestudent_sort = [ + "Student", + "Incoming", + "Outgoing", + "Diplomand", + "Unterbrecher", + "Aufgenommener", + "Wartender", + "Bewerber", + "Interessent", + "Abgewiesener", + "Absolvent", + "Abbrecher", + "Ausserordentlicher", + "Praktikant" +]; +$prestudent_sort_array = "array['" . implode("','", $prestudent_sort) . "']"; +$config['prestudent'] = [ + 'primarykey' => 'prestudent_id', + 'table' => 'public.tbl_prestudent', + 'searchfields' => [ + 'uid' => [ + 'comparison' => 'equals', + 'field' => 'student_uid', + 'join' => [ + 'table' => "public.tbl_student", + 'using' => "prestudent_id" + ] + ], + 'vorname' => [ + 'alias' => ['firstname'], + 'comparison' => 'similar', + 'field' => 'vorname', + 'join' => [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] + ], + 'nachname' => [ + 'alias' => ['lastname', 'surename'], + 'comparison' => 'similar', + 'field' => 'nachname', + 'join' => [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] + ], + 'name' => [ + 'comparison' => 'similar', + 'field' => "(vorname || ' ' || nachname)", + 'join' => [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] + ], + 'email' => [ + 'comparison' => 'similar', + 'field' => 'kontakt', + 'join' => [ + 'table' => "public.tbl_kontakt", + 'on' => "kontakttyp = 'email' AND tbl_kontakt.person_id = tbl_prestudent.person_id" + ], + "1-n" => true + ], + 'tel' => [ + 'alias' => ['phone', 'telefon'], + 'comparison' => 'similar', + 'field' => 'kontakt', + 'join' => [ + 'table' => "public.tbl_kontakt", + 'on' => "kontakttyp IN ('telefon', 'so.tel', 'mobil') AND tbl_kontakt.person_id = tbl_prestudent.person_id" + ], + "1-n" => true + ], + 'stg' => [ + 'alias' => ['studiengang'], + 'comparison' => 'equals', + 'field' => "typ || kurzbz", + 'join' => [ + 'table' => "public.tbl_studiengang", + 'using' => "studiengang_kz" + ] + ], + 'preid' => [ + 'alias' => ['prestudent_id'], + 'comparison' => 'equal-int', + 'field' => 'prestudent_id' + ], + 'pid' => [ + 'alias' => ['person_id'], + 'comparison' => 'equal-int', + 'field' => 'person_id', + 'join' => [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] + ] + ], + 'resultfields' => [ + "ps.prestudent_id", + "ps.studiengang_kz", + "s.matrikelnr", + "p.person_id", + "b.uid", + "(p.vorname || ' ' || p.nachname) AS name", + "(b.uid || '@" . DOMAIN . "') || ARRAY( SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp = 'email' AND person_id=p.person_id ) AS email", + "CASE + WHEN p.foto IS NOT NULL THEN 'data:image/jpeg' || CONVERT_FROM(DECODE('3b','hex'), 'UTF8') || 'base64,' || p.foto + ELSE NULL END + AS photo_url", + "UPPER(sg.typ || sg.kurzbz) AS stg_kuerzel", + "sg.bezeichnung", + "( + SELECT bezeichnung_mehrsprachig[(TABLE lang)] + FROM public.tbl_status + WHERE status_kurzbz = public.get_rolle_prestudent(ps.prestudent_id, NULL) + LIMIT 1 + ) AS status", + "COALESCE( + ( + SELECT COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz) + FROM public.tbl_prestudentstatus pss + LEFT JOIN lehre.tbl_studienplan plan USING (studienplan_id) + WHERE pss.prestudent_id=ps.prestudent_id + ORDER BY pss.datum DESC, pss.insertamum DESC, pss.ext_id DESC + LIMIT 1 + ), + sg.orgform_kurzbz + ) AS orgform", + "b.aktiv", + "array_position(" . $prestudent_sort_array . ", public.get_rolle_prestudent(ps.prestudent_id, NULL)) AS sort" + ], + 'resultjoin' => " + LEFT JOIN public.tbl_prestudent ps USING (prestudent_id) + LEFT JOIN public.tbl_student s ON (ps.prestudent_id = s.prestudent_id) + LEFT JOIN public.tbl_benutzer b ON (b.uid = s.student_uid) + JOIN public.tbl_person p ON (p.person_id = ps.person_id) + LEFT JOIN public.tbl_studiengang sg ON (sg.studiengang_kz = ps.studiengang_kz)" +]; + +$config['employee'] = [ + 'alias' => ['ma', 'mitarbeiter'], + 'primarykey' => 'mitarbeiter_uid', + 'table' => 'public.tbl_mitarbeiter', + 'searchfields' => [ + 'uid' => [ + 'alias' => ['mitarbeiter_uid'], + 'comparison' => 'equals', + 'field' => "mitarbeiter_uid" + ], + 'vorname' => [ + 'alias' => ['firstname'], + 'comparison' => 'similar', + 'field' => "vorname", + 'join' => [ + [ + 'table' => "public.tbl_benutzer", + 'on' => "uid = mitarbeiter_uid" + ], + [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] + ] + ], + 'nachname' => [ + 'alias' => ['lastname', 'surename'], + 'comparison' => 'similar', + 'field' => "nachname", + 'join' => [ + [ + 'table' => "public.tbl_benutzer", + 'on' => "uid = mitarbeiter_uid" + ], + [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] + ] + ], + 'name' => [ + 'comparison' => 'similar', + 'field' => "(vorname || ' ' || nachname)", + 'join' => [ + [ + 'table' => "public.tbl_benutzer", + 'on' => "uid = mitarbeiter_uid" + ], + [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] + ] + ], + 'email' => [ + 'comparison' => 'similar', + 'field' => "COALESCE(alias, uid) || '" . '@' . DOMAIN . "'", + 'join' => [ + 'table' => "public.tbl_benutzer", + 'on' => "uid = mitarbeiter_uid" + ] + ], + 'tel' => [ + 'alias' => ['phone', 'telefon'], + 'comparison' => 'similar', + 'field' => "TRIM(COALESCE(kontakt, '') || ' ' || COALESCE(telefonklappe, ''))", + 'join' => [ + 'table' => "public.tbl_kontakt", + 'on' => "kontakttyp = 'telefon' AND tbl_kontakt.standort_id = tbl_mitarbeiter.standort_id" + ], + "1-n" => true + ], + 'pid' => [ + 'alias' => ['person_id'], + 'comparison' => 'equal-int', + 'field' => "person_id", + 'join' => [ + 'table' => "public.tbl_benutzer", + 'on' => "uid = mitarbeiter_uid" + ] + ], + 'oe' => [ + 'alias' => ['ou', 'organisationseinheit', 'organisationunit'], + 'comparison' => 'vector', + 'field' => "fts_bezeichnung", + 'join' => [ + [ + 'table' => "public.tbl_benutzerfunktion", + 'on' => "mitarbeiter_uid = uid + AND funktion_kurzbz = 'oezuordnung' + AND (datum_von IS NULL OR datum_von <= NOW()) + AND (datum_bis IS NULL OR datum_bis >= NOW())" + ], + [ + 'table' => "public.tbl_organisationseinheit", + 'using' => "oe_kurzbz" + ] + ], + '1-n' => true + ], + 'kst' => [ + 'comparison' => 'vector', + 'field' => "fts_bezeichnung", + 'join' => [ + [ + 'table' => "public.tbl_benutzerfunktion", + 'on' => "mitarbeiter_uid = uid + AND funktion_kurzbz = 'kstzuordnung' + AND (datum_von IS NULL OR datum_von <= NOW()) + AND (datum_bis IS NULL OR datum_bis >= NOW())" + ], + [ + 'table' => "public.tbl_organisationseinheit", + 'using' => "oe_kurzbz" + ] + ], + '1-n' => true + ] + ], + 'resultfields' => [ + "b.uid", + "p.person_id", + "(p.vorname || ' ' || p.nachname) AS name", + "ARRAY( + SELECT + '[' || ot.bezeichnung || '] ' || o.bezeichnung AS bezeichnung + FROM public.tbl_benutzerfunktion bf + JOIN public.tbl_organisationseinheit o USING(oe_kurzbz) + JOIN public.tbl_organisationseinheittyp ot USING(organisationseinheittyp_kurzbz) + WHERE bf.funktion_kurzbz = 'oezuordnung' + AND (bf.datum_von IS NULL OR bf.datum_von <= NOW()) + AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW()) + AND bf.uid = b.uid + GROUP BY o.bezeichnung, ot.bezeichnung + ) AS organisationunit_name", + "COALESCE(b.alias, b.uid) || '" . '@' . DOMAIN . "' AS email", + "TRIM(COALESCE(k.kontakt, '') || ' ' || COALESCE(m.telefonklappe, '')) AS phone", + "'" . base_url("/cis/public/bild.php?src=person&person_id=") . "' || p.person_id AS photo_url", + "ARRAY( + SELECT + '[' || ot.bezeichnung || '] ' || o.bezeichnung AS bezeichnung + FROM public.tbl_benutzerfunktion bf + JOIN public.tbl_organisationseinheit o USING(oe_kurzbz) + JOIN public.tbl_organisationseinheittyp ot USING(organisationseinheittyp_kurzbz) + WHERE bf.funktion_kurzbz = 'kstzuordnung' + AND (bf.datum_von IS NULL OR bf.datum_von <= NOW()) + AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW()) + AND bf.uid = b.uid + GROUP BY o.bezeichnung, ot.bezeichnung + ) AS standardkostenstelle" + ], + 'resultjoin' => " + JOIN public.tbl_mitarbeiter m USING (mitarbeiter_uid) + JOIN public.tbl_benutzer b ON (b.uid = m.mitarbeiter_uid) + JOIN public.tbl_person p USING(person_id) + LEFT JOIN ( + SELECT kontakt, standort_id + FROM public.tbl_kontakt + WHERE kontakttyp = 'telefon' + ) k ON (k.standort_id = m.standort_id)" +]; + +// TODO(chris): move to searchpv21.php +$config['unassigned_employee'] = $config['employee']; +$config['unassigned_employee']['alias'] = ['mitarbeiter_ohne_zuordnung']; +$config['unassigned_employee']['prepare'] = "unassigned_employee AS ( + SELECT tbl_mitarbeiter.* + FROM public.tbl_mitarbeiter + LEFT JOIN public.tbl_benutzerfunktion ON ( + uid = mitarbeiter_uid + AND funktion_kurzbz = 'kstzuordnung' + AND (datum_von IS NULL OR datum_von <= NOW()) + AND (datum_bis IS NULL OR datum_bis >= NOW()) + ) + WHERE tbl_benutzerfunktion.bezeichnung IS NULL + UNION + SELECT tbl_mitarbeiter.* + FROM public.tbl_mitarbeiter + LEFT JOIN public.tbl_benutzerfunktion ON ( + uid = mitarbeiter_uid + AND funktion_kurzbz = 'oezuordnung' + AND (datum_von IS NULL OR datum_von <= NOW()) + AND (datum_bis IS NULL OR datum_bis >= NOW()) + ) + WHERE tbl_benutzerfunktion.bezeichnung IS NULL +)"; +$config['unassigned_employee']['table'] = "unassigned_employee"; +$config['unassigned_employee']['searchfields']['tel']['join']['on'] = " + kontakttyp = 'telefon' + AND tbl_kontakt.standort_id = unassigned_employee.standort_id +"; +$config['unassigned_employee']['renderer'] = 'employee'; + +$config['organisationunit'] = [ + 'alias' => ['ou', 'organisationseinheit', 'oe'], + 'primarykey' => 'oe_kurzbz', + 'table' => 'public.tbl_organisationseinheit', + 'searchfields' => [ + 'uid' => [ + 'comparison' => 'equals', + 'field' => 'uid', + 'prepare' => "organisationunit_leader(oe_kurzbz, uid, vorname, nachname) AS ( + SELECT oe_kurzbz, vorname, nachname, uid + FROM public.tbl_benutzerfunktion + JOIN public.tbl_benutzer USING (uid) + JOIN public.tbl_person USING (person_id) + WHERE funktion_kurzbz = 'Leitung' + AND (datum_von IS NULL OR datum_von <= NOW()) + AND (datum_bis IS NULL OR datum_bis >= NOW()) + AND tbl_benutzer.aktiv = TRUE + )", + 'join' => [ + 'table' => "organisationunit_leader", + 'using' => "oe_kurzbz" + ], + '1-n' => true + ], + 'vorname' => [ + 'alias' => ['firstname'], + 'comparison' => 'similar', + 'field' => 'vorname', + 'prepare' => "organisationunit_leader(oe_kurzbz, uid, vorname, nachname) AS ( + SELECT oe_kurzbz, vorname, nachname, uid + FROM public.tbl_benutzerfunktion + JOIN public.tbl_benutzer USING (uid) + JOIN public.tbl_person USING (person_id) + WHERE funktion_kurzbz = 'Leitung' + AND (datum_von IS NULL OR datum_von <= NOW()) + AND (datum_bis IS NULL OR datum_bis >= NOW()) + AND tbl_benutzer.aktiv = TRUE + )", + 'join' => [ + 'table' => "organisationunit_leader", + 'using' => "oe_kurzbz" + ], + '1-n' => true + ], + 'nachname' => [ + 'alias' => ['lastname', 'surename'], + 'comparison' => 'similar', + 'field' => 'nachname', + 'prepare' => "organisationunit_leader(oe_kurzbz, uid, vorname, nachname) AS ( + SELECT oe_kurzbz, vorname, nachname, uid + FROM public.tbl_benutzerfunktion + JOIN public.tbl_benutzer USING (uid) + JOIN public.tbl_person USING (person_id) + WHERE funktion_kurzbz = 'Leitung' + AND (datum_von IS NULL OR datum_von <= NOW()) + AND (datum_bis IS NULL OR datum_bis >= NOW()) + AND tbl_benutzer.aktiv = TRUE + )", + 'join' => [ + 'table' => "organisationunit_leader", + 'using' => "oe_kurzbz" + ], + '1-n' => true + ], + 'name' => [ + 'comparison' => 'similar', + 'field' => "(vorname || ' ' || nachname)", + 'prepare' => "organisationunit_leader(oe_kurzbz, uid, vorname, nachname) AS ( + SELECT oe_kurzbz, vorname, nachname, uid + FROM public.tbl_benutzerfunktion + JOIN public.tbl_benutzer USING (uid) + JOIN public.tbl_person USING (person_id) + WHERE funktion_kurzbz = 'Leitung' + AND (datum_von IS NULL OR datum_von <= NOW()) + AND (datum_bis IS NULL OR datum_bis >= NOW()) + AND tbl_benutzer.aktiv = TRUE + )", + 'join' => [ + 'table' => "organisationunit_leader", + 'using' => "oe_kurzbz" + ], + '1-n' => true + ], + 'oe' => [ + 'alias' => ['ou', 'organisationseinheit', 'organisationunit'], + 'comparison' => 'vector', + 'field' => "fts_bezeichnung" + ], + 'kurzbz' => [ + 'alias' => ['oe_kurzbz'], + 'comparison' => 'equals', + 'field' => "oe_kurzbz" + ] + ], + 'resultfields' => [ + "oe.oe_kurzbz", + "('[' || type.bezeichnung || '] ' || oe.bezeichnung) AS name", + "oe_parent.oe_kurzbz AS parentoe_kurzbz", + "(CASE WHEN oe_parent.bezeichnung IS NOT NULL THEN '[' || type_parent.bezeichnung || '] ' || oe_parent.bezeichnung END) AS parentoe_name", + "ARRAY( + SELECT JSON_BUILD_OBJECT('uid', b.uid, 'vorname', p.vorname, 'nachname', p.nachname, 'name', (p.vorname || ' ' || p.nachname)) + FROM public.tbl_benutzerfunktion bf + JOIN public.tbl_benutzer b USING (uid) + JOIN public.tbl_person p USING (person_id) + WHERE funktion_kurzbz = 'Leitung' + AND (datum_von IS NULL OR datum_von <= NOW()) + AND (datum_bis IS NULL OR datum_bis >= NOW()) + AND b.aktiv = TRUE + AND oe_kurzbz = oe.oe_kurzbz + ) AS leaders", + "( + SELECT COUNT(*) + FROM public.tbl_benutzerfunktion + WHERE funktion_kurzbz = 'oezuordnung' + AND (datum_von IS NULL OR datum_von <= NOW()) + AND (datum_bis IS NULL OR datum_bis >= NOW()) + AND oe_kurzbz = oe.oe_kurzbz + ) AS number_of_people", + "(CASE WHEN oe.mailverteiler THEN oe.oe_kurzbz || '" . '@' . DOMAIN . "' END) AS mailgroup" + ], + 'resultjoin' => " + JOIN public.tbl_organisationseinheit oe + USING (oe_kurzbz) + JOIN public.tbl_organisationseinheittyp type + USING (organisationseinheittyp_kurzbz) + LEFT JOIN public.tbl_organisationseinheit oe_parent + ON (oe_parent.oe_kurzbz = oe.oe_parent_kurzbz) + LEFT JOIN public.tbl_organisationseinheittyp type_parent + ON (oe_parent.organisationseinheittyp_kurzbz = type_parent.organisationseinheittyp_kurzbz)" +]; + +$config['room'] = [ + 'alias' => ['raum'], + 'primarykey' => 'ort_kurzbz', + 'table' => 'public.tbl_ort', + 'searchfields' => [ + 'name' => [ + 'comparison' => 'similar', + 'field' => 'ort_kurzbz' + ] + ], + 'resultfields' => [ + "ort.ort_kurzbz", + "ort.gebteil AS building", + "ort.ausstattung AS equipment", + "ort.stockwerk AS floor", + "ort.dislozierung AS room_number", + "ort.content_id", + "address.ort AS city", + "address.plz AS zip", + "address.strasse AS street", + "ort.max_person", + "ort.arbeitsplaetze AS workplaces" + ], + 'resultjoin' => " + JOIN public.tbl_ort ort + USING (ort_kurzbz) + LEFT JOIN public.tbl_standort + USING (standort_id) + LEFT JOIN public.tbl_adresse address + USING (adresse_id)" +]; +$sprache = getUserLanguage(); +$config['cms'] = [ + 'primarykey' => 'contentsprache_id', + 'table' => 'campus.tbl_contentsprache', + 'prepare' => " + cms_auth (content_id) AS ( + SELECT content_id + FROM campus.tbl_content c + WHERE NOT EXISTS (SELECT 1 FROM campus.tbl_contentgruppe g WHERE g.content_id=c.content_id) + UNION + SELECT content_id + FROM public.vw_gruppen g + JOIN campus.tbl_contentgruppe c USING (gruppe_kurzbz) + WHERE uid = (TABLE auth) + ), + cms_active (content_id, template_kurzbz) AS ( + SELECT content_id, template_kurzbz + FROM cms_auth + JOIN campus.tbl_content USING (content_id) + WHERE aktiv = TRUE + ), + cms_active_redirect (content_id) AS ( + SELECT content_id + FROM cms_active + WHERE template_kurzbz = 'redirect' + ), + cms_active_redirect_linked (content_id) AS ( + SELECT content_id + FROM cms_active_redirect + JOIN campus.tbl_contentsprache USING (content_id) + WHERE LEFT((xpath('string(/content/url)', content))[1]::text, 1) <> '#' + ), + cms_active_others (content_id) AS ( + SELECT content_id + FROM cms_active + WHERE template_kurzbz IN ('contentmittitel', 'contentohnetitel', 'contentmittitel_filterwidget') + ) + ", + 'searchfields' => [ + 'content' => [ + 'alias' => ['inhalt'], + 'comparison' => "vector", + 'field' => "( + setweight(to_tsvector('simple', COALESCE(titel, '')), 'A') + || + setweight(to_tsvector('simple', COALESCE(content, '')::text), 'B') + )" + ], + 'content_id' => [ + 'alias' => ['id'], + 'comparison' => "equal-int", + 'field' => "content_id" + ], + 'lang' => [ + 'alias' => ['language', 'sprache'], + 'comparison' => "equals", + 'field' => "sprache" + ] + ], + 'resultfields' => [ + "contentsprache.content_id", + "content.template_kurzbz", + "contentsprache.version", + "contentsprache.sprache AS language", + "contentsprache.titel AS title", + "contentsprache.content", + "(xpath('string(/content/url)', contentsprache.content))[1] AS content_url" + ], + 'resultjoin' => " + JOIN campus.tbl_contentsprache contentsprache + USING (contentsprache_id) + JOIN campus.tbl_content content + USING (content_id) + WHERE content_id IN ( + SELECT content_id + FROM cms_active_redirect_linked + UNION + SELECT content_id + FROM cms_active_others + ) + AND version = campus.get_highest_content_version(content_id) + AND contentsprache.sprache = '{$sprache}'" +]; + +$config['dms'] = [ + 'primarykey' => 'dms_id, version', + 'table' => 'campus.tbl_dms_version', + 'searchfields' => [ + 'keywords' => [ + 'alias' => ['keyword', 'keywords', 'schlagwort', 'schlagworte'], + 'comparison' => "vector", + 'field' => "(to_tsvector('simple', COALESCE(schlagworte, '')))" + ] + ], + 'resultfields' => [ + "v.dms_id", + "v.version", + "v.filename", + "v.mimetype", + "v.name", + "v.beschreibung AS description", + "v.schlagworte AS keywords" + ], + 'resultjoin' => " + JOIN campus.tbl_dms_version v + USING (dms_id, version) + WHERE cis_suche = TRUE + AND version=(SELECT MAX(version) FROM campus.tbl_dms_version WHERE dms_id=v.dms_id) + AND NOT EXISTS ( + SELECT + 1 + FROM + fue.tbl_projekt_dokument p + WHERE p.dms_id = v.dms_id + ) AND ( + NOT EXISTS ( + WITH RECURSIVE categories (kategorie_kurzbz) AS ( + SELECT + kategorie_kurzbz + FROM + campus.tbl_dms c + WHERE c.dms_id = v.dms_id + UNION ALL + SELECT + cat.parent_kategorie_kurzbz AS kategorie_kurzbz + FROM + categories + JOIN campus.tbl_dms_kategorie cat USING (kategorie_kurzbz) + ) + SELECT + 1 + FROM + categories + JOIN campus.tbl_dms_kategorie_gruppe USING (kategorie_kurzbz) + UNION + SELECT + 1 + FROM + categories + JOIN campus.tbl_dms_kategorie USING (kategorie_kurzbz) + WHERE + berechtigung_kurzbz IS NOT NULL + ) OR EXISTS ( + WITH RECURSIVE categories (kategorie_kurzbz) AS ( + SELECT + kategorie_kurzbz + FROM + campus.tbl_dms c + WHERE c.dms_id = v.dms_id + UNION ALL + SELECT + cat.parent_kategorie_kurzbz AS kategorie_kurzbz + FROM + categories + JOIN campus.tbl_dms_kategorie cat USING (kategorie_kurzbz) + ) + SELECT + 1 + FROM + categories + JOIN campus.tbl_dms_kategorie_gruppe USING (kategorie_kurzbz) + JOIN public.tbl_benutzergruppe USING(gruppe_kurzbz) + WHERE + uid = (TABLE auth) + ) + )" +]; diff --git a/application/config/searchcis.php b/application/config/searchcis.php new file mode 100644 index 000000000..12bad025d --- /dev/null +++ b/application/config/searchcis.php @@ -0,0 +1,48 @@ +config->item('employee', 'search'); +$config['employee']['resultjoin'] = " + JOIN public.tbl_mitarbeiter m USING (mitarbeiter_uid) + JOIN public.tbl_benutzer b ON (b.uid = m.mitarbeiter_uid AND b.aktiv = true) + JOIN public.tbl_person p USING(person_id) + LEFT JOIN ( + SELECT kontakt, standort_id + FROM public.tbl_kontakt + WHERE kontakttyp = 'telefon' + ) k ON (k.standort_id = m.standort_id)"; + +$config['student'] = $CI->config->item('student', 'search'); +unset($config['student']['searchfields']['email']); +unset($config['student']['searchfields']['tel']); +$config['student']['resultfields'] = [ + "s.student_uid AS uid", + "s.matrikelnr", + "p.person_id", + "(p.vorname || ' ' || p.nachname) AS name", + "ARRAY[s.student_uid || '@' || '" . DOMAIN . "'] AS email", + "CASE + WHEN (p.foto_sperre = false AND p.foto IS NOT NULL) THEN 'data:image/jpeg' || CONVERT_FROM(DECODE('3b','hex'), 'UTF8') || 'base64,' || p.foto + ELSE NULL END + AS photo_url", + "b.aktiv" +]; +$config['student']['resultjoin'] = " + JOIN public.tbl_student s USING (student_uid) + JOIN public.tbl_benutzer b ON(b.uid = s.student_uid AND b.aktiv = true) + JOIN public.tbl_person p USING(person_id)"; + +$config['organisationunit'] = $CI->config->item('organisationunit', 'search'); +$config['organisationunit']['prepare'] = 'active_organisationseinheit AS (SELECT * FROM public.tbl_organisationseinheit WHERE aktiv = true AND organisationseinheittyp_kurzbz <> \'Container\')'; +$config['organisationunit']['table'] = 'active_organisationseinheit'; + +$config['room'] = $CI->config->item('room', 'search'); + +$config['cms'] = $CI->config->item('cms', 'search'); + +$config['dms'] = $CI->config->item('dms', 'search'); diff --git a/application/config/searchfunctions.php b/application/config/searchfunctions.php new file mode 100644 index 000000000..ddf7692d5 --- /dev/null +++ b/application/config/searchfunctions.php @@ -0,0 +1,35 @@ + 4, + 'rank' => "0", + 'compare' => "{field}::text = {word}::text", + 'force_integer' => true +]; + +$config['equals'] = [ + 'priority' => 3, + 'rank' => "0", + 'compare' => "LOWER({field}) = {word}" +]; + +$config['similar'] = [ + 'priority' => 2, + 'rank' => "(COALESCE({field}, '') <->> {word})", + 'compare' => "COALESCE({field}, '') %> {word}", + 'compare_boolean' => "COALESCE({field}, '') ILIKE {like:word}" +]; + +$config['vector'] = [ + 'priority' => 1, + 'rank' => "ts_rank({field}, plainto_tsquery('simple', {word}))", + 'compare' => "plainto_tsquery('simple', {word}) @@ {field}" +]; + diff --git a/application/config/searchstv.php b/application/config/searchstv.php new file mode 100644 index 000000000..d507f7250 --- /dev/null +++ b/application/config/searchstv.php @@ -0,0 +1,49 @@ +config->item('student', 'search'); +$config['student']['searchfields']['pkz'] = [ + 'alias' => ['personenkennzeichen', 'personalid'], + 'comparison' => 'equals', + 'field' => 'matrikelnr' +]; +$config['student']['searchfields']['matrnr'] = [ + 'alias' => ['matrikelnr', 'matrikelnummer', 'matrno', 'matriculationno', 'matriculationnumber', 'studno', 'studentno', 'studentnumber'], + 'comparison' => 'equals', + 'field' => 'matr_nr', + 'join' => [ + [ + 'table' => "public.tbl_prestudent", + 'using' => "prestudent_id" + ], + [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] + ] +]; + +$config['prestudent'] = $CI->config->item('prestudent', 'search'); +$config['prestudent']['searchfields']['pkz'] = [ + 'alias' => ['personenkennzeichen', 'personalid'], + 'comparison' => 'equals', + 'field' => 'matrikelnr', + 'join' => [ + 'table' => "public.tbl_student", + 'using' => "prestudent_id" + ] +]; +$config['prestudent']['searchfields']['matrnr'] = [ + 'alias' => ['matrikelnr', 'matrikelnummer', 'matrno', 'matriculationno', 'matriculationnumber', 'studno', 'studentno', 'studentnumber'], + 'comparison' => 'equals', + 'field' => 'matr_nr', + 'join' => [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] +]; diff --git a/application/config/stv.php b/application/config/stv.php index 31ce3f521..8942c35e6 100644 --- a/application/config/stv.php +++ b/application/config/stv.php @@ -1,5 +1,6 @@ [ @@ -52,9 +53,21 @@ $config['tabs'] = ], ], ], - ] + ], + 'exemptions' => [ + //if true, Anrechnungen can be added and edited in tab Anrechnungen + 'editableAnrechnungen' => false, + ], + 'notes' => [ + //if true, the count of Messages will be shown in the header of the Tab Messages + 'showCountNotes' => true + ], + 'combinePeople' => [ + //multitab should only be shown with this length of selection + 'validCountMulti' => 2, + ], ]; - + // List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined $fieldsZgvDoktor = ['zgvdoktorort', 'zgvdoktordatum', 'zgvdoktornation', 'zgvdoktor_erfuellt', 'zgvdoktor_code']; @@ -74,3 +87,46 @@ if (!defined('ZGV_DOKTOR_ANZEIGEN') || !ZGV_DOKTOR_ANZEIGEN) { $fieldsZgvDoktor ); } + +$config['tabs']['projektarbeit']['defaultProjektbetreuerStunden'] = + defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR') + ? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR + : '0.0'; +$config['tabs']['projektarbeit']['defaultProjektbetreuerStundenDiplom'] = + defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER') + ? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER + : '0.0'; +$config['tabs']['projektarbeit']['defaultProjektbetreuerStundensatz'] = '80.0'; + +$config['student_tab_order'] = [ + 'details', + 'notes', + 'messages', + 'contact', + 'prestudent', + 'status', + 'documents', + 'archive', + 'banking', + 'grades', + 'exam', + 'exemptions', + 'projektarbeit', + 'finalexam', + 'mobility', + 'jointstudies', + 'admissionDates', + 'groups', + 'functions', + 'coursedates', + 'resources', +]; +$config['students_tab_order'] = [ + 'banking', + 'status', + 'messages', + 'groups', + 'finalexam', + 'combinePeople', + 'archive', +]; diff --git a/application/config/theme.php b/application/config/theme.php new file mode 100644 index 000000000..715c4e39c --- /dev/null +++ b/application/config/theme.php @@ -0,0 +1,11 @@ + self::PERM_LOGGED, + 'Mitarbeiter' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'), + 'Assistenz' => array('basis/abgabe_assistenz:rw'), + 'Student' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'), + 'Deadlines' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw') + ]); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * @return void + */ + public function index() + { + // 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']); + } else { + $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']); + } + } + + public function Student($student_uid_prop = '') + { + $viewData = array( + 'uid'=>getAuthUID(), + ); + + if(defined('CIS4') && CIS4) { + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']); + } else { + $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]); + } + } + + public function Mitarbeiter() + { + $viewData = array( + 'uid'=>getAuthUID(), + ); + + if(defined('CIS4') && CIS4) { + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']); + } else { + $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']); + } + } + + public function Assistenz($stg_kz_prop = '') + { + + $viewData = array( + 'uid'=>getAuthUID(), + ); + + if(defined('CIS4') && CIS4) { + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolAssistenz']); + } else { + $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]); + } + } + + public function Deadlines() + { + $viewData = array( + 'uid'=>getAuthUID(), + ); + + if(defined('CIS4') && CIS4) { + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, '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 59dab1568..67267ebf6 100644 --- a/application/controllers/Cis/Auth.php +++ b/application/controllers/Cis/Auth.php @@ -72,6 +72,7 @@ class Auth extends FHC_Controller { $this->load->library('AuthLib'); $this->authlib->logout(); - redirect('/Cis/Auth/login', 'refresh'); + setcookie('fhclogout', 'fhclogout', 0, '/'); + redirect(base_url('/cis/private/logout.php'), 'refresh'); } } diff --git a/application/controllers/Cis/Documents.php b/application/controllers/Cis/Documents.php index c5a6684d3..0b8d08a56 100644 --- a/application/controllers/Cis/Documents.php +++ b/application/controllers/Cis/Documents.php @@ -72,7 +72,7 @@ class Documents extends Auth_Controller $stgs = []; $stsemArray = []; - $buchungstypen = implode('\',\'', defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : []); + $buchungstypen = defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : []; $person_ids = []; foreach ($stati as $status) { $person_ids[] = $status->person_id; diff --git a/application/controllers/Cis/LvPlan.php b/application/controllers/Cis/LvPlan.php new file mode 100644 index 000000000..884c8a9a0 --- /dev/null +++ b/application/controllers/Cis/LvPlan.php @@ -0,0 +1,39 @@ + ['basis/cis:r'] + ]); + + // Load Config + $this->load->config('calendar'); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * @return void + */ + public function index() + { + + $viewData = array( + 'uid'=>getAuthUID(), + 'timezone' => $this->config->item('timezone') + ); + + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'LvPlan']); + } +} diff --git a/application/controllers/Cis/MyLvPlan.php b/application/controllers/Cis/MyLvPlan.php new file mode 100644 index 000000000..366ce8e65 --- /dev/null +++ b/application/controllers/Cis/MyLvPlan.php @@ -0,0 +1,39 @@ + ['basis/cis:r'] + ]); + + // Load Config + $this->load->config('calendar'); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * @return void + */ + public function index() + { + + $viewData = array( + 'uid'=>getAuthUID(), + 'timezone' => $this->config->item('timezone') + ); + + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLvPlan']); + } +} diff --git a/application/controllers/Cis/Profil.php b/application/controllers/Cis/Profil.php index 8c3088bd7..c287d87d0 100644 --- a/application/controllers/Cis/Profil.php +++ b/application/controllers/Cis/Profil.php @@ -55,8 +55,13 @@ 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']); } @@ -68,8 +73,16 @@ class Profil extends Auth_Controller */ public function View($uid) { - $viewData = array ('uid' => $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']); } diff --git a/application/controllers/Cis/ProfilUpdate.php b/application/controllers/Cis/ProfilUpdate.php index c47b7540b..698b091d1 100644 --- a/application/controllers/Cis/ProfilUpdate.php +++ b/application/controllers/Cis/ProfilUpdate.php @@ -9,54 +9,21 @@ if (!defined('BASEPATH')) class ProfilUpdate extends Auth_Controller { - public static $STATUS_PENDING = NULL; - public static $STATUS_ACCEPTED = NULL; - public static $STATUS_REJECTED = NULL; - - public static $TOPICS = []; - - public function __construct() { parent::__construct([ 'index' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r'], - 'id' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r'], - 'getProfilUpdateWithPermission' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r'], - 'acceptProfilRequest' => ['student/stammdaten:rw', 'mitarbeiter/stammdaten:rw'], - 'denyProfilRequest' => ['student/stammdaten:rw', 'mitarbeiter/stammdaten:rw'], - 'show' => ['basis/cis:r'], - - 'insertProfilRequest' => ['basis/cis:rw'], - 'updateProfilRequest' => ['basis/cis:rw'], - 'deleteProfilRequest' => ['basis/cis:rw'], - 'selectProfilRequest' => ['basis/cis:r'], - 'insertFile' => ['basis/cis:rw'], - 'getProfilRequestFiles' => ['basis/cis:r'], - 'getStatus' => ['basis/cis:r'], - 'getTopic' => ['basis/cis:r'], + 'show' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r', 'basis/cis:r'], + 'id' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r'] ]); - $this->load->config('cis'); - $this->load->model('person/Profil_update_model', 'ProfilUpdateModel'); - $this->load->model('person/Kontakt_model', 'KontaktModel'); - $this->load->model('person/Adresse_model', 'AdresseModel'); - $this->load->model('person/Adressentyp_model', 'AdressenTypModel'); - $this->load->model('person/Person_model', 'PersonModel'); $this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel'); $this->load->model('crm/Student_model', 'StudentModel'); - $this->load->model('person/Benutzer_model', 'BenutzerModel'); - $this->load->model('system/Sprache_model', 'SpracheModel'); - $this->load->model('person/Profil_update_status_model', 'ProfilUpdateStatusModel'); - $this->load->model('person/Profil_update_topic_model', 'ProfilUpdateTopicModel'); // Load language phrases $this->loadPhrases( array( - 'ui', - 'global', - 'person', - 'profil', 'profilUpdate' ) ); @@ -64,32 +31,10 @@ class ProfilUpdate extends Auth_Controller $this->load->library('DmsLib'); $this->load->library('PermissionLib'); - //? put the uid and pid inside the controller for reusability $this->uid = getAuthUID(); $this->pid = getAuthPersonID(); - - // setup the ProfilUpdate states - $this->ProfilUpdateStatusModel->addSelect(['status_kurzbz']); - $status_kurzbz = $this->ProfilUpdateStatusModel->load(); - if (hasData($status_kurzbz)) { - list($status_pending, $status_accepted, $status_rejected) = getData($status_kurzbz); - - self::$STATUS_PENDING = $status_pending->status_kurzbz; - self::$STATUS_ACCEPTED = $status_accepted->status_kurzbz; - self::$STATUS_REJECTED = $status_rejected->status_kurzbz; - } - // setup the ProfilUpdate topics - $this->ProfilUpdateTopicModel->addSelect(['topic_kurzbz']); - $topic_kurzbz = $this->ProfilUpdateTopicModel->load(); - - if (hasData($topic_kurzbz)) { - foreach (getData($topic_kurzbz) as $topic) { - self::$TOPICS[$topic->topic_kurzbz] = $topic->topic_kurzbz; - } - } } - public function index() { $this->load->view('Cis/ProfilUpdate'); @@ -100,129 +45,14 @@ class ProfilUpdate extends Auth_Controller $this->load->view('Cis/ProfilUpdate', ['profil_update_id' => $profil_update_id]); } - public function getStatus() - { - echo json_encode([self::$STATUS_PENDING => self::$STATUS_PENDING, self::$STATUS_ACCEPTED => self::$STATUS_ACCEPTED, self::$STATUS_REJECTED => self::$STATUS_REJECTED]); - } - - public function getTopic() - { - echo json_encode(self::$TOPICS); - } - - private function sendEmail_onProfilUpdate_response($uid, $topic, $status) - { - if($this->config->item('cis_send_profil_update_mails') === false) - { - return; - } - - $this->load->helper('hlp_sancho_helper'); - $email = $uid . "@" . DOMAIN; - - - function languageQuery($language) - { - return "select index from public.tbl_sprache where sprache = '" + $language + "'"; - } - $this->ProfilUpdateStatusModel->addSelect(["bezeichnung_mehrsprachig[(" . languageQuery('German') . ")] as status_de", "bezeichnung_mehrsprachig[(" . languageQuery('English') . ")] as status_en"]); - $status_translation = $this->ProfilUpdateStatusModel->loadWhere(["status_kurzbz" => $status]); - if (isError($status_translation)) { - show_error($this->p->t('profilUpdate', 'ProfilUpdateStatusTranslationError')); - } - $status_translation = hasData($status_translation) ? getData($status_translation)[0] : null; - if (isset($status_translation)) { - $mail_res = sendSanchoMail("profil_update_response", ['topic' => $topic, 'status_de' => $status_translation->status_de, 'status_en' => $status_translation->status_en, 'href' => APP_ROOT . 'Cis/Profil'], $email, ("Profil Änderung " . $this->p->t('profilUpdate', 'pending'))); - if (!$mail_res) { - show_error($this->p->t('profilUpdate', 'profilUpdate_email_error')); - } - } - - } - - - private function sendEmail_onProfilUpdate_insertion($uid, $profil_update_id, $topic) - { - if($this->config->item('cis_send_profil_update_mails') === false) - { - return; - } - - $this->load->helper('hlp_sancho_helper'); - $emails = []; - - $isMitarbeiter_res = $this->MitarbeiterModel->isMitarbeiter($uid); - if (isError($isMitarbeiter_res)) { - show_error($this->p->t('profilUpdate', 'profilUpdate_mitarbeiterCheck_error')); - } - $isMitarbeiter_res = getData($isMitarbeiter_res); - - //! if the $uid is a mitarbeiter and student, only the hr is notified by email - if ($isMitarbeiter_res) { - //? user is not a student therefore he is a mitarbeiter, send email to Personalverwaltung - //? use constant variable MAIL_GST to mail to the personalverwaltung - $this->MitarbeiterModel->addSelect([TRUE]); - $this->MitarbeiterModel->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid"); - //? check if the the userID is a mitarbeiter and if the benutzer is active - $res = $this->MitarbeiterModel->loadWhere(["public.tbl_mitarbeiter.mitarbeiter_uid" => $uid, "public.tbl_benutzer.aktiv" => TRUE]); - if (isError($res)) { - show_error("was not able to query the mitarbeiter and benutzer by the uid: " . $uid); - } - if (hasData($res)) { - array_push($emails, MAIL_GST); - } else { - show_error($this->p->t('profilUpdate', 'profilUpdate_mitarbeiterCheck_error')); - } - } else { - //? if it is not a mitarbeiter, check whether it is a student and send email to studiengang - $isStudent_res = $this->StudentModel->isStudent($uid); - if (isError($isStudent_res)) { - show_error($this->p->t('profilUpdate', 'profilUpdate_studentCheck_error')); - } - $isStudent_res = getData($isStudent_res); - if ($isStudent_res) { - //? Send email to the Studiengangsassistentinnen - $this->StudentModel->addSelect(["public.tbl_studiengang.email"]); - $this->StudentModel->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_student.student_uid"); - $this->StudentModel->addJoin("public.tbl_prestudent", "public.tbl_benutzer.person_id = public.tbl_prestudent.person_id"); - $this->StudentModel->addJoin("public.tbl_prestudentstatus", "public.tbl_prestudentstatus.prestudent_id = public.tbl_prestudent.prestudent_id"); - $this->StudentModel->addJoin("public.tbl_studiengang", "public.tbl_studiengang.studiengang_kz = public.tbl_prestudent.studiengang_kz"); - //* check if the benutzer itself is active - //* check if the student status is Student or Diplomand (active students) - $this->StudentModel->db->where_in("public.tbl_prestudentstatus.status_kurzbz", ['Student', 'Diplomand']); - $res = $this->StudentModel->loadWhere(["public.tbl_benutzer.aktiv" => TRUE, "public.tbl_student.student_uid" => $uid]); - if (isError($res)) { - show_error(getData($res)); - } else { - $res = hasData($res) ? getData($res) : []; - foreach ($res as $emailObj) { - array_push($emails, $emailObj->email); - } - } - } - } - $mail_res = []; - //? sending email - foreach ($emails as $email) { - array_push($mail_res, sendSanchoMail("profil_update", ['uid' => $uid, 'topic' => $topic, 'href' => APP_ROOT . 'Cis/ProfilUpdate/id/' . $profil_update_id], $email, ("Profil Änderung von " . $uid))); - } - foreach ($mail_res as $m_res) { - if (!$m_res) { - show_error($this->p->t('profilUpdate', 'profilUpdate_email_error')); - } - } - - } - - public function show($dms_id) { - $profil_update = $this->ProfilUpdateModel->loadWhere(['attachment_id' => $dms_id]); $profil_update = hasData($profil_update) ? getData($profil_update)[0] : null; //? checks if an profil update exists with the dms_id requested from the user - if ($profil_update) { + if ($profil_update) + { $is_mitarbeiter_profil_update = getData($this->MitarbeiterModel->isMitarbeiter($profil_update->uid)); $is_student_profil_update = getData($this->StudentModel->isStudent($profil_update->uid)); @@ -230,7 +60,8 @@ class ProfilUpdate extends Auth_Controller $this->permissionlib->isBerechtigt('student/stammdaten:r') && $is_student_profil_update || $this->permissionlib->isBerechtigt('mitarbeiter/stammdaten:r') && $is_mitarbeiter_profil_update || $this->uid == $profil_update->uid - ) { + ) + { // Get file to be downloaded from DMS $newFilename = $this->uid . "/document_" . $dms_id; $download = $this->dmslib->download($dms_id); @@ -239,576 +70,17 @@ class ProfilUpdate extends Auth_Controller // Download file $this->outputFile(getData($download)); - - - } else { + } + else + { show_error($this->p->t('profilUpdate', 'profilUpdate_permission_error')); return; } - - } else { + } + else + { show_error($this->p->t('profilUpdate', 'profilUpdate_dms_error')); return; } - } - - - public function insertFile($replace) - { - $replace = json_decode($replace); - - if (!count($_FILES)) { - echo json_encode([]); - return; - } - - //? if replace is set it contains the profil_update_id in which the attachment_id has to be replaced - if (isset($replace)) { - $this->ProfilUpdateModel->addSelect(["attachment_id"]); - $profilUpdate = $this->ProfilUpdateModel->load([$replace]); - if (isError($profilUpdate)) { - return json_encode(error($this->p->t('profilUpdate', 'profilUpdate_loading_error'))); - } - //? get the attachmentID - $dms_id = hasData($profilUpdate) ? getData($profilUpdate)[0]->attachment_id : null; - - //? delete old dms_file of Profil Update - $this->deleteOldVersionFile($dms_id); - } - - - $files = $_FILES['files']; - $file_count = count($files['name']); - - $res = []; - - for ($i = 0; $i < $file_count; $i++) { - $_FILES['files']['name'] = $files['name'][$i]; - $_FILES['files']['type'] = $files['type'][$i]; - $_FILES['files']['tmp_name'] = $files['tmp_name'][$i]; - $_FILES['files']['error'] = $files['error'][$i]; - $_FILES['files']['size'] = $files['size'][$i]; - - $dms = [ - "kategorie_kurzbz" => "profil_aenderung", - "version" => 0, - "name" => $_FILES['files']['name'], - "mimetype" => $_FILES['files']['type'], - "beschreibung" => $this->uid . " Profil Änderung", - "insertvon" => $this->uid, - "insertamum" => "NOW()", - ]; - - $tmp_res = $this->dmslib->upload($dms, 'files', array("jpg", "png", "pdf")); - - $tmp_res = hasData($tmp_res) ? getData($tmp_res) : null; - array_push($res, $tmp_res); - } - - echo json_encode($res); - } - - - public function selectProfilRequest() - { - $_GET = json_decode($this->input->raw_input_stream, true); - $uid = $this->input->get('uid'); - $id = $this->input->get('id'); - $whereClause = ['uid' => $this->uid]; - - if (isset($uid)) - $whereClause['uid'] = $uid; - if (isset($id)) - $whereClause['id'] = $id; - - $res = $this->ProfilUpdateModel->getProfilUpdatesWhere($whereClause); - $res = hasData($res) ? getData($res) : null; - echo json_encode($res); - - } - - - public function getProfilRequestFiles() - { - $id = json_decode($this->input->raw_input_stream); - - $this->ProfilUpdateModel->addSelect(["attachment_id"]); - $attachmentID = $this->ProfilUpdateModel->load([$id]); - if (isError($attachmentID)) { - return json_encode(error($this->p->t('profilUpdate', 'profilUpdate_loading_error'))); - } - //? get the attachmentID - $dms_id = hasData($attachmentID) ? getData($attachmentID)[0]->attachment_id : null; - - //? get the name to the file - $this->DmsVersionModel->addSelect(["name", "dms_id"]); - $attachment = $this->DmsVersionModel->load([$dms_id, 0]); - if (isError($attachment)) { - return json_encode(error($this->p->t('profilUpdate', 'profilUpdate_dmsVersion_error'))); - } - $attachment = hasData($attachment) ? getData($attachment) : null; - //? returns {name:..., dms_id:...} - echo json_encode($attachment); - } - - public function insertProfilRequest() - { - - $json = json_decode($this->input->raw_input_stream); - - $payload = $json->payload; - $identifier = property_exists($json->payload, "kontakt_id") ? "kontakt_id" : (property_exists($json->payload, "adresse_id") ? "adresse_id" : null); - - $data = ["topic" => $json->topic, "uid" => $this->uid, "requested_change" => json_encode($payload), "insertamum" => "NOW()", "insertvon" => $this->uid, "status" => self::$STATUS_PENDING ?: 'Pending']; - - //? insert fileID in the dataset if sent with post request - if (isset($json->fileID)) { - $data['attachment_id'] = $json->fileID; - - } - - //? loops over all updateRequests from a user to validate if the new request is valid - $res = $this->ProfilUpdateModel->getProfilUpdatesWhere(["uid" => $this->uid]); - if (isError($res)) { - show_error($this->p->t('profilUpdate', 'profilUpdate_loading_error')); - } - $res = hasData($res) ? getData($res) : null; - - //? the user cannot delete a zustelladresse/kontakt - if (isset($payload->delete) && $payload->{$identifier == "kontakt_id" ? "zustellung" : "zustelladresse"}) { - echo json_encode(error($this->p->t('profilUpdate', 'profilUpdate_deleteZustellung_error'))); - return; - } - - //? if the user tries to delete a adresse, checks whether the adresse is a heimatadresse, if so an error is raised - if (isset($payload->delete) && $identifier == "adresse_id") { - $adr = $this->AdresseModel->load($payload->$identifier); - $adr = getData($adr)[0]; - if ($adr->heimatadresse) { - echo json_encode(error($this->p->t('profilUpdate', 'profilUpdate_deleteZustellung_error'))); - return; - } - } - - if ($res) { - $pending_changes = array_filter($res, function ($element) { - return $element->status == (self::$STATUS_PENDING ?: "Pending"); - }); - - foreach ($pending_changes as $update_request) { - $existing_change = $update_request->requested_change; - - //? the user can add as many new kontakte/adressen as he likes - if (!isset($payload->add) && property_exists($existing_change, $identifier) && property_exists($payload, $identifier) && $existing_change->$identifier == $payload->$identifier) { - //? the kontakt_id / adresse_id of a change has to be unique - echo json_encode(error($this->p->t('profilUpdate', 'profilUpdate_changeTwice_error'))); - return; - } - - //? if it is not updating any kontakt/adresse, the topic has to be unique - elseif (!$identifier && $update_request->topic == $json->topic) { - echo json_encode(error($this->p->t('profilUpdate', 'profilUpdate_changeTopicTwice_error', ['0' => $update_request->topic]))); - return; - } - } - } - - $insertID = $this->ProfilUpdateModel->insert($data); - - if (isError($insertID)) { - show_error(getData($insertID)); - } else { - $insertID = hasData($insertID) ? getData($insertID) : null; - - //? sends emails to the correspondents of the $uid - $this->sendEmail_onProfilUpdate_insertion($this->uid, $insertID, $json->topic); - echo json_encode(success($insertID)); - } - } - - public function updateProfilRequest() - { - $json = json_decode($this->input->raw_input_stream); - - $updateData = ["requested_change" => json_encode($json->payload), "updateamum" => "NOW()", "updatevon" => $this->uid]; - if (isset($json->fileID)) { - $updateData['attachment_id'] = json_decode($json->fileID); - } - $updateID = $this->ProfilUpdateModel->update([$json->ID], $updateData); - //? insert fileID in the dataset if sent with post request - - if (isError($updateID)) { - //catch error - } else { - $updateID = hasData($updateID) ? getData($updateID)[0] : null; - //TODO: should an email be sent to the responsable people when the user changes his profil update - echo json_encode(success($updateID)); - } - } - - public function deleteProfilRequest() - { - - $json = json_decode($this->input->raw_input_stream); - $delete_res = $this->ProfilUpdateModel->delete([$json]); - echo json_encode($delete_res); - } - - - public function getProfilUpdateWithPermission($status = null) - { - // early return if no status has been passed as argument - if (!isset($status)) { - echo json_encode($this->ProfilUpdateModel->getProfilUpdateWithPermission()); - return; - } - - // get the sprache of the user - $sprachenIndex = $this->SpracheModel->loadWhere(["sprache" => getUserLanguage()]); - $sprachenIndex = hasData($sprachenIndex) ? getData($sprachenIndex)[0]->index : null; - - if (isset($sprachenIndex) && isset($status)) { - // get the corresponding status kurz_bz primary key out of the translation - $status = $this->ProfilUpdateStatusModel->execReadOnlyQuery("select * from public.tbl_profil_update_status where ? = ANY(bezeichnung_mehrsprachig)", [$status]); - $status = hasData($status) ? getData($status)[0]->status_kurzbz : null; - $res = $this->ProfilUpdateModel->getProfilUpdateWithPermission(isset($status) ? ['status' => $status] : null); - - echo json_encode($res); - } - } - - - - private function getOE_from_student($student_uid) - { - - //? returns the oe_einheit eines Studenten - $query = "SELECT public.tbl_studiengang.oe_kurzbz - FROM public.tbl_student - JOIN public.tbl_studiengang ON tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz - WHERE public.tbl_student.student_uid = ?;"; - - $res = $this->StudentModel->execReadOnlyQuery($query, [$student_uid]); - if (!isSuccess($res)) { - show_error($this->p->t('profilUpdate', 'profilUpdate_loadingOE_error')); - } - $res = hasData($res) ? getData($res) : []; - $res = array_map( - function ($item) { - return $item->oe_kurzbz; - }, - $res - ); - return $res; - } - - - public function acceptProfilRequest() - { - $_POST = json_decode($this->input->raw_input_stream, true); - $id = $this->input->post('profil_update_id', true); - $uid = $this->input->post('uid', true); - - //? fetching person_id using UID - $personID = $this->PersonModel->getByUid($uid); - $personID = hasData($personID) ? getData($personID)[0]->person_id : null; - $status_message = $this->input->post('status_message', true); - $topic = $this->input->post('topic', true); - - //! somehow the xss check converted boolean false to empty string - $requested_change = $this->input->post('requested_change'); - - //! check for required information - if (!isset($id) || !isset($uid) || !isset($personID) || !isset($requested_change) || !isset($topic)) { - return json_encode(error($this->p->t('profilUpdate', 'profilUpdate_requiredInformation_error'))); - } - - $is_mitarbeiter_profil_update = getData($this->MitarbeiterModel->isMitarbeiter($uid)); - $is_student_profil_update = getData($this->StudentModel->isStudent($uid)); - - - //? check if the permissions are set correctly - if ( - $this->permissionlib->isBerechtigt('student/stammdaten', "suid", $this->getOE_from_student($uid)) && $is_student_profil_update || - $this->permissionlib->isBerechtigt('mitarbeiter/stammdaten', "suid") && $is_mitarbeiter_profil_update - ) { - - if (is_array($requested_change) && array_key_exists("adresse_id", $requested_change)) { - $insertID = $this->handleAdresse($requested_change, $personID); - $insertID = hasData($insertID) ? getData($insertID) : null; - if (isset($insertID)) { - $requested_change['adresse_id'] = $insertID; - $update_res = $this->updateRequestedChange($id, $requested_change); - if (isError($update_res)) { - echo json_encode(error($this->p->t('profilUpdate', 'profilUpdate_address_error', [$insertID]))); - return; - } - } - - } else if (is_array($requested_change) && array_key_exists("kontakt_id", $requested_change)) { - $insertID = $this->handleKontakt($requested_change, $personID); - $insertID = hasData($insertID) ? getData($insertID) : null; - if (isset($insertID)) { - $requested_change['kontakt_id'] = $insertID; - $update_res = $this->updateRequestedChange($id, $requested_change); - if (isError($update_res)) { - echo json_encode(error($this->p->t('profilUpdate', 'profilUpdate_kontakt_error', [$insertID]))); - return; - } - } - - - } else { - switch ($topic) { - // mapping phrasen to database columns to make the update with the correct column names - case self::$TOPICS['Titel']: - $topic = "titelpre"; - break; - case self::$TOPICS['Postnomen']: - $topic = "titelpost"; - break; - case self::$TOPICS['Vorname']: - $topic = "vorname"; - break; - case self::$TOPICS['Nachname']: - $topic = "nachname"; - break; - default: - show_error($this->p->t('profilUpdate', 'profilUpdate_topic_error', [$topic])); - return; - } - - $result = $this->PersonModel->update($personID, [$topic => $requested_change["value"]]); - if (isError($result)) { - echo json_encode(error($this->p->t('profilUpdate', 'profilUpdate_insert_error'))); - return; - } - } - $this->sendEmail_onProfilUpdate_response($uid, $topic, self::$STATUS_ACCEPTED); - - echo json_encode($this->setStatusOnUpdateRequest($id, self::$STATUS_ACCEPTED, $status_message, $requested_change)); - } else { - show_error($this->p->t('profilUpdate', 'profilUpdate_permission_error')); - } - - - } - - public function denyProfilRequest() - { - - $_POST = json_decode($this->input->raw_input_stream, true); - $id = $this->input->post('profil_update_id', true); - $uid = $this->input->post('uid', true); - $topic = $this->input->post('topic', true); - $status_message = $this->input->post('status_message', true); - - $is_mitarbeiter_profil_update = getData($this->MitarbeiterModel->isMitarbeiter($uid)); - $is_student_profil_update = getData($this->StudentModel->isStudent($uid)); - - - if ( - $this->permissionlib->isBerechtigt('student/stammdaten', "suid", $this->getOE_from_student($uid)) && $is_student_profil_update || - $this->permissionlib->isBerechtigt('mitarbeiter/stammdaten', "suid") && $is_mitarbeiter_profil_update - ) { - $this->sendEmail_onProfilUpdate_response($uid, $topic, self::$STATUS_REJECTED); - echo json_encode($this->setStatusOnUpdateRequest($id, self::$STATUS_REJECTED, $status_message)); - } else { - show_error($this->p->t('profilUpdate', 'profilUpdate_permission_error')); - } - - - } - - private function updateRequestedChange($id, $requested_change) - { - return $this->ProfilUpdateModel->update([$id], ['requested_change' => json_encode($requested_change)]); - } - - private function setStatusOnUpdateRequest($id, $status, $status_message) - { - return $this->ProfilUpdateModel->update([$id], ["status" => $status, "status_timestamp" => "NOW()", "status_message" => $status_message]); - } - - private function deleteOldVersionFile($dms_id) - { - if (!isset($dms_id)) { - return; - } - - //? collect all the results of the deleted versions in an array - $res = array(); - - //? delete all the different versions of the dms_file - $dmsVersions = $this->DmsVersionModel->loadWhere(["dms_id" => $dms_id]); - $dmsVersions = hasData($dmsVersions) ? getData($dmsVersions) : null; - if (isset($dmsVersions)) { - $zwischen_res = array_map(function ($item) { - return $item->version; - }, $dmsVersions); - foreach ($zwischen_res as $version) { - array_push($res, $this->DmsVersionModel->delete([$dms_id, $version])); - } - } else { - echo json_encode(error($this->p->t('profilUpdate', 'profilUpdate_dmsVersion_error'))); - } - - //? returns a result for each deleted dms_file - return $res; - } - - - private function handleKontakt($requested_change, $personID) - { - $kontakt_id = $requested_change["kontakt_id"]; - //? removes the kontakt_id because we don't want to update the kontakt_id in the database - unset($requested_change["kontakt_id"]); - - - //! ADD - if (array_key_exists('add', $requested_change) && $requested_change['add']) { - //? removes add flag - unset($requested_change['add']); - $requested_change['person_id'] = $personID; - $requested_change['insertamum'] = "NOW()"; - $requested_change['insertvon'] = getAuthUID(); - $insertID = $this->KontaktModel->insert($requested_change); - $insert_kontakt_id = $insertID; - if (isError($insert_kontakt_id)) { - show_error($this->p->t('profilUpdate', 'profilUpdate_insertKontakt_error')); - } - $insert_kontakt_id = hasData($insert_kontakt_id) ? getData($insert_kontakt_id) : null; - if ($insert_kontakt_id) { - $this->handleDupplicateZustellKontakte($requested_change['zustellung'], $insert_kontakt_id); - } - - - } - //! DELETE - elseif (array_key_exists('delete', $requested_change) && $requested_change['delete']) { - $this->KontaktModel->delete($kontakt_id); - } - //! UPDATE - else { - $requested_change['updateamum'] = "NOW()"; - $requested_change['updatevon'] = getAuthUID(); - - $update_kontakt_id = $this->KontaktModel->update($kontakt_id, $requested_change); - - if (isError($update_kontakt_id)) { - show_error($this->p->t('profilUpdate', 'profilUpdate_updateKontakt_error')); - } - $update_kontakt_id = hasData($update_kontakt_id) ? getData($update_kontakt_id) : null; - if ($update_kontakt_id) { - $this->handleDupplicateZustellKontakte($requested_change['zustellung'], $update_kontakt_id); - } - } - return isset($insertID) ? $insertID : null; - } - - private function handleAdresse($requested_change, $personID) - { - - $this->AdressenTypModel->addSelect(["adressentyp_kurzbz"]); - $adr_kurzbz = $this->AdressenTypModel->loadWhere(["bezeichnung" => $requested_change['typ']]); - $adr_kurzbz = hasData($adr_kurzbz) ? getData($adr_kurzbz)[0]->adressentyp_kurzbz : null; - //? replace the address_typ with its correct kurzbz foreign key - $requested_change['typ'] = $adr_kurzbz; - - $adresse_id = $requested_change["adresse_id"]; - //? removes the adresse_id because we don't want to update the kontakt_id in the database - unset($requested_change["adresse_id"]); - - - //! ADD - if (array_key_exists('add', $requested_change) && $requested_change['add']) { - - //? removes add flag - unset($requested_change['add']); - $requested_change['insertamum'] = "NOW()"; - $requested_change['insertvon'] = getAuthUID(); - $requested_change['person_id'] = $personID; - //TODO: zustelladresse, heimatadresse, rechnungsadresse und nation werden nicht beachtet - $insertID = $this->AdresseModel->insert($requested_change); - $insert_adresse_id = $insertID; - if (isError($insert_adresse_id)) { - show_error($this->p->t('profilUpdate', 'profilUpdate_insertAdresse_error')); - } - $insert_adresse_id = hasData($insert_adresse_id) ? getData($insert_adresse_id) : null; - if ($insert_adresse_id) { - $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $insert_adresse_id); - } - - } - //! DELETE - elseif (array_key_exists('delete', $requested_change) && $requested_change['delete']) { - $this->AdresseModel->delete($adresse_id); - } - //! UPDATE - else { - $requested_change['updateamum'] = "NOW()"; - $requested_change['updatevon'] = getAuthUID(); - $update_adresse_id = $this->AdresseModel->update($adresse_id, $requested_change); - if (isError($update_adresse_id)) { - show_error($this->p->t('profilUpdate', 'profilUpdate_updateAdresse_error')); - } - $update_adresse_id = hasData($update_adresse_id) ? getData($update_adresse_id) : null; - if ($update_adresse_id) { - $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $update_adresse_id); - } - } - return isset($insertID) ? $insertID : null; - } - - - private function handleDupplicateZustellKontakte($zustellung, $kontakt_id) - { - if ($zustellung) { - $this->PersonModel->addSelect("public.tbl_kontakt.kontakt_id"); - $this->PersonModel->addJoin("public.tbl_kontakt", "public.tbl_kontakt.person_id = public.tbl_person.person_id"); - $zustellKontakteArray = $this->PersonModel->loadWhere(["public.tbl_person.person_id" => $this->pid, "zustellung" => TRUE]); - if (!isSuccess($zustellKontakteArray)) { - return error($this->p->t('profilUpdate', 'profilUpdate_loadingZustellkontakte_error')); - } - $zustellKontakteArray = hasData($zustellKontakteArray) ? getData($zustellKontakteArray) : null; - - if ($zustellung && count($zustellKontakteArray) > 0) { - $zustellKontakteArray = array_filter($zustellKontakteArray, function ($kontakt) use ($kontakt_id) { - return $kontakt->kontakt_id != $kontakt_id; - }); - foreach ($zustellKontakteArray as $kontakt) { - $this->KontaktModel->update($kontakt->kontakt_id, ["zustellung" => FALSE]); - } - - } - } - } - - private function handleDupplicateZustellAdressen($zustellung, $adresse_id) - { - if ($zustellung) { - $this->PersonModel->addSelect("public.tbl_adresse.adresse_id"); - $this->PersonModel->addJoin("public.tbl_adresse", "public.tbl_adresse.person_id = public.tbl_person.person_id"); - $zustellAdressenArray = $this->PersonModel->loadWhere(["public.tbl_person.person_id" => $this->pid, "zustelladresse" => TRUE]); - if (!isSuccess($zustellAdressenArray)) { - return error($this->p->t('profilUpdate', 'profilUpdate_loadingZustellAdressen_error')); - } - $zustellAdressenArray = hasData($zustellAdressenArray) ? getData($zustellAdressenArray) : null; - - if ($zustellung && count($zustellAdressenArray) > 0) { - - $zustellAdressenArray = array_filter($zustellAdressenArray, function ($adresse) use ($adresse_id) { - - return $adresse->adresse_id != $adresse_id; - }); - foreach ($zustellAdressenArray as $adresse) { - $this->AdresseModel->update($adresse->adresse_id, ["zustelladresse" => FALSE]); - } - - } - } - } - - -} \ No newline at end of file +} diff --git a/application/controllers/Cis/Pub.php b/application/controllers/Cis/Pub.php index bebc844ab..de456145b 100644 --- a/application/controllers/Cis/Pub.php +++ b/application/controllers/Cis/Pub.php @@ -14,7 +14,7 @@ class Pub extends Auth_Controller { parent::__construct( array( - 'bild' => ['basis/cis:r'] + 'bild' => ['basis/cis:r', 'assistenz:r'] ) ); } diff --git a/application/controllers/Cis/Stundenplan.php b/application/controllers/Cis/Raumsuche.php similarity index 84% rename from application/controllers/Cis/Stundenplan.php rename to application/controllers/Cis/Raumsuche.php index 71e01be8b..055038275 100644 --- a/application/controllers/Cis/Stundenplan.php +++ b/application/controllers/Cis/Raumsuche.php @@ -5,7 +5,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** * */ -class Stundenplan extends Auth_Controller +class Raumsuche extends Auth_Controller { /** * Constructor @@ -25,11 +25,11 @@ class Stundenplan extends Auth_Controller */ public function index() { - + $viewData = array( 'uid'=>getAuthUID(), ); - - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Stundenplan']); + + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Raumsuche']); } } diff --git a/application/controllers/Cis/Studium.php b/application/controllers/Cis/Studium.php new file mode 100644 index 000000000..a298de648 --- /dev/null +++ b/application/controllers/Cis/Studium.php @@ -0,0 +1,40 @@ + ['basis/cis:r'], + + ]); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + + /** + * index loads the Studium view + * @access public + * @return void + */ + public function index() + { + $viewData = array( + + ); + $this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'studium']); + } + + + +} diff --git a/application/controllers/Cis4.php b/application/controllers/Cis4.php index c0ca8d503..b7ba2029d 100644 --- a/application/controllers/Cis4.php +++ b/application/controllers/Cis4.php @@ -17,6 +17,9 @@ class Cis4 extends Auth_Controller 'index' => 'basis/cis:r' ) ); + + // Load Config + $this->load->config('calendar'); } // ----------------------------------------------------------------------------------------------------------------- @@ -27,15 +30,16 @@ class Cis4 extends Auth_Controller */ public function index() { - $this->load->model('person/Person_model','PersonModel'); + $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 + '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', ['viewData' => $viewData, 'route' => 'FhcDashboard']); } -} \ No newline at end of file +} diff --git a/application/controllers/CisVue/Cms.php b/application/controllers/CisVue/Cms.php index a9ff13c53..aa07b919f 100644 --- a/application/controllers/CisVue/Cms.php +++ b/application/controllers/CisVue/Cms.php @@ -87,9 +87,14 @@ class Cms extends Auth_Controller $this->load->view('CisRouterView/CisRouterView.php', ['viewData'=>$viewData, 'route' => 'News']); } - public function getRoomInformation($ort_kurzbz){ + public function getRoomInformation($ort_kurzbz) + { + // Load Config + $this->load->config('calendar'); + $viewData = array( - 'ort_kurzbz' => $ort_kurzbz + 'ort_kurzbz' => $ort_kurzbz, + 'timezone' => $this->config->item('timezone') ); $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'CmsRoom']); } diff --git a/application/controllers/LVVerwaltung.php b/application/controllers/LVVerwaltung.php new file mode 100644 index 000000000..2a79d6375 --- /dev/null +++ b/application/controllers/LVVerwaltung.php @@ -0,0 +1,42 @@ +method] = ['admin:r', 'assistenz:r']; + parent::__construct($permissions); + + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + } + + /** + * @return void + */ + public function _remap() + { + $this->load->view('LVVerwaltung', [ + 'permissions' => [ + 'lehre/lehrveranstaltung' => $this->permissionlib->isBerechtigt('lehre/lehrveranstaltung'), + 'lv-plan/gruppenentfernen' => $this->permissionlib->isBerechtigt('lv-plan/gruppenentfernen'), + 'lv-plan/lektorentfernen' => $this->permissionlib->isBerechtigt('lv-plan/lektorentfernen'), + ], + 'variables' => [ + 'semester_aktuell' => $this->variablelib->getVar('semester_aktuell') + ], + 'configs' => [ + 'showVertragsdetails' => defined('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN') && FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN, + 'showGewichtung' => defined('CIS_GESAMTNOTE_GEWICHTUNG') && CIS_GESAMTNOTE_GEWICHTUNG, + 'lehreinheitAnmerkungDefault' => defined('LEHREINHEIT_ANMERKUNG_DEFAULT') ? LEHREINHEIT_ANMERKUNG_DEFAULT : '', + 'lehreinheitRaumtypDefault' => defined('DEFAULT_LEHREINHEIT_RAUMTYP') ? DEFAULT_LEHREINHEIT_RAUMTYP : '', + 'lehreinheitRaumtypAlternativeDefault' => defined('DEFAULT_LEHREINHEIT_RAUMTYP_ALTERNATIV') ? DEFAULT_LEHREINHEIT_RAUMTYP_ALTERNATIV : '' + ] + ]); + + } +} diff --git a/application/controllers/NeueNachricht.php b/application/controllers/NeueNachricht.php new file mode 100644 index 000000000..b0ff5c554 --- /dev/null +++ b/application/controllers/NeueNachricht.php @@ -0,0 +1,37 @@ +method] = ['vertrag/mitarbeiter:r']; + parent::__construct($permissions); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + } + + /** + * @return void + */ + public function _remap() + { + $typeid = $this->input->post('typeid'); + $ids = ($this->input->post('ids') && strpos($this->input->post('ids'), ',')) + ? explode(',', $this->input->post('ids')) + : $this->input->post('ids'); + + //now working + $this->load->view('Nachrichten', [ + 'permissions' => [ + 'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'), + ], + 'ids' => $ids, + 'typeid' => $typeid + ]); + } +} diff --git a/application/controllers/Studentenverwaltung.php b/application/controllers/Studentenverwaltung.php index 2ce19c58a..36c91d5f6 100644 --- a/application/controllers/Studentenverwaltung.php +++ b/application/controllers/Studentenverwaltung.php @@ -32,6 +32,10 @@ class Studentenverwaltung extends Auth_Controller 'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'), 'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'), 'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'), + 'student/editBakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array(), + 'student/editMakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array(), + 'student/editDokZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array(), + 'student/editBismelden' => $this->permissionlib->isBerechtigt('student/editBismelden') ], 'variables' => [ 'semester_aktuell' => $this->variablelib->getVar('semester_aktuell') diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php new file mode 100644 index 000000000..b37c64713 --- /dev/null +++ b/application/controllers/api/frontend/v1/Abgabe.php @@ -0,0 +1,1339 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +use CI3_Events as Events; + +class Abgabe extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + parent::__construct([ + 'getConfig' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'getConfigStudent' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'), + 'getStudentProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'), + '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'), + 'getMitarbeiterProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'postProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'deleteProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor: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, + 'getNoten' => self::PERM_LOGGED, + 'getProjektarbeitenForStudiengang' =>array('basis/abgabe_assistenz:rw'), + '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') + ]); + + $this->load->library('PhrasesLib'); + $this->load->library('SignatureLib'); + + // Loads LogLib with different debug trace levels to get data of the job that extends this class + // It also specify parameters to set database fields + $this->load->library('LogLib', array( + 'classIndex' => 5, + 'functionIndex' => 5, + 'lineIndex' => 4, + 'dbLogType' => 'API', // required + 'dbExecuteUser' => 'RESTful API', + 'requestId' => 'API', + 'requestDataFormatter' => function ($data) { + return json_encode($data); + } + ), 'logLib'); + + $this->loadPhrases( + array( + 'global', + 'ui', + 'abgabetool' + ) + ); + $this->load->config('abgabe'); + $this->load->helper('hlp_sancho_helper'); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * loads config related to abgabetool, found in application/config/abgabe + */ + public function getConfig() { + $old_abgabe_beurteilung_link =$this->config->item('old_abgabe_beurteilung_link'); + $turnitin_link = $this->config->item('turnitin_link'); + $abgabetypenBetreuer = $this->config->item('ALLOWED_ABGABETYPEN_BETREUER'); + $ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'); + $ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER = $this->config->item('ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'); + + $ret = array( + 'old_abgabe_beurteilung_link' => $old_abgabe_beurteilung_link, + 'turnitin_link' => $turnitin_link, + 'abgabetypenBetreuer' => $abgabetypenBetreuer, + 'ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT' => $ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT, + 'ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER' => $ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER + ); + + $this->terminateWithSuccess($ret); + } + + /** + * 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'); + + $ret = array( + 'moodle_link' => $moodle_link, + ); + + $this->terminateWithSuccess($ret); + } + + /** + * fetches all projektabgabetermine for a given projektarbeit_id used in cis4 student abgabetool & lektor abgabetool + */ + public function getStudentProjektabgaben() { + $projektarbeit_id = $this->input->get("projektarbeit_id",TRUE); + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general'); + + if(count($projektarbeitArr) > 0) { + $projektarbeit = $projektarbeitArr[0]; + } else { + $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), '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; + + $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)); + } + } + + /** + * fetches all projektarbeiten and betreuer for a given student_uid used in cis4 student abgabetool + */ + public function getStudentProjektarbeiten() + { + $uid = $this->input->get("uid",TRUE); + + $this->load->model('person/Person_model', 'PersonModel'); + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + // if uid is missing or empty, fall back to getAuthUID() + if ($uid === NULL || trim((string)$uid) === '') { + $uid = getAuthUID(); + } + + $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID()); + if ($isMitarbeiter) { + $result = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer($uid); + } else { + $result = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer(getAuthUID()); + } + + $projektarbeiten = getData($result); + + if(count($projektarbeiten)) { + foreach($projektarbeiten as $pa) { + + $pa->student = getData($this->PersonModel->getFullName($uid)); + + $downloadPaFunc = function ($babgeschickt, $zweitbetreuer_abgeschickt) use ($pa) { + $pa->babgeschickt = $babgeschickt; + $pa->zweitbetreuer_abgeschickt = $zweitbetreuer_abgeschickt; + }; + + Events::trigger('projektbeurteilung_check_available', $pa->projektarbeit_id, $pa->bperson_id, $downloadPaFunc); + + if(isset($pa->babgeschickt) && $pa->babgeschickt) { + $downloadLink1 = ''; + $downloadLinkFunc1 = function ($link) use (&$downloadLink1) { + $downloadLink1 = $link; + }; + + Events::trigger('projektbeurteilung_download_link', $pa->projektarbeit_id, $pa->betreuerart_kurzbz, $pa->bperson_id, $downloadLinkFunc1); + + // use config fallback in case the event fails + if($downloadLink1 == '') { + $fallback = $this->config->item('beurteilung_link_fallback'); + + $search = array( + 'betreuerart_kurzbz=?', + 'projektarbeit_id=?', + 'person_id=?' + ); + + $replace = array( + 'betreuerart_kurzbz=' . $pa->betreuerart_kurzbz, + 'projektarbeit_id=' . $pa->projektarbeit_id, + 'person_id=' . $pa->bperson_id + ); + + $fallback = str_replace($search, $replace, $fallback); + $downloadLink1 = APP_ROOT.$fallback; + + } + $pa->downloadLink1 = $downloadLink1; + } + + $pa->email = $pa->mitarbeiter_uid.'@'.DOMAIN; + + if($pa->zweitbetreuer_person_id !== null) { + + if($pa->zweitbetreuer_abgeschickt) { + $downloadLink2 = ''; + $downloadLinkFunc2 = function ($link) use (&$downloadLink2) { + $downloadLink2 = $link; + }; + + Events::trigger('projektbeurteilung_download_link', $pa->projektarbeit_id, $pa->zweitbetreuer_betreuerart_kurzbz, $pa->zweitbetreuer_person_id, $downloadLinkFunc2); + + // use config fallback in case the event fails + if($downloadLink2 == '') { + $fallback = $this->config->item('beurteilung_link_fallback'); + + $search = array( + 'betreuerart_kurzbz=?', + 'projektarbeit_id=?', + 'person_id=?' + ); + + $replace = array( + 'betreuerart_kurzbz=' . $pa->zweitbetreuer_betreuerart_kurzbz, + 'projektarbeit_id=' . $pa->projektarbeit_id, + 'person_id=' . $pa->zweitbetreuer_person_id + ); + + $fallback = str_replace($search, $replace, $fallback); + $downloadLink2 = APP_ROOT.$fallback; + + } + + $pa->downloadLink2 = $downloadLink2; + } + + $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($pa->zweitbetreuer_person_id); + + $data = getData($result); + if(count($data) > 0) { + $pa->zweitbetreuer = $data[0]; + } + } + } + } + + $this->terminateWithSuccess(array($projektarbeiten)); + } + + + + /** + * projektarbeit - upload for zwischenabgaben in cis4 student abgabetool + */ + public function postStudentProjektarbeitZwischenabgabe() + { + $this->checkUploadSize(); + + $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); + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + if(getAuthUID() == $student_uid || $zugeordnet) { + + + $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'); + } + + } else { + $this->terminateWithError('File missing', 'general'); + } + } else { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent')); + } + +} + + /** + * upload für finale abgaben aka Endupload in cis4 student abgabetool + */ + public function postStudentProjektarbeitEndupload() + { + $this->checkUploadSize(); + + $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'); + $schlagwoerter = $this->input->post('schlagwoerter'); + $schlagwoerter_en = $this->input->post('schlagwoerter_en'); + $seitenanzahl = $this->input->post('seitenanzahl'); + $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) === '' + || $abstract === NULL || $abstract_en === NULL + || $schlagwoerter === NULL || $schlagwoerter_en === NULL + || $seitenanzahl === NULL || $sprache === NULL) { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $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'); + + if (file_exists(PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf')) { + + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general'); + + if (count($projektarbeitArr) > 0) { + $projektarbeit = $projektarbeitArr[0]; + } else { + $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 + $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); + } else { + $this->terminateWithError('Error moving File', 'general'); + } + + } else { + $this->terminateWithError('File missing', 'general'); + } + } else { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent')); + } + + } + + /** + * tabulator tabledata fetch for abgabetool/mitarbeiter + * initially fetches all currently active projektarbeiten with assigned mentorship + * showAll functionality also retrieves older finished projektarbeiten + */ + public function getMitarbeiterProjektarbeiten() { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $boolParamStr = $this->input->get('showall'); + $trueStrings = ['true', '1']; + $falseStrings = ['false', '0']; + + // Handle missing or invalid parameter + if ($boolParamStr === null) { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + $boolParamStrLower = strtolower($boolParamStr); + + $showAllBool = false; // fallback if input strings are anything else for whatever reason + if (in_array($boolParamStrLower, $trueStrings, true)) { + $showAllBool = true; + } elseif (in_array($boolParamStrLower, $falseStrings, true)) { + $showAllBool = false; + } + + $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool); + + + 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) { + $newLink = $resultNew; + $oldLink = $resultOld; + }; + + Events::trigger('projektbeurteilung_formular_link', $pa->betreuerart_kurzbz, APP_ROOT, $pa->projektarbeit_id, $pa->student_uid, $returnFunc); + $pa->beurteilungLinkNew = $newLink; + $pa->beurteilungLinkOld = $oldLink; + } + + + $this->terminateWithSuccess(array($projektarbeiten, DOMAIN)); + } + + /** + * called by abgabetool/mitarbeiter in mitarbeiterdetail.js when adding a single new abgabetermin + * initially fetches all + */ + public function postProjektarbeitAbgabe() { + $projektarbeit_id = $this->input->post('projektarbeit_id'); + $paabgabe_id = $this->input->post('paabgabe_id'); + $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz'); + $datum = $this->input->post('datum'); + $fixtermin = $this->input->post('fixtermin'); + $kurzbz = $this->input->post('kurzbz'); + $note = $this->input->post('note'); + $beurteilungsnotiz = $this->input->post('beurteilungsnotiz'); + $upload_allowed = $this->input->post('upload_allowed'); + $betreuer_person_id = $this->input->post('betreuer_person_id'); + + if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '' + || $paabgabe_id === NULL || trim((string)$paabgabe_id) === '' + || $datum === NULL || trim((string)$datum) === '' + || $kurzbz === NULL + || $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + if(!$zugeordnet) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent')); + } + + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + + $existingPaabgabe = null; + if($paabgabe_id == -1) { + $result = $this->PaabgabeModel->insert( + array( + 'projektarbeit_id' => $projektarbeit_id, + 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, + 'fixtermin' => $fixtermin, + 'datum' => $datum, + 'kurzbz' => $kurzbz, + 'note' => $note, + 'beurteilungsnotiz' => $beurteilungsnotiz, + 'upload_allowed' => $upload_allowed, + 'insertvon' => getAuthUID(), + 'insertamum' => date('Y-m-d H:i:s') + ) + ); + $this->logLib->logInfoDB(array('paabgabe created',$result, getAuthUID(), getAuthPersonId())); + } else { + // 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]; + + $result = $this->PaabgabeModel->update( + $paabgabe_id, + array( + 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, + 'datum' => $datum, + 'kurzbz' => $kurzbz, + 'note' => $note, + 'fixtermin' => $fixtermin, + 'beurteilungsnotiz' => $beurteilungsnotiz, + 'upload_allowed' => $upload_allowed, + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ) + ); + + $this->logLib->logInfoDB(array('paabgabe updated',$result, array( + 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, + 'datum' => $datum, + 'kurzbz' => $kurzbz, + 'note' => $note, + 'fixtermin' => $fixtermin, + 'beurteilungsnotiz' => $beurteilungsnotiz, + 'upload_allowed' => $upload_allowed, + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId())); + } + + // check if $paaabgabe is a qual gate and its note is deemed negative + // -> send email to student with that info + $paabgabe_id = $this->getDataOrTerminateWithError($result, 'general'); + + $result = $this->PaabgabeModel->load($paabgabe_id); + $paabgabeArr = $this->getDataOrTerminateWithError($result, 'general'); + $paabgabe = $paabgabeArr[0]; + + // check if abgabe even has note + if($paabgabe->note) { + $this->load->model('education/Note_model', 'NoteModel'); + $result = $this->NoteModel->load($paabgabe->note); + $noteArr = $this->getDataOrTerminateWithError($result, 'general'); + $note = $noteArr[0]; + if($note->positiv === false) { + + if($existingPaabgabe && $existingPaabgabe->note) { + $result = $this->NoteModel->load($paabgabe->note); + $noteArr = $this->getDataOrTerminateWithError($result, 'general'); + $note = $noteArr[0]; + if($note->positiv === false) { + // do nothing since this means $beurteilungsnotiz change or smth else + } else { // benotung legitimately changed -> email + $this->sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe); + } + } else { // nothing existing previously -> send that mail + $this->sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe); + } + + } + } + + $this->terminateWithSuccess([$paabgabe, $existingPaabgabe]); + } + + /** + * 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 + * none of these roles are allowed to delete if students uploaded something for that termin + */ + public function deleteProjektarbeitAbgabe() { + $paabgabe_id = $this->input->post('paabgabe_id'); + + if ($paabgabe_id === NULL || trim((string)$paabgabe_id) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->checkProjektarbeitForFinishedStatus($this->getProjektarbeitIDForPaabgabeID($paabgabe_id)); + + $zugeordnet = $this->checkZuordnungByPaabgabe($paabgabe_id, getAuthUID()); + + if(!$zugeordnet) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + } + + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + + $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'); + + // TODO: consider this in nightly email job + $this->logLib->logInfoDB(array($paabgabeArr[0], getAuthUID(), getAuthPersonId())); + $this->terminateWithSuccess($result); + } + + /** + * endpoint for adding the same paabgabe for multiple projektarbeiten + * can be slow for large n since it queries twice per projektarbeit_id + */ + public function postSerientermin() { + $projektarbeit_ids = $this->input->post('projektarbeit_ids'); + $datum = $this->input->post('datum'); + $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz'); + $bezeichnung = $this->input->post('bezeichnung'); + $kurzbz = $this->input->post('kurzbz'); + $fixtermin = $this->input->post('fixtermin'); + $upload_allowed = $this->input->post('upload_allowed'); + + if ($projektarbeit_ids === NULL || !is_array($projektarbeit_ids) || empty($projektarbeit_ids) + || $datum === NULL || trim((string)$datum) === '' + || $kurzbz === NULL + || $bezeichnung === NULL || trim((string)$bezeichnung) === '' + || $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + // old script checks if there already are tbl_paabgabe entries with exact date, type & kurzbz + // for each termin - good to check that in principle but should not matter in this place. if necessary + // duplicate abgabetermine can be easily deleted manually, also via cronjob@night. + + // since this entry includes the kurzbz string match, it should have only ever mattered when there were + // multiple users entering the exact same set of (date, type, kurzbz) - which is a much more narrow case than the + // general "saveMultiple" function should handle + + // old script afterwards again queries if user is not the zweitbetreuer of any id - this is blocked in the ui + // 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); + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + if(!$zugeordnet) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + } + + $result = $this->PaabgabeModel->insert( + array( + 'projektarbeit_id' => $projektarbeit_id, + 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, + 'fixtermin' => $fixtermin, + 'datum' => $datum, + 'kurzbz' => $kurzbz, + 'upload_allowed' => $upload_allowed, + 'insertvon' => getAuthUID(), + 'insertamum' => date('Y-m-d H:i:s') + ) + ); + + $dataAbgabe = $this->getDataOrTerminateWithError($result, 'general'); + + $abgaben[]= getData($this->PaabgabeModel->load($dataAbgabe))[0]; + } + + $this->logLib->logInfoDB(array('serientermin angelegt',$res, getAuthUID(), getAuthPersonId())); + + $this->terminateWithSuccess($abgaben); + } + + /** + * called by Abgabetool/Deadlines + * fetches the next upcoming abgabtermine for a given betreuer person_id + * resembles the legacy abgabetool functionality of "show deadlines" + */ + public function fetchDeadlines() { + $person_id = $this->input->post('person_id'); + + if ($person_id === NULL || trim((string)$person_id) === '') { + $person_id = getAuthPersonId(); + } + + if($person_id !== getAuthPersonId()) { + $this->load->library('PermissionLib'); + $isAdmin = $this->permissionlib->isBerechtigt('admin'); + if(!$isAdmin) $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general'); + } + + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + $result = $this->PaabgabeModel->getDeadlines($person_id); + $data = $this->getDataOrTerminateWithError($result, 'general'); + + $this->terminateWithSuccess($data); + } + + /** + * called by Abgabetool/Mitarbeiter & Abgabetool/Assistenz + * fetches all available paabgabetypen to enable a logical selection of them + * based on active status and role assistenz/betreuer + */ + public function getPaAbgabetypen() { + $this->load->model('education/Paabgabetyp_model', 'PaabgabetypModel'); + + $result = $this->PaabgabetypModel->getAll(); + $paabgabetypen = $this->getDataOrTerminateWithError($result, 'general'); + + + $this->terminateWithSuccess($paabgabetypen); + } + + /** + * helper function to fetch the correct email for a projektarbeits erstbetreuer + */ + private function getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id) { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $result = $this->ProjektarbeitModel->getProjektbetreuerEmail($projektarbeit_id); + $email = $this->getDataOrTerminateWithError($result, 'general'); + + return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email; + + } + + /** + * helper function to fetch the correct email for a projektarbeits zweitbetreuer by their person id + * can be used for erstbetreuer aswell if necessary + */ + 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; + } + + //TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API + + /** + * GET METHOD + * returns List of all available & active NotenOptions + */ + public function getNoten() { + $this->load->model('education/Note_model', 'NoteModel'); + + $result = $this->NoteModel->getAllActive(); + $noten = $this->getDataOrTerminateWithError($result, 'general'); + + $allowed_noten_abgabetool = $this->config->item('ALLOWED_NOTEN_ABGABETOOL'); + + $nonfinal_noten_abgabetool = $this->config->item('NONFINAL_NOTEN_ABGABETOOL'); + + + $this->terminateWithSuccess(array($noten, $allowed_noten_abgabetool, $nonfinal_noten_abgabetool)); + } + + /** + * helper function to send a sancho mail to students if a betreuer or assistenz grades a quality gate + * termin as negative (nicht bestanden) + */ + private function sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe) { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general'); + $projektarbeit = $projektarbeitArr[0]; + + $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($betreuer_person_id); + $anredeArr = $this->getDataOrTerminateWithError($result, 'general'); + $anrede = $anredeArr[0]; + + $student_uid = $projektarbeit->student_uid; + + $this->load->model('education/Paabgabetyp_model', 'PaabgabetypModel'); + $result = $this->PaabgabetypModel->load($paabgabe->paabgabetyp_kurzbz); + $paabgabetyp_kurzbzArr = $this->getDataOrTerminateWithError($result, 'general'); + $paabgabetyp_kurzbz = $paabgabetyp_kurzbzArr[0]; + + // Mail an Student wenn Qualgate negativ beurteilt wurde + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->load([$student_uid]); + $studentArr = $this->getDataOrTerminateWithError($result, 'general'); + $student = $studentArr[0]; + + if(!$student) { + $this->terminateWithError($this->p->t('abgabetool','c4userNichtGefunden'), 'general'); + } + + $subject = $this->p->t('abgabetool', 'c4qualgateNegativEmailSubjectv2'); + $tomail = $student_uid.'@'.DOMAIN; + + $datetime = new DateTime($paabgabe->datum); + $dateEmailFormatted = $datetime->format('d.m.Y'); + + $data = array( + 'betreuerfullname' => $anrede->first, + 'qualgatebezeichnung' => $paabgabetyp_kurzbz->bezeichnung, + 'datum' => $dateEmailFormatted, + 'projektarbeitname' => $projektarbeit->titel + ); + + // students still get theirs on event, since it is very unlikely that this + // leads to spam on their end + + $mailres = sendSanchoMail( + 'QualGateNegativ', + $data, + $tomail, + $subject + ); + + } + + /** + * tabulator tabledata fetch for abgabetool/assistenz + * initially fetches all ungraded projektarbeiten with all their abgabetermine + */ + public function getProjektarbeitenForStudiengang() { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $studiengang_kz = $this->input->get("studiengang_kz", TRUE); + $benotet = $this->input->get("benotet", TRUE); + + if ($studiengang_kz === NULL || trim((string)$studiengang_kz) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + // TODO: recheck getSTGEntitlement here! + $stg_allowed = $this->permissionlib->getSTG_isEntitledFor('basis/abgabe_assistenz:rw'); + if($stg_allowed == false) { + $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general'); + } + + // check if provided studiengang_kz is included in stg_allowed to proceed + if(!in_array($studiengang_kz, $stg_allowed)) { + $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general'); + } + + $result = $this->ProjektarbeitModel->getProjektarbeitenForStudiengang($studiengang_kz, $benotet); + $projektarbeiten = $this->getDataOrTerminateWithError($result, 'general'); + + if(count($projektarbeiten) == 0) { // avoid further abgabetermin queries if the are no projektarbeiten + $this->terminateWithSuccess(array($projektarbeiten, DOMAIN)); + } + + $mapFunc = function($projektarbeit) { + return $projektarbeit->projektarbeit_id; + }; + $projektarbeiten_ids = array_map($mapFunc, $projektarbeiten); + + $ret = $this->ProjektarbeitModel->getProjektarbeitenAbgabetermine($projektarbeiten_ids); + $projektabgaben = $this->getDataOrTerminateWithError($ret, 'general'); + + // map the abgaben into projektarbeiten + foreach($projektarbeiten as $projektarbeit) { + $projektarbeit->betreuer_mail = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit->projektarbeit_id); + + if($projektarbeit->zweitbetreuer_person_id !== null) { + $projektarbeit->zweitbetreuer_mail = $this->getProjektbetreuerEmailByPersonID($projektarbeit->zweitbetreuer_person_id); + } + + $filterFunc = function($projektabgabe) use ($projektarbeit) { + return $projektabgabe->projektarbeit_id == $projektarbeit->projektarbeit_id; + }; + + $projektarbeit->abgabetermine = array_values(array_filter($projektabgaben, $filterFunc)); + } + + $this->terminateWithSuccess(array($projektarbeiten, DOMAIN)); + } + + // TODO: this could be in a generic info controller and reused + /** + * GET METHOD + * returns List of all studiengang_kz a user has the assigned permission 'basis/abgabe_assistenz:rw' for + * used in Abgabetool/Assistenz to populate Studiengang Dropdown + */ + public function getStudiengaenge() { + $this->load->library('PermissionLib'); + + $stg_allowed = $this->permissionlib->getSTG_isEntitledFor('basis/abgabe_assistenz:rw'); + + if($stg_allowed == false) { + $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general'); + } + + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $result = $this->StudiengangModel->getStudiengaengeFiltered($stg_allowed); + $data = $this->getDataOrTerminateWithError($result, 'general'); + + $this->terminateWithSuccess($data); + } + + /** + * GET METHOD + * endpoint to download the abgabe of a paabgabe termin zwischenabgabe or endupload + */ + public function getStudentProjektarbeitAbgabeFile() + { + $this->load->helper('download'); + + $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) === '') { + $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'); + } + } else { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + } + } + + /** + * POST METHOD + * endpoint to enable Assistenz/Betreuer to edit the zusatzdate of a projektarbeit, in case the student somehow + * can't do it themself + */ + public function postStudentProjektarbeitZusatzdaten(){ + $projektarbeit_id = $this->input->post('projektarbeit_id'); + $sprache = $this->input->post('sprache'); + $abstract = $this->input->post('abstract'); + $abstract_en = $this->input->post('abstract_en'); + $schlagwoerter = $this->input->post('schlagwoerter'); + $schlagwoerter_en = $this->input->post('schlagwoerter_en'); + $seitenanzahl = $this->input->post('seitenanzahl'); + + if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '' + || $sprache === NULL || trim((string)$sprache) === '' + || $seitenanzahl === NULL || trim((string)$seitenanzahl) === '' + || $abstract === NULL || trim((string)$abstract) === '' + || $abstract_en === NULL || trim((string)$abstract_en) === '' + || $schlagwoerter === NULL || trim((string)$schlagwoerter) === '' + || $schlagwoerter_en === NULL || trim((string)$schlagwoerter_en) === '') { + + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general'); + + if(count($projektarbeitArr) > 0) { + $projektarbeit = $projektarbeitArr[0]; + } else { + $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general'); + } + + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + if(!$zugeordnet) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + } + + // update projektarbeit cols + $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en + ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl); + + $this->logLib->logInfoDB(array('zusatzdatenEditMitarbeiter', array( + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId(), array($projektarbeit_id,$sprache,$abstract,$abstract_en + ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl))); + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + + $this->terminateWithSuccess($result); + } + + // used to lazy load signatur status for assistenzen, since they could run into very long fetch times + // since they fetch the projektarbeiten with paabgaben included and could have a lot of huge endupload files + // in their stg resulting in huge loading times -> use this api call on opening detail component instead + public function getSignaturStatusForProjektarbeitAbgaben() { + $paabgabe_ids = $this->input->post('paabgabe_ids'); + $student_uid = $this->input->post('student_uid'); + + if ($paabgabe_ids === NULL || $student_uid === NULL || trim((string)$student_uid) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + + $result = $this->PaabgabeModel->loadByIDs($paabgabe_ids); + $data = $this->getDataOrTerminateWithError($result); + + foreach($data as $paabgabetermin) { + $this->checkAbgabeSignatur($paabgabetermin, $student_uid); + } + + $this->terminateWithSuccess($data); + } + + /** + * helper function to check the signature status of uploaded files for zwischenabgabe & endupload + */ + private function checkAbgabeSignatur($abgabe, $student_uid) { + $paabgabetypenToCheck = $this->config->item('SIGNATUR_CHECK_PAABGABETYPEN'); + + if(!in_array($abgabe->paabgabetyp_kurzbz, $paabgabetypenToCheck)) { + return; + } + + if (!defined('SIGNATUR_URL')) { + $abgabe->signatur = 'error'; + return; + } + + $path = PAABGABE_PATH.$abgabe->paabgabe_id.'_'.$student_uid.'.pdf'; + + $signaturVorhanden = null; // if frontend receives null -> indicates no file found at path + if(file_exists($path)) { + + // Check if the document is signed + $signList = SignatureLib::list($path); + if (is_array($signList) && count($signList) > 0) + { + // The document is signed + $signaturVorhanden = true; + } + elseif ($signList === null) + { + // frontend knows to handle it this way for signatures + $signaturVorhanden = 'error'; + } + else + { + $signaturVorhanden = false; + } + + $abgabe->signatur = $signaturVorhanden; + } + } + + private function sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid) { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $resBetr = $this->ProjektarbeitModel->getProjektbetreuerAnrede($bperson_id); + + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general'); + + if(count($projektarbeitArr) > 0) { + $projektarbeit = $projektarbeitArr[0]; + } else { + $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general'); + } + + $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','c4fehlerAktualitaetProjektarbeit'), 'general'); + } + + // Link to Abgabetool + if (defined('CIS4') && CIS4) { + $ci3BootstrapFilePath = "cis.php"; + } else { + $ci3BootstrapFilePath = "index.ci.php"; + } + + $path = $this->config->item('URL_MITARBEITER'); + $url = APP_ROOT.$path; + + // getProjektbetreuerAnrede fetches distinct on person_id, so there should be one row. zweitbetreuer is handled seperately afterwards + foreach($resBetr->retval as $betreuerRow) { + + // query student benutzer view for every betreuer row + $studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0]; + + // 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'; + $abgabetyp = $paabgabetyp_kurzbz == 'end' ? 'Endabgabe' : 'Zwischenabgabe'; + + $maildata = array(); + $maildata['geehrt'] = "geehrte".($betreuerRow->anrede=="Herr"?"r":""); + $maildata['anrede'] = $betreuerRow->anrede; + $maildata['betreuer_voller_name'] = $betreuerRow->first; + $maildata['student_anrede'] = $studentUser->anrede; + $maildata['student_voller_name'] = trim($studentUser->titelpre." ".$studentUser->vorname." ".$studentUser->nachname." ".$studentUser->titelpost); + $maildata['abgabetyp'] = $abgabetyp; + $maildata['parbeituebersichtlink'] = "

Zur Projektarbeitsübersicht

"; + $maildata['bewertunglink'] = $projektarbeitIsCurrent && $paabgabetyp_kurzbz == 'end' ? "

Zur Beurteilung der Arbeit

" : ""; + $maildata['token'] = ""; + + $email = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id); + + if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general'); + + $mailres = sendSanchoMail( + 'ParbeitsbeurteilungEndupload', + $maildata, + $email, + $subject, + 'sancho_header_min_bw.jpg', + 'sancho_footer_min_bw.jpg', + get_uid()."@".DOMAIN); + + if(!$mailres) + { + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general'); + } + + // 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)); + + 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', 'c4fehlerMailZweitBegutachter'), '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', 'c4fehlerMailZweitBegutachter'), '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', 'c4fehlerMailBegutachter'), 'general'); + } + + } + } + } + } + } + + private function checkZuordnung($projektarbeit_id, $betreuer_uid) { + // 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'); + } + + 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(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingBetreuerStudentZuordnung'), 'general'); + } + + // if this is true betreuer has zuordnung to the given $projektarbeit_id and conversely the $student_uid + // assigned to that project + if(hasData($res)) { + return true; + } else { + $berechtigt = $this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id); + if($berechtigt) { + return true; + } + + // otherwhise if there is no zuordnung via global admin or assistenz berechtigung, + // check if the given uid has permissions over the studiengang of the student + // via the abgabetool specific berechtigungen + // 'basis/abgabe_assistenz:rw' OR 'basis/abgabe_lektor:rw' + + if ($this->permissionlib->isBerechtigt('basis/abgabe_assistenz', 'suid', $studiengang_kz)) { + return true; + } + + if ($this->permissionlib->isBerechtigt('basis/abgabe_lektor', 'suid', $studiengang_kz)){ + return true; + } + } + + return false; + } + + private function getProjektarbeitIDForPaabgabeID($paabgabe_id) { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $res = $this->ProjektarbeitModel->getProjektarbeitByPaabgabeID($paabgabe_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingProjektarbeitForPaabgabeID'), 'general'); + } + + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedProjektarbeitForPaabgabeID'), 'general'); + } + $data = getData($res)[0]; + return $data->projektarbeit_id; + } + + private function checkZuordnungByPaabgabe($paabgabe_id, $betreuer_uid) { + $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id); + return $this->checkZuordnung($projektarbeit_id, $betreuer_uid); + } + + // loads a projektarbeit table row by id and looks if a note has been set. A non null note field + // currently indicates that a projektarbeit has been finished and should not accept further crud manipulation + private function checkProjektarbeitForFinishedStatus($projektarbeit_id) { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $res = $this->ProjektarbeitModel->load($projektarbeit_id); + + if(isError($res) || !hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general'); + } + + $data = getData($res)[0]; + if($data->note !== NULL) { + $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general'); + } + } + +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/AuthInfo.php b/application/controllers/api/frontend/v1/AuthInfo.php index 1362aee18..72f396b4f 100644 --- a/application/controllers/api/frontend/v1/AuthInfo.php +++ b/application/controllers/api/frontend/v1/AuthInfo.php @@ -20,6 +20,10 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); class AuthInfo extends FHCAPI_Controller { + protected $uid; + protected $pid; + protected $isMitarbeiter; + protected $isStudent; /** * Object initialization @@ -28,10 +32,16 @@ class AuthInfo extends FHCAPI_Controller { parent::__construct([ 'getAuthUID' => self::PERM_LOGGED, + 'getAuthInfo' => self::PERM_LOGGED, ]); + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->uid = getAuthUID(); $this->pid = getAuthPersonID(); + $this->isMitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter($this->uid)) ?? false; + $this->isStudent = getData($this->StudentModel->isStudent($this->uid)) ?? false; } //------------------------------------------------------------------------------------------------------------------ @@ -47,6 +57,14 @@ class AuthInfo extends FHCAPI_Controller $this->terminateWithSuccess(['uid'=>$this->uid]); } - + public function getAuthInfo() + { + $data = (object) array( + 'uid' => $this->uid, + 'isMitarbeiter' => $this->isMitarbeiter, + 'isStudent' => $this->isStudent + ); + $this->terminateWithSuccess($data); + } } diff --git a/application/controllers/api/frontend/v1/Documents.php b/application/controllers/api/frontend/v1/Documents.php index 60010e14d..7b2fc4a15 100644 --- a/application/controllers/api/frontend/v1/Documents.php +++ b/application/controllers/api/frontend/v1/Documents.php @@ -43,7 +43,8 @@ class Documents extends FHCAPI_Controller parent::__construct([ 'permissionAlternativeFormat' => self::PERM_LOGGED, 'archive' => ['admin:rw', 'assistenz:rw'], - 'archiveSigned' => ['admin:rw', 'assistenz:rw'] + 'archiveSigned' => ['admin:rw', 'assistenz:rw'], + 'download' => ['admin:rw', 'assistenz:rw'] ]); // Load Phrases @@ -66,7 +67,7 @@ class Documents extends FHCAPI_Controller } /** - * Download a not signed document. + * Archive a not signed document. * * @param string $xml (optional) * @param string $xsl (optional) @@ -79,7 +80,7 @@ class Documents extends FHCAPI_Controller } /** - * Download a signed document. + * Archive a signed document. * * @param string $xml (optional) * @param string $xsl (optional) @@ -91,6 +92,42 @@ class Documents extends FHCAPI_Controller return $this->_archive($xml, $xsl, getAuthUID()); } + /** + * + * @return void + */ + public function download($xml, $xsl, $sign_user = null) + { + $akteExportData = $this->_getAkteExportData($xml, $xsl, $sign_user); + + $akteData = $akteData['akteData']; + $exportData = $akteData['exportData']; + + /** + * [ + 'vorlage' => $vorlage, + 'xml_data' => $data, + 'oe_kurzbz' => $xsl_oe_kurzbz, + 'version' => $version, + 'outputformat' => $outputformat, + 'sign_user' => $sign_user + ] + */ + + // Output + $result = $this->documentexportlib->showContent( + $akteData['akteData']['inhalt'], + $exportData['vorlage'], + $exportData['xml_data'], + $exportData['oe_kurzbz'], + $exportData['version'], + $exportData['outputformat'], + $exportData['sign_user'] + ); + + $this->terminateWithSuccess(true); + } + /** * Helper function for archive() and archiveSigned() * @@ -100,16 +137,36 @@ class Documents extends FHCAPI_Controller * * @return void */ - public function _archive($xml, $xsl, $sign_user = null) + private function _archive($xml, $xsl, $sign_user = null) + { + $akteData = $this->_getAkteExportData($xml, $xsl, $sign_user); + + $this->load->model('crm/Akte_model', 'AkteModel'); + $result = $this->AkteModel->insert($akteData['akteData']); + $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(true); + } + + /** + * @param string $xml + * @param string $xsl + * @param string $sign_user (optional) + * + * @return array with Akte data and export data + */ + private function _getAkteExportData($xml, $xsl, $sign_user = null) { if (!$xml || !$xsl) { $this->load->library('form_validation'); if (!$xml) { $xml = $this->input->post_get('xml'); + $this->addMeta('xml', $xml); $this->form_validation->set_rules('xml', 'xml', 'required'); } if (!$xsl) { $xsl = $this->input->post_get('xsl'); + $this->addMeta('xsl', $xsl); $this->form_validation->set_rules('xsl', 'xsl', 'required'); } @@ -151,6 +208,7 @@ class Documents extends FHCAPI_Controller $this->load->model('system/Vorlage_model', 'VorlageModel'); $result = $this->VorlageModel->load($xsl); + $this->addMeta("ress", $result); $vorlage = current($this->getDataOrTerminateWithError($result)); if (!$vorlage) show_404(); @@ -171,12 +229,13 @@ class Documents extends FHCAPI_Controller $studiengang_kz = null; if ($akteData['uid']) { $this->load->model('crm/Student_model', 'StudentModel'); + $this->StudentModel->addSelect('tbl_student.*, UPPER(typ || kurzbz) AS kuerzel'); $this->StudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT'); $result = $this->StudentModel->load([$akteData['uid']]); $student = current($this->getDataOrTerminateWithError($result)); $ss = $this->input->post_get('ss'); - + if ($ss !== null) { $this->load->model('crm/prestudentstatus_model', 'PrestudentstatusModel'); $result = $this->PrestudentstatusModel->getLastStatus($student->prestudent_id, $ss); @@ -275,7 +334,7 @@ class Documents extends FHCAPI_Controller $this->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT'); $result = $this->PrestudentModel->load($prestudent_id); $prestudent = current($this->getDataOrTerminateWithError($result)); - + $studiengang_kz = $prestudent->studiengang_kz; $akteData['person_id'] = $prestudent->person_id; $akteData['titel'] = mb_substr($xsl . "_" . $prestudent->kuerzel, 0, 64); @@ -318,9 +377,10 @@ class Documents extends FHCAPI_Controller $result = $this->VorlagestudiengangModel->getCurrent($xsl, $xsl_oe_kurzbz, $version); $access_rights = current($this->getDataOrTerminateWithError($result)); + // TODO: was bedeutet wenn keine berechtigung? if (!$access_rights || !$access_rights->berechtigung) return show_404(); - + $allowed = false; foreach ($access_rights->berechtigung as $access_right) { if ($this->permissionlib->isBerechtigt($access_right)) { @@ -382,6 +442,10 @@ class Documents extends FHCAPI_Controller 'betreuerart_kurzbz', 'studiensemester_kurzbz' ] as $key) { + if (in_array($xsl, array('Ausbildungsver', 'AusbVerEng')) && $key === 'uid') + { + continue; + } $value = $this->input->post_get($key); if ($value !== null) $params .= '&' . $key . '=' . urlencode($value); @@ -394,11 +458,11 @@ class Documents extends FHCAPI_Controller if (!$vorlage->archivierbar) $this->terminateWithError($this->p->t("stv", "grades_error_archive")); - + if ($sign_user && !$vorlage->signierbar) $this->terminateWithError($this->p->t("stv", "grades_error_sign")); - + $this->load->library('DocumentExportLib'); // XML Data @@ -413,10 +477,17 @@ class Documents extends FHCAPI_Controller $akteData['titel'] .= '.pdf'; $akteData['inhalt'] = base64_encode($content); - $this->load->model('crm/Akte_model', 'AkteModel'); - $result = $this->AkteModel->insert($akteData); - $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess(true); + return [ + 'akteData' => $akteData, + 'exportData' => + [ + 'vorlage' => $vorlage, + 'xml_data' => $data, + 'oe_kurzbz' => $xsl_oe_kurzbz, + 'version' => $version, + 'outputformat' => $outputformat, + 'sign_user' => $sign_user + ] + ]; } } diff --git a/application/controllers/api/frontend/v1/Language.php b/application/controllers/api/frontend/v1/Language.php new file mode 100644 index 000000000..797af4804 --- /dev/null +++ b/application/controllers/api/frontend/v1/Language.php @@ -0,0 +1,47 @@ +. + */ + +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 languages + * This controller works with JSON calls on the HTTP GET and the output is always JSON + */ +class Language extends FHCAPI_Controller +{ + public function __construct() + { + parent::__construct([ + 'get' => self::PERM_LOGGED + ]); + + // Load models + $this->load->model('system/Sprache_model', 'SpracheModel'); + } + + public function get() + { + $this->SpracheModel->addOrder('sprache'); + + $result = $this->SpracheModel->load(); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } +} diff --git a/application/controllers/api/frontend/v1/Lehre.php b/application/controllers/api/frontend/v1/Lehre.php index f079a5b37..10d945a3e 100644 --- a/application/controllers/api/frontend/v1/Lehre.php +++ b/application/controllers/api/frontend/v1/Lehre.php @@ -18,6 +18,14 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); +//require_once('../../../include/studiengang.class.php'); +//require_once('../../../include/student.class.php'); +//require_once('../../../include/datum.class.php'); +//require_once('../../../include/mail.class.php'); +//require_once('../../../include/benutzerberechtigung.class.php'); +//require_once('../../../include/phrasen.class.php'); +//require_once('../../../include/projektarbeit.class.php'); +//require_once('../../../include/projektbetreuer.class.php'); class Lehre extends FHCAPI_Controller { @@ -30,11 +38,9 @@ class Lehre extends FHCAPI_Controller parent::__construct([ 'lvStudentenMail' => self::PERM_LOGGED, 'LV' => self::PERM_LOGGED, - 'Pruefungen' => self::PERM_LOGGED, + 'Pruefungen' => self::PERM_LOGGED ]); - - } //------------------------------------------------------------------------------------------------------------------ @@ -94,10 +100,5 @@ class Lehre extends FHCAPI_Controller $this->terminateWithSuccess($result); } - - - - - } diff --git a/application/controllers/api/frontend/v1/Lehrveranstaltung.php b/application/controllers/api/frontend/v1/Lehrveranstaltung.php new file mode 100644 index 000000000..935602391 --- /dev/null +++ b/application/controllers/api/frontend/v1/Lehrveranstaltung.php @@ -0,0 +1,277 @@ +. + */ + +if (!defined('BASEPATH')) + exit('No direct script access allowed'); + +class Lehrveranstaltung extends FHCAPI_Controller +{ + private $_ci; + private $_uid; + + public function __construct() + { + parent::__construct([ + 'getByEmp' => ['admin:r', 'assistenz:r'], + 'getByStg' => ['admin:r', 'assistenz:r'], + 'loadByLV' => ['admin:r', 'assistenz:r'], + ]); + + $this->_ci = &get_instance(); + $this->_setAuthUID(); + + $this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + $this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $this->_ci->load->library('VariableLib', ['uid' => $this->_uid]); + + $this->loadPhrases( + array( + 'ui' + ) + ); + } + + public function getByEmp($studiensemester_kurzbz = null, $mitarbeiter_uid = null, $stg_kz = null) + { + + if (is_null($mitarbeiter_uid)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); + + $lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz); + $lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen); + + $tree = []; + + foreach ($lehrveranstaltungen_data as $lehrveranstaltung) + { + $lehreinheiten = $this->_ci->LehreinheitModel->getByLvidStudiensemester($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz, $mitarbeiter_uid); + $lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten); + + if (!isset($lehrveranstaltung->_children)) + { + $lehrveranstaltung->_children = $lehreinheiten_data; + } + $tree[] = $lehrveranstaltung; + } + + $this->terminateWithSuccess($tree); + } + public function getByStg($studiensemester_kurzbz = null, $studiengang_kz = null, $semester = null) + { + 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; + $semester = null; + } + + $this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel'); + + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); + $studienplan_data = $this->_ci->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $semester, $verband); + + $studienplan_ids = array(); + $only_ids = array(); + $placeholders = array(); + + if (hasData($studienplan_data)) + { + foreach (getData($studienplan_data) as $studienplan) { + $placeholders[] = "(?, ?)"; + $studienplan_ids[] = $studienplan->studienplan_id; + $studienplan_ids[] = $studienplan->semester; + $only_ids[] = $studienplan->studienplan_id; + } + } + + $lehrveranstaltungen_data = $this->_ci->LehrveranstaltungModel->getLvsByStudiengang($studienplan_ids, $placeholders, $only_ids, $studiengang_kz, $studiensemester_kurzbz, $semester, $verband); + $lehrveranstaltungen_data = hasData($lehrveranstaltungen_data) ? getData($lehrveranstaltungen_data) : array(); + + $tree = []; + foreach ($lehrveranstaltungen_data as $row) + { + $rowData = $row; + + $lehreinheiten_data = $this->_ci->LehreinheitModel->getByLvidStudiensemester($row->lehrveranstaltung_id, $studiensemester_kurzbz); + + if (hasData($lehreinheiten_data)) + { + $lehreinheiten = getData($lehreinheiten_data); + + if (!isset($row->_children)) + { + $row->_children = $lehreinheiten; + } + else + { + if (!is_array($row->_children)) + { + $row->_children = [$row->_children]; + } + $row->_children = array_merge($row->_children, $lehreinheiten); + } + } + + if (!isEmptyString($row->studienplan_lehrveranstaltung_id_parent)) + { + $child = $this->_ci->StudienplanModel->loadStudienplanLehrveranstaltung($row->studienplan_lehrveranstaltung_id_parent); + + if (hasData($child)) + { + $child = getData($child)[0]; + $searchId = $child->lehrveranstaltung_id; + + foreach ($lehrveranstaltungen_data as &$searchParent) + { + if ($searchParent->lehrveranstaltung_id === $searchId) + { + if (!isset($searchParent->_children)) + { + $searchParent->_children = []; + } + + if (is_array($searchParent->_children)) + { + $searchParent->_children[] = $row; + } + else + { + $searchParent->_children = [$searchParent->_children, $row]; + } + break; + } + } + + } + } + else + { + $tree[] = $rowData; + } + } + + $counter = 0; + $this->assignUniqueIndex($tree, $counter); + $this->terminateWithSuccess($tree); + } + + + public function loadByLV($lehrveranstaltung_id = null) + { + if (is_null($lehrveranstaltung_id) || !ctype_digit((string)$lehrveranstaltung_id)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $this->_ci->LehrveranstaltungModel->addSelect('lehrveranstaltung_id, lehrform_kurzbz, lehre, bezeichnung as lvbezeichnung, sprache'); + $lehrveranstaltung_result = $this->_ci->LehrveranstaltungModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung_id)); + $lehrveranstaltung_result = $this->getDataOrTerminateWithError($lehrveranstaltung_result); + $lehrveranstaltung = $lehrveranstaltung_result[0]; + + $this->_ci->LehreinheitModel->addSelect('lehrveranstaltung_id_kompatibel'); + $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung_kompatibel', 'lehrveranstaltung_id'); + $lehrfaecher = $this->_ci->LehreinheitModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung->lehrveranstaltung_id)); + + $lehrfaecher_array = []; + if (hasData($lehrfaecher)) + $lehrfaecher_array = array_merge($lehrfaecher_array, array_column(getData($lehrfaecher), 'lehrveranstaltung_id_kompatibel')); + + $lehrfaecher_array[] = $lehrveranstaltung->lehrveranstaltung_id; + + $this->_ci->LehrveranstaltungModel->addDistinct('lehrfach_id'); + $this->_ci->LehrveranstaltungModel->addSelect("tbl_lehrveranstaltung.lehrveranstaltung_id, CONCAT(tbl_lehrveranstaltung.bezeichnung || '(' || tbl_lehrveranstaltung.oe_kurzbz || ')') as lehrfach"); + $this->_ci->LehrveranstaltungModel->db->where_in('tbl_lehrveranstaltung.lehrveranstaltung_id', $lehrfaecher_array); + $lehrfaecher_result = $this->_ci->LehrveranstaltungModel->load(); + + $lehrfaecher_array = hasData($lehrfaecher_result) ? getData($lehrfaecher_result) : array(); + + $lehrveranstaltung->lehrfaecher = $lehrfaecher_array; + $this->terminateWithSuccess($lehrveranstaltung); + } + + /* + * (david) ggf. im naechsten release + * public function loadByOrganization($oe_kurzbz) + { + $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); + + $lehrveranstaltungen = $this->LehrveranstaltungModel->getLvsByOrganization($oe_kurzbz); + $lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen); + $tree = []; + + foreach ($lehrveranstaltungen_data as $lehrveranstaltung) + { + $lehreinheiten = $this->LehreinheitModel->getByLvidStudiensemester($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz); + $lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten); + + if (!isset($lehrveranstaltung->_children)) + { + + $lehrveranstaltung->_children = $lehreinheiten_data; + } + $tree[] = $lehrveranstaltung; + } + $this->terminateWithSuccess($tree); + }*/ + + /*public function loadByFachbereich($fachbereich, $mitarbeiter_uid = null) + { + $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); + + $this->LehreinheitModel->getLvsByFachbereich($fachbereich, $studiensemester_kurzbz, $mitarbeiter_uid); + }*/ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) + show_error('User authentification failed'); + } + + private function assignUniqueIndex(&$nodes, &$counter) + { + foreach ($nodes as &$node) + { + $node->uniqueindex = $counter++; + if (!empty($node->_children) && is_array($node->_children)) + { + $this->assignUniqueIndex($node->_children, $counter); + } + } + } + + private function getStudiensemesterKurzbz($studiensemester_kurzbz = null) + { + if (!is_null($studiensemester_kurzbz)) + { + $studiensemester_result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz); + + if (isError($studiensemester_result) || !hasData($studiensemester_result)) + $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); + } +} diff --git a/application/controllers/api/frontend/v1/LvMenu.php b/application/controllers/api/frontend/v1/LvMenu.php index 393c4d5c3..45936d9f5 100644 --- a/application/controllers/api/frontend/v1/LvMenu.php +++ b/application/controllers/api/frontend/v1/LvMenu.php @@ -51,7 +51,7 @@ class LvMenu extends FHCAPI_Controller $this->load->library("PermissionLib", null, 'PermissionLib'); - $this->load->library("PhrasesLib"); + $this->load->library("PhrasesLib", null, 'PhrasesLib'); $this->loadPhrases(array('global', 'lehre')); } @@ -269,6 +269,8 @@ class LvMenu extends FHCAPI_Controller 'lehrfach_id'=>$lehrfach_id, 'lektor_der_lv'=>$lektor_der_lv, 'lehrfach_oe_kurzbz_arr'=>$lehrfach_oe_kurzbz_arr, + 'permissionLib' => &$this->PermissionLib, + 'phrasesLib' => &$this->PhrasesLib ]; Events::trigger('lvMenuBuild', @@ -331,6 +333,7 @@ class LvMenu extends FHCAPI_Controller 'id'=>'core_menu_lvinfo', 'position'=>'10', 'name'=>$this->p->t('lehre', 'lehrveranstaltungsinformation'), + 'phrase' => 'lehre/lehrveranstaltungsinformation', 'icon'=>'../../../skin/images/button_lvinfo.png', 'link'=>'', 'c4_icon'=> base_url('skin/images/button_lvinfo.png'), @@ -349,6 +352,7 @@ class LvMenu extends FHCAPI_Controller 'id'=>'core_menu_feedback', 'position'=>'60', 'name'=>$this->p->t('lehre', 'feedback'), + 'phrase' => 'lehre/feedback', 'c4_icon'=> base_url('skin/images/button_feedback.png'), 'c4_link'=> base_url('feedback.php?lvid='.$lvid), ); @@ -366,6 +370,7 @@ class LvMenu extends FHCAPI_Controller 'id'=>'core_menu_gesamtnote', 'position'=>'80', 'name'=>$this->p->t('lehre', 'gesamtnote'), + 'phrase' => 'lehre/gesamtnote', 'c4_icon'=> base_url('skin/images/button_endnote.png'), 'c4_link'=> base_url('cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem)) //'c4_link'=> base_url('benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem)) @@ -378,6 +383,7 @@ class LvMenu extends FHCAPI_Controller 'id'=>'core_menu_gesamtnote', 'position'=>'80', 'name'=>$this->p->t('lehre', 'gesamtnote'), + 'phrase'=>'lehre/gesamtnote', 'c4_icon'=>base_url('skin/images/button_endnote.png'), 'c4_link'=>'#', 'c4_linkList'=>[[$this->p->t('lehre', 'noteneingabedeaktiviert'),'#']], @@ -450,6 +456,7 @@ class LvMenu extends FHCAPI_Controller 'id'=>'core_menu_mailanstudierende', 'position'=>'100', 'name'=>$this->p->t('lehre', 'mail'), + 'phrase' => 'lehre/mail', 'c4_icon'=>base_url('skin/images/button_feedback.png'), 'c4_icon2' => 'fa-regular fa-envelope', 'c4_link'=>$mailto, @@ -474,6 +481,7 @@ class LvMenu extends FHCAPI_Controller 'id'=>'core_menu_abmeldung', 'position'=>'120', 'name'=>$this->p->t('lehre', 'abmelden'), + 'phrase'=>'lehre/abmelden', 'c4_icon'=>base_url('skin/images/button_studiupload.png'), 'c4_link'=>base_url('abmeldung.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem)), ); @@ -508,6 +516,7 @@ class LvMenu extends FHCAPI_Controller 'id' => 'core_menu_anerkennungNachgewiesenerKenntnisse', 'position' => '128', 'name' => $this->p->t('lehre', 'anrechnung'), + 'phrase' => 'lehre/anrechnung', 'c4_icon' => base_url('skin/images/button_listen.png'), 'c4_icon2' => 'fa-regular fa-folder-open', 'c4_link' => base_url('cis.php/lehre/anrechnung/RequestAnrechnung?studiensemester='.urlencode($angezeigtes_stsem).'&lv_id='.urlencode($lvid)) @@ -525,6 +534,7 @@ class LvMenu extends FHCAPI_Controller 'id' => 'core_menu_anerkennungNachgewiesenerKenntnisse_empfehlen', 'position' => '128', 'name' => $this->p->t('lehre', 'anrechnungen'), + 'phrase' => 'lehre/anrechnung', 'c4_icon'=> base_url('skin/images/button_listen.png'), 'c4_icon2' => 'fa-regular fa-folder-open', 'c4_link' => base_url('cis.php/lehre/anrechnung/ReviewAnrechnungUebersicht?studiensemester='.urlencode($angezeigtes_stsem)) diff --git a/application/controllers/api/frontend/v1/LvPlan.php b/application/controllers/api/frontend/v1/LvPlan.php new file mode 100644 index 000000000..28b48e3f1 --- /dev/null +++ b/application/controllers/api/frontend/v1/LvPlan.php @@ -0,0 +1,363 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +use CI3_Events as Events; +use \DateTime as DateTime; +use \DateTimeZone as DateTimeZone; + +class LvPlan extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + + parent::__construct([ + 'getRoomplan' => 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 + ]); + + $this->load->library('LogLib'); + $this->loglib->setConfigs(array( + 'classIndex' => 5, + 'functionIndex' => 5, + 'lineIndex' => 4, + 'dbLogType' => 'API', // required + 'dbExecuteUser' => 'RESTful API' + )); + + $this->load->library('form_validation'); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * fetches LvPlan and Moodle events together + * @access public + * + */ + public function LvPlanEvents() + { + $hasLv = $this->input->post('lv_id'); + + return $hasLv ? $this->eventsLv() : $this->eventsPersonal(); + } + + /** + * fetches LvPlan, Moodle and Ferien events together for the logged in user + * + * @access public + */ + public function eventsPersonal() + { + $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"); + + 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); + + // fetching lvplan events + $result = $this->stundenplanlib->getEventsUser($start_date, $end_date); + $lvplanEvents = $this->getDataOrTerminateWithError($result); + + // fetching moodle events + $moodleEvents = $this->fetchMoodleEvents($start_date, $end_date); + + // fetching ferien events + $ferienEvents = $this->fetchFerienEvents($start_date, $end_date); + + + $this->terminateWithSuccess(array_merge( + $lvplanEvents, + $moodleEvents, + $ferienEvents + )); + } + + /** + * fetches LvPlan and Ferien events together for the lv + * + * @access public + */ + public function eventsLv() + { + $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('lv_id', "lv_id", "required|integer"); + + 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); + $lv_id = $this->input->post('lv_id', true); + + // fetching lvplan events + $result = $this->stundenplanlib->getEventsLv($lv_id, $start_date, $end_date); + $lvplanEvents = $this->getDataOrTerminateWithError($result); + + // fetching ferien events + $ferienEvents = $this->fetchFerienEvents($start_date, $end_date); + + + $this->terminateWithSuccess(array_merge( + $lvplanEvents, + $ferienEvents + )); + } + + //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)); + $this->terminateWithSuccess($studiensemester); + } + + public function getLvPlanForStudiensemester($studiensemester,$lvid){ + $this->load->library('StundenplanLib'); + $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); + $this->terminateWithSuccess($lvplan); + + } + + + /** + * 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); + + $this->terminateWithSuccess($stunden); + } + + /** + * fetches room events from a certain date + * @access public + * + * @return void + */ + public function getRoomplan() + { + $this->form_validation->set_rules('ort_kurzbz', "Ort", "required"); + $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 + $ort_kurzbz = $this->input->post('ort_kurzbz', true); + $start_date = $this->input->post('start_date', true); + $end_date = $this->input->post('end_date', true); + + // get data + $this->load->library('StundenplanLib'); + + $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 + * @access public + * + * @param string $ort_kurzbz + * @return void + */ + public function getReservierungen($ort_kurzbz = null) + { + $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); + + // get data + $this->load->library('StundenplanLib'); + + $result = $this->stundenplanlib->getReservierungen($start_date, $end_date, $ort_kurzbz); + + $result = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($result); + } + + public function getLehreinheitStudiensemester($lehreinheit_id){ + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + $this->LehreinheitModel->addSelect(["studiensemester_kurzbz"]); + $result = $this->LehreinheitModel->load($lehreinheit_id); + $result = current($this->getDataOrTerminateWithError($result))->studiensemester_kurzbz; + $this->terminateWithSuccess($result); + } + + /** + * get details for a lv + * @access public + * + * @param integer $lehrveranstaltung_id + * @return void + */ + public function getLv($lehrveranstaltung_id) + { + if (!$lehrveranstaltung_id && $lehrveranstaltung_id !== 0 && $lehrveranstaltung_id !== '0') + return show_404(); + + // Load Phrases + $this->loadPhrases(['lehre']); + + // Validation + $this->form_validation->set_data([ + 'lehrveranstaltung_id' => $lehrveranstaltung_id + ]); + + $this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung_id'), 'integer'); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + // Get Data + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id); + + $result = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess(current($result)); + } + + /** + * fetch moodle events + * + * @param string $start_date + * @param string $end_date + * @return array + */ + private function fetchMoodleEvents($start_date, $end_date) + { + $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) { + return $moodle_events; + }, + [ + 'start_date' => $start->format('c'), + 'end_date' => $end->format('c'), + 'username' => getAuthUID() + ] + ); + + return $moodle_events; + } + + /** + * fetch ferien events + * + * @param string $start_date + * @param string $end_date + * @return array + */ + private function fetchFerienEvents($start_date, $end_date) + { + $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(), + "studiensemester_kurzbz" => $studentsemester_kurzbz + ]); + $studiengang = $this->getDataOrTerminateWithError($studiengang); + + if ($studiengang) + $studiengang_kz = current($studiengang)->studiengang_kz; + else + $studiengang_kz = 0; + } else { + $studiengang_kz = 0; + } + + $ferienEvents = $this->stundenplanlib->fetchFerienTageEvents($start_date, $end_date, $studiengang_kz); + + return $this->getDataOrTerminateWithError($ferienEvents); + } +} diff --git a/application/controllers/api/frontend/v1/Ort.php b/application/controllers/api/frontend/v1/Ort.php index 8c4059824..0d8074fa9 100644 --- a/application/controllers/api/frontend/v1/Ort.php +++ b/application/controllers/api/frontend/v1/Ort.php @@ -35,15 +35,98 @@ class Ort extends FHCAPI_Controller parent::__construct([ 'ContentID' => self::PERM_LOGGED, 'getOrtKurzbzContent' => self::PERM_LOGGED, + 'getRooms' => self::PERM_LOGGED, + 'getTypes' => self::PERM_LOGGED ]); $this->load->model('ressource/Ort_model', 'OrtModel'); - + $this->config->load('raumsuche'); } //------------------------------------------------------------------------------------------------------------------ // Public methods + /** + * Retrieves all Ort entries filtered by the provided parameters + */ + public function getRooms() + { + $this->load->library('form_validation'); + $this->form_validation->set_data($_GET); + $this->form_validation->set_rules('datum','Datum','required'); + $this->form_validation->set_rules('von','Uhrzeit Von','required|regex_match[/^[0-9]{2}:[0-9]{2}$/]'); + $this->form_validation->set_rules('bis','Uhrzeit Bis','required|regex_match[/^[0-9]{2}:[0-9]{2}$/]'); + if($this->form_validation->run() == FALSE) { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $datum = $this->input->get('datum', TRUE); + $von = $this->input->get('von', TRUE); + $bis = $this->input->get('bis', TRUE); + $typ = $this->input->get('typ', TRUE); + $personenanzahl = $this->input->get('personenanzahl', TRUE); + + + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID())->retval; + + $this->load->model('ressource/Stunde_model', 'StundeModel'); + $vonStunde = getData($this->StundeModel->getStundeForTime($von))[0]->stunde; + $bisStunde = getData($this->StundeModel->getStundeForTime($bis))[0]->stunde; + + $params = array(); + $qry = "SELECT DISTINCT tbl_ort.* + FROM public.tbl_ort JOIN public.tbl_ortraumtyp USING(ort_kurzbz) + WHERE aktiv AND lehre AND ort_kurzbz NOT LIKE '\\\\_%'"; + if($typ) { + $params[] = $typ; + $qry.= "AND raumtyp_kurzbz = ?"; + } + + if(!$isMitarbeiter) { // students are only allowed to get a subset defined by config + $qry.= ' AND raumtyp_kurzbz IN ?'; + $params[] = $this->config->item('roomtypes_student'); + $this->addMeta('config', $this->config->item('roomtypes_student')); + } + + $qry.= "AND (max_person>= ? OR max_person is null)"; + $params[] = $personenanzahl; + + $qry.=" AND ort_kurzbz NOT IN + ( + SELECT ort_kurzbz FROM lehre.tbl_stundenplandev WHERE datum = ? AND stunde >= ? AND stunde <= ? + UNION + SELECT ort_kurzbz FROM campus.tbl_reservierung WHERE datum= ? AND stunde >= ? AND stunde <= ? + ) + "; + $params = array_merge($params, [$datum, $vonStunde, $bisStunde, $datum, $vonStunde, $bisStunde]); +// $this->addMeta('qry', $qry); +// $this->addMeta('params', $params); + $result = $this->OrtModel->execReadOnlyQuery($qry, $params); + + $this->terminateWithSuccess($result); + } + + public function getTypes() + { + $this->load->model('ressource/Raumtyp_model', 'RaumtypModel'); + $qry = "SELECT * FROM public.tbl_raumtyp WHERE aktiv = true"; + $params = array(); + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + + $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID())->retval; + if(!$isMitarbeiter) { // students are only allowed to get a subset defined by config + $qry.= ' AND raumtyp_kurzbz IN ?'; + $params[] = $this->config->item('roomtypes_student'); + } + + $qry .= " ORDER BY raumtyp_kurzbz;"; + + $result = $this->OrtModel->execReadOnlyQuery($qry, $params); + + $this->terminateWithSuccess(getData($result)); + } + /** * Gets a JSON body via HTTP POST and provides the parameters */ diff --git a/application/controllers/api/frontend/v1/Profil.php b/application/controllers/api/frontend/v1/Profil.php index c52d8bae5..3133b107a 100644 --- a/application/controllers/api/frontend/v1/Profil.php +++ b/application/controllers/api/frontend/v1/Profil.php @@ -27,27 +27,17 @@ class Profil extends FHCAPI_Controller public function __construct() { parent::__construct([ - 'getView' => 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'); - $this->load->model('crm/Student_model', 'StudentModel'); - $this->load->model('person/Benutzer_model', 'BenutzerModel'); $this->load->model('person/Person_model', 'PersonModel'); - $this->load->model('person/Adresse_model', 'AdresseModel'); - $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); - $this->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel'); - $this->load->model('ressource/Betriebsmittelperson_model', 'BetriebsmittelpersonModel'); - $this->load->model('person/Kontakt_model', 'KontaktModel'); - $this->load->model('person/Profil_update_model', 'ProfilUpdateModel'); - $this->load->model('content/DmsVersion_model', 'DmsVersionModel'); //? put the uid and pid inside the controller for reusability @@ -58,66 +48,25 @@ class Profil extends FHCAPI_Controller //------------------------------------------------------------------------------------------------------------------ // Public methods - - - /** - * function that returns the data used for the corresponding view - * the client side parses the @param $uid and calls this function to get the data to the correct view - * @access public - * @param boolean $uid the userID used to identify which information should be retrieved for which view - * @return stdClass all the data corresponding to a view of a user - */ - public function getView($uid) - { - $res = new stdClass(); - $editAllowed = getAuthUID() == $uid || $this->permissionlib->isBerechtigt('admin'); - - // if parsing the URL did not found a UID then the UID of the logged in user is used - if ($uid == "Profil" || $uid == $this->uid) { - $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter($this->uid); - if (isError($isMitarbeiter)) { - show_error("error while checking if UID: " . $this->uid . " is a mitarbeiter"); + public function profilViewData($uid=null){ + $this->load->library('ProfilLib'); + $editable = false; + if(isset($uid) && $uid != null){ + $profil_data = $this->profillib->getView($uid); + if($uid == getAuthUID()){ + $editable = true; } - $isMitarbeiter = getData($isMitarbeiter); - if ($isMitarbeiter) { - $res->view = "MitarbeiterProfil"; - $res->data = $this->mitarbeiterProfil(); - $res->data->pid = $this->pid; - } else { - $res->view = "StudentProfil"; - $res->data = $this->studentProfil(); - $res->data->pid = $this->pid; - } - // editing your own profil - true - $editAllowed = true; + }else{ + $editable = true; + $profil_data = $this->profillib->getView(getAuthUID()); } - // UID is availabe when accessing Profil/View/:uid - else { - $this->PersonModel->addSelect(["person_id"]); - $pid = $this->PersonModel->getByUid($uid); - if (isError($pid)) { - show_error("error while trying to update table public.tbl_person while searching for a person with UID: " . $uid); - } - $pid = hasData($pid) ? getData($pid)[0] : null; - if (!$pid) { - show_error("Person with UID: " . $uid . " does not exist"); - } - $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter($uid); - if (isError($isMitarbeiter)) { - show_error("error while checking if UID: " . $uid . " is a mitarbeiter"); - } - $isMitarbeiter = getData($isMitarbeiter); - if ($isMitarbeiter) { - $res->view = "ViewMitarbeiterProfil"; - $res->data = $this->viewMitarbeiterProfil($uid); - - } else { - $res->view = "ViewStudentProfil"; - $res->data = $this->viewStudentProfil($uid); - } - } - $res->data->editAllowed = $editAllowed; - $this->terminateWithSuccess($res); + + $profil_data = hasData($profil_data) ? getData($profil_data) : null; + $viewData = array( + 'editable'=>$editable, + 'profil_data' => $profil_data, + ); + $this->terminateWithSuccess($viewData); } /** @@ -134,14 +83,11 @@ class Profil extends FHCAPI_Controller $res = $this->PersonModel->update($this->pid, ["foto_sperre" => $value]); if (isError($res)) { - show_error("error while trying to update table public.tbl_person"); + $this->terminateWithError("error while trying to update table public.tbl_person"); } $this->PersonModel->addSelect("foto_sperre"); $res = $this->PersonModel->load($this->pid); - if (isError($res)) { - show_error("error while trying to query table public.tbl_person"); - } - + $res = $this->getDataOrTerminateWithError($res); $this->terminateWithSuccess(current($res)); @@ -194,91 +140,7 @@ class Profil extends FHCAPI_Controller } - - // ----------------------------------------------------------------------------------------------------------------- - // Private methods - - /** - * function that returns the data used for viewing another mitarbeiter profile - * @access private - * @param integer $uid the userID to retrieve the mitarbeiter data - * @return stdClass restricted mitarbeiter data - */ - private function viewMitarbeiterProfil($uid) - { - $mailverteiler_res = $this->getMailverteiler($uid); - $benutzer_funktion_res = $this->getBenutzerFunktion($uid); - $benutzer_res = $this->getBenutzerAlias($uid); - $person_res = $this->getPersonInfo($uid); - $mitarbeiter_res = $this->getMitarbeiterInfo($uid); - $telefon_res = $this->getTelefonInfo($uid); - - $res = new stdClass(); - $res->username = $uid; - - //? Person Info - foreach ($person_res as $key => $val) { - $res->$key = $val; - } - - //? Mitarbeiter Info - foreach ($mitarbeiter_res as $key => $val) { - $res->$key = $val; - - } - - $intern_email = array(); - $intern_email["type"] = "intern"; - $intern_email["email"] = $uid . "@" . DOMAIN; - $extern_email = array(); - $extern_email["type"] = "alias"; - $extern_email["email"] = $benutzer_res->alias . "@" . DOMAIN; - $res->emails = array($intern_email, $extern_email); - - $res->funktionen = $benutzer_funktion_res; - $res->mailverteiler = $mailverteiler_res; - $res->standort_telefon = isset($telefon_res) ? $telefon_res->kontakt : null; - - return $res; - } - - /** - * function that returns the data used for viewing another student profile - * @access private - * @param integer $uid the userID to retrieve the student data - * @return stdClass restricted student data - */ - private function viewStudentProfil($uid) - { - $mailverteiler_res = $this->getMailverteiler($uid); - $person_res = $this->getPersonInfo($uid); - $student_res = $this->getStudentInfo($uid); - $matr_res = $this->getMatrikelNummer($uid); - - $res = new stdClass(); - $res->username = $uid; - - //? Person Information - foreach ($person_res as $key => $value) { - $res->$key = $value; - } - - //? Student Information - foreach ($student_res as $key => $value) { - $res->$key = $value; - } - - $intern_email = array(); - $intern_email["type"] = "intern"; - $intern_email["email"] = $uid . "@" . DOMAIN; - - $res->emails = [$intern_email]; - $res->matrikelnummer = $matr_res->matr_nr; - $res->mailverteiler = $mailverteiler_res; - - return $res; - } - + /** * checks whether a specific userID is a mitarbeiter or not (foreword declaration of the function isMitarbeiter in Mitarbeiter_model.php) * @access public @@ -302,394 +164,9 @@ class Profil extends FHCAPI_Controller $this->terminateWithSuccess($result); } - /** - * function that returns the data used for the mitarbeiter profile - * @access private - * @return stdClass mitarbeiter data - */ - private function mitarbeiterProfil() - { + // ----------------------------------------------------------------------------------------------------------------- + // Private methods - $zutrittskarte_ausgegebenam = $this->getZutrittskarteDatum($this->uid); - $adresse_res = $this->getAdressenInfo($this->pid); - $kontakte_res = $this->getKontaktInfo($this->pid); - $mailverteiler_res = $this->getMailverteiler($this->uid); - $person_res = $this->getPersonInfo($this->uid, true); - $benutzer_funktion_res = $this->getBenutzerFunktion($this->uid); - $betriebsmittelperson_res = $this->getBetriebsmittelInfo($this->pid); - $profilUpdates = $this->getProfilUpdates($this->uid); - $telefon_res = $this->getTelefonInfo($this->uid); - $mitarbeiter_res = $this->getMitarbeiterInfo($this->uid); - - $res = new stdClass(); - $res->username = $this->uid; - - //? Person Information - foreach ($person_res as $key => $value) { - $res->$key = $value; - } - - //? Mitarbeiter Information - foreach ($mitarbeiter_res as $key => $value) { - $res->$key = $value; - } - - $res->adressen = $adresse_res; - $res->zutrittsdatum = $zutrittskarte_ausgegebenam; - $res->kontakte = $kontakte_res; - $res->mittel = $betriebsmittelperson_res; - $res->mailverteiler = $mailverteiler_res; - - $intern_email = array(); - $intern_email["type"] = "intern"; - $intern_email["email"] = $this->uid . "@" . DOMAIN; - $extern_email = array(); - $extern_email["type"] = "alias"; - $extern_email["email"] = $mitarbeiter_res->alias . "@" . DOMAIN; - $res->emails = [$intern_email, $extern_email]; - - $res->funktionen = $benutzer_funktion_res; - $res->standort_telefon = $telefon_res; - $res->profilUpdates = $profilUpdates; - - return $res; - } - - /** - * function that returns the data used for the student profile - * @access private - * @return stdClass student data - */ - private function studentProfil() - { - $betriebsmittelperson_res = $this->getBetriebsmittelInfo($this->pid); - $kontakte_res = $this->getKontaktInfo($this->pid); - $zutrittskarte_ausgegebenam = $this->getZutrittskarteDatum($this->uid); - $adresse_res = $this->getAdressenInfo($this->pid); - $mailverteiler_res = $this->getMailverteiler($this->uid); - $person_res = $this->getPersonInfo($this->uid, true); - $zutrittsgruppe_res = $this->getZutrittsgruppen($this->uid); - $student_res = $this->getStudentInfo($this->uid); - $matr_res = $this->getMatrikelNummer($this->uid); - $profilUpdates = $this->getProfilUpdates($this->uid); - - $res = new stdClass(); - $res->username = $this->uid; - - //? Person Information - foreach ($person_res as $key => $value) { - $res->$key = $value; - } - - //? Student Information - foreach ($student_res as $key => $value) { - $res->$key = trim($value); - } - - $intern_email = array(); - $intern_email["type"] = "intern"; - $intern_email["email"] = $this->uid . "@" . DOMAIN; - - $res->emails = [$intern_email]; - $res->adressen = $adresse_res; - $res->zutrittsdatum = $zutrittskarte_ausgegebenam; - $res->kontakte = $kontakte_res; - $res->mittel = $betriebsmittelperson_res; - $res->matrikelnummer = $matr_res->matr_nr; - $res->zuttritsgruppen = $zutrittsgruppe_res; - $res->mailverteiler = $mailverteiler_res; - $res->profilUpdates = $profilUpdates; - - return $res; - } - - - /** - * gets all the mailverteiler using the tables: tbl_benutzer, tbl_benutzergruppe, tbl_gruppe - * @access private - * @param integer $uid the userID used to retrieve the mailverteiler - * @return array returns the mailvertailer corresponding to a userID - */ - private function getMailverteiler($uid) - { - $this->PersonModel->addSelect('gruppe_kurzbz, beschreibung'); - $this->PersonModel->addJoin('tbl_benutzer', 'person_id'); - $this->PersonModel->addJoin('tbl_benutzergruppe', 'uid'); - $this->PersonModel->addJoin('tbl_gruppe', 'gruppe_kurzbz'); - - $mailverteiler_res = $this->PersonModel->loadWhere(array('mailgrp' => true, 'uid' => $uid)); - if (isError($mailverteiler_res)) { - show_error("was not able to query the table public.tbl_benutzer:" . getData($mailverteiler_res)); - } - $mailverteiler_res = hasData($mailverteiler_res) ? getData($mailverteiler_res) : null; - $mailverteiler_res = array_map(function ($element) { - $element->mailto = "mailto:" . $element->gruppe_kurzbz . "@" . DOMAIN; - return $element; - }, $mailverteiler_res); - return $mailverteiler_res; - } - - /** - * gets all the Benutzerfunktionen of a corresponding user - * @access private - * @param integer $uid the userID used to retrieve the Benutzerfunktionen - * @return array returns the Benutzerfunktionen corresponding to a userID - */ - private function getBenutzerFunktion($uid) - { - $this->BenutzerfunktionModel->addSelect(["tbl_benutzerfunktion.bezeichnung as Bezeichnung", "tbl_organisationseinheit.bezeichnung as Organisationseinheit", "datum_von as Gültig_von", "datum_bis as Gültig_bis", "wochenstunden as Wochenstunden"]); - $this->BenutzerfunktionModel->addJoin("tbl_organisationseinheit", "oe_kurzbz"); - - $benutzer_funktion_res = $this->BenutzerfunktionModel->loadWhere(array('uid' => $uid)); - if (isError($benutzer_funktion_res)) { - show_error("was not able to query the table public.tbl_benutzerfunktion:" . getData($benutzer_funktion_res)); - } - $benutzer_funktion_res = hasData($benutzer_funktion_res) ? getData($benutzer_funktion_res) : null; - return $benutzer_funktion_res; - } - - /** - * gets all the Betriebsmittel of a corresponding user - * @access private - * @param integer $uid the userID used to retrieve the Betriebsmittel - * @return array returns the Betriebsmittel corresponding to a userID - */ - private function getBetriebsmittelInfo($pid) - { - $this->BetriebsmittelpersonModel->addSelect(["CONCAT(betriebsmitteltyp, ' ' ,beschreibung) as Betriebsmittel", "nummer as Nummer", "ausgegebenam as Ausgegeben_am"]); - - //? betriebsmittel are not needed in a view - $betriebsmittelperson_res = $this->BetriebsmittelpersonModel->getBetriebsmittel($pid); - if (isError($betriebsmittelperson_res)) { - show_error("was not able to query the table public.tbl_betriebsmittelperson:" . getData($betriebsmittelperson_res)); - } - $betriebsmittelperson_res = hasData($betriebsmittelperson_res) ? getData($betriebsmittelperson_res) : null; - return $betriebsmittelperson_res; - } - - /** - * gets the alias of a corresponding user - * @access private - * @param integer $uid the userID used to get the alias - * @return string the alias of the userID - */ - private function getBenutzerAlias($uid) - { - $this->BenutzerModel->addSelect(["alias"]); - $benutzer_res = $this->BenutzerModel->load([$uid]); - if (isError($benutzer_res)) { - show_error("was not able to query the table public.tbl_benutzer:" . getData($benutzer_res)); - } else { - $benutzer_res = hasData($benutzer_res) ? getData($benutzer_res)[0] : null; - } - - return $benutzer_res; - } - - /** - * gets the person information corresponding to a user - * @access private - * @param integer $uid the userID used to get the person information - * @param integer $geburtsInfo flag wether to add the columns gebort, gebdatum, foto_sperre or not - * @return array all the person informaion corresponding to a userID - */ - private function getPersonInfo($uid, $geburtsInfo = null) - { - $selectClause = ["foto", "foto_sperre", "anrede", "titelpost as postnomen", "titelpre as titel", "vorname", "nachname"]; - /** @param integer $geburtsInfo */ - if ($geburtsInfo) { - array_push($selectClause, "gebort"); - array_push($selectClause, "TO_CHAR(gebdatum, 'DD.MM.YYYY') as gebdatum"); - } - $this->BenutzerModel->addSelect($selectClause); - $this->BenutzerModel->addJoin("tbl_person", "person_id"); - - $person_res = $this->BenutzerModel->load([$uid]); - if (isError($person_res)) { - show_error("was not able to query the table public.tbl_benutzer:" . getData($person_res)); - } else { - $person_res = hasData($person_res) ? getData($person_res)[0] : null; - } - - if( ($person_res->foto === null) || (($this->uid !== $uid) && ($person_res->foto_sperre !== false)) ) - { - $dummy_foto = base64_encode(file_get_contents(DOC_ROOT.'skin/images/profilbild_dummy.jpg')); - $person_res->foto = $dummy_foto; - } - - return $person_res; - } - - /** - * gets the mitarbeiter information corresponding to a user - * @access private - * @param integer $uid the userID used to get the mitarbeiter information - * @return array all the mitarbeiter informaion corresponding to a userID - */ - private function getMitarbeiterInfo($uid) - { - $this->MitarbeiterModel->addSelect(["kurzbz", "telefonklappe", "alias", "ort_kurzbz"]); - $this->MitarbeiterModel->addJoin("tbl_benutzer", "tbl_benutzer.uid = tbl_mitarbeiter.mitarbeiter_uid"); - $mitarbeiter_res = $this->MitarbeiterModel->load($uid); - if (isError($mitarbeiter_res)) { - show_error("was not able to query the table public.tbl_mitarbeiter:" . getData($mitarbeiter_res)); - } else { - $mitarbeiter_res = hasData($mitarbeiter_res) ? getData($mitarbeiter_res)[0] : null; - } - - return $mitarbeiter_res; - } - - /** - * gets the telefon information corresponding to a user - * @access private - * @param integer $uid the userID used to get the telefon information - * @return array all the telefon informaion corresponding to a userID - */ - private function getTelefonInfo($uid) - { - $this->MitarbeiterModel->addSelect(["kontakt"]); - $this->MitarbeiterModel->addJoin("tbl_kontakt", "tbl_mitarbeiter.standort_id = tbl_kontakt.standort_id"); - $this->MitarbeiterModel->addLimit(1); - $telefon_res = $this->MitarbeiterModel->loadWhere(["mitarbeiter_uid" => $uid, "kontakttyp" => "telefon"]); - if (isError($telefon_res)) { - show_error("was not able to query the table public.tbl_mitarbeiter:" . getData($telefon_res)); - } - $telefon_res = hasData($telefon_res) ? getData($telefon_res)[0] : null; - return $telefon_res; - } - - /** - * gets the student information corresponding to a user - * @access private - * @param integer $uid the userID used to get the student information - * @return array all the student informaion corresponding to a userID - */ - private function getStudentInfo($uid) - { - $this->StudentModel->addSelect(['tbl_studiengang.bezeichnung as studiengang', 'tbl_studiengang.studiengang_kz as studiengang_kz', 'tbl_student.semester', 'tbl_student.verband', 'tbl_student.gruppe', 'tbl_student.matrikelnr as personenkennzeichen']); - $this->StudentModel->addJoin('tbl_studiengang', "tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz"); - - $student_res = $this->StudentModel->load([$uid]); - if (isError($student_res)) { - show_error("was not able to query the table public.tbl_student:" . getData($student_res)); - } - $student_res = hasData($student_res) ? getData($student_res)[0] : null; - return $student_res; - } - - /** - * gets the profil updates corresponding to a user - * @access private - * @param integer $uid the userID used to get the profil updates - * @return array all the profil updates corresponding to a userID - */ - private function getProfilUpdates($uid) - { - $profilUpdates = $this->ProfilUpdateModel->getProfilUpdatesWhere(['uid' => $uid]); - if (isError($profilUpdates)) { - show_error("was not able to query the table public.tbl_profil_update:" . getData($profilUpdates)); - } - $profilUpdates = hasData($profilUpdates) ? getData($profilUpdates) : null; - return $profilUpdates; - } - - /** - * gets the Matrikelnummer corresponding to a user - * @access private - * @param integer $uid the userID used to get the Matrikelnummer - * @return integer the Matrikelnummer corresponding to a userID - */ - private function getMatrikelNummer($uid) - { - $this->BenutzerModel->addSelect(["matr_nr"]); - $this->BenutzerModel->addJoin("tbl_person", "person_id"); - - $matr_res = $this->BenutzerModel->load([$uid]); - if (isError($matr_res)) { - show_error("was not able to query the table public.tbl_benutzer:" . getData($matr_res)); - } - $matr_res = hasData($matr_res) ? getData($matr_res)[0] : []; - return $matr_res; - } - - /** - * gets the Zutrittsgruppen corresponding to a user - * @access private - * @param integer $uid the userID used to get the Zutrittsgruppen - * @return array all the Zutrittsgruppen corresponding to a userID - */ - private function getZutrittsgruppen($uid) - { - $this->BenutzergruppeModel->addSelect(['bezeichnung']); - $this->BenutzergruppeModel->addJoin('tbl_gruppe', 'gruppe_kurzbz'); - - $zutrittsgruppe_res = $this->BenutzergruppeModel->loadWhere(array("uid" => $uid, "zutrittssystem" => true)); - if (isError($zutrittsgruppe_res)) { - show_error("was not able to query the table public.tbl_benutzergruppe:" . getData($zutrittsgruppe_res)); - } - $zutrittsgruppe_res = hasData($zutrittsgruppe_res) ? getData($zutrittsgruppe_res) : null; - return $zutrittsgruppe_res; - } - - /** - * gets the address information corresponding to a user - * @access private - * @param integer $uid the userID used to get the address information - * @return array all the address information corresponding to a userID - */ - private function getAdressenInfo($pid) - { - $adresse_res = $this->AdresseModel->addSelect(["adresse_id", "strasse", "tbl_adressentyp.bezeichnung as typ", "plz", "ort", "zustelladresse", "gemeinde", "nation"]); - $adresse_res = $this->AdresseModel->addOrder("zustelladresse", "DESC"); - $adresse_res = $this->AdresseModel->addJoin("tbl_adressentyp", "typ=adressentyp_kurzbz"); - - $adresse_res = $this->AdresseModel->loadWhere(["person_id" => $pid]); - if (isError($adresse_res)) { - show_error("was not able to query the table public.tbl_adresse:" . getData($adresse_res)); - } - $adresse_res = hasData($adresse_res) ? getData($adresse_res) : null; - return $adresse_res; - } - - /** - * gets the kontakt information corresponding to a user - * @access private - * @param integer $uid the userID used to get the kontakt information - * @return array all the kontakt information corresponding to a userID - */ - private function getKontaktInfo($pid) - { - $this->KontaktModel->addSelect(['kontakttyp', 'kontakt_id', 'kontakt', 'tbl_kontakt.anmerkung', 'tbl_kontakt.zustellung']); - $this->KontaktModel->addJoin('public.tbl_standort', 'standort_id', 'LEFT'); - $this->KontaktModel->addJoin('public.tbl_firma', 'firma_id', 'LEFT'); - $this->KontaktModel->addOrder('kontakttyp, kontakt, tbl_kontakt.updateamum, tbl_kontakt.insertamum'); - - $kontakte_res = $this->KontaktModel->loadWhere(['person_id' => $pid]); - if (isError($kontakte_res)) { - show_error("was not able to query the table public.tbl_kontakt:" . getData($kontakte_res)); - } - $kontakte_res = hasData($kontakte_res) ? getData($kontakte_res) : null; - return $kontakte_res; - } - - /** - * gets the date of issue of the FH access card corresponding to a user - * @access private - * @param integer $uid the userID used to get the date of issue of the FH access card - * @return string the date of issue of the FH access card corresponding to a userID - */ - private function getZutrittskarteDatum($uid) - { - $zutrittskarte_ausgegebenam = $this->BetriebsmittelpersonModel->getBetriebsmittelByUid($uid, "Zutrittskarte"); - if (isError($zutrittskarte_ausgegebenam)) { - show_error("was not able to query the table wavi.tbl_bentriebsmittelperson:" . getData($zutrittskarte_ausgegebenam)); - } - $zutrittskarte_ausgegebenam = hasData($zutrittskarte_ausgegebenam) ? getData($zutrittskarte_ausgegebenam)[0]->ausgegebenam : null; - - //? formats date from 01-01-2000 to 01.01.2000 - $zutrittskarte_ausgegebenam = str_replace("-", ".", $zutrittskarte_ausgegebenam); - return $zutrittskarte_ausgegebenam; - } + } diff --git a/application/controllers/api/frontend/v1/ProfilUpdate.php b/application/controllers/api/frontend/v1/ProfilUpdate.php index 827654d21..f97546288 100644 --- a/application/controllers/api/frontend/v1/ProfilUpdate.php +++ b/application/controllers/api/frontend/v1/ProfilUpdate.php @@ -44,6 +44,7 @@ class ProfilUpdate extends FHCAPI_Controller 'updateProfilRequest' => self::PERM_LOGGED, 'deleteProfilRequest' => self::PERM_LOGGED, 'insertFile' => self::PERM_LOGGED, + 'updateProfilbild' => self::PERM_LOGGED, 'show' => self::PERM_LOGGED, ]); @@ -478,12 +479,101 @@ class ProfilUpdate extends FHCAPI_Controller $this->terminateWithSuccess($res); } + public function updateProfilbild() + { + + $resize = function($filename, $width, $height){ + // Hoehe und Breite neu berechnen + list($width_orig, $height_orig) = getimagesize($filename); + + if ($width && ($width_orig < $height_orig)) + { + $width = ($height / $height_orig) * $width_orig; + } + else + { + $height = ($width / $width_orig) * $height_orig; + } + + $image_p = imagecreatetruecolor($width, $height); + + $image = imagecreatefromjpeg($filename); + + //Bild nur verkleinern aber nicht vergroessern + if($width_orig>$width || $height_orig>$height) + imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); + else + $image_p = $image; + + imagejpeg($image_p, $filename, 80); + + @imagedestroy($image_p); + @imagedestroy($image); + }; + + if (!count($_FILES)) { + $this->terminateWithError("No file available for upload"); + } + + $files = $_FILES['files']; + + $_FILES['files']['name'] = current($files['name']); + $_FILES['files']['type'] = current($files['type']); + $_FILES['files']['tmp_name'] = current($files['tmp_name']); + $_FILES['files']['error'] = current($files['error']); + $_FILES['files']['size'] = current($files['size']); + $_FILES['files']['tmp_name'] = current($files['tmp_name']); + + $filename = $_FILES['files']['tmp_name']; + + $ext = substr(current($files['name']), strrpos(current($files['name']), '.') + 1); + if($ext!='jpg' && $ext!='jpeg'){ + $this->terminateWithError("Only jpg and jpeg files are allowed for profilbild upload"); + } + + // resize + $resize($filename, 827, 1063); + + //akte + $fp = fopen($filename,'r'); + //auslesen + $content = fread($fp, filesize($filename)); + $base64_content = base64_encode($content); + $this->load->library('AkteLib'); + $aktenInsertResult = $this->aktelib->add($this->pid,'Lichtbil',"Lichtbild_".$this->pid.".jpg","image/jpg",$fp,"Lichtbild gross"); + fclose($fp); + if (isError($aktenInsertResult)) { + $this->terminateWithError(getError($aktenInsertResult)); + } + + // in person abspeichern + $resize($filename, 101, 130); + $fp = fopen($filename,'r'); + $content = fread($fp, filesize($filename)); + fclose($fp); + $base64_content = base64_encode($content); + $this->load->model('person/Person_model','PersonModel'); + $personUpdate = $this->PersonModel->update($this->pid, ["foto"=>$base64_content]); + if(isError($personUpdate)){ + $this->terminateWithError(getError($personUpdate)); + } + + + // update foto status + $this->load->model('person/Fotostatusperson_model','FotostatusModel'); + $fotoInsert = $this->FotostatusModel->insert(["person_id"=>$this->pid,"fotostatus_kurzbz"=>"hochgeladen","datum"=>date('Y-m-d'),"insertamum"=>date('Y-m-d H:i:s'),"insertvon"=>$this->uid,"updateamum"=>date('Y-m-d H:i:s'),"updatevon"=>$this->uid]); + if(isError($fotoInsert)){ + $this->terminateWithError(getError($fotoInsert)); + } + + $this->terminateWithSuccess(); + } + public function getProfilUpdateWithPermission($status = null) { // early return if no status has been passed as argument if (!isset($status)) { - echo json_encode($this->ProfilUpdateModel->getProfilUpdateWithPermission()); - return; + $this->terminateWithSuccess($this->ProfilUpdateModel->getProfilUpdateWithPermission()); } // get the sprache of the user @@ -496,7 +586,7 @@ class ProfilUpdate extends FHCAPI_Controller $status = hasData($status) ? getData($status)[0]->status_kurzbz : null; $res = $this->ProfilUpdateModel->getProfilUpdateWithPermission(isset($status) ? ['status' => $status] : null); - echo json_encode($res); + $this->terminateWithSuccess($res); } } @@ -547,9 +637,10 @@ class ProfilUpdate extends FHCAPI_Controller //? Send email to the Studiengangsassistentinnen $this->StudentModel->addSelect(["public.tbl_studiengang.email"]); $this->StudentModel->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_student.student_uid"); - $this->StudentModel->addJoin("public.tbl_prestudent", "public.tbl_benutzer.person_id = public.tbl_prestudent.person_id"); + $this->StudentModel->addJoin("public.tbl_prestudent", "public.tbl_benutzer.person_id = public.tbl_prestudent.person_id and public.tbl_student.studiengang_kz = public.tbl_prestudent.studiengang_kz"); $this->StudentModel->addJoin("public.tbl_prestudentstatus", "public.tbl_prestudentstatus.prestudent_id = public.tbl_prestudent.prestudent_id"); $this->StudentModel->addJoin("public.tbl_studiengang", "public.tbl_studiengang.studiengang_kz = public.tbl_prestudent.studiengang_kz"); + $this->StudentModel->addGroupBy(["public.tbl_studiengang.email"]); //* check if the benutzer itself is active //* check if the student status is Student or Diplomand (active students) $this->StudentModel->db->where_in("public.tbl_prestudentstatus.status_kurzbz", ['Student', 'Diplomand']); @@ -566,8 +657,10 @@ class ProfilUpdate extends FHCAPI_Controller } $mail_res = []; //? sending email - foreach ($emails as $email) { - array_push($mail_res, sendSanchoMail("profil_update", ['uid' => $uid, 'topic' => $topic, 'href' => APP_ROOT . 'Cis/ProfilUpdate/id/' . $profil_update_id], $email, ("Profil Änderung von " . $uid))); + foreach ($emails as $email) + { + $href = $this->config->item('cis_vilesci_base_url') . $this->config->item('cis_vilesci_index_page') . '/Cis/ProfilUpdate/id/' . $profil_update_id; + array_push($mail_res, sendSanchoMail("profil_update", ['uid' => $uid, 'topic' => $topic, 'href' => $href], $email, ("Profil Änderung von " . $uid))); } foreach ($mail_res as $m_res) { if (!$m_res) { @@ -590,21 +683,21 @@ class ProfilUpdate extends FHCAPI_Controller function languageQuery($language) { - return "select index from public.tbl_sprache where sprache = '" + $language + "'"; + return "select index from public.tbl_sprache where sprache = '" . $language . "'"; } $this->ProfilUpdateStatusModel->addSelect(["bezeichnung_mehrsprachig[(" . languageQuery('German') . ")] as status_de", "bezeichnung_mehrsprachig[(" . languageQuery('English') . ")] as status_en"]); $status_translation = $this->ProfilUpdateStatusModel->loadWhere(["status_kurzbz" => $status]); - if (isError($status_translation)) { $this->terminateWithError($this->p->t('profilUpdate', 'ProfilUpdateStatusTranslationError')); } $status_translation = hasData($status_translation) ? getData($status_translation)[0] : null; - - if (isset($status_translation)) { - $mail_res = sendSanchoMail("profil_update_response", ['topic' => $topic, 'status_de' => $status_translation->status_de, 'status_en' => $status_translation->status_en, 'href' => APP_ROOT . 'Cis/Profil'], $email, ("Profil Änderung " . $this->p->t('profilUpdate', 'pending'))); + if (isset($status_translation)) + { + $href = $this->config->item('cis_base_url') . $this->config->item('cis_index_page') . '/Cis/Profil'; + $mail_res = sendSanchoMail("profil_update_response", ['topic' => $topic, 'status_de' => $status_translation->status_de, 'status_en' => $status_translation->status_en, 'href' => $href], $email, ("Profil Änderung " . $status_translation->status_de . ' / Profile Update ' . $status_translation->status_en)); if (!$mail_res) { $this->addError($this->p->t('profilUpdate', 'profilUpdate_email_error')); } @@ -613,7 +706,13 @@ class ProfilUpdate extends FHCAPI_Controller private function setStatusOnUpdateRequest($id, $status, $status_message) { - return $this->ProfilUpdateModel->update([$id], ["status" => $status, "status_timestamp" => "NOW()", "status_message" => $status_message]); + return $this->ProfilUpdateModel->update([$id], [ + "status" => $status, + "status_timestamp" => "NOW()", + "status_message" => $status_message, + "updateamum" => "NOW()", + "updatevon" => getAuthUID() + ]); } private function updateRequestedChange($id, $requested_change) @@ -623,13 +722,12 @@ class ProfilUpdate extends FHCAPI_Controller private function deleteOldVersionFile($dms_id) { + if (!isset($dms_id)) { + return true; + } + // starting the transaction $this->db->trans_start(); - - - if (!isset($dms_id)) { - return; - } //? delete the file from the profilUpdate first $profilUpdateFileDelete = $this->ProfilUpdateModel->removeFileFromProfilUpdate($dms_id); @@ -684,13 +782,8 @@ class ProfilUpdate extends FHCAPI_Controller $res = $this->StudentModel->execReadOnlyQuery($query, [$student_uid]); $res = $this->getDataOrTerminateWithError($res, $this->p->t('profilUpdate', 'profilUpdate_loadingOE_error')); - $res = array_map( - function ($item) { - return $item->oe_kurzbz; - }, - $res - ); - return $res; + $oe = ($res[0])->oe_kurzbz; + return $oe; } private function handleAdresse($requested_change, $personID) @@ -720,7 +813,7 @@ class ProfilUpdate extends FHCAPI_Controller $insert_adresse_id = $insertID; $insert_adresse_id = $this->getDataOrTerminateWithError($insert_adresse_id, $this->p->t('profilUpdate', 'profilUpdate_insertAdresse_error')); if ($insert_adresse_id) { - $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $insert_adresse_id); + $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $insert_adresse_id, $personID); } } //! DELETE @@ -732,12 +825,33 @@ class ProfilUpdate extends FHCAPI_Controller } //! UPDATE else { - $requested_change['updateamum'] = "NOW()"; - $requested_change['updatevon'] = getAuthUID(); - $update_adresse_id = $this->AdresseModel->update($adresse_id, $requested_change); - $update_adresse_id = $this->getDataOrTerminateWithError($update_adresse_id, $this->p->t('profilUpdate', 'profilUpdate_updateAdresse_error')); - $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $update_adresse_id); + $curadresse_res = $this->AdresseModel->load($adresse_id); + $curadresse = ($this->getDataOrTerminateWithError($curadresse_res))[0]; + if($curadresse->heimatadresse) + { + $tmpadresse = array_merge((array) $curadresse, $requested_change); + unset($tmpadresse["adresse_id"]); + $tmpadresse['insertamum'] = "NOW()"; + $tmpadresse['insertvon'] = getAuthUID(); + $tmpadresse['person_id'] = $personID; + unset($tmpadresse["heimatadresse"]); + unset($tmpadresse["updateamum"]); + unset($tmpadresse["updatevon"]); + + $tmpadresse_res = $this->AdresseModel->insert($tmpadresse); + $tmpadresse_id = $this->getDataOrTerminateWithError($tmpadresse_res, $this->p->t('profilUpdate', 'profilUpdate_insertAdresse_error')); + $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $tmpadresse_id, $personID); + } + else + { + $requested_change['updateamum'] = "NOW()"; + $requested_change['updatevon'] = getAuthUID(); + + $update_adresse_id = $this->AdresseModel->update($adresse_id, $requested_change); + $update_adresse_id = $this->getDataOrTerminateWithError($update_adresse_id, $this->p->t('profilUpdate', 'profilUpdate_updateAdresse_error')); + $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $update_adresse_id, $personID); + } } return $insertID ?? null; } @@ -759,7 +873,7 @@ class ProfilUpdate extends FHCAPI_Controller $insert_kontakt_id = $insertID; $insert_kontakt_id = $this->getDataOrTerminateWithError($insert_kontakt_id, $this->p->t('profilUpdate', 'profilUpdate_insertKontakt_error')); if ($insert_kontakt_id) { - $this->handleDupplicateZustellKontakte($requested_change['zustellung'], $insert_kontakt_id); + $this->handleDupplicateZustellKontakte($requested_change['zustellung'], $insert_kontakt_id, $requested_change['kontakttyp'], $personID); } } //! DELETE @@ -776,18 +890,18 @@ class ProfilUpdate extends FHCAPI_Controller $update_kontakt_id = $this->KontaktModel->update($kontakt_id, $requested_change); $update_kontakt_id = $this->getDataOrTerminateWithError($update_kontakt_id, $this->p->t('profilUpdate', 'profilUpdate_updateKontakt_error')); if ($update_kontakt_id) { - $this->handleDupplicateZustellKontakte($requested_change['zustellung'], $update_kontakt_id); + $this->handleDupplicateZustellKontakte($requested_change['zustellung'], $update_kontakt_id, $requested_change['kontakttyp'], $personID); } } return isset($insertID) ? $insertID : null; } - private function handleDupplicateZustellAdressen($zustellung, $adresse_id) + private function handleDupplicateZustellAdressen($zustellung, $adresse_id, $person_id) { if ($zustellung) { $this->PersonModel->addSelect("public.tbl_adresse.adresse_id"); $this->PersonModel->addJoin("public.tbl_adresse", "public.tbl_adresse.person_id = public.tbl_person.person_id"); - $zustellAdressenArray = $this->PersonModel->loadWhere(["public.tbl_person.person_id" => $this->pid, "zustelladresse" => TRUE]); + $zustellAdressenArray = $this->PersonModel->loadWhere(["public.tbl_person.person_id" => $person_id, "zustelladresse" => TRUE]); if (isError($zustellAdressenArray)) { $this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_loadingZustellAdressen_error')); } @@ -800,6 +914,8 @@ class ProfilUpdate extends FHCAPI_Controller return $adresse->adresse_id != $adresse_id; }); + $this->addMeta('bhzustelladressen', $zustellAdressenArray); + // remove the zustelladresse from all other zustelladressen foreach ($zustellAdressenArray as $adresse) { $this->AdresseModel->update($adresse->adresse_id, ["zustelladresse" => FALSE]); @@ -809,12 +925,16 @@ class ProfilUpdate extends FHCAPI_Controller } } - private function handleDupplicateZustellKontakte($zustellung, $kontakt_id) + private function handleDupplicateZustellKontakte($zustellung, $kontakt_id, $kontakttyp, $person_id) { if ($zustellung) { $this->PersonModel->addSelect("public.tbl_kontakt.kontakt_id"); $this->PersonModel->addJoin("public.tbl_kontakt", "public.tbl_kontakt.person_id = public.tbl_person.person_id"); - $zustellKontakteArray = $this->PersonModel->loadWhere(["public.tbl_person.person_id" => $this->pid, "zustellung" => TRUE]); + $zustellKontakteArray = $this->PersonModel->loadWhere([ + "public.tbl_person.person_id" => $person_id, + "zustellung" => TRUE, + "kontakttyp" => $kontakttyp + ]); if (!isSuccess($zustellKontakteArray)) { return error($this->p->t('profilUpdate', 'profilUpdate_loadingZustellkontakte_error')); } diff --git a/application/controllers/api/frontend/v1/RendererLoader.php b/application/controllers/api/frontend/v1/RendererLoader.php new file mode 100644 index 000000000..dc16bb3fc --- /dev/null +++ b/application/controllers/api/frontend/v1/RendererLoader.php @@ -0,0 +1,72 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +use CI3_Events as Events; + +class RendererLoader extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + + parent::__construct([ + 'GetRenderers' => self::PERM_LOGGED, + + ]); + + $this->load->library('LogLib'); + $this->loglib->setConfigs(array( + 'classIndex' => 5, + 'functionIndex' => 5, + 'lineIndex' => 4, + 'dbLogType' => 'API', // required + 'dbExecuteUser' => 'RESTful API' + )); + + + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * fetches Stundenplan and Moodle events together + * @access public + * + */ + public function GetRenderers(){ + $renderer_paths = []; + Events::trigger( + 'loadRenderers', + function & () use (&$renderer_paths) + { + return $renderer_paths; + } + ); + $this->terminateWithSuccess($renderer_paths); + } + + + + +} diff --git a/application/controllers/api/frontend/v1/RouteInfo.php b/application/controllers/api/frontend/v1/RouteInfo.php new file mode 100644 index 000000000..78db3ba2c --- /dev/null +++ b/application/controllers/api/frontend/v1/RouteInfo.php @@ -0,0 +1,60 @@ +. + */ +if (!defined('BASEPATH')) + exit('No direct script access allowed'); + +class RouteInfo extends FHCAPI_Controller +{ + + public function __construct() + { + parent::__construct([ + 'info' => self::PERM_LOGGED, + ]); + + $this->load->model('system/Webservicelog_model', 'WebservicelogModel'); + } + + public function info() + { + $payload = json_decode($this->input->raw_input_stream); + + if (isset($payload->app) && isset($payload->path) && $this->isValidApp($payload->app) && $this->isValidPath($payload->path)) + { + $this->WebservicelogModel->insert(array( + 'webservicetyp_kurzbz' => 'content', + 'beschreibung' => $payload->app, + 'request_data' => $payload->path, + 'execute_user' => getAuthUID(), + 'execute_time' => 'NOW()' + )); + } + $this->terminateWithSuccess(true); + } + + protected function isValidApp($app) + { + return preg_match("/^[A-Za-z0-9\-_]+$/", $app); + } + + protected function isValidPath($path) + { + return preg_match("/^[\/A-Za-z0-9_.\-~?%=&;]+$/", $path); + } +} diff --git a/application/controllers/api/frontend/v1/Searchbar.php b/application/controllers/api/frontend/v1/Searchbar.php index 8b383e042..b4c251555 100644 --- a/application/controllers/api/frontend/v1/Searchbar.php +++ b/application/controllers/api/frontend/v1/Searchbar.php @@ -35,11 +35,12 @@ class Searchbar extends FHCAPI_Controller { // NOTE(chris): additional permission checks will be done in SearchBarLib parent::__construct([ - 'search' => self::PERM_LOGGED + 'search' => self::PERM_LOGGED, + 'searchCis' => self::PERM_LOGGED, + 'searchStv' => self::PERM_LOGGED ]); - // Load the library SearchBarLib - $this->load->library('SearchBarLib'); + $this->load->model('system/Webservicelog_model', 'WebservicelogModel'); } //------------------------------------------------------------------------------------------------------------------ @@ -50,6 +51,7 @@ class Searchbar extends FHCAPI_Controller */ public function search() { + $this->load->library('SearchBarLib'); $this->load->library('form_validation'); // Checks if the searchstr and the types parameters are in the POSTed JSON @@ -63,7 +65,64 @@ class Searchbar extends FHCAPI_Controller $result = $this->searchbarlib->search($this->input->post(self::SEARCHSTR_PARAM), $this->input->post(self::TYPES_PARAM)); if (property_exists($result, 'error')) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - $this->terminateWithSuccess($result); + + $this->addMeta('mode', 'simple'); + + $this->terminateWithSuccess($result->data); + } + + /** + * Gets a JSON body via HTTP POST and provides the parameters + */ + public function searchCis() + { + return $this->searchAdvanced([ 'config' => 'searchcis' ]); + } + + /** + * Gets a JSON body via HTTP POST and provides the parameters + */ + public function searchStv() + { + return $this->searchAdvanced([ 'config' => 'searchstv' ]); + } + + /** + * Gets a JSON body via HTTP POST and provides the parameters + */ + private function searchAdvanced($config) + { + $this->load->library('SearchLib', $config); + $this->load->library('form_validation'); + + // Checks if the searchstr and the types parameters are in the POSTed JSON + $this->form_validation->set_rules(self::SEARCHSTR_PARAM, null, 'required'); + $this->form_validation->set_rules(self::TYPES_PARAM . '[]', null, 'required'); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + // Convert to json the result from searchlib->search + $result = $this->searchlib->search($this->input->post(self::SEARCHSTR_PARAM), $this->input->post(self::TYPES_PARAM)); + + $this->WebservicelogModel->insert(array( + 'webservicetyp_kurzbz' => 'content', + 'beschreibung' => $config['config'], + 'request_data' => json_encode(array( + self::SEARCHSTR_PARAM => $this->input->post(self::SEARCHSTR_PARAM), + self::TYPES_PARAM => $this->input->post(self::TYPES_PARAM) + )), + 'execute_user' => getAuthUID(), + 'execute_time' => 'NOW()' + )); + + $data = $this->getDataOrTerminateWithError($result); + + $this->addMeta('time', $result->meta['time']); + $this->addMeta('searchstring', $result->meta['searchstring']); + $this->addMeta('mode', 'advanced'); + + $this->terminateWithSuccess($data); } } diff --git a/application/controllers/api/frontend/v1/Studium.php b/application/controllers/api/frontend/v1/Studium.php new file mode 100644 index 000000000..d17f0c1a1 --- /dev/null +++ b/application/controllers/api/frontend/v1/Studium.php @@ -0,0 +1,329 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +use CI3_Events as Events; + +class Studium extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + parent::__construct([ + 'getStudienAllSemester'=> self::PERM_LOGGED, + 'getStudiengaengeForStudienSemester'=> self::PERM_LOGGED, + 'getStudienplaeneBySemester'=> self::PERM_LOGGED, + 'getLvEvaluierungInfo'=> self::PERM_LOGGED, + ]); + + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->load->model('organisation/Studienordnung_model','StudienordnungModel'); + $this->load->model('organisation/Studiensemester_model',"StudiensemesterModel"); + $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); + $this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $this->load->model('codex/Orgform_model','OrgformModel'); + $this->load->model('person/Person_model','PersonModel'); + + + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + public function getStudienAllSemester(){ + + $parameter_studiensemester = $this->input->get('studiensemester',true); + $parameter_studiengang = $this->input->get('studiengang',true); + $parameter_semester = $this->input->get('semester',true); + $parameter_studienplan = $this->input->get('studienplan',true); + + $aktuelles_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->getAktOrNextSemester())); + + 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; + $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_studienplan)) + $parameter_studienplan = $student_studienplan; + } + + if(isset($parameter_studiensemester)){ + $parameter_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz" => $parameter_studiensemester]))); + } + + if(isset($parameter_studiengang)){ + $parameter_studiengang = current($this->getDataOrTerminateWithError($this->StudiengangModel->loadWhere(["studiengang_kz" => $parameter_studiengang]))); + } + + if(isset($parameter_studienplan)){ + $this->StudienplanModel->addJoin("lehre.tbl_studienordnung", "studienordnung_id"); + $this->StudienplanModel->addJoin("lehre.tbl_studienplan_semester", "studienplan_id"); + $parameter_studienplan = $this->StudienplanModel->loadWhere(["studienplan_id" => $parameter_studienplan, "aktiv" => TRUE]); + $parameter_studienplan = current($this->getDataOrTerminateWithError($parameter_studienplan)); + } + + // 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; + }))){ + $aktuelles_studiensemester = $parameter_studiensemester; + } + + // fetch studiengaenge + $studiengaenge = $this->computeStudiengaenge($aktuelles_studiensemester->studiensemester_kurzbz); + $aktuelles_studiengang = current($studiengaenge); + if(!$aktuelles_studiengang){ + $aktuelles_studiengang = null; + } + if(isset($parameter_studiengang) && !empty(array_filter( $studiengaenge,function($studiengang)use($parameter_studiengang){ + return $studiengang->studiengang_kz == $parameter_studiengang->studiengang_kz; + }))){ + $aktuelles_studiengang = $parameter_studiengang; + } + + // compute semester and studienplaene + if($aktuelles_studiengang){ + $studienplaene = $this->computeStudienplaene($aktuelles_studiengang->studiengang_kz, $aktuelles_studiensemester->studiensemester_kurzbz); + }else{ + $studienplaene =[]; + } + + $semester = array_values(array_unique(array_map(function($item){ + return $item->semester; + }, $studienplaene))); + $aktuelles_semester = current($semester); + if(!$aktuelles_semester){ + $aktuelles_semester = null; + } + if(isset($parameter_semester) && in_array($parameter_semester, $semester)){ + $aktuelles_semester = $parameter_semester; + } + + $semester_studienplan = array_filter($studienplaene, function($item) use($aktuelles_semester){ + return $item->semester == $aktuelles_semester; + }); + + // fetch current studienplan based on semester + $aktuelles_studienplan = current($semester_studienplan); + if(!$aktuelles_studienplan){ + $aktuelles_studienplan = null; + } + if(isset($parameter_studienplan) && !empty(array_filter( $semester_studienplan, function($studienplan) use($parameter_studienplan){ + return $studienplan->studienplan_id == $parameter_studienplan->studienplan_id; + }))){ + $aktuelles_studienplan = $parameter_studienplan ; + } + + // fetch studienplan lehrveranstaltungen + if($aktuelles_studienplan){ + $lehrveranstaltungen = $this->computeStudienplanLehrveranstaltungen($aktuelles_studienplan->studienplan_id, $aktuelles_semester); + foreach($lehrveranstaltungen as $lehrv){ + foreach($lehrv->lehrveranstaltungen as $lv){ + $lvLektoren =$this->computeLektorenFromLehrveranstaltung($lv->lehrveranstaltung_id,$aktuelles_semester, $aktuelles_studiengang->studiengang_kz, $aktuelles_studiensemester->studiensemester_kurzbz); + $lv->lektoren = $lvLektoren; + } + + } + $aktuelles_lehrveranstaltungen = $lehrveranstaltungen; + }else{ + $aktuelles_lehrveranstaltungen = []; + } + + // result object + $result = new stdClass(); + $result->studienSemester = []; + $result->studienSemester["all"]= $allStudienSemester; + $result->studienSemester["preselected"]=$aktuelles_studiensemester; + $result->studiengang["all"]=$studiengaenge; + $result->studiengang["preselected"]=$aktuelles_studiengang; + $result->semester["all"] =$semester; + $result->semester["preselected"] =$aktuelles_semester; + $result->studienplan["all"]=$semester_studienplan; + $result->studienplan["preselected"]=$aktuelles_studienplan; + $result->lehrveranstaltungen=$aktuelles_lehrveranstaltungen; + + + $this->terminateWithSuccess($result); + } + + public function getLvEvaluierungInfo($studiensemester_kurzbz, $lehrveranstaltung_id){ + $result = []; + Events::trigger('lvEvaluierungsInfo', function & () use (&$result) { + return $result; + },$lehrveranstaltung_id, $studiensemester_kurzbz); + $this->terminateWithSuccess($result); + } + + public function getStudiengaengeForStudienSemester($studiensemester){ + $studiengaenge = $this->computeStudiengaenge($studiensemester); + $this->terminateWithSuccess($studiengaenge); + } + + public function getStudienplaeneBySemester(){ + $this->load->library('form_validation'); + $this->form_validation->set_data($this->input->get()); + $this->form_validation->set_rules('studiengang', 'studiengang', 'required'); + $this->form_validation->set_rules('studiensemester', 'studiensemester', 'required'); + if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $studiengang = $this->input->get('studiengang',true); + $studiensemester = $this->input->get('studiensemester',true); + $studienplaene = $this->computeStudienplaene($studiengang, $studiensemester); + $this->terminateWithSuccess($studienplaene); + } + + //------------------------------------------------------------------------------------------------------------------ + // Private methods + + private function computeStudienplaene($studiengang, $studiensemester){ + $studienplaene = $this->StudienplanModel->getStudienplaeneBySemester($studiengang, $studiensemester); + $studienplaene = $this->getDataOrTerminateWithError($studienplaene); + $studienplaene = array_map(function($studienplan){ + $orgform = current($this->getDataOrTerminateWithError($this->OrgformModel->loadWhere(["orgform_kurzbz" => $studienplan->orgform_kurzbz]))); + $studienplan->orgform_bezeichnung = $orgform->bezeichnung; + return $studienplan; + },$studienplaene); + return $studienplaene; + } + + private function computeStudienplanLehrveranstaltungen($studienplan_id, $semester){ + +/* +SELECT tbl_lehrveranstaltung.*, + tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id, + tbl_studienplan_lehrveranstaltung.semester as stpllv_semester, + tbl_studienplan_lehrveranstaltung.pflicht as stpllv_pflicht, + tbl_studienplan_lehrveranstaltung.koordinator as stpllv_koordinator, + tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent, + tbl_studienplan_lehrveranstaltung.sort stpllv_sort, + tbl_studienplan_lehrveranstaltung.curriculum, + tbl_studienplan_lehrveranstaltung.export, + tbl_studienplan_lehrveranstaltung.genehmigung + FROM lehre.tbl_lehrveranstaltung + JOIN lehre.tbl_studienplan_lehrveranstaltung + USING(lehrveranstaltung_id) + WHERE tbl_studienplan_lehrveranstaltung.studienplan_id=" . $this->db_add_param($studienplan_id, FHC_INTEGER); + if (defined("CIS_PROFIL_STUDIENPLAN_MODULE_AUSBLENDEN") && CIS_PROFIL_STUDIENPLAN_MODULE_AUSBLENDEN) + $qry .= " AND tbl_lehrveranstaltung.lehrtyp_kurzbz != 'modul'"; + if (!is_null($semester)) + { + $qry.=" AND tbl_studienplan_lehrveranstaltung.semester=" . $this->db_add_param($semester, FHC_INTEGER); + } */ + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $query = " + SELECT tbl_lehrveranstaltung.*, + tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id, + tbl_studienplan_lehrveranstaltung.semester as stpllv_semester, + tbl_studienplan_lehrveranstaltung.pflicht as stpllv_pflicht, + tbl_studienplan_lehrveranstaltung.koordinator as stpllv_koordinator, + tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent, + tbl_studienplan_lehrveranstaltung.sort stpllv_sort, + tbl_studienplan_lehrveranstaltung.curriculum, + tbl_studienplan_lehrveranstaltung.export, + tbl_studienplan_lehrveranstaltung.genehmigung + FROM lehre.tbl_lehrveranstaltung + JOIN lehre.tbl_studienplan_lehrveranstaltung + USING(lehrveranstaltung_id) + WHERE + tbl_lehrveranstaltung.lehre = true AND + tbl_studienplan_lehrveranstaltung.studienplan_id=? AND tbl_studienplan_lehrveranstaltung.semester=?"; + + if (defined("CIS_PROFIL_STUDIENPLAN_MODULE_AUSBLENDEN") && CIS_PROFIL_STUDIENPLAN_MODULE_AUSBLENDEN) + $query .= " AND tbl_lehrveranstaltung.lehrtyp_kurzbz != 'modul'"; + + $lehrveranstaltungen = $this->LehrveranstaltungModel->execReadOnlyQuery($query,[$studienplan_id, $semester]); + + $lehrveranstaltungen = $this->getDataOrTerminateWithError($lehrveranstaltungen); + usort($lehrveranstaltungen, function($a, $b){ + if($a->lehrtyp_kurzbz == "modul"){ + return -1; + } + else if($b->lehrtyp_kurzbz == "modul"){ + return 1; + } + return 0; + }); + $lehrveranstaltungen= array_reduce($lehrveranstaltungen,function($carry, $lehrv){ + if($lehrv->lehrtyp_kurzbz == "modul"){ + $lehrv->lehrveranstaltungen = []; + array_push($carry, $lehrv); + } + else{ + $parent =array_filter($carry, function($item)use($lehrv){ + return $item->studienplan_lehrveranstaltung_id == $lehrv->studienplan_lehrveranstaltung_id_parent; + }); + $parent = current($parent); + if($parent){ + $parent->lehrveranstaltungen[] = $lehrv; + } + } + return $carry; + }, []); + return $lehrveranstaltungen; + } + + private function computeStudiengaenge($studiensemester){ + $studiengang_studiensemester_result = $this->StudiengangModel->getStudiengaengeByStudiensemester($studiensemester); + $studiengang_studiensemester_result = $this->getDataOrTerminateWithError($studiengang_studiensemester_result); + return $studiengang_studiensemester_result; + } + + private function getStudienPlanFromPrestudentStatus($person_id){ + $studienplan_id = current($this->getDataOrTerminateWithError($this->PrestudentstatusModel->getLastStatusPerson($person_id)))->studienplan_id; + $studienplan =current($this->getDataOrTerminateWithError($this->StudienplanModel->loadWhere(["studienplan_id"=>$studienplan_id]))); + return $studienplan; + } + + private function computeLektorenFromLehrveranstaltung($lehreinheit_id, $semester, $studiengang, $studiensemester){ + $this->load->library('StundenplanLib'); + $lektoren = $this->stundenplanlib->getLektorenFromLehrveranstaltung($lehreinheit_id,$semester, $studiengang,$studiensemester); + $lektoren = $this->getDataOrTerminateWithError($lektoren) ?? []; + + $lektoren = array_map(function($lektor){ + return ["name"=>$this->getDataOrTerminateWithError($this->PersonModel->getFullName($lektor)), "email"=>$lektor."@".DOMAIN]; + },$lektoren); + + return $lektoren; + } + + + + +} + diff --git a/application/controllers/api/frontend/v1/Stundenplan.php b/application/controllers/api/frontend/v1/Stundenplan.php deleted file mode 100644 index 2ec02fea9..000000000 --- a/application/controllers/api/frontend/v1/Stundenplan.php +++ /dev/null @@ -1,618 +0,0 @@ -. - */ - -if (! defined('BASEPATH')) exit('No direct script access allowed'); - -class Stundenplan extends FHCAPI_Controller -{ - - /** - * Object initialization - */ - public function __construct() - { - - parent::__construct([ - 'getRoomplan' => self::PERM_LOGGED, - 'Stunden' => self::PERM_LOGGED, - 'Reservierungen' => self::PERM_LOGGED, - 'getStundenplan' => self::PERM_LOGGED, - 'getLehreinheitStudiensemester' => self::PERM_LOGGED, - 'studiensemesterDateInterval' => self::PERM_LOGGED, - ]); - - $this->load->library('LogLib'); - $this->loglib->setConfigs(array( - 'classIndex' => 5, - 'functionIndex' => 5, - 'lineIndex' => 4, - 'dbLogType' => 'API', // required - 'dbExecuteUser' => 'RESTful API' - )); - - $this->load->library('form_validation'); - - //load models - $this->load->model('ressource/Stundenplan_model', 'StundenplanModel'); - $this->load->model('ressource/Reservierung_model', 'ReservierungModel'); - - - } - - //------------------------------------------------------------------------------------------------------------------ - // Public methods - - //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)); - $this->terminateWithSuccess($studiensemester); - } - - - /** - * fetches Stunden layout from database - * @access public - * - */ - public function Stunden() - { - $this->load->model('ressource/Stunde_model', 'StundeModel'); - - $stunden = $this->StundeModel->load(); - - $stunden = $this->getDataOrTerminateWithError($stunden); - - $this->terminateWithSuccess($stunden); - } - - /** - * fetches room events from a certain date - * @access public - * - */ - public function getRoomplan() - { - // form validation - $this->load->library('form_validation'); - $this->form_validation->set_data($_GET); - $this->form_validation->set_rules('ort_kurzbz',"Ort","required"); - $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() === FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array()); - - // storing the get parameter in local variables - $ort_kurzbz = $this->input->get('ort_kurzbz', TRUE); - $start_date = $this->input->get('start_date', TRUE); - $end_date = $this->input->get('end_date', TRUE); - - $roomplan_data = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getRoomQuery($ort_kurzbz, $start_date, $end_date)); - - $roomplan_data = $this->getDataOrTerminateWithError($roomplan_data); - - $this->expand_object_information($roomplan_data); - - $this->terminateWithSuccess($roomplan_data); - - } - - /** - * fetches stundenplan events from a UID and start/end date - * @access public - * - */ - - public function getStundenplan(){ - - $this->load->model('ressource/Mitarbeiter_model','MitarbeiterModel'); - $this->load->model('organisation/Studiensemester_model','StudiensemesterModel'); - $this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); - $this->load->model('person/Benutzergruppe_model','BenutzergruppeModel'); - - // form validation - $this->load->library('form_validation'); - $this->form_validation->set_data($_GET); - $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() === FALSE) - $this->terminateWithValidationErrors($this->form_validation->error_array()); - - // storing the get parameter in local variables - $start_date = $this->input->get('start_date', TRUE); - $end_date = $this->input->get('end_date', TRUE); - $lv_id = $this->input->get('lv_id', TRUE); - - $student_uid = getAuthUID(); - if(is_null($student_uid)) - { - $this->terminateWithError("No UID"); - } - - $semester_range = $this->studienSemesterErmitteln($start_date,$end_date); - $this->sortStudienSemester($semester_range); - $this->applyLoadUeberSemesterHaelfte($semester_range); - - if($lv_id) { // fetch Stundenplan for lva, irrelevant of who is requesting it (for now) - - $stundenplan_data = $this->StundenplanModel->getStundenplanLVA($start_date, $end_date, $lv_id); - $stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? []; - $this->expand_object_information($stundenplan_data); - - // query lv itself in case its Stundenplan is being queried and it has no entries - $this->load->model('education/Lehrveranstaltung_model','LehrveranstaltungModel'); - $lv = getData($this->LehrveranstaltungModel->load($lv_id))[0]; - $this->addMeta('lv', $lv); - $this->terminateWithSuccess($stundenplan_data); - - } - - $is_mitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter($student_uid)); - if($is_mitarbeiter) - { - - $stundenplan_data = $this->StundenplanModel->getStundenplanMitarbeiter($start_date, $end_date, $student_uid); - $stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? []; - $this->expand_object_information($stundenplan_data); - $this->terminateWithSuccess($stundenplan_data); - } else { - // getting the gruppen_kurzbz of the student in the different studiensemester - $benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($semester_range); - - // getting the student_lehrverbaende of the student in the different studiensemester - $student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($semester_range); - - $stundenplan_query = $this->StundenplanModel->getStundenplanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband); - if(!$stundenplan_query) - { - $this->terminateWithSuccess([]); - } - $stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($stundenplan_query); - $stundenplan_data = $this->getDataOrTerminateWithError($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); - } - - } - - // gets the reservierungen of a room if the ort_kurzbz parameter is supplied otherwise gets the reservierungen of the stundenplan of a student - public function Reservierungen($ort_kurzbz = null) - { - //form validation - $this->load->library('form_validation'); - $this->form_validation->set_data($_GET); - $this->form_validation->set_rules('start_date', "StartDate", "required"); - $this->form_validation->set_rules('end_date', "EndDate", "required"); - if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array()); - - $this->load->model('ressource/Mitarbeiter_model','MitarbeiterModel'); - - // storing the get parameter in local variables - $start_date = $this->input->get('start_date', TRUE); - $end_date = $this->input->get('end_date', TRUE); - - $is_mitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter(getAuthUID())); - if($is_mitarbeiter) - { - $reservierungen = $this->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz); - } else { - // querying the reservierungen - $reservierungen = $this->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz); - } - - $reservierungen = $this->getDataOrTerminateWithError($reservierungen) ?? []; - $this->expand_object_information($reservierungen); - $this->terminateWithSuccess($reservierungen); - - } - - public function getLehreinheitStudiensemester($lehreinheit_id){ - $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); - $this->LehreinheitModel->addSelect(["studiensemester_kurzbz"]); - $result = $this->LehreinheitModel->load($lehreinheit_id); - $result = current($this->getDataOrTerminateWithError($result))->studiensemester_kurzbz; - $this->terminateWithSuccess($result); - } - - // ################# Private Functions - - private function expand_object_information($data){ - - foreach ($data as $item) - { - - $lektor_obj_array = array(); - $gruppe_obj_array = array(); - - // load lektor object - foreach ($item->lektor as $lv_lektor) - { - $this->StundenplanModel->addLimit(1); - $lektor_object = $this->StundenplanModel->execReadOnlyQuery(" - SELECT mitarbeiter_uid, vorname, nachname, kurzbz - FROM public.tbl_mitarbeiter - JOIN public.tbl_benutzer benutzer ON benutzer.uid = mitarbeiter_uid - JOIN public.tbl_person person ON person.person_id = benutzer.person_id - WHERE kurzbz = ?", [$lv_lektor]); - if (isError($lektor_object)) { - $this->show_error(getError($lektor_object)); - } - $lektor_object = $this->getDataOrTerminateWithError($lektor_object); - if(count($lektor_object) == 0) - { - $this->terminateWithError("No lektor object"); - } - $lektor_object = current($lektor_object); - // only provide needed information of the mitarbeiter object - $lektor_obj_array[] = $lektor_object; - } - - // load gruppe object - foreach ($item->gruppe as $lv_gruppe) - { - $lv_gruppe = strtr($lv_gruppe, ['(' => '', ')' => '', '"' => '']); - $lv_gruppe_array = explode(",", $lv_gruppe); - list($gruppe, $verband, $semester, $studiengang_kz, $gruppen_kuerzel) = $lv_gruppe_array; - - $lv_gruppe_object = new stdClass(); - $lv_gruppe_object->gruppe = $gruppe; - $lv_gruppe_object->verband = $verband; - $lv_gruppe_object->semester = $semester; - $lv_gruppe_object->studiengang_kz = $studiengang_kz; - $lv_gruppe_object->kuerzel = $gruppen_kuerzel; - - $gruppe_obj_array[] = $lv_gruppe_object; - } - - if($item->ort_kurzbz) { - - $ort_content_object = $this->StundenplanModel->execReadOnlyQuery(" - SELECT content_id - FROM public.tbl_ort - WHERE ort_kurzbz = ?", [$item->ort_kurzbz]); - if (isError($ort_content_object)) { - $this->show_error(getError($ort_content_object)); - } - $ort_content_object = getData($ort_content_object)[0]; - if($ort_content_object) { - $item->ort_content_id = $ort_content_object->content_id; - } - - - } - - $item->gruppe = $gruppe_obj_array; - $item->lektor = $lektor_obj_array; - - } - } - - // function used to sort an array of studiensemester strings - private function sortStudienSemester(&$semester_range){ - usort( - $semester_range, - function($first,$second) - { - $sem_first = null; - $year_first = null; - $match_first = null; - - $sem_second = null; - $year_second = null; - $match_second = null; - - preg_match('/([WS]+)([0-9]+)/',$first,$match_first); - preg_match('/([WS]+)([0-9]+)/',$second,$match_second); - - $sem_first = $match_first[1]; - $year_first = intval($match_first[2]); - - $sem_second = $match_second[1]; - $year_second = intval($match_second[2]); - - if($year_first < $year_second) - { - return -1; - } - else if($year_first > $year_second) - { - return 1; - } - else if($year_first == $year_second && $sem_first > $sem_second) - { - return 1; - } - else if($year_first == $year_second && $sem_first < $sem_second) - { - return -1; - } - return 0; - } - ); - } - - - - private function fetchBenutzerGruppenFromStudiensemester($semester_range){ - $student_uid = getAuthUID(); - $benutzer_gruppen = []; - // for each studiensemester fetch the benutzer gruppen and add them to an associate $bentuzer_gruppen array - /* - [ - ['WS2023'] => [['gruppe1_SS2023','gruppe2_SS2023'],['gruppe1_WS2023','gruppe2_WS2023']], - ['SS2024'] => [['gruppe1_WS2023','gruppe2_WS2023'],['gruppe1_SS2024','gruppe2_SS2024']], - ['WS2024'] => [['gruppe1_SS2024','gruppe2_SS2024'],['gruppe1_WS2024','gruppe2_WS2024']], - ] - */ - foreach($semester_range as $semester_key => $semester_array) - { - $benutzer_gruppen[$semester_key] = []; - // each semester could have ajoint semesters that need to be checked - foreach($semester_array as $semester=>$semester_date_range) - { - // for each active semester query the benutzer_gruppen associated to the semester - $benutzer_query = $this->BenutzergruppeModel->execReadOnlyQuery(" - SELECT * FROM tbl_benutzergruppe where uid = ? AND studiensemester_kurzbz = ?",[$student_uid, $semester]); - $benutzer_query_result = $this->getDataOrTerminateWithError($benutzer_query); - array_push( - $benutzer_gruppen[$semester_key], - array_map( - function($item) - { - return "'".$item->gruppe_kurzbz. "'"; - }, - $benutzer_query_result - ) - ); - } - } - - // merge the gruppen of each studiensemester together for the original studiensemester - /* - [ - ['WS2023'] => ['gruppe1_SS2023','gruppe2_SS2023','gruppe1_WS2023','gruppe2_WS2023'], - ['SS2024'] => ['gruppe1_WS2023','gruppe2_WS2023','gruppe1_SS2024','gruppe2_SS2024'], - ['WS2024'] => ['gruppe1_SS2024','gruppe2_SS2024','gruppe1_WS2024','gruppe2_WS2024'], - ] - */ - $benutzer_gruppen = array_map( - function($gruppe) - { - $merged_gruppe = []; - foreach($gruppe as $gruppen_array) - { - $merged_gruppe = array_merge($merged_gruppe, $gruppen_array); - } - return $merged_gruppe; - }, - $benutzer_gruppen - ); - - return $benutzer_gruppen; - } - - private function fetchStudentlehrverbandFromStudiensemester($semester_range){ - $student_uid = getAuthUID(); - $student_lehrverband = []; - // for each studiensemester fetch the studentlehrverbaende and add them to an associate $student_lehrverband array - /* - [ - ['WS2023'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ] ], - ['SS2024'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ] ], - ['WS2024'] => [ [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ] ], - ] - */ - foreach($semester_range as $semester_key => $semester_array) - { - $student_lehrverband[$semester_key] = []; - foreach($semester_array as $semester=>$semester_date_range) - { - // for each active semester query the student_lehrverband associated to the semester - $lehrverband_query = $this->BenutzergruppeModel->execReadOnlyQuery(" - SELECT * FROM tbl_studentlehrverband where student_uid = ? AND studiensemester_kurzbz = ?", [$student_uid, $semester]); - $lehrverband_query_result = $this->getDataOrTerminateWithError($lehrverband_query); - array_push($student_lehrverband[$semester_key], array_map( - function ($item) - { - $result = new stdClass(); - $result->studiengang_kz = $item->studiengang_kz; - $result->semester = $item->semester; - $result->verband = $item->verband; - $result->gruppe = $item->gruppe; - return $result; - }, - $lehrverband_query_result)); - } - } - - // merge the studentlehrverband of each studiensemester together for the original studiensemester - /* - [ - ['WS2023'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], - ['SS2024'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], - ['WS2024'] => [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ], - ] - */ - $student_lehrverband = array_map( - function($studentlehrverband) - { - $merged_studentlehrverband = []; - foreach($studentlehrverband as $studentlehrverband_array) - { - $merged_studentlehrverband = array_merge($merged_studentlehrverband, $studentlehrverband_array); - } - return $merged_studentlehrverband; - }, - $student_lehrverband - ); - - return $student_lehrverband; - } - - private function applyLoadUeberSemesterHaelfte(&$semester_range){ - /* - @var($semester_collection) - convert the array of studiensemester into an associative array with the studiensemester as the key - and the values of each key are the studiensemester needed for the query associated to that studiensemester - example: - - #INPUT: - ['WS2023','SS2024','WS2024'] - #OUTPUT: - [ - 'WS2023' => ['SS2023','WS2023'] - 'SS2024' => ['WS2023','SS2024'] - 'WS2024' => ['SS2024','WS2024'] - ] - */ - $semester_collection = []; - foreach($semester_range as $studiensemester) - { - $previous_studiensemester = $this->StudiensemesterModel->getPreviousFrom($studiensemester); - $previous_studiensemester = $this->getDataOrTerminateWithError($previous_studiensemester); - if (count($previous_studiensemester) == 0) { - $this->terminateWithError("No previous semester"); - } - $previous_studiensemester = current($previous_studiensemester)->studiensemester_kurzbz; - $semester_collection[$studiensemester] = [$previous_studiensemester, $studiensemester]; - } - - /* - @var($studienSemesterDateRanges) - fetches for each studiensemester the start and end date, (SS) summer studiensemester are extended by 1 month to cover the summerbreak - based on the LVPLAN_LOAD_UEBER_SEMESTERHAELFTE constant it will load both the semester and the previous semester with the full date range - or the semester with the full date range and the previous semester with the half date range: - - #INPUT: - [ - 'WS2023' => ['SS2023','WS2023'] - 'SS2024' => ['WS2023','SS2024'] - 'WS2024' => ['SS2024','WS2024'] - ] - #OUTPUT: depends whether LVPLAN_LOAD_UEBER_SEMESTERHAELFTE is true or false - ~ if LVPLAN_LOAD_UEBER_SEMESTERHAELFTE == true - [ - "SS2024": [ - "WS2023": [ - "start"=> "2024-02-03", - "ende"=> "2024-08-31" - ], - "SS2024": [ - "start"=> "2024-02-03", - "ende"=> "2024-08-31" - ] - ] - ] - ~ if LVPLAN_LOAD_UEBER_SEMESTERHAELFTE == false - [ - "SS2024": [ - "WS2023": [ - "start"=> "2024-02-03", - "ende"=> "2024-05-17" - ], - "SS2024": [ - "start"=> "2024-02-03", - "ende"=> "2024-08-31" - ] - ] - ] - */ - $studienSemesterDateRanges=[]; - foreach($semester_collection as $semester_original => $semester_adjoint) - { - $semester_start_ende = $this->StudiensemesterModel->getStartEndeFromStudiensemester($semester_original); - $semester_start_ende = current($this->getDataOrTerminateWithError($semester_start_ende)); - - // initialize empty arrays to add key value pairs - $studienSemesterDateRanges[$semester_original] = []; - - // check if the studiensemester is a summer semester and add 1 month to bridge the school summer break - $match = null; - preg_match("/^(SS)([0-9]+)/",$semester_original,$match); - if(count($match) >0) - { - $one_month = new DateInterval('P1M'); - $one_day = DateInterval::createFromDateString('1 days'); - $summer_studiensemester_end_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->ende); - $summer_studiensemester_end_date->add($one_month); - $summer_studiensemester_end_date->sub($one_day); - $semester_start_ende->ende = date_format($summer_studiensemester_end_date,'Y-m-d'); - } - if (defined('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE') && LVPLAN_LOAD_UEBER_SEMESTERHAELFTE === true) - { - foreach($semester_adjoint as $adjoint) - { - $studienSemesterDateRanges[$semester_original][$adjoint]=$semester_start_ende; - } - } - else - { - //TODO: half of a DateInterval might not be correctly calculated - // calculate the half of the studiensemester - $studiensemester_start_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->start); - $studiensemester_end_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->ende); - $studiensemester_time_difference = $studiensemester_start_date->diff($studiensemester_end_date); - $half_dateNumber = ceil($studiensemester_time_difference->d/2)+ceil(($studiensemester_time_difference->m*30)/2); - $half_dateInterval = new DateInterval('P'.strval($half_dateNumber) .'D'); - $studiensemester_half = date_format($studiensemester_start_date->add($half_dateInterval),'Y-m-d'); - - $first_half = new stdClass(); - $first_half->start = $semester_start_ende->start; - $first_half->ende = $studiensemester_half; - - $studienSemesterDateRanges[$semester_original][$semester_adjoint[0]] = $first_half; - $studienSemesterDateRanges[$semester_original][$semester_adjoint[1]] = $semester_start_ende; - } - $semester_range = $studienSemesterDateRanges; - } - } - - private function studienSemesterErmitteln($start_date,$end_date){ - - // gets all studiensemester from the student from start_date to end_date - $semester_range = $this->StudiensemesterModel->getByDateRange($start_date,$end_date); - $semester_range = array_map( - function($sem) - { - return $sem->studiensemester_kurzbz; - }, - $this->getDataOrTerminateWithError($semester_range) - ); - - // if no studiensemester is found for the given timespan, get the nearest studiensemester - if(count($semester_range) == 0) - { - $aktuelle_studiensemester = $this->StudiensemesterModel->getNearest(); - $aktuelle_studiensemester = $this->getDataOrTerminateWithError($aktuelle_studiensemester); - if (count($aktuelle_studiensemester) == 0) { - $this->terminateWithError("No aktuelles semester"); - } - $aktuelle_studiensemester = current($aktuelle_studiensemester)->studiensemester_kurzbz; - // push aktuelles semester in active semester array - array_push($semester_range, $aktuelle_studiensemester); - - } - return $semester_range; - } - -} diff --git a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php index 8e9d931f2..7486f44f0 100644 --- a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php +++ b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php @@ -60,7 +60,11 @@ class BetriebsmittelP extends FHCAPI_Controller public function getAllBetriebsmittel($type_id, $id) { - $result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($id, $type_id); + $betriebsmitteltypes = null; + if ($this->input->get('betriebsmitteltypes') !== null && !isEmptyArray($this->input->get('betriebsmitteltypes'))) + $betriebsmitteltypes = $this->input->get('betriebsmitteltypes'); + + $result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($id, $type_id, $betriebsmitteltypes); if (isError($result)) { $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); @@ -75,8 +79,9 @@ class BetriebsmittelP extends FHCAPI_Controller 'required' => $this->p->t('ui', 'error_fieldRequired') ]); - $this->form_validation->set_rules('kaution', 'Kaution', 'numeric|less_than_equal_to[9999.99]', [ - 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric') + $this->form_validation->set_rules('kaution', 'Kaution', 'callback_valid_number|callback_not_less_than_equal', [ + 'valid_number' => $this->p->t('ui', 'error_fieldNoValidNumber'), + 'not_less_than_equal' => $this->p->t('ui', 'error_fieldLessThan1000'), ]); $this->form_validation->set_rules('ausgegebenam', 'Ausgegeben am', 'required|is_valid_date', [ @@ -158,6 +163,7 @@ class BetriebsmittelP extends FHCAPI_Controller ], [ 'uid_in_person' => $this->p->t('person', 'error_uidNotInPerson') ]); + $this->validateNewOrUpdate(); $betriebsmitteltyp = $this->input->post('betriebsmitteltyp'); @@ -167,6 +173,7 @@ class BetriebsmittelP extends FHCAPI_Controller $betriebsmittel_id = $this->input->post('betriebsmittel_id'); $anmerkung = $this->input->post('anmerkung'); $kaution = $this->input->post('kaution'); + if($kaution) $kaution = str_replace(',', '.', $kaution); $ausgegebenam = $this->input->post('ausgegebenam'); $retouram = $this->input->post('retouram'); $uid = $this->input->post('uid'); @@ -250,6 +257,7 @@ class BetriebsmittelP extends FHCAPI_Controller $betriebsmittel_id = $this->input->post('betriebsmittel_id'); $anmerkung = $this->input->post('anmerkung'); $kaution = $this->input->post('kaution'); + if($kaution) $kaution = str_replace(',', '.', $kaution); $ausgegebenam = $this->input->post('ausgegebenam'); $retouram = $this->input->post('retouram'); @@ -366,6 +374,12 @@ class BetriebsmittelP extends FHCAPI_Controller $this->load->model('ressource/Betriebsmitteltyp_model', 'BetriebsmitteltypModel'); $this->BetriebsmitteltypModel->addOrder('beschreibung', 'ASC'); + + if ($this->input->get('betriebsmitteltypes') !== null && !isEmptyArray($this->input->get('betriebsmitteltypes'))) + { + $this->BetriebsmitteltypModel->db->where_in('betriebsmitteltyp', $this->input->get('betriebsmitteltypes')); + } + $result = $this->BetriebsmitteltypModel->load(); // load All if (isError($result)) { @@ -382,6 +396,26 @@ class BetriebsmittelP extends FHCAPI_Controller $this->terminateWithSuccess($data); } + + public function valid_number($number) + { + if(is_null($number)) return true; + $number = str_replace(',', '.', $number); + if (!is_numeric($number)) + { + return false; + } + return true; + } + + public function not_less_than_equal($number) + { + $number = str_replace(',', '.', $number); + if ($number < 1000) + return true; + return false; + + } } diff --git a/application/controllers/api/frontend/v1/funktionen/Funktionen.php b/application/controllers/api/frontend/v1/funktionen/Funktionen.php new file mode 100644 index 000000000..b2787072b --- /dev/null +++ b/application/controllers/api/frontend/v1/funktionen/Funktionen.php @@ -0,0 +1,328 @@ + ['admin:r', 'assistenz:r'], + 'getAllUserFunctions' => ['admin:r', 'assistenz:r'], + 'getOrgHeads' => ['admin:r', 'assistenz:r'], + 'getOrgetsForCompany' => ['admin:r', 'assistenz:r'], + 'getAllOrgUnits' => ['admin:r', 'assistenz:r'], + 'loadFunction' => ['admin:r', 'assistenz:r'], + 'insertFunction' => ['admin:rw', 'assistenz:rw'], + 'updateFunction' => ['admin:rw', 'assistenz:rw'], + 'deleteFunction' => ['admin:rw', 'assistenz:rw'], + ) + ); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('form_validation'); + + // Load language phrases + $this->loadPhrases([ + 'ui', + ]); + + // Load models + $this->load->model('extensions/FHC-Core-Personalverwaltung/Api_model', 'ApiModel'); + $this->load->model('ressource/Funktion_model', 'FunktionModel'); + $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + + $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); + } + + public function getAllFunctions() + { + $this->FunktionModel->addSelect("funktion_kurzbz"); + $this->FunktionModel->addSelect("beschreibung"); + $this->FunktionModel->addSelect("aktiv"); + $this->FunktionModel->addSelect("beschreibung AS label"); + $this->FunktionModel->addOrder("beschreibung"); + $result = $this->FunktionModel->load(); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getOrgHeads() + { + $result = $this->OrganisationseinheitModel->getHeads(); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getAllUserFunctions($uid) + { + if(!$uid) + { + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'UID']), self::ERROR_TYPE_GENERAL); + } + + $sql = " + SELECT + dv.dienstverhaeltnis_id, + un.bezeichnung || ' (' || TO_CHAR(dv.von, 'DD.MM.YYYY') || CASE WHEN dv.bis IS NOT NULL THEN ' - ' + || TO_CHAR(dv.bis, 'DD.MM.YYYY') ELSE '' END || ')' AS dienstverhaeltnis_unternehmen , + '[' || oet.bezeichnung || '] ' || oe.bezeichnung AS funktion_oebezeichnung, + f.beschreibung AS funktion_beschreibung, + bf.*, + fb.bezeichnung AS fachbereich_bezeichnung, + CASE + WHEN + bf.datum_bis IS NOT NULL AND bf.datum_bis::date < now()::date + THEN + false + ELSE + true + END aktiv + FROM + public.tbl_benutzerfunktion bf + JOIN + public.tbl_organisationseinheit oe ON oe.oe_kurzbz = bf.oe_kurzbz + JOIN + public.tbl_organisationseinheittyp oet ON oe.organisationseinheittyp_kurzbz = oet.organisationseinheittyp_kurzbz + JOIN + public.tbl_funktion f ON f.funktion_kurzbz = bf.funktion_kurzbz + LEFT JOIN + hr.tbl_vertragsbestandteil_funktion vf ON vf.benutzerfunktion_id = bf.benutzerfunktion_id + LEFT JOIN + hr.tbl_vertragsbestandteil v ON vf.vertragsbestandteil_id = v.vertragsbestandteil_id + LEFT JOIN + hr.tbl_dienstverhaeltnis dv ON v.dienstverhaeltnis_id = dv.dienstverhaeltnis_id + LEFT JOIN + public.tbl_organisationseinheit un ON dv.oe_kurzbz = un.oe_kurzbz + LEFT JOIN + public.tbl_fachbereich fb ON fb.fachbereich_kurzbz = bf.fachbereich_kurzbz + WHERE + bf.uid = ? + ORDER BY + bf.datum_von, bf.datum_von ASC"; + + $benutzerfunktionen = $this->BenutzerfunktionModel->execReadOnlyQuery($sql, array($uid)); + $data = $this->getDataOrTerminateWithError($benutzerfunktionen); + + $this->terminateWithSuccess($data); + } + + /* + * returns list of all organisation units + * as key value list to be used in select or autocomplete + */ + public function getAllOrgUnits() + { + $sql = " + SELECT + oe.oe_kurzbz, oe.aktiv, + '[' || COALESCE(oet.bezeichnung, oet.organisationseinheittyp_kurzbz) || + '] ' || COALESCE(oe.bezeichnung, oe.oe_kurzbz) AS label + FROM public.tbl_organisationseinheit oe + JOIN public.tbl_organisationseinheittyp oet ON oe.organisationseinheittyp_kurzbz = oet.organisationseinheittyp_kurzbz + ORDER BY oet.bezeichnung ASC, oe.bezeichnung ASC"; + + $result = $this->OrganisationseinheitModel->execReadOnlyQuery($sql); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + /* + * return list of child orgets for a given company orget_kurzbz + * as key value list to be used in select or autocomplete + */ + public function getOrgetsForCompany($companyOrgetkurzbz = null) + { + $sql = " + SELECT + oe.oe_kurzbz, oe.aktiv, + '[' || COALESCE(oet.bezeichnung, oet.organisationseinheittyp_kurzbz) || + '] ' || COALESCE(oe.bezeichnung, oe.oe_kurzbz) AS label + FROM ( + WITH RECURSIVE oes(oe_kurzbz, oe_parent_kurzbz) as + ( + SELECT oe_kurzbz, oe_parent_kurzbz FROM public.tbl_organisationseinheit + WHERE oe_kurzbz=? + UNION ALL + SELECT o.oe_kurzbz, o.oe_parent_kurzbz FROM public.tbl_organisationseinheit o, oes + WHERE o.oe_parent_kurzbz=oes.oe_kurzbz + ) + SELECT oe_kurzbz + FROM oes + GROUP BY oe_kurzbz + ) c + JOIN public.tbl_organisationseinheit oe ON oe.oe_kurzbz = c.oe_kurzbz + JOIN public.tbl_organisationseinheittyp oet ON oe.organisationseinheittyp_kurzbz = oet.organisationseinheittyp_kurzbz + ORDER BY oet.bezeichnung ASC, oe.bezeichnung ASC"; + + $childorgets = $this->OrganisationseinheitModel->execReadOnlyQuery($sql, array($companyOrgetkurzbz)); + $data = $this->getDataOrTerminateWithError($childorgets); + + $this->terminateWithSuccess($data); + } + + public function loadFunction($benutzerfunktion_id) + { + $this->BenutzerfunktionModel->addSelect("*"); + $result = $this->BenutzerfunktionModel->loadWhere( + array('benutzerfunktion_id' => $benutzerfunktion_id) + ); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function insertFunction() + { + $this->load->library('form_validation'); + $authUID = getAuthUID(); + + $uid = $this->input->post('uid'); + + if(!$uid) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'UID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + + $datum_von = $formData['datum_von'] ?? null; + $datum_bis = $formData['datum_bis'] ?? null; + $formData['oe_kurzbz'] = is_array($formData['oe_kurzbz']) ? $formData['oe_kurzbz']['oe_kurzbz'] : $formData['oe_kurzbz']; + $formData['funktion_kurzbz'] = is_array($formData['funktion_kurzbz']) + ? $formData['funktion_kurzbz']['funktion_kurzbz'] + : $formData['funktion_kurzbz']; + $bezeichnung = $formData['bezeichnung'] ?? null; + $wochenstunden = $formData['wochenstunden'] ?? null; + + $this->form_validation->set_data($formData); + $this->form_validation->set_rules('datum_von', 'VonDatum', 'required|is_valid_date', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'VonDatum']), + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum']) + ]); + $this->form_validation->set_rules('datum_bis', 'BisDatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'BisDatum']) + ]); + $this->form_validation->set_rules('oe_kurzbz', 'Organisationseinheit', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Organisationseinheit']) + ]); + $this->form_validation->set_rules('funktion_kurzbz', 'Funktion', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Funktion']) + ]); + $this->form_validation->set_rules('wochenstunden', 'Wochenstunden', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Wochenstunden']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->BenutzerfunktionModel->insert([ + 'uid' => $uid, + 'datum_von' => $datum_von, + 'datum_bis' => $datum_bis , + 'oe_kurzbz' => $formData['oe_kurzbz'], + 'funktion_kurzbz' => $formData['funktion_kurzbz'], + 'bezeichnung' => $bezeichnung, + 'wochenstunden' => $wochenstunden, + 'insertamum' => date('c'), + 'insertvon' => $authUID, + ]); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function updateFunction() + { + $this->load->library('form_validation'); + $authUID = getAuthUID(); + + $uid = $this->input->post('uid'); + + if(!$uid) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'UID']), self::ERROR_TYPE_GENERAL); + } + $benutzerfunktion_id = $this->input->post('benutzerfunktion_id'); + + if(!$benutzerfunktion_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Benutzerfunktion ID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + + $datum_von = $formData['datum_von'] ?? null; + $datum_bis = $formData['datum_bis'] ?? null; + $formData['oe_kurzbz'] = is_array($formData['oe_kurzbz']) ? $formData['oe_kurzbz']['oe_kurzbz'] : $formData['oe_kurzbz']; + $formData['funktion_kurzbz'] = is_array($formData['funktion_kurzbz']) + ? $formData['funktion_kurzbz']['funktion_kurzbz'] + : $formData['funktion_kurzbz']; + $bezeichnung = $formData['bezeichnung'] ?? null; + $wochenstunden = $formData['wochenstunden'] ?? null; + + $this->form_validation->set_data($formData); + $this->form_validation->set_rules('datum_von', 'VonDatum', 'required|is_valid_date', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'VonDatum']), + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum']) + ]); + $this->form_validation->set_rules('datum_bis', 'BisDatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'BisDatum']) + ]); + $this->form_validation->set_rules('oe_kurzbz', 'Organisationseinheit', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Organisationseinheit']) + ]); + $this->form_validation->set_rules('funktion_kurzbz', 'Funktion', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Funktion']) + ]); + $this->form_validation->set_rules('wochenstunden', 'Wochenstunden', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Wochenstunden']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->BenutzerfunktionModel->update( + [ + 'benutzerfunktion_id' => $benutzerfunktion_id, + ], + [ + 'uid' => $uid, + 'datum_von' => $datum_von, + 'datum_bis' => $datum_bis , + 'oe_kurzbz' => $formData['oe_kurzbz'], + 'funktion_kurzbz' => $formData['funktion_kurzbz'], + 'bezeichnung' => $bezeichnung, + 'wochenstunden' => $wochenstunden, + 'updateamum' => date('c'), + 'updatevon' => $authUID, + ] + ); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function deleteFunction($benutzerfunktion_id) + { + $result = $this->BenutzerfunktionModel->delete( + array('benutzerfunktion_id' => $benutzerfunktion_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } +} diff --git a/application/controllers/api/frontend/v1/lv/DirektGruppe.php b/application/controllers/api/frontend/v1/lv/DirektGruppe.php new file mode 100644 index 000000000..2dcf7d3cb --- /dev/null +++ b/application/controllers/api/frontend/v1/lv/DirektGruppe.php @@ -0,0 +1,110 @@ +. + */ + +if (!defined('BASEPATH')) + exit('No direct script access allowed'); + +class DirektGruppe extends FHCAPI_Controller +{ + private $_ci; + public function __construct() + { + parent::__construct([ + 'add' => ['admin:rw', 'assistenz:rw'], + 'delete' => ['admin:rw', 'assistenz:rw'], + 'getByLehreinheit' => ['admin:r', 'assistenz:r'], + ]); + + $this->_ci = &get_instance(); + + $this->loadPhrases([ + 'ui' + ]); + $this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel'); + $this->_ci->load->model('education/lehreinheit_model', 'LehreinheitModel'); + $this->_ci->load->model('person/Benutzer_model', 'BenutzerModel'); + } + + public function add() + { + $uid = $this->input->post('uid'); + $lehreinheit_id = $this->input->post('lehreinheit_id'); + + $this->checkPermission($lehreinheit_id, $uid); + + $result = $this->_ci->LehreinheitgruppeModel->direktUserAdd($uid, $lehreinheit_id); + + if (isError($result)) + $this->terminateWithError(getError($result)); + + $this->terminateWithSuccess($result); + } + + public function delete() + { + $uid = $this->input->post('uid'); + $lehreinheit_id = $this->input->post('lehreinheit_id'); + + $this->checkPermission($lehreinheit_id, $uid); + + $result = $this->_ci->LehreinheitgruppeModel->direktUserDelete($uid, $lehreinheit_id); + + if (isError($result)) + $this->terminateWithError(getError($result)); + + $this->terminateWithSuccess($result); + } + + public function getByLehreinheit($lehreinheit_id = null) + { + $this->checkPermission($lehreinheit_id); + $gruppen = $this->_ci->LehreinheitgruppeModel->getDirectGroup($lehreinheit_id); + $this->terminateWithSuccess(hasData($gruppen) ? getData($gruppen) : array()); + } + + private function checkPermission($lehreinheit_id, $uid = false) + { + if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id); + + if (!hasData($lehreinheit_result) || isError($lehreinheit_result)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + if ($uid) + { + $benuzuer_result = $this->_ci->BenutzerModel->load(array($uid)); + if (!hasData($benuzuer_result) || isError($benuzuer_result)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + } + + $result = $this->_ci->LehreinheitModel->getOes($lehreinheit_id); + + if (isError($result)) + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + $oe_array = []; + if (hasData($result)) + $oe_array = getData($result); + + if (!$this->_ci->permissionlib->isBerechtigtMultipleOe('admin', $oe_array, 'suid') && + !$this->_ci->permissionlib->isBerechtigtMultipleOe('assistenz', $oe_array, 'suid')) + $this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess')); + } +} diff --git a/application/controllers/api/frontend/v1/lv/Favorites.php b/application/controllers/api/frontend/v1/lv/Favorites.php new file mode 100644 index 000000000..080a4ec6e --- /dev/null +++ b/application/controllers/api/frontend/v1/lv/Favorites.php @@ -0,0 +1,47 @@ + 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 new file mode 100644 index 000000000..daebe8a61 --- /dev/null +++ b/application/controllers/api/frontend/v1/lv/Gruppe.php @@ -0,0 +1,250 @@ + ['admin:rw', 'assistenz:rw'], + 'delete' => ['admin:rw', 'assistenz:rw'], + 'deleteFromLVPlan' => ['admin:rw', 'assistenz:rw'], + 'getBenutzerSearch' => ['admin:r', 'assistenz:r'], + 'getAllSearch' => ['admin:r', 'assistenz:r'], + 'getByLehreinheit' => ['admin:r', 'assistenz:r'], + ]); + + $this->_ci = &get_instance(); + $this->_setAuthUID(); + $this->_ci->load->library('PhrasesLib'); + $this->loadPhrases( + array( + 'ui', + 'lehre' + ) + ); + + $this->_ci->load->model('organisation/Gruppe_model', 'GruppeModel'); + $this->_ci->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); + $this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel'); + $this->_ci->load->model('person/Person_model', 'PersonModel'); + $this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel'); + } + + public function delete() + { + $lehreinheitgruppe_id = $this->input->post('lehreinheitgruppe_id'); + $lehreinheit_id = $this->input->post('lehreinheit_id'); + + if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($lehreinheitgruppe_id) || !ctype_digit((string)$lehreinheitgruppe_id)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $lehreinheitgruppe_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheitgruppe_id' => $lehreinheitgruppe_id)); + if (!hasData($lehreinheitgruppe_result) || isError($lehreinheitgruppe_result)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $this->checkPermission($lehreinheit_id); + + $result = $this->_ci->LehreinheitgruppeModel->deleteGroup($lehreinheit_id, $lehreinheitgruppe_id); + + if (isError($result)) + $this->terminateWithError(getError($result)); + + $this->terminateWithSuccess($result); + } + + public function add() + { + $lehreinheit_id = $this->input->post('lehreinheit_id'); + $gid = $this->input->post('gid'); + $lehrverband = $this->input->post('lehrverband'); + + if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($gid) || !ctype_digit((string)$gid) || is_null($lehrverband)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $this->checkPermission($lehreinheit_id); + + $result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, !($lehrverband === 'false')); + + if (isError($result)) + $this->terminateWithError(getError($result)); + + $this->terminateWithSuccess($result); + } + + public function getByLehreinheit($lehreinheit_id = null) + { + if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $this->checkPermission($lehreinheit_id); + + $gruppen = $this->_ci->LehreinheitgruppeModel->getByLehreinheit($lehreinheit_id); + $this->terminateWithSuccess(hasData($gruppen) ? getData($gruppen) : array()); + } + + public function deleteFromLVPlan() + { + $lehreinheit_id = $this->input->post('lehreinheit_id'); + $lehreinheitgruppe_id = $this->input->post('lehreinheitgruppe_id'); + + if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($lehreinheitgruppe_id) || !ctype_digit((string)$lehreinheitgruppe_id)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $lehreinheitgruppe_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheitgruppe_id' => $lehreinheitgruppe_id)); + if (!hasData($lehreinheitgruppe_result) || isError($lehreinheitgruppe_result)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $this->checkPermission($lehreinheit_id); + + $result = $this->_ci->StundenplandevModel->deleteGroupPlanning($lehreinheit_id, $lehreinheitgruppe_id); + + if (isError($result)) + $this->terminateWithError(getError($result)); + + $this->terminateWithSuccess($result); + } + + + public function getAllSearch() + { + $query = $this->input->get('query'); + + if (is_null($query)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $query_words = explode(' ', $query); + + $this->_ci->GruppeModel->addSelect('gruppe_kurzbz, + studiengang_kz, + semester, + bezeichnung, + gid, + \'false\' as lehrverband'); + $this->_ci->GruppeModel->db->where(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null)); + $this->_ci->GruppeModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->GruppeModel->db->group_start(); + $this->_ci->GruppeModel->db->where('gruppe_kurzbz ILIKE', "%" . $word . "%"); + $this->_ci->GruppeModel->db->or_where('bezeichnung ILIKE', "%" . $word . "%"); + $this->_ci->GruppeModel->db->group_end(); + } + $this->_ci->GruppeModel->db->group_end(); + + $gruppen_result = $this->_ci->GruppeModel->load(); + + $gruppen_array = array(); + + if (isError($gruppen_result)) + $this->terminateWithError(getError($gruppen_result), self::ERROR_TYPE_GENERAL); + + if (hasData($gruppen_result)) + $gruppen_array = getData($gruppen_result); + + $this->_ci->LehrverbandModel->addSelect('CONCAT(UPPER(CONCAT(typ, kurzbz)), \'\', semester, verband, COALESCE(gruppe,\'\')) as gruppe_kurzbz, + studiengang_kz, + semester, + tbl_lehrverband.bezeichnung, + gid, + \'true\' as lehrverband'); + $this->_ci->LehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz'); + $this->_ci->LehrverbandModel->addOrder('verband'); + $this->_ci->LehrverbandModel->addOrder('gruppe'); + $this->_ci->LehrverbandModel->db->where(array('tbl_lehrverband.aktiv' => true)); + + $this->_ci->LehrverbandModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->LehrverbandModel->db->group_start(); + $this->_ci->LehrverbandModel->db->where('CONCAT(CONCAT(typ, kurzbz), \'\', semester, verband, COALESCE(gruppe,\'\')) ILIKE', "%" . $word . "%"); + $this->_ci->LehrverbandModel->db->or_where('tbl_lehrverband.bezeichnung ILIKE', "%" . $word . "%"); + $this->_ci->LehrverbandModel->db->group_end(); + } + $this->_ci->LehrverbandModel->db->group_end(); + $lehrverband_result = $this->_ci->LehrverbandModel->load(); + + $lehrverband_array = array(); + + if (isError($lehrverband_result)) + $this->terminateWithError(getError($lehrverband_result), self::ERROR_TYPE_GENERAL); + + if (hasData($lehrverband_result)) + $lehrverband_array = getData($lehrverband_result); + + $all_gruppen = array_merge($gruppen_array, $lehrverband_array); + + $this->terminateWithSuccess($all_gruppen); + } + + public function getBenutzerSearch() + { + $query = $this->input->get('query'); + + if (is_null($query)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $query_words = explode(' ', $query); + + $this->_ci->PersonModel->addSelect('vorname, nachname, uid, semester, UPPER(CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz)) as studiengang'); + $this->_ci->PersonModel->addJoin('public.tbl_benutzer', 'person_id'); + $this->_ci->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid', 'LEFT'); + $this->_ci->PersonModel->addJoin('public.tbl_student', 'uid = student_uid', 'LEFT'); + $this->_ci->PersonModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT'); + + $this->_ci->PersonModel->db->where(array('tbl_benutzer.aktiv' => true)); + + $this->_ci->PersonModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->PersonModel->db->group_start(); + $this->_ci->PersonModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%"); + $this->_ci->PersonModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%"); + $this->_ci->PersonModel->db->or_where('uid ILIKE', "%" . $word . "%"); + $this->_ci->PersonModel->db->or_where('CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz) ILIKE', "%" . $word . "%"); + + if (is_numeric($word)) + { + $this->_ci->PersonModel->db->or_where('semester', $word); + } + $this->_ci->PersonModel->db->group_end(); + } + $this->_ci->PersonModel->db->group_end(); + $personen = $this->_ci->PersonModel->load(); + $this->terminateWithSuccess(hasData($personen) ? getData($personen) : array()); + } + + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) + show_error('User authentification failed'); + } + + private function checkPermission($lehreinheit_id) + { + $lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id); + + if (!hasData($lehreinheit_result) || isError($lehreinheit_result)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $result = $this->_ci->LehreinheitModel->getOes($lehreinheit_id); + + if (isError($result)) + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + $oe_array = []; + if (hasData($result)) + $oe_array = getData($result); + + if (!$this->_ci->permissionlib->isBerechtigtMultipleOe('admin', $oe_array, 'suid') && + !$this->_ci->permissionlib->isBerechtigtMultipleOe('assistenz', $oe_array, 'suid') && + !$this->_ci->permissionlib->isBerechtigtMultipleOe('lv-plan', $oe_array, 'suid')) + $this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess')); + } + +} diff --git a/application/controllers/api/frontend/v1/lv/Lehreinheit.php b/application/controllers/api/frontend/v1/lv/Lehreinheit.php new file mode 100644 index 000000000..6329d30ac --- /dev/null +++ b/application/controllers/api/frontend/v1/lv/Lehreinheit.php @@ -0,0 +1,478 @@ + ['admin:rw', 'assistenz:rw'], + 'copy' => ['admin:rw', 'assistenz:rw'], + 'delete' => ['admin:rw', 'assistenz:rw'], + 'update' => ['admin:rw', 'assistenz:rw'], + + 'get' => ['admin:r', 'assistenz:r'], + 'getStudiensemester' => ['admin:r', 'assistenz:r'], + 'getLehrfach' => ['admin:r', 'assistenz:r'], + 'getSprache' => ['admin:r', 'assistenz:r'], + 'getRaumtyp' => ['admin:r', 'assistenz:r'], + 'getLehrform' => ['admin:r', 'assistenz:r'] + ]); + + $this->_ci = &get_instance(); + $this->_setAuthUID(); + $this->_ci->load->library('VariableLib', ['uid' => $this->_uid]); + $this->_ci->load->library('PhrasesLib'); + $this->loadPhrases( + array( + 'global', + 'ui' + ) + ); + + $this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + $this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel'); + $this->_ci->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); + } + + public function get($lehreinheit_id) + { + $lehreinheit = $this->checkLehreinheit($lehreinheit_id); + $lehreinheit->lehrfaecher = $this->getLehrfaecher($lehreinheit); + $this->terminateWithSuccess($lehreinheit); + } + + private function getLehrfaecher($lehreinheit) + { + $lehrfacher_array = array($lehreinheit->lehrfach_id); + $this->_ci->LehreinheitModel->addSelect('lehrveranstaltung_id_kompatibel'); + $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung_kompatibel', 'lehrveranstaltung_id'); + $lehrfaecher = $this->_ci->LehreinheitModel->loadWhere(array('lehrveranstaltung_id' => $lehreinheit->lehrveranstaltung_id)); + + + if (hasData($lehrfaecher)) + $lehrfaecher_array = array_merge($lehrfacher_array, array_column(getData($lehrfaecher), 'lehrveranstaltung_id_kompatibel')); + + $lehrfaecher_array[] = $lehreinheit->lehrveranstaltung_id; + + $this->_ci->LehrveranstaltungModel->addDistinct('lehrfach_id'); + $this->_ci->LehrveranstaltungModel->addSelect("tbl_lehrveranstaltung.lehrveranstaltung_id, CONCAT(tbl_lehrveranstaltung.bezeichnung || '(' || tbl_lehrveranstaltung.oe_kurzbz || ')') as lehrfach"); + $this->_ci->LehrveranstaltungModel->db->where_in('tbl_lehrveranstaltung.lehrveranstaltung_id', $lehrfaecher_array); + $lehrfaecher_result = $this->_ci->LehrveranstaltungModel->load(); + + return hasData($lehrfaecher_result) ? getData($lehrfaecher_result) : array(); + } + + public function add() + { + $lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id'); + + if (is_null($lehrveranstaltung_id) || !ctype_digit((string)$lehrveranstaltung_id)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $lehrveranstaltung_result = $this->_ci->LehrveranstaltungModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung_id)); + + if (!hasData($lehrveranstaltung_result) || isError($lehrveranstaltung_result)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $lehrveranstaltung = getData($lehrveranstaltung_result)[0]; + + $oe_result = $this->_ci->LehrveranstaltungModel->getAllOe($lehrveranstaltung->lehrveranstaltung_id); + $oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array(); + + if (!$this->_ci->permissionlib->isBerechtigtMultipleOe('admin', $oe_array, 'suid') && + !$this->_ci->permissionlib->isBerechtigtMultipleOe('assistenz', $oe_array, 'suid') && + !$this->_ci->permissionlib->isBerechtigtMultipleOe('lv-plan', $oe_array, 'suid')) + $this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess')); + + $this->_ci->load->library('form_validation'); + + $updatableFields = array( + 'lehrveranstaltung_id', + 'studiensemester_kurzbz', + 'lehrfach_id', + 'lehrform_kurzbz', + 'stundenblockung', + 'wochenrythmus', + 'gewicht', + 'start_kw', + 'raumtyp', + 'raumtypalternativ', + 'sprache', + 'lehre', + 'anmerkung', + 'lvnr', + 'unr', + ); + + foreach ($updatableFields as $field) + { + switch ($field) { + case 'lehrveranstaltung_id': + $this->form_validation->set_rules($field, 'Lehrveranstaltung ID', 'required|integer'); + break; + case 'studiensemester_kurzbz': + $this->form_validation->set_rules($field, 'Studiensemester', 'required|max_length[16]'); + break; + case 'lehrfach_id': + $this->form_validation->set_rules($field, 'Lehrfach ID', 'required|integer'); + break; + case 'lehrform_kurzbz': + $this->form_validation->set_rules($field, 'Lehrform', 'required|max_length[8]'); + break; + case 'stundenblockung': + $this->form_validation->set_rules($field, 'Stundenblockung', 'required|integer|greater_than_equal_to[0]'); + break; + case 'wochenrythmus': + $this->form_validation->set_rules($field, 'Wochenrhytmus', 'required|integer|greater_than_equal_to[0]'); + break; + case 'start_kw': + $this->form_validation->set_rules($field, 'Start KW', 'integer|greater_than[0]|less_than_equal_to[53]'); + break; + case 'gewicht': + $this->form_validation->set_rules($field, 'Gewicht', 'numeric'); + break; + case 'raumtyp': + $this->form_validation->set_rules($field, 'Raumtyp', 'required|max_length[16]'); + break; + case 'raumtypalternativ': + $this->form_validation->set_rules($field, 'Raumtyp Alternativ', 'required|max_length[16]'); + break; + case 'sprache': + $this->form_validation->set_rules($field, 'Sprache', 'required|max_length[16]'); + break; + case 'lvnr': + $this->form_validation->set_rules($field, 'LVNR', 'integer'); + break; + case 'unr': + $this->form_validation->set_rules($field, 'UNR', 'integer'); + break; + case 'lehre': + $this->form_validation->set_rules($field, 'Lehre', 'trim'); + break; + case 'anmerkung': + $this->form_validation->set_rules($field, 'Anmerkung', 'trim'); + break; + } + } + + if ($this->form_validation->run() === false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $updateData = array(); + foreach ($updatableFields as $field) + { + $value = $this->input->post($field); + + if ($field === 'lehre') + { + $value = (bool)$value; + } + if ($value !== null) + { + $updateData[$field] = $value; + } + } + + $updateData['insertvon'] = $this->_uid; + $updateData['insertamum'] = date('Y-m-d H:i:s'); + + $result = $this->_ci->LehreinheitModel->insert( + $updateData + ); + + if (!isset($updateData['unr'])) + { + $unr = getData($result); + $this->_ci->LehreinheitModel->update($unr, array('unr' => $unr)); + } + + $this->terminateWithSuccess($result); + } + + public function copy() + { + $lehreinheit_id = $this->input->post('lehreinheit_id'); + $art = $this->input->post('art'); + + $lehreinheit_old = $this->checkLehreinheit($lehreinheit_id); + $this->checkPermission($lehreinheit_old->lehreinheit_id); + + $lehreinheit_new = $lehreinheit_old; + + $lehreinheit_new->unr = null; + unset($lehreinheit_new->lehreinheit_id); + $lehreinheit_new->updateamum = date('Y-m-d H:i:s'); + $lehreinheit_new->updatevon = $this->_uid; + $lehreinheit_new->insertamum = date('Y-m-d H:i:s'); + $lehreinheit_new->insertvon = $this->_uid; + + $insert_result = $this->_ci->LehreinheitModel->insert($lehreinheit_new); + + if (isError($insert_result)) + $this->terminateWithError(getError($insert_result), self::ERROR_TYPE_GENERAL); + + $lehreinheit_id_new = getData($insert_result); + + $this->_ci->LehreinheitModel->update(array('lehreinheit_id' => $lehreinheit_id_new), array('unr' => $lehreinheit_id_new)); + if (in_array($art, array('gruppen', 'alle'))) + { + $gruppen_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); + + if (isError($gruppen_result)) + $this->terminateWithError(getError($gruppen_result), self::ERROR_TYPE_GENERAL); + + if (hasData($gruppen_result)) + { + $gruppen = getData($gruppen_result); + + foreach ($gruppen as $gruppe) + { + $gruppe_new = $gruppe; + unset($gruppe_new->lehreinheitgruppe_id); + $gruppe_new->lehreinheit_id = $lehreinheit_id_new; + $gruppe_new->insertamum = date('Y-m-d H:i:s'); + $gruppe_new->insertvon = $this->_uid; + $gruppe_new->updateamum = date('Y-m-d H:i:s'); + $gruppe_new->updatevon = $this->_uid; + + $gruppe_new_result = $this->_ci->LehreinheitgruppeModel->insert($gruppe_new); + + if (isError($gruppe_new_result)) + $this->terminateWithError(getError($gruppe_new_result), self::ERROR_TYPE_GENERAL); + } + } + } + + if (in_array($art, array('lektoren', 'alle'))) + { + $lektoren_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); + + if (isError($lektoren_result)) + $this->terminateWithError(getError($lektoren_result), self::ERROR_TYPE_GENERAL); + + if (hasData($lektoren_result)) + { + $lektoren = getData($lektoren_result); + + foreach ($lektoren as $lektor) + { + + $lektor_new = $lektor; + $lektor_new->lehreinheit_id = $lehreinheit_id_new; + $lektor_new->insertamum = date('Y-m-d H:i:s'); + $lektor_new->insertvon = $this->_uid; + $lektor_new->updateamum = date('Y-m-d H:i:s'); + $lektor_new->updatevon = $this->_uid; + unset($lektor_new->vertrag_id); + + $lektor_new_result = $this->_ci->LehreinheitmitarbeiterModel->insert((array)$lektor_new); + + if (isError($lektor_new_result)) + $this->terminateWithError(getError($lektor_new_result), self::ERROR_TYPE_GENERAL); + } + } + } + + $this->terminateWithSuccess("Erfolgeich gespeichert"); + } + + public function delete() + { + $lehreinheit_id = $this->input->post('lehreinheit_id'); + + $errors = array(); + if (is_array($lehreinheit_id)) + { + foreach ($lehreinheit_id as $le_id) + { + $lehreinheit = $this->checkLehreinheit($le_id); + $this->checkPermission($lehreinheit->lehreinheit_id); + + $result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id); + + if (isError($result)) + { + $errors[] = getError($result); + } + } + } + else + { + $lehreinheit = $this->checkLehreinheit($lehreinheit_id); + $this->checkPermission($lehreinheit->lehreinheit_id); + + $result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id); + + if (isError($result)) + $this->terminateWithError(getError($result)); + } + + if (!isEmptyArray($errors)) + { + if (count($errors) !== count($lehreinheit_id)) + $this->terminateWithSuccess(array('errors' => $errors)); + else + $this->terminateWithError($errors); + } + else + $this->terminateWithSuccess('Erfolgreich geloescht'); + } + + public function update() + { + $lehreinheit = $this->checkLehreinheit($this->input->post('lehreinheit_id')); + + $this->checkPermission($lehreinheit->lehreinheit_id); + + $this->_ci->load->library('form_validation'); + + $formData = $this->input->post('formData'); + + $updatableFields = array( + 'lehrveranstaltung_id', + 'studiensemester_kurzbz', + 'lehrfach_id', + 'lehrform_kurzbz', + 'stundenblockung', + 'wochenrythmus', + 'gewicht', + 'start_kw', + 'raumtyp', + 'raumtypalternativ', + 'sprache', + 'lehre', + 'anmerkung', + 'lvnr', + 'unr', + ); + + $this->form_validation->set_data($formData); + + foreach ($updatableFields as $field) + { + if (array_key_exists($field, $formData)) + { + switch ($field) + { + case 'lehrveranstaltung_id': + $this->form_validation->set_rules($field, 'Lehrveranstaltung ID', 'required|integer'); + break; + case 'studiensemester_kurzbz': + $this->form_validation->set_rules($field, 'Studiensemester', 'required|max_length[16]'); + break; + case 'lehrfach_id': + $this->form_validation->set_rules($field, 'Lehrfach ID', 'required|integer'); + break; + case 'lehrform_kurzbz': + $this->form_validation->set_rules($field, 'Lehrform', 'required|max_length[8]'); + break; + case 'stundenblockung': + $this->form_validation->set_rules($field, 'Stundenblockung', 'required|integer|greater_than_equal_to[0]'); + break; + case 'wochenrythmus': + $this->form_validation->set_rules($field, 'Wochenrhytmus', 'required|integer|greater_than_equal_to[0]'); + break; + case 'start_kw': + $this->form_validation->set_rules($field, 'Start KW', 'integer|greater_than[0]|less_than_equal_to[53]'); + break; + case 'gewicht': + $this->form_validation->set_rules($field, 'Gewicht', 'numeric|greater_than_equal_to[0]'); + break; + case 'raumtyp': + $this->form_validation->set_rules($field, 'Raumtyp', 'required|max_length[16]'); + break; + case 'raumtypalternativ': + $this->form_validation->set_rules($field, 'Raumtyp Alternativ', 'required|max_length[16]'); + break; + case 'sprache': + $this->form_validation->set_rules($field, 'Sprache', 'required|max_length[16]'); + break; + case 'lvnr': + $this->form_validation->set_rules($field, 'LVNR', 'integer'); + break; + case 'unr': + $this->form_validation->set_rules($field, 'UNR', 'integer|greater_than_equal_to[0]'); + break; + case 'lehre': + $this->form_validation->set_rules($field, 'Lehre', 'trim'); + break; + case 'anmerkung': + $this->form_validation->set_rules($field, 'Anmerkung', 'trim'); + break; + } + } + } + + if ($this->form_validation->run() === false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $updateData = []; + foreach ($updatableFields as $field) + { + if (array_key_exists($field, $formData)) + { + $updateData[$field] = $formData[$field]; + } + } + + + $updateData['updatevon'] = $this->_uid; + $updateData['updateamum'] = date('Y-m-d H:i:s'); + $result = $this->_ci->LehreinheitModel->update( + [ + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + ], + $updateData + ); + + if (isError($result)) + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + $this->terminateWithSuccess($this->p->t('global', 'gespeichert')); + } + + + private function checkPermission($lehreinheit_id) + { + $result = $this->_ci->LehreinheitModel->getOes($lehreinheit_id); + + if (isError($result)) + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + $oe_array = []; + if (hasData($result)) + $oe_array = getData($result); + + if (!$this->_ci->permissionlib->isBerechtigtMultipleOe('admin', $oe_array, 'suid') && + !$this->_ci->permissionlib->isBerechtigtMultipleOe('assistenz', $oe_array, 'suid') && + !$this->_ci->permissionlib->isBerechtigtMultipleOe('lv-plan', $oe_array, 'suid')) + $this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess')); + } + private function checkLehreinheit($lehreinheit_id) + { + if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id); + + if (!hasData($lehreinheit_result) || isError($lehreinheit_result)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + return getData($lehreinheit_result)[0]; + } + + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) + show_error('User authentification failed'); + } +} diff --git a/application/controllers/api/frontend/v1/lv/Lektor.php b/application/controllers/api/frontend/v1/lv/Lektor.php new file mode 100644 index 000000000..cce7f6e8b --- /dev/null +++ b/application/controllers/api/frontend/v1/lv/Lektor.php @@ -0,0 +1,432 @@ + ['admin:rw', 'assistenz:rw'], + 'update' => ['admin:rw', 'assistenz:rw'], + 'cancelVertrag' => ['admin:rw', 'assistenz:rw'], + 'deleteLVPlan' => ['admin:rw', 'assistenz:rw'], + 'deletePerson' => ['admin:rw', 'assistenz:rw'], + 'getLehrfunktionen' => ['admin:r', 'assistenz:r'], + 'getLektorenSearch' => ['admin:r', 'assistenz:r'], + 'getLektorenByLE' => ['admin:r', 'assistenz:r'], + 'getLektorDaten' => ['admin:r', 'assistenz:r'], + 'getLektorVertrag' => ['admin:r', 'assistenz:r'], + + ]); + + $this->_ci = &get_instance(); + $this->_setAuthUID(); + $this->_ci->load->library('VariableLib', ['uid' => $this->_uid]); + $this->_ci->load->library('PermissionLib'); + $this->_ci->load->library('LektorLib'); + $this->_ci->load->library('form_validation'); + $this->loadPhrases([ + 'ui' + ]); + + $this->_ci->load->model('accounting/Vertrag_model', 'VertragModel'); + $this->_ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->_ci->load->model('education/lehreinheit_model', 'LehreinheitModel'); + $this->_ci->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); + $this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel'); + $this->_ci->load->model('ressource/Stundensatz_model', 'StundensatzModel'); + + } + + private function checkMitarbeiter($mitarbeiter_uid) + { + if (is_null($mitarbeiter_uid)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid); + + if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + } + + public function add() + { + $lehreinheit_id = $this->input->post('lehreinheit_id'); + $mitarbeiter_uid = $this->input->post('mitarbeiter_uid'); + + $this->checkLehreinheit($lehreinheit_id); + $this->checkMitarbeiter($mitarbeiter_uid); + $lehrfach_permission = $this->checkLehrfachPermission($lehreinheit_id, array('assistenz', 'admin')); + $lehreinheit_permission = $this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan')); + + if (!$lehrfach_permission && !$lehreinheit_permission) + $this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess')); + + $result = $this->_ci->lektorlib->addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid); + + if (isError($result)) $this->terminateWithError(getError($result)); + + $this->terminateWithSuccess("Erfolgreich gespeichert"); + } + + public function update() + { + $formData = $this->input->post('formData'); + $lehreinheit_id = $this->input->post('lehreinheit_id'); + $mitarbeiter_uid = $this->input->post('mitarbeiter_uid'); + + $this->checkLehreinheit($lehreinheit_id); + $this->checkMitarbeiter($mitarbeiter_uid); + + $updatableFields = array( + 'lehrfunktion_kurzbz', + 'planstunden', + 'stundensatz', + 'faktor', + 'anmerkung', + 'bismelden', + 'semesterstunden', + 'mitarbeiter_uid' + ); + + $this->form_validation->set_data($formData); + + foreach ($updatableFields as $field) + { + if (array_key_exists($field, $formData)) + { + switch ($field) + { + case 'lehrfunktion_kurzbz': + $this->form_validation->set_rules($field, 'Lehrfunktion', 'required|max_length[16]'); + break; + case 'planstunden': + $this->form_validation->set_rules($field, 'Planstunden', 'integer|greater_than_equal_to[0]'); + break; + case 'stundensatz': + $formData['stundensatz'] = str_replace(',', '.', $formData['stundensatz']); + $this->form_validation->set_rules($field, 'Stundensatz', 'callback__check_stundensatz'); + break; + case 'faktor': + $this->form_validation->set_rules($field, 'Faktor', 'numeric|greater_than_equal_to[0]'); + break; + case 'anmerkung': + $this->form_validation->set_rules($field, 'Anmerkung', 'max_length[256]'); + break; + case 'bismelden': + $this->form_validation->set_rules($field, 'Bis Melden', 'trim'); + break; + case 'semesterstunden': + $formData['semesterstunden'] = str_replace(',', '.', $formData['semesterstunden']); + $this->form_validation->set_rules($field, 'Semesterstunden', 'callback__check_semesterstunden'); + break; + case 'mitarbeiter_uid': + $this->form_validation->set_rules($field, 'Semesterstunden', 'required|max_length[32]'); + break; + } + } + } + if (!$this->form_validation->run()) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + if (isset($formData['semesterstunden']) && (!is_numeric($formData['semesterstunden']) || $formData['semesterstunden'] === '')) + { + $formData['semesterstunden'] = null; + } + + $lehreinheit_permission = $this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan')); + + if (!$lehreinheit_permission) + $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)); + $this->terminateWithSuccess($result); + } + + public function _check_stundensatz($value) + { + $value = str_replace(',', '.', $value); + + if (!is_numeric($value)) + { + $this->form_validation->set_message('_check_decimal', 'Das Feld {field} muss eine Zahl sein.'); + return false; + } + + if ($value < 0 || $value >= 10000) { + $this->form_validation->set_message('_check_decimal', 'Das Feld {field} muss zwischen 0 und 10000 liegen.'); + return false; + } + + return true; + } + public function _check_semesterstunden($value) + { + if ($value === null || $value === '') { + return true; + } + + if (!is_numeric($value)) + { + $this->form_validation->set_message( + '_check_semesterstunden', + 'Das Feld {field} muss eine Zahl sein.' + ); + return false; + } + + if ($value < 0) + { + $this->form_validation->set_message( + '_check_semesterstunden', + 'Das Feld {field} muss eine Zahl größer oder gleich 0 sein.' + ); + return false; + } + if ($value > 999.99) + { + $this->form_validation->set_message( + '_check_semesterstunden', + 'Das Feld {field} darf maximal 999,99 betragen.' + ); + return false; + } + + return true; + } + public function getLehrfunktionen() + { + $this->_ci->load->model('education/Lehrfunktion_model', 'LehrfunktionModel'); + $this->_ci->LehrfunktionModel->addOrder('lehrfunktion_kurzbz'); + $this->terminateWithSuccess(getData($this->_ci->LehrfunktionModel->load())); + } + + public function getLektorenSearch() + { + $query = $this->input->get('query'); + + if (is_null($query)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $query_words = explode(' ', $query); + + $this->_ci->MitarbeiterModel->addSelect('uid, person_id, vorname, nachname'); + $this->_ci->MitarbeiterModel->addJoin('public.tbl_benutzer', 'uid = mitarbeiter_uid'); + $this->_ci->MitarbeiterModel->addJoin('public.tbl_person', 'person_id'); + + $this->_ci->MitarbeiterModel->db->where('public.tbl_benutzer.aktiv', true); + + $this->_ci->MitarbeiterModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->MitarbeiterModel->db->group_start(); + $this->_ci->MitarbeiterModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%"); + $this->_ci->MitarbeiterModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%"); + $this->_ci->MitarbeiterModel->db->or_where('uid ILIKE', "%" . $word . "%"); + $this->_ci->MitarbeiterModel->db->group_end(); + } + $this->_ci->MitarbeiterModel->db->group_end(); + $this->_ci->MitarbeiterModel->addOrder('nachname'); + $this->_ci->MitarbeiterModel->addOrder('vorname'); + $result = $this->_ci->MitarbeiterModel->load(); + $this->terminateWithSuccess(hasData($result) ? getData($result) : array()); + } + + private function checkLehreinheit($lehreinheit_id) + { + if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id); + + if (!hasData($lehreinheit_result) || isError($lehreinheit_result)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + return getData($lehreinheit_result)[0]; + + } + public function getLektorenByLE($lehreinheit_id = null) + { + $this->checkLehreinheit($lehreinheit_id); + $le_mitarbeiter_data = $this->_ci->LehreinheitmitarbeiterModel->getLektorenByLe($lehreinheit_id); + $this->terminateWithSuccess(hasData($le_mitarbeiter_data) ? getData($le_mitarbeiter_data) : array()); + } + + public function getLektorDaten($lehreinheit_id = null, $mitarbeiter_uid = null) + { + $lehreinheit = $this->checkLehreinheit($lehreinheit_id); + + if (is_null($mitarbeiter_uid)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid); + + if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $this->load->model('organisation/Studiensemester_model','StudiensemesterModel'); + $studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz)); + $studiensemester = getData($studiensemester_result)[0]; + + $defaultStundensatz = $this->_ci->StundensatzModel->getDefaultStundensatz($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre'); + + $le_mitarbeiter_result = $this->_ci->LehreinheitmitarbeiterModel->getByLeLektor($lehreinheit_id, $mitarbeiter_uid); + + $le_mitarbeiter_data = array(); + if (hasData($le_mitarbeiter_result)) + { + $le_mitarbeiter_data = getData($le_mitarbeiter_result)[0]; + $le_mitarbeiter_data->default_stundensatz = $defaultStundensatz; + } + $vertrag = $this->getLektorVertrag($lehreinheit_id, $mitarbeiter_uid); + $le_mitarbeiter_data->vertrag = $vertrag; + $this->terminateWithSuccess($le_mitarbeiter_data); + } + + private function getLektorVertrag($lehreinheit_id = null, $mitarbeiter_uid = null) + { + $this->_ci->load->model('accounting/Vertrag_model', 'VertragModel'); + $vertrag = $this->_ci->VertragModel->getVertrag($mitarbeiter_uid, $lehreinheit_id); + return hasData($vertrag) ? getData($vertrag)[0] : null; + } + + private function checkLehrfachPermission($lehreinheit_id, $permissions) + { + $lehrfach_oe_kurzbz = $this->_ci->LehreinheitModel->getLehrfachOe($lehreinheit_id); + + if (isError($lehrfach_oe_kurzbz)) + $this->terminateWithError(getError($lehrfach_oe_kurzbz), self::ERROR_TYPE_GENERAL); + + $lehrfach_oe_kurzbz = array(''); + if (hasData($lehrfach_oe_kurzbz)) + $lehrfach_oe_kurzbz = array_column(getData($lehrfach_oe_kurzbz), 'oe_kurzbz'); + + + return $this->checkPermissionGenerel($permissions, $lehrfach_oe_kurzbz); + } + + private function checkPermissionGenerel($permissions, $oe_array) + { + $hasPermission = false; + foreach ($permissions as $permission) + { + if ($this->_ci->permissionlib->isBerechtigtMultipleOe($permission, $oe_array, 'suid')) + { + $hasPermission = true; + break; + } + } + + return $hasPermission; + } + + private function checkPermission($lehreinheit_id, $permissions) + { + $result = $this->_ci->LehreinheitModel->getOes($lehreinheit_id); + + if (isError($result)) + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + $oe_array = []; + if (hasData($result)) + $oe_array = getData($result); + + return $this->checkPermissionGenerel($permissions, $oe_array); + } + public function cancelVertrag() + { + $vertrag_id = $this->input->post('vertrag_id'); + $lehreinheit_id = $this->input->post('lehreinheit_id'); + $mitarbeiter_uid = $this->input->post('mitarbeiter_uid'); + + $this->checkLehreinheit($lehreinheit_id); + $this->checkPermission($lehreinheit_id, array('admin', 'lehre/lehrauftrag_bestellen')); + + if (is_null($vertrag_id) || !ctype_digit((string)$vertrag_id)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $vertrag_result = $this->_ci->VertragModel->load($vertrag_id); + + if (!hasData($vertrag_result) || isError($vertrag_result)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + if (is_null($mitarbeiter_uid)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid); + + if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $result = $this->_ci->VertragModel->cancelVertrag($vertrag_id, $mitarbeiter_uid); + + if (isError($result)) + $this->terminateWithError(getError($result)); + + $this->terminateWithSuccess($result); + } + + public function deletePerson() + { + $lehreinheit_id = $this->input->post('lehreinheit_id'); + $mitarbeiter_uid = $this->input->post('mitarbeiter_uid'); + + $this->checkLehreinheit($lehreinheit_id); + $this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan')); + + if (is_null($mitarbeiter_uid)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid); + + if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $delete_result =$this->_ci->LehreinheitmitarbeiterModel->deleteLektorFromLe($lehreinheit_id, $mitarbeiter_uid); + + if (isError($delete_result)) + $this->terminateWithError(getError($delete_result)); + + $this->terminateWithSuccess($delete_result); + } + + public function deleteLVPlan() + { + $lehreinheit_id = $this->input->post('lehreinheit_id'); + $mitarbeiter_uid = $this->input->post('mitarbeiter_uid'); + + $this->checkLehreinheit($lehreinheit_id); + $this->checkPermission($lehreinheit_id, array('lv-plan/lektorentfernen')); + + if (is_null($mitarbeiter_uid)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid); + + if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + + $delete_result = $this->_ci->StundenplandevModel->deleteLektorPlanning($lehreinheit_id, $mitarbeiter_uid); + + if (isError($delete_result)) + $this->terminateWithError(getError($delete_result)); + + $this->terminateWithSuccess($delete_result); + } + + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) + show_error('User authentification failed'); + } +} diff --git a/application/controllers/api/frontend/v1/lv/Setup.php b/application/controllers/api/frontend/v1/lv/Setup.php new file mode 100644 index 000000000..eea4befa5 --- /dev/null +++ b/application/controllers/api/frontend/v1/lv/Setup.php @@ -0,0 +1,121 @@ +. + */ + +if (!defined('BASEPATH')) + exit('No direct script access allowed'); + +class Setup extends FHCAPI_Controller +{ + private $_ci; + private $_uid; + + public function __construct() + { + parent::__construct([ + 'getTabs' => ['admin:r', 'assistenz:r'], + 'getStudiensemester' => ['admin:r', 'assistenz:r'], + 'getSprache' => ['admin:r', 'assistenz:r'], + 'getRaumtyp' => ['admin:r', 'assistenz:r'], + 'getLehrform' => ['admin:r', 'assistenz:r'], + ]); + + $this->_ci = &get_instance(); + $this->_setAuthUID(); + + $this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + $this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $this->_ci->load->library('VariableLib', ['uid' => $this->_uid]); + } + + public function getTabs() + { + $tabs['details'] = array ( + 'title' => 'Details', + 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Details.js'), + 'config' => [] + ); + $tabs['gruppen'] = array ( + 'title' => 'Gruppen', + 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Gruppen.js'), + 'config' => [] + ); + $tabs['lektor'] = array ( + 'title' => 'LektorInnenzuteilung', + 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'), + 'config' => [] + ); + $tabs['notiz'] = array ( + 'title' => 'Notizen', + 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'), + 'config' => [] + ); + $this->terminateWithSuccess($tabs); + } + + public function getStudiensemester() + { + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->_ci->StudiensemesterModel->addOrder('start', 'DESC'); + $this->terminateWithSuccess(getData($this->_ci->StudiensemesterModel->load())); + } + public function getSprache() + { + $this->_ci->load->model('system/Sprache_model', 'SpracheModel'); + $this->terminateWithSuccess(getData($this->_ci->SpracheModel->load())); + } + + public function getRaumtyp() + { + $this->_ci->load->model('ressource/Raumtyp_model', 'RaumtypModel'); + $this->_ci->RaumtypModel->addOrder('raumtyp_kurzbz'); + $this->terminateWithSuccess(getData($this->_ci->RaumtypModel->loadWhere(array('aktiv' => true)))); + } + + public function getLehrform() + { + $language = $this->_getLanguageIndex(); + + $this->_ci->load->model('codex/lehrform_model', 'LehrformModel'); + + $this->_ci->LehrformModel->addSelect( + '*, + bezeichnung_kurz[('.$language.')] as bez_kurz, + bezeichnung_lang[('.$language.')] as bez + ' + ); + $this->terminateWithSuccess(getData($this->_ci->LehrformModel->load())); + } + + private function _getLanguageIndex() + { + $this->_ci->load->model('system/Sprache_model', 'SpracheModel'); + $this->_ci->SpracheModel->addSelect('index'); + $result = $this->_ci->SpracheModel->loadWhere(array('sprache' => getUserLanguage())); + + return hasData($result) ? getData($result)[0]->index : 1; + } + + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) + show_error('User authentification failed'); + } +} diff --git a/application/controllers/api/frontend/v1/lv/StgTree.php b/application/controllers/api/frontend/v1/lv/StgTree.php new file mode 100644 index 000000000..8272da978 --- /dev/null +++ b/application/controllers/api/frontend/v1/lv/StgTree.php @@ -0,0 +1,117 @@ +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/lv/Tags.php b/application/controllers/api/frontend/v1/lv/Tags.php new file mode 100644 index 000000000..34c42bc32 --- /dev/null +++ b/application/controllers/api/frontend/v1/lv/Tags.php @@ -0,0 +1,50 @@ + self::BERECHTIGUNG_KURZBZ, + 'getTags' => self::BERECHTIGUNG_KURZBZ, + 'addTag' => self::BERECHTIGUNG_KURZBZ, + 'updateTag' => self::BERECHTIGUNG_KURZBZ, + 'doneTag' => self::BERECHTIGUNG_KURZBZ, + 'deleteTag' => self::BERECHTIGUNG_KURZBZ, + 'updateLehre' => self::BERECHTIGUNG_KURZBZ, + 'doneLehre' => self::BERECHTIGUNG_KURZBZ, + 'deleteLehre' => self::BERECHTIGUNG_KURZBZ, + ]); + + $this->config->load('lvverwaltung'); + } + public function getTag($readonly_tags = null) + { + parent::getTag($this->config->item('lvverwaltung_tags')); + } + public function getTags($tags = null) + { + parent::getTags($this->config->item('lvverwaltung_tags')); + } + public function addTag($withZuordnung = true, $updatable_tags = null) + { + parent::addTag(true, $this->config->item('lvverwaltung_tags')); + } + public function updateTag($updatable_tags = null) + { + parent::updateTag($this->config->item('lvverwaltung_tags')); + } + public function deleteTag($withZuordnung = true, $updatable_tags = null) + { + parent::deleteTag(true, $this->config->item('lvverwaltung_tags')); + } + public function doneTag($updatable_tags = null) + { + parent::doneTag($this->config->item('lvverwaltung_tags')); + } +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/messages/Messages.php b/application/controllers/api/frontend/v1/messages/Messages.php new file mode 100644 index 000000000..3035e532d --- /dev/null +++ b/application/controllers/api/frontend/v1/messages/Messages.php @@ -0,0 +1,556 @@ + ['admin:r', 'assistenz:r'], + 'getVorlagen' => ['admin:r', 'assistenz:r'], + 'getMessageVarsPerson' => ['admin:r', 'assistenz:r'], + 'getMsgVarsPrestudent' => ['admin:r', 'assistenz:r'], + 'getMsgVarsLoggedInUser' => ['admin:r', 'assistenz:r'], + 'getNameOfDefaultRecipient' => ['admin:r', 'assistenz:r'], + 'getNameOfDefaultRecipients' => ['admin:r', 'assistenz:r'], + 'sendMessage' => ['admin:r', 'assistenz:r'], + 'deleteMessage' => ['admin:r', 'assistenz:r'], + 'getDataVorlage' => ['admin:r', 'assistenz:r'], + 'getPreviewText' => ['admin:r', 'assistenz:r'], + 'getReplyData' => ['admin:r', 'assistenz:r'], + 'getPersonId' => ['admin:r', 'assistenz:r'], + 'getUid' => ['admin:r', 'assistenz:r'], + 'getUids' => ['admin:r', 'assistenz:r'], + ]); + + //Load Models + $this->load->model('system/Message_model', 'MessageModel'); + $this->load->model('CL/Messages_model', 'MessagesModel'); + + // Additional Permission Checks + //TODO(manu) check permissions + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('form_validation'); + $this->load->library('MessageLib'); + + // Load language phrases + $this->loadPhrases([ + 'ui', 'messages' + ]); + } + + public function getMessages($id, $type_id, $size, $page) + { + if($type_id != 'person_id'){ + $id = $this->_getPersonId($id, $type_id); + } + + $offset = $size * ($page - 1); + $limit = $size; + + $result = $this->MessageModel->getMessagesForTable($id, $offset, $limit); + + if (hasData($result)) + { + $data = getData($result); + $this->addMeta('count', $data['count']); + $this->terminateWithSuccess($data['data']); + } + + $this->terminateWithSuccess(array()); + } + + public function getVorlagen() + { + //get oe of user + $uid = getAuthUID(); + $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + $result = $this->BenutzerfunktionModel->getBenutzerfunktionByUid($uid, 'oezuordnung'); + + if (hasData($result)) + { + $this->load->model('system/Vorlage_model', 'VorlageModel'); + + $data = getData($result); + + $oe_kurzbz = array_column($data, 'oe_kurzbz'); + $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz); + + $this->terminateWithSuccess(hasData($result) ? getData($result) : array()); + } + + $this->terminateWithSuccess(array()); + } + + public function getDataVorlage($vorlage_kurzbz) + { + $studiengang_kz = 0; + $this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel'); + $this->VorlagestudiengangModel->addOrder('version', 'DESC'); + + $result = $this->VorlagestudiengangModel->loadWhere( + [ + 'vorlage_kurzbz' =>$vorlage_kurzbz, + 'studiengang_kz' => $studiengang_kz + ]); + + $data = $this->getDataOrTerminateWithError($result); + $vorlage = current($data); + $this->terminateWithSuccess($vorlage); + } + + public function getMessageVarsPerson($typeId) + { + $ids = $this->input->post('ids'); + $messageVarsPerson = []; + + foreach ($ids as $id) + { + $person_id = ($typeId == 'mitarbeiter_uid') ? $this->_getPersonId($id, $typeId) : $id; + $result = $this->MessageModel->getMsgVarsDataByPersonId($person_id); + $data = $this->getDataOrTerminateWithError($result); + $messageVarsPerson[] = current($data); + } + + $this->terminateWithSuccess($messageVarsPerson); + } + + public function getMsgVarsPrestudent($typeId) + { + $ids = $this->input->post('ids'); + if(!is_array($ids)) { + $ids = array($ids); + } + $messageVarsPrestudent = []; + + if($typeId == 'uid') + { + $prestudent_ids = []; + foreach ($ids as $id) + { + $prestudent_ids[] = $this->_getPrestudentIdFromUid($id); + } + } + else + $prestudent_ids = $ids; + + foreach ($prestudent_ids as $prestudent_id) + { + $result = $this->MessageModel->getMsgVarsDataByPrestudentId($prestudent_id); + $data = $this->getDataOrTerminateWithError($result); + $messageVarsPrestudent[] = current($data); + } + + $this->terminateWithSuccess($messageVarsPrestudent); + } + + public function getMsgVarsLoggedInUser() + { + $result = $this->MessageModel->getMsgVarsLoggedInUser(); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getNameOfDefaultRecipients($type_id) + { + $ids = $this->input->post('ids'); + if(!is_array($ids)) { + $ids = array($ids); + } + $recipients = []; + + if (empty($ids)) { + + throw new InvalidArgumentException($this->p->t('ui', 'errorMissingOrInvalidParameters', ['parameter'=> 'Id(s)']), self::ERROR_TYPE_GENERAL); + } + + $this->load->model('person/Person_model', 'PersonModel'); + if($type_id != 'person_id'){ + foreach ($ids as $id) + { + $person_id = $this->_getPersonId($id, $type_id); + $result = $this->PersonModel->load($person_id); + $data = $this->getDataOrTerminateWithError($result); + $name = current($data); + $recipients[$id] = $name->vorname . " " . $name->nachname; + } + } + else { + foreach ($ids as $id) { + $result = $this->PersonModel->load($id); + $data = $this->getDataOrTerminateWithError($result); + $name = current($data); + $recipients[$id] = $name->vorname . " " . $name->nachname; + } + } + + $this->terminateWithSuccess($recipients); + } + + public function sendMessage($typeId) + { + $resultReturn = []; + $uid = getAuthUID(); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $result = $this->BenutzerModel->loadWhere( + ['uid' => $uid] + ); + + $data = $this->getDataOrTerminateWithError($result); + $benutzer = current($data); + + if (isset($_POST['data'])) + { + $data = json_decode($_POST['data']); + unset($_POST['data']); + foreach ($data as $k => $v) { + $_POST[$k] = $v; + } + } + + $this->load->library('form_validation'); + + $this->form_validation->set_rules('subject', 'Betreff', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Betreff']) + ]); + + $this->form_validation->set_rules('body', 'Text', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Text']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $subject = $this->input->post('subject'); + $body = $this->input->post('body'); + $relationmessage_id = $this->input->post('relationmessage_id'); + + if (isset($_POST['ids'])) + { + $ids = json_decode($_POST['ids']); + unset($_POST['ids']); + foreach ($data as $k => $v) { + $_POST[$k] = $v; + } + } + + if (!is_array($ids)) { + $ids = [$ids]; + } + + foreach ($ids as $id) + { + $receiversPersonId = $typeId == "person_id" ? $id : $this->_getPersonId($id, $typeId); + + if($typeId == 'uid') + { + $prestudent_id = $this-> _getPrestudentIdFromUid($id); + + $result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $body); + $bodyParsed = $this->getDataOrTerminateWithError($result); + } + if($typeId == 'mitarbeiter_uid') + { + $person_id = $this->_getPersonId($id, $typeId); + + $result = $this->MessagesModel->parseMessageTextPerson($person_id, $body); + $bodyParsed = $this->getDataOrTerminateWithError($result); + } + elseif($typeId == 'person_id') + { + $result = $this->MessagesModel->parseMessageTextPerson($id, $body); + $bodyParsed = $this->getDataOrTerminateWithError($result); + } + elseif($typeId == 'prestudent_id') + { + $result = $this->MessagesModel->parseMessageTextPrestudent($id, $body); + $bodyParsed = $this->getDataOrTerminateWithError($result); + } + else + { + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL); + } + + $result =$this->messagelib->sendMessageUser($receiversPersonId, $subject, $bodyParsed, $benutzer->person_id, null, $relationmessage_id); + $data = $this->getDataOrTerminateWithError($result); + $resultReturn[] = current($data); + + } + $this->terminateWithSuccess($resultReturn); + } + + public function getPreviewText($type_id) + { + if (isset($_POST['data'])) + { + $data = json_decode($_POST['data']); + unset($_POST['data']); + } + else + $this->terminateWithError($this->p->t('messages', 'errorMissingOrInvalidParameters', ['parameter'=> "Textbody"]), self::ERROR_TYPE_GENERAL); + + if (isset($_POST['ids'])) + { + $ids = json_decode($_POST['ids']); + if(!is_array($ids)) + { + $ids = array($ids); + } + unset($_POST['ids']); + } + else + $this->terminateWithError($this->p->t('ui', 'errorMissingOrInvalidParameters', ['parameter'=> 'Id(s)']), self::ERROR_TYPE_GENERAL); + + $bodyParsed = []; + + foreach ($ids as $id) + { + switch($type_id) + { + case 'uid': + $prestudent_id = $this->_getPrestudentIdFromUid($id); + $result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $data); + $bodyParsed[$id] = $this->getDataOrTerminateWithError($result); + break; + case 'prestudent_id': + $result = $this->MessagesModel->parseMessageTextPrestudent($id, $data); + $bodyParsed[$id] = $this->getDataOrTerminateWithError($result); + break; + case 'person_id': + $result = $this->MessagesModel->parseMessageTextPerson($id, $data); + $bodyParsed[$id] = $this->getDataOrTerminateWithError($result); + break; + case 'mitarbeiter_uid': + { + $person_id = $this->_getPersonId($id, $type_id); + $result = $this->MessagesModel->parseMessageTextPerson($person_id, $data); + $bodyParsed[$id] = $this->getDataOrTerminateWithError($result); + } + break; + default: + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $type_id]), self::ERROR_TYPE_GENERAL); + break; + } + } + + $this->terminateWithSuccess($bodyParsed); + } + + public function getReplyData($messageId) + { + if (!is_numeric($messageId)) { + $this->terminateWithError($this->p->t('ui', 'error_valueNotNumeric', ['value'=> 'Message ID']), self::ERROR_TYPE_GENERAL); + } + + $this->MessageModel->addSelect('public.tbl_msg_message.*'); + $this->MessageModel->addSelect('r.*'); + $this->MessageModel->addSelect('p.nachname'); + $this->MessageModel->addSelect('p.vorname'); + $this->MessageModel->addJoin('public.tbl_msg_recipient r', 'ON (r.message_id = public.tbl_msg_message.message_id)'); + $this->MessageModel->addJoin('public.tbl_person p', 'ON (p.person_id = public.tbl_msg_message.person_id)'); + + $result = $this->MessageModel->loadWhere( + array('r.message_id' => $messageId) + ); + + $dataMessage = $this->getDataOrTerminateWithError($result); + $prefix = "Re: "; // reply subject prefix + + $subject = $dataMessage[0]->subject; + $body = $dataMessage[0]->body; + + + $replyBody = $this->_getReplyBody($body, $dataMessage[0]->nachname, $dataMessage[0]->vorname, $dataMessage[0]->insertamum); + + $dataMessage[0]->replyBody = $replyBody; + $dataMessage[0]->replySubject = $prefix . $subject; + + $this->terminateWithSuccess($dataMessage); + } + + public function deleteMessage($messageId) + { + // Start DB transaction + $this->db->trans_begin(); + + $result = $this->MessageModel->deleteMessageRecipient($messageId); + if (isError($result)) { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + + } + + $result = $this->MessageModel->deleteMessageStatus($messageId); + if (isError($result)) { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + + $result = $this->MessageModel->deleteMessage($messageId); + if (isError($result)) { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + + $this->db->trans_commit(); + + $this->terminateWithSuccess($result); + } + + public function getPersonId($id, $typeId) + { + if ($typeId == 'uid' || $typeId == 'mitarbeiter_uid') + { + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $result = $this->BenutzerModel->loadWhere( + ['uid' => $id] + ); + } + elseif($typeId == 'prestudent_id') + { + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + $result = $this->PrestudentModel->loadWhere( + ['prestudent_id' => $id] + ); + } + else + { + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL); + } + + + $data = $this->getDataOrTerminateWithError($result); + $person = current($data); + + $this->terminateWithSuccess($person->person_id); + } + + public function getUids($typeId) + { + $ids = $this->input->post('ids'); + $benutzerIds = []; + + if (!$typeId) + { + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Type ID']), self::ERROR_TYPE_GENERAL); + } + elseif ($typeId == 'person_id') + { + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + foreach ($ids as $id) + { + $result = $this->BenutzerModel->loadWhere( + ['person_id' => $id] + ); + $data = $this->getDataOrTerminateWithError($result); + $benutzer = current($data); + + $benutzerIds[$id] = $benutzer->uid; + } + } + elseif($typeId == 'prestudent_id') + { + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + foreach ($ids as $id) + { + $result = $this->PrestudentModel->loadWhere( + ['prestudent_id' => $id] + ); + + $data = $this->getDataOrTerminateWithError($result); + $person = current($data); + $person_id = $person->person_id; + + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $result = $this->BenutzerModel->loadWhere( + ['person_id' => $person_id] + ); + $data = $this->getDataOrTerminateWithError($result); + $benutzer = current($data); + + $benutzerIds[$id] = $benutzer->uid; + } + } + elseif($typeId == 'uid' || $typeId == 'mitarbeiter_uid') + { + $this->terminateWithSuccess($ids); + } + else + { + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL); + } + + $this->terminateWithSuccess($benutzerIds); + } + + private function _getPersonId($id, $typeId) + { + if ($typeId == 'uid' || $typeId == 'mitarbeiter_uid') + { + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $result = $this->BenutzerModel->loadWhere( + ['uid' => $id] + ); + } + elseif($typeId == 'prestudent_id') + { + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + $result = $this->PrestudentModel->loadWhere( + ['prestudent_id' => $id] + ); + } + else + { + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL); + } + + + $data = $this->getDataOrTerminateWithError($result); + if (count($data) < 1) + { + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); + } + $person = current($data); + + return $person->person_id; + } + + private function _getPrestudentIdFromUid($uid) + { + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->loadWhere( + ['student_uid' => $uid] + ); + + $data = $this->getDataOrTerminateWithError($result); + if (count($data) < 1) + { + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + } + $student = current($data); + + return $student->prestudent_id; + } + + private function _getReplyBody($body, $receiverName, $receiverSurname, $sentDate) + { + // To quote a reply body message + $bodyFormat = "
+
+
+ + On %s %s %s wrote: + +
+
+ %s +
"; + return sprintf( + $bodyFormat, + date_format(date_create($sentDate), 'd.m.Y H:i'), $receiverName, $receiverSurname, $body + ); + } +} diff --git a/application/controllers/api/frontend/v1/notiz/NotizLehreinheit.php b/application/controllers/api/frontend/v1/notiz/NotizLehreinheit.php new file mode 100644 index 000000000..f8e1f816b --- /dev/null +++ b/application/controllers/api/frontend/v1/notiz/NotizLehreinheit.php @@ -0,0 +1,21 @@ + ['admin:r', 'assistenz:r'], + 'getNotizen' => ['admin:r', 'assistenz:r'], + 'loadNotiz' => ['admin:r', 'assistenz:r'], + 'addNewNotiz' => ['admin:rw', 'assistenz:rw'], + 'updateNotiz' => ['admin:rw', 'assistenz:rw'], + 'deleteNotiz' => ['admin:rw', 'assistenz:rw'], + 'loadDokumente' => ['admin:r', 'assistenz:r'], + 'getMitarbeiter' => ['admin:r', 'assistenz:r'], + 'isBerechtigt' => ['admin:r', 'assistenz:r'], + ]); + } +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/notiz/NotizPerson.php b/application/controllers/api/frontend/v1/notiz/NotizPerson.php index cb9d31024..23a8fd199 100644 --- a/application/controllers/api/frontend/v1/notiz/NotizPerson.php +++ b/application/controllers/api/frontend/v1/notiz/NotizPerson.php @@ -18,6 +18,7 @@ class NotizPerson extends Notiz_Controller 'loadDokumente' => ['admin:r', 'assistenz:r'], 'getMitarbeiter' => ['admin:r', 'assistenz:r'], 'isBerechtigt' => ['admin:r', 'assistenz:r'], + 'getCountNotes' => ['admin:r', 'assistenz:r'], ]); } diff --git a/application/controllers/api/frontend/v1/organisation/Studienjahr.php b/application/controllers/api/frontend/v1/organisation/Studienjahr.php new file mode 100644 index 000000000..cdbb524c7 --- /dev/null +++ b/application/controllers/api/frontend/v1/organisation/Studienjahr.php @@ -0,0 +1,80 @@ + self::PERM_LOGGED, + 'getNext' => self::PERM_LOGGED + ) + ); + // Load model StudiensemesterModel + $this->load->model('organisation/studienjahr_model', 'StudienjahrModel'); + } + + /** + * Get all Studienjahre. + * + * @param null|string $order Sorting order for the Studienjahr, 'asc' or 'desc'. Defaults to 'asc'. + * @param null|string $start Starting Studienjahre with given studienjahr_kurzbz + */ + public function getAll() + { + $order = $this->input->get('order'); + $start = $this->input->get('studienjahr_kurzbz'); + + if (strcasecmp($order, 'DESC') == 0) { + $this->StudienjahrModel->addOrder('studienjahr_kurzbz', 'DESC'); + } else { + $this->StudienjahrModel->addOrder('studienjahr_kurzbz', 'ASC'); + } + + if ($start) { + $result = $this->StudienjahrModel->loadWhere([ + 'studienjahr_kurzbz >= ' => $start + ]); + } else { + $result = $this->StudienjahrModel->load(); + } + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_DB); + } + + $this->terminateWithSuccess((getData($result) ?: [])); + } + + public function getNext() + { + $this->StudienjahrModel->addJoin('public.tbl_studiensemester', 'studienjahr_kurzbz'); + $this->StudienjahrModel->addOrder('start'); + $this->StudienjahrModel->addLimit(1); + + $result = $this->StudienjahrModel->loadWhere(['start >' => 'NOW()']); + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_DB); + } + + $this->terminateWithSuccess(current(getData($result))); + } +} diff --git a/application/controllers/api/frontend/v1/organisation/Studienplan.php b/application/controllers/api/frontend/v1/organisation/Studienplan.php new file mode 100644 index 000000000..c5a69fdee --- /dev/null +++ b/application/controllers/api/frontend/v1/organisation/Studienplan.php @@ -0,0 +1,69 @@ + self::PERM_LOGGED + ]); + } + + public function getBySemester() + { + $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); + + $studiengang_kz = $this->input->get('studiengang_kz'); + $studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz'); + $ausbildungssemester = $this->input->get('ausbildungssemester') ?: null; + $orgform_kurzbz = $this->input->get('orgform_kurzbz') ?: null; + + if (!$studiengang_kz || !is_numeric($studiengang_kz)) + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiengangskennzahl']), self::ERROR_TYPE_GENERAL); + + if (!$studiensemester_kurzbz) + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiensemester']), self::ERROR_TYPE_GENERAL); + + if (isset($ausbildungssemester) && !is_numeric($ausbildungssemester)) + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Ausbildungssemester']), self::ERROR_TYPE_GENERAL); + + + //~ $this->load->library('form_validation'); + + //~ $this->form_validation->set_rules('studiengang_kz', 'StudiengangKz', 'required|numeric'); + //~ $this->form_validation->set_rules('studiensemester_kurzbz', 'StudiensemesterKurbz', 'required'); + //~ $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'numeric'); + + //~ if (!$this->form_validation->run()) + //~ { + //~ $this->addMeta('fail2', 'fail2'); + //~ return $this->terminateWithValidationErrors($this->form_validation->error_array()); + //~ } + + + $this->addMeta('stg_kz', $studiengang_kz); + $this->addMeta('sem', $studiensemester_kurzbz); + $this->addMeta('sem2', $ausbildungssemester); + $this->addMeta('org', $orgform_kurzbz); + + $result = $this->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $ausbildungssemester, $orgform_kurzbz); + if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB); + + $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } +} diff --git a/application/controllers/api/frontend/v1/organisation/Studiensemester.php b/application/controllers/api/frontend/v1/organisation/Studiensemester.php index 72a449aaa..3c6b72d2f 100644 --- a/application/controllers/api/frontend/v1/organisation/Studiensemester.php +++ b/application/controllers/api/frontend/v1/organisation/Studiensemester.php @@ -24,7 +24,9 @@ class Studiensemester extends FHCAPI_Controller parent::__construct( array( 'getAll' => self::PERM_LOGGED, - 'getAktNext' => self::PERM_LOGGED + 'getAktNext' => self::PERM_LOGGED, + 'getStudienjahrByStudiensemester' => self::PERM_LOGGED, + 'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED ) ); // Load model StudiensemesterModel @@ -115,4 +117,53 @@ class Studiensemester extends FHCAPI_Controller $this->terminateWithSuccess((getData($result) ?: '')); } + + /** + * Get Studienjahr by Studiensemester. + * input param semester: studiensemester_kurzbz + */ + public function getStudienjahrByStudiensemester() + { + $semester = $this->input->get('semester'); + + $studienjahrObj = null; + + if (!is_numeric($semester)) + { + $this->StudiensemesterModel->addSelect('studienjahr_kurzbz'); + $result = $this->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz =' => $semester)); + } + + if (hasData($result)) + { + $studienjahr = getData($result)[0]->studienjahr_kurzbz; + $startstudienjahr = substr($studienjahr, 0, 4); + $endstudienjahr = substr($studienjahr, 0, 2) . substr($studienjahr, -2); + + $studienjahrObj = new StdClass(); + + $studienjahrObj->studienjahr_kurzbz = $studienjahr; + $studienjahrObj->startstudienjahr = $startstudienjahr; + $studienjahrObj->endstudienjahr= $endstudienjahr; + } + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_DB); + } + + $this->terminateWithSuccess((getData(success($studienjahrObj)))); + } + + public function getAllStudiensemesterAndAktOrNext() { + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $this->StudiensemesterModel->addOrder("start", "DESC"); + $result = $this->StudiensemesterModel->getAktOrNextSemester(); + $aktuell = getData($result)[0]; + $this->StudiensemesterModel->addSelect('*'); + $result = $this->StudiensemesterModel->load(); + $studiensemester = getData($result); + + $this->terminateWithSuccess(array($studiensemester, $aktuell)); + } } diff --git a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php index daaf043b5..def4f6502 100644 --- a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php +++ b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php @@ -38,6 +38,51 @@ class Abschlusspruefung extends FHCAPI_Controller // Load models $this->load->model('education/Abschlusspruefung_model', 'AbschlusspruefungModel'); + + + //Permission checks for Studiengangsarray + $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []; + + if ($this->router->method == 'insertAbschlusspruefung' || $this->router->method == 'updateAbschlusspruefung') + { + $student_uid = $this->input->post('uid') ?: ($this->input->post('formData')['student_uid'] ?? null); + + if(!$student_uid) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); + } + $this->_checkAllowedStgsFromUid($student_uid, $allowedStgs); + } + + if ($this->router->method == 'deleteAbschlusspruefung') + { + $abschlusspruefung_id = $this->input->post('id'); + + if(!$abschlusspruefung_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Abschlusspruefung ID']), self::ERROR_TYPE_GENERAL); + } + $result = $this->AbschlusspruefungModel->load( + array('abschlusspruefung_id' => $abschlusspruefung_id) + ); + $data = $this->getDataOrTerminateWithError($result); + $student_uid = current($data)->student_uid; + + $this->_checkAllowedStgsFromUid($student_uid, $allowedStgs); + } + } + + private function _checkAllowedStgsFromUid($student_uid, $allowedStgs) + { + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->loadWhere(['student_uid' => $student_uid]); + $data = $this->getDataOrTerminateWithError($result); + $studiengang_kz = current($data)->studiengang_kz; + + if (!in_array($studiengang_kz, $allowedStgs)) + { + return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL); + } } public function getAbschlusspruefung($student_uid) @@ -55,35 +100,45 @@ class Abschlusspruefung extends FHCAPI_Controller { $abschlusspruefung_id = $this->input->post('id'); - $this->AbschlusspruefungModel->addSelect('lehre.tbl_abschlusspruefung.*'); - $this->AbschlusspruefungModel->addSelect(" - CASE - WHEN pruefer1 IS NOT NULL - THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, '')) - ELSE NULL - END AS p1 - "); - $this->AbschlusspruefungModel->addSelect(" - CASE - WHEN pruefer2 IS NOT NULL - THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, '')) - ELSE NULL - END AS p2 - "); - $this->AbschlusspruefungModel->addSelect(" - CASE - WHEN pruefer3 IS NOT NULL - THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, '')) - ELSE NULL - END AS p3 - "); - $this->AbschlusspruefungModel->addSelect(" - CASE - WHEN vorsitz IS NOT NULL - THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' ) - ELSE NULL - END AS pv - "); + $this->AbschlusspruefungModel->addSelect( + 'lehre.tbl_abschlusspruefung.*, + p1.person_id AS p1_person_id, p1.vorname AS p1_vorname, p1.nachname AS p1_nachname, + p1.titelpre AS p1_titelpre, p1.titelpost AS p1_titelpost, + p2.person_id AS p2_person_id, p2.vorname AS p2_vorname, p2.nachname AS p2_nachname, + p2.titelpre AS p2_titelpre, p2.titelpost AS p2_titelpost, + p3.person_id AS p3_person_id, p3.vorname AS p3_vorname, p3.nachname AS p3_nachname, + p3.titelpre AS p3_titelpre, p3.titelpost AS p3_titelpost, + pv.person_id AS pv_person_id, pv.vorname AS pv_vorname, pv.nachname AS pv_nachname, + pv.titelpre AS pv_titelpre, pv.titelpost AS pv_titelpost, ben.uid AS pv_uid' + ); + //~ $this->AbschlusspruefungModel->addSelect(" + //~ CASE + //~ WHEN pruefer1 IS NOT NULL + //~ THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, '')) + //~ ELSE NULL + //~ END AS p1 + //~ "); + //~ $this->AbschlusspruefungModel->addSelect(" + //~ CASE + //~ WHEN pruefer2 IS NOT NULL + //~ THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, '')) + //~ ELSE NULL + //~ END AS p2 + //~ "); + //~ $this->AbschlusspruefungModel->addSelect(" + //~ CASE + //~ WHEN pruefer3 IS NOT NULL + //~ THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, '')) + //~ ELSE NULL + //~ END AS p3 + //~ "); + //~ $this->AbschlusspruefungModel->addSelect(" + //~ CASE + //~ WHEN vorsitz IS NOT NULL + //~ THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' ) + //~ ELSE NULL + //~ END AS pv + //~ "); $this->AbschlusspruefungModel->addJoin('public.tbl_benutzer ben', 'ON (ben.uid = lehre.tbl_abschlusspruefung.vorsitz)', 'LEFT'); $this->AbschlusspruefungModel->addJoin('public.tbl_person pv', 'ON (pv.person_id = ben.person_id)', 'LEFT'); $this->AbschlusspruefungModel->addJoin('public.tbl_person p1', 'ON (p1.person_id = lehre.tbl_abschlusspruefung.pruefer1)', 'LEFT'); @@ -149,16 +204,16 @@ class Abschlusspruefung extends FHCAPI_Controller { $studiengang_kz= $this->input->post('studiengang_kz'); -/* if (!$studiengang_kzs || !is_array($studiengang_kzs)) { - $this->load->library('form_validation'); + /* if (!$studiengang_kzs || !is_array($studiengang_kzs)) { + $this->load->library('form_validation'); - $this->form_validation->set_rules('studiengang_kzs', '', 'required|is_null', [ - 'is_null' => $this->p->t('ui', 'error_fieldMustBeArray') - ]); + $this->form_validation->set_rules('studiengang_kzs', '', 'required|is_null', [ + 'is_null' => $this->p->t('ui', 'error_fieldMustBeArray') + ]); - if (!$this->form_validation->run()) - $this->terminateWithValidationErrors($this->form_validation->error_array()); - }*/ + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + }*/ $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); @@ -173,8 +228,10 @@ class Abschlusspruefung extends FHCAPI_Controller $this->terminateWithSuccess($typStudiengang); } - public function getMitarbeiter($searchString) + public function getMitarbeiter() { + $searchString = $this->input->get('searchString') ?? ''; + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'mitAkadGrad'); @@ -185,8 +242,10 @@ class Abschlusspruefung extends FHCAPI_Controller $this->terminateWithSuccess($result ?: []); } - public function getPruefer($searchString) + public function getPruefer() { + $searchString = $this->input->get('searchString') ?? ''; + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid'); @@ -224,19 +283,7 @@ class Abschlusspruefung extends FHCAPI_Controller $formData = $this->input->post('formData'); - $_POST['pruefungstyp_kurzbz'] = $formData['pruefungstyp_kurzbz']; - $_POST['akadgrad_id']= $formData['akadgrad_id']; - $_POST['vorsitz'] = isset($formData['vorsitz']['mitarbeiter_uid']) ? $formData['vorsitz']['mitarbeiter_uid'] : $formData['vorsitz']; - $_POST['pruefer1'] = isset($formData['pruefer1']['person_id']) ? $formData['pruefer1']['person_id'] : $formData['pruefer1']; - $_POST['pruefer2'] = isset($formData['pruefer2']['person_id']) ? $formData['pruefer2']['person_id'] : $formData['pruefer2']; - $_POST['pruefer3'] = isset($formData['pruefer3']['person_id']) ? $formData['pruefer3']['person_id'] : $formData['pruefer3']; - $_POST['pruefungsantritt_kurzbz'] = $formData['pruefungsantritt_kurzbz']; - $_POST['abschlussbeurteilung_kurzbz'] = $formData['abschlussbeurteilung_kurzbz']; - $_POST['datum']= $formData['datum']; - $_POST['sponsion']= $formData['sponsion']; - $_POST['anmerkung'] = $formData['anmerkung']; - $_POST['protokoll']= $formData['protokoll']; - $_POST['note'] = $formData['note']; + $this->form_validation->set_data($formData); $this->form_validation->set_rules('pruefungstyp_kurzbz', 'Typ', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) @@ -261,19 +308,19 @@ class Abschlusspruefung extends FHCAPI_Controller $result = $this->AbschlusspruefungModel->insert([ 'student_uid' => $student_uid, - 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), - 'akadgrad_id' => $this->input->post('akadgrad_id'), - 'vorsitz' => $this->input->post('vorsitz'), - 'pruefungsantritt_kurzbz' => $this->input->post('pruefungsantritt_kurzbz'), - 'abschlussbeurteilung_kurzbz' => $this->input->post('abschlussbeurteilung_kurzbz'), - 'datum' => $this->input->post('datum'), //TODO(Manu) check if minute format like FAS - 'sponsion' => $this->input->post('sponsion'), - 'pruefer1' => $this->input->post('pruefer1'), - 'pruefer2' => $this->input->post('pruefer2'), - 'pruefer3' => $this->input->post('pruefer3'), - 'protokoll' => $this->input->post('protokoll'), - 'note' => $this->input->post('note'), - 'anmerkung' => $this->input->post('anmerkung'), + 'pruefungstyp_kurzbz' => $formData['pruefungstyp_kurzbz'], + 'akadgrad_id' => $formData['akadgrad_id'], + 'vorsitz' => $formData['vorsitz'], + 'pruefungsantritt_kurzbz' => $formData['pruefungsantritt_kurzbz'], + 'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'], + 'datum' => $formData['datum'], //TODO(Manu) check if minute format like FAS + 'sponsion' => $formData['sponsion'], + 'pruefer1' => $formData['pruefer1'], + 'pruefer2' => $formData['pruefer2'], + 'pruefer3' => $formData['pruefer3'], + 'protokoll' => $formData['protokoll'], + 'note' => $formData['note'], + 'anmerkung' => $formData['anmerkung'], 'insertamum' => date('c'), 'insertvon' => getAuthUID() ]); @@ -295,25 +342,17 @@ class Abschlusspruefung extends FHCAPI_Controller } $formData = $this->input->post('formData'); - $_POST['student_uid'] = $formData['student_uid']; - $_POST['pruefungstyp_kurzbz'] = $formData['pruefungstyp_kurzbz']; - $_POST['akadgrad_id']= $formData['akadgrad_id']; - $_POST['vorsitz'] = isset($formData['vorsitz']['mitarbeiter_uid']) ? $formData['vorsitz']['mitarbeiter_uid'] : $formData['vorsitz']; - $_POST['pruefer1'] = isset($formData['pruefer1']['person_id']) ? $formData['pruefer1']['person_id'] : $formData['pruefer1']; - $_POST['pruefer2'] = isset($formData['pruefer2']['person_id']) ? $formData['pruefer2']['person_id'] : $formData['pruefer2']; - $_POST['pruefer3'] = isset($formData['pruefer3']['person_id']) ? $formData['pruefer3']['person_id'] : $formData['pruefer3']; - $_POST['pruefungsantritt_kurzbz'] = $formData['pruefungsantritt_kurzbz']; - $_POST['abschlussbeurteilung_kurzbz'] = $formData['abschlussbeurteilung_kurzbz']; - $_POST['datum']= $formData['datum']; - $_POST['sponsion']= $formData['sponsion']; - $_POST['anmerkung'] = $formData['anmerkung']; - $_POST['protokoll']= $formData['protokoll']; - $_POST['note'] = $formData['note']; + $vorsitz = isset($formData['vorsitz']['mitarbeiter_uid']) ? $formData['vorsitz']['mitarbeiter_uid'] : $formData['vorsitz']; + $pruefer1 = isset($formData['pruefer1']['person_id']) ? $formData['pruefer1']['person_id'] : $formData['pruefer1']; + $pruefer2 = isset($formData['pruefer2']['person_id']) ? $formData['pruefer2']['person_id'] : $formData['pruefer2']; + $pruefer3 = isset($formData['pruefer3']['person_id']) ? $formData['pruefer3']['person_id'] : $formData['pruefer3']; + + $this->form_validation->set_data($formData); $this->form_validation->set_rules('pruefungstyp_kurzbz', 'Typ', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) ]); - + $this->form_validation->set_rules('akadgrad_id', 'AkadGrad', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'AkadGrad']) ]); @@ -334,25 +373,25 @@ class Abschlusspruefung extends FHCAPI_Controller $result = $this->AbschlusspruefungModel->update( [ - 'abschlusspruefung_id' => $abschlusspruefung_id + 'abschlusspruefung_id' => $abschlusspruefung_id ], [ - 'student_uid' => $this->input->post('student_uid'), - 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), - 'akadgrad_id' => $this->input->post('akadgrad_id'), - 'vorsitz' => $this->input->post('vorsitz'), - 'pruefungsantritt_kurzbz' => $this->input->post('pruefungsantritt_kurzbz'), - 'abschlussbeurteilung_kurzbz' => $this->input->post('abschlussbeurteilung_kurzbz'), - 'datum' => $this->input->post('datum'), - 'sponsion' => $this->input->post('sponsion'), - 'pruefer1' => $this->input->post('pruefer1'), - 'pruefer2' => $this->input->post('pruefer2'), - 'pruefer3' => $this->input->post('pruefer3'), - 'protokoll' => $this->input->post('protokoll'), - 'note' => $this->input->post('note'), - 'anmerkung' => $this->input->post('anmerkung'), - 'insertamum' => date('c'), - 'insertvon' => getAuthUID() + 'student_uid' => $formData['student_uid'], + 'pruefungstyp_kurzbz' => $formData['pruefungstyp_kurzbz'], + 'akadgrad_id' => $formData['akadgrad_id'], + 'vorsitz' => $vorsitz, + 'pruefungsantritt_kurzbz' => $formData['pruefungsantritt_kurzbz'], + 'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'], + 'datum' => $formData['datum'], + 'sponsion' => $formData['sponsion'], + 'pruefer1' => $pruefer1, + 'pruefer2' => $pruefer2, + 'pruefer3' => $pruefer3, + 'protokoll' => $formData['protokoll'], + 'note' => $formData['note'], + 'anmerkung' => $formData['anmerkung'], + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() ] ); diff --git a/application/controllers/api/frontend/v1/stv/Address.php b/application/controllers/api/frontend/v1/stv/Address.php index 324e306f3..d14111e99 100644 --- a/application/controllers/api/frontend/v1/stv/Address.php +++ b/application/controllers/api/frontend/v1/stv/Address.php @@ -31,6 +31,11 @@ class Address extends FHCAPI_Controller 'getNations' => self::PERM_LOGGED, 'getPlaces' => self::PERM_LOGGED ]); + + // Load language phrases + $this->loadPhrases([ + 'ui' + ]); } public function getNations() @@ -53,7 +58,11 @@ class Address extends FHCAPI_Controller $this->form_validation->set_data(['address.plz' => $plz]); - $this->form_validation->set_rules('address.plz', 'PLZ', 'required|numeric|less_than[10000]'); + $this->form_validation->set_rules('address.plz', 'PLZ', 'required|numeric|less_than[10000]', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']), + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ']), + 'less_than' => $this->p->t('ui', 'error_fieldLessThan10000', ['field' => 'PLZ']) + ]); if (!$this->form_validation->run()) $this->terminateWithValidationErrors($this->form_validation->error_array()); diff --git a/application/controllers/api/frontend/v1/stv/Akte.php b/application/controllers/api/frontend/v1/stv/Akte.php new file mode 100644 index 000000000..1d38c96d4 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Akte.php @@ -0,0 +1,70 @@ +. + */ + +if (!defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * Controller for downloading Akte + */ +class Akte extends Auth_Controller +{ + /** + * Calls the parent's constructor and prepares libraries and phrases + */ + public function __construct() + { + parent::__construct([ + 'download' => ['admin:w', 'assistenz:w'], + ]); + + // Load models + $this->load->model('crm/Akte_model', 'AkteModel'); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * + * Downloads an Akte + */ + public function download() + { + $akte_id = $this->input->get('akte_id'); + + if (!is_numeric($akte_id)) $this->terminateWithError('akte Id missing'); + + $result = $this->AkteModel->load($akte_id); + + if (!hasData($result)) $this->terminateWithError('Akte not found'); + + $data = getData($result)[0]; + + if (isset($data->inhalt) && $data->inhalt != '') + { + header('Content-Description: File Transfer'); + header('Content-Type: '. $data->mimetype); + header('Expires: 0'); + header('Cache-Control: must-revalidate'); + header('Pragma: public'); + header('Content-Disposition: attachment; filename="'.$data->titel.'"'); + echo base64_decode($data->inhalt); + die(); + } + } +} diff --git a/application/controllers/api/frontend/v1/stv/Anrechnungen.php b/application/controllers/api/frontend/v1/stv/Anrechnungen.php new file mode 100644 index 000000000..251e2d5bd --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Anrechnungen.php @@ -0,0 +1,256 @@ + ['admin:r', 'assistenz:r'], + 'deleteAnrechnung' => ['admin:rw', 'assistenz:rw'], + 'getLehrveranstaltungen' => ['admin:r', 'assistenz:r'], + 'getBegruendungen' => ['admin:r', 'assistenz:r'], + 'getLektoren' => ['admin:r', 'assistenz:r'], + 'getLvsKompatibel' => ['admin:r', 'assistenz:r'], + 'insertAnrechnung' => ['admin:rw', 'assistenz:rw'], + 'loadAnrechnung' => ['admin:rw', 'assistenz:rw'], + 'updateAnrechnung' => ['admin:rw', 'assistenz:rw'], + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + + // Load language phrases + $this->loadPhrases([ + 'ui', 'lehre' + ]); + + // Load models + $this->load->model('education/Anrechnung_model', 'AnrechnungsModel'); + } + + public function getAnrechnungen($prestudent_id) + { + $result = $this->AnrechnungsModel->getAnrechnungsData($prestudent_id); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getBegruendungen() + { + $this->load->model('education/Anrechnungbegruendung_model', 'AnrechnungbegrueundungsModel'); + + $result = $this->AnrechnungbegrueundungsModel->load(); + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess(getData($result) ?: []); + } + + public function getLehrveranstaltungen($prestudent_id) + { + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $result = $this->PrestudentstatusModel->getLastStatus($prestudent_id); + + $data = $this->getDataOrTerminateWithError($result); + $studienplan_id = current($data)->studienplan_id; + + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $result = $this->LehrveranstaltungModel->getLvsByStudienplanId($studienplan_id); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getLvsKompatibel($lehrveranstaltung_id) + { + $this->AnrechnungsModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'ON (lv.lehrveranstaltung_id = lehre.tbl_anrechnung.lehrveranstaltung_id)'); + $result = $this->AnrechnungsModel->loadWhere( + ['lehrveranstaltung_id_kompatibel' => $lehrveranstaltung_id] + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getLektoren($studiengang_kz) + { + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + + $result = $this->MitarbeiterModel->getLektoren($studiengang_kz); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function insertAnrechnung() + { + $this->load->library('form_validation'); + + $prestudent_id = $this->input->post('prestudent_id'); + + if(!$prestudent_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + $_POST['lehrveranstaltung_id'] = + (isset($formData['lehrveranstaltung_id']) && !empty($formData['lehrveranstaltung_id'])) + ? $formData['lehrveranstaltung_id'] + : null; + $_POST['lehrveranstaltung_id_kompatibel'] = + (isset($formData['lehrveranstaltung_id_kompatibel']) && !empty($formData['lehrveranstaltung_id_kompatibel'])) + ? $formData['lehrveranstaltung_id_kompatibel'] + : null; + $_POST['begruendung'] = + (isset($formData['begruendung_id']) && !empty($formData['begruendung_id'])) + ? $formData['begruendung_id'] + : null; + $_POST['genehmigtVon'] = (isset($formData['genehmigt_von']) && !empty($formData['genehmigt_von'])) + ? $formData['genehmigt_von'] + : null; + + $this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung_id', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung']) + ]); + + $this->form_validation->set_rules('begruendung', 'Begruendung', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Begruendung']) + ]); + + if($_POST['begruendung'] == 2) + { + $this->form_validation->set_rules('lehrveranstaltung_id_kompatibel', 'Lehrveranstaltung_id', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung Kompatibel']) + ]); + } + + $this->form_validation->set_rules('genehmigtVon', 'GenehmigtVon', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'GenehmigtVon']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->AnrechnungsModel->insert( + [ + 'prestudent_id' => $prestudent_id, + 'lehrveranstaltung_id' => $_POST['lehrveranstaltung_id'], + 'lehrveranstaltung_id_kompatibel' => $_POST['lehrveranstaltung_id_kompatibel'], + 'begruendung_id' => $_POST['begruendung'], + 'genehmigt_von' => $_POST['genehmigtVon'] + ] + ); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function loadAnrechnung($anrechnung_id) + { + $this->AnrechnungsModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'ON (lv.lehrveranstaltung_id = lehre.tbl_anrechnung.lehrveranstaltung_id)'); + $result = $this->AnrechnungsModel->loadWhere( + array('anrechnung_id' => $anrechnung_id) + ); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function updateAnrechnung() + { + $this->load->library('form_validation'); + + $anrechnung_id = $this->input->post('anrechnung_id'); + + if(!$anrechnung_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Anrechnung UID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + $_POST['lehrveranstaltung_id'] = + (isset($formData['lehrveranstaltung_id']) && !empty($formData['lehrveranstaltung_id'])) + ? $formData['lehrveranstaltung_id'] + : null; + $_POST['lehrveranstaltung_id_kompatibel'] = + (isset($formData['lehrveranstaltung_id_kompatibel']) && !empty($formData['lehrveranstaltung_id_kompatibel'])) + ? $formData['lehrveranstaltung_id_kompatibel'] + : null; + $_POST['begruendung'] = (isset($formData['begruendung_id']) && !empty($formData['begruendung_id'])) ? $formData['begruendung_id'] : null; + $_POST['genehmigtVon'] = (isset($formData['genehmigt_von']) && !empty($formData['genehmigt_von'])) ? $formData['genehmigt_von'] : null; + + $this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung_id', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung']) + ]); + + $this->form_validation->set_rules('begruendung', 'Begruendung', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Begruendung']) + ]); + + if($_POST['begruendung'] == 2) + { + $this->form_validation->set_rules('lehrveranstaltung_id_kompatibel', 'Lehrveranstaltung_id', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung Kompatibel']) + ]); + } + + $this->form_validation->set_rules('genehmigtVon', 'GenehmigtVon', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'GenehmigtVon']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->AnrechnungsModel->update( + [ + 'anrechnung_id' => $anrechnung_id, + ], + [ + + 'lehrveranstaltung_id' => $_POST['lehrveranstaltung_id'], + 'lehrveranstaltung_id_kompatibel' => $_POST['lehrveranstaltung_id_kompatibel'], + 'begruendung_id' => $_POST['begruendung'], + 'genehmigt_von' => $_POST['genehmigtVon'] + ] + ); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function deleteAnrechnung($anrechnung_id) + { + // Start DB transaction + $this->db->trans_begin(); + + //delete anrechnung_id of table tbl_anrechnung_anrechnungstatus + $this->load->model('education/Anrechnunganrechnungstatus_model','AnrechnungAnrechnungstatusModel'); + $result = $this->AnrechnungAnrechnungstatusModel->delete( + array('anrechnung_id' => $anrechnung_id) + ); + $this->getDataOrTerminateWithError($result); + + //delete anrechnung_id of table tbl_anrechnung + $result = $this->AnrechnungsModel->delete( + array('anrechnung_id' => $anrechnung_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->db->trans_commit(); + + $this->terminateWithSuccess($data); + } +} diff --git a/application/controllers/api/frontend/v1/stv/Archiv.php b/application/controllers/api/frontend/v1/stv/Archiv.php new file mode 100644 index 000000000..6b8388fbb --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Archiv.php @@ -0,0 +1,257 @@ +. + */ + +if (!defined('BASEPATH')) exit('No direct script access allowed'); + +use CI3_Events as Events; + +/** + * This controller operates between (interface) the JS (GUI) and the back-end + * Provides data to the ajax get calls about archive documents + * Listens to ajax post calls to change the archive documents + * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON + */ +class Archiv extends FHCAPI_Controller +{ + /** + * Calls the parent's constructor and prepares libraries and phrases + */ + public function __construct() + { + parent::__construct([ + 'getArchiv' => ['admin:r', 'assistenz:r'], + 'getArchivVorlagen' => ['admin:r', 'assistenz:r'], + 'archive' => ['admin:w', 'assistenz:w'], + 'download' => ['admin:w', 'assistenz:w'], + 'update' => ['admin:w'], + 'delete' => ['admin:w', 'assistenz:w'], + ]); + + // Load models + $this->load->model('crm/Akte_model', 'AkteModel'); + $this->load->model('system/Vorlage_model', 'VorlageModel'); + + // Load language phrases + $this->loadPhrases([ + 'archiv' + ]); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * Get archive documents for a person + + * @return void + */ + public function getArchiv() + { + $person_id = $this->input->get('person_id'); + + $this->load->library('form_validation'); + + if (!$person_id || !is_array($person_id)) + { + $this->form_validation->set_rules('person_id', 'Person ID', 'required'); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->AkteModel->getArchiv($person_id); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + /** + * Get Vorlagen for archiving documents + * @return void + */ + public function getArchivVorlagen() + { + $result = $this->VorlageModel->getArchivVorlagen(); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + /** + * + * @param + * @return object success or error + */ + public function download() + { + $akte_id = $this->input->get('akte_id'); + + if (!is_numeric($akte_id)) $this->terminateWithError('akte Id missing'); + + $result = $this->AkteModel->load($akte_id); + + if (!hasData($result)) $this->terminateWithError('Akte not found'); + + $data = getData($result)[0]; + + $fileObj = new stdClass(); + if (isset($data->inhalt) && $data->inhalt != '') + { + // Define handle to output stream + $tmpFilePointer = fopen("php://output", 'w'); + $meta_data = stream_get_meta_data($tmpFilePointer); + $filename = $meta_data["uri"]; + fwrite($tmpFilePointer, $data->inhalt); + + header('Content-Description: File Transfer'); + header('Content-Type: '. $data->mimetype); + header('Expires: 0'); + header('Cache-Control: must-revalidate'); + header('Pragma: public'); + //header('Content-Length: ' . filesize($fileObj->file)); + //header("Content-type: $data->mimetype"); + header('Content-Disposition: attachment; filename="'.$data->titel.'"'); + readfile($filename); + die(); + } + else + { + $this->load->library('AkteLib'); + + $result = $this->aktelib->get($akte_id); + } + } + + /** + * Updating an Akte + * @return void + */ + public function update() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules('akte_id', 'Akte Id', 'required'); + $this->form_validation->set_rules('signiert', 'Signiert', 'is_bool'); + $this->form_validation->set_rules('stud_selfservice', 'Self-Service', 'is_bool'); + + //Events::trigger('konto_update_validation', $this->form_validation); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $id = $this->input->post('akte_id'); + + // get the akte + $result = $this->AkteModel->load($id); + + if (!hasData($result)) $this->terminateWithError("Akte not found!"); + + $akte = getData($result)[0]; + + $allowed = [ + 'signiert', + 'stud_selfservice' + ]; + + $data = [ + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() + ]; + + // if Akte has Inhalt directly in Akte table + if (isset($_FILES['datei']['tmp_name'])) + { + $this->addMeta('read', "read"); + // update inhalt directly + + // get tmp file + $filename = $_FILES['datei']['tmp_name']; + // open it + $fp = fopen($filename,'r'); + // read it + $content = fread($fp, filesize($filename)); + fclose($fp); + // encode it + $data['inhalt'] = base64_encode($content); + $this->addMeta('content', base64_encode($content)); + } + + + foreach ($allowed as $field) + if ($this->input->post($field) !== null) + $data[$field] = $this->input->post($field); + + $this->addMeta("data", $data); + + $result = $this->AkteModel->update($id, $data); + + $this->getDataOrTerminateWithError($result); + + $result = null; + + $this->terminateWithSuccess($result); + } + + + /** + * Delete archived Akte + * + * @return void + */ + public function delete() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules('akte_id', 'Akte ID', 'required'); + $this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'has_permissions_for_stg[admin:rw,assistenz:rw]'); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $akte_id = $this->input->post('akte_id'); + + $result = $this->AkteModel->load($akte_id); + + if (!hasData($result)) + { + $this->terminateWithError($this->p->t('archiv', 'error_missing', [ + 'akte_id' => $akte_id + ])); + } + + $result = getData($result)[0]; + + if ($result->dokument_kurzbz == 'Ausbvert' + && isset($result->akzeptiertamum) + && !isEmptyString($result->akzeptiertamum) + && !has_permissions_for_stg($this->input->post('studiengang_kz'), 'admin:rw') + ) + { + $this->terminateWithError($this->p->t('archiv', 'nur_admins_loschen_ausbildungsvertraege', [ + 'akte_id' => $akte_id + ])); + } + + $result = $this->AkteModel->delete($akte_id); + if (isError($result)) $this->terminateWithError(getError($result)); + + $this->terminateWithSuccess(); + } +} diff --git a/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php new file mode 100644 index 000000000..26033908d --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php @@ -0,0 +1,413 @@ + ['admin:r', 'assistenz:r'], + 'loadAufnahmetermin' => ['admin:r', 'assistenz:r'], + 'insertAufnahmetermin' => ['admin:rw', 'assistenz:rw'], + 'updateAufnahmetermin' => ['admin:rw', 'assistenz:rw'], + 'deleteAufnahmetermin' => ['admin:rw', 'assistenz:rw'], + 'getListPlacementTests' => ['admin:r', 'assistenz:r'], + 'getListStudyPlans' => ['admin:r', 'assistenz:r'], + 'loadDataRtPrestudent' => ['admin:r', 'assistenz:r'], + 'insertOrUpdateDataRtPrestudent' => ['admin:r', 'assistenz:r'], + 'loadAufnahmegruppen' => ['admin:r', 'assistenz:r'], + 'getResultReihungstest' => ['admin:r', 'assistenz:r'], + 'getZukuenftigeReihungstestStg' => ['admin:r', 'assistenz:r'], + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('form_validation'); + + // Load language phrases + $this->loadPhrases([ + 'ui', + 'admission' + ]); + + // Load models + $this->load->model('crm/Reihungstest_model', 'ReihungstestModel'); + $this->load->model('crm/RtPerson_model', 'RtPersonModel'); + } + + public function getAufnahmetermine($person_id) + { + $result = $this->ReihungstestModel->getReihungstestPerson($person_id); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function insertAufnahmetermin() + { + $this->load->library('form_validation'); + $authUID = getAuthUID(); + + $formData = $this->input->post('formData'); + $person_id = $this->input->post('person_id'); + + if(!$person_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); + } + + + $rt_id = (isset($formData['rt_id']) && !empty($formData['rt_id'])) ? $formData['rt_id'] : null; + $anmeldedatum = (isset($formData['anmeldedatum']) && !empty($formData['anmeldedatum'])) ? $formData['anmeldedatum'] : null; + $teilgenommen = (isset($formData['teilgenommen']) && !empty($formData['teilgenommen'])) ? $formData['teilgenommen'] : false; + $studienplan_id = (isset($formData['studienplan_id']) && !empty($formData['studienplan_id'])) ? $formData['studienplan_id'] : null; + $punkte = (isset($formData['punkte']) && !empty($formData['punkte'])) ? $formData['punkte'] : null; + + //validation if there is already an RT with chosen data existing + $result = $this->RtPersonModel->loadWhere( + array( + 'rt_id' => $rt_id, + 'person_id' => $person_id, + 'studienplan_id' => $studienplan_id, + ) + ); + $data = getData($result); + if($data) + return $this->terminateWithError("Error", self::ERROR_TYPE_GENERAL); + + $this->form_validation->set_data($formData); + + $this->form_validation->set_rules('punkte', 'Punkte', 'numeric', [ + 'required' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Punkte']) + ]); + $this->form_validation->set_rules('studienplan_id', 'studienplan_id', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Studienplan']) + ]); + $this->form_validation->set_rules('rt_id', 'Reihungstest_id', 'required', [ + 'is_valid_date' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Reihungstest']) + ]); + $this->form_validation->set_rules('anmeldedatum', 'AnmeldeDatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Anmeldedatum']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->RtPersonModel->insert([ + 'person_id' => $person_id, + 'rt_id' => $rt_id, + 'anmeldedatum' => $anmeldedatum, + 'teilgenommen' => $teilgenommen, + 'studienplan_id' => $studienplan_id, + 'punkte' => $punkte, + 'insertamum' => date('c'), + 'insertvon' => $authUID, + ]); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function loadAufnahmetermin($rt_person_id) + { + $result = $this->RtPersonModel->loadWhere( + array('rt_person_id' => $rt_person_id) + ); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function updateAufnahmetermin() + { + $this->load->library('form_validation'); + $authUID = getAuthUID(); + + $formData = $this->input->post('formData'); + $rt_person_id = $this->input->post('rt_person_id'); + $person_id = (isset($formData['person_id']) && !empty($formData['person_id'])) ? $formData['person_id'] : null; + + + if(!$person_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); + } + if(!$rt_person_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'RT_Person ID']), self::ERROR_TYPE_GENERAL); + } + + $rt_id = (isset($formData['rt_id']) && !empty($formData['rt_id'])) ? $formData['rt_id'] : null; + $anmeldedatum = (isset($formData['anmeldedatum']) && !empty($formData['anmeldedatum'])) ? $formData['anmeldedatum'] : null; + $teilgenommen = (isset($formData['teilgenommen']) && !empty($formData['teilgenommen'])) ? $formData['teilgenommen'] : false; + $studienplan_id = (isset($formData['studienplan_id']) && !empty($formData['studienplan_id'])) ? $formData['studienplan_id'] : null; + $punkte = (isset($formData['punkte']) && !empty($formData['punkte'])) ? $formData['punkte'] : null; + + $this->form_validation->set_data($formData); + + $this->form_validation->set_rules('punkte', 'Punkte', 'numeric', [ + 'required' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Punkte']) + ]); + $this->form_validation->set_rules('studienplan_id', 'studienplan_id', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Studienplan']) + ]); + $this->form_validation->set_rules('rt_id', 'Reihungstest_id', 'required', [ + 'is_valid_date' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Reihungstest']) + ]); + + $this->form_validation->set_rules('anmeldedatum', 'AnmeldeDatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Anmeldedatum']) + ]); + + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->RtPersonModel->update( + [ + 'rt_person_id' => $rt_person_id, + ], + [ + 'rt_id' => $rt_id, + 'anmeldedatum' => $anmeldedatum, + 'teilgenommen' => $teilgenommen, + 'studienplan_id' => $studienplan_id, + 'punkte' => $punkte, + 'insertamum' => date('c'), + 'insertvon' => $authUID, + ] + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function deleteAufnahmetermin($rt_person_id) + { + $result = $this->RtPersonModel->delete( + array('rt_person_id' => $rt_person_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function getListPlacementTests($prestudent_id) + { + if(!$prestudent_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + } + + //get studienplan array + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + + $this->PrestudentstatusModel->addSelect('*'); + $this->PrestudentstatusModel->addSelect('sp.studienplan_id'); + + $this->PrestudentstatusModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT'); + + $result = $this->PrestudentstatusModel->loadWhere( + array( + 'prestudent_id' => $prestudent_id, + 'status_kurzbz' => 'Interessent' + ) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $studienplan_arr = []; + $include_ids = []; + foreach ($data as $item) + { + if($item->studienplan_id != null) + $studienplan_arr[] = $item->studienplan_id; + } + + //get Placementtests Person + $person_id = $this->_getPersonId($prestudent_id); + $resultRt = $this->ReihungstestModel->getReihungstestPerson($person_id); + + $dataRt = $this->getDataOrTerminateWithError($resultRt); + + foreach ($dataRt as $item) + { + if(!in_array($item->studienplan_id, $studienplan_arr)) + $studienplan_arr[] = $item->studienplan_id; + if(!in_array($item->rt_id, $include_ids) && ($item->rt_id != null)) + $include_ids[] = $item->rt_id; + } + + $result = $this->ReihungstestModel->getReihungstestByStudyPlanAndIds($studienplan_arr, $include_ids); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getListStudyPlans($person_id) + { + $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); + + $result = $this->StudienplanModel->getStudienplaeneForPerson($person_id); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function loadDataRtPrestudent($prestudent_id) + { + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->PrestudentModel->addSelect(["reihungstestangetreten"]); + $this->PrestudentModel->addSelect(["rt_gesamtpunkte"]); + $this->PrestudentModel->addSelect(["aufnahmegruppe_kurzbz"]); + $result = $this->PrestudentModel->loadWhere( + array('prestudent_id' => $prestudent_id) + ); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function insertOrUpdateDataRtPrestudent() + { + $this->load->library('form_validation'); + $authUID = getAuthUID(); + + $formData = $this->input->post('formData'); + $prestudent_id = $this->input->post('prestudent_id'); + + if(!$prestudent_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + } + $rt_gesamtpunkte = + (isset($formData['rt_gesamtpunkte']) && !empty($formData['rt_gesamtpunkte'])) + ? $formData['rt_gesamtpunkte'] + : null; + $reihungstestangetreten = + (isset($formData['reihungstestangetreten']) && !empty($formData['reihungstestangetreten'])) + ? $formData['reihungstestangetreten'] + : false; + $aufnahmegruppe_kurzbz = + (isset($formData['aufnahmegruppe_kurzbz']) && !empty($formData['aufnahmegruppe_kurzbz'])) + ? $formData['aufnahmegruppe_kurzbz'] + : null; + + $this->form_validation->set_data($formData); + + $this->form_validation->set_rules('rt_gesamtpunkte', 'Rt_gesamtpunkte', 'numeric', [ + 'required' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Rt_gesamtpunkte']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $result = $this->PrestudentModel->update( + [ + 'prestudent_id' => $prestudent_id, + ], + [ + 'reihungstestangetreten' => $reihungstestangetreten, + 'rt_gesamtpunkte' => $rt_gesamtpunkte, + 'aufnahmegruppe_kurzbz' => $aufnahmegruppe_kurzbz, + 'updateamum' => date('c'), + 'updatevon' => $authUID, + ] + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function loadAufnahmegruppen() + { + $uid = $this->input->get('uid'); + $studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz'); + + $this->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel'); + + $result = $this->BenutzergruppeModel->loadAufnahmegruppen($uid, $studiensemester_kurzbz); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(($data)); + } + + public function getResultReihungstest() + { + $person_id = $this->input->get('person_id'); + $punkte = $this->input->get('punkte'); + $reihungstest_id = $this->input->get('reihungstest_id'); + + if(!$reihungstest_id) + { + $this->terminateWithSuccess(null); + } + + //for gewichtung + $studiengang_kz = $this->input->get('studiengang_kz'); + + $this->load->model('testtool/Ablauf_model', 'AblaufModel'); + $result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz); + $data = $this->getDataOrTerminateWithError($result); + + $weightedArray = []; + foreach ($data as $abl) + { + $weightedArray[$abl->gebiet_id] = $abl->gewicht; + } + + $result = $this->ReihungstestModel->getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray); + +/* if (isError($result)) + { + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + }*/ + + $this->terminateWithSuccess($result); + } + + public function getZukuenftigeReihungstestStg() + { + $studiengang_kz = $this->input->get('studiengang_kz'); + if(!$studiengang_kz) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiengang_kz']), self::ERROR_TYPE_GENERAL); + } + + $result = $this->ReihungstestModel->getZukuenftigeReihungstestStg($studiengang_kz); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + private function _getPersonId($prestudent_id) + { + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + $result = $this->PrestudentModel->loadWhere( + ['prestudent_id' => $prestudent_id] + ); + + $data = $this->getDataOrTerminateWithError($result); + $person = current($data); + + return $person->person_id; + } +} diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php index 42de1b02f..c787381f0 100644 --- a/application/controllers/api/frontend/v1/stv/Config.php +++ b/application/controllers/api/frontend/v1/stv/Config.php @@ -33,6 +33,9 @@ class Config extends FHCAPI_Controller { // TODO(chris): permissions parent::__construct([ + 'get' => ['admin:r', 'assistenz:r'], + 'set' => ['admin:r', 'assistenz:r'], + 'filter' => ['admin:r', 'assistenz:r'], 'student' => ['admin:r', 'assistenz:r'], 'students' => ['admin:r', 'assistenz:r'] ]); @@ -45,13 +48,255 @@ class Config extends FHCAPI_Controller 'lehre', 'stv', 'konto', - 'abschlusspruefung' + 'abschlusspruefung', + 'projektarbeit' ]); // Load Config $this->load->config('stv'); } + /** + * get App config + */ + public function get() + { + $this->load->model('system/Variable_model', 'VariableModel'); + $this->load->config('stv'); + + $config = []; + + #number_displayed_past_studiensemester + $result = $this->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']); + $data = $this->getDataOrTerminateWithError($result); + + $number_displayed_past_studiensemester_default = $this->config->item('number_displayed_past_studiensemester_default'); + + $config['number_displayed_past_studiensemester'] = [ + "type" => "number", + "label" => $this->p->t('stv', 'settings_no_displayed_past_sem'), + "value" => $data['number_displayed_past_studiensemester'] + ?? $number_displayed_past_studiensemester_default + ]; + + #font_size + $result = $this->VariableModel->getVariables(getAuthUID(), ['stv_font_size']); + $data = $this->getDataOrTerminateWithError($result); + $config['font_size'] = [ + "type" => "select", + "label" => $this->p->t('stv', 'settings_fontsize'), + "value" => $data['stv_font_size'] ?? "fs_normal", + "options" => [ + "fs_xx-small" => $this->p->t('stv', 'settings_fontsize_xx-small'), + "fs_x-small" => $this->p->t('stv', 'settings_fontsize_x-small'), + "fs_small" => $this->p->t('stv', 'settings_fontsize_small'), + "fs_normal" => $this->p->t('stv', 'settings_fontsize_normal'), + "fs_big" => $this->p->t('stv', 'settings_fontsize_big'), + "fs_huge" => $this->p->t('stv', 'settings_fontsize_huge') + ] + ]; + + #others + Events::trigger('stv_config_get', function & () use (&$config) { + return $config; + }); + + $this->terminateWithSuccess($config); + } + + /** + * set App config + */ + public function set() + { + $this->load->model('system/Variable_model', 'VariableModel'); + $this->load->library('form_validation'); + + $this->form_validation->set_rules( + 'number_displayed_past_studiensemester', + $this->p->t('stv', 'settings_no_displayed_past_sem'), + 'required|integer' + ); + $this->form_validation->set_rules( + 'font_size', + $this->p->t('stv', 'settings_fontsize'), + 'required|in_list[fs_xx-small,fs_x-small,fs_small,fs_normal,fs_big,fs_huge]' + ); + + Events::trigger('stv_config_validation', $this->form_validation); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + + $this->VariableModel->setVariable( + getAuthUID(), + 'number_displayed_past_studiensemester', + $this->input->post('number_displayed_past_studiensemester') + ); + $this->VariableModel->setVariable( + getAuthUID(), + 'stv_font_size', + $this->input->post('font_size') + ); + + Events::trigger('stv_config_set', $this->input); + + $this->terminateWithSuccess(); + } + + /* + * Get the config for the student filters + * + * @return void + */ + public function filter() + { + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + + $this->load->model('crm/Buchungstyp_model', 'BuchungstypModel'); + + $this->BuchungstypModel->addOrder('beschreibung'); + + $result = $this->BuchungstypModel->load(); + + $buchungstyp_kurzbz = $this->getDataOrTerminateWithError($result); + $buchungstyp_kurzbz_plus_all = array_merge([[ + 'buchungstyp_kurzbz' => 'all', + 'beschreibung' => $this->p->t('stv', 'konto_all_types') + ]], $buchungstyp_kurzbz); + + $this->load->model('crm/Statusgrund_model', 'StatusgrundModel'); + + $result = $this->StatusgrundModel->getAktiveGruende(); + + $statusgruende = $this->getDataOrTerminateWithError($result); + + $result = []; + + $result[] = [ + 'id' => 'filter_konto_count_0', + 'label' => $this->p->t('stv', 'filter_konto_count_0'), + 'type' => 'konto', + 'fixed' => [ + 'missing' => true, + 'usestdsem' => true + ], + 'dynamic' => [ + 'buchungstyp_kurzbz' => [ + 'type' => 'select', + 'values' => $buchungstyp_kurzbz, + 'value_key' => 'buchungstyp_kurzbz', + 'label_key' => 'beschreibung' + ] + ] + ]; + $result[] = [ + 'id' => 'filter_konto_missing_counter', + 'label' => $this->p->t('stv', 'filter_konto_missing_counter'), + 'type' => 'konto_counter', + 'dynamic' => [ + 'buchungstyp_kurzbz' => [ + 'type' => 'select', + 'values' => $buchungstyp_kurzbz_plus_all, + 'value_key' => 'buchungstyp_kurzbz', + 'label_key' => 'beschreibung' + ], + 'samestg' => [ + 'type' => 'bool', + 'label' => $this->p->t('stv', 'filter_konto_samestg'), + 'default' => $this->variablelib->getVar('kontofilterstg') == 'true' + ] + ] + ]; + $result[] = [ + 'id' => 'filter_documents', + 'label' => $this->p->t('stv', 'filter_documents'), + 'type' => 'documents' + ]; + $result[] = [ + 'id' => 'filter_konto_missing_counter_past', + 'label' => $this->p->t('stv', 'filter_konto_missing_counter_past'), + 'type' => 'konto_counter', + 'fixed' => [ + 'past' => true + ], + 'dynamic' => [ + 'buchungstyp_kurzbz' => [ + 'type' => 'select', + 'values' => $buchungstyp_kurzbz_plus_all, + 'value_key' => 'buchungstyp_kurzbz', + 'label_key' => 'beschreibung' + ], + 'samestg' => [ + 'type' => 'bool', + 'label' => $this->p->t('stv', 'filter_konto_samestg'), + 'default' => $this->variablelib->getVar('kontofilterstg') == 'true' + ] + ] + ]; + $result[] = [ + 'id' => 'filter_konto_missing_studiengebuehr', + 'label' => $this->p->t('stv', 'filter_konto_missing_studiengebuehr'), + 'type' => 'konto', + 'fixed' => [ + 'missing' => true, + 'usestdsem' => true + ], + 'dynamic' => [ + 'buchungstyp_kurzbz' => [ + 'type' => 'select', + 'values' => $buchungstyp_kurzbz, + 'value_key' => 'buchungstyp_kurzbz', + 'label_key' => 'beschreibung' + ] + ] + ]; + $result[] = [ + 'id' => 'filter_konto_studiengebuehrerhoeht', + 'label' => $this->p->t('stv', 'filter_konto_studiengebuehrerhoeht'), + 'type' => 'konto', + 'fixed' => [ + 'usestdsem' => true + ], + 'dynamic' => [ + 'buchungstyp_kurzbz' => [ + 'type' => 'select', + 'values' => $buchungstyp_kurzbz, + 'value_key' => 'buchungstyp_kurzbz', + 'label_key' => 'beschreibung' + ] + ] + ]; + $result[] = [ + 'id' => 'filter_zgv_without_date', + 'label' => $this->p->t('stv', 'filter_zgv_without_date'), + 'type' => 'zgv' + ]; + $result[] = [ + 'id' => 'filter_statusgrund', + 'label' => $this->p->t('stv', 'filter_statusgrund'), + 'type' => 'statusgrund', + 'fixed' => [ + 'usestdsem' => true + ], + 'dynamic' => [ + 'statusgrund_id' => [ + 'type' => 'select', + 'values' => $statusgruende, + 'value_key' => 'statusgrund_id', + 'label_key' => 'bezeichnung' + ] + ] + ]; + + Events::trigger('stv_conf_filter', function & () use (&$result) { + return $result; + }); + + $this->terminateWithSuccess($result); + } + public function student() { $result = []; @@ -59,16 +304,21 @@ class Config extends FHCAPI_Controller $result['details'] = [ 'title' => $this->p->t('stv', 'tab_details'), - 'component' => './Stv/Studentenverwaltung/Details/Details.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Details.js'), 'config' => $config['details'] ]; + $result['notes'] = [ 'title' => $this->p->t('stv', 'tab_notes'), - 'component' => './Stv/Studentenverwaltung/Details/Notizen.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Notizen.js'), + 'config' => $config['notes'], + 'showSuffix' => ($config['notes']['showCountNotes'] ?? false), + 'suffixhelper' => absoluteJsImportUrl('public/js/helpers/Stv/Studentenverwaltung/Details/Notizen/NotizenSuffixHelper.js') ]; + $result['contact'] = [ 'title' => $this->p->t('stv', 'tab_contact'), - 'component' => './Stv/Studentenverwaltung/Details/Kontakt.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Kontakt.js'), 'config' => [ 'showBankaccount' => $this->permissionlib->isBerechtigt('mitarbeiter/bankdaten') || $this->permissionlib->isBerechtigt('student/bankdaten') @@ -76,16 +326,23 @@ class Config extends FHCAPI_Controller ]; $result['prestudent'] = [ 'title' => $this->p->t('stv', 'tab_prestudent'), - 'component' => './Stv/Studentenverwaltung/Details/Prestudent.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js'), 'config' => $config['prestudent'] ]; $result['status'] = [ 'title' => 'Status', - 'component' => './Stv/Studentenverwaltung/Details/MultiStatus.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js'), + 'config' => [ + 'showStatusVorruecken' => defined('STATUS_VORRUECKEN_ANZEIGEN') ? STATUS_VORRUECKEN_ANZEIGEN : true, + ] + ]; + $result['documents'] = [ + 'title' => $this->p->t('stv', 'tab_documents'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Dokumente.js') ]; $result['banking'] = [ 'title' => $this->p->t('stv', 'tab_banking'), - 'component' => './Stv/Studentenverwaltung/Details/Konto.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Konto.js'), 'config' => [ 'showZahlungsbestaetigung' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN), 'showBuchungsnr' => $this->permissionlib->isBerechtigt('admin'), @@ -97,11 +354,22 @@ class Config extends FHCAPI_Controller ]; $result['resources'] = [ 'title' => $this->p->t('stv', 'tab_resources'), - 'component' => './Stv/Studentenverwaltung/Details/Betriebsmittel.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Betriebsmittel.js'), + 'showOnlyWithUid' => true ]; + $result['groups'] = [ + 'title' => $this->p->t('stv', 'tab_groups'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Groups.js'), + 'showOnlyWithUid' => true + ]; + $result['messages'] = [ + 'title' => $this->p->t('stv', 'tab_messages'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Messages.js'), + ]; + $result['grades'] = [ 'title' => $this->p->t('stv', 'tab_grades'), - 'component' => './Stv/Studentenverwaltung/Details/Noten.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Noten.js'), 'showOnlyWithUid' => true, 'config' => [ 'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE, @@ -114,25 +382,76 @@ class Config extends FHCAPI_Controller $result['exam'] = [ 'title' => $this->p->t('stv', 'tab_exam'), - 'component' => './Stv/Studentenverwaltung/Details/Pruefung.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js'), + 'showOnlyWithUid' => true + ]; + + $result['exemptions'] = [ + 'title' => $this->p->t('lehre', 'anrechnungen'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Anrechnungen.js'), + 'config' => $config['exemptions'] ]; $result['finalexam'] = [ 'title' => $this->p->t('stv', 'tab_finalexam'), - 'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung.js'), + 'showOnlyWithUid' => true, 'config' => $config['finalexam'] ]; + $result['projektarbeit'] = [ + 'title' => $this->p->t('stv', 'tab_projektarbeit'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit.js'), + 'config' => array_merge( + $config['projektarbeit'], + ['showVertragsdetails' => + defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') && FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN] + ) + ]; + $result['mobility'] = [ 'title' => $this->p->t('stv', 'tab_mobility'), - 'component' => './Stv/Studentenverwaltung/Details/Mobility.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Mobility.js'), + 'showOnlyWithUid' => true + ]; + + $result['archive'] = [ + 'title' => $this->p->t('stv', 'tab_archive'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Archiv.js'), + 'config' => [ + 'showEdit' => $this->permissionlib->isBerechtigt('admin') + ] + ]; + + $result['jointstudies'] = [ + 'title' => $this->p->t('stv', 'tab_jointstudies'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/JointStudies.js'), + 'showOnlyWithUid' => true + ]; + + $result['coursedates'] = [ + 'title' => $this->p->t('stv', 'tab_courseDates'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Lehrveranstaltungstermine.js') + ]; + + $result['admissionDates'] = [ + 'title' => $this->p->t('stv', 'tab_admissionDates'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Aufnahmetermine.js') + ]; + + $result['functions'] = [ + 'title' => $this->p->t('stv', 'tab_functions'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Funktionen.js'), + 'showOnlyWithUid' => true ]; Events::trigger('stv_conf_student', function & () use (&$result) { return $result; }); - $this->terminateWithSuccess($result); + $sortConfig = $this->config->item('student_tab_order'); + + $this->terminateWithSuccess($this->sortTabList($result, $sortConfig)); } public function students() @@ -141,7 +460,7 @@ class Config extends FHCAPI_Controller $config = $this->config->item('tabs'); $result['banking'] = [ 'title' => $this->p->t('stv', 'tab_banking'), - 'component' => './Stv/Studentenverwaltung/Details/Konto.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Konto.js'), 'config' => [ 'showZahlungsbestaetigung' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN), 'showBuchungsnr' => $this->permissionlib->isBerechtigt('admin'), @@ -151,9 +470,14 @@ class Config extends FHCAPI_Controller 'additionalCols' => [] ] ]; + $result['groups'] = [ + 'title' => $this->p->t('stv', 'tab_groups'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Groups.js'), + 'showOnlyWithUid' => true + ]; $result['status'] = [ 'title' => 'Status', - 'component' => './Stv/Studentenverwaltung/Details/MultiStatus.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js'), 'config' => [ 'changeStatusToAbbrecherStgl' => $this->permissionlib->isBerechtigt('admin'), 'changeStatusToAbbrecherStud' => $this->permissionlib->isBerechtigt('admin'), @@ -163,16 +487,45 @@ class Config extends FHCAPI_Controller ] ]; $result['finalexam'] = [ - 'title' => $this->p->t('stv', 'tab_finalexam'), - 'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js', + 'title' => $this->p->t('stv', 'tab_finalexam'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung.js'), + 'showOnlyWithUid' => true, 'config' => $config['finalexam'] ]; + $result['archive'] = [ + 'title' => $this->p->t('stv', 'tab_archive'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Archiv.js'), + 'config' => [ + 'showEdit' => $this->permissionlib->isBerechtigt('admin') + ] + ]; + + if($this->permissionlib->isBerechtigt('basis/person')) + { + $result['combinePeople'] = [ + 'title' => $this->p->t('stv', 'tab_combine_people'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/CombinePeople.js'), + 'config' => $config['combinePeople'] + ]; + } + + $result['kontaktieren'] = [ + 'title' => $this->p->t('stv', 'tab_kontaktieren'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Kontaktieren.js'), + ]; + + $result['messages'] = [ + 'title' => $this->p->t('stv', 'tab_messages'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Messages.js'), + ]; Events::trigger('stv_conf_students', function & () use (&$result) { return $result; }); - $this->terminateWithSuccess($result); + $sortConfig = $this->config->item('students_tab_order'); + + $this->terminateWithSuccess($this->sortTabList($result, $sortConfig)); } protected function kontoColumns() @@ -303,7 +656,7 @@ class Config extends FHCAPI_Controller $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" . @@ -448,4 +801,34 @@ class Config extends FHCAPI_Controller return $list; } + + /** + * Sort tab list + * + * @param array $input + * @param array $config + * + * @return array + */ + protected function sortTabList($input, $config) + { + // prepare config + if (!$config || !is_array($config)) + $config = []; + else + $config = array_flip($config); + + // fill missing items in config + foreach (array_keys($input) as $key) { + if (!isset($config[$key])) + $config[$key] = count($config); + } + + // do the sorting + uksort($input, function ($a, $b) use ($config) { + return $config[$a] - $config[$b]; + }); + + return $input; + } } diff --git a/application/controllers/api/frontend/v1/stv/Dokumente.php b/application/controllers/api/frontend/v1/stv/Dokumente.php new file mode 100644 index 000000000..9f54d0aa4 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Dokumente.php @@ -0,0 +1,990 @@ + ['admin:r', 'assistenz:r'], + 'getDocumentsAccepted' => ['admin:r', 'assistenz:r'], + 'deleteZuordnung' => ['admin:rw', 'assistenz:rw'], + 'createZuordnung' => ['admin:rw', 'assistenz:rw'], + 'loadAkte' => ['admin:rw', 'assistenz:rw'], + 'deleteAkte' => ['admin:rw', 'assistenz:rw'], + 'updateAkte' => ['admin:rw', 'assistenz:rw'], + 'getDoktypen' => ['admin:r', 'assistenz:r'], + 'uploadDokument' => ['admin:rw', 'assistenz:rw'], + 'download' => ['admin:rw', 'assistenz:rw'], + 'getDocumentDropDown' => ['admin:rw', 'assistenz:rw'], + 'getDocumentDropDownMulti' => ['admin:rw', 'assistenz:rw'], + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('form_validation'); + $this->load->library('DmsLib', array('who' => getAuthUID())); + + // Load language phrases + $this->loadPhrases([ + 'ui', + 'dokumente' + ]); + + // Load models + $this->load->model('crm/Akte_model', 'AkteModel'); + $this->load->model('crm/Dokument_model', 'DokumentModel'); + $this->load->model('crm/Dokumentprestudent_model', 'DokumentprestudentModel'); + + //TODO(Manu) check additional Berechtigungen + //TODO(Manu) check if using dokument lib instead of dokument model? + } + + public function getDocumentsUnaccepted($prestudent_id, $studiengang_kz) + { + if(!$prestudent_id) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + + if (!is_numeric($prestudent_id)) + $this->terminateWithError($this->p->t('ui', 'error_valueNotNumeric', ['value' => 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + + if(!$studiengang_kz) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL); + + $person_id = $this->_getPersonId($prestudent_id); + $result = $this->DokumentModel->getUnacceptedDocuments($prestudent_id, $person_id); + + $dataAkteUnaccepted = $this->getDataOrTerminateWithError($result); + $resultMd = $this->_getMissingDocuments($studiengang_kz, $prestudent_id); + + $data = $this->_mergeDocuments($dataAkteUnaccepted, $resultMd); + + $this->terminateWithSuccess($data); + } + + public function getDocumentsAccepted($prestudent_id, $studiengang_kz) + { + if(!$prestudent_id) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + + if (!is_numeric($prestudent_id)) + $this->terminateWithError($this->p->t('ui', 'error_valueNotNumeric', ['value' => 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + + if(!$studiengang_kz) + $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); + + foreach($docNames as $doc) + { + $result = $this->AkteModel->getAktenFAS($person_id, $doc, $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) + { + array_push($arrayAccepted, $value); + } + } + } + + //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; + } + + $mergedArray[] = $merged; + } + + $this->terminateWithSuccess($mergedArray); + } + + public function deleteZuordnung($prestudent_id, $dokument_kurzbz) + { + if(!$prestudent_id) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + + if (!is_numeric($prestudent_id)) + $this->terminateWithError($this->p->t('ui', 'error_valueNotNumeric', ['value' => 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + + if(!$dokument_kurzbz) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Dokument_kurzbz']), self::ERROR_TYPE_GENERAL); + + $result = $this->DokumentprestudentModel->delete( + [ + 'prestudent_id' => $prestudent_id, + 'dokument_kurzbz' => $dokument_kurzbz + ] + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function loadAkte($akte_id) + { + if (!$akte_id) + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Akte ID']), self::ERROR_TYPE_GENERAL); + + $this->AkteModel->addSelect('public.tbl_akte.*'); + $this->AkteModel->addSelect("CONCAT(public.tbl_person.vorname, ' ' , public.tbl_person.nachname) AS namePerson"); + $this->AkteModel->addJoin('public.tbl_person', 'person_id'); + $result = $this->AkteModel->loadWhere( + [ + 'akte_id' => $akte_id, + ] + ); + + $data = $this->getDataOrTerminateWithError($result); + $data = current($data); + $this->terminateWithSuccess($data); + } + + public function updateAkte() + { + $this->form_validation->set_rules('akte_id', 'Akte ID', 'required', [ + 'required' => $this->p->t('dokumente', 'err_updateNotAllowed') + ]); + + $this->form_validation->set_rules('dokument_kurzbz', 'Dokumenttyp', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Dokumenttyp']) + ]); + + $this->form_validation->set_rules('nachreichung_am', 'Nachreichung am', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Nachreichung am']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $uid = getAuthUID(); + + $result = $this->AkteModel->update( + [ + 'akte_id' => $this->input->post('akte_id'), + ], + [ + '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'), + 'updateamum' => date('c'), + 'updatevon' => $uid, + ] + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function createZuordnung($prestudent_id, $dokument_kurzbz) + { + if (!$prestudent_id) + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + + if(!$dokument_kurzbz) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Dokument_kurzbz']), self::ERROR_TYPE_GENERAL); + + $uid = getAuthUid(); + + //check if more than 1 dokumentkurzbz + //if() + + $result = $this->DokumentprestudentModel->insert( + [ + 'prestudent_id' => $prestudent_id, + 'dokument_kurzbz' => $dokument_kurzbz, + 'mitarbeiter_uid' => $uid, + 'datum' => date('c'), + 'insertamum' => date('c'), + 'insertvon' => $uid, + ] + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function deleteAkte($akte_id) + { + if (!$akte_id) + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Akte ID']), self::ERROR_TYPE_GENERAL); + + $result = $this->AkteModel->load($akte_id); + $dataAkte = $this->getDataOrTerminateWithError($result); + + $logdata_akte = var_export($dataAkte, true); + + $dms_id = current($dataAkte)->dms_id; + $nachgereicht = current($dataAkte)->nachgereicht; + $inhalt = current($dataAkte)->inhalt; + $inhaltVorhanden = $inhalt != ''; + $uid = getAuthUid(); + + $this->db->trans_start(); + + if($dms_id) + { + $this->load->model('content/Dms_model', 'DmsModel'); + $result = $this->DmsModel->load($dms_id); + $data = $this->getDataOrTerminateWithError($result); + + $logdata_dms = (array)$data; + $logdata_dms = "Logdata: " . var_export($logdata_dms, true); + + //delete from dmsLib + $this->load->library('DmsLib'); + $person_id = current($dataAkte)->person_id; + $result = $this->dmslib->delete($person_id, $dms_id); + $this->getDataOrTerminateWithError($result); + + //LOGGING Dms ID + $this->load->model('system/Log_model', 'LogModel'); + $result = $this->LogModel->insert([ + 'executetime' => date('c'), + 'mitarbeiter_uid' => $uid, + 'beschreibung' => "Löschen der DMS_ID ". $dms_id, + 'sql' => $logdata_dms + ]); + $this->getDataOrTerminateWithError($result); + + //delete akte + $result = $this->AkteModel->delete( + [ + 'akte_id' => $akte_id + ] + ); + $data = $this->getDataOrTerminateWithError($result); + + //Logging Deletion Akte + $result = $this->LogModel->insert([ + 'executetime' => date('c'), + 'mitarbeiter_uid' => $uid, + 'beschreibung' => "Löschen der Akte ". $akte_id, + 'sql' => "DELETE FROM public.tbl_akte WHERE akte_id=" .$akte_id. " LogData: ". $logdata_akte + ]); + $this->getDataOrTerminateWithError($result); + $this->db->trans_complete(); + $this->terminateWithSuccess($data); + } + elseif (!!$dms_id || ($nachgereicht && !$inhaltVorhanden)) + { + $result = $this->AkteModel->delete( + [ + 'akte_id' => $akte_id + ] + ); + $data = $this->getDataOrTerminateWithError($result); + + $result = $this->LogModel->insert([ + 'executetime' => date('c'), + 'mitarbeiter_uid' => $uid, + 'beschreibung' => "Löschen der Akte ". $akte_id, + 'sql' => "DELETE FROM public.tbl_akte WHERE akte_id=" .$akte_id. " LogData: ". $logdata_akte + ]); + $this->getDataOrTerminateWithError($result); + + $this->db->trans_complete(); + $this->terminateWithSuccess($data); + } + else + $this->terminateWithError($this->p->t('dokumente', 'err_deleteDokHere'), self::ERROR_TYPE_GENERAL); + } + + public function uploadDokument() + { + $this->load->library('DmsLib'); + $prestudent_id = $this->input->post('prestudent_id'); + $anmerkung_intern = $this->input->post('anmerkung_intern'); + $titel_intern = $this->input->post('titel_intern'); + $dokument_kurzbz = $this->input->post('dokument_kurzbz'); + + $this->form_validation->set_rules('prestudent_id', 'Prestudent_id', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Prestudent ID']) + ]); + + $this->form_validation->set_rules('dokument_kurzbz', 'Dokumenttyp', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Dokumenttyp']) + ]); + + //validation if attachment was added + $this->form_validation->set_rules('anhang', 'Attachment', 'callback_file_check'); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $this->db->trans_start(); + $uid = getAuthUID(); + + $dms = array( + 'kategorie_kurzbz' => 'Akte', + 'version' => 0, + 'name' => $_FILES['anhang']['name'], + 'mimetype' => $_FILES['anhang']['type'], + 'insertamum' => date('c'), + 'insertvon' => $uid + ); + + $result = $this->dmslib->upload($dms, 'anhang', array("jpg", "png", "pdf")); + + if (isError($result)) + { + return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + $dms_id = $result->retval['dms_id']; + + $person_id = $this->_getPersonId($prestudent_id); + + $result = $this->DokumentModel->load($dokument_kurzbz); + $data = $this->getDataOrTerminateWithError($result); + + $bezeichnung = current($data)->bezeichnung; + + //save entry in akte + if($dms_id) + { + $result = $this->AkteModel->insert([ + 'person_id' => $person_id, + 'dms_id' => $dms_id, + 'dokument_kurzbz' => $dokument_kurzbz, + 'mimetype' => $_FILES['anhang']['type'], + 'insertamum' => date('c'), + 'erstelltam' => date('c'), + 'insertvon' => $uid, + 'anmerkung_intern' => $anmerkung_intern, + 'titel_intern' => $titel_intern, + 'bezeichnung' => $bezeichnung, + 'titel' => $_FILES['anhang']['name'] + ]); + + $data = $this->getDataOrTerminateWithError($result); + $this->db->trans_complete(); + $this->terminateWithSuccess($data); + } + $this->db->trans_complete(); + $this->terminateWithSuccess($data); + } + + public function getDoktypen() + { + $this->DokumentModel->addSelect('dokument_kurzbz'); + $this->DokumentModel->addSelect('bezeichnung'); + $this->DokumentModel->addOrder('dokument_kurzbz', 'ASC'); + $result = $this->DokumentModel->load(); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function download() + { + //TODO(Manu) check filetype, Decoding + $akte_id = $this->input->get('akte_id'); + + if(!$akte_id) + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Akte ID']), self::ERROR_TYPE_GENERAL); + + if (!is_numeric($akte_id)) + $this->terminateWithError($this->p->t('ui', 'error_valueNotNumeric', ['value' => 'Akte ID']), self::ERROR_TYPE_GENERAL); + + + $result = $this->AkteModel->load($akte_id); + if (!hasData($result)) $this->terminateWithError('Akte not found'); + $data = getData($result)[0]; + + $mimetype = $data->mimetype; + $filecontentbase64 = $data->inhalt; + $filename = $data->titel; + + if(intval($data->dms_id) > 0) + { + $dmsdokres = $this->dmslib->read($data->dms_id); + if (!hasData($dmsdokres)) $this->terminateWithError('DMS File not found'); + $dmsdok = getData($dmsdokres)[0]; + + $mimetype = $dmsdok->mimetype; + $filecontentbase64 = $dmsdok->file_content; + $filename = $dmsdok->name; + } + + $filecontent = ''; + + if (!empty($filecontentbase64)) { + $filecontent = base64_decode($filecontentbase64, true); + + if ($filecontent === false) { + $this->terminateWithError('Base64-Dekodierung failed.'); + } + } + + $this->terminateWithFileOutput($mimetype, $filecontent, $filename); + } + + private function _getMissingDocuments($studiengang_kz, $prestudent_id) + { + $result = $this->DokumentModel->getMissingDocuments($studiengang_kz, $prestudent_id); + + $data = $this->getDataOrTerminateWithError($result); + + return $data; + } + + private function _getUnacceptedDocuments($prestudent_id) + { + $person_id = $this->_getPersonId($prestudent_id); + $result = $this->DokumentModel->getUnacceptedDocuments($prestudent_id, $person_id); + + $data = $this->getDataOrTerminateWithError($result); + + return $data; + } + + /** + * helper function for merging objects + * sorts object after merging according to dokument_kurzbz + * @param $original object of documents of akte + * @param object $toMerge documents to merge (of dokumentprestudent, dokumentstudiengang) + * @return Array mergedObject + */ + private function _mergeDocuments($original, $toMerge) + { + $existingKurzbez = []; + foreach ($original as $doc) { + $existingKurzbez[$doc->dokument_kurzbz] = true; + } + + foreach ($toMerge as $doc) { + if (!isset($existingKurzbez[$doc->dokument_kurzbz])) { + $original[] = $doc; + $existingKurzbez[$doc->dokument_kurzbz] = true; + } + else + { + foreach($original as $docOriginal) + { + if ($docOriginal->dokument_kurzbz == $doc->dokument_kurzbz) + { + $docOriginal->pflicht = $doc->pflicht; + $docOriginal->onlinebewerbung = $doc->onlinebewerbung; + } + } + } + } + + usort($original, function ($a, $b) { + return strcmp($a->dokument_kurzbz, $b->dokument_kurzbz); + }); + + return $original; + } + + private function _getDocumentsOfAkte($person_id) + { + $result = $this->AkteModel->getAktenFAS($person_id); + + $data = $this->getDataOrTerminateWithError($result); + + return $data; + } + + private function _getPrestudentDokumente($prestudent_id) + { + $result = $this->DokumentprestudentModel->getPrestudentDokumente($prestudent_id); + + $data = $this->getDataOrTerminateWithError($result); + + return $data; + } + + private function _getPersonId($prestudent_id) + { + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + $result = $this->PrestudentModel->loadWhere( + ['prestudent_id' => $prestudent_id] + ); + + $data = $this->getDataOrTerminateWithError($result); + $person = current($data); + + return $person->person_id; + } + + public function file_check($str) + { + if (isset($_FILES['anhang']) && $_FILES['anhang']['size'] > 0) + { + $allowed_mime_types = ['image/jpeg', 'image/png', 'application/pdf']; + $mime = mime_content_type($_FILES['anhang']['tmp_name']); + + if (in_array($mime, $allowed_mime_types)) + { + return true; + } else + { + $this->form_validation->set_message('file_check', $this->p->t('dokumente', 'error_fileType')); + return false; + } + } + else + { + $this->form_validation->set_message('file_check', $this->p->t('dokumente', 'error_fileMissing')); + return false; + } + } + + public function getDocumentDropDown($prestudent_id, $studiensemester_kurzbz, $studiengang_kz) + { + $this->load->helper('hlp_common'); + //permission to create also odt, and doc outputs of certain documents(menu abschlusspruefung) + $hasPermissionOutputformat = $this->permissionlib->isBerechtigt('system/change_outputformat', 's'); + + if (!$prestudent_id) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Prestudent_id']), self::ERROR_TYPE_GENERAL); + if (!$studiensemester_kurzbz) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiensemester']), self::ERROR_TYPE_GENERAL); + if(!$studiengang_kz) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL); + + + $uid = $this->_loadUIDFromPrestudent($prestudent_id); + $semArray = $this->_getEntriesStudiensemester(); + $stgTyp = $this->_getStudiengangstyp($studiengang_kz); + + $documents = [ + buildDropdownEntryPrintArray("accountinfo", "Accountinfoblatt", "xml=accountinfoblatt.xml.php&xsl=AccountInfo&output=pdf", $uid, 10, null), + buildDropdownEntryPrintArray("ausbildungsvertrag", "Ausbildungsvertrag", "xml=ausbildungsvertrag.xml.php&xsl=Ausbildungsver&output=pdf&prestudent_id=$prestudent_id", null,20, null), + buildDropdownEntryPrintArray("ausbildungsvertrag_en", "Ausbildungsvertrag Zweisprachig", "xml=ausbildungsvertrag.xml.php&xsl=AusbVerEng&output=pdf&prestudent_id=$prestudent_id", null,21, null), + + buildDropdownEntryPrintArray("bescheid", "Bescheid (nur Voransicht)", "xml=abschlusspruefung.rdf.php&xsl_stg_kz=$studiengang_kz&xsl=Bescheid&output=pdf", $uid, 25, null), + buildDropdownEntryPrintArray("diplomasupp", "Diploma Supplement (nur Voransicht)", "xml=diplomasupplement.xml.php&xsl_stg_kz=$studiengang_kz&xsl=DiplSupplement&output=pdf", $uid, 26, null), + + buildDropdownEntryPrintArray("studienbestaetigung", "Studienbestätigung", "xml=student.rdf.php&xsl=Inskription&output=pdf&ss=$studiensemester_kurzbz&xsl_stg_kz=$studiengang_kz", $uid, 50, null), + buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf&ss=$studiensemester_kurzbz&xsl_stg_kz=$studiengang_kz", $uid, 51, null), + buildDropdownEntryPrintArray("zutrittskarte", "Zutrittskarte", "xsl=ZutrittskarteStud&output=pdf&data=$uid", $uid,200, "zutrittskarte.php"), + buildDropdownEntryPrintArray("studienblatt", "Studienblatt", "xml=studienblatt.xml.php&xsl=Studienblatt&output=pdf&ss=$studiensemester_kurzbz", $uid, 60, null), + buildDropdownEntryPrintArray("studienblatt_eng", "Studienblatt Englisch", "xml=studienblatt.xml.php&xsl=StudienblattEng&output=pdf&ss=$studiensemester_kurzbz", $uid, 61, null), + + $this->buildStudienerfolgSubmenu("de", $uid, $semArray, $studiensemester_kurzbz), + $this->buildStudienerfolgSubmenu("en", $uid, $semArray, $studiensemester_kurzbz), + $this->buildStudienerfolgSubmenu("de", $uid, $semArray, $studiensemester_kurzbz, true), + $this->buildStudienerfolgSubmenu("en", $uid, $semArray, $studiensemester_kurzbz, true), + + [ + "id" => "submenu_studstatus", + "type" => "submenu", + "name" => "Verwaltung des StudierendenStatus", + "order" => 110, + "data" => [ + buildDropdownEntryPrintArray("Abmeldung", "Abmeldung", "xml=AntragAbmeldung.xml.php&xsl=AntragAbmeldung&prestudent_id=$prestudent_id&output=pdf", $uid, null, null), + buildDropdownEntryPrintArray("Abmeldung durch Stgl", "AntragAbmeldungStgl", "xml=AntragAbmeldungStgl.xml.php&xsl=AntragAbmeldungStgl&prestudent_id=$prestudent_id&output=pdf", $uid, null, null), + buildDropdownEntryPrintArray("Unterbrechung", "Unterbrechung", "xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&prestudent_id=$prestudent_id&output=pdf", $uid, null, null), + buildDropdownEntryPrintArray("Wiederholung", "Abmeldung durch Ablauf der Wiederholungsfrist", "xml=AntragWiederholung.xml.php&xsl=AntragWiederholung&prestudent_id=$prestudent_id&output=pdf", $uid, null, null), + ] + ], + + //Bakkzeugnis bzw. Diplomzeugnis is just shown in tab final_exam + buildDropdownEntryPrintArray("zeugnis", "Zeugnis", "xml=zeugnis.rdf.php&xsl=Zeugnis&output=pdf&xsl_stg_kz=$studiengang_kz&ss=$studiensemester_kurzbz", $uid, 121, null), + buildDropdownEntryPrintArray("zeugnis_en", "Zeugnis Englisch", "xml=zeugnis.rdf.php&xsl=ZeugnisEng&output=pdf&xsl_stg_kz=$studiengang_kz&ss=$studiensemester_kurzbz", $uid, 122, null), + + + ]; + + Events::trigger('DocumentGenerationDropDown', + // passing $menu per reference + function & () use (&$documents) { + return $documents; + }, + $prestudent_id, + $studiensemester_kurzbz, + $studiengang_kz + ); + + $extraEntries = $this->loadDropDownEntriesBakkOrDipl($stgTyp, $uid); + + $documents = array_merge($documents, $extraEntries); + + usort($documents, function ($a, $b) { + $orderA = isset($a['order']) ? (int)$a['order'] : PHP_INT_MAX; + $orderB = isset($b['order']) ? (int)$b['order'] : PHP_INT_MAX; + return $orderA <=> $orderB; + }); + + $this->terminateWithSuccess($documents); + //return $documents || null; + } + + public function getDocumentDropDownMulti($studiensemester_kurzbz,$studiengang_kz) + { + //permission to create also odt, and doc outputs of certain documents (menu abschlusspruefung) + $hasPermissionOutputformat = $this->permissionlib->isBerechtigt('system/change_outputformat', 's'); + + $studentUids = $this->input->get('studentUids'); + $prestudentIds = []; + + if (is_array($studentUids) && !empty($studentUids)) { + foreach ($studentUids as $uid) { + $prestudent_id = $this-> _loadPrestudentFromUid($uid); + $prestudentIds[] = $prestudent_id; + } + } + else + { + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Array StudentUIDs']), self::ERROR_TYPE_GENERAL); + } + + if (!$studiensemester_kurzbz) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiensemester']), self::ERROR_TYPE_GENERAL); + if(!$studiengang_kz) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL); + + + $uidString = implode(";", $studentUids); + $prestudentIdsString = implode(";", $prestudentIds); + + $semArray = $this->_getEntriesStudiensemester(); + $stgTyp = $this->_getStudiengangstyp($studiengang_kz); + + $documents = [ + buildDropdownEntryPrintArray("accountinfo", "Accountinfoblatt", "xml=accountinfoblatt.xml.php&xsl=AccountInfo&output=pdf", $uidString, 10, null), + buildDropdownEntryPrintArray("ausbildungsvertrag", "Ausbildungsvertrag", "xml=ausbildungsvertrag.xml.php&xsl=Ausbildungsver&output=pdf", $uidString, 20, null), + buildDropdownEntryPrintArray("ausbildungsvertrag_en", "Ausbildungsvertrag Englisch", "xml=ausbildungsvertrag.xml.php&xsl=AusbVerEng&output=pdf", $uidString, 21, null), + buildDropdownEntryPrintArray("studienbestaetigung", "Studienbestätigung", "xml=student.rdf.php&xsl=Inskription&output=pdf&ss=$studiensemester_kurzbz&xsl_stg_kz=$studiengang_kz", $uidString, 50, null), + buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf&ss=$studiensemester_kurzbz&xsl_stg_kz=$studiengang_kz", $uidString, 51, null), + buildDropdownEntryPrintArray("zutrittskarte", "Zutrittskarte", "xsl=ZutrittskarteStud&output=pdf&data=$uidString", $uidString,200, "zutrittskarte.php"), + buildDropdownEntryPrintArray("studienblatt", "Studienblatt", "xml=studienblatt.xml.php&xsl=Studienblatt&output=pdf&ss=$studiensemester_kurzbz", $uidString, 60, null), + buildDropdownEntryPrintArray("studienblatt_eng", "Studienblatt Englisch", "xml=studienblatt.xml.php&xsl=StudienblattEng&output=pdf&ss=$studiensemester_kurzbz", $uidString, 61, null), + + // Studienerfolg Menüs automatisch + $this->buildStudienerfolgSubmenu("de", $uidString, $semArray, $studiensemester_kurzbz), + $this->buildStudienerfolgSubmenu("en", $uidString, $semArray, $studiensemester_kurzbz), + $this->buildStudienerfolgSubmenu("de", $uidString, $semArray, $studiensemester_kurzbz, true), + $this->buildStudienerfolgSubmenu("en", $uidString, $semArray, $studiensemester_kurzbz, true), + + [ + "id" => "submenu_studstatus", + "type" => "submenu", + "name" => "Verwaltung des StudierendenStatus", + "order" => 110, + "data" => [ + buildDropdownEntryPrintArray("Abmeldung", "Abmeldung", "xml=AntragAbmeldung.xml.php&xsl=AntragAbmeldung&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null), + buildDropdownEntryPrintArray("Abmeldung durch Stgl", "AntragAbmeldungStgl", "xml=AntragAbmeldungStgl.xml.php&xsl=AntragAbmeldungStgl&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null), + buildDropdownEntryPrintArray("Unterbrechung", "Unterbrechung", "xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null), + buildDropdownEntryPrintArray("Wiederholung", "Abmeldung durch Ablauf der Wiederholungsfrist", "xml=AntragWiederholung.xml.php&xsl=AntragWiederholung&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null), + ] + ], + + buildDropdownEntryPrintArray("diplomasupp", "Diploma Supplement (nur Voransicht)", "xml=diplomasupplement.xml.php&xsl_stg_kz=$studiengang_kz&xsl=DiplSupplement&output=pdf", $uidString, 35, null), + buildDropdownEntryPrintArray("zeugnis", "Zeugnis", "xml=zeugnis.rdf.php&xsl=Zeugnis&output=pdf&xsl_stg_kz=$studiengang_kz&ss=$studiensemester_kurzbz", $uidString, 121, null), + buildDropdownEntryPrintArray("zeugnis_en", "Zeugnis Englisch", "xml=zeugnis.rdf.php&xsl=ZeugnisEng&output=pdf&xsl_stg_kz=$studiengang_kz&ss=$studiensemester_kurzbz", $uidString, 122, null), + ]; + + Events::trigger('DocumentGenerationDropDownMulti', + // passing $menu per reference + function & () use (&$documents) { + return $documents; + }, + $studentUids, + $studiensemester_kurzbz, + $studiengang_kz + ); + + $extraEntries = $this->loadDropDownEntriesBakkOrDipl($stgTyp, $uidString); + + $documents = array_merge($documents, $extraEntries); + + usort($documents, function ($a, $b) { + $orderA = isset($a['order']) ? (int)$a['order'] : PHP_INT_MAX; + $orderB = isset($b['order']) ? (int)$b['order'] : PHP_INT_MAX; + return $orderA <=> $orderB; + }); + + + $this->terminateWithSuccess($documents); + + return $documents || null; + } + + private function _loadUIDFromPrestudent($prestudent_id) + { + if(!$prestudent_id){ + return $this->terminateWithError("no prestudent ID received."); + } + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->loadWhere( + ['prestudent_id' => $prestudent_id] + ); + + $data = $this->getDataOrTerminateWithError($result); + $student = current($data); + + return $student->student_uid; + } + + private function _loadPrestudentFromUid($studentUid) + { + + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->loadWhere( + ['student_uid' => $studentUid] + ); + + $data = $this->getDataOrTerminateWithError($result); + $student = current($data); + + + return $student->prestudent_id; + } + + /** + * is building an array with studiensemesterkurzb + * actual studiensemester plus the 5 studiensemester in the past + + * @return Array Studiensemester_kurzbz + */ + private function _getEntriesStudiensemester(){ + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $this->StudiensemesterModel->addPlusMinus(1, 5); + $this->StudiensemesterModel->addOrder('ende', 'DESC'); + $result = $this->StudiensemesterModel->load(); + $data = $this->getDataOrTerminateWithError($result); + + foreach($data as $sem) + { + $semArray[] = $sem->studiensemester_kurzbz; + } + + array_shift($semArray); + + return $semArray; + } + /** + * is returning the typ of Studiengang (Bakk oder Master) + + * @return character eg. 'b' or 'm' + */ + private function _getStudiengangstyp($studiengang_kz) + { + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $result = $this->StudiengangModel->loadWhere( + array('studiengang_kz' => $studiengang_kz) + ); + $data = $this->getDataOrTerminateWithError($result); + + $typStudiengang = current($data)->typ; + + return $typStudiengang; + } + + /** + * helper function to create ArrayStructure + * actual studiensemester plus the 5 studiensemester in the past + + * @return Array Studiensemester_kurzbz + */ + private function buildStudienerfolgSubmenu($lang, $uid, $semArray, $studiensemester_kurzbz, $fa = false) + { + $entries = []; + + $xsl = $lang === "de" ? "Studienerfolg" : "StudienerfolgEng"; + $idPrefix = "submenu_studienerfolg_" . $lang . ($fa ? "_fa" : ""); + + $entries[] = buildDropdownEntryPrintArray( + $idPrefix . "_aktuell", + "ausgewähltes Semester", + "xml=studienerfolg.rdf.php&xsl=$xsl&ss=$studiensemester_kurzbz" . ($fa ? "&typ=finanzamt" : ""), + $uid + ); + + //all semester + $entries[] = buildDropdownEntryPrintArray( + $idPrefix . "_all", + "alle Semester", + "xml=studienerfolg.rdf.php&xsl=$xsl&ss=$studiensemester_kurzbz&all=true" . ($fa ? "&typ=finanzamt" : ""), + $uid + ); + + //sem from array + foreach ($semArray as $i => $sem) { + $entries[] = buildDropdownEntryPrintArray( + $idPrefix . ($i === 0 ? "_akt" : "_minus" . $i), + $sem, + "xml=studienerfolg.rdf.php&xsl=$xsl&ss=$sem" . ($fa ? "&typ=finanzamt" : ""), + $uid + ); + + } + $order = 0; + if ($lang === "de" && !$fa) $order = 75; // Studienerfolg + if ($lang === "en" && !$fa) $order = 76; // Studienerfolg Englisch + if ($lang === "de" && $fa) $order = 77; // Studienerfolg Finanzamt + if ($lang === "en" && $fa) $order = 78; // Studienerfolg Finanzamt Englisch + + return [ + "id" => $idPrefix, + "type" => "submenu", + "name" => "Studienerfolg " . ($fa ? " Finanzamt" : "") . ($lang === "de" ? "" : "Englisch") , + "order" => $order, + "data" => $entries, + ]; + } + + private function loadDropDownEntriesFinalExam($hasPermissionOutputformat, $stgTyp, $uid) + { + if ($stgTyp == 'b') + $postfix = 'Bakk'; + else if ($stgTyp == 'm' || $stgTyp == 'd') + $postfix = 'Master'; + else + return []; + + $arrayFinalExam = [ + 'pruefungsprotokoll' => [ + 'de' => [ + 'Bakk' => 'PrProtBA', + 'Master' => 'PrProtMA', + ], + 'en' => [ + 'Bakk' => 'PrProtBAEng', + 'Master' => 'PrProtMAEng', + ], + ], + 'pruefungszeugnis' => [ + 'de' => [ + 'Bakk' => 'Bakkzeugnis', + 'Master' => 'Diplomzeugnis', + ], + 'en' => [ + 'Bakk' => 'BakkzeugnisEng', + 'Master' => 'DiplomzeugnisEng', + ], + ], + 'urkunde' => [ + 'de' => [ + 'Bakk' => 'Bakkurkunde', + 'Master' => 'Diplomurkunde', + ], + 'en' => [ + 'Bakk' => 'BakkurkundeEng', + 'Master' => 'DiplomurkundeEng', + ], + ], + ]; + + $langLabels = [ + "de" => "Deutsch", + "en" => "Englisch" + ]; + + $docLabels = [ + "pruefungsprotokoll" => "Prüfungsprotokoll", + "pruefungszeugnis" => "Zeugnis", + "urkunde" => "Urkunde" + ]; + + $submenuData = []; + if ($hasPermissionOutputformat) { + foreach ($arrayFinalExam as $docType => $langs) { + foreach ($langs as $lang => $types) { + $xsl = $types[$postfix]; + $idPrefix = $docType . "_" . $lang; + + $baseName = $docLabels[$docType] . " " . $langLabels[$lang]; + $baseUrl = "xml=abschlusspruefung.rdf.php&xsl={$xsl}"; + + //3 outputformates + foreach (["pdf", "odt", "docx"] as $format) { + $submenuData[] = buildDropdownEntryPrintArray( + $idPrefix . "_" . $format, + $baseName . " (" . strtoupper($format) . ")", + $baseUrl . "&output=" . $format, + $uid + ); + } + } + } + } + else + { + foreach ($arrayFinalExam as $docType => $langs) { + foreach ($langs as $lang => $types) { + $xsl = $types[$postfix]; // Auswahl Bakk/Master für jeweilige Sprache + $id = $docType . "_" . $lang; + + $name = $docLabels[$docType] . " " . $langLabels[$lang]; + + $url = "xml=abschlusspruefung.rdf.php&xsl=" . $xsl . "&output=pdf"; + + $submenuData[] = buildDropdownEntryPrintArray($id, $name, $url, $uid); + } + } + } + return [ + "id" => "submenu_finalexam", + "type" => "submenu", + "name" => "Abschlussprüfung", + "data" => $submenuData, + "order" => null, + "order" => 80, + ]; + } + + private function loadDropDownEntriesBakkOrDipl($stgTyp, $uid) + { + $entries = []; + + if ($stgTyp == 'b') + { + $entries[] = buildDropdownEntryPrintArray("bakkurkunde", "Bakkurkunde", "xml=abschlusspruefung.rdf.php&xsl=Bakkurkunde&output=pdf", $uid, 22, null); + $entries[] = buildDropdownEntryPrintArray("bakkurkundeEng", "Bakkurkunde Englisch", "xml=abschlusspruefung.rdf.php&xsl=BakkurkundeEng&output=pdf", $uid, 23, null); + } + + if ($stgTyp == 'm' || $stgTyp == 'd') + { + $entries[] = buildDropdownEntryPrintArray("diplomurkunde", "Diplomurkunde", "xml=abschlusspruefung.rdf.php&xsl=Diplomurkunde&output=pdf", $uid, 27, null); + $entries[] = buildDropdownEntryPrintArray("diplomurkundeEng", "Diplomurkunde Englisch", "xml=abschlusspruefung.rdf.php&xsl=DiplomurkundeEng&output=pdf", $uid, 28, null); + } + + return $entries; + } + +} diff --git a/application/controllers/api/frontend/v1/stv/Favorites.php b/application/controllers/api/frontend/v1/stv/Favorites.php index b8fe6f3d7..951eb01a4 100644 --- a/application/controllers/api/frontend/v1/stv/Favorites.php +++ b/application/controllers/api/frontend/v1/stv/Favorites.php @@ -35,8 +35,6 @@ class Favorites extends FHCAPI_Controller // Load models $this->load->model('system/Variable_model', 'VariableModel'); - - // TODO(chris): variable table might be to small to store favorites! } public function index() diff --git a/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php b/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php new file mode 100644 index 000000000..8f3d6419a --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php @@ -0,0 +1,287 @@ + ['admin:r', 'assistenz:r'], + 'loadStudie' => ['admin:r', 'assistenz:r'], + 'insertStudie' => ['admin:rw', 'assistenz:rw'], + 'updateStudie' => ['admin:rw', 'assistenz:rw'], + 'deleteStudie' => ['admin:rw', 'assistenz:rw'], + 'getProgramsStudien' => ['admin:r', 'assistenz:r'], + 'getTypenMobility' => ['admin:r', 'assistenz:r'], + 'getStudiensemester' => ['admin:r', 'assistenz:r'], + 'getStudienprogramme' => ['admin:r', 'assistenz:r'], + 'getPartnerfirmen' => ['admin:r', 'assistenz:r'], + 'getStatiPrestudent' => ['admin:r', 'assistenz:r'], + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('form_validation'); + + // Load language phrases + $this->loadPhrases([ + 'ui', + 'jointstudies' + ]); + + // Load models + $this->load->model('codex/Mobilitaet_model', 'MobilitaetModel'); + + //TODO(check if additional Permissions necessary): 'student/stammdaten' + } + + public function getStudien($prestudent_id) + { + $this->MobilitaetModel->addSelect('mobilitaet_id'); + $this->MobilitaetModel->addSelect('mobilitaetstyp_kurzbz'); + $this->MobilitaetModel->addSelect('prestudent_id'); + $this->MobilitaetModel->addSelect('studiensemester_kurzbz'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.mobilitaetsprogramm_code'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.gsprogramm_id'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.firma_id'); + $this->MobilitaetModel->addSelect('status_kurzbz'); + $this->MobilitaetModel->addSelect('ausbildungssemester'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.insertvon'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.insertamum'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.updatevon'); + $this->MobilitaetModel->addSelect('bis.tbl_mobilitaet.updateamum'); + $this->MobilitaetModel->addSelect('mp.kurzbz'); + $this->MobilitaetModel->addSelect('gp.gsprogrammtyp_kurzbz'); + $this->MobilitaetModel->addSelect('gp.bezeichnung as studienprogramm'); + $this->MobilitaetModel->addSelect('f.name as partner'); + + $this->MobilitaetModel->addJoin('bis.tbl_mobilitaetsprogramm mp', 'ON (mp.mobilitaetsprogramm_code = bis.tbl_mobilitaet.mobilitaetsprogramm_code)', 'LEFT'); + $this->MobilitaetModel->addJoin('bis.tbl_gsprogramm gp', 'ON (gp.gsprogramm_id = bis.tbl_mobilitaet.gsprogramm_id)', 'LEFT'); + $this->MobilitaetModel->addJoin('public.tbl_firma f', 'ON (f.firma_id = bis.tbl_mobilitaet.firma_id)', 'LEFT'); + + $result = $this->MobilitaetModel->loadWhere([ + 'prestudent_id' => $prestudent_id, + ]); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function getTypenMobility() + { + $this->load->model('codex/Mobilitaetstyp_model', 'MobilitaetstypModel'); + + $result = $this->MobilitaetstypModel->load(); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function getStudiensemester() + { + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $this->StudiensemesterModel->addOrder('start', 'DESC'); + $result = $this->StudiensemesterModel->load(); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function getStudienprogramme() + { + $this->load->model('codex/Gsprogramm_model', 'GsprogrammModel'); + + $result = $this->GsprogrammModel->load(); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function getPartnerfirmen() + { + $this->load->model('ressource/Firma_model', 'FirmaModel'); + + $result = $this->FirmaModel->loadWhere( + ['partner_code !=' => null] + ); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function getStatiPrestudent() + { + $this->load->model('crm/Status_model', 'StatusModel'); + + $result = $this->StatusModel->load(); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function loadStudie($mobilitaet_id) + { + $result = $this->MobilitaetModel->load($mobilitaet_id); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess(current($data)); + } + + public function insertStudie() + { + $this->load->library('form_validation'); + $authUID = getAuthUID(); + + $prestudent_id = $this->input->post('prestudent_id'); + if(!$prestudent_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + $ausbildungssemester = (isset($formData['ausbildungssemester']) && !empty($formData['ausbildungssemester'])) + ? $formData['ausbildungssemester'] + : null; + $mobilitaetstyp_kurzbz = (isset($formData['mobilitaetstyp_kurzbz']) && !empty($formData['mobilitaetstyp_kurzbz'])) + ? $formData['mobilitaetstyp_kurzbz'] + : null; + $studiensemester_kurzbz = (isset($formData['studiensemester_kurzbz']) && !empty($formData['studiensemester_kurzbz'])) + ? $formData['studiensemester_kurzbz'] : null; + + $this->form_validation->set_data($formData); + + $this->form_validation->set_rules('mobilitaetstyp_kurzbz', 'Typ', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) + ]); + + $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Studiensemester']) + ]); + + $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'required|numeric', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Ausbildungssemester']), + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ausbildungssemester']), + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $status_kurzbz = (isset($formData['status_kurzbz']) && !empty($formData['status_kurzbz'])) + ? $formData['status_kurzbz'] + : null; + $mobilitaetsprogramm_code = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) + ? $formData['mobilitaetsprogramm_code'] + : null; + $gsprogramm_id = (isset($formData['gsprogramm_id']) && !empty($formData['gsprogramm_id'])) + ? $formData['gsprogramm_id'] + : null; + $firma_id= (isset($formData['firma_id']) && !empty($formData['firma_id'])) ? $formData['firma_id'] : null; + + $result = $this->MobilitaetModel->insert([ + 'prestudent_id' => $prestudent_id, + 'mobilitaetstyp_kurzbz' =>$mobilitaetstyp_kurzbz, + 'status_kurzbz' => $status_kurzbz, + 'studiensemester_kurzbz' =>$studiensemester_kurzbz, + 'mobilitaetsprogramm_code' => $mobilitaetsprogramm_code, + 'gsprogramm_id' => $gsprogramm_id, + 'firma_id' => $firma_id, + 'ausbildungssemester' =>$ausbildungssemester, + 'insertvon' => $authUID, + 'insertamum' => date('c'), + ]); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function updateStudie() + { + $this->load->library('form_validation'); + $authUID = getAuthUID(); + + $prestudent_id = $this->input->post('prestudent_id'); + if(!$prestudent_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + + $mobilitaet_id = (isset($formData['mobilitaet_id']) && !empty($formData['mobilitaet_id'])) + ? $formData['mobilitaet_id'] : + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Mobilitaet ID']), self::ERROR_TYPE_GENERAL); + $ausbildungssemester = (isset($formData['ausbildungssemester']) && !empty($formData['ausbildungssemester'])) + ? $formData['ausbildungssemester'] + : null; + $mobilitaetstyp_kurzbz = (isset($formData['mobilitaetstyp_kurzbz']) && !empty($formData['mobilitaetstyp_kurzbz'])) + ? $formData['mobilitaetstyp_kurzbz'] + : null; + $studiensemester_kurzbz = (isset($formData['studiensemester_kurzbz']) && !empty($formData['studiensemester_kurzbz'])) + ? $formData['studiensemester_kurzbz'] + : null; + + $this->form_validation->set_data($formData); + + $this->form_validation->set_rules('mobilitaetstyp_kurzbz', 'Typ', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) + ]); + + $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Studiensemester']) + ]); + + $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'required|numeric', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Ausbildungssemester']), + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ausbildungssemester']), + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $status_kurzbz = (isset($formData['status_kurzbz']) && !empty($formData['status_kurzbz'])) ? $formData['status_kurzbz'] : null; + $mobilitaetsprogramm_code = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) + ? $formData['mobilitaetsprogramm_code'] + : null; + $gsprogramm_id = (isset($formData['gsprogramm_id']) && !empty($formData['gsprogramm_id'])) + ? $formData['gsprogramm_id'] + : null; + $firma_id= (isset($formData['firma_id']) && !empty($formData['firma_id'])) ? $formData['firma_id'] : null; + + $result = $this->MobilitaetModel->update( + [ + 'mobilitaet_id' => $mobilitaet_id, + ], + [ + 'prestudent_id' => $prestudent_id, + 'mobilitaetstyp_kurzbz' => $mobilitaetstyp_kurzbz, + 'status_kurzbz' => $status_kurzbz, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'mobilitaetsprogramm_code' => $mobilitaetsprogramm_code, + 'gsprogramm_id' => $gsprogramm_id, + 'firma_id' => $firma_id, + 'ausbildungssemester' => $ausbildungssemester, + 'updatevon' => $authUID, + 'updateamum' => date('c'), + ] + ); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function deleteStudie($mobilitaet_id) + { + if(!$mobilitaet_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Mobilität ID']), self::ERROR_TYPE_GENERAL); + } + $result = $this->MobilitaetModel->delete( + array('mobilitaet_id' => $mobilitaet_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } +} diff --git a/application/controllers/api/frontend/v1/stv/Grades.php b/application/controllers/api/frontend/v1/stv/Grades.php index 61d797495..128316d2b 100644 --- a/application/controllers/api/frontend/v1/stv/Grades.php +++ b/application/controllers/api/frontend/v1/stv/Grades.php @@ -60,7 +60,8 @@ class Grades extends FHCAPI_Controller { $this->load->model('codex/Note_model', 'NoteModel'); - $this->NoteModel->addOrder('note'); + $this->NoteModel->addOrder('notenwert', 'ASC'); + $this->NoteModel->addOrder('bezeichnung', 'ASC'); $result = $this->NoteModel->load(); @@ -74,14 +75,15 @@ class Grades extends FHCAPI_Controller * (Entries in lehre.tbl_zeugnisnote) * * @param string $prestudent_id - * @param string|null $all (optional) If null only the current semesters grades will be loaded, otherwise all semesters grades will be loaded. + * @param string|null $studiensemester_kurzbz If studiensemester_kurzbz only this semesters grades will be loaded, otherwise all semesters grades will be loaded. * * @return void */ - public function getCertificate($prestudent_id, $all = null) + public function getCertificate($prestudent_id, $studiensemester_kurzbz = null) { $this->load->model('crm/Student_model', 'StudentModel'); $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); $result = $this->StudentModel->loadWhere([ 'prestudent_id' => $prestudent_id @@ -91,12 +93,13 @@ class Grades extends FHCAPI_Controller if (!$student) $this->terminateWithSuccess([]); - $student_uid = current($student)->student_uid; - $studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : null; + if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } - $result = $this->ZeugnisnoteModel->getZeugnisnoten($student_uid, $studiensemester_kurzbz); $grades = $this->getDataOrTerminateWithError($result); @@ -109,14 +112,15 @@ class Grades extends FHCAPI_Controller * (Entries in campus.tbl_lvgesamtnote) * * @param string $prestudent_id - * @param string|null $all (optional) If null only the current semesters grades will be loaded, otherwise all semesters grades will be loaded. + * @param string|null $studiensemester_kurzbz If studiensemester_kurzbz only this semesters grades will be loaded, otherwise all semesters grades will be loaded. * * @return void */ - public function getTeacherProposal($prestudent_id, $all = null) + public function getTeacherProposal($prestudent_id, $studiensemester_kurzbz = null) { $this->load->model('crm/Student_model', 'StudentModel'); $this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); $result = $this->StudentModel->loadWhere([ 'prestudent_id' => $prestudent_id @@ -129,9 +133,11 @@ class Grades extends FHCAPI_Controller $student_uid = current($student)->student_uid; - $studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : null; + if ($studiensemester_kurzbz !== null && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } - $result = $this->LvgesamtnoteModel->getLvGesamtNoten(null, $student_uid, $studiensemester_kurzbz); $grades = $this->getDataOrTerminateWithError($result); @@ -144,17 +150,20 @@ class Grades extends FHCAPI_Controller * or as not allowed because of the repeating of a semester. * * @param string $prestudent_id - * @param string|null $all (optional) If null only the current semesters grades will be loaded, otherwise all semesters grades will be loaded. + * @param string|false $studiensemester_kurzbz If studiensemester_kurzbz only this semesters grades will be loaded, otherwise all semesters grades will be loaded. * * @return void */ - public function getRepeaterGrades($prestudent_id, $all = null) + public function getRepeaterGrades($prestudent_id, $studiensemester_kurzbz = false) { + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); $this->load->library('AntragLib'); - $studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : false; + if ($studiensemester_kurzbz !== false && !$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } - $result = $this->antraglib->getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz); $grades = $this->getDataOrTerminateWithError($result); @@ -456,13 +465,19 @@ class Grades extends FHCAPI_Controller $this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer"); $this->form_validation->set_rules("points", $this->p->t("stv", "grades_points"), "required|numeric"); + $this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t("lehre", "studiensemester"), "required|regex_match[/^[WS]S[0-9]{4}$/]"); if (!$this->form_validation->run()) $this->terminateWithValidationErrors($this->form_validation->error_array()); - - $this->load->model('education/Notenschluesselaufteilung_model', 'NotenschluesselaufteilungModel'); - $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } + + $this->load->model('education/Notenschluesselaufteilung_model', 'NotenschluesselaufteilungModel'); $result = $this->NotenschluesselaufteilungModel->getNote( $this->input->post('points'), diff --git a/application/controllers/api/frontend/v1/stv/Gruppen.php b/application/controllers/api/frontend/v1/stv/Gruppen.php new file mode 100644 index 000000000..b10cfb328 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Gruppen.php @@ -0,0 +1,229 @@ + ['admin:rw', 'assistenz:rw'], + 'search' => ['admin:r', 'assistenz:r'], + 'getGruppen' => ['admin:r', 'assistenz:r'], + 'deleteGruppe' => ['admin:rw', 'assistenz:rw'], + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + + // Load language phrases + $this->loadPhrases([ + 'ui', + 'gruppenmanagement', + 'lehre' + ]); + + // Load models + $this->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel'); + $this->load->model('organisation/Gruppe_model', 'GruppeModel'); + } + + public function add() + { + $this->load->library("form_validation"); + + $this->form_validation->set_rules( + 'gruppe_kurzbz', + $this->p->t('gruppenmanagement', 'gruppe'), + 'required|is_in_db[organisation/Gruppe_model]', + [ + 'required' => $this->p->t('ui', 'error_fieldRequired'), + 'is_in_db' => $this->p->t('ui', 'error_fieldNotFound') + ] + ); + $this->form_validation->set_rules( + 'uid', + $this->p->t('ui', 'student_uid'), + 'required|is_in_db[crm/Student_model:student_uid]', + [ + 'required' => $this->p->t('ui', 'error_fieldRequired'), + 'is_in_db' => $this->p->t('ui', 'error_fieldNotFound') + ] + ); + $this->form_validation->set_rules( + 'studiensemester_kurzbz', + $this->p->t('lehre', 'studiensemester'), + 'required|is_in_db[organisation/Studiensemester_model]', + [ + 'required' => $this->p->t('ui', 'error_fieldRequired'), + 'is_in_db' => $this->p->t('ui', 'error_fieldNotFound') + ] + ); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $gruppe_kurzbz = $this->input->post('gruppe_kurzbz'); + $uid = $this->input->post('uid'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + + $result = $this->BenutzergruppeModel->load([ + $gruppe_kurzbz, + $uid + ]); + $benutzergruppe = $this->getDataOrTerminateWithError($result); + + if ($benutzergruppe) { + $this->terminateWithError( + $this->p->t('gruppenmanagement', 'error_alreadyInGroup', [ + 'uid' => $uid, + 'studiensemester_kurzbz' => current($benutzergruppe)->studiensemester_kurzbz + ]), + self::ERROR_TYPE_GENERAL + ); + } + + $result = $this->BenutzergruppeModel->insert([ + 'uid' => $uid, + 'gruppe_kurzbz' => $gruppe_kurzbz, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'insertamum' => date('c'), + 'insertvon' => getAuthUID() + ]); + + $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(); + } + + public function search() + { + $query = $this->input->post('query'); + if (!$query) + $this->terminateWithSuccess([]); + + // add query to where clause + $query = strtoupper($query); + $query = $this->GruppeModel->db->escape_like_str($query); + $query = '%' . str_replace(' ', '%', $query) . '%'; + + $this->GruppeModel->db->group_start(); + $this->GruppeModel->db->or_like('UPPER(gruppe_kurzbz)', $query, 'none', false); + $this->GruppeModel->db->or_like('UPPER(bezeichnung)', $query, 'none', false); + $this->GruppeModel->db->or_like('UPPER(beschreibung)', $query, 'none', false); + $this->GruppeModel->db->group_end(); + + // add stg sorting 1 + $studiengang_kz = $this->input->post('studiengang_kz'); + $sort_stg = $studiengang_kz ? "WHEN studiengang_kz = " . $this->GruppeModel->escape($studiengang_kz) . " THEN 0" : ""; + + // add stg sorting 2 + $studiengang_kzs = []; + $result = $this->permissionlib->getSTG_isEntitledFor('admin'); + if ($result) + $studiengang_kzs = array_merge($studiengang_kzs, $result); + $result = $this->permissionlib->getSTG_isEntitledFor('assistenz'); + if ($result) + $studiengang_kzs = array_merge($studiengang_kzs, $result); + + // selects + $this->GruppeModel->addSelect("*"); + $this->GruppeModel->addSelect("CASE + " . $sort_stg . " + WHEN studiengang_kz IN (" . implode(",", $this->GruppeModel->db->escape($studiengang_kzs)) . ") + THEN 1 + ELSE 2 + END AS sort_stg"); + + // ordering + $this->GruppeModel->addOrder("sort_stg"); + $this->GruppeModel->addOrder("sort"); + $this->GruppeModel->addOrder("gruppe_kurzbz"); + + // default where clause & execute + $result = $this->GruppeModel->loadWhere([ + 'lehre' => true, + 'sichtbar' => true, + 'aktiv' => true, + 'direktinskription' => false, + 'generiert' => false + ]); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getGruppen($student_uid) + { + $this->BenutzergruppeModel->addSelect('gruppe_kurzbz'); + $this->BenutzergruppeModel->addSelect('bezeichnung'); + $this->BenutzergruppeModel->addSelect('generiert'); + $this->BenutzergruppeModel->addSelect('uid'); + $this->BenutzergruppeModel->addSelect('studiensemester_kurzbz'); + $this->BenutzergruppeModel->addJoin('public.tbl_gruppe', 'gruppe_kurzbz'); + $this->BenutzergruppeModel->addOrder('bezeichnung', 'ASC'); + + $result = $this->BenutzergruppeModel->loadWhere( + array( + 'uid' => $student_uid + ) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function deleteGruppe() + { + $this->load->library("form_validation"); + + $this->form_validation->set_rules( + 'uid', + $this->p->t('person', 'UID'), + 'required', + [ + 'required' => $this->p->t('ui', 'error_fieldRequired') + ] + ); + + $this->form_validation->set_rules( + 'gruppe_kurzbz', + $this->p->t('gruppenmanagement', 'gruppe'), + 'required', + [ + 'required' => $this->p->t('ui', 'error_fieldRequired') + ] + ); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $uid = $this->input->post('uid'); + $gruppe_kurzbz = $this->input->post('gruppe_kurzbz'); + + // Validate if automatic group generation + $result = $this->GruppeModel->loadWhere([ + 'gruppe_kurzbz' => $gruppe_kurzbz + ]); + $data = $this->getDataOrTerminateWithError($result); + $generation = current($data); + + if ($generation->generiert) + { + $this->terminateWithError($this->p->t('gruppenmanagement', 'error_deleteGeneratedGroups'), self::ERROR_TYPE_GENERAL); + } + + $result = $this->BenutzergruppeModel->delete([ + 'gruppe_kurzbz' => $gruppe_kurzbz, + 'uid' => $uid + ]); + + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess($data); + } +} diff --git a/application/controllers/api/frontend/v1/stv/Kontakt.php b/application/controllers/api/frontend/v1/stv/Kontakt.php index fd16fff06..d246a04d9 100644 --- a/application/controllers/api/frontend/v1/stv/Kontakt.php +++ b/application/controllers/api/frontend/v1/stv/Kontakt.php @@ -28,7 +28,8 @@ class Kontakt extends FHCAPI_Controller 'getStandorte' => ['admin:r', 'assistenz:r'], 'getStandorteByFirma' => ['admin:r', 'assistenz:r'], 'getKontakte' => ['admin:r', 'assistenz:r'], - 'getBankverbindung' => ['mitarbeiter/bankdaten:r', 'student/bankdaten:r'] + 'getBankverbindung' => ['mitarbeiter/bankdaten:r', 'student/bankdaten:r'], + 'getAllFirmen' => ['admin:r', 'assistenz:r'] ]); // Load Libraries @@ -46,10 +47,12 @@ class Kontakt extends FHCAPI_Controller $this->load->model('organisation/standort_model', 'StandortModel'); $this->load->model('ressource/firma_model', 'FirmaModel'); $this->load->model('person/Kontakt_model', 'KontaktModel'); + $this->load->model('person/Kontakttyp_model', 'KontakttypModel'); // Extra Permissionchecks $permsMa = []; $permsStud = []; + $permsDefault = null; switch ($this->router->method) { case 'getBankverbindung': case 'loadBankverbindung': @@ -66,7 +69,7 @@ class Kontakt extends FHCAPI_Controller case 'getKontakte': case 'loadAddress': case 'loadContact': - $permsMa = $permsStud = ['admin:r', 'assistenz:r']; + $permsMa = $permsStud = $permsDefault = ['admin:r', 'assistenz:r']; break; case 'addNewAddress': case 'addNewContact': @@ -74,7 +77,7 @@ class Kontakt extends FHCAPI_Controller case 'updateContact': case 'deleteAddress': case 'deleteContact': - $permsMa = $permsStud = ['admin:rw', 'assistenz:rw']; + $permsMa = $permsStud = $permsDefault = ['admin:rw', 'assistenz:rw']; break; } if ($this->router->method == 'getAdressen' @@ -85,8 +88,11 @@ class Kontakt extends FHCAPI_Controller || $this->router->method == 'addNewBankverbindung' ) { $person_id = current(array_slice($this->uri->rsegments, 2)); - - $this->checkPermissionsForPerson($person_id, $permsMa, $permsStud); + + if (is_null($person_id) || !ctype_digit((string)$person_id)) + $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $this->checkPermissionsForPerson($person_id, $permsMa, $permsStud, $permsDefault); } elseif ($this->router->method == 'loadAddress' || $this->router->method == 'loadContact' || $this->router->method == 'loadBankverbindung' @@ -119,6 +125,9 @@ class Kontakt extends FHCAPI_Controller $model = 'person/Bankverbindung_model'; } + if (!isset($id) || !ctype_digit((string)$id)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + $this->load->model($model, 'TempModel'); $result = $this->TempModel->load($id); $data = $this->getDataOrTerminateWithError($result); @@ -127,7 +136,7 @@ class Kontakt extends FHCAPI_Controller $person_id = current($data)->person_id; - $this->checkPermissionsForPerson($person_id, $permsMa, $permsStud); + $this->checkPermissionsForPerson($person_id, $permsMa, $permsStud, $permsDefault); } } public function getAdressen($person_id) @@ -190,13 +199,7 @@ class Kontakt extends FHCAPI_Controller $name = isset($_POST['name']) ? $_POST['name'] : null; $typ = isset($_POST['typ']) ? $_POST['typ'] : null; $anmerkung = isset($_POST['anmerkung']) ? $_POST['anmerkung'] : null; - - if(isset($_POST['firma'])) - { - $firma_id = $_POST['firma']['firma_id']; - } - else - $firma_id = null; + $firma_id = isset($_POST['firma_id']) ? $_POST['firma_id'] : null; $result = $this->AdresseModel->insert( [ @@ -263,17 +266,6 @@ class Kontakt extends FHCAPI_Controller return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Adresse_id']), self::ERROR_TYPE_GENERAL); } - if(isset($_POST['firma'])) - { - $firma_id = $_POST['firma']['firma_id']; - } - elseif(isset($_POST['firma_id'])) - { - $firma_id = $_POST['firma_id']; - } - else - $firma_id = null; - $person_id = isset($_POST['person_id']) ? $_POST['person_id'] : null; $co_name = isset($_POST['co_name']) ? $_POST['co_name'] : null; $strasse = isset($_POST['strasse']) ? $_POST['strasse'] : null; @@ -283,6 +275,7 @@ class Kontakt extends FHCAPI_Controller $name = isset($_POST['name']) ? $_POST['name'] : null; $typ = isset($_POST['typ']) ? $_POST['typ'] : null; $anmerkung = isset($_POST['anmerkung']) ? $_POST['anmerkung'] : null; + $firma_id = isset($_POST['firma_id']) ? $_POST['firma_id'] : null; $result = $this->AdresseModel->update( [ @@ -387,8 +380,11 @@ class Kontakt extends FHCAPI_Controller $this->terminateWithSuccess(getData($result) ?: []); } - public function getFirmen($searchString) + public function getFirmen($searchString = null) { + if (is_null($searchString)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + $this->load->model('ressource/firma_model', 'FirmaModel'); $result = $this->FirmaModel->searchFirmen($searchString); @@ -398,8 +394,11 @@ class Kontakt extends FHCAPI_Controller $this->terminateWithSuccess($result ?: []); } - public function getStandorte($searchString) + public function getStandorte($searchString = null) { + if (is_null($searchString)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + $this->load->model('organisation/standort_model', 'StandortModel'); $result = $this->StandortModel->searchStandorte($searchString); @@ -409,8 +408,11 @@ class Kontakt extends FHCAPI_Controller $this->terminateWithSuccess($data); } - public function getStandorteByFirma($firma_id) + public function getStandorteByFirma($firma_id = null) { + if (is_null($firma_id) || !ctype_digit((string)$firma_id)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + $this->load->model('organisation/standort_model', 'StandortModel'); $result = $this->StandortModel->getStandorteByFirma($firma_id); @@ -428,10 +430,15 @@ class Kontakt extends FHCAPI_Controller THEN public.tbl_kontakt.updateamum ELSE public.tbl_kontakt.insertamum END) AS lastUpdate, st.bezeichnung, f.name"); + $this->KontakttypModel->addSelect("kt.beschreibung as kontakttypbeschreibung"); $this->StandortModel->addJoin('public.tbl_standort st', 'ON (public.tbl_kontakt.standort_id = st.standort_id)', 'LEFT'); $this->FirmaModel->addJoin('public.tbl_firma f', 'ON (f.firma_id = st.firma_id)', 'LEFT'); + $this->KontakttypModel->addJoin('public.tbl_kontakttyp kt', 'ON (public.tbl_kontakt.kontakttyp = kt.kontakttyp)'); $result = $this->KontaktModel->loadWhere( - array('person_id' => $person_id) + array( + 'person_id' => $person_id, + 'public.tbl_kontakt.kontakttyp !=' => 'hidden' + ) ); if (isError($result)) @@ -439,20 +446,18 @@ class Kontakt extends FHCAPI_Controller $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); } $this->terminateWithSuccess((getData($result) ?: [])); + } public function getKontakttypen() { $this->load->model('person/Kontakttyp_model', 'KontakttypModel'); + $this->KontakttypModel->addOrder('beschreibung', 'ASC'); + $result = $this->KontakttypModel->loadWhere(array('kontakttyp !=' => 'hidden')); - $result = $this->KontakttypModel->load(); - if (isError($result)) { - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - else - { - $this->terminateWithSuccess(getData($result) ?: []); - } + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } public function loadContact() @@ -579,8 +584,8 @@ class Kontakt extends FHCAPI_Controller 'anmerkung' => $anmerkung, 'kontakt' => $kontakt, 'zustellung' => $_POST['zustellung'], - 'insertvon' => $uid, - 'insertamum' => date('c'), + 'updatevon' => $uid, + 'updateamum' => date('c'), 'standort_id' => $standort_id, 'ext_id' => $ext_id ] @@ -652,6 +657,10 @@ class Kontakt extends FHCAPI_Controller $bic = $this->input->post('bic'); $blz = $this->input->post('blz'); $kontonr = $this->input->post('kontonr'); + $iban = $this->input->post('iban'); + $typ = $this->input->post('typ'); + $verrechnung = $this->input->post('verrechnung'); + $uid = getAuthUID(); $result = $this->BankverbindungModel->insert( [ @@ -659,13 +668,13 @@ class Kontakt extends FHCAPI_Controller 'name' => $name, 'anschrift' => $anschrift, 'bic' => $bic, - 'iban' => $_POST['iban'], + 'iban' => $iban, 'blz' => $blz, 'kontonr' => $kontonr, - 'insertvon' => 'uid', + 'insertvon' => $uid, 'insertamum' => date('c'), - 'typ' => $_POST['typ'], - 'verrechnung' => $_POST['verrechnung'], + 'typ' => $typ, + 'verrechnung' => $verrechnung, 'ext_id' => $ext_id, 'oe_kurzbz' => $oe_kurzbz, 'orgform_kurzbz' => $orgform_kurzbz @@ -779,4 +788,25 @@ class Kontakt extends FHCAPI_Controller return $this->GemeindeModel->checkLocation($_POST['plz'], $_POST['gemeinde'], $_POST['ort']); } + + /* + * returns list of all companies + * as key value list to be used in select or autocomplete + */ + public function getAllFirmen() + { + $sql = " + SELECT + f.firma_id, f.name, + f.name AS label + FROM public.tbl_firma f + ORDER BY f.name ASC"; + + $result = $this->FirmaModel->execReadOnlyQuery($sql); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + } diff --git a/application/controllers/api/frontend/v1/stv/Konto.php b/application/controllers/api/frontend/v1/stv/Konto.php index ac36b5d8f..ecd58671a 100644 --- a/application/controllers/api/frontend/v1/stv/Konto.php +++ b/application/controllers/api/frontend/v1/stv/Konto.php @@ -116,6 +116,8 @@ class Konto extends FHCAPI_Controller { $this->load->model('crm/Buchungstyp_model', 'BuchungstypModel'); + $this->BuchungstypModel->addOrder('beschreibung'); + $result = $this->BuchungstypModel->load(); $data = $this->getDataOrTerminateWithError($result); @@ -237,7 +239,7 @@ class Konto extends FHCAPI_Controller $data[$field] = $this->input->post($field); if (defined('FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE') && isset(unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']])) { - $data['kostenstelle'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']]; + $data['studiengang_kz'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']]; } $result = []; @@ -350,7 +352,7 @@ class Konto extends FHCAPI_Controller continue; } - + $result = $this->KontoModel->insert([ 'person_id' => $buchung['person_id'], 'studiengang_kz' => $buchung['studiengang_kz'], @@ -359,7 +361,7 @@ class Konto extends FHCAPI_Controller 'buchungstyp_kurzbz' => $buchung['buchungstyp_kurzbz'], 'credit_points' => $buchung['credit_points'], 'zahlungsreferenz' => $buchung['zahlungsreferenz'], - 'betrag' => $betrag, + 'betrag' => number_format($betrag, 2, '.', ''), 'buchungsdatum' => $buchungsdatum, 'mahnspanne' => '0', 'buchungsnr_verweis' => $buchung['buchungsnr'], diff --git a/application/controllers/api/frontend/v1/stv/Lehrverband.php b/application/controllers/api/frontend/v1/stv/Lehrverband.php new file mode 100644 index 000000000..72610dd63 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Lehrverband.php @@ -0,0 +1,63 @@ + ['admin:r', 'assistenz:r'], + 'getTree' => ['admin:r', 'assistenz:r'], + 'getSpecialgroups' => ['admin:r', 'assistenz:r'] + ]); + } + + public function hasOrgforms($studiengang_kz) + { + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $result = $this->StudiengangModel->load($studiengang_kz); + + $data = $this->getDataOrTerminateWithError($result); + if ($data) { + $data = current($data)->mischform; + } + + $this->terminateWithSuccess($data); + } + + public function getTree($studiengang_kz) + { + $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); + + $result = $this->LehrverbandModel->loadWhere([ + 'studiengang_kz' => $studiengang_kz, + 'aktiv' => true + ]); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getSpecialgroups($studiengang_kz) + { + $this->load->model('organisation/Gruppe_model', 'GruppeModel'); + + $where = [ + 'studiengang_kz' => $studiengang_kz, + 'lehre' => true, + 'sichtbar' => true, + 'aktiv' => true, + 'direktinskription' => false + ]; + + $result = $this->GruppeModel->loadWhere($where); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } +} diff --git a/application/controllers/api/frontend/v1/stv/LvTermine.php b/application/controllers/api/frontend/v1/stv/LvTermine.php new file mode 100644 index 000000000..c29f56964 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/LvTermine.php @@ -0,0 +1,408 @@ + ['admin:r', 'assistenz:r'], + 'getStudiensemester' => ['admin:r', 'assistenz:r'], + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('form_validation'); + + // Load language phrases + $this->loadPhrases([ + 'ui', + ]); + + // Load models + $this->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + + //query verwenden wie im Cis endpoint + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); + $this->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel'); + } + + //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") + { + $student_uid = $uid; + $semester_range = $this->studienSemesterErmitteln($start_date, $end_date); + + $this->sortStudienSemester($semester_range); + $this->applyLoadUeberSemesterHaelfte($semester_range); + + $benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($semester_range, $student_uid); + $student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($semester_range, $student_uid); + + if(!$groupConsecutiveHours) + $stundenplan_query = $this->StundenplanModel->getStundenplanQuery( + $start_date, + $end_date, + $semester_range, + $benutzer_gruppen, + $student_lehrverband + ); + else + $stundenplan_query = $this->StundenplanModel->getStundenplanQuery( + $start_date, + $end_date, + $semester_range, + $benutzer_gruppen, + $student_lehrverband, + true, + $dbStundenplanTable + ); + + if(!$stundenplan_query) + { + $this->terminateWithSuccess([]); + } + + if($groupConsecutiveHours) + { + $stundenplan_data = $this->StundenplanModel->stundenplanGruppierungConsecutive($stundenplan_query); + } + else + { + $stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($stundenplan_query); + } + + $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() + { + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $this->StudiensemesterModel->addOrder('studienjahr_kurzbz', 'DESC'); + $result = $this->StudiensemesterModel->load(); + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + //copied from Stundenplan.php + private function studienSemesterErmitteln($start_date, $end_date) + { + // gets all studiensemester from the student from start_date to end_date + $semester_range = $this->StudiensemesterModel->getByDateRange($start_date, $end_date); + $semester_range = array_map( + function ($sem) { + return $sem->studiensemester_kurzbz; + }, + $this->getDataOrTerminateWithError($semester_range) + ); + + // if no studiensemester is found for the given timespan, get the nearest studiensemester + if(count($semester_range) == 0) + { + $aktuelle_studiensemester = $this->StudiensemesterModel->getNearest(); + $aktuelle_studiensemester = $this->getDataOrTerminateWithError($aktuelle_studiensemester); + if (count($aktuelle_studiensemester) == 0) { + $this->terminateWithError("No aktuelles semester"); + } + $aktuelle_studiensemester = current($aktuelle_studiensemester)->studiensemester_kurzbz; + // push aktuelles semester in active semester array + array_push($semester_range, $aktuelle_studiensemester); + } + return $semester_range; + } + + //copied from Stundenplan.php + private function sortStudienSemester(&$semester_range) + { + usort( + $semester_range, + function ($first, $second) { + $sem_first = null; + $year_first = null; + $match_first = null; + + $sem_second = null; + $year_second = null; + $match_second = null; + + preg_match('/([WS]+)([0-9]+)/', $first, $match_first); + preg_match('/([WS]+)([0-9]+)/', $second, $match_second); + + $sem_first = $match_first[1]; + $year_first = intval($match_first[2]); + + $sem_second = $match_second[1]; + $year_second = intval($match_second[2]); + + if($year_first < $year_second) + { + return -1; + } + elseif($year_first > $year_second) + { + return 1; + } + elseif($year_first == $year_second && $sem_first > $sem_second) + { + return 1; + } + elseif($year_first == $year_second && $sem_first < $sem_second) + { + return -1; + } + return 0; + } + ); + } + + //copied from Stundenplan.php + private function applyLoadUeberSemesterHaelfte(&$semester_range) + { + /* + @var($semester_collection) + convert the array of studiensemester into an associative array with the studiensemester as the key + and the values of each key are the studiensemester needed for the query associated to that studiensemester + example: + + #INPUT: + ['WS2023','SS2024','WS2024'] + #OUTPUT: + [ + 'WS2023' => ['SS2023','WS2023'] + 'SS2024' => ['WS2023','SS2024'] + 'WS2024' => ['SS2024','WS2024'] + ] + */ + $semester_collection = []; + foreach($semester_range as $studiensemester) + { + $previous_studiensemester = $this->StudiensemesterModel->getPreviousFrom($studiensemester); + $previous_studiensemester = $this->getDataOrTerminateWithError($previous_studiensemester); + if (count($previous_studiensemester) == 0) { + $this->terminateWithError("No previous semester"); + } + $previous_studiensemester = current($previous_studiensemester)->studiensemester_kurzbz; + $semester_collection[$studiensemester] = [$previous_studiensemester, $studiensemester]; + } + + /* + @var($studienSemesterDateRanges) + fetches for each studiensemester the start and end date, (SS) summer studiensemester are extended by 1 month to cover the summerbreak + based on the LVPLAN_LOAD_UEBER_SEMESTERHAELFTE constant it will load both the semester and the previous semester with the full date range + or the semester with the full date range and the previous semester with the half date range: + + #INPUT: + [ + 'WS2023' => ['SS2023','WS2023'] + 'SS2024' => ['WS2023','SS2024'] + 'WS2024' => ['SS2024','WS2024'] + ] + #OUTPUT: depends whether LVPLAN_LOAD_UEBER_SEMESTERHAELFTE is true or false + ~ if LVPLAN_LOAD_UEBER_SEMESTERHAELFTE == true + [ + "SS2024": [ + "WS2023": [ + "start"=> "2024-02-03", + "ende"=> "2024-08-31" + ], + "SS2024": [ + "start"=> "2024-02-03", + "ende"=> "2024-08-31" + ] + ] + ] + ~ if LVPLAN_LOAD_UEBER_SEMESTERHAELFTE == false + [ + "SS2024": [ + "WS2023": [ + "start"=> "2024-02-03", + "ende"=> "2024-05-17" + ], + "SS2024": [ + "start"=> "2024-02-03", + "ende"=> "2024-08-31" + ] + ] + ] + */ + $studienSemesterDateRanges=[]; + foreach($semester_collection as $semester_original => $semester_adjoint) + { + $semester_start_ende = $this->StudiensemesterModel->getStartEndeFromStudiensemester($semester_original); + $semester_start_ende = current($this->getDataOrTerminateWithError($semester_start_ende)); + + // initialize empty arrays to add key value pairs + $studienSemesterDateRanges[$semester_original] = []; + + // check if the studiensemester is a summer semester and add 1 month to bridge the school summer break + $match = null; + preg_match("/^(SS)([0-9]+)/", $semester_original, $match); + if(count($match) >0) + { + $one_month = new DateInterval('P1M'); + $one_day = DateInterval::createFromDateString('1 days'); + $summer_studiensemester_end_date = DateTime::createFromFormat('Y-m-d', $semester_start_ende->ende); + $summer_studiensemester_end_date->add($one_month); + $summer_studiensemester_end_date->sub($one_day); + $semester_start_ende->ende = date_format($summer_studiensemester_end_date, 'Y-m-d'); + } + if (defined('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE') && LVPLAN_LOAD_UEBER_SEMESTERHAELFTE === true) + { + foreach($semester_adjoint as $adjoint) + { + $studienSemesterDateRanges[$semester_original][$adjoint]=$semester_start_ende; + } + } + else + { + //TODO: half of a DateInterval might not be correctly calculated + // calculate the half of the studiensemester + $studiensemester_start_date = DateTime::createFromFormat('Y-m-d', $semester_start_ende->start); + $studiensemester_end_date = DateTime::createFromFormat('Y-m-d', $semester_start_ende->ende); + $studiensemester_time_difference = $studiensemester_start_date->diff($studiensemester_end_date); + $half_dateNumber = ceil($studiensemester_time_difference->d/2)+ceil(($studiensemester_time_difference->m*30)/2); + $half_dateInterval = new DateInterval('P'.strval($half_dateNumber) .'D'); + $studiensemester_half = date_format($studiensemester_start_date->add($half_dateInterval), 'Y-m-d'); + + $first_half = new stdClass(); + $first_half->start = $semester_start_ende->start; + $first_half->ende = $studiensemester_half; + + $studienSemesterDateRanges[$semester_original][$semester_adjoint[0]] = $first_half; + $studienSemesterDateRanges[$semester_original][$semester_adjoint[1]] = $semester_start_ende; + } + $semester_range = $studienSemesterDateRanges; + } + } + + //copied from Stundenplan.php, extended with $student_uid + private function fetchBenutzerGruppenFromStudiensemester($semester_range, $student_uid) + { + //$student_uid = getAuthUID(); + $benutzer_gruppen = []; + // for each studiensemester fetch the benutzer gruppen and add them to an associate $bentuzer_gruppen array + /* + [ + ['WS2023'] => [['gruppe1_SS2023','gruppe2_SS2023'],['gruppe1_WS2023','gruppe2_WS2023']], + ['SS2024'] => [['gruppe1_WS2023','gruppe2_WS2023'],['gruppe1_SS2024','gruppe2_SS2024']], + ['WS2024'] => [['gruppe1_SS2024','gruppe2_SS2024'],['gruppe1_WS2024','gruppe2_WS2024']], + ] + */ + foreach($semester_range as $semester_key => $semester_array) + { + $benutzer_gruppen[$semester_key] = []; + // each semester could have ajoint semesters that need to be checked + foreach($semester_array as $semester => $semester_date_range) + { + // for each active semester query the benutzer_gruppen associated to the semester + $benutzer_query = $this->BenutzergruppeModel->execReadOnlyQuery(" + SELECT * FROM tbl_benutzergruppe where uid = ? AND studiensemester_kurzbz = ?", [$student_uid, $semester]); + $benutzer_query_result = $this->getDataOrTerminateWithError($benutzer_query); + array_push( + $benutzer_gruppen[$semester_key], + array_map( + function ($item) { + return "'".$item->gruppe_kurzbz. "'"; + }, + $benutzer_query_result + ) + ); + } + } + + // merge the gruppen of each studiensemester together for the original studiensemester + /* + [ + ['WS2023'] => ['gruppe1_SS2023','gruppe2_SS2023','gruppe1_WS2023','gruppe2_WS2023'], + ['SS2024'] => ['gruppe1_WS2023','gruppe2_WS2023','gruppe1_SS2024','gruppe2_SS2024'], + ['WS2024'] => ['gruppe1_SS2024','gruppe2_SS2024','gruppe1_WS2024','gruppe2_WS2024'], + ] + */ + $benutzer_gruppen = array_map( + function ($gruppe) { + $merged_gruppe = []; + foreach($gruppe as $gruppen_array) + { + $merged_gruppe = array_merge($merged_gruppe, $gruppen_array); + } + return $merged_gruppe; + }, + $benutzer_gruppen + ); + + return $benutzer_gruppen; + } + + //copied from Stundenplan.php, extended with $student_uid + private function fetchStudentlehrverbandFromStudiensemester($semester_range, $student_uid) + { + //$student_uid = getAuthUID(); + $student_lehrverband = []; + // for each studiensemester fetch the studentlehrverbaende and add them to an associate $student_lehrverband array + /* + [ + ['WS2023'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ] ], + ['SS2024'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ] ], + ['WS2024'] => [ [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ] ], + ] + */ + foreach($semester_range as $semester_key => $semester_array) + { + $student_lehrverband[$semester_key] = []; + foreach($semester_array as $semester => $semester_date_range) + { + // for each active semester query the student_lehrverband associated to the semester + $lehrverband_query = $this->BenutzergruppeModel->execReadOnlyQuery(" + SELECT * FROM tbl_studentlehrverband where student_uid = ? AND studiensemester_kurzbz = ?", [$student_uid, $semester]); + $lehrverband_query_result = $this->getDataOrTerminateWithError($lehrverband_query); + array_push($student_lehrverband[$semester_key], array_map( + function ($item) { + $result = new stdClass(); + $result->studiengang_kz = $item->studiengang_kz; + $result->semester = $item->semester; + $result->verband = $item->verband; + $result->gruppe = $item->gruppe; + return $result; + }, + $lehrverband_query_result)); + } + } + + // merge the studentlehrverband of each studiensemester together for the original studiensemester + /* + [ + ['WS2023'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], + ['SS2024'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], + ['WS2024'] => [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ], + ] + */ + $student_lehrverband = array_map( + function ($studentlehrverband) { + $merged_studentlehrverband = []; + foreach($studentlehrverband as $studentlehrverband_array) + { + $merged_studentlehrverband = array_merge($merged_studentlehrverband, $studentlehrverband_array); + } + return $merged_studentlehrverband; + }, + $student_lehrverband + ); + + return $student_lehrverband; + } +} diff --git a/application/controllers/api/frontend/v1/stv/Mobility.php b/application/controllers/api/frontend/v1/stv/Mobility.php index 2ab0ac682..f61816086 100644 --- a/application/controllers/api/frontend/v1/stv/Mobility.php +++ b/application/controllers/api/frontend/v1/stv/Mobility.php @@ -3,6 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); use \DateTime as DateTime; +use CI3_Events as Events; class Mobility extends FHCAPI_Controller { @@ -40,13 +41,54 @@ class Mobility extends FHCAPI_Controller // Load models $this->load->model('codex/Bisio_model', 'BisioModel'); + + //Permission checks for Studiengangsarray + $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []; + + if ($this->router->method == 'insertMobility' || $this->router->method == 'updateMobility') + { + $student_uid = $this->input->post('uid'); + if(!$student_uid) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); + } + $this->_checkAllowedStgsFromUid($student_uid, $allowedStgs); + } + + if ($this->router->method == 'deleteMobility') { + $bisio_id = $this->input->post('bisio_id'); + if(!$bisio_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Bisio ID']), self::ERROR_TYPE_GENERAL); + } + $result = $this->BisioModel->load( + array('bisio_id' => $bisio_id) + ); + $data = $this->getDataOrTerminateWithError($result); + $student_uid = current($data)->student_uid; + + $this->_checkAllowedStgsFromUid($student_uid, $allowedStgs); + } + } + + private function _checkAllowedStgsFromUid($student_uid, $allowedStgs) + { + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->loadWhere(['student_uid' => $student_uid]); + $data = $this->getDataOrTerminateWithError($result); + $studiengang_kz = current($data)->studiengang_kz; + + if (!in_array($studiengang_kz, $allowedStgs)) + { + return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL); + } } public function getMobilitaeten($student_uid) { $this->BisioModel->addSelect("*"); $this->BisioModel->addJoin('bis.tbl_mobilitaetsprogramm mp', 'ON (mp.mobilitaetsprogramm_code = bis.tbl_bisio.mobilitaetsprogramm_code)', 'LEFT'); - $this->BisioModel->addJoin('lehre.tbl_lehreinheit le', 'ON (le.lehreinheit_id = bis.tbl_bisio.lehreinheit_id)','LEFT'); + $this->BisioModel->addJoin('lehre.tbl_lehreinheit le', 'ON (le.lehreinheit_id = bis.tbl_bisio.lehreinheit_id)', 'LEFT'); $this->BisioModel->addOrder('von', 'DESC'); $this->BisioModel->addOrder('bis', 'DESC'); $this->BisioModel->addOrder('bisio_id', 'DESC'); @@ -83,14 +125,20 @@ class Mobility extends FHCAPI_Controller $formData = $this->input->post('formData'); - $_POST['von'] = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null; - $_POST['bis'] = (isset($formData['bis']) && !empty($formData['bis'])) ? $formData['bis'] : null; - $_POST['nation_code'] = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A'; - $_POST['mobilitaetsprogramm_code'] = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; - $_POST['herkunftsland_code'] = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A'; - $_POST['ects_erworben'] = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; - $_POST['ects_angerechnet'] = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null; - $_POST['lehreinheit_id'] = (isset($formData['lehreinheit_id']) && !empty($formData['lehreinheit_id'])) ? $formData['lehreinheit_id'] : 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; + $ects_erworben = $formData['ects_erworben'] ?? null; + $ects_angerechnet = $formData['ects_angerechnet'] ?? null; + $lehreinheit_id = $formData['lehreinheit_id'] ?? null; + $ort = $formData['ort'] ?? null; + $universitaet = $formData['universitaet'] ?? null; + $localPurposes = $formData['localPurposes'] ?? null; + $localSupports = $formData['localSupports'] ?? null; + + $this->form_validation->set_data($formData); $this->form_validation->set_rules('nation_code', 'Nation_code', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Nation_code']) @@ -126,23 +174,18 @@ class Mobility extends FHCAPI_Controller $this->terminateWithValidationErrors($this->form_validation->error_array()); } - $ort = (isset($formData['ort']) && !empty($formData['ort'])) ? $formData['ort'] : null; - $universitaet = (isset($formData['universitaet']) && !empty($formData['universitaet'])) ? $formData['universitaet'] : null; - $localPurposes = (isset($formData['localPurposes']) && !empty($formData['localPurposes'])) ? $formData['localPurposes'] : null; - $localSupports = (isset($formData['localSupports']) && !empty($formData['localSupports'])) ? $formData['localSupports'] : null; - $result = $this->BisioModel->insert([ 'student_uid' => $student_uid, - 'von' => $_POST['von'], - 'bis' => $_POST['bis'], - 'mobilitaetsprogramm_code' => $_POST['mobilitaetsprogramm_code'], - 'nation_code' => $_POST['nation_code'], - 'herkunftsland_code' => $_POST['herkunftsland_code'], - 'lehreinheit_id' => $_POST['lehreinheit_id'], + 'von' => $von, + 'bis' => $bis, + 'mobilitaetsprogramm_code' => $mobilitaetsprogramm_code, + 'nation_code' => $nation_code, + 'herkunftsland_code' => $herkunftsland_code, + 'lehreinheit_id' => $lehreinheit_id, 'ort' => $ort, 'universitaet' => $universitaet, - 'ects_erworben' => $_POST['ects_erworben'] , - 'ects_angerechnet' => $_POST['ects_angerechnet'], + 'ects_erworben' => $ects_erworben , + 'ects_angerechnet' => $ects_angerechnet, 'insertamum' => date('c'), 'insertvon' => $authUID, ]); @@ -171,7 +214,7 @@ class Mobility extends FHCAPI_Controller { $this->BisioModel->addSelect("*"); $this->BisioModel->addJoin('bis.tbl_mobilitaetsprogramm mp', 'ON (mp.mobilitaetsprogramm_code = bis.tbl_bisio.mobilitaetsprogramm_code)', 'LEFT'); - $this->BisioModel->addJoin('lehre.tbl_lehreinheit le', 'ON (le.lehreinheit_id = bis.tbl_bisio.lehreinheit_id)','LEFT'); + $this->BisioModel->addJoin('lehre.tbl_lehreinheit le', 'ON (le.lehreinheit_id = bis.tbl_bisio.lehreinheit_id)', 'LEFT'); $result = $this->BisioModel->loadWhere( array('bisio_id' => $bisio_id) ); @@ -194,14 +237,18 @@ class Mobility extends FHCAPI_Controller } $formData = $this->input->post('formData'); - $_POST['von'] = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null; - $_POST['bis'] = (isset($formData['bis']) && !empty($formData['bis'])) ? $formData['bis'] : null; - $_POST['nation_code'] = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A'; - $_POST['mobilitaetsprogramm_code'] = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; - $_POST['herkunftsland_code'] = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A'; - $_POST['ects_erworben'] = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; - $_POST['ects_angerechnet'] = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null; - $_POST['lehreinheit_id'] = (isset($formData['lehreinheit_id']) && !empty($formData['lehreinheit_id'])) ? $formData['lehreinheit_id'] : 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; + $ects_erworben = $formData['ects_erworben'] ?? null; + $ects_angerechnet = $formData['ects_angerechnet'] ?? null; + $lehreinheit_id = $formData['lehreinheit_id'] ?? null; + $ort = $formData['ort'] ?? null; + $universitaet = $formData['universitaet'] ?? null; + + $this->form_validation->set_data($formData); $this->form_validation->set_rules('nation_code', 'Nation_code', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Nation_code']) @@ -209,6 +256,7 @@ class Mobility extends FHCAPI_Controller $this->form_validation->set_rules('herkunftsland_code', 'Herkunftsland_code', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Herkunftsland_code']) ]); + $this->form_validation->set_rules('mobilitaetsprogramm_code', 'Mobilitaetsprogramm_code', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Mobilitaetsprogramm_code']) ]); @@ -243,16 +291,17 @@ class Mobility extends FHCAPI_Controller ], [ 'student_uid' => $student_uid, - 'von' => $_POST['von'], - 'bis' => $_POST['bis'], - 'mobilitaetsprogramm_code' => $_POST['mobilitaetsprogramm_code'], - 'nation_code' => $_POST['nation_code'], - 'herkunftsland_code' => $_POST['herkunftsland_code'], - 'lehreinheit_id' => $_POST['lehreinheit_id'], - 'ort' => $formData['ort'], - 'universitaet' => $formData['universitaet'], - 'ects_erworben' => $_POST['ects_erworben'] , - 'ects_angerechnet' => $_POST['ects_angerechnet'], + + 'von' => $von, + 'bis' => $bis, + 'mobilitaetsprogramm_code' => $mobilitaetsprogramm_code, + 'nation_code' => $nation_code, + 'herkunftsland_code' => $herkunftsland_code, + 'lehreinheit_id' => $lehreinheit_id, + 'ort' => $ort, + 'universitaet' => $universitaet, + 'ects_erworben' => $ects_erworben , + 'ects_angerechnet' => $ects_angerechnet, 'updateamum' => date('c'), 'updatevon' => $authUID, ] @@ -263,30 +312,12 @@ class Mobility extends FHCAPI_Controller $this->terminateWithSuccess(current($data)); } - public function deleteMobility($bisio_id) + public function deleteMobility() { - //check if extension table exists - $result = $this->BisioModel->tableExists('extension', 'tbl_mo_bisioidzuordnung'); - $data = $this->getDataOrTerminateWithError($result); + $bisio_id = $this->input->post('bisio_id'); - //if table exists check if existing entry - if(!empty($data)) - { - $this->BisioModel->addSelect("count(*)"); - $this->BisioModel->addJoin('extension.tbl_mo_bisioidzuordnung mo', 'ON (mo.bisio_id = bis.tbl_bisio.bisio_id)', 'LEFT'); - - $resultCheckMo = $this->BisioModel->loadWhere( - array('mo.bisio_id' => $bisio_id) - ); - - $resultCheckMo = $this->getDataOrTerminateWithError($resultCheckMo); - $count = current($resultCheckMo)->count; - - $existsInExtension = $count > 0 ? true : false; - - if($existsInExtension) - $this->terminateWithError($this->p->t('mobility', 'error_existingEntryInExtension'), self::ERROR_TYPE_GENERAL); - } + //check if entry in MobilityOnline extension exists + Events::trigger('mobility_delete', $bisio_id); $result = $this->BisioModel->delete( array('bisio_id' => $bisio_id) @@ -294,6 +325,7 @@ class Mobility extends FHCAPI_Controller $data = $this->getDataOrTerminateWithError($result); $this->terminateWithSuccess($data); + } public function getLVList($studiengang_kz) @@ -475,7 +507,6 @@ class Mobility extends FHCAPI_Controller if($local_support){ $aufenthaltfoerderung_code = $local_support; } - $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel'); if(!$local_support) diff --git a/application/controllers/api/frontend/v1/stv/Notiz.php b/application/controllers/api/frontend/v1/stv/Notiz.php index 19e568f33..ba7cd1928 100644 --- a/application/controllers/api/frontend/v1/stv/Notiz.php +++ b/application/controllers/api/frontend/v1/stv/Notiz.php @@ -16,7 +16,8 @@ class Notiz extends Notiz_Controller 'updateNotiz' => ['admin:rw', 'assistenz:rw'], // TODO(manu): self::PERM_LOGGED 'deleteNotiz' => ['admin:r', 'assistenz:r'], 'loadDokumente' => ['admin:r', 'assistenz:r'], - 'getMitarbeiter' => ['admin:r', 'assistenz:r'] + 'getMitarbeiter' => ['admin:r', 'assistenz:r'], + 'getCountNotes' => ['admin:r', 'assistenz:r'], ]); //Load Models diff --git a/application/controllers/api/frontend/v1/stv/Prestudent.php b/application/controllers/api/frontend/v1/stv/Prestudent.php index 0b06b9667..d8c8d1ff2 100644 --- a/application/controllers/api/frontend/v1/stv/Prestudent.php +++ b/application/controllers/api/frontend/v1/stv/Prestudent.php @@ -43,7 +43,7 @@ class Prestudent extends FHCAPI_Controller // Load language phrases $this->loadPhrases([ - 'ui', 'studierendenantrag', 'lehre' + 'ui', 'studierendenantrag', 'lehre', 'global' ]); } @@ -98,11 +98,9 @@ class Prestudent extends FHCAPI_Controller 'person_id', 'berufstaetigkeit_code', 'ausbildungcode', - 'zgv_code', 'zgvort', 'zgvdatum', 'zgvnation', - 'zgvmas_code', 'zgvmaort', 'zgvmadatum', 'zgvmanation', @@ -110,7 +108,6 @@ class Prestudent extends FHCAPI_Controller 'bismelden', 'anmerkung', 'dual', - 'zgvdoktor_code', 'zgvdoktorort', 'zgvdoktordatum', 'zgvdoktornation', @@ -125,6 +122,57 @@ class Prestudent extends FHCAPI_Controller 'standort_code' ]; + // add zgv code fields only if user has permission + $this->load->library('PermissionLib'); + $prestudentres = $this->PrestudentModel->load($prestudent_id); + if(!hasData($prestudentres)) + { + $this->terminateWithError($this->p->t('ui', 'error_fieldNotFound', ['field' => 'Prestudent ' . $prestudent_id])); + } + $prestudent = (getData($prestudentres))[0]; + $bakkZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array(); + $makkZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array(); + $dokZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array(); + + if(in_array($prestudent->studiengang_kz, $bakkZgvStg)) + { + $array_allowed_props_prestudent[] = 'zgv_code'; + } + else if(!is_null($this->input->post('zgv_code'))) + { + $this->terminateWithError( + $this->p->t('global', 'zgv') + . ' - ' . + $this->p->t('ui', 'error_keineBerechtigungStg') + ); + } + + if(in_array($prestudent->studiengang_kz, $makkZgvStg)) + { + $array_allowed_props_prestudent[] = 'zgvmas_code'; + } + else if(!is_null($this->input->post('zgvmas_code'))) + { + $this->terminateWithError( + $this->p->t('lehre', 'zgvMaster') + . ' - ' . + $this->p->t('ui', 'error_keineBerechtigungStg') + ); + } + + if(in_array($prestudent->studiengang_kz, $dokZgvStg)) + { + $array_allowed_props_prestudent[] = 'zgvdoktor_code'; + } + else if(!is_null($this->input->post('zgvdoktor_code'))) + { + $this->terminateWithError( + $this->p->t('lehre', 'zgvDoktor') + . ' - ' . + $this->p->t('ui', 'error_keineBerechtigungStg') + ); + } + // add UDFs $result = $this->udflib->getDefinitionForModel($this->PrestudentModel); @@ -136,10 +184,32 @@ class Prestudent extends FHCAPI_Controller $update_prestudent = array(); foreach ($array_allowed_props_prestudent as $prop) { - $val = $this->input->post($prop); - if ($val !== null || $prop == 'foerderrelevant') { + $val = $this->input->post($prop, true); + + if ($val !== null) { + if(in_array($prop, ['dual', 'bismelden', 'foerderrelevant'])) + { + $val = boolval($val); + } + elseif ( + $val === '' + && in_array($prop, ['zgvnation', 'zgvmanation', 'zgvdoktornation', 'berufstaetigkeit_code', 'ausbildungcode']) + ) + { + $val = null; + } $update_prestudent[$prop] = $val; } + + // allowed to be null, but has to be in postparameter + if ( + in_array($prop, ['foerderrelevant', 'zgvdatum', 'zgvmadatum', 'zgvdoktordatum', 'zgv_code', 'zgvmas_code', 'zgvdoktor_code']) + && !isset($update_prestudent[$prop]) + && array_key_exists($prop, $_POST) + ) + { + $update_prestudent[$prop] = null; + } } $update_prestudent['updateamum'] = date('c'); @@ -174,7 +244,11 @@ class Prestudent extends FHCAPI_Controller { $this->load->model('codex/Zgv_model', 'ZgvModel'); - $this->ZgvModel->addOrder('zgv_code'); + $this->ZgvModel->addSelect('zgv_code'); + $this->ZgvModel->addSelect('zgv_bez'); + $this->ZgvModel->addSelect('aktiv'); + $this->ZgvModel->addSelect('zgv_bez as label'); + $this->ZgvModel->addOrder('zgv_bez'); $result = $this->ZgvModel->load(); if (isError($result)) @@ -188,7 +262,11 @@ class Prestudent extends FHCAPI_Controller { $this->load->model('codex/Zgvdoktor_model', 'ZgvdoktorModel'); - $this->ZgvdoktorModel->addOrder('zgvdoktor_code'); + $this->ZgvdoktorModel->addSelect('zgvdoktor_code'); + $this->ZgvdoktorModel->addSelect('zgvdoktor_bez'); + $this->ZgvdoktorModel->addSelect('aktiv'); + $this->ZgvdoktorModel->addSelect('zgvdoktor_bez as label'); + $this->ZgvdoktorModel->addOrder('zgvdoktor_bez'); $result = $this->ZgvdoktorModel->load(); if (isError($result)) @@ -202,7 +280,11 @@ class Prestudent extends FHCAPI_Controller { $this->load->model('codex/Zgvmaster_model', 'ZgvmasterModel'); - $this->ZgvmasterModel->addOrder('zgvmas_code'); + $this->ZgvmasterModel->addSelect('zgvmas_code'); + $this->ZgvmasterModel->addSelect('zgvmas_bez'); + $this->ZgvmasterModel->addSelect('aktiv'); + $this->ZgvmasterModel->addSelect('zgvmas_bez as label'); + $this->ZgvmasterModel->addOrder('zgvmas_bez'); $result = $this->ZgvmasterModel->load(); if (isError($result)) diff --git a/application/controllers/api/frontend/v1/stv/Projektarbeit.php b/application/controllers/api/frontend/v1/stv/Projektarbeit.php new file mode 100644 index 000000000..8740ef3d6 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Projektarbeit.php @@ -0,0 +1,413 @@ + ['admin:r', 'assistenz:r'], + 'loadProjektarbeit' => ['admin:r', 'assistenz:r'], + 'insertProjektarbeit' => ['admin:rw', 'assistenz:rw'], + 'updateProjektarbeit' => ['admin:rw', 'assistenz:rw'], + 'deleteProjektarbeit' => ['admin:rw', 'assistenz:rw'], + 'getTypenProjektarbeit' => ['admin:r', 'assistenz:r'], + 'getFirmen' => ['admin:r', 'assistenz:r'], + 'getLehrveranstaltungen' => ['admin:r', 'assistenz:r'], + 'getNoten' => ['admin:r', 'assistenz:r'], + 'getStudiensemester' => ['admin:r', 'assistenz:r'] + ]); + + // Load Libraries + $this->load->library('form_validation'); + + // Load language phrases + $this->loadPhrases([ + 'ui', + 'person', + 'projektarbeit' + ]); + + // Load models + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $this->load->model('education/Projekttyp_model', 'ProjekttypModel'); + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + $this->load->model('ressource/Firma_model', 'FirmaModel'); + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->load->model('education/Note_model', 'NoteModel'); + $this->load->model('education/Projektbetreuer_model', 'BetreuerModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + // load libraries + $this->load->library('PermissionLib'); + } + + /** + * Get projekt works for a uid. + */ + public function getProjektarbeit() + { + $student_uid = $this->input->get('uid'); + + if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); + + $result = $this->ProjektarbeitModel->getProjektarbeit($student_uid); + + if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + if (!hasData($result)) $this->terminateWithSuccess([]); + + $projektarbeiten = getData($result); + + foreach ($projektarbeiten as $projektarbeit) + { + $projektarbeit_id = $projektarbeit->projektarbeit_id; + $abgabeRes = $this->PaabgabeModel->getEndabgabe($projektarbeit_id); + + if (isError($abgabeRes)) $this->terminateWithError(getError($abgabeRes), self::ERROR_TYPE_GENERAL); + + if (hasData($abgabeRes)) + { + $paabgabe = getData($abgabeRes)[0]; + $projektarbeit->abgabedatum = $paabgabe->abgabedatum; + } + } + + $this->terminateWithSuccess($projektarbeiten); + } + + /** + * Load a single Projektarbeit by id. + */ + public function loadProjektarbeit() + { + $projektarbeit_id = $this->input->get('projektarbeit_id'); + + if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id)) return $this->terminateWithError('Projektarbeit Id missing', self::ERROR_TYPE_GENERAL); + + $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' + ); + $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( + array('projektarbeit_id' => $projektarbeit_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + /** + * Inwert a Projektarbeit. + */ + public function insertProjektarbeit() + { + $student_uid = $this->input->post('uid'); + + if (!$student_uid) return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); + + if (!$this->_hasBerechtigungForStudent($student_uid)) + return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]); + + $formData = $this->input->post('formData'); + + if ($this->_validate($formData) == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $projektarbeit = $this->_getProjektarbeitArr($formData); + + $result = $this->ProjektarbeitModel->insert( + array_merge($projektarbeit, ['insertamum' => date('c'), 'insertvon' => getAuthUID(), 'student_uid' => $student_uid]) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + /** + * Update a Projektarbeit by ID. + */ + public function updateProjektarbeit() + { + $projektarbeit_id = $this->input->post('projektarbeit_id'); + + if (!$projektarbeit_id || !is_numeric($projektarbeit_id)) + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL); + + if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id)) + return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]); + + $formData = $this->input->post('formData'); + + if ($this->_validate($formData) == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $projektarbeit = $this->_getProjektarbeitArr($formData); + + $result = $this->ProjektarbeitModel->update( + $projektarbeit_id, + array_merge($projektarbeit, ['updateamum' => date('c'), 'updatevon' => getAuthUID()]) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + /** + * Delete Projektarbeit by ID after validation. + */ + public function deleteProjektarbeit() + { + $projektarbeit_id = $this->input->post('projektarbeit_id'); + + if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id)) + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID'], self::ERROR_TYPE_GENERAL)); + + if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id)) + return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]); + + $validate = $this->_validateDelete($projektarbeit_id); + + if (isError($validate)) return $this->terminateWithError(getError($validate), self::ERROR_TYPE_GENERAL); + + $result = $this->ProjektarbeitModel->delete( + ['projektarbeit_id' => $projektarbeit_id] + ); + + if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + if (!hasData($result)) + { + $this->outputJson($result); + } + + return $this->terminateWithSuccess(current(getData($result)) ? : null); + } + + /** + * Get all active projekt work types. + */ + public function getTypenProjektarbeit() + { + $result = $this->ProjekttypModel->loadWhere(['aktiv' => true]); + + if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + return $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } + + /** + * Gets companies by search string. + */ + public function getFirmen() + { + $searchString = $this->input->get('searchString'); + + if (!isset($searchString)) + $this->terminateWithError($this->p->t('ui', 'error_fieldRequired', ['field' => 'Search term']), self::ERROR_TYPE_GENERAL); + + $result = $this->FirmaModel->searchFirmen($searchString, $aktiv = true); + + if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + return $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } + + /** + * Get Lehrveranstaltungen by params, incling lehreinheiten for a specific Studiensemester.. + */ + public function getLehrveranstaltungen() + { + $student_uid = $this->input->get('student_uid'); + $studiengang_kz = $this->input->get('studiengang_kz'); + $studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz'); + $additional_lehrveranstaltung_id = $this->input->get('additional_lehrveranstaltung_id'); + + if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); + if (!isset($studiensemester_kurzbz)) $this->terminateWithError('Studiensemster missing', self::ERROR_TYPE_GENERAL); + + // get Lvs + $lvsResult = $this->LehrveranstaltungModel->getLvsForProjektarbeit($student_uid, $studiengang_kz, $additional_lehrveranstaltung_id); + + if (isError($lvsResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL); + + $lvs = hasData($lvsResult) ? getData($lvsResult) : []; + + foreach ($lvs as $lv) + { + // add Lehreinheiten for each Lv for the semester + $lehreinheiten = $this->LehreinheitModel->getLesForLv( + $lv->lehrveranstaltung_id, $studiensemester_kurzbz + ); + + foreach ($lehreinheiten as $lehreinheit) + { + if (!isEmptyArray($lehreinheit->lektoren)) + { + $this->MitarbeiterModel->addSelect('kurzbz'); + $this->MitarbeiterModel->db->where_in('tbl_mitarbeiter.mitarbeiter_uid', $lehreinheit->lektoren); + $maResult = $this->MitarbeiterModel->load(); + + if (isError($maResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL); + + $lehreinheit->lektoren = array_column(getData($maResult), 'kurzbz'); + } + } + + $lv->lehreinheiten = $lehreinheiten; + } + + return $this->terminateWithSuccess($lvs); + } + + /** + * Get all noten. + */ + public function getNoten() + { + $this->NoteModel->addOrder('notenwert', 'ASC'); + $this->NoteModel->addOrder('bezeichnung', 'ASC'); + + $result = $this->NoteModel->load(); + + if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + return $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } + + /** + * Get all Studiensemester, sorted. + */ + public function getStudiensemester() + { + $this->StudiensemesterModel->addOrder('start', 'DESC'); + $result = $this->StudiensemesterModel->load(); + + if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + return $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } + + /** + * Validate Projektarbeit data. + * @param formData + * @return bool true if data valid + */ + private function _validate($formData) + { + $this->form_validation->set_data($formData); + + $this->form_validation->set_rules('projekttyp_kurzbz', 'Projekttyp', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Projekttyp']) + ]); + + $this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'required|is_natural', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehreinheit']), + 'is_natural' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit']) + ]); + + $this->form_validation->set_rules('beginn', 'Beginn', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Beginn']) + ]); + + $this->form_validation->set_rules('ende', 'Ende', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Ende']) + ]); + + $this->form_validation->set_rules('gesperrtbis', 'Ende', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Gesperrt bis']) + ]); + + return $this->form_validation->run(); + } + + /** + * Extract Projektarbeit data from passed form data. + * @param formData + * @return array + */ + private function _getProjektarbeitArr($formData) + { + return [ + 'titel' => $formData['titel'], + 'titel_english' => $formData['titel_english'] ?? null, + 'themenbereich' => $formData['themenbereich'] ?? null, + 'projekttyp_kurzbz' => $formData['projekttyp_kurzbz'], + 'firma_id' => $formData['firma_id'] ?? null, + 'lehreinheit_id' => $formData['lehreinheit_id'], + 'beginn' => isset($formData['beginn']) && !isEmptyString($formData['beginn']) ? $formData['beginn'] : null, + 'ende' => isset($formData['ende']) && !isEmptyString($formData['ende']) ? $formData['ende'] : null, + 'note' => $formData['note'] ?? null, + 'final' => $formData['final'] ?? null, + 'freigegeben' => $formData['freigegeben'] ?? null, + 'anmerkung' => $formData['anmerkung'] ?? null, + 'gesperrtbis' => isset($formData['gesperrtbis']) && !isEmptyString($formData['gesperrtbis']) ? $formData['gesperrtbis'] : null + ]; + } + + /** + * Check if deletion of a Projektarbeit is possible. + * @param $projektarbeit_id + * @return object success if deletion possible, error otherwise. + */ + private function _validateDelete($projektarbeit_id) + { + $this->BetreuerModel->addSelect('1'); + $result = $this->BetreuerModel->loadWhere(['projektarbeit_id' => $projektarbeit_id]); + + if (isError($result)) return $result; + + if (hasData($result)) return error($this->p->t('projektarbeit', 'error_betreuerNichtGeloescht')); + + $this->PaabgabeModel->addSelect('1'); + $result = $this->PaabgabeModel->loadWhere(['projektarbeit_id' => $projektarbeit_id]); + + if (isError($result)) return $result; + + if (hasData($result)) return error($this->p->t('projektarbeit', 'error_paabgabeNichtGeloescht')); + + return success(); + } + + /** + * Checks permissions for a student. + * @param $student_uid + * @return bool true if authorized + */ + private function _hasBerechtigungForStudent($student_uid) + { + if (!$student_uid) + return false; + + $this->load->model('crm/Student_model', 'StudentModel'); + + $this->StudentModel->addSelect('studiengang_kz'); + $result = $this->StudentModel->load([$student_uid]); + if (isError($result) || !hasData($result)) + return false; + + $studiengang_kz = getData($result)[0]->studiengang_kz; + + if ($this->permissionlib->isBerechtigt('admin', 'suid', $studiengang_kz)) + return true; + if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $studiengang_kz)) + return true; + + return false; + } +} diff --git a/application/controllers/api/frontend/v1/stv/Projektbetreuer.php b/application/controllers/api/frontend/v1/stv/Projektbetreuer.php new file mode 100644 index 000000000..904fa6167 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Projektbetreuer.php @@ -0,0 +1,435 @@ + ['admin:r', 'assistenz:r'], + 'saveProjektbetreuer' => ['admin:rw', 'assistenz:rw'], + 'deleteProjektbetreuer' => ['admin:rw', 'assistenz:rw'], + 'getBetreuerarten' => ['admin:r', 'assistenz:r'], + 'getNoten' => ['admin:r', 'assistenz:r'], + 'getDefaultStundensaetze' => ['admin:r', 'assistenz:r'], + 'getProjektbetreuerBySearchQuery' => ['admin:r', 'assistenz:r'], + 'getPerson' => ['admin:r', 'assistenz:r'], + 'validateProjektbetreuer' => ['admin:r', 'assistenz:r'] + ]); + + // Load Libraries + $this->load->library('form_validation'); + + // Load language phrases + $this->loadPhrases([ + 'ui', + 'person', + 'projektarbeit' + ]); + + // Load models + $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); + $this->load->model('education/Betreuerart_model', 'BetreuerartModel'); + $this->load->model('ressource/Stundensatz_model', 'StundensatzModel'); + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $this->load->model('education/Note_model', 'NoteModel'); + $this->load->model('person/Person_model', 'PersonModel'); + + // load libraries + $this->load->library('PermissionLib'); + } + + /** + * Gets Projektbetreuer data for a Projektarbeit. + */ + public function getProjektbetreuer() + { + $projektarbeit_id = $this->input->get('projektarbeit_id'); + + if (!isset($projektarbeit_id)) + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL); + + $qry = " + SELECT * FROM ( + SELECT + projektarbeit_id, person_id, nachname, vorname, note, punkte, round(stunden, 1) AS stunden, + stundensatz, betreuerart_kurzbz, vertrag_id, titelpre, titelpost, + CASE + WHEN EXISTS + (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=pers.person_id) + THEN 'Mitarbeiter' + WHEN EXISTS + (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=pers.person_id) + THEN 'Student' + ELSE 'Person' + END AS status + FROM + lehre.tbl_projektbetreuer + JOIN public.tbl_person pers USING (person_id) + WHERE + projektarbeit_id = ? + ) betreuer + ORDER BY + CASE WHEN status = 'Mitarbeiter' THEN 0 WHEN status = 'Person' THEN 1 ELSE 2 END"; + + $result = $this->ProjektbetreuerModel->execReadOnlyQuery($qry, [$projektarbeit_id]); + + if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + if (!hasData($result)) $this->terminateWithSuccess([]); + + $projektbetreuer = getData($result); + + //~ foreach ($projektbetreuer as $projektarbeit) + //~ { + //~ $projektarbeit_id = $projektarbeit->projektarbeit_id; + //~ $abgabeRes = $this->PaabgabeModel->getEndabgabe($projektarbeit_id); + + //~ if (isError($abgabeRes)) $this->terminateWithError(getError($abgabeRes), self::ERROR_TYPE_GENERAL); + + //~ if (hasData($abgabeRes)) + //~ { + //~ $paabgabe = getData($abgabeRes)[0]; + //~ $projektarbeit->abgabedatum = $paabgabe->abgabedatum; + //~ } + //~ } + + // add thesis download link (from external extension) + foreach ($projektbetreuer as $pb) + { + $downloadLink = null; + Events::trigger( + 'projektbeurteilung_download_link', + $pb->projektarbeit_id, + $pb->betreuerart_kurzbz, + $pb->person_id, + function ($value) use (&$downloadLink) { + $downloadLink = $value; + } + ); + $pb->beurteilungDownloadLink = $downloadLink; + } + + $this->terminateWithSuccess($this->_addFullNameToBetreuer($projektbetreuer)); + } + + /** + * Saves (adds or updates) a single Projektbetreuer for a Projektarbeit. + */ + public function saveProjektbetreuer() + { + $projektarbeit_id = $this->input->post('projektarbeit_id'); + + if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id)) + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL); + + if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id)) + return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]); + + $projektbetreuer = $this->input->post('projektbetreuer'); + + if ($this->_validate($projektbetreuer) == false) $this->terminateWithValidationErrors($this->form_validation->error_array()); + + // check if assessor has already been assigned + if (isset($projektbetreuer['person_id'])) + { + $this->ProjektbetreuerModel->addSelect('1'); + $betreuerRes = $this->ProjektbetreuerModel->loadWhere( + [ + 'person_id' => $projektbetreuer['person_id'], + 'projektarbeit_id' => $projektbetreuer['projektarbeit_id'], + 'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz'] + ] + ); + + if (hasData($betreuerRes) + && (!isset($projektbetreuer['person_id_old']) || $projektbetreuer['person_id'] != $projektbetreuer['person_id_old'])) { + return $this->terminateWithError($this->p->t('projektarbeit', 'betreuerZugewiesen'), self::ERROR_TYPE_GENERAL); + } + } + + $result = null; + + $stunden = isset($projektbetreuer['stunden']) && !isEmptyString($projektbetreuer['stunden']) ? $projektbetreuer['stunden'] : null; + $stundensatz = + isset($projektbetreuer['stundensatz']) && !isEmptyString($projektbetreuer['stundensatz']) ? $projektbetreuer['stundensatz'] : null; + + $betreuer = [ + 'projektarbeit_id' => $projektarbeit_id, + 'person_id' => $projektbetreuer['person_id'], + 'note' => $projektbetreuer['note'], + 'stunden' => $stunden, + 'stundensatz' => $stundensatz, + 'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz'] + ]; + + if (isset($projektbetreuer['person_id_old']) && isset($projektbetreuer['betreuerart_kurzbz_old'])) + { + $result = $this->ProjektbetreuerModel->update( + [ + 'projektarbeit_id' => $projektarbeit_id, + 'person_id' => $projektbetreuer['person_id_old'], + 'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz_old'] + ], + array_merge($betreuer, ['updateamum' => date('c'), 'updatevon' => getAuthUID()]) + ); + } + else + { + $result = $this->ProjektbetreuerModel->insert( + array_merge($betreuer, ['insertamum' => date('c'), 'insertvon' => getAuthUID()]) + ); + } + + if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } + + /** + * Delete a Projektbetreuer assignment to a Projektarbeit. + */ + public function deleteProjektbetreuer() + { + $projektarbeit_id = $this->input->post('projektarbeit_id'); + $person_id = $this->input->post('person_id'); + $betreuerart_kurzbz = $this->input->post('betreuerart_kurzbz'); + + if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id)) + { + return $this->terminateWithError( + $this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'projektarbeit').' ID'], self::ERROR_TYPE_GENERAL) + ); + } + + if (!isset($person_id) || !is_numeric($person_id)) + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID'], self::ERROR_TYPE_GENERAL)); + + if (!isset($betreuerart_kurzbz)) + { + return $this->terminateWithError( + $this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'betreuerart')], self::ERROR_TYPE_GENERAL) + ); + } + + // check permission + if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id)) + return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]); + + $validate = $this->_validateDelete($projektarbeit_id, $person_id, $betreuerart_kurzbz); + + if (isError($validate)) return $this->terminateWithError(getError($validate), self::ERROR_TYPE_GENERAL); + + // check if there is a Projektarbeitsbeurteilung - if yes, it is handled (possibly deleted) by external extension. + $beurteilungDeleteSuccess = true; + + Events::trigger( + 'projektarbeitsbeurteilung_delete', + $projektarbeit_id, + function ($value) use (&$beurteilungDeleteSuccess) { + $beurteilungDeleteSuccess = $value; + } + ); + + // if there is still a Beurteilung, Projektarbeit cannot be deleted - return with error + if (!$beurteilungDeleteSuccess) return $this->terminateWithError($this->p->t('projektarbeit', 'error_paarbeitHatBeurteilung')); + + $result = $this->ProjektbetreuerModel->delete( + ['projektarbeit_id' => $projektarbeit_id, 'person_id' => $person_id, 'betreuerart_kurzbz' => $betreuerart_kurzbz] + ); + + if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + if (!hasData($result)) + { + $this->outputJson($result); + } + + return $this->terminateWithSuccess(getData($result)); + } + + /** + * Get all active Betreuerarten. + */ + public function getBetreuerarten() + { + $result = $this->BetreuerartModel->loadWhere(['aktiv' => true]); + + if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + return $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } + + /** + * Get all Noten. + */ + public function getNoten() + { + $result = $this->NoteModel->load(); + + if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + return $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } + + /** + * Get default Stundensätze for an employee in a semester. + */ + public function getDefaultStundensaetze() + { + $person_id = $this->input->get('person_id'); + $studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz'); + + $result = $this->StundensatzModel->getStundensatzForMitarbeiter($person_id, $studiensemester_kurzbz); + + return $this->terminateWithSuccess($result); + } + + /** + * Get all Projektbetreuer by search string. + */ + public function getProjektbetreuerBySearchQuery() + { + $searchString = $this->input->get('searchString'); + + if (!isset($searchString)) + $this->terminateWithError($this->p->t('ui', 'error_fieldRequired', ['field' => 'Search term']), self::ERROR_TYPE_GENERAL); + + $result = $this->PersonModel->searchPerson($searchString); + + if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + if (!hasData($result)) $this->terminateWithSuccess([]); + + $persons = $this->_addFullNameToBetreuer(getData($result)); + + // sort persons by type (employees first) + usort($persons, function ($a, $b) { + $statusRanks = ['Mitarbeiter' => 0, 'Person' => 1, 'Student' => 2]; + return (isset($statusRanks[$a->status]) ? $statusRanks[$a->status] : count($statusRanks) + 1) + - (isset($statusRanks[$b->status]) ? $statusRanks[$b->status] : count($statusRanks) + 1); + }); + + return $this->terminateWithSuccess($persons); + } + + /** + * Get person info by Id. + */ + public function getPerson() + { + $person_id = $this->input->get('person_id'); + + if (!isset($person_id)) + $this->terminateWithError($this->p->t('ui', 'error_fieldRequired', ['field' => 'Person']), self::ERROR_TYPE_GENERAL); + + $this->PersonModel->addSelect("CASE + WHEN EXISTS + (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=tbl_person.person_id) + THEN 'Mitarbeiter' + WHEN EXISTS + (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=tbl_person.person_id) + THEN 'Student' + ELSE 'Person' + END AS status"); + $result = $this->PersonModel->addSelect('titelpre, titelpost, vorname, nachname, person_id'); + $result = $this->PersonModel->load($person_id); + + if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + return $this->terminateWithSuccess(hasData($result) ? $this->_addFullNameToBetreuer(getData($result))[0] : []); + } + + /** + * Validate list of Projektbetreuer. + */ + public function validateProjektbetreuer() + { + $projektbetreuerArr = $this->input->post('projektbetreuer'); + + if (!is_array($projektbetreuerArr)) $projektbetreuerArr = [$projektbetreuerArr]; + + foreach ($projektbetreuerArr as $pb) + { + if ($this->_validate($pb) == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + } + + $this->terminateWithSuccess([]); + } + + /** + * Validation funciton for checking Projektbetreuer input. + * @param $formData Betreuer data + * @return bool true when data is valid + */ + private function _validate($formData) + { + $this->form_validation->set_data($formData); + + $this->form_validation->set_rules('betreuerart_kurzbz', 'Betreuerart', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('projektarbeit', 'betreuerart')]) + ]); + + $this->form_validation->set_rules('person_id', 'Person', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('projektarbeit', 'betreuer')]) + ]); + + $this->form_validation->set_rules('stunden', 'Stunden', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => $this->p->t('projektarbeit', 'stunden')]) + ]); + + $this->form_validation->set_rules('stundensatz', 'Stundensatz', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => $this->p->t('projektarbeit', 'stundensatz')]) + ]); + + + return $this->form_validation->run(); + } + + /** + * Check possibility of deletion of a Projektbetreuer. + * @param projektarbeit_id + * @param person_id + * @param betreuerart_kurzbz + * @return object success when delete possible, error otherwise + */ + private function _validateDelete($projektarbeit_id, $person_id, $betreuerart_kurzbz) + { + // check if contract exists + $this->ProjektbetreuerModel->addSelect('vertrag_id'); + $result = $this->ProjektbetreuerModel->loadWhere( + ['projektarbeit_id' => $projektarbeit_id, 'person_id' => $person_id, 'betreuerart_kurzbz' => $betreuerart_kurzbz] + ); + + if (isError($result)) return $result; + + // if contract exists, no deletion is possible + if (hasData($result) && getData($result)[0]->vertrag_id != null) return error($this->p->t('projektarbeit', 'error_betreuerHatVertrag')); + + return success(); + } + + /** + * Add full name to array with Betreuer. + * @param $betreuerArr + * @return array including Betreuer with their full names + */ + private function _addFullNameToBetreuer($betreuerArr) + { + foreach ($betreuerArr as $betreuer) + { + $betreuer->name = ($betreuer->titelpre ? $betreuer->titelpre . ' ' : '') . + $betreuer->nachname . ' ' . $betreuer->vorname . ($betreuer->titelpost ? ' ' . $betreuer->titelpre : ''). + ' (' . $betreuer->status . ')'; + } + + return $betreuerArr; + } +} diff --git a/application/controllers/api/frontend/v1/stv/Pruefung.php b/application/controllers/api/frontend/v1/stv/Pruefung.php index e205c85b8..4521c2033 100644 --- a/application/controllers/api/frontend/v1/stv/Pruefung.php +++ b/application/controllers/api/frontend/v1/stv/Pruefung.php @@ -18,6 +18,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); +use \DateTime as DateTime; + /** * This controller operates between (interface) the JS (GUI) and the back-end * Provides data to the ajax get calls about addresses @@ -111,7 +113,7 @@ class Pruefung extends FHCAPI_Controller // Load language phrases $this->loadPhrases([ - 'global', 'ui','lehre' + 'global', 'ui', 'lehre', 'exam' ]); } @@ -172,174 +174,11 @@ class Pruefung extends FHCAPI_Controller * * @param lehrveranstaltung_id, student_uid, lehreinheit_id * - * @return values on success - * retval 0: pruefung inserted - * reval 1: pruefung and zeugnisnote inserted - * retval 2: pruefung inserted, no insert Zeugnisnote - * (change after date of examination) - * retval 3: pruefung of type Termin2 inserted - * and pruefung of type Termin1 as well - * retval 5: prueufungen Termin 2 and 1 inserted - * and no insert Zeugnisnote (change after date of examination) + * @return void */ public function insertPruefung() { - $authUID = getAuthUID(); - - $this->load->library('form_validation'); - - $this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]), - ]); - $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]), - ]); - $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]), - ]); - $this->form_validation->set_rules( - 'datum', - $this->p->t('global', 'datum'), - ['is_valid_date'] - ); - - if ($this->form_validation->run() == false) - { - $this->terminateWithValidationErrors($this->form_validation->error_array()); - } - - //calculate studiensemester_kurzbz this from lehreinheit (case newPruefung) - $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); - if (!$studiensemester_kurzbz) - { - $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); - - $result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id')); - - $lehreinheit = $this->getDataOrTerminateWithError($result); - $studiensemester_kurzbz = current($lehreinheit)->studiensemester_kurzbz; - - if (isError($result)) - { - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - } - - $result = $this->PruefungModel->insert([ - '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'), - 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), - 'note' => $this->input->post('note'), - 'anmerkung' => $this->input->post('anmerkung'), - 'insertamum' => date('c'), - 'insertvon' => $authUID, - ]); - - $this->getDataOrTerminateWithError($result); - - //check if existing zeugnisnote - $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); - - $result = $this->ZeugnisnoteModel->loadWhere(array( - 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), - 'student_uid' => $this->input->post('student_uid'), - 'studiensemester_kurzbz' => $studiensemester_kurzbz)); - - if (isError($result)) - { - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - - if (!hasData($result)) - { - //insert zeugnisnote, if not existing - $result = $this->ZeugnisnoteModel->insert(array( - 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), - 'student_uid' => $this->input->post('student_uid'), - 'studiensemester_kurzbz' => $studiensemester_kurzbz, - 'note' => $this->input->post('note'), - 'uebernahmedatum' => date('c'), - 'benotungsdatum' => $this->input->post('datum'), - 'insertamum' => date('c'), - 'insertvon' => $authUID - )); - - if (isError($result)) - { - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - $this->terminateWithSuccess(1); - } - - $return_code = 0; - - //handling Termin1 if not existing - if($this->input->post('pruefungstyp_kurzbz') == "Termin2") - { - $resultP = $this->PruefungModel->loadWhere(array( - 'lehreinheit_id' => $this->input->post('lehreinheit_id'), - 'student_uid' => $this->input->post('student_uid'), - 'pruefungstyp_kurzbz' => 'Termin1')); - - if (isError($resultP)) - { - $this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL); - } - if(!hasData($resultP)) - { - //check if existing Zeugnisnote - $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); - $this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id'); - - $resultP = $this->ZeugnisnoteModel->loadWhere(array( - 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), - 'student_uid' => $this->input->input->post('student_uid'), - 'lehre.tbl_zeugnisnote.studiensemester_kurzbz' => $studiensemester_kurzbz)); - if (isError($resultP)) - { - $this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL); - } - if (!hasData($resultP)) - { - $this->terminateWithError("Zeugnisnote existiert nicht", self::ERROR_TYPE_GENERAL); - } - $dataNote = current(getData($resultP)); - - $resultN = $this->PruefungModel->insert([ - 'lehreinheit_id' => $this->input->post('lehreinheit_id'), - 'student_uid' => $this->input->post('student_uid'), - 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), - 'datum' => $dataNote->benotungsdatum, - 'pruefungstyp_kurzbz' => 'Termin1', - 'note' => $dataNote->note, - 'punkte' => $dataNote->punkte, - 'anmerkung' => 'automatisiert aus Zeugnisnote erstellt', - 'insertamum' => date('c'), - 'insertvon' => $authUID, - ]); - - if (isError($resultN)) { - $this->terminateWithError(getError($resultN), self::ERROR_TYPE_GENERAL); - } - $return_code = 3; - } - } - - $note = current(getData($result)); - $uebernahmedatum = new DateTime($note->uebernahmedatum); - $benotungsdatum = new DateTime($note->benotungsdatum); - - $checkDate = $uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum - ? $benotungsdatum - : $uebernahmedatum; - - if ($checkDate >= $this->input->post('datum') && $note !== $note->note) - { - $this->terminateWithSuccess($return_code + 2); - } - $this->terminateWithSuccess($return_code + 2); + $this->insertOrUpdatePruefung(); } /** @@ -348,8 +187,6 @@ class Pruefung extends FHCAPI_Controller * @param pruefung_id * * @return success or error - * - * no impact on lehre.tbl_zeugnisnote */ public function updatePruefung($pruefung_id) { @@ -359,48 +196,7 @@ class Pruefung extends FHCAPI_Controller if (!$oldpruefung) show_404(); // Pruefung that should be updated does not exist - $authUID = getAuthUID(); - - $this->load->library('form_validation'); - - $this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]), - ]); - $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]), - ]); - $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]), - ]); - $this->form_validation->set_rules( - 'datum', - $this->p->t('global', 'datum'), - ['is_valid_date'] - ); - - if ($this->form_validation->run() == false) - { - $this->terminateWithValidationErrors($this->form_validation->error_array()); - } - - $result = $this->PruefungModel->update( - [ - 'pruefung_id' => $pruefung_id - ], - [ 'lehreinheit_id' => $this->input->post('lehreinheit_id'), - 'student_uid' => $this->input->post('student_uid'), - 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), - 'note' => $this->input->post('note'), - 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), - 'datum' => $this->input->post('datum'), - 'anmerkung' => $this->input->post('anmerkung'), - 'updatevon' => $authUID, - 'updateamum' => date('c'), - ] - ); - $this->getDataOrTerminateWithError($result); - - return $this->outputJsonSuccess(true); + $this->insertOrUpdatePruefung($pruefung_id); } /** @@ -574,4 +370,198 @@ class Pruefung extends FHCAPI_Controller return $this->terminateWithSuccess($data); } + + protected function insertOrUpdatePruefung($pruefung_id=null) + { + $authUID = getAuthUID(); + + $this->load->library('form_validation'); + + $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]), + ]); + $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]), + ]); + $this->form_validation->set_rules( + 'datum', + $this->p->t('global', 'datum'), + ['is_valid_date'] + ); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $this->PruefungModel->db->trans_start(); + + if ($this->input->post('pruefungstyp_kurzbz') == "Termin2") + { + //Wenn ein 2. Termin angelegt wird, und kein 1. Termin vorhanden ist, + //dann wird auch ein 1. Termin angelegt mit der derzeitigen Zeugnisnote + $resultP = $this->PruefungModel->loadWhere(array( + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'pruefungstyp_kurzbz' => 'Termin1')); + + $termin1 = $this->getDataOrTerminateWithError($resultP); + if (!$termin1) + { + //check if existing Zeugnisnote + $this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id'); + + $this->ZeugnisnoteModel->db->where( + 'lehre.tbl_zeugnisnote.studiensemester_kurzbz', + 'lehre.tbl_lehreinheit.studiensemester_kurzbz', + false + ); + $resultP = $this->ZeugnisnoteModel->loadWhere(array( + 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), + 'student_uid' => $this->input->post('student_uid') + )); + + $zeugnisnoten = $this->getDataOrTerminateWithError($resultP); + if ($zeugnisnoten) + { + $zeugnisnote = current($zeugnisnoten); + + $resultN = $this->PruefungModel->insert([ + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), + 'datum' => $zeugnisnote->benotungsdatum, + 'pruefungstyp_kurzbz' => 'Termin1', + 'note' => $zeugnisnote->note, + 'punkte' => $zeugnisnote->punkte, + 'anmerkung' => 'automatisiert aus Zeugnisnote erstellt', + 'insertamum' => date('c'), + 'insertvon' => $authUID, + ]); + + $this->getDataOrTerminateWithError($resultN); + } + //Wenn keine Zeugnisnote vorhanden ist, dann wird kein + //1.Termin angelegt + } + } + + if(intval($pruefung_id) > 0) + { + $result = $this->PruefungModel->update( + [ + 'pruefung_id' => $pruefung_id + ], + [ 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), + 'note' => $this->input->post('note'), + 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), + 'datum' => $this->input->post('datum'), + 'anmerkung' => $this->input->post('anmerkung'), + 'updatevon' => $authUID, + 'updateamum' => date('c'), + ] + ); + } + else + { + $result = $this->PruefungModel->insert([ + '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'), + 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), + 'note' => $this->input->post('note'), + 'anmerkung' => $this->input->post('anmerkung'), + 'insertamum' => date('c'), + 'insertvon' => $authUID, + 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null + ]); + } + + $this->getDataOrTerminateWithError($result); + + //get studiensemester_kurzbz and lehreveranstaltung_id from lehreinheit + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + $result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id')); + + $lehreinheiten = $this->getDataOrTerminateWithError($result); + + if (!$lehreinheiten) { + $this->terminateWithValidationErrors([ + 'lehreinheit_id' => $this->p->t('ui', 'error_fieldNotFound', [ + 'field' => $this->p->t('lehre', 'lehreinheit') + ]) + ]); + } + $lehreinheit = current($lehreinheiten); + $studiensemester_kurzbz = $lehreinheit->studiensemester_kurzbz; + $lehrveranstaltung_id = $lehreinheit->lehrveranstaltung_id; + + //check if existing zeugnisnote + $result = $this->ZeugnisnoteModel->loadWhere(array( + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'student_uid' => $this->input->post('student_uid'), + 'studiensemester_kurzbz' => $studiensemester_kurzbz + )); + + $zeugnisnoten = $this->getDataOrTerminateWithError($result); + + if (!$zeugnisnoten) + { + //insert zeugnisnote, if not existing + $result = $this->ZeugnisnoteModel->insert(array( + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'student_uid' => $this->input->post('student_uid'), + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'note' => $this->input->post('note'), + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $this->input->post('datum'), + 'insertamum' => date('c'), + 'insertvon' => $authUID, + 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null + )); + + $this->getDataOrTerminateWithError($result); + + $this->PruefungModel->db->trans_complete(); + $this->terminateWithSuccess(); + } + + $note = current($zeugnisnoten); + $uebernahmedatum = new DateTime($note->uebernahmedatum); + $benotungsdatum = new DateTime($note->benotungsdatum); + $pruefungsdatum = new DateTime($this->input->post('datum')); + + $checkDate = $note->uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum + ? $benotungsdatum + : $uebernahmedatum; + + if ($checkDate > $pruefungsdatum && $this->input->post('note') !== $note->note) + { + $this->PruefungModel->db->trans_complete(); + $this->terminateWithSuccess($this->p->t('exam', 'hinweis_changeAfterExamDate')); + } + + //update zeugnisnote, if existing and valid datum + $result = $this->ZeugnisnoteModel->update([ + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'student_uid' => $this->input->post('student_uid'), + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ], [ + 'note' => $this->input->post('note'), + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $this->input->post('datum'), + 'updateamum' => date('c'), + 'updatevon' => $authUID, + 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null + ]); + + $this->PruefungModel->db->trans_complete(); + $this->terminateWithSuccess(); + } } diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php index 8167bd90f..3c0a639cd 100644 --- a/application/controllers/api/frontend/v1/stv/Status.php +++ b/application/controllers/api/frontend/v1/stv/Status.php @@ -24,12 +24,12 @@ class Status extends FHCAPI_Controller 'updateStatus' => ['admin:rw', 'assistenz:rw'], 'advanceStatus' => ['admin:rw', 'assistenz:rw'], 'confirmStatus' => ['admin:rw', 'assistenz:rw'], - ]); //Load Models $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); $this->load->model('person/Person_model', 'PersonModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); // Load Libraries $this->load->library('VariableLib', ['uid' => getAuthUID()]); @@ -114,9 +114,8 @@ class Status extends FHCAPI_Controller $this->load->model('codex/Bismeldestichtag_model', 'BismeldestichtagModel'); $result = $this->BismeldestichtagModel->getLastReachedMeldestichtag(); - $data = $this->getDataOrTerminateWithError($result); - $this->terminateWithSuccess($data); + $this->terminateWithSuccess(hasData($result) ? getData($result) : array()); } public function isLastStatus($prestudent_id) @@ -189,9 +188,13 @@ class Status extends FHCAPI_Controller $studiensemester_kurzbz = $lastStatusData->studiensemester_kurzbz; if ($status_kurzbz == Prestudentstatus_model::STATUS_ABSOLVENT || $status_kurzbz == Prestudentstatus_model::STATUS_DIPLOMAND - ) { - $this->load->library('VariableLib', ['uid' => getAuthUID()]); - $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); + ) + { + $studiensemester_kurzbz = $this->input->post('currentSemester'); + if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } } $ausbildungssemester = $lastStatusData->ausbildungssemester; @@ -282,17 +285,17 @@ class Status extends FHCAPI_Controller ]); $this->form_validation->set_rules('_default', '', [ - ['meldestichtag_not_exceeded', function () use ($datum, $isBerechtigtNoStudstatusCheck) { + ['meldestichtag_not_exceeded', function () use ($datum_string, $isBerechtigtNoStudstatusCheck) { if ($isBerechtigtNoStudstatusCheck) return true; // Skip if access right says so - $result = $this->prestudentstatuschecklib->checkIfMeldestichtagErreicht($datum); + $result = $this->prestudentstatuschecklib->checkIfMeldestichtagErreicht($datum_string); return !$this->getDataOrTerminateWithError($result); }], //Check if Rolle already exists ['rolle_doesnt_exist', function () use ($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester) { - if (!$status_kurzbz || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->PrestudentstatusModel->load([$ausbildungssemester, $studiensemester_kurzbz, $status_kurzbz, $prestudent_id]); @@ -435,9 +438,10 @@ class Status extends FHCAPI_Controller ]); if (!$this->form_validation->run()) + { $this->terminateWithValidationErrors($this->form_validation->error_array()); + } - $this->load->library('PrestudentLib'); $this->db->trans_start(); @@ -623,15 +627,16 @@ class Status extends FHCAPI_Controller ]); if (!$this->form_validation->run()) + { $this->terminateWithValidationErrors($this->form_validation->error_array()); - + } // Start DB transaction $this->db->trans_start(); $this->load->library('PrestudentLib'); - $this->prestudentlib->setFirstStudent( + $resFirstStudent = $this->prestudentlib->setFirstStudent( $prestudent_id, $lastAufgenommener->studiensemester_kurzbz, $lastAufgenommener->ausbildungssemester, @@ -640,9 +645,8 @@ class Status extends FHCAPI_Controller $this->input->post('statusgrund_id') ); - $this->getDataOrTerminateWithError($result); - - $this->db->trans_commit(); + $this->db->trans_complete(); + $this->getDataOrTerminateWithError($resFirstStudent); return $this->outputJsonSuccess(true); } @@ -727,8 +731,9 @@ class Status extends FHCAPI_Controller ); $result = $this->prestudentstatuschecklib->checkIfMeldestichtagErreicht($oldstatus->datum); + $isMeldestichtagErreicht = $this->getDataOrTerminateWithError($result); - if (!$this->getDataOrTerminateWithError($result)) + if ($isMeldestichtagErreicht) $this->terminateWithError( $this->p->t('lehre', 'error_dataVorMeldestichtag'), self::ERROR_TYPE_GENERAL, @@ -739,8 +744,12 @@ class Status extends FHCAPI_Controller // Start DB transaction $this->db->trans_begin(); + //Delete Studentlehrverband if no Status left in this semester + $cilsresult = $this->PrestudentstatusModel->checkIfLastStatusEntry($prestudent_id, $studiensemester_kurzbz); + $isLastPrestudentStatusForSemester = $this->getDataOrTerminateWithError($cilsresult); + //Delete Status - $result = $this->PrestudentstatusModel->delete( + $delpsresult = $this->PrestudentstatusModel->delete( [ 'prestudent_id' => $prestudent_id, 'status_kurzbz' => $status_kurzbz, @@ -748,14 +757,9 @@ class Status extends FHCAPI_Controller 'studiensemester_kurzbz' => $studiensemester_kurzbz ] ); + $this->getDataOrTerminateWithError($delpsresult); - $this->getDataOrTerminateWithError($result); - - //Delete Studentlehrverband if no Status left in this semester - $result = $this->PrestudentstatusModel->checkIfLastStatusEntry($prestudent_id, $studiensemester_kurzbz); - - $result = $this->getDataOrTerminateWithError($result); - if ($result) + if ($isLastPrestudentStatusForSemester) { //get student_uid $this->load->model('crm/Student_model', 'StudentModel'); @@ -897,7 +901,7 @@ class Status extends FHCAPI_Controller $this->form_validation->set_rules('_default', '', [ ['rolle_doesnt_exist', function () use ($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester) { - if (!$status_kurzbz || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->PrestudentstatusModel->load([$ausbildungssemester, $studiensemester_kurzbz, $status_kurzbz, $prestudent_id]); @@ -914,7 +918,7 @@ class Status extends FHCAPI_Controller ) { if ($isBerechtigtNoStudstatusCheck) return true; // Skip if access right says so - if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->prestudentstatuschecklib->checkStatusHistoryTimesequence( @@ -939,7 +943,7 @@ class Status extends FHCAPI_Controller ) { if ($isBerechtigtNoStudstatusCheck) return true; // Skip if access right says so - if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->prestudentstatuschecklib->checkStatusHistoryLaststatus( @@ -964,7 +968,7 @@ class Status extends FHCAPI_Controller ) { if ($isBerechtigtNoStudstatusCheck) return true; // Skip if access right says so - if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->prestudentstatuschecklib->checkStatusHistoryUnterbrechersemester( @@ -989,7 +993,7 @@ class Status extends FHCAPI_Controller ) { if ($isBerechtigtNoStudstatusCheck) return true; // Skip if access right says so - if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->prestudentstatuschecklib->checkStatusHistoryAbbrechersemester( @@ -1014,7 +1018,7 @@ class Status extends FHCAPI_Controller ) { if ($isBerechtigtNoStudstatusCheck) return true; // Skip if access right says so - if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->prestudentstatuschecklib->checkStatusHistoryDiplomant( @@ -1073,6 +1077,24 @@ class Status extends FHCAPI_Controller $this->terminateWithSuccess(true); } + protected function checkForCriticalChangesBis($oldstatus) + { + $changedFields = array(); + $allowedFields = array('anmerkung', 'statusgrund_id'); + $oldstatus_array = get_object_vars($oldstatus); + foreach($oldstatus_array as $key => $oldValue) + { + $newValue = $this->input->post($key); + if( $newValue !== $oldValue ) + { + $changedFields[] = $key; + } + } + $criticalFieldsChanged = array_diff($changedFields, $allowedFields); + $hasCriticalChangesBis = count($criticalFieldsChanged) > 0 ? true : false; + return $hasCriticalChangesBis; + } + /** * Updates a status entry * @@ -1097,6 +1119,7 @@ class Status extends FHCAPI_Controller $oldstatus = current($oldstatus); + $hasCriticalChangesBis = $this->checkForCriticalChangesBis($oldstatus); $isBerechtigtNoStudstatusCheck = $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'); $isBerechtigtBasisPrestudentstatus = $this->permissionlib->isBerechtigt('basis/prestudentstatus'); @@ -1107,7 +1130,6 @@ class Status extends FHCAPI_Controller $ausbildungssemester = $this->input->post('ausbildungssemester') ?: $oldstatus->ausbildungssemester; $datum = $this->input->post('datum') ?: $oldstatus->datum; - //Form Validation $this->load->library('form_validation'); @@ -1130,9 +1152,15 @@ class Status extends FHCAPI_Controller $this->p->t('global', 'datum'), [ 'is_valid_date', - ['meldestichtag_not_exceeded', function ($value) use ($isBerechtigtNoStudstatusCheck) { + ['meldestichtag_not_exceeded', function ($value) use ($isBerechtigtNoStudstatusCheck, $hasCriticalChangesBis){ if ($isBerechtigtNoStudstatusCheck) - return true; // Skip if access right says so + { + return true; // Skip if access right says so*/ + } + if (!$hasCriticalChangesBis) { + return true; // Skip if no critical changes were made + } + if (!$value) return true; // Error will be handled by the required statement above @@ -1336,6 +1364,7 @@ class Status extends FHCAPI_Controller 'updateamum' => date('c'), 'updatevon' => $authUID ]; + $nullableFields = ['statusgrund_id', 'anmerkung', 'rt_stufe']; foreach ([ 'orgform_kurzbz', 'anmerkung', @@ -1344,8 +1373,17 @@ class Status extends FHCAPI_Controller 'rt_stufe', 'statusgrund_id' ] as $key) - if ($this->input->post($key)) + { + if (in_array($key, $nullableFields)) + { + $updateData[$key] = ($this->input->post($key) === '') ? null : $this->input->post($key); + } + else if ($this->input->post($key)) + { $updateData[$key] = $this->input->post($key); + } + } + if ($this->input->post('bestaetigtam')) { $updateData['bestaetigtam'] = $this->input->post('bestaetigtam'); @@ -1529,9 +1567,32 @@ class Status extends FHCAPI_Controller $newStudentlvb['semester'] = $ausbildungssemester; } // If there is no lehrverband just use the same as in the previous studiensemester - - //add studentlehrverband - $result = $this->StudentlehrverbandModel->insert($newStudentlvb); + $checkres = $this->StudentlehrverbandModel->load(array( + 'student_uid' => $studentlvb->student_uid, + 'studiensemester_kurzbz' => $studiensemester_kurzbz + )); + if(hasData($checkres)) + { + $result = $this->StudentlehrverbandModel->update( + array( + 'student_uid' => $studentlvb->student_uid, + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ), + array( + 'studiengang_kz' => $studentlvb->studiengang_kz, + 'semester' => $studentlvb->semester, + 'verband' => $studentlvb->verband, + 'gruppe' => $studentlvb->gruppe, + 'updateamum' => $now, + 'updatevon' => $authUID + ) + ); + } + else + { + //add studentlehrverband + $result = $this->StudentlehrverbandModel->insert($newStudentlvb); + } $this->getDataOrTerminateWithError($result); diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php index d21e4e135..f01f3e138 100644 --- a/application/controllers/api/frontend/v1/stv/Student.php +++ b/application/controllers/api/frontend/v1/stv/Student.php @@ -36,7 +36,8 @@ class Student extends FHCAPI_Controller parent::__construct([ 'get' => ['admin:r', 'assistenz:r'], 'save' => ['admin:rw', 'assistenz:rw'], - 'check' => ['admin:rw', 'assistenz:rw'], + 'saveStudent' => ['admin:rw', 'assistenz:rw'], + 'getPerson' => ['admin:rw', 'assistenz:rw'], 'add' => ['admin:rw', 'assistenz:rw'] // TODO(chris): extra permissions ]); @@ -55,7 +56,7 @@ class Student extends FHCAPI_Controller // Load language phrases $this->loadPhrases([ - 'ui', 'lehre' + 'ui', 'lehre', 'person' ]); } @@ -68,13 +69,28 @@ class Student extends FHCAPI_Controller * @param string $prestudent_id * @return void */ - public function get($prestudent_id) + public function get($prestudent_id, $studiensemester_kurzbz) { - $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); - $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } - $this->PrestudentModel->addSelect('p.*'); + $this->PrestudentModel->addSelect('p.person_id'); + $this->PrestudentModel->addSelect('p.titelpre'); + $this->PrestudentModel->addSelect('p.nachname'); + $this->PrestudentModel->addSelect('p.vorname'); + $this->PrestudentModel->addSelect('p.wahlname'); + $this->PrestudentModel->addSelect('p.vornamen'); + $this->PrestudentModel->addSelect('p.titelpost'); + $this->PrestudentModel->addSelect('p.svnr'); + $this->PrestudentModel->addSelect('p.ersatzkennzeichen'); + $this->PrestudentModel->addSelect('p.gebdatum'); + $this->PrestudentModel->addSelect('p.geschlecht'); + $this->PrestudentModel->addSelect('p.foto'); + $this->PrestudentModel->addSelect('p.foto_sperre'); $this->PrestudentModel->addSelect('s.student_uid'); $this->PrestudentModel->addSelect('matrikelnr'); $this->PrestudentModel->addSelect('b.aktiv'); @@ -82,21 +98,48 @@ class Student extends FHCAPI_Controller $this->PrestudentModel->addSelect('v.verband'); $this->PrestudentModel->addSelect('v.gruppe'); $this->PrestudentModel->addSelect('b.alias'); + $this->PrestudentModel->addSelect('p.geburtsnation'); + $this->PrestudentModel->addSelect('p.sprache'); + $this->PrestudentModel->addSelect('p.gebort'); + $this->PrestudentModel->addSelect('p.homepage'); + $this->PrestudentModel->addSelect('p.anmerkung'); + $this->PrestudentModel->addSelect('p.familienstand'); + $this->PrestudentModel->addSelect('p.staatsbuergerschaft'); + $this->PrestudentModel->addSelect('p.matr_nr'); + $this->PrestudentModel->addSelect('p.anrede'); + $this->PrestudentModel->addSelect('p.zugangscode'); if (defined('ACTIVE_ADDONS') && strpos(ACTIVE_ADDONS, 'bewerbung') !== false) { $this->PrestudentModel->addSelect( "( - SELECT kontakt - FROM public.tbl_kontakt - WHERE kontakttyp='email' - AND person_id=p.person_id - AND zustellung - ORDER BY kontakt_id + SELECT kontakt + FROM public.tbl_kontakt + WHERE kontakttyp='email' + AND person_id=p.person_id + AND zustellung + ORDER BY kontakt_id DESC LIMIT 1 ) AS email_privat", false ); + $this->PrestudentModel->addSelect( + "( + SELECT kontakt + FROM public.tbl_kontakt + WHERE kontakttyp='email_unverifiziert' + AND person_id=p.person_id + AND zustellung + ORDER BY kontakt_id DESC + LIMIT 1 + ) AS email_privat_unverified", + false + ); } + $this->PrestudentModel->addSelect( + "public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, " + . $this->PrestudentModel->escape($studiensemester_kurzbz) + . ") AS statusofsemester" + ); $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT'); $this->PrestudentModel->addJoin('public.tbl_benutzer b', 'student_uid = uid', 'LEFT'); @@ -106,43 +149,76 @@ class Student extends FHCAPI_Controller 'LEFT' ); $this->PrestudentModel->addJoin('public.tbl_person p', 'p.person_id = tbl_prestudent.person_id'); +/* $this->PrestudentModel->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id = tbl_prestudent.prestudent_id + AND pss.studiensemester_kurzbz = ' . $this->PrestudentModel->escape($studiensemester_kurzbz), + 'LEFT');*/ + + $result = $this->PrestudentModel->loadWhere(['tbl_prestudent.prestudent_id' => $prestudent_id]); - $result = $this->PrestudentModel->loadWhere(['prestudent_id' => $prestudent_id]); - $student = $this->getDataOrTerminateWithError($result); - + if (!$student) return show_404(); + $this->terminateWithSuccess(current($student)); } + protected function isLaufendesSemester($selectedSemester) + { + $laufendesStudiensemester = ''; + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $result = $this->StudiensemesterModel->getAktOrNextSemester(); + if(hasData($result)) { + $laufendesStudiensemester = (getData($result))[0]->studiensemester_kurzbz; + } + + $islaufendesSemester = $selectedSemester === $laufendesStudiensemester; + return $islaufendesSemester; + } + /** * Saves data to a prestudent * * @param string $prestudent_id * @return void */ - public function save($prestudent_id) + public function save($prestudent_id, $studiensemester_kurzbz) { - $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); - $this->load->model('person/Person_model', 'PersonModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); $this->load->model('crm/Student_model', 'StudentModel'); $this->load->model('crm/Prestudent_model', 'PrestudentModel'); $this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); + $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); $this->load->library('form_validation'); + if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } + + $authuid = getAuthUID(); + $now = date('c'); + $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'is_valid_date'); - $this->form_validation->set_rules('semester', 'Semester', 'integer'); + $this->form_validation->set_rules('semester', 'Semester', 'integer', [ + 'integer' => $this->p->t('ui', 'error_fieldNotInteger') + ] + ); + + $this->form_validation->set_rules('alias', 'Alias', 'regex_match[/^[-a-z0-9\_\.]*[a-z0-9]{1,}\.[-a-z0-9\_]{1,}$/]', + [ + 'regex_match' => $this->p->t('ui', 'error_fieldInvalidAlias') + ]); $this->load->library('UDFLib'); - + $result = $this->udflib->getCiValidations($this->PersonModel, $this->input->post()); - //TODO(Manu) check with Chris: input number not allowed $udf_field_validations = $this->getDataOrTerminateWithError($result); $this->form_validation->set_rules($udf_field_validations); @@ -151,18 +227,19 @@ class Student extends FHCAPI_Controller $this->terminateWithValidationErrors($this->form_validation->error_array()); $result = $this->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]); - + $student = $this->getDataOrTerminateWithError($result); $uid = $student ? current($student)->student_uid : null; + $studiengang_kz = $student ? current($student)->studiengang_kz : null; + $result = $this->PrestudentModel->loadWhere(['prestudent_id' => $prestudent_id]); $person = $this->getDataOrTerminateWithError($result); $person_id = $person ? current($person)->person_id : null; - $array_allowed_props_lehrverband = ['verband', 'semester', 'gruppe']; $update_lehrverband = array(); foreach ($array_allowed_props_lehrverband as $prop) { @@ -184,7 +261,6 @@ class Student extends FHCAPI_Controller 'gebdatum', 'gebort', 'geburtsnation', - 'svnr', 'ersatzkennzeichen', 'staatsbuergerschaft', 'matr_nr', @@ -195,7 +271,7 @@ class Student extends FHCAPI_Controller 'anmerkung', 'homepage' ]; - + // add UDFs $result = $this->udflib->getDefinitionForModel($this->PersonModel); @@ -207,12 +283,26 @@ class Student extends FHCAPI_Controller $update_person = array(); foreach ($array_allowed_props_person as $prop) { $val = $this->input->post($prop); - if ($val !== null) { + if ($val === null) + { + continue; + } + if($prop == 'foto') + { + $fotoval = ($val == '') ? null : str_replace('data:image/jpeg;base64,', '', $val); + $update_person[$prop] = $fotoval; + } + else + { $update_person[$prop] = $val; } } $array_allowed_props_student = ['matrikelnr']; + if($this->isLaufendesSemester($studiensemester_kurzbz)) + { + $array_allowed_props_student = ['matrikelnr', 'verband', 'semester', 'gruppe']; + } $update_student = array(); foreach ($array_allowed_props_student as $prop) { $val = $this->input->post($prop); @@ -221,6 +311,19 @@ class Student extends FHCAPI_Controller } } + $array_allowed_props_benutzer = ['aktiv', 'alias']; + $update_benutzer = array(); + foreach ($array_allowed_props_benutzer as $prop) { + $val = $this->input->post($prop); + if ($val !== null) { + if($prop === 'alias' && $val === '') + { + $val = null; + } + $update_benutzer[$prop] = $val; + } + } + // Check PKs if (count($update_lehrverband) + count($update_student) && $uid === null) { $this->terminateWithValidationErrors(['' => $this->p->t('lehre', 'error_no_student')]); @@ -228,17 +331,69 @@ class Student extends FHCAPI_Controller if (count($update_person) && $person_id === null) { $this->terminateWithValidationErrors(['' => $this->p->t('lehre', 'error_no_person')]); } + if (count($update_benutzer) && $uid === null) { + $this->terminateWithValidationErrors(['' => $this->p->t('lehre', 'error_no_student')]); + } // Do Updates if (count($update_lehrverband)) { - $result = $this->StudentlehrverbandModel->update([ + + $curstudlvb = $this->StudentlehrverbandModel->load([ 'studiensemester_kurzbz' => $studiensemester_kurzbz, 'student_uid' => $uid - ], $update_lehrverband); + ]); + + $data = $this->getDataOrTerminateWithError($curstudlvb); + $data = current($data); + + $verbandCurrent = $data->verband; + $studiengang_kz = $data->studiengang_kz; + $semesterCurrent = $data->semester; + $gruppeCurrent = $data->gruppe; + + $verband = isset($update_lehrverband['verband']) ? $update_lehrverband['verband'] : $verbandCurrent; + $gruppe = isset($update_lehrverband['gruppe']) ? $update_lehrverband['gruppe'] : $gruppeCurrent; + $semester = isset($update_lehrverband['semester']) ? $update_lehrverband['semester'] : $semesterCurrent; + + //check if existing Lehrverband of new data to avoid Error + $result = $this->LehrverbandModel->loadWhere([ + 'verband' => $verband, + 'gruppe' => $gruppe, + 'semester' => $semester, + 'studiengang_kz' => $studiengang_kz, + ]); + + if(!hasData($result)) + { + $this->terminateWithError($this->p->t('lehre', 'error_noLehrverband'), self::ERROR_TYPE_GENERAL); + } + + if(hasData($curstudlvb) && count(getData($curstudlvb)) > 0 ) + { + $update_lehrverband['updatevon'] = $authuid; + $update_lehrverband['updateamum'] = $now; + $result = $this->StudentlehrverbandModel->update([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $uid + ], $update_lehrverband); + } + else + { + $update_lehrverband['insertvon'] = $authuid; + $update_lehrverband['insertamum'] = $now; + $result = $this->StudentlehrverbandModel->insert(array_merge([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $uid, + 'studiengang_kz' => $studiengang_kz + ], $update_lehrverband)); + } + $this->getDataOrTerminateWithError($result); } if (count($update_person)) { + $update_person['updatevon'] = $authuid; + $update_person['updateamum'] = $now; $result = $this->PersonModel->update( $person_id, $update_person @@ -248,6 +403,8 @@ class Student extends FHCAPI_Controller if (count($update_student)) { + $update_student['updatevon'] = $authuid; + $update_student['updateamum'] = $now; $result = $this->StudentModel->update( [$uid], $update_student @@ -255,14 +412,55 @@ class Student extends FHCAPI_Controller $this->getDataOrTerminateWithError($result); } + if (count($update_benutzer)) { + $update_benutzer['updatevon'] = $authuid; + $update_benutzer['updateamum'] = $now; + if (array_key_exists("aktiv", $update_benutzer)) + { + $update_benutzer['updateaktivvon'] = $authuid; + $update_benutzer['updateaktivam'] = $now; + } + $result = $this->BenutzerModel->update( + [$uid], + $update_benutzer + ); + $this->getDataOrTerminateWithError($result); + } + $this->terminateWithSuccess(array_fill_keys(array_merge( array_keys($update_lehrverband), array_keys($update_person), - array_keys($update_student) + array_keys($update_student), + array_keys($update_benutzer) ), '')); } - public function check() + /** + * Saves data to a prestudent using their student_uid + * + * @param string $student_uid + * @param string $studiensemester_kurzbz + * @return void + */ + public function saveStudent($student_uid, $studiensemester_kurzbz) + { + $this->load->model('crm/Student_model', 'StudentModel'); + + $result = $this->StudentModel->load([$student_uid]); + + $data = $this->getDataOrTerminateWithError($result); + + if (!$data) + show_404(); // No Student with that ID + + $student = current($data); + + $this->checkPermissionsForPrestudent($student->prestudent_id, ['admin:rw', 'assistenz:rw']); + + return $this->save($student->prestudent_id, $studiensemester_kurzbz); + } + + public function getPerson() { $this->load->library('form_validation'); @@ -280,21 +478,55 @@ class Student extends FHCAPI_Controller $this->load->model('person/Person_model', 'PersonModel'); + $this->PersonModel->addSelect( + 'person_id, vorname, nachname, vornamen, wahlname, gebdatum, staatsbuergerschaft, geburtsnation, sprache, anrede, + titelpost, titelpre, gebort, gebzeit, homepage, geschlecht, matr_nr, + aktiv, unruly, tbl_geschlecht.bezeichnung_mehrsprachig AS geschlecht_bezeichnung' + ); + $this->PersonModel->addJoin('public.tbl_geschlecht', 'geschlecht'); + if ($gebdatum) $this->PersonModel->db->where('gebdatum', (new DateTime($gebdatum))->format('Y-m-d')); if ($vorname && $nachname) { $this->PersonModel->db->or_group_start(); - $this->PersonModel->db->where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->db->escape($nachname) . ')', false); - $this->PersonModel->db->where('LOWER(vorname)', 'LOWER(' . $this->PersonModel->db->escape($vorname) . ')', false); + $this->PersonModel->db->where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->db->escape(trim($nachname)) . ')', false); + $this->PersonModel->db->where('LOWER(vorname)', 'LOWER(' . $this->PersonModel->db->escape(trim($vorname)) . ')', false); $this->PersonModel->db->group_end(); } elseif ($nachname) { - $this->PersonModel->db->or_where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->escape($nachname) . ')', false); + $this->PersonModel->db->or_where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->escape(trim($nachname)) . ')', false); } $result = $this->PersonModel->load(); $data = $this->getDataOrTerminateWithError($result); + $this->load->model('person/Adresse_model', 'AdresseModel'); + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + + foreach ($data as $person) + { + // get adresses + $langIdx = $this->_getLanguageIndex() - 1; + $person->geschlecht_bezeichnung = isset($person->geschlecht_bezeichnung[$langIdx]) ? $person->geschlecht_bezeichnung[$langIdx] : ''; + + // get Adresse + $this->AdresseModel->addOrder('heimatadresse', 'DESC'); + $this->AdresseModel->addOrder('zustelladresse', 'DESC'); + $this->AdresseModel->addOrder('adresse_id', 'DESC'); + $result = $this->AdresseModel->loadWhere(['person_id' => $person->person_id]); + + $adressen = $this->getDataOrTerminateWithError($result); + + $person->adressen = $adressen; + + // get status + $result = $this->PrestudentstatusModel->getLastStatusPerson($person->person_id); + + $status = $this->getDataOrTerminateWithError($result); + + $person->status = $status; + } + $this->terminateWithSuccess($data); } @@ -303,13 +535,12 @@ class Student extends FHCAPI_Controller if (!$this->input->post('person_id')) { if (!isset($_POST['address']) || !is_array($_POST['address'])) $_POST['address'] = []; - $_POST['address']['func'] = 1; } if ($this->input->post('incoming')) { $_POST['ausbildungssemester'] = 0; } - $this->load->library('form_validation'); + $this->_validate(); $this->form_validation->set_rules('nachname', 'Nachname', 'callback_requiredIfNotPersonId', [ 'requiredIfNotPersonId' => $this->p->t('ui', 'error_required') @@ -344,28 +575,50 @@ class Student extends FHCAPI_Controller $this->terminateWithValidationErrors($this->form_validation->error_array()); // TODO(chris): This should be in a library + $this->load->model('crm/Student_model', 'StudentModel'); $this->load->model('crm/Prestudent_model', 'PrestudentModel'); $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); + $this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); - $this->db->trans_start(); + $this->load->library('PrestudentLib'); - $result = $this->addInteressent(); + $errors = []; + $person_id = null; - $this->db->trans_complete(); + $this->db->trans_begin(); - if ($this->db->trans_status() === FALSE) - $this->terminateWithError('TODO(chris): TEXT', self::ERROR_TYPE_GENERAL); + $result = $this->_addPerson(); + if (isError($result)) $errors[] = getError($result); - $this->terminateWithSuccess($result); + if (hasData($result)) + { + $person_id = getData($result); + $result = $this->_addAdresse($person_id); + if (isError($result)) $errors[] = getError($result); + $result = $this->_addKontakt($person_id); + if (isError($result)) $errors[] = getError($result); + if (!$this->input->post('personOnly')) $result = $this->_addFirstPrestudentstatus($person_id); + if (isError($result)) $errors[] = getError($result); + } + + if ($this->db->trans_status() === FALSE || !isEmptyArray($errors)) + { + $this->db->trans_rollback(); + $this->terminateWithError(isEmptyArray($errors) ? $this->p->t('stv', 'error_add_student') : $errors); + } + $this->db->trans_commit(); + + $this->terminateWithSuccess($person_id); } - protected function addInteressent() + private function _addPerson() { // Person anlegen wenn nötig $person_id = $this->input->post('person_id'); if (!$person_id) { $this->load->model('person/Person_model', 'PersonModel'); - + $data = [ 'nachname' => $this->input->post('nachname'), 'insertamum' => date('c'), @@ -388,19 +641,25 @@ class Student extends FHCAPI_Controller if ($this->input->post('geschlecht')) $data['geschlecht'] = $this->input->post('geschlecht'); if ($this->input->post('gebdatum')) - $data['gebdatum'] = (new DateTime($this->input->post('datum_obj')))->format('Y-m-d'); + $data['gebdatum'] = (new DateTime($this->input->post('gebdatum')))->format('Y-m-d'); if ($this->input->post('geburtsnation')) $data['geburtsnation'] = $this->input->post('geburtsnation'); if ($this->input->post('staatsbuergerschaft')) $data['staatsbuergerschaft'] = $this->input->post('staatsbuergerschaft'); - $result = $this->PersonModel->insert($data); - $person_id = $this->getDataOrTerminateWithError($result); + return $this->PersonModel->insert($data); } - // Addresse anlegen - $anlegen = $this->input->post('address[func]'); - if ($anlegen) { + return success($person_id); + } + + private function _addAdresse($person_id) + { + // Addresse anlegen? + $anlegen = $this->input->post('address[checked]'); + if ($anlegen === true) + { + // Adresse laden $this->load->model('person/Adresse_model', 'AdresseModel'); $data = [ @@ -412,50 +671,45 @@ class Student extends FHCAPI_Controller 'typ' => 'h', 'zustelladresse' => true, ]; - if ($anlegen < 0) { // Überschreiben - $this->AdresseModel->addOrder('zustelladresse', 'DESC'); - $this->AdresseModel->addOrder('sort'); + + $this->AdresseModel->addSelect('adresse_id'); $result = $this->AdresseModel->loadWhere([ 'person_id' => $person_id ]); - $address = $this->getDataOrTerminateWithError($result); - if ($address) { - $address = current($address); - $data['updateamum'] = date('c'); - $data['updatevon'] = getAuthUID(); + if (isError($result)) return $result; + + // wenn neue Adresse, heimatadresse setzen + if (!hasData($result)) $data['heimatadresse'] = true; - $result = $this->AdresseModel->update($address->adresse_id, $data); - $this->getDataOrTerminateWithError($result); - } else { - //Wenn keine Adrese vorhanden ist dann eine neue Anlegen - $anlegen = 1; - $data['heimatadresse'] = true; - } - } - if ($anlegen > 0) { $data['person_id'] = $person_id; $data['insertamum'] = date('c'); $data['insertvon'] = getAuthUID(); - if (!isset($data['heimatadresse'])) - $data['heimatadresse'] = !$this->input->post('person_id'); - - $result = $this->AdresseModel->insert($data); - $this->getDataOrTerminateWithError($result); - } + + return $this->AdresseModel->insert($data); } - + + return success(null); + } + + private function _addKontakt($person_id) + { // Kontaktdaten $kontaktdaten = []; - foreach (['email', 'telefon', 'mobil'] as $k) { + + foreach (['email', 'telefon', 'mobil'] as $k) + { $v = $this->input->post($k); if ($v) $kontaktdaten[$k] = $v; } - if (count($kontaktdaten)) { + + if (count($kontaktdaten)) + { $this->load->model('person/Kontakt_model', 'KontaktModel'); - foreach ($kontaktdaten as $typ => $kontakt) { + foreach ($kontaktdaten as $typ => $kontakt) + { $data = [ 'person_id' => $person_id, 'kontakttyp' => $typ, @@ -465,83 +719,70 @@ class Student extends FHCAPI_Controller 'insertvon' => getAuthUID() ]; $result = $this->KontaktModel->insert($data); - $this->getDataOrTerminateWithError($result); + if (isError($result)) return $result; } } + return success(null); + } + private function _addFirstPrestudentstatus($person_id) + { // Prestudent anlegen - $data = [ - 'aufmerksamdurch_kurzbz' => 'k.A.', - 'person_id' => $person_id, - 'studiengang_kz' => $this->input->post('studiengang_kz'), - 'ausbildungcode' => $this->input->post('letzteausbildung'), - 'anmerkung' => $this->input->post('anmerkungen'), - 'reihungstestangetreten' => false, - 'bismelden' => true - ]; + + // Anmerkung with Ausbildungsart + $studiengang_kz = $this->input->post('studiengang_kz'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); $ausbildungsart = $this->input->post('ausbildungsart'); + $anmerkung = $this->input->post('anmerkungen'); + $foerderrelevant = null; if ($ausbildungsart) - $data['anmerkung'] .= ' Ausbildungsart:' . $ausbildungsart; + $anmerkung .= ' Ausbildungsart:' . $ausbildungsart; + // Incomings und ausserordentliche sind bei Meldung nicht förderrelevant $incoming = $this->input->post('incoming'); - if ($incoming || substr($data['studiengang_kz'], 0, 1) == '9') - $data['foerderrelevant'] = false; - // Wenn die Person schon im System erfasst ist, dann die ZGV des Datensatzes uebernehmen - $this->PrestudentModel->addOrder('zgvmas_code'); - $this->PrestudentModel->addOrder('zgv_code', 'DESC'); - $this->PrestudentModel->addLimit(1); - $result = $this->PrestudentModel->loadWhere([ - 'person_id' => $person_id - ]); - $prestudent = $this->getDataOrTerminateWithError($result); - if ($prestudent) { - $prestudent = current($prestudent); - if ($prestudent->zgv_code) { - $data['zgv_code'] = $prestudent->zgv_code; - $data['zgvort'] = $prestudent->zgvort; - $data['zgvdatum'] = $prestudent->zgvdatum; + if ($incoming || substr($studiengang_kz, 0, 1) == '9') + $foerderrelevant = false; - $data['zgvmas_code'] = $prestudent->zgvmas_code; - $data['zgvmaort'] = $prestudent->zgvmaort; - $data['zgvmadatum'] = $prestudent->zgvmadatum; - } - } // Prestudent speichern - $result = $this->PrestudentModel->insert($data); - $prestudent_id = $this->getDataOrTerminateWithError($result); + $result = $this->prestudentlib->setPrestudent( + $person_id, + $studiengang_kz, + $this->input->post('letzteausbildung'), + $anmerkung, + $foerderrelevant + ); + if (isError($result)) return $result; + if (!hasData($result)) return error('Error when adding prestudent'); - // Prestudent Rolle Anlegen - $data = [ - 'prestudent_id' => $prestudent_id, - 'status_kurzbz' => $incoming ? 'Incoming' : 'Interessent', - 'studiensemester_kurzbz' => $this->input->post('studiensemester_kurzbz'), - 'ausbildungssemester' => $this->input->post('ausbildungssemester') ?: 0, - 'orgform_kurzbz' => $this->input->post('orgform_kurzbz') ?: null, - 'studienplan_id' => $this->input->post('studienplan_id') ?: null, - 'datum' => date('Y-m-d'), - 'insertamum' => date('c'), - 'insertvon' => getAuthUID() - ]; - $result = $this->PrestudentstatusModel->insert($data); - $this->getDataOrTerminateWithError($result); + $prestudent_id = getData($result); - if ($incoming) { - // TODO(chris): IMPLEMENT! - //Matrikelnummer und UID generieren - //Benutzerdatensatz anlegen - //Studentendatensatz anlegen - //StudentLehrverband anlegen + // wenn Incoming, Incoming Daten hinzufügen + if ($incoming) + { + $statusResult = $this->prestudentlib->setFirstIncoming( + $prestudent_id, + $studiengang_kz, + $studiensemester_kurzbz, + $this->input->post('orgform_kurzbz'), + $this->input->post('studienplan_id') + ); } + else + { + // Prestudent Rolle Anlegen + $statusResult = $this->prestudentlib->setFirstStatus( + $prestudent_id, + $this->PrestudentstatusModel::STATUS_INTERESSENT, + $studiensemester_kurzbz, + $this->input->post('ausbildungssemester'), + $this->input->post('orgform_kurzbz'), + $this->input->post('studienplan_id') + ); + } + if (!hasData($statusResult)) return error('error when adding status'); + if (isError($statusResult)) return $statusResult; - // TODO(chris): DEBUG - /*$result = $this->PrestudentModel->loadWhere([ - 'pestudent_id' => 1 - ]); - if (isError($result)) { - return $result; - }*/ - - $this->terminateWithSuccess(true); + return success($prestudent_id); } public function requiredIfNotPersonId($value) @@ -553,8 +794,84 @@ class Student extends FHCAPI_Controller public function requiredIfAddressFunc($value) { - if (!$_POST['address']['func']) + if (!isset($_POST['address']['checked']) || !$_POST['address']['checked']) return true; return !!$value; } + + public function requiredIfStudentFunc($value) + { + if (isset($_POST['personOnly']) && $_POST['personOnly']) + return true; + return !!$value; + } + + public function requiredIfStudentAndNotIncomingFunc($value) + { + if ((isset($_POST['incoming']) && $_POST['incoming']) || $this->requiredIfStudentFunc($value)) + return true; + return !!$value; + } + + /** + * Validates input data. Terminates with validation errors, if invalid. + */ + private function _validate() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules('nachname', 'Nachname', 'callback_requiredIfNotPersonId', [ + 'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'nachname')]) + ]); + $this->form_validation->set_rules('geschlecht', 'Geschlecht', 'callback_requiredIfNotPersonId', [ + 'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'geschlecht')]) + ]); + $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', ['isValidDate', function($value) { return isValidDate($value); }], [ + 'isValidDate' => $this->p->t('ui', 'error_invalid_date') + ]); + //$this->form_validation->set_rules('address[checked]', 'Address', 'required'); + $this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [ + 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'plz')]) + ]); + $this->form_validation->set_rules('address[gemeinde]', 'Gemeinde', 'callback_requiredIfAddressFunc', [ + 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'gemeinde')]) + ]); + $this->form_validation->set_rules('address[ort]', 'Ort', 'callback_requiredIfAddressFunc', [ + 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'ort')]) + ]); + $this->form_validation->set_rules('address[address]', 'Adresse', 'callback_requiredIfAddressFunc', [ + 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'adresse')]) + ]); + $this->form_validation->set_rules('email', 'E-Mail', 'valid_email'); + $this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'callback_requiredIfStudentFunc', [ + 'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiengang')]) + ]); + $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'callback_requiredIfStudentFunc', [ + 'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiensemester')]) + ]); + $this->form_validation->set_rules( + 'ausbildungssemester', + 'Ausbildungssemester', + 'callback_requiredIfStudentAndNotIncomingFunc|integer|less_than[9]|greater_than[-1]', + [ + 'requiredIfStudentAndNotIncomingFunc' => + $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'ausbildungssemester')]), + ] + ); + // TODO(chris): validate studienplan with studiengang, semester and orgform? + // TODO(chris): validate person_id, studiengang_kz, studiensemester_kurzbz, orgform_kurzbz, nation, gemeinde, ort, geschlecht? + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + private function _getLanguageIndex() + { + $this->load->model('system/Sprache_model', 'SpracheModel'); + $this->SpracheModel->addSelect('index'); + $result = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage())); + $this->addMeta('lang', getUserLanguage()); + + return hasData($result) ? getData($result)[0]->index : 1; + } } diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php index 5fb7b592c..acacca052 100644 --- a/application/controllers/api/frontend/v1/stv/Students.php +++ b/application/controllers/api/frontend/v1/stv/Students.php @@ -44,143 +44,263 @@ class Students extends FHCAPI_Controller } // Load Libraries - $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('PhrasesLib'); + $this->loadPhrases( + array( + 'lehre' + ) + ); } /** - * Remap calls: - * / => return [] - * /inout => return [] - * /inout/incoming => getIncoming - * /inout/outgoing => getOutgoing - * /inout/gemeinsamestudien => getGemeinsamestudien - * /(studiengang_kz) => getStudents - * /(studiengang_kz)/prestudent => getPrestudents - * /(studiengang_kz)/prestudent/* => getPrestudents - * /(studiengang_kz)/(semester) => getStudents - * /(studiengang_kz)/(semester)/grp/(gruppe_kurzbz) => getStudents - * /(studiengang_kz)/(semester)/(verband) => getStudents - * /(studiengang_kz)/(semester)/(verband)/(gruppe) => getStudents - * /(studiengang_kz)/(org_form) => getStudents - * /(studiengang_kz)/(org_form)/prestudent => getPrestudents - * /(studiengang_kz)/(org_form)/prestudent/* => getPrestudents - * /(studiengang_kz)/(org_form)/(semester) => getStudents - * /(studiengang_kz)/(org_form)/(semester)/grp/(gruppe_kurzbz) - * => getStudents - * /(studiengang_kz)/(org_form)/(semester)/(verband) => getStudents - * /(studiengang_kz)/(org_form)/(semester)/(verband)/(gruppe) - * => getStudents - * /uid/(student_uid) => getStudent - * /prestudent/(prestudent_id) => getPrestudent - * /person/(person_id) => getPerson + * Routing * - * @param string $method - * @param array $params (optional) + * /inout => index + * /(studiensemester_kurzbz) => index + * /(studiensemester_kurzbz)/inout => index + * + * /(studiensemester_kurzbz)/inout/incoming => getIncoming + * /(studiensemester_kurzbz)/inout/outgoing => getOutgoing + * /(studiensemester_kurzbz)/inout/gemeinsamestudien => getGemeinsamestudien + * + * /(studiengang_kz)/prestudent => getPrestudents + * /(studiengang_kz)/prestudent/(studiensemester_kurzbz) => getPrestudents + * /(studiengang_kz)/prestudent/(studiensemester_kurzbz)/(filter) => getPrestudents + * /(studiengang_kz)/prestudent/(studiensemester_kurzbz)/(filter)/(otherfilter) => getPrestudents + * + * /(studiengang_kz)/(orgform)/prestudent => getPrestudentsOrgform + * /(studiengang_kz)/(orgform)/prestudent/(studiensemester_kurzbz) => getPrestudentsOrgform + * /(studiengang_kz)/(orgform)/prestudent/(studiensemester_kurzbz)/(filter) => getPrestudentsOrgform + * /(studiengang_kz)/(orgform)/prestudent/(studiensemester_kurzbz)/(filter)/(otherfilter) => getPrestudentsOrgform + * + * /(studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe) => getStudentsSpezialgruppe + * + * /(studiensemester_kurzbz)/(studiengang_kz) => getStudents + * /(studiensemester_kurzbz)/(studiengang_kz)/(semester) => getStudents + * /(studiensemester_kurzbz)/(studiengang_kz)/(semester)/(verband) => getStudents + * /(studiensemester_kurzbz)/(studiengang_kz)/(semester)/(verband)/(gruppe) => getStudents + * + * /(studiensemester_kurzbz)/(studiengang_kz)/(orgform)/(semester)/grp/(gruppe) => getStudentsOrgformSpezialgruppe + * + * /(studiensemester_kurzbz)/(studiengang_kz)/(orgform) => getStudentsOrgform + * /(studiensemester_kurzbz)/(studiengang_kz)/(orgform)/(semester) => getStudentsOrgform + * /(studiensemester_kurzbz)/(studiengang_kz)/(orgform)/(semester)/(verband) => getStudentsOrgform + * /(studiensemester_kurzbz)/(studiengang_kz)/(orgform)/(semester)/(verband)/(gruppe) => getStudentsOrgform + * + * /(studiensemester_kurzbz)/uid/(student_uid) => getStudent + * /(studiensemester_kurzbz)/prestudent/(prestudent_id) => getPrestudent + * /(studiensemester_kurzbz)/person/(person_id) => getPerson + */ + + public function index() + { + $this->addMeta('ci_method', __FUNCTION__); + $this->terminateWithSuccess([]); + } + + /** + * @param string $studiensemester_kurzbz * * @return void */ - public function _remap($method, $params = []) + public function getIncoming($studiensemester_kurzbz) { - if ($method == '' || $method == 'index') - return $this->terminateWithSuccess([]); - - if ($method == 'inout') { - if (!count($params)) - return $this->terminateWithSuccess([]); - switch ($params[0]) { - case 'incoming': - return $this->getIncoming(); - case 'outgoing': - return $this->getOutgoing(); - case 'gemeinsamestudien': - return $this->getGemeinsamestudien(); - default: - return show_404(); - } - } - - $count = count($params); - if (!$count) - return $this->getStudents($method); - - if ($method == 'uid' && $count == 1) - return $this->getStudent($params[0]); - - if ($method == 'prestudent' && $count == 1) - return $this->getPrestudent($params[0]); - - if ($method == 'person' && $count == 1) - return $this->getPerson($params[0]); - - if (is_numeric($params[0])) { - $sem = $params[0]; - if ($count == 3 && $params[1] == 'grp') { - $g = $params[2]; - $ver = null; - $grp = null; - } else { - $g = null; - $ver = $count > 1 ? $params[1] : null; - $grp = $count > 2 ? $params[2] : null; - } - return $this->getStudents($method, $sem, $ver, $grp, $g); - } elseif ($params[0] == 'prestudent') { - if ($count == 1) - return $this->getPrestudents($method); - if ($count == 2) - return $this->getPrestudents($method, $params[1]); - return $this->getPrestudents($method, $params[1], $params[$count-1]); - } else { - $org = $params[0]; - if ($count > 1 && $params[1] == 'prestudent') { - if ($count == 2) - return $this->getPrestudents($method, null, null, $org); - if ($count == 3) - return $this->getPrestudents($method, $params[2], null, $org); - return $this->getPrestudents($method, $params[2], $params[$count-1], $org); - } - $sem = $count > 1 ? $params[1] : null; - if ($count == 4 && $params[2] == 'grp') { - $g = $params[3]; - $ver = null; - $grp = null; - } else { - $g = null; - $ver = $count > 2 ? $params[2] : null; - $grp = $count > 3 ? $params[3] : null; - } - - return $this->getStudents($method, $sem, $ver, $grp, $g, $org); - } + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', [ + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ]); - show_404(); + + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + + + $this->PrestudentModel->addJoin( + "( + SELECT prestudent_id + FROM public.tbl_prestudentstatus + WHERE status_kurzbz = 'Incoming' + AND studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " + ) test", + "prestudent_id" + ); + + + $this->prepareQuery($studiensemester_kurzbz); + + $this->PrestudentModel->addSelect("COALESCE( + v.semester::text, + CASE + WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') + THEN pls.ausbildungssemester::text + 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->addFilter($studiensemester_kurzbz); + + + $result = $this->PrestudentModel->load(); + + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } /** + * @param string $studiensemester_kurzbz + * * @return void */ - protected function getIncoming() + public function getOutgoing($studiensemester_kurzbz) { - // TODO(chris): IMPLEMENT! - $this->terminateWithSuccess([]); + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', [ + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ]); + + + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + + + $this->PrestudentModel->addJoin( + "( + SELECT prestudent_id + FROM bis.tbl_bisio bis + JOIN public.tbl_student USING (student_uid) + JOIN public.tbl_studiensemester stdsem ON ( + (bis.von >= stdsem.start AND bis.von <= stdsem.ende) + OR + (bis.bis >= stdsem.start AND bis.bis <= stdsem.ende) + OR + (bis.von <= stdsem.start AND bis.bis >= stdsem.ende) + ) + WHERE NOT EXISTS ( + SELECT 1 + FROM public.tbl_prestudentstatus + WHERE status_kurzbz = 'Incoming' + AND prestudent_id = tbl_student.prestudent_id + ) AND stdsem.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " + GROUP BY prestudent_id + ) test", + "prestudent_id" + ); + + + $this->prepareQuery($studiensemester_kurzbz); + + + $this->PrestudentModel->addSelect("COALESCE( + v.semester::text, + CASE + WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') + THEN pls.ausbildungssemester::text + 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->addFilter($studiensemester_kurzbz); + + + $result = $this->PrestudentModel->load(); + + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } /** + * @param string $studiensemester_kurzbz + * * @return void */ - protected function getOutgoing() + public function getGemeinsamestudien($studiensemester_kurzbz) { - // TODO(chris): IMPLEMENT! - $this->terminateWithSuccess([]); + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', [ + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ]); + + + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + + + $this->PrestudentModel->addJoin( + "( + SELECT prestudent_id + FROM bis.tbl_mobilitaet + WHERE studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " + ) bis", + "prestudent_id" + ); + + + $this->prepareQuery($studiensemester_kurzbz); + + + $this->PrestudentModel->addSelect("COALESCE( + v.semester::text, + CASE + WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') + THEN pls.ausbildungssemester::text + 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->addFilter($studiensemester_kurzbz); + + + $result = $this->PrestudentModel->load(); + + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } - /** - * @return void - */ - protected function getGemeinsamestudien() - { - // TODO(chris): IMPLEMENT! - $this->terminateWithSuccess([]); + public function getPrestudents( + $studiengang_kz, + $studiensemester_kurzbz = null, + $filter = null + ) { + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', array( + 'studiengang_kz' => $studiengang_kz, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'filter' => $filter + )); + + $this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter); + } + + public function getPrestudentsOrgform( + $studiengang_kz, + $orgform_kurzbz, + $studiensemester_kurzbz = null, + $filter = null + ) { + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', array( + 'studiengang_kz' => $studiengang_kz, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'filter' => $filter, + 'orgform_kurzbz' => $orgform_kurzbz + )); + + $this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter, $orgform_kurzbz); } /** @@ -191,7 +311,7 @@ class Students extends FHCAPI_Controller * * @return void */ - protected function getPrestudents($studiengang_kz, $studiensemester_kurzbz = null, $filter = null, $orgform_kurzbz = null) + protected function fetchPrestudents($studiengang_kz, $studiensemester_kurzbz = null, $filter = null, $orgform_kurzbz = null) { $this->load->model('crm/Prestudent_model', 'PrestudentModel'); @@ -223,25 +343,25 @@ class Students extends FHCAPI_Controller break; case "bewerbungnichtabgeschickt": $where['ps.status_kurzbz'] = 'Interessent'; - $where['bewerbung_abgeschicktamum'] = null; + $where['ps.bewerbung_abgeschicktamum'] = null; break; case "bewerbungabgeschickt": $where['ps.status_kurzbz'] = 'Interessent'; - $where['bewerbung_abgeschicktamum IS NOT NULL'] = null; - $where['bestaetigtam'] = null; + $where['ps.bewerbung_abgeschicktamum IS NOT NULL'] = null; + $where['ps.bestaetigtam'] = null; break; case "statusbestaetigt": $where['ps.status_kurzbz'] = 'Interessent'; - $where['bestaetigtam IS NOT NULL'] = null; + $where['ps.bestaetigtam IS NOT NULL'] = null; break; case "statusbestaetigtrtnichtangemeldet": $where['ps.status_kurzbz'] = 'Interessent'; - $where['bestaetigtam IS NOT NULL'] = null; + $where['ps.bestaetigtam IS NOT NULL'] = null; $this->PrestudentModel->db->where('NOT EXISTS(' . $selectRT . ')', null, false); break; case "statusbestaetigtrtangemeldet": $where['ps.status_kurzbz'] = 'Interessent'; - $where['bestaetigtam IS NOT NULL'] = null; + $where['ps.bestaetigtam IS NOT NULL'] = null; $this->PrestudentModel->db->where('EXISTS(' . $selectRT . ')', null, false); break; case "zgv": @@ -251,7 +371,7 @@ class Students extends FHCAPI_Controller $stg = $this->getDataOrTerminateWithError($result); if (!$stg) - $this->terminateWithValidationErrors(['' => 'Studiengang does not exist']); // TODO(chris): phrase + $this->terminateWithSuccess([]); $stg = current($stg); $where['ps.status_kurzbz'] = 'Interessent'; @@ -320,7 +440,10 @@ class Students extends FHCAPI_Controller break; default: if (!$studiensemester_kurzbz) { - // TODO(chris): this does not work with $orgform_kurzbz != null + /** NOTE(chris): + * 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; } else { $this->PrestudentModel->db->where_in('ps.status_kurzbz', [ @@ -334,26 +457,14 @@ class Students extends FHCAPI_Controller break; } - /* - $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id'); - $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_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->prepareQuery($studiensemester_kurzbz); $this->PrestudentModel->addSelect(" - CASE WHEN ps.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') - THEN ps.ausbildungssemester::text - ELSE ''::text END AS semester", false); + 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(); @@ -367,8 +478,85 @@ class Students extends FHCAPI_Controller $this->terminateWithSuccess($data); } + public function getStudents( + $studiensemester_kurzbz, + $studiengang_kz, + $semester = null, + $verband = null, + $gruppe = null + ) { + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'studiengang_kz' => $studiengang_kz, + 'semester' => $semester, + 'verband' => $verband, + 'gruppe' => $gruppe + )); + + $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, null); + } + + public function getStudentsOrgform( + $studiensemester_kurzbz, + $studiengang_kz, + $orgform_kurzbz, + $semester = null, + $verband = null, + $gruppe = null + ) { + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'studiengang_kz' => $studiengang_kz, + 'orgform_kurzbz' => $orgform_kurzbz, + 'semester' => $semester, + 'verband' => $verband, + 'gruppe' => $gruppe + )); + + $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, $orgform_kurzbz); + } + + public function getStudentsSpezialgruppe( + $studiensemester_kurzbz, + $studiengang_kz, + $semester, + $gruppe_kurzbz + ) { + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'studiengang_kz' => $studiengang_kz, + 'semester' => $semester, + 'gruppe_kurzbz' => $gruppe_kurzbz + )); + + $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, null); + } + + public function getStudentsOrgformSpezialgruppe( + $studiensemester_kurzbz, + $orgform_kurzbz, + $studiengang_kz, + $semester, + $gruppe_kurzbz + ) { + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'orgform_kurzbz' => $orgform_kurzbz, + 'studiengang_kz' => $studiengang_kz, + 'semester' => $semester, + 'gruppe_kurzbz' => $gruppe_kurzbz + )); + + $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, $orgform_kurzbz); + } + /** * @param integer $studiengang_kz + * @param string $studiensemester_kurzbz * @param integer $semester (optional) * @param string $verband (optional) * @param integer $gruppe (optional) @@ -377,28 +565,23 @@ class Students extends FHCAPI_Controller * * @return void */ - protected function getStudents($studiengang_kz, $semester = null, $verband = null, $gruppe = null, $gruppe_kurzbz = null, $orgform_kurzbz = null) - { - $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); - - + protected function fetchStudents( + $studiensemester_kurzbz, + $studiengang_kz, + $semester = null, + $verband = null, + $gruppe = null, + $gruppe_kurzbz = null, + $orgform_kurzbz = null + ) { $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } - /* - $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'); - $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'); - $this->PrestudentModel->addJoin( - 'public.tbl_studentlehrverband v', - 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz) - );*/ $this->prepareQuery($studiensemester_kurzbz, ''); $this->PrestudentModel->addSelect('v.semester'); @@ -438,7 +621,6 @@ class Students extends FHCAPI_Controller false ); } - } $this->addFilter($studiensemester_kurzbz); @@ -455,33 +637,36 @@ class Students extends FHCAPI_Controller * * @return void */ - protected function getPrestudent($prestudent_id) + public function getPrestudent($studiensemester_kurzbz, $prestudent_id) { - $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'prestudent_id' => $prestudent_id, + )); + + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - /* - $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', 'LEFT'); - $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=' . $this->PrestudentModel->escape($studiensemester_kurzbz), - 'LEFT' - );*/ $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'); + $this->PrestudentModel->addSelect("COALESCE( + v.semester::text, + CASE + WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') + THEN pls.ausbildungssemester::text + 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->addFilter($studiensemester_kurzbz); @@ -500,35 +685,33 @@ class Students extends FHCAPI_Controller * * @return void */ - protected function getStudent($student_uid) + public function getStudent($studiensemester_kurzbz, $student_uid) { - $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $student_uid, + )); + + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - /* - $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'); - $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'); - $this->PrestudentModel->addJoin( - 'public.tbl_studentlehrverband v', - 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz), - 'LEFT' - );*/ $this->prepareQuery($studiensemester_kurzbz); $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([ @@ -541,30 +724,34 @@ class Students extends FHCAPI_Controller } /** + * @param string $studiensemester_kurzbz * @param integer $person_id * * @return void */ - protected function getPerson($person_id) + public function getPerson($studiensemester_kurzbz, $person_id) { - $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'person_id' => $person_id, + )); + + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + { + $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); + } $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - /* - $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id'); - $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id'); - $this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); - $this->PrestudentModel->addJoin( - 'public.tbl_studentlehrverband v', - 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz), - 'LEFT' - );*/ $this->prepareQuery($studiensemester_kurzbz); $this->PrestudentModel->addSelect('v.semester'); $this->PrestudentModel->addSelect('v.verband'); $this->PrestudentModel->addSelect('v.gruppe'); + $this->addSelectPrioRel(); $this->addFilter($studiensemester_kurzbz); @@ -578,6 +765,81 @@ class Students extends FHCAPI_Controller $this->terminateWithSuccess($data); } + /** + * @param string $studiensemester_kurzbz + * + * @return void + */ + public function search($studiensemester_kurzbz) + { + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz + )); + + $this->load->library('SearchLib', [ 'config' => 'searchstv' ]); + $this->load->library('form_validation'); + + $this->form_validation->set_rules('searchstr', 'searchstr', 'required'); + $this->form_validation->set_rules('types[]', 'types', 'required'); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $result = $this->searchlib->search($this->input->post('searchstr'), $this->input->post('types')); + + $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') { + $prestudent_ids[] = $dataset->prestudent_id; + } elseif ($row->type == 'student') { + $student_uids[] = $dataset->uid; + } + } + + 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); + } elseif ($prestudent_ids) { + $this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids); + } elseif ($student_uids) { + $this->PrestudentModel->db->where_in('s.student_uid', $student_uids); + } else { + $this->terminateWithSuccess([]); + } + + $result = $this->PrestudentModel->load(); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + /** * @param string|null $studiensemester_kurzbz * @param string $type @@ -618,17 +880,26 @@ class Students extends FHCAPI_Controller $this->PrestudentModel->addSelect('wahlname'); $this->PrestudentModel->addSelect('vornamen'); $this->PrestudentModel->addSelect('titelpost'); - $this->PrestudentModel->addSelect('svnr'); $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'); @@ -640,7 +911,7 @@ class Students extends FHCAPI_Controller ); $this->PrestudentModel->addSelect(" CASE WHEN b.uid IS NOT NULL AND b.uid<>'' - THEN b.uid || " . $this->PrestudentModel->escape(DOMAIN) . " + 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'); @@ -661,13 +932,6 @@ class Students extends FHCAPI_Controller $this->PrestudentModel->addSelect('mentor'); $this->PrestudentModel->addSelect('b.aktiv AS bnaktiv'); - /*$this->PrestudentModel->addSelect('tbl_prestudent.reihungstest_id'); - $this->PrestudentModel->addSelect('tbl_prestudent.anmeldungreihungstest'); - $this->PrestudentModel->addSelect('tbl_prestudent.gsstudientyp_kurzbz'); - $this->PrestudentModel->addSelect('tbl_prestudent.priorisierung'); - $this->PrestudentModel->addSelect('p.zugangscode'); - $this->PrestudentModel->addSelect('p.bpk');*/ - $this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs); $this->PrestudentModel->addOrder('nachname'); @@ -682,13 +946,13 @@ class Students extends FHCAPI_Controller $this->PrestudentModel->addSelect("( SELECT count(*) FROM ( - SELECT *, public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) AS laststatus - FROM PUBLIC.tbl_prestudent pss - JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id) + 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 + FROM public.tbl_prestudentstatus WHERE prestudent_id = tbl_prestudent.prestudent_id AND status_kurzbz = 'Interessent' LIMIT 1 @@ -697,7 +961,7 @@ class Students extends FHCAPI_Controller ) prest WHERE laststatus NOT IN ('Abbrecher', 'Abgewiesener', 'Absolvent') AND priorisierung <= tbl_prestudent.priorisierung - ) || ' (' || tbl_prestudent.priorisierung || ')' AS priorisierung_relativ", false); + ) || ' (' || COALESCE(tbl_prestudent.priorisierung::text, ' '::text) || ')' AS priorisierung_relativ", false); } /** @@ -709,35 +973,20 @@ class Students extends FHCAPI_Controller */ protected function addFilter($studiensemester_kurzbz) { - $filter = $this->input->get('filter'); - if (isset($filter['konto_count_0'])) { - $bt = $this->PrestudentModel->escape($filter['konto_count_0']); - $stdsem = $this->PrestudentModel->escape($studiensemester_kurzbz); - - $this->PrestudentModel->db->where('( - SELECT count(*) - FROM public.tbl_konto - WHERE person_id=tbl_prestudent.person_id - AND buchungstyp_kurzbz=' . $bt . ' - AND studiensemester_kurzbz=' . $stdsem . ' - ) =', 0); - $this->PrestudentModel->db->where('get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) !=', 'Incoming'); + $filter = $this->input->post('filter'); + + if (!is_array($filter)) + { + $this->addMeta('addfilter', 'invalid filter: ' . json_encode($this->input->post('filter'))); + return; } - if (isset($filter['konto_missing_counter'])) { - $bt = $this->PrestudentModel->escape($filter['konto_missing_counter']); - $stg = ''; - if ($this->variablelib->getVar('kontofilterstg') == 'true') - $stg = ' AND studiengang_kz=tbl_prestudent.studiengang_kz'; - - $bt = $bt == 'alle' ? '' : ' AND buchungstyp_kurzbz=' . $bt; - - $this->PrestudentModel->db->where('( - SELECT sum(betrag) - FROM public.tbl_konto - WHERE person_id=tbl_prestudent.person_id' . - $bt . - $stg . ' - ) !=', 0); + foreach ($filter as $item) { + if (isset($item['usestdsem']) && $item['usestdsem']) + $item['studiensemester_kurzbz'] = $studiensemester_kurzbz; + if (!$this->PrestudentModel->addFilter($item)) { + $this->addMeta('addfilter', 'invalid filter: ' . json_encode($item)); + return; + } } } } diff --git a/application/controllers/api/frontend/v1/stv/Verband.php b/application/controllers/api/frontend/v1/stv/Verband.php index e8c532652..32ef30a45 100644 --- a/application/controllers/api/frontend/v1/stv/Verband.php +++ b/application/controllers/api/frontend/v1/stv/Verband.php @@ -165,7 +165,17 @@ class Verband extends FHCAPI_Controller $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("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); @@ -173,6 +183,7 @@ class Verband extends FHCAPI_Controller $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); @@ -188,6 +199,8 @@ class Verband extends FHCAPI_Controller array_unshift($list, [ 'name' => 'PreStudent', 'link' => $link . 'prestudent', + 'no_sem_reload' => true, + 'stg_kz' => (int)$studiengang_kz, 'children' => $this->getStdSem($link . 'prestudent/', $studiengang_kz) ]); @@ -202,6 +215,7 @@ class Verband extends FHCAPI_Controller $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'); @@ -215,7 +229,6 @@ class Verband extends FHCAPI_Controller $list = array_merge($list, $result); } } - } $this->terminateWithSuccess($list); } @@ -271,6 +284,7 @@ class Verband extends FHCAPI_Controller $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); @@ -319,6 +333,8 @@ class Verband extends FHCAPI_Controller $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); @@ -355,7 +371,11 @@ class Verband extends FHCAPI_Controller $this->load->model('system/Variable_model', 'VariableModel'); $result = $this->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']); $data = $this->getDataOrTerminateWithError($result); - $number_displayed_past_studiensemester = $data['number_displayed_past_studiensemester'] ?? null; + + $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'); diff --git a/application/controllers/api/frontend/v1/stv/Vertrag.php b/application/controllers/api/frontend/v1/stv/Vertrag.php new file mode 100644 index 000000000..c2b0f713c --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Vertrag.php @@ -0,0 +1,102 @@ + ['admin:r', 'assistenz:r'], + 'cancelVertrag' => ['admin:r', 'assistenz:r'] + ]); + + // Load Libraries + $this->load->library('form_validation'); + + // Load language phrases + $this->loadPhrases([ + 'ui', + 'person', + 'projektarbeit' + ]); + + // Load models + $this->load->model('accounting/Vertrag_model', 'VertragModel'); + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + + // load libraries + $this->load->library('PermissionLib'); + } + + public function getVertrag() + { + $vertrag_id = $this->input->get('vertrag_id'); + + if (!isset($vertrag_id) || !is_numeric($vertrag_id)) + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Vertrag ID']), self::ERROR_TYPE_GENERAL); + + $result = $this->VertragModel->getVertragById($vertrag_id); + + if (isError($result)) + { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + + if (!hasData($result)) $this->terminateWithSuccess([]); + + $vertrag = getData($result)[0]; + + $this->terminateWithSuccess($vertrag); + } + + public function cancelVertrag() + { + $vertrag_id = $this->input->post('vertrag_id'); + $person_id = $this->input->post('person_id'); + + if (!isset($vertrag_id) || !is_numeric($vertrag_id)) + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Vertrag ID']), self::ERROR_TYPE_GENERAL); + if (!isset($person_id) || !is_numeric($person_id)) + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); + + // * first find lehrveranstaltung_id of the contracts lehrveranstaltung + $this->VertragModel->addSelect('lehrveranstaltung_id'); + $this->VertragModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id', 'LEFT'); + $result = $this->VertragModel->loadWhere(['vertrag_id' => $vertrag_id]); + + if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + if (!hasData($result)) $this->terminateWithSuccess([]); + + $lehrveranstaltung_id = getData($result)[0]->lehrveranstaltung_id; + + $allOe = $this->LehrveranstaltungModel->getAllOe($lehrveranstaltung_id); + + if (isError($allOe)) $this->terminateWithError(getError($allOe), self::ERROR_TYPE_GENERAL); + + $allOe = hasData($allOe) ? array_column(getData($allOe), 'oe_kurzbz') : []; + + // * then check if the user has permissions to cancel the corresponding lv-organisational units + if (!$this->permissionlib->isBerechtigtMultipleOe('admin', $allOe, 'suid') && + !$this->permissionlib->isBerechtigtMultipleOe('lehre/lehrauftrag_bestellen', $allOe, 'suid')) + { + return $this->_outputAuthError([$this->router->method => ['admin:rw', 'lehrauftrag_bestellen:rw']]); + } + + $uidResult = $this->BenutzerModel->getFromPersonId($person_id); + + if (isError($uidResult)) $this->terminateWithError(getError($uidResult), self::ERROR_TYPE_GENERAL); + + if (!hasData($uidResult)) $this->terminateWithError("no user found", self::ERROR_TYPE_GENERAL); + + $mitarbeiter_uid = getData($uidResult)[0]->uid; + + $result = $this->VertragModel->cancelVertrag($vertrag_id, $mitarbeiter_uid); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } +} diff --git a/application/controllers/api/frontend/v1/vertraege/Vertraege.php b/application/controllers/api/frontend/v1/vertraege/Vertraege.php new file mode 100644 index 000000000..bb14bc511 --- /dev/null +++ b/application/controllers/api/frontend/v1/vertraege/Vertraege.php @@ -0,0 +1,720 @@ + ['vertrag/mitarbeiter:r'], + 'getAllContractsNotAssigned' => ['vertrag/mitarbeiter:r'], + 'getAllContractsAssigned' => ['vertrag/mitarbeiter:r'], + 'getAllContractTypes' => ['vertrag/mitarbeiter:r'], + 'getAllContractStati' => ['vertrag/mitarbeiter:r'], + 'getStatiOfContract' => ['vertrag/mitarbeiter:r'], + 'loadContract' => ['vertrag/mitarbeiter:r'], + 'loadContractStatus' => ['vertrag/mitarbeiter:r'], + 'updateContract' =>['vertrag/mitarbeiter:w'], + 'addNewContract' =>['vertrag/mitarbeiter:w'], + 'deleteContract' =>['vertrag/mitarbeiter:w'], + 'insertContractStatus' =>['vertrag/mitarbeiter:w'], + 'deleteContractStatus' =>['vertrag/mitarbeiter:w'], + 'updateContractStatus' =>['vertrag/mitarbeiter:w'], + 'deleteLehrauftrag' =>['vertrag/mitarbeiter:w'], + 'deleteBetreuung' =>['vertrag/mitarbeiter:w'], + 'getMitarbeiter' => ['vertrag/mitarbeiter:r'], + 'getHeader' => ['vertrag/mitarbeiter:r'], + 'getPersonAbteilung' => ['vertrag/mitarbeiter:r'], + 'getLeitungOrg' => ['vertrag/mitarbeiter:r'], + ]); + + //Load Models and Libraries + $this->load->model('accounting/Vertrag_model', 'VertragModel'); + $this->load->model('accounting/Vertragsstatus_model', 'VertragsstatusModel'); + $this->load->model('accounting/Vertragstyp_model', 'VertragstypModel'); + $this->load->model('accounting/Vertragvertragsstatus_model', 'VertragvertragsstatusModel'); + + // Load language phrases + $this->loadPhrases([ + 'ui', + 'vertrag' + ]); + } + + public function getAllVertraege($person_id) + { + $result = $this->VertragModel->loadContractsOfPerson($person_id); + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess((getData($result) ?: [])); + } + + public function getAllContractsNotAssigned($person_id) + { + $result = $this->VertragModel->loadContractsOfPersonNotAssigned($person_id); + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess((getData($result) ?: [])); + } + + public function getAllContractsAssigned($person_id, $vertrag_id) + { + $result = $this->VertragModel->loadContractsOfPersonAssigned($person_id, $vertrag_id); + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess((getData($result) ?: [])); + } + + public function getStatiOfContract($person_id, $vertrag_id) + { + //check if vertrag_id corresponds with person_id and return null if not + $result = $this->VertragModel->loadWhere( + array( + 'vertrag_id' => $vertrag_id, + 'person_id' => $person_id + ) + ); + if(!hasData($result)) + { + $this->terminateWithSuccess([]); + } + + $result = $this->VertragModel->getStatiOfContract($vertrag_id); + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess((getData($result) ?: [])); + } + + public function getAllContractTypes() + { + $result = $this->VertragstypModel->load(); + if (isError($result)) + { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess(getData($result) ?: []); + } + + public function getAllContractStati() + { + $result = $this->VertragsstatusModel->load(); + if (isError($result)) + { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess(getData($result) ?: []); + } + + public function addNewContract() + { + $this->load->library('form_validation'); + + $person_id = $this->input->post('person_id'); + + if(!$person_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + $vertragstyp_kurzbz = $formData['vertragstyp_kurzbz'] ?? null; + $vertragsdatum = $formData['vertragsdatum'] ?? null; + $bezeichnung = $formData['bezeichnung'] ?? null; + $betrag = $formData['betrag'] ?? null; + $vertragsstunden = $formData['vertragsstunden'] ?? null; + $vertragsstunden_studiensemester_kurzbz = $formData['vertragsstunden_studiensemester_kurzbz'] ?? null; + $anmerkung = $formData['anmerkung'] ?? null; + + $this->form_validation->set_data($formData); + $this->form_validation->set_rules('bezeichnung', 'Bezeichnung', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Bezeichnung']) + ]); + + $this->form_validation->set_rules('vertragstyp_kurzbz', 'Vertragstyp', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Vertragstyp']) + ]); + $this->form_validation->set_rules('vertragsdatum', 'Vertragsdatum', 'required|is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Vertragsdatum']), + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Vertragsdatum']) + ]); + $this->form_validation->set_rules('betrag', 'Betrag', 'required|numeric', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Betrag']), + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Betrag']) + ]); + $this->form_validation->set_rules('vertragsstunden', 'Stunden(Vertrags-Urfassung)', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Stunden(Vertrags-Urfassung)']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $lehrauftraege = $this->input->post('clickedRows'); + + $this->db->trans_start(); + + $result = $this->VertragModel->insert([ + 'person_id' => $person_id, + 'vertragsdatum' => $vertragsdatum, + 'bezeichnung' => $bezeichnung, + 'vertragstyp_kurzbz' => $vertragstyp_kurzbz, + 'betrag' => $betrag, + 'vertragsstunden' => $vertragsstunden, + 'vertragsstunden_studiensemester_kurzbz' => $vertragsstunden_studiensemester_kurzbz, + 'anmerkung' => $anmerkung, + 'insertamum' => date('c'), + 'insertvon' => getAuthUID() + ]); + + $this->getDataOrTerminateWithError($result); + $vertrag_id = $result->retval; + + $status_result = $this->VertragvertragsstatusModel->insert([ + 'vertrag_id' => $vertrag_id, + 'uid' => getAuthUID(), + 'vertragsstatus_kurzbz' => 'neu', + 'insertamum' => date('c'), + 'insertvon' => getAuthUID(), + 'datum' => date('c') + ]); + + if (!$status_result) { + $this->db->trans_rollback(); + $this->terminateWithError($this->p->t('vertrag', 'error_insertOrUpdateStatusVertrag'), self::ERROR_TYPE_GENERAL); + } + + //Hinzufügen der Lehraufträge + foreach ($lehrauftraege as $row) + { + if ($row['type'] == 'Lehrauftrag') + { + $this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); + + $result_lehrauftrag = $this->LehreinheitmitarbeiterModel->update( + [ + 'lehreinheit_id' => $row['lehreinheit_id'], + 'mitarbeiter_uid' => $row['mitarbeiter_uid'] + ], + [ + 'vertrag_id' => $vertrag_id + ] + ); + + if (!$result_lehrauftrag) { + $this->db->trans_rollback(); + $this->terminateWithError($this->p->t('vertrag', 'error_addOrUpdateLehrauftraege'), self::ERROR_TYPE_GENERAL); + } + } + + if ($row['type'] == 'Betreuung') + { + $this->load->model('education/Projektbetreuer_model', 'Projektbetreuermodel'); + + $result_projektbetreuer = $this->Projektbetreuermodel->update( + [ + 'person_id' => $person_id, + 'projektarbeit_id' => $row['projektarbeit_id'], + 'betreuerart_kurzbz' => $row['betreuerart_kurzbz'] + ], + [ + 'vertrag_id' => $vertrag_id + ] + ); + + if (!$result_projektbetreuer) + { + $this->db->trans_rollback(); + $this->terminateWithError($this->p->t('vertrag', 'error_addOrUpdateLehrauftraege'), self::ERROR_TYPE_GENERAL); + } + } + } + $this->db->trans_complete(); + $this->terminateWithSuccess(true); + } + + public function updateContract() + { + $this->load->library('form_validation'); + + $vertrag_id = $this->input->post('vertrag_id'); + $person_id = $this->input->post('person_id'); + $formData = $this->input->post('formData'); + $lehrauftraege = $this->input->post('clickedRows'); + + $vertragstyp_kurzbz = $formData['vertragstyp_kurzbz'] ?? null; + $vertragsdatum = $formData['vertragsdatum'] ?? null; + $bezeichnung = $formData['bezeichnung'] ?? null; + $betrag = $formData['betrag'] ?? null; + $vertragsstunden = $formData['vertragsstunden'] ?? null; + $vertragsstunden_studiensemester_kurzbz = $formData['vertragsstunden_studiensemester_kurzbz'] ?? null; + $anmerkung = $formData['anmerkung'] ?? null; + + + $this->form_validation->set_data($formData); + $this->form_validation->set_rules('bezeichnung', 'Bezeichnung', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Bezeichnung']) + ]); + + $this->form_validation->set_rules('vertragstyp_kurzbz', 'Vertragstyp', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Vertragstyp']) + ]); + $this->form_validation->set_rules('vertragsdatum', 'Vertragsdatum', 'required|is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Vertragsdatum']), + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Vertragsdatum']) + ]); + $this->form_validation->set_rules('betrag', 'Betrag', 'required|numeric', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Betrag']), + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Betrag']) + ]); + $this->form_validation->set_rules('vertragsstunden', 'Stunden(Vertrags-Urfassung)', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Stunden(Vertrags-Urfassung)']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $this->db->trans_start(); + + $result = $this->VertragModel->update( + $vertrag_id, + [ + 'person_id' => $person_id, + 'vertragsdatum' => $vertragsdatum, + 'bezeichnung' => $bezeichnung, + 'vertragstyp_kurzbz' => $vertragstyp_kurzbz, + 'betrag' => $betrag, + 'vertragsstunden' => $vertragsstunden, + 'vertragsstunden_studiensemester_kurzbz' => $vertragsstunden_studiensemester_kurzbz, + 'anmerkung' => $anmerkung, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() + ] + ); + + $this->getDataOrTerminateWithError($result); + + //Adding of Lehraufträge + foreach ($lehrauftraege as $row) + { + if ($row['type'] == 'Lehrauftrag') + { + $this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); + + $result_lehrauftrag = $this->LehreinheitmitarbeiterModel->update( + [ + 'lehreinheit_id' => $row['lehreinheit_id'], + 'mitarbeiter_uid' => $row['mitarbeiter_uid'] + ], + [ + 'vertrag_id' => $vertrag_id, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() + ] + ); + + if (!$result_lehrauftrag) { + $this->db->trans_rollback(); + $this->terminateWithError($this->p->t('vertrag', 'error_addOrUpdateLehrauftraege'), self::ERROR_TYPE_GENERAL); + } + } + + if ($row['type'] == 'Betreuung') + { + $this->load->model('education/Projektbetreuer_model', 'Projektbetreuermodel'); + + $result_projektbetreuer = $this->Projektbetreuermodel->update( + [ + 'person_id' => $person_id, + 'projektarbeit_id' => $row['projektarbeit_id'], + 'betreuerart_kurzbz' => $row['betreuerart_kurzbz'] + ], + [ + 'vertrag_id' => $vertrag_id, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() + ] + ); + + if (!$result_projektbetreuer) + { + $this->db->trans_rollback(); + $this->terminateWithError($this->p->t('vertrag', 'error_addOrUpdateLehrauftraege'), self::ERROR_TYPE_GENERAL); + } + } + } + $this->db->trans_complete(); + + $this->terminateWithSuccess(true); + } + + public function loadContract($vertrag_id) + { + $result = $this->VertragModel->load($vertrag_id); + + if (isError($result)) { + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + + if (!hasData($result)) { + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Vertrag_id']), self::ERROR_TYPE_GENERAL); + } + + $this->terminateWithSuccess(current(getData($result))); + } + + public function deleteContract($vertrag_id) + { + $this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); + + //check if attached Lehrauftrag + $resultLehrauftrag = $this->LehreinheitmitarbeiterModel->load([ + 'vertrag_id' => $vertrag_id + ]); + + if(hasData($resultLehrauftrag)) + { + $resultLehrauftrag = getData($resultLehrauftrag); + foreach($resultLehrauftrag as $lehrauftrag) + { + $result = $this->LehreinheitmitarbeiterModel->update( + [ + 'lehreinheit_id' => $lehrauftrag->lehreinheit_id, + 'mitarbeiter_uid' => $lehrauftrag->mitarbeiter_uid, + 'vertrag_id' => $vertrag_id + ], + [ + 'vertrag_id' => null, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() + ] + ); + + $this->getDataOrTerminateWithError($result); + } + } + + //if attached Betreuung + $this->load->model('education/Projektbetreuer_model', 'Projektbetreuermodel'); + + //if attached Betreuung + $resultBetreuung = $this->Projektbetreuermodel->load([ + 'vertrag_id' => $vertrag_id + ]); + + if(hasData($resultBetreuung)) + { + $resultBetreuung = getData($resultBetreuung); + foreach($resultBetreuung as $betreuung) + { + $result = $this->Projektbetreuermodel->update( + [ + 'person_id' => $betreuung->person_id, + 'projektarbeit_id' => $betreuung->projektarbeit_id, + 'betreuerart_kurzbz' => $betreuung->betreuerart_kurzbz, + 'vertrag_id' => $vertrag_id + ], + [ + 'vertrag_id' => null, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() + + ] + ); + + $this->getDataOrTerminateWithError($result); + } + } + + $result = $this->VertragvertragsstatusModel->load([ + 'vertrag_id' => $vertrag_id + ]); + + if(hasData($result)) + { + $data = getData($result); + foreach ($data as $item) + { + //delete all entries in lehre.tbl_vertrag_vertragsstatus + $result = $this->VertragvertragsstatusModel->delete([ + 'vertrag_id' => $vertrag_id, + 'vertragsstatus_kurzbz' => $item->vertragsstatus_kurzbz, + 'uid' => $item->uid + ]); + if(isError($result)) + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + } + + //delete Contract + $result = $this->VertragModel->delete( + array('vertrag_id' => $vertrag_id, + ) + ); + + if (isError($result)) { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + if (!hasData($result)) { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Vertrag_id']), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(current(getData($result))); + } + + public function insertContractStatus() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules('vertragsstatus_kurzbz', 'vertragsstatus_kurzbz', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'vertragsstatus_kurzbz']) + ]); + $this->form_validation->set_rules('datum', 'Datum', 'required|is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Datum']), + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Datum']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->VertragvertragsstatusModel->loadWhere( + array( + 'vertrag_id' => $this->input->post('vertrag_id'), + 'vertragsstatus_kurzbz' => $this->input->post('vertragsstatus_kurzbz') + ) + ); + + if (hasData($result)) + { + $this->terminateWithError($this->p->t('vertrag', 'error_statusVorhanden'), self::ERROR_TYPE_GENERAL); + } + + $status_result = $this->VertragvertragsstatusModel->insert([ + 'vertrag_id' => $this->input->post('vertrag_id'), + 'uid' => getAuthUID(), + 'vertragsstatus_kurzbz' => $this->input->post('vertragsstatus_kurzbz'), + 'insertamum' => date('c'), + 'insertvon' => getAuthUID(), + 'datum' => $this->input->post('datum') + ]); + + if (!$status_result) { + $this->terminateWithError('Fehler beim Hinzufügen des Vertragsstatus.'); + } + + return $this->terminateWithSuccess(current(getData($status_result))); + } + + public function deleteContractStatus() + { + $status = $this->input->post('vertragsstatus_kurzbz'); + $vertrag_id = $this->input->post('vertrag_id'); + + $result = $this->VertragvertragsstatusModel->delete( + array( + 'vertrag_id' => $vertrag_id, + 'vertragsstatus_kurzbz' => $status + ) + ); + + if (isError($result)) + { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + if (!hasData($result)) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'vertragsstatus_kurzb']), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(current(getData($result))); + } + + public function loadContractStatus() + { + $status = $this->input->get('vertragsstatus_kurzbz'); + $vertrag_id = $this->input->get('vertrag_id'); + + $result = $this->VertragvertragsstatusModel->loadWhere( + array( + 'vertrag_id' => $vertrag_id, + 'vertragsstatus_kurzbz' => $status + ) + ); + if (!$result) { + $this->terminateWithError('Status not existing'); + } + return $this->terminateWithSuccess(current(getData($result))); + } + + public function updateContractStatus() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules('vertragsstatus_kurzbz', 'vertragsstatus_kurzbz', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'vertragsstatus_kurzbz']) + ]); + $this->form_validation->set_rules('datum', 'Datum', 'required|is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Datum']), + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Datum']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $status_result = $this->VertragvertragsstatusModel->update( + [ + 'vertrag_id' => $this->input->post('vertrag_id'), + 'vertragsstatus_kurzbz' => $this->input->post('vertragsstatus_kurzbz') + ], + [ + 'uid' => getAuthUID(), + 'updateamum' => date('c'), + 'updatevon' => getAuthUID(), + 'datum' => $this->input->post('datum') + ] + ); + + if (!$status_result) { + $this->terminateWithError('Fehler beim Updaten des Vertragsstatus.'); + } + + return $this->terminateWithSuccess(current(getData($status_result))); + } + + public function deleteLehrauftrag() + { + $lehreinheit_id = $this->input->post('lehreinheit_id'); + $mitarbeiter_uid = $this->input->post('mitarbeiter_uid'); + $vertrag_id = $this->input->post('vertrag_id'); + + $this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); + + //kein delete: ein update, bei dem die vertrag_id auf null gesetzt wird + $result = $this->LehreinheitmitarbeiterModel->update( + [ + 'lehreinheit_id' => $lehreinheit_id, + 'mitarbeiter_uid' => $mitarbeiter_uid, + 'vertrag_id' => $vertrag_id + ], + [ + 'vertrag_id' => null, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() + ] + ); + + if (isError($result)) + { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + if (!hasData($result)) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Id_Lehrauftrag']), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(current(getData($result))); + } + + public function deleteBetreuung() + { + $person_id= $this->input->post('person_id'); + $projektarbeit_id = $this->input->post('projektarbeit_id'); + $betreuerart_kurzbz = $this->input->post('betreuerart_kurzbz'); + $vertrag_id = $this->input->post('vertrag_id'); + + $this->load->model('education/Projektbetreuer_model', 'Projektbetreuermodel'); + + $result = $this->Projektbetreuermodel->update( + [ + 'person_id' => $person_id, + 'projektarbeit_id' => $projektarbeit_id, + 'betreuerart_kurzbz' => $betreuerart_kurzbz, + 'vertrag_id' => $vertrag_id + ], + [ + 'vertrag_id' => null, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() + ] + ); + + if (isError($result)) + { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + if (!hasData($result)) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Id_Projektbetreuung']), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(current(getData($result))); + } + + public function getMitarbeiter() + { + $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); + + $result = $this->Mitarbeitermodel->getPersonenWithContractDetails(); + + if (isError($result)) + { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + if (!hasData($result)) + { + //return data before PV21 (with filter fix angestellt, active and with bisverwendung) + $result = $this->Mitarbeitermodel->getPersonal(true, true, true); + if (isError($result)) + { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + } + return $this->terminateWithSuccess(getData($result)); + } + + public function getPersonAbteilung($mitarbeiter_uid) + { + $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); + + $result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function getLeitungOrg($oekurzbz) + { + $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); + + $result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function getHeader($person_id) + { + $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); + + $result = $this->Mitarbeitermodel->getHeader($person_id); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } +} diff --git a/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php b/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php new file mode 100644 index 000000000..cf76746ef --- /dev/null +++ b/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php @@ -0,0 +1,67 @@ + ['admin:r', 'assistenz:r'], + 'getVorlagenByLoggedInUser' => ['admin:r', 'assistenz:r'], + ]); + + //Load Models + $this->load->model('system/Vorlage_model', 'VorlageModel'); + + // Additional Permission Checks + //TODO(manu) check permissions + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('form_validation'); + $this->load->library('VorlageLib'); + + // Load language phrases + $this->loadPhrases([ + 'ui' + ]); + } + + public function getVorlagen() + { + $this->load->model('system/Vorlage_model', 'VorlageModel'); + + $this->VorlageModel->addOrder('vorlage_kurzbz', 'ASC'); + + $result = $this->VorlageModel->loadWhere( + array( + 'mimetype' => 'text/html' + )); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getVorlagenByLoggedInUser() + { + //get oe of user + $uid = getAuthUID(); + $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + $result = $this->BenutzerfunktionModel->getBenutzerfunktionByUid($uid, 'oezuordnung'); + + if (hasData($result)) + { + $data = getData($result); + + $oe_kurzbz = array_column($data, 'oe_kurzbz'); + $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz); + + $this->terminateWithSuccess(hasData($result) ? getData($result) : array()); + } + $this->terminateWithSuccess(array()); + + } + +} \ No newline at end of file diff --git a/application/controllers/api/v1/person/Person.php b/application/controllers/api/v1/person/Person.php index 6a373137f..935fbae62 100644 --- a/application/controllers/api/v1/person/Person.php +++ b/application/controllers/api/v1/person/Person.php @@ -233,10 +233,10 @@ class Person extends API_Controller //Quersumme bilden for ($i = 0; $i < 10; $i++) { - $erg += $gewichtung[$i] * $tmpSvnr{$i}; + $erg += $gewichtung[$i] * $tmpSvnr[$i]; } - if ($tmpSvnr{3} != ($erg % 11)) //Vergleichen der Pruefziffer mit Quersumme Modulo 11 + if ($tmpSvnr[3] != ($erg % 11)) //Vergleichen der Pruefziffer mit Quersumme Modulo 11 { return error('SVNR ist ungueltig'); } @@ -244,7 +244,7 @@ class Person extends API_Controller if (mb_strlen($person['svnr']) == 12) { $last = substr($person['svnr'], 10, 12); - if ($last{0} != 'v' || !is_numeric($last{1})) + if ($last[0] != 'v' || !is_numeric($last[1])) { return error('SVNR ist ungueltig'); } diff --git a/application/controllers/codex/UHSTAT1.php b/application/controllers/codex/UHSTAT1.php index ff59ef41a..c1d4d0abf 100644 --- a/application/controllers/codex/UHSTAT1.php +++ b/application/controllers/codex/UHSTAT1.php @@ -11,6 +11,7 @@ class UHSTAT1 extends FHC_Controller const CODEX_UNKNOWN_YEAR = 9999; const CODEX_UNKNOWN_NATION = 'XXX'; const CODEX_UNKNOWN_BILDUNGMAX = 999; + const CODEX_EXCLUDED_NATIONS = ['ZZZ']; const LOWER_BOUNDARY_YEARS = 160; const UPPER_BOUNDARY_YEARS = 20; @@ -32,8 +33,7 @@ class UHSTAT1 extends FHC_Controller $this->load->library('PermissionLib'); // load models - $this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel'); - $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); $this->load->model('system/Sprache_model', 'SpracheModel'); $this->load->model('codex/Abschluss_model', 'AbschlussModel'); $this->load->model('codex/Uhstat1daten_model', 'Uhstat1datenModel'); @@ -104,7 +104,7 @@ class UHSTAT1 extends FHC_Controller { $saved = false; - $person_id = $this->_getValidPersonId('sui'); + $person_id = $this->_getUHSTATPersonId('sui'); $this->form_validation->set_error_delimiters('', ''); @@ -245,7 +245,7 @@ class UHSTAT1 extends FHC_Controller // uhstat data can only be deleted with permission if (!$this->_checkPermission('suid')) show_error('no permission'); - $person_id = $this->_getValidPersonId('suid'); + $person_id = $this->_getUHSTATPersonId('suid'); $uhstat1datenRes = $this->Uhstat1datenModel->delete( array('person_id' => $person_id) @@ -287,13 +287,17 @@ class UHSTAT1 extends FHC_Controller */ private function _getFormMetaData() { - $person_id = $this->_getValidPersonId('s'); + $person_id = $this->_getUHSTATPersonId('s'); // read only display param $readOnly = $this->input->get('readOnly'); - // depending on permissions, editing or deleting is possible - $editPermission = $this->_checkPermission('sui'); + // checking permissions for form + + // saving is possible if there permission or student log in (but not from application tool) + $savePermission = $this->_checkPermission('sui') || ($this->_getUserPersonId() && !$this->_getApplicationToolPersonId()); + + // deleting only possible with permission $deletePermission = $this->_checkPermission('suid'); $languageIdx = $this->_getLanguageIndex(); @@ -304,7 +308,7 @@ class UHSTAT1 extends FHC_Controller 'abschluss_nicht_oesterreich' => array(), 'jahre' => array(), 'person_id' => $person_id, - 'editPermission' => $editPermission, + 'savePermission' => $savePermission, 'deletePermission' => $deletePermission, 'readOnly' => $readOnly ); @@ -336,15 +340,19 @@ class UHSTAT1 extends FHC_Controller if (hasData($nationRes)) { + $dropdownNations = []; $nations = getData($nationRes); - // put austria in beginning of selection foreach ($nations as $nation) { - if ($nation->nation_code == self::CODEX_OESTERREICH) array_unshift($nations, $nation); + // put austria in beginning of selection + if ($nation->nation_code == self::CODEX_OESTERREICH) + array_unshift($dropdownNations, $nation); + elseif (!in_array($nation->nation_code, self::CODEX_EXCLUDED_NATIONS)) // add nation if not excluded + $dropdownNations[] = $nation; } - $formMetaData['nation'] = $nations; + $formMetaData['nation'] = $dropdownNations; } // get abschluss list @@ -386,7 +394,7 @@ class UHSTAT1 extends FHC_Controller */ private function _getUHSTAT1Data() { - $person_id = $this->_getValidPersonId('s'); + $person_id = $this->_getUHSTATPersonId('s'); $this->Uhstat1datenModel->addSelect( implode(', ', array_keys($this->_uhstat1Fields)) @@ -417,29 +425,70 @@ class UHSTAT1 extends FHC_Controller } /** - * Gets Id of person having permissions to manage UHSTAT1 data. - * Can be passed as parameter or be in session. + * Gets Id of person, for which UHSTAT1 data is edited. + * Can be passed as parameter, id of logged in person, or be in session. + * @param berechtigungsArt type of permission (suid) * @return int person_id */ - private function _getValidPersonId($berechtigungsArt) + private function _getUHSTATPersonId($berechtigungsArt) { // if coming from bewerbungstool - person id is in session (person must be logged in bewerbungstool) + $applicationToolPersonId = $this->_getApplicationToolPersonId(); + if (isset($applicationToolPersonId) && is_numeric($applicationToolPersonId)) return $applicationToolPersonId; + + // if successfully logged in + $loggedInPersonId = $this->_getUserPersonId(); + if (isset($loggedInPersonId) && is_numeric($loggedInPersonId)) + { + // if person id passed directly... + $person_id = $this->input->post('person_id'); + if (!isset($person_id)) $person_id = $this->input->get('person_id'); + + if (isset($person_id)) + { + if (!is_numeric($person_id)) show_error("invalid person id"); + // ...check if there is a permission for editing UHSTAT1 data + if ($this->_checkPermission($berechtigungsArt)) return $person_id; + } + + // if no id passed, use logged in person id + return $loggedInPersonId; + } + + show_error("No permission"); + } + + /** + * Gets person Id if there is a application tool login. + * @return person Id or null + */ + private function _getApplicationToolPersonId() + { + // if coming from aplication tool - person id is in session (person must be logged in bewerbungstool) if (isset($_SESSION[self::PERSON_ID_SESSION_INDEX]) && is_numeric($_SESSION[self::PERSON_ID_SESSION_INDEX]) && isset($_SESSION[self::LOGIN_SESSION_INDEX]) ) return $_SESSION[self::PERSON_ID_SESSION_INDEX]; - // if person id passed directly... - $person_id = $this->input->post('person_id'); - if (!isset($person_id)) $person_id = $this->input->get('person_id'); + return null; + } - if (!isset($person_id) || !is_numeric($person_id)) show_error("invalid person id"); - - // ...check if there is a permission for editing UHSTAT1 data - if ($this->_checkPermission($berechtigungsArt)) return $person_id; - - show_error("No permission"); + /** + * Gets person Id if there is a user login. + * @return person Id or null + */ + private function _getUserPersonId() + { + $loggedInPersonId = getAuthPersonId(); + if (isset($loggedInPersonId) && is_numeric($loggedInPersonId)) + { + // check if the the user is a student and if the benutzer is active + $this->BenutzerModel->addSelect('1'); + $res = $this->BenutzerModel->loadWhere(["public.tbl_benutzer.person_id" => $loggedInPersonId, "public.tbl_benutzer.aktiv" => TRUE]); + if (hasData($res)) return $loggedInPersonId; + } + return null; } /** diff --git a/application/controllers/components/Cis/Stundenplan.php b/application/controllers/components/Cis/LvPlan.php similarity index 97% rename from application/controllers/components/Cis/Stundenplan.php rename to application/controllers/components/Cis/LvPlan.php index a9f35c651..d4cf63520 100644 --- a/application/controllers/components/Cis/Stundenplan.php +++ b/application/controllers/components/Cis/LvPlan.php @@ -5,7 +5,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** * */ -class Stundenplan extends Auth_Controller +class LvPlan extends Auth_Controller { /** diff --git a/application/controllers/dashboard/Config.php b/application/controllers/dashboard/Config.php index 2c0cf5fca..f6db9509f 100644 --- a/application/controllers/dashboard/Config.php +++ b/application/controllers/dashboard/Config.php @@ -65,7 +65,7 @@ class Config extends Auth_Controller $preset_decoded = json_decode($preset->preset, true); - $this->DashboardLib->addWidgetsToWidgets($preset_decoded['widgets'], $dashboard_kurzbz, $funktion_kurzbz, $input->widgets); + $this->DashboardLib->addWidgetsToWidgets($preset_decoded, $dashboard_kurzbz, $funktion_kurzbz, $input->widgets); $preset->preset = json_encode($preset_decoded); @@ -92,7 +92,7 @@ class Config extends Auth_Controller } $preset_decoded = json_decode($preset->preset, true); - if (!$this->DashboardLib->removeWidgetFromWidgets($preset_decoded['widgets'], $funktion_kurzbz, $widgetid)) + if (!$this->DashboardLib->removeWidgetFromWidgets($preset_decoded, $funktion_kurzbz, $widgetid)) { http_response_code(404); $this->terminateWithJsonError('widgetid ' . $widgetid . ' not found'); @@ -119,7 +119,7 @@ class Config extends Auth_Controller $override_decoded = json_decode($override->override, true); - $this->DashboardLib->addWidgetsToWidgets($override_decoded['widgets'], $dashboard_kurzbz, $funktion_kurzbz, $input->widgets); + $this->DashboardLib->addWidgetsToWidgets($override_decoded, $dashboard_kurzbz, $funktion_kurzbz, $input->widgets); $override->override = json_encode($override_decoded); @@ -148,7 +148,7 @@ class Config extends Auth_Controller $override_decoded = json_decode($override->override, true); - if (!$this->DashboardLib->removeWidgetFromWidgets($override_decoded['widgets'], $funktion_kurzbz, $widgetid)) + if (!$this->DashboardLib->removeWidgetFromWidgets($override_decoded, $funktion_kurzbz, $widgetid)) { http_response_code(404); $this->terminateWithJsonError('widgetid ' . $widgetid . ' not found'); @@ -202,10 +202,10 @@ class Config extends Auth_Controller if ($conf) { $preset = json_decode($conf->preset, true); - if (!isset($preset['widgets']) || !isset($preset['widgets'][$funktion])) + if (!isset($preset[$funktion]) || !isset($preset[$funktion]['widgets'])) $result[$funktion] = []; else - $result[$funktion] = $preset['widgets'][$funktion]; + $result[$funktion] = $preset[$funktion]['widgets']; } else $result[$funktion] = []; diff --git a/application/controllers/dashboard/Widget.php b/application/controllers/dashboard/Widget.php index 0da6fe8da..9966ddc12 100644 --- a/application/controllers/dashboard/Widget.php +++ b/application/controllers/dashboard/Widget.php @@ -33,19 +33,26 @@ class Widget extends Auth_Controller return $this->outputJsonSuccess([ "widget_id" => 0, "widget_kurzbz" => "notfound", - "arguments" => json_encode([ + "arguments" => [ "className" => 'alert-danger', "title" => 'Widget Not Found', "msg" => 'The widget with the id ' . $widget_id . ' could not be found' - ]), - "setup" => json_encode([ + ], + "setup" => [ "name" => 'Widget Not Found', - "file" => 'DashboardWidget/Default.js', + "file" => absoluteJsImportUrl('public/js/components/DashboardWidget/Default.js'), "width" => 1, "height" => 1 - ]) + ] ]); - return $this->outputJsonSuccess(current(getData($widget))); + + $widget = current(getData($widget)); + $widget->arguments = json_decode($widget->arguments); + $tmpsetup = json_decode($widget->setup); + $tmpsetup->file = absoluteJsImportUrl($tmpsetup->file); + $widget->setup = $tmpsetup; + + return $this->outputJsonSuccess($widget); } public function getAll() @@ -56,7 +63,16 @@ class Widget extends Auth_Controller if (isError($result)) return $this->outputJsonError(getError($result)); - $this->outputJsonSuccess(getData($result) ?: []); + $tmpwidgets = getData($result) ?: []; + $widgets = array_map(function($widget) { + $widget->arguments = json_decode($widget->arguments); + $tmpsetup = json_decode($widget->setup); + $tmpsetup->file = absoluteJsImportUrl($tmpsetup->file); + $widget->setup = $tmpsetup; + return $widget; + }, $tmpwidgets); + + $this->outputJsonSuccess($widgets); } public function getWidgetsForDashboard() @@ -71,7 +87,16 @@ class Widget extends Auth_Controller ]); } - $this->outputJsonSuccess(getData($result) ?: []); + $tmpwidgets = getData($result) ?: []; + $widgets = array_map(function($widget) { + $widget->arguments = json_decode($widget->arguments); + $tmpsetup = json_decode($widget->setup); + $tmpsetup->file = absoluteJsImportUrl($tmpsetup->file); + $widget->setup = $tmpsetup; + return $widget; + }, $tmpwidgets); + + $this->outputJsonSuccess($widgets); } public function setAllowed() diff --git a/application/controllers/jobs/AbgabetoolJob.php b/application/controllers/jobs/AbgabetoolJob.php new file mode 100644 index 000000000..51b2b4920 --- /dev/null +++ b/application/controllers/jobs/AbgabetoolJob.php @@ -0,0 +1,621 @@ +_ci =& get_instance(); + + $this->_ci->load->helper('hlp_sancho_helper'); + + $this->_ci->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $this->_ci->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); + $this->_ci->load->model('education/Paabgabe_model', 'PaabgabeModel'); + $this->_ci->load->model('crm/Student_model', 'StudentModel'); + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); + + $this->_ci->load->config('abgabe'); + $this->loadPhrases([ + 'abgabetool' + ]); + } + + public function notifyAssistenzAboutChangedAbgaben() { + + $this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutChangedAbgaben'); + + $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); + $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'); + // get all new or changed termine in interval + $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes); + + $retval = getData($result); + + if(count($retval) == 0) { + $this->_ci->logInfo("Keine Emails an Assistenzen über neue oder veränderte Termine versandt"); + return; + } + + // group changed/new abgaben for projektarbeiten + $projektarbeiten = []; + foreach($retval as $newOrChangedAbgabe) { + // Check if the current item has a 'projektarbeit_id' field. + // Replace 'projektarbeit_id' with the actual key name if it's different. + if (isset($newOrChangedAbgabe->projektarbeit_id)) { + $projektarbeitId = $newOrChangedAbgabe->projektarbeit_id; + + // If the 'projektarbeit_id' is not yet a key in $projektarbeiten, + // initialize it as an empty array. + if (!isset($projektarbeiten[$projektarbeitId])) { + $projektarbeiten[$projektarbeitId] = []; + } + + // Add the current row to the array associated with its 'projektarbeit_id'. + $projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe; + } + } + + // for each projektarbeit fetch their assistenz and same them in their own dictionary to avoid too many mails + $assistenzMap = []; + // for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails + $projektarbeitBetreuerMap = []; + forEach($projektarbeiten as $projektarbeit_id => $abgaben) { + + $assistenzResult = $this->_ci->OrganisationseinheitModel->getAssistenzForOE($abgaben[0]->stg_oe_kurzbz); + + forEach($assistenzResult->retval as $assistenzRow) { + if (!isset($assistenzMap[$assistenzRow->person_id])) { + $assistenzMap[$assistenzRow->person_id] = []; + } + + // Add the current $assistenzRow to the $assistenzMap as an array associated with its projektarbeit_id. + $assistenzMap[$assistenzRow->person_id][] = [$projektarbeit_id, $assistenzRow]; + } + + $betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id); + + forEach($betreuerResult->retval as $betreuerRow) { + if (!isset($projektarbeitBetreuerMap[$projektarbeit_id])) { + $projektarbeitBetreuerMap[$projektarbeit_id] = []; + } + + // Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id. + $projektarbeitBetreuerMap[$projektarbeit_id][] = $betreuerRow; + } + } + + $count = 0; + foreach($assistenzMap as $assistenz_person_id => $tupelArr) { + + $abgabenString = '
'; + + foreach($tupelArr as $tupel) { + $projektarbeit_id = $tupel[0]; + $assistenzRow = $tupel[1]; + + $betreuerArray = $projektarbeitBetreuerMap[$projektarbeit_id] ?? []; + $changedAbgaben = $projektarbeiten[$projektarbeit_id]; + + $relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($assistenzRow) { + if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $assistenzRow->uid) { + return $abgabetermin; + } else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $assistenzRow->uid) { + return $abgabetermin; + } + })); + + if(count($relevantAbgaben) == 0) { + continue; + } + + // Format the Student Name + $s = $relevantAbgaben[0]; + $nameParts = []; + if (!empty($s->titelpre)) $nameParts[] = $s->titelpre; + $nameParts[] = $s->vorname; + $nameParts[] = $s->nachname; + if (!empty($s->titelpost)) $nameParts[] = $s->titelpost; + $studentFullName = implode(' ', $nameParts); + + // Format the Supervisors string + $betreuerStrings = []; + foreach($betreuerArray as $b) { + $bNameParts = []; + if (!empty($b->titelpre)) $bNameParts[] = $b->titelpre; + $bNameParts[] = $b->vorname; + $bNameParts[] = $b->nachname; + if (!empty($b->titelpost)) $bNameParts[] = $b->titelpost; + + $bFullName = implode(' ', $bNameParts); + $betreuerStrings[] = "{$bFullName} ({$b->betreuerart_kurzbz})"; + } + $allBetreuerFormatted = implode(', ', $betreuerStrings); + + $projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben'; + + // Project Header Section + $abgabenString .= " +
+ Projekt: {$projektarbeit_titel}
+
+ Studierende/r: {$studentFullName} +
+
+ Betreuer: {$allBetreuerFormatted} +
+ + ID: {$projektarbeit_id} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz}) + +
"; + + // Start Table + $abgabenString .= ' + + + + + + + + '; + + foreach ($relevantAbgaben as $abgabe) { + $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y'); + $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y'); + $kurzbzLine = !empty($abgabe->kurzbz) ? "
{$abgabe->kurzbz}" : ""; + + $abgabenString .= " + + + + "; + } + + $abgabenString .= '
ZieldatumBezeichnung
{$dateEmailFormatted} + {$abgabe->bezeichnung}{$kurzbzLine} +
'; + } + + $abgabenString .= '
'; + + // done with building the change list, now send it + $assistenzRow = $tupelArr[0][1]; + $anrede = $assistenzRow->anrede; + $anredeFillString = $assistenzRow->anrede == "Herr" ? "r" : ""; + $fullFormattedNameString = $assistenzRow->first; + + + + $path = $this->_ci->config->item('URL_ASSISTENZ'); + $url = CIS_ROOT.$path; + + $body_fields = array( + 'anrede' => $anrede, + 'anredeFillString' => $anredeFillString, + 'fullFormattedNameString' => $fullFormattedNameString, + 'abgabenString' => $abgabenString, + 'linkAbgabetool' => $url + ); + + $email = $assistenzRow->uid."@".DOMAIN; + + // send email with bundled info + sendSanchoMail( + 'PAAChangesAssSM', + $body_fields, + $email, + $this->p->t('abgabetool', 'changedAbgabeterminev2') + ); + + $count++; + } + + $this->_ci->logInfo($count . " Emails erfolgreich versandt"); + $this->_ci->logInfo('End job FHC-Core->notifyAssistenzAboutChangedAbgaben'); + } + + public function notifyBetreuerAboutChangedAbgaben() { + + $this->_ci->logInfo('Start job FHC-Core->notifyBetreuerAboutChangedAbgaben'); + + $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); + + $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_BETREUER'); + + // get all new or changed termine in interval + $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes); + $retval = getData($result); + + if(count($retval) == 0) { + $this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt"); + return; + } + + // group changed/new abgaben for projektarbeiten + $projektarbeiten = []; + foreach($retval as $newOrChangedAbgabe) { + // Check if the current item has a 'projektarbeit_id' field. + // Replace 'projektarbeit_id' with the actual key name if it's different. + if (isset($newOrChangedAbgabe->projektarbeit_id)) { + $projektarbeitId = $newOrChangedAbgabe->projektarbeit_id; + + // If the 'projektarbeit_id' is not yet a key in $projektarbeiten, + // initialize it as an empty array. + if (!isset($projektarbeiten[$projektarbeitId])) { + $projektarbeiten[$projektarbeitId] = []; + } + + // Add the current row to the array associated with its 'projektarbeit_id'. + $projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe; + } + } + + // for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails + $betreuerMap = []; + forEach($projektarbeiten as $projektarbeit_id => $abgaben) { + $betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id); + + forEach($betreuerResult->retval as $betreuerRow) { + if (!isset($betreuerMap[$betreuerRow->person_id])) { + $betreuerMap[$betreuerRow->person_id] = []; + } + + // Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id. + $betreuerMap[$betreuerRow->person_id][] = [$projektarbeit_id, $betreuerRow]; + } + } + + $count = 0; + // now iterate over the betreuerMap and build 1 email about all projektarbeiten and their new/changed termine + // $tupel = [$projektarbeit_id, $betreuerRow], each betreuer has 0..n [projektarbeit_id, changedAbgaben] tupel + forEach($betreuerMap as $betreuer_person_id => $tupelArr) { + + // start the container + $abgabenString = '
'; + + $result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($betreuer_person_id); + $data = getData($result)[0]; + + $anrede = $data->anrede; + $anredeFillString = $data->anrede == "Herr" ? "r" : ""; + $fullFormattedNameString = $data->first; + + forEach($tupelArr as $tupel) { + $projektarbeit_id = $tupel[0]; + $betreuerRow = $tupel[1]; + + $changedAbgaben = $projektarbeiten[$projektarbeit_id]; + + $relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($betreuerRow) { + if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $betreuerRow->uid) { + return $abgabetermin; + } else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $betreuerRow->uid) { + return $abgabetermin; + } + })); + + if(count($relevantAbgaben) == 0) { + continue; + } + + // format the Student Name + $s = $relevantAbgaben[0]; + $nameParts = []; + if (!empty($s->titelpre)) $nameParts[] = $s->titelpre; + $nameParts[] = $s->vorname; + $nameParts[] = $s->nachname; + if (!empty($s->titelpost)) $nameParts[] = $s->titelpost; + $studentFullName = implode(' ', $nameParts); + + $projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben'; + + // project header section + $abgabenString .= " +
+ Projekt: {$projektarbeit_titel}
+
+ Studierende/r: {$studentFullName} +
+ + ID: {$projektarbeit_id} | Rolle: {$betreuerRow->betreuerart_kurzbz} | + Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz}) + +
"; + + // start table + $abgabenString .= ' + + + + + + + + '; + + foreach ($relevantAbgaben as $abgabe) { + $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y'); + $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y'); + $kurzbzLine = !empty($abgabe->kurzbz) ? "
{$abgabe->kurzbz}" : ""; + + $abgabenString .= " + + + + "; + } + + $abgabenString .= '
ZieldatumBezeichnung
{$dateEmailFormatted} + {$abgabe->bezeichnung}{$kurzbzLine} +
'; + } + + // close container + $abgabenString .= '
'; + + // done with building the change list, now send it + $betreuerRow = $tupelArr[0][1]; + + $path = $this->_ci->config->item('URL_MITARBEITER'); + $url = CIS_ROOT.$path; + + $body_fields = array( + 'anrede' => $anrede, + 'anredeFillString' => $anredeFillString, + 'fullFormattedNameString' => $fullFormattedNameString, + 'abgabenString' => $abgabenString, + 'linkAbgabetool' => $url + ); + + $email = $betreuerRow->uid ? $betreuerRow->uid."@".DOMAIN : $betreuerRow->private_email; + + // send email with bundled info + sendSanchoMail( + 'PAAChangesBetSM', + $body_fields, + $email, + $this->p->t('abgabetool', 'changedAbgabeterminev2') + ); + + $count++; + } + + $this->_ci->logInfo($count . " Emails erfolgreich versandt"); + $this->_ci->logInfo('End job FHC-Core->notifyBetreuerAboutChangedAbgaben'); + } + + public function notifyBetreuerMail() { + // send all new projektarbeit abgabe UPLOADS since the last job run to the related betreuer + // this job gathers all new or changed file uploads via field 'abgabedatum', enduploads still + // send an email directly after happening since they are kind of important + + $this->_ci->logInfo('Start job FHC-Core->notifyBetreuerMail'); + + // dont filter for relevant types since this mail should gather all UPLOAD info + + $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); + + $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval); + $retval = getData($result); + + // retval are paabgaben joined with projektarbeit and betreuer + if(count($retval) == 0) { + $this->logInfo("Keine Emails über neue Paabgaben an Betreuer versandt"); + return; + } + + // group contents per betreuer person_id + $betreuer_uids = []; + forEach($retval as $paabgabe) { + if(!isset($betreuer_uids[$paabgabe->person_id])) { + $betreuer_uids[$paabgabe->person_id] = []; + } + + $betreuer_uids[$paabgabe->person_id][] = $paabgabe; + } + + $count = 0; + forEach ($betreuer_uids as $person_id => $abgaben) { + // $person_id is from betreuer + + $result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($person_id); + $data = getData($result)[0]; + + $anrede = $data->anrede; + $anredeFillString = $data->anrede == "Herr" ? "r" : ""; + $fullFormattedNameString = $data->first; + + // sorting $abgaben array by datum + usort($abgaben, function ($a, $b) { + return strtotime($a->datum) <=> strtotime($b->datum); + }); + + $projektarbeit_titel = $abgaben[0]->titel; + + // initialize the table and headers + $abgabenString = ' + + + + + + + + + + '; + + foreach ($abgaben as $abgabe) { + // format the student name + $nameParts = []; + if (!empty($abgabe->titelpre)) $nameParts[] = $abgabe->titelpre; + $nameParts[] = $abgabe->vorname; + $nameParts[] = $abgabe->nachname; + if (!empty($abgabe->titelpost)) $nameParts[] = $abgabe->titelpost; + $studentFullName = implode(' ', $nameParts); + + // format dates inline + $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y'); + $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y'); + + // handle the optional Kurzbezeichnung + $kurzbzLine = !empty($abgabe->kurzbz) ? "
{$abgabe->kurzbz}" : ""; + + $abgabenString .= " + + + + + + "; + } + + $abgabenString .= '
ZieldatumStudierende/rBezeichnungAbgabedatum
{$dateEmailFormatted}{$studentFullName} + {$abgabe->bezeichnung}{$kurzbzLine} + {$abgabedatumFormatted}
'; + + $path = $this->_ci->config->item('URL_MITARBEITER'); + $url = CIS_ROOT.$path; + + $body_fields = array( + 'anrede' => $anrede, + 'anredeFillString' => $anredeFillString, + 'fullFormattedNameString' => $fullFormattedNameString, + 'paTitel' => $projektarbeit_titel, + 'abgabenString' => $abgabenString, + 'linkAbgabetool' => $url + ); + + $result = $this->_ci->ProjektbetreuerModel->getBetreuerOfProjektarbeit($abgaben[0]->projektarbeit_id, $abgaben[0]->betreuerart_kurzbz); + $data = getData($result)[0]; + + $email = $data->uid ? $data->uid."@".DOMAIN : $data->private_email; + + // send email with bundled info + sendSanchoMail( + 'PaabgabeUpdatesBetSM', + $body_fields, + $email, + $this->p->t('abgabetool', 'changedAbgabeterminev2') + ); + + $count++; + } + + $this->_ci->logInfo($count . " Emails erfolgreich versandt"); + $this->_ci->logInfo('End job FHC-Core->notifyBetreuerMail'); + } + + public function notifyStudentMail() + { + // send all new projektarbeit abgabe since the last job run to the related student + + $this->_ci->logInfo('Start job FHC-Core->notifyStudentMail'); + + $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); + + $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_STUDENT'); + + $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes); + $retval = getData($result); + + if(count($retval) == 0) { + $this->_ci->logInfo("Keine Emails an Studenten versandt"); + return; + } + + // group results per projektarbeit/student_uid + $student_uids = []; + forEach($retval as $paabgabe) { + if(!isset($student_uids[$paabgabe->student_uid])) { + $student_uids[$paabgabe->student_uid] = []; + } + + $student_uids[$paabgabe->student_uid][] = $paabgabe; + } + + $count = 0; + foreach ($student_uids as $uid => $abgaben) { + // $uid is the student's UID + $result = $this->_ci->StudentModel->getEmailAnredeForStudentUID($uid); + $data = getData($result)[0]; + + // $abgabe is the array of paabgabe objects + $anredeFillString = $data->anrede=="Herr"?"r":""; + $fullFormattedNameString = trim($data->titelpre." ".$data->vorname." ".$data->vornamen." ".$data->nachname." ".$data->titelpost); + + // https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op + // php has spaceships 🚀🚀🚀🚀🚀 + usort($abgaben, function($a, $b) { + return strtotime($a->datum) <=> strtotime($b->datum); + }); + + $projektarbeit_titel = $abgaben[0]->titel; + + // initialize the table and headers + $abgabenString = ' + + + + + + + + '; + + foreach ($abgaben as $abgabe) { + $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y'); + + // handle the optional Kurzbezeichnung + $kurzbzLine = !empty($abgabe->kurzbz) ? "
{$abgabe->kurzbz}" : ""; + + $abgabenString .= " + + + + "; + } + + $abgabenString .= '
ZieldatumBezeichnung / Hinweis
+ {$dateEmailFormatted} + + {$abgabe->bezeichnung}{$kurzbzLine} +
'; + + $route = $this->_ci->config->item('URL_STUDENTS'); + $url = CIS_ROOT.$route; + + $body_fields = array( + 'anrede' => $data->anrede, + 'anredeFillString' => $anredeFillString, + 'fullFormattedNameString' => $fullFormattedNameString, + 'paTitel' => $projektarbeit_titel, + 'abgabenString' => $abgabenString, + 'linkAbgabetool' => $url + ); + + // send email with bundled info + sendSanchoMail( + 'PaabgabeUpdatesSammelmail', + $body_fields, + $uid.'@'.DOMAIN, + $this->p->t('abgabetool', 'changedAbgabeterminev2') + ); + + $count++; + + } + + $this->_ci->logInfo($count . " Emails erfolgreich versandt"); + $this->_ci->logInfo('End job FHC-Core->notifyStudentMail'); + } +} \ No newline at end of file diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 11b950174..8dc4870ea 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -95,12 +95,15 @@ class AntragJob extends JOB_Controller continue; } - $leitung = current(getData($result)); - if (!isset($stgLeitungen[$leitung->uid])) + $leitungen = getData($result); + foreach ($leitungen as $leitung) { - $stgLeitungen[$leitung->uid] = [ 'Details' => $leitung, 'stgs' => [] ]; + if (!isset($stgLeitungen[$leitung->uid])) + { + $stgLeitungen[$leitung->uid] = ['Details' => $leitung, 'stgs' => []]; + } + $stgLeitungen[$leitung->uid]['stgs'][] = $antrag->studiengang_kz; } - $stgLeitungen[$leitung->uid]['stgs'][] = $antrag->studiengang_kz; $result = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id); if (isError($result)) @@ -197,13 +200,14 @@ class AntragJob extends JOB_Controller } /** - * Send reminder to Assistant for Wiedereinstieg Unterbrecher + * Send reminder to Assistant and to Student for Wiedereinstieg Unterbrecher * */ public function sendReminderWiedereinstieg() { $now = new DateTime(); $modifier = $this->config->item('unterbrechung_job_remind_wiedereinstieg_date_modifier'); + if (!$modifier) return $this->logError('Konnte Job nicht starten: Config "unterbrechung_job_remind_wiedereinstieg_date_modifiers" nicht gesetzt'); @@ -227,6 +231,7 @@ class AntragJob extends JOB_Controller $antraege = getData($result) ?: []; $count = 0; + $countReminderStudent = 0; foreach ($antraege as $antrag) { $res = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id); @@ -254,10 +259,92 @@ class AntragJob extends JOB_Controller $data['UID'] = $student->student_uid; } - // NOTE(chris): Sancho mail - if(sendSanchoMail('Sancho_Mail_Antrag_U_Reminder', $data, $antrag->email, 'Reminder: Unterbrechung Wiedereinstieg')) + //Data für Email Student + $result = $this->PrestudentModel->load($antrag->prestudent_id); + $dataPrestudent = current(getData($result)); + $person_id = $dataPrestudent->person_id; + + $this->KontaktModel->addSelect('kontakt'); + + $result = $this->KontaktModel->loadWhere([ + 'person_id'=> $person_id, + 'zustellung' => true, + 'kontakttyp' => 'email' + ]); + + $email_student_privat = null; + $dataKontakt = getData($result); + if ($dataKontakt) { + $stud_private_zustell_emails = array_map(function($kontakt) { + return $kontakt->kontakt; + }, $dataKontakt); + $email_student_privat = implode(', ', $stud_private_zustell_emails); + } + + $email_student_FH = $this->StudentModel->getEmailFH($this->StudentModel->getUID($antrag->prestudent_id)); + + //studiensemester + $result = $this->StudiensemesterModel->getByDate($datum->format('Y-m-d')); + if (hasData($result)) { + $dataSem = current(getData($result)); + } + + $studiensemester = $dataSem->studiensemester_kurzbz; + $studsemShort = substr($studiensemester, 0, 2); + + if($studsemShort == "SS") + { + $data['studSemShort_Eng'] = "summer semester"; + $data['meldenBis'] = "15.1."; + $data['meldenBis_Eng'] = "January 15"; + } + elseif ($studsemShort == "WS") { + $data['studSemShort_Eng'] = "winter semester"; + $data['meldenBis'] = "1.8."; + $data['meldenBis_Eng'] = "August 1"; + } + else + { + $studsemShort = "SS/WS"; + $data['studSemShort_Eng'] = "summer/winter semester"; + $data['meldenBis'] = "15.1. (bei Einstieg ins SS) / 1.8. (bei Einstieg ins WS)"; + $data['meldenBis_Eng'] = "January 15 (for sommer semester enrollment) / August 1 (for winter semester enrollment)"; + } + + $data['studSemShort'] = $studsemShort; + + // NOTE(chris): Sancho mail Assistant + $sancho_assistant_sent = sendSanchoMail('Sancho_Mail_Antrag_U_Reminder', $data, $antrag->email, 'Reminder: Unterbrechung Wiedereinstieg'); + if($sancho_assistant_sent) { $count++; + } + else + { + $this->logError('Error: failed to send Assistant Reminder studierendenantrag_id: ' . $antrag->studierendenantrag_id); + } + //Mail to Student + $sancho_student_sent = sendSanchoMail( + 'Sancho_Mail_Antrag_U_Remind_Stud', + $data, + $email_student_FH, + 'Reminder: Unterbrechung Wiedereinstieg', + '', + '', + '', + $email_student_privat); + + if($sancho_student_sent) + { + $countReminderStudent++; + } + else + { + $this->logError('Error: failed to send Student Reminder studierendenantrag_id: ' . $antrag->studierendenantrag_id); + } + + if($sancho_assistant_sent && $sancho_student_sent) + { $this->StudierendenantragstatusModel->insert([ 'studierendenantrag_id' => $antrag->studierendenantrag_id, 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REMINDERSENT, @@ -265,7 +352,7 @@ class AntragJob extends JOB_Controller ]); } } - $this->logInfo($count . ' Reminder gesendet - Ende Job sendReminderWiedereinstieg'); + $this->logInfo($count . ' Reminder an Assistenz und ' . $countReminderStudent . ' Reminder an Student gesendet - Ende Job sendReminderWiedereinstieg'); } /** diff --git a/application/controllers/jobs/IssueResolver.php b/application/controllers/jobs/IssueResolver.php index ca07439c3..fe7ee21f5 100755 --- a/application/controllers/jobs/IssueResolver.php +++ b/application/controllers/jobs/IssueResolver.php @@ -48,7 +48,9 @@ class IssueResolver extends IssueResolver_Controller 'CORE_PERSON_0001' => 'CORE_PERSON_0001', 'CORE_PERSON_0002' => 'CORE_PERSON_0002', 'CORE_PERSON_0003' => 'CORE_PERSON_0003', - 'CORE_PERSON_0004' => 'CORE_PERSON_0004' + 'CORE_PERSON_0004' => 'CORE_PERSON_0004', + 'CORE_PERSON_0005' => 'CORE_PERSON_0005', + 'CORE_PERSON_0006' => 'CORE_PERSON_0006' ); // fehler which are resolved by the job the same way as they are produced diff --git a/application/controllers/jobs/MeldezettelJob.php b/application/controllers/jobs/MeldezettelJob.php new file mode 100644 index 000000000..329597985 --- /dev/null +++ b/application/controllers/jobs/MeldezettelJob.php @@ -0,0 +1,86 @@ +_ci =& get_instance(); + + $this->_ci->load->model('crm/Dokumentprestudent_model', 'DokumentprestudentModel'); + } + + /** + * Sets Meldezettel to "accepted" for all students with Meldeadresse. + */ + public function acceptMeldezettel() + { + $this->logInfo('Start Meldezettel Job'); + + $params = array(self::DOKUMENT_KURZBZ); + + $qry = " + -- get all prestudents with meldeadresse, but no accepted Meldezettel + SELECT + DISTINCT prestudent_id + FROM + public.tbl_adresse + JOIN public.tbl_person USING (person_id) + JOIN public.tbl_prestudent ps USING (person_id) + WHERE + typ = 'm' + AND NOT EXISTS ( + SELECT + 1 + FROM + public.tbl_dokumentprestudent + WHERE + prestudent_id = ps.prestudent_id + AND dokument_kurzbz = ? + )"; + + // get all prestudents with Meldeadresse and no accpeted Meldezettel + $result = $this->_ci->DokumentprestudentModel->execReadOnlyQuery($qry, $params); + + if (isError($result)) + { + $this->logError(getError($result)); + } + + $count = 0; + + if (hasData($result)) + { + $prestudents = getData($result); + + foreach ($prestudents as $prestudent) + { + // set Meldezettel to accepted + $result = $this->_ci->DokumentprestudentModel->insert( + array( + 'prestudent_id' => $prestudent->prestudent_id, + 'dokument_kurzbz' => self::DOKUMENT_KURZBZ, + 'datum' => date('Y-m-d'), + 'insertamum' => strftime('%Y-%m-%d %H:%M'), + 'insertvon' => self::INSERT_VON + ) + ); + + if (isError($result)) + $this->logError(getError($result)); + else + $count++; + } + } + + $this->logInfo('End Meldezettel Job', array('Number of changes ' => $count)); + } +} diff --git a/application/controllers/jobs/OneTimeMessages.php b/application/controllers/jobs/OneTimeMessages.php index 525f63c3b..0e49ca8a5 100644 --- a/application/controllers/jobs/OneTimeMessages.php +++ b/application/controllers/jobs/OneTimeMessages.php @@ -52,6 +52,7 @@ class OneTimeMessages extends JOB_Controller JOIN public.tbl_prestudentstatus ps USING (prestudent_id) JOIN public.tbl_studiengang s USING (studiengang_kz) WHERE get_rolle_prestudent(ps.prestudent_id, NULL) = \'Wartender\' + AND ps.status_kurzbz = \'Wartender\' AND ps.studiensemester_kurzbz = ? AND ps.datum <= NOW() - \''.$days.' days\'::interval AND s.typ = ? diff --git a/application/controllers/jobs/ReihungstestJob.php b/application/controllers/jobs/ReihungstestJob.php index 9b2532b4b..6dd214fbb 100644 --- a/application/controllers/jobs/ReihungstestJob.php +++ b/application/controllers/jobs/ReihungstestJob.php @@ -821,7 +821,7 @@ class ReihungstestJob extends JOB_Controller JOIN lehre.tbl_studienordnung USING (studienordnung_id) JOIN PUBLIC.tbl_studiengang ON (tbl_studienordnung.studiengang_kz = tbl_studiengang.studiengang_kz) WHERE get_rolle_prestudent (tbl_prestudent.prestudent_id, ?) IN ('Aufgenommener','Bewerber','Wartender','Abgewiesener') - AND studiensemester_kurzbz = ? + AND studiensemester_kurzbz = ? AND tbl_studiengang.typ IN ('b', 'm') ) SELECT * FROM prst @@ -861,7 +861,7 @@ class ReihungstestJob extends JOB_Controller { // Alle niedrigeren Prios laden $qryNiedrPrios = " - SELECT DISTINCT + SELECT DISTINCT ON(prestudent_id) get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') AS laststatus, tbl_studienplan.orgform_kurzbz, tbl_person.nachname, @@ -880,7 +880,7 @@ class ReihungstestJob extends JOB_Controller AND studiensemester_kurzbz = '".$row_ps->studiensemester_kurzbz."' AND tbl_studiengang.typ IN ('b', 'm') AND priorisierung > ".$row_ps->priorisierung." - ORDER BY studiengang_kz, laststatus + ORDER BY prestudent_id, studiengang_kz, laststatus, tbl_prestudentstatus.datum DESC "; // Wenn der letzte Status "Aufgenommener" ist, alle niedrigeren Prios auf "Abgewiesen" setzen @@ -976,7 +976,7 @@ class ReihungstestJob extends JOB_Controller FROM public.tbl_konto WHERE person_id = " . $row_ps->person_id . " AND studiensemester_kurzbz = '" . $row_ps->studiensemester_kurzbz . "' - AND buchungstyp_kurzbz = 'StudiengebuehrAnzahlung'"; + AND buchungstyp_kurzbz IN ('StudiengebuehrAnzahlung','KautionDrittStaat')"; $resultKautionExists = $db->execReadOnlyQuery($qryKautionExists); if (hasdata($resultKautionExists)) diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php index f6e41d2e6..eaa207ff1 100644 --- a/application/controllers/system/infocenter/InfoCenter.php +++ b/application/controllers/system/infocenter/InfoCenter.php @@ -22,6 +22,7 @@ class InfoCenter extends Auth_Controller const REIHUNGSTESTABSOLVIERT_PAGE = 'reihungstestAbsolviert'; const ABGEWIESEN_PAGE = 'abgewiesen'; const AUFGENOMMEN_PAGE = 'aufgenommen'; + const ONBOARDING_PAGE = 'onboarding'; const SHOW_DETAILS_PAGE = 'showDetails'; const SHOW_ZGV_DETAILS_PAGE = 'showZGVDetails'; const ZGV_UBERPRUEFUNG_PAGE = 'ZGVUeberpruefung'; @@ -116,6 +117,7 @@ class InfoCenter extends Auth_Controller 'index' => 'infocenter:r', 'freigegeben' => 'infocenter:r', 'abgewiesen' => 'infocenter:r', + 'onboarding' => 'infocenter:r', 'aufgenommen' => 'infocenter:r', 'reihungstestAbsolviert' => 'infocenter:r', 'showDetails' => 'infocenter:r', @@ -230,6 +232,13 @@ class InfoCenter extends Auth_Controller $this->load->view('system/infocenter/infocenterAbgewiesen.php'); } + + public function onboarding() + { + $this->_setNavigationMenu(self::ONBOARDING_PAGE); // define the navigation menu for this page + + $this->load->view('system/infocenter/onboarding.php'); + } /** * Aufgenommene page of the InfoCenter tool @@ -362,6 +371,8 @@ class InfoCenter extends Auth_Controller $data[self::ORIGIN_PAGE] = $origin_page; $data[self::PREV_FILTER_ID] = $this->input->get(self::PREV_FILTER_ID); + $data['studiensemester'] = $this->variablelib->getVar('infocenter_studiensemester'); + $this->load->view('system/infocenter/infocenterDetails.php', $data); } @@ -1275,7 +1286,6 @@ class InfoCenter extends Auth_Controller 'nachname' => $this->input->post('nachname'), 'titelpost' => isEmptyString($this->input->post('titelpost')) ? null : $this->input->post('titelpost'), 'gebdatum' => isEmptyString($this->input->post('gebdatum')) ? null : date("Y-m-d", strtotime($this->input->post('gebdatum'))), - 'svnr' => isEmptyString($this->input->post('svnr')) ? null : $this->input->post('svnr'), 'staatsbuergerschaft' => isEmptyString($this->input->post('buergerschaft')) ? null : $this->input->post('buergerschaft'), 'geschlecht' => $this->input->post('geschlecht'), 'geburtsnation' => isEmptyString($this->input->post('gebnation')) ? null : $this->input->post('gebnation'), @@ -1552,6 +1562,7 @@ class InfoCenter extends Auth_Controller $reihungstestAbsolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE); $abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE); $aufgenommenLink = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE); + $onboardingLink = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE); $currentFilterId = $this->input->get(self::FILTER_ID); if (isset($currentFilterId)) @@ -1560,6 +1571,7 @@ class InfoCenter extends Auth_Controller $reihungstestAbsolviertLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; $abgewiesenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; $aufgenommenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; + $onboardingLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; } $this->navigationlib->setSessionMenu( @@ -1623,6 +1635,18 @@ class InfoCenter extends Auth_Controller '', // target 40 // sort ), + 'ohnePrestudent' => $this->navigationlib->oneLevel( + 'Electronic Onboarding', // description + $onboardingLink, // link + null, // children + 'users', // icon + null, // subscriptDescription + false, // expand + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 50 // sort + ), ) ); } @@ -1649,6 +1673,8 @@ class InfoCenter extends Auth_Controller $link = site_url(self::ZGV_UEBERPRUEFUNG_URI); if ($origin_page === self::ABGEWIESEN_PAGE) $link = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE); + if ($origin_page === self::ONBOARDING_PAGE) + $link = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE); if ($origin_page === self::AUFGENOMMEN_PAGE) $link = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE); @@ -1690,6 +1716,7 @@ class InfoCenter extends Auth_Controller $freigegebenLink = site_url(self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE); $absolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE); $abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE); + $onboardingLink = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE); $prevFilterId = $this->input->get(self::PREV_FILTER_ID); if (isset($prevFilterId)) { @@ -1766,6 +1793,24 @@ class InfoCenter extends Auth_Controller ) ); } + if($page == self::ONBOARDING_PAGE) + { + $this->navigationlib->setSessionElementMenu( + 'onboarding', + $this->navigationlib->oneLevel( + 'Electronic Onboarding', // description + $onboardingLink, // link + null, // children + 'users', // icon + null, // subscriptDescription + false, // expand + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 50 // sort + ) + ); + } } /** @@ -1816,7 +1861,7 @@ class InfoCenter extends Auth_Controller } /** - * Loads all necessary Person data: Stammdaten (name, svnr, contact, ...), Dokumente, Logs and Notizen + * Loads all necessary Person data: Stammdaten (name, contact, ...), Dokumente, Logs and Notizen * @param $person_id * @return array */ @@ -2375,16 +2420,50 @@ class InfoCenter extends Auth_Controller if ($statusgrund === 'null' || $studiengang === 'null' || $abgeschickt === 'null' || empty($personen)) $this->terminateWithJsonError("Bitte füllen Sie alle Felder aus"); - foreach($personen as $person) + if ($studiengang === 'all' && $abgeschickt === 'all') { - $prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt); + foreach($personen as $person) + { + $prestudenten = $this->PrestudentModel->getByPersonWithoutLehrgang($person, $studienSemester); - if (!hasData($prestudent)) - continue; + if (!hasData($prestudenten)) + continue; - $prestudentData = getData($prestudent); + $prestudentenData = getData($prestudenten); + + foreach ($prestudentenData as $prestudent) + { + $this->saveAbsage($prestudent->prestudent_id, $statusgrund); + } + } + } + else + { + $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); + + $this->StudienplanModel->addSelect('1'); + $this->StudienplanModel->addJoin('lehre.tbl_studienordnung so', 'studienordnung_id'); + $escaped = $this->StudienplanModel->db->escape(strtoupper($studiengang)); + $this->StudienplanModel->db->where("UPPER(so.studiengangkurzbzlang || ':' || tbl_studienplan.orgform_kurzbz) = $escaped"); + $this->StudienplanModel->addLimit(1); + $studiengangResult = $this->StudienplanModel->load(); + + if (hasData($studiengangResult)) + { + foreach($personen as $person) + { + $prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt, $abgeschickt === 'all'); + + if (!hasData($prestudent)) + continue; + + $prestudentData = getData($prestudent); + $this->saveAbsage($prestudentData[0]->prestudent_id, $statusgrund); + } + } + else + $this->terminateWithJsonError("Falschen Studiengang übergeben!"); - $this->saveAbsage($prestudentData[0]->prestudent_id, $statusgrund); } $this->outputJsonSuccess("Success"); diff --git a/application/controllers/system/infocenter/Rueckstellung.php b/application/controllers/system/infocenter/Rueckstellung.php index 62af633ca..b1f2b60b7 100644 --- a/application/controllers/system/infocenter/Rueckstellung.php +++ b/application/controllers/system/infocenter/Rueckstellung.php @@ -14,7 +14,8 @@ class Rueckstellung extends Auth_Controller 'get' => array('infocenter:r', 'lehre/zgvpruefung:r'), 'set' => array('infocenter:r', 'lehre/zgvpruefung:r'), 'delete' => array('infocenter:r', 'lehre/zgvpruefung:r'), - 'getStatus' => array('infocenter:rw', 'lehre/zgvpruefung:rw') + 'getStatus' => array('infocenter:rw', 'lehre/zgvpruefung:rw'), + 'setForPersonen' => array('infocenter:rw', 'lehre/zgvpruefung:rw'), ) ); @@ -79,7 +80,34 @@ class Rueckstellung extends Auth_Controller $this->outputJson($result); } - + + public function setForPersonen() + { + $personen = $this->input->post('personen'); + $datum_bis = $this->input->post('datum_bis'); + $status_kurzbz = $this->input->post('status_kurzbz'); + + foreach ($personen as $person) + { + $rueckstellung = $this->_ci->RueckstellungModel->loadWhere(array('person_id' => $person)); + if (hasData($rueckstellung)) + continue; + + $result = $this->_ci->RueckstellungModel->insert( + array('person_id' => $person, + 'status_kurzbz' => $status_kurzbz, + 'datum_bis' => date_format(date_create($datum_bis), 'Y-m-d'), + 'insertvon' => $this->_uid + ) + ); + + if (isError($result)) + $this->terminateWithJsonError(getError($result)); + $this->_log($person, $status_kurzbz); + } + $this->outputJsonSuccess("Erfolgreich gespeichert!"); + } + public function delete() { $person_id = $this->input->post('person_id'); diff --git a/application/controllers/system/issues/Issues.php b/application/controllers/system/issues/Issues.php index 44c2ff5d3..27a928fb4 100644 --- a/application/controllers/system/issues/Issues.php +++ b/application/controllers/system/issues/Issues.php @@ -6,7 +6,6 @@ class Issues extends Auth_Controller { private $_uid; - const FUNKTION_KURZBZ = 'ass'; // user having this funktion can see issues for oes assigned with this funktion const BERECHTIGUNG_KURZBZ = 'system/issues_verwalten'; // user having this permission can see issues for oes assigned with this permission public function __construct() @@ -28,6 +27,9 @@ class Issues extends Auth_Controller $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); $this->load->model('system/Sprache_model', 'SpracheModel'); + // load config + $this->load->config('issueList'); + $this->loadPhrases( array( 'global', @@ -47,10 +49,12 @@ class Issues extends Auth_Controller { $oes_for_issues = $this->_getOesForIssues(); $language_index = $this->_getLanguageIndex(); + $apps = $this->config->item('issues_list_apps'); + $status = $this->config->item('issues_list_status'); $this->load->view( 'system/issues/issues', - array_merge($oes_for_issues, array('language_index' => $language_index)) + array_merge($oes_for_issues, array('language_index' => $language_index, 'apps' => $apps, 'status' => $status)) ); } @@ -121,6 +125,8 @@ class Issues extends Auth_Controller $oe_kurzbz_for_funktion = array(); $benutzerfunktionRes = $this->BenutzerfunktionModel->getBenutzerFunktionByUid($this->_uid, null, date('Y-m-d'), date('Y-m-d')); + $functions = $this->config->item('issues_list_functions'); + if (isError($benutzerfunktionRes)) show_error(getError($benutzerfunktionRes)); @@ -130,8 +136,8 @@ class Issues extends Auth_Controller { $all_funktionen_oe_kurzbz[$benutzerfunktion->oe_kurzbz][] = $benutzerfunktion->funktion_kurzbz; - // separate oes for the additional funktion which enables displaying issues - if ($benutzerfunktion->funktion_kurzbz == self::FUNKTION_KURZBZ) + // separate oes for the additional functions which enables displaying issues + if (in_array($benutzerfunktion->funktion_kurzbz, $functions)) { $oe_kurzbz_for_funktion[] = $benutzerfunktion->oe_kurzbz; diff --git a/application/core/Auth_Controller.php b/application/core/Auth_Controller.php index 466627fe3..d6c89be57 100644 --- a/application/core/Auth_Controller.php +++ b/application/core/Auth_Controller.php @@ -70,20 +70,22 @@ abstract class Auth_Controller extends FHC_Controller /** * Checks for Permissions depending if the given person is a * Mitarbeiter and/or Student + * If neither Student nor Mitarbeiter, default permissions are checked * and exits/outputs an error if they are not met. * * @param integer $person_id * @param array $permMa Perms if the person is a Mitarbeiter * @param array $permStud Perms if the person is a Student + * @param array $permDefault Perms if the person is neither a Student nor a Mitarbeiter * * @return void */ - protected function checkPermissionsForPerson($person_id, $permMa, $permStud) + protected function checkPermissionsForPerson($person_id, $permMa, $permStud, $permDefault = null) { - $res = $this->hasPermissionsForPerson($person_id, $permMa, $permStud); - + $res = $this->hasPermissionsForPerson($person_id, $permMa, $permStud, $permDefault); + if ($res) { - $perm = array_keys(array_flip(array_merge($res|1 ? $permMa : [], $res|2 ? $permStud : []))); + $perm = array_keys(array_flip(array_merge($res&1 ? $permMa : [], $res&2 ? $permStud : [], $res&4 ? $permDefault : []))); $this->_outputAuthError([$this->router->method => $perm]); } } @@ -108,16 +110,19 @@ abstract class Auth_Controller extends FHC_Controller * Checks for Permissions depending if the given person is a * Mitarbeiter and/or Student * and returns the result. - * + * If neither Student nor Mitarbeiter, default permissions are checked + * * @param integer $person_id * @param array $permMa Perms if the person is a Mitarbeiter * @param array $permStud Perms if the person is a Student - * + * @param array $permDefault Perms if the person is neither a Student nor a Mitarbeiter * @return integer 0 if permission is granted */ - protected function hasPermissionsForPerson($person_id, $permMa, $permStud) + protected function hasPermissionsForPerson($person_id, $permMa, $permStud, $permDefault) { - $res = 3; + $res = 8; + $isMitarbeiter = false; + $isStudent = false; $this->load->model('person/Person_model', 'PersonModel'); $this->PersonModel->addJoin('public.tbl_benutzer', 'person_id'); $this->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid'); @@ -125,7 +130,8 @@ abstract class Auth_Controller extends FHC_Controller if (hasData($result)) { if ($this->permissionlib->isEntitled(['a' => $permMa], 'a')) return 0; - $res = 1; + $isMitarbeiter = true; + $res += 1; } $this->PersonModel->addJoin('public.tbl_prestudent', 'person_id'); $result = $this->PersonModel->load($person_id); @@ -140,8 +146,15 @@ abstract class Auth_Controller extends FHC_Controller return 0; } } + $isStudent = true; $res += 2; } + if (isset($permDefault) && !$isMitarbeiter && !$isStudent) + { + if ($this->permissionlib->isEntitled(['a' => $permDefault], 'a')) + return 0; + $res += 4; + } return $res; } diff --git a/application/core/FHCAPI_Controller.php b/application/core/FHCAPI_Controller.php index c1e57a0f2..e81506d4b 100644 --- a/application/core/FHCAPI_Controller.php +++ b/application/core/FHCAPI_Controller.php @@ -81,8 +81,11 @@ class FHCAPI_Controller extends Auth_Controller // For JSON Requests (as opposed to multipart/form-data) get the $_POST variable from the input stream instead if ($this->input->get_request_header('Content-Type', true) == 'application/json') - $_POST = json_decode($this->security->xss_clean($this->input->raw_input_stream), true); - elseif (isset($_POST['_jsondata'])) { + { + $_POST = json_decode($this->input->raw_input_stream, true); + } + elseif (isset($_POST['_jsondata'])) + { $_POST = array_merge($_POST, json_decode($_POST['_jsondata'], true)); unset($_POST['_jsondata']); } @@ -106,10 +109,15 @@ class FHCAPI_Controller extends Auth_Controller $error = []; if (is_array($data)) { - if ($type == self::ERROR_TYPE_VALIDATION) + if ($type == self::ERROR_TYPE_VALIDATION) { $error['messages'] = $data; - else + } elseif (array_is_list($data)) { + foreach ($data as $d) + $this->addError($d, $type); + return; + } else { $error = $data; + } } elseif (is_object($data)) { $error = (array)$data; } else { @@ -223,9 +231,42 @@ class FHCAPI_Controller extends Auth_Controller return $result->retval; } + protected function terminateWithFileOutput($contenttype, $content, $filename=null) + { + $this->clearOutputBuffering(); + $this->output->set_status_header(200) + ->set_content_type($contenttype) + ->set_header('Expires: 0') + ->set_header('Cache-Control: no-store, no-cache, must-revalidate') + ->set_header('Pragma: public') + ->set_header('Content-Length: ' . strlen($content)); + + if($filename) + { + $cleanedfilename = preg_replace('/[^a-zA-Z0-9\-_.]/', '_', $filename); + $this->output->set_header('Content-Disposition: attachment; filename="' + . $cleanedfilename . '"'); + } + else + { + $this->output->set_header('Content-Disposition: inline'); + } + + $this->output->set_output($content) + ->_display(); + exit(); + } + + private function clearOutputBuffering() + { + while(ob_get_level() > 0) + { + ob_end_clean(); + } + } // --------------------------------------------------------------- - // Security + // Security Begin // --------------------------------------------------------------- /** @@ -246,4 +287,31 @@ class FHCAPI_Controller extends Auth_Controller 'required_permissions' => $this->_rpsToString($requiredPermissions, $this->router->method) ], self::ERROR_TYPE_AUTH); } + + // --------------------------------------------------------------- + // Security End + // --------------------------------------------------------------- + + /** + * Checks the client's total request size (Content-Length) against the minimum + * effective PHP limit (min of upload_max_filesize, post_max_size, memory_limit). + * This preempts failures that result in vague "missing parameters" errors on large files. + * + * @return void + */ + protected function checkUploadSize() { + // this number represents bytes + $content_length_bytes = (int)$this->input->server('CONTENT_LENGTH'); + $content_length = $content_length_bytes / 1000000; + + //get max serverside size upload -> this comes in megabytes + $max_upload = (int)(ini_get('upload_max_filesize')); + $max_post = (int)(ini_get('post_max_size')); + $memory_limit = (int)(ini_get('memory_limit')); + $max_upload_mb = min($max_upload, $max_post, $memory_limit); // smallest of 3 config values + + if($content_length >= $max_upload_mb) { + $this->terminateWithError($this->p->t('global', 'filesizeExceeded'), 'general'); + } + } } diff --git a/application/core/Notiz_Controller.php b/application/core/Notiz_Controller.php index 472ac7669..cfc54d5f5 100644 --- a/application/core/Notiz_Controller.php +++ b/application/core/Notiz_Controller.php @@ -21,6 +21,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller 'loadDokumente' => self::DEFAULT_PERMISSION_R, 'getMitarbeiter' => self::DEFAULT_PERMISSION_R, 'isBerechtigt' => self::DEFAULT_PERMISSION_R, + 'getCountNotes' => self::DEFAULT_PERMISSION_R, ]; if(!is_array($permissions)) @@ -392,10 +393,10 @@ abstract class Notiz_Controller extends FHCAPI_Controller foreach ($result as $doc) { $res = $this->dmslib->removeAll($doc->dms_id); - if (isError($result)) + if (isError($res)) { $this->db->trans_rollback(); - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + $this->terminateWithError(getError($res), self::ERROR_TYPE_GENERAL); } } @@ -459,4 +460,20 @@ abstract class Notiz_Controller extends FHCAPI_Controller return $this->terminateWithSuccess($result); } + public function getCountNotes($person_id) + { + $this->NotizzuordnungModel->addSelect('COUNT(*) AS anzahl', false); + + $result = $this->NotizzuordnungModel->loadWhere( + array('person_id' => $person_id) + ); + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + + $anzahl = current(getData($result)); + return $this->terminateWithSuccess($anzahl->anzahl ?: 0); + } + } \ No newline at end of file diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php index 10e54780e..5b9bac6c5 100644 --- a/application/core/Tag_Controller.php +++ b/application/core/Tag_Controller.php @@ -29,13 +29,36 @@ class Tag_Controller extends FHCAPI_Controller $this->load->model('person/Notiz_model', 'NotizModel'); $this->load->model('system/Notiztyp_model', 'NotiztypModel'); $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); + + $this->loadPhrases([ + 'ui' + ]); } - public function getTag() + public function getTag($readonly_tags = null) { $language = $this->_getLanguageIndex(); $id = $this->input->get('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, @@ -54,7 +77,7 @@ class Tag_Controller extends FHCAPI_Controller $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.verfasser_uid = bearbeiterbenutzer.uid', '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'); $notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id)); @@ -62,7 +85,7 @@ class Tag_Controller extends FHCAPI_Controller $this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array()); } - public function getTags() + public function getTags($tags = null) { $this->NotiztypModel->addSelect( 'typ_kurzbz as tag_typ_kurzbz, @@ -73,19 +96,36 @@ class Tag_Controller extends FHCAPI_Controller ' ); $this->NotiztypModel->addOrder('prioritaet'); + + if (is_array($tags) && !isEmptyArray($tags)) + { + $tags = $this->_filterTag($tags, false); + $this->NotiztypModel->db->where_in('typ_kurzbz', $tags); + } + $notiztypen = $this->NotiztypModel->loadWhere(array('aktiv' => true)); $this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array()); } - public function addTag($withZuordnung = true) + public function addTag($withZuordnung = true, $updatable_tags = null) { $postData = $this->getPostJson(); $checkTyp = $this->NotiztypModel->loadWhere(array('typ_kurzbz' => $postData->tag_typ_kurzbz)); - if (!hasData($checkTyp)) - $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); + if (isError($checkTyp)) + $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen')); + if (!hasData($checkTyp)) + $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen')); + + if (is_array($updatable_tags) && !isEmptyArray($updatable_tags)) + { + $tags = $this->_filterTag($updatable_tags, false); + + if (!in_array($postData->tag_typ_kurzbz, $tags)) + $this->terminateWithError($this->p->t('ui', 'keineBerechtigung')); + } if ($withZuordnung) { @@ -125,48 +165,88 @@ class Tag_Controller extends FHCAPI_Controller } } - private function addNotiz($postData) - { - return $this->NotizModel->insert(array( - 'titel' => 'TAG', //TODO klären - 'text' => $postData->notiz, - 'verfasser_uid' => $this->_uid, - 'erledigt' => false, - 'insertamum' => date('Y-m-d H:i:s'), - 'insertvon' => $this->_uid, - 'typ' => $postData->tag_typ_kurzbz - )); - - } - public function updateTag() + public function updateTag($updatable_tags = null) { $postData = $this->getPostJson(); + $post_tag = $this->NotizModel->loadWhere(array('notiz_id' => $postData->id)); + + if (isError($post_tag)) + $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen')); + + if (!hasData($post_tag)) + $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen')); + + if (is_array($updatable_tags) && !isEmptyArray($updatable_tags)) + { + $tags = $this->_filterTag($updatable_tags, false); + + $post_tag_typ = getData($post_tag)[0]->typ; + + if (!in_array($post_tag_typ, $tags)) + $this->terminateWithError($this->p->t('ui', 'keineBerechtigung')); + } + $updateData = $this->NotizModel->update(array('notiz_id' => $postData->id), array('text' => $postData->notiz, 'updateamum' => date('Y-m-d H:i:s'), 'updatevon' => $this->_uid, 'bearbeiter_uid' => $this->_uid, - ) + ) ); $this->terminateWithSuccess($updateData); } - public function doneTag() + public function doneTag($updatable_tags = null) { $postData = $this->getPostJson(); + $post_tag = $this->NotizModel->loadWhere(array('notiz_id' => $postData->id)); + + if (isError($post_tag)) + $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen')); + + if (!hasData($post_tag)) + $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen')); + + if (is_array($updatable_tags) && !isEmptyArray($updatable_tags)) + { + $tags = $this->_filterTag($updatable_tags, false); + + $post_tag_typ = getData($post_tag)[0]->typ; + + if (!in_array($post_tag_typ, $tags)) + $this->terminateWithError($this->p->t('ui', 'keineBerechtigung')); + } + $updateData = $this->NotizModel->update(array('notiz_id' => $postData->id), array('erledigt' => !$postData->done, + 'text' => $postData->notiz, 'updateamum' => date('Y-m-d H:i:s'), 'updatevon' => $this->_uid, 'bearbeiter_uid' => $this->_uid, ) ); - $this->terminateWithSuccess($updateData); } - public function deleteTag($withZuordnung = true) + public function deleteTag($withZuordnung = true, $updatable_tags = null) { $postData = $this->getPostJson(); + $post_tag = $this->NotizModel->loadWhere(array('notiz_id' => $postData->id)); + + if (isError($post_tag)) + $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen')); + + if (!hasData($post_tag)) + $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen')); + + if (is_array($updatable_tags) && !isEmptyArray($updatable_tags)) + { + $tags = $this->_filterTag($updatable_tags, false); + + $post_tag_typ = getData($post_tag)[0]->typ; + + if (!in_array($post_tag_typ, $tags)) + $this->terminateWithError($this->p->t('ui', 'keineBerechtigung')); + } $deleteNotiz = ""; if ($withZuordnung) @@ -208,5 +288,27 @@ class Tag_Controller extends FHCAPI_Controller return hasData($result) ? getData($result)[0]->index : 1; } + private function _filterTag($tags, $readonly = true) + { + $filtered_tags = array_filter($tags, function ($tag) use ($readonly) + { + return isset($tag['readonly']) && $tag['readonly'] === $readonly; + }); + + return array_keys($filtered_tags); + } + + private function addNotiz($postData) + { + return $this->NotizModel->insert(array( + 'titel' => 'TAG', //TODO klären + 'text' => $postData->notiz, + 'verfasser_uid' => $this->_uid, + 'erledigt' => false, + 'insertamum' => date('Y-m-d H:i:s'), + 'insertvon' => $this->_uid, + 'typ' => $postData->tag_typ_kurzbz + )); + } } \ No newline at end of file diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php index d339efa62..51d520a80 100644 --- a/application/helpers/hlp_common_helper.php +++ b/application/helpers/hlp_common_helper.php @@ -408,6 +408,23 @@ function findResource($path, $resource, $subdir = false, $extraDir = null) return null; } +// ------------------------------------------------------------------------ +// PHP functions that don't exist in older versions +// ------------------------------------------------------------------------ + +/** + * Returns true if the given array is sequential + */ +if (!function_exists('array_is_list')) { + function array_is_list(array $arr) + { + if ($arr === []) { + return true; + } + return array_keys($arr) === range(0, count($arr) - 1); + } +} + // ------------------------------------------------------------------------ // Collection of utility functions for form validation purposes // ------------------------------------------------------------------------ @@ -483,3 +500,73 @@ function has_permissions_for_stg($studiengang_kz, $permissions = '') return false; } + +/** + * check if an entry exists in the database + */ +function is_in_db($key, $model = '') +{ + if (!$model) + return false; + + $field = strstr($model, ":"); + if ($field) { + $model = strstr($model, ":", true); + $field = substr($field, 1); + } + + $CI =& get_instance(); + $CI->load->model($model, $model); + + if ($field) { + $result = $CI->$model->loadWhere([ + $field => $key + ]); + } else { + $result = $CI->$model->load($key); + } + + return (isSuccess($result) && hasData($result)); +} + +/** + * is building an array for Dropdown Entry in Print Dropdown + * @param $id id for the Document to add to the Document Array + * @param $name title of the dropdownEntry + * @param $parameterUrl url of parameters xml, xsl, format etc as needed + * WITHOUT BASEURL eg. "xml=abschlusspruefung.rdf.php&xsl_stg_kz=$studiengang_kz&xsl=Bescheid&output=pdf" + * @param $uid default parameter, if null only parameterurl will be added + * additional needed parameter: put in the parameterUrl + * @param $alternativeBaseUrl: if baseUrl not pdfExport.php, put here alternative without ? char, eg. "zutrittskarte.php" + * + * @return Array + */ +function buildDropdownEntryPrintArray($id, $name, $parameterurl, $uid=null, $order=null, $alternativeBaseUrl=null) +{ + //DEFAULT BASEURL + $baseurl = "pdfExport.php?"; + + $uidString = $uid ? "&uid=" . $uid : ""; + + + + if($alternativeBaseUrl) + { + return [ + "id" => $id, + "type" => "documenturl", + "name" => $name, + "url" => $alternativeBaseUrl . "?" . $parameterurl . $uidString, + "order" => $order + ]; + } + else + return [ + "id" => $id, + "type" => "documenturl", + "name" => $name, + "url" => $baseurl . $parameterurl . "&uid=" . $uid, + "order" => $order + ]; + +} diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php index 14f7ed338..41d40ca0d 100644 --- a/application/helpers/hlp_header_helper.php +++ b/application/helpers/hlp_header_helper.php @@ -88,6 +88,7 @@ function generateCSSsInclude($CSSs) function generateJSDataStorageObject($indexPage, $calledPath, $calledMethod) { $ci =& get_instance(); + $ci->load->config('theme'); $ci->load->model('system/Sprache_model','SpracheModel'); $server_language = getData($ci->SpracheModel->loadWhere(['content' => true])); $server_language = array_map(function($language){ @@ -95,6 +96,9 @@ function generateJSDataStorageObject($indexPage, $calledPath, $calledMethod) }, $server_language); $user_language = getUserLanguage(); + $ci->load->config('javascript'); + $systemerror_mailto = $ci->config->item('systemerror_mailto'); + $FHC_JS_DATA_STORAGE_OBJECT = array( 'app_root' => APP_ROOT, 'ci_router' => $indexPage, @@ -103,6 +107,11 @@ function generateJSDataStorageObject($indexPage, $calledPath, $calledMethod) 'server_languages' => $server_language, 'user_language' => $user_language, 'timezone' => date_default_timezone_get(), + 'systemerror_mailto' => $systemerror_mailto, + 'theme' => [ + 'name'=>$ci->config->item('theme_name'), + 'modes'=>$ci->config->item('theme_modes'), + ] ); $toPrint = "\n"; @@ -176,7 +185,15 @@ function generateJSModulesInclude($JSModules) for ($tmpJSsCounter = 0; $tmpJSsCounter < count($tmpJSs); $tmpJSsCounter++) { - $toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL; + if($ci->config->item('use_fhcomplete_build_version_in_path')) + { + $relurl = preg_replace('#public/#', 'public/' . $ci->config->item('fhcomplete_build_version') . '/', $tmpJSs[$tmpJSsCounter]); + $toPrint = sprintf($jsInclude, base_url($relurl)).PHP_EOL; + } + else + { + $toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL; + } if ($tmpJSsCounter > 0) $toPrint = "\t\t".$toPrint; @@ -227,3 +244,28 @@ function generateBackwardCompatibleJSMsIe($js) echo "\n"; } +/** + * Constructs an accessibility skipLink https://www.w3schools.com/accessibility/accessibility_skip_links.php + */ +function generateSkipLink($skipID) +{ + $toPrint = ''; + echo $toPrint; +} + +function absoluteJsImportUrl($relurl) +{ + $ci =& get_instance(); + $ci->load->config('javascript'); + if($ci->config->item('use_fhcomplete_build_version_in_path')) + { + $url = base_url(preg_replace('#^public/#', 'public/' . $ci->config->item('fhcomplete_build_version') . '/', $relurl)); + } + else + { + $url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version'); + } + return $url; +} diff --git a/application/language/english/form_validation_lang.php b/application/language/english/form_validation_lang.php index b8918a721..2777cd05e 100644 --- a/application/language/english/form_validation_lang.php +++ b/application/language/english/form_validation_lang.php @@ -41,3 +41,4 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); $lang['form_validation_has_write_permissions'] = 'You have no rights to edit {field} field.'; $lang['form_validation_is_valid_date'] = 'The date format is invalid or out of range.'; $lang['form_validation_has_permissions_for_stg'] = 'You have no rights for stg {field}.'; +$lang['form_validation_is_in_db'] = '{field} does not exist.'; diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index 885acac90..d90a98241 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -77,7 +77,9 @@ class AntragLib 'studiensemester_kurzbz'=>$prestudentstatus->studiensemester_kurzbz, 'ausbildungssemester'=>$prestudentstatus->ausbildungssemester ], [ - 'statusgrund_id' => null + 'statusgrund_id' => null, + 'updateamum' => date('c'), + 'updatevon' => $insertvon ]); } } @@ -335,7 +337,10 @@ class AntragLib 'status_kurzbz'=>$prestudentstatus->status_kurzbz, 'studiensemester_kurzbz'=>$prestudentstatus->studiensemester_kurzbz, 'ausbildungssemester'=>$prestudentstatus->ausbildungssemester - ], []); + ], [ + 'updateamum' => $insertam, + 'updatevon' => $insertvon + ]); if (isError($result)) { $errors[] = getError($result); diff --git a/application/libraries/DmsLib.php b/application/libraries/DmsLib.php index 774ebdc79..c6c16a866 100644 --- a/application/libraries/DmsLib.php +++ b/application/libraries/DmsLib.php @@ -670,7 +670,7 @@ class DmsLib $fileObj = new stdClass(); $fileObj->filename = getData($result)[0]->filename; $fileObj->file = DMS_PATH.getData($result)[0]->filename; - $fileObj->name = DMS_PATH.getData($result)[0]->name; // original user filename + $fileObj->name = getData($result)[0]->name; // original user filename $fileObj->mimetype = getData($result)[0]->mimetype; return success($fileObj); diff --git a/application/libraries/DocumentExportLib.php b/application/libraries/DocumentExportLib.php index 595ac461a..a75047cf9 100644 --- a/application/libraries/DocumentExportLib.php +++ b/application/libraries/DocumentExportLib.php @@ -55,7 +55,7 @@ use SimpleXMLElement as SimpleXMLElement; * $doc->create($outputformat); * $doc->output(true); * $doc->close(); - * + * * New: * $xml_data = $this->documentexportlib->getDataXML($data); * $images = [[ @@ -397,20 +397,24 @@ class DocumentExportLib $vorlage_stg = current(getData($result)); foreach ($vorlage_stg as $k => $v) $vorlage->$k = $v; - + + if ($sign_user) + { + $this->addSignToData($xml_data); + } + $result = $this->create($temp_folder, $outputformat, $vorlage, $xml_data, $images); if (isError($result)) return $result; - + $temp_filename = getData($result); - if ($sign_user) { - $this->addSignToData($xml_data); - + if ($sign_user) + { $result = $this->sign($temp_folder, $temp_filename, $outputformat, $sign_user, $sign_profile); if (isError($result)) return $result; - + $temp_filename = getData($result); } @@ -445,6 +449,7 @@ class DocumentExportLib if ($xml_data->firstChild->tagName == 'error') return error($xml_data->firstChild->textContent); + $styles_xsl = null; // styles.xml erstellen if ($vorlage->style) { $styles_xsl = new DOMDocument(); @@ -461,7 +466,7 @@ class DocumentExportLib // Template holen $vorlage_found = false; $vorlage_filename = $vorlage->vorlage_kurzbz . ($vorlage->mimetype == 'application/vnd.oasis.opendocument.spreadsheet' ? '.ods' : '.odt'); - + $aktive_addons = array_filter(array_map('trim', explode(";", ACTIVE_ADDONS))); foreach($aktive_addons as $addon) { $zipfile = DOC_ROOT . 'addons/' . $addon . '/system/vorlage_zip/' . $vorlage_filename; @@ -652,7 +657,7 @@ class DocumentExportLib foreach ($files as $file) if (is_file($file)) unlink($file); - + chdir($source_folder); rmdir($temp_folder); } @@ -703,12 +708,12 @@ class DocumentExportLib { if ($outputformat) return $outputformat; - + if ($mimetype == 'application/vnd.oasis.opendocument.spreadsheet') return 'ods'; if ($mimetype == 'application/vnd.oasis.opendocument.text') return 'odt'; - + return 'pdf'; } } diff --git a/application/libraries/FilterCmptLib.php b/application/libraries/FilterCmptLib.php index 272899de6..b1de89245 100644 --- a/application/libraries/FilterCmptLib.php +++ b/application/libraries/FilterCmptLib.php @@ -1,7 +1,7 @@ getSession(); // If session is NOT empty -> a filter was already loaded - if ($session != null) + if (!isError($session) && $session != null) { // Retrieve the filterId stored in the session $sessionFilterId = $this->_getSessionElement(FilterCmptLib::FILTER_ID); @@ -219,9 +219,7 @@ class FilterCmptLib } } } - - // If the session is empty -> first time that this filter is loaded - if ($session == null) + else { // Load filter definition data from DB $definition = $this->_loadDefinition( @@ -602,7 +600,7 @@ class FilterCmptLib { $session = getSessionElement(self::SESSION_NAME, $this->_filterUniqueId); - if (isset($session[$name])) + if (!isError($session) && isset($session[$name])) { return $session[$name]; } @@ -623,7 +621,7 @@ class FilterCmptLib if (!$this->_ci->permissionlib->hasAtLeastOne($this->_requiredPermissions, self::PERMISSION_FILTER_METHOD, self::PERMISSION_TYPE)) { - $this->_setSession(error('The required permission is not help by the logged user')); + $this->_setSession(error('The required permission is not held by the logged user')); return false; } @@ -904,7 +902,7 @@ class FilterCmptLib $filterCmptsSession = getSession(self::SESSION_NAME); // If something is present in session - if ($filterCmptsSession != null) + if (!isError($filterCmptsSession) && $filterCmptsSession != null) { // Loops in the session for all the filter components foreach ($filterCmptsSession as $filterCmpt => $filterCmptData) @@ -951,9 +949,11 @@ class FilterCmptLib { $session = getSessionElement(self::SESSION_NAME, $this->_filterUniqueId); - $session[$name] = $value; - - setSessionElement(self::SESSION_NAME, $this->_filterUniqueId, $session); // stores the single value + if (!isError($session) && $session != null) + { + $session[$name] = $value; + setSessionElement(self::SESSION_NAME, $this->_filterUniqueId, $session); // stores the single value + } } /** @@ -965,7 +965,7 @@ class FilterCmptLib $filterCmptsSession = getSession(self::SESSION_NAME); // If something is present in session - if ($filterCmptsSession != null) + if (!isError($filterCmptsSession) && $filterCmptsSession != null) { // Loops in the session for all the filter components foreach ($filterCmptsSession as $filterCmpt => $filterCmptData) @@ -1174,3 +1174,4 @@ class FilterCmptLib return $filterName; } } + diff --git a/application/libraries/LektorLib.php b/application/libraries/LektorLib.php new file mode 100644 index 000000000..bbe630eaf --- /dev/null +++ b/application/libraries/LektorLib.php @@ -0,0 +1,350 @@ +_ci =& get_instance(); + $this->_ci->load->model('education/lehreinheit_model', 'LehreinheitModel'); + $this->_ci->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); + $this->_ci->load->model('organisation/Studiensemester_model','StudiensemesterModel'); + $this->_ci->load->model('ressource/Stundensatz_model', 'StundensatzModel'); + $this->_ci->load->model('vertragsbestandteil/Dienstverhaeltnis_model','DienstverhaeltnisModel'); + $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->library('PhrasesLib', array('lehre')); + } + + public function addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid) + { + $this->_ci->LehreinheitModel->addSelect('tbl_lehreinheit.*, tbl_lehrveranstaltung.studiengang_kz, semesterstunden'); + $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id'); + $lehreinheit_result = $this->_ci->LehreinheitModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); + + if (isError($lehreinheit_result)) return $lehreinheit_result; + + if (!hasData($lehreinheit_result)) return error("Lehreinheit not found"); + + $lehreinheit = getData($lehreinheit_result)[0]; + + $already_assigned = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit->lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid)); + + if (isError($already_assigned)) return $already_assigned; + + if (hasData($already_assigned)) return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt")); + + $studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz)); + if (isError($studiensemester_result)) return $studiensemester_result; + $studiensemester = getData($studiensemester_result)[0]; + + $stundensatz = $this->_ci->StundensatzModel->getDefaultStundensatz($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre'); + $echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'echterdv'); + + $echter_dv = false; + + if (hasData($echter_dv_result)) + { + $echter_dv = true; + } + + $maxstunden = $this->getMaxStunden($mitarbeiter_uid, $studiensemester->studiensemester_kurzbz, $lehreinheit->studiengang_kz, $echter_dv); + + $newData['semesterstunden'] = 0; + $newData['planstunden'] = 0; + if (!is_null($lehreinheit->semesterstunden)) + { + $newData['semesterstunden'] = min($lehreinheit->semesterstunden, $maxstunden); + $newData['planstunden'] = min($lehreinheit->semesterstunden, $maxstunden); + } + + $newData['lehreinheit_id'] = $lehreinheit->lehreinheit_id; + $newData['mitarbeiter_uid'] = $mitarbeiter_uid; + $newData['lehrfunktion_kurzbz'] = 'Lektor'; + $newData['bismelden'] = true; + $newData['insertvon'] = getAuthUID(); + $newData['insertamum'] = date('Y-m-d H:i:s'); + $newData['stundensatz'] = $stundensatz; + $result = $this->_ci->LehreinheitmitarbeiterModel->insert($newData); + + if (isError($result)) return $result; + + return success("Lektor added successfully"); + } + + public function updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $new_data) + { + $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)); + + if (isError($lehreinheit_result)) return $lehreinheit_result; + + if (!hasData($lehreinheit_result)) return error("Lehreinheit not found"); + + $lehreinheit = getData($lehreinheit_result)[0]; + + + //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) + { + $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)); + + if (hasData($lehreinheit_data)) + return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt")); + + } + $warning = ''; + if (isset($new_data['semesterstunden'])) + { + $studiengang_result = $this->_ci->StudiengangModel->loadWhere(array('studiengang_kz' => $lehreinheit->studiengang_kz)); + if (isError($studiengang_result)) return $studiengang_result; + if (!hasData($studiengang_result)) return error('Studiengang not found'); + $studiengang = getData($studiengang_result)[0]; + + $studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz)); + 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 = false; + + if (hasData($echter_dv_result)) + { + $echter_dv = true; + } + + $neue_stunden_eingerechnet = isset($new_data['bismelden']) ? $new_data['bismelden'] : $lehreinheit->bismelden; + $alte_stunden_eingerechnet = $lehreinheit->bismelden; + + if (($new_data['semesterstunden'] > $lehreinheit->semesterstunden) || $neue_stunden_eingerechnet) + { + $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); + } + + $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'))) + { + 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"; + } + } + } + } + } + + $benutzer_result = $this->_ci->BenutzerModel->load(array(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid)); + + if (isError($benutzer_result)) return $benutzer_result; + + if (!hasData($benutzer_result)) return error('Benutzer not found'); + + $benutzer_aktiv = getData($benutzer_result)[0]->aktiv; + + if (!$benutzer_aktiv) + $warning .= "Achtung: Der/Die Benutzer*in ist inaktiv!\nBitte informieren Sie die Personalbteilung.\nDaten wurden gespeichert.\n\n"; + + $updatableFields = array( + 'semesterstunden', + 'planstunden', + 'stundensatz', + 'faktor', + 'anmerkung', + 'lehrfunktion_kurzbz', + 'mitarbeiter_uid', + 'bismelden' + ); + + $updateData = array(); + foreach ($updatableFields as $field) + { + $value = isset($new_data[$field]) ? $new_data[$field] : null; + + if ($value !== null) + { + $updateData[$field] = $value; + } + } + $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); + + if (isError($result)) return $result; + + if ($warning !== '') return success(['warning' => $warning]); + + return success('Erfolgreich geupdated'); + } + + private function getMaxStunden($mitarbeiter_uid, $studiensemester_kurzbz, $studiengang_kz, $echter_dv) + { + $maxstunden = 9999; + + $studiengang_result = $this->_ci->StudiengangModel->loadWhere(array('studiengang_kz' => $studiengang_kz)); + if (isError($studiengang_result)) return $studiengang_result; + + $studiengang = getData($studiengang_result)[0]; + + $stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv); + if (isError($stundengrenze_result)) return $stundengrenze_result; + + $stundengrenze = getData($stundengrenze_result)[0]; + $maxstunden = $stundengrenze->stunden; + + $lehrauftrag_firma = $this->LehrauftragAufFirma($mitarbeiter_uid); + + if (!$echter_dv && !$lehrauftrag_firma) + { + $oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz); + $oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array(''); + + $stunden_summe_result = $this->getSumSemesterstunden($mitarbeiter_uid, $studiensemester_kurzbz, $oe_array); + + $stunden_summe = hasData($stunden_summe_result) ? getData($stunden_summe_result)[0]->summe : 0; + + if ($stunden_summe >= $maxstunden && (!$this->_ci->permissionlib->isBerechtigt('admin'))) + { + $stunden_limit_result = $this->getStundenInstitut($mitarbeiter_uid, $studiensemester_kurzbz, $oe_array); + + $error = "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $maxstunden Stunden ($stundengrenze->oe_kurzbz) wurde ueberschritten!\n + Daten wurden NICHT gespeichert!\n\n"; + + if (hasData($stunden_limit_result)) + { + $stunden_limit_array = getData($stunden_limit_result); + + foreach ($stunden_limit_array as $stunden_limit) + { + $error .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n"; + } + } + return error($error); + } + else + $maxstunden =- $stunden_summe; + } + return $maxstunden; + } + + private function LehrauftragAufFirma($mitarbeiter_uid) + { + $this->_ci->MitarbeiterModel->addJoin('tbl_benutzer', 'tbl_mitarbeiter.mitarbeiter_uid = tbl_benutzer.uid'); + $this->_ci->MitarbeiterModel->addJoin('tbl_person', 'person_id'); + $this->_ci->MitarbeiterModel->addJoin('tbl_adresse', 'person_id', 'LEFT'); + $this->_ci->MitarbeiterModel->addOrder('zustelladresse', 'DESC'); + $this->_ci->MitarbeiterModel->addOrder('firma_id'); + $this->_ci->MitarbeiterModel->addLimit(1); + $firma_result = $this->_ci->MitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $mitarbeiter_uid)); + $firma = getData($firma_result)[0]->firma_id; + return !is_null($firma); + } + + private function getSumSemesterstunden($mitarbeiter_uid, $studiensemester_kurzbz, $oe_array = array()) + { + $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', $mitarbeiter_uid); + $this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $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); + return $this->_ci->LehreinheitmitarbeiterModel->load(); + } + + private function getStundenInstitut($mitarbeiter_uid, $studiensemester_kurzbz, $oe_array = array()) + { + $this->_ci->LehreinheitmitarbeiterModel->addSelect('SUM(tbl_lehreinheitmitarbeiter.semesterstunden) as summe, tbl_studiengang.bezeichnung'); + $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', $mitarbeiter_uid); + $this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $studiensemester_kurzbz); + $this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true); + $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); + } + + $this->_ci->LehreinheitmitarbeiterModel->addGroupBy('tbl_studiengang.bezeichnung'); + return $this->_ci->LehreinheitmitarbeiterModel->load(); + } +} diff --git a/application/libraries/PermissionLib.php b/application/libraries/PermissionLib.php index c6e693666..42502f999 100644 --- a/application/libraries/PermissionLib.php +++ b/application/libraries/PermissionLib.php @@ -109,7 +109,7 @@ class PermissionLib foreach($oe_kurzbz as $value) { - $results[] = $this->isBerechtigt($berechtigung_kurzbz, $value, $art, $kostenstelle_id); + $results[] = $this->isBerechtigt($berechtigung_kurzbz, $art, $value, $kostenstelle_id); } if(!in_array(true, $results)) diff --git a/application/libraries/PhrasesLib.php b/application/libraries/PhrasesLib.php index ecd8094d6..647bf7074 100644 --- a/application/libraries/PhrasesLib.php +++ b/application/libraries/PhrasesLib.php @@ -122,6 +122,7 @@ class PhrasesLib $tmpText = substr($tmpText, 0, strlen($tmpText) - 4); } } + $tmpText = str_replace(['', ''], '', $tmpText); $result->retval[$i]->text = $tmpText; } diff --git a/application/libraries/PrestudentLib.php b/application/libraries/PrestudentLib.php index ef5e2e3a9..b1f2dc900 100644 --- a/application/libraries/PrestudentLib.php +++ b/application/libraries/PrestudentLib.php @@ -35,6 +35,90 @@ class PrestudentLib $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); } + /** + * Sets initial prestudent entry, no status yet. + * @return object success or error + */ + public function setPrestudent( + $person_id, + $studiengang_kz, + $ausbildungscode, + $anmerkung, + $foerderrelevant + ) + { + // Prestudent anlegen + $data = [ + 'aufmerksamdurch_kurzbz' => 'k.A.', + 'person_id' => $person_id, + 'studiengang_kz' => $studiengang_kz, + 'ausbildungcode' => $ausbildungscode, + 'anmerkung' => $anmerkung, + 'reihungstestangetreten' => false, + 'bismelden' => true, + 'foerderrelevant' => $foerderrelevant, + 'insertamum' => date('c'), + 'insertvon' => getAuthUID() + ]; + + // Wenn die Person schon im System erfasst ist, dann die ZGV des Datensatzes uebernehmen + $this->_ci->PrestudentModel->addSelect('public.tbl_prestudent.*, public.tbl_person.vorname, public.tbl_person.nachname'); + $this->_ci->PrestudentModel->addJoin('public.tbl_person', 'person_id'); + $this->_ci->PrestudentModel->addOrder('zgvmas_code'); + $this->_ci->PrestudentModel->addOrder('zgv_code', 'DESC'); + $this->_ci->PrestudentModel->addLimit(1); + $result = $this->_ci->PrestudentModel->loadWhere([ + 'person_id' => $person_id, + 'zgv_code IS NOT NULL' => null + ]); + + if (isError($result)) return $result; + + if (hasData($result)) { + $prestudent = getData($result)[0]; + if ($prestudent->zgv_code) { + $data['zgv_code'] = $prestudent->zgv_code; + $data['zgvort'] = $prestudent->zgvort; + $data['zgvdatum'] = $prestudent->zgvdatum; + + $data['zgvmas_code'] = $prestudent->zgvmas_code; + $data['zgvmaort'] = $prestudent->zgvmaort; + $data['zgvmadatum'] = $prestudent->zgvmadatum; + } + } + // Prestudent speichern + return $this->_ci->PrestudentModel->insert($data); + } + + /** + * Sets first status of a prestudent.! + * @return object success or error + */ + public function setFirstStatus( + $prestudent_id, + $status_kurzbz, + $studiensemester_kurzbz, + $ausbildungssemester = null, + $orgform_kurzbz = null, + $studienplan_id = null + ) + { + // Prestudent Rolle Anlegen + $data = [ + 'prestudent_id' => $prestudent_id, + 'status_kurzbz' => $status_kurzbz, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'ausbildungssemester' => $ausbildungssemester ?: 0, + 'orgform_kurzbz' => $orgform_kurzbz ?: null, + 'studienplan_id' => $studienplan_id ?: null, + 'datum' => date('Y-m-d'), + 'insertamum' => date('c'), + 'insertvon' => getAuthUID() + ]; + + return $this->_ci->PrestudentstatusModel->insert($data); + } + public function setAbbrecher( $prestudent_id, $studiensemester_kurzbz, @@ -500,11 +584,6 @@ class PrestudentLib $student = current(getData($result)); - - $this->_ci->load->library('VariableLib', ['uid' => $authUID]); - $semester_aktuell = $this->_ci->variablelib->getVar('semester_aktuell'); - - // Update Aktionen // Status updaten @@ -545,8 +624,8 @@ class PrestudentLib // Studentlehrverband updaten $result = $this->_ci->StudentlehrverbandModel->update([ 'student_uid' => $student->student_uid, - 'studiensemester_kurzbz' => $semester_aktuell - ], [ + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ], [ 'semester' => $ausbildungssemester, 'verband' => '', 'gruppe' => '', @@ -608,9 +687,6 @@ class PrestudentLib $now = date('c'); $today = date('Y-m-d'); - $jahr = mb_substr($studiensemester_kurzbz, 4, 2); - - // Genererate Personenkennzeichen $personenkennzeichen = $this->_ci->StudentModel->generateMatrikelnummer2( $student_data->studiengang_kz, @@ -620,8 +696,9 @@ class PrestudentLib if (isError($personenkennzeichen)) return $personenkennzeichen; $personenkennzeichen = getData($personenkennzeichen); - - + + $jahr = mb_substr($personenkennzeichen, 0, 2); + // Generate UID $uid = $this->_ci->StudentModel->generateUID( $student_data->kurzbz, @@ -646,7 +723,7 @@ class PrestudentLib // Generate Alias - $alias = ''; + $alias = null; if (!defined('GENERATE_ALIAS_STUDENT') || GENERATE_ALIAS_STUDENT === true ) { @@ -894,6 +971,155 @@ class PrestudentLib ); } + /** + * Creates an incoming, saves necessary data for an incoming. + * @param $prestudent_id existing prestudent, for which incoming entry is created + * @param $studiengang_kz Studiengang assigned to incoming + * @param $studiensemester_kurzbz start semester for incoming + * @return object success if incoming successfully saved, or error + */ + public function setFirstIncoming($prestudent_id, $studiengang_kz, $studiensemester_kurzbz, $orgform_kurzbz, $studienplan_id) + { + // Verband and Ausbildungssemester for incoming + $authUID = getAuthUID(); + $incomingVerband = 'I'; + $incomingAusbildungssemester = '0'; + + // get prestudent + $this->_ci->PrestudentModel->addJoin('public.tbl_person p', 'person_id'); + $this->_ci->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz'); + $result = $this->_ci->PrestudentModel->load($prestudent_id); + + if (isError($result)) return $result; + if (!hasData($result)) return error('No prestudent'); + + $student_data = getData($result)[0]; + + $result = $this->setFirstStatus( + $prestudent_id, + $this->_ci->PrestudentstatusModel::STATUS_INCOMING, + $studiensemester_kurzbz, + $incomingAusbildungssemester, + $orgform_kurzbz, + $studienplan_id + ); + if (isError($result)) return $result; + if (!hasData($result)) return error('Error when adding prestudentstatus'); + + // generate Personenkennzeichen + $result = $this->_ci->StudentModel->generateMatrikelnummer2($studiengang_kz, $studiensemester_kurzbz); + if (isError($result)) return $result; + if (!hasData($result)) return error('No personenkennzeichen could be generated'); + + $personenkennzeichen = getData($result); + + $jahr = mb_substr($personenkennzeichen, 0, 2); + $stg = mb_substr($personenkennzeichen, 3, 4); + + $nachname_clean = mb_strtolower(sanitizeProblemChars($student_data->nachname)); + $vorname_clean = mb_strtolower(sanitizeProblemChars($student_data->vorname)); + $nachname_clean = str_replace(' ','_', $nachname_clean); + $vorname_clean = str_replace(' ','_', $vorname_clean); + + // get Studiengang data + $result = $this->_ci->StudiengangModel->load(ltrim($stg, '0')); + if (isError($result)) return $result; + if (!hasData($result)) return error('No Studiengang'); + + $stgObj = getData($result)[0]; + + // gernerate uid + $result = $this->_ci->StudentModel->generateUID($stgObj->kurzbz, $jahr, $stgObj->typ, $personenkennzeichen, $vorname_clean, $nachname_clean); + if (isError($result)) return $result; + if (!hasData($result)) return error("UID could not be generated"); + $uid = getData($result); + + //Benutzerdatensatz anlegen + $benutzer = [ + 'uid' => $uid, + 'person_id' => $student_data->person_id, + 'aktiv' => true, + 'aktivierungscode' => $this->_ci->BenutzerModel->generateActivationkey() + ]; + + // Generate Alias + $alias = ''; + if (!defined('GENERATE_ALIAS_STUDENT') || GENERATE_ALIAS_STUDENT === true) + { + $result = $this->_ci->BenutzerModel->generateAliasFromName($student_data->vorname, $student_data->nachname); + if (isError($result)) + return $result; + $alias = getData($result); + } + + $benutzer['alias'] = $alias; + $benutzer['insertamum'] = date('Y-m-d H:i:s'); + $benutzer['insertvon'] = $authUID; + + $result = $this->_ci->BenutzerModel->insert($benutzer); + + if (isError($result)) return $result; + + // Studentendatensatz anlegen + $student = [ + 'student_uid' => $uid, + 'matrikelnr' => $personenkennzeichen, + 'prestudent_id' => $prestudent_id, + 'studiengang_kz' => $studiengang_kz, + 'semester' => $incomingAusbildungssemester, + 'verband' => $incomingVerband, + 'gruppe' => ' ' + ]; + + $result = $this->_ci->LehrverbandModel->loadWhere([ + 'studiengang_kz' => $student['studiengang_kz'], + 'semester' => $student['semester'], + 'verband' => $student['verband'], + 'gruppe' => $student['gruppe'] + ]); + + if (isError($result)) return $result; + + if (!hasData($result)) + { + // Add Lehrverband if it does not exist + $result = $this->_ci->LehrverbandModel->insert([ + 'studiengang_kz' => $student_data->studiengang_kz, + 'semester' => $student['semester'], + 'verband' => $student['verband'], + 'gruppe' => $student['gruppe'], + 'bezeichnung' => 'Incoming', + 'aktiv' => true + ]); + + if (isError($result)) return $result; + } + + // add student + $student['insertamum'] = date('Y-m-d H:i:s'); + $student['insertvon'] = $authUID; + + $result = $this->_ci->StudentModel->insert($student); + if (isError($result)) return $result; + + // Add Studentlehrverband + $result = $this->_ci->StudentlehrverbandModel->insert([ + 'student_uid' => $uid, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'studiengang_kz' => $student_data->studiengang_kz, + 'semester' => $incomingAusbildungssemester, + 'verband' => $incomingVerband, + 'gruppe' => ' ', + 'insertamum' => date('Y-m-d H:i:s'), + 'insertvon' => $authUID + ]); + + if (isError($result)) + return $result; + + return success($prestudent_id); + } + protected function setBasic($authUID, $now, $status_kurzbz, $prestudent_id, $studiensemester_kurzbz, $ausbildungssemester, $statusgrund_id = null) { $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id); diff --git a/application/libraries/ProfilLib.php b/application/libraries/ProfilLib.php new file mode 100644 index 000000000..97cb8ce5d --- /dev/null +++ b/application/libraries/ProfilLib.php @@ -0,0 +1,609 @@ +ci =& get_instance(); + + + } + + public function getView($uid) + { + // loading required models + $this->ci->load->model("ressource/Mitarbeiter_model","MitarbeiterModel"); + $this->ci->load->model("person/Person_model","PersonModel"); + + $res = new stdClass(); + + // checking the uid + if ($uid == getAuthUID()) { + $isMitarbeiter = $this->ci->MitarbeiterModel->isMitarbeiter(getAuthUID()); + if(isError($isMitarbeiter)) + { + return error(getData($isMitarbeiter)); + } + $isMitarbeiter = getData($isMitarbeiter); + if ($isMitarbeiter) { + $res->view = "MitarbeiterProfil"; + $res->data = $this->mitarbeiterProfil(); + $res->data->pid = getAuthPersonId(); + } else { + $res->view = "StudentProfil"; + $res->data = $this->studentProfil(); + $res->data->pid = getAuthPersonId(); + } + $res->data->fotoStatus=$this->isFotoAkzeptiert(getAuthPersonId()); + } + // UID is availabe when accessing Profil/View/:uid + else { + $isMitarbeiter = $this->ci->MitarbeiterModel->isMitarbeiter($uid); + if(isError($isMitarbeiter)) + { + return error(getData($isMitarbeiter)); + } + $isMitarbeiter = getData($isMitarbeiter); + if ($isMitarbeiter) { + $res->view = "ViewMitarbeiterProfil"; + $res->data = $this->viewMitarbeiterProfil($uid); + + } else { + $res->view = "ViewStudentProfil"; + $res->data = $this->viewStudentProfil($uid); + } + } + + return success($res); + } + + //PRIVATE METHODS ############################################### + + /** + * function that returns the data used for the student profile + * @access private + * @return stdClass student data + */ + private function studentProfil() + { + $pid = getAuthPersonId(); + $uid = getAuthUID(); + $betriebsmittelperson_res = $this->getBetriebsmittelInfo($pid); + $kontakte_res = $this->getKontaktInfo($pid); + $zutrittskarte_ausgegebenam = $this->getZutrittskarteDatum($uid); + $adresse_res = $this->getAdressenInfo($pid); + $mailverteiler_res = $this->getMailverteiler($uid); + $person_res = $this->getPersonInfo($uid, true); + $zutrittsgruppe_res = $this->getZutrittsgruppen($uid); + $student_res = $this->getStudentInfo($uid); + $matr_res = $this->getMatrikelNummer($uid); + $profilUpdates = $this->getProfilUpdates($uid); + + $res = new stdClass(); + $res->username = $uid; + + //? Person Information + foreach ($person_res as $key => $value) { + $res->$key = $value; + } + + //? Student Information + foreach ($student_res as $key => $value) { + $res->$key = trim($value); + } + + $intern_email = array(); + $intern_email["type"] = "intern"; + $intern_email["email"] = DOMAIN? $uid . "@" . DOMAIN :""; + + $res->emails = [$intern_email]; + $res->adressen = $adresse_res; + $res->zutrittsdatum = $zutrittskarte_ausgegebenam; + $res->kontakte = $kontakte_res; + $res->mittel = $betriebsmittelperson_res; + $res->matrikelnummer = $matr_res->matr_nr; + $res->zuttritsgruppen = $zutrittsgruppe_res; + $res->mailverteiler = $mailverteiler_res; + $res->profilUpdates = $profilUpdates; + + return $res; + } + + /** + * function that returns the data used for the mitarbeiter profile + * @access private + * @return stdClass mitarbeiter data + */ + private function mitarbeiterProfil() + { + $pid = getAuthPersonId(); + $uid = getAuthUID(); + $zutrittskarte_ausgegebenam = $this->getZutrittskarteDatum($uid); + $adresse_res = $this->getAdressenInfo($pid); + $kontakte_res = $this->getKontaktInfo($pid); + $mailverteiler_res = $this->getMailverteiler($uid); + $person_res = $this->getPersonInfo($uid, true); + $benutzer_funktion_res = $this->getBenutzerFunktion($uid); + $betriebsmittelperson_res = $this->getBetriebsmittelInfo($pid); + $profilUpdates = $this->getProfilUpdates($uid); + $telefon_res = $this->getTelefonInfo($uid); + $mitarbeiter_res = $this->getMitarbeiterInfo($uid); + + $res = new stdClass(); + $res->username = $uid; + + //? Person Information + foreach ($person_res as $key => $value) { + $res->$key = $value; + } + + //? Mitarbeiter Information + foreach ($mitarbeiter_res as $key => $value) { + $res->$key = $value; + } + + $res->adressen = $adresse_res; + $res->zutrittsdatum = $zutrittskarte_ausgegebenam; + $res->kontakte = $kontakte_res; + $res->mittel = $betriebsmittelperson_res; + $res->mailverteiler = $mailverteiler_res; + + $intern_email = array(); + $intern_email["type"] = "intern"; + $intern_email["email"] = DOMAIN? $uid . "@" . DOMAIN : ""; + $extern_email = array(); + $extern_email["type"] = "alias"; + + $extern_email["email"] = $mitarbeiter_res->alias? ($mitarbeiter_res->alias . "@" . DOMAIN) : null; + $res->emails = $extern_email["email"]?[$intern_email, $extern_email]:[$intern_email]; + + $res->funktionen = $benutzer_funktion_res; + $res->standort_telefon = $telefon_res; + $res->profilUpdates = $profilUpdates; + + return $res; + } + + /** + * gets the date of issue of the FH access card corresponding to a user + * @access private + * @param integer $uid the userID used to get the date of issue of the FH access card + * @return string the date of issue of the FH access card corresponding to a userID + */ + private function getZutrittskarteDatum($uid) + { + $this->ci->load->model("ressource/Betriebsmittelperson_model","BetriebsmittelpersonModel"); + $zutrittskarte_ausgegebenam = $this->ci->BetriebsmittelpersonModel->getBetriebsmittelByUid($uid, "Zutrittskarte"); + + if(isError($zutrittskarte_ausgegebenam)){ + return error(getData($zutrittskarte_ausgegebenam)); + } + $zutrittskarte_ausgegebenam = getData($zutrittskarte_ausgegebenam); + $zutrittskarte_ausgegebenam = $zutrittskarte_ausgegebenam ? current($zutrittskarte_ausgegebenam)->ausgegebenam : null; + + //? formats date from 01-01-2000 to 01.01.2000 + if ($zutrittskarte_ausgegebenam !== NULL) + { + $zutrittskarte_ausgegebenam = (new DateTime($zutrittskarte_ausgegebenam))->format('d.m.Y'); + } + return $zutrittskarte_ausgegebenam; + } + + /** + * gets the address information corresponding to a user + * @access private + * @param integer $uid the userID used to get the address information + * @return array all the address information corresponding to a userID + */ + private function getAdressenInfo($pid) + { + $this->ci->load->model("person/Adresse_model","AdresseModel"); + $adresse_res = $this->ci->AdresseModel->addSelect(["adresse_id", "strasse", "tbl_adressentyp.bezeichnung as typ", "plz", "ort", "heimatadresse", "zustelladresse", "gemeinde", "nation"]); + $adresse_res = $this->ci->AdresseModel->addOrder("zustelladresse", "DESC"); + $adresse_res = $this->ci->AdresseModel->addJoin("tbl_adressentyp", "typ=adressentyp_kurzbz"); + + $adresse_res = $this->ci->AdresseModel->loadWhere(["person_id" => $pid]); + if(isError($adresse_res)){ + return error(getData($adresse_res)); + } + $adresse_res = getData($adresse_res) ?? []; + return $adresse_res; + } + + /** + * gets the kontakt information corresponding to a user + * @access private + * @param integer $uid the userID used to get the kontakt information + * @return array all the kontakt information corresponding to a userID + */ + private function getKontaktInfo($pid, $includehidden=false) + { + $this->ci->load->model("person/Kontakt_model","KontaktModel"); + $this->ci->KontaktModel->addSelect(['kontakttyp', 'kontakt_id', 'kontakt', 'tbl_kontakt.anmerkung', 'tbl_kontakt.zustellung']); + $this->ci->KontaktModel->addJoin('public.tbl_standort', 'standort_id', 'LEFT'); + $this->ci->KontaktModel->addJoin('public.tbl_firma', 'firma_id', 'LEFT'); + $this->ci->KontaktModel->addOrder('kontakttyp, kontakt, tbl_kontakt.updateamum, tbl_kontakt.insertamum'); + + $params = array('person_id' => $pid); + if(!$includehidden) + { + $params['kontakttyp <>'] = 'hidden'; + } + + $kontakte_res = $this->ci->KontaktModel->loadWhere($params); + if(isError($kontakte_res)){ + return error(getData($kontakte_res)); + } + $kontakte_res = getData($kontakte_res); + return $kontakte_res; + } + + /** + * gets all the mailverteiler using the tables: tbl_benutzer, tbl_benutzergruppe, tbl_gruppe + * @access private + * @param integer $uid the userID used to retrieve the mailverteiler + * @return array returns the mailvertailer corresponding to a userID + */ + private function getMailverteiler($uid) + { + $this->ci->load->model("person/Person_model","PersonModel"); + $this->ci->PersonModel->addSelect('gruppe_kurzbz, beschreibung'); + $this->ci->PersonModel->addJoin('tbl_benutzer', 'person_id'); + $this->ci->PersonModel->addJoin('tbl_benutzergruppe', 'uid'); + $this->ci->PersonModel->addJoin('tbl_gruppe', 'gruppe_kurzbz'); + + $mailverteiler_res = $this->ci->PersonModel->loadWhere(array('mailgrp' => true, 'uid' => $uid)); + if(isError($mailverteiler_res)){ + return error(getData($mailverteiler_res)); + } + $mailverteiler_res = getData($mailverteiler_res) ?? []; + $mailverteiler_res = gettype($mailverteiler_res) === 'array' ? $mailverteiler_res : []; + $mailverteiler_res = array_map(function ($element) { + $element->mailto = "mailto:" . $element->gruppe_kurzbz . "@" . DOMAIN; + return $element; + }, $mailverteiler_res); + return $mailverteiler_res; + } + + /** + * gets the person information corresponding to a user + * @access private + * @param integer $uid the userID used to get the person information + * @param integer $geburtsInfo flag wether to add the columns gebort, gebdatum, foto_sperre or not + * @return array all the person informaion corresponding to a userID + */ + private function getPersonInfo($uid, $geburtsInfo = null) + { + $this->ci->load->model("person/Benutzer_model","BenutzerModel"); + $selectClause = ["foto", "foto_sperre", "anrede", "titelpost as postnomen", "titelpre as titel", "vorname", "nachname"]; + /** @param integer $geburtsInfo */ + if ($geburtsInfo) { + array_push($selectClause, "gebort"); + array_push($selectClause, "TO_CHAR(gebdatum, 'DD.MM.YYYY') as gebdatum"); + } + $this->ci->BenutzerModel->addSelect($selectClause); + $this->ci->BenutzerModel->addJoin("tbl_person", "person_id"); + + $person_res = $this->ci->BenutzerModel->load([$uid]); + if(isError($person_res)){ + return error(getData($person_res)); + } + $person_res = getData($person_res); + $person_res = $person_res ? current($person_res) : null; + + if(isset($person_res)){ + if( ($person_res->foto === null) || ((getAuthUID() !== $uid) && ($person_res->foto_sperre !== false)) ) + { + $dummy_foto = base64_encode(file_get_contents(DOC_ROOT.'skin/images/profilbild_dummy.jpg')); + $person_res->foto = $dummy_foto; + } + } + + return $person_res; + } + + /** + * gets all the Benutzerfunktionen of a corresponding user + * @access private + * @param integer $uid the userID used to retrieve the Benutzerfunktionen + * @return array returns the Benutzerfunktionen corresponding to a userID + */ + private function getBenutzerFunktion($uid) + { + $this->ci->load->model("person/Benutzerfunktion_model","BenutzerfunktionModel"); + $this->ci->BenutzerfunktionModel->addSelect([ + "CASE WHEN (tbl_benutzerfunktion.bezeichnung IS NOT NULL AND tbl_benutzerfunktion.bezeichnung <> '' AND tbl_benutzerfunktion.bezeichnung <> tbl_funktion.beschreibung) THEN tbl_funktion.beschreibung || ' - ' || tbl_benutzerfunktion.bezeichnung ELSE tbl_funktion.beschreibung END as \"Bezeichnung\"", + "tbl_organisationseinheit.bezeichnung as Organisationseinheit", + "datum_von as Gültig_von", + "datum_bis as Gültig_bis", + "COALESCE(wochenstunden, '0'::numeric(5,2)) AS \"Wochenstunden\"" + ]); + $this->ci->BenutzerfunktionModel->addJoin("tbl_funktion", "funktion_kurzbz"); + $this->ci->BenutzerfunktionModel->addJoin("tbl_organisationseinheit", "oe_kurzbz"); + + $benutzer_funktion_res = $this->ci->BenutzerfunktionModel->loadWhere( + array( + 'uid' => $uid, + 'NOW()::date BETWEEN COALESCE(datum_von, \'1970-01-01\'::date) AND COALESCE(datum_bis, \'2170-12-01\'::date)' => null + ) + ); + if(isError($benutzer_funktion_res)){ + return error(getData($benutzer_funktion_res)); + } + $benutzer_funktion_res = getData($benutzer_funktion_res); + return $benutzer_funktion_res; + } + + /** + * gets all the Betriebsmittel of a corresponding user + * @access private + * @param integer $uid the userID used to retrieve the Betriebsmittel + * @return array returns the Betriebsmittel corresponding to a userID + */ + private function getBetriebsmittelInfo($pid) + { + $this->ci->load->model("ressource/Betriebsmittelperson_model","BetriebsmittelpersonModel"); + $this->ci->BetriebsmittelpersonModel->addSelect(["CONCAT(betriebsmitteltyp, ' ' ,beschreibung) as Betriebsmittel", "nummer as Nummer", "ausgegebenam as Ausgegeben_am"]); + + //? betriebsmittel are not needed in a view + $betriebsmittelperson_res = $this->ci->BetriebsmittelpersonModel->getBetriebsmittel($pid); + if(isError($betriebsmittelperson_res)){ + return error(getData($betriebsmittelperson_res)); + } + $betriebsmittelperson_res = getData($betriebsmittelperson_res); + return $betriebsmittelperson_res; + } + + /** + * gets the profil updates corresponding to a user + * @access private + * @param integer $uid the userID used to get the profil updates + * @return array all the profil updates corresponding to a userID + */ + private function getProfilUpdates($uid) + { + $this->ci->load->model("person/Profil_update_model","ProfilUpdateModel"); + $profilUpdates = $this->ci->ProfilUpdateModel->getProfilUpdatesWhere(['uid' => $uid]); + if(isError($profilUpdates)){ + return error(getData($profilUpdates)); + } + $profilUpdates = getData($profilUpdates); + return $profilUpdates; + } + + /** + * gets the telefon information corresponding to a user + * @access private + * @param integer $uid the userID used to get the telefon information + * @return array all the telefon informaion corresponding to a userID + */ + private function getTelefonInfo($uid) + { + $this->ci->load->model("ressource/Mitarbeiter_model","MitarbeiterModel"); + $this->ci->MitarbeiterModel->addSelect(["kontakt"]); + $this->ci->MitarbeiterModel->addJoin("tbl_kontakt", "tbl_mitarbeiter.standort_id = tbl_kontakt.standort_id"); + $this->ci->MitarbeiterModel->addLimit(1); + $telefon_res = $this->ci->MitarbeiterModel->loadWhere(["mitarbeiter_uid" => $uid, "kontakttyp" => "telefon"]); + if(isError($telefon_res)){ + return error(getData($telefon_res)); + } + $telefon_res = getData($telefon_res); + $telefon_res = $telefon_res ? current($telefon_res) : null; + return $telefon_res; + } + + /** + * gets the mitarbeiter information corresponding to a user + * @access private + * @param integer $uid the userID used to get the mitarbeiter information + * @return array all the mitarbeiter informaion corresponding to a userID + */ + private function getMitarbeiterInfo($uid) + { + $this->ci->load->model("ressource/Mitarbeiter_model","MitarbeiterModel"); + $this->ci->MitarbeiterModel->addSelect(["kurzbz", "telefonklappe", "alias", "ort_kurzbz"]); + $this->ci->MitarbeiterModel->addJoin("tbl_benutzer", "tbl_benutzer.uid = tbl_mitarbeiter.mitarbeiter_uid"); + $mitarbeiter_res = $this->ci->MitarbeiterModel->load($uid); + if(isError($mitarbeiter_res)){ + return error(getData($mitarbeiter_res)); + } + $mitarbeiter_res = getData($mitarbeiter_res); + $mitarbeiter_res = $mitarbeiter_res ? current($mitarbeiter_res) : null; + + return $mitarbeiter_res; + } + + /** + * gets the Zutrittsgruppen corresponding to a user + * @access private + * @param integer $uid the userID used to get the Zutrittsgruppen + * @return array all the Zutrittsgruppen corresponding to a userID + */ + private function getZutrittsgruppen($uid) + { + $this->ci->load->model("person/Benutzergruppe_model","BenutzergruppeModel"); + $this->ci->BenutzergruppeModel->addSelect(['bezeichnung']); + $this->ci->BenutzergruppeModel->addJoin('tbl_gruppe', 'gruppe_kurzbz'); + + $zutrittsgruppe_res = $this->ci->BenutzergruppeModel->loadWhere(array("uid" => $uid, "zutrittssystem" => true)); + if(isError($zutrittsgruppe_res)){ + return error(getData($zutrittsgruppe_res)); + } + $zutrittsgruppe_res = getData($zutrittsgruppe_res); + return $zutrittsgruppe_res; + } + + /** + * gets the student information corresponding to a user + * @access private + * @param integer $uid the userID used to get the student information + * @return array all the student informaion corresponding to a userID + */ + private function getStudentInfo($uid) + { + $this->ci->load->model("crm/Student_model","StudentModel"); + $this->ci->StudentModel->addSelect(['tbl_studiengang.bezeichnung as studiengang', 'tbl_studiengang.studiengang_kz as studiengang_kz', 'tbl_student.semester', 'tbl_student.verband', 'tbl_student.gruppe', 'tbl_student.matrikelnr as personenkennzeichen']); + $this->ci->StudentModel->addJoin('tbl_studiengang', "tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz"); + + $student_res = $this->ci->StudentModel->load([$uid]); + + if(isError($student_res)){ + return error(getData($student_res)); + } + $student_res = getData($student_res); + $student_res = $student_res ? current($student_res) : null; + return $student_res; + } + + /** + * gets the Matrikelnummer corresponding to a user + * @access private + * @param integer $uid the userID used to get the Matrikelnummer + * @return object the Matrikelnummer corresponding to a userID + */ + private function getMatrikelNummer($uid) + { + $this->ci->load->model("person/Benutzer_model","BenutzerModel"); + $this->ci->BenutzerModel->addSelect(["matr_nr"]); + $this->ci->BenutzerModel->addJoin("tbl_person", "person_id"); + + $matr_res = $this->ci->BenutzerModel->load([$uid]); + + if(isError($matr_res)){ + return error(getData($matr_res)); + } + $matr_res = getData($matr_res); + $matr_res = $matr_res ? current($matr_res) : []; + return $matr_res; + } + + /** + * checks whether the foto of a user is accepted or not + * @access private + * @param integer $pid the personId of the student or mitarbeiter + * @return bool whether the foto is accepted or not + */ + private function isFotoAkzeptiert($pid) + { + $this->ci->load->model('person/Fotostatusperson_model','FotostatusModel'); + $fotostatus = $this->ci->FotostatusModel->execReadOnlyQuery(" + select distinct on (person_id) person_id, insertamum, fotostatus_kurzbz + from public.tbl_person_fotostatus + where person_id = ? + order by person_id, insertamum desc",[$pid]); + if(isError($fotostatus)){ + return error(getData($fotostatus)); + } + $fotostatus = getData($fotostatus); + if(is_array($fotostatus) && count($fotostatus) > 0){ + $fotostatus = current($fotostatus)->fotostatus_kurzbz == 'akzeptiert'; + } + else + $fotostatus = false; + return $fotostatus; + } + + /** + * function that returns the data used for viewing another mitarbeiter profile + * @access private + * @param integer $uid the userID to retrieve the mitarbeiter data + * @return stdClass restricted mitarbeiter data + */ + private function viewMitarbeiterProfil($uid) + { + $mailverteiler_res = $this->getMailverteiler($uid); + $benutzer_funktion_res = $this->getBenutzerFunktion($uid); + $benutzer_res = $this->getBenutzerAlias($uid); + $person_res = $this->getPersonInfo($uid); + $mitarbeiter_res = $this->getMitarbeiterInfo($uid); + $telefon_res = $this->getTelefonInfo($uid); + + $res = new stdClass(); + $res->username = $uid; + + //? Person Info + foreach ($person_res as $key => $val) { + $res->$key = $val; + } + + //? Mitarbeiter Info + foreach ($mitarbeiter_res as $key => $val) { + $res->$key = $val; + + } + + $intern_email = array(); + $intern_email["type"] = "intern"; + $intern_email["email"] = DOMAIN? $uid . "@" . DOMAIN:""; + $extern_email = array(); + $extern_email["type"] = "alias"; + + $extern_email["email"] = $benutzer_res->alias ? ($benutzer_res->alias . "@" . DOMAIN) : null; + $res->emails = $extern_email?[$intern_email, $extern_email]:[$intern_email]; + + $res->funktionen = $benutzer_funktion_res; + $res->mailverteiler = $mailverteiler_res; + $res->standort_telefon = isset($telefon_res) ? $telefon_res->kontakt : null; + + return $res; + } + + /** + * gets the alias of a corresponding user + * @access private + * @param integer $uid the userID used to get the alias + * @return string the alias of the userID + */ + private function getBenutzerAlias($uid) + { + $this->ci->load->model("person/Benutzer_model","BenutzerModel"); + $this->ci->BenutzerModel->addSelect(["alias"]); + $benutzer_res = $this->ci->BenutzerModel->load([$uid]); + if(isError($benutzer_res)){ + return error(getData($benutzer_res)); + } + + $benutzer_res = getData($benutzer_res); + $benutzer_res = $benutzer_res ? current($benutzer_res) : null; + + return $benutzer_res; + } + + /** + * function that returns the data used for viewing another student profile + * @access private + * @param integer $uid the userID to retrieve the student data + * @return stdClass restricted student data + */ + private function viewStudentProfil($uid) + { + $mailverteiler_res = $this->getMailverteiler($uid); + $person_res = $this->getPersonInfo($uid); + $student_res = $this->getStudentInfo($uid); + $matr_res = $this->getMatrikelNummer($uid); + + $res = new stdClass(); + $res->username = $uid; + + //? Person Information + foreach ($person_res as $key => $value) { + $res->$key = $value; + } + + //? Student Information + foreach ($student_res as $key => $value) { + $res->$key = $value; + } + + $intern_email = array(); + $intern_email["type"] = "intern"; + $intern_email["email"] = DOMAIN? $uid . "@" . DOMAIN:""; + + $res->emails = [$intern_email]; + $res->matrikelnummer = $matr_res->matr_nr; + $res->mailverteiler = $mailverteiler_res; + + return $res; + } +} \ No newline at end of file diff --git a/application/libraries/SearchBarLib.php b/application/libraries/SearchBarLib.php index 13b0efdbb..f19365c02 100644 --- a/application/libraries/SearchBarLib.php +++ b/application/libraries/SearchBarLib.php @@ -115,6 +115,7 @@ class SearchBarLib $sql = ' SELECT + \'employee\' AS renderer, \''.$type.'\' AS type, b.uid AS uid, p.person_id AS person_id, @@ -205,6 +206,7 @@ EOSC; $employees = $dbModel->execReadOnlyQuery(' SELECT + \'employee\' AS renderer, \''.$type.'\' AS type, b.uid AS uid, p.person_id AS person_id, @@ -268,6 +270,7 @@ EOSC; $ous = $dbModel->execReadOnlyQuery(' SELECT + \'' . $type . '\' AS renderer, \''.$type.'\' AS type, o.oe_kurzbz AS oe_kurzbz, \'[\' || ot.bezeichnung || \'] \' || o.bezeichnung AS name, @@ -365,6 +368,7 @@ EOSC; $gesperrtes_foto = base64_encode(file_get_contents(DOC_ROOT.'skin/images/profilbild_dummy.jpg')); $students = $dbModel->execReadOnlyQuery(' SELECT + \'' . $type . '\' AS renderer, \''.$type.'\' AS type, s.student_uid AS uid, CONCAT(s.student_uid,\'@'.DOMAIN.'\') AS email, @@ -413,6 +417,7 @@ EOSC; $students = $dbModel->execReadOnlyQuery(' SELECT + \'student\' AS renderer, \''.$type.'\' AS type, s.student_uid AS uid, s.matrikelnr, @@ -458,6 +463,7 @@ EOSC; $prestudent = $dbModel->execReadOnlyQuery(' SELECT + \'' . $type . '\' AS renderer, \''.$type.'\' AS type, ps.prestudent_id, ps.studiengang_kz, @@ -517,6 +523,7 @@ EOSC; $rooms = $dbModel->execReadOnlyQuery(' SELECT + \'room\' AS renderer, \''.$type.'\' AS type, COALESCE(ort.ort_kurzbz, \'N/A\') as ort_kurzbz, COALESCE(ort.gebteil, \'N/A\') as building, diff --git a/application/libraries/SearchLib.php b/application/libraries/SearchLib.php new file mode 100644 index 000000000..24894eab5 --- /dev/null +++ b/application/libraries/SearchLib.php @@ -0,0 +1,1091 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +use \stdClass as stdClass; + +/** + * This is a alternative for SearchBarLib for advanced searches + */ +class SearchLib +{ + // Error constats + const ERROR_WRONG_JSON = 'ERR001'; + const ERROR_WRONG_SEARCHSTR = 'ERR002'; + const ERROR_NO_TYPES = 'ERR003'; + const ERROR_WRONG_TYPES = 'ERR004'; + const ERROR_NOT_AUTH = 'ERR005'; + + private $_ci; // Code igniter instance + + private $_searchfunction_priorities = []; + private $_numeric_searchfunctions = []; + private $_allowed_searchfunctions = []; + + /** + * Gets the CI instance and loads model + * + * @param array $params + * @return void + */ + public function __construct($params = null) + { + $this->_ci =& get_instance(); // get code igniter instance + + $config = $params['config'] ?? null; + // It is loaded only to have the DB functions available + $this->_ci->load->model('person/Benutzer_model', 'BenutzerModel'); + + // Load Config + $this->_ci->load->config('search', true, (boolean)$config); + $this->_ci->load->config('searchfunctions', true); + if ($config) { + $this->_ci->load->config($config, true); + $this->_ci->config->set_item('search', $this->_ci->config->item($config)); + } + + $this->_ci->load->library('PhrasesLib', [['search'], null], 'search_phrases'); + + // Precompute helper arrays + foreach ($this->_ci->config->item('searchfunctions') as $key => $arr) { + $this->_searchfunction_priorities[$key] = $arr['priority']; + if ($arr['force_integer'] ?? false) + $this->_numeric_searchfunctions[] = $key; + $this->_allowed_searchfunctions[] = $key; + } + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * It performes the search of the given search string using the specified search types + * + * @param string $searchstring + * @param array $types (optional) + * + * @return stdClass containing an array with the result on index 0 + * and the overall query time on index 1. + */ + public function search($searchstring, $types = []) + { + if (!$types) { + $types = $this->_ci->config->item('search'); + } else { + $tmp = []; + $missing = []; + foreach ($types as $type) { + $typeconfig = $this->_ci->config->item($type, 'search'); + if (!$typeconfig) { + $missing[] = $type; + } else { + $tmp[$type] = $typeconfig; + } + } + if ($missing) { + $p = $this->_ci->search_phrases; + return error(array_map(function ($type) use ($p) { + return $p->t('search', 'error_missing_config', [ + 'type' => $type + ]); + }, $missing)); + } + $types = $tmp; + } + + + // Convert searchstring into array + list($searchArray, $searchstring) = $this->_convertQuery($searchstring, $types); + + + $sql = $this->getDynamicSearchSqls($searchArray, array_keys($types)); + if (isError($sql)) + return $sql; + if (!hasData($sql)) { + $retval = success([]); + $retval->meta = ['time' => 0, 'searchstring' => $searchstring]; + return $retval; + } + + $msc = microtime(true); + $result = $this->_ci->BenutzerModel->execReadOnlyQuery(getData($sql)); + $msc = microtime(true) - $msc; + + if (isError($result)) + return $result; + + $retval = success($result->retval); + $retval->meta = [ + 'time' => $msc, + 'searchstring' => $searchstring + ]; + + return $retval; + } + + /** + * Generates the search query for the given search string and the + * specified search type. + * + * @param array $searchArray + * @param string $table + * + * @return stdClass containing the query string. + */ + public function getDynamicSearchSql($searchArray, $table) + { + $res = $this->checkConfig($table); + if (isError($res)) + return $res; + $table_config = getData($res); + + $sql_with = []; + + $sql_select = $this->prepareDynamicSearchSql($sql_with, $searchArray, $table); + + if (!$sql_select) + return success(""); + + $lang = getUserLanguage(); + + $output = "WITH"; + if ($sql_with && $sql_with[0] === 'RECURSIVE') { + $output .= " RECURSIVE"; + array_shift($sql_with); + } + + $output .= " + lang (index) AS ( + SELECT index + FROM public.tbl_sprache + WHERE sprache=" . $this->_ci->db->escape($lang) . " + LIMIT 1 + ), + auth (uid) AS ( + SELECT " . $this->_ci->db->escape(getAuthUID()) . " AS uid + )"; + + if ($sql_with) { + $sql_with = array_unique($sql_with); + $output .= ", " . implode(", ", $sql_with); + } + + $other_selects = ""; + if (isset($table_config['resultfields'])) + $other_selects = implode(", ", $table_config['resultfields']); + if ($other_selects) + $other_selects = ", " . $other_selects; + + $output .= " + , q (" . $this->_formatPrimarykeys($table_config['primarykey']) . ", rank) AS ( + SELECT " . $this->_formatPrimarykeys($table_config['primarykey']) . ", MAX(rank) + FROM (" . implode(" UNION ", $sql_select) . ") q + GROUP BY " . $this->_formatPrimarykeys($table_config['primarykey']) . " + ) + SELECT + " . $this->_ci->db->escape($table) . " AS type, + q.rank + " . $other_selects . " + FROM q + " . ($table_config['resultjoin'] ?? "") . " + ORDER BY rank DESC + "; + + return success($output); + } + + /** + * Generates the search query for the given search string and the + * specified search types. + * + * @param array $searchArray + * @param array $types + * + * @return stdClass containing the query string. + */ + public function getDynamicSearchSqls($searchArray, $types) + { + $with = []; + $selects = []; + foreach ($types as $type) { + $res = $this->checkConfig($type); + if (isError($res)) + return $res; + $table_config = getData($res); + + $select = $this->prepareDynamicSearchSql($with, $searchArray, $type); + if (!$select) + continue; + + $with[] = "final_" . $type . " (" . $this->_formatPrimarykeys($table_config['primarykey']) . ", rank) AS ( + SELECT " . $this->_formatPrimarykeys($table_config['primarykey']) . ", MAX(rank) + FROM (" . implode(" UNION ", $select) . ") q + GROUP BY " . $this->_formatPrimarykeys($table_config['primarykey']) . " + )"; + + $renderer = $table_config['renderer'] ?? $type; + $selects[] = " + SELECT + " . $this->_ci->db->escape($renderer) . " AS renderer, + " . $this->_ci->db->escape($type) . " AS type, + rank, + TO_JSONB((SELECT x FROM (SELECT " . implode(", ", $table_config['resultfields'] ?? ['*']) . ") x)) AS data + FROM final_" . $type . " + " . ($table_config['resultjoin'] ?? ""); + } + + if (!$selects) + return success(""); + + $recursive = ""; + if ($with && $with[0] === "RECURSIVE") { + $recursive = "RECURSIVE "; + array_shift($with); + } + + $with = array_unique($with); + + $lang = getUserLanguage(); + array_unshift($with, "lang (index) AS ( + SELECT index + FROM public.tbl_sprache + WHERE sprache=" . $this->_ci->db->escape($lang) . " + LIMIT 1 + )"); + array_unshift($with, "auth (uid) AS ( + SELECT " . $this->_ci->db->escape(getAuthUID()) . " AS uid + )"); + + return success(" + WITH " . $recursive . implode(", ", $with) . " + SELECT * + FROM (" . implode(" UNION ", $selects) . ") q + ORDER BY rank DESC + LIMIT 100 + "); + } + + //------------------------------------------------------------------------------------------------------------------ + // Protected methods + + /** + * Check config + * + * @param string $name + * + * @return stdClass + */ + protected function checkConfig($name) + { + $table_config = $this->_ci->config->item($name, 'search'); + + if (!$table_config) + return error($this->_ci->search_phrases->t('search', 'error_missing_config', [ + 'type' => $name + ])); + + $errors = []; + if (!isset($table_config['table']) + || !is_string($table_config['table']) + || !$table_config['table'] + ) { + $errors[] = $this->_ci->search_phrases->t('search', 'error_invalid_config', [ + 'type' => $name, + 'field' => 'table' + ]); + } + if (!isset($table_config['primarykey']) + || !is_string($table_config['primarykey']) + || !$table_config['primarykey'] + ) { + $errors[] = $this->_ci->search_phrases->t('search', 'error_invalid_config', [ + 'type' => $name, + 'field' => 'primarykey' + ]); + } + if (!isset($table_config['resultfields']) + || !is_array($table_config['resultfields']) + || !$table_config['resultfields'] + ) { + $errors[] = $this->_ci->search_phrases->t('search', 'error_invalid_config', [ + 'type' => $name, + 'field' => 'resultfields' + ]); + } + if (!isset($table_config['searchfields']) + || !is_array($table_config['searchfields']) + || !$table_config['searchfields'] + ) { + $errors[] = $this->_ci->search_phrases->t('search', 'error_invalid_config', [ + 'type' => $name, + 'field' => 'searchfields' + ]); + } else { + foreach ($table_config['searchfields'] as $searchfield => $config) { + if (!isset($config['field']) + || !is_string($config['field']) + || !$config['field'] + ) { + $errors[] = $this->_ci->search_phrases->t('search', 'error_invalid_config_searchfield', [ + 'type' => $name, + 'searchfield' => $searchfield, + 'field' => 'field' + ]); + } + if (!isset($config['comparison']) + || !is_string($config['comparison']) + || !in_array($config['comparison'], $this->_allowed_searchfunctions) + ) { + $errors[] = $this->_ci->search_phrases->t('search', 'error_invalid_config_searchfield', [ + 'type' => $name, + 'searchfield' => $searchfield, + 'field' => 'comparison' + ]); + } + } + } + + if ($errors) + return error($errors); + + return success($table_config); + } + + /** + * Generates the with statements for the given search string and the + * specified search type. + * + * @param array &$sqlWith + * @param array $searchArray + * @param string $table + * + * @return string a query string or the name of the prepared select. + */ + protected function prepareDynamicSearchSql(&$sqlWith, $searchArray, $table) + { + $table_config = $this->_ci->config->item($table, 'search'); + + $id_offset = count($sqlWith); + + + $allowed_codes_w_order = ['' => 0, '!' => -1]; + $max = max($this->_searchfunction_priorities); + foreach ($table_config['searchfields'] as $code => $config) { + $allowed_codes_w_order[$code] = $this->_searchfunction_priorities[$config['comparison']]; + $allowed_codes_w_order['!' . $code] = $this->_searchfunction_priorities[$config['comparison']] - $max - 2; + } + + $check_order = $this->_searchfunction_priorities; + uasort($table_config['searchfields'], function ($a, $b) use ($check_order) { + return $check_order[$b['comparison']] - $check_order[$a['comparison']]; + }); + + $integer_functions = $this->_numeric_searchfunctions; + $integer_fields = array_keys(array_filter($table_config['searchfields'], function ($a) use ($integer_functions) { + return in_array($a['comparison'], $integer_functions); + })); + + $only_integer_fields = count($integer_fields) == count($table_config['searchfields']); + + $aliases = []; + foreach ($table_config['searchfields'] as $field => $config) { + if (isset($config['alias'])) { + foreach ($config['alias'] as $alias) { + $aliases[$alias] = $field; + $aliases['!' . $alias] = '!' . $field; + } + } + } + + $sql_select = []; + + if (isset($table_config['prepare'])) { + $this->_addPreparesToSqlWith($sqlWith, $table_config['prepare']); + } + + foreach ($searchArray as $or_search) { + if (isset($or_search['-filter']) && !in_array($table, $or_search['-filter'])) + continue; + unset($or_search['-filter']); + + foreach ($aliases as $alias => $field) { + if (isset($or_search[$alias])) { + $or_search[$field] = array_merge($or_search[$alias], $or_search[$field] ?? []); + unset($or_search[$alias]); + } + } + + // NOTE(chris): early out if not allowed fields are in the search array + $used_codes = array_keys($or_search); + if (count(array_intersect($used_codes, array_keys($allowed_codes_w_order))) != count($used_codes)) + continue; + + // NOTE(chris): expand general excludes to all fields + if (isset($or_search['!'])) { + $not = $or_search['!']; + unset($or_search['!']); + foreach ($table_config['searchfields'] as $code => $config) { + if (isset($or_search['!' . $code])) + $or_search['!' . $code] = array_unique(array_merge($or_search['!' . $code], $not)); + else + $or_search['!' . $code] = $not; + } + } + + // NOTE(chris): early out if all searchfields require an integer and at least one searchword is not a number + if ($only_integer_fields + && isset($or_search[""]) + && $this->_hasAtLeastOneNaN($or_search[""]) + ) { + continue; + } + + $skip = false; + foreach ($integer_fields as $code) { + // NOTE(chris): filter non integer for integer fields + if (isset($or_search['!' . $code])) { + $or_search['!' . $code] = array_filter($or_search['!' . $code], function ($a) { + return is_numeric($a); + }); + if (!$or_search['!' . $code]) + unset($or_search['!' . $code]); + } + // NOTE(chris): early out if a searchword that is not a number is compared to a searchfield that requires an integer + if (isset($or_search[$code]) + && $this->_hasAtLeastOneNaN($or_search[$code]) + ) { + $skip = true; + break; + } + } + if ($skip) + continue; + + // NOTE(chris): sort for performance reasons + uksort($or_search, function ($a, $b) use ($allowed_codes_w_order) { + return $allowed_codes_w_order[$b] - $allowed_codes_w_order[$a]; + }); + + $or_with = []; + $or_select = []; + $or_prepare = []; + + if (substr(key($or_search), 0, 1) == '!') { + // NOTE(chris): only negative searchwords + $sql = []; + foreach ($or_search as $code => $words) { + $code = substr($code, 1); + // NOTE(chris): sort for performance reasons + usort($words, function ($a, $b) { + return strlen($b) - strlen($a); + }); + $field_config = $table_config['searchfields'][$code]; + + if (isset($field_config['prepare'])) { + $this->_addPreparesToSqlWith($or_with, $field_config['prepare']); + $or_prepare[$code] = $field_config['prepare']; + unset($table_config['searchfields'][$code]['prepare']); + unset($field_config['prepare']); + } + $field_sql = " + SELECT + " . $this->_formatPrimarykeys($table_config['primarykey'], $table_config['table']) . " + FROM " . $table_config['table'] . " + " . $this->_makeJoin($field_config['join'] ?? '') . " + WHERE "; + foreach ($words as $word) { + $sql[] = $field_sql . $this->_makeCompareBool($field_config['comparison'], $field_config['field'], $word); + } + } + + $or_select[] = " + SELECT + " . $this->_formatPrimarykeys($table_config['primarykey'], $table_config['table']) . ", + 1.0 AS rank + FROM " . $table_config['table'] . " + WHERE " . $table_config['primarykey'] . " NOT IN (" . implode(" UNION ", $sql) . ")"; + } else { + $current_select = false; + $count = 0; + $skip = false; + foreach ($or_search as $code => $words) { + // NOTE(chris): sort for performance reasons + if ($code && substr($code, 0, 1) == '!') { + usort($words, function ($a, $b) { + return strlen($a) - strlen($b); + }); + } else { + usort($words, function ($a, $b) { + return strlen($b) - strlen($a); + }); + } + if ($code == '') { + foreach ($words as $i => $word) { + $field_sql = []; + foreach ($table_config['searchfields'] as $c => $field_config) { + if (in_array($field_config['comparison'], $integer_functions) && !is_numeric($word)) + continue; + + $word_from = $table_config['table']; + $word_join = ""; + $word_rank = "0"; + if ($current_select) { + $word_from = $current_select; + if ($this->_needBasicTableJoin($field_config['field'], $table_config['primarykey'])) { + $word_join .= " " . $this->_makeJoin($table_config); + } + $word_rank = "rank"; + } + if (isset($field_config['prepare'])) { + $this->_addPreparesToSqlWith($or_with, $field_config['prepare']); + $or_prepare[$c] = $field_config['prepare']; + unset($table_config['searchfields'][$c]['prepare']); + unset($field_config['prepare']); + } + if (isset($field_config['join'])) { + $word_join .= " " . $this->_makeJoin($field_config['join']); + } + $field_sql[] = " + SELECT + " . $this->_formatPrimarykeys($table_config['primarykey'], $word_from) . ", + " . $word_rank . " AS w_rank, + " . $this->_makeRank($field_config['comparison'], $field_config['field'], $word) . " AS rank + FROM " . $word_from . " + " . $word_join . " + WHERE " . $this->_makeCompare($field_config['comparison'], $field_config['field'], $word); + } + // NOTE(chris): skip because the word is not numeric but all searchfields require integers + if (!$field_sql) { + $or_with = []; + $or_select = []; + $count = 0; + $skip = true; + foreach ($or_prepare as $k => $v) + $table_config['searchfields'][$k]['prepare'] = $v; + break; + } + + $id = "w" . ($id_offset + count($or_with)); + $or_with[] = " + " . $id . " (" . $this->_formatPrimarykeys($table_config['primarykey']) . ", rank) AS ( + SELECT + " . $this->_formatPrimarykeys($table_config['primarykey']) . ", + (w_rank + 1.0 - CASE " . + "WHEN MIN(rank) = 0 THEN 0 " . + "ELSE EXP(SUM(LN(CASE WHEN rank = 0 THEN 1 ELSE rank " . + "END))) END) AS rank + FROM (" . implode(' UNION ALL ', $field_sql) . ") " . $id . " + GROUP BY " . $this->_formatPrimarykeys($table_config['primarykey']) . ", w_rank + )"; + $current_select = $id; + } + } else { + foreach ($words as $i => $word) { + $where = ""; + $rank = ""; + $jointype = ""; + if (substr($code, 0, 1) == '!') { + $c = substr($code, 1); + $field_config = $table_config['searchfields'][$c]; + + $rank = "1"; + + $jointype = "LEFT"; + + $where = $field_config['field'] . + " IS NULL OR NOT (" . + $this->_makeCompareBool( + $field_config['comparison'], + $field_config['field'], + $word + ) . + ")"; + if ($field_config['1-n'] ?? false) { + $where = "GROUP BY " . + $this->_formatPrimarykeys($table_config['primarykey'], $current_select ?: $table_config['table']) . + ", rank HAVING MIN(CASE WHEN " . + $where . + " THEN 1 ELSE 0 END) = 1"; + } else { + $where = "WHERE " . $where; + } + } else { + $field_config = $table_config['searchfields'][$code]; + + $rank = $this->_makeRank($field_config['comparison'], $field_config['field'], $word); + + $where = $this->_makeCompare($field_config['comparison'], $field_config['field'], $word); + $where = "WHERE " . $where; + } + $word_from = $table_config['table']; + $word_join = ""; + $word_rank = ""; + if ($current_select) { + $word_from = $current_select; + if ($this->_needBasicTableJoin($field_config['field'], $table_config['primarykey'])) { + $word_join .= " " . $this->_makeJoin($table_config); + } + $word_rank = "rank + "; + } + if (isset($field_config['prepare'])) { + $this->_addPreparesToSqlWith($or_with, $field_config['prepare']); + $or_prepare[$code] = $field_config['prepare']; + unset($table_config['searchfields'][$code]['prepare']); + unset($field_config['prepare']); + } + if (isset($field_config['join'])) { + $word_join .= " " . $this->_makeJoin($field_config['join'], $jointype); + } + + $id = "w" . ($id_offset + count($or_with)); + $or_with[] = " + " . $id . " (" . $this->_formatPrimarykeys($table_config['primarykey']) . ", rank) AS ( + SELECT + " . $this->_formatPrimarykeys($table_config['primarykey'], $word_from) . ", + " . $word_rank . $rank . " AS rank + FROM " . $word_from . " + " . $word_join . " + " . $where . " + )"; + $current_select = $id; + } + } + if ($skip) + break; + $count += count($words); + } + + if (!$count || !$current_select) + continue; + + $or_select[] = " + SELECT " . $this->_formatPrimarykeys($table_config['primarykey']) . ", rank / " . $count . " AS rank FROM " . $current_select; + } + + if ($or_with[0] === "RECURSIVE") + { + if (empty($sqlWith) || $sqlWith[0] !== "RECURSIVE") + array_unshift($sqlWith, "RECURSIVE"); + array_shift($or_with); + } + + $sqlWith = array_merge($sqlWith, $or_with); + $sql_select = array_merge($sql_select, $or_select); + $id_offset += count($or_with); + } + + return $sql_select; + } + + //------------------------------------------------------------------------------------------------------------------ + // Private methods + + /** + * Checks if the field is not one of the primarykeys. + * + * @param string $field + * @param array|string $primarykeys + * + * @return boolean + */ + private function _needBasicTableJoin($field, $primarykeys) + { + if (!is_array($primarykeys) && strpos($primarykeys, ",") !== false) { + return $field != $primarykeys; + } + if (!is_array($primarykeys)) + $primarykeys = explode(",", $primarykeys); + + foreach ($primarykeys as $key) { + if ($field == trim($key)) + return false; + } + return true; + } + + /** + * Returns comma separated primarykeys. Optionally with table prefix + * + * @param array|string $primarykeys + * @param string $prefix + * + * @return string + */ + private function _formatPrimarykeys($primarykeys, $prefix = "") + { + if (is_array($primarykeys)) { + if ($prefix) + $prefix .= "."; + return $prefix . implode(", " . $prefix, $primarykeys); + } + if (!$prefix) + return $primarykeys; + + return $prefix . "." . implode(", " . $prefix . ".", explode(",", $primarykeys)); + } + + /** + * Adds the prepare statement to the sqlWith stack and handles the + * "RECURSIVE" modifier + * + * @param array &$sqlWith + * @param array $prepares + * + * @return void + */ + private function _addPreparesToSqlWith(&$sqlWith, $prepares) + { + $recursive = $sqlWith[0] ?? "" === "RECURSIVE"; + if (!is_array($prepares)) + $prepares = [$prepares]; + + foreach ($prepares as $prep) { + $prep = trim($prep); + if (strtoupper(substr($prep, 0, 10)) === "RECURSIVE ") { + $recursive = true; + $sqlWith[] = substr($prep, 10); + } else { + $sqlWith[] = $prep; + } + } + if ($recursive && $sqlWith[0] !== "RECURSIVE") { + array_unshift($sqlWith, "RECURSIVE"); + } + } + + /** + * Checks if an array has at least on non numeric value. + * + * @param array $arr + * + * @return boolean + */ + private function _hasAtLeastOneNaN($arr) + { + foreach ($arr as $value) + if (!is_numeric($value)) + return true; + return false; + } + + /** + * Helper function for getDynamicSearchSql + * + * @param array $join + * @param string $prefix + * + * @return string + */ + private function _makeJoin($join, $prefix = "") + { + if (!is_array($join)) + return ""; + if (!isset($join['table'])) { + $output = []; + foreach ($join as $j) + $output[] = trim($this->_makeJoin($j, $prefix)); + return implode(" ", $output); + } + if (!isset($join['on']) && !isset($join['using']) && !isset($join['primarykey'])) + return ""; + $output = $prefix . " JOIN " . $join['table']; + + if (isset($join['using'])) + return $output . " USING (" . $join['using'] . ")"; + + if (isset($join['primarykey'])) + return $output . " USING (" . $join['primarykey'] . ")"; + + return $output . " ON (" . $join['on'] . ")"; + } + + /** + * Helper function for _makeRank, _makeCompare and _makeCompareBool + * + * @param string $function + * @param string $mode + * @param string $field + * @param string $word + * + * @return string + */ + private function _makeFunction($function, $mode, $field, $word) + { + $searchfunction = $this->_ci->config->item($mode, 'searchfunctions'); + + if (!$searchfunction) + return ""; + $tpl = $searchfunction[$function] ?? ""; + + if (strstr($tpl, '{field}')) + $tpl = str_replace('{field}', $field, $tpl); + + if (strstr($tpl, '{word}')) + $tpl = str_replace('{word}', $this->_ci->db->escape($word), $tpl); + if (strstr($tpl, '{like:word}')) + $tpl = str_replace('{like:word}', "'%" . $this->_ci->db->escape_like_str($word) . "%'", $tpl); + + return $tpl; + } + + /** + * Helper function for getDynamicSearchSql + * + * @param string $mode + * @param string $field + * @param string $word + * + * @return string + */ + private function _makeRank($mode, $field, $word) + { + return $this->_makeFunction('rank', $mode, $field, $word); + } + + /** + * Helper function for getDynamicSearchSql + * + * @param string $mode + * @param string $field + * @param string $word + * + * @return string + */ + private function _makeCompare($mode, $field, $word) + { + return $this->_makeFunction('compare', $mode, $field, $word); + } + + /** + * Helper function for getDynamicSearchSql + * + * @param string $mode + * @param string $field + * @param string $word + * + * @return string + */ + private function _makeCompareBool($mode, $field, $word) + { + $searchfunction = $this->_ci->config->item($mode, 'searchfunctions'); + + if (!$searchfunction) + return ""; + $function = isset($searchfunction['compare_boolean']) ? 'compare_boolean' : 'compare'; + return $this->_makeFunction($function, $mode, $field, $word); + } + + /** + * Converts the search string to an array. + * First level should be joined with an OR. + * Second level should be joined with an AND or AND NOT. + * It is an associative array where the key is a code for the field + * which the words should be compared with and the value is the array + * of words. + * Use AND NOT if the first letter in the key is "!". + * Use AND if the first letter in the key is not "!". + * E.g: + * If the key is: + * "": the words should be compared to all fields with AND. + * "!": the words should be compared to all fields with AND NOT. + * "somefield": the words should be compared to the field somefield with + * AND. + * "!somefield": the words should be compared to the field somefield with + * AND NOT. + * + * @param string $searchstring + * @param array $types + * + * @return array + */ + private function _convertQuery($searchstring, $types) + { + $searchAllTypes = count($types) == count($this->_ci->config->item('search')); + $allowedTypes = array_keys($types); + + $currentArray = []; + $outputArray = []; + $cleanStrings = []; + $cleanSearchstring = ''; + $filter = ['+' => [], '-' => []]; + $typeAliases = []; + + $tmp = explode(' ', strtolower($searchstring)); + while ($tmp) { + $chunk = trim(array_shift($tmp)); + if ($chunk == '') + continue; + + if (strpos($chunk, '"') !== false) { + $test = explode('"', $chunk); + if (count($test) > 2) { + $rest = implode('"', array_slice($test, 2)); + if ($rest) { + array_unshift($tmp, $rest); + $chunk = implode('"', array_slice($test, 0, 2)) . '"'; + } + } + if (count($test) == 2) { + while ($tmp && strpos($test[1], '"') === false) { + $test[1] .= ' ' . trim(array_shift($tmp)); + } + if (strpos($test[1], '"') === false) { + $chunk = implode('"', $test) . '"'; + } else { + $test2 = explode('"', $test[1], 2); + $chunk = $test[0] . '"' . $test2[0] . '"'; + if ($test2[1]) { + array_unshift($tmp, $test2[1]); + } + } + } + if (strpos($chunk, ' ') === false) { + $chunk = str_replace('"', '', $chunk); + } + } + + if ($chunk == 'or') { + $this->_convertQueryCleanupOr($currentArray, $cleanStrings, $filter, $searchAllTypes, $allowedTypes); + $filter = ['+' => [], '-' => []]; + if ($currentArray) { + $cleanSearchstring .= ($cleanSearchstring ? ' or ' : '') . implode(' ', $cleanStrings); + $cleanStrings = []; + $outputArray[] = $currentArray; + $currentArray = []; + } + continue; + } + + if ($chunk == ':' || $chunk == '-' || substr($chunk, -1) == ':') + continue; + + if ($chunk[0] == ':' || ($chunk[0] == '-' && $chunk[1] == ':')) { + if (!$typeAliases) { + foreach ($types as $type => $config) { + $typeAliases[$type] = $type; + if (isset($config['alias'])) { + foreach ($config['alias'] as $alias) { + if (!isset($typeAliases[$alias])) + $typeAliases[$alias] = $type; + } + } + } + } + + $test = explode(':', $chunk, 2); + if (isset($typeAliases[$test[1]])) + $chunk = $test[0] . ':' . $typeAliases[$test[1]]; + elseif ($test[0] == '-') + continue; + } + + if (in_array($chunk, $cleanStrings)) + continue; + + $cleanStrings[] = $chunk; + + $chunk = str_replace('"', '', $chunk); + $code = ''; + + if ($chunk[0] == '-') { + $code = '!'; + $chunk = substr($chunk, 1); + } + if (strpos($chunk, ':') !== false) { + $chunk = explode(':', $chunk, 2); + if (!$chunk[0]) { + $filter[$code ? '-' : '+'][] = $chunk[1]; + continue; + } + $code .= $chunk[0]; + $chunk = $chunk[1]; + } + + if (!isset($currentArray[$code])) + $currentArray[$code] = []; + + $currentArray[$code][] = $chunk; + } + + $this->_convertQueryCleanupOr($currentArray, $cleanStrings, $filter, $searchAllTypes, $allowedTypes); + if ($currentArray) { + $cleanSearchstring .= ($cleanSearchstring ? ' or ' : '') . implode(' ', $cleanStrings); + $outputArray[] = $currentArray; + } + return [$outputArray, $cleanSearchstring]; + } + + private function _convertQueryCleanupOr(&$currentArray, &$cleanStrings, $filter, $searchAllTypes, $allowedTypes) + { + if ($filter['+'] && $filter['-']) { + $double = array_intersect($filter['+'], $filter['-']); + if ($double) { + foreach ($double as $type) { + array_splice($cleanStrings, array_search(':' . $type, $cleanStrings), 1); + array_splice($cleanStrings, array_search('-:' . $type, $cleanStrings), 1); + } + $filter['+'] = array_diff($filter['+'], $double); + $filter['-'] = array_diff($filter['-'], $double); + } + if (!$filter['+'] && !$filter['-']) { + // All filters cancel each other out + $currentArray = []; + $cleanStrings = []; + return; + } + if ($filter['+']) { + foreach ($filter['-'] as $type) { + array_splice($cleanStrings, array_search('-:' . $type, $cleanStrings), 1); + } + $filter['-'] = []; + } + } + if ($filter['+']) { + $cleanFilter = array_intersect($allowedTypes, $filter['+']); + if (!$cleanFilter) { + // All filters are forbidden + $currentArray = []; + $cleanStrings = []; + return; + } + $forbiddenFilter = array_diff($cleanFilter, $filter['+']); + foreach ($forbiddenFilter as $type) { + array_splice($cleanStrings, array_search(':' . $type, $cleanStrings), 1); + } + $filter['+'] = $cleanFilter; + } elseif ($filter['-']) { + $filter['+'] = array_diff($allowedTypes, $filter['-']); + if (!$searchAllTypes) { + foreach ($filter['+'] as $type) + $cleanStrings[] = ':' . $type; + foreach ($filter['-'] as $type) + array_splice($cleanStrings, array_search('-:' . $type, $cleanStrings), 1); + } + } else { + if (!$searchAllTypes) { + foreach ($allowedTypes as $type) + $cleanStrings[] = ':' . $type; + } + } + + if ($filter['+']) { + $currentArray['-filter'] = $filter['+']; + } + } +} diff --git a/application/libraries/StundenplanLib.php b/application/libraries/StundenplanLib.php new file mode 100644 index 000000000..7ed64da2c --- /dev/null +++ b/application/libraries/StundenplanLib.php @@ -0,0 +1,792 @@ +getEventsUser($start, $end); + + return $this->getEventsLv($lehrveranstaltung_id, $start, $end); + } + + /** + * fetches Stundenplan events for the loggedin user between start and end + * + * @param string $start + * @param string $end + * @return stdClass + * @access public + */ + public function getEventsUser($start, $end) + { + $this->_ci =& get_instance(); + + $this->_ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + + $uid = getAuthUID(); + if (is_null($uid)) + return error("No UID"); + + $is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter($uid)); + + if ($is_mitarbeiter) + return $this->getEventsEmployee($uid, $start, $end); + + return $this->getEventsStudent($uid, $start, $end); + } + + /** + * fetches Stundenplan events for a student between start and end + * + * @param string $student_uid + * @param string $start + * @param string $end + * @return stdClass + * @access public + */ + public function getEventsStudent($student_uid, $start, $end) + { + $this->_ci =& get_instance(); + + $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + + $semester_range = $this->studienSemesterErmitteln($start, $end); + if (isError($semester_range)) + return $semester_range; + $semester_range = getData($semester_range); + + $this->sortStudienSemester($semester_range); + + $function_error = $this->applyLoadUeberSemesterHaelfte($semester_range); + if ($function_error) + return $function_error; + + // getting the gruppen_kurzbz of the student in the different studiensemester + $benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($student_uid, $semester_range); + if (isError($benutzer_gruppen)) + return $benutzer_gruppen; + $benutzer_gruppen = getData($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); + + $stundenplan_query = $this->_ci->StundenplanModel->getStundenplanQuery( + $start, + $end, + $semester_range, + $benutzer_gruppen, + $student_lehrverband + ); + if (!$stundenplan_query) + return success([]); + + $stundenplan_data = $this->_ci->StundenplanModel->stundenplanGruppierung($stundenplan_query); + 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); + } + + /** + * fetches Stundenplan events for an employee between start and end + * + * @param string $uid + * @param string $start + * @param string $end + * @return stdClass + * @access public + */ + public function getEventsEmployee($uid, $start, $end) + { + $this->_ci =& get_instance(); + + $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + + $stundenplan_data = $this->_ci->StundenplanModel->getStundenplanMitarbeiter($start, $end, $uid); + 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); + } + + /** + * fetches Stundenplan events for a LV between start and end + * + * @param integer $lehrveranstaltung_id + * @param string $start + * @param string $end + * @return stdClass + * @access public + */ + public function getEventsLv($lehrveranstaltung_id, $start, $end) + { + $this->_ci =& get_instance(); + + $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + + $stundenplan_data = $this->_ci->StundenplanModel->getStundenplanLVA($start, $end, $lehrveranstaltung_id); + if (isError($stundenplan_data)) + return $stundenplan_data; + $stundenplan_data = getData($stundenplan_data) ?? []; + + $function_error = $this->expandObjectInformation($stundenplan_data); + if ($function_error) + return $function_error; + + // query lv itself in case its Stundenplan is being queried and it has no entries + $this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $lv_result = $this->_ci->LehrveranstaltungModel->load($lehrveranstaltung_id); + if (isError($lv_result)) + return $lv_result; + if (!hasData($lv_result)) + return error('LV not found'); + + return success($stundenplan_data); + } + + /** + * Get stundenplan for a room + * + * @param string $ort_kurzbz + * @param string $start_date + * @param string $end_date + * @return stdClass + */ + public function getRoomplan($ort_kurzbz, $start_date, $end_date) + { + $this->_ci =& get_instance(); + + // Load Config + $this->_ci->load->config('calendar'); + // Load Models + $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + + $query = $this->_ci->StundenplanModel->getRoomQuery($ort_kurzbz, $start_date, $end_date); + $roomplan_data = $this->_ci->StundenplanModel->stundenplanGruppierung($query); + + if (isError($roomplan_data)) + return $roomplan_data; + + $this->expandObjectInformation($roomplan_data->retval); + + return $roomplan_data; + } + + /** + * Get reservations (for a room or all) + * + * @param string $start_date + * @param string $end_date + * @param string $ort_kurzbz + * @return stdClass + */ + public function getReservierungen($start_date, $end_date, $ort_kurzbz = '') + { + $this->_ci =& get_instance(); + + // Load Config + $this->_ci->load->config('calendar'); + // Load Models + $this->_ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->_ci->load->model('ressource/Reservierung_model', 'ReservierungModel'); + $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + + $is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter(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); + } else { + // querying the reservierungen + $reservierungen = $this->_ci->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz); + } + + if (isError($reservierungen)) + return $reservierungen; + + $function_error = $this->expandObjectInformation($reservierungen->retval); + + if (!is_null($function_error)) + return $function_error; + + return $reservierungen; + } + + public function getLektorenFromLehrveranstaltung($lehrveranstaltung_id, $semester, $studiengang_kz, $studiensemester_kurzbz){ + $this->_ci =& get_instance(); + $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + $this->_ci->load->model('organisation/Studiensemester_model','StudiensemesterModel'); + + $studiensemester = $this->_ci->StudiensemesterModel->loadWhere(["studiensemester_kurzbz"=>$studiensemester_kurzbz]); + if(isError($studiensemester)) + { + return error(getData($studiensemester)); + } + $studiensemester = current(getData($studiensemester)); + $lektoren = $this->_ci->StundenplanModel->execReadOnlyQuery(" + SELECT DISTINCT uid + FROM campus.vw_stundenplan + WHERE lehrveranstaltung_id = ? AND + studiengang_kz = ? AND + semester = ? AND + (datum BETWEEN ? AND ?) + ",[$lehrveranstaltung_id, $studiengang_kz, $semester, $studiensemester->start, $studiensemester->ende]); + + if(isError($lektoren)) + { + return error(getData($lektoren)); + } + $lektoren = getData($lektoren); + if(isset($lektoren)){ + $lektoren = array_map(function($lektor){ + return $lektor->uid; + },$lektoren); + + } + return success($lektoren); + } + + public function expandObjectInformation($data) + { + $this->_ci =& get_instance(); + + // Load Config + $this->_ci->load->config('calendar'); + // Load Model + $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + + foreach ($data as $item) + { + $tz = new DateTimeZone($this->_ci->config->item('timezone')); + $isostart = new DateTime($item->datum . ' ' . $item->beginn, $tz); + $item->isostart = $isostart->format(DateTime::ATOM); + + $isoend = new DateTime($item->datum . ' ' . $item->ende, $tz); + $item->isoend = $isoend->format(DateTime::ATOM); + + $lektor_obj_array = array(); + $gruppe_obj_array = array(); + + // load lektor object + foreach ($item->lektor as $lv_lektor) + { + $this->_ci->StundenplanModel->addLimit(1); + $lektor_object = $this->_ci->StundenplanModel->execReadOnlyQuery(" + SELECT mitarbeiter_uid, vorname, nachname, kurzbz + FROM public.tbl_mitarbeiter + JOIN public.tbl_benutzer benutzer ON benutzer.uid = mitarbeiter_uid + JOIN public.tbl_person person ON person.person_id = benutzer.person_id + WHERE kurzbz = ?", [$lv_lektor]); + if (isError($lektor_object)) { + $this->_ci->show_error(getError($lektor_object)); + } + if(isError($lektor_object)) + { + return error(getData($lektor_object)); + } + $lektor_object = getData($lektor_object); + if(count($lektor_object) == 0) + { + return error("No lektor object"); + } + $lektor_object = current($lektor_object); + // only provide needed information of the mitarbeiter object + $lektor_obj_array[] = $lektor_object; + } + + // load gruppe object + foreach ($item->gruppe as $lv_gruppe) + { + $lv_gruppe = strtr($lv_gruppe, ['(' => '', ')' => '', '"' => '']); + $lv_gruppe_array = explode(",", $lv_gruppe); + list($gruppe, $verband, $semester, $studiengang_kz, $gruppen_kuerzel) = $lv_gruppe_array; + + $lv_gruppe_object = new stdClass(); + $lv_gruppe_object->gruppe = $gruppe; + $lv_gruppe_object->verband = $verband; + $lv_gruppe_object->semester = $semester; + $lv_gruppe_object->studiengang_kz = $studiengang_kz; + $lv_gruppe_object->kuerzel = $gruppen_kuerzel; + + $gruppe_obj_array[] = $lv_gruppe_object; + } + + if($item->ort_kurzbz) { + + $ort_content_object = $this->_ci->StundenplanModel->execReadOnlyQuery(" + SELECT content_id + FROM public.tbl_ort + WHERE ort_kurzbz = ?", [$item->ort_kurzbz]); + if (isError($ort_content_object)) { + return error(getData($ort_content_object)); + } + $ort_content_object = getData($ort_content_object)[0]; + if($ort_content_object) { + $item->ort_content_id = $ort_content_object->content_id; + } + + + } + + $item->gruppe = $gruppe_obj_array; + $item->lektor = $lektor_obj_array; + + } + } + + public function fetchFerienTageEvents($start_date, $end_date, $studiengang_kz) + { + $this->_ci =& get_instance(); + + // Load Config + $this->_ci->load->config('calendar'); + + $this->_ci->load->model('organisation/Ferien_model', 'FerienModel'); + + $tz = new DateTimeZone($this->_ci->config->item('timezone')); + + $ferienEvents = $this->_ci->FerienModel->execReadOnlyQuery(" + SELECT * + FROM lehre.tbl_ferien + WHERE (bisdatum >= ? AND vondatum < ?) AND (studiengang_kz = 0 OR studiengang_kz = ?) + ", [$start_date, $end_date, $studiengang_kz]); + + if (isError($ferienEvents)) + return $ferienEvents; + + $ferienEvents = getData($ferienEvents); + + if (!$ferienEvents) + return success([]); + + $ferienEvents = array_map(function ($event) { + $event_start = new DateTime($event->vondatum); + $event_end = new DateTime($event->bisdatum); + $event_end->modify('+1 day'); + + $interval = new DateInterval('P1D'); + $period = new DatePeriod($event_start, $interval, $event_end); + $event->dates = iterator_to_array($period); + return $event; + }, $ferienEvents); + + $start_date = new DateTime($start_date); + $start_date->setTime(0, 0, 0); + $end_date = new DateTime($end_date); + $end_date->setTime(23, 59, 59); + + $ferienEventsFlattened = []; + foreach ($ferienEvents as $ferien_event) { + foreach ($ferien_event->dates as $date) { + if ($date < $start_date || $date > $end_date) + continue; + $event = new stdClass(); + $event->bezeichnung = $ferien_event->bezeichnung; + $event->datum = $date->format('Y-m-d'); + $event->type = 'ferien'; + $ferienEventsFlattened[] = $event; + } + }; + + $today = new DateTime(); + $ferienEventsFlattened = array_map(function ($event) use ($today, $tz) { + $ferien_event = (object)array( + 'type' => 'ferien', + 'beginn' => $today->format('H:i:s'), + 'ende' => $today->format('H:i:s'), + 'isostart' => (new DateTime($event->datum . ' 00:00:00', $tz))->format('c'), + 'isoend' => (new DateTime($event->datum . ' 23:59:59', $tz))->format('c'), + 'allDayEvent' => true, + 'datum' => $event->datum, + 'topic' => $event->bezeichnung, + 'titel' => $event->bezeichnung, + 'farbe' => '00689E' + ); + return $ferien_event; + }, $ferienEventsFlattened); + + return success($ferienEventsFlattened); + } + + // start of the private functions ######################################################################################################## + + // function used to sort an array of studiensemester strings + private function sortStudienSemester(&$semester_range){ + usort( + $semester_range, + function($first,$second) + { + $sem_first = null; + $year_first = null; + $match_first = null; + + $sem_second = null; + $year_second = null; + $match_second = null; + + preg_match('/([WS]+)([0-9]+)/',$first,$match_first); + preg_match('/([WS]+)([0-9]+)/',$second,$match_second); + + $sem_first = $match_first[1]; + $year_first = intval($match_first[2]); + + $sem_second = $match_second[1]; + $year_second = intval($match_second[2]); + + if($year_first < $year_second) + { + return -1; + } + else if($year_first > $year_second) + { + return 1; + } + else if($year_first == $year_second && $sem_first > $sem_second) + { + return 1; + } + else if($year_first == $year_second && $sem_first < $sem_second) + { + return -1; + } + return 0; + } + ); + } + + + + private function fetchBenutzerGruppenFromStudiensemester($student_uid, $semester_range) + { + $this->_ci->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel'); + + $benutzer_gruppen = []; + // for each studiensemester fetch the benutzer gruppen and add them to an associate $bentuzer_gruppen array + /* + [ + ['WS2023'] => [['gruppe1_SS2023','gruppe2_SS2023'],['gruppe1_WS2023','gruppe2_WS2023']], + ['SS2024'] => [['gruppe1_WS2023','gruppe2_WS2023'],['gruppe1_SS2024','gruppe2_SS2024']], + ['WS2024'] => [['gruppe1_SS2024','gruppe2_SS2024'],['gruppe1_WS2024','gruppe2_WS2024']], + ] + */ + foreach($semester_range as $semester_key => $semester_array) + { + $benutzer_gruppen[$semester_key] = []; + // each semester could have ajoint semesters that need to be checked + foreach($semester_array as $semester=>$semester_date_range) + { + // for each active semester query the benutzer_gruppen associated to the semester + $benutzer_query = $this->_ci->BenutzergruppeModel->execReadOnlyQuery(" + SELECT * FROM tbl_benutzergruppe where uid = ? AND studiensemester_kurzbz = ?",[$student_uid, $semester]); + if(isError($benutzer_query)){ + return error(getData($benutzer_query)); + } + $benutzer_query_result = getData($benutzer_query)??[]; + + array_push( + $benutzer_gruppen[$semester_key], + array_map( + function($item) + { + return "'".$item->gruppe_kurzbz. "'"; + }, + $benutzer_query_result + ) + ); + } + } + + // merge the gruppen of each studiensemester together for the original studiensemester + /* + [ + ['WS2023'] => ['gruppe1_SS2023','gruppe2_SS2023','gruppe1_WS2023','gruppe2_WS2023'], + ['SS2024'] => ['gruppe1_WS2023','gruppe2_WS2023','gruppe1_SS2024','gruppe2_SS2024'], + ['WS2024'] => ['gruppe1_SS2024','gruppe2_SS2024','gruppe1_WS2024','gruppe2_WS2024'], + ] + */ + $benutzer_gruppen = array_map( + function($gruppe) + { + $merged_gruppe = []; + foreach($gruppe as $gruppen_array) + { + $merged_gruppe = array_merge($merged_gruppe, $gruppen_array); + } + return $merged_gruppe; + }, + $benutzer_gruppen + ); + + return success($benutzer_gruppen); + } + + private function fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range) + { + $this->_ci->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel'); + + $student_lehrverband = []; + // for each studiensemester fetch the studentlehrverbaende and add them to an associate $student_lehrverband array + /* + [ + ['WS2023'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ] ], + ['SS2024'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ] ], + ['WS2024'] => [ [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ] ], + ] + */ + foreach($semester_range as $semester_key => $semester_array) + { + $student_lehrverband[$semester_key] = []; + foreach($semester_array as $semester=>$semester_date_range) + { + // for each active semester query the student_lehrverband associated to the semester + $lehrverband_query = $this->_ci->BenutzergruppeModel->execReadOnlyQuery(" + SELECT * FROM tbl_studentlehrverband where student_uid = ? AND studiensemester_kurzbz = ?", [$student_uid, $semester]); + if(isError($lehrverband_query)){ + return error(getData($lehrverband_query)); + } + $lehrverband_query_result = getData($lehrverband_query)??[]; + + $converted_studentLehrverband= array_map( + function ($item) + { + $result = new stdClass(); + $result->studiengang_kz = $item->studiengang_kz; + $result->semester = $item->semester; + $result->verband = $item->verband; + $result->gruppe = $item->gruppe; + return $result; + }, + $lehrverband_query_result); + + array_push($student_lehrverband[$semester_key], $converted_studentLehrverband); + + } + + } + + // merge the studentlehrverband of each studiensemester together for the original studiensemester + /* + [ + ['WS2023'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], + ['SS2024'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], + ['WS2024'] => [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ], + ] + */ + + $student_lehrverband = array_map( + function($studentlehrverband) + { + $merged_studentlehrverband = []; + foreach($studentlehrverband as $studentlehrverband_array) + { + $merged_studentlehrverband = array_merge($merged_studentlehrverband, $studentlehrverband_array); + } + return $merged_studentlehrverband; + }, + $student_lehrverband + ); + + return success($student_lehrverband); + } + + private function applyLoadUeberSemesterHaelfte(&$semester_range) + { + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + /* + @var($semester_collection) + convert the array of studiensemester into an associative array with the studiensemester as the key + and the values of each key are the studiensemester needed for the query associated to that studiensemester + example: + + #INPUT: + ['WS2023','SS2024','WS2024'] + #OUTPUT: + [ + 'WS2023' => ['SS2023','WS2023'] + 'SS2024' => ['WS2023','SS2024'] + 'WS2024' => ['SS2024','WS2024'] + ] + */ + $semester_collection = []; + foreach($semester_range as $studiensemester) + { + $previous_studiensemester = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester); + if(isError($previous_studiensemester)) + { + return error(getData($previous_studiensemester)); + } + $previous_studiensemester = getData($previous_studiensemester); + if (count($previous_studiensemester) == 0) { + return error('no previous semester'); + } + $previous_studiensemester = current($previous_studiensemester)->studiensemester_kurzbz; + $semester_collection[$studiensemester] = [$previous_studiensemester, $studiensemester]; + } + + /* + @var($studienSemesterDateRanges) + fetches for each studiensemester the start and end date, (SS) summer studiensemester are extended by 1 month to cover the summerbreak + based on the LVPLAN_LOAD_UEBER_SEMESTERHAELFTE constant it will load both the semester and the previous semester with the full date range + or the semester with the full date range and the previous semester with the half date range: + + #INPUT: + [ + 'WS2023' => ['SS2023','WS2023'] + 'SS2024' => ['WS2023','SS2024'] + 'WS2024' => ['SS2024','WS2024'] + ] + #OUTPUT: depends whether LVPLAN_LOAD_UEBER_SEMESTERHAELFTE is true or false + ~ if LVPLAN_LOAD_UEBER_SEMESTERHAELFTE == true + [ + "SS2024": [ + "WS2023": [ + "start"=> "2024-02-03", + "ende"=> "2024-08-31" + ], + "SS2024": [ + "start"=> "2024-02-03", + "ende"=> "2024-08-31" + ] + ] + ] + ~ if LVPLAN_LOAD_UEBER_SEMESTERHAELFTE == false + [ + "SS2024": [ + "WS2023": [ + "start"=> "2024-02-03", + "ende"=> "2024-05-17" + ], + "SS2024": [ + "start"=> "2024-02-03", + "ende"=> "2024-08-31" + ] + ] + ] + */ + $studienSemesterDateRanges=[]; + foreach($semester_collection as $semester_original => $semester_adjoint) + { + $semester_start_ende = $this->_ci->StudiensemesterModel->getStartEndeFromStudiensemester($semester_original); + if(isError($semester_start_ende)) + { + return error(getData($semester_start_ende)); + } + $semester_start_ende = current(getData($semester_start_ende)); + + // initialize empty arrays to add key value pairs + $studienSemesterDateRanges[$semester_original] = []; + + // check if the studiensemester is a summer semester and add 1 month to bridge the school summer break + $match = null; + preg_match("/^(SS)([0-9]+)/",$semester_original,$match); + if(count($match) >0) + { + $one_month = new DateInterval('P1M'); + $one_day = DateInterval::createFromDateString('1 days'); + $summer_studiensemester_end_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->ende); + $summer_studiensemester_end_date->add($one_month); + $summer_studiensemester_end_date->sub($one_day); + $semester_start_ende->ende = date_format($summer_studiensemester_end_date,'Y-m-d'); + } + if (defined('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE') && LVPLAN_LOAD_UEBER_SEMESTERHAELFTE === true) + { + foreach($semester_adjoint as $adjoint) + { + $studienSemesterDateRanges[$semester_original][$adjoint]=$semester_start_ende; + } + } + else + { + //TODO: half of a DateInterval might not be correctly calculated + // calculate the half of the studiensemester + $studiensemester_start_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->start); + $studiensemester_end_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->ende); + $studiensemester_time_difference = $studiensemester_start_date->diff($studiensemester_end_date); + $half_dateNumber = ceil($studiensemester_time_difference->d/2)+ceil(($studiensemester_time_difference->m*30)/2); + $half_dateInterval = new DateInterval('P'.strval($half_dateNumber) .'D'); + $studiensemester_half = date_format($studiensemester_start_date->add($half_dateInterval),'Y-m-d'); + + $first_half = new stdClass(); + $first_half->start = $semester_start_ende->start; + $first_half->ende = $studiensemester_half; + + $studienSemesterDateRanges[$semester_original][$semester_adjoint[0]] = $first_half; + $studienSemesterDateRanges[$semester_original][$semester_adjoint[1]] = $semester_start_ende; + } + $semester_range = $studienSemesterDateRanges; + } + } + + private function studienSemesterErmitteln($start_date, $end_date) + { + $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); + if (isError($semester_range)) + return $semester_range; + + $semester_range = array_map( + function ($sem) { + return $sem->studiensemester_kurzbz; + }, + getData($semester_range) ?: [] + ); + + // if no studiensemester is found for the given timespan, get the nearest studiensemester + if (count($semester_range) == 0) + { + $aktuelle_studiensemester = $this->_ci->StudiensemesterModel->getNearest(); + if (isError($aktuelle_studiensemester)) + return $aktuelle_studiensemester; + + $aktuelle_studiensemester = getData($aktuelle_studiensemester); + if (count($aktuelle_studiensemester) == 0) { + return error("No aktuelles semester"); + } + $aktuelle_studiensemester = current($aktuelle_studiensemester)->studiensemester_kurzbz; + // push aktuelles semester in active semester array + array_push($semester_range, $aktuelle_studiensemester); + } + + return success($semester_range); + } +} diff --git a/application/libraries/dashboard/DashboardLib.php b/application/libraries/dashboard/DashboardLib.php index edea7c310..f6d7d6599 100644 --- a/application/libraries/dashboard/DashboardLib.php +++ b/application/libraries/dashboard/DashboardLib.php @@ -107,7 +107,7 @@ class DashboardLib $emptyoverride = new stdClass(); $emptyoverride->dashboard_id = $dashboard->dashboard_id; $emptyoverride->uid = $uid; - $emptyoverride->override = '{"widgets": {"' . self::USEROVERRIDE_SECTION . '": {}}}'; + $emptyoverride->override = '{"' . self::USEROVERRIDE_SECTION . '": {"widgets":{}}, "custom": { "widgets" : {}}}'; return $emptyoverride; } @@ -127,7 +127,7 @@ class DashboardLib $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 = '{"widgets": {"' . $section . '": {}}}'; + $emptypreset->preset = '{"' . $section . '": { "widgets" : {}},"custom": { "widgets" : {}}}'; return $emptypreset; } @@ -206,21 +206,22 @@ class DashboardLib public function addWidgetToWidgets(&$widgets, $section, $widget, $widgetid) { $section = ($section !== null) ? $section : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL; - if (!isset($widgets[$section]) || !is_array($widgets[$section])) + if (!isset($widgets[$section]) || !isset($widgets[$section]["widgets"]) || !is_array($widgets[$section])) { $widgets[$section] = array(); + $widgets[$section]["widgets"] = array(); } - $widgets[$section][$widgetid] = $widget; + $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][$widgetid])) + if (isset($widgets[$section]) && isset($widgets[$section]["widgets"][$widgetid])) { - unset($widgets[$section][$widgetid]); - if(empty($widgets[$section]) && $section !== self::USEROVERRIDE_SECTION) { + unset($widgets[$section]["widgets"][$widgetid]); + if(empty($widgets[$section]["widgets"]) && $section !== self::USEROVERRIDE_SECTION) { unset($widgets[$section]); } return true; diff --git a/application/libraries/issues/PlausicheckResolverLib.php b/application/libraries/issues/PlausicheckResolverLib.php index 26da985f6..2b20a7d93 100644 --- a/application/libraries/issues/PlausicheckResolverLib.php +++ b/application/libraries/issues/PlausicheckResolverLib.php @@ -13,7 +13,7 @@ class PlausicheckResolverLib private $_ci; // ci instance private $_extensionName; // name of extension private $_codeLibMappings = []; // mappings for issues which explicitly defined resolver - private $_codeProducerLibMappings = []; // mappings for issues which are resolved as produced + private $_codeProducerLibMappings = []; // mappings for issues which are resolved with the same check as they are produced public function __construct($params = null) { @@ -99,10 +99,11 @@ class PlausicheckResolverLib $issueResolved = getData($issueResolvedRes) === true; } } - elseif (isset($this->_codeProducerLibMappings[$issue->fehlercode])) + elseif (isset($this->_codeProducerLibMappings[$issue->fehlercode])) // check if it is an issue without explicit resolver, "self-resolving" { $libName = $this->_codeProducerLibMappings[$issue->fehlercode]; + // execute same check as used for issue production $issueResolvedRes = $this->_ci->plausicheckproducerlib->producePlausicheckIssue( $libName, $issue->fehler_kurzbz, diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0005.php b/application/libraries/issues/resolvers/CORE_PERSON_0005.php new file mode 100644 index 000000000..1d768e70c --- /dev/null +++ b/application/libraries/issues/resolvers/CORE_PERSON_0005.php @@ -0,0 +1,36 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('person/Person_model', 'PersonModel'); + + // load geburtsnation for the given person + $this->_ci->PersonModel->addSelect('geburtsnation'); + $personRes = $this->_ci->PersonModel->load($params['issue_person_id']); + + if (isError($personRes)) return $personRes; + + if (hasData($personRes)) + { + // get person data + $personData = getData($personRes)[0]; + + // if geburtsnation present, issue is resolved + return success(!isEmptyString($personData->geburtsnation)); + } + else + return success(false); // if no person found, not resolved + } +} \ No newline at end of file diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0006.php b/application/libraries/issues/resolvers/CORE_PERSON_0006.php new file mode 100644 index 000000000..8b7ff9c56 --- /dev/null +++ b/application/libraries/issues/resolvers/CORE_PERSON_0006.php @@ -0,0 +1,37 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Uhstat1daten_model', 'UhstatModel'); + + $personRes = $this->_ci->UhstatModel->getUHSTAT1PersonData([$params['issue_person_id']]); + + if (isError($personRes)) return $personRes; + + if (hasData($personRes)) + { + // get person data + $personData = getData($personRes)[0]; + + // if person identification data present, issue is resolved + return success( + !isEmptyString($personData->ersatzkennzeichen) + || (!isEmptyString($personData->vbpkAs) && !isEmptyString($personData->vbpkBf)) + ); + } + else + return success(false); // if no person found, not resolved + } +} \ No newline at end of file diff --git a/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php b/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php index 1aaafa471..c1238c13d 100644 --- a/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php +++ b/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php @@ -24,7 +24,6 @@ class GehaltsbestandteilLib $this->CI = get_instance(); $this->CI->load->model('vertragsbestandteil/Gehaltsbestandteil_model', 'GehaltsbestandteilModel'); - $this->CI->load->library('extensions/FHC-Core-Personalverwaltung/abrechnung/GehaltsLib'); $this->GehaltsbestandteilModel = $this->CI->GehaltsbestandteilModel; } @@ -121,10 +120,6 @@ class GehaltsbestandteilLib { $this->setUIDtoPGSQL(); - // delete Gehaltsabrechnung - $ret = $this->CI->gehaltslib->deleteAbrechnung($gehaltsbestandteil); - - // $ret = $this->GehaltsbestandteilModel->delete($gehaltsbestandteil->getGehaltsbestandteil_id()); if (isError($ret)) diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php index 2e6182957..1ecb9ac60 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php @@ -131,6 +131,11 @@ class VertragsbestandteilLib return $this->VertragsbestandteilModel->getVertragsbestandteil($vertragsbestandteil_id); } + public function fetchLastVertragsbestandteilStundenBeforeAltersteilzeit($dienstverhaeltnis_id) + { + return $this->VertragsbestandteilModel->getLastVertragsbestanteilStundenBeforeAltersteilzeit($dienstverhaeltnis_id); + } + public function storeDienstverhaeltnis(Dienstverhaeltnis $dv) { if( intval($dv->getDienstverhaeltnis_id()) > 0 ) diff --git a/application/models/accounting/Vertrag_model.php b/application/models/accounting/Vertrag_model.php index abc2114a6..4c036369b 100644 --- a/application/models/accounting/Vertrag_model.php +++ b/application/models/accounting/Vertrag_model.php @@ -384,6 +384,80 @@ class Vertrag_model extends DB_Model } } + public function getVertrag($mitarbeiter_uid, $lehreinheit_id) + { + $this->addSelect('tbl_lehreinheitmitarbeiter.*, tbl_vertrag.*, status.bezeichnung as vertragsstatus, status.vertragsstatus_kurzbz'); + $this->addJoin('lehre.tbl_lehreinheitmitarbeiter', 'vertrag_id'); + $this->addJoin('lehre.tbl_vertragstyp', 'vertragstyp_kurzbz', 'LEFT'); + $this->addJoin(' + ( + SELECT DISTINCT ON(vertrag_id) vertrag_id, + bezeichnung, + tbl_vertragsstatus.vertragsstatus_kurzbz + FROM lehre.tbl_vertrag_vertragsstatus + JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz) + ORDER BY vertrag_id, datum DESC + ) as status', 'status.vertrag_id = lehre.tbl_vertrag.vertrag_id', 'LEFT'); + + return $this->loadWhere(array('mitarbeiter_uid' => $mitarbeiter_uid, 'lehreinheit_id' => $lehreinheit_id)); + } + + public function getVertragById($vertrag_id) + { + $this->addSelect( + 'tbl_vertrag.vertrag_id, vertragstyp_kurzbz, vertragsstunden, vertragsstunden_studiensemester_kurzbz, status.vertragsstatus_kurzbz, + status.bezeichnung AS vertragsstatus, tbl_vertrag.betrag, lema.semesterstunden, lema.stundensatz' + ); + $this->addJoin('lehre.tbl_lehreinheitmitarbeiter lema', 'tbl_vertrag.vertrag_id = lema.vertrag_id', 'LEFT'); + $this->addJoin(' + ( + SELECT DISTINCT ON(vst.vertrag_id) vst.vertrag_id, + bezeichnung, + tbl_vertragsstatus.vertragsstatus_kurzbz + FROM lehre.tbl_vertrag_vertragsstatus vst + JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz) + ORDER BY vst.vertrag_id, datum DESC + ) as status', 'status.vertrag_id = lehre.tbl_vertrag.vertrag_id', 'LEFT'); + + return $this->loadWhere(['tbl_vertrag.vertrag_id' => $vertrag_id]); + } + + public function cancelVertrag($vertrag_id, $mitarbeiter_uid) + { + $vertrag = $this->load($vertrag_id); + + if (!hasData($vertrag)) + return error("Contract not found"); + + $vertrag = getData($vertrag)[0]; + + $this->_updateVertragRelevant($vertrag->vertrag_id); + + return $this->VertragvertragsstatusModel->insert(array( + 'vertrag_id' => $vertrag->vertrag_id, + 'vertragsstatus_kurzbz' => 'storno', + 'uid' => $mitarbeiter_uid, + 'datum' => 'NOW()', + 'insertamum' => 'NOW()', + 'insertvon' => getAuthUID() + )); + } + + public function deleteVertrag($vertrag_id) + { + $vertrag = $this->load($vertrag_id); + + if (!hasData($vertrag)) + return error("Contract not found"); + + $vertrag = getData($vertrag)[0]; + + $this->_updateVertragRelevant($vertrag->vertrag_id); + + $this->VertragvertragsstatusModel->delete(array('vertrag_id' => $vertrag->vertrag_id)); + return $this->delete(array('vertrag_id' => $vertrag->vertrag_id)); + } + // ----------------------------------------------------------------------------------------------------------------- // Private methods @@ -415,4 +489,20 @@ class Vertrag_model extends DB_Model return $bezeichnung; } + + private function _updateVertragRelevant($vertrag_id) + { + $this->LehreinheitmitarbeiterModel->update( + array("vertrag_id" => $vertrag_id), + array( + 'vertrag_id' => null + ) + ); + $this->ProjektbetreuerModel->update( + array("vertrag_id" => $vertrag_id), + array( + 'vertrag_id' => null + ) + ); + } } diff --git a/application/models/codex/Bisio_model.php b/application/models/codex/Bisio_model.php index 5ecd4bb51..1cff1dc54 100644 --- a/application/models/codex/Bisio_model.php +++ b/application/models/codex/Bisio_model.php @@ -44,27 +44,4 @@ class Bisio_model extends DB_Model else return success("Bisio not found"); } - - /** - * checks, if an (extension) table exists to avoid later errors - * @param String $schema like 'extension' - * @param String $table like 'tbl_mo_bisiozuordnung' - * @return boolean - */ - public function tableExists($schema, $table) - { - $params = array($schema, $table); - - $qry = "SELECT - 1 - FROM - information_schema.role_table_grants - WHERE - table_schema = ? - AND table_name = ?"; - - $result = $this->execQuery($qry, $params); - - return $result; - } } diff --git a/application/models/codex/Mobilitaetstyp_model.php b/application/models/codex/Mobilitaetstyp_model.php new file mode 100644 index 000000000..f93f588a0 --- /dev/null +++ b/application/models/codex/Mobilitaetstyp_model.php @@ -0,0 +1,14 @@ +dbTable = 'bis.tbl_mobilitaetstyp'; + $this->pk = 'mobilitaetstyp_kurzbz'; + } +} diff --git a/application/models/codex/Uhstat1daten_model.php b/application/models/codex/Uhstat1daten_model.php index 9bca44b58..899f037ef 100644 --- a/application/models/codex/Uhstat1daten_model.php +++ b/application/models/codex/Uhstat1daten_model.php @@ -11,4 +11,44 @@ class Uhstat1daten_model extends DB_Model $this->dbTable = 'bis.tbl_uhstat1daten'; $this->pk = 'uhstat1daten_id'; } + + /** + * Gets person data needed for sending as UHSTAT1 data. + * @param array $person_id_arr + * @param string $studiensemester + * @param array $status_kurzbz + * @return object success with prestudents or error + */ + public function getUHSTAT1PersonData($person_id_arr) + { + if (!isset($person_id_arr) || isEmptyArray($person_id_arr)) return success([]); + + $params = array($person_id_arr); + + $prstQry = "SELECT + DISTINCT ON (pers.person_id) + pers.person_id, uhstat_daten.uhstat1daten_id, pers.svnr, pers.ersatzkennzeichen, pers.geburtsnation, + uhstat_daten.mutter_geburtsstaat, uhstat_daten.mutter_bildungsstaat, uhstat_daten.mutter_geburtsjahr, + uhstat_daten.mutter_bildungmax, uhstat_daten.vater_geburtsstaat, uhstat_daten.vater_bildungsstaat, + uhstat_daten.vater_geburtsjahr, uhstat_daten.vater_bildungmax, + kzVbpkAs.inhalt AS \"vbpkAs\", kzVbpkBf.inhalt AS \"vbpkBf\" + FROM + public.tbl_person pers + JOIN public.tbl_prestudent ps USING (person_id) + JOIN public.tbl_studiengang stg USING (studiengang_kz) + JOIN bis.tbl_uhstat1daten uhstat_daten USING (person_id) + LEFT JOIN public.tbl_kennzeichen kzVbpkAs ON kzVbpkAs.kennzeichentyp_kurzbz = 'vbpkAs'AND kzVbpkAs.person_id = pers.person_id AND kzVbpkAs.aktiv + LEFT JOIN public.tbl_kennzeichen kzVbpkBf ON kzVbpkBf.kennzeichentyp_kurzbz = 'vbpkBf'AND kzVbpkBf.person_id = pers.person_id AND kzVbpkBf.aktiv + WHERE + ps.bismelden + AND stg.melderelevant + AND pers.person_id IN ? + ORDER BY + pers.person_id"; + + return $this->execReadOnlyQuery( + $prstQry, + $params + ); + } } diff --git a/application/models/crm/Akte_model.php b/application/models/crm/Akte_model.php index 57b6e0665..b945f414a 100644 --- a/application/models/crm/Akte_model.php +++ b/application/models/crm/Akte_model.php @@ -92,7 +92,7 @@ class Akte_model extends DB_Model a.anmerkung, a.nachgereicht, a.nachgereicht_am, - CASE WHEN MAX(dp.dokument_kurzbz) IS NOT NULL THEN TRUE ELSE FALSE END AS accepted + CASE WHEN MAX(dp.dokument_kurzbz) IS NOT NULL THEN TRUE ELSE FALSE END AS accepted, FROM public.tbl_akte a INNER JOIN public.tbl_prestudent p USING(person_id) LEFT JOIN public.tbl_dokumentprestudent dp USING(prestudent_id, dokument_kurzbz) @@ -111,6 +111,61 @@ class Akte_model extends DB_Model return $this->execQuery($query, $parametersArray); } + /** + * getAktenAccepted FAS + */ + public function getAktenFAS($person_id, $dokument_kurzbz = null, $stg_kz = null, $prestudent_id = null, $returnInhalt = false) + { + $query = 'SELECT + a.akte_id, + a.bezeichnung, + a.dokument_kurzbz, + a.titel_intern, + a.anmerkung_intern, + a.insertamum as hochgeladenamum, + a.updatevon, a.insertvon, a.uid, + a.dms_id, a.anmerkung as infotext, + a.nachgereicht, + CASE + WHEN inhalt IS NOT NULL OR a.dms_id IS NOT NULL + THEN true + ELSE false + END AS vorhanden, + a.nachgereicht_am, + ausstellungsnation, formal_geprueft_amum, archiv, + signiert, stud_selfservice, akzeptiertamum, inhalt + FROM public.tbl_akte a + WHERE a.person_id = ?'; + + $parametersArray = array($person_id); + + if (!isEmptyString($dokument_kurzbz)) + { + $query .= " AND dokument_kurzbz = ? + AND dokument_kurzbz NOT IN ('Zeugnis','DiplSupp','Bescheid')"; + array_push($parametersArray, $dokument_kurzbz); + } + + if($stg_kz != null && $prestudent_id != null) + { + $query.= " AND dokument_kurzbz not in ( + SELECT dokument_kurzbz + FROM public.tbl_dokument + JOIN public.tbl_dokumentstudiengang USING(dokument_kurzbz) + WHERE studiengang_kz= ? + AND dokument_kurzbz NOT IN( + SELECT dokument_kurzbz FROM public.tbl_dokumentprestudent + JOIN public.tbl_dokument USING(dokument_kurzbz) + WHERE prestudent_id=?))"; + array_push($parametersArray, $stg_kz); + array_push($parametersArray, $prestudent_id); + } + + $query .= ' ORDER BY erstelltam'; + + return $this->execQuery($query, $parametersArray); + } + /** * getAktenAcceptedDms */ @@ -195,9 +250,9 @@ class Akte_model extends DB_Model } /** - * Liefert die Archivdokumente einer Person + * Liefert die Archivdokumente einer Person/mehrerer Personen * - * @param integer $person_id + * @param integer/array $person_id * @param boolean|null $signiert Wenn true werden nur Dokumente geliefert die digital signiert wurden. * @param boolean|null $stud_selfservice Wenn true werden nur Dokumente geliefert die Studierende selbst herunterladen duerfen. * @@ -237,10 +292,15 @@ class Akte_model extends DB_Model if ($stud_selfservice !== null) $this->db->where('stud_selfservice', (boolean)$stud_selfservice); + if (is_array($person_id)) + $this->db->where_in('person_id', $person_id); + else + $this->db->where('person_id', $person_id); + $this->addOrder('erstelltam', 'DESC'); + $this->addOrder('akte_id', 'DESC'); return $this->loadWhere([ - 'person_id' => $person_id, 'archiv' => true ]); } diff --git a/application/models/crm/Dokument_model.php b/application/models/crm/Dokument_model.php index 7ef2be716..8008202c1 100644 --- a/application/models/crm/Dokument_model.php +++ b/application/models/crm/Dokument_model.php @@ -11,4 +11,91 @@ class Dokument_model extends DB_Model $this->dbTable = 'public.tbl_dokument'; $this->pk = 'dokument_kurzbz'; } + + /** + * Loads all missing Documents of a Studiengang + * a Prestudent has not submitted + * @param integer studiengang_kz + * @param integer prestudent_id + * @param boolean archivdokumente + * Default: true. + * If false, documents that are archivable (tbl_vorlage.archivierbar e.g. certificate, notice, ...) not retrieved + * @return Array of Documents || error + */ + public function getMissingDocuments($studiengang_kz, $prestudent_id = null, $archivdokumente = false, $person_id = null) + { + $parametersArray = array($studiengang_kz); + + $qry = "SELECT + tbl_dokument.* , + tbl_dokumentstudiengang.* + FROM public.tbl_dokument + JOIN public.tbl_dokumentstudiengang USING(dokument_kurzbz) + LEFT JOIN public.tbl_vorlage ON (tbl_dokument.dokument_kurzbz = tbl_vorlage.vorlage_kurzbz) + WHERE studiengang_kz = ? "; + + if($prestudent_id) + { + array_push($parametersArray, $prestudent_id); + $qry.=" AND tbl_dokument.dokument_kurzbz NOT IN ( + SELECT dokument_kurzbz FROM public.tbl_dokumentprestudent WHERE prestudent_id= ?)"; + } + + if(!$archivdokumente) + { + $qry.=" AND (tbl_vorlage.archivierbar = FALSE OR tbl_vorlage.archivierbar IS NULL)"; + } + + $qry.=" ORDER BY tbl_dokument.dokument_kurzbz;"; + + return $this->execQuery($qry, $parametersArray); + } + + public function getUnacceptedDocuments($prestudent_id, $person_id) + { + $parametersArray = array($person_id, $prestudent_id); + + $qry = " SELECT + a.akte_id, + a.bezeichnung, + a.dokument_kurzbz, + a.titel_intern, + a.anmerkung_intern, + a.insertamum as hochgeladenamum, + a.updatevon, + a.insertvon, + a.uid, + a.dms_id, + a.anmerkung as infotext, + a.nachgereicht, + CASE + WHEN inhalt IS NOT NULL + OR a.dms_id IS NOT NULL THEN true + ELSE false + END AS vorhanden, + a.nachgereicht_am, + ausstellungsnation, + formal_geprueft_amum, + archiv, + signiert, + stud_selfservice, + akzeptiertamum, + inhalt + FROM + public.tbl_akte a + WHERE + a.person_id = ? + AND a.dokument_kurzbz NOT IN ( + SELECT + dokument_kurzbz + FROM + public.tbl_dokumentprestudent + WHERE + prestudent_id = ? + ) + AND a.dokument_kurzbz NOT IN ('Zeugnis','DiplSupp','Bescheid') + ORDER BY a.dokument_kurzbz;"; + + return $this->execQuery($qry, $parametersArray); + } } diff --git a/application/models/crm/Dokumentprestudent_model.php b/application/models/crm/Dokumentprestudent_model.php index 0a6669359..6b1c222a8 100644 --- a/application/models/crm/Dokumentprestudent_model.php +++ b/application/models/crm/Dokumentprestudent_model.php @@ -69,4 +69,41 @@ class Dokumentprestudent_model extends DB_Model return $result; } + + /** + * Loads all Documents of Prestudent, already submitted + * @param integer prestudent_id + * @param boolean archivdokumente Default true. if false, archivable Documents (tbl_vorlage.archivierbar zB Zeugnis, Bescheid, ...) not retrieved + * @return Array of Documents || error + */ + public function getPrestudentDokumente($prestudent_id, $archivdokumente = true) + { + $parametersArray = array($prestudent_id); + + $qry = "SELECT + d.bezeichnung, + d.dokument_kurzbz, + dp.datum as Docdatum, + dp.mitarbeiter_uid as DocMitarbeiter_uid, + dp.insertamum as Docinsertamum, + dp.prestudent_id, + CONCAT(p.vorname, ' ', p.nachname) as insertvonma + FROM + public.tbl_dokumentprestudent dp + JOIN public.tbl_dokument d USING(dokument_kurzbz) + LEFT JOIN public.tbl_vorlage v ON (d.dokument_kurzbz = v.vorlage_kurzbz) + LEFT JOIN public.tbl_benutzer bn ON (bn.uid = dp.mitarbeiter_uid) + LEFT JOIN public.tbl_person p ON (p.person_id = bn.person_id) + WHERE + prestudent_id = ?"; + + if(!$archivdokumente) + { + $qry.=" AND (v.archivierbar = FALSE OR v.archivierbar IS NULL)"; + } + + $qry.=" ORDER BY d.bezeichnung ASC"; + + return $this->execQuery($qry, $parametersArray); + } } diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php index 242c26518..ad5c3e141 100644 --- a/application/models/crm/Prestudent_model.php +++ b/application/models/crm/Prestudent_model.php @@ -1,5 +1,7 @@ execQuery($query, array($person, $studiengang, $studienSemester)); } + public function getByPersonWithoutLehrgang($person, $studienSemester) + { + $query = "SELECT DISTINCT(ps.prestudent_id) + FROM public.tbl_prestudentstatus pss + JOIN public.tbl_prestudent ps USING(prestudent_id) + JOIN public.tbl_studiengang sg USING(studiengang_kz) + JOIN lehre.tbl_studienplan sp USING(studienplan_id) + JOIN lehre.tbl_studienordnung so USING(studienordnung_id) + WHERE ps.person_id = ? + AND (sg.typ = 'b' OR sg.typ = 'm') + AND pss.studiensemester_kurzbz = ?"; + + return $this->execQuery($query, array($person, $studienSemester)); + } + + /** * Gets förderrelevant flag for a prestudent, from prestudent, or, if not set on prestudent level, from studiengang * @param int $prestudent_id @@ -762,4 +784,118 @@ class Prestudent_model extends DB_Model return $this->execQuery($query, array($person_id)); } + + /** + * Adds a filter to the query builder + * + * @param array $filter + * @return boolean + */ + public function addFilter($filter) + { + if (!isset($filter['type'])) + return false; + + switch ($filter['type']) { + case 'konto': + $bt = ''; + $stdsem = ''; + $comp = '!='; + + if (isset($filter['buchungstyp_kurzbz']) && $filter['buchungstyp_kurzbz'] != 'all') + $bt = ' AND buchungstyp_kurzbz=' . $this->escape($filter['buchungstyp_kurzbz']); + + if (isset($filter['studiensemester_kurzbz'])) + $stdsem = ' AND studiensemester_kurzbz=' . $this->escape($filter['studiensemester_kurzbz']); + + if (isset($filter['missing']) && $filter['missing']) { + $comp = '='; + $this->db->where('get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) !=', 'Incoming'); + } + + $this->db->where('( + SELECT count(*) + FROM public.tbl_konto + WHERE person_id=tbl_prestudent.person_id + ' . $bt . ' + ' . $stdsem . ' + ) ' . $comp, 0); + break; + + case 'konto_counter': + $bt = ''; + $samestg = ''; + $past = ''; + + if (isset($filter['buchungstyp_kurzbz']) && $filter['buchungstyp_kurzbz'] != 'all') + $bt = ' AND buchungstyp_kurzbz = ' . $this->escape($filter['buchungstyp_kurzbz']); + + if (isset($filter['samestg']) && $filter['samestg']) + $samestg = ' AND studiengang_kz = tbl_prestudent.studiengang_kz'; + + if (isset($filter['past']) && $filter['past']) + $past = ' AND buchungsdatum < NOW()'; + + $this->db->where('( + SELECT sum(betrag) + FROM public.tbl_konto + WHERE person_id = tbl_prestudent.person_id + ' . $bt . ' + ' . $samestg . ' + ' . $past . ' + ) !=', 0); + break; + + case 'zgv': + $this->db + ->group_start() + ->group_start() + ->where('zgv_code IS NOT NULL') + ->where('zgvdatum IS NULL') + ->group_end() + ->or_group_start() + ->where('zgvmas_code IS NOT NULL') + ->where('zgvmadatum IS NULL') + ->group_end() + ->or_group_start() + ->where('zgvdoktor_code IS NOT NULL') + ->where('zgvdoktordatum IS NULL') + ->group_end() + ->group_end(); + break; + + case 'documents': + $this->db->where('( + SELECT count(*) + FROM public.tbl_dokumentstudiengang + WHERE dokument_kurzbz NOT IN ( + SELECT dokument_kurzbz + FROM tbl_dokumentprestudent + WHERE prestudent_id=tbl_prestudent.prestudent_id + ) + AND studiengang_kz=tbl_prestudent.studiengang_kz + ) !=', 0); + break; + + case 'statusgrund': + if (!isset($filter['statusgrund_id'])) + return false; + + if (isset($filter['studiensemester_kurzbz'])) + $stdsem = ' AND studiensemester_kurzbz=' . $this->escape($filter['studiensemester_kurzbz']); + + $this->db->where('( + SELECT count(*) + FROM public.tbl_prestudentstatus + WHERE prestudent_id = tbl_prestudent.prestudent_id + AND statusgrund_id = ' . $this->escape($filter['statusgrund_id']) . ' + ' . $stdsem . ' + ) !=', 0); + break; + } + + Events::trigger('prestudent_add_filter', $filter); + + return true; + } } diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php index de91319b9..c0ed8595e 100644 --- a/application/models/crm/Prestudentstatus_model.php +++ b/application/models/crm/Prestudentstatus_model.php @@ -290,7 +290,11 @@ class Prestudentstatus_model extends DB_Model */ public function getLastStatusPerson($person_id, $studiensemester_kurzbz = null) { - $query = 'SELECT * + $query = 'SELECT p.*, ps.*, s.*, + stg.kurzbz AS studiengang_kurzbz, stg.kurzbzlang AS studiengang_kurzbzlang, + UPPER(typ::varchar(1) || kurzbz) AS studiengang_kuerzel, + stg.typ AS studiengang_typ, stg.bezeichnung AS studiengang_bezeichnung, stg.english AS studiengang_bezeichnung_english, + stg.orgform_kurzbz AS studiengang_orgform FROM public.tbl_prestudent p JOIN ( SELECT DISTINCT ON(prestudent_id) * @@ -298,7 +302,8 @@ class Prestudentstatus_model extends DB_Model WHERE prestudent_id IN (SELECT prestudent_id FROM public.tbl_prestudent WHERE person_id = ?) ORDER BY prestudent_id, datum desc, insertamum desc ) ps USING(prestudent_id) - JOIN public.tbl_status USING(status_kurzbz)'; + JOIN public.tbl_status s USING(status_kurzbz) + JOIN public.tbl_studiengang stg USING (studiengang_kz)'; $parametersArray = array($person_id); diff --git a/application/models/crm/Reihungstest_model.php b/application/models/crm/Reihungstest_model.php index 86ebfd0af..a685b01cd 100644 --- a/application/models/crm/Reihungstest_model.php +++ b/application/models/crm/Reihungstest_model.php @@ -511,4 +511,250 @@ class Reihungstest_model extends DB_Model return $this->execQuery($query, array($date, $studiengang_kz)); } -} \ No newline at end of file + + /** + * Loads all placement tests of a given person + * @param integer $person_id + * @return array Returns object array with data of placement tests + */ + public function getReihungstestPerson($person_id) + { + $query = ' + SELECT + tbl_rt_person.*, + tbl_reihungstest.studiengang_kz, + tbl_reihungstest.anmerkung, + tbl_reihungstest.datum, + tbl_reihungstest.uhrzeit, + tbl_reihungstest.ext_id, + tbl_reihungstest.max_teilnehmer, + tbl_reihungstest.oeffentlich, + tbl_reihungstest.freigeschaltet, + tbl_reihungstest.studiensemester_kurzbz as studiensemester, + tbl_reihungstest.stufe, + tbl_reihungstest.anmeldefrist, + tbl_reihungstest.aufnahmegruppe_kurzbz, + tbl_studiengang.typ, + UPPER(typ::varchar(1) || kurzbz) AS stg_kuerzel, + so.studiengangbezeichnung, + so.studiengangbezeichnung_englisch, + so.studiengangkurzbzlang + FROM + public.tbl_rt_person + JOIN public.tbl_reihungstest ON (rt_id=reihungstest_id) + JOIN public.tbl_studiengang ON tbl_reihungstest.studiengang_kz = tbl_studiengang.studiengang_kz + JOIN lehre.tbl_studienplan sp USING(studienplan_id) + JOIN lehre.tbl_studienordnung so USING(studienordnung_id) + WHERE + tbl_rt_person.person_id = ? + ORDER BY datum, uhrzeit ASC'; + + return $this->execQuery($query, array($person_id)); + } + + /** + * Calculates Result of Placement Test for a given Person and given placementtest + * and with taking account of weighting per area + * + * @param $person_id ID of Person + * @param $punkte if true result is points else result is percentage of sum + * @param $reihungstest_id ID of Placementtest + * @param $weightedArray array of weighting per area (gewicht per gebiet_id) + * @return float result + */ + public function getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray = null) + { + $parametersArray = array($reihungstest_id); + + $qry = " + SELECT DISTINCT ON (vw_auswertung_ablauf.gebiet_id) gebiet_id, + vw_auswertung_ablauf.*, + tbl_studiengang.typ + FROM + testtool.vw_auswertung_ablauf + JOIN + public.tbl_studiengang USING (studiengang_kz) + WHERE + reihungstest_id = ? "; + + //using prestudent Status to avoid to get the sum of more than 1 placement tests + $qry .= " + AND prestudent_id = ( + SELECT + prestudent_id + FROM + public.tbl_rt_person + JOIN + public.tbl_prestudent USING(person_id) + JOIN + public.tbl_prestudentstatus USING (prestudent_id, studienplan_id) + JOIN + tbl_reihungstest ON ( + tbl_rt_person.rt_id = tbl_reihungstest.reihungstest_id + ) + WHERE + tbl_rt_person.person_id = ? + AND + tbl_rt_person.rt_id = ? + AND + tbl_prestudentstatus.status_kurzbz = 'Interessent' + AND + tbl_prestudentstatus.studiensemester_kurzbz = tbl_reihungstest.studiensemester_kurzbz + ORDER BY tbl_reihungstest.datum DESC, tbl_prestudent.priorisierung ASC LIMIT 1 + ) + "; + array_push($parametersArray, $person_id); + array_push($parametersArray, $reihungstest_id); + + $resultRtPerson = $this->execQuery($qry, $parametersArray); + + $ergebnis = 0; + $summeGewicht = 0; + + foreach ($resultRtPerson->retval as $row) + { + $prozent = 0; + if($row->punkte>=$row->maxpunkte) + { + $prozent = 100; + $row->punkte = $row->maxpunkte; + } + else + $prozent = (($row->punkte + $row->offsetpunkte)/($row->maxpunkte + $row->offsetpunkte))*100; + + if($punkte == 'true') + { + if($row->punkte) + { + $ergebnis += $row->punkte; + } + } + else + { + if ($row->punkte) + { + $gew = isset($weightedArray[$row->gebiet_id]) ? $weightedArray[$row->gebiet_id] : 1; + $ergebnis += $prozent * $gew; + $summeGewicht += $gew; + } + } + } + $return = $summeGewicht > 0 + ? number_format($ergebnis/$summeGewicht, 4, '.', '') + : number_format($ergebnis, 4, '.', ''); + + return $return; + } + + /** + * returns Reihungstests for given studyplans and include_ids + * + * @param Array $studienplan_arr array of studienplaene + * @param Array $include_ids array of include_ids + * @return Array List of Reihungstests + */ + public function getReihungstestByStudyPlanAndIds($studienplan_arr, $include_ids = null) + { + $studienplan_ids_string = implode(',', $studienplan_arr); + $studienplan_arr = explode(',', $studienplan_ids_string); + + $parametersArray = array($studienplan_arr); + + $qry = " + SELECT + distinct a.*, + CASE EXTRACT(DOW FROM a.datum) + WHEN 0 THEN 'So' + WHEN 1 THEN 'Mo' + WHEN 2 THEN 'Di' + WHEN 3 THEN 'Mi' + WHEN 4 THEN 'Do' + WHEN 5 THEN 'Fr' + WHEN 6 THEN 'Sa' + END AS wochentag, + sg.kurzbzlang as stg, + ( + SELECT count(*) FROM public.tbl_rt_person + WHERE rt_id = a.reihungstest_id + ) as angemeldete_teilnehmer + FROM + public.tbl_reihungstest a + JOIN public.tbl_rt_studienplan USING(reihungstest_id) + JOIN public.tbl_studiengang sg USING(studiengang_kz) + WHERE studienplan_id IN ?"; + + if($include_ids && is_array($include_ids) && count($include_ids) > 0) + { + $include_ids_string = implode(',', $include_ids); + $include_ids = explode(',', $include_ids_string); + + array_push($parametersArray, $include_ids); + + $qry .= "OR reihungstest_id in ?"; + } + $qry .= "ORDER BY a.datum DESC"; + + return $this->execQuery($qry, $parametersArray); + } + /** + * returns Reihungstests for given studyplans and include_ids + * + * @param Integer $studiengang_kz + * @param $include_id optional (here null) + * @return Array List of Reihungstests + */ + public function getZukuenftigeReihungstestStg($studiengang_kz, $include_id = null) + { + $parametersArray = array($studiengang_kz, $studiengang_kz, $include_id); + + $qry = " + SELECT *, + CASE EXTRACT(DOW FROM a.datum) + WHEN 0 THEN 'So' + WHEN 1 THEN 'Mo' + WHEN 2 THEN 'Di' + WHEN 3 THEN 'Mi' + WHEN 4 THEN 'Do' + WHEN 5 THEN 'Fr' + WHEN 6 THEN 'Sa' + END AS wochentag, + ( + SELECT count(*) FROM public.tbl_prestudent + WHERE reihungstest_id=a.reihungstest_id + ) as angemeldete_teilnehmer + FROM + ( + SELECT *, '1' as sortierung, + ( + SELECT upper(typ || kurzbz) FROM public.tbl_studiengang + WHERE studiengang_kz=tbl_reihungstest.studiengang_kz + ) as stg + FROM + public.tbl_reihungstest + WHERE + datum>=now()-'1 days'::interval AND studiengang_kz=? + UNION + SELECT *, '2' as sortierung, + ( + SELECT upper(typ || kurzbz) FROM public.tbl_studiengang + WHERE studiengang_kz=tbl_reihungstest.studiengang_kz + ) as stg + FROM + public.tbl_reihungstest + WHERE datum>=now()-'1 days'::interval AND studiengang_kz!=? + UNION + SELECT *, '0' as sortierung, + ( + SELECT upper(typ || kurzbz) FROM public.tbl_studiengang + WHERE studiengang_kz=tbl_reihungstest.studiengang_kz + ) as stg + FROM + public.tbl_reihungstest + WHERE reihungstest_id=? + ORDER BY sortierung, stg, datum + ) a + "; + + return $this->execQuery($qry, $parametersArray); + } +} diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php index 539c3cf56..ab073996f 100644 --- a/application/models/crm/Student_model.php +++ b/application/models/crm/Student_model.php @@ -27,7 +27,7 @@ class Student_model extends DB_Model $this->addSelect('1'); $result = $this->loadWhere(array('student_uid' => $uid)); - + if(hasData($result)) { @@ -169,7 +169,7 @@ class Student_model extends DB_Model $max = 0; if ($matrikelnrres && hasData($matrikelnrres)) { - $max = mb_substr($matrikelnrres->retval[0]->matrikelnr, 7); + $max = mb_substr(trim(getData($matrikelnrres)[0]->matrikelnr), -3); if (!is_numeric($max)) { $max = (int)$max; } @@ -279,4 +279,12 @@ class Student_model extends DB_Model { return $student_uid . '@' . DOMAIN; } + + public function getEmailAnredeForStudentUID($student_uid) { + $qry = "SELECT anrede, titelpre, vorname, vornamen, nachname, titelpost + FROM campus.vw_student + WHERE uid = ?"; + + return $this->execReadOnlyQuery($qry, array($student_uid)); + } } diff --git a/application/models/education/Abgabe_model.php b/application/models/education/Abgabe_model.php index c68bc55f4..5a18c4fe3 100644 --- a/application/models/education/Abgabe_model.php +++ b/application/models/education/Abgabe_model.php @@ -11,4 +11,5 @@ class Abgabe_model extends DB_Model $this->dbTable = 'campus.tbl_abgabe'; $this->pk = 'abgabe_id'; } + } diff --git a/application/models/education/Anrechnung_model.php b/application/models/education/Anrechnung_model.php index cbfdb6607..0b81be80c 100644 --- a/application/models/education/Anrechnung_model.php +++ b/application/models/education/Anrechnung_model.php @@ -202,4 +202,66 @@ class Anrechnung_model extends DB_Model return success(); } + + /** + * Get Anrechnungsdata for Table Anrechnungen + * + * @param $prestudent_id + * @return array + */ + public function getAnrechnungsData($prestudent_id) + { + $qry = ' + SELECT + lehre.tbl_anrechnung.anrechnung_id, + lehre.tbl_anrechnung.prestudent_id, + lehre.tbl_anrechnung.lehrveranstaltung_id, + lehre.tbl_lehrveranstaltung.bezeichnung AS bez_lehrveranstaltung, + lehre.tbl_anrechnung_begruendung.bezeichnung AS begruendung, + lehre.tbl_anrechnung_anrechnungstatus.status_kurzbz AS status, + genehmigt_von, + lehre.tbl_anrechnung.insertamum, + lehre.tbl_anrechnung.insertvon, + lehre.tbl_anrechnung.updateamum, + lehre.tbl_anrechnung.updatevon, + lehrveranstaltung_id_kompatibel, + lv_comp.bezeichnung as lehrveranstaltung_bez_kompatibel, + count(nz.notizzuordnung_id) AS notizen_anzahl + FROM + lehre.tbl_anrechnung + JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) + LEFT JOIN lehre.tbl_lehrveranstaltung lv_comp ON (lehre.tbl_anrechnung.lehrveranstaltung_id_kompatibel = lv_comp.lehrveranstaltung_id) + JOIN lehre.tbl_anrechnung_begruendung USING (begruendung_id) + LEFT JOIN lehre.tbl_anrechnung_anrechnungstatus ON (lehre.tbl_anrechnung_anrechnungstatus.anrechnung_id = lehre.tbl_anrechnung.anrechnung_id) + AND lehre.tbl_anrechnung_anrechnungstatus.insertamum = ( + SELECT MAX(insertamum) + FROM lehre.tbl_anrechnung_anrechnungstatus + WHERE anrechnung_id = lehre.tbl_anrechnung.anrechnung_id + ) + LEFT JOIN lehre.tbl_anrechnungstatus USING (status_kurzbz) + LEFT JOIN public.tbl_notizzuordnung nz ON (nz.anrechnung_id = lehre.tbl_anrechnung.anrechnung_id) + WHERE + lehre.tbl_anrechnung.prestudent_id = ? + GROUP BY + nz.anrechnung_id, + lehre.tbl_anrechnung.anrechnung_id, + lehre.tbl_anrechnung.prestudent_id, + lehre.tbl_anrechnung.lehrveranstaltung_id, + bez_lehrveranstaltung, + begruendung, + status, + genehmigt_von, + lehre.tbl_anrechnung.insertamum, + lehre.tbl_anrechnung.insertvon, + lehre.tbl_anrechnung.updateamum, + lehre.tbl_anrechnung.updatevon, + lehrveranstaltung_id_kompatibel, + lehrveranstaltung_bez_kompatibel + ORDER BY + lehre.tbl_anrechnung.updateamum ASC + '; + + return $this->execQuery($qry, array($prestudent_id)); + + } } diff --git a/application/models/education/Anrechnunganrechnungstatus_model.php b/application/models/education/Anrechnunganrechnungstatus_model.php new file mode 100644 index 000000000..68b319506 --- /dev/null +++ b/application/models/education/Anrechnunganrechnungstatus_model.php @@ -0,0 +1,14 @@ +dbTable = 'lehre.tbl_anrechnung_anrechnungstatus'; + $this->pk = 'anrechnungstatus_id'; + } +} diff --git a/application/models/education/Lehreinheit_model.php b/application/models/education/Lehreinheit_model.php index d4bc7a22f..2f955c295 100644 --- a/application/models/education/Lehreinheit_model.php +++ b/application/models/education/Lehreinheit_model.php @@ -1,4 +1,6 @@ load->model('education/lehreinheitgruppe_model', 'LehreinheitgruppeModel'); $this->load->model('education/lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); $this->load->model('organisation/studiengang_model', 'StudiengangModel'); + $this->load->model('ressource/stundenplandev_model', 'StundenplandevModel'); + $this->load->model('ressource/stundenplan_model', 'StundenplanModel'); + $this->load->model('system/Log_model', 'LogModel'); } /** @@ -28,6 +33,11 @@ class Lehreinheit_model extends DB_Model { $lehreinheiten = array(); + $this->addSelect( + 'lehreinheit_id, lehrveranstaltung_id, studiensemester_kurzbz, lehrform_kurzbz, + stundenblockung, wochenrythmus, start_kw, raumtyp, raumtypalternativ, + sprache, lehre, unr, lvnr, lehrfach_id, gewicht' + ); $this->addOrder('lehreinheit_id'); $les = $this->loadWhere( array('lehrveranstaltung_id' => $lehrveranstaltung_id, @@ -303,4 +313,430 @@ EOSQL; return $this->execQuery($query, $params); } + + + public function getOes($lehreinheit_id) + { + $this->addSelect('tbl_lehrveranstaltung.studiengang_kz, + tbl_lehrveranstaltung.lehrveranstaltung_id'); + $this->addJoin('lehre.tbl_lehrveranstaltung', 'tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_lehreinheit.lehrveranstaltung_id'); + $result = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); + + if (isError($result)) return $result; + + if (hasData($result)) + { + $lehrveranstaltung = getData($result)[0]; + $oe_result = $this->LehrveranstaltungModel->getAllOe($lehrveranstaltung->lehrveranstaltung_id); + return success(hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array('')); + } + } + + public function getLehrfachOe($lehreinheit_id) + { + $this->addSelect('lehrfach.oe_kurzbz'); + $this->addJoin('lehre.tbl_lehrveranstaltung lehrfach', 'lehrfach.lehrveranstaltung_id = tbl_lehreinheit.lehrfach_id', 'LEFT'); + return $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); + } + + + public function getByLvidStudiensemester($lv_id, $studiensemester_kurzbz, $mitarbeiter_uid = null, $fachbereich_kurzbz = null) + { + $qry = "WITH lehreinheiten AS ( + SELECT * + FROM lehre.tbl_lehreinheit + WHERE lehrveranstaltung_id = ? + AND studiensemester_kurzbz = ? + ), + ". $this->_getGruppenCTE() . ", + ". $this->_getLektorenCTE() . ", + ". $this->_getFachbereichCTE() . ", + ". $this->_getTagsCTE() . " + + SELECT lehreinheiten.*, + lehreinheiten.lehrform_kurzbz as lv_lehrform_kurzbz, + tbl_lehrveranstaltung.kurzbz as lv_kurzbz, + tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, + COALESCE(tag_data_agg.tags, '[]'::json) AS tags, + gruppen.gruppen, + mitarbeiter.lektoren, + mitarbeiter.le_planstunden, + mitarbeiter.vorname, + mitarbeiter.nachname, + mitarbeiter.semesterstunden, + fachbereich.bezeichnung as fachbereich, + UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang, + semester + FROM lehreinheiten + LEFT JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = lehreinheiten.lehrfach_id + LEFT JOIN public.tbl_studiengang USING(studiengang_kz) + LEFT JOIN tag_data_agg ON tag_data_agg.lehreinheit_id = lehreinheiten.lehreinheit_id + LEFT JOIN mitarbeiter ON lehreinheiten.lehreinheit_id = mitarbeiter.lehreinheit_id + LEFT JOIN fachbereich ON lehreinheiten.lehreinheit_id = fachbereich.lehreinheit_id + LEFT JOIN gruppen ON lehreinheiten.lehreinheit_id = gruppen.lehreinheit_id + WHERE true + "; + + $params = array($lv_id, $studiensemester_kurzbz); + + if ($mitarbeiter_uid !== null) + { + $qry .= " AND lehreinheiten.lehreinheit_id IN ( SELECT lehreinheit_id FROM lehre.tbl_lehreinheitmitarbeiter WHERE mitarbeiter_uid = ?) "; + $params[] = $mitarbeiter_uid; + } + + if($fachbereich_kurzbz !== null) + { + $qry .= " AND EXISTS ( SELECT 1 FROM lehre.tbl_lehrveranstaltung JOIN public.tbl_fachbereich USING(oe_kurzbz) WHERE fachbereich_kurzbz= ? AND lehrveranstaltung_id=lehreinheiten.lehrfach_id)"; + $params[] = $fachbereich_kurzbz; + } + $qry .= " ORDER BY lehrveranstaltung_id;"; + + return $this->execReadOnlyQuery($qry, $params); + } + + private function getLVTmp($stg_kz = null) + { + $qry = "SELECT DISTINCT ON(lehrveranstaltung_id) *, + '' as stundenblockung, + '' as lehreinheit_id, + '' as wochenrythmus, + '' as raumtyp, + '' as raumtypalternativ, + '' as gruppen, + '' as studienplan_id, + '' as studienplan_beeichnung, + UPPER(CONCAT(vw_lehreinheit.stg_typ, vw_lehreinheit.stg_kurzbz)) as studiengang + FROM campus.vw_lehreinheit + WHERE mitarbeiter_uid = ? + AND studiensemester_kurzbz = ?"; + + if (!is_null($stg_kz)) { + $qry .= " AND lv_studiengang_kz = ?"; + } + + return $qry; + } + + public function getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz = null) + { + $qry = "WITH lvs AS (" . $this->getLVTmp($stg_kz) . ") + SELECT lvs.* + FROM lvs + "; + + $params = array($mitarbeiter_uid, $studiensemester_kurzbz); + if (!is_null($stg_kz)) + { + $params[] = $stg_kz; + } + return $this->execReadOnlyQuery($qry, $params); + } + + public function deleteLehreinheit($lehreinheit_id) + { + $lehreinheit = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); + + if (isError($lehreinheit)) return $lehreinheit; + + if (!hasData($lehreinheit)) + return error("Lehreinheit not found!"); + + $errorReasons = []; + $addError = function ($reason = null) use (&$errorReasons) + { + if ($reason !== null) + { + $errorReasons[] = $reason; + } + }; + + $stundenplandev_result = $this->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); + $stundenplan_result = $this->StundenplanModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); + + if (hasData($stundenplan_result) || hasData($stundenplandev_result)) + $addError('Dieser LV-Teil ist bereits im LV-Plan verplant und kann daher nicht geloescht werden!'); + + Events::trigger( + 'lehreinheit_delete_check', + $addError, + $lehreinheit_id + ); + + if (!empty($errorReasons)) return error($errorReasons); + + $this->db->trans_begin(); + + Events::trigger( + 'lehreinheit_delete', + $addError, + $lehreinheit_id + ); + + $undosql = ''; + + $lehreinheit_gruppe_result = $this->LehreinheitgruppeModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); + if (hasData($lehreinheit_gruppe_result)) + { + foreach (getData($lehreinheit_gruppe_result) as $row) + { + $values = [ + $this->db->escape($row->lehreinheitgruppe_id), + $this->db->escape($row->lehreinheit_id), + $this->db->escape($row->studiengang_kz), + $this->db->escape($row->semester), + $this->db->escape($row->verband), + $this->db->escape($row->gruppe), + $this->db->escape($row->gruppe_kurzbz), + $this->db->escape($row->updateamum), + $this->db->escape($row->updatevon), + $this->db->escape($row->insertamum), + $this->db->escape($row->insertvon) + ]; + + $undosql .= "INSERT INTO lehre.tbl_lehreinheitgruppe ( + lehreinheitgruppe_id, + lehreinheit_id, + studiengang_kz, + semester, + verband, + gruppe, + gruppe_kurzbz, + updateamum, + updatevon, + insertamum, + insertvon + ) VALUES (" . implode(', ', $values) . ");\n"; + } + + $lehreinheit_gruppe_delete_result = $this->LehreinheitgruppeModel->delete(array('lehreinheit_id' => $lehreinheit_id)); + + if (isError($lehreinheit_gruppe_delete_result)) + $addError(getError($lehreinheit_gruppe_delete_result)); + } + + $lehreinheit_mitarbeiter_result = $this->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); + if (hasData($lehreinheit_mitarbeiter_result)) + { + foreach (getData($lehreinheit_mitarbeiter_result) as $row) + { + $values = [ + $this->db->escape($row->lehreinheit_id), + $this->db->escape($row->mitarbeiter_uid), + $this->db->escape($row->lehrfunktion_kurzbz), + $this->db->escape($row->planstunden), + $this->db->escape($row->stundensatz), + $this->db->escape($row->faktor), + $this->db->escape($row->anmerkung), + $this->db->escape($row->bismelden), + $this->db->escape($row->updateamum), + $this->db->escape($row->updatevon), + $this->db->escape($row->insertamum), + $this->db->escape($row->insertvon), + $this->db->escape($row->semesterstunden) + ]; + + $undosql .= "INSERT INTO lehre.tbl_lehreinheitmitarbeiter ( + lehreinheit_id, + mitarbeiter_uid, + lehrfunktion_kurzbz, + planstunden, + stundensatz, + faktor, + anmerkung, + bismelden, + updateamum, + updatevon, + insertamum, + insertvon, + semesterstunden + ) VALUES (" . implode(', ', $values) . ");\n"; + } + + $lehreinheit_mitarbeiter_delete_result = $this->LehreinheitmitarbeiterModel->delete(array('lehreinheit_id' => $lehreinheit_id)); + if (isError($lehreinheit_mitarbeiter_delete_result)) + $addError(getError($lehreinheit_mitarbeiter_delete_result)); + } + + foreach (getData($lehreinheit) as $row) + { + $values = [ + $this->db->escape($row->lehreinheit_id), + $this->db->escape($row->lehrveranstaltung_id), + $this->db->escape($row->studiensemester_kurzbz), + $this->db->escape($row->lehrfach_id), + $this->db->escape($row->lehrform_kurzbz), + $this->db->escape($row->stundenblockung), + $this->db->escape($row->wochenrythmus), + $this->db->escape($row->start_kw), + $this->db->escape($row->raumtyp), + $this->db->escape($row->raumtypalternativ), + $this->db->escape($row->sprache), + $this->db->escape($row->lehre), + $this->db->escape($row->anmerkung), + $this->db->escape($row->unr), + $this->db->escape($row->lvnr), + $this->db->escape($row->updateamum), + $this->db->escape($row->updatevon), + $this->db->escape($row->insertamum), + $this->db->escape($row->insertvon), + ]; + + $undosql .= "INSERT INTO lehre.tbl_lehreinheit ( + lehreinheit_id, + lehrveranstaltung_id, + studiensemester_kurzbz, + lehrfach_id, + lehrform_kurzbz, + stundenblockung, + wochenrythmus, + start_kw, + raumtyp, + raumtypalternativ, + sprache, + lehre, + anmerkung, + unr, + lvnr, + updateamum, + updatevon, + insertamum, + insertvon + ) VALUES (" . implode(', ', $values) . ");\n"; + } + $lehreinheit_result = $this->delete($lehreinheit_id); + + $deleteSql = "DELETE FROM lehre.tbl_lehreinheitmitarbeiter WHERE lehreinheit_id = " . $this->db->escape($lehreinheit_id) ."; \n + DELETE FROM lehre.tbl_lehreinheitgruppe WHERE lehreinheit_id = " . $this->db->escape($lehreinheit_id) ."; \n + DELETE FROM lehre.tbl_lehreinheit WHERE lehreinheit_id = " . $this->db->escape($lehreinheit_id) .";"; + if (isError($lehreinheit_result)) + $addError($lehreinheit_result); + + $log_result = $this->LogModel->insert([ + 'sql' => $deleteSql, + 'sqlundo' => $undosql, + 'beschreibung' => 'Lehreinheit loeschen - ' . $lehreinheit_id, + 'mitarbeiter_uid' => getAuthUID(), + ]); + + if (isError($log_result)) + $addError($log_result); + + if (!empty($errorReasons)) + { + $this->db->trans_rollback(); + return error($errorReasons); + } + + $this->db->trans_commit(); + return success('Contract successfully updated.'); + } + + private function _getGruppenCTE() + { + return "gruppen AS ( + SELECT + lehreinheit_id, + STRING_AGG( + CASE + WHEN (tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL OR tbl_lehreinheitgruppe.gruppe_kurzbz = '') + THEN + UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) || + COALESCE(TRIM(tbl_lehreinheitgruppe.semester::text), '') || + COALESCE(TRIM(tbl_lehreinheitgruppe.verband), '') || + COALESCE(TRIM(tbl_lehreinheitgruppe.gruppe), '') + ELSE + CASE + WHEN NOT tbl_gruppe.direktinskription THEN tbl_lehreinheitgruppe.gruppe_kurzbz + ELSE NULL + END + END, + ' ' + ORDER BY + UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz), + COALESCE(TRIM(tbl_lehreinheitgruppe.semester::text), ''), + COALESCE(TRIM(tbl_lehreinheitgruppe.verband), ''), + COALESCE(TRIM(tbl_lehreinheitgruppe.gruppe), ''), + COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, '') + ) AS gruppen + FROM lehre.tbl_lehreinheitgruppe + LEFT JOIN public.tbl_studiengang USING (studiengang_kz) + LEFT JOIN public.tbl_gruppe USING (gruppe_kurzbz) + JOIN lehreinheiten USING(lehreinheit_id) + GROUP BY lehreinheit_id + )"; + } + private function _getLektorenCTE() + { + return "mitarbeiter AS ( + SELECT + tbl_lehreinheitmitarbeiter.lehreinheit_id, + STRING_AGG(m.kurzbz, ' ') AS lektoren, + STRING_AGG(tbl_person.vorname, ' ') AS vorname, + STRING_AGG(tbl_person.nachname, ' ') AS nachname, + STRING_AGG(tbl_lehreinheitmitarbeiter.semesterstunden::text, ' ') AS semesterstunden, + STRING_AGG(tbl_lehreinheitmitarbeiter.planstunden::text, ' ') AS le_planstunden + FROM lehre.tbl_lehreinheitmitarbeiter + JOIN public.tbl_mitarbeiter m USING (mitarbeiter_uid) + JOIN lehreinheiten USING(lehreinheit_id) + JOIN public.tbl_benutzer ON mitarbeiter_uid = uid + JOIN public.tbl_person ON tbl_benutzer.person_id = tbl_person.person_id + GROUP BY tbl_lehreinheitmitarbeiter.lehreinheit_id + )"; + } + + private function _getFachbereichCTE() + { + return "fachbereich AS ( + SELECT + CONCAT(tbl_organisationseinheit.bezeichnung, ' (', tbl_organisationseinheit.organisationseinheittyp_kurzbz, ')') as bezeichnung, + lehreinheiten.lehreinheit_id + FROM public.tbl_organisationseinheit + JOIN lehre.tbl_lehrveranstaltung AS lehrfach ON tbl_organisationseinheit.oe_kurzbz = lehrfach.oe_kurzbz + JOIN lehre.tbl_lehreinheit ON lehrfach.lehrveranstaltung_id = tbl_lehreinheit.lehrfach_id + JOIN lehreinheiten ON tbl_lehreinheit.lehreinheit_id = lehreinheiten.lehreinheit_id + )"; + } + + private function _getTagsCTE() + { + $this->load->config('lvverwaltung'); + $tags = $this->config->item('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 tbl_notiz_typ.typ_kurzbz IN (" . implode(",", $tags) . ")"; + } + + return "tag_data_agg AS ( + SELECT + lehreinheit_id, + COALESCE(json_agg(tag ORDER BY done), '[]'::json) AS tags + FROM ( + SELECT DISTINCT ON (public.tbl_notiz.notiz_id) + tbl_notiz.notiz_id AS id, + typ_kurzbz, + array_to_json(tbl_notiz_typ.bezeichnung_mehrsprachig)->>0 AS beschreibung, + text AS notiz, + style, + erledigt AS done, + lehreinheit_id + 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 + WHERE lehreinheit_id IN (SELECT lehreinheit_id FROM lehreinheiten)" + . $whereTags. + ") AS tag + GROUP BY lehreinheit_id + )"; + } + } diff --git a/application/models/education/Lehreinheitgruppe_model.php b/application/models/education/Lehreinheitgruppe_model.php index 2a6f9571a..dee8bbfe1 100644 --- a/application/models/education/Lehreinheitgruppe_model.php +++ b/application/models/education/Lehreinheitgruppe_model.php @@ -14,6 +14,7 @@ class Lehreinheitgruppe_model extends DB_Model $this->load->model('organisation/studiengang_model', 'StudiengangModel'); $this->load->model('organisation/gruppe_model', 'GruppeModel'); $this->load->model('person/benutzergruppe_model', 'BenutzergruppeModel'); + $this->load->model('ressource/stundenplandev_model', 'StundenplandevModel'); } /** @@ -23,7 +24,15 @@ class Lehreinheitgruppe_model extends DB_Model */ public function getDirectGroup($lehreinheit_id) { + $this->addSelect('tbl_lehreinheitgruppe.*'); + $this->addSelect('tbl_gruppe.*'); + $this->addSelect('uid'); + $this->addSelect('vorname'); + $this->addSelect('nachname'); $this->addJoin('public.tbl_gruppe', 'gruppe_kurzbz'); + $this->addJoin('public.tbl_benutzergruppe', 'gruppe_kurzbz', 'LEFT'); + $this->addJoin('public.tbl_benutzer', 'uid', 'LEFT'); + $this->addJoin('public.tbl_person', 'person_id', 'LEFT'); return $this->loadWhere( array( 'tbl_gruppe.direktinskription' => true, @@ -264,4 +273,209 @@ class Lehreinheitgruppe_model extends DB_Model } return $result; } + + public function addGroup($lehreinheit_id, $gid, $verband) + { + $lehreinheit = $this->LehreinheitModel->load($lehreinheit_id); + + if (!hasData($lehreinheit)) + return error ('No Lehreinheit found!'); + + if ($verband === false) + { + $gruppen_result = $this->GruppeModel->loadWhere(array('gid' => $gid)); + + if (!hasData($gruppen_result)) + return error('No group found for gid ' . $gid); + + $gruppen_array = getData($gruppen_result)[0]; + + if (!isEmptyString($gruppen_array->gruppe_kurzbz)) + { + $this->db->where('trim(gruppe_kurzbz)', $gruppen_array->gruppe_kurzbz); + } + else + { + $this->db->group_start(); + $this->db->where("trim(gruppe_kurzbz) = ''"); + $this->db->or_where("gruppe_kurzbz IS NULL"); + $this->db->group_end(); + } + } + else if ($verband === true) + { + $gruppen_result = $this->LehrverbandModel->loadWhere(array('gid' => $gid)); + + if (!hasData($gruppen_result)) + return error('No group found for gid ' . $gid); + + $gruppen_array = getData($gruppen_result)[0]; + + if (!isEmptyString($gruppen_array->verband)) + { + $this->db->where('verband', $gruppen_array->verband); + } + else + { + $this->db->group_start(); + $this->db->where("trim(verband) = ''"); + $this->db->or_where("verband IS NULL"); + $this->db->group_end(); + } + + if (!isEmptyString($gruppen_array->gruppe)) + { + $this->db->where('gruppe', $gruppen_array->gruppe); + } + else + { + $this->db->group_start(); + $this->db->where("trim(gruppe) = ''"); + $this->db->or_where("gruppe IS NULL"); + $this->db->group_end(); + } + } + else + return error('Wrong type of verband'); + + $this->db->where('lehreinheit_id', $lehreinheit_id); + $this->db->where('studiengang_kz', $gruppen_array->studiengang_kz); + + if (!isEmptyString($gruppen_array->semester)) + { + $this->db->where('semester', $gruppen_array->semester); + } + else + { + $this->db->group_start(); + $this->db->where("semester = ''"); + $this->db->or_where("semester IS NULL"); + $this->db->group_end(); + } + + $exist_result = $this->load(); + + if (!hasData($exist_result)) + { + $new_group_result = $this->insert(array( + 'lehreinheit_id' => $lehreinheit_id, + 'studiengang_kz' => $gruppen_array->studiengang_kz, + 'gruppe_kurzbz' => isset($gruppen_array->gruppe_kurzbz) ? $gruppen_array->gruppe_kurzbz : null, + 'semester' => $gruppen_array->semester, + 'verband' => isset($gruppen_array->verband) && !isEmptyString($gruppen_array->verband) ? $gruppen_array->verband : null, + 'gruppe' => isset($gruppen_array->gruppe) && !isEmptyString($gruppen_array->gruppe) ? $gruppen_array->gruppe : null, + 'insertamum' => date('Y-m-d H:i:s'), + 'insertvon' => getAuthUID() + )); + + if (isError($new_group_result)) + return error('Error when adding Group'); + + return success('Group assigned successfully to Lehreinheit'); + } + else + return error($this->p->t('lehre', 'grpbereitszugeteilt')); + } + + public function deleteGroup($lehreinheit_id, $lehreinheitgruppe_id) + { + $lehreinheit = $this->LehreinheitModel->load($lehreinheit_id); + + if (!hasData($lehreinheit)) + return error ('No Lehreinheit found!'); + + $lehreinheitgruppe = $this->load($lehreinheitgruppe_id); + + if (!hasData($lehreinheitgruppe)) + return error ('No Lehreinheitgruppe found!'); + + $this->addSelect('stundenplandev_id'); + $this->addJoin('lehre.tbl_stundenplandev', + "tbl_stundenplandev.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id + AND tbl_stundenplandev.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz + AND tbl_stundenplandev.semester = tbl_lehreinheitgruppe.semester + AND trim(COALESCE(tbl_stundenplandev.verband, '')) = trim(COALESCE(tbl_lehreinheitgruppe.verband, '')) + AND trim(COALESCE(tbl_stundenplandev.gruppe, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe, '')) + AND trim(COALESCE(tbl_stundenplandev.gruppe_kurzbz, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, ''))" + ); + $stundenplan_result = $this->loadWhere(array('tbl_lehreinheitgruppe.lehreinheitgruppe_id' => $lehreinheitgruppe_id)); + + if (hasData($stundenplan_result)) + return error($this->p->t('lehre', 'grpbereitsverplant')); + + $delete_result = $this->delete($lehreinheitgruppe_id); + + if (isError($delete_result)) + return error('Error deleting Group'); + + return success('Group deleted'); + } + + public function getByLehreinheit($lehreinheit_id) + { + $lehreinheit = $this->LehreinheitModel->load($lehreinheit_id); + + if (!hasData($lehreinheit)) + return error ('No Lehreinheit found!'); + + $this->addSelect('tbl_lehreinheitgruppe.*'); + $this->addSelect('tbl_gruppe.direktinskription'); + $this->addSelect('tbl_gruppe.gruppe_kurzbz'); + $this->addSelect("CASE + WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN + COALESCE ( + UPPER(tbl_studiengang.typ || tbl_studiengang.kurzbz) || + COALESCE(tbl_lehreinheitgruppe.semester::varchar, '') || + COALESCE(tbl_lehreinheitgruppe.verband::varchar, '') || + COALESCE(tbl_lehreinheitgruppe.gruppe, ''), + '') + ELSE tbl_lehreinheitgruppe.gruppe_kurzbz + END AS bezeichnung"); + $this->addSelect("CASE + WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN + ( + SELECT bezeichnung + FROM public.tbl_lehrverband + WHERE studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz + AND semester = tbl_lehreinheitgruppe.semester + AND verband = tbl_lehreinheitgruppe.verband + AND gruppe = tbl_lehreinheitgruppe.gruppe + LIMIT 1 + ) + 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 + ( + SELECT EXISTS ( + SELECT 1 + FROM lehre.tbl_stundenplandev + WHERE lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id + AND gruppe_kurzbz = tbl_lehreinheitgruppe.gruppe_kurzbz + ) + ) + END AS verplant"); + $this->addJoin('tbl_studiengang', 'studiengang_kz', 'LEFT'); + $this->addJoin('public.tbl_gruppe', 'gruppe_kurzbz', 'LEFT'); + + $this->db->where('lehreinheit_id', $lehreinheit_id); + $this->db->group_start() + ->where('tbl_gruppe.direktinskription !=', true) + ->or_where('tbl_gruppe.direktinskription IS NULL') + ->group_end(); + return $this->load(); + } } diff --git a/application/models/education/Lehreinheitmitarbeiter_model.php b/application/models/education/Lehreinheitmitarbeiter_model.php index ae1ac55d2..efdb2e74d 100644 --- a/application/models/education/Lehreinheitmitarbeiter_model.php +++ b/application/models/education/Lehreinheitmitarbeiter_model.php @@ -10,6 +10,14 @@ class Lehreinheitmitarbeiter_model extends DB_Model parent::__construct(); $this->dbTable = 'lehre.tbl_lehreinheitmitarbeiter'; $this->pk = array('mitarbeiter_uid', 'lehreinheit_id'); + $this->hasSequence = false; + + $this->load->model('accounting/Vertrag_model', 'VertragModel'); + $this->load->model('ressource/stundenplandev_model', 'StundenplandevModel'); + $this->load->model('ressource/stundenplan_model', 'StundenplanModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); + $this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel'); } /** @@ -75,4 +83,67 @@ class Lehreinheitmitarbeiter_model extends DB_Model ]); } + public function getLektorenByLe($lehreinheit_id) + { + $this->addSelect('vorname, nachname, tbl_lehreinheitmitarbeiter.*, stundenplan.verplant'); + $this->addJoin('tbl_benutzer', 'uid = mitarbeiter_uid'); + $this->addJoin('tbl_person', 'person_id'); + + $this->addJoin('( + SELECT 1 as verplant, lehreinheit_id, mitarbeiter_uid + FROM lehre.tbl_stundenplandev + GROUP BY lehreinheit_id, mitarbeiter_uid + + ) stundenplan', 'stundenplan.mitarbeiter_uid = tbl_lehreinheitmitarbeiter.mitarbeiter_uid AND stundenplan.lehreinheit_id = tbl_lehreinheitmitarbeiter.lehreinheit_id', 'LEFT'); + + return $this->loadWhere(array('tbl_lehreinheitmitarbeiter.lehreinheit_id' => $lehreinheit_id)); + } + + public function getByLeLektor($lehreinheit_id, $mitarbeiter_uid) + { + $this->addSelect('vorname, nachname, tbl_lehreinheitmitarbeiter.*'); + $this->addJoin('tbl_benutzer', 'uid = mitarbeiter_uid'); + $this->addJoin('tbl_person', 'person_id'); + return $this->loadWhere(array('tbl_lehreinheitmitarbeiter.lehreinheit_id' => $lehreinheit_id, 'tbl_lehreinheitmitarbeiter.mitarbeiter_uid' => $mitarbeiter_uid)); + } + + public function deleteLektorFromLe($lehreinheit_id, $mitarbeiter_uid) + { + if (defined('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN') && FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN) + { + $vertrag_result = $this->VertragModel->getVertrag($mitarbeiter_uid, $lehreinheit_id); + + if (hasData($vertrag_result)) + return error("Loeschen nur nach Stornierung des Vertrags möglich"); + } + + $stundenplandev_result = $this->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid)); + $stundenplan_result = $this->StundenplanModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid)); + + if (hasData($stundenplandev_result) || hasData($stundenplan_result)) + return error("Diese/r LektorIn kann nicht gelöscht werden da er schon verplant ist"); + + $result = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid)); + + if (hasData($result)) + { + $le_mitarbeiter_array = getData($result)[0]; + + if ($le_mitarbeiter_array->vertrag_id !== null) + { + $vertrag_result = $this->VertragModel->deleteVertrag($le_mitarbeiter_array->vertrag_id); + if (isError($vertrag_result)) + return $vertrag_result; + } + + $delete_result = $this->delete(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid)); + + if (isError($delete_result)) + return $delete_result; + + return success($delete_result); + } + } + + } diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index 0a48965b5..ccac33bc7 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -16,145 +16,21 @@ class Lehrveranstaltung_model extends DB_Model } /** - * Get Lehrveranstaltungen by eventQuery string. Use with autocomplete event queries. - * @param $eventQuery String - * @param string $studiensemester_kurzbz Filter by Studiensemester - * @param array $oes Filter by Organisationseinheiten - * @return array - */ - public function getAutocompleteSuggestions($eventQuery, $studiensemester_kurzbz = null, $oes = null) - { - $subQry = $this->_getQryLvsByStudienplan($studiensemester_kurzbz, $oes); - $params = []; - - /* filter by input string */ - if (is_string($eventQuery)) { - $subQry.= ' AND lv.bezeichnung ILIKE ?'; - $params[] = '%' . $eventQuery . '%'; - } - - $qry = 'SELECT DISTINCT ON (lehrveranstaltung_id) * FROM ('. $subQry. ') AS tmp'; - - return $this->execQuery($qry, $params); - } - - /** - * Get Lehrveranstaltungen with its Stg, OE and OE-type. - * Filter by Studiensemester and Organisationseinheiten if necessary. - * @param $eventQuery String - * @param string $studiensemester_kurzbz Filter by Studiensemester - * @param array $oes Filter by Organisationseinheiten - * @param array $lv_ids Filter by Lehrveranstaltung-Ids - * @return array - */ - public function getLvsByStudienplan($studiensemester_kurzbz = null, $oes = null, $lv_ids = null) - { - $subQry = $this->_getQryLvsByStudienplan($studiensemester_kurzbz, $oes); - $qry = 'SELECT * FROM ('. $subQry. ') AS tmp'; - - if (isset($lv_ids) && is_array($lv_ids)) - { - /* filter by lv_ids */ - $implodedLvIds = "'". implode("', '", $lv_ids). "'"; - $qry.= ' WHERE lehrveranstaltung_id IN ('. $implodedLvIds. ')'; - } - - $qry.= ' ORDER BY stg_typ_kurzbz, orgform_kurzbz DESC'; - - return $this->execQuery($qry); - } - - /** - * Get basic query to retrieve Lehrveranstaltungen according to the Orgforms and Ausbildungssemesters actual Studienplan. - * - * @return string - */ - private function _getQryLvsByStudienplan($studiensemester_kurzbz = null, $oes = null, $lehrtyp_kurzbz = 'lv') - { - $qry = ' - SELECT - lv.oe_kurzbz AS lv_oe_kurzbz, - CASE - WHEN oe.organisationseinheittyp_kurzbz = \'Kompetenzfeld\' THEN (\'KF \' || oe.bezeichnung) - WHEN oe.organisationseinheittyp_kurzbz = \'Department\' THEN (\'DEP \' || oe.bezeichnung) - ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung) - END AS lv_oe_bezeichnung, - stplsem.studiensemester_kurzbz, - studienordnung_id, - sto.studiengang_kz, - stpl.studienplan_id, - stplsem.semester, - stpl.orgform_kurzbz, - upper(stg.typ || stg.kurzbz) AS stg_typ_kurzbz, - stg.bezeichnung AS stg_bezeichnung, - stgtyp.bezeichnung AS stg_typ_bezeichnung, - lv.lehrveranstaltung_id, - lv.semester, - lv.bezeichnung AS lv_bezeichnung, - ( - -- comma seperated string of all lehreinheitgruppen - SELECT string_agg(bezeichnung, \', \') AS lehreinheitgruppe_bezeichnung - FROM( - -- distinct bezeichnung, as may come multiple times from different lehreinheiten - SELECT DISTINCT ON (studiengang_kz, bezeichnung) studiengang_kz, bezeichnung FROM - ( - -- distinct lehreinheitgruppe, as may come multiple times from different lehrform - SELECT DISTINCT ON (legr.lehreinheitgruppe_id) legr.studiengang_kz, - -- get Spezialgruppe or Lehrverbandgruppe - COALESCE( - legr.gruppe_kurzbz, - CONCAT( UPPER(stg1.typ), UPPER(stg1.kurzbz), \'-\', legr.semester, legr.verband, legr.gruppe ) - ) as bezeichnung - FROM lehre.tbl_lehreinheitgruppe legr - JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id) - JOIN lehre.tbl_lehrveranstaltung lv1 USING (lehrveranstaltung_id) - JOIN public.tbl_studiengang stg1 ON stg1.studiengang_kz = legr.studiengang_kz - WHERE lv1.lehrveranstaltung_id = lv.lehrveranstaltung_id - AND le.studiensemester_kurzbz = stplsem.studiensemester_kurzbz - ) AS lehreinheitgruppen - GROUP BY studiengang_kz, bezeichnung - ORDER BY studiengang_kz DESC - ) AS uniqueLehreinheitgruppen_bezeichnung - ) AS lehreinheitgruppen_bezeichnung - FROM - lehre.tbl_studienplan stpl - JOIN lehre.tbl_studienordnung sto USING (studienordnung_id) - JOIN lehre.tbl_studienplan_semester stplsem USING (studienplan_id) - JOIN lehre.tbl_studienplan_lehrveranstaltung stpllv ON (stpllv.studienplan_id = stpl.studienplan_id AND stpllv.semester = stplsem.semester) - JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) - JOIN public.tbl_organisationseinheit oe USING (oe_kurzbz) - JOIN public.tbl_studiengang stg ON stg.studiengang_kz = sto.studiengang_kz - JOIN public.tbl_studiengangstyp stgtyp ON stgtyp.typ = stg.typ - /* filter by lehrtyp_kurzbz, default is lvs only */ - WHERE - lehrtyp_kurzbz = '. $this->db->escape($lehrtyp_kurzbz); - - if (isset($studiensemester_kurzbz) && is_string($studiensemester_kurzbz)) - { - /* filter by studiensemester */ - $qry.= ' AND stplsem.studiensemester_kurzbz = '. $this->db->escape($studiensemester_kurzbz); - - } - - if (isset($oes) && is_array($oes)) - { - /* filter by organisationseinheit */ - $implodedOes = "'". implode("', '", $oes). "'"; - $qry.= ' AND lv.oe_kurzbz IN ('. $implodedOes. ')'; - } - - return $qry; - } - - /** - * Get all Templates and union with all Lehrveranstaltungen of given Studiensemester and Oes, that are assigned to - * a template. This data structure can be used for nested tabulator data tree. + * Get all Templates and its assigned Lehrveranstaltungen of given Studiensemester and Oes. + * Lvs are queried via actual Studienordnung and Studienplan. * * @param null|string $studiensemester_kurzbz * @param null|array $oes + * @param null $lehrveranstaltung_id Queries certain LV only * @return array|stdClass|null */ - public function getTemplateLvTree($studiensemester_kurzbz = null, $oes = null){ + public function getTemplateLvTree($studiensemester_kurzbz = null, $oes = null, $studienjahr_kurzbz = null){ + + if (is_string($studiensemester_kurzbz) && is_string($studienjahr_kurzbz)) + { + return error('Query not possible for both studiensemester and studienjahr'); + } + $params = []; $qry = ' WITH @@ -189,6 +65,17 @@ class Lehrveranstaltung_model extends DB_Model } + if (is_string($studienjahr_kurzbz)) { + /* filter by studiensemester */ + $params[] = $studienjahr_kurzbz; + $qry .= ' + AND stplsem.studiensemester_kurzbz IN ( + SELECT studiensemester_kurzbz + FROM public.tbl_studiensemester + WHERE studienjahr_kurzbz = ? + )'; + } + if (is_array($oes)) { /* filter by organisationseinheit */ @@ -300,7 +187,15 @@ class Lehrveranstaltung_model extends DB_Model JOIN public.tbl_studiengangstyp stgtyp ON stgtyp.typ = stg.typ JOIN public.tbl_organisationseinheit oe ON oe.oe_kurzbz = lv.oe_kurzbz ORDER BY - oe.bezeichnung, lv.semester, lv.bezeichnung + -- Sort by lv.bezeichnung + lv.bezeichnung, + -- Within each group, ensure templates appear first + CASE + WHEN lv.lehrtyp_kurzbz = \'tpl\' THEN 0 + ELSE 1 + END, + -- Ensure assigend lvs follow their template, grouped by lehrveranstaltung_template_id + COALESCE(lv.lehrveranstaltung_template_id, lv.lehrveranstaltung_id) '; return $this->execQuery($qry, $params); @@ -421,8 +316,8 @@ class Lehrveranstaltung_model extends DB_Model (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 status, tbl_bisio.bisio_id, tbl_bisio.von, tbl_bisio.bis, tbl_student.studiengang_kz AS stg_kz_student, tbl_zeugnisnote.note, tbl_mitarbeiter.mitarbeiter_uid, tbl_person.matr_nr, tbl_benutzer.uid, - UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung - + UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung, + tbl_student.prestudent_id FROM campus.vw_student_lehrveranstaltung JOIN public.tbl_benutzer USING(uid) @@ -491,6 +386,37 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($query, array($lehrveranstaltung_id, $studiensemester_kurzbz)); } + + /** + * Get LV-Leitung of given Lehrveranstaltung ID and Studiensemester. + * + * @param $lehrveranstaltung_id + * @param $studiensemester + * @return array|stdClass|null + */ + public function getLvLeitung($lehrveranstaltung_id, $studiensemester) + { + $params = [$lehrveranstaltung_id, $studiensemester]; + + $qry = " + SELECT + vorname, nachname, mitarbeiter_uid, lehrfunktion_kurzbz + FROM + lehre.tbl_lehreinheit + JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) + JOIN public.tbl_benutzer b ON b.uid = lema.mitarbeiter_uid + JOIN public.tbl_person p using (person_id) + WHERE + tbl_lehreinheit.lehrveranstaltung_id= ? + AND tbl_lehreinheit.studiensemester_kurzbz = ? + AND lehrfunktion_kurzbz = 'LV-Leitung' + ORDER BY + lema.insertamum DESC + LIMIT 1 + "; + + return $this->execQuery($qry, $params); + } /** * Gets all Leiter of Lehrveranstaltungsorganisationseinheit * @param $lehrveranstaltung_id @@ -557,16 +483,6 @@ class Lehrveranstaltung_model extends DB_Model */ public function getLvsByStudentWithGrades($student_uid, $studiensemester_kurzbz, $sprache = null, $lvid=null) { - if ($sprache) { - $sprache_qry = $this->db->compile_binds('SELECT index FROM public.tbl_sprache WHERE sprache = ?', [$sprache]); - $bezeichnung = 'bezeichnung_mehrsprachig[(' . $sprache_qry . ')]'; - $sgbezeichnung = $sprache == 'English' ? 'COALESCE(sg.english, sg.bezeichnung)' : 'sg.bezeichnung'; - $lvbezeichnung = $sprache == 'English' ? 'COALESCE(v.bezeichnung_english, v.bezeichnung)' : 'v.bezeichnung'; - } else { - $bezeichnung = 'bezeichnung'; - $sgbezeichnung = 'sg.bezeichnung'; - $lvbezeichnung = 'v.bezeichnung'; - } $this->addDistinct(); // TODO(chris): selects @@ -606,16 +522,20 @@ class Lehrveranstaltung_model extends DB_Model $this->addSelect('znn.positiv'); #$this->addSelect('splv.module'); - $this->addSelect($lvbezeichnung . ' AS bezeichnung'); - $this->addSelect($sgbezeichnung . ' AS sg_bezeichnung'); + $this->addSelect('v.bezeichnung AS bezeichnung'); + $this->addSelect('v.bezeichnung_english AS bezeichnung_eng'); + $this->addSelect('sg.bezeichnung AS sg_bezeichnung'); + $this->addSelect('sg.english AS sg_bezeichnung_eng'); $this->addSelect('UPPER(sg.typ::VARCHAR(1) || sg.kurzbz) AS studiengang_kuerzel'); //also adds returns the index of the grade //TODO: ist zeugnissnote immer gleich wie die lvgesamtnote $this->addSelect('COALESCE(zn.note::numeric,gn.note::numeric) as note_index'); $this->addSelect('COALESCE(znn.positiv,gnn.positiv) as positiv'); - $this->addSelect('COALESCE(gnn.' . $bezeichnung . ', gnn.bezeichnung, gn.note::text) AS lvnote'); - $this->addSelect('COALESCE(znn.' . $bezeichnung . ', znn.bezeichnung, zn.note::text) AS znote'); + $this->addSelect('gnn.bezeichnung_mehrsprachig AS lvnotebez'); + $this->addSelect('gnn.note AS lvnote'); + $this->addSelect('znn.bezeichnung_mehrsprachig AS znotebez'); + $this->addSelect('znn.note AS znote'); // TODO(chris): Potentielle Anpassung "Eine UID" $this->addJoin('campus.vw_student_lehrveranstaltung v', 'lehrveranstaltung_id'); @@ -811,6 +731,28 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($qry); } + /** + * Check if given LV is a template (Quellkurs) + * + * @param $lehrveranstaltung_id + * @return array|stdClass|void + */ + public function checkIsTemplate($lehrveranstaltung_id) + { + $this->addSelect('lehrtyp_kurzbz, lehrveranstaltung_template_id'); + $result = $this->load($lehrveranstaltung_id); + + if (isError($result)) + return error(getError($result)); + + if (hasData($result)) + { + return success( + getData($result)[0]->lehrtyp_kurzbz === 'tpl' && + getData($result)[0]->lehrveranstaltung_template_id === null + ); + } + } /** * Get ECTS Summe pro angerechnetes Quereinstiegssemester. @@ -1071,4 +1013,334 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($qry, $params); } + + /** + * Gets lehrveranstaltungen of Studienplan + * @param $studienplan_id ID des Studienplans + * @param $semester Semester optional + * @return array|null + */ + public function getLvsByStudienplanId($studienplan_id, $semester = null) + { + $params = array($studienplan_id); + + $qry = "SELECT tbl_lehrveranstaltung.*, + tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id, + tbl_studienplan_lehrveranstaltung.semester as stpllv_semester, + tbl_studienplan_lehrveranstaltung.pflicht as stpllv_pflicht, + tbl_studienplan_lehrveranstaltung.koordinator as stpllv_koordinator, + tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent, + tbl_studienplan_lehrveranstaltung.sort stpllv_sort, + tbl_studienplan_lehrveranstaltung.curriculum, + tbl_studienplan_lehrveranstaltung.export, + tbl_studienplan_lehrveranstaltung.genehmigung + FROM lehre.tbl_lehrveranstaltung + JOIN lehre.tbl_studienplan_lehrveranstaltung + USING(lehrveranstaltung_id) + WHERE tbl_studienplan_lehrveranstaltung.studienplan_id = ? + "; + + if ($semester !== null) + { + $qry.= " AND tbl_studienplan_lehrveranstaltung.semester = ?"; + $params[] = $semester; + } + + $qry .= " ORDER BY stpllv_sort, semester, sort"; + + return $this->execQuery($qry, $params); + } + + public function getLvsByOrganization($oe_kurzbz) + { + $qry=" + SELECT + distinct on (lehrveranstaltung_id) + tbl_lehrveranstaltung.studiengang_kz as lv_studiengang_kz, tbl_lehrveranstaltung.semester as lv_semester, + tbl_lehrveranstaltung.kurzbz as lv_kurzbz, tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, tbl_lehrveranstaltung.ects as lv_ects, + tbl_lehrveranstaltung.lehreverzeichnis as lv_lehreverzeichnis, tbl_lehrveranstaltung.planfaktor as lv_planfaktor, + tbl_lehrveranstaltung.planlektoren as lv_planlektoren, tbl_lehrveranstaltung.planpersonalkosten as lv_planpersonalkosten, + tbl_lehrveranstaltung.plankostenprolektor as lv_plankostenprolektor, tbl_lehrveranstaltung.orgform_kurzbz as lv_orgform_kurzbz, + tbl_lehrveranstaltung.lehrveranstaltung_id, + tbl_lehrveranstaltung.lehrform_kurzbz as lehrform_kurzbz, + tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz, + tbl_lehrveranstaltung.bezeichnung_english as lv_bezeichnung_english, + tbl_lehrveranstaltung.studiengang_kz, tbl_lehrveranstaltung.semester, tbl_lehrveranstaltung.anmerkung, tbl_lehrveranstaltung.sprache, tbl_lehrveranstaltung.semesterstunden, + tbl_lehrveranstaltung.lehre, tbl_lehrveranstaltung.aktiv, + '' as studienplan_id, '' as studienplan_bezeichnung, tbl_lehrveranstaltung.lehrtyp_kurzbz + FROM + lehre.tbl_lehrveranstaltung + WHERE + tbl_lehrveranstaltung.oe_kurzbz= ? + AND tbl_lehrveranstaltung.aktiv + "; + + return $this->execReadOnlyQuery($qry, array($oe_kurzbz)); + } + + public function getLvsByFachbereich($fachbereich, $studiensemester_kurbz, $mitarbeiter_uid = null) + { + $qry = ""; + if (!is_null($mitarbeiter_uid)) + { + $qry = $this->getLvsFromStudienplanByEmp(); + $params = array($fachbereich, $studiensemester_kurbz); + } + + $qry .= "SELECT + distinct on(lehrveranstaltung_id) + lv_studiengang_kz, lv_semester, lv_kurzbz, lv_bezeichnung, lv_ects, + lv_lehreverzeichnis, lv_planfaktor, lv_planlektoren, lv_planpersonalkosten, + lv_plankostenprolektor, lv_orgform_kurzbz, lehrveranstaltung_id, + lehrform_kurzbz, lv_lehrform_kurzbz, lv_bezeichnung_english, studiengang_kz, semester, anmerkung, sprache, semesterstunden, + lehre, aktiv, + '' as studienplan_id, '' as studienplan_bezeichnung, + (SELECT lehrtyp_kurzbz FROM lehre.tbl_lehrveranstaltung WHERE lehrveranstaltung_id=vw_lehreinheit.lehrveranstaltung_id) as lehrtyp_kurzbz + FROM + campus.vw_lehreinheit + WHERE studiensemester_kurzbz = ? + AND fachbereich_kurzbz = ?"; + + $params[] = array($studiensemester_kurbz, $fachbereich); + + if (!is_null($mitarbeiter_uid)) + { + $qry .= " AND mitarbeiter_uid = ?"; + $params[] = $mitarbeiter_uid; + } + else + { + $qry.=" AND lehrveranstaltung_id NOT IN (SELECT lehrveranstaltung_id + FROM + lehre.tbl_lehrveranstaltung + JOIN lehre.tbl_studienplan_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN lehre.tbl_studienplan USING(studienplan_id) + JOIN lehre.tbl_studienordnung USING(studienordnung_id) + JOIN lehre.tbl_studienplan_semester USING(studienplan_id) + WHERE + tbl_lehrveranstaltung.oe_kurzbz=(Select oe_kurzbz from public.tbl_fachbereich where fachbereich_kurzbz= ?) + AND tbl_studienplan_semester.studiensemester_kurzbz= ?"; + + $params[] = array($fachbereich, $studiensemester_kurbz); + } + + return $this->execReadOnlyQuery($qry, $params); + } + + private function getLvsFromStudienplanByEmp() + { + return " + SELECT + distinct on (lehrveranstaltung_id) + tbl_lehrveranstaltung.studiengang_kz as lv_studiengang_kz, + tbl_lehrveranstaltung.semester as lv_semester, + tbl_lehrveranstaltung.kurzbz as lv_kurzbz, + tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, + tbl_lehrveranstaltung.ects as lv_ects, + tbl_lehrveranstaltung.lehreverzeichnis as lv_lehreverzeichnis, + tbl_lehrveranstaltung.planfaktor as lv_planfaktor, + tbl_lehrveranstaltung.planlektoren as lv_planlektoren, + tbl_lehrveranstaltung.planpersonalkosten as lv_planpersonalkosten, + tbl_lehrveranstaltung.plankostenprolektor as lv_plankostenprolektor, + tbl_lehrveranstaltung.orgform_kurzbz as lv_orgform_kurzbz, + tbl_lehrveranstaltung.lehrveranstaltung_id, + tbl_lehrveranstaltung.lehrform_kurzbz as lehrform_kurzbz, + tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz, + tbl_lehrveranstaltung.bezeichnung_english as lv_bezeichnung_english, + tbl_lehrveranstaltung.studiengang_kz, + tbl_studienplan_lehrveranstaltung.semester, + tbl_lehrveranstaltung.anmerkung, + tbl_lehrveranstaltung.sprache, + tbl_lehrveranstaltung.semesterstunden, + tbl_lehrveranstaltung.lehre, + tbl_lehrveranstaltung.aktiv, + tbl_studienplan.studienplan_id::text, + tbl_studienplan.bezeichnung as studienplan_bezeichnung, + tbl_lehrveranstaltung.lehrtyp_kurzbz + FROM + lehre.tbl_lehrveranstaltung + JOIN lehre.tbl_studienplan_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN lehre.tbl_studienplan USING(studienplan_id) + JOIN lehre.tbl_studienordnung USING(studienordnung_id) + JOIN lehre.tbl_studienplan_semester USING(studienplan_id) + WHERE + tbl_lehrveranstaltung.oe_kurzbz=(Select oe_kurzbz from public.tbl_fachbereich where fachbereich_kurzbz= ?) + AND tbl_studienplan_semester.studiensemester_kurzbz = ? + AND tbl_lehrveranstaltung.aktiv + UNION + "; + } + + public function getLvsByStudiengang($studienplan_ids, $placeholders, $only_ids, $studiengang_kz, $studiensemester_kurzbz, $semester = null, $verband = null) + { + $qry = ""; + $params = array(); + + if (!empty($studienplan_ids)) + { + $qry = $this->getLvsFromStudienplanByStudienplanID($placeholders); + $params = $studienplan_ids; + } + + $qry .= " + SELECT DISTINCT on(lehrveranstaltung_id) lehrveranstaltung_id, + tbl_lehrveranstaltung.kurzbz as lv_kurzbz, + tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, + tbl_lehrveranstaltung.bezeichnung_english as lv_bezeichnung_english, + studiengang_kz, + semester, + tbl_lehrveranstaltung.sprache, + ects as lv_ects, + semesterstunden, + tbl_lehrveranstaltung.anmerkung, + tbl_lehrveranstaltung.lehre, + lehreverzeichnis as lv_lehreverzeichnis, + tbl_lehrveranstaltung.aktiv, + planfaktor as lv_planfaktor, + planlektoren as lv_planlektoren, + planpersonalkosten as lv_planpersonalkosten, + plankostenprolektor as lv_plankostenprolektor, + tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz, + tbl_lehrveranstaltung.orgform_kurzbz, + ''::text as studienplan_id, + '' as studienplan_bezeichnung, + '' as studienplan_lehrveranstaltung_id_parent, + tbl_lehrveranstaltung.lehrtyp_kurzbz, + UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang + FROM lehre.tbl_lehrveranstaltung + JOIN lehre.tbl_lehreinheit USING (lehrveranstaltung_id) + JOIN public.tbl_studiengang USING(studiengang_kz) + WHERE studiengang_kz = ? + AND studiensemester_kurzbz = ? + "; + + $params[] = $studiengang_kz; + $params[] = $studiensemester_kurzbz; + if (!is_null($semester)) + { + $qry .= ' AND semester = ?'; + $params[] = $semester; + } + if (!is_null($verband)) + { + $qry .= ' AND (tbl_lehrveranstaltung.orgform_kurzbz = ? OR tbl_lehrveranstaltung.orgform_kurzbz IS NULL)'; + $params[] = $verband; + } + + if (!empty($only_ids)) + { + + $qry .= ' AND NOT EXISTS (SELECT 1 FROM lehre.tbl_studienplan_lehrveranstaltung where studienplan_id IN ? + AND lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND tbl_lehrveranstaltung.aktiv)'; + + $params[] = $only_ids; + } + + return $this->execReadOnlyQuery($qry, $params); + } + private function getLvsFromStudienplanByStudienplanID($placeholders) + { + return " + SELECT + 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, + plankostenprolektor as lv_plankostenprolektor, lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.orgform_kurzbz, + tbl_studienplan_lehrveranstaltung.studienplan_id::text as studienplan_id, tbl_studienplan.bezeichnung as studienplan_bezeichnung, tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent::text, + tbl_lehrveranstaltung.lehrtyp_kurzbz, UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang + FROM + lehre.tbl_lehrveranstaltung + JOIN lehre.tbl_studienplan_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN lehre.tbl_studienplan USING(studienplan_id) + JOIN tbl_studiengang USING(studiengang_kz) + WHERE + tbl_lehrveranstaltung.aktiv AND ((studienplan_id, tbl_studienplan_lehrveranstaltung.semester) IN ( " . implode(',', $placeholders) . ")) + UNION + "; + } + + public function getAllOe($lv_id) + { + $qry = "SELECT DISTINCT oe_kurzbz + FROM lehre.tbl_studienplan_lehrveranstaltung + JOIN lehre.tbl_studienplan USING(studienplan_id) + JOIN lehre.tbl_studienordnung USING(studienordnung_id) + JOIN public.tbl_studiengang USING(studiengang_kz) + WHERE lehrveranstaltung_id = ? + + UNION + + ( + SELECT oe_kurzbz + FROM public.tbl_studiengang + WHERE studiengang_kz = ( + SELECT tbl_lehrveranstaltung.studiengang_kz + FROM lehre.tbl_lehrveranstaltung + WHERE lehrveranstaltung_id = ? + ) + ) + "; + + $params = array($lv_id, $lv_id); + + return $this->execReadOnlyQuery($qry, $params); + } + + /** + * Gets Lehrveranstaltungen for a student, as needed for a Projektarbeit. + * @param student_uid + * @param studiengang_kz optional, all Lvs of this Studiengang will be included + * @param additional_lehrveranstaltung_id optional, this lv will be added to result + * @return object success or error + */ + public function getLvsForProjektarbeit($student_uid, $studiengang_kz = null, $additional_lehrveranstaltung_id = null) + { + $params = array($student_uid, $student_uid); + + $qry = " + SELECT * + FROM + lehre.tbl_lehrveranstaltung + WHERE + ( + lehrveranstaltung_id IN ( + + SELECT + lehrveranstaltung_id + FROM + campus.vw_student_lehrveranstaltung + WHERE + uid=? + + UNION + + SELECT + lehrveranstaltung_id + FROM + lehre.tbl_zeugnisnote + WHERE + student_uid=? + )"; + + if (isset($studiengang_kz)) + { + $params[] = $studiengang_kz; + $qry .= " OR (studiengang_kz = ? AND semester IS NOT NULL)"; + } + + if (isset($additional_lehrveranstaltung_id)) + { + $params[] = $additional_lehrveranstaltung_id; + $qry .= " OR lehrveranstaltung_id = ?"; + } + + $qry .= " + ) + AND projektarbeit = TRUE + ORDER BY + semester, bezeichnung"; + + return $this->execQuery($qry, $params); + } } diff --git a/application/models/education/Note_model.php b/application/models/education/Note_model.php index 80b454398..87a1501e0 100644 --- a/application/models/education/Note_model.php +++ b/application/models/education/Note_model.php @@ -11,4 +11,12 @@ class Note_model extends DB_Model $this->dbTable = 'lehre.tbl_note'; $this->pk = 'note'; } + + public function getAllActive() { + $qry ="SELECT * + FROM lehre.tbl_note + WHERE aktiv = true"; + + return $this->execReadOnlyQuery($qry); + } } \ No newline at end of file diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php index 5fb58cc81..a883043d3 100644 --- a/application/models/education/Paabgabe_model.php +++ b/application/models/education/Paabgabe_model.php @@ -30,4 +30,88 @@ class Paabgabe_model extends DB_Model return $this->execQuery($qry, array($projektarbeit_id)); } + + /** + * Gets all Paabgabe Termin Deadlines of zugewiesene Projektarbeiten as a Mitarbeiter for Terminübersicht Abgabetool. + * @param int $person_id + * @return object + */ + public function getDeadlines($person_id) + { + $qry = "SELECT + DISTINCT TO_CHAR(tbl_paabgabe.datum, 'DD.MM.YYYY') as datum, tbl_paabgabe.fixtermin, tbl_paabgabe.kurzbz, + person_student.vorname as stud_vorname, person_student.nachname as stud_nachname, + person_student.titelpre as stud_titelpre, person_student.titelpost as stud_titelpost, + tbl_lehrveranstaltung.semester, UPPER(tbl_studiengang.typ || tbl_studiengang.kurzbz) as stg, + tbl_paabgabetyp.bezeichnung as typ_bezeichnung + FROM + campus.tbl_paabgabe + JOIN lehre.tbl_projektarbeit USING(projektarbeit_id) + JOIN lehre.tbl_projektbetreuer USING(projektarbeit_id) + JOIN public.tbl_benutzer bn_student ON(tbl_projektarbeit.student_uid=bn_student.uid) + JOIN public.tbl_person person_student ON(bn_student.person_id=person_student.person_id) + JOIN lehre.tbl_lehreinheit ON(tbl_projektarbeit.lehreinheit_id=tbl_lehreinheit.lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung ON(tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id) + JOIN public.tbl_studiengang ON(tbl_lehrveranstaltung.studiengang_kz=tbl_studiengang.studiengang_kz) + JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz) + WHERE + tbl_projektbetreuer.person_id= ? AND tbl_paabgabe.datum>=now() AND bn_student.aktiv + ORDER BY datum"; + + return $this->execReadOnlyQuery($qry, array($person_id)); + } + + public function findAbgabenNewOrUpdatedSince($interval, $relevantTypes) + { + + $query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, campus.tbl_paabgabe.kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum, + campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum, + campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel, + UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz, + public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz, + public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost + FROM campus.tbl_paabgabe + JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz) + JOIN lehre.tbl_projektarbeit USING (projektarbeit_id) + JOIN lehre.tbl_lehreinheit using(lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id) + JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz) + JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid) + JOIN public.tbl_person USING (person_id) + + WHERE (campus.tbl_paabgabe.insertamum >= NOW() - INTERVAL ? + OR campus.tbl_paabgabe.updateamum >= NOW() - INTERVAL ?) + AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?"; + + return $this->execQuery($query, [$interval, $interval, $relevantTypes]); + } + + public function findAbgabenNewOrUpdatedSinceByAbgabedatum($interval) { + + $query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum, + campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum, + campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel, + lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id, + public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost + + FROM campus.tbl_paabgabe + JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz) + JOIN lehre.tbl_projektarbeit USING (projektarbeit_id) + JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid) + JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) + + WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL + AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ? + ORDER BY abgabedatum DESC + "; + + return $this->execQuery($query, [$interval]); + } + + public function loadByIDs($paabgabe_ids) { + $qry = "SELECT * FROM campus.tbl_paabgabe WHERE paabgabe_id IN ?"; + + return $this->execReadOnlyQuery($qry, [$paabgabe_ids]); + } } diff --git a/application/models/education/Paabgabetyp_model.php b/application/models/education/Paabgabetyp_model.php index b672a3f0e..034daca44 100644 --- a/application/models/education/Paabgabetyp_model.php +++ b/application/models/education/Paabgabetyp_model.php @@ -11,4 +11,10 @@ class Paabgabetyp_model extends DB_Model $this->dbTable = 'campus.tbl_paabgabetyp'; $this->pk = 'paabgabetyp_kurzbz'; } + + public function getAll() { + $qry = "SELECT * FROM campus.tbl_paabgabetyp ORDER BY bezeichnung"; + + return $this->execReadOnlyQuery($qry); + } } diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php index 109e23373..5e453056d 100644 --- a/application/models/education/Projektarbeit_model.php +++ b/application/models/education/Projektarbeit_model.php @@ -24,16 +24,28 @@ class Projektarbeit_model extends DB_Model public function getProjektarbeit($student_uid, $studiengang_kz = null, $studiensemester_kurzbz = null, $projekttyp = null, $final = null) { $qry = "SELECT - tbl_projektarbeit.* , tbl_projekttyp.bezeichnung + pa.*, tbl_projekttyp.bezeichnung, + tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.lehrveranstaltung_id, + tbl_firma.name AS firma_name, + ( + SELECT + STRING_AGG(trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')), ', ') + FROM + lehre.tbl_projektbetreuer + JOIN public.tbl_person USING (person_id) + WHERE + projektarbeit_id = pa.projektarbeit_id + AND student_uid = pa.student_uid + GROUP BY projektarbeit_id + ) AS projektbetreuer FROM - lehre.tbl_projektarbeit - JOIN - lehre.tbl_projekttyp USING (projekttyp_kurzbz), lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung - + lehre.tbl_projektarbeit pa + JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) + JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) + LEFT JOIN public.tbl_firma USING (firma_id) WHERE - tbl_projektarbeit.lehreinheit_id=tbl_lehreinheit.lehreinheit_id AND - tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND - tbl_projektarbeit.student_uid = ?"; + pa.student_uid = ?"; $params = array($student_uid); @@ -52,16 +64,16 @@ class Projektarbeit_model extends DB_Model if (isset($projekttyp)) { if (is_array($projekttyp)) - $qry .= ' AND tbl_projektarbeit.projekttyp_kurzbz IN ?'; + $qry .= ' AND pa.projekttyp_kurzbz IN ?'; else - $qry .= ' AND tbl_projektarbeit.projekttyp_kurzbz=?'; + $qry .= ' AND pa.projekttyp_kurzbz=?'; $params[] = $projekttyp; } if (isset($final)) { - $qry .= ' AND tbl_projektarbeit.final=?'; + $qry .= ' AND pa.final=?'; $params[] = $final; } @@ -69,4 +81,427 @@ class Projektarbeit_model extends DB_Model return $this->execQuery($qry, $params); } + + /** + * Update a Projektarbeit of a student by projektarbeit_id with + * the paramenters used by the student endupload page in cis4 abgabetool. + */ + public function updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en, + $schlagwoerter, $schlagwoerter_en,$seitenanzahl) + { + $qry = "UPDATE lehre.tbl_projektarbeit SET + seitenanzahl = ?, + abgabedatum = now(), + sprache = ?, + schlagwoerter_en = ?, + schlagwoerter = ?, + abstract = ?, + abstract_en = ? + WHERE projektarbeit_id = ?"; + + return $this->execQuery($qry, array($seitenanzahl, $sprache, $schlagwoerter_en, + $schlagwoerter, $abstract, $abstract_en, $projektarbeit_id)); + } + + /** + * Get a List of Projektarbeiten of a student with betreuer + * used by the student cis4 abgabetool. + */ + public function getStudentProjektarbeitenWithBetreuer($studentUID) + { + $betreuerQuery = "SELECT * FROM (SELECT DISTINCT ON(projektarbeit_id) + vorname as bvorname, + nachname as bnachname, + titelpre as btitelpre, + titelpost AS btitelpost, + tbl_betreuerart.beschreibung AS betreuerart_beschreibung, + + (SELECT person_id + FROM lehre.tbl_projektbetreuer + WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') 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') 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, + + tbl_betreuerart.betreuerart_kurzbz, + person_id as bperson_id, + projektarbeit_id, + lehre.tbl_projekttyp.bezeichnung as projekttypbezeichnung, + lehre.tbl_projekttyp.projekttyp_kurzbz as projekttypkurzbz, + lehre.tbl_lehreinheit.studiensemester_kurzbz, + lehre.tbl_lehrveranstaltung.studiengang_kz, + public.tbl_studiengang.kurzbzlang, + lehre.tbl_projektarbeit.note as note, + lehre.tbl_note.bezeichnung as note_bezeichnung, + public.tbl_mitarbeiter.mitarbeiter_uid, + lehre.tbl_projektarbeit.titel as titel, + 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, + (SELECT datum FROM campus.tbl_paabgabe WHERE paabgabetyp_kurzbz = 'end' AND abgabedatum IS NOT NULL AND projektarbeit_id = tbl_projektarbeit.projektarbeit_id LIMIT 1) AS abgegeben + + FROM lehre.tbl_projektarbeit + LEFT JOIN lehre.tbl_projektbetreuer USING(projektarbeit_id) + LEFT JOIN public.tbl_person USING(person_id) + LEFT JOIN public.tbl_benutzer USING(person_id) + LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) + LEFT JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz) + LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid) + LEFT JOIN public.tbl_studiengang USING(studiengang_kz) + LEFT JOIN lehre.tbl_note ON(lehre.tbl_projektarbeit.note = lehre.tbl_note.note) + WHERE + tbl_projektarbeit.student_uid = ? AND mitarbeiter_uid IS NOT NULL AND + (projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom') + AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')) as base + ORDER BY insertamum DESC"; + + return $this->execReadOnlyQuery($betreuerQuery, array($studentUID)); + } + + /** + * Get a List of Projektarbeit Abgabetermin used by the student cis4 abgabetool. + */ + public function getProjektarbeitAbgabetermine($projektarbeit_id) { + $qry ="SELECT campus.tbl_paabgabe.paabgabe_id, + campus.tbl_paabgabe.projektarbeit_id, + campus.tbl_paabgabe.fixtermin, + campus.tbl_paabgabe.kurzbz, + campus.tbl_paabgabe.datum, + campus.tbl_paabgabe.note, + campus.tbl_paabgabe.upload_allowed, + campus.tbl_paabgabe.beurteilungsnotiz, + campus.tbl_paabgabetyp.paabgabetyp_kurzbz, + campus.tbl_paabgabetyp.bezeichnung, + campus.tbl_paabgabetyp.benotbar, + campus.tbl_paabgabe.abgabedatum, + campus.tbl_paabgabe.insertvon + FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz) + WHERE campus.tbl_paabgabe.projektarbeit_id = ? + ORDER BY campus.tbl_paabgabe.datum"; + + return $this->execReadOnlyQuery($qry, array($projektarbeit_id)); + } + + public function getProjektarbeitenAbgabetermine($projektarbeiten_ids) { + $qry ="SELECT campus.tbl_paabgabe.paabgabe_id, + campus.tbl_paabgabe.projektarbeit_id, + campus.tbl_paabgabe.fixtermin, + campus.tbl_paabgabe.kurzbz, + campus.tbl_paabgabe.datum, + campus.tbl_paabgabe.note, + campus.tbl_paabgabe.upload_allowed, + campus.tbl_paabgabe.beurteilungsnotiz, + campus.tbl_paabgabetyp.paabgabetyp_kurzbz, + campus.tbl_paabgabetyp.bezeichnung, + campus.tbl_paabgabe.abgabedatum, + campus.tbl_paabgabe.insertvon + FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz) + WHERE campus.tbl_paabgabe.projektarbeit_id IN ? + ORDER BY campus.tbl_paabgabe.datum"; + + return $this->execReadOnlyQuery($qry, array($projektarbeiten_ids)); + } + + public function getProjektbetreuerAnrede($bperson_id) { + $qry_betr="SELECT DISTINCT ON(public.tbl_person.person_id) trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first, anrede + FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id) + WHERE public.tbl_person.person_id= ?"; + + return $this->execReadOnlyQuery($qry_betr, [$bperson_id]); + } + + public function getProjektbetreuerEmail($projektarbeit_id) { + $qry = "SELECT ( + SELECT kontakt + FROM public.tbl_kontakt + WHERE kontakttyp = 'email' + AND person_id = pers.person_id + ORDER BY + CASE WHEN zustellung THEN 0 ELSE 1 END, + insertamum DESC NULLS LAST + LIMIT 1 + ) AS private_email, mitarbeiter_uid as uid + FROM lehre.tbl_projektarbeit pa + JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + JOIN public.tbl_person pers USING (person_id) + 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 = ?"; + + return $this->execReadOnlyQuery($qry, [$projektarbeit_id]); + } + + public function getProjektbetreuerEmailByPersonID($person_id) { + $qry = "SELECT ( + SELECT kontakt + FROM public.tbl_kontakt + WHERE kontakttyp = 'email' + AND person_id = pers.person_id + ORDER BY + CASE WHEN zustellung THEN 0 ELSE 1 END, + insertamum DESC NULLS LAST + LIMIT 1 + ) AS private_email, mitarbeiter_uid as uid + FROM lehre.tbl_projektarbeit pa + JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + JOIN public.tbl_person pers USING (person_id) + 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 person_id = ?"; + + return $this->execReadOnlyQuery($qry, [$person_id]); + } + + public function getProjektarbeitBenutzer($uid) { + $qry="SELECT * FROM campus.vw_benutzer where uid=?"; + return $this->execReadOnlyQuery($qry, [$uid]); + } + + /** + * Checks if mitarbeiter has a projektbetreuer zuordnung to student. + */ + public function checkZuordnung($studentUID, $maUID) { + //oder Lektor mit Betreuung dieses Studenten + $qry = " + SELECT 1 + FROM + lehre.tbl_projektarbeit + JOIN lehre.tbl_projektbetreuer USING(projektarbeit_id) + JOIN campus.vw_benutzer on(vw_benutzer.person_id=tbl_projektbetreuer.person_id) + WHERE + tbl_projektarbeit.student_uid = ? AND + vw_benutzer.uid = ?"; + + return $this->execReadOnlyQuery($qry, array($studentUID, $maUID)); + } + + /** + * 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 ')." + AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Zweitbegutachter', 'Erstbetreuer', 'Senatsvorsitz', 'Senatsmitglied') + ORDER BY tbl_projektarbeit.projektarbeit_id, betreuerart_kurzbz desc) as xy + ORDER BY nachname;"; + + return $this->execReadOnlyQuery($qry, array($uid)); + } + + /** + * Fetch Student info relevant to a projektarbeit_id + */ + public function getStudentInfoForProjektarbeitId($projektarbeit_id) { + + $qry = "SELECT * + FROM campus.vw_student + WHERE uid IN( + SELECT student_uid + FROM lehre.tbl_projektarbeit + WHERE projektarbeit_id = ? )"; + + return $this->execReadOnlyQuery($qry, array($projektarbeit_id)); + } + + + 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.vorname as betreuer_vorname, + betreuer_person.nachname as betreuer_nachname, + 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 + 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 = ?"; + + 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)); + } + + /** + * + * @param + * @return object success or error + */ + public function hasBerechtigungForProjektarbeit($projektarbeit_id) + { + if (!$projektarbeit_id || !is_numeric($projektarbeit_id)) + return false; + + $this->ProjektarbeitModel->addSelect('studiengang_kz'); + $this->ProjektarbeitModel->addJoin('public.tbl_student', 'student_uid'); + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + if (isError($result) || !hasData($result)) + return false; + + $studiengang_kz = getData($result)[0]->studiengang_kz; + + if ($this->permissionlib->isBerechtigt('admin', 'suid', $studiengang_kz)) + return true; + if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $studiengang_kz)) + return true; + + return false; + } + + public function getProjektarbeitByPaabgabeID($paabgabe_id) { + $qry = "SELECT + projektarbeit_id + FROM + campus.tbl_paabgabe + JOIN lehre.tbl_projektarbeit USING(projektarbeit_id) + WHERE + campus.tbl_paabgabe.paabgabe_id = ?; + "; + + return $this->execReadOnlyQuery($qry, [$paabgabe_id]); + } } diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php index 95950bf95..47e0239d6 100644 --- a/application/models/education/Projektbetreuer_model.php +++ b/application/models/education/Projektbetreuer_model.php @@ -10,6 +10,7 @@ class Projektbetreuer_model extends DB_Model parent::__construct(); $this->dbTable = 'lehre.tbl_projektbetreuer'; $this->pk = array('betreuerart_kurzbz', 'projektarbeit_id', 'person_id'); + $this->hasSequence = false; } /** @@ -231,4 +232,41 @@ class Projektbetreuer_model extends DB_Model return $this->execQuery($qry, array($projektarbeit_id, $betreuer_person_id)); } + + /** + * Gets all Betreuer of a Projektarbeit. + * Returns one row for each person. + * @param int $projektarbeit_id + * @return array success with number of Betreuer or error + */ + public function getAllBetreuerOfProjektarbeit($projektarbeit_id) + { + $qry = "SELECT DISTINCT ON (pers.person_id) pers.person_id, betreuerart_kurzbz, vorname, nachname, + trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as voller_name, + anrede, titelpre, titelpost, gebdatum, geschlecht, pa.projekttyp_kurzbz, + ben.uid, ben.alias, ma.personalnummer, mitarbeiter_uid, student_uid, + ( + SELECT kontakt + FROM public.tbl_kontakt + WHERE kontakttyp = 'email' + AND person_id = pers.person_id + ORDER BY + CASE WHEN zustellung THEN 0 ELSE 1 END, + insertamum DESC NULLS LAST + LIMIT 1 + ) AS private_email + FROM lehre.tbl_projektarbeit pa + JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + JOIN public.tbl_person pers USING (person_id) + 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 = ? + ORDER BY pers.person_id, CASE WHEN ma.mitarbeiter_uid IS NULL THEN 1 ELSE 0 END, /*Mitarbeiter account first*/ + CASE WHEN ben.uid IS NULL THEN 1 ELSE 0 END, /*user with account first*/ + ben.insertamum"; + + return $this->execQuery($qry, array($projektarbeit_id)); + } + } diff --git a/application/models/organisation/Organisationseinheit_model.php b/application/models/organisation/Organisationseinheit_model.php index 1b1a826aa..9f64580a9 100644 --- a/application/models/organisation/Organisationseinheit_model.php +++ b/application/models/organisation/Organisationseinheit_model.php @@ -191,7 +191,7 @@ class Organisationseinheit_model extends DB_Model /** * @param string $oe_kurzbz - * + * * @return stdClass */ public function getWithType($oe_kurzbz) @@ -203,18 +203,60 @@ class Organisationseinheit_model extends DB_Model } /** - * Get OEs by eventQuery string. Use with autocomplete event queries. - * @param $eventQuery String - * @return array + * get highest organisation units */ - public function getAutocompleteSuggestions($eventQuery) + public function getHeads() { - $this->addSelect('oe_kurzbz'); - $this->addSelect('organisationseinheittyp_kurzbz, oe_kurzbz, bezeichnung, aktiv, lehre'); - $this->addOrder('organisationseinheittyp_kurzbz, bezeichnung'); + $this->addSelect('*'); + $this->addSelect('oe_kurzbz as head'); + $result = $this->loadWhere(array('oe_parent_kurzbz' => null, 'aktiv' => true)); - return $this->loadWhere(" - oe_kurzbz ILIKE '%". $this->escapeLike($eventQuery). "%' - "); + return $result; + } + + /** + * Ermittelt die Stundenobergrenze fuer Lektoren + * Dabei wird im OE Baum nach oben nach Stundengrenzen gesucht und die niedrigste Stundengrenze ermittelt + * @param $oe_kurzbz Organisationseinheit + * @param $fixangestellt boolean legt fest ob die Grenze + * fuer Freie oder Fixangestellte Lektoren ermittelt werden soll + + */ + public function getStundengrenze($oe_kurzbz, $fixangestellt = true) + { + $fixfrei = $fixangestellt ? 'fix' : 'frei'; + + $qry = " + WITH RECURSIVE oes(oe_kurzbz, oe_parent_kurzbz) as + ( + SELECT oe_kurzbz, oe_parent_kurzbz FROM public.tbl_organisationseinheit + WHERE oe_kurzbz= ? + UNION ALL + SELECT o.oe_kurzbz, o.oe_parent_kurzbz FROM public.tbl_organisationseinheit o, oes + WHERE o.oe_kurzbz=oes.oe_parent_kurzbz + ) + SELECT oe_kurzbz, warn_semesterstunden_{$fixfrei} AS stunden + FROM oes + JOIN public.tbl_organisationseinheit USING (oe_kurzbz) + ORDER BY warn_semesterstunden_{$fixfrei} ASC + LIMIT 1"; + + return $this->execReadOnlyQuery($qry, array($oe_kurzbz)); + } + + public function getAssistenzForOE($oe_kurzbz) { + $qry = " + SELECT person_id, uid, benutzerfunktion_id, funktion_kurzbz, oe_kurzbz, alias, + anrede, trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first + FROM tbl_benutzerfunktion + JOIN public.tbl_benutzer USING(uid) + JOIN public.tbl_person USING(person_id) + WHERE funktion_kurzbz = 'ass' + AND oe_kurzbz = ? + AND (datum_bis IS NULL OR NOW() <= datum_bis) + AND public.tbl_benutzer.aktiv = true + "; + + return $this->execReadOnlyQuery($qry, array($oe_kurzbz)); } } diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index 7ea8a901c..131e1deb5 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -657,37 +657,7 @@ class Studiengang_model extends DB_Model $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); $this->load->model('person/Person_model', 'PersonModel'); $this->load->model('crm/Student_model', 'StudentModel'); - - $addEmailProperty= function(&$benutzerfunktionen){ - if(count($benutzerfunktionen) && defined('DOMAIN')) - { - $benutzerfunktionen = array_map(function($benutzer) - { - $benutzer->email = $benutzer->alias."@".DOMAIN; - return $benutzer; - },$benutzerfunktionen) ; - } - - }; - $addFotoProperty= function(&$collection){ - $collection = array_map(function($item){ - $person_id = $this->PersonModel->getByUid($item->uid); - if(isError($person_id)) - return error($person_id); - $person_id = current(getData($person_id))->person_id; - $this->PersonModel->addSelect('foto'); - $foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id)); - if(isError($foto)) - return error($foto); - $foto = current(getData($foto))->foto; - $item->foto = $foto; - return $item; - },$collection); - }; - - $this->load->model('crm/Student_model', 'StudentModel'); - $student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]); if (isError($student)) return error($student); @@ -709,46 +679,69 @@ class Studiengang_model extends DB_Model if (isError($stg_ltg)) return $stg_ltg; $stg_ltg = getData($stg_ltg) ?: []; - $addFotoProperty($stg_ltg); + $stg_ltg = array_values(array_filter($stg_ltg, function($stg_leitung){ + return $stg_leitung->aktiv; + })); + $this->addFotoProperty($stg_ltg); $gf_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz); if (isError($gf_ltg)) return $gf_ltg; $gf_ltg = getData($gf_ltg) ?: []; - $addEmailProperty($gf_ltg); + $gf_ltg = array_values(array_filter($gf_ltg, function($gf_leitung){ + return $gf_leitung->aktiv; + })); + $this->addEmailProperty($gf_ltg); + $this->addFotoProperty($gf_ltg); $stv_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz); if (isError($stv_ltg)) return $stv_ltg; $stv_ltg = getData($stv_ltg) ?: []; - $addEmailProperty($stv_ltg); - + $stv_ltg = array_values(array_filter($stv_ltg, function($stv_leitung){ + return $stv_leitung->aktiv; + })); + $this->addEmailProperty($stv_ltg); + $this->addFotoProperty($stv_ltg); + $ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz); if (isError($ass)) return $ass; $ass = getData($ass) ?: []; - $addEmailProperty($ass); - $addFotoProperty($ass); + $ass = array_values(array_filter($ass, function($assistenz){ + return $assistenz->aktiv; + })); + $this->addEmailProperty($ass); + $this->addFotoProperty($ass); $hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv'); if (isError($hochschulvertr)) return $hochschulvertr; $hochschulvertr = getData($hochschulvertr) ?: []; - $addEmailProperty($hochschulvertr); + $hochschulvertr = array_values(array_filter($hochschulvertr, function($hochschul_vertreter){ + return $hochschul_vertreter->aktiv; + })); + $this->addEmailProperty($hochschulvertr); $stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz); if (isError($stdv)) return $stdv; $stdv = getData($stdv) ?: []; - $addEmailProperty($stdv); + $stdv = array_values(array_filter($stdv, function($std_vertreter){ + return $std_vertreter->aktiv; + })); + $this->addEmailProperty($stdv); $jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester); if (isError($jahrgangsvertr)) return $jahrgangsvertr; $jahrgangsvertr = getData($jahrgangsvertr) ?: []; - $addEmailProperty($jahrgangsvertr); + $jahrgangsvertr = array_values(array_filter($jahrgangsvertr, function($jahrgang_vertreter){ + return $jahrgang_vertreter->aktiv; + })); + $this->addEmailProperty($jahrgangsvertr); $result_object = new stdClass(); @@ -778,4 +771,141 @@ class Studiengang_model extends DB_Model return $this->execReadOnlyQuery($qry, array($studiengang_kz, $orgform_kurzbz, $studiensemester_kurzbz)); } + + /** + * Get active Studiengänge with Kuerzel by given Studiengang-Kennzahlen. + * Helpful to easily get Studiengänge the user is entitled for. + * + * @param $studiengang_kz_arr + * @param $studiensemester_kurzbz + * @return array|stdClass|null Returns one row per Studiengang. Not considering the Orgforms. + */ + public function getByStgs($studiengang_kz_arr, $studiensemester_kurzbz) + { + if (is_numeric($studiengang_kz_arr)) + { + $studiengang_kz_arr = [$studiengang_kz_arr]; + } + + $qry = ' + SELECT + DISTINCT stg.*, UPPER(typ::varchar(1) || kurzbz) AS kuerzel + FROM + public.tbl_studiengang stg + JOIN lehre.tbl_studienordnung sto USING(studiengang_kz) + JOIN lehre.tbl_studienplan stpl USING(studienordnung_id) + JOIN lehre.tbl_studienplan_semester stplsem USING(studienplan_id) + WHERE + stg.studiengang_kz IN ? + AND stplsem.studiensemester_kurzbz = ? + ORDER BY + stg.kurzbzlang + '; + + return $this->execQuery($qry, [$studiengang_kz_arr, $studiensemester_kurzbz]); + } + + /** + * Get OrgForms of given Studiengang and Studiensemester. + * + * @param $studiengang_kz + * @param $studiensemester_kurzbz + * @return array|stdClass|null + */ + public function getOrgformsByStg($studiengang_kz, $studiensemester_kurzbz) + { + $qry = ' + SELECT + stpl.orgform_kurzbz + FROM + public.tbl_studiengang stg + JOIN lehre.tbl_studienordnung sto USING(studiengang_kz) + JOIN lehre.tbl_studienplan stpl USING(studienordnung_id) + JOIN lehre.tbl_studienplan_semester stplsem USING(studienplan_id) + WHERE + stg.studiengang_kz = ? + AND stg.aktiv = TRUE + AND stplsem.studiensemester_kurzbz = ? + GROUP BY + stpl.orgform_kurzbz + ORDER BY + CASE stpl.orgform_kurzbz + WHEN \'VZ\' THEN 1 + WHEN \'BB\' THEN 2 + WHEN \'DUA\' THEN 3 + ELSE 4 + END, + stpl.orgform_kurzbz; + '; + + return $this->execQuery($qry, [$studiengang_kz, $studiensemester_kurzbz]); + } + + public function getStudiengaengeFiltered($allowed_stg) { + $query ="SELECT DISTINCT + public.tbl_studiengang.studiengang_kz, + public.tbl_studiengang.bezeichnung, + public.tbl_studiengang.kurzbzlang, + public.tbl_studiengang.orgform_kurzbz + FROM public.tbl_studiengang JOIN lehre.tbl_studienordnung USING(studiengang_kz) + JOIN lehre.tbl_studienplan USING(studienordnung_id) + JOIN lehre.tbl_studienplan_semester USING(studienplan_id) + WHERE public.tbl_studiengang.aktiv = true + + AND public.tbl_studiengang.studiengang_kz IN ? + ORDER BY public.tbl_studiengang.kurzbzlang"; + + return $this->execReadOnlyQuery($query, [$allowed_stg]); + } + + public function getAssistenzForStudiengangKZ($stg_kz) { + $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + + $stg_obj = $this->load($stg_kz); + if(isError($stg_obj)) + return error($stg_obj); + if(getData($stg_obj)) + { + $stg_obj = current(getData($stg_obj)); + } + + $ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz); + if (isError($ass)) + return $ass; + $ass = getData($ass) ?: []; + $ass = array_values(array_filter($ass, function($assistenz){ + return $assistenz->aktiv; + })); + + $this->addEmailProperty($ass); + + return success($ass); + } + + private function addEmailProperty(&$benutzerfunktionen) { + if(count($benutzerfunktionen) && defined('DOMAIN')) + { + $benutzerfunktionen = array_map(function($benutzer) + { + $benutzer->email = $benutzer->alias."@".DOMAIN; + return $benutzer; + },$benutzerfunktionen) ; + } + } + + private function addFotoProperty (&$collection) { + $collection = array_map(function($item){ + $person_id = $this->PersonModel->getByUid($item->uid); + if(isError($person_id)) + return error($person_id); + $person_id = current(getData($person_id))->person_id; + $this->PersonModel->addSelect('foto'); + $foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id)); + if(isError($foto)) + return error($foto); + $foto = current(getData($foto))->foto; + $item->foto = $foto; + return $item; + },$collection); + } } diff --git a/application/models/organisation/Studienjahr_model.php b/application/models/organisation/Studienjahr_model.php index a6e1bc575..1686ddc48 100644 --- a/application/models/organisation/Studienjahr_model.php +++ b/application/models/organisation/Studienjahr_model.php @@ -1,4 +1,5 @@ execQuery($query); } + public function getNextStudienjahr() + { + $this->addJoin('public.tbl_studiensemester', 'studienjahr_kurzbz'); + $this->addOrder('start'); + $this->addLimit(1); + + return $this->loadWhere(['start >' => 'NOW()']); + } + public function getNextFrom($studienjahr_kurzbz) + { + $this->addLimit(1); + + return $this->loadWhere([ + 'studienjahr_kurzbz >' => $studienjahr_kurzbz + ]); + } /** * Get the current Studienjahr. During the summer term, continue using the previous Studienjahr. @@ -38,8 +55,7 @@ class Studienjahr_model extends DB_Model */ public function getLastOrAktStudienjahr($days = 60) { - if (!is_numeric($days)) - { + if (!is_numeric($days)) { $days = 60; } @@ -63,8 +79,7 @@ class Studienjahr_model extends DB_Model */ public function getAktOrNextStudienjahr($days = 62) { - if (!is_numeric($days)) - { + if (!is_numeric($days)) { $days = 62; } diff --git a/application/models/organisation/Studienplan_model.php b/application/models/organisation/Studienplan_model.php index e35ba52fb..4a5f87832 100644 --- a/application/models/organisation/Studienplan_model.php +++ b/application/models/organisation/Studienplan_model.php @@ -107,6 +107,8 @@ class Studienplan_model extends DB_Model )); } + // Deprecated + // im Lehrveranstaltung_model vorhanden public function getAllOesForLv($lehrveranstaltung_id) { $this->addDistinct('oe_kurzbz'); @@ -134,4 +136,37 @@ class Studienplan_model extends DB_Model 'prestudent_id' => $prestudent_id ]); } + + public function loadStudienplanLehrveranstaltung($lv_id) + { + $qry = "SELECT studienplan_lehrveranstaltung_id, + semester, + pflicht, + studienplan_id, + koordinator, + studienplan_lehrveranstaltung_id_parent, + lehrveranstaltung_id, + insertamum, + insertvon, + updateamum, + updatevon, + sort, + curriculum, + export + FROM lehre.tbl_studienplan_lehrveranstaltung WHERE studienplan_lehrveranstaltung_id = ? "; + return $this->execReadOnlyQuery($qry, array($lv_id)); + } + + public function getStudienplaeneForPerson($person_id) + { + $this->addDistinct(); + $this->addSelect($this->dbTable . '.*'); + $this->addSelect('ps.*'); + $this->addJoin('public.tbl_prestudentstatus pss', 'studienplan_id'); + $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); + + return $this->loadWhere([ + 'person_id' => $person_id + ]); + } } diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index 0ea5b9328..5fa6ffb14 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -225,7 +225,7 @@ class Studiensemester_model extends DB_Model /** * @param string $student_uid - * + * * @return StdClass */ public function getWhereStudentHasLvs($student_uid) @@ -238,7 +238,7 @@ class Studiensemester_model extends DB_Model $this->db->where("v.lehreverzeichnis<>''"); $this->addOrder($this->dbTable . '.start'); - + return $this->loadWhere(['uid' => $student_uid, 'v.lehre' => true]); } @@ -291,6 +291,42 @@ class Studiensemester_model extends DB_Model return $studienjahrNumber; } + /** + * Get Studienjahr by Studiensemester. + * + * @param $studiensemester_kurzbz + * @return array|stdClass + */ + public function getStudienjahrByStudiensemester($studiensemester_kurzbz) + { + $studienjahrObj = null; + + if (!is_numeric($studiensemester_kurzbz)) + { + $this->StudiensemesterModel->addSelect('studienjahr_kurzbz'); + $result = $this->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz =' => $studiensemester_kurzbz)); + } + + if (hasData($result)) + { + $studienjahr = getData($result)[0]->studienjahr_kurzbz; + $startstudienjahr = substr($studienjahr, 0, 4); + $endstudienjahr = substr($studienjahr, 0, 2) . substr($studienjahr, -2); + + $studienjahrObj = new StdClass(); + + $studienjahrObj->studienjahr_kurzbz = $studienjahr; + $studienjahrObj->startstudienjahr = $startstudienjahr; + $studienjahrObj->endstudienjahr= $endstudienjahr; + } + + if (isError($result)) { + return error(getError($result)); + } + + return success($studienjahrObj); + } + /** * Holt Start und Ende des Studiensemester_kurzbz * @param studiensemester_kurzbz @@ -305,4 +341,10 @@ class Studiensemester_model extends DB_Model WHERE studiensemester_kurzbz = ?",[$studiensemester_kurzbz]); } + + public function isValidStudiensemester($studiensemester_kurzbz) + { + $result = $this->load($studiensemester_kurzbz); + return hasData($result); + } } diff --git a/application/models/person/Benutzergruppe_model.php b/application/models/person/Benutzergruppe_model.php index fba797641..271402ffe 100644 --- a/application/models/person/Benutzergruppe_model.php +++ b/application/models/person/Benutzergruppe_model.php @@ -33,4 +33,16 @@ class Benutzergruppe_model extends DB_Model $uids = (hasData($res)) ? getData($res) : array(); return $uids; } + + /** + * Laedt die Aufnahmegruppe(n) in Abhängigkeit von User und Studiensemester + * @param uid, gruppe_kurzbz, studiensemester_kurzbz + * @return array + */ + public function loadAufnahmegruppen($uid, $stsem) + { + $query = " + SELECT * FROM tbl_gruppe WHERE aufnahmegruppe=true;"; + return $this->execReadOnlyQuery($query); + } } diff --git a/application/models/person/Kontaktverifikation_model.php b/application/models/person/Kontaktverifikation_model.php new file mode 100644 index 000000000..17bcb1c35 --- /dev/null +++ b/application/models/person/Kontaktverifikation_model.php @@ -0,0 +1,42 @@ +dbTable = 'public.tbl_kontakt_verifikation'; + $this->pk = 'kontakt_verifikation_id'; + } + + /** + * Gets contact verification for a person and a verification code + * @param person_id + * @param kontakttyp + * @param verifikation_code + * @param expiration_days number of days after which verifikation code expires + * @return object success or error + */ + public function getKontaktVerifikation($person_id, $kontakttyp, $verifikation_code, $expiration_days = 1) + { + $qry = " + SELECT + kt.kontakt_id, + kv.verifikation_code + FROM + public.tbl_kontakt_verifikation kv + JOIN public.tbl_kontakt kt USING(kontakt_id) + WHERE kt.person_id = ? + AND kt.kontakttyp = ? + AND kv.verifikation_code = ? + AND kv.erstelldatum >= NOW() - INTERVAL '".$this->escape($expiration_days)." days' + ORDER BY + kt.kontakt_id DESC + LIMIT 1"; + + return $this->execQuery($qry, array($person_id, $kontakttyp, $verifikation_code)); + } +} diff --git a/application/models/person/Notiz_model.php b/application/models/person/Notiz_model.php index 2e99d1cdd..64fce8944 100644 --- a/application/models/person/Notiz_model.php +++ b/application/models/person/Notiz_model.php @@ -151,11 +151,24 @@ class Notiz_model extends DB_Model * bestellung_id, lehreinheit_id, anrechnung_id, uid) * @param $id the corresponding id, part of public.tbl_notizzuordnung */ - public function getNotizWithDocEntries($id, $type) + public function getNotizWithDocEntries($id, $type, $withoutTags = true) { $qry = " - SELECT - n.*, count(dms_id) as countDoc, z.notizzuordnung_id, + SELECT + n.*, + CASE + WHEN person_verfasser.vorname IS NOT NULL AND person_verfasser.vorname != '' + OR person_verfasser.nachname IS NOT NULL AND person_verfasser.nachname != '' + THEN CONCAT(person_verfasser.vorname, ' ', person_verfasser.nachname) + ELSE NULL + END AS verfasser, + CASE + WHEN person_bearbeiter.vorname IS NOT NULL AND person_bearbeiter.vorname != '' + OR person_bearbeiter.nachname IS NOT NULL AND person_bearbeiter.nachname != '' + THEN CONCAT(person_bearbeiter.vorname, ' ', person_bearbeiter.nachname) + ELSE NULL + END AS bearbeiter, + count(dms_id) as countDoc, z.notizzuordnung_id, (CASE WHEN n.updateamum >= n.insertamum THEN n.updateamum ELSE n.insertamum @@ -173,14 +186,27 @@ class Notiz_model extends DB_Model public.tbl_notiz_dokument dok USING (notiz_id) LEFT JOIN campus.tbl_dms_version USING (dms_id) + LEFT JOIN + public.tbl_benutzer p_verfasser ON (p_verfasser.uid = n.verfasser_uid) + LEFT JOIN + public.tbl_person person_verfasser ON (person_verfasser.person_id = p_verfasser.person_id) + LEFT JOIN + public.tbl_benutzer p_bearbeiter ON (p_bearbeiter.uid = n.bearbeiter_uid) + LEFT JOIN + public.tbl_person person_bearbeiter ON (person_bearbeiter.person_id = p_bearbeiter.person_id) WHERE - z.$type = ? - GROUP BY - notiz_id, z.notizzuordnung_id + z.$type = ?"; + + if ($withoutTags) + $qry .= " AND n.typ IS NULL "; + + $qry .= "GROUP BY + notiz_id, z.notizzuordnung_id, + person_verfasser.vorname, person_verfasser.nachname, + person_bearbeiter.vorname, person_bearbeiter.nachname "; return $this->execQuery($qry, array($type, $id)); - } diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php index 997048972..e72b24de4 100644 --- a/application/models/person/Person_model.php +++ b/application/models/person/Person_model.php @@ -151,12 +151,21 @@ class Person_model extends DB_Model */ public function searchPerson($filter) { - $this->addSelect('vorname, nachname, gebdatum, person_id'); + $this->addSelect('vorname, nachname, gebdatum, person_id, titelpre, titelpost'); + $this->addSelect("CASE + WHEN EXISTS + (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=tbl_person.person_id) + THEN 'Mitarbeiter' + WHEN EXISTS + (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=tbl_person.person_id) + THEN 'Student' + ELSE 'Person' + END AS status"); $result = $this->loadWhere( - 'lower(nachname) like '.$this->db->escape('%'.$filter.'%')." + 'lower(nachname) like '.$this->db->escape('%'.mb_strtolower($filter).'%')." OR lower(vorname) like ".$this->db->escape('%'.$filter.'%')." - OR lower(nachname || ' ' || vorname) like ".$this->db->escape('%'.$filter.'%')." - OR lower(vorname || ' ' || nachname) like ".$this->db->escape('%'.$filter.'%') + OR lower(nachname || ' ' || vorname) like ".$this->db->escape('%'.mb_strtolower($filter).'%')." + OR lower(vorname || ' ' || nachname) like ".$this->db->escape('%'.mb_strtolower($filter).'%') ); return $result; @@ -307,72 +316,60 @@ class Person_model extends DB_Model public function checkDuplicate($person_id) { - $qry = "SELECT person_id - FROM public.tbl_prestudent p - JOIN - ( - SELECT DISTINCT ON(prestudent_id) * - FROM public.tbl_prestudentstatus - WHERE prestudent_id IN - ( - SELECT prestudent_id - FROM public.tbl_prestudent - WHERE person_id IN - ( - SELECT p2.person_id - FROM public.tbl_person p - JOIN public.tbl_person p2 - ON lower(p.vorname) = lower(p2.vorname) - AND lower(p.nachname) = lower(p2.nachname) - AND p.gebdatum = p2.gebdatum - AND p.person_id = ? - ) - ) - ORDER BY prestudent_id, datum DESC, insertamum DESC - ) ps USING(prestudent_id) - JOIN public.tbl_status USING(status_kurzbz) + $qry = " + WITH person AS ( + SELECT * + FROM public.tbl_person + WHERE person_id = ? + ), + allePersonen AS ( + SELECT p.person_id + FROM public.tbl_person p + JOIN person + ON lower(p.vorname) = lower(person.vorname) + AND lower(p.nachname) = lower(person.nachname) + AND p.gebdatum = person.gebdatum + ), + lastStatus AS ( + SELECT DISTINCT ON (tbl_prestudentstatus.prestudent_id) + tbl_prestudentstatus.prestudent_id, + tbl_prestudentstatus.status_kurzbz, + tbl_prestudent.studiengang_kz, + tbl_prestudent.person_id + FROM public.tbl_prestudentstatus + JOIN public.tbl_prestudent USING (prestudent_id) + WHERE tbl_prestudent.person_id IN (SELECT person_id FROM allePersonen) + ORDER BY tbl_prestudentstatus.prestudent_id, tbl_prestudentstatus.datum DESC, tbl_prestudentstatus.insertamum DESC + ), + interessenten AS ( + SELECT * + FROM lastStatus WHERE status_kurzbz = 'Interessent' - AND studiengang_kz IN - ( - SELECT studiengang_kz - FROM public.tbl_prestudent p - JOIN - ( - SELECT DISTINCT ON(prestudent_id) * - FROM public.tbl_prestudentstatus - WHERE prestudent_id IN - ( - SELECT prestudent_id - FROM public.tbl_prestudent - WHERE person_id IN - ( - SELECT p2.person_id - FROM public.tbl_person p - JOIN public.tbl_person p2 - ON lower(p.vorname) = lower(p2.vorname) - AND lower(p.nachname) = lower(p2.nachname) - AND p.gebdatum = p2.gebdatum - AND p.person_id = ? - ) - ) - ORDER BY prestudent_id, datum DESC, insertamum DESC - ) ps USING(prestudent_id) - JOIN public.tbl_status USING(status_kurzbz) - WHERE status_kurzbz = 'Abbrecher' - ) - - UNION - + ), + keineInteressenten AS ( + SELECT * + FROM lastStatus + WHERE status_kurzbz != 'Interessent' + ), + doppeltePerson AS ( SELECT p2.person_id - FROM tbl_person p1 - JOIN tbl_prestudent ps ON p1.person_id = ps.person_id - INNER JOIN ( - SELECT vorname, nachname, gebdatum, person.person_id - FROM tbl_person person - JOIN tbl_prestudent sps ON person.person_id = sps.person_id - ) p2 - ON (lower(p1.vorname) = lower(p2.vorname) AND lower(p1.nachname) = lower(p2.nachname) AND p1.gebdatum = p2.gebdatum) - WHERE p1.person_id != p2.person_id AND (p1.person_id = ?)"; + FROM public.tbl_person p1 + JOIN public.tbl_prestudent ps1 ON ps1.person_id = p1.person_id + JOIN public.tbl_person p2 + ON lower(p1.vorname) = lower(p2.vorname) + AND lower(p1.nachname) = lower(p2.nachname) + AND p1.gebdatum = p2.gebdatum + WHERE p1.person_id = ? + AND p1.person_id <> p2.person_id + ) + SELECT DISTINCT(interessenten.person_id) + FROM interessenten + JOIN keineInteressenten + ON interessenten.studiengang_kz = keineInteressenten.studiengang_kz + WHERE interessenten.person_id = ? + UNION + SELECT DISTINCT person_id + FROM doppeltePerson"; return $this->execQuery($qry, array($person_id, $person_id, $person_id)); } @@ -423,4 +420,17 @@ class Person_model extends DB_Model return success($result); } } -} \ No newline at end of file + + public function loadAllStudentUIDSForPersonID($person_id) { + $qry = "SELECT + CONCAT(tp.vorname, ' ', tp.nachname) AS name, + ARRAY_AGG(DISTINCT b.uid ORDER BY b.uid) AS uids + FROM public.tbl_student s + JOIN public.tbl_benutzer b ON s.student_uid = b.uid + JOIN public.tbl_person tp ON b.person_id = tp.person_id + GROUP BY tp.vorname, tp.nachname, b.aktiv, b.person_id + HAVING b.person_id = ? AND b.aktiv IS TRUE;"; + + return $this->execReadOnlyQuery($qry, [$person_id]); + } +} diff --git a/application/models/person/Profil_update_model.php b/application/models/person/Profil_update_model.php index ffb04b7e7..039810537 100644 --- a/application/models/person/Profil_update_model.php +++ b/application/models/person/Profil_update_model.php @@ -63,6 +63,7 @@ class Profil_update_model extends DB_Model $this->addSelect(["public.tbl_profil_update.*", "public.tbl_person.vorname"]); $this->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_profil_update.uid"); $this->addJoin("public.tbl_person", "public.tbl_person.person_id = public.tbl_benutzer.person_id"); + $this->db->order_by('COALESCE(public.tbl_profil_update.updateamum, public.tbl_profil_update.insertamum)', 'DESC', false); $res = $this->loadWhere($whereClause); if (isError($res)) { return $res; @@ -118,13 +119,48 @@ class Profil_update_model extends DB_Model $parameters = []; $query = " SELECT - profil_update_id, tbl_profil_update.uid, (tbl_person.vorname || ' ' || tbl_person.nachname) AS name , topic, requested_change, tbl_profil_update.updateamum, tbl_profil_update.updatevon, tbl_profil_update.insertamum, tbl_profil_update.insertvon, status, public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] as status_translated, status_timestamp, status_message, attachment_id + profil_update_id, + tbl_profil_update.uid, + (tbl_person.vorname || ' ' || tbl_person.nachname) AS name , + topic, + requested_change, + tbl_profil_update.updateamum, + tbl_profil_update.updatevon, + tbl_profil_update.insertamum, + tbl_profil_update.insertvon, + status, + public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] as status_translated, + status_timestamp, + status_message, + attachment_id, + UPPER(public.tbl_studiengang.typ || public.tbl_studiengang.kurzbz) AS studiengang, + COALESCE(of.orgform_kurzbz, public.tbl_studiengang.orgform_kurzbz) AS orgform, + NULL as oezuordnung, + tbl_student.semester FROM public.tbl_profil_update JOIN public.tbl_profil_update_status ON public.tbl_profil_update_status.status_kurzbz = public.tbl_profil_update.status JOIN public.tbl_student ON public.tbl_student.student_uid=public.tbl_profil_update.uid JOIN public.tbl_benutzer ON public.tbl_benutzer.uid = public.tbl_student.student_uid JOIN public.tbl_person ON public.tbl_benutzer.person_id=public.tbl_person.person_id JOIN public.tbl_studiengang ON public.tbl_studiengang.studiengang_kz=public.tbl_student.studiengang_kz + LEFT JOIN ( + select + pss.prestudent_id, COALESCE(sp.orgform_kurzbz, pss.orgform_kurzbz) as orgform_kurzbz + from ( + select + prestudent_id, max(insertamum) as insertamum + from + public.tbl_prestudentstatus + where + datum <= NOW() + group by + prestudent_id + ) mpss + join + public.tbl_prestudentstatus pss on pss.prestudent_id = mpss.prestudent_id and pss.insertamum = mpss.insertamum + left join + lehre.tbl_studienplan sp on pss.studienplan_id = sp.studienplan_id + ) of ON of.prestudent_id = public.tbl_student.prestudent_id Where public.tbl_studiengang.oe_kurzbz IN ? "; $parameters[] = $oe_berechtigung; if ($whereClause) { @@ -144,12 +180,33 @@ class Profil_update_model extends DB_Model } } if ($mitarbeiterBerechtigung) { - $this->addSelect(["profil_update_id", "tbl_profil_update.uid", "(tbl_person.vorname || ' ' || tbl_person.nachname) AS name", "topic", "requested_change", "tbl_profil_update.updateamum", "tbl_profil_update.updatevon", "tbl_profil_update.insertamum", "tbl_profil_update.insertvon", "status", "public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] AS status_translated", "status_timestamp", "status_message", "attachment_id"]); + $this->addSelect([ + "profil_update_id", + "tbl_profil_update.uid", + "(tbl_person.vorname || ' ' || tbl_person.nachname) AS name", + "topic", + "requested_change", + "tbl_profil_update.updateamum", + "tbl_profil_update.updatevon", + "tbl_profil_update.insertamum", + "tbl_profil_update.insertvon", + "status", + "public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] AS status_translated", + "status_timestamp", + "status_message", + "attachment_id", + "COALESCE(NULL) as studiengang", + "COALESCE(NULL) as orgform", + "oe.bezeichnung as oezuordnung" + ]); $this->addJoin('tbl_profil_update_status', 'tbl_profil_update_status.status_kurzbz=tbl_profil_update.status'); $this->addJoin('tbl_mitarbeiter', 'tbl_mitarbeiter.mitarbeiter_uid=tbl_profil_update.uid'); $this->addJoin('tbl_benutzer', 'tbl_benutzer.uid=tbl_profil_update.uid'); $this->addJoin('tbl_person', 'tbl_benutzer.person_id=tbl_person.person_id'); + $this->addJoin('tbl_benutzerfunktion bf', 'bf.uid = tbl_benutzer.uid AND bf.funktion_kurzbz = \'oezuordnung\' AND NOW() >= COALESCE(bf.datum_von, \'1970-01-01\'::date) AND NOW() <= COALESCE(bf.datum_bis, \'2170-12-31\'::date)', 'LEFT'); + $this->addJoin('tbl_organisationseinheit oe', 'oe.oe_kurzbz = bf.oe_kurzbz', 'LEFT'); $mitarbeiterRequests = $this->loadWhere($whereClause); + if (isError($mitarbeiterRequests)) return error("db error: " . getData($mitarbeiterRequests)); $mitarbeiterRequests = getData($mitarbeiterRequests) ?: []; @@ -179,8 +236,11 @@ class Profil_update_model extends DB_Model private function formatProfilRequest($request) { $request->requested_change = json_decode($request->requested_change); + $request->insertamum_iso = !is_null($request->insertamum) ? date_create($request->insertamum)->format('Y-m-d') : null; $request->insertamum = !is_null($request->insertamum) ? date_create($request->insertamum)->format('d.m.Y') : null; + $request->updateamum_iso = !is_null($request->updateamum) ? date_create($request->updateamum)->format('Y-m-d') : null; $request->updateamum = !is_null($request->updateamum) ? date_create($request->updateamum)->format('d.m.Y') : null; + $request->status_timestamp_iso = !is_null($request->status_timestamp) ? date_create($request->status_timestamp)->format('Y-m-d') : null; $request->status_timestamp = !is_null($request->status_timestamp) ? date_create($request->status_timestamp)->format('d.m.Y') : null; } diff --git a/application/models/ressource/Betriebsmittelperson_model.php b/application/models/ressource/Betriebsmittelperson_model.php index 6da9a384d..219af51b8 100644 --- a/application/models/ressource/Betriebsmittelperson_model.php +++ b/application/models/ressource/Betriebsmittelperson_model.php @@ -97,7 +97,7 @@ class Betriebsmittelperson_model extends DB_Model return $this->loadWhere($condition); } - public function getBetriebsmittelData($id, $type_id) + public function getBetriebsmittelData($id, $type_id, $betriesmitteltypes = null) { switch ($type_id) { case 'person_id': @@ -113,6 +113,15 @@ class Betriebsmittelperson_model extends DB_Model return error("ID nicht gültig"); } + $cond .= " = ? "; + $params[] = $id; + + if ($betriesmitteltypes && !isEmptyArray($betriesmitteltypes)) + { + $cond .= " AND bm.betriebsmitteltyp IN ?"; + $params[] = $betriesmitteltypes; + } + $query = " SELECT bm.nummer, bmp.person_id, bm.betriebsmitteltyp, bmp.anmerkung as anmerkung, @@ -126,9 +135,9 @@ class Betriebsmittelperson_model extends DB_Model JOIN wawi.tbl_betriebsmittel bm ON (bmp.betriebsmittel_id = bm.betriebsmittel_id) WHERE - " . $cond . " = ? "; + " . $cond; - return $this->execQuery($query, array($id)); + return $this->execQuery($query, $params); } /** diff --git a/application/models/ressource/Firma_model.php b/application/models/ressource/Firma_model.php index 431f0815f..5ae53eeaf 100644 --- a/application/models/ressource/Firma_model.php +++ b/application/models/ressource/Firma_model.php @@ -12,17 +12,24 @@ class Firma_model extends DB_Model $this->pk = 'firma_id'; } - public function searchFirmen($filter) + public function searchFirmen($filter, $aktiv = null) { + $params = []; $filter = strtoLower($filter); $qry = " - SELECT + SELECT f.name, f.firma_id - FROM - public.tbl_firma f - WHERE - lower (f.name) LIKE '%". $this->db->escape_like_str($filter)."%'"; + FROM + public.tbl_firma f + WHERE + lower (f.name) LIKE '%". $this->db->escape_like_str($filter)."%'"; - return $this->execQuery($qry); + if (isset($aktiv) && is_bool($aktiv)) + { + $params[] = $aktiv; + $qry .= " AND aktiv = ?"; + } + + return $this->execQuery($qry, $params); } } diff --git a/application/models/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php index 836f5d65a..a650643f1 100644 --- a/application/models/ressource/Mitarbeiter_model.php +++ b/application/models/ressource/Mitarbeiter_model.php @@ -12,34 +12,34 @@ class Mitarbeiter_model extends DB_Model $this->pk = 'mitarbeiter_uid'; } - /** - * Checks if the user is a Mitarbeiter. - * @param string $uid - * @param boolean null $fixangestellt - * @return array - */ - public function isMitarbeiter($uid, $fixangestellt = null) - { - $this->addSelect('1'); + /** + * Checks if the user is a Mitarbeiter. + * @param string $uid + * @param boolean null $fixangestellt + * @return array + */ + public function isMitarbeiter($uid, $fixangestellt = null) + { + $this->addSelect('1'); - if (is_bool($fixangestellt)) - { - $result = $this->loadWhere(array('mitarbeiter_uid' => $uid, 'fixangestellt' => $fixangestellt)); - } - else // default - { - $result = $this->loadWhere(array('mitarbeiter_uid' => $uid)); - } + if (is_bool($fixangestellt)) + { + $result = $this->loadWhere(array('mitarbeiter_uid' => $uid, 'fixangestellt' => $fixangestellt)); + } + else // default + { + $result = $this->loadWhere(array('mitarbeiter_uid' => $uid)); + } - if(hasData($result)) - { - return success(true); - } - else - { - return success(false); - } - } + if(hasData($result)) + { + return success(true); + } + else + { + return success(false); + } + } /** * Laedt das Personal @@ -98,6 +98,129 @@ class Mitarbeiter_model extends DB_Model return $this->execQuery($qry, $params); } + /** + * gibt Personen mit Übersicht von Vertragsdaten aus + * + * @return array + */ + public function getPersonenWithContractDetails($person_id = null) + { + $qry = " + SELECT + b.uid , p.person_id, + p.vorname, p.nachname, + gebdatum, + COALESCE(b.alias, b.uid) AS email, + STRING_AGG(DISTINCT va.bezeichnung, ', ') AS Vertragsarten, + STRING_AGG(DISTINCT u.bezeichnung, ', ') AS Unternehmen, + STRING_AGG(d.dienstverhaeltnis_id::TEXT, ', ') AS ids, + b.aktiv + FROM + hr.tbl_dienstverhaeltnis d + JOIN + public.tbl_benutzer b ON d.mitarbeiter_uid = b.uid + JOIN + public.tbl_person p ON p.person_id = b.person_id + JOIN + public.tbl_organisationseinheit u ON d.oe_kurzbz = u.oe_kurzbz + JOIN + hr.tbl_vertragsart va ON d.vertragsart_kurzbz = va.vertragsart_kurzbz + "; + + if($person_id) + { + $qry .= " WHERE p.person_id = ?"; + } + + $qry.= " + GROUP BY + b.uid, p.person_id, p.vorname, p.nachname, b.alias + ORDER BY + p.nachname, p.vorname; + "; + + $params = array($person_id); + + return $this->execQuery($qry, $params); + } + + /** + * get current disciplinary Abteilung of person + * + * @param $person_id + * + * @return Array benutzerfunktionsdata + */ + public function getPersonAbteilung($uid) + { + $qry = " + SELECT + bf.benutzerfunktion_id, bf.fachbereich_kurzbz, bf.uid, bf.funktion_kurzbz, bf.updateamum, + bf.updatevon, bf.insertamum, bf.insertvon, bf.ext_id, bf.semester, bf.oe_kurzbz, + bf.datum_von, bf.datum_bis, bf.bezeichnung, bf.wochenstunden, + oe.oe_kurzbz, oe.oe_parent_kurzbz, oe.bezeichnung, + oe.organisationseinheittyp_kurzbz, oe.aktiv, oe.mailverteiler, + oe.freigabegrenze, oe.kurzzeichen, oe.lehre, oe.standort, + oe.warn_semesterstunden_frei, oe.warn_semesterstunden_fix, oe.standort_id + FROM tbl_benutzerfunktion bf + JOIN public.tbl_organisationseinheit oe USING(oe_kurzbz) + WHERE uid = ? + AND funktion_kurzbz = 'oezuordnung' + AND datum_von <= NOW() + AND (datum_bis IS NULL OR datum_bis >= NOW()) + "; + $result = $this->execQuery($qry, [$uid]); + + return $result; + } + + /** + * get Leitung / Vorgesetzten of current OE + * + * @param $oe_kurzbz + * + * @return Array persondata / benutzerfunktionsdata + */ + public function getLeitungOrg($oe_kurzbz) + { + $qry = " + SELECT bf.benutzerfunktion_id,bf.fachbereich_kurzbz,bf.uid,bf.funktion_kurzbz, + bf.updateamum,bf.updatevon,bf.insertamum,bf.insertvon,bf.ext_id,bf.semester, + bf.oe_kurzbz,bf.datum_von,bf.datum_bis,bf.bezeichnung,bf.wochenstunden, + p.person_id, p.vorname,p.nachname,p.titelpre,p.titelpost + FROM public.tbl_benutzerfunktion bf JOIN public.tbl_organisationseinheit oe USING(oe_kurzbz) + JOIN public.tbl_benutzer b USING (uid) JOIN public.tbl_mitarbeiter ma ON(b.uid=ma.mitarbeiter_uid) + JOIN public.tbl_person p USING(person_id) + WHERE funktion_kurzbz='Leitung' AND oe.oe_kurzbz = ? + AND datum_von<=now() AND (datum_bis is null OR datum_bis>=now()); + "; + + return $this->execQuery($qry, array($oe_kurzbz)); + } + + /** + * get persondata for person_id + * + * @param $oe_kurzbz + * + * @return Array persondata + */ + public function getHeader($person_id) + { + $qry = " + SELECT + titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe + FROM + public.tbl_person + JOIN public.tbl_benutzer b USING(person_id) + JOIN public.tbl_mitarbeiter ma ON (ma.mitarbeiter_uid = b.uid) + WHERE + person_id = ? + "; + + return $this->execQuery($qry, array($person_id)); + } + /** * Gibt ein Array mit den UIDs der Vorgesetzten zurück * @return object @@ -213,7 +336,7 @@ class Mitarbeiter_model extends DB_Model if (hasData($kurzbzexists) && getData($kurzbzexists)[0]) return error('No Kurzbezeichnung could be generated'); - + return success($kurzbz); } @@ -230,27 +353,33 @@ class Mitarbeiter_model extends DB_Model { $filter = strtoLower($filter); + $returnwert = "p.person_id, p.nachname, p.vorname, p.titelpost, p.titelpre"; + if ($mode == "mitAkadGrad") - $returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; + $returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; elseif ($mode == "ohneMaUid") - $returnwert = "p.person_id, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter"; + $returnwert .= ", CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter"; else - $returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; + $returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; $qry = " SELECT " . $returnwert . " FROM - public.tbl_mitarbeiter ma + public.tbl_mitarbeiter ma JOIN - public.tbl_benutzer b on (ma.mitarbeiter_uid = b.uid) + public.tbl_benutzer b on (ma.mitarbeiter_uid = b.uid) JOIN - public.tbl_person p on (p.person_id = b.person_id) + public.tbl_person p on (p.person_id = b.person_id) WHERE - lower (p.nachname) LIKE '%". $this->db->escape_like_str($filter)."%' + lower (p.nachname) LIKE '%". $this->db->escape_like_str($filter)."%' OR lower (p.vorname) LIKE '%". $this->db->escape_like_str($filter)."%' OR - (ma.mitarbeiter_uid) LIKE '%". $this->db->escape_like_str($filter)."%'"; + (ma.mitarbeiter_uid) LIKE '%". $this->db->escape_like_str($filter)."%' + OR + lower(vorname || ' ' || nachname || ' ' || vorname) like ".$this->db->escape('%'.mb_strtolower($filter).'%')." + ORDER BY + p.nachname, p.vorname, b.uid, p.person_id"; return $this->execQuery($qry); } @@ -261,14 +390,14 @@ class Mitarbeiter_model extends DB_Model * @param $lehrveranstaltung_id * @return array with Mitarbeiter and their Lehreinheiten */ - public function getMitarbeiterFromLV($lehrveranstaltung_id){ - //TODO(manu) maybe filter that in pruefungslist.js ? - $qry = "SELECT DISTINCT - lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid + public function getMitarbeiterFromLV($lehrveranstaltung_id) + { + $qry = "SELECT DISTINCT + lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid FROM - lehre.tbl_lehreinheitmitarbeiter, campus.vw_mitarbeiter, lehre.tbl_lehreinheit + lehre.tbl_lehreinheitmitarbeiter, campus.vw_mitarbeiter, lehre.tbl_lehreinheit WHERE - lehrveranstaltung_id= ? + lehrveranstaltung_id= ? AND mitarbeiter_uid=uid AND @@ -278,4 +407,47 @@ class Mitarbeiter_model extends DB_Model return $this->execQuery($qry, $parametersArray); } + + /** + * Get Lektoren by studiengang_kz + * + * @param $studiengang_kz + * @return array with Mitarbeiter + */ + public function getLektoren($studiengang_kz) + { + $qry = " + SELECT DISTINCT + campus.vw_mitarbeiter.uid, + campus.vw_mitarbeiter.vorname, + campus.vw_mitarbeiter.nachname, + studiengang_kz, + tbl_studiengang.typ, + tbl_studiengang.kurzbz AS stg_kurzbz + FROM + campus.vw_mitarbeiter + JOIN public.tbl_benutzerfunktion USING (uid) + JOIN public.tbl_studiengang USING(oe_kurzbz) + WHERE studiengang_kz = ? + AND lektor is true + ORDER BY campus.vw_mitarbeiter.nachname"; + + $parametersArray = array($studiengang_kz); + + return $this->execQuery($qry, $parametersArray); + } + + public function isLehrauftragFirma($mitarbeiter_uid) + { + $this->addSelect('firma_id'); + $this->addJoin('public.tbl_benutzer', 'uid = mitarbeiter_uid'); + $this->addJoin('public.tbl_person', 'person_id'); + $this->addJoin('public.tbl_adresse', 'person_id', 'LEFT'); + $this->addOrder('zustelladresse', 'DESC'); + $this->addOrder('firma_id'); + $this->addLimit(1); + $firma_result = $this->loadWhere(array('mitarbeiter_uid' => $mitarbeiter_uid)); + $firma = getData($firma_result)[0]->firma_id; + return !is_null($firma); + } } diff --git a/application/models/ressource/Reservierung_model.php b/application/models/ressource/Reservierung_model.php index f635d0cb1..0c391ea20 100644 --- a/application/models/ressource/Reservierung_model.php +++ b/application/models/ressource/Reservierung_model.php @@ -21,7 +21,7 @@ class Reservierung_model extends DB_Model public function getReservierungen($start_date, $end_date, $ort_kurzbz = null) { - $stundenplan_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),'/')) @@ -46,7 +46,7 @@ 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)? $stundenplan_reservierungen_query:$raum_reservierungen_query; + $subquery = is_null($ort_kurzbz)? $lvplan_reservierungen_query:$raum_reservierungen_query; $query_result= $this->execReadOnlyQuery(" SELECT @@ -76,7 +76,7 @@ class Reservierung_model extends DB_Model * * @return stdClass */ - public function getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz = null) + public function getReservierungenMitarbeiter($start_date, $end_date) { $raum_reservierungen_query = "SELECT res.*, beginn, ende, @@ -89,7 +89,6 @@ class Reservierung_model extends DB_Model JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde WHERE res.uid = ? AND datum >= ? AND datum <= ?"; -// $subquery = is_null($ort_kurzbz)? $stundenplan_reservierungen_query:$raum_reservierungen_query; $subquery = $raum_reservierungen_query; diff --git a/application/models/ressource/Stunde_model.php b/application/models/ressource/Stunde_model.php index 05a9cddff..0203163f7 100644 --- a/application/models/ressource/Stunde_model.php +++ b/application/models/ressource/Stunde_model.php @@ -11,4 +11,19 @@ class Stunde_model extends DB_Model $this->dbTable = 'lehre.tbl_stunde'; $this->pk = 'stunde'; } + + /** + * $time needs to be of PGSQL TIME format + */ + public function getStundeForTime($time) { + $query = " + SELECT min(stunde) as stunde FROM ( + SELECT stunde, extract(epoch from (beginn-?)) AS delta FROM lehre.tbl_stunde + UNION + SELECT stunde, extract(epoch from (ende-?)) AS delta FROM lehre.tbl_stunde + ) foo WHERE delta>=0 + "; + + return $this->execReadOnlyQuery($query, [$time, $time]); + } } diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 012ce0a57..d0a97ed9d 100644 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -50,7 +50,6 @@ class Stundenplan_model extends DB_Model */ public function groupedCalendarEvents($ort_kurzbz,$start_date,$end_date){ - $gruppierteEvents= $this->execReadOnlyQuery(" SELECT @@ -178,7 +177,7 @@ class Stundenplan_model extends DB_Model ) as subquery - GROUP BY unr, datum, beginn, ende, ort_kurzbz, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id + GROUP BY unr, datum, beginn, ende, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id ORDER BY datum, beginn "); @@ -186,6 +185,99 @@ class Stundenplan_model extends DB_Model return $query_result; } + /** + * groups rows of a subquery that fetches data from the lehre.vw_stundenplan table or lehre.vw_stundenplandev + * @param string $stundenplanViewQuery the subquery used to group the result regarding consecutive hours (Tab LV Termine) + * + * @return stdClass + */ + public function stundenplanGruppierungConsecutive($stundenplanViewQuery) + { + $query_result = $this->execReadOnlyQuery(" + SELECT + distinct lehrveranstaltung_id, + datum, + MIN(beginn) as beginn, + MAX(ende) as ende, + type, + topic, + gruppe, + ort_kurzbz, + lehreinheit_id, + lehrfach_bez, + lektor, + lektorname, + gruppen_kuerzel, + farbe + FROM + ( + SELECT + 'lehreinheit' as type, beginn, ende, datum, + CONCAT(lehrfach,'-',lehrform) as topic, + array_agg(DISTINCT lektor) as lektor, + array_agg(DISTINCT lektorname) as lektorname, + array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe, + array_agg(DISTINCT (gruppen_kuerzel)) as gruppen_kuerzel, + 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 lektor + END as lektor, + CASE + WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz + ELSE (SELECT UPPER(typ || kurzbz) + FROM public.tbl_studiengang + WHERE studiengang_kz=sp.studiengang_kz) || COALESCE(sp.semester,'0') || COALESCE(sp.verband,'') || COALESCE(sp.gruppe,'') + 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, + ort_kurzbz, studiengang_kz, titel,lehreinheit_id,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, + CONCAT(p.nachname, ' ', p.vorname) as lektorname + + FROM (".$stundenplanViewQuery.") sp + JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde + LEFT JOIN public.tbl_benutzer bn ON bn.uid = sp.uid + LEFT JOIN public.tbl_person p ON p.person_id = bn.person_id + ) as subquery + + GROUP BY unr, datum, beginn, ende, ort_kurzbz, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, + farbe, lehrveranstaltung_id + + ORDER BY datum, beginn) t + + GROUP BY + lehrveranstaltung_id, + type, + datum, + topic, + lektor, + lehrfach_bez, + gruppe, + ort_kurzbz, + lehreinheit_id, + lektorname, + gruppen_kuerzel, + farbe + ORDER BY + datum, beginn + " + ); + return $query_result; + } + /** * queries Stundenplan but for a whole lva, irrespective of who is requesting it * @@ -235,7 +327,7 @@ class Stundenplan_model extends DB_Model ) as subquery - GROUP BY unr, datum, beginn, ende, ort_kurzbz, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id + GROUP BY unr, datum, beginn, ende, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id ORDER BY datum, beginn ", [$start_date, $end_date, $lv_id]); @@ -292,7 +384,7 @@ class Stundenplan_model extends DB_Model ) as subquery - GROUP BY unr, datum, beginn, ende, ort_kurzbz, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id + GROUP BY unr, datum, beginn, ende, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id ORDER BY datum, beginn", [$start_date, $end_date, $ma_uid]); } @@ -300,10 +392,13 @@ class Stundenplan_model extends DB_Model /** * NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester. * + * @param isLvList if condition needed for Tab LV Termine is given + * @param db_stpl_table enables switch to db 'stundenplandev' + * * @return mixed */ - public function getStundenplanQuery($start_date, $end_date,$semester,$gruppen,$studentlehrverbaende){ - + public function getStundenplanQuery($start_date, $end_date, $semester, $gruppen, $studentlehrverbaende, $isLvList=false, $db_stpl_table='stundenplan'){ + // helper function to check if either $gruppen or $studentlehrverbaende are empty for each semester $emptyCheck = function($toBeCheckedArray) use ($semester){ $result = true; @@ -325,7 +420,7 @@ class Stundenplan_model extends DB_Model $query = "select sp.* - from lehre.vw_stundenplan sp + from lehre.vw_".$db_stpl_table." sp WHERE sp.datum >= ".$this->escape($start_date)." AND sp.datum <= ".$this->escape($end_date); @@ -335,10 +430,10 @@ class Stundenplan_model extends DB_Model { $query .= " AND ( "; } - + foreach($semester as $sem => $semester_date_range) { - + foreach($semester_date_range as $sem_date => $sem_date_range) { // if there are not groups for the semester skip the iteration step @@ -358,7 +453,13 @@ class Stundenplan_model extends DB_Model { $query = substr($query, 0, -2); } - + + //Condition for showLVList FHC4 + if(!$isLvList) + $stringGroupLv = "AND gruppe_kurzbz is null"; + else + $stringGroupLv =""; + foreach($semester as $sem=>$semester_date_range) { foreach($semester_date_range as $sem_date => $sem_date_range) @@ -369,14 +470,14 @@ class Stundenplan_model extends DB_Model } foreach($studentlehrverbaende[$sem_date] 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).")"; + $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 $query .= "OR (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 is null OR sp.gruppe='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")"; // Eintraege fuer das ganze Semester - $query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND (sp.verband is null OR sp.verband='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).") AND gruppe_kurzbz is null)"; - + $query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND (sp.verband is null OR sp.verband='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start) + ." AND ".$this->escape($sem_date_range->ende).")) AND gruppe_kurzbz is null)"; + $query .="OR"; - } } } @@ -435,4 +536,52 @@ class Stundenplan_model extends DB_Model return $this->execQuery($query, [$uid, $uid]); } + /** + * Get Stundenplantermine for given Lehreinheit. + * + * @param $lehreinheit_id + * @return array|stdClass|null + */ + public function getTermineByLe($lehreinheit_id) + { + $qry = ' + SELECT DISTINCT + datum + FROM + lehre.vw_stundenplan + WHERE + lehreinheit_id = ? + ORDER BY + datum ASC + '; + + return $this->execQuery($qry, [$lehreinheit_id]); + } + + /** + * Get Stundenplantermine for given Lehrveranstaltung of given Studiensemester. + * + * @param $lehrveranstaltung_id + * @param $studiensemester_kurzbz + * @return array|stdClass|null + */ + public function getTermineByLv($lehrveranstaltung_id, $studiensemester_kurzbz) + { + $qry = ' + SELECT DISTINCT + datum + FROM + lehre.vw_stundenplan + WHERE + lehreinheit_id IN ( + SELECT lehreinheit_id + FROM lehre.tbl_lehreinheit + WHERE lehrveranstaltung_id = ? + AND studiensemester_kurzbz = ? + ) + ORDER BY datum ASC + '; + + return $this->execQuery($qry, [$lehrveranstaltung_id, $studiensemester_kurzbz]); + } } diff --git a/application/models/ressource/Stundenplandev_model.php b/application/models/ressource/Stundenplandev_model.php index 800540d60..e718ba073 100644 --- a/application/models/ressource/Stundenplandev_model.php +++ b/application/models/ressource/Stundenplandev_model.php @@ -10,6 +10,9 @@ class Stundenplandev_model extends DB_Model parent::__construct(); $this->dbTable = 'lehre.tbl_stundenplandev'; $this->pk = 'stundenplandev_id'; + + $this->load->model('education/lehreinheit_model', 'LehreinheitModel'); + $this->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel'); } @@ -157,4 +160,85 @@ class Stundenplandev_model extends DB_Model return $this->execQuery($qry, $params); } + public function deleteGroupPlanning($lehreinheit_id, $lehreinheitgruppe_id) + { + $lehreinheit = $this->LehreinheitModel->load($lehreinheit_id); + + if (!hasData($lehreinheit)) + return error ('No Lehreinheit found!'); + + $lehreinheitgruppe = $this->LehreinheitgruppeModel->load($lehreinheitgruppe_id); + + if (!hasData($lehreinheitgruppe)) + return error ('No Lehreinheitgruppe found!'); + + $this->addJoin('lehre.tbl_stundenplan_betriebsmittel', 'stundenplandev_id'); + $this->addJoin('lehre.tbl_lehreinheitgruppe', 'lehreinheit_id'); + $this->db->where('tbl_lehreinheitgruppe.lehreinheitgruppe_id', $lehreinheitgruppe_id); + + $this->db->group_start(); + $this->db->group_start(); + $this->db->where('tbl_lehreinheitgruppe.gruppe_kurzbz IS NOT NULL', null, false); + $this->db->where('tbl_lehreinheitgruppe.gruppe_kurzbz = tbl_stundenplandev.gruppe_kurzbz', null, false); + $this->db->group_end(); + $this->db->or_group_start(); + $this->db->where('tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL', null, false); + $this->db->where('tbl_lehreinheitgruppe.studiengang_kz = tbl_stundenplandev.studiengang_kz', null, false); + $this->db->where('tbl_lehreinheitgruppe.semester = tbl_stundenplandev.semester', null, false); + $this->db->where('tbl_lehreinheitgruppe.verband = tbl_stundenplandev.verband', null, false); + $this->db->where('tbl_lehreinheitgruppe.gruppe = tbl_stundenplandev.gruppe', null, false); + $this->db->group_end(); + $this->db->group_end(); + + $betriebsmittel_result = $this->load(); + $betriebsmittel_array = hasData($betriebsmittel_result) ? getData($betriebsmittel_result) : array(); + if (sizeof($betriebsmittel_array) > 0) + { + return error ('Gruppe kann nicht entfernt werden da bereits Ressourcen zugeordnet wurden'); + } + + $this->addSelect('stundenplandev_id'); + $this->addJoin('lehre.tbl_lehreinheitgruppe', + "tbl_stundenplandev.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id + AND tbl_stundenplandev.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz + AND tbl_stundenplandev.semester = tbl_lehreinheitgruppe.semester + AND trim(COALESCE(tbl_stundenplandev.verband, '')) = trim(COALESCE(tbl_lehreinheitgruppe.verband, '')) + AND trim(COALESCE(tbl_stundenplandev.gruppe, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe, '')) + AND trim(COALESCE(tbl_stundenplandev.gruppe_kurzbz, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, ''))" + ); + $stundenplan_result = $this->loadWhere(array('tbl_lehreinheitgruppe.lehreinheitgruppe_id' => $lehreinheitgruppe_id)); + + if (hasData($stundenplan_result)) + { + $stundenplan_ids = array_column(getData($stundenplan_result), 'stundenplandev_id'); + $this->db->where_in('stundenplandev_id', $stundenplan_ids); + $delete_result = $this->db->delete('lehre.tbl_stundenplandev'); + + if ($delete_result) + return success('Group deleted successfully from Stundenplandev'); + else + return error('Error deleting Group from Stundenplandev'); + } + } + + public function deleteLektorPlanning($lehreinheit_id, $mitarbeiter_uid) + { + //TODO (david) prüfen ob der check notwendig ist + /*$this->addDistinct('mitarbeiter_uid'); + $this->addSelect('mitarbeiter_uid'); + $stundenplan_result = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); + $stundenplan_array = hasData($stundenplan_result) ? (getData($stundenplan_result)) : array(); + + if (sizeof($stundenplan_array) <= 1) + return error('Diese/r LektorIn kann nicht aus dem LVPlan entfernt werden da dies der/die letzte verplante LektorIn ist');*/ + + $this->addJoin('lehre.tbl_stundenplan_betriebsmittel', 'stundenplandev_id'); + $betriebsmittel_result = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'tbl_stundenplandev.mitarbeiter_uid' => $mitarbeiter_uid)); + $betriebsmittel_array = hasData($betriebsmittel_result) ? getData($betriebsmittel_result) : array(); + + if (sizeof($betriebsmittel_array) > 0) + return error('Gruppe kann nicht entfernt werden da bereits Ressourcen zugeordnet wurden'); + + return $this->delete(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid)); + } } diff --git a/application/models/ressource/Stundensatz_model.php b/application/models/ressource/Stundensatz_model.php index 10f5a6aa1..2a7418924 100644 --- a/application/models/ressource/Stundensatz_model.php +++ b/application/models/ressource/Stundensatz_model.php @@ -2,7 +2,7 @@ class Stundensatz_model extends DB_Model { - + /** * Constructor */ @@ -42,4 +42,121 @@ class Stundensatz_model extends DB_Model return $this->execQuery($qry, $params); } -} \ No newline at end of file + + public function getStundensatzForMitarbeiter($person_id, $studiensemester_kurzbz) + { + $this->load->config('stv'); + + $defaultStundensatz = $this->config->item('tabs')['projektarbeit']['defaultProjektbetreuerStundensatz']; + + $stundensatz = ''; + + if(isset($person_id) && isset($studiensemester_kurzbz)) + { + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $this->StudiensemesterModel->addSelect('start, ende'); + $result = $this->StudiensemesterModel->load($studiensemester_kurzbz); + + if (hasData($result)) + { + $studiensemester = getData($result)[0]; + + if (defined('FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ') && !FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ) + { + // load Mitarbeiter + $params = [$person_id]; + $qry = " + SELECT + mitarbeiter_uid, fixangestellt + FROM + public.tbl_mitarbeiter + JOIN public.tbl_benutzer ON(tbl_benutzer.uid=tbl_mitarbeiter.mitarbeiter_uid) + WHERE + person_id=? + ORDER BY + tbl_mitarbeiter.insertamum DESC NULLS LAST + LIMIT 1"; + + $result = $this->execQuery($qry, $params); + + if (hasData($result)) + { + $ma = getData($result)[0]; + + $this->load->model('vertragsbestandteil/Dienstverhaeltnis_model','DienstverhaeltnisModel'); + $echterdv_result = $this->DienstverhaeltnisModel->existsDienstverhaeltnis( + $ma->mitarbeiter_uid, + $studiensemester->start, + $studiensemester->ende, + 'echterdv' + ); + + if (hasData($echterdv_result)) + { + $stundensatz = null; + } + else + { + $stundensatzRes = $this->getStundensatzByDatum( + $ma->mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre' + ); + + if (hasData($stundensatzRes)) + $stundensatz = getData($stundensatzRes)[0]->stundensatz; + else + $stundensatz = '0.00'; + } + } + else + { + $stundensatz = '0.00'; + } + + } + else + { + $params = [$person_id, $studiensemester->ende, $studiensemester->start]; + $qry = "SELECT ss.stundensatz + FROM hr.tbl_stundensatz ss + JOIN public.tbl_mitarbeiter ON ss.uid = tbl_mitarbeiter.mitarbeiter_uid + JOIN public.tbl_benutzer ON(tbl_benutzer.uid=tbl_mitarbeiter.mitarbeiter_uid) + WHERE person_id=? + AND stundensatztyp = 'lehre' + AND gueltig_von <= ? + AND (gueltig_bis >= ? OR gueltig_bis IS NULL) + ORDER BY gueltig_bis DESC NULLS FIRST, gueltig_von DESC NULLS LAST LIMIT 1"; + + $result = $this->execQuery($qry, $params); + + if (hasData($result)) + { + $stundensatz = getData($result)[0]->stundensatz; + } + else + { + $stundensatz = $defaultStundensatz; + } + } + } + } + + return $stundensatz; + } + + public function getDefaultStundensatz($mitarbeiter_uid, $beginn, $ende = null, $typ = null) + { + $stundensatz_result = $this->getStundensatzByDatum($mitarbeiter_uid, $beginn, $ende, $typ); + $default_stundensatz = hasData($stundensatz_result) ? getData($stundensatz_result)[0]->stundensatz : null; + if (defined('FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ') && !FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ) + { + $this->load->model('vertragsbestandteil/Dienstverhaeltnis_model','DienstverhaeltnisModel'); + $echterdv_result = $this->DienstverhaeltnisModel->existsDienstverhaeltnis($mitarbeiter_uid, $beginn, $ende, 'echterdv'); + if (hasData($echterdv_result)) + { + $default_stundensatz = null; + } + } + return $default_stundensatz; + } +} diff --git a/application/models/system/Message_model.php b/application/models/system/Message_model.php index d9f8585ed..19129b606 100644 --- a/application/models/system/Message_model.php +++ b/application/models/system/Message_model.php @@ -85,7 +85,7 @@ class Message_model extends DB_Model */ public function getMessagesOfPerson($person_id, $status = null) { - $sql = 'SELECT m.message_id, + $sql = "SELECT m.message_id, m.person_id, m.subject, m.body, @@ -122,7 +122,7 @@ class Message_model extends DB_Model ) s ON (m.message_id = s.message_id AND re.person_id = s.person_id) WHERE se.person_id = ? OR re.person_id = ? - '; + "; if (is_numeric($status)) { @@ -230,4 +230,150 @@ class Message_model extends DB_Model return $this->execQuery($query, $params); } + + /** + * Gets messages for a person for tableMessages. + * @param $person_id + * paginationInitialPage: 1, + * @param $offset number to skip, calculated by tabulatorParam paginationInitialPage and paginationSize, refers to specified numer of skipped items + * and page + * @param $limit refers to tabulatorParam paginationSize + * @return array|null + */ + public function getMessagesForTable($person_id, $offset, $limit) + { + $sql = <<execQuery($sql, $parametersArray); + + if (isError($data)) + return $data; + + $data = getData($data); + if($data) + { + $count = ceil($data[0]->total_msgs / $limit); + } + + return success(['data' => $data, 'count' => $count]); + } + + /** + * Deletes entry in dependency table tbl_msg_recipient + * + * @param $message_id + * @return boolean success + */ + public function deleteMessageRecipient($message_id) + { + $sql = " + DELETE FROM public.tbl_msg_recipient + WHERE message_id = ?; + "; + + return $this->execQuery($sql, array($message_id)); + } + + /** + * Deletes entry in dependency table tbl_msg_status + * + * @param $message_id + * @return boolean success + */ + public function deleteMessageStatus($message_id) + { + $sql = " + DELETE FROM public.tbl_msg_status + WHERE message_id = ?; + "; + + return $this->execQuery($sql, array($message_id)); + } + /** + * Deletes entry in dependency table tbl_msg_message + * + * @param $message_id + * @return boolean success + */ + public function deleteMessage($message_id) + { + $sql = " + DELETE FROM public.tbl_msg_message + WHERE message_id = ?; + "; + + return $this->execQuery($sql, array($message_id)); + } + } diff --git a/application/models/system/Vorlage_model.php b/application/models/system/Vorlage_model.php index 8022e71fc..e3c00818a 100644 --- a/application/models/system/Vorlage_model.php +++ b/application/models/system/Vorlage_model.php @@ -13,7 +13,7 @@ class Vorlage_model extends DB_Model } /** - * Returns mume types + * Returns mime types */ public function getMimeTypes() { @@ -21,4 +21,130 @@ class Vorlage_model extends DB_Model return $this->execQuery($query); } + + /** + * Returns all Vorlagen for archive + */ + public function getArchivVorlagen() + { + $query ="SELECT * FROM public.tbl_vorlage WHERE archivierbar=true ORDER BY bezeichnung"; + + return $this->execQuery($query); + } + + /** + * Returns all Vorlagen + * that belongs to the organisation units of the user + * and the parents of those organisation units until the root of the + * @param Array Array of $oe_kurzbz + * @return object Array of Vorlagen + */ + public function getAllVorlagenByOe($oe_kurzbz) + { + // Loads library OrganisationseinheitLib + $this->load->library('OrganisationseinheitLib'); + + $vorlage = success(array()); // Default value + + $table = '( + SELECT v.vorlage_kurzbz, + v.bezeichnung, + vs.version, + vs.oe_kurzbz, + vs.aktiv, + vs.subject, + vs.text, + v.mimetype + FROM tbl_vorlagestudiengang vs + JOIN tbl_vorlage v USING(vorlage_kurzbz) + ) templates'; + + $alias = 'templates'; + + $fields = array( + 'templates.vorlage_kurzbz AS id', + 'templates.bezeichnung || \' (\' || UPPER(templates.oe_kurzbz) || \')\' AS description' + ); + + $where = 'templates.aktiv = TRUE + AND templates.subject IS NOT NULL + AND templates.text IS NOT NULL + AND templates.mimetype = \'text/html\' + GROUP BY 1, 2, 3'; + + $order_by = 'description ASC'; + + if (!is_array($oe_kurzbz)) + { + $vorlage = $this->organisationseinheitlib->treeSearchEntire( + $table, + $alias, + $fields, + $where, + $order_by, + $oe_kurzbz + ); + } + else // is an array + { + // Get the vorlage for each organisation unit + foreach($oe_kurzbz as $val) + { + $tmpVorlage = $this->organisationseinheitlib->treeSearchEntire( + $table, + $alias, + $fields, + $where, + $order_by, + $val + ); + + // Everything is ok and data are inside + if (hasData($tmpVorlage)) + { + // If it's the first vorlage copy it + if (!hasData($vorlage)) + { + for ($j = 0; $j < count(getData($tmpVorlage)); $j++) + { + if (getData($tmpVorlage)[$j]->id != '') + { + array_push($vorlage->retval, getData($tmpVorlage)[$j]); + } + } + } + else // checks for duplicates, if it's not already present push it into the array getData($vorlage) + { + for ($j = 0; $j < count(getData($tmpVorlage)); $j++) + { + $found = false; + $currentTmpVorlageData = null; + + for ($i = 0; $i < count(getData($vorlage)); $i++) + { + $currentTmpVorlageData = getData($tmpVorlage)[$j]; + + if (getData($vorlage)[$i]->id == getData($tmpVorlage)[$j]->id + && getData($vorlage)[$i]->_pk == getData($tmpVorlage)[$j]->_pk + && getData($vorlage)[$i]->_ppk == getData($tmpVorlage)[$j]->_ppk + && getData($vorlage)[$i]->_jtpk == getData($tmpVorlage)[$j]->_jtpk) + { + $found = true; + break; + } + } + + if (!$found && $currentTmpVorlageData->id != '') + { + array_push($vorlage->retval, $currentTmpVorlageData); + } + } + } + } + } + } + + return $vorlage; + } + } diff --git a/application/models/testtool/Ablauf_model.php b/application/models/testtool/Ablauf_model.php index 748926658..d6d6ebe74 100644 --- a/application/models/testtool/Ablauf_model.php +++ b/application/models/testtool/Ablauf_model.php @@ -11,4 +11,31 @@ class Ablauf_model extends DB_Model $this->dbTable = 'testtool.tbl_ablauf'; $this->pk = 'ablauf_id'; } + + /** + * Returns Weighting of the respective ranking test areas + * @param $studiengang_kz Studiengang_kz + * @param $semester Integer optional + * @return array of weightings per ranking test areas of given studiengang + */ + public function getAblaufGebieteAndGewichte($studiengang_kz, $semester = null) + { + $parametersArray = array($studiengang_kz); + + $qry = " + SELECT + tbl_ablauf.gebiet_id, tbl_ablauf.gewicht + FROM + testtool.tbl_ablauf + WHERE + tbl_ablauf.studiengang_kz= ?"; + + if($semester) + { + $qry .= " AND semester = ?"; + array_push($parametersArray, $semester); + + } + return $this->execQuery($qry, $parametersArray); + } } diff --git a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php index 6827beaa4..1143398ca 100644 --- a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php +++ b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php @@ -59,7 +59,14 @@ class Dienstverhaeltnis_model extends DB_Model } $qry .=" - ORDER BY dv.von desc + ORDER BY + CASE + WHEN (COALESCE(dv.bis, '2999-12-31'::date) - NOW()::date) < 0 THEN NULL + ELSE + (COALESCE(dv.bis, '2999-12-31'::date) - NOW()::date) + END ASC NULLS LAST, + COALESCE(dv.bis, '2999-12-31'::date) DESC, + dv.von DESC "; return $this->execQuery($qry, $data); @@ -246,4 +253,19 @@ EOSQL; } return $dvs; } + + public function existsDienstverhaeltnis($mitarbeiter_uid, $start, $ende, $vertragsart_kurzbz) + { + $this->addOrder('von', 'DESC'); + $this->db->where('mitarbeiter_uid', $mitarbeiter_uid); + $this->db->where('vertragsart_kurzbz', $vertragsart_kurzbz); + $this->db->where('von <=', $ende); + $this->db->group_start(); + $this->db->where('bis >=', $start); + $this->db->or_where('bis IS NULL', null, false); + $this->db->group_end(); + + $this->addLimit(1); + return $this->load(); + } } diff --git a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php index c50627697..2669105a1 100644 --- a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php @@ -286,7 +286,13 @@ EOSQL; foreach( $rows as $row ) { $tmpgb = new Gehaltsbestandteil(); $tmpgb->hydrateByStdClass($row, true); - + + if ($row->betrag_valorisiert != null && $row->valorisierungsdatum != null + && $row->valorisierungsdatum == $row->von) { + // neuer Gehaltsbestandteil mit Valorisierungsdatum aber auch valorisiert + $tmpgb->setGrundbetrag($row->betrag_valorisiert); + } + // prevent duplication (caused by the join with historic values) if (!isset($lastRecords[(string)$row->gehaltsbestandteil_id])) { $gehaltsbestandteile[] = $tmpgb; diff --git a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php index cbc529d83..ce741268d 100644 --- a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php @@ -183,6 +183,46 @@ EOSQL; return $vbcount[0]->overlappingvbs; } + public function getLastVertragsbestanteilStundenBeforeAltersteilzeit($dienstverhaeltnis_id) + { + $sql = <<execReadOnlyQuery($sql, array($dienstverhaeltnis_id)); + $data = getData($query); + + if ($data == null) + { + return null; + } + + $vertragsbestandteil = null; + try + { + $vertragsbestandteil = VertragsbestandteilFactory::getVertragsbestandteil($data[0], true); + } + catch (Exception $ex) + { + echo $ex->getMessage() . "\n"; + } + return $vertragsbestandteil; + } + /** * Checks if sap sync table exists. * @return bool diff --git a/application/views/Cis/Abgabetool.php b/application/views/Cis/Abgabetool.php new file mode 100644 index 000000000..86e8721f2 --- /dev/null +++ b/application/views/Cis/Abgabetool.php @@ -0,0 +1,47 @@ + 'Cis4', + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'tabulator5' => true, // TODO: upgrade to 6 when available + 'vue3' => true, + 'primevue3' => true, + 'skipID' => '#fhccontent', + 'vuedatepicker11' => true, + 'customCSSs' => array( + 'public/css/components/verticalsplit.css', + 'public/css/components/FilterComponent.css', + 'public/css/components/FormUnderline.css', + 'public/css/theme/default.css', + 'public/css/components/abgabetool/abgabe.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/inputnumber/inputnumber.min.js', + 'vendor/npm-asset/primevue/speeddial/speeddial.min.js', + 'vendor/npm-asset/primevue/textarea/textarea.min.js', + 'vendor/npm-asset/primevue/timeline/timeline.min.js', + 'vendor/npm-asset/primevue/inplace/inplace.min.js', + 'vendor/npm-asset/primevue/message/message.min.js', + 'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js', + 'vendor/moment/luxonjs/luxon.min.js' + ), + 'customJSModules' => array( + 'public/js/apps/Abgabetool/Abgabetool.js', + ), + +); + +$this->load->view('templates/FHC-Header', $includesArray); +?> +
+ uid= + student_uid_prop="" + stg_kz_prop="" + > +
+load->view('templates/FHC-Footer', $includesArray); ?> diff --git a/application/views/Cis/Login.php b/application/views/Cis/Login.php index 68490e67e..90f78f123 100644 --- a/application/views/Cis/Login.php +++ b/application/views/Cis/Login.php @@ -2,7 +2,8 @@ $includesArray = array( 'title' => 'FH-Complete', 'bootstrap5' => true, - 'fontawesome6' => true + 'fontawesome6' => true, + 'customJSs' => 'public/js/helpers/ColorThemeSetting.js' ); $this->load->view('templates/FHC-Header', $includesArray); diff --git a/application/views/Cis/ProfilUpdate.php b/application/views/Cis/ProfilUpdate.php index e797d436f..2e69208c7 100644 --- a/application/views/Cis/ProfilUpdate.php +++ b/application/views/Cis/ProfilUpdate.php @@ -2,10 +2,14 @@ $includesArray = array( 'title' => 'Profil Änderungen', 'vue3' => true, + 'primevue3' => true, 'bootstrap5' => true, 'fontawesome6'=> true, 'axios027' => true, 'tabulator5' => true, + 'customJSs' => array( + 'vendor/moment/luxonjs/luxon.min.js' + ), 'customJSModules' => array( 'public/js/apps/Cis/ProfilUpdateRequests.js' ), diff --git a/application/views/CisRouterView/CisRouterView.php b/application/views/CisRouterView/CisRouterView.php index 4590b210e..6ff428362 100644 --- a/application/views/CisRouterView/CisRouterView.php +++ b/application/views/CisRouterView/CisRouterView.php @@ -5,35 +5,48 @@ $includesArray = array( 'axios027' => true, 'bootstrap5' => true, 'fontawesome6' => true, - 'tabulator5' => true, + 'tabulator5' => true, // TODO: upgrade to 6 when available 'vue3' => true, 'primevue3' => true, + 'skipID' => '#fhccontent', + 'vuedatepicker11' => true, 'customCSSs' => array( 'public/css/components/verticalsplit.css', 'public/css/components/searchbar/searchbar.css', 'public/css/Fhc.css', 'public/css/components/dashboard.css', - 'public/css/components/calendar.css', + //'public/css/components/calendar.css', <= imported in dashboard.css 'public/css/components/Sprachen.css', 'public/css/components/MyLv.css', 'public/css/components/FilterComponent.css', 'public/css/components/Profil.css', 'public/css/components/FormUnderline.css', + 'public/css/components/abgabetool/abgabe.css', 'public/css/Cis4/Cms.css', + 'public/css/Cis4/Studium.css', ), 'customJSs' => array( - 'vendor/npm-asset/primevue/accordion/accordion.js', - 'vendor/npm-asset/primevue/accordiontab/accordiontab.js' + '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/inputnumber/inputnumber.min.js', + 'vendor/npm-asset/primevue/speeddial/speeddial.min.js', + 'vendor/npm-asset/primevue/textarea/textarea.min.js', + 'vendor/npm-asset/primevue/timeline/timeline.min.js', + 'vendor/npm-asset/primevue/inplace/inplace.min.js', + 'vendor/npm-asset/primevue/message/message.min.js', + 'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js', + 'vendor/moment/luxonjs/luxon.min.js' ), 'customJSModules' => array( - 'public/js/apps/Dashboard/Fhc.js' + 'public/js/apps/Dashboard/Fhc.js', ), ); $this->load->view('templates/CISVUE-Header', $includesArray); ?> -
> +
> diff --git a/application/views/LVVerwaltung.php b/application/views/LVVerwaltung.php new file mode 100644 index 000000000..4cebae839 --- /dev/null +++ b/application/views/LVVerwaltung.php @@ -0,0 +1,39 @@ + 'LVVerwaltung', + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'vue3' => true, + 'primevue3' => true, + 'tabulator6' => true, + 'tinymce5' => true, + 'tags' => true, + + 'customCSSs' => [ + 'public/css/components/vue-datepicker.css', + 'public/css/components/primevue.css', + 'public/css/Studentenverwaltung.css', + 'public/css/Lvverwaltung.css' + + ], + 'customJSModules' => [ + 'public/js/apps/LVVerwaltung.js' + ] + ); + + $this->load->view('templates/FHC-Header', $includesArray); + +?> +
+ + + +
+load->view('templates/FHC-Footer', $includesArray); ?> + diff --git a/application/views/Nachrichten.php b/application/views/Nachrichten.php new file mode 100644 index 000000000..0d0e8e707 --- /dev/null +++ b/application/views/Nachrichten.php @@ -0,0 +1,52 @@ + 'Nachrichten', + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'vue3' => true, + 'primevue3' => true, + #'filtercomponent' => true, + 'tabulator5' => true, + 'tinymce5' => true, + 'phrases' => array( + 'global', + 'ui', + ), + 'customCSSs' => [ + 'public/css/components/vue-datepicker.css', + 'public/css/components/primevue.css', + ], + 'customJSs' => [ + #'vendor/npm-asset/primevue/tree/tree.min.js', + #'vendor/npm-asset/primevue/toast/toast.min.js' + ], + 'customJSModules' => [ + 'public/js/apps/Nachrichten.js' + ] +); + +$this->load->view('templates/FHC-Header', $includesArray); +?> + + !defined('DOMAIN') ? 'notDefined' : DOMAIN, +]; +?> + +
+ + :id ="" + type-id ="" + + > + +
+ +load->view('templates/FHC-Footer', $includesArray); ?> + diff --git a/application/views/Studentenverwaltung.php b/application/views/Studentenverwaltung.php index c10dc475a..1cd28d735 100644 --- a/application/views/Studentenverwaltung.php +++ b/application/views/Studentenverwaltung.php @@ -15,11 +15,15 @@ 'notiz', ), 'customCSSs' => [ + #datepicker fuer component functions 'public/css/components/vue-datepicker.css', 'public/css/components/primevue.css', - 'public/css/Studentenverwaltung.css' + 'public/css/Studentenverwaltung.css', + 'public/css/components/function.css' ], 'customJSs' => [ + 'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js', + 'vendor/moment/luxonjs/luxon.min.js' #'vendor/npm-asset/primevue/tree/tree.min.js', #'vendor/npm-asset/primevue/toast/toast.min.js' ], @@ -37,7 +41,10 @@ $configArray = [ //replaced by possibility to hide each formular field via config stv.php #'showZgvDoktor' => !defined('ZGV_DOKTOR_ANZEIGEN') ? false : ZGV_DOKTOR_ANZEIGEN, #'showZgvErfuellt' => !defined('ZGV_ERFUELLT_ANZEIGEN') ? false : ZGV_ERFUELLT_ANZEIGEN - 'showHintKommPrfg' => !defined('FAS_STUDSTATUS_SHOW_KOMM_PRFG_HINT') ? false : FAS_STUDSTATUS_SHOW_KOMM_PRFG_HINT + 'showHintKommPrfg' => !defined('FAS_STUDSTATUS_SHOW_KOMM_PRFG_HINT') ? false : FAS_STUDSTATUS_SHOW_KOMM_PRFG_HINT, + 'showAufnahmegruppen' => !defined('FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN') ? false : FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN, + 'allowUebernahmePunkte' => !defined('FAS_REIHUNGSTEST_PUNKTEUEBERNAHME') ? true : FAS_REIHUNGSTEST_PUNKTEUEBERNAHME, + 'useReihungstestPunkte' => !defined('FAS_REIHUNGSTEST_PUNKTE') ? true : FAS_REIHUNGSTEST_PUNKTE, ]; ?> @@ -47,6 +54,8 @@ $configArray = [ active-addons="" stv-root="" cis-root="" + avatar-url="" + logout-url="" :permissions="" :config="" > diff --git a/application/views/codex/uhstat1.php b/application/views/codex/uhstat1.php index a255781f1..cb2f219f8 100644 --- a/application/views/codex/uhstat1.php +++ b/application/views/codex/uhstat1.php @@ -26,7 +26,7 @@ $vater_bildungsstaat = isset($uhstatData->vater_bildungsstaat) ? $uhstatData->va $vater_bildungmax = isset($uhstatData->vater_bildungmax) ? $uhstatData->vater_bildungmax : set_value('vater_bildungmax'); $readOnly = isset($formMetaData['readOnly']); $disabled = $readOnly ? ' disabled' : ''; -$editPermission = isset($formMetaData['editPermission']) && $formMetaData['editPermission'] === true; +$savePermission = isset($formMetaData['savePermission']) && $formMetaData['savePermission'] === true; $deletePermission = isset($formMetaData['deletePermission']) && $formMetaData['deletePermission'] === true; $saved = isset($saved) && $saved === true; ?> @@ -51,7 +51,7 @@ $saved = isset($saved) && $saved === true; p->t('uhstat', 'uhstat1EinleitungSvnrtext') ?>


- +
@@ -288,7 +288,7 @@ $saved = isset($saved) && $saved === true;
- +
diff --git a/application/views/lehre/anrechnung/requestAnrechnungImportant.php b/application/views/lehre/anrechnung/requestAnrechnungImportant.php index 6a3cc5a9a..0ec44c047 100644 --- a/application/views/lehre/anrechnung/requestAnrechnungImportant.php +++ b/application/views/lehre/anrechnung/requestAnrechnungImportant.php @@ -9,7 +9,6 @@ p->t('anrechnung', 'requestAnrechnungInfoFristenTitle'); ?> -
@@ -80,4 +79,4 @@ - \ No newline at end of file + diff --git a/application/views/system/infocenter/anmerkungenZurBewerbung.php b/application/views/system/infocenter/anmerkungenZurBewerbung.php index ca012ff3e..3ffe5f9a2 100644 --- a/application/views/system/infocenter/anmerkungenZurBewerbung.php +++ b/application/views/system/infocenter/anmerkungenZurBewerbung.php @@ -18,6 +18,9 @@ kurzbzlang)) ?: print_r('(' . nl2br($notiz->kurzbzlang) . ') - ') ?> text) ?> + + + diff --git a/application/views/system/infocenter/infocenter.php b/application/views/system/infocenter/infocenter.php index 0b7a20c2c..157f98bf1 100644 --- a/application/views/system/infocenter/infocenter.php +++ b/application/views/system/infocenter/infocenter.php @@ -14,12 +14,13 @@ 'navigationwidget' => true, 'dialoglib' => true, 'phrases' => array( + 'infocenter' => array('statusAuswahl'), 'person' => array('vorname', 'nachname'), 'global' => array('mailAnXversandt'), 'ui' => array('bitteEintragWaehlen') ), 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'), - 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/infocenterPersonDataset.js') + 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js') ); $this->load->view('templates/FHC-Header', $includesArray); diff --git a/application/views/system/infocenter/infocenterAbgewiesen.php b/application/views/system/infocenter/infocenterAbgewiesen.php index 921d9f224..7129a3250 100644 --- a/application/views/system/infocenter/infocenterAbgewiesen.php +++ b/application/views/system/infocenter/infocenterAbgewiesen.php @@ -20,7 +20,7 @@ 'ui' => array('bitteEintragWaehlen') ), 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'), - 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/infocenterPersonDataset.js') + 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js') ) ); ?> diff --git a/application/views/system/infocenter/infocenterAbgewiesenData.php b/application/views/system/infocenter/infocenterAbgewiesenData.php index da816b2c7..03397ff31 100644 --- a/application/views/system/infocenter/infocenterAbgewiesenData.php +++ b/application/views/system/infocenter/infocenterAbgewiesenData.php @@ -8,7 +8,7 @@ $STUDIENSEMESTER = '\''.$this->variablelib->getVar('infocenter_studiensemester').'\''; $LOGDATA_NAME = '\'Message sent\''; $LOGDATA_VON = '\'online\''; - $STUDIENGEBUEHR_ANZAHLUNG = '\'StudiengebuehrAnzahlung\''; + $KAUTION_DRITT_STAAT = '\'KautionDrittStaat\''; $query = ' SELECT @@ -62,7 +62,7 @@ $query = ' FROM public.tbl_konto konto WHERE konto.person_id = p.person_id AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .' - AND konto.buchungstyp_kurzbz = '. $STUDIENGEBUEHR_ANZAHLUNG .' + AND konto.buchungstyp_kurzbz = '. $KAUTION_DRITT_STAAT .' ) AS "Kaution" FROM public.tbl_prestudentstatus pss diff --git a/application/views/system/infocenter/infocenterAufgenommen.php b/application/views/system/infocenter/infocenterAufgenommen.php index 680d66a8a..d57f31d6b 100644 --- a/application/views/system/infocenter/infocenterAufgenommen.php +++ b/application/views/system/infocenter/infocenterAufgenommen.php @@ -20,7 +20,7 @@ 'ui' => array('bitteEintragWaehlen') ), 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'), - 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/infocenterPersonDataset.js') + 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js') ) ); ?> diff --git a/application/views/system/infocenter/infocenterData.php b/application/views/system/infocenter/infocenterData.php index 956ad80d4..ebfd1db37 100644 --- a/application/views/system/infocenter/infocenterData.php +++ b/application/views/system/infocenter/infocenterData.php @@ -13,7 +13,7 @@ $ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz'); $AKTE_TYP = '\'identity\', \'zgv_bakk\''; $STUDIENSEMESTER = '\''.$this->variablelib->getVar('infocenter_studiensemester').'\''; - $STUDIENGEBUEHR_ANZAHLUNG = '\'StudiengebuehrAnzahlung\''; + $KAUTION_DRITT_STAAT = '\'KautionDrittStaat\''; $ORG_NAME = '\'InfoCenter\''; $ONLINE = '\'online\''; @@ -302,7 +302,7 @@ FROM public.tbl_konto konto WHERE konto.person_id = p.person_id AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .' - AND konto.buchungstyp_kurzbz = '. $STUDIENGEBUEHR_ANZAHLUNG .' + AND konto.buchungstyp_kurzbz = '. $KAUTION_DRITT_STAAT .' ) AS "Kaution" FROM public.tbl_person p LEFT JOIN ( diff --git a/application/views/system/infocenter/infocenterDetails.php b/application/views/system/infocenter/infocenterDetails.php index 51b913b6c..fb023c5fd 100644 --- a/application/views/system/infocenter/infocenterDetails.php +++ b/application/views/system/infocenter/infocenterDetails.php @@ -57,7 +57,7 @@
diff --git a/application/views/system/infocenter/infocenterFreigegeben.php b/application/views/system/infocenter/infocenterFreigegeben.php index a240a0b5c..d843cc5c9 100644 --- a/application/views/system/infocenter/infocenterFreigegeben.php +++ b/application/views/system/infocenter/infocenterFreigegeben.php @@ -20,7 +20,7 @@ 'ui' => array('bitteEintragWaehlen') ), 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'), - 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/infocenterPersonDataset.js') + 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js') ) ); ?> diff --git a/application/views/system/infocenter/infocenterFreigegebenData.php b/application/views/system/infocenter/infocenterFreigegebenData.php index 8003b42e0..38285b6ae 100644 --- a/application/views/system/infocenter/infocenterFreigegebenData.php +++ b/application/views/system/infocenter/infocenterFreigegebenData.php @@ -13,7 +13,8 @@ $ORG_NAME = '\'InfoCenter\''; $IDENTITY = '\'identity\''; $ONLINE = '\'online\''; - $STUDIENGEBUEHR_ANZAHLUNG = '\'StudiengebuehrAnzahlung\''; + $KAUTION_DRITT_STAAT = '\'KautionDrittStaat\''; + $query = ' SELECT @@ -111,7 +112,7 @@ $query = ' LIMIT 1 ) AS "AnzahlAbgeschickt", ( - SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(so.studiengangkurzbzlang) || \':\' || sp.orgform_kurzbz), \', \') + SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(so.studiengangkurzbzlang) || \':\' || sp.orgform_kurzbz || \' [\' || pss.ausbildungssemester || \']\'), \', \') FROM public.tbl_prestudentstatus pss JOIN public.tbl_prestudent ps USING(prestudent_id) JOIN public.tbl_studiengang sg USING(studiengang_kz) @@ -275,7 +276,7 @@ $query = ' FROM public.tbl_konto konto WHERE konto.person_id = p.person_id AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .' - AND konto.buchungstyp_kurzbz = '. $STUDIENGEBUEHR_ANZAHLUNG .' + AND konto.buchungstyp_kurzbz = '. $KAUTION_DRITT_STAAT .' ) AS "Kaution" FROM public.tbl_person p LEFT JOIN ( diff --git a/application/views/system/infocenter/infocenterReihungstestAbsolviert.php b/application/views/system/infocenter/infocenterReihungstestAbsolviert.php index a86e0df97..eef2a214a 100644 --- a/application/views/system/infocenter/infocenterReihungstestAbsolviert.php +++ b/application/views/system/infocenter/infocenterReihungstestAbsolviert.php @@ -20,7 +20,7 @@ 'ui' => array('bitteEintragWaehlen') ), 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'), - 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/infocenterPersonDataset.js') + 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js') ) ); ?> diff --git a/application/views/system/infocenter/infocenterReihungstestAbsolviertData.php b/application/views/system/infocenter/infocenterReihungstestAbsolviertData.php index 7f9ee1288..c19b139b3 100644 --- a/application/views/system/infocenter/infocenterReihungstestAbsolviertData.php +++ b/application/views/system/infocenter/infocenterReihungstestAbsolviertData.php @@ -9,7 +9,8 @@ $ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz'); $STUDIENSEMESTER = '\''.$this->variablelib->getVar('infocenter_studiensemester').'\''; $ORG_NAME = '\'InfoCenter\''; - $STUDIENGEBUEHR_ANZAHLUNG = '\'StudiengebuehrAnzahlung\''; + $KAUTION_DRITT_STAAT = '\'KautionDrittStaat\''; + $query = ' SELECT @@ -206,7 +207,7 @@ $query = ' FROM public.tbl_konto konto WHERE konto.person_id = p.person_id AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .' - AND konto.buchungstyp_kurzbz = '. $STUDIENGEBUEHR_ANZAHLUNG .' + AND konto.buchungstyp_kurzbz = '. $KAUTION_DRITT_STAAT .' ) AS "Kaution" FROM public.tbl_person p LEFT JOIN ( diff --git a/application/views/system/infocenter/onboarding.php b/application/views/system/infocenter/onboarding.php new file mode 100644 index 000000000..1f5bae847 --- /dev/null +++ b/application/views/system/infocenter/onboarding.php @@ -0,0 +1,47 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Info Center', + 'jquery3' => true, + 'jqueryui1' => true, + 'jquerycheckboxes1' => true, + 'bootstrap3' => true, + 'fontawesome4' => true, + 'sbadmintemplate3' => true, + 'tablesorter2' => true, + 'ajaxlib' => true, + 'filterwidget' => true, + 'navigationwidget' => true, + 'dialoglib' => true, + 'phrases' => array( + 'person' => array('vorname', 'nachname'), + 'ui' => array('bitteEintragWaehlen') + ), + 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'), + 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js') + ) + ); +?> + +
+ + widgetlib->widget('NavigationWidget'); ?> + +
+
+
+
+ +
+
+
+ load->view('system/infocenter/onboardingData.php'); ?> +
+
+
+
+ +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/system/infocenter/onboardingData.php b/application/views/system/infocenter/onboardingData.php new file mode 100644 index 000000000..5ee66fdde --- /dev/null +++ b/application/views/system/infocenter/onboardingData.php @@ -0,0 +1,116 @@ +>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 + ) + ) rueck ON rueck.person_id = p.person_id + WHERE p.person_id NOT IN (SELECT person_id FROM public.tbl_prestudent)'; + + $filterWidgetArray = array( + 'query' => $query, + 'app' => InfoCenter::APP, + 'datasetName' => 'onboarding', + 'filter_id' => $this->input->get('filter_id'), + 'requiredPermissions' => 'infocenter', + 'datasetRepresentation' => 'tablesorter', + 'checkboxes' => 'PersonId', + 'additionalColumns' => array('Details'), + 'columnsAliases' => array( + 'PersonId', + ucfirst($this->p->t('person', 'vorname')) , + ucfirst($this->p->t('person', 'nachname')), + ucfirst($this->p->t('global', 'sperrdatum')), + ucfirst($this->p->t('global', 'gesperrtVon')), + ucfirst($this->p->t('infocenter', 'rueckstelldatum')), + ucfirst($this->p->t('infocenter', 'rueckstellgrund')), + ), + + 'formatRow' => function($datasetRaw) { + /* NOTE: Dont use $this here for PHP Version compatibility */ + $datasetRaw->{'Details'} = sprintf( + 'Details', + site_url('system/infocenter/InfoCenter/showDetails'), + $datasetRaw->{'PersonId'}, + 'onboarding', + (isset($_GET['fhc_controller_id']) ? $_GET['fhc_controller_id'] : ''), + (isset($_GET['filter_id']) ? $_GET['filter_id'] : '') + ); + + if ($datasetRaw->{'LockDate'} == null) + { + $datasetRaw->{'LockDate'} = '-'; + } + + if ($datasetRaw->{'LockUser'} == null) + { + $datasetRaw->{'LockUser'} = '-'; + } + + if ($datasetRaw->{'HoldDate'} == null) + { + $datasetRaw->{'HoldDate'} = '-'; + } + else + { + $datasetRaw->{'HoldDate'} = date_format(date_create($datasetRaw->{'HoldDate'}), 'Y-m-d H:i'); + } + + if ($datasetRaw->{'Rueckstellgrund'} === null) + { + $datasetRaw->{'Rueckstellgrund'} = '-'; + } + + return $datasetRaw; + }, + + 'markRow' => function($datasetRaw) { + + if ($datasetRaw->LockDate != null) + { + return FilterWidget::DEFAULT_MARK_ROW_CLASS; + } + } + + + + ); + + echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray); +?> diff --git a/application/views/system/infocenter/stammdaten.php b/application/views/system/infocenter/stammdaten.php index f143c9c03..c632b079f 100644 --- a/application/views/system/infocenter/stammdaten.php +++ b/application/views/system/infocenter/stammdaten.php @@ -32,12 +32,6 @@
gebdatum), 'd.m.Y') ?>
- - p->t('person','svnr')) ?> - -
svnr ?>
- - p->t('person','staatsbuergerschaft')) ?> @@ -112,6 +106,7 @@ kontakte as $kontakt): ?> kontakttyp === 'email'): ?> @@ -125,14 +120,16 @@ kontakttyp.'" data-id="'. $kontakt->kontakt_id .'" data-value="' . $kontakt->kontakt .'">';?> kontakttyp === 'email'): ?> - kontakt; + kontakt; ?> + kontakttyp === 'email_unverifiziert'): ?> + kontakt; endif; echo $kontakt->kontakt; - if ($kontakt->kontakttyp === 'email'): + if ($kontakt->kontakttyp === 'email'): ?> - - '?> + + '?> anmerkung; ?> @@ -146,9 +143,9 @@
strasse ?>
- +
plz ?>
- +
ort ?>
nationkurztext)): ?> @@ -188,7 +185,8 @@
zugangscode)): ?> diff --git a/application/views/system/issues/issuesData.php b/application/views/system/issues/issuesData.php index c60b03a74..edaee9058 100644 --- a/application/views/system/issues/issuesData.php +++ b/application/views/system/issues/issuesData.php @@ -1,11 +1,21 @@ db->escape($string); }, array_keys($all_funktionen_oe_kurzbz))) . ")"; + // all oes for which logged user has issues permissions, including permissions for "special" issue funktion -$ALL_OE_KURZBZ_BERECHTIGT = "('" . implode("','", $all_oe_kurzbz_berechtigt) . "')"; -$RELEVANT_PRESTUDENT_STATUS = "('Aufgenommener', 'Student', 'Incoming', 'Diplomand', 'Abbrecher', 'Unterbrecher', 'Absolvent')"; +$ALL_OE_KURZBZ_BERECHTIGT = isEmptyArray($all_oe_kurzbz_berechtigt) ? "(NULL)" + : "(" . implode(",", array_map(function($string) { return $this->db->escape($string); }, $all_oe_kurzbz_berechtigt)) . ")"; + +// app apps for which issues should be displayed +$APPS = isEmptyArray($apps) ? "" : "(" . implode(",", array_map(function($string) { return $this->db->escape($string); }, $apps)) . ")"; + +// all prestudent status for which issues should be displayed +$RELEVANT_PRESTUDENT_STATUS = isEmptyArray($status) ? "" + : "(" . implode(",", array_map(function($string) { return $this->db->escape($string); }, $status)) . ")"; // get issues for the oes of the logged user or for the persons (students, oe-zuordnung) of the oes $query = "WITH zustaendigkeiten AS ( @@ -37,8 +47,8 @@ $query .= " SELECT issue_id, fehlercode AS \"Fehlercode\", fehler_kurzbz AS \"Fehler Kurzbezeichnung\", iss.fehlercode_extern AS \"Fehlercode extern\", datum AS \"Datum\", inhalt AS \"Inhalt\", inhalt_extern AS \"Inhalt extern\", iss.person_id AS \"PersonId\", iss.oe_kurzbz AS \"OE\", - ftyp.bezeichnung_mehrsprachig[".$language_index."] AS \"Fehlertyp\", - stat.bezeichnung_mehrsprachig[".$language_index."] AS \"Fehlerstatus\", + ftyp.bezeichnung_mehrsprachig[".$this->db->escape($language_index)."] AS \"Fehlertyp\", + stat.bezeichnung_mehrsprachig[".$this->db->escape($language_index)."] AS \"Fehlerstatus\", verarbeitetvon AS \"Verarbeitet von\",verarbeitetamum AS \"Verarbeitet am\", fr.app AS \"Applikation\", fr.fehlertyp_kurzbz AS \"Fehlertypcode\", iss.status_kurzbz AS \"Statuscode\", pers.vorname AS \"Vorname\", pers.nachname AS \"Nachname\", @@ -118,44 +128,48 @@ $query .= " JOIN system.tbl_issue_status stat USING (status_kurzbz) LEFT JOIN public.tbl_person pers ON iss.person_id = pers.person_id WHERE - fr.app IN ('core', 'dvuh') - AND ( + ( EXISTS ( /* if oe or person is specified in fehler_zustaendigkeiten */ SELECT 1 FROM zustaendigkeiten WHERE fehlercode = iss.fehlercode AND zustaendig = TRUE)"; // show issue if it is assigend to oe of logged in user or to student of oe of logged in user -if (!isEmptyArray($all_oe_kurzbz_berechtigt)) -{ - $query .= " OR iss.oe_kurzbz IN $ALL_OE_KURZBZ_BERECHTIGT /* if issue is for oe */"; +$query .= " OR iss.oe_kurzbz IN $ALL_OE_KURZBZ_BERECHTIGT /* if issue is for oe */"; + +$query .= " OR (iss.oe_kurzbz IS NULL AND EXISTS ( /* if person_id of issue is a student of studiengang oe */ + SELECT 1 FROM public.tbl_prestudent ps + JOIN public.tbl_prestudentstatus pss USING (prestudent_id) + JOIN public.tbl_studiengang stg USING (studiengang_kz) + WHERE person_id = iss.person_id + AND stg.oe_kurzbz IN ".$ALL_OE_KURZBZ_BERECHTIGT; + +if (!isEmptyString($RELEVANT_PRESTUDENT_STATUS)) $query .= " AND pss.status_kurzbz IN ".$RELEVANT_PRESTUDENT_STATUS; + +$query .= " AND NOT EXISTS (SELECT 1 /* irrelevant if already finished studies and studied a while ago */ + FROM public.tbl_prestudentstatus ps_finished + JOIN public.tbl_studiensemester sem_finished USING (studiensemester_kurzbz) + WHERE prestudent_id = ps.prestudent_id + AND status_kurzbz IN ('Absolvent','Abbrecher','Abgewiesener') + AND datum::date + interval '2 months' < NOW() + AND EXISTS (SELECT 1 FROM public.tbl_prestudent /* if more recent prestudent exists, still display the issue */ + JOIN public.tbl_prestudentstatus USING (prestudent_id) + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) + WHERE person_id = ps.person_id + AND prestudent_id <> ps_finished.prestudent_id + AND tbl_studiensemester.start::date > sem_finished.start::date"; + +if (!isEmptyString($RELEVANT_PRESTUDENT_STATUS)) $query .= " AND tbl_prestudentstatus.status_kurzbz IN ".$RELEVANT_PRESTUDENT_STATUS; + +$query .= ") + ) + ) + )"; - $query .= " OR (iss.oe_kurzbz IS NULL AND EXISTS ( /* if person_id of issue is a student of studiengang oe */ - SELECT 1 FROM public.tbl_prestudent ps - JOIN public.tbl_prestudentstatus pss USING (prestudent_id) - JOIN public.tbl_studiengang stg USING (studiengang_kz) - WHERE person_id = iss.person_id - AND stg.oe_kurzbz IN $ALL_OE_KURZBZ_BERECHTIGT - AND pss.status_kurzbz IN $RELEVANT_PRESTUDENT_STATUS - AND NOT EXISTS (SELECT 1 /* irrelevant if already finished studies and studied a while ago */ - FROM public.tbl_prestudentstatus ps_finished - JOIN public.tbl_studiensemester sem_finished USING (studiensemester_kurzbz) - WHERE prestudent_id = ps.prestudent_id - AND status_kurzbz IN ('Absolvent','Abbrecher','Abgewiesener') - AND datum::date + interval '2 months' < NOW() - AND EXISTS (SELECT 1 FROM public.tbl_prestudent /* if more recent prestudent exists, still display the issue */ - JOIN public.tbl_prestudentstatus USING (prestudent_id) - JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) - WHERE tbl_prestudentstatus.status_kurzbz IN $RELEVANT_PRESTUDENT_STATUS - AND person_id = ps.person_id - AND prestudent_id <> ps_finished.prestudent_id - AND tbl_studiensemester.start::date > sem_finished.start::date) - ) - ) - )"; -} $query .= ") "; +if (!isEmptyString($APPS)) $query .= " AND fr.app IN ".$APPS; + $query .= " ORDER BY CASE WHEN fehlertyp_kurzbz = '".IssuesLib::ERRORTYPE_CODE."' THEN 0 diff --git a/application/views/templates/CISVUE-Header.php b/application/views/templates/CISVUE-Header.php index 86b5b8755..804a43821 100644 --- a/application/views/templates/CISVUE-Header.php +++ b/application/views/templates/CISVUE-Header.php @@ -1,4 +1,5 @@ load->config('theme'); $includesArray = array( 'title' => $title ?? 'FH-Complete', 'vue3' => true, @@ -10,7 +11,8 @@ $includesArray = array( 'public/js/apps/Cis.js' ], $customJSModules ?? []), 'customCSSs' => array_merge([ - 'public/css/Cis4/Cis.css' + 'public/css/Cis4/Cis.css', + $this->config->item('theme_css'), ], $customCSSs ?? []) ); @@ -26,7 +28,7 @@ $this->load->view('templates/FHC-Header', $includesArray); -
\ No newline at end of file +
\ No newline at end of file diff --git a/application/views/templates/FHC-Common.php b/application/views/templates/FHC-Common.php index 33f9d4cc9..71f9c46c4 100644 --- a/application/views/templates/FHC-Common.php +++ b/application/views/templates/FHC-Common.php @@ -29,6 +29,7 @@ $tinymce5 = isset($tinymce5) ? $tinymce5 : false; $vue3 = isset($vue3) ? $vue3 : false; $primevue3 = isset($primevue3) ? $primevue3 : false; + $vuedatepicker11 = isset($vuedatepicker11) ? $vuedatepicker11 : false; // Hooks $addons = isset($addons) ? $addons : false; diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index d30c76045..c816ebf2e 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -155,6 +155,8 @@ generateJSsInclude('vendor/npm-asset/primevue/tieredmenu/tieredmenu.min.js'); } + if($vuedatepicker11) generateJSsInclude('vendor/vuejs/vuedatepicker_js11/vue-datepicker.iife.js'); + // -------------------------------------------------------------------------------------------------------- // From public folder @@ -184,11 +186,13 @@ // User Defined Fields if ($udfs === true) generateJSsInclude('public/js/UDFWidget.js'); - + // Load addon hooks JS // NOTE: keep it as the last but one if ($addons === true) generateAddonsJSsInclude($calledPath.'/'.$calledMethod); + + // Eventually required JS // NOTE: keep it as the latest generateJSsInclude($customJSs); diff --git a/application/views/templates/FHC-Header.php b/application/views/templates/FHC-Header.php index cd25f4b58..f7b5491a1 100644 --- a/application/views/templates/FHC-Header.php +++ b/application/views/templates/FHC-Header.php @@ -9,12 +9,14 @@ $title = isset($title) ? $title : null; $refresh = isset($refresh) ? $refresh : null; $customCSSs = isset($customCSSs) ? $customCSSs : null; + $skipID = isset($skipID) ? $skipID : null; ?> + <?php printPageTitle($title); ?> @@ -95,7 +97,12 @@ generateCSSsInclude('vendor/npm-asset/primeicons/primeicons.css'); } - // -------------------------------------------------------------------------------------------------------- + if ($vuedatepicker11 === true) + { + generateCSSsInclude('vendor/vuejs/vuedatepicker_css11/main.css'); + } + + // -------------------------------------------------------------------------------------------------------- // From public folder // AjaxLib CSS @@ -131,5 +138,7 @@ + + diff --git a/application/widgets/TableWidget.php b/application/widgets/TableWidget.php index c48308258..28e7c4a4f 100644 --- a/application/widgets/TableWidget.php +++ b/application/widgets/TableWidget.php @@ -95,10 +95,8 @@ class TableWidget extends Widget */ public function display($widgetData) { - $this->view(self::WIDGET_URL_TABLE, array( - 'tableUniqueId' => $widgetData[TableWidgetLib::TABLE_UNIQUE_ID], - 'bootstrapVersion' => $widgetData[TableWidgetLib::TABLE_BOOTSTRAP_VERSION], + 'tableUniqueId' => $widgetData[TableWidgetLib::TABLE_UNIQUE_ID] )); // GUI starts here } diff --git a/cis/index.html b/cis/index.html index 2a3809f6f..074107e57 100644 --- a/cis/index.html +++ b/cis/index.html @@ -2,6 +2,7 @@ CIS + diff --git a/cis/index_login.php b/cis/index_login.php index 74c87f649..4040a9304 100644 --- a/cis/index_login.php +++ b/cis/index_login.php @@ -22,6 +22,8 @@ */ require_once('../config/cis.config.inc.php'); require_once('../include/functions.inc.php'); +require_once('../include/benutzerberechtigung.class.php'); +require_once('../include/student.class.php'); if(isset($_GET['login'])) { @@ -35,7 +37,26 @@ if(isset($_GET['login'])) if($uid!='') { - header('Location: '.APP_ROOT.'cis/index.php'); + $benutzerberechtigung = new benutzerberechtigung(); + $benutzerberechtigung->getBerechtigungen($uid); + $student = new student(); + $student->load($uid); + + $redirectToCisneu = (defined('CIS_REDIRECT_TO_CIS4') && (true === CIS_REDIRECT_TO_CIS4)); + $isBerechtigtCisneu = ($benutzerberechtigung->isBerechtigt('basis/cis') + && $benutzerberechtigung->isBerechtigt('dashboard/benutzer')); + $isValidStudent = $student->checkIfValidStudentUID($uid); + + if( $redirectToCisneu && $isBerechtigtCisneu && $isValidStudent ) + { + http_response_code(303); + header('Location: ' . APP_ROOT . 'cis.php'); + exit(); + } + else + { + header('Location: '.APP_ROOT.'cis/index.php'); + } } } diff --git a/cis/infoterminal/index.php b/cis/infoterminal/index.php index 1b4c7d637..04c591ee1 100644 --- a/cis/infoterminal/index.php +++ b/cis/infoterminal/index.php @@ -843,7 +843,6 @@ function meine_uid_informationen_detail($db,$uid,$count=0) $aktiv=$db->db_result($erg,0,"aktiv"); - $svnr=$db->db_result($erg,0,"svnr"); $titelpre=$db->db_result($erg,0,"titelpre"); $titelpost=$db->db_result($erg,0,"titelpost"); diff --git a/cis/private/lehre/abgabe_lektor_details.php b/cis/private/lehre/abgabe_lektor_details.php index a8705e7f9..f97dfa159 100644 --- a/cis/private/lehre/abgabe_lektor_details.php +++ b/cis/private/lehre/abgabe_lektor_details.php @@ -125,7 +125,7 @@ $projekttyp_kurzbz = $projektarbeit_obj->projekttyp_kurzbz; // paarbeit sollte nur ab bestimmten Zeitpunkt online bewertet werden $paIsCurrent = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id); -if(!is_numeric($paIsCurrent) || $paIsCurrent < 0) +if(!is_bool($paIsCurrent)) { echo "".$p->t('abgabetool/fehlerAktualitaetProjektarbeit')."
 "; } @@ -166,7 +166,7 @@ if(in_array($betreuerart, array('Erstbegutachter', 'Senatsvorsitz'))) } // Mail mit Token an Zweitbegutachter senden - if (count($zweitbetreuerArr) > 0 && $paIsCurrent >= 1 && isset($_GET['zweitbegutachtertoken']) && isset($_GET['zweitbetreuer_person_id'])) + if (count($zweitbetreuerArr) > 0 && $paIsCurrent === true && isset($_GET['zweitbegutachtertoken']) && isset($_GET['zweitbetreuer_person_id'])) { $qry_std="SELECT * FROM campus.vw_benutzer where uid=".$db->db_add_param($uid); if(!$result_std=$db->db_query($qry_std)) @@ -482,7 +482,7 @@ $htmlstr .= "\n"; $htmlstr .= ""; $htmlstr .= " - + "; $htmlstr .= "\n"; @@ -544,7 +545,7 @@ if (isset($zweitbetreuerArr) && is_array($zweitbetreuerArr)) // wenn es Zweitbet $htmlstr .= "  " . $p->t("; // Token senden button wenn Zweitbegutachter extern ist und Projektarbeit nicht für altes Semester ist - if (isset($zweitbetreuer->email) && !isset($zweitbetreuer->uid) && $paIsCurrent >= 1) + if (isset($zweitbetreuer->email) && !isset($zweitbetreuer->uid) && $paIsCurrent === true) { $htmlstr .= "\n"; $htmlstr .= ""; diff --git a/cis/private/lehre/abgabe_student.php b/cis/private/lehre/abgabe_student.php index 2512d9831..0a0385970 100644 --- a/cis/private/lehre/abgabe_student.php +++ b/cis/private/lehre/abgabe_student.php @@ -195,13 +195,13 @@ else $htmlstr .= ""; } diff --git a/cis/private/lehre/abgabe_student_details.php b/cis/private/lehre/abgabe_student_details.php index 860eb7579..84ba608a1 100644 --- a/cis/private/lehre/abgabe_student_details.php +++ b/cis/private/lehre/abgabe_student_details.php @@ -472,8 +472,8 @@ if($command=="update" && $error!=true) else { // paarbeit sollte nur ab bestimmten Zeitpunkt online bewertet werden - $num_rows_sem = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id); - if(!is_numeric($num_rows_sem) || $num_rows_sem < 0) + $paIsCurrent = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id); + if(!is_bool($paIsCurrent)) { echo "".$p->t('abgabetool/fehlerAktualitaetProjektarbeit')."
 "; } @@ -495,7 +495,7 @@ if($command=="update" && $error!=true) $maildata['student_voller_name'] = trim($row_std->titelpre." ".$row_std->vorname." ".$row_std->nachname." ".$row_std->titelpost); $maildata['abgabetyp'] = $abgabetyp; $maildata['parbeituebersichtlink'] = "

Zur Projektarbeitsübersicht

"; - $maildata['bewertunglink'] = $num_rows_sem >= 1 && $paabgabetyp_kurzbz == 'end' ? "

Zur Beurteilung der Arbeit

" : ""; + $maildata['bewertunglink'] = $paIsCurrent && $paabgabetyp_kurzbz == 'end' ? "

Zur Beurteilung der Arbeit

" : ""; $maildata['token'] = ""; $mailres = sendSanchoMail( @@ -557,8 +557,8 @@ if($command=="update" && $error!=true) $zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name']; $zweitbetmaildata['abgabetyp'] = $abgabetyp; $zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : ""; - $zweitbetmaildata['bewertunglink'] = $num_rows_sem >= 1 ? "

Zur Beurteilung der Arbeit

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

Zugangstoken: " . $begutachterMitToken->zugangstoken . "

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

Zur Beurteilung der Arbeit

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

Zugangstoken: " . $begutachterMitToken->zugangstoken . "

" : ""; $mailres = sendSanchoMail( 'ParbeitsbeurteilungEndupload', diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php index a799c9fad..553e3f03c 100644 --- a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php +++ b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php @@ -241,7 +241,7 @@ if (isset($_REQUEST["freigabe"]) && ($_REQUEST["freigabe"] == 1)) $name hat neue Noten für die Lehrveranstaltung\n\n
" . $sg->kuerzel . ' ' . $lv->semester . '.Semester - ' . $lv->bezeichnung . " " . $lv->orgform_kurzbz . " - " . $stsem . " + ' . $lv->bezeichnung . " - " .$lv->lehrform_kurzbz. " " . $lv->orgform_kurzbz . " - " . $stsem . "
eingetragen.\n

Die Noten können jetzt ins Zeugnis übernommen werden.\n"; @@ -1090,7 +1090,10 @@ foreach ($stsem_obj->studiensemester as $studiensemester) } $stsem_content .= "\n"; -if (! $rechte->isBerechtigt('admin', 0) && ! $rechte->isBerechtigt('admin', $lv_obj->studiengang_kz) && ! $rechte->isBerechtigt('lehre', $lv_obj->studiengang_kz)) +if (! $rechte->isBerechtigt('admin', 0) + && ! $rechte->isBerechtigt('admin', $lv_obj->studiengang_kz) + && ! $rechte->isBerechtigt('lehre', $lv_obj->studiengang_kz) + && ! $rechte->isBerechtigt('lehre', $lv_obj->oe_kurzbz)) { $qry = "SELECT lehreinheit_id diff --git a/cis/private/lehre/projektbeurteilungDocumentExport.php b/cis/private/lehre/projektbeurteilungDocumentExport.php new file mode 100644 index 000000000..08f7127ee --- /dev/null +++ b/cis/private/lehre/projektbeurteilungDocumentExport.php @@ -0,0 +1,26 @@ +getVorlage($_GET['projektarbeit_id'], $_GET['betreuerart_kurzbz']); + +if ($vorlage == null) + die("

".$projektarbeitVorlage->errormsg."

"); + +// weiterleiten auf Dokumentexport +header('Location: ' . APP_ROOT . '/cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php' + .'&xsl='.$vorlage.'&betreuerart_kurzbz=' . $_GET['betreuerart_kurzbz'] + . '&projektarbeit_id=' . $_GET['projektarbeit_id'] . '&person_id=' . $_GET['person_id'] +); +die(); diff --git a/cis/private/lehre/pruefung/pruefung.js.php b/cis/private/lehre/pruefung/pruefung.js.php index 4142e413c..ea4c1eff0 100644 --- a/cis/private/lehre/pruefung/pruefung.js.php +++ b/cis/private/lehre/pruefung/pruefung.js.php @@ -382,7 +382,7 @@ function writePruefungsTable(e, data, anmeldung) } else if(new Date() > minimumFrist) { - button = "

"+frist+"'>

"; + button = "

"+frist+"'>

"; } } else @@ -479,13 +479,15 @@ function showPruefungsDetails(prfId, lvId) * @param {type} lvBezeichnung Bezeichnung der Lehrveranstaltung * @param {type} terminVon Beginn der Prüfung * @param {type} terminBis Ende der Prüfung + * @param {type} ects der LV * @returns {undefined} */ -function openDialog(lehrveranstaltung_id, termin_id, lvBezeichnung, terminVon, terminBis) +function openDialog(lehrveranstaltung_id, termin_id, lvBezeichnung, terminVon, terminBis, ects) { $("#lehrveranstaltungHidden").val(lehrveranstaltung_id); $("#terminHidden").val(termin_id); $("#lehrveranstaltung").html(lvBezeichnung); + $("#ectsangabe").val(ects); $.ajax({ dataType: 'json', @@ -582,6 +584,12 @@ function saveAnmeldung(lehrveranstaltung_id, termin_id) if($('#prestudent_studiengang').length) studiengang_kz = $('#prestudent_studiengang option:selected').val(); + var ects = null; + if ($('#ectsangabe').length) + { + ects = $('#ectsangabe').val(); + } + $.ajax({ dataType: 'json', url: "./pruefungsanmeldung.json.php", @@ -593,7 +601,8 @@ function saveAnmeldung(lehrveranstaltung_id, termin_id) bemerkung: bemerkungen, uid: uid, studienverpflichtung_id: studienverpflichtung_id, - studiengang_kz: studiengang_kz + studiengang_kz: studiengang_kz, + ects: ects }, error: loadError, success: function(data){ @@ -804,6 +813,7 @@ function writeAnmeldungen(data, showMessage = true) var pruefung_id = data.result.anmeldungen[0].pruefung_id; var lehrveranstaltung_id = data.result.anmeldungen[0].lehrveranstaltung_id; var ort_kurzbz = data.result.ort_kurzbz; + var anderer_raum = data.result.anderer_raum; var lv_bezeichnung = data.result.lv_bezeichnung; var lv_lehrtyp = data.result.lv_lehrtyp; var prf_termin = data.result.datum; @@ -816,24 +826,33 @@ function writeAnmeldungen(data, showMessage = true) count++; var vorname = d.student.vorname !== "null" ? d.student.vorname : ""; var nachname = d.student.nachname !== "null" ? d.student.nachname : ""; + + let ects = ""; + + ects = d.ects !== null ? "(" + d.ects + " ECTS) ": ""; + + + switch(d.status_kurzbz) { case 'angemeldet': - liste += "
  • "+vorname+" "+nachname+""; + liste += "
  • "+ects+vorname+" "+nachname+""; liste += "
    "+count+"
    ' onclick='anmeldungBestaetigen(\""+d.pruefungsanmeldung_id+"\", \""+terminId+"\", \""+lehrveranstaltung_id+"\");'>"; liste += "
    "; if(d.wuensche !== null) { - liste += ""; + let msg = $('
    ').text(d.wuensche).html(); + liste += `
    `; } liste += "
  • "; break; case 'bestaetigt': - liste += "
  • "+vorname+" "+nachname+""; + liste += "
  • "+ects+vorname+" "+nachname+""; liste += "
    "+count+"
    "; if(d.wuensche !== null) { - liste += ""; + let msg = $('
    ').text(d.wuensche).html(); + liste += `
    `; } break; @@ -844,13 +863,14 @@ function writeAnmeldungen(data, showMessage = true) }); liste += ""; $("#anmeldung_hinzufuegen").html("' onclick='saveAnmeldung(\""+lehrveranstaltung_id+"\",\""+terminId+"\");'/>"); - $("#reihungSpeichernButton").html("' onclick='saveReihung(\""+terminId+"\", \""+lehrveranstaltung_id+"\");'>' onclick='alleBestaetigen(\""+terminId+"\", \""+lehrveranstaltung_id+"\");'>"); + $("#reihungSpeichernButton").html("
  • + + + + `; + } + else + { + termine.forEach(function(d) { + let vonDate = convertDateTime(d.von); + let vonTime = convertDateTime(d.von, 'time'); + let bisTime = convertDateTime(d.bis, 'time'); + let onClick = `showAnmeldungen(${d.pruefungstermin_id}, ${e.lehrveranstaltung_id})`; + + rows += ` + + + + + + + + + `; + }); } - liste += ""; }); - $("#pruefungenListe").append(liste); + $("#pruefungenListe").html(rows); + setTablesorter('table4') } else { + $('#table4').hide() $("#pruefungenListe").html("t('pruefung/keinePruefungenVorhanden'); ?>"); } } @@ -1148,6 +1231,42 @@ function loadPruefungStudiengang(studiengang_kz, studiensemester) }); } +function terminezusammenlegen(termine, lv_id) +{ + if(termine.length <= 1) + return; + + $.ajax({ + dataType: 'json', + url: "./pruefungsanmeldung.json.php", + type: "POST", + data: { + method: "terminezusammenlegen", + 'termine[]': termine, + lv_id: lv_id + }, + error: loadError, + success: function(data){ + if(data.error === 'false') + { + loadPruefungStudiengang() + $("#anmeldung_hinzufuegen").empty(); + $("#lvdaten").empty(); + $("#anmeldeDaten").empty(); + $("#reihungSpeichernButton").empty(); + $("#kommentar").empty(); + $("#kommentarSpeichernButton").empty(); + $("#raumLink").empty(); + $("#listeDrucken").empty(); + } + else + { + messageBox("message", data.errormsg, "red", "highlight", 10000); + } + } + }); +} + /** * Zeigt das Formularfeld zur Eingabe eines Kommentars in der Anmeldungsverwaltung an. * @param {String} vorname Vorname des Studenten @@ -1241,6 +1360,7 @@ function loadStudiensemester() data.result.forEach(function(d){ selectData += ""; }); + $('#studiensemester').html(selectData); loadPruefungsfenster(); loadLehrveranstaltungen(); @@ -1540,7 +1660,7 @@ function loadPruefungsDetails(prfId) if(data.result.length === 0) { messageBox("message", "t('pruefung/keinePruefungsfensterGespeichert'); ?>", "red", "highlight", 10000); - $("#pruefungsfenster").html(""); + $("#pruefungsfenster").html(""); } else { @@ -2188,10 +2308,28 @@ function changeStateOfRaumDropdown() } } +function changeStateOfRaumInputs() +{ + if ($("#andererRaum").prop("checked") === true) + { + $("#raumInfos").hide(); + } + else + { + $("#raumInfos").show(); + } +} + function saveRaum(terminId, lehrveranstaltung_id) { var ort_kurzbz; - if($("#raum input[type=checkbox]").prop("checked") === true) + let anderer_raum = ''; + if ($("#andererRaum").prop("checked") === true && $('#andereRaumInput').val() !== '') + { + ort_kurzbz = ""; + anderer_raum = $('#andereRaumInput').val(); + } + else if($("#raum input[type=checkbox]").prop("checked") === true) { ort_kurzbz = "buero"; } @@ -2206,7 +2344,8 @@ function saveRaum(terminId, lehrveranstaltung_id) data: { method: "saveRaum", ort_kurzbz: ort_kurzbz, - terminId: terminId + terminId: terminId, + anderer_raum: anderer_raum }, error: loadError }).done(function(data){ diff --git a/cis/private/lehre/pruefung/pruefungsanmeldung.json.php b/cis/private/lehre/pruefung/pruefungsanmeldung.json.php index 6757cf391..e4f17860a 100644 --- a/cis/private/lehre/pruefung/pruefungsanmeldung.json.php +++ b/cis/private/lehre/pruefung/pruefungsanmeldung.json.php @@ -106,9 +106,14 @@ switch($method) case 'getStudiengaenge': $data = getStudiengaenge(); break; - case 'getPruefungenStudiengang': + case 'getPruefungenStudiensemester': $studiensemester = filter_input(INPUT_POST,"studiensemester"); - $data = getPruefungenStudiengang($uid, $studiensemester); + $data = getPruefungenStudiengangBySemester($studiensemester); + break; + case 'terminezusammenlegen': + $termine = filter_input(INPUT_POST, 'termine', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY); + $lv_id = filter_input(INPUT_POST, 'lv_id'); + $data = terminezusammenlegen($termine, $lv_id); break; case 'saveKommentar': $data = saveKommentar(); @@ -120,7 +125,8 @@ switch($method) case 'saveRaum': $terminId = $_REQUEST["terminId"]; $ort_kurzbz = $_REQUEST["ort_kurzbz"]; - $data = saveRaum($terminId, $ort_kurzbz, $uid); + $anderer_raum = $_REQUEST["anderer_raum"]; + $data = saveRaum($terminId, $ort_kurzbz, $uid, $anderer_raum); break; case 'getLvKompatibel': $lvid = filter_input(INPUT_POST, "lehrveranstaltung_id"); @@ -397,6 +403,7 @@ function saveAnmeldung($aktStudiensemester = null, $uid = null) $lv_besucht = false; $studienverpflichtung_id = filter_input(INPUT_POST, "studienverpflichtung_id"); $studiengang_kz = filter_input(INPUT_POST, "studiengang_kz"); + $ects = filter_input(INPUT_POST, "ects"); //Defaulteinstellung für Anzahlprüfungsversuche (wird durch Addon "ktu" überschrieben) $maxAnzahlVersuche = 0; @@ -731,6 +738,10 @@ function saveAnmeldung($aktStudiensemester = null, $uid = null) else $anmeldung->anrechnung_id = $anrechnung->anrechnung_id; + if (defined('CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE') && (CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE === true)) + { + $anmeldung->ects = $ects; + } if($anmeldung->save(true)) { $pruefung = new pruefungCis($termin->pruefung_id); @@ -960,9 +971,13 @@ function alleBestaetigen($uid) global $p; $lehrveranstaltung_id = $_REQUEST["lehrveranstaltung_id"]; $pruefungstermin_id = $_REQUEST["termin_id"]; + $emails = $_REQUEST["emails"]; $pruefungstermin = new pruefungstermin($pruefungstermin_id); $pruefungsanmeldung = new pruefungsanmeldung(); $pranmeldungen = $pruefungsanmeldung->getAnmeldungenByTermin($pruefungstermin_id, $lehrveranstaltung_id); + + $mail_benutzer = []; + $mail_inhalt = []; foreach($pranmeldungen as $a) { $anmeldung = new pruefungsanmeldung($a->pruefungsanmeldung_id); @@ -976,6 +991,13 @@ function alleBestaetigen($uid) $ma = new mitarbeiter($uid); $datum = new datum(); $ort = new ort($termin->ort_kurzbz); + + $ortbezeichnung = $ort->bezeichnung; + if (is_null($termin->ort_kurzbz) && !is_null($termin->anderer_raum)) + { + $ortbezeichnung = $termin->anderer_raum; + } + $pruefung = new pruefungCis($termin->pruefung_id); $to = $anm->uid."@".DOMAIN; @@ -995,17 +1017,66 @@ function alleBestaetigen($uid) } else $html .= $p->t('pruefung/emailBodyTermin')." ".$datum->formatDatum($termin->von, "d.m.Y")." ".$p->t('pruefung/emailBodyUm')." ".$datum->formatDatum($termin->von, "H:i")."
    "; - $html .= $p->t('pruefung/anmeldungErfolgreich')." ".$ort->bezeichnung."
    "; + $html .= $p->t('pruefung/anmeldungErfolgreich')." ".$ortbezeichnung."
    "; $html .= "
    "; $html .= "".$p->t('pruefung/emailBodyLinkZurAnmeldung')."
    "; $html .= "
    "; + $mail_benutzer[] = [ + 'uid' => $anm->uid + ]; + + if (empty($mail_inhalt)) + { + $mail_inhalt = array( + 'von' => $ma->vorname." ".$ma->nachname, + 'lv' => $lv->bezeichnung, + 'ort' => $ortbezeichnung, + 'datum' => $datum->formatDatum($termin->von, "d.m.Y") . ' ' . $p->t('pruefung/emailBodyUm') . ' ' . (isset($von) ? $von : $datum->formatDatum($termin->von, "H:i")), + 'dauer' => $pruefung->einzeln ? ($pruefung->pruefungsintervall . ' ' . $p->t('pruefung/emailBodyMinuten')): ''); + } + $mail = new mail($to, $from, $subject,$p->t('pruefung/emailBodyBitteHtmlSicht')); $mail->setHTMLContent($html); $mail->send(); } } } + + if (!empty($emails) && !empty($mail_inhalt)) + { + foreach ($emails as $email) + { + $from = "noreply@".DOMAIN; + $subject = $p->t('pruefung/emailSubjectAnmeldungBestaetigung'); + $html = $p->t('pruefung/sammelemailBody',array($mail_inhalt['lv'], $mail_inhalt['datum'], $mail_inhalt['von'])); + + if ($mail_inhalt['ort']) + { + $html .= $p->t('pruefung/sammelemailBody2',array($mail_inhalt['ort'])); + } + + $html .= "
    ".$p->t('abgabetool/student').": ".$db->convert_html_chars($studentenname).""; -$semester_benotbar = $paIsCurrent >= 1; +$semester_benotbar = $paIsCurrent === true; $endupload_vorhanden = $num_rows_endupload >= 1; if ($semester_benotbar && $endupload_vorhanden) @@ -495,7 +495,8 @@ if ($semester_benotbar && $endupload_vorhanden) } else { - $quick_info = !$semester_benotbar ? $p->t('abgabetool/aeltereParbeitBenoten') : $p->t('abgabetool/keinEnduploadErfolgt'); + $quick_info = !$semester_benotbar ? $p->t('abgabetool/aeltereParbeitBenotenQuickInfo') : $p->t('abgabetool/keinEnduploadErfolgt'); + $info_text = !$semester_benotbar ? $p->t('abgabetool/aeltereParbeitBenoten') : $p->t('abgabetool/keinEnduploadErfolgt'); $htmlstr .= "
    "; $htmlstr .= ""; @@ -516,7 +517,7 @@ else } $htmlstr .= "
    " . $p->t('abgabetool/titel') . ": ".$db->convert_html_chars($titel)."".(isset($quick_info) ? $quick_info : '')."".(isset($info_text) ? $info_text : '')." ".$p->t('abgabetool/studentenansicht')."
    "; if (!is_null($row->babgeschickt)) - $htmlstr .= "".$p->t('abgabetool/projektbeurteilungErstDownload').""; + $htmlstr .= "".$p->t('abgabetool/projektbeurteilungErstDownload').""; if (!is_null($row->babgeschickt) && !is_null($row->zweitbetreuer_abgeschickt)) $htmlstr .= "/"; if (!is_null($row->zweitbetreuer_abgeschickt)) - $htmlstr .= "".$p->t('abgabetool/projektbeurteilungZweitDownload').""; + $htmlstr .= "".$p->t('abgabetool/projektbeurteilungZweitDownload').""; $htmlstr .= "
    ${e.bezeichnung}Keine Termine
    ${e.studiengang}${e.bezeichnung}${vonDate}${vonTime}${bisTime}t('pruefung/pruefungsbewertungAnmeldungen'); ?>
    + + + + + + "; + + foreach($mail_benutzer as $benutzer) + { + $html .= " + + "; + } + $html .= "
    UID
    " . htmlspecialchars($benutzer['uid']) . "

    "; + + $mail = new mail($email, $from, $subject, $p->t('pruefung/emailBodyBitteHtmlSicht')); + $mail->setHTMLContent($html); + $mail->send(); + } + } $data['result']=true; $data['error']='false'; $data['errormsg']=''; @@ -1032,6 +1103,12 @@ function anmeldungBestaetigen($uid) $ort = new ort($termin->ort_kurzbz); $pruefung = new pruefungCis($termin->pruefung_id); + $ortbezeichnung = $ort->bezeichnung; + if (is_null($termin->ort_kurzbz) && !is_null($termin->anderer_raum)) + { + $ortbezeichnung = $termin->anderer_raum; + } + $to = $anmeldung->uid."@".DOMAIN; $from = "noreply@".DOMAIN; $subject = $p->t('pruefung/emailSubjectAnmeldungBestaetigung'); @@ -1049,7 +1126,7 @@ function anmeldungBestaetigen($uid) } else $html .= $p->t('pruefung/emailBodyTermin')." ".$datum->formatDatum($termin->von, "d.m.Y")." ".$p->t('pruefung/emailBodyUm')." ".$datum->formatDatum($termin->von, "H:i")."
    "; - $html .= $p->t('pruefung/anmeldungErfolgreich')." ".$ort->bezeichnung."
    "; + $html .= $p->t('pruefung/anmeldungErfolgreich')." ".$ortbezeichnung."
    "; $html .= "
    "; $html .= "".$p->t('pruefung/emailBodyLinkZurAnmeldung')."
    "; $html .= "
    "; @@ -1166,6 +1243,258 @@ function getPruefungenStudiengang($uid, $aktStudiensemester) return $data; } +function getPruefungenStudiengangBySemester($aktStudiensemester) +{ + $result = array(); + $pruefungen = new pruefungCis(); + $pruefungen->getPruefungByStudiensemester($aktStudiensemester); + + if(!empty($pruefungen->lehrveranstaltungen)) + { + $lehrveranstaltungen = []; + foreach ($pruefungen->lehrveranstaltungen as $prf) + { + $pruefung = new pruefungCis(); + $pruefung->load($prf->pruefung_id); + + if ($pruefung->storniert) + continue; + + $pruefung->getTermineByPruefung(); + + $lvid = $prf->lehrveranstaltung_id; + + if (!isset($lehrveranstaltungen[$lvid])) + { + $lv = new stdClass(); + $lehrveranstaltung = new lehrveranstaltung(); + $lehrveranstaltung->load($lvid); + + $studiengang = new studiengang(); + $studiengang->load($lehrveranstaltung->studiengang_kz); + + $lv->bezeichnung = $lehrveranstaltung->bezeichnung; + $lv->lehrveranstaltung_id = $lvid; + $lv->studiengang = $studiengang->kuerzel; + $lv->pruefung = []; + $lehrveranstaltungen[$lvid] = $lv; + } + + $lehrveranstaltungen[$lvid]->pruefung[] = $pruefung; + } + $result = array_values($lehrveranstaltungen); + } + $data['result']=$result; + $data['error']='false'; + $data['errormsg']=''; + return $data; +} + +function terminezusammenlegen($termine, $lv_id) +{ + $result = array(); + $alle_termine = array(); + $error = false; + $terminkollision = defined('CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION') ? CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION : false; + foreach($termine as $termin) + { + $pruefungstermin = new pruefungstermin(); + $pruefungstermin->load($termin); + $pruefung = new pruefungCis(); + $pruefung->load($pruefungstermin->pruefung_id); + $pruefung->getLehrveranstaltungenByPruefung(); + + $lehrveranstaltungen = array_column($pruefung->lehrveranstaltungen, 'lehrveranstaltung_id'); + if (!in_array($lv_id, $lehrveranstaltungen)) + continue; + + $pruefung->lehrveranstaltung_id = $lv_id; + $pruefung->termin = $pruefungstermin; + $alle_termine[] = $pruefung; + } + + + if (count($alle_termine) >= 1) + { + usort($alle_termine, function($a, $b) { + return strcmp($a->termin->von, $b->termin->von); + }); + + $first_termin = $alle_termine[0]; + + $first_mitarbeiter = $first_termin->mitarbeiter_uid; + $first_date = date('Y-m-d', strtotime($first_termin->termin->von)); + $first_studiensemester = $first_termin->studiensemester_kurzbz; + $first_sammelklausur = $first_termin->termin->sammelklausur; + $first_ort = $first_termin->termin->ort_kurzbz; + $first_raum = $first_termin->termin->anderer_raum; + $first_lv = $first_termin->lehrveranstaltung_id; + $first_titel = $first_termin->titel; + + $max_von = strtotime($first_termin->termin->von); + $max_bis = strtotime($first_termin->termin->bis); + $teilnehmer_min = (int)$first_termin->termin->teilnehmer_min; + $teilnehmer_max = (int)$first_termin->termin->teilnehmer_max; + + + $prevEnd = $max_bis; + + foreach ($alle_termine as $termin) + { + if (date('Y-m-d', strtotime($termin->termin->von)) !== $first_date) + { + $data['errormsg'] = 'Nicht der gleiche Tag!'; + $error = true; + } + + if ($termin->mitarbeiter_uid !== $first_mitarbeiter) + { + $data['errormsg'] = 'Unterschiedliche Lektoren!'; + $error = true; + } + + if ($termin->studiensemester_kurzbz !== $first_studiensemester) + { + $data['errormsg'] = 'Unterschiedliche Studiensemester!'; + $error = true; + } + + if ($termin->termin->sammelklausur !== $first_sammelklausur) + { + $data['errormsg'] = 'Sammelklausur unterschiedlich!'; + $error = true; + } + + if (!($termin->termin->ort_kurzbz === $first_ort || $first_termin->termin->anderer_raum == $first_raum)) + { + $data['errormsg'] = 'Ort/Raum unterschiedlich!'; + $error = true; + } + + if ($termin->lehrveranstaltung_id !== $first_lv) + { + $data['errormsg'] = 'Lehrveranstaltungen unterscheiden sich!'; + $error = true; + } + + + $start = strtotime($termin->termin->von); + $max_von = min($max_von, $start); + $max_bis = max($max_bis, strtotime($termin->termin->bis)); + $teilnehmer_min = min($teilnehmer_min, (int)$termin->termin->teilnehmer_min); + $teilnehmer_max = max($teilnehmer_max, (int)$termin->termin->teilnehmer_max); + + if (($start - $prevEnd > 0) && $first_ort) + { + $stunde = new stunde(); + + $gapStartStr = date('Y-m-d H:i:s', $prevEnd); + $gapEndStr = date('Y-m-d H:i:s', $start); + + $gapStartArr = explode(' ', $gapStartStr); + $gapEndArr = explode(' ', $gapEndStr); + + $stunden = $stunde->getStunden($gapStartArr[1], $gapEndArr[1]); + + $reservierung = new reservierung(); + $reserviert = false; + + $reservierungs_stunden = $reservierung->getReservierungen($first_ort, $gapStartArr[0]); + + $need_stunden = array_diff($stunden, $reservierungs_stunden); + + foreach ($need_stunden as $h) + { + if ($reservierung->isReserviert($first_ort, $gapStartArr[0], $h)) + $reserviert = true; + } + + if (!$terminkollision && $reserviert && !$first_sammelklausur) + { + $error = true; + $data['errormsg'] = 'Kann nicht zusammengelegt werden, da der Raum reserviert ist'; + } + else + { + $reservierung->studiengang_kz = "0"; + $reservierung->ort_kurzbz = $first_ort; + $reservierung->uid = $first_mitarbeiter; + $reservierung->datum = $gapStartArr[0]; + $reservierung->titel = $first_titel; + if (strlen($first_titel) > 10) + { + $reservierung->titel = "Prüfung"; + } + $reservierung->beschreibung = "Prüfung"; + $reservierung->insertamum = date('Y-m-d G:i:s'); + $reservierung->insertvon = get_uid(); + $reservierungError = false; + + foreach ($need_stunden as $h) + { + $reservierung->stunde = $h; + if (!$reservierungError) + { + if (!$reservierung->save(true)) + { + $error = true; + $data['errormsg'] = $reservierung->errormsg; + $reservierungError = true; + } + } + } + } + } + $prevEnd = strtotime($termin->termin->bis); + } + + if (!$error) + { + $first_pruefungstermin = new pruefungstermin(); + $first_pruefungstermin->load($first_termin->termin->pruefungstermin_id); + + $first_pruefungstermin->von = date('Y-m-d H:i:s', $max_von); + $first_pruefungstermin->bis = date('Y-m-d H:i:s', $max_bis); + $first_pruefungstermin->teilnehmer_min = $teilnehmer_min; + $first_pruefungstermin->teilnehmer_max = $teilnehmer_max; + + $first_pruefungstermin->save(); + + $alle_termine = array_slice($alle_termine, 1); + + foreach ($alle_termine as $termin) + { + $anmeldung_termin = new pruefungsanmeldung(); + $anmeldungen_termine = $anmeldung_termin->getAnmeldungenByTermin($termin->termin->pruefungstermin_id); + + if (count($anmeldungen_termine) === 0) + { + $first_pruefungstermin->delete($termin->termin->pruefungstermin_id); + } + $i = 0; + $anmeldungen_termine_count = count($anmeldungen_termine); + foreach ($anmeldungen_termine as $anmeldungtermin) + { + $anmeldung = new pruefungsanmeldung(); + $anmeldung->load($anmeldungtermin->pruefungsanmeldung_id); + $old_pruefuengstermin_id = $anmeldung->pruefungstermin_id; + $anmeldung->pruefungstermin_id = $first_termin->termin->pruefungstermin_id; + if ($anmeldung->save(false) && ($i === $anmeldungen_termine_count - 1)) + { + $first_pruefungstermin->delete($old_pruefuengstermin_id); + } + $i ++; + } + } + } + } + + $data['result']= $result; + $data['error']= $error ? 'true' : 'false'; + //$data['errormsg']=''; + return $data; +} + /** * * @return typespeichert ein Kommentar zu einer Prüfungsanmeldung @@ -1246,7 +1575,7 @@ function compareRaeume($a, $b) return strcmp($a->ort_kurzbz, $b->ort_kurzbz); } -function saveRaum($terminId, $ort_kurzbz, $uid) +function saveRaum($terminId, $ort_kurzbz, $uid, $anderer_raum = '') { $terminkollision = defined('CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION') ? CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION : false; $pruefungstermin = new pruefungstermin($terminId); @@ -1265,7 +1594,24 @@ function saveRaum($terminId, $ort_kurzbz, $uid) { $pruefung = new pruefungCis($pruefungstermin->pruefung_id); $mitarbeiter = new mitarbeiter($pruefung->mitarbeiter_uid); - if($ort_kurzbz === "buero") + + if ($ort_kurzbz === "" && $anderer_raum !== "") + { + $pruefungstermin->anderer_raum = $anderer_raum; + + if($pruefungstermin->save(false)) + { + $data['result']="reserviert"; + $data['error']='false'; + $data['errormsg']=''; + } + else + { + $data['error']='true'; + $data['errormsg']=$pruefungstermin->errormsg; + } + } + else if($ort_kurzbz === "buero") { $pruefungstermin->ort_kurzbz = $mitarbeiter->ort_kurzbz; if($pruefungstermin->save(false)) diff --git a/cis/private/lehre/pruefung/pruefungsanmeldung.php b/cis/private/lehre/pruefung/pruefungsanmeldung.php index c969c51aa..837e0c227 100644 --- a/cis/private/lehre/pruefung/pruefungsanmeldung.php +++ b/cis/private/lehre/pruefung/pruefungsanmeldung.php @@ -321,6 +321,20 @@ $studiensemester->getAll(); + + + + + t('pruefung/ects'); ?>: + + + + + + diff --git a/cis/private/lehre/pruefung/pruefungsanmeldungen_liste.php b/cis/private/lehre/pruefung/pruefungsanmeldungen_liste.php index 39ec68ad4..91c2ea084 100644 --- a/cis/private/lehre/pruefung/pruefungsanmeldungen_liste.php +++ b/cis/private/lehre/pruefung/pruefungsanmeldungen_liste.php @@ -235,12 +235,18 @@ $rechte->getBerechtigungen($uid); t('global/datum'); ?> t('benotungstool/note'); ?> t('global/anmerkung'); ?> + + + t('pruefung/ects'); ?> + + uid); @@ -269,6 +275,8 @@ $rechte->getBerechtigungen($uid); echo ''.$date.''; echo ''; echo ''; + if (defined('CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE') && (CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE === true)) + echo ''. $anmeldung->ects .''; echo ''; } ?> diff --git a/cis/private/lehre/pruefung/pruefungsanmeldungen_liste_ohne_namen.php b/cis/private/lehre/pruefung/pruefungsanmeldungen_liste_ohne_namen.php index 207ba4dd7..414ebdf15 100644 --- a/cis/private/lehre/pruefung/pruefungsanmeldungen_liste_ohne_namen.php +++ b/cis/private/lehre/pruefung/pruefungsanmeldungen_liste_ohne_namen.php @@ -233,6 +233,11 @@ $rechte->getBerechtigungen($uid); t('global/datum'); ?> t('benotungstool/note'); ?> t('global/anmerkung'); ?> + + t('pruefung/ects'); ?> + @@ -265,6 +270,8 @@ $rechte->getBerechtigungen($uid); echo ''.$date.''; echo ''; echo ''; + if (defined('CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE') && (CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE === true)) + echo ''. $anmeldung->ects .''; echo ''; } ?> diff --git a/cis/private/lehre/pruefung/pruefungsanmeldungen_verwalten.php b/cis/private/lehre/pruefung/pruefungsanmeldungen_verwalten.php index 22bca21cc..96a00f033 100644 --- a/cis/private/lehre/pruefung/pruefungsanmeldungen_verwalten.php +++ b/cis/private/lehre/pruefung/pruefungsanmeldungen_verwalten.php @@ -76,7 +76,7 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung width: 850px; padding: 1.8em 1.5em 1.8em 1em; /*border-radius: 25px;*/ - border: 1px solid #dddddd; + /*border: 1px solid #dddddd;*/ /*box-shadow: 0em 0em 2em 0.5em #888888 inset;*/ } @@ -95,7 +95,7 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung #prfWrapper { position: absolute; height: 70%; - width: 300px; + width: 40%; top: 180px; padding: 1.8em 1.5em 1.8em 1em; /*border-radius: 25px;*/ @@ -117,9 +117,9 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung #anmWrapper { position: absolute; /*top: 45px;*/ - left: 350px; + left: 45%; top: 180px; - width: 500px; + width: 40%; height: 70%; padding: 1.8em 1.5em 1.8em 1em; /*border-radius: 25px;*/ @@ -228,7 +228,6 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung

    t('pruefung/anmeldungenVerwalten'); ?>

    -
    -
    -

    t('global/studiengang'); ?>

    -
    -
    -

    t('global/studiensemester'); ?>

    result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung $studiensemester->getPlusMinus(null, 5); foreach($studiensemester->studiensemester as $sem) { - /*@var $sem studiensemester */ if ($aktuellesSemester == $sem->studiensemester_kurzbz) { echo ''; @@ -273,9 +320,21 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung

    t('pruefung/pruefungPruefungenTitle'); ?>

    -
      - -
    + + + + + + + + + + + + + + +
    @@ -311,6 +370,9 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung
    +
    diff --git a/cis/private/logout.php b/cis/private/logout.php new file mode 100644 index 000000000..9c1cbeee6 --- /dev/null +++ b/cis/private/logout.php @@ -0,0 +1,34 @@ + + + + + FH-Complete logout Basic Auth + + + + + + + getAllVorlagen(); - $projektarbeit = new projektarbeit(); - $projektarbeit->load($_GET['projektarbeit_id']); + if (!is_array($allePaVorlagen)) + die("

    Fehler beim Holen der Projektarbeit Vorlagen

    "); - $betreuer = new person(); - $betreuer->getPersonFromBenutzer($user); - - //Überprüft ob es der Betreuer oder der Student ist - if ($betreuer->person_id !== $_GET['person_id'] && $projektarbeit->student_uid !== $user && !$rechte->isBerechtigt('assistenz')) - die("

    Sie haben keine Berechtigung für diese Aktion.

    "); - - switch ($_GET['betreuerart_kurzbz']) + if (in_array($xsl, $allePaVorlagen)) { - case 'Begutachter' : - case 'Senatsvorsitz' : - $xsl = 'ProjektBeurteilungBA'; - break; - case 'Erstbegutachter' : - $xsl = 'ProjektBeurteilungMAErst'; - break; - case 'Zweitbegutachter' : - $xsl = 'ProjektBeurteilungMAZweit'; - break; - } + $rechte = new benutzerberechtigung(); + $rechte->getBerechtigungen($user); - $allowed = true; + $projektarbeit = new projektarbeit(); + $projektarbeit->load($_GET['projektarbeit_id']); + + $betreuer = new person(); + $betreuer->getPersonFromBenutzer($user); + + //Überprüft ob es der Betreuer oder der Student ist + if ($betreuer->person_id !== $_GET['person_id'] && $projektarbeit->student_uid !== $user && !$rechte->isBerechtigt('assistenz')) + die("

    Sie haben keine Berechtigung für diese Aktion.

    "); + $paBerechtigt = true; + } } - $konto = new konto(); -if ((((isset($_GET["uid"]) && $user == $_GET["uid"])) || $rechte->isBerechtigt('admin')) || (isset($allowed) && $allowed === true)) +if (((isset($_GET["uid"]) && $user == $_GET["uid"])) || $rechte->isBerechtigt('admin') || (isset($paBerechtigt) && $paBerechtigt === true)) { $buchungstypen = array(); if (defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN")) diff --git a/cis/private/profile/studienplan.php b/cis/private/profile/studienplan.php index 92728df42..74102fd09 100644 --- a/cis/private/profile/studienplan.php +++ b/cis/private/profile/studienplan.php @@ -69,6 +69,8 @@ if(isset($_GET['getAnmeldung'])) $lehrveranstaltung_id=$_GET['lehrveranstaltung_id']; $stsem = $_GET['stsem']; + $semester = $_GET['semester']; + $studienplan_id = $_GET['studienplan_id']; echo $p->t('studienplan/LehrveranstalungWaehlen').' @@ -83,6 +85,10 @@ if(isset($_GET['getAnmeldung'])) $datum = new datum(); $kompatibel[]=$lehrveranstaltung_id; $kompatibel = array_unique($kompatibel); + $stsem_obj = new studiensemester(); + $aktornext = $stsem_obj->getaktorNext(); + + $lvregel = new lvregel(); foreach($kompatibel as $lvid) { $lvangebot = new lvangebot(); @@ -95,19 +101,50 @@ if(isset($_GET['getAnmeldung'])) $angebot = $lvangebot->result[0]; if($angebot->AnmeldungMoeglich()) { - $anzahl++; - // LV wird angeboten und Anmeldefenster ist offen + $kompatible_lv = $lehrveranstaltung->getStudienplanLehrveranstaltung($lvid, $studienplan_id); - $bngruppe = new benutzergruppe(); - if(!$bngruppe->load($uid, $lvangebot->result[0]->gruppe_kurzbz, $stsem)) + $lvregelExists = false; + $abgeschlossen = false; + $semesterlock = false; + $regelerfuellt = true; + + if ($kompatible_lv) { - // User ist noch nicht angemeldet - echo '
    '.$lv->bezeichnung.' (Anmeldung bis '.$datum->formatDatum($angebot->anmeldefenster_ende,"d.m.Y").')'; + $lvregelExists = $lvregel->exists($kompatible_lv); + + if(!$lvregel->checkSemester($kompatible_lv, $semester)) + { + $semesterlock=true; + } + else + { + if($stsem === $aktornext) + { + $result = $lvregel->isZugangsberechtigt($uid, $kompatible_lv, $stsem); + if((is_array($result)) && ($result[0] !== true)) + { + $regelerfuellt=false; + } + } + } } - else + + if (!$semesterlock && $regelerfuellt) { - // Bereits angemeldet - echo '
    '.$lv->bezeichnung.''; + $anzahl++; + // LV wird angeboten und Anmeldefenster ist offen + + $bngruppe = new benutzergruppe(); + if(!$bngruppe->load($uid, $lvangebot->result[0]->gruppe_kurzbz, $stsem)) + { + // User ist noch nicht angemeldet + echo '
    '.$lv->bezeichnung.' (Anmeldung bis '.$datum->formatDatum($angebot->anmeldefenster_ende,"d.m.Y").')'; + } + else + { + // Bereits angemeldet + echo '
    '.$lv->bezeichnung.''; + } } } /* else @@ -170,9 +207,9 @@ echo ' $("#dialog").dialog({ autoOpen: false, width: "auto" }); }); - function OpenAnmeldung(lehrveranstaltung_id, stsem) + function OpenAnmeldung(lehrveranstaltung_id, stsem, semester, studienplan_id) { - $("#dialog").load("studienplan.php?getAnmeldung=true&lehrveranstaltung_id="+lehrveranstaltung_id+"&stsem="+stsem+"&uid='.$db->convert_html_chars($uid).'"); + $("#dialog").load("studienplan.php?getAnmeldung=true&lehrveranstaltung_id="+lehrveranstaltung_id+"&stsem="+stsem+"&semester="+semester+"&studienplan_id="+studienplan_id+"&uid='.$db->convert_html_chars($uid).'"); $("#dialog").dialog("open"); } @@ -359,7 +396,7 @@ drawTree($tree,0); function drawTree($tree, $depth) { - global $uid, $stsem_arr, $noten_arr, $lvangebot_arr, $aktornext; + global $uid, $stsem_arr, $noten_arr, $lvangebot_arr, $aktornext, $studienplan_id; global $datum_obj, $db, $lv_arr, $p, $note_pruef_arr, $student; global $anrechnung; @@ -639,12 +676,12 @@ function drawTree($tree, $depth) $tdclass[]='angebot'; if($angemeldet) { - $tdinhalt.= ''; + $tdinhalt.= ''; } else { if($anmeldungmoeglich) - $tdinhalt.= ''; + $tdinhalt.= ''; else $tdinhalt.= '-'; diff --git a/cis/private/profile/zeitsperre_resturlaub.php b/cis/private/profile/zeitsperre_resturlaub.php index ffd179401..1b6546d41 100644 --- a/cis/private/profile/zeitsperre_resturlaub.php +++ b/cis/private/profile/zeitsperre_resturlaub.php @@ -285,15 +285,16 @@ function showHideBezeichnungDropDown() if (dd.options[dd.selectedIndex].value == 'DienstV') { var str = ''; sp.innerHTML = str; diff --git a/cis/private/tools/zeitaufzeichnung.php b/cis/private/tools/zeitaufzeichnung.php index 1ae315f7a..4dcb63b31 100644 --- a/cis/private/tools/zeitaufzeichnung.php +++ b/cis/private/tools/zeitaufzeichnung.php @@ -45,6 +45,7 @@ require_once('../../../include/benutzerberechtigung.class.php'); require_once('../../../include/zeitaufzeichnung_import_csv.class.php'); require_once('../../../include/zeitaufzeichnung_import_post.class.php'); require_once('../../../include/vertragsbestandteil.class.php'); +require_once('../../../include/benutzerfunktion.class.php'); $sprache = getSprache(); $p=new phrasen($sprache); @@ -112,6 +113,13 @@ else $activities = array('Admin', 'FuE','FuEallg','Lehre', 'Pause', 'Arztbesuch', 'DienstreiseMT', 'Behoerde', 'Ersatzruhe', 'Weiterbildung', 'LVEntwicklung'); } +// Wenn die Funktion Lehrling zugeteilt ist, kann zusaetzlich Berufsschule als Aktivitaet gewaehlt werden +$benutzerfunktion = new benutzerfunktion(); +if ($benutzerfunktion->benutzerfunktion_exists($user, 'lehrling', true)) +{ + $activities[] = 'Berufsschule'; +} + $activities_str = "'".implode("','", $activities)."'"; // definiert bis zu welchem Datum die Eintragung nicht mehr möglich ist @@ -690,7 +698,7 @@ echo ' function checkPausenblock() { var sel = $("#aktivitaet").val(); - var activities = ["Admin", "Lehre", "FuE", "Operativ", "Betrieb", "Design", "LVEntwicklung", "Weiterbildung", "FuEallg"]; + var activities = ["Admin", "Lehre", "FuE", "Operativ", "Betrieb", "Design", "LVEntwicklung", "Weiterbildung", "FuEallg", "Berufsschule"]; if (activities.includes(sel)) showPausenblock(); else diff --git a/cis/private/tools/zeitaufzeichnung_projektliste.php b/cis/private/tools/zeitaufzeichnung_projektliste.php index 32c45c06a..69e803655 100644 --- a/cis/private/tools/zeitaufzeichnung_projektliste.php +++ b/cis/private/tools/zeitaufzeichnung_projektliste.php @@ -384,17 +384,6 @@ for ($i = 0; $i < count($ztaufdata); $i++) } } - //worktime with no break greater 6 -> compulsory break of half an hour - if ($pauseSubtracted < 0.5 && !$lehreExternExists) - { - if ($projektlines[$day]->arbeitszeit >= 6.5) - $projektlines[$day]->arbeitszeit -= 0.5; - - //ensure that no worktime gets smaller than 6 hours because of compulsory break - elseif ($projektlines[$day]->arbeitszeit > 6) - $projektlines[$day]->arbeitszeit -= $projektlines[$day]->arbeitszeit - 6; - } - $projektlines[$day]->arbeitszeit = round($projektlines[$day]->arbeitszeit, 2); //calculate sums diff --git a/cis/public/testtool_test/MathML_Beispiel.png b/cis/public/testtool_test/MathML_Beispiel.png new file mode 100644 index 000000000..d6ef2403f Binary files /dev/null and b/cis/public/testtool_test/MathML_Beispiel.png differ diff --git a/cis/public/testtool_test/testseite.php b/cis/public/testtool_test/testseite.php index a200b95b2..34ea12818 100644 --- a/cis/public/testtool_test/testseite.php +++ b/cis/public/testtool_test/testseite.php @@ -86,67 +86,88 @@ echo '';

    Formel / Formula

    - - 5 - 3 - - - + - - 7 - 6 - - = - - - 10 - 6 - - + - - - 7 - 6 - - = - - 17 - - 6 - + + + 5 + 3 + + + + + 7 + 6 + + = + + 10 + 6 + + + + + 7 + 6 + + = + + 17 + 6 + +

    - - - - k=1 - 5 - - - - (-1) - k+1 - - - - - - x - 2k + 1 - - - - (2k+1)! - - - - + + + + + k + = + 1 + + 5 + + + + + ( + - + 1 + ) + + + k + + + 1 + + + + + + x + + 2 + k + + + 1 + + + + + ( + 2 + k + + + 1 + ) + ! + + + +

    Bild / Picture

    - Beispielbild + Beispielbild
    diff --git a/cis/testtool/admin/index.php b/cis/testtool/admin/index.php index 6da5040ed..f8e8d36ed 100644 --- a/cis/testtool/admin/index.php +++ b/cis/testtool/admin/index.php @@ -65,7 +65,7 @@ if (isset($_GET['nummer'])) } else { - $nummer = ''; + $nummer = '0'; } if (isset($_GET['frage_id'])) @@ -102,29 +102,175 @@ echo ''; + + + + +getBerechtigungen($user); + +if(!$rechte->isBerechtigt('lehre/lehrveranstaltung', 'suid')) + die('Sie haben keine Berechtigung fuer diese Seite'); + +$studiengang = new studiengang(); +$studiengang->getAll("kurzbzlang"); + +$organisationseinheit = new organisationseinheit(); +$organisationseinheit->getAll(true, true); + +echo "
    +
    +
    + + + + + + + + + "; + echo " + + + + + + + + + + +
    Suche: + +
    Studiengang: + + OE: +
    Semester: + +
    Lehrveranstaltungen: + +
    +
    + Kompatible Lehrveranstaltungen - + +
    +
    + + + + + + + + + + + + + + + + + +
    IDKurzbezeichnungBezeichnungECTSStudiengangOrganisationseiheitÜbernehmen?Löschen?
    + + + +
    +
    +
    + + + + + + + + + + "; + echo " + + + + + + + + + + +
    Suche: + +
    Studiengang: + + OE: +
    Semester: + +
    Lehrveranstaltungen: + +
    +
    + Kompatible Lehrveranstaltungen - + + + + + + + + + + + + + + +
    IDKurzbezeichnungBezeichnungECTSStudiengangOrganisationseiheitLöschen?
    +
    +"; + + +echo " + "; + +?> diff --git a/vilesci/lehre/studienordnung.js b/vilesci/lehre/studienordnung.js index 54fa9e81b..bf7ff34e7 100644 --- a/vilesci/lehre/studienordnung.js +++ b/vilesci/lehre/studienordnung.js @@ -695,15 +695,16 @@ function loadLVKompatibilitaet(lvid) }).success(function(data) { var html=''; + html = html+'kompatible Lehrveranstaltungen vergleichen

    '; + html = html+'kompatible Lehrveranstaltungen hinzufügen
    '; for(i in data.result) { if(data.result[i]) { lvdata = data.result[i]; if(!(lvdata.kurzbz===null && lvdata.bezeichnung===null && lvdata.studiengang_kz===null && lvdata.semester===null)) - html = html+'
    '+lvdata.kurzbz+' - '+lvdata.bezeichnung+' (Studiengang '+lvdata.studiengang_kz+', Semester '+lvdata.semester+')'; + html = html+'
    '+lvdata.kurzbz+' - '+lvdata.bezeichnung+' (Studiengang '+lvdata.studiengang_kz+', Semester '+lvdata.semester+')
    '; } - html = html+'

    kompatible Lehrveranstaltungen hinzufügen'; } $("#tab-kompatibel").html(html); diff --git a/vilesci/personen/bankimport.php b/vilesci/personen/bankimport.php new file mode 100644 index 000000000..dda6d029f --- /dev/null +++ b/vilesci/personen/bankimport.php @@ -0,0 +1,343 @@ +getBerechtigungen($user); +if (!$rechte->isBerechtigt("admin", null, "suid")) +{ + die("Sie haben keine Berechtigung für diese Seite"); +} + +// Variables declaration +$logArray = array(); // Array for output messages +$errorOccurred = false; // Error flag +$dataPosted = false; // Post data flag +$fileName = null; +$fileTmpName = null; +$fileMimeType = null; + +// Constants +$L_CSV_N_COLS = 4; // Number of columns of the CSV file +$L_ERROR = "Error"; +$L_WARNING = "Warning"; +$L_INFO = "Info"; +$L_LN_NOT_AVAILABLE = "N/A"; + +/** + * Add an entry in $logArray + */ +function lAddToLogArray($code, $lineNumber, $msg) +{ + global $logArray, $errorOccurred, $L_ERROR; + + if ($code == $L_ERROR) + { + $errorOccurred = true; + } + + $log = new stdClass(); + $log->code = $code; + $log->lineNumber = $lineNumber; + $log->msg = $msg; + + array_push($logArray, $log); +} + + + +// If data has been posted +if (isset($_POST["submit"])) +{ + $dataPosted = true; + + // Checks if a file was uploaded + if (!$errorOccurred && (!isset($_FILES) || !is_array($_FILES) || count($_FILES) == 0)) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "No files have been uploaded"); + } + + // If the file is not present or it was not correctly uploaded + if (!$errorOccurred && (!isset($_FILES["csvFile"]) || $_FILES["csvFile"]["error"] != 0)) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "An error has occurred while uploading the CSV file"); + } + else // else save file attributes + { + $fileName = $_FILES["csvFile"]["name"]; + $fileTmpName = $_FILES["csvFile"]["tmp_name"]; + $fileMimeType = mime_content_type($_FILES["csvFile"]["tmp_name"]); + } + + // Checks the file mime type + if (!$errorOccurred && ($fileMimeType != "text/plain")) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "The mime type of the uploaded file is not of the type text/plain"); + } + + // Opens the file in read mode + if (!$errorOccurred && (($fileHandle = fopen($fileTmpName, "r")) === false)) + { + lAddToLogArray($L_ERROR, $L_LN_NOT_AVAILABLE, "An error has occurred while opening the uploaded file on read mode"); + } +} +else // else no data has been posted +{ + $dataPosted = false; +} + +// If everything is ok and data has been posted +if (!$errorOccurred && $dataPosted) +{ + $fileRow = false; // Contains a single file row + $lineNumber = 0; // lines number counter + + // Loops on file rows + do + { + $lineNumber++; + // Gets and parses a single row of the given file + $fileRow = fgetcsv($fileHandle, 9999, ";", "\""); + // If everything is ok + if ($fileRow != null && $fileRow !== false) + { + // Checks if the row has the right amount of columns + if (is_array($fileRow) && count($fileRow) == $L_CSV_N_COLS) + { + // Checks if character encoding is UTF-8 + if (mb_detect_encoding(implode(";", $fileRow), "UTF-8", true)) + { + $rowSurname = $fileRow[0]; + $rowName = $fileRow[1]; + $rowPersonID = $fileRow[2]; + $rowIBAN = $fileRow[3]; + + // If this row is not the header + if (strtolower($rowSurname) != "nachname") + { + // Bankverbindung hinterlegen + $bank = new bankverbindung(); + $found = false; + if($bank->load_pers($rowPersonID)) + { + foreach($bank->result as $row_bank) + { + if(str_replace(' ', '', $row_bank->iban) == str_replace(' ', '', $rowIBAN)) + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "Bank IBAN already found for PersonID ".$rowPersonID + ); + $found = true; + + // Update Datum aktualisieren damit Update in Fremdsystem getriggert wird + $row_bank->new=false; + $row_bank->updateamum = date('Y-m-d H:i:s'); + $row_bank->updatevon = 'Bankimport'; + if($row_bank->save()) + { + lAddToLogArray( + $L_INFO, + $lineNumber, + "Bank Date Update for PersonID ".$rowPersonID + ); + } + else + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "Bank Date Update Failed for PersonID ".$rowPersonID + ); + } + + break; + } + } + } + + if(!$found) + { + $bank = new bankverbindung(); + $bank->new = true; + $bank->iban = $rowIBAN; + $bank->person_id = $rowPersonID; + //$bank->bic = $rowBIC; + //$bank->name = $rowBank; + $bank->typ = 'p'; + $bank->verrechnung = true; + $bank->insertamum = date('Y-m-d H:i:s'); + $bank->insertvon = 'Bankimport'; + $bank->updateamum = date('Y-m-d H:i:s'); + $bank->updatevon = 'Bankimport'; + if($bank->save()) + { + lAddToLogArray( + $L_INFO, + $lineNumber, + "Bankdaten hinzugefügt" + ); + } + else + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "Failed to Add Bankdata".$bank->errormsg + ); + } + } + } + else + { + lAddToLogArray($L_WARNING, $lineNumber, "This file row has been discarted because it is the header"); + } + } + else + { + lAddToLogArray($L_WARNING, $lineNumber, "This file row has been discarted because of invalid characters"); + } + } + else + { + lAddToLogArray( + $L_WARNING, + $lineNumber, + "This file row has been discarted because it isn't well formatted and/or it hasn't " . $L_CSV_N_COLS . " columns" + ); + } + } + else + { + // If it is not the end of the file, another error has occurred + if (!feof($fileHandle)) + { + lAddToLogArray($L_ERROR, $lineNumber, "An error has occurred while parsing this row, procedure terminated"); + } + } + } + while($fileRow); + + // Close the file handler + fclose($fileHandle); +} + +?> + + + + + + + +

    Bank Data Import

    + Diese Seite dient dazu Bankdaten für Studierende per CSV Import ins System zu laden.

    + + + + + + + + + + + + + + + + + + + +
    CMS-Format + Zeichensatz: UTF-8
    + Feldtrenner: ;
    + Texttrenner: "
    + Felder:
    +
    Nachname;Vorname;PersonID;IBAN
    +
    + + +
    + CSV file: +   + +
     
    + +
    + + +
    +
    + + + + + + + + + + + + "; + + foreach($logArray as $log) + { + $color = "green"; // great expectations + if ($log->code == $L_ERROR) + { + $color = "red"; + } + else if ($log->code == $L_WARNING) + { + $color = "orange"; + } + + echo sprintf($tableRow, $color, $log->code, $log->lineNumber, $log->msg); + } + ?> +
    StatusRecordMessage
    + %s + + %s + + %s +
    + + diff --git a/vilesci/personen/import/interessentenimport.php b/vilesci/personen/import/interessentenimport.php index d1830eaeb..8734a1353 100644 --- a/vilesci/personen/import/interessentenimport.php +++ b/vilesci/personen/import/interessentenimport.php @@ -1167,8 +1167,7 @@ if ($where != '') } } $status = mb_substr($status, 0, mb_strlen($status)-2); - - echo ''."$row->nachname$row->vorname$row->wahlname$row->vornamen$row->gebdatum$row->svnr".($row->geschlecht=='m'?'männlich':'weiblich').""; + echo ''."$row->nachname$row->vorname$row->wahlname$row->vornamen$row->gebdatum".((strpos($status, 'Mitarbeiter') !== false) ? $row->svnr : '')."".($row->geschlecht=='m'?'männlich':'weiblich').""; $qry_adr = "SELECT * FROM public.tbl_adresse WHERE person_id=".$db->db_add_param($row->person_id, FHC_INTEGER); if ($result_adr = $db->db_query($qry_adr)) while ($row_adr = $db->db_fetch_object($result_adr)) diff --git a/vilesci/personen/leistungsstipendium.php b/vilesci/personen/leistungsstipendium.php index 45732c902..f70dc2da6 100644 --- a/vilesci/personen/leistungsstipendium.php +++ b/vilesci/personen/leistungsstipendium.php @@ -71,7 +71,7 @@ $fileTmpName = null; $fileMimeType = null; // Constants -$L_CSV_N_COLS = 10; // Number of columns of the CSV file +$L_CSV_N_COLS = 9; // Number of columns of the CSV file $L_ERROR = "Error"; $L_WARNING = "Warning"; $L_INFO = "Info"; @@ -477,8 +477,8 @@ if (!$errorOccurred && $dataPosted) Feldtrenner: ;
    Texttrenner: "
    Felder:
    -
    Nachname;Vorname;UID/PersKZ;Studiengang;Betrag;Überweisungsdatum
    -Dylan;Bob;1234567;MEE;750;03.10.2016
    +
    Nachname;Vorname;Gebdatum;UID/PersKZ;Studiengang;Betrag;IBAN;BIC;Bankname
    +Dylan;Bob;12.12.2000;1234567;MEE;750;ATXXXX;BBAWAATWW;BAWAG PSK
    diff --git a/vilesci/personen/personen_details.php b/vilesci/personen/personen_details.php index d1dcd8815..b274558bd 100644 --- a/vilesci/personen/personen_details.php +++ b/vilesci/personen/personen_details.php @@ -125,6 +125,7 @@ $verband = (isset($_POST['verband'])?$_POST['verband']:''); $gruppe = (isset($_POST['gruppe'])?$_POST['gruppe']:''); $dms_id_lichtbild = ''; +$is_mitarbeiter = false; if($uid!='') { $qry = "SELECT person_id, true as mitarbeiter FROM campus.vw_mitarbeiter WHERE uid=".$db->db_add_param($uid)." @@ -144,7 +145,17 @@ if($uid!='') else die('Fehler beim Ermitteln der UID'); } - +else if ($person_id !='') +{ + $qry = "SELECT person_id, true as mitarbeiter FROM campus.vw_mitarbeiter WHERE person_id=".$db->db_add_param($person_id); + if($result = $db->db_query($qry)) + { + if($row = $db->db_fetch_object($result)) + { + $is_mitarbeiter = ($row->mitarbeiter=='t'?true:false); + } + } +} if(isset($_POST['saveperson'])) { if(!$rechte->isBerechtigt('student/stammdaten', null, 'su') && !$rechte->isBerechtigt('mitarbeiter/stammdaten', null, 'su')) @@ -163,7 +174,8 @@ if(isset($_POST['saveperson'])) $person->gebdatum = $geburtsdatum; $person->gebort = $geburtsort; $person->geburtsnation = $geburtsnation; - $person->svnr = $svnr; + if ($is_mitarbeiter) + $person->svnr = $svnr; $person->ersatzkennzeichen = $ersatzkennzeichen; $person->gebzeit = $geburtszeit; $person->staatsbuergerschaft = $staatsbuergerschaft; @@ -332,7 +344,8 @@ if(!$error_person_save) $geburtsdatum = $person->gebdatum; $geburtsort = $person->gebort; $geburtsnation = $person->geburtsnation; - $svnr = $person->svnr; + if ($is_mitarbeiter) + $svnr = $person->svnr; $ersatzkennzeichen = $person->ersatzkennzeichen; $geburtszeit = $person->gebzeit; $staatsbuergerschaft = $person->staatsbuergerschaft; @@ -398,10 +411,16 @@ foreach ($nation->nation as $row_nation) echo " - - SVNR - - Ersatzkennzeichen +"; + +if ($is_mitarbeiter) +{ + echo "SVNR + "; +} + +echo + "Ersatzkennzeichen Geburtszeit diff --git a/vilesci/personen/personendetails.php b/vilesci/personen/personendetails.php index a20e34c5d..684b21712 100644 --- a/vilesci/personen/personendetails.php +++ b/vilesci/personen/personendetails.php @@ -153,7 +153,7 @@ echo "Name: $person->titelpre $person->nachname $ echo "Geburtsdatum: ".$datum_obj->formatDatum($person->gebdatum,'d.m.Y').""; echo "Geschlecht: ".$person->geschlecht.""; echo "Anmerkung: ".$db->convert_html_chars($person->anmerkungen).""; -echo "Zugangscode:".(in_array('bewerbung', (explode(';', ACTIVE_ADDONS)))?"".$db->convert_html_chars($person->zugangscode)."":$db->convert_html_chars($person->zugangscode)).""; +echo "Zugangscode:".(in_array('bewerbung', (explode(';', ACTIVE_ADDONS)))?"".$db->convert_html_chars($person->zugangscode)."":$db->convert_html_chars($person->zugangscode)).""; echo ''; echo '
    Statusinformation - FH Ausweis
    '; diff --git a/vilesci/personen/preinteressent_anlegen.php b/vilesci/personen/preinteressent_anlegen.php index 3ba5865d2..cc9ecbf53 100644 --- a/vilesci/personen/preinteressent_anlegen.php +++ b/vilesci/personen/preinteressent_anlegen.php @@ -140,7 +140,6 @@ function disablefields(obj) document.getElementById('vorname').disabled=val; document.getElementById('geschlecht').disabled=val; document.getElementById('geburtsdatum').disabled=val; - document.getElementById('svnr').disabled=val; document.getElementById('ersatzkennzeichen').disabled=val; //document.getElementById('adresse').disabled=val; //document.getElementById('plz').disabled=val; @@ -159,21 +158,6 @@ function disablefields(obj) } } -function GeburtsdatumEintragen() -{ - svnr = document.getElementById('svnr').value; - gebdat = document.getElementById('geburtsdatum'); - - if(svnr.length==10 && gebdat.value=='') - { - var tag = svnr.substr(4,2); - var monat = svnr.substr(6,2); - var jahr = svnr.substr(8,2); - - gebdat.value='19'+jahr+'-'+monat+'-'+tag; - } -} - function disablefields2(val) { document.getElementById('adresse').disabled=val; @@ -368,7 +352,6 @@ $email = (isset($_REQUEST['email'])?$_REQUEST['email']:''); $telefon = (isset($_REQUEST['telefon'])?$_REQUEST['telefon']:''); $mobil = (isset($_REQUEST['mobil'])?$_REQUEST['mobil']:''); $person_id = (isset($_REQUEST['person_id'])?$_REQUEST['person_id']:''); -$svnr = (isset($_REQUEST['svnr'])?$_REQUEST['svnr']:''); $ersatzkennzeichen = (isset($_REQUEST['ersatzkennzeichen'])?$_REQUEST['ersatzkennzeichen']:''); $ueberschreiben = (isset($_REQUEST['ueberschreiben'])?$_REQUEST['ueberschreiben']:''); @@ -413,7 +396,6 @@ if(isset($_POST['save'])) $person->geschlecht = $geschlecht; $person->gebdatum = $datum_obj->formatDatum($geburtsdatum,'Y-m-d'); $person->staatsbuergerschaft = $nation; - $person->svnr = $svnr; $person->ersatzkennzeichen = $ersatzkennzeichen; $person->aktiv = true; $person->insertamum = date('Y-m-d H:i:s'); @@ -689,39 +671,38 @@ if($result = $db->db_query($qry)) } echo ''; echo ''; -echo 'SVNR'; echo 'Ersatzkennzeichen'; echo 'Geburtsdatum (Format dd.mm.JJJJ)'; echo 'Geburtsort'; -echo 'Geburtsnation'; +echo 'Geburtsnation'; echo ''; -echo 'Sprache'; $sprache_obj = new sprache(); $sprache_obj->getAll(); foreach($sprache_obj->result as $row) -{ - if($row->sprache==$sprache) - $selected='selected'; - else - $selected=''; - - echo ""; -} -echo ''; +{ + if($row->sprache==$sprache) + $selected='selected'; + else + $selected=''; + + echo ""; +} +echo ''; echo ''; echo '
    Adresse'; echo ' + + + + + + diff --git a/vilesci/statistik/oehwaehlerverzeichnis.php b/vilesci/statistik/oehwaehlerverzeichnis.php index f7ea9447e..d94301f99 100644 --- a/vilesci/statistik/oehwaehlerverzeichnis.php +++ b/vilesci/statistik/oehwaehlerverzeichnis.php @@ -61,7 +61,6 @@ header( 'Content-Disposition: attachment;filename='.$filename); $qry=" SELECT * FROM ( SELECT DISTINCT ON (matrikelnr) matrikelnr AS personenkennzeichen, - tbl_person.svnr, tbl_person.ersatzkennzeichen, tbl_person.gebdatum, tbl_person.nachname, diff --git a/vilesci/statistik/studierendenliste_oeh.php b/vilesci/statistik/studierendenliste_oeh.php index 3480e76cd..a99cbde54 100644 --- a/vilesci/statistik/studierendenliste_oeh.php +++ b/vilesci/statistik/studierendenliste_oeh.php @@ -60,7 +60,6 @@ header( 'Content-Disposition: attachment;filename='.$filename); $qry=" SELECT * FROM ( SELECT DISTINCT ON (matrikelnr) matrikelnr AS personenkennzeichen, - tbl_person.svnr, tbl_person.ersatzkennzeichen, tbl_person.gebdatum, tbl_person.nachname,
    Nation'; + echo '
    NachnameVornameGebDatumSVNRGeschlechtAdresseStatusDetails
    '; while($row = $db->db_fetch_object($result)) { $status = ''; @@ -905,7 +886,7 @@ if($where!='') } $status = mb_substr($status, 0, mb_strlen($status)-2); - echo ''; echo ''; -//SVNR -echo ""; //Ersatzkennzeichen echo ""; //Geschlecht diff --git a/vilesci/personen/suche.php b/vilesci/personen/suche.php index 6d2cf3cde..c24688c61 100644 --- a/vilesci/personen/suche.php +++ b/vilesci/personen/suche.php @@ -1051,6 +1051,16 @@ function casDeletePrestudent($db, $prestudent_id, $trans=true) } } + /* Entries from testtool */ + if(!$error) + { + $qry = 'DELETE FROM testtool.tbl_pruefling_frage WHERE pruefling_id=(SELECT pruefling_id FROM testtool.tbl_pruefling WHERE prestudent_id='.$db->db_add_param($prestudent_id, FHC_INTEGER).'); + DELETE FROM testtool.tbl_antwort WHERE pruefling_id=(SELECT pruefling_id FROM testtool.tbl_pruefling WHERE prestudent_id='.$db->db_add_param($prestudent_id, FHC_INTEGER).'); + DELETE FROM testtool.tbl_pruefling WHERE prestudent_id='.$db->db_add_param($prestudent_id, FHC_INTEGER).';'; + if(!$db->db_query($qry)) + $error = true; + } + /* * Delete the tbl_student entry */ @@ -1606,6 +1616,22 @@ function casDeletePerson($db, $person_id, $trans=true) } } + /* Entries from rt_person */ + if(!$error) + { + $qry = 'DELETE FROM public.tbl_rt_person WHERE person_id='.$db->db_add_param($person_id, FHC_INTEGER).';'; + if(!$db->db_query($qry)) + $error = true; + } + + /* Entries from UHSTAT */ + if(!$error) + { + $qry = 'DELETE FROM bis.tbl_uhstat1daten WHERE person_id='.$db->db_add_param($person_id, FHC_INTEGER).';'; + if(!$db->db_query($qry)) + $error = true; + } + diff --git a/vilesci/stammdaten/ampel_details.php b/vilesci/stammdaten/ampel_details.php index bc7b343ec..277329e55 100644 --- a/vilesci/stammdaten/ampel_details.php +++ b/vilesci/stammdaten/ampel_details.php @@ -41,18 +41,19 @@ $datum_obj = new datum(); ?> - - Ampel - Details - - - - - - - - - - + + + + + + + @@ -312,7 +312,7 @@ $htmlstr=' $selected = 'selected="selected"'; else $selected = ''; - $htmlstr .= ''; + $htmlstr .= ''; } $htmlstr .= ' Nur User @@ -422,13 +422,13 @@ if(isset($_GET['searchstr'])) if($berechtigung_kurzbz != '') { $berechtigungen = new benutzerberechtigung(); - - // Wenn $userOnly false ist, werden die Rollen und Funktionen ausgegeben, die das Recht beinhalten, - // ansonsten werden die Rollen und Funktionen auf User aufgelöst und nur User ausgegeben - if ($userOnly == false) - { + + // Wenn $userOnly false ist, werden die Rollen und Funktionen ausgegeben, die das Recht beinhalten, + // ansonsten werden die Rollen und Funktionen auf User aufgelöst und nur User ausgegeben + if ($userOnly == false) + { $berechtigungen->getBenutzerFromBerechtigung($berechtigung_kurzbz); - + if(isset($berechtigungen->result) && count($berechtigungen->result) != 0) { $htmlstr .= "

    ".$berechtigung_kurzbz."

    \n"; @@ -444,16 +444,16 @@ if($berechtigung_kurzbz != '') "; $htmlstr .= "\n"; - + foreach($berechtigungen->result as $row) { $benutzer = new benutzer(); $benutzer->load($row->uid); $organisationseinheit = new organisationseinheit($row->oe_kurzbz); - + $heute = strtotime(date('Y-m-d')); - + if ($row->ende!='' && strtotime($row->ende) < $heute) { $status = '
    '; @@ -466,7 +466,7 @@ if($berechtigung_kurzbz != '') { $status = '
    '; } - + $htmlstr .= ' '; $htmlstr .= ' '; $htmlstr .= ' '; @@ -483,7 +483,7 @@ if($berechtigung_kurzbz != '') $htmlstr .= ' '; elseif ($row->rolle_kurzbz != '') $htmlstr .= ' '; - + $htmlstr .= ' '; } $htmlstr .= '
    NachnameVornameGebDatumGeschlechtAdresseStatusDetails
    '."$row->nachname$row->vorname$row->gebdatum$row->svnr".($row->geschlecht=='m'?'männlich':'weiblich').""; + echo '
    '."$row->nachname$row->vorname$row->gebdatum".((strpos($status, 'Mitarbeiter') !== false) ? $row->svnr : '')."".($row->geschlecht=='m'?'männlich':'weiblich').""; $qry_adr = "SELECT * FROM public.tbl_adresse WHERE person_id='$row->person_id'"; if($result_adr = $db->db_query($qry_adr)) while($row_adr=$db->db_fetch_object($result_adr)) diff --git a/vilesci/personen/preinteressent_detail.php b/vilesci/personen/preinteressent_detail.php index 5f86e7369..a49c1a0c6 100644 --- a/vilesci/personen/preinteressent_detail.php +++ b/vilesci/personen/preinteressent_detail.php @@ -338,7 +338,6 @@ if(isset($_POST['saveperson'])) $person->gebzeit = $_POST['gebzeit']; $person->anmerkungen = $_POST['anmerkungen']; $person->homepage = $_POST['homepage']; - $person->svnr = $_POST['svnr']; $person->ersatzkennzeichen = $_POST['ersatzkennzeichen']; $person->familienstand = $_POST['familienstand']; $person->geschlecht = $_POST['geschlecht']; @@ -606,8 +605,6 @@ if($result = $db->db_query($qry)) } echo '
    SVNR:Ersatzkennzeichen Status Aktion
    '.($row->rolle_kurzbz != ''?$row->rolle_kurzbz:'').''.($row->funktion_kurzbz != ''?$row->funktion_kurzbz:'').'Funktionsrechte bearbeitenRollenrechte bearbeiten
    '; @@ -493,63 +493,63 @@ if($berechtigung_kurzbz != '') $htmlstr .= "Für diese Berechtigung sind keine Einträge vorhanden"; } } - else - { - $berechtigungen_array = array(); - $berechtigungen->getBenutzerFromBerechtigung($berechtigung_kurzbz); + else + { + $berechtigungen_array = array(); + $berechtigungen->getBenutzerFromBerechtigung($berechtigung_kurzbz); - if (isset($berechtigungen->result) && count($berechtigungen->result) != 0) - { - foreach ($berechtigungen->result as $row) - { - if ($row->uid != '') - { - $berechtigungen_array[] = array('uid' => $row->uid, - 'art' => $row->art, - 'start' => $row->start, - 'ende' => $row->ende, - 'oe_kurzbz' => $row->oe_kurzbz, - 'rolle_kurzbz' => '', - 'funktion_kurzbz' => ''); - } - if ($row->rolle_kurzbz != '') - { - $user_rolleberechtigung = new benutzerberechtigung(); - $user_rolleberechtigung->getBenutzerFromRolle($row->rolle_kurzbz); - foreach ($user_rolleberechtigung->result as $row_rolle) - { - $berechtigungen_array[] = array('uid' => $row_rolle->uid, - 'art' => $row_rolle->art, - 'start' => $row_rolle->start, - 'ende' => $row_rolle->ende, - 'oe_kurzbz' => $row_rolle->oe_kurzbz, - 'rolle_kurzbz' => $row_rolle->rolle_kurzbz, - 'funktion_kurzbz' => $row->funktion_kurzbz); - } - } - if ($row->funktion_kurzbz != '') - { - $user_funktion = new benutzerfunktion(); - $user_funktion->getBenutzerFunktionen($row->funktion_kurzbz); - foreach ($user_funktion->result as $row_funktion) - { - $berechtigungen_array[] = array('uid' => $row_funktion->uid, - 'art' => $row->art, - 'start' => $row->start, - 'ende' => $row->ende, - 'oe_kurzbz' => $row_funktion->oe_kurzbz, - 'rolle_kurzbz' => '', - 'funktion_kurzbz' => $row->funktion_kurzbz); - } - } - } -// var_dump($berechtigungen_array);exit; - // Benutzer der Rolle auflösen - foreach ($berechtigungen->result as $row) - { - $user_rolleberechtigung = new benutzerberechtigung(); - $user_rolleberechtigung->getBenutzerFromRolle($row->rolle_kurzbz); - } + if (isset($berechtigungen->result) && count($berechtigungen->result) != 0) + { + foreach ($berechtigungen->result as $row) + { + if ($row->uid != '') + { + $berechtigungen_array[] = array('uid' => $row->uid, + 'art' => $row->art, + 'start' => $row->start, + 'ende' => $row->ende, + 'oe_kurzbz' => $row->oe_kurzbz, + 'rolle_kurzbz' => '', + 'funktion_kurzbz' => ''); + } + if ($row->rolle_kurzbz != '') + { + $user_rolleberechtigung = new benutzerberechtigung(); + $user_rolleberechtigung->getBenutzerFromRolle($row->rolle_kurzbz); + foreach ($user_rolleberechtigung->result as $row_rolle) + { + $berechtigungen_array[] = array('uid' => $row_rolle->uid, + 'art' => $row_rolle->art, + 'start' => $row_rolle->start, + 'ende' => $row_rolle->ende, + 'oe_kurzbz' => $row_rolle->oe_kurzbz, + 'rolle_kurzbz' => $row_rolle->rolle_kurzbz, + 'funktion_kurzbz' => $row->funktion_kurzbz); + } + } + if ($row->funktion_kurzbz != '') + { + $user_funktion = new benutzerfunktion(); + $user_funktion->getBenutzerFunktionen($row->funktion_kurzbz); + foreach ($user_funktion->result as $row_funktion) + { + $berechtigungen_array[] = array('uid' => $row_funktion->uid, + 'art' => $row->art, + 'start' => $row->start, + 'ende' => $row->ende, + 'oe_kurzbz' => $row_funktion->oe_kurzbz, + 'rolle_kurzbz' => '', + 'funktion_kurzbz' => $row->funktion_kurzbz); + } + } + } +// var_dump($berechtigungen_array);exit; + // Benutzer der Rolle auflösen + foreach ($berechtigungen->result as $row) + { + $user_rolleberechtigung = new benutzerberechtigung(); + $user_rolleberechtigung->getBenutzerFromRolle($row->rolle_kurzbz); + } // Anzahl uniquer UIDs ermitteln $berechtigungen_array_uids = array_map(function ($each) @@ -560,60 +560,60 @@ if($berechtigung_kurzbz != '') $htmlstr .= "

    ".$berechtigung_kurzbz."

    \n"; $htmlstr .= "
    ".count($berechtigungen_array)." Einträge
    "; $htmlstr .= "
    ".count(array_unique($berechtigungen_array_uids))." UIDs
    "; - $htmlstr .= "\n"; - $htmlstr .= " - - - - - - - - - "; - $htmlstr .= "\n"; - - foreach ($berechtigungen_array as $key => $row) - { - $benutzer = new benutzer(); - $benutzer->load($row['uid']); - - $organisationseinheit = new organisationseinheit($row['oe_kurzbz']); - - $heute = strtotime(date('Y-m-d')); - - if ($row['ende'] != '' && strtotime($row['ende']) < $heute) - { - $status = '
    '; - } - elseif ($row['start'] != '' && strtotime($row['start']) > $heute) - { - $status = '
    '; - } - else - { - $status = '
    '; - } - - $htmlstr .= ' '; - $htmlstr .= ' '; - $htmlstr .= ' '; - $htmlstr .= ' '; - $htmlstr .= ' '; - $htmlstr .= ' '; - $htmlstr .= ' '; - $htmlstr .= ' '; - $htmlstr .= ' '; - $htmlstr .= ' '; - $htmlstr .= ' '; - $htmlstr .= ' '; - } - $htmlstr .= '
    NachnameVornameUIDArtOE_KurzbzRolleFunktionBenutzer AktivStatusAktion
    ' . ($benutzer->nachname != '' ? $benutzer->nachname : '') . '' . ($benutzer->vorname != '' ? $benutzer->vorname : '') . '' . ($row['uid'] != '' ? $row['uid'] : '') . '' . $row['art'] . '' . $organisationseinheit->organisationseinheittyp_kurzbz . ' ' .$organisationseinheit->bezeichnung . '' . $row['rolle_kurzbz'] . '' . $row['funktion_kurzbz'] . '' . (isset($row['uid']) ? $benutzer->bnaktiv ? 'Ja' : 'Nein' : '') . '' . $status . 'Benutzerrechte bearbeiten
    '; - } - else - { - $htmlstr .= "Für diese Berechtigung sind keine Einträge vorhanden"; - } + $htmlstr .= "\n"; + $htmlstr .= " + + + + + + + + + "; + $htmlstr .= "\n"; + + foreach ($berechtigungen_array as $key => $row) + { + $benutzer = new benutzer(); + $benutzer->load($row['uid']); + + $organisationseinheit = new organisationseinheit($row['oe_kurzbz']); + + $heute = strtotime(date('Y-m-d')); + + if ($row['ende'] != '' && strtotime($row['ende']) < $heute) + { + $status = '
    '; + } + elseif ($row['start'] != '' && strtotime($row['start']) > $heute) + { + $status = '
    '; + } + else + { + $status = '
    '; + } + + $htmlstr .= ' '; + $htmlstr .= ' '; + $htmlstr .= ' '; + $htmlstr .= ' '; + $htmlstr .= ' '; + $htmlstr .= ' '; + $htmlstr .= ' '; + $htmlstr .= ' '; + $htmlstr .= ' '; + $htmlstr .= ' '; + $htmlstr .= ' '; + $htmlstr .= ' '; + } + $htmlstr .= '
    NachnameVornameUIDArtOE_KurzbzRolleFunktionBenutzer AktivStatusAktion
    ' . ($benutzer->nachname != '' ? $benutzer->nachname : '') . '' . ($benutzer->vorname != '' ? $benutzer->vorname : '') . '' . ($row['uid'] != '' ? $row['uid'] : '') . '' . $row['art'] . '' . $organisationseinheit->organisationseinheittyp_kurzbz . ' ' .$organisationseinheit->bezeichnung . '' . $row['rolle_kurzbz'] . '' . $row['funktion_kurzbz'] . '' . (isset($row['uid']) ? $benutzer->bnaktiv ? 'Ja' : 'Nein' : '') . '' . $status . 'Benutzerrechte bearbeiten
    '; + } + else + { + $htmlstr .= "Für diese Berechtigung sind keine Einträge vorhanden"; + } } } diff --git a/vilesci/stammdaten/reihungstestverwaltung.php b/vilesci/stammdaten/reihungstestverwaltung.php index 07e88183c..990b3e129 100644 --- a/vilesci/stammdaten/reihungstestverwaltung.php +++ b/vilesci/stammdaten/reihungstestverwaltung.php @@ -1458,6 +1458,7 @@ if(isset($_POST['speichern']) || isset($_POST['kopieren'])) $reihungstest->anmeldefrist = $datum_obj->formatDatum($_POST['anmeldefrist']); $reihungstest->zugangs_ueberpruefung = false; $reihungstest->zugangscode = null; + $reihungstest->externe_ueberwachung = false; } else { @@ -1474,6 +1475,7 @@ if(isset($_POST['speichern']) || isset($_POST['kopieren'])) $reihungstest->updatevon = $user; $reihungstest->zugangs_ueberpruefung = isset($_POST['zugangs_ueberpruefung']); $reihungstest->zugangscode = ($_POST['zugangcode'] === '' ? null : $_POST['zugangcode']); + $reihungstest->externe_ueberwachung = isset($_POST['externe_ueberwachung']); } $reihungstest->studiengang_kz = $_POST['studiengang_kz']; //$reihungstest->ort_kurzbz = $_POST['ort_kurzbz']; @@ -2571,6 +2573,14 @@ $studienplaene_list = implode(',', array_keys($studienplaene_arr)); (Verpflichtend, wenn die Zugangsüberprüfung aktiviert ist)
    Externe Überwachnung + externe_ueberwachung ? 'checked="checked"' : '' ?>> +