diff --git a/application/components/filters/Vertragsverwaltung.php b/application/components/filters/Vertragsverwaltung.php
new file mode 100644
index 000000000..b96aee8ea
--- /dev/null
+++ b/application/components/filters/Vertragsverwaltung.php
@@ -0,0 +1,36 @@
+ 'core',
+ 'datasetName' => 'vertragsverwaltung',
+ 'query' => '
+ SELECT
+ uid,
+ person_id,
+ vorname,
+ nachname,
+ gebdatum,
+ vertragsarten,
+ unternehmen,
+ ids,
+ aktiv
+ FROM
+ (
+ SELECT
+ b.uid , p.person_id,
+ p.vorname, p.nachname,
+ gebdatum,
+ 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
+ GROUP BY b.uid, p.person_id, p.vorname, p.nachname, b.aktiv
+ ) as vertragsdaten
+ ',
+ 'requiredPermissions' => 'vertrag/mitarbeiter'
+ );
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..90aedbd8b
--- /dev/null
+++ b/application/config/abgabe.php
@@ -0,0 +1,45 @@
+ 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;
+
+$config['BETREUER_SAMMELMAIL_BUTTON_STUDENT'] = true;
diff --git a/application/config/anrechnung.php b/application/config/anrechnung.php
index 2466d2bb1..6713ef37d 100644
--- a/application/config/anrechnung.php
+++ b/application/config/anrechnung.php
@@ -1,6 +1,6 @@
TRUE,
+ 'referenzbeispiele_ects' => TRUE,
+ 'voraussetzungen' => TRUE,
+ 'nachweisdokumente' => TRUE,
+ 'herkunft_kenntnisse' => 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..4d4dcc22a 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(
@@ -153,6 +163,13 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 50,
'requiredPermissions' => 'lehre/gruppenmanager:r'
+ ),
+ 'vertragsverwaltung' => array(
+ 'link' => site_url('vertragsverwaltung'),
+ 'description' => 'Vertragsverwaltung',
+ 'expand' => true,
+ 'sort' => 51,
+ 'requiredPermissions' => 'vertrag/mitarbeiter:r'
)
)
),
@@ -191,7 +208,14 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 30,
'requiredPermissions' => 'lehre/anrechnungszeitfenster:rw'
- )
+ ),
+ 'dashboardadmin' => array(
+ 'link' => site_url('dashboard/Admin'),
+ 'description' => 'Dashboard Admin',
+ 'expand' => true,
+ 'sort' => 40,
+ 'requiredPermissions' => 'dashboard/admin:r'
+ )
)
)
)
@@ -325,4 +349,37 @@ $config['navigation_menu']['system/issues/Issues/*'] = array(
'target' => '_blank',
'requiredPermissions' => array('admin:rw')
),
-);
\ No newline at end of file
+
+);
+
+$config['navigation_menu']['vertragsverwaltung/*'] = array(
+ 'vertragsverwaltung' => array(
+ 'link' => site_url('vertragsverwaltung'),
+ 'description' => 'Vertragsverwaltung',
+ 'icon' => 'home',
+ 'sort' => 100,
+ 'target' => '_blank',
+ 'requiredPermissions' => array('vertrag/mitarbeiter:r')
+ )
+);
+
+$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,27 +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['CisVue'] = 'CisVue/dashboard';
-$route['Cis/Stundenplan/(:any)'] = 'Cis/Stundenplan';
+$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
new file mode 100644
index 000000000..34a30a96e
--- /dev/null
+++ b/application/config/stv.php
@@ -0,0 +1,145 @@
+ [
+ //all fields can be configured to be hidden, see class attribute stv-details-details-name for name
+ 'hiddenFields' => [],
+ 'hideUDFs' => false
+ ],
+
+ 'prestudent' => [
+
+ //all fields can be configured to be hidden, see class attribute stv-details-prestudent-name for name
+ 'hiddenFields' => [
+
+ //propably used by FH-Communities
+ 'aufnahmeschluessel', 'standort_code', 'facheinschlaegigBerufstaetig'
+
+ ],
+ 'hideUDFs' => false
+ ],
+ 'finalexam' => [
+ 'documents' => [
+ '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',
+ ],
+ ],
+ ],
+ ],
+ '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'];
+
+// List of fields to show when ZGV_ERFUELLT_ANZEIGEN is defined
+$fieldsZgvErfuellt = ['zgv_erfuellt', 'zgvmas_erfuellt','zgvdoktor_erfuellt'];
+
+//order important: to show zgf_erfuellt_doktor just in case visibility of doktor is true
+if (!defined('ZGV_ERFUELLT_ANZEIGEN') || !ZGV_ERFUELLT_ANZEIGEN) {
+ $config['tabs']['prestudent']['hiddenFields'] = array_merge(
+ $config['tabs']['prestudent']['hiddenFields'], $fieldsZgvErfuellt
+ );
+}
+
+if (!defined('ZGV_DOKTOR_ANZEIGEN') || !ZGV_DOKTOR_ANZEIGEN) {
+ $config['tabs']['prestudent']['hiddenFields'] = array_merge(
+ $config['tabs']['prestudent']['hiddenFields'],
+ $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',
+];
+
+$config['stv_prestudent_tags'] = [
+ 'prioone' => ['readonly' => false],
+ 'priotwo' => ['readonly' => true],
+ 'hinweis' => ['readonly' => false],
+ 'hinweis_assistenz' => ['readonly' => true],
+ 'hinweis_kf' => ['readonly' => true],
+ 'hinweis_lehrende' => ['readonly' => false],
+ 'hinweis_stg_kf' => ['readonly' => true],
+ 'finished_stg' => ['readonly' => true],
+ 'finished_kf' => ['readonly' => true],
+ 'inwork_kf' => ['readonly' => true],
+];
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/Stundenplan.php b/application/controllers/Cis/InfoTerminal.php
similarity index 75%
rename from application/controllers/Cis/Stundenplan.php
rename to application/controllers/Cis/InfoTerminal.php
index 3e4e1a070..13dea1367 100644
--- a/application/controllers/Cis/Stundenplan.php
+++ b/application/controllers/Cis/InfoTerminal.php
@@ -5,7 +5,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*/
-class Stundenplan extends Auth_Controller
+class InfoTerminal extends Auth_Controller
{
/**
* Constructor
@@ -13,7 +13,7 @@ class Stundenplan extends Auth_Controller
public function __construct()
{
parent::__construct([
- 'index' => ['basis/cis:r']
+ 'index' => ['basis/cis:r'],
]);
}
@@ -25,6 +25,6 @@ class Stundenplan extends Auth_Controller
*/
public function index()
{
- $this->load->view('Cis/Stundenplan');
+ $this->load->view('Cis/InfoTerminal.php', []);
}
}
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/MyLv.php b/application/controllers/Cis/MyLv.php
index 08bf843b5..819d56b05 100644
--- a/application/controllers/Cis/MyLv.php
+++ b/application/controllers/Cis/MyLv.php
@@ -26,11 +26,11 @@ class MyLv extends Auth_Controller
*/
public function index()
{
- $this->load->view('Cis/MyLv');
- }
+
+ $viewData = array(
- public function Info($studien_semester,$lvid)
- {
- $this->load->view('Cis/LvInfo',['lvid'=> $lvid, 'studien_semester' => $studien_semester]);
+ );
+
+ $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLv']);
}
}
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 e991d1976..c287d87d0 100644
--- a/application/controllers/Cis/Profil.php
+++ b/application/controllers/Cis/Profil.php
@@ -55,7 +55,15 @@ class Profil extends Auth_Controller
*/
public function index()
{
- $this->load->view('Cis/Profil');
+
+ $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']);
}
/**
@@ -65,7 +73,17 @@ class Profil extends Auth_Controller
*/
public function View($uid)
{
- $this->load->view('Cis/Profil');
+ $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/Raumsuche.php b/application/controllers/Cis/Raumsuche.php
new file mode 100644
index 000000000..055038275
--- /dev/null
+++ b/application/controllers/Cis/Raumsuche.php
@@ -0,0 +1,35 @@
+ ['basis/cis:r']
+ ]);
+ }
+
+ // -----------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * @return void
+ */
+ public function index()
+ {
+
+ $viewData = array(
+ 'uid'=>getAuthUID(),
+ );
+
+ $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 9197fd388..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('CisVue/Dashboard.php',['viewData' => $viewData]);
+ $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 d1fe5468e..aa07b919f 100644
--- a/application/controllers/CisVue/Cms.php
+++ b/application/controllers/CisVue/Cms.php
@@ -60,7 +60,14 @@ class Cms extends Auth_Controller
$content = current($content);
- $this->load->view('CisVue/Cms/Content', ['content_id' => $content_id, 'template_kurzbz' => $content->template_kurzbz, 'version' => $version, 'sprache' => $sprache, 'sichtbar' => $sichtbar]);
+ $viewData = array(
+ 'content_id' => $content_id,
+ 'template_kurzbz' => $content->template_kurzbz,
+ 'version' => $version,
+ 'sichtbar' => $sichtbar
+ );
+
+ $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Content']);
}
/**
@@ -75,53 +82,20 @@ class Cms extends Auth_Controller
* @return void
*/
public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
- {
- $this->load->view('CisVue/Cms/Content', ['infoscreen' => $infoscreen, 'studiengang_kz' => $studiengang_kz, 'semester' => $semester, 'mischen' => $mischen, 'titel' => $titel, 'edit' => $edit, 'sichtbar' => $sichtbar]);
+ {
+ $viewData = array();
+ $this->load->view('CisRouterView/CisRouterView.php', ['viewData'=>$viewData, 'route' => 'News']);
}
-
- public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
+
+ public function getRoomInformation($ort_kurzbz)
{
- $get_page = intval($this->input->get('page', true));
- $get_page_size = intval($this->input->get('page_size', true));
- if ($get_page) {
- $page = $get_page;
- }
- if ($get_page_size) {
- $page_size = $get_page_size;
- } else {
- $page_size = $this->page_size;
- }
- $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size);
+ // Load Config
+ $this->load->config('calendar');
- if (isError($news)) {
- $this->terminateWithJsonError(getError($news));
- }
- $news = hasData($news) ? getData($news) : null;
- if ($news) {
- echo json_encode($news);
- } else {
- show_error("News: No data found");
- }
-
- }
-
- public function getNewsRowCount($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10)
- {
- list($studiengang_kz, $semester) = $this->cmslib->getStgAndSem($studiengang_kz, $semester);
- $all = $edit;
- $num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->page_size, $all, $mischen);
- if (isError($num_rows)) {
- $this->terminateWithJsonError(getError($num_rows));
- }
- $num_rows = hasData($num_rows) ? getData($num_rows) : null;
- if ($num_rows) {
- echo json_encode($num_rows);
- } else {
- show_error("News number rows: No data found");
- }
- }
-
- public function getRoomInformation($ort_kurzbz){
- $this->load->view('CisVue/Cms/RoomInformation',['ort_kurzbz'=>$ort_kurzbz]);
+ $viewData = array(
+ 'ort_kurzbz' => $ort_kurzbz,
+ 'timezone' => $this->config->item('timezone')
+ );
+ $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'CmsRoom']);
}
}
diff --git a/application/controllers/CisVue/Dashboard.php b/application/controllers/CisVue/Dashboard.php
index 5cb0d1a9e..ee830cb8b 100644
--- a/application/controllers/CisVue/Dashboard.php
+++ b/application/controllers/CisVue/Dashboard.php
@@ -29,17 +29,15 @@ class Dashboard extends Auth_Controller
{
$this->load->model('person/Person_model','PersonModel');
- $begruesung = $this->PersonModel->getFirstName(getAuthUID());
- if(isError($begruesung))
- {
- show_error("name couldn't be loaded for username ".getAuthUID());
- }
- $begruesung = getData($begruesung);
+ $personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
+
$viewData = array(
- 'name' => $begruesung
+ 'uid' => getAuthUID(),
+ 'name' => $personData->vorname,
+ 'person_id' => $personData->person_id
);
- $this->load->view('CisVue/Dashboard.php', ['viewData' => $viewData]);
+ $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData]);
}
}
\ No newline at end of file
diff --git a/application/controllers/Documents.php b/application/controllers/Documents.php
new file mode 100644
index 000000000..47aae7ed1
--- /dev/null
+++ b/application/controllers/Documents.php
@@ -0,0 +1,294 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * This controller handles output and access to documents.
+ * It creates a XML file, transforms it with the XSL-FO Vorlage from the
+ * database and generates a PDF file with unoconv or docsbox.
+ * This file is then outputted as download.
+ *
+ * It is the CodeIgniter version of content/pdfExport.php when not using the
+ * get paremeters: "archivdokument" and "archive".
+ * Use exportSigned() instead of providing the "sign" get parameter and
+ * export() otherwise.
+ */
+class Documents extends Auth_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'export' => self::PERM_LOGGED,
+ 'exportSigned' => self::PERM_LOGGED
+ ]);
+
+ // Load Phrases
+ $this->loadPhrases([
+ 'stv'
+ ]);
+ }
+
+ /**
+ * Download a not signed document.
+ *
+ * @param string $xml
+ * @param string $xsl
+ *
+ * @return void
+ */
+ public function export($xml, $xsl)
+ {
+ return $this->_export($xml, $xsl);
+ }
+
+ /**
+ * Download a signed document.
+ *
+ * @param string $xml
+ * @param string $xsl
+ *
+ * @return void
+ */
+ public function exportSigned($xml, $xsl)
+ {
+ return $this->_export($xml, $xsl, getAuthUID());
+ }
+
+ /**
+ * Helper function for export() and exportSigned()
+ *
+ * @param string $xml
+ * @param string $xsl
+ * @param string $sign_user (optional)
+ *
+ * @return void
+ */
+ protected function _export($xml, $xsl, $sign_user = null)
+ {
+ $xsl_oe_kurzbz = null;
+ $version = $this->input->post_get('version') ?: null;
+
+ // Get the OE or STG of the document
+ $xsl_oe_kurzbz = $this->input->post_get('xsl_oe_kurzbz')
+ ?: $this->input->post_get('xsl_stg_kz')
+ ?: $this->input->post_get('stg_kz');
+ if (is_null($xsl_oe_kurzbz)) {
+ $uid = $this->input->post_get('uid');
+ if ($uid) {
+ $uid = current(explode(';', $uid));
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $result = $this->StudentModel->load([$uid]);
+ if (!isError($result) && hasData($result))
+ $xsl_oe_kurzbz = current(getData($result))->studiengang_kz;
+ }
+ }
+ if (is_null($xsl_oe_kurzbz)) {
+ $prestudent_id = $this->input->post_get('prestudent_id');
+ if ($prestudent_id) {
+ $prestudent_id = current(explode(';', $prestudent_id));
+ $this->load->model('crm/Prestudent_model', 'PrestudentModel');
+ $result = $this->PrestudentModel->load($prestudent_id);
+ if (!isError($result) && hasData($result))
+ $xsl_oe_kurzbz = current(getData($result))->studiengang_kz;
+ }
+ }
+ if (is_null($xsl_oe_kurzbz))
+ $xsl_oe_kurzbz = 0;
+
+ // Access rights
+ if ($xsl == 'AccountInfo') {
+ $this->load->model('resource/Mitarbeiter_model', 'MitarbeiterModel');
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $uids = $this->input->post_get('uid');
+ if ($uids) {
+ $uids = explode(';', $uids);
+ foreach ($uids as $uid) {
+ $result = $this->MitarbeiterModel->load($uid);
+ if (!isError($result) && hasData($result)) {
+ if (!$this->permissionlib->isBerechtigt('admin', 'suid', 0)
+ && !$this->permissionlib->isBerechtigt('mitarbeiter', 'suid', 0))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'mitarbeiter:rw']]);
+ } else {
+ $result = $this->StudentModel->load([$uid]);
+ if (!isError($result) && hasData($result)) {
+ $student = current(getData($result));
+ if (!$this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz)
+ && !$this->permissionlib->isBerechtigt('admin', 'suid', 0)
+ && !$this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz)
+ && !$this->permissionlib->isBerechtigt('assistenz', 'suid', 0)
+ && !$this->permissionlib->isBerechtigt('support', 'suid', 0))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw', 'support:rw']]);
+ }
+ }
+ }
+ }
+ } else {
+ $this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
+
+ $result = $this->VorlagestudiengangModel->getCurrent($xsl, $xsl_oe_kurzbz, $version);
+ if (isError($result))
+ return show_error(getError($result));
+ if (!hasData($result))
+ return show_404();
+
+ $access_rights = current(getData($result))->berechtigung;
+ if (!$access_rights)
+ return show_404();
+ $allowed = false;
+ foreach ($access_rights as $access_right) {
+ if ($this->permissionlib->isBerechtigt($access_right)) {
+ $allowed = true;
+ break;
+ }
+ }
+ if (!$allowed)
+ return $this->_outputAuthError([$this->router->method => $access_rights]);
+ }
+
+ // Output format
+ $outputformat = $this->input->post_get('output') ?: 'pdf';
+ if ($outputformat != 'pdf'
+ // An der FHTW darf das Studienblatt und das Prüfungsprotokoll auch in anderen Formaten exportiert werden
+ && !(CAMPUS_NAME == 'FH Technikum Wien'
+ && ($xsl == 'Studienblatt'
+ || $xsl == 'StudienblattEng'
+ || $xsl == 'PrProtBA'
+ || $xsl == 'PrProtBAEng'
+ || $xsl == 'PrProtMA'
+ || $xsl == 'PrProtMAEng'
+ )
+ )
+ && !$this->permissionlib->isBerechtigt('system/change_outputformat', null, $xsl_oe_kurzbz)
+ ) {
+ $outputformat = 'pdf';
+ }
+
+ // XML Params
+ $params = 'xmlformat=xml';
+ foreach ([
+ 'uid',
+ 'stg_kz',
+ 'person_id',
+ 'id',
+ 'prestudent_id',
+ 'buchungsnummern',
+ 'ss',
+ 'abschlusspruefung_id',
+ 'typ',
+ 'all',
+ 'preoutgoing_id',
+ 'lvid',
+ 'projekt_kurzbz',
+ 'von',
+ 'bis',
+ 'stundevon',
+ 'stundebis',
+ 'sem',
+ 'lehreinheit',
+ 'mitarbeiter_uid',
+ 'studienordnung_id',
+ 'fixangestellt',
+ 'standort',
+ 'abrechnungsmonat',
+ 'form',
+ 'projektarbeit_id',
+ 'betreuerart_kurzbz',
+ 'studiensemester_kurzbz'
+ ] as $key) {
+ $value = $this->input->post_get($key);
+ if ($value !== null)
+ $params .= '&' . $key . '=' . urlencode($value);
+ }
+ $value = $this->input->post_get('vertrag_id');
+ if ($value !== null) {
+ foreach ($value as $id)
+ $params .= '&vertrag_id[]=' . urlencode($id);
+ }
+
+ $this->load->library('DocumentExportLib');
+ $this->load->model('system/Vorlage_model', 'VorlageModel');
+
+ $result = $this->VorlageModel->load($xsl);
+ if (isError($result))
+ return show_error(getError($result));
+ if (!hasData($result))
+ show_404();
+
+ $vorlage = current(getData($result));
+ if ($sign_user && !$vorlage->signierbar)
+ return show_error($this->p->t("stv", "grades_error_sign"));
+
+
+ // Filename
+ $filename = ($vorlage->bezeichnung ?: $vorlage->vorlage_kurzbz);
+ switch ($xsl) {
+ case 'LV_Informationen':
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $result = $this->StudiengangModel->load($this->input->post_get('stg_kz'));
+ if (!isError($result) && hasData($result))
+ $filename .= '_' . sanitizeProblemChars(current(getData($result))->kurzbzlang);
+
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ $result = $this->StudiensemesterModel->load($this->input->post_get('ss'));
+ if (!isError($result) && hasData($result))
+ $filename .= '_' . sanitizeProblemChars(current(getData($result))->studiensemester_kurzbz);
+ break;
+ case 'Honorarvertrag':
+ $uid = str_replace(';', '', $this->input->post_get('uid') ?: '');
+ $this->load->model('person/Benutzer_model', 'BenutzerModel');
+ $this->BenutzerModel->addJoin('public.tbl_person', 'person_id', 'LEFT');
+ $result = $this->BenutzerModel->load([$uid]);
+ if (!isError($result) && hasData($result)) {
+ $user = current(getData($result));
+ $filename .= '_' . sanitizeProblemChars($user->nachname) . '_' . sanitizeProblemChars($user->vorname);
+ }
+ break;
+ case 'Studienordnung':
+ $filename = 'Studienordnung-Studienplan-';
+
+ $this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
+ $result = $this->StudienordnungModel->load($this->input->post_get('studienordnung_id'));
+ if (!isError($result) && hasData($result)) {
+ $so = current(getData($result));
+ $filename .= sprintf("%'.04d", $so->studiengang_kz) . '-' . $so->studiengangkurzbzlang;
+ }
+ break;
+ default:
+ $uid = str_replace(';', '', $this->input->post_get('uid') ?: '');
+ $this->load->model('person/Benutzer_model', 'BenutzerModel');
+ $this->BenutzerModel->addJoin('public.tbl_person', 'person_id', 'LEFT');
+ $result = $this->BenutzerModel->load([$uid]);
+ if (!isError($result) && hasData($result)) {
+ $user = current(getData($result));
+ $filename .= '_' . sanitizeProblemChars($user->nachname);
+ }
+ break;
+ }
+
+ // XML Data
+ $result = $this->documentexportlib->getDataURL($xml, $params);
+ if (isError($result))
+ return show_error(getError($result));
+
+ $data = getData($result);
+
+ // Output
+ $this->documentexportlib->showContent($filename, $vorlage, $data, $xsl_oe_kurzbz, $version, $outputformat, $sign_user);
+ }
+}
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 e09d04c6a..1699ba740 100644
--- a/application/controllers/Studentenverwaltung.php
+++ b/application/controllers/Studentenverwaltung.php
@@ -28,9 +28,14 @@ class Studentenverwaltung extends Auth_Controller
'basis/prestudentstatus' => $this->permissionlib->isBerechtigt('basis/prestudentstatus'),
'assistenz_stgs' => $this->permissionlib->getSTG_isEntitledFor('assistenz'),
'admin' => $this->permissionlib->isBerechtigt('admin'),
- 'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'),
+ 'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz', 'suid'),
'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'),
- 'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht')
+ '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')
@@ -38,3 +43,5 @@ class Studentenverwaltung extends Auth_Controller
]);
}
}
+
+
diff --git a/application/controllers/Vertragsverwaltung.php b/application/controllers/Vertragsverwaltung.php
new file mode 100644
index 000000000..f68ed1737
--- /dev/null
+++ b/application/controllers/Vertragsverwaltung.php
@@ -0,0 +1,30 @@
+method] = ['vertrag/mitarbeiter:r'];
+ #$permissions[$router->method] = ['admin:rw'];
+ parent::__construct($permissions);
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+ }
+
+ /**
+ * @return void
+ */
+ public function _remap()
+ {
+ $this->load->view('Vertragsverwaltung', [
+ 'permissions' => [
+ 'vertragsverwaltung_schreibrechte' => $this->permissionlib->isBerechtigt('vertrag/mitarbeiter', 'suid')
+ ]
+ ]);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php
new file mode 100644
index 000000000..43dc18d1c
--- /dev/null
+++ b/application/controllers/api/frontend/v1/Abgabe.php
@@ -0,0 +1,1418 @@
+.
+ */
+
+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');
+ $BETREUER_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('BETREUER_SAMMELMAIL_BUTTON_STUDENT');
+
+ $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,
+ 'BETREUER_SAMMELMAIL_BUTTON_STUDENT' => $BETREUER_SAMMELMAIL_BUTTON_STUDENT,
+ );
+
+ $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->checkPaabgabeDeadline($paabgabe_id);
+
+ $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'));
+ }
+
+ }
+
+ // validate paabgabe deadline against servertime just in case a student spoofs their local clock and thus
+ // unlocks the upload ui
+ private function checkPaabgabeDeadline($paabgabe_id) {
+ $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');
+ }
+
+ // in that case any submission date is fine
+ if($paabgabe->fixtermin === false) return;
+
+ $tz = new DateTimeZone('Europe/Berlin');
+ $now = new DateTimeImmutable('now', $tz);
+ $deadline = DateTimeImmutable::createFromFormat(
+ 'Y-m-d H:i:s',
+ $paabgabe->datum . ' 23:59:59',
+ $tz
+ );
+
+ if($now >= $deadline) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4deadlineExceeded'));
+ }
+ }
+
+ /**
+ * 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);
+
+
+ $mapFunc = function($projektarbeit) {
+ return $projektarbeit->projektarbeit_id;
+ };
+ $projektarbeiten_ids = array_map($mapFunc, $projektarbeiten->retval);
+
+ if(count($projektarbeiten_ids) > 0) {
+ $ret = $this->ProjektarbeitModel->getProjektarbeitenAbgabetermine($projektarbeiten_ids);
+ $projektabgaben = $this->getDataOrTerminateWithError($ret, 'general');
+ }
+
+ forEach($projektarbeiten->retval as $pa) {
+
+ $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;
+
+ // has previously been retrieved via getStudentProjektabgaben but is fetched in advance to avoid having to reload abgaben
+ $projektarbeitIsCurrent = false;
+ $returnFunc = function ($result) use (&$projektarbeitIsCurrent) {
+ $projektarbeitIsCurrent = $result;
+ };
+ Events::trigger('projektarbeit_is_current', $pa->projektarbeit_id, $returnFunc);
+ $pa->isCurrent = $projektarbeitIsCurrent;
+
+ $filterFunc = function($projektabgabe) use ($pa) {
+ return $projektabgabe->projektarbeit_id == $pa->projektarbeit_id;
+ };
+
+ $pa->abgabetermine = array_values(array_filter($projektabgaben, $filterFunc));
+ }
+
+
+ $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',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')
+ ), 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',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')
+ ), 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);
+ if(count($result->retval) > 0) {
+ $email = getData($result);
+ return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email;
+ } else return '';
+
+ }
+
+ /**
+ * 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', 'c4fehlerMailBegutachterv2'), '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', 'c4fehlerMailBegutachterv2'), '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', 'c4fehlerMailZweitBegutachterv2'), 'general');
+ }
+
+ $begutachterMitTokenRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id));
+
+ if (!$begutachterMitTokenRetval && count($begutachterMitTokenRetval) <= 0)
+ {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
+ }
+
+ $begutachterMitToken = $begutachterMitTokenRetval[0];
+
+ $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter';
+ $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path";
+ $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
+ $intern = isset($begutachterMitToken->uid);
+ $mail_link = $intern ? $mail_fulllink : $mail_baselink;
+
+ $zweitbetmaildata = array();
+ $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : "");
+ $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede;
+ $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name;
+ $zweitbetmaildata['student_anrede'] = $maildata['student_anrede'];
+ $zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name'];
+ $zweitbetmaildata['abgabetyp'] = $abgabetyp;
+ $zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : "";
+ $zweitbetmaildata['bewertunglink'] = $projektarbeitIsCurrent ? "Zur Beurteilung der Arbeit
" : "";
+ $zweitbetmaildata['token'] = $projektarbeitIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "Zugangstoken: " . $begutachterMitToken->zugangstoken . "
" : "";
+
+ $mailres = sendSanchoMail(
+ 'ParbeitsbeurteilungEndupload',
+ $zweitbetmaildata,
+ $begutachterMitToken->email,
+ $subject,
+ 'sancho_header_min_bw.jpg',
+ 'sancho_footer_min_bw.jpg',
+ get_uid()."@".DOMAIN
+ );
+
+ if (!$mailres)
+ {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
+ }
+
+ }
+ }
+ }
+ }
+ }
+
+ private function checkZuordnung($projektarbeit_id, $betreuer_uid) {
+ // 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
new file mode 100644
index 000000000..72f396b4f
--- /dev/null
+++ b/application/controllers/api/frontend/v1/AuthInfo.php
@@ -0,0 +1,70 @@
+.
+ */
+
+if (!defined('BASEPATH')) exit('No direct script access allowed');
+
+class AuthInfo extends FHCAPI_Controller
+{
+ protected $uid;
+ protected $pid;
+ protected $isMitarbeiter;
+ protected $isStudent;
+
+ /**
+ * Object initialization
+ */
+ public function __construct()
+ {
+ 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;
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * returns the uid of the currently logged in user
+ * @access public
+ *
+ */
+ public function getAuthUID()
+ {
+ $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/Bookmark.php b/application/controllers/api/frontend/v1/Bookmark.php
index a811843ce..3e646bb51 100644
--- a/application/controllers/api/frontend/v1/Bookmark.php
+++ b/application/controllers/api/frontend/v1/Bookmark.php
@@ -30,6 +30,7 @@ class Bookmark extends FHCAPI_Controller
'getBookmarks' => self::PERM_LOGGED,
'delete' => self::PERM_LOGGED,
'insert' => self::PERM_LOGGED,
+ 'update' => self::PERM_LOGGED,
]);
$this->load->model('dashboard/Bookmark_model', 'BookmarkModel');
@@ -50,7 +51,8 @@ class Bookmark extends FHCAPI_Controller
*/
public function getBookmarks()
{
- $bookmarks = $this->BookmarkModel->loadWhere(["uid"=>$this->uid]);
+ $this->BookmarkModel->addOrder("bookmark_id");
+ $bookmarks = $this->BookmarkModel->loadWhere(["uid"=>$this->uid]);
$bookmarks = $this->getDataOrTerminateWithError($bookmarks);
@@ -104,6 +106,33 @@ class Bookmark extends FHCAPI_Controller
$this->terminateWithSuccess($insert_into_result);
+ }
+
+ /**
+ * updates bookmark in the bookmark table
+ * @access public
+ * @return void
+ */
+ public function update($bookmark_id)
+ {
+ // form validation
+ $this->load->library('form_validation');
+ $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
+ $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
+ if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $url = $this->input->post('url',true);
+ $title = $this->input->post('title',true);
+
+ $now = new DateTime();
+ $now = $now->format('Y-m-d H:i:s');
+
+ $update_result = $this->BookmarkModel->update($bookmark_id,['url'=>$url, 'title'=>$title,'updateamum'=>$now]);
+
+ $update_result = $this->getDataOrTerminateWithError($update_result);
+
+ $this->terminateWithSuccess($update_result);
+
}
}
diff --git a/application/controllers/api/frontend/v1/Cis4FhcApi.php b/application/controllers/api/frontend/v1/Cis4FhcApi.php
new file mode 100644
index 000000000..372e4bfaa
--- /dev/null
+++ b/application/controllers/api/frontend/v1/Cis4FhcApi.php
@@ -0,0 +1,58 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+class Cis4FhcApi extends FHCAPI_Controller
+{
+
+ /**
+ * Object initialization
+ */
+ public function __construct()
+ {
+ parent::__construct([
+ 'getViewData' => self::PERM_LOGGED,
+ ]);
+
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * fetches ViewData
+ */
+ public function getViewData()
+ {
+ $this->load->model('person/Person_model','PersonModel');
+ $personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
+
+ $viewData = array(
+ 'uid' => getAuthUID(),
+ 'name' => $personData->vorname,
+ 'person_id' => $personData->person_id
+ );
+
+ $this->terminateWithSuccess($viewData);
+ }
+
+
+
+}
+
diff --git a/application/controllers/api/frontend/v1/CisMenu.php b/application/controllers/api/frontend/v1/CisMenu.php
new file mode 100644
index 000000000..4f4f2573e
--- /dev/null
+++ b/application/controllers/api/frontend/v1/CisMenu.php
@@ -0,0 +1,58 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+
+class CisMenu extends FHCAPI_Controller
+{
+
+ /**
+ * Object initialization
+ */
+ public function __construct()
+ {
+ parent::__construct([
+ 'getMenu' => self::PERM_LOGGED,
+ ]);
+
+
+
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * fetches the menu for CIS from the database based on the userLanguage
+ */
+ public function getMenu()
+ {
+ $this->load->model('content/Content_model', 'ContentModel');
+ $this->load->config('cis');
+ $cis4_content_id =$this->config->item('cis_menu_root_content_id');
+ $result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(),getUserLanguage());
+ $result = $this->getDataOrTerminateWithError($result);
+ $menu = $result->childs ?? [];
+ $this->terminateWithSuccess($menu);
+ }
+
+
+
+}
+
diff --git a/application/controllers/api/frontend/v1/Cms.php b/application/controllers/api/frontend/v1/Cms.php
index e41196f45..b8937a1f4 100644
--- a/application/controllers/api/frontend/v1/Cms.php
+++ b/application/controllers/api/frontend/v1/Cms.php
@@ -106,7 +106,6 @@ class Cms extends FHCAPI_Controller
$this->terminateWithSuccess($content_id);
}
- //todo: there is the method news and getNews but only one should exist
public function news()
{
@@ -125,25 +124,35 @@ class Cms extends FHCAPI_Controller
//get the data or terminate with error
$news = $this->getDataOrTerminateWithError($news);
-
+ // array that keeps track of which news don't have a betreff and have to be removed from the news array
+ $newsToRemove = array();
// collect the content of the news
- foreach($news as $news_element){
- $this->addMeta("content_id",$news_element->content_id);
+ foreach($news as $index=>$news_element){
- //todo: quick fix, for query builder error when fetching content
$this->NewsModel->resetQuery();
$content = $this->cmslib->getContent($news_element->content_id);
-
- $content = getData($content);
-
- $news_element->content_obj = $content;
+ if(isError($content))
+ {
+ // removes the news from the news array, so that the response does not include a invalid news
+ array_push($newsToRemove,$index);
+ //add the error to the api response? visual feedback
+ //$this->addError(print_r($content->retval,true));
+ continue;
+ }
+ $content = getData($content);
+ $news_element->content_obj = $content;
}
+
+ //removes all news that don't have a betreff
+ foreach($newsToRemove as $removeNewsIndex)
+ {
+ unset($news[$removeNewsIndex]);
+ }
+
$withContent = function($news) {
return $news->content_obj != null;
- };
-
+ };
$newsWithContent = array_filter($news, $withContent);
-
$this->terminateWithSuccess($newsWithContent);
}
@@ -176,15 +185,18 @@ class Cms extends FHCAPI_Controller
// getting the GET parameters
$page = intval($this->input->get('page', true));
$page_size = intval($this->input->get('page_size', true));
+ $sprache = $this->input->get('sprache', true);
+ if(!$sprache)
+ {
+ $sprache = getUserLanguage();
+ }
// default value for the page_size is 10
$page_size = $page_size ?? 10;
- $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size);
-
+ $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size, $sprache);
$news = $this->getDataOrTerminateWithError($news);
- $this->addMeta('test', $this->p->t('global', 'studiengangsleitung'));
$this->addMeta('phrases', json_decode($this->p->getJson()));
$this->terminateWithSuccess($news);
diff --git a/application/controllers/api/frontend/v1/Documents.php b/application/controllers/api/frontend/v1/Documents.php
new file mode 100644
index 000000000..13c0a2eba
--- /dev/null
+++ b/application/controllers/api/frontend/v1/Documents.php
@@ -0,0 +1,496 @@
+.
+ */
+
+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 documents
+ * Listens to ajax post calls to change the documents data
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ *
+ * This controller handles output and access to documents.
+ * It checks permissions to render documents in an alternative format
+ * or it creates a XML file, transforms it with the XSL-FO Vorlage from the
+ * database and generates a PDF file with unoconv or docsbox.
+ * This file is then archivated in the database.
+ *
+ * The last part is the CodeIgniter version of content/pdfExport.php when not
+ * using the get paremeter: "archivdokument" but using the get parameter:
+ * "archive".
+ * Use archiveSigned() instead of providing the "sign" get parameter and
+ * archive() otherwise.
+ */
+class Documents extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'permissionAlternativeFormat' => self::PERM_LOGGED,
+ 'archive' => ['admin:rw', 'assistenz:rw'],
+ 'archiveSigned' => ['admin:rw', 'assistenz:rw'],
+ 'download' => ['admin:rw', 'assistenz:rw']
+ ]);
+
+ // Load Phrases
+ $this->loadPhrases([
+ 'stv'
+ ]);
+ }
+
+ /**
+ * Checks if the current user has permission to render documents in an
+ * alternative format.
+ *
+ * @param string $oe_kurzbz Or studiengang_kz
+ *
+ * @return void
+ */
+ public function permissionAlternativeFormat($oe_kurzbz)
+ {
+ $this->terminateWithSuccess($this->permissionlib->isBerechtigt('system/change_outputformat', null, $oe_kurzbz));
+ }
+
+ /**
+ * Archive a not signed document.
+ *
+ * @param string $xml (optional)
+ * @param string $xsl (optional)
+ *
+ * @return void
+ */
+ public function archive($xml = null, $xsl = null)
+ {
+ return $this->_archive($xml, $xsl);
+ }
+
+ /**
+ * Archive a signed document.
+ *
+ * @param string $xml (optional)
+ * @param string $xsl (optional)
+ *
+ * @return void
+ */
+ public function archiveSigned($xml = null, $xsl = null)
+ {
+ 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()
+ *
+ * @param string $xml
+ * @param string $xsl
+ * @param string $sign_user (optional)
+ *
+ * @return void
+ */
+ 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');
+ }
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }
+
+ $xsl_oe_kurzbz = null;
+ $version = $this->input->post_get('version') ?: null;
+
+ // Get the OE or STG of the document
+ $xsl_oe_kurzbz = $this->input->post_get('xsl_oe_kurzbz')
+ ?: $this->input->post_get('xsl_stg_kz')
+ ?: $this->input->post_get('stg_kz');
+ if (is_null($xsl_oe_kurzbz)) {
+ $uid = $this->input->post_get('uid');
+ if ($uid) {
+ $uid = current(explode(';', $uid));
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $result = $this->StudentModel->load([$uid]);
+ if (!isError($result) && hasData($result))
+ $xsl_oe_kurzbz = current(getData($result))->studiengang_kz;
+ }
+ }
+ if (is_null($xsl_oe_kurzbz)) {
+ $prestudent_id = $this->input->post_get('prestudent_id');
+ if ($prestudent_id) {
+ $prestudent_id = current(explode(';', $prestudent_id));
+ $this->load->model('crm/Prestudent_model', 'PrestudentModel');
+ $result = $this->PrestudentModel->load($prestudent_id);
+ if (!isError($result) && hasData($result))
+ $xsl_oe_kurzbz = current(getData($result))->studiengang_kz;
+ }
+ }
+ if (is_null($xsl_oe_kurzbz))
+ $xsl_oe_kurzbz = 0;
+
+ // Vorlage
+ $this->load->model('system/Vorlage_model', 'VorlageModel');
+
+ $result = $this->VorlageModel->load($xsl);
+ $vorlage = current($this->getDataOrTerminateWithError($result));
+ if (!$vorlage)
+ show_404();
+
+ // Akte Data
+ $akteData = [
+ 'dokument_kurzbz' => $vorlage->dokument_kurzbz ?: 'Zeugnis',
+ 'mimetype' => 'application/pdf',
+ 'erstelltam' => date('Y-m-d'),
+ 'gedruckt' => true,
+ 'insertamum' => date('c'),
+ 'insertvon' => getAuthUID(),
+ 'uid' => $this->input->post_get('uid') ?: null,
+ 'archiv' => true,
+ 'signiert' => !!$sign_user,
+ 'stud_selfservice' => $vorlage->stud_selfservice
+ ];
+ $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);
+ $status = current($this->getDataOrTerminateWithError($result));
+ if (!$status)
+ $this->terminateWithError($this->p->t("stv", "grades_error_prestudentstatus"));
+ $semester = $status->ausbildungssemester;
+
+ $this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
+ $this->StudentlehrverbandModel->addJoin('public.tbl_benutzer', 'uid = student_uid');
+ $this->StudentlehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
+ $result = $this->StudentlehrverbandModel->load([
+ 'studiensemester_kurzbz' => $ss,
+ 'student_uid' => $akteData['uid']
+ ]);
+
+ if (!hasData($result)) $this->terminateWithError($this->p->t("stv", "error_noLehrverbandAssigned"));
+
+ $res = current($this->getDataOrTerminateWithError($result));
+
+ $studiengang_kz = $res->studiengang_kz;
+ $akteData['person_id'] = $res->person_id;
+ switch ($xsl) {
+ case 'Ausbildungsver':
+ case 'AusbVerEng':
+ $akteData['titel'] = mb_substr($xsl .
+ "_" .
+ strtoupper($res->typ) .
+ strtoupper($res->kurzbz) .
+ "_" .
+ $semester .
+ "_" .
+ $ss, 0, 64);
+ $akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64);
+ break;
+ case 'LVZeugnisEng':
+ case 'LVZeugnis':
+ case 'Zertifikat':
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+ $result = $this->LehrveranstaltungModel->load($this->input->post_get('lvid'));
+ $lv = current($this->getDataOrTerminateWithError($result));
+ $akteData['dokument_kurzbz'] = $xsl;
+ $akteData['titel'] = mb_substr($xsl .
+ "_" .
+ strtoupper($res->typ) .
+ strtoupper($res->kurzbz) .
+ "_" .
+ $semester .
+ '_' .
+ $ss .
+ '_' .
+ str_replace(' ', '_', $lv->bezeichnung), 0, 60);
+ $akteData['bezeichnung'] = mb_substr($xsl .
+ " " .
+ strtoupper($res->typ) .
+ strtoupper($res->kurzbz) .
+ " " .
+ $semester .
+ ". Semester" .
+ ' ' .
+ $ss .
+ ' ' .
+ $lv->bezeichnung, 0, 64);
+ break;
+ case 'SZeugnis':
+ $akteData['titel'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64);
+ $akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64);
+ break;
+ default:
+ $akteData['titel'] = mb_substr($xsl .
+ "_" .
+ strtoupper($res->typ) .
+ strtoupper($res->kurzbz) .
+ "_" .
+ $semester .
+ "_" .
+ $ss, 0, 64);
+ $akteData['bezeichnung'] = mb_substr($xsl .
+ " " .
+ strtoupper($res->typ) .
+ strtoupper($res->kurzbz) .
+ " " .
+ $semester .
+ ". Semester" .
+ ' ' .
+ $ss, 0, 64);
+ break;
+ }
+ } else {
+ $studiengang_kz = $student->studiengang_kz;
+ $akteData['person_id'] = $student->person_id;
+ $akteData['titel'] = $vorlage->bezeichnung . '_' . $student->kuerzel;
+ $akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64);
+ }
+ } else {
+ $prestudent_id = $this->input->post_get('prestudent_id');
+ if ($prestudent_id) {
+ $this->load->model('crm/prestudent_model', 'PrestudentModel');
+ $this->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
+ $this->PrestudentModel->addSelect('tbl_prestudent.*, UPPER(typ || kurzbz) AS kuerzel');
+ $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);
+ $akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $prestudent->kuerzel, 0, 64);
+ }
+ }
+
+ // Access rights
+ if (!$this->permissionlib->isBerechtigt('admin', 'suid', $studiengang_kz)
+ && !$this->permissionlib->isBerechtigt('assistenz', 'suid', $studiengang_kz))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
+ if ($xsl == 'AccountInfo') {
+ $this->load->model('resource/Mitarbeiter_model', 'MitarbeiterModel');
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $uids = $this->input->post_get('uid');
+ if ($uids) {
+ $uids = explode(';', $uids);
+ foreach ($uids as $uid) {
+ $result = $this->MitarbeiterModel->load($uid);
+ if (!isError($result) && hasData($result)) {
+ if (!$this->permissionlib->isBerechtigt('admin', 'suid', 0)
+ && !$this->permissionlib->isBerechtigt('mitarbeiter', 'suid', 0))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'mitarbeiter:rw']]);
+ } else {
+ $result = $this->StudentModel->load([$uid]);
+ if (!isError($result) && hasData($result)) {
+ $student = current(getData($result));
+ if (!$this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz)
+ && !$this->permissionlib->isBerechtigt('admin', 'suid', 0)
+ && !$this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz)
+ && !$this->permissionlib->isBerechtigt('assistenz', 'suid', 0)
+ && !$this->permissionlib->isBerechtigt('support', 'suid', 0))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw', 'support:rw']]);
+ }
+ }
+ }
+ }
+ } else {
+ $this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
+
+ $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)) {
+ $allowed = true;
+ break;
+ }
+ }
+ if (!$allowed)
+ return $this->_outputAuthError([$this->router->method => $access_rights]);
+ }
+
+ // Output format
+ $outputformat = $this->input->post_get('output') ?: 'pdf';
+ if ($outputformat != 'pdf'
+ // An der FHTW darf das Studienblatt und das Prüfungsprotokoll auch in anderen Formaten exportiert werden
+ && !(CAMPUS_NAME == 'FH Technikum Wien'
+ && ($xsl == 'Studienblatt'
+ || $xsl == 'StudienblattEng'
+ || $xsl == 'PrProtBA'
+ || $xsl == 'PrProtBAEng'
+ || $xsl == 'PrProtMA'
+ || $xsl == 'PrProtMAEng'
+ )
+ )
+ && !$this->permissionlib->isBerechtigt('system/change_outputformat', null, $xsl_oe_kurzbz)
+ ) {
+ $outputformat = 'pdf';
+ }
+
+ // XML Params
+ $params = 'xmlformat=xml';
+ foreach ([
+ 'uid',
+ 'stg_kz',
+ 'person_id',
+ 'id',
+ 'prestudent_id',
+ 'buchungsnummern',
+ 'ss',
+ 'abschlusspruefung_id',
+ 'typ',
+ 'all',
+ 'preoutgoing_id',
+ 'lvid',
+ 'projekt_kurzbz',
+ 'von',
+ 'bis',
+ 'stundevon',
+ 'stundebis',
+ 'sem',
+ 'lehreinheit',
+ 'mitarbeiter_uid',
+ 'studienordnung_id',
+ 'fixangestellt',
+ 'standort',
+ 'abrechnungsmonat',
+ 'form',
+ 'projektarbeit_id',
+ '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);
+ }
+ $value = $this->input->post_get('vertrag_id');
+ if ($value !== null) {
+ foreach ($value as $id)
+ $params .= '&vertrag_id[]=' . urlencode($id);
+ }
+
+ 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
+ $result = $this->documentexportlib->getDataURL($xml, $params);
+ $data = $this->getDataOrTerminateWithError($result);
+ $this->documentexportlib->addArchiveToData($data);
+
+ // Output
+ $result = $this->documentexportlib->getContent($vorlage, $data, $xsl_oe_kurzbz, $version, $outputformat, $sign_user);
+
+ $content = $this->getDataOrTerminateWithError($result);
+ $akteData['titel'] .= '.pdf';
+ $akteData['inhalt'] = base64_encode($content);
+
+ 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/Filter.php b/application/controllers/api/frontend/v1/Filter.php
index 45838fc5f..b195e0012 100644
--- a/application/controllers/api/frontend/v1/Filter.php
+++ b/application/controllers/api/frontend/v1/Filter.php
@@ -113,7 +113,7 @@ class Filter extends FHCAPI_Controller
*/
public function applyFilterFields()
{
- $this->form_validation->set_rules('filterFields', 'filterFields', 'required');
+ $this->form_validation->set_rules('filterFields[]', 'filterFields', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
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 c25dc1986..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,10 +38,9 @@ class Lehre extends FHCAPI_Controller
parent::__construct([
'lvStudentenMail' => self::PERM_LOGGED,
'LV' => self::PERM_LOGGED,
+ 'Pruefungen' => self::PERM_LOGGED
]);
-
-
}
//------------------------------------------------------------------------------------------------------------------
@@ -76,10 +83,22 @@ class Lehre extends FHCAPI_Controller
$this->terminateWithSuccess($result);
}
-
-
+ /**
+ * fetches all Pruefungen of a student for a specific lehrveranstaltung
+ * if the student passed the Pruefung on the first attempt, no information about the Pruefungen is stored in the database
+ * @param mixed $lehrveranstaltung_id
+ * @return void
+ */
+ public function Pruefungen($lehrveranstaltung_id)
+ {
+ $this->load->model('education/Pruefung_model', 'PruefungModel');
-
+ $result = $this->PruefungModel->getByStudentAndLv(getAuthUID(), $lehrveranstaltung_id, getUserLanguage());
+
+ $result = $this->getDataOrTerminateWithError($result);
+
+ $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 777d49b0c..45936d9f5 100644
--- a/application/controllers/api/frontend/v1/LvMenu.php
+++ b/application/controllers/api/frontend/v1/LvMenu.php
@@ -51,13 +51,29 @@ 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'));
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
+
+ /**
+ * alternative function to get multiple lvMenus with a single http request
+ */
+ public function getMultipleLvMenu($lvMenuOptionList){
+ $result =[];
+ foreach($lvMenuOptionList as $lvMenuOptions){
+ $lvMenu = $this->getLvMenu($lvMenuOptions['lvid'],$lvMenuOptions['studiensemester_kurzbz']);
+ if(isError($lvMenu)){
+ // TODO: some lvMenu threw an error, handle error here
+ }
+ $result[$lvMenuOptions['lvid']]=$lvMenu;
+ }
+ $this->terminateWithSuccess($result);
+ }
+
/**
*
*/
@@ -91,20 +107,24 @@ class LvMenu extends FHCAPI_Controller
$lvres = $this->Lehrveranstaltung_model->load($lvid);
if(!hasData($lvres))
{
- $this->terminateWithError('LV ' . $lvid . ' not found.');
+ $this->terminateWithError('LV ' . $lvid . ' not found.');
}
$lv = (getData($lvres))[0];
-
+ $this->addMeta('lvInfo',$lv);
// define studiengang_kz / semester / lehrverzeichnis
$studiengang_kz = $lv->studiengang_kz;
$semester = $lv->semester;
$short = $lv->lehreverzeichnis;
+ // return empty menu for studiengang_kz = 0
+ if($studiengang_kz == 0){
+ $this->terminateWithSuccess("organisatorische_einheit");
+ }
// load studiengang
- $stgres = $this->Studiengang_model->load($lv->studiengang_kz);
+ $stgres = $this->Studiengang_model->load(strval($studiengang_kz));
if(!hasData($stgres))
{
- $this->terminateWithError('Stg ' . $lv->studiengang_kz . ' nof found.');
+ $this->terminateWithError('Stg ' . $lv->studiengang_kz . ' not found.');
}
$stg = (getData($stgres))[0];
$kurzbz = strtoupper($stg->typ . $stg->kurzbz);
@@ -249,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',
@@ -284,24 +306,6 @@ class LvMenu extends FHCAPI_Controller
}
-
- private function fhc_menu_digitale_anwesenheiten(&$menu, $angemeldet, $studiengang_kz, $semester, $lvid, $angezeigtes_stsem){
-
- // DIGITALE ANWESENHEITEN
- if (defined('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN') && CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN && $angemeldet) {
-
- $menu[] = array
- (
- 'id' => 'core_menu_digitale_anwesenheitslisten',
- 'position' => '50',
- 'name' => $this->p->t('lehre', 'digiAnw'),
- 'c4_icon' => base_url('skin/images/button_kreuzerltool.png'),
- 'c4_link' => base_url("index.ci.php/extensions/FHC-Core-Anwesenheiten/?stg_kz=$studiengang_kz&sem=$semester&lvid=$lvid&sem_kurzbz=$angezeigtes_stsem&nav=false"),
- 'c4_linkList' => []
- );
- }
- }
-
private function fhc_menu_lvinfo(&$menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr){
// LVINFO
@@ -329,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'),
@@ -347,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),
);
@@ -364,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))
@@ -376,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'),'#']],
@@ -448,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,
@@ -472,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)),
);
@@ -506,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))
@@ -523,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/Phrasen.php b/application/controllers/api/frontend/v1/Phrasen.php
index 3509e6630..7cc652c71 100644
--- a/application/controllers/api/frontend/v1/Phrasen.php
+++ b/application/controllers/api/frontend/v1/Phrasen.php
@@ -73,11 +73,22 @@ class Phrasen extends FHCAPI_Controller
// gets all languages that are set as active in the database
public function getAllLanguages()
{
- $langs = getDBActiveLanguages();
+ $this->load->model('system/Sprache_model', 'SprachenModel');
+
+ // Add order clause by index and select the sprache,bezeichnung and index column
+ $this->SprachenModel->addOrder('index');
+ $this->SprachenModel->addSelect('sprache, bezeichnung, index');
+
+ // Retrieves from public.tbl_sprache
+ $langs = $this->SprachenModel->loadWhere(array('content' => true));
$langs = $this->getDataOrTerminateWithError($langs);
$langs = array_map(function($lang){
- return $lang->sprache;
+ $data = new stdClass();
+ $data->sprache = $lang->sprache;
+ $data->bezeichnung = $lang->bezeichnung[($lang->index-1)];
+ return $data;
}, $langs);
+
$this->terminateWithSuccess($langs);
}
diff --git a/application/controllers/api/frontend/v1/Profil.php b/application/controllers/api/frontend/v1/Profil.php
index 576a2a8ed..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, "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_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/Studgang.php b/application/controllers/api/frontend/v1/Studgang.php
new file mode 100644
index 000000000..82aebb666
--- /dev/null
+++ b/application/controllers/api/frontend/v1/Studgang.php
@@ -0,0 +1,65 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+class Studgang extends FHCAPI_Controller
+{
+
+ /**
+ * Object initialization
+ */
+ public function __construct()
+ {
+ parent::__construct([
+ 'getStudiengangInfo'=> self::PERM_LOGGED,
+
+ ]);
+
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
+
+ // Loads phrases system
+ $this->loadPhrases([
+ 'global'
+ ]);
+
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ public function getStudiengangInfo(){
+ $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID());
+ $isMitarbeiter = $this->getDataOrTerminateWithError($isMitarbeiter);
+ if($isMitarbeiter) {
+ $this->terminateWithSuccess(null);
+ }
+
+ // fetches the Studiengang Information which is used next to the news
+ $studiengangInfo = $this->StudiengangModel->getStudiengangInfoForNews();
+ $studiengangInfo= $this->getDataOrTerminateWithError($studiengangInfo);
+ $this->terminateWithSuccess($studiengangInfo);
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Private methods
+
+
+
+}
+
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/betriebsmittel/BetriebsmittelP.php b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php
index 8e44b2326..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');
@@ -342,7 +350,7 @@ class BetriebsmittelP extends FHCAPI_Controller
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL);
}
- $this->terminateWithSuccess(current(getData($result)));
+ return $this->terminateWithSuccess(current(getData($result)));
}
public function deleteBetriebsmittel($betriebsmittelperson_id)
@@ -358,7 +366,7 @@ class BetriebsmittelP extends FHCAPI_Controller
if (!hasData($result)) {
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL);
}
- return $this->outputJsonSuccess(current(getData($result)));
+ $this->terminateWithSuccess(current(getData($result)));
}
public function getTypenBetriebsmittel()
@@ -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/dashboard/Board.php b/application/controllers/api/frontend/v1/dashboard/Board.php
new file mode 100644
index 000000000..c50fec128
--- /dev/null
+++ b/application/controllers/api/frontend/v1/dashboard/Board.php
@@ -0,0 +1,121 @@
+.
+ */
+
+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 addresses
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Board extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'list' => 'dashboard/admin:r',
+ 'create' => 'dashboard/admin:rw',
+ 'update' => 'dashboard/admin:rw',
+ 'delete' => 'dashboard/admin:rw'
+ ]);
+
+ // Models
+ $this->load->model('dashboard/Dashboard_model', 'DashboardModel');
+ }
+
+ public function list()
+ {
+ $result = $this->DashboardModel->load();
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($result);
+ }
+
+ public function create()
+ {
+ $dashboard_kurzbz = $this->input->post('dashboard_kurzbz');
+
+ $result = $this->DashboardModel->insert([
+ 'dashboard_kurzbz' => $dashboard_kurzbz
+ ]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function update()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('dashboard_id', 'Dashboard ID', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $dashboard_id = $this->input->post('dashboard_id');
+ $dashboard_kurzbz = $this->input->post('dashboard_kurzbz');
+ $beschreibung = $this->input->post('beschreibung');
+
+ $result = $this->DashboardModel->update([
+ 'dashboard_id' => $dashboard_id
+ ], [
+ 'dashboard_kurzbz' => $dashboard_kurzbz,
+ 'beschreibung' => $beschreibung
+ ]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($result);
+ }
+
+ public function delete()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('dashboard_id', 'Dashboard ID', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $dashboard_id = $this->input->post('dashboard_id');
+
+ //delete all presets
+ $this->load->model('dashboard/Dashboard_Preset_model', 'DashboardPresetModel');
+
+ $result = $this->DashboardPresetModel->delete([
+ 'dashboard_id' => $dashboard_id
+ ]);
+ $this->getDataOrTerminateWithError($result);
+
+ //delete all widgets
+ $this->load->model('dashboard/Dashboard_Widget_model', 'DashboardWidgetModel');
+
+ $result = $this->DashboardWidgetModel->delete([
+ 'dashboard_id' => $dashboard_id
+ ]);
+ $this->getDataOrTerminateWithError($result);
+
+ $result = $this->DashboardModel->delete($dashboard_id);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($result);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/dashboard/Preset.php b/application/controllers/api/frontend/v1/dashboard/Preset.php
new file mode 100644
index 000000000..5983d9660
--- /dev/null
+++ b/application/controllers/api/frontend/v1/dashboard/Preset.php
@@ -0,0 +1,200 @@
+.
+ */
+
+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 addresses
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Preset extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'list' => 'dashboard/admin:r',
+ 'getBatch' => 'dashboard/admin:r',
+ 'addWidget' => 'dashboard/admin:rw',
+ 'removeWidget' => 'dashboard/admin:rw'
+ ]);
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui'
+ ]);
+
+ // Libraries
+ $this->load->library('dashboard/DashboardLib');
+
+ // Models
+ $this->load->model('ressource/Funktion_model', 'FunktionModel');
+ }
+
+ public function list($dashboard_kurzbz)
+ {
+ $sql = "
+ WITH
+ dashboard_presets AS (
+ SELECT
+ *
+ FROM
+ dashboard.tbl_dashboard_preset dp
+ JOIN
+ dashboard.tbl_dashboard d ON d.dashboard_id = dp.dashboard_id
+ WHERE
+ d.dashboard_kurzbz = {$this->db->escape($dashboard_kurzbz)}
+ ),
+ general AS (
+ SELECT
+ 'general' AS funktion_kurzbz,
+ 'Allgemein' AS beschreibung
+ )
+
+ (
+ SELECT
+ f.funktion_kurzbz,
+ f.beschreibung,
+ COUNT(p.preset_id) AS has_preset
+ FROM
+ general f
+ LEFT JOIN
+ dashboard_presets p ON p.funktion_kurzbz IS NULL
+ GROUP BY
+ f.funktion_kurzbz, f.beschreibung
+ )
+ UNION ALL
+ (
+ SELECT
+ f.funktion_kurzbz,
+ f.beschreibung,
+ COUNT(p.preset_id) AS has_preset
+ FROM
+ public.tbl_funktion f
+ LEFT JOIN
+ dashboard_presets p ON p.funktion_kurzbz = f.funktion_kurzbz
+ GROUP BY
+ f.funktion_kurzbz, f.beschreibung
+ ORDER BY
+ f.beschreibung ASC
+ )
+ ";
+
+ $result = $this->FunktionModel->execReadOnlyQuery($sql);
+
+ $funktionen = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($funktionen);
+ }
+
+ public function getBatch()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('db', 'Dashboard', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $db = $this->input->post('db');
+ $funktionen = $this->input->post('funktionen') ?: [];
+
+ $result = [];
+
+ foreach ($funktionen as $funktion) {
+ $conf = $this->dashboardlib->getPreset($db, $funktion);
+ if ($conf) {
+ $preset = json_decode($conf->preset, true);
+ if (!isset($preset[$funktion]) || !isset($preset[$funktion]['widgets']))
+ $result[$funktion] = [];
+ else
+ $result[$funktion] = $preset[$funktion]['widgets'];
+ } else {
+ $result[$funktion] = [];
+ }
+ }
+
+ return $this->terminateWithSuccess($result);
+ }
+
+ public function addWidget()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('dashboard', 'Dashboard', 'required');
+ $this->form_validation->set_rules('funktion_kurzbz', 'Funktion', 'required');
+ $this->form_validation->set_rules('widget[widget]', 'Widget', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $dashboard_kurzbz = $this->input->post('dashboard');
+ $funktion_kurzbz = $this->input->post('funktion_kurzbz');
+ $widget = $this->input->post('widget');
+
+ if (!isset($widget['widgetid']))
+ $widget['widgetid'] = $this->dashboardlib->generateWidgetId($dashboard_kurzbz);
+
+ $preset = $this->dashboardlib->getPresetOrCreateEmptyPreset($dashboard_kurzbz, $funktion_kurzbz);
+
+ $preset_decoded = json_decode($preset->preset, true);
+
+ $this->dashboardlib->addWidgetsToWidgets($preset_decoded, $dashboard_kurzbz, $funktion_kurzbz, [$widget]);
+
+ $preset->preset = json_encode($preset_decoded);
+
+ $result = $this->dashboardlib->insertOrUpdatePreset($preset);
+
+ $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($widget['widgetid']);
+ }
+
+ public function removeWidget()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('db', 'Dashboard', 'required');
+ $this->form_validation->set_rules('funktion_kurzbz', 'Funktion', 'required');
+ $this->form_validation->set_rules('widgetid', 'Widget', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $dashboard_kurzbz = $this->input->post('db');
+ $funktion_kurzbz = $this->input->post('funktion_kurzbz');
+ $widgetid = $this->input->post('widgetid');
+
+ $preset = $this->dashboardlib->getPreset($dashboard_kurzbz, $funktion_kurzbz);
+ if (!$preset)
+ show_404();
+
+ $preset_decoded = json_decode($preset->preset, true);
+
+ if (!$this->dashboardlib->removeWidgetFromWidgets($preset_decoded, $funktion_kurzbz, $widgetid))
+ show_404();
+
+ $preset->preset = json_encode($preset_decoded);
+
+ $result = $this->dashboardlib->insertOrUpdatePreset($preset);
+
+ $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(array('msg' => $this->p->t('dashboard', 'success_savePreset')));
+ }
+}
diff --git a/application/controllers/api/frontend/v1/dashboard/User.php b/application/controllers/api/frontend/v1/dashboard/User.php
new file mode 100644
index 000000000..9d020649e
--- /dev/null
+++ b/application/controllers/api/frontend/v1/dashboard/User.php
@@ -0,0 +1,159 @@
+.
+ */
+
+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 the users dashboard
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class User extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'get' => 'dashboard/benutzer:r',
+ 'addWidget' => 'dashboard/benutzer:rw',
+ 'removeWidget' => 'dashboard/benutzer:rw'
+ ]);
+
+ // Libraries
+ $this->load->library('dashboard/DashboardLib');
+
+ // Models
+ $this->load->model('ressource/Funktion_model', 'FunktionModel');
+ }
+
+ public function get($dashboard_kurzbz)
+ {
+ $dashboard = $this->dashboardlib->getDashboardByKurzbz($dashboard_kurzbz);
+ if (!$dashboard)
+ show_404();
+
+ $uid = $this->authlib->getAuthObj()->username;
+
+ /*$mergedconfig = $this->dashboardlib->getMergedConfig($dashboard->dashboard_id, $uid);
+
+ $this->terminateWithSuccess([
+ 'general' => call_user_func_array(
+ 'array_merge_recursive',
+ $mergedconfig
+ )
+ ]);*/
+ $defaultconfig = $this->dashboardlib->getDefaultConfig($dashboard->dashboard_id);
+ $userconfig = $this->dashboardlib->getUserConfig($dashboard->dashboard_id, $uid);
+
+ $defaultconfig_squashed = $defaultconfig ? call_user_func_array('array_replace_recursive', $defaultconfig) : [];
+ $userconfig_squashed = $userconfig ? call_user_func_array('array_replace_recursive', $userconfig) : [];
+
+ $mergedconfig = array_replace_recursive($defaultconfig_squashed, $userconfig_squashed);
+
+ $this->terminateWithSuccess([
+ DashboardLib::SECTION_IF_FUNKTION_KURZBZ_IS_NULL => $mergedconfig
+ ]);
+ }
+
+ public function addWidget()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('dashboard', 'Dashboard', 'required');
+ $this->form_validation->set_rules('widget[widget]', 'Widget', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $widget = $this->input->post('widget');
+ $dashboard_kurzbz = $this->input->post('dashboard');
+ $uid = $this->authlib->getAuthObj()->username;
+
+ if (!isset($widget['widgetid']))
+ $widget['widgetid'] = $this->dashboardlib->generateWidgetId($dashboard_kurzbz);
+
+ $override = $this->dashboardlib->getOverrideOrCreateEmptyOverride($dashboard_kurzbz, $uid);
+
+ $override_decoded = json_decode($override->override, true);
+
+ if (!isset($override_decoded['general']) || !is_array($override_decoded['general']))
+ $override_decoded['general'] = [];
+
+ if (!isset($override_decoded['general']['widgets']))
+ $override_decoded['general']['widgets'] = [];
+
+ $override_decoded['general']['widgets'][$widget['widgetid']] = $widget;
+
+ // NOTE(chris): remove doubles in other funktionen
+ foreach ($override_decoded as $funktion => $array) {
+ if ($funktion == 'general')
+ continue;
+ if (isset($array['widgets']) && isset($array['widgets'][$widget['widgetid']]))
+ unset($override_decoded[$funktion]['widgets'][$widget['widgetid']]);
+ }
+
+ $override->override = json_encode($override_decoded);
+
+ $result = $this->dashboardlib->insertOrUpdateOverride($override);
+
+ $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($widget['widgetid']);
+ }
+
+ public function removeWidget()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('dashboard', 'Dashboard', 'required');
+ $this->form_validation->set_rules('widget', 'Widget', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $widget_id = $this->input->post('widget');
+ $dashboard_kurzbz = $this->input->post('dashboard');
+ $uid = $this->authlib->getAuthObj()->username;
+
+ $override = $this->dashboardlib->getOverride($dashboard_kurzbz, $uid);
+ if (!$override)
+ show_404();
+
+ $override_decoded = json_decode($override->override, true);
+
+ foreach (array_keys($override_decoded) as $k) {
+ if (!isset($override_decoded[$k]["widgets"])) {
+ unset($override_decoded[$k]);
+ continue;
+ }
+ if (isset($override_decoded[$k]["widgets"][$widget_id])) {
+ unset($override_decoded[$k]["widgets"][$widget_id]);
+ }
+ if (!$override_decoded[$k]["widgets"]) {
+ unset($override_decoded[$k]);
+ }
+ }
+
+ $override->override = json_encode($override_decoded);
+
+ $result = $this->dashboardlib->insertOrUpdateOverride($override);
+
+ $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess();
+ }
+}
diff --git a/application/controllers/api/frontend/v1/dashboard/Widget.php b/application/controllers/api/frontend/v1/dashboard/Widget.php
new file mode 100644
index 000000000..ac8c682e8
--- /dev/null
+++ b/application/controllers/api/frontend/v1/dashboard/Widget.php
@@ -0,0 +1,137 @@
+.
+ */
+
+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 the users dashboard
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Widget extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'get' => ['dashboard/benutzer:r', 'dashboard/admin:r'],
+ 'list' => 'dashboard/admin:r',
+ 'listAllowed' => ['dashboard/benutzer:rw', 'dashboard/admin:r'],
+ 'setAllowed' => 'dashboard/admin:rw'
+ ]);
+
+ // Libraries
+ $this->load->library('dashboard/DashboardLib');
+
+ // Models
+ $this->load->model('dashboard/Widget_model', 'WidgetModel');
+ }
+
+ public function get($id)
+ {
+ $result = $this->WidgetModel->load($id);
+
+ $widget = $this->getDataOrTerminateWithError($result);
+
+ if (!$widget)
+ return $this->terminateWithSuccess([
+ "widget_id" => 0,
+ "widget_kurzbz" => "notfound",
+ "arguments" => [
+ "className" => 'alert-danger',
+ "title" => 'Widget Not Found',
+ "msg" => 'The widget with the id ' . $id . ' could not be found'
+ ],
+ "setup" => [
+ "name" => 'Widget Not Found',
+ "file" => absoluteJsImportUrl('public/js/components/DashboardWidget/Default.js'),
+ "width" => 1,
+ "height" => 1
+ ]
+ ]);
+
+ $widget = current($widget);
+ $widget->arguments = json_decode($widget->arguments);
+ $tmpsetup = json_decode($widget->setup);
+ $tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
+ $widget->setup = $tmpsetup;
+
+ $this->terminateWithSuccess($widget);
+ }
+
+ public function list($dashboard)
+ {
+ $result = $this->WidgetModel->getWithAllowedForDashboard($dashboard);
+
+ $widgets = $this->getDataOrTerminateWithError($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;
+ }, $widgets);
+
+ $this->terminateWithSuccess($widgets);
+ }
+
+ public function listAllowed($dashboard)
+ {
+ $result = $this->WidgetModel->getForDashboard($dashboard);
+
+ $widgets = $this->getDataOrTerminateWithError($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;
+ }, $widgets);
+
+ $this->terminateWithSuccess($widgets);
+ }
+
+ public function setAllowed()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('dashboard_id', 'Dashboard', 'required');
+ $this->form_validation->set_rules('widget_id', 'Widget', 'required');
+ $this->form_validation->set_rules('allowed', 'Allowed', 'is_bool');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $data = [
+ 'dashboard_id' => $this->input->post('dashboard_id'),
+ 'widget_id' => $this->input->post('widget_id')
+ ];
+
+ $this->load->model('dashboard/Dashboard_Widget_model', 'DashboardWidgetModel');
+
+ if ($this->input->post('allowed'))
+ $result = $this->DashboardWidgetModel->insert($data);
+ else
+ $result = $this->DashboardWidgetModel->delete($data);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/detailheader/Detailheader.php b/application/controllers/api/frontend/v1/detailheader/Detailheader.php
new file mode 100644
index 000000000..ada10c5b6
--- /dev/null
+++ b/application/controllers/api/frontend/v1/detailheader/Detailheader.php
@@ -0,0 +1,53 @@
+ ['vertrag/mitarbeiter:r'],
+ 'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
+ 'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
+ ]);
+ }
+
+ 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));
+ }
+
+ 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));
+ }
+
+}
+
+
diff --git a/application/controllers/api/frontend/v1/fotoHandling/Foto.php b/application/controllers/api/frontend/v1/fotoHandling/Foto.php
new file mode 100644
index 000000000..4945ddd85
--- /dev/null
+++ b/application/controllers/api/frontend/v1/fotoHandling/Foto.php
@@ -0,0 +1,237 @@
+ ['admin:r', 'assistenz:r'],
+ 'deleteFoto' => ['admin:r', 'assistenz:r'],
+ ]);
+
+ //Load Models and Libraries
+ $this->load->model('person/Person_model', 'PersonModel');
+ $this->load->model("crm/Akte_model", "AkteModel");
+ $this->load->model('person/Fotostatusperson_model', 'FotostatusPersonModel');
+
+ $this->loadPhrases([
+ 'ui',
+ 'header'
+ ]);
+ }
+
+ public function uploadFoto($person_id)
+ {
+ if(!$person_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL);
+ }
+
+ $data = json_decode(file_get_contents("php://input"), true);
+
+ if (!empty($data['image']))
+ {
+ $base64 = $data['image'];
+ $resizedImage1 = $this->_resize($base64, 827, 1063);
+
+ if (is_null($resizedImage1))
+ return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL);
+
+ $akte = $this->AkteModel->loadWhere(array('person_id' => $person_id, 'dokument_kurzbz' => 'Lichtbil'));
+
+ $akteUpdateData = array(
+ 'dokument_kurzbz' => 'Lichtbil',
+ 'person_id' => $person_id,
+ 'inhalt' => $resizedImage1,
+ 'mimetype' => 'image/jpg',
+ 'erstelltam' => date('c'),
+ 'gedruckt' => false,
+ 'titel' => 'Lichtbild_' . $person_id . '.jpg',
+ 'bezeichnung' => 'Lichtbild gross',
+ 'insertamum' => date('c'),
+ 'insertvon' => getAuthUID(),
+ );
+
+ if (hasData($akte)) {
+ $akte_id = getData($akte)[0]->akte_id;
+
+ $akteUpdateData['updateamum'] = date('c');
+ $akteUpdateData['updatevon'] = getAuthUID();
+ $akteResult = $this->AkteModel->update(array('akte_id' => $akte_id), $akteUpdateData);
+ } else {
+ $akteResult = $this->AkteModel->insert($akteUpdateData);
+ }
+
+ if (isError($akteResult)) {
+ return $this->terminateWithError(getError($akteResult), self::ERROR_TYPE_GENERAL);
+ }
+
+ $resizedImage2 = $this->_resize($base64, 101, 130);
+
+ if (is_null($resizedImage2))
+ return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->_updateFoto($person_id, $resizedImage2);
+
+ if (!isError($result)) {
+ $this->FotostatusPersonModel->insert(array(
+ 'person_id' => $person_id,
+ 'fotostatus_kurzbz' => 'hochgeladen',
+ 'datum' => date('Y-m-d'),
+ 'updateamum' => date('c'),
+ 'updatevon' => getAuthUID(),
+ 'insertamum' => date('c'),
+ 'insertvon' => getAuthUID(),
+ ));
+
+ return $this->terminateWithSuccess($base64);
+ }
+ }
+ else
+ {
+ $this->terminateWithError($this->p->t('header', 'error_noPhoto'), self::ERROR_TYPE_GENERAL);
+ }
+ }
+
+ public function deleteFoto($person_id)
+ {
+ if(!$person_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL);
+ }
+
+ $result = $this->_deleteFoto($person_id);
+
+ if (isError($result))
+ {
+ return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ }
+ return $this->terminateWithSuccess($result);
+ }
+
+ private function _resize($imageData, $maxwidth, $maxheight, $quality = 90)
+ {
+ $meta = getimagesize($imageData);
+ if (!$meta)
+ {
+ return null;
+ }
+
+ $src_width = $meta[0];
+ $src_height = $meta[1];
+ $mime = $meta['mime'];
+
+ switch ($mime) {
+ case 'image/jpeg':
+ case 'image/jpg':
+ $imagecreated = imagecreatefromjpeg($imageData);
+ break;
+ case 'image/png':
+ $imagecreated = imagecreatefrompng($imageData);
+ break;
+ case 'image/gif':
+ $imagecreated = imagecreatefromgif($imageData);
+ break;
+ default:
+ return null;
+ }
+
+
+ if (!$imagecreated)
+ {
+ return null;
+ }
+
+ $src_aspect_ratio = $src_width / $src_height;
+ $thu_aspect_ratio = $maxwidth / $maxheight;
+
+ if ($src_width <= $maxwidth && $src_height <= $maxheight)
+ {
+ $thu_width = $src_width;
+ $thu_height = $src_height;
+ }
+ elseif ($thu_aspect_ratio > $src_aspect_ratio)
+ {
+ $thu_width = (int) ($maxheight * $src_aspect_ratio);
+ $thu_height = $maxheight;
+ }
+ else
+ {
+ $thu_width = $maxwidth;
+ $thu_height = (int) ($maxwidth / $src_aspect_ratio);
+ }
+
+ $imageScaled = imagecreatetruecolor($thu_width, $thu_height);
+
+ if ($mime === 'image/png')
+ {
+ $background = imagecolorallocate($imageScaled , 0, 0, 0);
+ imagecolortransparent($imageScaled, $background);
+ imagealphablending($imageScaled, false);
+ imagesavealpha($imageScaled, true);
+ }
+
+ imagecopyresampled($imageScaled, $imagecreated, 0, 0, 0, 0, $thu_width, $thu_height, $src_width, $src_height);
+
+ if ($mime === "image/gif")
+ {
+ $background = imagecolorallocate($imageScaled, 0, 0, 0);
+ imagecolortransparent($imageScaled, $background);
+ }
+
+ if (!empty($imageScaled))
+ {
+ ob_start();
+
+ if ($mime == 'image/png')
+ imagepng($imageScaled, NULL);
+ else if ($mime === 'image/gif')
+ imagegif($imageScaled, NULL);
+ else
+ imagejpeg($imageScaled, NULL, $quality);
+
+ $resizedImageData = ob_get_contents();
+ ob_end_clean();
+ @imagedestroy($imagecreated);
+ @imagedestroy($imageScaled);
+
+
+ if (!empty($resizedImageData))
+ {
+ return base64_encode($resizedImageData);
+ }
+ return null;
+ }
+ return null;
+ }
+
+ private function _updateFoto($person_id, $foto)
+ {
+ $personJson['foto'] = $foto;
+ $result = $this->PersonModel->update($person_id, $personJson);
+
+ if (isError($result))
+ {
+ return error($result->msg, EXIT_ERROR);
+ }
+
+ return $result;
+ }
+
+ private function _deleteFoto($person_id)
+ {
+ $personJson['foto'] = null;
+ $result = $this->PersonModel->update($person_id, $personJson);
+
+ if (isError($result))
+ {
+ return error($result->msg, EXIT_ERROR);
+ }
+
+ return $result;
+ }
+}
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..77b46f97b
--- /dev/null
+++ b/application/controllers/api/frontend/v1/messages/Messages.php
@@ -0,0 +1,564 @@
+ ['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=null, $page=null)
+ {
+ if($type_id != 'person_id'){
+ $id = $this->_getPersonId($id, $type_id);
+ }
+
+ if(!(is_null($size) && is_null($page)))
+ {
+ $offset = $size * ($page - 1);
+ $limit = $size;
+ }
+ else
+ {
+ $offset = null;
+ $limit = null;
+ }
+
+ $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/NotizAnrechnung.php b/application/controllers/api/frontend/v1/notiz/NotizAnrechnung.php
new file mode 100644
index 000000000..30dae9a50
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizAnrechnung.php
@@ -0,0 +1,44 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+
+ //Load Models
+ $this->load->model('person/Notiz_model', 'NotizModel');
+ $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui'
+ ]);
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "anrechnung_id")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ //TODO define permission
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/notiz/NotizBestellung.php b/application/controllers/api/frontend/v1/notiz/NotizBestellung.php
new file mode 100644
index 000000000..e30628f33
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizBestellung.php
@@ -0,0 +1,43 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+
+ //Load Models
+ $this->load->model('person/Notiz_model', 'NotizModel');
+ $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui'
+ ]);
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "bestellung_id")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+ //TODO define permission
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+}
\ No newline at end of file
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..a3b96d477
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizLehreinheit.php
@@ -0,0 +1,122 @@
+ ['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'],
+ ]);
+
+ //Load Models
+ $this->load->model('person/Notiz_model', 'NotizModel');
+ $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
+ $this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ //Permission checks for allowed Oes
+ $allowedOes = $this->permissionlib->getOE_isEntitledFor('assistenz') ?: [];
+
+ if ($this->router->method == 'addNewNotiz')
+ {
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $lehreinheit_id = $post_data['id'];
+
+ if(!$lehreinheit_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
+ }
+
+ if ($this->router->method == 'updateNotiz')
+ {
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $notiz_id = $post_data['notiz_id'];
+
+ if(!$notiz_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ //get lehreinheit_id
+ $result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+ $lehreinheit_id = current($data)->lehreinheit_id;
+
+ if(!$lehreinheit_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
+ }
+
+ if ($this->router->method == 'deleteNotiz')
+ {
+ $notiz_id = $this->input->post('notiz_id');
+ $lehreinheit_id = $this->input->post('id');
+
+ if(!$notiz_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ if(!$lehreinheit_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
+ }
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui'
+ ]);
+ }
+
+ private function _checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes)
+ {
+ //get oe from lehreinheit
+ $result = $this->LehreinheitModel->getOes($lehreinheit_id);
+ $data = $this->getDataOrTerminateWithError($result);
+ $oes = current($data);
+
+ if (!in_array($oes, $allowedOes))
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg') . " " . $oes, self::ERROR_TYPE_GENERAL);
+ }
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "lehreinheit_id")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+
+
+}
diff --git a/application/controllers/api/frontend/v1/notiz/NotizMitarbeiter.php b/application/controllers/api/frontend/v1/notiz/NotizMitarbeiter.php
new file mode 100644
index 000000000..f7de4b47b
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizMitarbeiter.php
@@ -0,0 +1,44 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+
+ //Load Models
+ $this->load->model('person/Notiz_model', 'NotizModel');
+ $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui'
+ ]);
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "mitarbeiter_uid")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ //TODO define permission
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+}
\ 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..a047129d7 100644
--- a/application/controllers/api/frontend/v1/notiz/NotizPerson.php
+++ b/application/controllers/api/frontend/v1/notiz/NotizPerson.php
@@ -18,34 +18,102 @@ 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'],
]);
+
+ //Load Models
+ $this->load->model('person/Benutzer_model', 'BenutzerModel');
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $this->load->model('crm/Prestudent_model', 'PrestudentModel');
+
+ //Permission checks for allowed Oes
+ if ($this->router->method == 'addNewNotiz')
+ {
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $person_id = $post_data['id'];
+
+ $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
+
+ if(!$person_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
+ }
+
+ if ( $this->router->method == 'updateNotiz')
+ {
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $notiz_id = $post_data['notiz_id'];
+
+ if(!$notiz_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ //get person_id
+ $result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+ $person_id = current($data)->person_id;
+
+ $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
+ $this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
+ }
+
+ if ($this->router->method == 'deleteNotiz' )
+ {
+ $notiz_id = $this->input->post('notiz_id');
+ $person_id = $this->input->post('id');
+
+ if(!$notiz_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ if(!$person_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'person ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
+ $this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
+ }
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "person_id")
{
- return $this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
- //TODO define permission
if (!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre', 'error_keineSchreibrechte');
-
- return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
- return $this->outputJsonSuccess(true);
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
- public function loadDokumente()
+ //stv: if person has permission of one studiengang of person -> permission to add/update/delete Note
+ private function _checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs)
{
- $notiz_id = $this->input->post('notiz_id');
+ $result = $this->PrestudentModel->loadWhere(['person_id' => $person_id]);
+ $data = $this->getDataOrTerminateWithError($result);
- // TODO(chris): make CI variant of endpoint
- $this->NotizModel->addSelect($this->NotizModel->escape(base_url('content/notizdokdownload.php?id=')) . ' || campus.tbl_dms_version.dms_id AS preview');
-
- return parent::loadDokumente();
+ $checkarray = [];
+ foreach ($data as $item)
+ {
+ if(in_array($item->studiengang_kz, $allowedStgs))
+ {
+ return true;
+ }
+ }
+
+ $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL);
}
-}
\ No newline at end of file
+}
diff --git a/application/controllers/api/frontend/v1/notiz/NotizPrestudent.php b/application/controllers/api/frontend/v1/notiz/NotizPrestudent.php
new file mode 100644
index 000000000..5e6cd747c
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizPrestudent.php
@@ -0,0 +1,117 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+
+ //Load Models
+ $this->load->model('person/Notiz_model', 'NotizModel');
+ $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
+ $this->load->model('crm/Student_model', 'StudentModel');
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui'
+ ]);
+
+ //Permission checks for Studiengangsarray
+ $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
+
+ if ($this->router->method == 'addNewNotiz')
+ {
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $prestudent_id = $post_data['id'];
+
+ if(!$prestudent_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
+ }
+
+ if ($this->router->method == 'updateNotiz')
+ {
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $notiz_id = $post_data['notiz_id'];
+
+ if(!$notiz_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ //get prestudent_id
+ $result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+ $prestudent_id = current($data)->prestudent_id;
+
+ if(!$prestudent_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
+ }
+
+ if ($this->router->method == 'deleteNotiz')
+ {
+ $notiz_id = $this->input->post('notiz_id');
+ $prestudent_id = $this->input->post('id');
+
+ if(!$notiz_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ if(!$prestudent_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
+ }
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "prestudent_id")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+
+ private function _checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs)
+ {
+ $student_uid = $this->StudentModel->getUID($prestudent_id);
+
+ $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);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/notiz/NotizProjekt.php b/application/controllers/api/frontend/v1/notiz/NotizProjekt.php
new file mode 100644
index 000000000..9cdde36ae
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizProjekt.php
@@ -0,0 +1,32 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "projekt_kurzbz")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ //TODO define permission
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/notiz/NotizProjektphase.php b/application/controllers/api/frontend/v1/notiz/NotizProjektphase.php
new file mode 100644
index 000000000..7a82c658e
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizProjektphase.php
@@ -0,0 +1,32 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "projektphase_id")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ //TODO define permission
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/notiz/NotizProjekttask.php b/application/controllers/api/frontend/v1/notiz/NotizProjekttask.php
new file mode 100644
index 000000000..aadb04f40
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizProjekttask.php
@@ -0,0 +1,32 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "projekttask_id")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ //TODO define permission
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/organisation/StudiengangEP.php b/application/controllers/api/frontend/v1/organisation/StudiengangEP.php
new file mode 100644
index 000000000..463243f57
--- /dev/null
+++ b/application/controllers/api/frontend/v1/organisation/StudiengangEP.php
@@ -0,0 +1,57 @@
+ self::PERM_LOGGED
+ )
+ );
+ // Load model StudiengangModel
+ $this->load->model('organisation/studiengang_model', 'StudiengangModel');
+ }
+
+ /**
+ * @return void
+ */
+ public function getStudiengangByKz()
+ {
+ $studiengang_kz = intval($this->input->get('studiengang_kz'));
+
+ $this->StudiengangModel->addSelect('studiengang_kz, kurzbz, kurzbzlang, '
+ . 'typ, bezeichnung, english, aktiv, orgform_kurzbz, sprache, '
+ . 'oe_kurzbz');
+ $result = $this->StudiengangModel->load($studiengang_kz);
+
+ if (isError($result))
+ {
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
+ }
+
+ $stg = null;
+ if(hasData($result))
+ {
+ $stg = (getData($result))[0];
+ }
+ $this->terminateWithSuccess($stg);
+ }
+}
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/studstatus/Unterbrechung.php b/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php
index abf58cf4f..72d5dbccc 100644
--- a/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php
+++ b/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php
@@ -127,9 +127,9 @@ class Unterbrechung extends FHCAPI_Controller
$this->form_validation->set_rules(
'datum_wiedereinstieg',
'Datum Wiedereinstieg',
- 'required|callback_isValidDate|callback_isDateInFuture',
+ 'required|is_valid_date|callback_isDateInFuture',
[
- 'isValidDate' => $this->p->t('ui', 'error_invalid_date'),
+ 'is_valid_date' => $this->p->t('ui', 'error_invalid_date'),
'isDateInFuture' => $this->p->t('ui', 'error_invalid_date')
]
);
@@ -209,18 +209,9 @@ class Unterbrechung extends FHCAPI_Controller
$this->terminateWithSuccess(getData($result));
}
- public function isValidDate($date)
- {
- try {
- new DateTime($date);
- } catch (Exception $e) {
- return false;
- }
- return true;
- }
-
public function isDateInFuture($date)
{
return new DateTime() < new DateTime($date);
}
}
+
diff --git a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
new file mode 100644
index 000000000..def4f6502
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
@@ -0,0 +1,459 @@
+ ['admin:r', 'assistenz:r'],
+ 'loadAbschlusspruefung' => ['admin:r', 'assistenz:r'],
+ 'insertAbschlusspruefung' => ['admin:rw', 'assistenz:rw'],
+ 'updateAbschlusspruefung' => ['admin:rw', 'assistenz:rw'],
+ 'deleteAbschlusspruefung' => ['admin:rw', 'assistenz:rw'],
+ 'getTypenAbschlusspruefung' => ['admin:rw', 'assistenz:rw'],
+ 'getNoten' => ['admin:rw', 'assistenz:rw'],
+ 'getTypenAntritte' => ['admin:rw', 'assistenz:rw'],
+ 'getBeurteilungen' => ['admin:rw', 'assistenz:rw'],
+ 'getAkadGrade' => ['admin:rw', 'assistenz:rw'],
+ 'getMitarbeiter' => ['admin:rw', 'assistenz:rw'],
+ 'getPruefer' => ['admin:rw', 'assistenz:rw'],
+ 'getTypStudiengang' => ['admin:rw', 'assistenz:rw'],
+ 'checkForExistingExams' => ['admin:rw', 'assistenz:rw'],
+ ]);
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+ $this->load->library('form_validation');
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui',
+ 'person',
+ 'abschlusspruefung'
+ ]);
+
+ // 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)
+ {
+ $result = $this->AbschlusspruefungModel->getAbschlusspruefungForPrestudent($student_uid);
+
+ if (isError($result)) {
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ }
+
+ $this->terminateWithSuccess((getData($result) ?: []));
+ }
+
+ public function loadAbschlusspruefung()
+ {
+ $abschlusspruefung_id = $this->input->post('id');
+
+ $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');
+ $this->AbschlusspruefungModel->addJoin('public.tbl_person p2', 'ON (p2.person_id = lehre.tbl_abschlusspruefung.pruefer2)', 'LEFT');
+ $this->AbschlusspruefungModel->addJoin('public.tbl_person p3', 'ON (p3.person_id = lehre.tbl_abschlusspruefung.pruefer3)', 'LEFT');
+ $result = $this->AbschlusspruefungModel->loadWhere(
+ array('abschlusspruefung_id' => $abschlusspruefung_id)
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(current($data));
+ }
+
+ public function getTypenAbschlusspruefung()
+ {
+ $this->load->model('education/Pruefungstyp_model', 'PruefungstypModel');
+
+ $result = $this->PruefungstypModel->loadWhere(
+ array('abschluss' => true)
+ );
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getTypenAntritte()
+ {
+ $this->load->model('education/Pruefungsantritt_model', 'PruefungsantrittModel');
+
+ $result = $this->PruefungsantrittModel->load();
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getBeurteilungen()
+ {
+ $this->load->model('education/Abschlussbeurteilung_model', 'AbschlussbeurteilungModel');
+
+ $result = $this->AbschlussbeurteilungModel->load();
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getAkadGrade()
+ {
+ $studiengang_kz= $this->input->post('studiengang_kz');
+
+
+ $this->load->model('education/Akadgrad_model', 'AkadgradModel');
+
+ $result = $this->AkadgradModel->loadWhere(
+ array('studiengang_kz' => $studiengang_kz)
+ );
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getTypStudiengang()
+ {
+ $studiengang_kz= $this->input->post('studiengang_kz');
+
+ /* 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')
+ ]);
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }*/
+
+
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $result = $this->StudiengangModel->loadWhere(
+ array('studiengang_kz' => $studiengang_kz)
+ );
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $typStudiengang = current($data)->typ;
+
+ $this->terminateWithSuccess($typStudiengang);
+ }
+
+ public function getMitarbeiter()
+ {
+ $searchString = $this->input->get('searchString') ?? '';
+
+ $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
+
+ $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'mitAkadGrad');
+
+ if (isError($result)) {
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess($result ?: []);
+ }
+
+ public function getPruefer()
+ {
+ $searchString = $this->input->get('searchString') ?? '';
+
+ $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
+
+ $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid');
+
+ if (isError($result)) {
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+
+ $this->terminateWithSuccess($result ?: []);
+ }
+
+ public function getNoten()
+ {
+ $this->load->model('education/Note_model', 'NoteModel');
+
+ $this->NoteModel->addOrder('note', 'ASC');
+ $result = $this->NoteModel->load();
+
+ if (isError($result)) {
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ }
+ return $this->terminateWithSuccess(getData($result) ?: []);
+ }
+
+ public function insertAbschlusspruefung()
+ {
+ $this->load->library('form_validation');
+
+ $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);
+ }
+
+ $formData = $this->input->post('formData');
+
+ $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'])
+ ]);
+
+ $this->form_validation->set_rules('datum', 'Datum', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Datum'])
+ ]);
+
+ $this->form_validation->set_rules('sponsion', 'Sponsion', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Sponsion'])
+ ]);
+
+ if ($this->form_validation->run() == false)
+ {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }
+
+ $result = $this->AbschlusspruefungModel->insert([
+ 'student_uid' => $student_uid,
+ '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()
+ ]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function updateAbschlusspruefung()
+ {
+ $this->load->library('form_validation');
+
+ $abschlusspruefung_id = $this->input->post('id');
+
+ if(!$abschlusspruefung_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Abschlussprüfung ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ $formData = $this->input->post('formData');
+ $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'])
+ ]);
+
+ $this->form_validation->set_rules('datum', 'Datum', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Datum'])
+ ]);
+
+ $this->form_validation->set_rules('sponsion', 'Sponsion', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Sponsion'])
+ ]);
+
+
+ if ($this->form_validation->run() == false)
+ {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }
+
+ $result = $this->AbschlusspruefungModel->update(
+ [
+ 'abschlusspruefung_id' => $abschlusspruefung_id
+ ],
+ [
+ '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()
+ ]
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function deleteAbschlusspruefung()
+ {
+ $abschlusspruefung_id = $this->input->post('id');
+
+ $result = $this->AbschlusspruefungModel->delete(
+ array('abschlusspruefung_id' => $abschlusspruefung_id)
+ );
+
+ if (isError($result))
+ {
+ return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ if (!hasData($result))
+ {
+ $this->outputJson($result);
+ }
+ return $this->terminateWithSuccess(current(getData($result)) ? : null);
+ }
+
+ public function checkForExistingExams()
+ {
+ $warning = false;
+ $output = [];
+
+ $student_uids = $this->input->post('uids');
+
+ if (empty($student_uids)) {
+ throw new InvalidArgumentException("Keine UID(s) übergeben.");
+ }
+
+ if( !is_array($student_uids) )
+ {
+ $student_uids = array($student_uids);
+ }
+
+ foreach ($student_uids as $uid)
+ {
+ $result = $this->AbschlusspruefungModel->loadWhere(
+ array('student_uid' => $uid)
+ );
+ if (isError($result)) {
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ }
+ if (!hasData($result))
+ {
+ $warning = true;
+ $output[] = $uid;
+ }
+ }
+ if($warning)
+ {
+ $uids = is_array($output) ? implode(", ", $output) : $output;
+ return $this->terminateWithError($this->p->t('abschlusspruefung', 'error_studentOhneFinalExam', ['id'=> $uids]), self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess('step3');
+ }
+}
diff --git a/application/controllers/api/frontend/v1/stv/Address.php b/application/controllers/api/frontend/v1/stv/Address.php
index 7685fcd04..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()
@@ -45,7 +50,7 @@ class Address extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
- public function getPlaces($plz)
+ public function getPlaces($plz = null)
{
$this->load->model('codex/Gemeinde_model', 'GemeindeModel');
@@ -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', '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..437ba42ad
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php
@@ -0,0 +1,457 @@
+ ['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');
+ $this->load->model('organisation/Studienplan_model', 'StudienplanModel');
+ $this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ }
+
+ public function getAufnahmetermine($person_id)
+ {
+ $result = $this->ReihungstestModel->getReihungstestPerson($person_id);
+ $arrayRt = $this->getDataOrTerminateWithError($result);
+
+ foreach ($arrayRt as $item) {
+ //Studienplan
+ $result = $this->StudienplanModel->loadWhere([
+ 'studienplan_id' => $item->studienplan_id
+ ]);
+ $data = $this->getDataOrTerminateWithError($result);
+ $studienordnung_id_ber = current($data)->studienordnung_id;
+
+ //Studienordnung
+ $result = $this->StudienordnungModel->loadWhere([
+ 'studienordnung_id' => $studienordnung_id_ber
+ ]);
+ $data = $this->getDataOrTerminateWithError($result);
+ $studiengang_kz_ber = current($data)->studiengang_kz;
+
+ //Studiengang von studiengang_kz_ber
+ $result = $this->StudiengangModel->load($studiengang_kz_ber);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $studiengangkurzbzlang_ber = current($data)->kurzbzlang;
+ $typ_ber = current($data)->typ;
+
+ //add to Array
+ $item->studiengang_kz_ber = $studiengang_kz_ber;
+ $item->studiengangkurzbzlang_ber = $studiengangkurzbzlang_ber;
+ $item->studiengangtyp_ber = $typ_ber;
+ }
+ $this->terminateWithSuccess($arrayRt);
+ }
+
+ 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'
+ )
+ );
+
+ //check if existing placementtest
+ if(!hasData($result))
+ $this->terminateWithSuccess([]);
+ else
+ $data = getData($result);
+
+ $studienplan_arr = [];
+ $include_ids = [];
+ foreach ($data as $item)
+ {
+ if($item->studienplan_id != null)
+ $studienplan_arr[] = $item->studienplan_id;
+ }
+ if(!hasData($studienplan_arr))
+ $this->terminateWithSuccess([]);
+
+ //get Placementtests Person
+ $person_id = $this->_getPersonId($prestudent_id);
+ $resultRt = $this->ReihungstestModel->getReihungstestPerson($person_id);
+
+ //check if existing placementtest
+ if(!hasData($result))
+ $this->terminateWithSuccess([]);
+ else
+ $dataRt = getData($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');
+ $has_excluded_gebiete = $this->input->get('hasExcludedAreas');
+
+ 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, 1);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $weightedArray = [];
+ $basis_gebiet_id_arr = [];
+ $basis_gebiet_id_toString = '';
+ foreach ($data as $abl)
+ {
+ $weightedArray[$abl->gebiet_id] = $abl->gewicht;
+ $basis_gebiet_id_arr[]= $abl->gebiet_id;
+ }
+ $basis_gebiet_id_toString = implode(', ', $basis_gebiet_id_arr);
+
+ $result = $this->ReihungstestModel->getReihungstestErgebnisPerson(
+ $person_id,
+ $punkte,
+ $reihungstest_id,
+ $weightedArray,
+ $has_excluded_gebiete,
+ $basis_gebiet_id_toString
+ );
+ $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 c28c49485..bc1fbebfe 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']
]);
@@ -44,24 +47,280 @@ class Config extends FHCAPI_Controller
'person',
'lehre',
'stv',
- 'konto'
+ 'konto',
+ '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',
+ 'default' => 'all'
+ ],
+ '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',
+ 'default' => 'all'
+ ],
+ '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 = [];
+ $config = $this->config->item('tabs');
+
$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')
@@ -69,15 +328,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'),
@@ -89,28 +356,113 @@ 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
];
- /* TODO(chris): Ausgeblendet für Testing
+ $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,
+ 'edit' => 'both', // Possible values: both|header|inline
+ 'delete' => 'both', // Possible values: both|header|inline
+ 'documents' => 'both', // Possible values: both|header|inline
+ 'documentslist' => $this->gradesDocumentsList()
+ ]
+ ];
+
+ $result['exam'] = [
+ 'title' => $this->p->t('stv', 'tab_exam'),
+ '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' => 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' => 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()
{
$result = [];
+ $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'),
@@ -120,9 +472,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'),
@@ -131,12 +488,46 @@ class Config extends FHCAPI_Controller
'changeStatusToAbsolvent' => $this->permissionlib->isBerechtigt('admin')
]
];
+ $result['finalexam'] = [
+ '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()
@@ -230,4 +621,216 @@ class Config extends FHCAPI_Controller
]
] + $this->kontoColumns();
}
+
+ /**
+ * Helper function to generate the default documentslist config for the
+ * grades tab.
+ *
+ * The resulting array consists of elements which are associative arrays
+ * that can have the following entries:
+ * title (required) on the first level this can be HTML code.
+ * permissioncheck (optional) an URL to an FHCAPI endpoint which returns
+ * true or false.
+ * link (optional) an URL that will be called if "action" and
+ * "children" are not defined.
+ * action (optional) an associative array that describes an
+ * POST action that will be called if "children" is
+ * not defined.
+ * It can have the following entries:
+ * - url (required) an URL to an FHCAPI endpoint.
+ * - post (optional) an associative array with the POST data to
+ * be sent.
+ * - response (optional) a string that will be displayed on success.
+ * children (optional) an array of child elements
+ *
+ * All strings that start with { and end with } in the URLs and the
+ * actions post parameter will be replaced with the corresponding
+ * attribute of the current dataset (e.G: {uid} will be replaced with the
+ * uid of the current dataset)
+ *
+ * @return array
+ */
+ protected function gradesDocumentsList()
+ {
+ $permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}");
+
+ $title_ger = $this->p->t("global", "deutsch");
+ $title_eng = $this->p->t("global", "englisch");
+ $title_ff = $this->p->t("stv", "document_certificate");
+ $title_lv = $this->p->t("stv", "document_coursecertificate");
+
+ $link_ff = "documents/export/" .
+ "zertifikat.rdf.php/" .
+ "Zertifikat" .
+ "?stg_kz={studiengang_kz_lv}" .
+ "&uid={uid}" .
+ "&ss={studiensemester_kurzbz}" .
+ "&lvid={lehrveranstaltung_id}";
+ $link_lv_ger = "documents/export/" .
+ "lehrveranstaltungszeugnis.rdf.php/" .
+ "LVZeugnis" .
+ "?stg_kz={studiengang_kz}" .
+ "&uid={uid}" .
+ "&ss={studiensemester_kurzbz}" .
+ "&lvid={lehrveranstaltung_id}";
+ $link_lv_eng = "documents/export/" .
+ "lehrveranstaltungszeugnis.rdf.php/" .
+ "LVZeugnisEng" .
+ "?stg_kz={studiengang_kz}" .
+ "&uid={uid}" .
+ "&ss={studiensemester_kurzbz}" .
+ "&lvid={lehrveranstaltung_id}";
+
+ $archive_url = "api/frontend/v1/documents/archiveSigned";
+ $archive_response = $this->p->t("stv", "document_signed_and_archived");
+ $archive_post_ff = [
+ "xml" => "zertifikat.rdf.php",
+ "xsl" => "Zertifikat",
+ "stg_kz" => "{studiengang_kz_lv}",
+ "uid" => "{uid}",
+ "ss" => "{studiensemester_kurzbz}",
+ "lvid" => "{lehrveranstaltung_id}"
+ ];
+ $archive_post_lv_ger = [
+ "xml" => "lehrveranstaltungszeugnis.rdf.php",
+ "xsl" => "LVZeugnis",
+ "stg_kz" => "{studiengang_kz}",
+ "uid" => "{uid}",
+ "ss" => "{studiensemester_kurzbz}",
+ "lvid" => "{lehrveranstaltung_id}"
+ ];
+ $archive_post_lv_eng = [
+ "xml" => "lehrveranstaltungszeugnis.rdf.php",
+ "xsl" => "LVZeugnisEng",
+ "stg_kz" => "{studiengang_kz}",
+ "uid" => "{uid}",
+ "ss" => "{studiensemester_kurzbz}",
+ "lvid" => "{lehrveranstaltung_id}"
+ ];
+
+ $list = [
+ [
+ 'title' => ' ',
+ 'children' => [
+ [
+ 'title' => $title_ff,
+ 'link' => site_url($link_ff)
+ ],
+ [
+ 'title' => $title_lv,
+ 'children' => [
+ [
+ 'title' => $title_ger,
+ 'link' => site_url($link_lv_ger),
+ 'children' => [
+ [
+ 'title' => 'PDF',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_ger)
+ ],
+ [
+ 'title' => 'DOC',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_ger . "&output=doc")
+ ],
+ [
+ 'title' => 'ODT',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_ger . "&output=odt")
+ ]
+ ]
+ ],
+ [
+ 'title' => $title_eng,
+ 'link' => site_url($link_lv_eng),
+ 'children' => [
+ [
+ 'title' => 'PDF',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_eng)
+ ],
+ [
+ 'title' => 'DOC',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_eng . "&output=doc")
+ ],
+ [
+ 'title' => 'ODT',
+ 'permissioncheck' => $permissioncheck,
+ 'link' => site_url($link_lv_eng . "&output=odt")
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ],
+ [
+ 'title' => ' ',
+ 'children' => [
+ [
+ 'title' => $title_ff,
+ 'action' => [
+ 'url' => site_url($archive_url),
+ 'post' => $archive_post_ff,
+ 'response' => $archive_response
+ ]
+ ],
+ [
+ 'title' => $title_lv,
+ 'children' => [
+ [
+ 'title' => $title_ger,
+ 'action' => [
+ 'url' => site_url($archive_url),
+ 'post' => $archive_post_lv_ger,
+ 'response' => $archive_response
+ ]
+ ],
+ [
+ 'title' => $title_eng,
+ 'action' => [
+ 'url' => site_url($archive_url),
+ 'post' => $archive_post_lv_eng,
+ 'response' => $archive_response
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ];
+
+ return $list;
+ }
+
+ /**
+ * Sort tab list
+ *
+ * @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..b8c7830bd
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Dokumente.php
@@ -0,0 +1,994 @@
+ ['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);
+ if(!(is_array($data) && count($data) > 0))
+ {
+ return null;
+ }
+ $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 8d7a6cd14..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()
@@ -48,7 +46,7 @@ class Favorites extends FHCAPI_Controller
if (!$data)
$this->terminateWithSuccess(null);
else
- $this->terminateWithSuccess($data['stv_favorites']);
+ $this->terminateWithSuccess($data['stv_favorites'] ?? null);
}
public function set()
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
new file mode 100644
index 000000000..128316d2b
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Grades.php
@@ -0,0 +1,700 @@
+.
+ */
+
+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 grades
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Grades extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'list' => 'student/noten:r',
+ 'getCertificate' => 'student/noten:r',
+ 'getTeacherProposal' => 'student/noten:r',
+ 'getRepeaterGrades' => 'student/noten:r',
+ 'updateCertificate' => ['admin:w', 'assistenz:w'],
+ 'deleteCertificate' => ['admin:w', 'assistenz:w'],
+ 'copyTeacherProposalToCertificate' => 'student/noten:w',
+ 'copyRepeaterGradeToCertificate' => 'student/noten:w',
+ 'getGradeFromPoints' => 'student/noten:r'
+ ]);
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ // Load Phrases
+ $this->loadPhrases([
+ 'stv',
+ 'person',
+ 'lehre'
+ ]);
+ }
+
+ /**
+ * List all possible grades
+ * (Entries in lehre.tbl_note)
+ *
+ * @return void
+ */
+ public function list()
+ {
+ $this->load->model('codex/Note_model', 'NoteModel');
+
+ $this->NoteModel->addOrder('notenwert', 'ASC');
+ $this->NoteModel->addOrder('bezeichnung', 'ASC');
+
+ $result = $this->NoteModel->load();
+
+ $grades = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($grades);
+ }
+
+ /**
+ * List grades for the certificate of a prestudent.
+ * (Entries in lehre.tbl_zeugnisnote)
+ *
+ * @param string $prestudent_id
+ * @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, $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
+ ]);
+
+ $student = $this->getDataOrTerminateWithError($result);
+ if (!$student)
+ $this->terminateWithSuccess([]);
+
+ $student_uid = current($student)->student_uid;
+
+ 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);
+
+ $this->terminateWithSuccess($grades);
+ }
+
+ /**
+ * List grades of a prestudent that teachers gave.
+ * (Entries in campus.tbl_lvgesamtnote)
+ *
+ * @param string $prestudent_id
+ * @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, $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
+ ]);
+
+ $student = $this->getDataOrTerminateWithError($result);
+ if (!$student)
+ $this->terminateWithSuccess([]);
+
+
+ $student_uid = current($student)->student_uid;
+
+ 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);
+
+ $this->terminateWithSuccess($grades);
+ }
+
+ /**
+ * List grades of a prestudent that an assistant marked as already done
+ * or as not allowed because of the repeating of a semester.
+ *
+ * @param string $prestudent_id
+ * @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, $studiensemester_kurzbz = false)
+ {
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ $this->load->library('AntragLib');
+
+ 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);
+
+ $this->terminateWithSuccess($grades);
+ }
+
+ /**
+ * Update or Insert a grade for the certificate of a prestudent.
+ * (Entry in lehre.tbl_zeugnisnote)
+ *
+ * @return void
+ */
+ public function updateCertificate()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer");
+ $this->form_validation->set_rules("student_uid", $this->p->t('person', 'student'), "required");
+ $this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t('lehre', 'studiensemester'), "required");
+ $this->form_validation->set_rules('note', $this->p->t('lehre', 'note'), 'required|numeric');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+
+ $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
+ $student_uid = $this->input->post('student_uid');
+ $lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id');
+ $note = $this->input->post('note');
+ $authUID = getAuthUID();
+ $now = date('c');
+
+ // NOTE(chris): Stg Permissions
+ if (!$this->hasPermissionUpdate($lehrveranstaltung_id, $student_uid))
+ return $this->_outputAuthError([$this->router->method => ['admin', 'assistenz']]);
+
+ $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+
+ $result = $this->ZeugnisnoteModel->load([
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'student_uid' => $student_uid,
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id
+ ]);
+ $current = $this->getDataOrTerminateWithError($result);
+
+ if ($current) {
+ $result = $this->ZeugnisnoteModel->update([
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'student_uid' => $student_uid,
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id
+ ], [
+ 'note' => $note,
+ 'benotungsdatum' => $now,
+ 'updateamum' => $now,
+ 'updatevon' => $authUID
+ ]);
+ } else {
+ $result = $this->ZeugnisnoteModel->insert([
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'student_uid' => $student_uid,
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id,
+ 'note' => $note,
+ 'benotungsdatum' => $now,
+ 'insertamum' => $now,
+ 'insertvon' => $authUID
+ ]);
+ }
+ $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(true);
+ }
+
+ /**
+ * Delete a grade from the certificate of a prestudent.
+ * (Entry in lehre.tbl_zeugnisnote)
+ *
+ * @return void
+ */
+ public function deleteCertificate()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer");
+ $this->form_validation->set_rules("student_uid", $this->p->t('person', 'student'), "required");
+ $this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t('lehre', 'studiensemester'), "required");
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+
+ $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
+ $student_uid = $this->input->post('student_uid');
+ $lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id');
+
+ // NOTE(chris): Stg Permissions
+ if (!$this->hasPermissionDelete($lehrveranstaltung_id, $student_uid))
+ return $this->_outputAuthError([$this->router->method => ['admin', 'assistenz']]);
+
+ $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+
+ $result = $this->ZeugnisnoteModel->delete([
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'student_uid' => $student_uid,
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id
+ ]);
+ $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(true);
+ }
+
+ /**
+ * Copy a grade that teachers gave to the certificate of a prestudent.
+ * (Entry in campus.tbl_lvgesamtnote to an entry in lehre.tbl_zeugnisnote)
+ *
+ * @return void
+ */
+ public function copyTeacherProposalToCertificate()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer");
+ $this->form_validation->set_rules("student_uid", $this->p->t('person', 'student'), "required");
+ $this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t('lehre', 'studiensemester'), "required");
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id');
+ $student_uid = $this->input->post('student_uid');
+ $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
+ $authUID = getAuthUID();
+
+ // NOTE(chris): Stg Permissions
+ if (!$this->hasPermissionCopy($lehrveranstaltung_id, $student_uid))
+ return $this->_outputAuthError([$this->router->method => 'student/noten']);
+
+ $this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel');
+
+ $result = $this->LvgesamtnoteModel->load([
+ 'student_uid' => $student_uid,
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id
+ ]);
+ $teacherGrade = $this->getDataOrTerminateWithError($result);
+
+ if (!$teacherGrade)
+ show_404();
+
+ $teacherGrade = current($teacherGrade);
+
+ $data = [
+ 'note' => $teacherGrade->note,
+ 'punkte' => $teacherGrade->punkte,
+ 'uebernahmedatum' => date('c'),
+ 'benotungsdatum' => $teacherGrade->benotungsdatum,
+ 'bemerkung' => $teacherGrade->bemerkung
+ ];
+
+ $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+
+ $this->ZeugnisnoteModel->addJoin('lehre.tbl_note n', 'note');
+ $result = $this->ZeugnisnoteModel->load([
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'student_uid' => $student_uid,
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id
+ ]);
+ $certificateGrade = $this->getDataOrTerminateWithError($result);
+
+ if ($certificateGrade) {
+ $certificateGrade = current($certificateGrade);
+
+ if (!$certificateGrade->lkt_ueberschreibbar)
+ $this->terminateWithError($this->p->t("stv", "grades_error_overwrite"));
+
+ // NOTE(chris): update
+ $data['updateamum'] = $data['uebernahmedatum'];
+ $data['updatevon'] = $authUID;
+
+ $this->ZeugnisnoteModel->update([
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'student_uid' => $student_uid,
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id
+ ], $data);
+ } else {
+ // NOTE(chris): insert
+ $data['insertamum'] = $data['uebernahmedatum'];
+ $data['insertvon'] = $authUID;
+ $data['lehrveranstaltung_id'] = $lehrveranstaltung_id;
+ $data['student_uid'] = $student_uid;
+ $data['studiensemester_kurzbz'] = $studiensemester_kurzbz;
+
+ $this->ZeugnisnoteModel->insert($data);
+
+ if (defined('FAS_PRUEFUNG_BEI_NOTENEINGABE_ANLEGEN')
+ && FAS_PRUEFUNG_BEI_NOTENEINGABE_ANLEGEN) {
+ $result = $this->addTestsForGrade(
+ $studiensemester_kurzbz,
+ $student_uid,
+ $lehrveranstaltung_id,
+ $teacherGrade->note,
+ $teacherGrade->punkte
+ );
+ $this->getDataOrTerminateWithError($result);
+ }
+ }
+
+
+ $this->terminateWithSuccess(true);
+ }
+
+ /**
+ * Copy a grade that was marked by an assistant as already done or not
+ * allowed because of the repeating of a semester to the certificate of a
+ * prestudent.
+ *
+ * @return void
+ */
+ public function copyRepeaterGradeToCertificate()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules("studierendenantrag_lehrveranstaltung_id", "studierendenantrag_lehrveranstaltung_id", "required|integer");
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $id = $this->input->post('studierendenantrag_lehrveranstaltung_id');
+ $authUID = getAuthUID();
+
+ $this->load->model('education/Studierendenantraglehrveranstaltung_model', 'StudierendenantraglehrveranstaltungModel');
+
+ $this->StudierendenantraglehrveranstaltungModel->addSelect("tbl_studierendenantrag_lehrveranstaltung.*");
+ $this->StudierendenantraglehrveranstaltungModel->addSelect("student_uid");
+ $this->StudierendenantraglehrveranstaltungModel->addJoin("campus.tbl_studierendenantrag", "studierendenantrag_id");
+ $this->StudierendenantraglehrveranstaltungModel->addJoin("public.tbl_student", "prestudent_id", "LEFT");
+
+ $result = $this->StudierendenantraglehrveranstaltungModel->load($id);
+ $repeaterGrade = $this->getDataOrTerminateWithError($result);
+
+ if (!$repeaterGrade)
+ show_404();
+
+ $repeaterGrade = current($repeaterGrade);
+
+ // NOTE(chris): Stg Permissions
+ if (!$this->hasPermissionCopy($repeaterGrade->lehrveranstaltung_id, $repeaterGrade->student_uid))
+ return $this->_outputAuthError([$this->router->method => 'student/noten']);
+
+ $data = [
+ 'note' => $repeaterGrade->note,
+ 'uebernahmedatum' => date('c'),
+ 'benotungsdatum' => $repeaterGrade->insertamum,
+ 'bemerkung' => $repeaterGrade->anmerkung
+ ];
+
+ $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+
+ $result = $this->ZeugnisnoteModel->load([
+ $repeaterGrade->studiensemester_kurzbz,
+ $repeaterGrade->student_uid,
+ $repeaterGrade->lehrveranstaltung_id
+ ]);
+ $certificateGrade = $this->getDataOrTerminateWithError($result);
+
+ if ($certificateGrade) {
+ // NOTE(chris): update
+ $data['updateamum'] = $data['uebernahmedatum'];
+ $data['updatevon'] = $authUID;
+
+ $this->ZeugnisnoteModel->update([
+ $repeaterGrade->studiensemester_kurzbz,
+ $repeaterGrade->student_uid,
+ $repeaterGrade->lehrveranstaltung_id
+ ], $data);
+ } else {
+ // NOTE(chris): insert
+ $data['insertamum'] = $data['uebernahmedatum'];
+ $data['insertvon'] = $authUID;
+ $data['lehrveranstaltung_id'] = $repeaterGrade->lehrveranstaltung_id;
+ $data['student_uid'] = $repeaterGrade->student_uid;
+ $data['studiensemester_kurzbz'] = $repeaterGrade->studiensemester_kurzbz;
+
+ $this->ZeugnisnoteModel->insert($data);
+ }
+
+
+ $this->terminateWithSuccess(true);
+ }
+
+ /**
+ * Loads the grade from the points using the gradingkey
+ *
+ * @return void
+ */
+ public function getGradeFromPoints()
+ {
+ $this->load->library('form_validation');
+
+ $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('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'),
+ $this->input->post('lehrveranstaltung_id'),
+ $studiensemester_kurzbz
+ );
+
+ $note = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($note);
+ }
+
+ /**
+ * Helper function that adds tests for a student
+ * (Entries in lehre.tbl_pruefung)
+ *
+ * @param string $studiensemester_kurzbz
+ * @param string $student_uid
+ * @param integer $lehrveranstaltung_id
+ * @param integer $note
+ * @param numeric $punkte
+ *
+ * @return stdClass
+ */
+ protected function addTestsForGrade($studiensemester_kurzbz, $student_uid, $lehrveranstaltung_id, $note, $punkte)
+ {
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+
+ // Get Lehreinheit
+ $result = $this->LehrveranstaltungModel->getLeByStudent($student_uid, $studiensemester_kurzbz, $lehrveranstaltung_id);
+
+ if (isError($result))
+ return $result;
+ if (!hasData($result))
+ return error($this->p->t("stv", "grades_error_lehreinheit_id"));
+ $le = current(getData($result));
+
+ // Prepare
+ $this->load->model('education/LePruefung_model', 'LePruefungModel');
+ $data = [
+ "student_uid" => $student_uid,
+ "lehreinheit_id" => $le->lehreinheit_id,
+ "datum" => date('Y-m-d'),
+ "pruefungstyp_kurzbz" => "Termin1",
+ "note" => $note
+ ];
+
+ if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE)
+ $data["punkte"] = $punkte;
+
+ // Get Anwesenheit
+ $this->load->model('education/Anwesenheit_model', 'AnwesenheitModel');
+ $result = $this->AnwesenheitModel->loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid, $lehrveranstaltung_id);
+ if (isError($result))
+ return $result;
+ $anwesenheit = getData($result);
+
+ if ($anwesenheit && (float)current($anwesenheit)->prozent < FAS_ANWESENHEIT_ROT) {
+ // Get Anwesenheitsbefreiung
+ $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
+ $result = $this->BenutzerfunktionModel->getBenutzerFunktionByUidInStdsem($student_uid, $studiensemester_kurzbz, 'awbefreit');
+
+ if (isError($result))
+ return $result;
+
+ $anwesenheitsbefreit = hasData($result);
+
+ // Wenn nicht Anwesenheitsbefreit und Anwesenheit unter einem bestimmten Prozentsatz fällt dann wird ein Pruefungsantritt abgezogen
+ if (!$anwesenheitsbefreit) {
+ $data2 = $data;
+ $data2["note"] = 7;
+ if (isset($data2["punkte"]))
+ unset($data2["punkte"]);
+
+ $result = $this->LePruefungModel->insert($data2);
+
+ if (isError($result))
+ return $result;
+
+ $data["pruefungstyp_kurzbz"] = "Termin2";
+ }
+ }
+
+ return $this->LePruefungModel->insert($data);
+ }
+
+ /**
+ * Helper function to check permissions for updateCertificate()
+ *
+ * @param integer $lehrveranstaltung_id
+ * @param string $student_uid
+ *
+ * @return boolean
+ */
+ protected function hasPermissionUpdate($lehrveranstaltung_id, $student_uid)
+ {
+ if ($lehrveranstaltung_id === null || $student_uid === null)
+ return true;
+
+ $this->load->model('crm/Student_model', 'StudentModel');
+
+ $result = $this->StudentModel->load([$student_uid]);
+ if (isError($result) || !hasData($result))
+ return false;
+
+ $student = current(getData($result));
+
+ if ($this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz))
+ return true;
+ if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz))
+ return true;
+
+ $this->load->model('organisation/Studienplan_model', 'StudienplanModel');
+
+ $result = $this->StudienplanModel->getAllOesForLv($lehrveranstaltung_id);
+ if (isError($result))
+ return false;
+
+ $oes = getData($result) ?: [];
+
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+
+ $result = $this->LehrveranstaltungModel->getStg($lehrveranstaltung_id);
+ if (isError($result))
+ return false;
+
+ if (hasData($result))
+ $oes[] = current(getData($result));
+
+ foreach ($oes as $oe) {
+ if ($this->permissionlib->isBerechtigt('admin', 'suid', $oe->oe_kurzbz))
+ return true;
+ if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $oe->oe_kurzbz))
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Helper function to check permissions for deleteCertificate()
+ *
+ * @param integer $lehrveranstaltung_id
+ * @param string $student_uid
+ *
+ * @return boolean
+ */
+ protected function hasPermissionDelete($lehrveranstaltung_id, $student_uid)
+ {
+ if ($lehrveranstaltung_id === null || $student_uid === null)
+ return true;
+
+ $this->load->model('crm/Student_model', 'StudentModel');
+
+ $result = $this->StudentModel->load([$student_uid]);
+ if (isError($result) || !hasData($result))
+ return false;
+
+ $student = current(getData($result));
+
+ if ($this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz))
+ return true;
+ if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz))
+ return true;
+
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+
+ $result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id);
+ if (isError($result) || !hasData($result))
+ return false;
+
+ $oe = current(getData($result));
+
+ if ($this->permissionlib->isBerechtigt('admin', 'suid', $oe->oe_kurzbz))
+ return true;
+ if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $oe->oe_kurzbz))
+ return true;
+
+ return false;
+ }
+
+ /**
+ * Helper function to check permissions for
+ * copyTeacherProposalToCertificate() and copyRepeaterGradeToCertificate()
+ *
+ * @param integer $lehrveranstaltung_id
+ * @param string $student_uid
+ *
+ * @return boolean
+ */
+ protected function hasPermissionCopy($lehrveranstaltung_id, $student_uid)
+ {
+ if ($lehrveranstaltung_id === null || $student_uid === null)
+ return true;
+
+ $this->load->model('crm/Student_model', 'StudentModel');
+
+ $result = $this->StudentModel->load([$student_uid]);
+ if (isError($result) || !hasData($result))
+ return false;
+
+ $student = current(getData($result));
+
+ if ($this->permissionlib->isBerechtigt('student/noten', 'suid', $student->studiengang_kz))
+ return true;
+
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+
+ $result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id);
+ if (isError($result) || !hasData($result))
+ return false;
+
+ $oe = current(getData($result));
+
+ if ($this->permissionlib->isBerechtigt('student/noten', 'suid', $oe->oe_kurzbz))
+ return true;
+
+ return false;
+ }
+}
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 379184ee0..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'
@@ -97,7 +103,14 @@ class Kontakt extends FHCAPI_Controller
|| $this->router->method == 'deleteContact'
|| $this->router->method == 'deleteBankverbindung'
) {
- $id = current(array_slice($this->uri->rsegments, 2));
+ if($this->input->post('address_id'))
+ $id = $this->input->post('address_id');
+ if($this->input->post('adresse_id'))
+ $id = $this->input->post('adresse_id');
+ if($this->input->post('bankverbindung_id'))
+ $id = $this->input->post('bankverbindung_id');
+ if($this->input->post('kontakt_id'))
+ $id = $this->input->post('kontakt_id');
$model = 'person/Adresse_model';
if ($this->router->method == 'loadContact'
@@ -112,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);
@@ -120,12 +136,17 @@ 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)
{
- $this->AdresseModel->addSelect('public.tbl_adresse.*');
+ $this->AdresseModel->addSelect("public.tbl_adresse.*,
+ (CASE
+ WHEN public.tbl_adresse.updateamum >= public.tbl_adresse.insertamum
+ THEN public.tbl_adresse.updateamum
+ ELSE public.tbl_adresse.insertamum
+ END) AS lastUpdate");
$this->AdresseModel->addSelect('t.*');
$this->AdresseModel->addSelect('f.firma_id');
$this->AdresseModel->addSelect('f.name as firmenname');
@@ -143,15 +164,26 @@ class Kontakt extends FHCAPI_Controller
public function addNewAddress($person_id)
{
- $this->form_validation->set_rules('plz', 'PLZ', 'required|numeric', [
+ $this->form_validation->set_data(['address.plz' => $_POST['plz']]);
+
+ $this->form_validation->set_rules('address.plz', 'PLZ', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']),
- 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ'])
]);
- if(isset($_POST['gemeinde']) && isset($_POST['ort']))
- $this->form_validation->set_rules('plz', 'Postleitzahl', 'callback_validateLocationCombination', [
- 'validateLocationCombination' => $this->p->t('ui', 'error_location_combination')
- ]);
+ if(isset($_POST['nation']) && $_POST['nation'] == 'A')
+ {
+ $this->form_validation->set_rules('address.plz', 'PLZ', 'required|numeric', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']),
+ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ'])
+ ]);
+ }
+
+ if(isset($_POST['gemeinde']) && isset($_POST['ort']) && isset($_POST['nation']) && $_POST['nation'] == 'A')
+ {
+ $this->form_validation->set_rules('address.plz', 'Postleitzahl', 'callback_validateLocationCombination', [
+ 'validateLocationCombination' => $this->p->t('ui', 'error_location_combination')
+ ]);
+ }
if ($this->form_validation->run() == false)
{
@@ -167,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(
[
@@ -196,25 +222,37 @@ class Kontakt extends FHCAPI_Controller
]
);
- if (isError($result))
- {
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
- return $this->outputJsonSuccess(true);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
}
- public function updateAddress($address_id)
+ public function updateAddress()
{
+ $address_id = $this->input->post('adresse_id');
+
+ $this->form_validation->set_data(['address.plz' => $_POST['plz']]);
+
$uid = getAuthUID();
- $this->form_validation->set_rules('plz', 'PLZ', 'required|numeric', [
+
+ $this->form_validation->set_rules('address.plz', 'PLZ', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']),
- 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ'])
]);
- if(isset($_POST['gemeinde']) && isset($_POST['ort']))
- $this->form_validation->set_rules('plz', 'Postleitzahl', 'callback_validateLocationCombination', [
+ if(isset($_POST['nation']) && $_POST['nation'] == 'A')
+ {
+ $this->form_validation->set_rules('address.plz', 'PLZ', 'required|numeric', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']),
+ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ'])
+ ]);
+ }
+
+ if(isset($_POST['gemeinde']) && isset($_POST['ort']) && isset($_POST['nation']) && $_POST['nation'] == 'A')
+ {
+ $this->form_validation->set_rules('address.plz', 'Postleitzahl', 'callback_validateLocationCombination', [
'validateLocationCombination' => $this->p->t('ui', 'error_location_combination')
]);
+ }
if ($this->form_validation->run() == false)
{
@@ -228,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;
@@ -248,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(
[
@@ -272,15 +300,15 @@ class Kontakt extends FHCAPI_Controller
]
);
- if (isError($result))
- {
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
- return $this->outputJsonSuccess(true);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
}
- public function loadAddress($adresse_id)
+ public function loadAddress()
{
+ $adresse_id = $this->input->post('address_id');
+
$this->load->model('person/Adresse_model', 'AdresseModel');
$this->AdresseModel->addSelect('public.tbl_adresse.*');
@@ -306,8 +334,10 @@ class Kontakt extends FHCAPI_Controller
$this->terminateWithSuccess(current(getData($result)) ? : null);
}
- public function deleteAddress($adresse_id)
+ public function deleteAddress()
{
+ $adresse_id = $this->input->post('address_id');
+
$this->load->model('person/Adresse_model', 'AdresseModel');
$result = $this->AdresseModel->load([
'adresse_id'=> $adresse_id,
@@ -350,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);
@@ -361,19 +394,25 @@ 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);
- if (isError($result)) {
- $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
- }
- $this->terminateWithSuccess($result ?: []);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $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);
@@ -386,15 +425,20 @@ class Kontakt extends FHCAPI_Controller
public function getKontakte($person_id)
{
$this->KontaktModel->addSelect("public.tbl_kontakt.*,
- TO_CHAR (CASE
- WHEN public.tbl_kontakt.updateamum >= public.tbl_kontakt.insertamum
- THEN public.tbl_kontakt.updateamum
- ELSE public.tbl_kontakt.insertamum
- END::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS lastUpdate, st.bezeichnung, f.name");
+ (CASE
+ WHEN public.tbl_kontakt.updateamum >= public.tbl_kontakt.insertamum
+ 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))
@@ -402,24 +446,23 @@ 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($kontakt_id)
+ public function loadContact()
{
+ $kontakt_id = $this->input->post('kontakt_id');
$this->load->model('person/Kontakt_model', 'KontaktModel');
$this->KontaktModel->addSelect('*, public.tbl_kontakt.*');
@@ -439,7 +482,6 @@ class Kontakt extends FHCAPI_Controller
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Kontakt_id']), self::ERROR_TYPE_GENERAL);
}
- // $this->outputJsonSuccess(current(getData($result)));
$this->terminateWithSuccess(current(getData($result)));
}
@@ -492,11 +534,12 @@ class Kontakt extends FHCAPI_Controller
{
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
- return $this->outputJsonSuccess(true);
+ $this->terminateWithSuccess($result);
}
- public function updateContact($kontakt_id)
+ public function updateContact()
{
+ $kontakt_id = $this->input->post('kontakt_id');
$this->load->model('person/Kontakt_model', 'KontaktModel');
if(!$kontakt_id)
@@ -523,13 +566,6 @@ class Kontakt extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
-/* if(isset($_POST['standort']))
- {
- $standort_id = $_POST['standort']['standort_id'];
- }
- else
- $standort_id = null;*/
-
$uid = getAuthUID();
$kontakttyp = $this->input->post('kontakttyp');
$anmerkung = $this->input->post('anmerkung');
@@ -538,8 +574,6 @@ class Kontakt extends FHCAPI_Controller
$person_id = $this->input->post('person_id');
$standort_id = $this->input->post('standort_id');
- //return $this->terminateWithError("in update " . $standort_id, self::ERROR_TYPE_GENERAL);
-
$result = $this->KontaktModel->update(
[
'kontakt_id' => $kontakt_id
@@ -550,22 +584,21 @@ 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
]
);
- if (isError($result))
- {
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
- return $this->outputJsonSuccess(true);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
}
- public function deleteContact($kontakt_id)
+ public function deleteContact()
{
+ $kontakt_id = $this->input->post('kontakt_id');
$this->load->model('person/Kontakt_model', 'KontaktModel');
$result = $this->KontaktModel->delete(
@@ -624,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(
[
@@ -631,27 +668,27 @@ 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
]
);
- if (isError($result))
- {
- return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
- }
- return $this->outputJsonSuccess(true);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
}
- public function loadBankverbindung($bankverbindung_id)
+ public function loadBankverbindung()
{
+ $bankverbindung_id = $this->input->post('bankverbindung_id');
+
$this->load->model('person/Bankverbindung_model', 'BankverbindungModel');
$this->BankverbindungModel->addSelect('*');
@@ -719,15 +756,15 @@ class Kontakt extends FHCAPI_Controller
]
);
- if (isError($result))
- {
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
- return $this->outputJsonSuccess(true);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
}
- public function deleteBankverbindung($bankverbindung_id)
+ public function deleteBankverbindung()
{
+ $bankverbindung_id = $this->input->post('bankverbindung_id');
+
$this->load->model('person/Bankverbindung_model', 'BankverbindungModel');
$result = $this->BankverbindungModel->delete(
@@ -740,7 +777,7 @@ class Kontakt extends FHCAPI_Controller
}
if (!hasData($result))
{
- $this->outputJson($result);
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Bankverbindung_id']), self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess(current(getData($result)) ? : null);
}
@@ -751,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/Stundenplan.php b/application/controllers/api/frontend/v1/stv/LvTermine.php
similarity index 53%
rename from application/controllers/api/frontend/v1/Stundenplan.php
rename to application/controllers/api/frontend/v1/stv/LvTermine.php
index c14ea4315..c29f56964 100644
--- a/application/controllers/api/frontend/v1/Stundenplan.php
+++ b/application/controllers/api/frontend/v1/stv/LvTermine.php
@@ -1,264 +1,137 @@
.
- */
if (! defined('BASEPATH')) exit('No direct script access allowed');
-class Stundenplan extends FHCAPI_Controller
-{
+use \DateTime as DateTime;
- /**
- * Object initialization
- */
+class LvTermine extends FHCAPI_Controller
+{
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,
+ 'getStundenplan' => ['admin:r', 'assistenz:r'],
+ 'getStudiensemester' => ['admin:r', 'assistenz:r'],
]);
- $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
-
- /**
- * 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
- *
- */
- //TODO: getStundenplan fuer Mitarbeiter anpassen
- 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
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
$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);
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui',
+ ]);
- $student_uid = getAuthUID();
- if(is_null($student_uid))
- {
- $this->terminateWithError("No UID");
- }
+ // Load models
+ $this->load->model('ressource/Stundenplan_model', 'StundenplanModel');
- $is_mitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter($student_uid));
- if($is_mitarbeiter)
- {
- $this->terminateWithError("Not possible to look at the Student Calendar as a Mitarbeiter");
- }
-
- $semester_range = $this->studienSemesterErmitteln($start_date,$end_date);
+ //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);
-
- // 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);
+
+ $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([]);
}
- $stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($stundenplan_query);
+
+ 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);
}
- // 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)
+ public function getStudiensemester()
{
- //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());
-
- // storing the get parameter in local variables
- $start_date = $this->input->get('start_date', TRUE);
- $end_date = $this->input->get('end_date', TRUE);
-
- // 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);
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ $this->StudiensemesterModel->addOrder('studienjahr_kurzbz', 'DESC');
+ $result = $this->StudiensemesterModel->load();
+ $data = $this->getDataOrTerminateWithError($result);
+ $this->terminateWithSuccess($data);
}
- 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);
- }
+ //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)
+ );
- // ################# Private Functions
-
- private function expand_object_information($data){
-
- foreach ($data as $item)
+ // if no studiensemester is found for the given timespan, get the nearest studiensemester
+ if(count($semester_range) == 0)
{
-
- $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;
+ $aktuelle_studiensemester = $this->StudiensemesterModel->getNearest();
+ $aktuelle_studiensemester = $this->getDataOrTerminateWithError($aktuelle_studiensemester);
+ if (count($aktuelle_studiensemester) == 0) {
+ $this->terminateWithError("No aktuelles semester");
}
-
- // 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;
- }
-
- $item->gruppe = $gruppe_obj_array;
- $item->lektor = $lektor_obj_array;
-
+ $aktuelle_studiensemester = current($aktuelle_studiensemester)->studiensemester_kurzbz;
+ // push aktuelles semester in active semester array
+ array_push($semester_range, $aktuelle_studiensemester);
}
+ return $semester_range;
}
- // function used to sort an array of studiensemester strings
- private function sortStudienSemester(&$semester_range){
+ //copied from Stundenplan.php
+ private function sortStudienSemester(&$semester_range)
+ {
usort(
$semester_range,
- function($first,$second)
- {
+ function ($first, $second) {
$sem_first = null;
$year_first = null;
$match_first = null;
@@ -267,9 +140,9 @@ class Stundenplan extends FHCAPI_Controller
$year_second = null;
$match_second = null;
- preg_match('/([WS]+)([0-9]+)/',$first,$match_first);
- preg_match('/([WS]+)([0-9]+)/',$second,$match_second);
-
+ 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]);
@@ -280,145 +153,29 @@ class Stundenplan extends FHCAPI_Controller
{
return -1;
}
- else if($year_first > $year_second)
+ elseif($year_first > $year_second)
{
return 1;
}
- else if($year_first == $year_second && $sem_first > $sem_second)
+ elseif($year_first == $year_second && $sem_first > $sem_second)
{
return 1;
}
- else if($year_first == $year_second && $sem_first < $sem_second)
+ elseif($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){
+ //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
+ 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:
@@ -446,7 +203,7 @@ class Stundenplan extends FHCAPI_Controller
/*
@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
+ 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:
@@ -483,26 +240,26 @@ class Stundenplan extends FHCAPI_Controller
]
]
*/
- $studienSemesterDateRanges=[];
+ $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));
-
+ $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);
+ 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 = 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');
+ $semester_start_ende->ende = date_format($summer_studiensemester_end_date, 'Y-m-d');
}
if (defined('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE') && LVPLAN_LOAD_UEBER_SEMESTERHAELFTE === true)
{
@@ -515,13 +272,13 @@ class Stundenplan extends FHCAPI_Controller
{
//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_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');
-
+ $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;
@@ -533,32 +290,119 @@ class Stundenplan extends FHCAPI_Controller
}
}
- private function studienSemesterErmitteln($start_date,$end_date){
-
- // gets all studiensemester from the student from start_date to end_date
- $semester_range = $this->StudiensemesterModel->getByDate($start_date,$end_date);
- $semester_range = array_map(
- function($sem)
+ //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)
{
- return $sem->studiensemester_kurzbz;
+ // 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;
},
- $this->getDataOrTerminateWithError($semester_range)
+ $benutzer_gruppen
);
- // 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;
+ 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
new file mode 100644
index 000000000..f61816086
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Mobility.php
@@ -0,0 +1,559 @@
+ ['admin:r', 'assistenz:r'],
+ 'loadMobility' => ['admin:r', 'assistenz:r'],
+ 'insertMobility' => ['admin:rw', 'assistenz:rw'],
+ 'updateMobility' => ['admin:rw', 'assistenz:rw'],
+ 'deleteMobility' => ['admin:rw', 'assistenz:rw'],
+ 'getProgramsMobility' => ['admin:r', 'assistenz:r'],
+ 'getLVList' => ['admin:r', 'assistenz:r'],
+ 'getAllLehreinheiten' => ['admin:r', 'assistenz:r'],
+ 'getLvsandLesByStudent' => ['admin:r', 'assistenz:r'],
+ 'getPurposes' => ['admin:r', 'assistenz:r'],
+ 'getSupports' => ['admin:r', 'assistenz:r'],
+ 'getListPurposes' => ['admin:r', 'assistenz:r'],
+ 'getListSupports' => ['admin:r', 'assistenz:r'],
+ 'deleteMobilityPurpose' => ['admin:r', 'assistenz:r'],
+ 'addMobilityPurpose' => ['admin:r', 'assistenz:r'],
+ 'deleteMobilitySupport' => ['admin:r', 'assistenz:r'],
+ 'addMobilitySupport' => ['admin:r', 'assistenz:r'],
+ ]);
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+ $this->load->library('form_validation');
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui',
+ 'mobility'
+ ]);
+
+ // 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->addOrder('von', 'DESC');
+ $this->BisioModel->addOrder('bis', 'DESC');
+ $this->BisioModel->addOrder('bisio_id', 'DESC');
+ $result = $this->BisioModel->loadWhere(
+ array('student_uid' => $student_uid)
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getProgramsMobility()
+ {
+ $this->load->model('codex/Mobilitaetsprogramm_model', 'MobilitaetsprogrammModel');
+
+ $result = $this->MobilitaetsprogrammModel->load();
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function insertMobility()
+ {
+ $this->load->library('form_validation');
+ $authUID = getAuthUID();
+
+ $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);
+ }
+
+ $formData = $this->input->post('formData');
+
+ $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'])
+ ]);
+ $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'])
+ ]);
+ $this->form_validation->set_rules('von', 'VonDatum', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum'])
+ ]);
+
+ $this->form_validation->set_rules('bis', 'VBisDatum', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VBisDatum'])
+ ]);
+
+ $this->form_validation->set_rules('ects_erworben', 'Ects_erworben', 'numeric', [
+ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_erworben'])
+ ]);
+
+ $this->form_validation->set_rules('ects_angerechnet', 'Ects_angerechnet', 'numeric', [
+ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_angerechnet'])
+ ]);
+
+ $this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'numeric', [
+ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit'])
+ ]);
+
+ if ($this->form_validation->run() == false)
+ {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }
+
+ $result = $this->BisioModel->insert([
+ 'student_uid' => $student_uid,
+ '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,
+ 'insertamum' => date('c'),
+ 'insertvon' => $authUID,
+ ]);
+
+ $bisio_id = $this->getDataOrTerminateWithError($result);
+
+ //check if localData (purposes)
+ if(count($localPurposes) > 0){
+ foreach ($localPurposes as $zweck){
+ $zweck = (int)$zweck;
+ $this->addMobilityPurpose($bisio_id, $zweck);
+ }
+ }
+
+ //check if localData (supports)
+ if(count($localSupports) > 0){
+ foreach ($localSupports as $support){
+ $this->addMobilitySupport($bisio_id, $support);
+ }
+ }
+
+ $this->terminateWithSuccess($bisio_id);
+ }
+
+ public function loadMobility($bisio_id)
+ {
+ $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');
+ $result = $this->BisioModel->loadWhere(
+ array('bisio_id' => $bisio_id)
+ );
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(current($data));
+ }
+
+ public function updateMobility()
+ {
+
+ $this->load->library('form_validation');
+ $authUID = getAuthUID();
+
+ $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);
+ }
+ $formData = $this->input->post('formData');
+
+ $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'])
+ ]);
+ $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'])
+ ]);
+ $this->form_validation->set_rules('von', 'VonDatum', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum'])
+ ]);
+
+ $this->form_validation->set_rules('bis', 'VBisDatum', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VBisDatum'])
+ ]);
+
+ $this->form_validation->set_rules('ects_erworben', 'Ects_erworben', 'numeric', [
+ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_erworben'])
+ ]);
+
+ $this->form_validation->set_rules('ects_angerechnet', 'Ects_angerechnet', 'numeric', [
+ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_angerechnet'])
+ ]);
+
+ $this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'numeric', [
+ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit'])
+ ]);
+
+ if ($this->form_validation->run() == false)
+ {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }
+
+ $result = $this->BisioModel->update(
+ [
+ 'bisio_id' => $formData['bisio_id']
+ ],
+ [
+ 'student_uid' => $student_uid,
+
+ '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,
+ ]
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(current($data));
+ }
+
+ public function deleteMobility()
+ {
+ $bisio_id = $this->input->post('bisio_id');
+
+ //check if entry in MobilityOnline extension exists
+ Events::trigger('mobility_delete', $bisio_id);
+
+ $result = $this->BisioModel->delete(
+ array('bisio_id' => $bisio_id)
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+ $this->terminateWithSuccess($data);
+
+ }
+
+ public function getLVList($studiengang_kz)
+ {
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+
+ $result = $this->LehrveranstaltungModel->getLvsByStudiengangkz($studiengang_kz);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getAllLehreinheiten()
+ {
+ $lv_id = $this->input->post('lv_id');
+ $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
+
+ $this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
+
+ $result = $this->LehreinheitModel->getLesFromLvIds($lv_id, $studiensemester_kurzbz);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getLvsandLesByStudent($student_uid)
+ {
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+
+ $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $lv_ids = array();
+ $allData = array();
+
+ foreach ($data as $lehrveranstaltung) {
+ $lv_ids[] = $lehrveranstaltung->lehrveranstaltung_id;
+ }
+
+ $this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
+
+ foreach ($lv_ids as $id)
+ {
+ $result = $this->LehreinheitModel->getLesFromLvIds($id);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if (is_array($data)) {
+ $allData = array_merge($allData, $data);
+ }
+ }
+
+ return $this->terminateWithSuccess($allData);
+ }
+
+ public function getPurposes($bisio_id)
+ {
+ $bisio_id = (int)$bisio_id;
+
+ $this->load->model('codex/Bisiozweck_model', 'BisiozweckModel');
+
+ $this->BisiozweckModel->addSelect("*");
+ $this->BisiozweckModel->addJoin('bis.tbl_zweck zw', 'ON (zw.zweck_code = bis.tbl_bisio_zweck.zweck_code)');
+
+ $result = $this->BisiozweckModel->loadWhere(
+ array('bisio_id' => $bisio_id)
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getSupports($bisio_id)
+ {
+ $bisio_id = (int)$bisio_id;
+
+ $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel');
+
+ $this->BisioaufenthaltfoerderungModel->addSelect("*");
+ $this->BisioaufenthaltfoerderungModel->addJoin('bis.tbl_aufenthaltfoerderung af', 'ON (af.aufenthaltfoerderung_code = bis.tbl_bisio_aufenthaltfoerderung.aufenthaltfoerderung_code)');
+
+ $result = $this->BisioaufenthaltfoerderungModel->loadWhere(
+ array('bisio_id' => $bisio_id)
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getListPurposes()
+ {
+ $this->load->model('codex/Zweck_model', 'ZweckModel');
+
+ $result = $this->ZweckModel->load();
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getListSupports()
+ {
+ $this->load->model('codex/Aufenthaltfoerderung_model', 'AufenthaltfoerderungModel');
+
+ $result = $this->AufenthaltfoerderungModel->load();
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function addMobilityPurpose($bisio_id, $local_purpose = null)
+ {
+ $zweck_code = $this->input->post('zweck_code');
+
+ if($local_purpose){
+ $zweck_code = $local_purpose;
+ }
+
+ $this->load->model('codex/Bisiozweck_model', 'BisiozweckModel');
+ if(!$local_purpose)
+ {
+ $check = $this->BisiozweckModel->loadWhere(
+ [
+ 'bisio_id' => $bisio_id,
+ 'zweck_code' => $zweck_code,
+ ]
+ );
+ if (hasData($check))
+ {
+ $this->terminateWithError($this->p->t('ui', 'error_entryExisting'), self::ERROR_TYPE_GENERAL);
+ }
+ }
+
+ $result = $this->BisiozweckModel->insert(
+ array(
+ 'bisio_id' => $bisio_id,
+ 'zweck_code' => $zweck_code
+ )
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if($local_purpose)
+ {
+ return $data;
+ }
+
+ return $this->terminateWithSuccess(current($data));
+ }
+
+ public function deleteMobilityPurpose($bisio_id)
+ {
+ $zweck_code = $this->input->post('zweck_code');
+
+ $this->load->model('codex/Bisiozweck_model', 'BisiozweckModel');
+
+
+ $result = $this->BisiozweckModel->delete(
+ array(
+ 'bisio_id' => $bisio_id,
+ 'zweck_code' => $zweck_code
+ )
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess(current($data));
+ }
+
+ public function addMobilitySupport($bisio_id, $local_support = null)
+ {
+ $aufenthaltfoerderung_code = $this->input->post('aufenthaltfoerderung_code');
+
+ if($local_support){
+ $aufenthaltfoerderung_code = $local_support;
+ }
+ $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel');
+
+ if(!$local_support)
+ {
+ $check = $this->BisioaufenthaltfoerderungModel->loadWhere(
+ [
+ 'bisio_id' => $bisio_id,
+ 'aufenthaltfoerderung_code' => $aufenthaltfoerderung_code,
+ ]
+ );
+ if (hasData($check))
+ {
+ $this->terminateWithError($this->p->t('ui', 'error_entryExisting'), self::ERROR_TYPE_GENERAL);
+ }
+ }
+
+ $result = $this->BisioaufenthaltfoerderungModel->insert(
+ array(
+ 'bisio_id' => $bisio_id,
+ 'aufenthaltfoerderung_code' => $aufenthaltfoerderung_code
+ )
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if($local_support)
+ {
+ return $data;
+ }
+
+ return $this->terminateWithSuccess(current($data));
+ }
+
+ public function deleteMobilitySupport($bisio_id)
+ {
+ $aufenthaltfoerderung_code = $this->input->post('aufenthaltfoerderung_code');
+
+ $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel');
+
+ $result = $this->BisioaufenthaltfoerderungModel->delete(
+ array(
+ 'bisio_id' => $bisio_id,
+ 'aufenthaltfoerderung_code' => $aufenthaltfoerderung_code
+ )
+ );
+ $data = $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess(current($data));
+ }
+}
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 ef9aeb111..d8c8d1ff2 100644
--- a/application/controllers/api/frontend/v1/stv/Prestudent.php
+++ b/application/controllers/api/frontend/v1/stv/Prestudent.php
@@ -19,6 +19,7 @@ class Prestudent extends FHCAPI_Controller
'getAufmerksamdurch' => ['admin:r', 'assistenz:r'],
'getBerufstaetigkeit' => ['admin:r', 'assistenz:r'],
'getTypenStg' => ['admin:r', 'assistenz:r'],
+ 'getBisstandort' => ['admin:r', 'assistenz:r'],
'getStudienplaene' => ['admin:r', 'assistenz:r'],
'getStudiengang' => ['admin:r', 'assistenz:r']
]);
@@ -42,7 +43,7 @@ class Prestudent extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
- 'ui', 'studierendenantrag', 'lehre'
+ 'ui', 'studierendenantrag', 'lehre', 'global'
]);
}
@@ -97,11 +98,9 @@ class Prestudent extends FHCAPI_Controller
'person_id',
'berufstaetigkeit_code',
'ausbildungcode',
- 'zgv_code',
'zgvort',
'zgvdatum',
'zgvnation',
- 'zgvmas_code',
'zgvmaort',
'zgvmadatum',
'zgvmanation',
@@ -109,7 +108,6 @@ class Prestudent extends FHCAPI_Controller
'bismelden',
'anmerkung',
'dual',
- 'zgvdoktor_code',
'zgvdoktorort',
'zgvdoktordatum',
'zgvdoktornation',
@@ -124,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);
@@ -135,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');
@@ -173,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))
@@ -187,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))
@@ -201,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))
@@ -265,6 +348,17 @@ class Prestudent extends FHCAPI_Controller
return $this->terminateWithSuccess(getData($result) ?: []);
}
+ public function getBisstandort()
+ {
+ $this->load->model('codex/Bisstandort_model', 'BisstandortModel');
+
+ $result = $this->BisstandortModel->load();
+ if (isError($result)) {
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ }
+ return $this->terminateWithSuccess(getData($result) ?: []);
+ }
+
public function getStudienplaene($prestudent_id)
{
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
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
new file mode 100644
index 000000000..4521c2033
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Pruefung.php
@@ -0,0 +1,567 @@
+.
+ */
+
+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
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Pruefung extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'getPruefungen' => ['admin:r', 'assistenz:r'],
+ 'loadPruefung' => ['admin:r', 'assistenz:r'],
+ 'getTypenPruefungen' => ['admin:r', 'assistenz:r'],
+ 'getLehreinheiten' => ['admin:r', 'assistenz:r'],
+ 'getAllLehreinheiten' => ['admin:r', 'assistenz:r'],
+ 'getLvsByStudent' => ['admin:r', 'assistenz:r'],
+ 'getLvsandLesByStudent' => ['admin:r', 'assistenz:r'],
+ 'getLvsAndMas' => ['admin:r', 'assistenz:r'],
+ 'getMitarbeiterLv' => ['admin:r', 'assistenz:r'],
+ 'getNoten' => ['admin:r', 'assistenz:r'],
+ 'checkZeugnisnoteLv' => ['admin:r', 'assistenz:r'],
+ 'checkTermin1' => ['admin:r', 'assistenz:r'],
+ 'insertPruefung' => self::PERM_LOGGED,
+ 'updatePruefung' =>self::PERM_LOGGED,
+ 'deletePruefung' =>self::PERM_LOGGED,
+ ]);
+
+ //Load Models
+ $this->load->model('education/LePruefung_model', 'PruefungModel');
+
+ //version with postParameter
+ if ($this->router->method == 'insertPruefung')
+ {
+ $student_uid = $this->input->post('student_uid');
+
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $result = $this->StudentModel->load([$student_uid]);
+ $student = $this->getDataOrTerminateWithError($result);
+
+ $prestudent_id = current($student)->prestudent_id;
+ $this->checkPermissionsForPrestudent($prestudent_id, ['admin:w', 'assistenz:w']);
+ }
+
+ // parameter from uri
+ if ($this->router->method == 'updatePruefung' || $this->router->method == 'deletePruefung')
+ {
+ $pruefung_id = current(array_slice($this->uri->rsegments, 2));
+
+ $result = $this->PruefungModel->load($pruefung_id);
+ $pruefung = $this->getDataOrTerminateWithError($result);
+ $student_uid = current($pruefung)->student_uid;
+
+
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $result = $this->StudentModel->load([$student_uid]);
+ $student = $this->getDataOrTerminateWithError($result);
+ $prestudent_id = current($student)->prestudent_id;
+
+ $this->checkPermissionsForPrestudent($prestudent_id, ['admin:rw', 'assistenz:rw']);
+ }
+
+ if ($this->router->method == 'loadPruefung')
+ {
+ $pruefung_id = current(array_slice($this->uri->rsegments, 2));
+
+ $result = $this->PruefungModel->load($pruefung_id);
+ $pruefung = $this->getDataOrTerminateWithError($result);
+
+
+ $student_uid = current($pruefung)->student_uid;
+
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $result = $this->StudentModel->load([$student_uid]);
+ $student = $this->getDataOrTerminateWithError($result);
+ $prestudent_id = current($student)->prestudent_id;
+
+ $this->checkPermissionsForPrestudent($prestudent_id, ['admin:r', 'assistenz:r']);
+ }
+
+ if ($this->router->method == 'getPruefungen')
+ {
+ $student_uid = current(array_slice($this->uri->rsegments, 2));
+
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $result = $this->StudentModel->load([$student_uid]);
+ $student = $this->getDataOrTerminateWithError($result);
+ $prestudent_id = current($student)->prestudent_id;
+
+ $this->checkPermissionsForPrestudent($prestudent_id, ['admin:r', 'assistenz:r']);
+ }
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'global', 'ui', 'lehre', 'exam'
+ ]);
+ }
+
+ public function getPruefungen($student_uid, $studiensemester_kurzbz = null)
+ {
+ $result = $this->PruefungModel->getPruefungenByStudentuid($student_uid);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function loadPruefung($pruefung_id)
+ {
+ $this->PruefungModel->addSelect('tbl_pruefung.datum');
+ $this->PruefungModel->addSelect("TO_CHAR(tbl_pruefung.datum::timestamp, 'DD.MM.YYYY') AS format_datum");
+ $this->PruefungModel->addSelect('tbl_pruefung.anmerkung');
+ $this->PruefungModel->addSelect('tbl_pruefung.pruefungstyp_kurzbz');
+ $this->PruefungModel->addSelect('tbl_pruefung.pruefung_id');
+ $this->PruefungModel->addSelect('tbl_pruefung.lehreinheit_id');
+ $this->PruefungModel->addSelect('tbl_pruefung.student_uid');
+ $this->PruefungModel->addSelect('tbl_pruefung.mitarbeiter_uid');
+ $this->PruefungModel->addSelect('tbl_pruefung.punkte');
+ $this->PruefungModel->addSelect('tbl_pruefung.note');
+
+ $this->PruefungModel->addSelect('tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung');
+ $this->PruefungModel->addSelect('tbl_lehrveranstaltung.lehrveranstaltung_id');
+ $this->PruefungModel->addSelect('tbl_lehrveranstaltung.semester');
+ $this->PruefungModel->addSelect('tbl_lehrveranstaltung.lehrform_kurzbz');
+ $this->PruefungModel->addSelect('tbl_note.bezeichnung as note_bezeichnung');
+ $this->PruefungModel->addSelect('tbl_pruefungstyp.beschreibung as typ_beschreibung');
+ $this->PruefungModel->addSelect('tbl_lehreinheit.studiensemester_kurzbz as studiensemester_kurzbz');
+
+ $this->PruefungModel->addJoin('lehre.tbl_lehreinheit', 'lehre.tbl_pruefung.lehreinheit_id = lehre.tbl_lehreinheit.lehreinheit_id');
+ $this->PruefungModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
+ $this->PruefungModel->addJoin('lehre.tbl_note', 'note');
+ $this->PruefungModel->addJoin('lehre.tbl_pruefungstyp', 'pruefungstyp_kurzbz');
+
+
+ $this->PruefungModel->addLimit(1);
+
+ $result = $this->PruefungModel->loadWhere(
+ array('pruefung_id' => $pruefung_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'=> 'Pruefung_id']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess(current(getData($result)) ? : null);
+ }
+
+ /**
+ * Inserts a pruefung
+ *
+ * @param lehrveranstaltung_id, student_uid, lehreinheit_id
+ *
+ * @return void
+ */
+ public function insertPruefung()
+ {
+ $this->insertOrUpdatePruefung();
+ }
+
+ /**
+ * Updates a pruefung
+ *
+ * @param pruefung_id
+ *
+ * @return success or error
+ */
+ public function updatePruefung($pruefung_id)
+ {
+ $result = $this->PruefungModel->load($pruefung_id);
+
+ $oldpruefung = $this->getDataOrTerminateWithError($result);
+ if (!$oldpruefung)
+ show_404(); // Pruefung that should be updated does not exist
+
+ $this->insertOrUpdatePruefung($pruefung_id);
+ }
+
+ /**
+ * Deletes a pruefung
+ *
+ * @param pruefung_id
+ *
+ * @return success or error
+ *
+ * no impact on lehre.tbl_zeugnisnote
+ */
+ public function deletePruefung($pruefung_id)
+ {
+ $result = $this->PruefungModel->load($pruefung_id);
+
+ $oldpruefung = $this->getDataOrTerminateWithError($result);
+ if (!$oldpruefung)
+ show_404(); // Pruefung that should be deleted does not exist
+
+ $result = $this->PruefungModel->delete(
+ [
+ 'pruefung_id' => $pruefung_id
+ ]
+ );
+
+ $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess(true);
+ }
+
+ public function getTypenPruefungen()
+ {
+ $this->load->model('education/Pruefungstyp_model', 'PruefungtypModel');
+
+ //TODO(Manu) sort Termin3
+ $this->PruefungtypModel->addOrder('sort', 'ASC');
+ $result = $this->PruefungtypModel->loadWhere(
+ array('abschluss' => 'false')
+ );
+
+ if (isError($result)) {
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ }
+ return $this->terminateWithSuccess(getData($result) ?: []);
+ }
+
+ public function getAllLehreinheiten()
+ {
+ $lv_id = $this->input->post('lv_id');
+ $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
+
+ $this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
+
+ $result = $this->LehreinheitModel->getLesFromLvIds($lv_id, $studiensemester_kurzbz);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getLvsandLesByStudent($student_uid, $semester_kurzbz=null)
+ {
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+
+ $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid, $semester_kurzbz);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $lv_ids = array();
+ $allData = array();
+
+ foreach ($data as $lehrveranstaltung) {
+ $lv_ids[] = $lehrveranstaltung->lehrveranstaltung_id;
+ }
+
+ $this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
+
+ foreach ($lv_ids as $id)
+ {
+ $result = $this->LehreinheitModel->getLesFromLvIds($id, $semester_kurzbz);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if (is_array($data)) {
+ $allData = array_merge($allData, $data);
+ }
+ }
+
+ return $this->terminateWithSuccess($allData);
+ }
+
+ public function getLvsAndMas($student_uid)
+ {
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+
+ $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $lv_ids = array();
+ $allDataMa = array();
+
+ foreach ($data as $lehrveranstaltung)
+ {
+ $lv_ids[] = $lehrveranstaltung->lehrveranstaltung_id;
+ }
+
+ $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
+
+ foreach ($lv_ids as $id)
+ {
+ $resultMa = $this->MitarbeiterModel->getMitarbeiterFromLV($id);
+ $dataMa = $this->getDataOrTerminateWithError($resultMa);
+
+ if (is_array($dataMa))
+ {
+ $allDataMa = array_merge($allDataMa, $dataMa);
+ }
+ }
+ return $this->terminateWithSuccess($allDataMa);
+ }
+
+ public function getLvsByStudent($student_uid, $studiensemester_kurzbz = null)
+ {
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+
+ $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid, $studiensemester_kurzbz);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($data);
+ }
+
+ public function getMitarbeiterLv($lv_id)
+ {
+ $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
+
+ $result = $this->MitarbeiterModel->getMitarbeiterFromLV($lv_id);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($data);
+ }
+
+ public function getNoten()
+ {
+ $this->load->model('education/Note_model', 'NoteModel');
+
+ $this->NoteModel->addOrder('note', 'ASC');
+ $result = $this->NoteModel->load();
+
+ if (isError($result)) {
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ }
+ return $this->terminateWithSuccess(getData($result) ?: []);
+ }
+
+ public function checkZeugnisnoteLv()
+ {
+ $student_uid = $this->input->post('student_uid');
+ $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
+ $lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id');
+
+ $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+
+ $result = $this->ZeugnisnoteModel->loadWhere(array(
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id,
+ 'student_uid' => $student_uid,
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz));
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ 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 074f4029e..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,22 +645,14 @@ 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);
}
- public function loadStatus()
+ public function loadStatus($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester)
{
- $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
-
- $prestudent_id = $this->input->post('prestudent_id');
- $status_kurzbz = $this->input->post('status_kurzbz');
- $ausbildungssemester = $this->input->post('ausbildungssemester');
- $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
-
$result = $this->PrestudentstatusModel->loadWhere(
array(
'prestudent_id' => $prestudent_id,
@@ -734,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,
@@ -746,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,
@@ -755,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');
@@ -904,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]);
@@ -921,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(
@@ -946,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(
@@ -971,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(
@@ -996,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(
@@ -1021,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(
@@ -1080,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
*
@@ -1104,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');
@@ -1114,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');
@@ -1137,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
@@ -1343,16 +1364,26 @@ class Status extends FHCAPI_Controller
'updateamum' => date('c'),
'updatevon' => $authUID
];
+ $nullableFields = ['statusgrund_id', 'anmerkung', 'rt_stufe'];
foreach ([
- 'orgform_kurzbz',
- 'anmerkung',
- 'bewerbung_abgeschicktamum',
- 'studienplan_id',
- 'rt_stufe',
- 'statusgrund_id'
- ] as $key)
- if ($this->input->post($key))
+ 'orgform_kurzbz',
+ 'anmerkung',
+ 'bewerbung_abgeschicktamum',
+ 'studienplan_id',
+ 'rt_stufe',
+ 'statusgrund_id'
+ ] as $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');
@@ -1536,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 89c317ae4..7694807e7 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'
+ '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,52 @@ 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($this->permissionlib->isBerechtigt('student/bpk'))
+ {
+ $this->PrestudentModel->addSelect('p.bpk');
+ }
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 +153,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 +231,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 +265,6 @@ class Student extends FHCAPI_Controller
'gebdatum',
'gebort',
'geburtsnation',
- 'svnr',
'ersatzkennzeichen',
'staatsbuergerschaft',
'matr_nr',
@@ -195,7 +275,7 @@ class Student extends FHCAPI_Controller
'anmerkung',
'homepage'
];
-
+
// add UDFs
$result = $this->udflib->getDefinitionForModel($this->PersonModel);
@@ -207,12 +287,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,26 +315,89 @@ 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) {
- // TODO(chris): phrase
- $this->terminateWithValidationErrors(['' => "Kein/e StudentIn vorhanden!"]);
+ $this->terminateWithValidationErrors(['' => $this->p->t('lehre', 'error_no_student')]);
}
if (count($update_person) && $person_id === null) {
- // TODO(chris): phrase
- $this->terminateWithValidationErrors(['' => "Keine Person vorhanden!"]);
+ $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
@@ -250,6 +407,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
@@ -257,14 +416,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');
@@ -282,21 +482,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);
}
@@ -305,69 +539,58 @@ 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->form_validation->set_rules('nachname', 'Nachname', 'callback_requiredIfNotPersonId', [
- 'requiredIfNotPersonId' => $this->p->t('ui', 'error_required')
- ]);
- $this->form_validation->set_rules('geschlecht', 'Geschlecht', 'callback_requiredIfNotPersonId', [
- 'requiredIfNotPersonId' => $this->p->t('ui', 'error_required')
- ]);
- $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'callback_isValidDate', [
- 'isValidDate' => $this->p->t('ui', 'error_invalid_date')
- ]);
- $this->form_validation->set_rules('address[func]', 'Address', 'required|integer|less_than[2]|greater_than[-2]');
- $this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [
- 'requiredIfAddressFunc' => $this->p->t('ui', 'error_required')
- ]);
- $this->form_validation->set_rules('address[gemeinde]', 'Gemeinde', 'callback_requiredIfAddressFunc', [
- 'requiredIfAddressFunc' => $this->p->t('ui', 'error_required')
- ]);
- $this->form_validation->set_rules('address[ort]', 'Ort', 'callback_requiredIfAddressFunc', [
- 'requiredIfAddressFunc' => $this->p->t('ui', 'error_required')
- ]);
- $this->form_validation->set_rules('address[address]', 'Adresse', 'callback_requiredIfAddressFunc', [
- 'requiredIfAddressFunc' => $this->p->t('ui', 'error_required')
- ]);
- $this->form_validation->set_rules('email', 'E-Mail', 'valid_email');
- $this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'required');
- $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required');
- $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'required|integer|less_than[9]|greater_than[-1]');
- // 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());
+ $this->_validate();
// 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'),
@@ -390,19 +613,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 = [
@@ -414,50 +643,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,
@@ -467,83 +691,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)
@@ -555,8 +766,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', 'is_valid_date', [
+ 'is_valid_date' => $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..f87e527e0 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');
@@ -428,7 +611,7 @@ class Students extends FHCAPI_Controller
if (!$verband && !$gruppe && $orgform_kurzbz !== null) {
$this->PrestudentModel->db->where(
"(
- SELECT orgform_kurzbz
+ SELECT orgform_kurzbz
FROM public.tbl_prestudentstatus
WHERE prestudent_id=tbl_prestudent.prestudent_id
AND studiensemester_kurzbz=" . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
@@ -438,13 +621,12 @@ class Students extends FHCAPI_Controller
false
);
}
-
}
$this->addFilter($studiensemester_kurzbz);
$result = $this->PrestudentModel->loadWhere($where);
-
+
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
@@ -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
@@ -588,6 +850,45 @@ class Students extends FHCAPI_Controller
{
$stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
+ $this->load->config('stv');
+
+ if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED)
+ {
+ $tags = $this->config->item('stv_prestudent_tags');
+
+ $whereTags = '';
+ if (is_array($tags) && !isEmptyArray($tags)) {
+ $tags = array_keys($tags);
+
+ foreach ($tags as $key => $tag) {
+ $tags[$key] = $this->db->escape($tag);
+ }
+ $whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")";
+ }
+ $subQueryTag = "
+ (
+ SELECT
+ tag.prestudent_id,
+ COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags
+ FROM (
+ SELECT DISTINCT ON (n.notiz_id)
+ n.notiz_id AS id,
+ nt.typ_kurzbz,
+ array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung,
+ n.text AS notiz,
+ nt.style,
+ n.erledigt AS done,
+ nz.prestudent_id
+ FROM public.tbl_notizzuordnung AS nz
+ JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id
+ JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz "
+ . $whereTags .
+ "
+ ) AS tag
+ GROUP BY tag.prestudent_id
+ ) AS tag_data_agg
+ ";
+ }
$this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
@@ -610,25 +911,43 @@ class Students extends FHCAPI_Controller
AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')', 'LEFT');
+ if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED)
+ {
+ $this->PrestudentModel->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT');
+ }
+
$this->PrestudentModel->addSelect("b.uid");
+ if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED)
+ {
+ $this->PrestudentModel->addSelect('tag_data_agg.tags');
+ }
$this->PrestudentModel->addSelect('titelpre');
$this->PrestudentModel->addSelect('nachname');
$this->PrestudentModel->addSelect('vorname');
$this->PrestudentModel->addSelect('wahlname');
$this->PrestudentModel->addSelect('vornamen');
$this->PrestudentModel->addSelect('titelpost');
- $this->PrestudentModel->addSelect('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 +959,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');
@@ -660,13 +979,7 @@ 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->addSelect('unruly');
$this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs);
@@ -682,13 +995,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 +1010,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 +1022,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/Tags.php b/application/controllers/api/frontend/v1/stv/Tags.php
new file mode 100644
index 000000000..3004a1f3b
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Tags.php
@@ -0,0 +1,48 @@
+ self::BERECHTIGUNG_KURZBZ,
+ 'getTags' => self::BERECHTIGUNG_KURZBZ,
+ 'addTag' => self::BERECHTIGUNG_KURZBZ,
+ 'updateTag' => self::BERECHTIGUNG_KURZBZ,
+ 'doneTag' => self::BERECHTIGUNG_KURZBZ,
+ 'deleteTag' => self::BERECHTIGUNG_KURZBZ
+ ]);
+
+ $this->config->load('stv');
+ }
+
+ public function getTag($readonly_tags = null)
+ {
+ parent::getTag($this->config->item('stv_prestudent_tags'));
+ }
+ public function getTags($tags = null)
+ {
+ parent::getTags($this->config->item('stv_prestudent_tags'));
+ }
+ public function addTag($withZuordnung = true, $updatable_tags = null)
+ {
+ parent::addTag(true, $this->config->item('stv_prestudent_tags'));
+ }
+ public function updateTag($updatable_tags = null)
+ {
+ parent::updateTag($this->config->item('stv_prestudent_tags'));
+ }
+ public function deleteTag($withZuordnung = true, $updatable_tags = null)
+ {
+ parent::deleteTag(true, $this->config->item('stv_prestudent_tags'));
+ }
+ public function doneTag($updatable_tags = null)
+ {
+ parent::doneTag($this->config->item('stv_prestudent_tags'));
+ }
+}
diff --git a/application/controllers/api/frontend/v1/stv/Verband.php b/application/controllers/api/frontend/v1/stv/Verband.php
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/Config.php b/application/controllers/api/frontend/v1/vertraege/Config.php
new file mode 100644
index 000000000..a4ebd8c48
--- /dev/null
+++ b/application/controllers/api/frontend/v1/vertraege/Config.php
@@ -0,0 +1,62 @@
+.
+ */
+
+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 the VV Config
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Config extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'printDocument' => ['vertrag/mitarbeiter:r'],
+ ]);
+ }
+
+ public function printDocument()
+ {
+ $params = [];
+ $menu = [];
+
+ Events::trigger(
+ 'multiActionPrintHonorarvertrag',
+ // passing $menu per reference
+ function & () use (&$menu) {
+ return $menu;
+ },
+ $params
+ );
+
+ if (is_array($menu) && isset($menu[0]))
+ {
+ $this->terminateWithSuccess($menu[0]);
+ }
+ else
+ {
+ // $this->terminateWithError('Error with Event 'multiActionPrintHonorarvertrag');
+ $this->terminateWithSuccess();
+
+ }
+ }
+}
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..c0683e999
--- /dev/null
+++ b/application/controllers/api/frontend/v1/vertraege/Vertraege.php
@@ -0,0 +1,684 @@
+ ['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'],
+ ]);
+
+ //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($vertrag_id);
+ }
+
+ 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($vertrag_id);
+ }
+
+ 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));
+ }
+}
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/components/stv/Noten.php b/application/controllers/components/stv/Noten.php
deleted file mode 100644
index fb61de065..000000000
--- a/application/controllers/components/stv/Noten.php
+++ /dev/null
@@ -1,168 +0,0 @@
- 'student/noten:r',
- 'getZeugnis' => 'student/noten:r',
- 'update' => ['admin:w', 'assistenz:w']
- ]);
-
- // Load Libraries
- $this->load->library('VariableLib', ['uid' => getAuthUID()]);
- }
-
- public function get()
- {
- $this->load->model('codex/Note_model', 'NoteModel');
-
- $result = $this->NoteModel->addOrder('note');
-
- $result = $this->NoteModel->load();
- if (isError($result)) {
- $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
- }
-
- return $this->outputJson($result);
- }
-
- public function getZeugnis($prestudent_id, $all = null)
- {
- $this->load->model('crm/Student_model', 'StudentModel');
- $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
-
- $result = $this->StudentModel->loadWhere([
- 'prestudent_id' => $prestudent_id
- ]);
- if (isError($result)) {
- $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
- return $this->outputJson($result);
- }
- if (!hasData($result))
- return $this->outputJsonSuccess(null);
-
- $student_uid = current(getData($result))->student_uid;
-
- $studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : null;
-
- $result = $this->ZeugnisnoteModel->getZeugnisnoten($student_uid, $studiensemester_kurzbz);
- if (isError($result)) {
- $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
- }
-
- return $this->outputJson($result);
- }
-
- public function update()
- {
- $this->load->model('crm/Student_model', 'StudentModel');
- $this->load->model('organisation/Studienplan_model', 'StudienplanModel');
- $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
- $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
-
- $this->load->library('form_validation');
-
- $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
-
- if (empty($_POST) || !is_array(current($_POST))) {
- $result = $this->hasPermissionUpdate($this->input->post('lehrveranstaltung_id'), $this->input->post('student_uid'));
- if (isError($result)) {
- $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN);
- return $this->outputJson($result);
- }
-
- $this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrverantaltung ID', 'required|numeric');
- $this->form_validation->set_rules('student_uid', 'Student UID', 'required');
- $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester Kurzbezeichnung', 'required');
- $this->form_validation->set_rules('note', 'Note', 'required|numeric');
- $post = [$_POST];
- } else {
- foreach ($_POST as $i => $data) {
- $lvid = isset($data['lehrveranstaltung_id']) ? $data['lehrveranstaltung_id'] : null;
- $uid = isset($data['student_uid']) ? $data['student_uid'] : null;
- $result = $this->hasPermissionUpdate($lvid, $uid);
- if (isError($result)) {
- $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN);
- return $this->outputJson($result);
- }
-
- $this->form_validation->set_rules($i . '[lehrveranstaltung_id]', '#' . $i . ' Lehrverantaltung ID', 'required|numeric');
- $this->form_validation->set_rules($i . '[student_uid]', '#' . $i . ' Student UID', 'required');
- $this->form_validation->set_rules($i . '[studiensemester_kurzbz]', '#' . $i . ' Studiensemester Kurzbezeichnung', 'required');
- $this->form_validation->set_rules($i . '[note]', '#' . $i . ' Note', 'required|numeric');
- }
- $post = $_POST;
- }
- if ($this->form_validation->run() == false) {
- $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST);
- return $this->outputJsonError($this->form_validation->error_array());
- }
-
- $final_result = success();
- $this->ZeugnisnoteModel->db->trans_start();
-
- foreach ($post as $i => $data) {
- $note = $data['note'];
- unset($data['note']);
- $result = $this->ZeugnisnoteModel->update($data, [
- 'note' => $note,
- 'benotungsdatum' => date('c'),
- 'updateamum' => date('c'),
- 'updatevon' => getAuthUID()
- ]);
- if (isError($result)) {
- $final_result = $result;
- break;
- }
- }
-
- $this->ZeugnisnoteModel->db->trans_complete();
-
- if (isError($final_result)) {
- $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
- }
-
- $this->outputJson($final_result);
- }
-
- protected function hasPermissionUpdate($lehrveranstaltung_id, $student_uid)
- {
- // TODO(chris): error phrases!
- if ($lehrveranstaltung_id === null || $student_uid === null)
- return success();
- $result = $this->StudentModel->load([$student_uid]);
- if (isError($result))
- return $result;
- if (!hasData($result))
- return error('Fehler beim Ermitteln des Studenten');
- $student = current(getData($result));
-
- if ($this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz))
- return success();
- if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz))
- return success();
-
- $result = $this->StudienplanModel->getAllOesForLv($lehrveranstaltung_id);
- if (isError($result))
- return $result;
- $oes = getData($result) ?: [];
- $result = $this->LehrveranstaltungModel->getStg($lehrveranstaltung_id);
- if (isError($result))
- return $result;
- if (hasData($result))
- $oes[] = current(getData($result));
-
- foreach ($oes as $oe) {
- if ($this->permissionlib->isBerechtigt('admin', 'suid', $oe->oe_kurzbz))
- return success();
- if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $oe->oe_kurzbz))
- return success();
- }
-
- return error('Forbidden');
- }
-}
diff --git a/application/controllers/dashboard/Admin.php b/application/controllers/dashboard/Admin.php
new file mode 100644
index 000000000..702c04bab
--- /dev/null
+++ b/application/controllers/dashboard/Admin.php
@@ -0,0 +1,52 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ */
+class Admin extends Auth_Controller
+{
+ /**
+ * Constructor
+ */
+ public function __construct()
+ {
+ // Set required permissions
+ parent::__construct(
+ array(
+ 'index' => 'dashboard/admin:rw',
+ 'preview' => 'dashboard/admin:r',
+ )
+ );
+ }
+
+ // -----------------------------------------------------------------------------------------------------------------
+ // Public methods
+ public function index()
+ {
+ $this->load->view('dashboard/admin.php', []);
+ }
+
+ public function preview($dashboard_kurzbz = 'CIS')
+ {
+ $this->load->view('dashboard/preview.php', [
+ 'dashboard_kurzbz' => $dashboard_kurzbz
+ ]);
+ }
+}
diff --git a/application/controllers/dashboard/Api.php b/application/controllers/dashboard/Api.php
deleted file mode 100644
index 422bf0675..000000000
--- a/application/controllers/dashboard/Api.php
+++ /dev/null
@@ -1,76 +0,0 @@
- 'dashboard/admin:rw',
- 'getNews' => 'dashboard/benutzer:r',
- 'getAmpeln' => 'dashboard/benutzer:r',
- )
- );
-
- $this->load->library('AuthLib', null, 'AuthLib');
-
- $this->_setAuthUID();
- }
-
- public function index()
- {
- echo 'Dashboard API Controller';
- }
-
- /**
- * Get News.
- */
- public function getNews()
- {
- $limit = $this->input->get('limit');
-
- $this->load->model('content/News_model', 'NewsModel');
-
- $result = $this->NewsModel->getAll($limit);
-
- if (hasData($result))
- {
- $this->outputJson(getData($result), REST_Controller::HTTP_OK);
- }
- else
- {
- $this->terminateWithJsonError('fehler entdeckt');
- }
- }
-
-
- /**
- * Get Ampeln.
- */
- public function getAmpeln()
- {
-
- $this->load->model('content/Ampel_model', 'AmpelModel');
- $result = $this->AmpelModel->getByUser($this->_uid);
-
- if (hasData($result))
- {
- $this->outputJson(getData($result), REST_Controller::HTTP_OK);
- }
- else
- {
- $this->terminateWithJsonError('fehler entdeckt');
- }
- }
-
- /**
- * Retrieve the UID of the logged user and checks if it is valid
- */
- private function _setAuthUID()
- {
- $this->_uid = getAuthUID();
-
- if (!$this->_uid) show_error('User authentification failed');
- }
-}
diff --git a/application/controllers/dashboard/Config.php b/application/controllers/dashboard/Config.php
deleted file mode 100644
index 2c0cf5fca..000000000
--- a/application/controllers/dashboard/Config.php
+++ /dev/null
@@ -1,216 +0,0 @@
- 'dashboard/benutzer:r',
- 'dummy' => 'dashboard/benutzer:r',
- 'genWidgetId' => 'dashboard/benutzer:rw',
- 'addWidgetsToPreset' => 'dashboard/admin:rw',
- 'removeWidgetFromPreset' => 'dashboard/admin:rw',
- 'addWidgetsToUserOverride' => 'dashboard/benutzer:rw',
- 'removeWidgetFromUserOverride' => 'dashboard/benutzer:rw',
- 'funktionen' => 'dashboard/admin:r',
- 'preset' => 'dashboard/admin:r',
- 'presetBatch' => 'dashboard/admin:r'
- )
- );
-
- $this->load->library('dashboard/DashboardLib', null, 'DashboardLib');
- $this->load->library('AuthLib', null, 'AuthLib');
- $this->load->model('ressource/Funktion_model', 'FunktionModel');
- }
-
- public function index()
- {
- $dashboard_kurzbz = $this->input->get('db');
- $uid = $this->AuthLib->getAuthObj()->username;
-
- $dashboard = $this->DashboardLib->getDashboardByKurzbz($dashboard_kurzbz);
- if(!$dashboard) {
- http_response_code(404);
- $this->terminateWithJsonError(array(
- 'error' => 'Dashboard ' . $dashboard_kurzbz . ' not found.'
- ));
- }
-
- $mergedconfig = $this->DashboardLib->getMergedConfig($dashboard->dashboard_id, $uid);
- $this->outputJsonSuccess($mergedconfig);
- }
-
- public function genWidgetId()
- {
- $dashboard_kurzbz = $this->input->get('db');
- $widgetid = $this->DashboardLib->generateWidgetId($dashboard_kurzbz);
- $this->outputJsonSuccess(array(
- 'widgetid' => $widgetid
- ));
- }
-
- public function addWidgetsToPreset()
- {
- $input = json_decode($this->input->raw_input_stream);
- $dashboard_kurzbz = $input->db;
- $funktion_kurzbz = $input->funktion_kurzbz;
-
- $preset = $this->DashboardLib->getPresetOrCreateEmptyPreset($dashboard_kurzbz, $funktion_kurzbz);
-
- $preset_decoded = json_decode($preset->preset, true);
-
- $this->DashboardLib->addWidgetsToWidgets($preset_decoded['widgets'], $dashboard_kurzbz, $funktion_kurzbz, $input->widgets);
-
- $preset->preset = json_encode($preset_decoded);
-
- $result = $this->DashboardLib->insertOrUpdatePreset($preset);
- if (isError($result)) {
- http_response_code(500);
- $this->terminateWithJsonError('preset could not be saved');
- }
-
- $this->outputJsonSuccess(array('msg' => 'preset successfully stored.', 'data' => $preset_decoded));
- }
-
- public function removeWidgetFromPreset()
- {
- $input = json_decode($this->input->raw_input_stream);
- $dashboard_kurzbz = $input->db;
- $funktion_kurzbz = $input->funktion_kurzbz;
- $widgetid = $input->widgetid;
-
- $preset = $this->DashboardLib->getPreset($dashboard_kurzbz, $funktion_kurzbz);
- if ($preset === null) {
- http_response_code(404);
- $this->terminateWithJsonError('preset for dashboard ' . $dashboard_kurzbz . ' and funktion ' . $funktion_kurzbz . ' not found.');
- }
-
- $preset_decoded = json_decode($preset->preset, true);
- if (!$this->DashboardLib->removeWidgetFromWidgets($preset_decoded['widgets'], $funktion_kurzbz, $widgetid))
- {
- http_response_code(404);
- $this->terminateWithJsonError('widgetid ' . $widgetid . ' not found');
- }
-
- $preset->preset = json_encode($preset_decoded);
- $result = $this->DashboardLib->insertOrUpdatePreset($preset);
- if (isError($result))
- {
- http_response_code(500);
- $this->terminateWithJsonError('failed to remove widget');
- }
- $this->outputJsonSuccess(array('msg' => 'preset successfully updated.'));
- }
-
- public function addWidgetsToUserOverride()
- {
- $input = json_decode($this->input->raw_input_stream);
- $dashboard_kurzbz = $input->db;
- $funktion_kurzbz = $input->funktion_kurzbz;
- $uid = $this->AuthLib->getAuthObj()->username;
-
- $override = $this->DashboardLib->getOverrideOrCreateEmptyOverride($dashboard_kurzbz, $uid);
-
- $override_decoded = json_decode($override->override, true);
-
- $this->DashboardLib->addWidgetsToWidgets($override_decoded['widgets'], $dashboard_kurzbz, $funktion_kurzbz, $input->widgets);
-
- $override->override = json_encode($override_decoded);
-
- $result = $this->DashboardLib->insertOrUpdateOverride($override);
- if (isError($result)) {
- http_response_code(500);
- $this->terminateWithJsonError('override could not be saved');
- }
-
- $this->outputJsonSuccess(array('msg' => 'override successfully stored.', 'data' => $override_decoded));
- }
-
- public function removeWidgetFromUserOverride()
- {
- $input = json_decode($this->input->raw_input_stream);
- $dashboard_kurzbz = $input->db;
- $funktion_kurzbz = $input->funktion_kurzbz;
- $uid = $this->AuthLib->getAuthObj()->username;
- $widgetid = $input->widgetid;
-
- $override = $this->DashboardLib->getOverride($dashboard_kurzbz, $uid);
- if (empty($override)) {
- http_response_code(404);
- $this->terminateWithJsonError('userconfig for dashboard ' . $dashboard_kurzbz . ' not found.');
- }
-
- $override_decoded = json_decode($override->override, true);
-
- if (!$this->DashboardLib->removeWidgetFromWidgets($override_decoded['widgets'], $funktion_kurzbz, $widgetid))
- {
- http_response_code(404);
- $this->terminateWithJsonError('widgetid ' . $widgetid . ' not found');
- }
-
- $override->override = json_encode($override_decoded);
- $result = $this->DashboardLib->insertOrUpdateOverride($override, $uid);
- if (isError($result))
- {
- http_response_code(500);
- $this->terminateWithJsonError('failed to remove widget');
- }
- $this->outputJsonSuccess(array('msg' => 'override successfully updated.'));
- }
-
- public function funktionen()
- {
- $funktionen = $this->FunktionModel->load();
-
- if (isError($funktionen)) {
- http_response_code(404);
- $this->terminateWithJsonError([
- 'error' => getError($funktionen)
- ]);
- }
-
- return $this->outputJsonSuccess(getData($funktionen) ?: []);
- }
-
- public function preset()
- {
- $db = $this->input->get('db');
- $funktion = $this->input->get('funktion');
-
- $conf = $this->DashboardLib->getPreset($db, $funktion);
-
- if (!$conf)
- return $this->outputJsonSuccess(['widgets' => [$funktion => []]]);
-
- return $this->outputJsonSuccess(json_decode($conf->preset, true));
- }
-
- public function presetBatch()
- {
- $db = $this->input->get('db');
- $funktionen = $this->input->get('funktionen');
- $result = [];
-
- foreach ($funktionen as $funktion) {
- $conf = $this->DashboardLib->getPreset($db, $funktion);
- if ($conf)
- {
- $preset = json_decode($conf->preset, true);
- if (!isset($preset['widgets']) || !isset($preset['widgets'][$funktion]))
- $result[$funktion] = [];
- else
- $result[$funktion] = $preset['widgets'][$funktion];
- }
- else
- $result[$funktion] = [];
- }
-
- return $this->outputJsonSuccess($result);
- }
-}
diff --git a/application/controllers/dashboard/Dashboard.php b/application/controllers/dashboard/Dashboard.php
deleted file mode 100644
index 3773a6d73..000000000
--- a/application/controllers/dashboard/Dashboard.php
+++ /dev/null
@@ -1,86 +0,0 @@
- 'dashboard/admin:r',
- 'create' => 'dashboard/admin:rw',
- 'update' => 'dashboard/admin:rw',
- 'delete' => 'dashboard/admin:rw'
- )
- );
-
- $this->load->library('dashboard/DashboardLib', null, 'DashboardLib');
- $this->load->model('dashboard/Dashboard_model', 'DashboardModel');
- }
-
- public function index()
- {
- $result = $this->DashboardModel->load();
-
- if (isError($result)) {
- http_response_code(404);
- $this->terminateWithJsonError([
- 'error' => getError($result)
- ]);
- }
-
- return $this->outputJsonSuccess(getData($result) ?: []);
- }
-
- public function create()
- {
- $input = $this->getPostJSON();
-
- $result = $this->DashboardModel->insert($input);
-
- if (isError($result)) {
- http_response_code(404);
- $this->terminateWithJsonError([
- 'error' => getError($result)
- ]);
- }
-
- return $this->outputJsonSuccess(getData($result) ?: []);
- }
-
- public function update()
- {
- $input = $this->getPostJSON();
-
- $result = $this->DashboardModel->update($input->dashboard_id, $input);
-
- if (isError($result)) {
- http_response_code(404);
- $this->terminateWithJsonError([
- 'error' => getError($result)
- ]);
- }
-
- return $this->outputJsonSuccess(getData($result) ?: []);
- }
-
- public function delete()
- {
- $input = $this->getPostJSON();
-
- $result = $this->DashboardModel->delete($input->dashboard_id);
-
- if (isError($result)) {
- http_response_code(404);
- $this->terminateWithJsonError([
- 'error' => getError($result)
- ]);
- }
-
- return $this->outputJsonSuccess(getData($result) ?: []);
- }
-}
diff --git a/application/controllers/dashboard/DashboardDemo.php b/application/controllers/dashboard/DashboardDemo.php
deleted file mode 100644
index 35d530384..000000000
--- a/application/controllers/dashboard/DashboardDemo.php
+++ /dev/null
@@ -1,58 +0,0 @@
- 'dashboard/benutzer:r',
- 'admin' => 'dashboard/admin:rw'
- )
- );
-
- $this->load->library('AuthLib');
- $this->load->library('WidgetLib');
-
- $this->_setAuthUID(); // sets property uid
-
- $this->setControllerId(); // sets the controller id
- }
-
- // -----------------------------------------------------------------------------------------------------------------
- // Public methods
- public function index()
- {
- $this->load->view('dashboard/dashboard_demo.php', []);
- }
-
- // -----------------------------------------------------------------------------------------------------------------
- // Public methods
- public function admin()
- {
- $this->load->view('dashboard/dashboard_demo_admin.php', []);
- }
-
- // -----------------------------------------------------------------------------------------------------------------
- // Private methods
-
- /**
- * Retrieve the UID of the logged user and checks if it is valid
- */
- private function _setAuthUID()
- {
- $this->_uid = getAuthUID();
-
- if (!$this->_uid) show_error('User authentification failed');
- }
-}
diff --git a/application/controllers/dashboard/Widget.php b/application/controllers/dashboard/Widget.php
deleted file mode 100644
index 0da6fe8da..000000000
--- a/application/controllers/dashboard/Widget.php
+++ /dev/null
@@ -1,109 +0,0 @@
- ['dashboard/benutzer:r', 'dashboard/admin:r'],
- 'getAll' => 'dashboard/admin:r',
- 'getWidgetsForDashboard' => ['dashboard/benutzer:rw', 'dashboard/admin:r'],
- 'setAllowed' => 'dashboard/admin:rw'
- )
- );
-
- $this->load->library('dashboard/DashboardLib', null, 'DashboardLib');
- $this->load->model('dashboard/Widget_model', 'WidgetModel');
- $this->load->model('dashboard/Dashboard_Widget_model', 'DashboardWidgetModel');
- }
-
- public function index()
- {
- $widget_id = $this->input->get('id');
-
- $widget = $this->WidgetModel->load($widget_id);
-
- if (isError($widget) || !getData($widget))
- return $this->outputJsonSuccess([
- "widget_id" => 0,
- "widget_kurzbz" => "notfound",
- "arguments" => json_encode([
- "className" => 'alert-danger',
- "title" => 'Widget Not Found',
- "msg" => 'The widget with the id ' . $widget_id . ' could not be found'
- ]),
- "setup" => json_encode([
- "name" => 'Widget Not Found',
- "file" => 'DashboardWidget/Default.js',
- "width" => 1,
- "height" => 1
- ])
- ]);
- return $this->outputJsonSuccess(current(getData($widget)));
- }
-
- public function getAll()
- {
- $dashboard_id = $this->input->get('dashboard_id');
- $result = $this->WidgetModel->getWithAllowedForDashboard($dashboard_id);
-
- if (isError($result))
- return $this->outputJsonError(getError($result));
-
- $this->outputJsonSuccess(getData($result) ?: []);
- }
-
- public function getWidgetsForDashboard()
- {
- $db = $this->input->get('db');
- $result = $this->WidgetModel->getForDashboard($db);
-
- if (isError($result)) {
- http_response_code(404);
- $this->terminateWithJsonError([
- 'error' => getError($result)
- ]);
- }
-
- $this->outputJsonSuccess(getData($result) ?: []);
- }
-
- public function setAllowed()
- {
- $input = $this->getPostJSON();
-
- $dashboard_id = $input->dashboard_id;
- $widget_id = $input->widget_id;
- $action = $input->action;
-
- if ($action == 'add') {
- $result = $this->DashboardWidgetModel->insert([
- 'dashboard_id' => $dashboard_id,
- 'widget_id' => $widget_id
- ]);
- } elseif ($action == 'delete') {
- $result = $this->DashboardWidgetModel->delete([
- 'dashboard_id' => $dashboard_id,
- 'widget_id' => $widget_id
- ]);
- } else {
- http_response_code(404); // TODO(chris): 400?
- $this->terminateWithJsonError([
- 'error' => 'action value invalid'
- ]);
- }
- if (isError($result)) {
- http_response_code(404);
- $this->terminateWithJsonError([
- 'error' => getError($result)
- ]);
- }
- return $this->outputJsonSuccess(getData($result));
- }
-}
diff --git a/application/controllers/jobs/AbgabetoolJob.php b/application/controllers/jobs/AbgabetoolJob.php
new file mode 100644
index 000000000..b81053032
--- /dev/null
+++ b/application/controllers/jobs/AbgabetoolJob.php
@@ -0,0 +1,913 @@
+_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->library('SignatureLib');
+
+ $this->_ci->load->config('abgabe');
+ $this->loadPhrases([
+ 'abgabetool'
+ ]);
+
+
+ }
+
+ // basically the notifyBetreuerMail function but email goes to assistenz
+ // and new abgaben are further evaluated for missing signature status
+ public function notifyAssistenzAboutMissingSignatureUploads() {
+ $this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutMissingSignatureUploads');
+
+ $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
+ $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ');
+
+ $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $relevantTypes);
+ $retval = getData($result);
+
+ // retval are paabgaben joined with projektarbeit and betreuer
+ if(count($retval) == 0) {
+ $this->logInfo("Keine Emails über neue Paabgaben an Assistenzen versandt");
+ return;
+ }
+
+ // group changed/new abgaben for projektarbeiten
+ $projektarbeiten = [];
+ foreach($retval as $abgabeWithNewUpload) {
+ // Check if the current item has a 'projektarbeit_id' field.
+ // Replace 'projektarbeit_id' with the actual key name if it's different.
+ if (isset($abgabeWithNewUpload->projektarbeit_id)) {
+ $projektarbeitId = $abgabeWithNewUpload->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] = [];
+ }
+
+ // check signature for that abgabe, main point of this job
+ $this->checkAbgabeSignatur($abgabeWithNewUpload, $abgabeWithNewUpload->student_uid);
+
+ // Add the current row to the array associated with its 'projektarbeit_id'.
+ $projektarbeiten[$projektarbeitId][] = $abgabeWithNewUpload;
+ }
+ }
+
+ // 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 = '';
+ $hasIssues = false; // Track if this assistant actually needs an email
+
+ foreach($tupelArr as $tupel) {
+ $projektarbeit_id = $tupel[0];
+ $assistenzRow = $tupel[1];
+
+ $betreuerArray = $projektarbeitBetreuerMap[$projektarbeit_id] ?? [];
+ $allAbgaben = $projektarbeiten[$projektarbeit_id];
+
+ // only keep abgaben that are not correctly signed
+ $issueAbgaben = array_filter($allAbgaben, function($abgabe) {
+ // We only care about cases where it's explicitly NOT true (false, error, or null)
+ return $abgabe->signatur !== true;
+ });
+
+ // if this specific project has no signature issues, skip to the next project
+ if(empty($issueAbgaben)) {
+ continue;
+ }
+
+ // If we reached here, we have at least one issue to report
+ $hasIssues = true;
+
+ // Format the Student Name (using the first available abgabe object)
+ $s = reset($issueAbgaben);
+ $nameParts = array_filter([$s->titelpre, $s->vorname, $s->nachname, $s->titelpost]);
+ $studentFullName = implode(' ', $nameParts);
+
+ // Format the Supervisors string
+ $betreuerStrings = [];
+ foreach($betreuerArray as $b) {
+ $bNameParts = array_filter([$b->titelpre, $b->vorname, $b->nachname, $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 .= '
+
+
+
+ Datum
+ Abgabe/Bezeichnung
+ Status
+
+
+ ';
+
+ $printed = []; // lazy hack to avoid duplicate rows
+ foreach ($issueAbgaben as $abgabe) {
+ // if we had this paabgabe already (erstbetreuer/zweitbetreuer fetch achieves duplicates
+ if(in_array($abgabe->paabgabe_id, $printed)) {
+ continue; // skip this forEach iteration
+ }
+
+ $printed[] = $abgabe->paabgabe_id;
+
+ $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y');
+
+ // label and color
+ if ($abgabe->signatur === false) {
+ $sigLabel = "FEHLENDE SIGNATUR";
+ $sigBg = "#dc3545";
+ } elseif ($abgabe->signatur === 'error') {
+ $sigLabel = "PRÜFUNG FEHLGESCHLAGEN";
+ $sigBg = "#fd7e14";
+ } else {
+ $sigLabel = "DATEI NICHT GEFUNDEN";
+ $sigBg = "#6c757d";
+ }
+
+ $abgabenString .= "
+
+ {$abgabedatumFormatted}
+
+ {$abgabe->bezeichnung}
+
+
+
+ {$sigLabel}
+
+
+ ";
+ }
+
+ $abgabenString .= '
';
+ }
+
+ $abgabenString .= '
';
+
+ // only send the email if at least one project had an issue
+ if ($hasIssues) {
+ $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;
+
+ sendSanchoMail(
+ 'PAANoSigAssSM',
+ $body_fields,
+ $email,
+ $this->p->t('abgabetool', 'c4missingSignatureNotification')
+ );
+
+ $count++;
+ }
+ }
+
+ $this->_ci->logInfo($count . " Emails bezüglich fehlender Signaturen erfolgreich versandt");
+ $this->_ci->logInfo('End job FHC-Core->notifyAssistenzAboutMissingSignatureUploads');
+ }
+
+ /**
+ * 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;
+ }
+ }
+
+ 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 .= '
+
+
+
+ Zieldatum
+ Bezeichnung
+
+
+ ';
+
+ 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 .= "
+
+ {$dateEmailFormatted}
+
+ {$abgabe->bezeichnung} {$kurzbzLine}
+
+ ";
+ }
+
+ $abgabenString .= '
';
+ }
+
+ $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(!$retval) {
+ $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;
+
+ // check if the updatevon field is NOT the same as the student the projektarbeit is assigned to
+ // since uploading a file to a paabgabe is also putting updateamum & updatevon
+ // we have our own "student has uploaded a file" emailjob anyways
+ if($newOrChangedAbgabe->student_uid === $newOrChangedAbgabe->updatevon) {
+ continue;
+ }
+
+ // 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;
+ }
+ }
+
+ if(count($projektarbeiten) == 0) {
+ $this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt");
+ return;
+ }
+
+ // 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;
+
+ $relevantCounter = 0; // workaround to check if a betreuer needs to have any notification about relevant
+ // abgaben at all to avoid sending empty emails since we filter on certain conditions
+ 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;
+ }
+
+ $relevantCounter++;
+
+ // 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 .= '
+
+
+
+ Zieldatum
+ Bezeichnung
+
+
+ ';
+
+ 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 .= "
+
+ {$dateEmailFormatted}
+
+ {$abgabe->bezeichnung} {$kurzbzLine}
+
+ ";
+ }
+
+ $abgabenString .= '
';
+ }
+
+ // close container
+ $abgabenString .= '
';
+
+ // done with building the change list, now send it
+ $betreuerRow = $tupelArr[0][1];
+
+ if($relevantCounter == 0) {
+ $this->_ci->logInfo('No Relevant Abgaben to notify Betreuer PersonID: "'.$betreuerRow->person_id.'".');
+ continue;
+ }
+
+ $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;
+
+ if(!$email) {
+ $this->_ci->logInfo('Could not send Email for Betreuer PersonID: "'.$data->person_id.'".');
+ continue;
+ }
+
+ // 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 = '
+
+
+
+ Zieldatum
+ Studierende/r
+ Bezeichnung
+ Abgabedatum
+
+
+ ';
+
+ 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 .= "
+
+ {$dateEmailFormatted}
+ {$studentFullName}
+
+ {$abgabe->bezeichnung} {$kurzbzLine}
+
+ {$abgabedatumFormatted}
+ ";
+ }
+
+ $abgabenString .= '
';
+
+ $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;
+
+ // in rare cases there are betreuer (often zweitbetreuer) without uid and without private email
+ if(!$email) {
+ $this->_ci->logInfo('Could not send Email for Betreuer PersonID: "'.$data->person_id.'".');
+ continue;
+ }
+
+ // 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 = '
+
+
+
+ Zieldatum
+ Bezeichnung / Hinweis
+
+
+ ';
+
+ foreach ($abgaben as $abgabe) {
+ $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
+
+ // handle the optional Kurzbezeichnung
+ $kurzbzLine = !empty($abgabe->kurzbz) ? "{$abgabe->kurzbz} " : "";
+
+ $abgabenString .= "
+
+
+ {$dateEmailFormatted}
+
+
+ {$abgabe->bezeichnung} {$kurzbzLine}
+
+ ";
+ }
+
+ $abgabenString .= '
';
+
+ $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 996354bb5..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,
@@ -876,11 +876,11 @@ class ReihungstestJob extends JOB_Controller
JOIN PUBLIC.tbl_studiengang ON (tbl_prestudent.studiengang_kz = tbl_studiengang.studiengang_kz)
WHERE tbl_prestudent.person_id = ".$row_ps->person_id."
AND tbl_prestudent.prestudent_id != ".$row_ps->prestudent_id."
- AND get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') IN ('Aufgenommener','Bewerber','Wartender')
+ AND get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') IN ('Aufgenommener','Bewerber','Wartender', 'Student')
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
@@ -894,12 +894,22 @@ class ReihungstestJob extends JOB_Controller
{
foreach ($resultNiedrPrios->retval as $rowNiedrPrios)
{
- // nur Info wenn aufgenommen oder master
- if ($rowNiedrPrios->laststatus == 'Aufgenommener' || $rowNiedrPrios->studiengang_typ == 'm')
+ // nur Info wenn aufgenommen/student oder master
+ if ($rowNiedrPrios->laststatus == 'Aufgenommener' || $rowNiedrPrios->laststatus == 'Student' || $rowNiedrPrios->studiengang_typ == 'm')
{
- // Mail zur Info an Assistenz schicken, dass in höherer Prio aufgenommen wurde
- $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][]
- = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')';
+
+ if ($rowNiedrPrios->laststatus == 'Aufgenommener')
+ {
+ // Mail zur Info an Assistenz schicken, dass in höherer Prio aufgenommen wurde
+ $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][]
+ = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')';
+ }
+ else if ($rowNiedrPrios->laststatus == 'Student')
+ {
+ $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['StudentHoeherePrio'][]
+ = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')';
+ }
+
}
elseif ($rowNiedrPrios->laststatus == 'Bewerber' && $row_ps->prestudenstatus_datum > $rowNiedrPrios->datum)
{
@@ -966,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))
@@ -1061,6 +1071,20 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '';
$content = true;
}
+ if (isset($value['StudentHoeherePrio']) && !isEmptyArray($value['StudentHoeherePrio']))
+ {
+ $mailcontent .= '
+ Folgende Studenten wurden in einem höher priorisierten Studiengang aufgenommen:
';
+ $mailcontent .= '';
+ $mailcontent .= ' ';
+ sort($value['StudentHoeherePrio']);
+ foreach ($value['StudentHoeherePrio'] AS $key=>$bewerber)
+ {
+ $mailcontent .= ''.$bewerber.' ';
+ }
+ $mailcontent .= '
';
+ $content = true;
+ }
if (isset($value['AbgewiesenHoeherePrio']) && !isEmptyArray($value['AbgewiesenHoeherePrio']))
{
$mailcontent .= '
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/CI3_Events.php b/application/core/CI3_Events.php
index 37f6c3f21..ad4aea729 100644
--- a/application/core/CI3_Events.php
+++ b/application/core/CI3_Events.php
@@ -35,7 +35,7 @@ class CI3_Events
});
self::$eventsSorted[$event] = true;
}
-
+
foreach (self::$events[$event] as $conf) {
$conf[1](...$args);
}
diff --git a/application/core/DB_Model.php b/application/core/DB_Model.php
index c3a609f3d..2f33bc82e 100644
--- a/application/core/DB_Model.php
+++ b/application/core/DB_Model.php
@@ -991,14 +991,17 @@ class DB_Model extends CI_Model
// Find and replace all the occurrences of the provided encrypted columns
// with the postgresql decryption function
- $query = preg_replace(
- '/\b' . $encryptedColumn . '\b/',
- sprintf(
- self::CRYPT_WHERE_TEMPLATE,
- $encryptedColumn,
- $decryptionPassword,
- $definition[self::CRYPT_CAST]
- ),
+ $query = preg_replace_callback(
+ '/(?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 05f70ee85..923970923 100644
--- a/application/core/Notiz_Controller.php
+++ b/application/core/Notiz_Controller.php
@@ -8,7 +8,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
{
const DEFAULT_PERMISSION_R = 'admin:r';
const DEFAULT_PERMISSION_RW = 'admin:rw';
- //public function __construct($zuordnung = 'person/Notizzuordnung_model')
+
public function __construct($permissions)
{
$default_permissions = [
@@ -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))
@@ -96,13 +97,13 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
- return $this->terminateWithSuccess(getData($result) ?: []);
+ $this->terminateWithSuccess(getData($result) ?: []);
}
//Override function
protected function isBerechtigt($id, $typeId){
- return $this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
}
public function loadNotiz()
@@ -111,7 +112,6 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$notiz_id = $this->input->post('notiz_id');
- //$this->load->model('person/Notiz_model', 'NotizModel');
$this->NotizModel->addJoin('public.tbl_notiz_dokument', 'notiz_id', 'LEFT');
$this->NotizModel->addSelect('*');
$this->NotizModel->addSelect("TO_CHAR(CASE WHEN public.tbl_notiz.updateamum >= public.tbl_notiz.insertamum
@@ -142,14 +142,9 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$uid = getAuthUID();
- if (isset($_POST['data']))
- {
- $data = json_decode($_POST['data']);
- unset($_POST['data']);
- foreach ($data as $k => $v) {
- $_POST[$k] = $v;
- }
- }
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $this->form_validation->set_data($post_data);
//Form Validation
$this->form_validation->set_rules('titel', 'Titel', 'required', [
@@ -165,26 +160,25 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
- $titel = $this->input->post('titel');
- $text = $this->input->post('text');
- $erledigt = $this->input->post('erledigt');
- $verfasser_uid = isset($_POST['verfasser']) ? $_POST['verfasser'] : $uid;
- $bearbeiter_uid = isset($_POST['bearbeiter']) ? $_POST['bearbeiter'] : null;
- $type = $this->input->post('typeId');
- $start = $this->input->post('start');
- $ende = $this->input->post('ende');
+ $titel = $post_data['titel'];
+ $text = $post_data['text'];
+ $erledigt = $post_data['erledigt'];
+ $bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : null;
+ $type = $post_data['typeId'];
+ $start = isset($post_data['start']) ? $post_data['start'] : null;
+ $ende = isset($post_data['ende']) ? $post_data['ende'] : null;
// Start DB transaction
$this->db->trans_start();
//Save note
- $result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $verfasser_uid,
- "insertvon" => $verfasser_uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid));
+ $result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $uid,
+ "insertvon" => $uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid));
if (isError($result))
{
$this->db->trans_rollback();
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$notiz_id = $result->retval;
@@ -219,7 +213,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result))
{
$this->db->trans_rollback();
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$dms_id_arr[] = $result->retval['dms_id'];
}
@@ -234,34 +228,28 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result))
{
$this->db->trans_rollback();
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
}
}
$this->db->trans_commit();
- return $this->terminateWithSuccess($result);
+ $this->terminateWithSuccess($result);
}
public function updateNotiz()
{
+
$this->load->library('form_validation');
$this->load->library('DmsLib');
- if (isset($_POST['data']))
- {
- $data = json_decode($_POST['data']);
- unset($_POST['data']);
- foreach ($data as $k => $v) {
- $_POST[$k] = $v;
- }
- }
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
- $notiz_id = $this->input->post('notiz_id');
+ $this->form_validation->set_data($post_data);
- if(!$notiz_id)
- {
- $this->terminateWithError($this->p->t('ui','error_missingId',['id'=>'Notiz_id']), self::ERROR_TYPE_GENERAL);
- }
+ $this->form_validation->set_rules('notiz_id', 'Notiz ID', 'required', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'notiz_id'])
+ ]);
//Form Validation
$this->form_validation->set_rules('titel', 'Titel', 'required', [
@@ -279,25 +267,23 @@ abstract class Notiz_Controller extends FHCAPI_Controller
//update Notiz
$uid = getAuthUID();
- $titel = $this->input->post('titel');
- $text = $this->input->post('text');
- $verfasser_uid = isset($_POST['verfasser']) ? $_POST['verfasser'] : $uid;
- $bearbeiter_uid = isset($_POST['bearbeiter']) ? $_POST['bearbeiter'] : $uid;
- $erledigt = $this->input->post('erledigt');
- $start = $this->input->post('start');
- $ende = $this->input->post('ende');
+ $titel = $post_data['titel'];
+ $text = $post_data['text'];
+ $bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : $post_data['bearbeiter_uid'];
+ $erledigt = $post_data['erledigt'];
+ $start = $post_data['start'];
+ $ende = $post_data['ende'];
$result = $this->NotizModel->update(
[
- 'notiz_id' => $notiz_id
+ 'notiz_id' => $post_data['notiz_id'],
],
[
'titel' => $titel,
'updatevon' => $uid,
'updateamum' => date('c'),
'text' => $text,
- 'verfasser_uid' => $verfasser_uid,
- 'bearbeiter_uid' => $bearbeiter_uid,
+ 'bearbeiter_uid' => isEmptyString($bearbeiter_uid) ? null : $bearbeiter_uid,
'start' => $start,
'ende' => $ende,
'erledigt' => $erledigt
@@ -305,14 +291,15 @@ abstract class Notiz_Controller extends FHCAPI_Controller
);
if (isError($result))
{
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
//update(1) loading all dms-entries with this notiz_id
+ $dms_id_arr = [];
$this->load->model('person/Notizdokument_model', 'NotizdokumentModel');
$this->NotizdokumentModel->addJoin('campus.tbl_dms_version', 'dms_id');
- $result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $notiz_id));
+ $result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $post_data['notiz_id']));
$result = $this->getDataOrTerminateWithError($result);
foreach ($result as $doc) {
$dms_id_arr[$doc->dms_id] = array(
@@ -349,7 +336,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$result = $this->getDataOrTerminateWithError($result);
$dms_id = $result['dms_id'];
- $result = $this->NotizdokumentModel->insert(array('notiz_id' => $notiz_id, 'dms_id' => $dms_id));
+ $result = $this->NotizdokumentModel->insert(array('notiz_id' => $post_data['notiz_id'], 'dms_id' => $dms_id));
$this->getDataOrTerminateWithError($result);
}
@@ -363,7 +350,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->getDataOrTerminateWithError($result);
}
- return $this->terminateWithSuccess($result);
+ $this->terminateWithSuccess($result);
}
public function deleteNotiz()
@@ -391,10 +378,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);
}
}
@@ -414,15 +401,15 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result))
{
$this->db->trans_rollback();
- return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if(!hasData($result))
{
- return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
}
$this->db->trans_complete();
- return $this->terminateWithSuccess(getData($result));
+ $this->terminateWithSuccess(getData($result));
}
public function loadDokumente()
@@ -438,14 +425,14 @@ abstract class Notiz_Controller extends FHCAPI_Controller
array('public.tbl_notiz.notiz_id' => $notiz_id)
);
if (isError($result)) {
- return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if(!hasData($result))
{
- return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
}
- return $this->terminateWithSuccess(getData($result));
+ $this->terminateWithSuccess(getData($result));
}
public function getMitarbeiter($searchString)
@@ -455,7 +442,23 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
- return $this->terminateWithSuccess($result);
+ $this->terminateWithSuccess($result);
}
-}
\ No newline at end of file
+ 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);
+ }
+
+}
diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php
index 6f6cef31b..5b9bac6c5 100644
--- a/application/core/Tag_Controller.php
+++ b/application/core/Tag_Controller.php
@@ -29,32 +29,63 @@ 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.titel,
tbl_notiz.text,
- array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
+ array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $language. " as bezeichnung,
tbl_notiz.notiz_id,
tbl_notiz_typ.style,
tbl_notiz.erledigt as done,
tbl_notiz.insertamum,
tbl_notiz.updateamum,
- tbl_notiz.insertvon,
- tbl_notiz.updatevon
- '
+ (verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
+ (bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter
+ "
);
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
+
+ $this->NotizModel->addJoin('public.tbl_benutzer verfasserbenutzer', 'tbl_notiz.verfasser_uid = verfasserbenutzer.uid', 'LEFT');
+ $this->NotizModel->addJoin('public.tbl_person verfasserperson', 'verfasserbenutzer.person_id = verfasserperson.person_id', 'LEFT');
+
+ $this->NotizModel->addJoin('public.tbl_benutzer bearbeiterbenutzer', 'tbl_notiz.bearbeiter_uid = bearbeiterbenutzer.uid', 'LEFT');
+ $this->NotizModel->addJoin('public.tbl_person bearbeiterperson', 'bearbeiterbenutzer.person_id = bearbeiterperson.person_id', 'LEFT');
+
$notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id));
$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,
@@ -65,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)
{
@@ -117,40 +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)
+ 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();
- $updateData = $this->NotizModel->update(array('notiz_id' => $postData->id),
- array('erledigt' => !$postData->done)
- );
+ $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)
@@ -183,5 +279,36 @@ class Tag_Controller extends FHCAPI_Controller
show_error('User authentification failed');
}
+ private function _getLanguageIndex()
+ {
+ $this->load->model('system/Sprache_model', 'SpracheModel');
+ $this->SpracheModel->addSelect('index');
+ $result = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage()));
+
+ return hasData($result) ? getData($result)[0]->index : 1;
+ }
+
+ 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 40aed007c..06cfa1cfd 100644
--- a/application/helpers/hlp_common_helper.php
+++ b/application/helpers/hlp_common_helper.php
@@ -91,7 +91,7 @@ function var_dump_to_error_log($parameter)
var_dump($parameter); // KEEP IT!!!
$ob_get_contents = ob_get_contents();
ob_end_clean();
- error_log(str_replace("\n", '', $ob_get_contents)); // KEEP IT!!!
+ error_log(str_replace("\n", '', $ob_get_contents) . ', referer: ' . "http".(!empty($_SERVER['HTTPS'])?"s":"")."://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); // KEEP IT!!!
}
/**
@@ -408,28 +408,30 @@ function findResource($path, $resource, $subdir = false, $extraDir = null)
return null;
}
-/**
- * check if String can be converted to a date
- */
-function isValidDate($dateString)
-{
- try
- {
- return (new DateTime($dateString)) !== false;
- }
- catch(Exception $e)
- {
- return false;
- }
-}
+// ------------------------------------------------------------------------
+// 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
// ------------------------------------------------------------------------
/**
- * check if string can be converted to a date
+ * Check if the provided parameter is a string containing a valid date
+ * NOTE: the name is in the "snake case" format because othewise the CI form validation _cannot_ use it
*/
function is_valid_date($dateString)
{
@@ -498,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 ea1795ad5..27dfba5a1 100644
--- a/application/helpers/hlp_header_helper.php
+++ b/application/helpers/hlp_header_helper.php
@@ -87,18 +87,37 @@ 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){
+ return ['sprache'=>$language->sprache, 'LC_Time'=>$language->locale, 'bezeichnung'=>$language->bezeichnung[$language->index-1]];
+ }, $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,
+ 'called_path' => $calledPath,
+ 'called_method' => $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";
$toPrint .= '';
$toPrint .= "\n\n";
@@ -166,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;
@@ -217,3 +244,224 @@ 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;
+}
+
+/*
+ * Manipulate CI views includes Array to load
+ * - public/js/FhcApps.js via customJSs and
+ * - app customisation js and/or css from extensions via customJSModules
+ * if customJSModules contains at least one vuejs app and customisation files
+ * exist in extensions
+ */
+class ExtendableAppsHelper
+{
+ private static $instance = null;
+
+ protected $extensions;
+
+ protected $customCSSs;
+ protected $customJSs;
+ protected $customJSModules;
+
+ protected $initialised;
+ protected $appscount;
+
+ protected $extCustomCSSs;
+ protected $extCustomJSs;
+ protected $extCustomJSModules;
+
+ private function __construct()
+ {
+ $this->extensions = array();
+ $this->customCSSs = null;
+ $this->customJSs = null;
+ $this->customJSModules = null;
+
+ $this->initialised = false;
+ $this->appscount = 0;
+
+ $this->extCustomCSSs = null;
+ $this->extCustomJSs = null;
+ $this->extCustomJSModules = null;
+ }
+
+ public static function getInstance()
+ {
+ if(self::$instance === null)
+ {
+ self::$instance = new ExtendableAppsHelper();
+ }
+ return self::$instance;
+ }
+
+ public function init($customCSSs, $customJSs, $customJSModules)
+ {
+ if($this->initialised)
+ {
+ return;
+ }
+
+ $this->customCSSs = $customCSSs;
+ $this->customJSs = $customJSs;
+ $this->customJSModules = $customJSModules;
+ $this->initialised = true;
+
+ if(!isset($this->customJSModules))
+ {
+ return;
+ }
+
+ if(!is_array($this->customJSModules))
+ {
+ $this->customJSModules = array($this->customJSModules);
+ }
+
+ if(count($this->customJSModules) < 1)
+ {
+ return;
+ }
+
+ $this->buildExtensionsList();
+ $this->prepareExtendedArrays();
+ }
+
+ public function getCustomCSSs()
+ {
+ if(is_null($this->extCustomCSSs))
+ {
+ return $this->customCSSs;
+ }
+ return $this->extCustomCSSs;
+ }
+
+ public function getCustomJSs()
+ {
+ if(is_null($this->extCustomJSs))
+ {
+ return $this->customJSs;
+ }
+ return $this->extCustomJSs;
+ }
+
+ public function getCustomJSModules()
+ {
+ if(is_null($this->extCustomJSModules))
+ {
+ return $this->customJSModules;
+ }
+ return $this->extCustomJSModules;
+ }
+
+ protected function buildExtensionsList()
+ {
+ $this->extensions = array();
+ $fsiterator = new FilesystemIterator(FHCPATH . 'application/extensions');
+ foreach ($fsiterator as $fsitem)
+ {
+ if(preg_match('/^FHC-Core-/', $fsitem->getBasename()))
+ {
+ $this->extensions[] = $fsitem->getBasename();
+ }
+ }
+ }
+
+ protected function prepareExtendedArrays()
+ {
+ $this->appscount = 0;
+ $this->initExtCustomCSSs();
+ $this->extCustomJSModules = array();
+ foreach($this->customJSModules as $item)
+ {
+ $matches = array();
+ if(preg_match('#^public/(extensions/FHC-Core-.+)?js/apps/(.*)\.js$#', $item, $matches))
+ {
+ $this->appscount++;
+
+ $fhcextension = $matches[1];
+ $app = $matches[2];
+
+ $extend_js_suffix = 'js/extend_app/' . $fhcextension . $app . '.js';
+ $extend_css_suffix = 'css/extend_app/' . $fhcextension . $app . '.css';
+
+ foreach($this->extensions as $extension)
+ {
+ $extend_js = 'public/extensions/' . $extension . '/' . $extend_js_suffix;
+ $extend_css = 'public/extensions/' . $extension . '/' . $extend_css_suffix;
+
+ if(is_readable(FHCPATH . $extend_js))
+ {
+ array_push($this->extCustomJSModules, $extend_js);
+ }
+
+ if(is_readable(FHCPATH . $extend_css))
+ {
+ array_push($this->extCustomCSSs, $extend_css);
+ }
+ }
+ }
+ array_push($this->extCustomJSModules, $item);
+ }
+
+ if($this->appscount > 0)
+ {
+ $this->addFhcAppsJs();
+ }
+ }
+
+ protected function initExtCustomCSSs()
+ {
+ if(!isset($this->customCSSs))
+ {
+ $this->extCustomCSSs = array();
+ }
+ elseif(!is_array($this->customCSSs))
+ {
+ $this->extCustomCSSs = array($this->customCSSs);
+ }
+ else
+ {
+ $this->extCustomCSSs = $this->customCSSs;
+ }
+ }
+
+ protected function addFhcAppsJs()
+ {
+ if(!isset($this->customJSs))
+ {
+ $this->extCustomJSs = array();
+ }
+ elseif(!is_array($this->customJSs))
+ {
+ $this->extCustomJSs = array($this->customJSs);
+ }
+ else
+ {
+ $this->extCustomJSs = $this->customJSs;
+ }
+ array_push($this->extCustomJSs, 'public/js/FhcApps.js');
+ }
+}
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..3d8a2ea26 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
]);
}
}
@@ -126,7 +128,7 @@ class AntragLib
return $this->_ci->StudierendenantragstatusModel->resumeAntraegeForAbmeldungStgl($antrag_id);
}
// NOTE(chris): get last status that is not pause
- $this->_ci->StudierendenantragstatusModel->addOrder('insertamum');
+ $this->_ci->StudierendenantragstatusModel->addOrder('insertamum', 'DESC');
$this->_ci->StudierendenantragstatusModel->addLimit(1);
$result = $this->_ci->StudierendenantragstatusModel->loadWhere([
'studierendenantrag_id' => $antrag_id,
@@ -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/CmsLib.php b/application/libraries/CmsLib.php
index b65e2a71c..355cf7c56 100644
--- a/application/libraries/CmsLib.php
+++ b/application/libraries/CmsLib.php
@@ -43,7 +43,7 @@ class CmsLib
* @param string $sprache
* @param boolean $sichtbar
*
- * @return void
+ * @return stdClass
*/
public function getContent($content_id, $version = null, $sprache = null, $sichtbar = true)
{
@@ -105,7 +105,19 @@ class CmsLib
if($content->titel){
$betreff = $content->titel;
}else{
+ //DomDocument getElementsByTagName returns a DomNodeList
$betreff = $XML->getElementsByTagName('betreff');
+ //check if any betreff was found and if it is not empty
+ if($betreff->length > 0 && !empty($betreff->item(0)->nodeValue))
+ {
+ //DomNodeList item() return a DomNode, property nodeValue contains the value of the node
+ $betreff = $betreff->item(0)->nodeValue;
+
+ }
+ else
+ {
+ return error('no betreff found for the content');
+ }
}
$xsltemplate = new DOMDocument();
@@ -221,7 +233,7 @@ class CmsLib
*
* @return void
*/
- public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true, $page = 1, $page_size = 10)
+ public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true, $page = 1, $page_size = 10, $sprache)
{
$this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
list($studiengang_kz, $semester) = $this->getStgAndSem($studiengang_kz, $semester);
@@ -230,13 +242,13 @@ class CmsLib
$xml = '';
$this->ci->load->model('content/News_model', 'NewsModel');
- $news = $this->ci->NewsModel->getNewsWithContent(getSprache(), $studiengang_kz, $semester, null, $sichtbar, 0, $page, $page_size, $all, $mischen);
+ $news = $this->ci->NewsModel->getNewsWithContent($sprache, $studiengang_kz, $semester, null, $sichtbar, 0, $page, $page_size, $all, $mischen);
if (isError($news))
return $news;
$news = getData($news);
- //var_dump($news->maxPageCount);
+
foreach ($news as $newsobj) {
if ($studiengang_kz && $edit && !$newsobj->studiengang_kz)
continue;
@@ -247,7 +259,7 @@ class CmsLib
$xml .= "" . $newsobj->content . $datum . $id . " ";
}
- if ($studiengang_kz != 0) {
+ /* if ($studiengang_kz != 0) {
$stg_obj = $this->ci->StudiengangModel->load($studiengang_kz);
if (isError($stg_obj))
return $stg_obj;
@@ -262,7 +274,7 @@ class CmsLib
}
$xml .= 'bezeichnung . ']]> ';
}
- }
+ } */
if ($titel != '') {
$xml .= '' . $titel . ' ';
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/DocsboxLib.php b/application/libraries/DocsboxLib.php
index f9167c379..184855ad8 100644
--- a/application/libraries/DocsboxLib.php
+++ b/application/libraries/DocsboxLib.php
@@ -180,7 +180,8 @@ class DocsboxLib
}
// Just started or still working on it
elseif ($getStatusResponse->body->status == self::STATUS_WORKING
- || $getStatusResponse->body->status == self::STATUS_STARTED)
+ || $getStatusResponse->body->status == self::STATUS_STARTED
+ || $getStatusResponse->body->status == self::STATUS_QUEUED)
{
// go on!
}
diff --git a/application/libraries/DocumentExportLib.php b/application/libraries/DocumentExportLib.php
new file mode 100644
index 000000000..a75047cf9
--- /dev/null
+++ b/application/libraries/DocumentExportLib.php
@@ -0,0 +1,719 @@
+vorlage_kurzbz, $oe_kurzbz, $version);
+ * $doc->setFilename($filename);
+ * $doc->addDataXML($data);
+ * $doc->addImage($imagepath, $imagename, $imagecontenttype);
+ * $doc->create($outputformat);
+ * $doc->output(true);
+ * $doc->close();
+ *
+ * New:
+ * $xml_data = $this->documentexportlib->getDataXML($data);
+ * $images = [[
+ * 'path' => $imagepath,
+ * 'name' => $imagename,
+ * 'contenttype' => $imagecontenttype
+ * ]];
+ * $this->documentexportlib->showContent(
+ * $filename,
+ * $vorlage,
+ * $xml_data,
+ * $oe_kurzbz,
+ * $version,
+ * $outputformat,
+ * null,
+ * null,
+ * $images
+ * );
+ */
+class DocumentExportLib
+{
+ private $unoconv_version;
+
+ /**
+ * Constructor
+ */
+ public function __construct()
+ {
+ // Gets CI instance
+ $this->ci =& get_instance();
+
+ // Load Phrases
+ $this->ci->load->library('PhrasesLib', ['document_export', null], 'documentExportPhrases');
+
+ // Which document converter has to be used
+ if (defined('DOCSBOX_ENABLED') && DOCSBOX_ENABLED === true)
+ {
+ // Use docsbox!!
+ }
+ else
+ {
+ exec('unoconv --version', $ret_arr);
+
+ if(isset($ret_arr[0]))
+ {
+ $hlp = explode(' ', $ret_arr[0]);
+ if(isset($hlp[1]))
+ {
+ $this->unoconv_version = $hlp[1];
+ }
+ else
+ show_error($this->ci->documentExportPhrases->t("document_export", "error_unoconv_version"));
+ }
+ else
+ show_error($this->ci->documentExportPhrases->t("document_export", "error_unoconv"));
+ }
+ }
+
+ /**
+ * Laedt die XML Daten fuer die XSL Transformation anhand eines Arrays
+ *
+ * @param array $data Array mit Daten
+ * @param string $root Bezeichnung des Root Nodes
+ *
+ * @return DOMDocument
+ */
+ public function getDataArray($data, $root)
+ {
+ $xml_data = new DOMDocument();
+ $xml_data->loadXML($this->convertArrayToXML($data, $root));
+ return $xml_data;
+ }
+
+ /**
+ * XML Daten fuer die XSL Transformation
+ *
+ * @param string $xml
+ *
+ * @return DOMDocument
+ */
+ public function getDataXML($xml)
+ {
+ $xml_data = new DOMDocument();
+ $xml_data->loadXML($xml);
+ return $xml_data;
+ }
+
+ /**
+ * URL zu XML Datei die fuer XSLTransformation verwendet werden soll
+ *
+ * @param string $xml URL to XML
+ * @param string $params GET parameter
+ *
+ * @return stdClass
+ */
+ public function getDataURL($xml, $params)
+ {
+ $xml_found = false;
+
+ $aktive_addons = array_filter(array_map('trim', explode(";", ACTIVE_ADDONS)));
+ foreach($aktive_addons as $addon) {
+ $xmlfile = DOC_ROOT . 'addons/' . $addon . '/rdf/' . $xml;
+ if (file_exists($xmlfile)) {
+ $xml_found = true;
+ $xml_url = XML_ROOT . '../addons/' . $addon . '/rdf/' . $xml . '?' . $params;
+ break;
+ }
+ }
+ if (!$xml_found)
+ $xml_url = XML_ROOT . $xml . '?' . $params;
+
+
+ // Load the XML source
+ $xml_data = new DOMDocument;
+
+ if (!$xml_data->load($xml_url))
+ return error($this->ci->documentExportPhrases->t("document_export", "error_xml_load", [
+ "url" => $xml_url,
+ "xml" => $xml,
+ "params" => $params
+ ]));
+
+ return success($xml_data);
+ }
+
+ /**
+ * Adds a XML Tag for signatur to the document
+ *
+ * @param DomDocument $xml_data
+ *
+ * @return void
+ */
+ protected function addSignToData($xml_data)
+ {
+ $signblock = $xml_data->createElement("signed", "true");
+ $xml_data->documentElement->appendChild($signblock);
+ }
+
+ /**
+ * Adds a XML Tag for archive to the document
+ *
+ * @param DomDocument $xml_data
+ *
+ * @return void
+ */
+ public function addArchiveToData($xml_data)
+ {
+ $archiv = $xml_data->createElement("archivierbar", "true");
+ $xml_data->documentElement->appendChild($archiv);
+ }
+
+ /**
+ * Get the contents of a Document
+ *
+ * @param stdClass $vorlage A db entry from tbl_vorlage
+ * @param DomDocument $xml_data
+ * @param string $oe_kurzbz
+ * @param integer|null $version (optional)
+ * @param string $outputformat (optional)
+ * @param string $sign_user (optional) Must be a valid uid
+ * @param string $sign_profile (optional) Signatureprofile for signing
+ * @param array $images (optional) Each element should have a property path, name & contenttype which are all strings
+ *
+ * @return stdClass
+ */
+ public function getContent(
+ $vorlage,
+ $xml_data,
+ $oe_kurzbz,
+ $version = null,
+ $outputformat = null,
+ $sign_user = null,
+ $sign_profile = null,
+ $images = []
+ ) {
+ $source_folder = getcwd();
+ $temp_folder = sys_get_temp_dir() . '/fhcunoconv-' . uniqid();
+
+ $outputformat = $this->getDefaultOutputFormat($outputformat, $vorlage->mimetype);
+
+ $result = $this->createAndSignContent(
+ $temp_folder,
+ $outputformat,
+ $vorlage,
+ $oe_kurzbz,
+ $version,
+ $xml_data,
+ $images,
+ $sign_user,
+ $sign_profile
+ );
+ if (isError($result)) {
+ $this->close($temp_folder, $source_folder);
+ return $result;
+ }
+ $temp_filename = getData($result);
+
+ $fsize = filesize($temp_filename);
+ $handle = fopen($temp_filename, 'r');
+ if (!$handle)
+ return error($this->ci->documentExportPhrases->t("document_export", "error_file_load"));
+ $result = fread($handle, $fsize);
+ fclose($handle);
+
+ $this->close($temp_folder, $source_folder);
+
+ return success($result);
+ }
+
+ /**
+ * Sets the headers and displays the Document.
+ * On failure the exit() function will be called
+ *
+ * @param string $filename
+ * @param stdClass $vorlage A db entry from tbl_vorlage
+ * @param DomDocument $xml_data
+ * @param string $oe_kurzbz
+ * @param integer|null $version (optional)
+ * @param string $outputformat (optional)
+ * @param string $sign_user (optional) Must be a valid uid
+ * @param string $sign_profile (optional) Signatureprofile for signing
+ * @param array $images (optional) Each element should have a property path, name & contenttype which are all strings
+ *
+ * @return void
+ */
+ public function showContent(
+ $filename,
+ $vorlage,
+ $xml_data,
+ $oe_kurzbz,
+ $version = null,
+ $outputformat = null,
+ $sign_user = null,
+ $sign_profile = null,
+ $images = []
+ ) {
+ $source_folder = getcwd();
+ $temp_folder = sys_get_temp_dir() . '/fhcunoconv-' . uniqid();
+
+ $outputformat = $this->getDefaultOutputFormat($outputformat, $vorlage->mimetype);
+
+ $result = $this->createAndSignContent(
+ $temp_folder,
+ $outputformat,
+ $vorlage,
+ $oe_kurzbz,
+ $version,
+ $xml_data,
+ $images,
+ $sign_user,
+ $sign_profile
+ );
+ if (isError($result)) {
+ $this->close($temp_folder, $source_folder);
+ exit(getError($result));
+ }
+ $temp_filename = getData($result);
+
+ $fsize = filesize($temp_filename);
+ $handle = fopen($temp_filename, 'r');
+ if (!$handle) {
+ $this->close($temp_folder, $source_folder);
+ exit($this->ci->documentExportPhrases->t("document_export", "error_file_load"));
+ }
+
+ if (headers_sent()) {
+ $this->close($temp_folder, $source_folder);
+ exit($this->ci->documentExportPhrases->t("document_export", "error_headers"));
+ }
+
+ switch ($outputformat) {
+ case 'pdf':
+ header('Content-type: application/pdf');
+ header('Content-Disposition: attachment; filename="' . $filename . '.pdf"');
+ header('Content-Length: ' . $fsize);
+ break;
+
+ case 'doc':
+ header('Content-type: application/vnd.ms-word');
+ header('Content-Disposition: attachment; filename="' . $filename . '.doc"');
+ header('Content-Length: ' . $fsize);
+ break;
+
+ case 'odt':
+ header('Content-type: application/vnd.oasis.opendocument.text');
+ header('Content-Disposition: attachment; filename="' . $filename . '.odt"');
+ header('Content-Length: ' . $fsize);
+ break;
+ default:
+ $this->close($temp_folder, $source_folder);
+ exit($this->ci->documentExportPhrases->t("document_export", "error_outputformat_missing"));
+ }
+
+ while (!feof($handle)) {
+ echo fread($handle, 8192);
+ }
+ fclose($handle);
+
+ $this->close($temp_folder, $source_folder);
+ }
+
+ /**
+ * Helper function for getContent and showContent.
+ * Creates the temp folder and calls create and sign functions.
+ *
+ * @param string $temp_folder
+ * @param string $outputformat
+ * @param stdClass $vorlage
+ * @param string $oe_kurzbz
+ * @param integer $version
+ * @param DomDocument $xml_data
+ * @param array $images Each element should have a property path, name and contenttype which are all strings
+ * @param string $sign_user Must be a valid uid
+ * @param string $sign_profile Signatureprofile for signing
+ *
+ * @return stdClass
+ */
+ protected function createAndSignContent(
+ $temp_folder,
+ $outputformat,
+ $vorlage,
+ $oe_kurzbz,
+ $version,
+ $xml_data,
+ $images,
+ $sign_user,
+ $sign_profile
+ ) {
+ mkdir($temp_folder);
+ chdir($temp_folder);
+
+ $this->ci->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
+
+ $result = $this->ci->VorlagestudiengangModel->getCurrent($vorlage->vorlage_kurzbz, $oe_kurzbz, $version);
+ if (isError($result))
+ return $result;
+ if (!hasData($result))
+ return error($this->ci->documentExportPhrases->t("document_export", "error_template_missing"));
+ $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)
+ {
+ $result = $this->sign($temp_folder, $temp_filename, $outputformat, $sign_user, $sign_profile);
+ if (isError($result))
+ return $result;
+
+ $temp_filename = getData($result);
+ }
+
+ return success($temp_filename);
+ }
+
+ /**
+ * Helper function for createAndSignContent.
+ * Creates the files in the temp folder.
+ *
+ * @param string $temp_folder
+ * @param string $outputformat
+ * @param stdClass $vorlage
+ * @param DomDocument $xml_data
+ * @param array $images Each element should have a property path, name and contenttype which are all strings
+ *
+ * @return stdClass
+ */
+ protected function create($temp_folder, $outputformat, $vorlage, $xml_data, $images)
+ {
+ $content_xsl = new DOMDocument();
+ if (!$content_xsl->loadXML($vorlage->text))
+ return error($this->ci->documentExportPhrases->t("document_export", "error_xsl_load"));
+
+ $proc = new XSLTProcessor();
+ $proc->importStyleSheet($content_xsl);
+
+ $contentbuffer = $proc->transformToXml($xml_data);
+
+ file_put_contents($temp_folder . '/content.xml', $contentbuffer);
+
+ 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();
+ if (!$styles_xsl->loadXML($vorlage->style))
+ return error($this->ci->documentExportPhrases->t("document_export", "error_styles_load"));
+ $style_proc = new XSLTProcessor();
+ $style_proc->importStyleSheet($styles_xsl);
+
+ $stylesbuffer = $style_proc->transformToXml($xml_data);
+
+ file_put_contents($temp_folder . '/styles.xml', $stylesbuffer);
+ }
+
+ // 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;
+
+ if (file_exists($zipfile)) {
+ $vorlage_found = true;
+ break;
+ }
+ }
+ if (!$vorlage_found)
+ $zipfile = DOC_ROOT . 'system/vorlage_zip/' . $vorlage_filename;
+
+ $tempname_zip = $temp_folder . '/out.zip';
+
+ if (!copy($zipfile, $tempname_zip))
+ return error($this->ci->documentExportPhrases->t("document_export", "error_file_copy"));
+
+ exec("zip $tempname_zip content.xml");
+ if (!is_null($styles_xsl))
+ exec("zip $tempname_zip styles.xml");
+
+ // bilder hinzufuegen
+ if (count($images) > 0)
+ {
+ // Unterordner fuer die Bilder erstellen
+ mkdir('Pictures');
+
+ // Manifest Datei holen
+ exec('unzip ' . $tempname_zip . ' META-INF/manifest.xml');
+
+ // Bild zur Manifest Datei hinzufuegen
+ $manifest = file_get_contents('META-INF/manifest.xml');
+
+ $manifest_xml = new DOMDocument;
+ if (!$manifest_xml->loadXML($manifest))
+ return error($this->ci->documentExportPhrases->t("document_export", "error_manifest"));
+
+ //root-node holen
+ $root = $manifest_xml->getElementsByTagName('manifest')->item(0);
+
+ foreach ($images as $bild) {
+ copy($bild['path'], 'Pictures/' . $bild['name']);
+
+ //Neues Element unterhalb des Root Nodes anlegen
+ $node = $manifest_xml->createElement("manifest:file-entry");
+ $node->setAttribute("manifest:full-path", 'Pictures/' . $bild['name']);
+ $node->setAttribute("manifest:media-type", $bild['contenttype']);
+ $root->appendChild($node);
+ }
+
+ $out = $manifest_xml->saveXML();
+
+ //geaenderte Manifest Datei speichern und wieder ins Zip packen
+ file_put_contents('META-INF/manifest.xml', $out);
+ exec('zip ' . $tempname_zip . ' META-INF/*');
+
+ // Bilder zum ZIP-File hinzufuegen
+ exec('zip ' . $tempname_zip . ' Pictures/*');
+ }
+
+ clearstatcache();
+
+ switch ($outputformat) {
+ case 'pdf':
+ case 'doc':
+ $ret = 0;
+ $temp_filename = $temp_folder . '/out.' . $outputformat;
+
+ if (defined('DOCSBOX_ENABLED') && DOCSBOX_ENABLED === true) {
+ // Use docsbox
+
+ $this->ci->load->library("DocsboxLib");
+
+ $docboxlib = get_class($this->ci->docboxlib);
+
+ $ret = $docboxlib::convert($tempname_zip, $temp_filename, $outputformat);
+ } else {
+ // Use unoconv
+
+ // Unoconv Version 0.6 hat eine Bug wodurch die Berechtigungen des PDF/Doc nicht korrekt gesetzt
+ // werden. Deshalb wird dies hier speziell behandelt.
+ // Die 2. Variante hat den Vorteil dass hier eine bessere Fehlerbehandlung moeglich ist
+ if ($this->unoconv_version == '0.6')
+ $command = 'unoconv -e IsSkipEmptyPages=false -f ' . $outputformat . ' %2$s > %1$s';
+ else
+ $command = 'unoconv -e IsSkipEmptyPages=false -f ' . $outputformat . ' --output %s %s 2>&1';
+
+ $command = sprintf($command, $temp_filename, $tempname_zip);
+
+ exec($command, $out, $ret);
+ }
+
+ if ($ret)
+ return error($this->ci->documentExportPhrases->t("document_export", "error_conv_timeout"));
+ break;
+ case 'odt':
+ default:
+ $temp_filename = $tempname_zip;
+ }
+
+ return success($temp_filename);
+ }
+
+ /**
+ * Helper function for createAndSignContent.
+ * Signs the main file in the temp folder.
+ *
+ * @param string $temp_folder
+ * @param string $temp_filename
+ * @param string $outputformat
+ * @param string $user Must be a valid uid
+ * @param string $profile Signatureprofile for signing
+ *
+ * @return stdClass
+ */
+ protected function sign($temp_folder, $temp_filename, $outputformat, $user, $profile)
+ {
+ if ($outputformat != 'pdf')
+ return error($this->ci->documentExportPhrases->t("document_export", "error_sign_pdf"));
+
+ // Load the File
+ $file_data = file_get_contents($temp_filename);
+
+ $data = new stdClass();
+ $data->document = base64_encode($file_data);
+
+ // Signatur Profil
+ if (!is_null($profile))
+ $data->profile = $profile;
+ else
+ $data->profile = SIGNATUR_DEFAULT_PROFILE;
+
+ // Username des Endusers der die Signatur angefordert hat
+ $data->user = $user;
+
+ $ch = curl_init();
+
+ curl_setopt($ch, CURLOPT_URL, SIGNATUR_URL . '/' . SIGNATUR_SIGN_API);
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 7);
+ curl_setopt($ch, CURLOPT_USERAGENT, "FH-Complete");
+
+ // SSL Zertifikatsprüfung deaktivieren
+ // Besser ist es das Zertifikat am Server zu installieren!
+ //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+ //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+
+ $data_string = json_encode($data, JSON_FORCE_OBJECT);
+
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, [
+ 'Content-Type: application/json',
+ 'Content-Length:' . mb_strlen($data_string),
+ 'Authorization: Basic ' . base64_encode(SIGNATUR_USER . ":" . SIGNATUR_PASSWORD)
+ ]);
+
+ $result = curl_exec($ch);
+ if (curl_errno($ch)) {
+ curl_close($ch);
+ return error($this->ci->documentExportPhrases->t("document_export", "error_sign_timeout"));
+ }
+ curl_close($ch);
+ $resultdata = json_decode($result);
+
+ // If it is success
+ if (isset($resultdata->error) && $resultdata->error == 0) {
+ $signed_filename = $temp_folder . '/signed.pdf';
+ file_put_contents($signed_filename, base64_decode($resultdata->retval));
+ return success($signed_filename);
+ }
+
+ // otherwise if it is an error
+ return error($resultdata->retval ?? $this->ci->documentExportPhrases->t("global", "unknown_error", ["error" => $result]));
+ }
+
+ /**
+ * Deletes all files in the $temp_folder and changes back to the source_folder
+ *
+ * @param string $temp_folder
+ * @param string $source_folder
+ *
+ * @return void
+ */
+ protected function close($temp_folder, $source_folder)
+ {
+ $files = glob($temp_folder . '/*'); // get all file names
+ foreach ($files as $file)
+ if (is_file($file))
+ unlink($file);
+
+ chdir($source_folder);
+ rmdir($temp_folder);
+ }
+
+ /**
+ * Convert an array to XML
+ *
+ * @param array $data
+ * @param string $root
+ * @param SimpleXMLElement $xml_data
+ *
+ * @return string|boolean
+ */
+ private function convertArrayToXML($data, $root = null, $xml_data = null)
+ {
+ $_xml_data = $xml_data;
+ if ($_xml_data === null)
+ $_xml_data = new SimpleXMLElement($root !== null ? '<' . $root . ' />' : ' ');
+
+ foreach ($data as $key => $value) {
+ if (is_array($value)) {
+ if (is_numeric($key)) {
+ $key = 'item' . $key; // dealing with <0/>.. issues
+ $this->convertArrayToXML($value, null, $_xml_data);
+ } else {
+ $subnode = $_xml_data->addChild($key);
+ $this->convertArrayToXML($value, null, $subnode);
+ }
+ } else {
+ // Remove UTF8 Control Characters (breaking XML)
+ $value = preg_replace('/[\x00-\x1F\x7F]/u', '', $value);
+ $_xml_data->addChild((string)$key, htmlspecialchars("$value"));
+ }
+ }
+
+ return $_xml_data->asXML();
+ }
+
+ /**
+ * Get default outputformat from mimetype if its not set
+ *
+ * @param string $outputformat
+ * @param string $mimetype
+ *
+ * @return string
+ */
+ private function getDefaultOutputFormat($outputformat, $mimetype)
+ {
+ 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 c1a2b47cb..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(
@@ -371,21 +369,21 @@ class FilterCmptLib
foreach ($filterFields as $filterField)
{
// If not an empty array
- if ($filterField != null)
+ if (!isEmptyArray($filterField))
{
//
- if (isset($filterField->name) && isset($filterField->operation) && isset($filterField->condition)
- && !isEmptyString($filterField->name) && !isEmptyString($filterField->operation)
- && !isEmptyString($filterField->condition))
+ if (isset($filterField['name']) && isset($filterField['operation']) && isset($filterField['condition'])
+ && !isEmptyString($filterField['name']) && !isEmptyString($filterField['operation'])
+ && !isEmptyString((string)$filterField['condition']))
{
// Fine
$filter = new stdClass();
- $filter->name = $filterField->name;
- $filter->operation = $filterField->operation;
- $filter->condition = $filterField->condition;
- if (isset($filterField->option) && !isEmptyString($filterField->option))
+ $filter->name = $filterField['name'];
+ $filter->operation = $filterField['operation'];
+ $filter->condition = $filterField['condition'];
+ if (isset($filterField['option']) && !isEmptyString($filterField['option']))
{
- $filter->option = $filterField->option;
+ $filter->option = $filterField['option'];
}
else
{
@@ -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)
@@ -1173,4 +1173,5 @@ class FilterCmptLib
return $filterName;
}
-}
\ No newline at end of file
+}
+
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..d3fdc6642 100644
--- a/application/libraries/PermissionLib.php
+++ b/application/libraries/PermissionLib.php
@@ -50,6 +50,7 @@ class PermissionLib
const LOGINAS_PERSONIDS_BLACKLIST = 'permission_loginas_personids_blacklist';
private $_ci; // CI instance
+ private $access_rights; // current users access rights
private static $bb; // benutzerberechtigung
/**
@@ -61,6 +62,8 @@ class PermissionLib
// Loads CI instance
$this->_ci =& get_instance();
+ $this->access_rights = null;
+
$this->_ci->config->load('permission'); // Loads permission configuration
// If it's NOT called from command line
@@ -69,8 +72,10 @@ class PermissionLib
// API Caller rights initialization
$authObj = $this->_ci->authlib->getAuthObj();
self::$bb = new benutzerberechtigung();
- if ($authObj)
+ if ($authObj) {
self::$bb->getBerechtigungen($authObj->{AuthLib::AO_USERNAME});
+ $this->access_rights = self::$bb->berechtigungen;
+ }
}
}
@@ -109,7 +114,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))
@@ -340,6 +345,16 @@ class PermissionLib
}
}
+ /**
+ * Returns the access rights for the current user
+ *
+ * @return array|null
+ */
+ public function getAccessRights()
+ {
+ return $this->access_rights;
+ }
+
//------------------------------------------------------------------------------------------------------------------
// Private methods
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..1c3983108 100644
--- a/application/libraries/dashboard/DashboardLib.php
+++ b/application/libraries/dashboard/DashboardLib.php
@@ -49,7 +49,7 @@ class DashboardLib
public function getMergedConfig($dashboard_id, $uid)
{
- $defaultconfig = $this->getDefaultConfig($dashboard_id, $uid);
+ $defaultconfig = $this->getDefaultConfig($dashboard_id);
$userconfig = $this->getUserConfig($dashboard_id, $uid);
$mergedconfig = array_replace_recursive($defaultconfig, $userconfig);
@@ -57,14 +57,31 @@ class DashboardLib
return $mergedconfig;
}
- public function getDefaultConfig($dashboard_id, $uid)
+ public function getDefaultConfig($dashboard_id)
{
- $res_presets = $this->_ci->DashboardPresetModel->getPresets($dashboard_id, $uid);
+ $funktion_kurzbzs = [];
+ $rights = $this->_ci->permissionlib->getAccessRights();
+ if ($rights)
+ $funktion_kurzbzs = array_unique(array_map(function ($right) {
+ return $right->funktion_kurzbz;
+ }, $rights));
+
+ $this->_ci->DashboardPresetModel->db
+ ->group_start()
+ ->where_in('funktion_kurzbz', $funktion_kurzbzs)
+ ->or_where('funktion_kurzbz IS NULL')
+ ->group_end();
+
+ $this->_ci->DashboardPresetModel->addOrder('funktion_kurzbz', 'DESC');
+
+ $result = $this->_ci->DashboardPresetModel->loadWhere([
+ 'dashboard_id' => $dashboard_id
+ ]);
$defaultconfig = array();
- if (hasData($res_presets))
+ if (hasData($result))
{
- $presets = getData($res_presets);
+ $presets = getData($result);
foreach ($presets as $presetobj)
{
$preset = json_decode($presetobj->preset, true);
@@ -107,7 +124,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 +144,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;
}
@@ -137,8 +154,10 @@ class DashboardLib
$dashboard = $this->getDashboardByKurzbz($dashboard_kurzbz);
$funktion_kurzbz = ($section === self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL) ? null : $section;
- $result = $this->_ci->DashboardPresetModel
- ->getPresetByDashboardAndFunktion($dashboard->dashboard_id, $funktion_kurzbz);
+ $result = $this->_ci->DashboardPresetModel->loadWhere([
+ 'dashboard_id' => $dashboard->dashboard_id,
+ 'funktion_kurzbz' => $funktion_kurzbz
+ ]);
if (hasData($result))
{
@@ -195,32 +214,33 @@ class DashboardLib
{
foreach ($addwigets as $widget)
{
- if(!isset($widget->widgetid))
+ if(!isset($widget['widgetid']))
{
- $widget->widgetid = $this->generateWidgetId($dashboard_kurzbz);
+ $widget['widgetid'] = $this->generateWidgetId($dashboard_kurzbz);
}
- $this->addWidgetToWidgets($widgets, $section, $widget, $widget->widgetid);
+ $this->addWidgetToWidgets($widgets, $section, $widget, $widget['widgetid']);
}
}
public function addWidgetToWidgets(&$widgets, $section, $widget, $widgetid)
{
$section = ($section !== null) ? $section : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL;
- if (!isset($widgets[$section]) || !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 b75bdd722..c1238c13d 100644
--- a/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php
+++ b/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php
@@ -24,13 +24,20 @@ 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;
}
- public function fetchGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false)
+ public function fetchGehaltsbestandteileValorisiertForChart($dienstverhaeltnis_id, $stichtag=null, $includefuture=false)
{
- return $this->GehaltsbestandteilModel->getGehaltsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture);
+ return $this->GehaltsbestandteilModel->getGehaltsbestandteileValorisiertForChart($dienstverhaeltnis_id, $stichtag, $includefuture);
+ }
+
+ public function fetchGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null,
+ $includefuture=false, $withvalorisationhistory=true)
+ {
+ return $this->GehaltsbestandteilModel->getGehaltsbestandteile(
+ $dienstverhaeltnis_id, $stichtag, $includefuture, $withvalorisationhistory
+ );
}
public function fetchGehaltsbestandteil($gehaltsbestandteil_id)
@@ -113,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/VertragsbestandteilFactory.php b/application/libraries/vertragsbestandteil/VertragsbestandteilFactory.php
index 6e7b0af06..50504099a 100644
--- a/application/libraries/vertragsbestandteil/VertragsbestandteilFactory.php
+++ b/application/libraries/vertragsbestandteil/VertragsbestandteilFactory.php
@@ -3,6 +3,7 @@ namespace vertragsbestandteil;
use Exception;
use vertragsbestandteil\VertragsbestandteilStunden;
+use vertragsbestandteil\VertragsbestandteilLohnguide;
/**
* Description of VertragsbestandteilFactory
@@ -22,6 +23,7 @@ class VertragsbestandteilFactory
const VERTRAGSBESTANDTEIL_URLAUBSANSPRUCH = 'urlaubsanspruch';
const VERTRAGSBESTANDTEIL_ZEITAUFZEICHNUNG = 'zeitaufzeichnung';
const VERTRAGSBESTANDTEIL_LEHRE = 'lehre';
+ const VERTRAGSBESTANDTEIL_LOHNGUIDE = 'lohnguide';
public static function getVertragsbestandteil($data, $fromdb=false)
{
@@ -69,6 +71,11 @@ class VertragsbestandteilFactory
$vertragsbestandteil = new VertragsbestandteilZeitaufzeichnung();
$vertragsbestandteil->hydrateByStdClass($data, $fromdb);
break;
+
+ case self::VERTRAGSBESTANDTEIL_LOHNGUIDE:
+ $vertragsbestandteil = new VertragsbestandteilLohnguide();
+ $vertragsbestandteil->hydrateByStdClass($data, $fromdb);
+ break;
default:
throw new Exception('Unknown vertragsbestandteiltyp_kurzbz '
@@ -127,6 +134,12 @@ class VertragsbestandteilFactory
$vertragsbestandteildbmodel = $CI->VertragsbestandteilZeitaufzeichnung_model;
break;
+ case self::VERTRAGSBESTANDTEIL_LOHNGUIDE:
+ $CI->load->model('vertragsbestandteil/VertragsbestandteilLohnguide_model',
+ 'VertragsbestandteilLohnguide_model');
+ $vertragsbestandteildbmodel = $CI->VertragsbestandteilLohnguide_model;
+ break;
+
default:
throw new Exception('Unknown vertragsbestandteil_kurzbz '
. $vertragsbestandteil_kurzbz);
diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php
index b58c514e1..61208eda0 100644
--- a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php
+++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php
@@ -10,6 +10,7 @@ require_once __DIR__ . '/VertragsbestandteilKuendigungsfrist.php';
require_once __DIR__ . '/VertragsbestandteilUrlaubsanspruch.php';
require_once __DIR__ . '/VertragsbestandteilFreitext.php';
require_once __DIR__ . '/VertragsbestandteilKarenz.php';
+require_once __DIR__ . '/VertragsbestandteilLohnguide.php';
require_once __DIR__ . '/VertragsbestandteilFactory.php';
require_once __DIR__ . '/OverlapChecker.php';
@@ -26,6 +27,8 @@ class VertragsbestandteilLib
{
const INCLUDE_FUTURE = true;
const DO_NOT_INCLUDE_FUTURE = false;
+ const WITH_VALORISATION_HISTORY = true;
+ const NOT_WITH_VALORISATION_HISTORY = false;
protected $CI;
/** @var Dienstverhaeltnis_model */
@@ -90,10 +93,15 @@ class VertragsbestandteilLib
return $dv;
}
- public function fetchVertragsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false)
+ public function fetchVertragsbestandteile($dienstverhaeltnis_id, $stichtag=null,
+ $includefuture=false, $withvalorisationhistory=true)
{
- $vbs = $this->VertragsbestandteilModel->getVertragsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture);
- $gbs = $this->GehaltsbestandteilLib->fetchGehaltsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture);
+ $vbs = $this->VertragsbestandteilModel->getVertragsbestandteile(
+ $dienstverhaeltnis_id, $stichtag, $includefuture
+ );
+ $gbs = $this->GehaltsbestandteilLib->fetchGehaltsbestandteile(
+ $dienstverhaeltnis_id, $stichtag, $includefuture, $withvalorisationhistory
+ );
$gbsByVBid = array();
foreach( $gbs as $gb )
@@ -124,6 +132,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/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php
new file mode 100644
index 000000000..0e071f36b
--- /dev/null
+++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php
@@ -0,0 +1,155 @@
+setVertragsbestandteiltyp_kurzbz(
+ VertragsbestandteilFactory::VERTRAGSBESTANDTEIL_LOHNGUIDE);
+ }
+
+ public function getStellenbezeichnung()
+ {
+ return $this->stellenbezeichnung;
+ }
+
+ public function setStellenbezeichnung($stellenbezeichnung): self
+ {
+ $this->markDirty('stellenbezeichnung', $this->stellenbezeichnung, $stellenbezeichnung);
+ $this->stellenbezeichnung = $stellenbezeichnung;
+ return $this;
+ }
+
+ public function getVordienstzeit()
+ {
+ return $this->vordienstzeit;
+ }
+
+ public function setVordienstzeit($vordienstzeit): self
+ {
+ $this->markDirty('vordienstzeit', $this->vordienstzeit, $vordienstzeit);
+ $this->vordienstzeit = $vordienstzeit;
+ return $this;
+ }
+
+ public function getFachrichtung_kurzbz()
+ {
+ return $this->fachrichtung_kurzbz;
+ }
+
+ public function setFachrichtung_kurzbz($fachrichtung_kurzbz): self
+ {
+ $this->markDirty('fachrichtung_kurzbz', $this->fachrichtung_kurzbz, $fachrichtung_kurzbz);
+ $this->fachrichtung_kurzbz = $fachrichtung_kurzbz;
+ return $this;
+ }
+
+ public function getModellstelle_kurzbz()
+ {
+ return $this->modellstelle_kurzbz;
+ }
+
+ public function setModellstelle_kurzbz($modellstelle_kurzbz): self
+ {
+ $this->markDirty('modellstelle_kurzbz', $this->modellstelle_kurzbz, $modellstelle_kurzbz);
+ $this->modellstelle_kurzbz = $modellstelle_kurzbz;
+ return $this;
+ }
+
+ public function getKommentar_person()
+ {
+ return $this->kommentar_person;
+ }
+
+ public function setKommentar_person($kommentar_person): self
+ {
+ $this->markDirty('kommentar_person', $this->kommentar_person, $kommentar_person);
+ $this->kommentar_person = $kommentar_person;
+ return $this;
+ }
+
+ public function getKommentar_modellstelle()
+ {
+ return $this->kommentar_modellstelle;
+ }
+
+ public function setKommentar_modellstelle($kommentar_modellstelle): self
+ {
+ $this->markDirty('kommentar_modellstelle', $this->kommentar_modellstelle, $kommentar_modellstelle);
+ $this->kommentar_modellstelle = $kommentar_modellstelle;
+ return $this;
+ }
+
+
+
+
+ public function hydrateByStdClass($data, $fromdb=false)
+ {
+ parent::hydrateByStdClass($data, $fromdb);
+ $this->fromdb = $fromdb;
+ isset($data->fachrichtung_kurzbz) && $this->setFachrichtung_kurzbz($data->fachrichtung_kurzbz);
+ isset($data->stellenbezeichnung) && $this->setStellenbezeichnung($data->stellenbezeichnung);
+ isset($data->vordienstzeit) && $this->setVordienstzeit($data->vordienstzeit);
+ isset($data->modellstelle_kurzbz) && $this->setModellstelle_kurzbz($data->modellstelle_kurzbz);
+ isset($data->kommentar_person) && $this->setKommentar_person($data->kommentar_person);
+ isset($data->kommentar_modellstelle) && $this->setKommentar_modellstelle($data->kommentar_modellstelle);
+ $this->fromdb = false;
+ }
+
+ public function toStdClass(): \stdClass
+ {
+ $tmp = array(
+ 'vertragsbestandteil_id' => $this->getVertragsbestandteil_id(),
+ 'stellenbezeichnung' => $this->getStellenbezeichnung(),
+ 'vordienstzeit' => $this->getVordienstzeit(),
+ 'fachrichtung_kurzbz' => $this->getFachrichtung_kurzbz(),
+ 'modellstelle_kurzbz' => $this->getModellstelle_kurzbz(),
+ 'kommentar_person' => $this->getKommentar_person(),
+ 'kommentar_modellstelle' => $this->getKommentar_modellstelle(),
+ );
+
+ $tmp = array_filter($tmp, function($k) {
+ return in_array($k, $this->modifiedcolumns);
+ }, ARRAY_FILTER_USE_KEY);
+
+ return (object) $tmp;
+ }
+
+ public function __toString()
+ {
+ $txt = <<getModellstelle_kurzbz()}
+
+EOTXT;
+ return parent::__toString() . $txt;
+ }
+
+ /* public function validate()
+ {
+ if( !(filter_var($this->tage, FILTER_VALIDATE_INT,
+ array(
+ 'options' => array(
+ 'min_range' => 1,
+ 'max_range' => 50
+ )
+ )
+ )) ) {
+ $this->validationerrors[] = 'Urlaubsanspruch muss eine Tagesanzahl im Bereich 1 bis 50 sein.';
+ }
+
+ return parent::validate();
+ } */
+}
diff --git a/application/models/accounting/Vertrag_model.php b/application/models/accounting/Vertrag_model.php
index abc2114a6..97b5c72b6 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,189 @@ class Vertrag_model extends DB_Model
return $bezeichnung;
}
+
+ /**
+ * Loads all Contracts of a Person
+ * @param $person_id
+ * @return array of objects
+ */
+ public function loadContractsOfPerson($person_id)
+ {
+ $query = "
+ SELECT
+ *,
+ tbl_vertrag.bezeichnung as bezeichnung,
+ tbl_vertragstyp.bezeichnung as vertragstyp_bezeichnung,
+ tbl_vertrag.vertragsdatum,
+ (SELECT bezeichnung FROM lehre.tbl_vertragsstatus
+ JOIN lehre.tbl_vertrag_vertragsstatus USING(vertragsstatus_kurzbz)
+ WHERE vertrag_id=tbl_vertrag.vertrag_id ORDER BY datum desc limit 1) as status, anmerkung,
+ CASE
+ WHEN EXISTS (
+ SELECT 1
+ FROM lehre.tbl_vertrag_vertragsstatus
+ WHERE vertrag_id = tbl_vertrag.vertrag_id
+ AND vertragsstatus_kurzbz = 'abgerechnet'
+ ) THEN true
+ ELSE false
+ END AS isAbgerechnet
+ FROM
+ lehre.tbl_vertrag
+ LEFT JOIN lehre.tbl_vertragstyp USING(vertragstyp_kurzbz)
+ WHERE person_id= ?";
+
+
+ return $this->execQuery($query, array($person_id));
+ }
+
+ /**
+ * Loads all Contracts of a Person that are not assigned yet
+ * @param $person_id
+ * @return array of objects
+ */
+ public function loadContractsOfPersonNotAssigned($person_id)
+ {
+ $query = "
+SELECT
+ 'Lehrauftrag' as type,
+ lehreinheit_id,
+ mitarbeiter_uid,
+ null as pruefung_id,
+ null as projektarbeit_id,
+ (tbl_lehreinheitmitarbeiter.semesterstunden*tbl_lehreinheitmitarbeiter.stundensatz) as betrag1,
+ tbl_lehreinheit.studiensemester_kurzbz,
+ null as betreuerart_kurzbz,
+ ( SELECT
+ upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz
+ FROM
+ lehre.tbl_lehrveranstaltung
+ JOIN public.tbl_studiengang USING(studiengang_kz)
+ WHERE
+ lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
+ as bezeichnung
+ FROM
+ lehre.tbl_lehreinheitmitarbeiter
+ JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
+ WHERE
+ mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?)
+ AND vertrag_id IS NULL
+ UNION
+ SELECT
+ 'Betreuung' as type,
+ tbl_projektarbeit.lehreinheit_id as lehreinheit_id,
+ null as mitarbeiter_uid,
+ null::integer as pruefung_id,
+ projektarbeit_id,
+ (tbl_projektbetreuer.stunden*tbl_projektbetreuer.stundensatz) as betrag1,
+ tbl_lehreinheit.studiensemester_kurzbz,
+ tbl_projektbetreuer.betreuerart_kurzbz,
+ (SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
+ as bezeichnung
+ FROM
+ lehre.tbl_projektbetreuer
+ JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
+ JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
+ WHERE
+ tbl_projektbetreuer.person_id=?
+ AND vertrag_id IS NULL
+ ";
+
+ return $this->execQuery($query, array($person_id, $person_id));
+ }
+
+ /**
+ * Loads all Contracts of a Person that are assigned yet
+ * @param $person_id, $vertrag_id
+ * @return array of objects
+ */
+
+ public function loadContractsOfPersonAssigned($person_id, $vertrag_id)
+ {
+ $query = "
+ SELECT
+ 'Lehrauftrag' as type,
+ lehreinheit_id,
+ mitarbeiter_uid,
+ null as pruefung_id,
+ null as projektarbeit_id,
+ (tbl_lehreinheitmitarbeiter.semesterstunden * tbl_lehreinheitmitarbeiter.stundensatz) as betrag,
+ tbl_lehreinheit.studiensemester_kurzbz,
+ null as betreuerart_kurzbz,
+ ( SELECT
+ upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz
+ FROM
+ lehre.tbl_lehrveranstaltung
+ JOIN public.tbl_studiengang USING(studiengang_kz)
+ WHERE
+ lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
+ as bezeichnung, vertrag_id
+ FROM
+ lehre.tbl_lehreinheitmitarbeiter
+ JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
+ WHERE
+ mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?)
+ AND vertrag_id = ?
+ UNION
+ SELECT
+ 'Betreuung' as type,
+ tbl_projektarbeit.lehreinheit_id as lehreinheit_id,
+ null as mitarbeiter_uid,
+ null::integer as pruefung_id,
+ projektarbeit_id,
+ (tbl_projektbetreuer.stunden * tbl_projektbetreuer.stundensatz) as betrag,
+ tbl_lehreinheit.studiensemester_kurzbz,
+ tbl_projektbetreuer.betreuerart_kurzbz,
+ (SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
+ as bezeichnung, vertrag_id
+ FROM
+ lehre.tbl_projektbetreuer
+ JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
+ JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
+ WHERE
+ tbl_projektbetreuer.person_id=?
+ AND vertrag_id = ?
+ ";
+
+ return $this->execQuery($query, array($person_id, $vertrag_id, $person_id, $vertrag_id));
+ }
+
+ /**
+ * Returns all stati of a contract
+ *
+ * @param $vertrag_id
+ * @return array
+ */
+ public function getStatiOfContract($vertrag_id)
+ {
+ $query = "
+ SELECT
+ *,
+ tbl_vertrag_vertragsstatus.datum,
+ tbl_vertrag_vertragsstatus.insertamum,
+ tbl_vertrag_vertragsstatus.updateamum
+ FROM
+ lehre.tbl_vertrag_vertragsstatus
+ JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz)
+ WHERE
+ tbl_vertrag_vertragsstatus.vertrag_id = ?
+ ORDER BY tbl_vertrag_vertragsstatus.datum DESC";
+
+ return $this->execQuery($query, array($vertrag_id));
+ }
+
+ 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/accounting/Vertragstyp_model.php b/application/models/accounting/Vertragstyp_model.php
index 42d248217..a3275af6e 100644
--- a/application/models/accounting/Vertragstyp_model.php
+++ b/application/models/accounting/Vertragstyp_model.php
@@ -11,4 +11,5 @@ class Vertragstyp_model extends DB_Model
$this->dbTable = 'lehre.tbl_vertragstyp';
$this->pk = 'vertragstyp_kurzbz';
}
+
}
diff --git a/application/models/accounting/Vertragvertragsstatus_model.php b/application/models/accounting/Vertragvertragsstatus_model.php
index 78a065540..75b0794cc 100644
--- a/application/models/accounting/Vertragvertragsstatus_model.php
+++ b/application/models/accounting/Vertragvertragsstatus_model.php
@@ -190,4 +190,6 @@ class Vertragvertragsstatus_model extends DB_Model
return $this->loadWhere($condition);
}
+
+
}
diff --git a/application/models/codex/Bisstandort_model.php b/application/models/codex/Bisstandort_model.php
new file mode 100644
index 000000000..9c7e9e45b
--- /dev/null
+++ b/application/models/codex/Bisstandort_model.php
@@ -0,0 +1,14 @@
+dbTable = 'bis.tbl_bisstandort';
+ $this->pk = 'standort_code';
+ }
+}
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/content/News_model.php b/application/models/content/News_model.php
index 0700a7057..ad8ecab99 100644
--- a/application/models/content/News_model.php
+++ b/application/models/content/News_model.php
@@ -21,7 +21,7 @@ class News_model extends DB_Model
{
$this->addJoin("campus.tbl_content","content_id");
return $this->execReadOnlyQuery('
- SELECT *
+ SELECT *, TO_CHAR(campus.tbl_news.datum, ?) as datumformatted
FROM campus.tbl_news
JOIN campus.tbl_content content ON content.content_id = campus.tbl_news.content_id
WHERE
@@ -29,7 +29,7 @@ class News_model extends DB_Model
datum <= NOW() AND (datum_bis IS NULL OR datum_bis >= now()::date)
ORDER BY datum DESC
LIMIT ' . $this->escape($limit)
- );
+ , ['DD/MM/YYYY']);
}
public function getNewsContentIDs($limit=10){
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 5f3c8400e..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);
@@ -501,17 +506,14 @@ class Prestudentstatus_model extends DB_Model
$this->addSelect('tbl_prestudentstatus.studiensemester_kurzbz');
$this->addSelect('tbl_prestudentstatus.ausbildungssemester');
$this->addSelect('tbl_prestudentstatus.datum');
- $this->addSelect("TO_CHAR(tbl_prestudentstatus.datum::timestamp, 'DD.MM.YYYY') AS format_datum");
$this->addSelect('tbl_prestudentstatus.insertamum');
$this->addSelect('tbl_prestudentstatus.insertvon');
$this->addSelect('tbl_prestudentstatus.updateamum');
$this->addSelect('tbl_prestudentstatus.updatevon');
$this->addSelect('tbl_prestudentstatus.orgform_kurzbz');
$this->addSelect('tbl_prestudentstatus.bestaetigtam');
- $this->addSelect("TO_CHAR(tbl_prestudentstatus.bestaetigtam::timestamp, 'DD.MM.YYYY') AS format_bestaetigtam");
$this->addSelect('tbl_prestudentstatus.bestaetigtvon');
$this->addSelect('tbl_prestudentstatus.bewerbung_abgeschicktamum');
- $this->addSelect("TO_CHAR(tbl_prestudentstatus.bewerbung_abgeschicktamum::timestamp, 'DD.MM.YYYY') AS format_bewerbung_abgeschicktamum");
$this->addSelect('tbl_prestudentstatus.anmerkung');
$this->addSelect('plan.studienplan_id');
$this->addSelect('plan.bezeichnung');
diff --git a/application/models/crm/Reihungstest_model.php b/application/models/crm/Reihungstest_model.php
index 86ebfd0af..efef0a8fa 100644
--- a/application/models/crm/Reihungstest_model.php
+++ b/application/models/crm/Reihungstest_model.php
@@ -10,7 +10,7 @@ class Reihungstest_model extends DB_Model
parent::__construct();
$this->dbTable = 'public.tbl_reihungstest';
$this->pk = 'reihungstest_id';
- }
+ }
/**
* Gets a test from a test id only if it is available
@@ -42,8 +42,8 @@ class Reihungstest_model extends DB_Model
/**
* Checks if there are active studyplans which have no public placement tests assigned yet.
* Only check assignment to studyplans that are
- * - Bachelor,
- * - active,
+ * - Bachelor,
+ * - active,
* - set as online application
* - valid for 1st terms
* @return array Returns object array with studyplans that have no public placement tests assigned yet.
@@ -97,7 +97,7 @@ class Reihungstest_model extends DB_Model
USING (reihungstest_id)
WHERE
datum >= now()
- AND
+ AND
oeffentlich = \'t\'
)
';
@@ -105,7 +105,7 @@ class Reihungstest_model extends DB_Model
return $this->execQuery($query);
}
- /**
+ /**
* Gets amount of free places.
* @return array Returns object array with faculty and amount of free places
* for each public actual placement test date.
@@ -432,10 +432,10 @@ class Reihungstest_model extends DB_Model
}
/**
- * Loads all applicants of a placement test
- * @param integer $reihungstest_id ID of placement test
- * @return array Returns object array with data of applicants.
- */
+ * Loads all applicants of a placement test
+ * @param integer $reihungstest_id ID of placement test
+ * @return array Returns object array with data of applicants.
+ */
public function getApplicantsOfPlacementTest($reihungstest_id)
{
$query = '
@@ -511,4 +511,288 @@ 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 Number $person_id ID of Person
+ * @param Boolean $punkte if true result is points else result is percentage of sum
+ * @param Number $reihungstest_id ID of Placementtest
+ * @param Array $weightedArray array of weighting per area (gewicht per gebiet_id)
+ * @param Boolean $has_excluded_gebiete if true, areas in the configArray will be excluded
+ * @param Array $basis_gebiet_id_toString areas to exclude
+ * @return float result points of RT
+ */
+ public function getReihungstestErgebnisPerson(
+ $person_id,
+ $punkte,
+ $reihungstest_id,
+ $weightedArray = null,
+ $has_excluded_gebiete = false,
+ $basis_gebiet_id_toString = 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 = ? ";
+
+ //areas of Studiengang
+ if (!empty($basis_gebiet_id_toString))
+ {
+ $qry .= "
+ AND
+ gebiet_id IN (". $basis_gebiet_id_toString. ")
+ ";
+ }
+
+ //areas to exclude
+ if($has_excluded_gebiete)
+ {
+ if (defined('FAS_REIHUNGSTEST_EXCLUDE_GEBIETE') && !empty(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE))
+ {
+ $excluded_gebiete = unserialize(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE);
+ $exclude_gebiet_id_arr = $excluded_gebiete;
+ if (is_array($exclude_gebiet_id_arr) && count($exclude_gebiet_id_arr) > 0)
+ {
+ $exclude_gebiet_id_toString = implode(', ', $exclude_gebiet_id_arr);
+ $qry .= "
+ AND
+ gebiet_id NOT IN (". $exclude_gebiet_id_toString. ")
+ -- AND
+ -- typ = 'b'
+ ";
+ }
+ }
+ }
+
+ //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/dashboard/Dashboard_Preset_model.php b/application/models/dashboard/Dashboard_Preset_model.php
index ca10ce98a..42570d091 100644
--- a/application/models/dashboard/Dashboard_Preset_model.php
+++ b/application/models/dashboard/Dashboard_Preset_model.php
@@ -11,57 +11,4 @@ class Dashboard_Preset_model extends DB_Model
$this->dbTable = 'dashboard.tbl_dashboard_preset';
$this->pk = 'preset_id';
}
-
- /**
- * Get Presets of given uid.
- * @param integer dashboard_id
- * @param string $uid
- * @return array
- */
- public function getPresets($dashboard_id, $uid)
- {
- // TODO: get Funktionen for uid and load all preset for all funktionen for uid
- //return $this->loadWhere(array('dashboard_id' => $dashboard_id, 'funktion_kurzbz'=> null));
- $sql = <<execQuery($sql, array($dashboard_id, $uid));
- }
-
- /**
- * Get Preset by Dashboard and Funktion
- * @param integer dashboard_id
- * @param string funktion_kurzbz
- * @return array
- */
- public function getPresetByDashboardAndFunktion($dashboard_id, $funktion_kurzbz)
- {
- return $this->loadWhere(array('dashboard_id' => $dashboard_id, 'funktion_kurzbz' => $funktion_kurzbz));
- }
}
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/Abschlusspruefung_model.php b/application/models/education/Abschlusspruefung_model.php
index 268e786cb..0ba8fd55c 100644
--- a/application/models/education/Abschlusspruefung_model.php
+++ b/application/models/education/Abschlusspruefung_model.php
@@ -113,4 +113,61 @@ class Abschlusspruefung_model extends DB_Model
return success($abschlusspruefungdata);
}
+
+ /**
+ * Gets data of an Abschlusspruefung
+ * @param $student_uid
+ * @return object
+ */
+ public function getAbschlusspruefungForPrestudent($student_uid)
+ {
+ $qry = "
+ SELECT
+ exam.*,
+ CONCAT(
+ person_pruefer1.nachname || ' ',
+ person_pruefer1.vorname,
+ COALESCE(' ' || person_pruefer1.titelpre)
+ ) AS person_pruefer1,
+ CONCAT(
+ person_pruefer2.nachname || ' ',
+ person_pruefer2.vorname,
+ COALESCE(' ' || person_pruefer2.titelpre)
+ ) AS person_pruefer2,
+ CONCAT(
+ person_pruefer3.nachname || ' ',
+ person_pruefer3.vorname,
+ COALESCE(' ' || person_pruefer3.titelpre)
+ ) AS person_pruefer3,
+ CONCAT(
+ person_vorsitzender.nachname || ' ',
+ person_vorsitzender.vorname,
+ COALESCE(' ' || person_vorsitzender.titelpre)
+ ) AS person_vorsitzender,
+ datum,
+ freigabedatum,
+ sponsion,
+ uhrzeit,
+ person_pruefer1.nachname as p1_nachname,
+ person_pruefer2.nachname as p2_nachname,
+ person_pruefer3.nachname as p3_nachname,
+ person_vorsitzender.nachname as vorsitz_nachname,
+ beurteilung.bezeichnung as beurteilung_bezeichnung,
+ antritt.bezeichnung as antritt_bezeichnung
+ FROM
+ lehre.tbl_abschlusspruefung exam
+ JOIN lehre.tbl_pruefungstyp USING (pruefungstyp_kurzbz)
+ LEFT JOIN public.tbl_benutzer ben_vorsitzender ON (ben_vorsitzender.uid = vorsitz)
+ LEFT JOIN public.tbl_person person_vorsitzender ON (ben_vorsitzender.person_id = person_vorsitzender.person_id)
+ LEFT JOIN public.tbl_person person_pruefer1 ON (person_pruefer1.person_id = pruefer1)
+ LEFT JOIN public.tbl_person person_pruefer2 ON (person_pruefer2.person_id = pruefer2)
+ LEFT JOIN public.tbl_person person_pruefer3 ON (person_pruefer3.person_id = pruefer3)
+ LEFT JOIN lehre.tbl_abschlussbeurteilung beurteilung USING (abschlussbeurteilung_kurzbz)
+ LEFT JOIN lehre.tbl_abschlusspruefung_antritt antritt USING (pruefungsantritt_kurzbz)
+ WHERE student_uid = ?
+ ORDER BY exam.datum DESC
+ ";
+
+ return $this->execQuery($qry, array('student_uid' => $student_uid));
+ }
}
diff --git a/application/models/education/Akadgrad_model.php b/application/models/education/Akadgrad_model.php
new file mode 100644
index 000000000..92762a525
--- /dev/null
+++ b/application/models/education/Akadgrad_model.php
@@ -0,0 +1,14 @@
+dbTable = 'lehre.tbl_akadgrad';
+ $this->pk = 'akadgrad_id';
+ }
+}
\ No newline at end of file
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/Anwesenheit_model.php b/application/models/education/Anwesenheit_model.php
index 80a1fc111..b2c78fe02 100644
--- a/application/models/education/Anwesenheit_model.php
+++ b/application/models/education/Anwesenheit_model.php
@@ -11,4 +11,193 @@ class Anwesenheit_model extends DB_Model
$this->dbTable = 'campus.tbl_anwesenheit';
$this->pk = 'anwesenheit_id';
}
+
+ /**
+ * Laedt die Anwesenheiten in Prozent von Studierenden bei Lehrveranstaltungen
+ * Wenn die StudentUID uebergeben wird, werden alle Lehrveranstaltungen zu denen der Studierenden zugeteilt ist inkl Prozent der Anwesenheit
+ * Wenn die LehrveranstaltungID uebergeben wird, werden alle Studierenden geholt die zugeteilt sind inkl Prozent der Anwesenheit
+ * Es werden pro Student die Anwesenheiten berechnet aufgrund der Lehreinheit zu der sie zugeordnet sind
+ *
+ * @param string $studiensemester_kurzbz
+ * @param string|null (optional) $student_uid
+ * @param integer|null (optional) $lehrveranstaltung_id
+ *
+ * @return stdClass
+ */
+ public function loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid = null, $lehrveranstaltung_id = null)
+ {
+ $this->addSelect("vorname");
+ $this->addSelect("nachname");
+ $this->addSelect("wahlname");
+ $this->addSelect("lehrveranstaltung_id");
+ $this->addSelect("bezeichnung");
+ $this->addSelect("gruppe");
+ $this->addSelect("student_uid AS uid");
+ $this->addSelect("COUNT(stundenplan_id) AS gesamtstunden");
+ $this->addSelect("COALESCE(anwesend.summe, 0) AS anwesend");
+ $this->addSelect("COALESCE(nichtanwesend.summe, 0) AS nichtanwesend");
+ $this->addSelect("COALESCE(anwesend.summe, 0) + COALESCE(nichtanwesend.summe, 0) AS erfassteanwesenheit");
+ $this->addSelect("CASE
+ WHEN COUNT(stundenplan_id) = 0 OR COALESCE(anwesend.summe, 0) + COALESCE(nichtanwesend.summe, 0) = 0
+ THEN 100
+ ELSE TRUNC(100-(100/COUNT(stundenplan_id)*COALESCE(nichtanwesend.summe, 0)), 2)
+ END AS prozent");
+
+
+ $this->db->join("(
+ SELECT
+ semester::text AS gruppe,
+ public.tbl_studentlehrverband.studiensemester_kurzbz,
+ student_uid,
+ studiengang_kz
+ FROM public.tbl_studentlehrverband
+ WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
+
+ UNION
+
+ SELECT
+ semester || verband AS gruppe,
+ public.tbl_studentlehrverband.studiensemester_kurzbz,
+ student_uid,
+ studiengang_kz
+ FROM public.tbl_studentlehrverband
+ WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
+
+ UNION
+
+ SELECT
+ semester || verband || gruppe AS gruppe,
+ public.tbl_studentlehrverband.studiensemester_kurzbz,
+ student_uid,
+ studiengang_kz
+ FROM public.tbl_studentlehrverband
+ WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
+
+ UNION
+
+ SELECT
+ gruppe_kurzbz AS gruppe,
+ public.tbl_benutzergruppe.studiensemester_kurzbz,
+ uid AS student_uid,
+ studiengang_kz
+ FROM public.tbl_benutzergruppe
+ JOIN public.tbl_gruppe USING (gruppe_kurzbz)
+ WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
+ ) a", "gruppe,studiensemester_kurzbz,studiengang_kz", "", false);
+ $this->addJoin("public.tbl_benutzer b", "b.uid = student_uid");
+ $this->addJoin("public.tbl_person p", "person_id");
+ $this->db->join("(
+ SELECT
+ lehrveranstaltung_id,
+ studiensemester_kurzbz, uid AS student_uid,
+ SUM(einheiten) AS summe
+ FROM campus.tbl_anwesenheit a
+ JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
+ JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
+ WHERE anwesend = TRUE
+ AND studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
+ GROUP BY
+ lehrveranstaltung_id,
+ bezeichnung,
+ uid,
+ studiensemester_kurzbz
+ ) anwesend", "lehrveranstaltung_id,student_uid,studiensemester_kurzbz", "LEFT", false);
+ $this->db->join("(
+ SELECT
+ lehrveranstaltung_id,
+ studiensemester_kurzbz,
+ uid AS student_uid,
+ SUM(einheiten) AS summe
+ FROM campus.tbl_anwesenheit a
+ JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
+ JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
+ WHERE anwesend = FALSE
+ AND studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
+ GROUP BY
+ lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
+ ) nichtanwesend", "lehrveranstaltung_id,student_uid,studiensemester_kurzbz", "LEFT", false);
+
+ $this->addGroupBy("vorname");
+ $this->addGroupBy("nachname");
+ $this->addGroupBy("wahlname");
+ $this->addGroupBy("lehrveranstaltung_id");
+ $this->addGroupBy("bezeichnung");
+ $this->addGroupBy("gruppe");
+ $this->addGroupBy("student_uid");
+ $this->addGroupBy("anwesend.summe");
+ $this->addGroupBy("nichtanwesend.summe");
+
+
+ $where = [
+ "lehrveranstaltung_id >" => 0
+ ];
+
+ if ($student_uid)
+ $where["student_uid"] = $student_uid;
+
+ if ($lehrveranstaltung_id)
+ $where["lehrveranstaltung_id"] = $lehrveranstaltung_id;
+
+ if ($lehrveranstaltung_id) {
+ $this->addOrder("nachname");
+ $this->addOrder("vorname");
+ } elseif ($student_uid) {
+ $this->addOrder("bezeichnung");
+ }
+
+
+ $tmp = $this->dbTable;
+
+ $this->dbTable = "(
+ SELECT
+ SUM(stundenplan_id) AS stundenplan_id,
+ datum,
+ stunde,
+ lehrveranstaltung_id,
+ bezeichnung,
+ studiensemester_kurzbz,
+ studiengang_kz,
+ TRIM(
+ CASE
+ WHEN stp.gruppe_kurzbz IS NOT NULL
+ THEN stp.gruppe_kurzbz
+ ELSE stp.semester || (
+ CASE
+ WHEN verband IS NULL
+ THEN ''
+ ELSE stp.verband
+ END
+ ) || (
+ CASE
+ WHEN stp.gruppe IS NULL
+ THEN ''
+ ELSE stp.gruppe
+ END
+ )
+ END
+ ) AS gruppe
+ FROM lehre.tbl_lehrveranstaltung lv
+ JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id)
+ JOIN lehre.tbl_stundenplan stp USING (lehreinheit_id,studiengang_kz)
+ WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
+ AND (titel NOT LIKE '%Nebenprüfung%' OR titel IS NULL)
+ GROUP BY
+ datum,
+ stunde,
+ lehrveranstaltung_id,
+ bezeichnung,
+ studiensemester_kurzbz,
+ studiengang_kz,
+ stp.gruppe_kurzbz,
+ stp.semester,
+ stp.verband,
+ stp.gruppe
+ ) x";
+
+ $result = $this->loadWhere($where);
+
+ $this->dbTable = $tmp;
+
+ return $result;
+ }
}
diff --git a/application/models/education/LePruefung_model.php b/application/models/education/LePruefung_model.php
index ac6c7f9b2..6e51f1975 100644
--- a/application/models/education/LePruefung_model.php
+++ b/application/models/education/LePruefung_model.php
@@ -11,4 +11,45 @@ class LePruefung_model extends DB_Model
$this->dbTable = 'lehre.tbl_pruefung';
$this->pk = 'pruefung_id';
}
+
+ /**
+ * gets all Pruefungen for a student_uid
+ * @param string $student_uid
+ * @param string $studiensemester_kurzbz
+ *
+ * @return stdClass
+ */
+ public function getPruefungenByStudentuid($student_uid, $studiensemester_kurzbz = null)
+ {
+ $this->addSelect('tbl_pruefung.datum');
+ $this->addSelect("TO_CHAR(tbl_pruefung.datum::timestamp, 'DD.MM.YYYY') AS format_datum");
+ $this->addSelect('tbl_pruefung.anmerkung');
+ $this->addSelect('tbl_pruefung.pruefungstyp_kurzbz');
+ $this->addSelect('tbl_pruefung.pruefung_id');
+ $this->addSelect('tbl_pruefung.lehreinheit_id');
+ $this->addSelect('tbl_pruefung.student_uid');
+ $this->addSelect('tbl_pruefung.mitarbeiter_uid');
+ $this->addSelect('tbl_pruefung.punkte');
+
+ $this->addSelect('tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung');
+ $this->addSelect('tbl_lehrveranstaltung.lehrveranstaltung_id');
+ $this->addSelect('tbl_note.bezeichnung as note_bezeichnung');
+ $this->addSelect('tbl_pruefungstyp.beschreibung as typ_beschreibung');
+ $this->addSelect('tbl_lehreinheit.studiensemester_kurzbz as studiensemester_kurzbz');
+
+ $this->addJoin('lehre.tbl_lehreinheit', 'lehre.tbl_pruefung.lehreinheit_id=lehre.tbl_lehreinheit.lehreinheit_id');
+ $this->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
+ $this->addJoin('lehre.tbl_note', 'note');
+ $this->addJoin('lehre.tbl_pruefungstyp', 'pruefungstyp_kurzbz');
+
+ if ($studiensemester_kurzbz)
+ $this->db->where("tbl_lehreinheit.studiensemester_kurzbz = ", $studiensemester_kurzbz);
+
+ $this->addOrder('tbl_pruefung.datum', 'DESC');
+ $this->addOrder('tbl_pruefung.pruefung_id', 'DESC');
+
+ return $this->loadWhere([
+ 'student_uid' => $student_uid
+ ]);
+ }
}
diff --git a/application/models/education/Lehreinheit_model.php b/application/models/education/Lehreinheit_model.php
index afad6870b..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,10 +33,15 @@ 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,
- 'studiensemester_kurzbz' => $studiensemester)
+ 'studiensemester_kurzbz' => $studiensemester)
);
if (hasData($les))
@@ -244,4 +254,489 @@ EOSQL;
$res = $this->execReadOnlyQuery($query);
return $res;
}
+
+ /**
+ * Gets Lehreinheiten for Lehrveranstaltungen in a Studiensemester.
+ * Without using tbl_lehrfach: bezeichnung and kurzbz ALWAYS from lehrveranstaltung
+ * @param $lehrveranstaltung_id
+ * @param $studiensemester
+ * @return array with Lehreinheiten and their Lehreinheitgruppen
+ */
+ public function getLesFromLvIds($lehrveranstaltung_id, $studiensemester_kurzbz = null)
+ {
+ $params = array($lehrveranstaltung_id);
+
+ $query = "
+ SELECT
+ lv.lehrveranstaltung_id,
+ le.lehreinheit_id,
+ le.lehrform_kurzbz,
+ lv.kurzbz,
+ lv.bezeichnung,
+ lv.semester,
+ (
+ SELECT
+ STRING_AGG(CONCAT(leg.semester, leg.verband, leg.gruppe), ' ')
+ FROM lehre.tbl_lehreinheitgruppe leg
+ WHERE leg.lehreinheit_id = le.lehreinheit_id
+ ) AS gruppe,
+ STRING_AGG(tma.kurzbz, ' ') as kuerzel
+ FROM
+ lehre.tbl_lehreinheit le
+ JOIN
+ lehre.tbl_lehrveranstaltung lv ON lv.lehrveranstaltung_id = le.lehrveranstaltung_id
+ JOIN
+ lehre.tbl_lehreinheitmitarbeiter ma USING (lehreinheit_id)
+ JOIN
+ public.tbl_mitarbeiter tma USING (mitarbeiter_uid)
+ WHERE
+ lv.lehrveranstaltung_id = ?
+ ";
+
+ if (isset($studiensemester_kurzbz))
+ {
+ $query .= " AND le.studiensemester_kurzbz = ?";
+ $params[] = $studiensemester_kurzbz;
+ }
+
+ $query .="
+ GROUP BY
+ lv.lehrveranstaltung_id,
+ le.lehreinheit_id,
+ le.lehrform_kurzbz,
+ lv.kurzbz,
+ lv.bezeichnung,
+ lv.semester
+ ORDER BY
+ le.lehreinheit_id;
+ ";
+
+ 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 3f02f5ce7..5422c290e 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,40 @@ 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 le
+ 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
+ le.lehrveranstaltung_id= ?
+ AND le.studiensemester_kurzbz = ?
+ AND lehrfunktion_kurzbz = 'LV-Leitung'
+ AND lema.mitarbeiter_uid NOT like '_Dummy%'
+ AND b.aktiv = TRUE
+ AND p.aktiv = TRUE
+ ORDER BY
+ lema.insertamum DESC
+ LIMIT 1
+ ";
+
+ return $this->execQuery($qry, $params);
+ }
/**
* Gets all Leiter of Lehrveranstaltungsorganisationseinheit
* @param $lehrveranstaltung_id
@@ -517,28 +446,29 @@ class Lehrveranstaltung_model extends DB_Model
/**
* Gets Lehrveranstaltungen of a student
* @param $student_uid
- * @param null $studiensemester_kurzbz
+ * @param $studiensemester_kurzbz
* @return array|null
*/
public function getLvsByStudent($student_uid, $studiensemester_kurzbz = null)
{
$params = array($student_uid);
-
$qry = "SELECT * FROM lehre.tbl_lehrveranstaltung
- WHERE lehrveranstaltung_id IN(SELECT lehrveranstaltung_id FROM campus.vw_student_lehrveranstaltung
- WHERE uid=?";
+ WHERE lehrveranstaltung_id IN(
+ SELECT lehrveranstaltung_id FROM campus.vw_student_lehrveranstaltung
+ WHERE uid=?";
+
if (isset($studiensemester_kurzbz))
{
- $qry .= " AND studiensemester_kurzbz=?";
$params[] = $studiensemester_kurzbz;
+ $qry .= " AND studiensemester_kurzbz=?";
}
- $qry .= ") OR lehrveranstaltung_id IN(SELECT lehrveranstaltung_id FROM lehre.tbl_zeugnisnote WHERE student_uid=?";
+ $qry .= ")";
+
+ $qry .= " OR lehrveranstaltung_id IN(
+ SELECT lehrveranstaltung_id FROM lehre.tbl_zeugnisnote
+ WHERE student_uid=?";
$params[] = $student_uid;
- if (isset($studiensemester_kurzbz))
- {
- $qry .= " AND studiensemester_kurzbz=?";
- $params[] = $studiensemester_kurzbz;
- }
+
$qry .= ") ORDER BY semester, bezeichnung";
return $this->execQuery($qry, $params);
@@ -556,16 +486,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
@@ -605,12 +525,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');
-
- $this->addSelect('COALESCE(gnn.' . $bezeichnung . ', gnn.bezeichnung, gn.note::text) AS lvnote');
- $this->addSelect('COALESCE(znn.' . $bezeichnung . ', znn.bezeichnung, zn.note::text) AS znote');
+
+ //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('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');
@@ -730,6 +658,37 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($query, array($uid, $studiensemester_kurzbz, $lehrveranstaltung_id));
}
+ /**
+ * Get Lehreinheit.
+ *
+ * @param string $student_uid
+ * @param string $studiensemester_kurzbz
+ * @param integer $lehrveranstaltung_id
+ *
+ * @return stdClass
+ */
+ public function getLeByStudent($student_uid, $studiensemester_kurzbz, $lehrveranstaltung_id)
+ {
+ $this->addSelect("lehreinheit_id");
+
+ $this->addOrder("lehreinheit_id", "ASC");
+
+ $this->addLimit(1);
+
+ $tmp = $this->dbTable;
+ $this->dbTable = "campus.vw_student_lehrveranstaltung";
+
+ $result = $this->loadWhere([
+ "uid" => $student_uid,
+ "lehrveranstaltung_id" => $lehrveranstaltung_id,
+ "studiensemester_kurzbz" => $studiensemester_kurzbz
+ ]);
+
+ $this->dbTable = $tmp;
+
+ return $result;
+ }
+
/**
* Sucht nach LV Templates und gibt Id und Label ("bezeichnung [kurzbz]") aus
* Diese funktion ist für autocomplete gedacht
@@ -775,6 +734,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.
@@ -1012,4 +993,357 @@ class Lehrveranstaltung_model extends DB_Model
$res = $this->execReadOnlyQuery($query);
return $res;
}
+
+ /**
+ * Gets lehrveranstaltungen of a studiengang
+ * @param integer $studiengang_kz
+ * @return array|null
+ */
+ public function getLvsByStudiengangkz($studiengang_kz)
+ {
+ $params = array($studiengang_kz);
+
+ $qry = "SELECT
+ *
+ FROM
+ lehre.tbl_lehrveranstaltung
+ WHERE lehrveranstaltung_id IN
+ (SELECT lehrveranstaltung_id
+ FROM campus.vw_student_lehrveranstaltung
+ WHERE studiengang_kz = ?";
+
+ $qry .= ") ORDER BY semester, bezeichnung";
+
+ 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/Lvgesamtnote_model.php b/application/models/education/Lvgesamtnote_model.php
index 975833287..c30045ff0 100644
--- a/application/models/education/Lvgesamtnote_model.php
+++ b/application/models/education/Lvgesamtnote_model.php
@@ -12,4 +12,38 @@ class Lvgesamtnote_model extends DB_Model
$this->pk = array('student_uid', 'studiensemester_kurzbz', 'lehrveranstaltung_id');
$this->hasSequence = false;
}
+
+ /**
+ * Laedt die Noten
+ *
+ * @param integer $lehrveranstaltung_id
+ * @param string $student_uid
+ * @param string $studiensemester_kurzbz
+ *
+ * @return stdClass
+ */
+ public function getLvGesamtNoten($lehrveranstaltung_id, $student_uid, $studiensemester_kurzbz)
+ {
+ $this->addSelect($this->dbTable . ".*");
+ $this->addSelect("n.bezeichnung AS note_bezeichnung");
+ $this->addSelect("lv.bezeichnung AS lehrveranstaltung_bezeichnung");
+ $this->addSelect("lv.studiengang_kz");
+ $this->addSelect("UPPER(stg.typ || stg.kurzbz) AS studiengang");
+
+ $this->addJoin("lehre.tbl_note n", "note");
+ $this->addJoin("lehre.tbl_lehrveranstaltung lv", "lehrveranstaltung_id");
+ $this->addJoin("public.tbl_studiengang stg", "studiengang_kz");
+
+ $this->db->where($this->dbTable . ".freigabedatum <", "NOW()", false);
+
+ $where = [];
+ if ($studiensemester_kurzbz)
+ $where[$this->dbTable . ".studiensemester_kurzbz"] = $studiensemester_kurzbz;
+ if ($lehrveranstaltung_id)
+ $where[$this->dbTable . ".lehrveranstaltung_id"] = $lehrveranstaltung_id;
+ if ($student_uid)
+ $where[$this->dbTable . ".student_uid"] = $student_uid;
+
+ return $this->loadWhere($where);
+ }
}
diff --git a/application/models/education/Note_model.php b/application/models/education/Note_model.php
new file mode 100644
index 000000000..87a1501e0
--- /dev/null
+++ b/application/models/education/Note_model.php
@@ -0,0 +1,22 @@
+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/Notenschluesselaufteilung_model.php b/application/models/education/Notenschluesselaufteilung_model.php
index 5e0f2f05c..d48e16b0b 100644
--- a/application/models/education/Notenschluesselaufteilung_model.php
+++ b/application/models/education/Notenschluesselaufteilung_model.php
@@ -11,4 +11,34 @@ class Notenschluesselaufteilung_model extends DB_Model
$this->dbTable = 'lehre.tbl_notenschluesselaufteilung';
$this->pk = 'notenschluesselaufteilung_id';
}
+
+ /**
+ * Liefert die Note zu Punkten einer Lehrveranstaltung
+ *
+ * @param number $points
+ * @param integer $lehrveranstaltung_id
+ * @param string $studiensemester_kurzbz
+ *
+ * @return stdClass returns success(null) if no entry is found
+ */
+ public function getNote($points, $lehrveranstaltung_id, $studiensemester_kurzbz)
+ {
+ $this->load->model('education/Notenschluesselzuordnung_model', 'NotenschluesselzuordnungModel');
+ $notenschluessel_kurzbz = $this->NotenschluesselzuordnungModel->getKurzbzForLv($lehrveranstaltung_id, $studiensemester_kurzbz);
+
+ $this->addSelect("note");
+ $this->addOrder("punkte", "DESC");
+ $this->addLimit(1);
+
+ $result = $this->loadWhere([
+ "notenschluessel_kurzbz" => $notenschluessel_kurzbz,
+ "punkte <=" => $points
+ ]);
+
+ if (isError($result))
+ return $result;
+ if (!hasData($result))
+ return success(null);
+ return success(current(getData($result))->note);
+ }
}
diff --git a/application/models/education/Notenschluesselzuordnung_model.php b/application/models/education/Notenschluesselzuordnung_model.php
index e6881e12b..9eb46b290 100644
--- a/application/models/education/Notenschluesselzuordnung_model.php
+++ b/application/models/education/Notenschluesselzuordnung_model.php
@@ -11,4 +11,71 @@ class Notenschluesselzuordnung_model extends DB_Model
$this->dbTable = 'lehre.tbl_notenschluesselzuordnung';
$this->pk = 'notenschluesselzuordnung_id';
}
+
+ /**
+ * Liefert den passenden Notenschluessel zu einer Lehrveranstaltung
+ *
+ * @param integer $lehrveranstaltung_id
+ * @param string $studiensemester_kurzbz
+ *
+ * @return integer|null
+ */
+ public function getKurzbzForLv($lehrveranstaltung_id, $studiensemester_kurzbz)
+ {
+ $this->addSelect("notenschluessel_kurzbz");
+
+ $this->db->where("lehrveranstaltung_id", $lehrveranstaltung_id);
+ if ($studiensemester_kurzbz) {
+ $this->db->where("studiensemester_kurzbz", $studiensemester_kurzbz);
+ $this->db->or_where("studiensemester_kurzbz", null);
+ } else {
+ $this->db->where("studiensemester_kurzbz", null);
+ }
+
+ $result = $this->load();
+
+ if (!isError($result) && hasData($result))
+ return current(getData($result))->notenschluessel_kurzbz;
+
+
+ $this->addSelect("notenschluessel_kurzbz");
+
+ $this->addJoin("(
+ WITH RECURSIVE oes(oe_kurzbz, oe_parent_kurzbz, depth) AS (
+ SELECT oe_kurzbz, oe_parent_kurzbz, 1
+ FROM public.tbl_organisationseinheit
+ WHERE oe_kurzbz = (
+ SELECT
+ oe_kurzbz
+ FROM
+ lehre.tbl_lehrveranstaltung
+ WHERE
+ lehrveranstaltung_id = " . $this->escape($lehrveranstaltung_id) . "
+ )
+ UNION ALL
+ SELECT o.oe_kurzbz, o.oe_parent_kurzbz, oes.depth+1 AS depth
+ FROM public.tbl_organisationseinheit o, oes
+ WHERE o.oe_kurzbz = oes.oe_parent_kurzbz
+ AND aktiv = true
+ )
+ SELECT * FROM oes
+ ) oes", "oe_kurzbz");
+
+ $this->addOrder("depth", "ASC");
+ $this->addLimit(1);
+
+ if ($studiensemester_kurzbz) {
+ $this->db->where_in("studiensemester_kurzbz", [$studiensemester_kurzbz, null]);
+ $result = $this->load();
+ } else {
+ $result = $this->loadWhere([
+ "studiensemester_kurzbz" => null
+ ]);
+ }
+
+ if (isError($result) || !hasData($result))
+ return null;
+
+ return current(getData($result))->notenschluessel_kurzbz;
+ }
}
diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php
index 5fb58cc81..99b9b75f1 100644
--- a/application/models/education/Paabgabe_model.php
+++ b/application/models/education/Paabgabe_model.php
@@ -30,4 +30,99 @@ 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::date = CURRENT_DATE - INTERVAL ?
+ OR campus.tbl_paabgabe.updateamum::date = CURRENT_DATE - INTERVAL ?)
+ AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
+
+ return $this->execQuery($query, [$interval, $interval, $relevantTypes]);
+ }
+
+ public function findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $relevantTypes = null) {
+
+ $queryParams = [$interval];
+ $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,
+ 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 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 ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
+
+ WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL
+ AND campus.tbl_paabgabe.abgabedatum = CURRENT_DATE - INTERVAL ?";
+
+ if($relevantTypes !== null) {
+ $query .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
+ $queryParams[]= $relevantTypes;
+ }
+
+ $query .= " ORDER BY abgabedatum DESC";
+
+ return $this->execQuery($query, $queryParams);
+ }
+
+ 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..3b1ea55e5 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,473 @@ 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.titelpre as betreuer_titelpre,
+ betreuer_person.vorname as betreuer_vorname,
+ betreuer_person.nachname as betreuer_nachname,
+ betreuer_person.titelpost as betreuer_titelpost,
+ lehre.tbl_projektbetreuer.betreuerart_kurzbz as betreuerart,
+ lehre.tbl_projektbetreuer.person_id as betreuer_person_id,
+ lehre.tbl_projektarbeit.sprache as sprache,
+ lehre.tbl_projektarbeit.seitenanzahl as seitenanzahl,
+ lehre.tbl_projektarbeit.kontrollschlagwoerter as kontrollschlagwoerter,
+ lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter,
+ lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
+ lehre.tbl_projektarbeit.abstract as abstract,
+ lehre.tbl_projektarbeit.abstract_en as abstract_en,
+ lehre.tbl_projektarbeit.insertamum as insertamum,
+ lehre.tbl_projektarbeit.note as note,
+ (
+ SELECT orgform_kurzbz
+ FROM tbl_prestudentstatus
+ WHERE prestudent_id = (SELECT prestudent_id
+ FROM tbl_student
+ WHERE student_uid = student_benutzer.uid
+ LIMIT 1)
+ ORDER BY datum DESC, insertamum DESC, ext_id DESC
+ LIMIT 1
+ )
+ as organisationsform,
+ (
+ SELECT person_id
+ FROM lehre.tbl_projektbetreuer
+ WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ AS zweitbetreuer_person_id,
+ (
+ SELECT betreuerart_kurzbz
+ FROM lehre.tbl_projektbetreuer
+ WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ AS zweitbetreuer_betreuerart_kurzbz,
+ (
+ SELECT tbl_betreuerart.beschreibung
+ FROM lehre.tbl_projektbetreuer
+ JOIN lehre.tbl_betreuerart USING (betreuerart_kurzbz)
+ WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ AS zweitbetreuer_betreuerart_beschreibung,
+ (
+ SELECT trim(COALESCE(titelpre, '') || ' ' || COALESCE(vorname, '') || ' ' || COALESCE(nachname, '') || ' ' ||
+ COALESCE(titelpost, ''))
+ FROM public.tbl_person
+ JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
+ LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
+ LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
+ WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ as zweitbetreuer_full_name,
+ (
+ SELECT titelpre
+ FROM public.tbl_person
+ JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
+ LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
+ LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
+ WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ as zweitbetreuer_titelpre,
+ (
+ SELECT vorname
+ FROM public.tbl_person
+ JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
+ LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
+ LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
+ WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ as zweitbetreuer_vorname,
+ (
+ SELECT nachname
+ FROM public.tbl_person
+ JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
+ LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
+ LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
+ WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ as zweitbetreuer_nachname,
+ (
+ SELECT titelpost
+ FROM public.tbl_person
+ JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
+ LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
+ LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
+ WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ as zweitbetreuer_titelpost,
+ (
+ SELECT
+ COALESCE(tbl_studienplan.orgform_kurzbz,
+ tbl_prestudentstatus.orgform_kurzbz, tbl_studiengang.orgform_kurzbz) as
+ orgform
+ FROM
+ public.tbl_prestudent
+ JOIN public.tbl_prestudentstatus USING(prestudent_id)
+ JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
+ JOIN public.tbl_studiengang USING(studiengang_kz)
+ LEFT JOIN lehre.tbl_studienplan USING(studienplan_id)
+ WHERE
+ prestudent_id=tbl_student.prestudent_id
+ ORDER BY tbl_prestudentstatus.datum DESC LIMIT 1
+ ) as orgform,
+ (SELECT status_kurzbz FROM public.tbl_prestudentstatus
+ WHERE prestudent_id=tbl_student.prestudent_id
+ ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as studienstatus
+ FROM lehre.tbl_projektarbeit
+ LEFT JOIN public.tbl_benutzer student_benutzer ON (student_benutzer.uid = lehre.tbl_projektarbeit.student_uid)
+ LEFT JOIN public.tbl_person student_person ON (student_benutzer.person_id = student_person.person_id)
+ LEFT JOIN public.tbl_student on(student_benutzer.uid = public.tbl_student.student_uid)
+ LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
+ LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
+ LEFT JOIN public.tbl_studiengang ON (public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz)
+ LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
+ LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
+ LEFT JOIN public.tbl_person betreuer_person ON (betreuer_person.person_id = lehre.tbl_projektbetreuer.person_id)
+ LEFT JOIN public.tbl_benutzer betreuer_benutzer ON (betreuer_person.person_id = betreuer_benutzer.person_id)
+ WHERE (projekttyp_kurzbz = 'Bachelor' OR projekttyp_kurzbz = 'Diplom')
+ AND student_benutzer.aktiv AND (
+ lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbegutachter'
+ OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Begutachter'
+ OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Betreuer'
+ OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbetreuer'
+ OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Senatsvorsitz'
+ )
+ AND public.tbl_studiengang.studiengang_kz = ?";
+
+ 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/education/Pruefungsantritt_model.php b/application/models/education/Pruefungsantritt_model.php
new file mode 100644
index 000000000..f22633117
--- /dev/null
+++ b/application/models/education/Pruefungsantritt_model.php
@@ -0,0 +1,14 @@
+dbTable = 'lehre.tbl_abschlusspruefung_antritt';
+ $this->pk = 'pruefungsantritt_kurzbz';
+ }
+}
\ No newline at end of file
diff --git a/application/models/education/Studierendenantraglehrveranstaltung_model.php b/application/models/education/Studierendenantraglehrveranstaltung_model.php
index 4318c773e..927343a3e 100644
--- a/application/models/education/Studierendenantraglehrveranstaltung_model.php
+++ b/application/models/education/Studierendenantraglehrveranstaltung_model.php
@@ -46,6 +46,15 @@ class Studierendenantraglehrveranstaltung_model extends DB_Model
}
}
+ /**
+ * Gets all LVs for a repeating prestudent that are either not allowed or
+ * already done.
+ *
+ * @param string $prestudent_id
+ * @param string $studiensemester_kurzbz
+ *
+ * @return stdClass
+ */
public function getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz)
{
$this->addSelect($this->dbTable . '.*');
@@ -66,39 +75,53 @@ class Studierendenantraglehrveranstaltung_model extends DB_Model
);
$this->addJoin('public.tbl_student s', 'prestudent_id');
- // NOTE(chris): last offizell note
- $this->addJoin('(
- SELECT z.*
- FROM lehre.tbl_zeugnisnote z
- LEFT JOIN public.tbl_studiensemester zs
- USING(studiensemester_kurzbz)
- JOIN (
- SELECT zi.lehrveranstaltung_id, zi.student_uid, MAX(zis.start) AS start
- FROM lehre.tbl_zeugnisnote zi
- LEFT JOIN lehre.tbl_note zin
- USING(note)
- LEFT JOIN public.tbl_studiensemester zis
- USING(studiensemester_kurzbz)
- WHERE zin.aktiv AND zin.offiziell
- GROUP BY zi.lehrveranstaltung_id, zi.student_uid
- ) zx
- ON (
- z.lehrveranstaltung_id=zx.lehrveranstaltung_id
- AND z.student_uid=zx.student_uid
- AND zs.start = zx.start
- )) z', 'z.lehrveranstaltung_id=lv.lehrveranstaltung_id AND z.student_uid=s.student_uid', 'LEFT');
- $this->addJoin('lehre.tbl_note zn', 'z.note = zn.note', 'LEFT');
-
+
$this->load->config('studierendenantrag');
$note_intern_angerechntet = $this->config->item('wiederholung_note_angerechnet');
- return $this->loadWhere([
+ $where = [
'ps.prestudent_id' => $prestudent_id,
'a.typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
'stat.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED,
'n.note <> ' => 0,
- $this->dbTable . '.studiensemester_kurzbz' => $studiensemester_kurzbz,
- '(n.note<>' . $this->db->escape($note_intern_angerechntet) . ' OR (z.note IS NOT NULL AND zn.positiv))' => null
- ]);
+ // NOTE(chris): grade "intern angerechnet" needs an official grade beforehand (the subquery gets the last positive offical grade)
+ "(n.note<>" . $this->db->escape($note_intern_angerechntet) . " OR EXISTS (
+ SELECT
+ 1
+ FROM
+ lehre.tbl_zeugnisnote z
+ LEFT JOIN public.tbl_studiensemester zs USING(studiensemester_kurzbz)
+ JOIN (
+ SELECT
+ zi.lehrveranstaltung_id,
+ zi.student_uid,
+ MAX(zis.start) AS start
+ FROM
+ lehre.tbl_zeugnisnote zi
+ LEFT JOIN lehre.tbl_note zin USING(note)
+ LEFT JOIN public.tbl_studiensemester zis USING(studiensemester_kurzbz)
+ WHERE
+ zin.aktiv
+ AND zin.offiziell
+ GROUP BY
+ zi.lehrveranstaltung_id,
+ zi.student_uid
+ ) zx ON (
+ z.lehrveranstaltung_id = zx.lehrveranstaltung_id
+ AND z.student_uid = zx.student_uid
+ AND zs.start = zx.start
+ )
+ JOIN lehre.tbl_note zn USING (note)
+ WHERE
+ z.lehrveranstaltung_id = lv.lehrveranstaltung_id
+ AND z.student_uid = s.student_uid
+ AND zn.positiv
+ ))" => null
+ ];
+
+ if ($studiensemester_kurzbz !== false)
+ $where[$this->dbTable . '.studiensemester_kurzbz'] = $studiensemester_kurzbz;
+
+ return $this->loadWhere($where);
}
}
diff --git a/application/models/education/Zeugnisnote_model.php b/application/models/education/Zeugnisnote_model.php
index b4d909e37..f32713dec 100644
--- a/application/models/education/Zeugnisnote_model.php
+++ b/application/models/education/Zeugnisnote_model.php
@@ -177,45 +177,63 @@ class Zeugnisnote_model extends DB_Model
$params[] = $studiensemester_kurzbz;
}
- $qry = "SELECT vw_student_lehrveranstaltung.lehrveranstaltung_id, uid,
- vw_student_lehrveranstaltung.studiensemester_kurzbz, note, punkte, uebernahmedatum, benotungsdatum,
- vw_student_lehrveranstaltung.ects, vw_student_lehrveranstaltung.semesterstunden,
- tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum,
- tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id,
- vw_student_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung,
- vw_student_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english,
- tbl_note.bezeichnung as note_bezeichnung,
- tbl_note.positiv as note_positiv,
- tbl_zeugnisnote.bemerkung as bemerkung,
- vw_student_lehrveranstaltung.sort,
- vw_student_lehrveranstaltung.zeugnis,
- vw_student_lehrveranstaltung.studiengang_kz,
- vw_student_lehrveranstaltung.lv_lehrform_kurzbz,
- tbl_lehrveranstaltung.sws
- FROM
- (
- campus.vw_student_lehrveranstaltung LEFT JOIN lehre.tbl_zeugnisnote
- ON(uid=student_uid
- AND vw_student_lehrveranstaltung.studiensemester_kurzbz=tbl_zeugnisnote.studiensemester_kurzbz
- AND vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id
- )
- ) LEFT JOIN lehre.tbl_note USING(note)
- JOIN lehre.tbl_lehrveranstaltung ON(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id)
- WHERE true $where
+ $qry = "SELECT
+ a.*,
+ lv.lehrform_kurzbz AS lehrveranstaltung_lehrform,
+ lv.kurzbz AS lehrveranstaltung_kurzbz,
+ UPPER(stg1.typ || stg1.kurzbz) AS studiengang,
+ s.studiengang_kz AS studiengang_kz,
+ UPPER(stg2.typ || stg2.kurzbz) AS studiengang_lv,
+ lv.studiengang_kz AS studiengang_kz_lv,
+ lv.semester AS semester_lv,
+ lv.ects AS ects_lv,
+ lv.zeugnis,
+ lv.bezeichnung_english AS lehrveranstaltung_bezeichnung_english
+ FROM (
+ SELECT vw_student_lehrveranstaltung.lehrveranstaltung_id, uid,
+ vw_student_lehrveranstaltung.studiensemester_kurzbz, note, punkte, uebernahmedatum, benotungsdatum,
+ vw_student_lehrveranstaltung.ects, vw_student_lehrveranstaltung.semesterstunden,
+ tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum,
+ tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id,
+ vw_student_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung,
+ vw_student_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english,
+ tbl_note.bezeichnung as note_bezeichnung,
+ tbl_note.positiv as note_positiv,
+ tbl_zeugnisnote.bemerkung as bemerkung,
+ vw_student_lehrveranstaltung.sort,
+ vw_student_lehrveranstaltung.zeugnis,
+ vw_student_lehrveranstaltung.studiengang_kz,
+ vw_student_lehrveranstaltung.lv_lehrform_kurzbz,
+ tbl_lehrveranstaltung.sws
+ FROM
+ (
+ campus.vw_student_lehrveranstaltung LEFT JOIN lehre.tbl_zeugnisnote
+ ON(uid=student_uid
+ AND vw_student_lehrveranstaltung.studiensemester_kurzbz=tbl_zeugnisnote.studiensemester_kurzbz
+ AND vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id
+ )
+ ) LEFT JOIN lehre.tbl_note USING(note)
+ JOIN lehre.tbl_lehrveranstaltung ON(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id)
+ WHERE true $where
- UNION
- SELECT lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,student_uid AS uid,studiensemester_kurzbz, note, punkte,
- uebernahmedatum, benotungsdatum,lehre.tbl_lehrveranstaltung.ects,lehre.tbl_lehrveranstaltung.semesterstunden, tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum,
- tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, lehre.tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, lehre.tbl_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english,
- tbl_note.bezeichnung as note_bezeichnung, tbl_note.positiv as note_positiv, tbl_zeugnisnote.bemerkung as bemerkung, tbl_lehrveranstaltung.sort, tbl_lehrveranstaltung.zeugnis, tbl_lehrveranstaltung.studiengang_kz,
- tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.sws
- FROM
- lehre.tbl_zeugnisnote
- JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
- JOIN lehre.tbl_note USING(note)
- WHERE true $where2
+ UNION
+ SELECT lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,student_uid AS uid,studiensemester_kurzbz, note, punkte,
+ uebernahmedatum, benotungsdatum,lehre.tbl_lehrveranstaltung.ects,lehre.tbl_lehrveranstaltung.semesterstunden, tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum,
+ tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, lehre.tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, lehre.tbl_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english,
+ tbl_note.bezeichnung as note_bezeichnung, tbl_note.positiv as note_positiv, tbl_zeugnisnote.bemerkung as bemerkung, tbl_lehrveranstaltung.sort, tbl_lehrveranstaltung.zeugnis, tbl_lehrveranstaltung.studiengang_kz,
+ tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.sws
+ FROM
+ lehre.tbl_zeugnisnote
+ JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
+ JOIN lehre.tbl_note USING(note)
+ WHERE true $where2
- ORDER BY sort";
+ ORDER BY sort
+ ) a
+ LEFT JOIN public.tbl_student s ON (a.uid = s.student_uid)
+ LEFT JOIN public.tbl_studiengang stg1 ON (s.studiengang_kz = stg1.studiengang_kz)
+ LEFT JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
+ LEFT JOIN public.tbl_studiengang stg2 ON (lv.studiengang_kz = stg2.studiengang_kz)";
return $this->execQuery($qry, $params);
}
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 e306ce950..1db658596 100644
--- a/application/models/organisation/Studiengang_model.php
+++ b/application/models/organisation/Studiengang_model.php
@@ -594,7 +594,10 @@ class Studiengang_model extends DB_Model
$this->addSelect('p.prestudent_id');
$this->addSelect('pers.vorname');
$this->addSelect('pers.nachname');
- $this->addSelect("CONCAT(UPPER(pers.nachname), ' ', pers.vorname, ' (', " . $this->dbTable . ".bezeichnung, ')') AS name");
+ $this->addSelect("CONCAT(UPPER(pers.nachname), ' ', pers.vorname, ' (', "
+ . $this->dbTable . ".bezeichnung, ', ', "
+ . "UPPER(" . $this->dbTable . ".typ), "
+ . "UPPER(" . $this->dbTable . ".kurzbz),')') AS name");
$this->addJoin('public.tbl_prestudent p', 'studiengang_kz');
$this->addJoin(
@@ -647,4 +650,265 @@ class Studiengang_model extends DB_Model
return $this->load();
}
+
+ /**
+ * @return stdClass
+ */
+ public function getStudiengangInfoForNews()
+ {
+
+ $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
+ $this->load->model('person/Person_model', 'PersonModel');
+ $this->load->model('crm/Student_model', 'StudentModel');
+
+ $student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]);
+ if (isError($student))
+ return error($student);
+ if (getData($student)) {
+ $student = current(getData($student));
+ $studiengang_kz = $student->studiengang_kz;
+ $semester = $student->semester;
+ }
+
+ $stg_obj = $this->load($studiengang_kz);
+ if(isError($stg_obj))
+ return error($stg_obj);
+ if(getData($stg_obj))
+ {
+ $stg_obj = current(getData($stg_obj));
+ }
+
+ $stg_ltg = $this->getLeitungDetailed($stg_obj->studiengang_kz);
+ if (isError($stg_ltg))
+ return $stg_ltg;
+ $stg_ltg = getData($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) ?: [];
+ $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) ?: [];
+ $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) ?: [];
+ $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) ?: [];
+ $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) ?: [];
+ $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) ?: [];
+ $jahrgangsvertr = array_values(array_filter($jahrgangsvertr, function($jahrgang_vertreter){
+ return $jahrgang_vertreter->aktiv;
+ }));
+ $this->addEmailProperty($jahrgangsvertr);
+
+
+ $result_object = new stdClass();
+ $result_object->studiengang = $stg_obj;
+ $result_object->semester = $semester;
+ $result_object->stg_ltg = $stg_ltg;
+ $result_object->gf_ltg = $gf_ltg;
+ $result_object->stv_ltg = $stv_ltg;
+ $result_object->ass = $ass;
+ $result_object->hochschulvertr = $hochschulvertr;
+ $result_object->stdv = $stdv;
+ $result_object->jahrgangsvertr = $jahrgangsvertr;
+
+ return success($result_object);
+ }
+
+ public function getLvaForStudiengangInStudiensemester($studiengang_kz, $orgform_kurzbz, $studiensemester_kurzbz) {
+ $qry = '
+ SELECT DISTINCT ON (lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,
+ kurzbz, bezeichnung, semester,
+ lehre.tbl_lehrveranstaltung.sprache, orgform_kurzbz,
+ lehre.tbl_lehrveranstaltung.lehrform_kurzbz)
+ lehre.tbl_lehrveranstaltung.lehrveranstaltung_id, kurzbz, bezeichnung,
+ semester, lehre.tbl_lehrveranstaltung.sprache, orgform_kurzbz, lehre.tbl_lehrveranstaltung.lehrform_kurzbz
+ FROM lehre.tbl_lehrveranstaltung JOIN lehre.tbl_lehreinheit USING(lehrveranstaltung_id) JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id)
+ WHERE aktiv = TRUE AND studiengang_kz = ? AND orgform_kurzbz = ? AND tbl_lehreinheit.studiensemester_kurzbz IN ?';
+
+ 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 291a010f9..5fa6ffb14 100644
--- a/application/models/organisation/Studiensemester_model.php
+++ b/application/models/organisation/Studiensemester_model.php
@@ -170,13 +170,31 @@ class Studiensemester_model extends DB_Model
return $this->execQuery($query, array($studiensemester_kurzbz, $studiengang_kz));
}
+ /**
+ * Gets a Studiensemester for a date
+ * @param $date
+ * @return string
+ */
+ public function getByDate($date)
+ {
+ // gets the studiensemster of a date or the next closest previous studiensemester if a date is not within a studiensemester
+ $query = "
+ SELECT studiensemester_kurzbz, start, ende
+ FROM public.tbl_studiensemester
+ WHERE ( ende >= ?::date AND start <= ?::date ) OR ( ende >= ?::date + '-45 days'::interval AND start <= ?::date + '-45 days'::interval )
+ ORDER BY start DESC
+ LIMIT 1";
+
+ return $this->execQuery($query, array($date,$date,$date,$date));
+ }
+
/**
* Gets all Studiensemester between two dates
* @param $from
* @param $to
* @return array|null
*/
- public function getByDate($from, $to)
+ public function getByDateRange($from, $to)
{
if (date_format(date_create($from), 'Y-m-d') > (date_format(date_create($to), 'Y-m-d')))
return success(array());
@@ -207,7 +225,7 @@ class Studiensemester_model extends DB_Model
/**
* @param string $student_uid
- *
+ *
* @return StdClass
*/
public function getWhereStudentHasLvs($student_uid)
@@ -220,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]);
}
@@ -273,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
@@ -287,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/Benutzerfunktion_model.php b/application/models/person/Benutzerfunktion_model.php
index 398ca765e..dff422b7d 100644
--- a/application/models/person/Benutzerfunktion_model.php
+++ b/application/models/person/Benutzerfunktion_model.php
@@ -50,6 +50,53 @@ class Benutzerfunktion_model extends DB_Model
return $this->execQuery($qry, $params);
}
+ /**
+ * Lädt alle Benutzerfunktionen zu einer UID im Zeitraum eines Studiensemesters
+ *
+ * @param string $uid
+ * @param string $stdsem
+ * @param string $funktion_kurzbz (optional)
+ *
+ * @return stdClass
+ */
+ public function getBenutzerFunktionByUidInStdsem($uid, $stdsem, $funktion_kurzbz = null)
+ {
+ $stdsemEscaped = $this->escape($stdsem);
+ $this->addSelect($this->dbTable . ".*");
+ $this->addSelect("oe.bezeichnung AS organisationseinheit_bezeichnung");
+ $this->addSelect("oe.organisationseinheittyp_kurzbz");
+
+ $this->addJoin("public.tbl_organisationseinheit oe", "oe_kurzbz");
+
+ $this->db->where("uid", $uid);
+
+ if ($funktion_kurzbz !== null)
+ $this->db->where("funktion_kurzbz", $funktion_kurzbz);
+
+ $this->db->group_start();
+ $this->db->where("datum_bis IS NULL");
+ $this->db->or_where("datum_bis >=", "(
+ SELECT start
+ FROM public.tbl_studiensemester
+ WHERE studiensemester_kurzbz = " . $stdsemEscaped . "
+ )", false);
+ $this->db->group_end();
+
+ $this->db->group_start();
+ $this->db->where("datum_von IS NULL");
+ $this->db->or_where("datum_von <=", "(
+ SELECT ende
+ FROM public.tbl_studiensemester
+ WHERE studiensemester_kurzbz = " . $stdsemEscaped . "
+ )", false);
+ $this->db->group_end();
+
+ $this->addOrder("datum_bis", "NULLS LAST");
+ $this->addOrder("datum_von", "NULLS LAST");
+
+ return $this->load();
+ }
+
/**
* Get the Benutzerfunktion using the person_id
*/
@@ -214,6 +261,42 @@ class Benutzerfunktion_model extends DB_Model
}
+ /**
+ * Get active Kompetenzfeldleitung bei UID.
+ *
+ * @param $uid
+ * @return array|stdClass|null
+ */
+ public function getKFLByUID($uid)
+ {
+ $query = '
+ SELECT
+ bf.uid,
+ bf.oe_kurzbz,
+ oe.organisationseinheittyp_kurzbz
+ FROM
+ public.tbl_benutzerfunktion bf
+ JOIN public.tbl_organisationseinheit oe USING (oe_kurzbz)
+ JOIN public.tbl_benutzer b USING (uid)
+ WHERE
+ b.uid = ?
+ AND b.aktiv = TRUE
+ AND funktion_kurzbz = \'Leitung\'
+ AND organisationseinheittyp_kurzbz = \'Kompetenzfeld\'
+ AND (datum_von IS NULL OR datum_von <= now())
+ AND (datum_bis IS NULL OR datum_bis >= now())
+ ';
+
+ $parameters_array = array();
+ if (is_string($uid))
+ {
+ $parameters_array[] = $uid;
+ }
+
+ return $this->execQuery($query, $parameters_array);
+ }
+
+
public function insertBenutzerfunktion($Json)
{
unset($Json['benutzerfunktion_id']);
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 2d1e054c3..64fce8944 100644
--- a/application/models/person/Notiz_model.php
+++ b/application/models/person/Notiz_model.php
@@ -151,15 +151,28 @@ 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,
- TO_CHAR (CASE
+ 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
- END::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS lastUpdate,
+ END) AS lastUpdate,
regexp_replace(n.text, '<[^>]*>', '', 'g') as text_stripped,
TO_CHAR(n.start::timestamp, 'DD.MM.YYYY') AS start_format,
TO_CHAR(n.ende::timestamp, 'DD.MM.YYYY') AS ende_format,
@@ -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 39f08b5cd..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,17 +113,31 @@ 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, bmp.retouram, TO_CHAR(bmp.retouram::timestamp, 'DD.MM.YYYY') AS format_retour, bmp.ausgegebenam, TO_CHAR(bmp.ausgegebenam::timestamp, 'DD.MM.YYYY') AS format_ausgabe, bm.beschreibung, bmp.uid, bmp.kaution, bm.betriebsmittel_id, bmp.betriebsmittelperson_id, bm.inventarnummer, bm.nummer2
+ bm.nummer, bmp.person_id, bm.betriebsmitteltyp, bmp.anmerkung as anmerkung,
+ bmp.retouram,
+ bmp.ausgegebenam,
+ bm.beschreibung, bmp.uid, bmp.kaution,
+ bm.betriebsmittel_id, bmp.betriebsmittelperson_id,
+ bm.inventarnummer, bm.nummer2
FROM
- wawi.tbl_betriebsmittelperson bmp
+ wawi.tbl_betriebsmittelperson bmp
JOIN
- wawi.tbl_betriebsmittel bm ON (bmp.betriebsmittel_id = bm.betriebsmittel_id)
+ 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 c38fcf054..d8bbd7d63 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, personalnummer, mitarbeiter_uid
+ 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,29 +336,118 @@ class Mitarbeiter_model extends DB_Model
if (hasData($kurzbzexists) && getData($kurzbzexists)[0])
return error('No Kurzbezeichnung could be generated');
-
+
return success($kurzbz);
}
- public function searchMitarbeiter($filter)
+ /**
+ * Search function for mitarbeiter
+ * @param $filter searchstring: searches for nachname, vorname, mitarbeiter_uid
+ * $param $mode gives the resultobject in different version:
+ * null : "[mitarbeiter_uid], Nachname, Vorname, (mitarbeiter_uid)"
+ * 'mitAkadGrad': "[mitarbeiter_uid], Nachname, Vorname, Titelpre, Titelpost (mitarbeiter_uid)"
+ * 'ohneMaUid' : "[mitarbeiter_uid], Nachname, Vorname, Titelpre, Titelpost"
+ * @return object in 3 versions
+ */
+ public function searchMitarbeiter($filter, $mode=null)
{
$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";
+ elseif ($mode == "ohneMaUid")
+ $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";
+
$qry = "
- SELECT
- ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter
- FROM
- public.tbl_mitarbeiter ma
- JOIN
- public.tbl_benutzer b on (ma.mitarbeiter_uid = b.uid)
- JOIN
- public.tbl_person p on (p.person_id = b.person_id)
- WHERE
- lower (p.nachname) LIKE '%". $this->db->escape_like_str($filter)."%'
+ SELECT " . $returnwert . "
+ FROM
+ public.tbl_mitarbeiter ma
+ JOIN
+ public.tbl_benutzer b on (ma.mitarbeiter_uid = b.uid)
+ JOIN
+ public.tbl_person p on (p.person_id = b.person_id)
+ WHERE
+ 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);
}
+
+ /**
+ * Gets Mitarbeiter for a certain Lehrveranstaltung.
+ *
+ * @param $lehrveranstaltung_id
+ * @return array with Mitarbeiter and their Lehreinheiten
+ */
+ 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
+ WHERE
+ lehrveranstaltung_id= ?
+ AND
+ mitarbeiter_uid=uid
+ AND
+ tbl_lehreinheitmitarbeiter.lehreinheit_id=tbl_lehreinheit.lehreinheit_id;";
+
+ $parametersArray = array($lehrveranstaltung_id);
+
+ 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 fdfc9926b..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
@@ -71,6 +71,50 @@ class Reservierung_model extends DB_Model
return $query_result;
}
+ /**
+ * @param $uid
+ *
+ * @return stdClass
+ */
+ public function getReservierungenMitarbeiter($start_date, $end_date)
+ {
+
+ $raum_reservierungen_query = "SELECT res.*, beginn, ende,
+ CASE
+ WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz
+ ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/'))
+ END as gruppen_kuerzel
+ FROM campus.vw_reservierung res
+ JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz
+ JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde
+ WHERE res.uid = ? AND datum >= ? AND datum <= ?";
+
+ $subquery = $raum_reservierungen_query;
+
+
+ $query_result= $this->execReadOnlyQuery("
+ SELECT
+ 'reservierung' as type, beginn, ende, datum,
+ COALESCE(titel, beschreibung) as topic,
+ array_agg(DISTINCT mitarbeiter_kurzbz) as lektor,
+ array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
+
+ ort_kurzbz, 'FFFFFF' as farbe
+
+ FROM
+ (
+ ". $subquery ."
+ ) AS subquery
+
+ GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung
+
+ ORDER BY datum, beginn
+ ", [getAuthUID(), $start_date, $end_date]);
+
+
+ return $query_result;
+ }
+
/**
* @param $uid
*
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 8cb07a3bb..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,14 +185,220 @@ 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
+ *
+ * @return void
+ */
+ public function getStundenplanLVA($start_date, $end_date, $lv_id) {
+ return $this->execReadOnlyQuery("
+
+ SELECT
+ 'lehreinheit' as type, beginn, ende, datum,
+ CONCAT(lehrfach,'-',lehrform) as topic,
+ array_agg(DISTINCT lektor) as lektor,
+ array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
+ string_agg(DISTINCT ort_kurzbz, '/') as ort_kurzbz,
+ array_agg(DISTINCT lehreinheit_id) as lehreinheit_id,
+
+ titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
+
+ FROM
+ (
+ SELECT unr,datum,beginn, ende,
+ CASE
+ WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
+ ELSE lektor
+ END as lektor,
+ CASE
+ WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz
+ ELSE CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/'))
+ END as gruppen_kuerzel,
+ (SELECT bezeichnung
+ FROM public.tbl_organisationseinheit
+ WHERE oe_kurzbz IN(
+ SELECT oe_kurzbz
+ FROM lehre.tbl_lehrveranstaltung
+ WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id
+ )) as organisationseinheit,
+ ort_kurzbz, studiengang_kz, titel,lehreinheit_id,lehrfach_id,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz
+
+ FROM (
+ SELECT sp.*
+ FROM lehre.vw_stundenplan sp
+ WHERE
+ sp.datum >= ?
+ AND sp.datum <= ? AND sp.lehrveranstaltung_id = ?
+ ) sp
+ JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde
+
+ ) as subquery
+
+ 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]);
+ }
+
+ /**
+ * queries Stundenplan and filters by assigned ma_kurzbz, very similar to get by LVA
+ *
+ * @return void
+ */
+ public function getStundenplanMitarbeiter($start_date, $end_date, $ma_uid) {
+ return $this->execReadOnlyQuery("
+
+ SELECT
+ 'lehreinheit' as type, beginn, ende, datum,
+ CONCAT(lehrfach,'-',lehrform) as topic,
+ array_agg(DISTINCT lektor) as lektor,
+ array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
+ string_agg(DISTINCT ort_kurzbz, '/') as ort_kurzbz,
+ array_agg(DISTINCT lehreinheit_id) as lehreinheit_id,
+
+ titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
+
+ FROM
+ (
+ SELECT unr,datum,beginn, ende,
+ CASE
+ WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
+ ELSE sp.lektor
+ END as lektor,
+ CASE
+ WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz
+ ELSE CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/'))
+ END as gruppen_kuerzel,
+ (SELECT bezeichnung
+ FROM public.tbl_organisationseinheit
+ WHERE oe_kurzbz IN(
+ SELECT oe_kurzbz
+ FROM lehre.tbl_lehrveranstaltung
+ WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id
+ )) as organisationseinheit,
+ sp.ort_kurzbz, sp.studiengang_kz, sp.titel,sp.lehreinheit_id,sp.lehrfach_id,sp.anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz
+
+ FROM (
+ SELECT sp.*
+ FROM lehre.vw_stundenplan sp
+ WHERE
+ sp.datum >= ?
+ AND sp.datum <= ?
+ ) sp
+ JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde
+ JOIN public.tbl_mitarbeiter ON public.tbl_mitarbeiter.kurzbz = sp.mitarbeiter_kurzbz
+ WHERE mitarbeiter_uid = ?
+
+ ) as subquery
+
+ 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]);
+ }
+
/**
* NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester.
- * @param string $uid the user id that is used to fetch the stundenplan rows from the lehre.vw_stundenplan table
+ *
+ * @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;
@@ -215,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);
@@ -225,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
@@ -248,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)
@@ -259,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";
-
}
}
}
@@ -325,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..ba51e514e 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,154 @@ 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)
+ {
+ $limitoffset = (!is_null($offset) && !is_null($limit)) ? 'limit ? offset ?' : '';
+ $sql = <<execQuery($sql, $parametersArray);
+
+ if (isError($data))
+ return $data;
+
+ $data = getData($data);
+ if($data)
+ {
+ $count = is_null($limit) ? 1 : 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/system/Vorlagestudiengang_model.php b/application/models/system/Vorlagestudiengang_model.php
index 24af7353c..613d88226 100644
--- a/application/models/system/Vorlagestudiengang_model.php
+++ b/application/models/system/Vorlagestudiengang_model.php
@@ -11,4 +11,49 @@ class Vorlagestudiengang_model extends DB_Model
$this->dbTable = 'public.tbl_vorlagestudiengang';
$this->pk = 'vorlagestudiengang_id';
}
+
+ /**
+ * Gets the Current Vorlagestudiengang
+ *
+ * @param string $vorlage_kurzbz
+ * @param string $oe_kurzbz Or studiengang_kz
+ * @param integer $version (optional)
+ * @param boolean|null $active (optional)
+ *
+ * @return stdClass
+ */
+ public function getCurrent($vorlage_kurzbz, $oe_kurzbz, $version = null, $active = true)
+ {
+ if (is_numeric($oe_kurzbz)) {
+ $initselect = "SELECT oe_kurzbz, 1 AS l FROM public.tbl_studiengang WHERE studiengang_kz = " . $this->escape($oe_kurzbz);
+ } else {
+ $initselect = "SELECT oe_kurzbz, 1 AS l FROM public.tbl_organisationseinheit WHERE oe_kurzbz = " . $this->escape($oe_kurzbz);
+ }
+
+ $this->addJoin("(
+ WITH RECURSIVE tmp (oe_kurzbz, l) AS (
+ " . $initselect . "
+ UNION ALL
+ SELECT o.oe_parent_kurzbz AS oe_kurzbz, l+1 AS l
+ FROM tmp
+ JOIN public.tbl_organisationseinheit o USING (oe_kurzbz)
+ WHERE o.oe_parent_kurzbz IS NOT NULL
+ ) SELECT * FROM tmp
+ ) oe", "oe_kurzbz");
+
+ if (!is_null($version))
+ $this->db->where('version', $version);
+ if ($active)
+ $this->db->where('aktiv', true);
+
+ $this->addOrder('l', 'ASC');
+ $this->addOrder('version', 'DESC');
+ $this->addLimit(1);
+
+ $result = $this->loadWhere([
+ 'vorlage_kurzbz' => $vorlage_kurzbz
+ ]);
+
+ return $result;
+ }
}
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 e9006dfc0..2669105a1 100644
--- a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php
+++ b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php
@@ -33,41 +33,84 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption
$datestring = $date->format("Y-m-d");
$qry = "
- SELECT
- gehaltsbestandteil_id,
- gbt.von,
- gbt.bis,
- gbt.anmerkung,
- gbt.dienstverhaeltnis_id,
- gehaltstyp_kurzbz,
- valorisierungssperre,
- gbt.valorisierung,
- grundbetrag as grund_betrag_decrypted,
- betrag_valorisiert as betrag_val_decrypted,
- gt.bezeichnung as gehaltstyp_bezeichnung,
- vb.vertragsbestandteiltyp_kurzbz,
- bf.funktion_kurzbz,
- bf.oe_kurzbz,
- fkt.beschreibung as fkt_beschreibung,
- fb.bezeichnung as fb_bezeichnung,
- org.bezeichnung as org_bezeichnung,
- freitext.freitexttyp_kurzbz,
- freitext.titel as freitext_titel
- FROM hr.tbl_gehaltsbestandteil gbt LEFT JOIN hr.tbl_gehaltstyp gt using(gehaltstyp_kurzbz)
- LEFT JOIN hr.tbl_vertragsbestandteil vb using(vertragsbestandteil_id)
- LEFT JOIN hr.tbl_vertragsbestandteil_funktion vbf using(vertragsbestandteil_id)
- LEFT JOIN public.tbl_benutzerfunktion bf using(benutzerfunktion_id)
- LEFT JOIN public.tbl_funktion fkt using(funktion_kurzbz)
- LEFT JOIN public.tbl_fachbereich fb using(fachbereich_kurzbz)
- LEFT JOIN public.tbl_organisationseinheit org on (bf.oe_kurzbz=org.oe_kurzbz)
- LEFT JOIN hr.tbl_vertragsbestandteil_freitext freitext on(vb.vertragsbestandteil_id=freitext.vertragsbestandteil_id)
- WHERE gbt.dienstverhaeltnis_id=? AND
- (gbt.von<=? and (gbt.bis is null OR gbt.bis>=?))
- ORDER BY gt.sort
+with gbt as (
+ select
+ gb.gehaltsbestandteil_id,
+ gb.von,
+ gb.bis,
+ gb.anmerkung,
+ gb.dienstverhaeltnis_id,
+ gb.gehaltstyp_kurzbz,
+ gb.valorisierungssperre,
+ gb.valorisierung,
+ gb.grundbetrag as grund_betrag_decrypted,
+ coalesce(vh.betrag_valorisiert, gb.grundbetrag) as betrag_val_decrypted,
+ gb.vertragsbestandteil_id
+ from
+ hr.tbl_gehaltsbestandteil gb
+ LEFT JOIN
+ hr.tbl_valorisierung_historie vh ON vh.gehaltsbestandteil_id = gb.gehaltsbestandteil_id AND vh.valorisierungsdatum = (
+ SELECT
+ vi.valorisierungsdatum
+ FROM
+ hr.tbl_valorisierung_instanz vi
+ JOIN
+ hr.tbl_dienstverhaeltnis d ON d.dienstverhaeltnis_id = ?
+ AND d.oe_kurzbz = vi.oe_kurzbz
+ WHERE
+ ? >= valorisierungsdatum
+ ORDER BY
+ valorisierungsdatum DESC
+ LIMIT 1
+ )
+ where
+ dienstverhaeltnis_id = ?
+ and (
+ ? BETWEEN COALESCE(von, '1970-01-01'::date) AND COALESCE(bis, '2170-01-01'::date)
+ )
+)
+select
+ gbt.gehaltsbestandteil_id,
+ gbt.von,
+ gbt.bis,
+ gbt.anmerkung,
+ gbt.dienstverhaeltnis_id,
+ gbt.gehaltstyp_kurzbz,
+ gbt.valorisierungssperre,
+ gbt.valorisierung,
+ gbt.grund_betrag_decrypted,
+ gbt.betrag_val_decrypted,
+ gt.bezeichnung as gehaltstyp_bezeichnung,
+ vb.vertragsbestandteiltyp_kurzbz,
+ bf.funktion_kurzbz,
+ bf.oe_kurzbz,
+ fkt.beschreibung as fkt_beschreibung,
+ fb.bezeichnung as fb_bezeichnung,
+ org.bezeichnung as org_bezeichnung,
+ freitext.freitexttyp_kurzbz,
+ freitext.titel as freitext_titel
+from
+ gbt
+LEFT JOIN
+ hr.tbl_gehaltstyp gt using(gehaltstyp_kurzbz)
+LEFT JOIN
+ hr.tbl_vertragsbestandteil vb using(vertragsbestandteil_id)
+LEFT JOIN
+ hr.tbl_vertragsbestandteil_funktion vbf using(vertragsbestandteil_id)
+LEFT JOIN
+ public.tbl_benutzerfunktion bf using(benutzerfunktion_id)
+LEFT JOIN
+ public.tbl_funktion fkt using(funktion_kurzbz)
+LEFT JOIN
+ public.tbl_fachbereich fb using(fachbereich_kurzbz)
+LEFT JOIN
+ public.tbl_organisationseinheit org on (bf.oe_kurzbz=org.oe_kurzbz)
+LEFT JOIN
+ hr.tbl_vertragsbestandteil_freitext freitext on(vb.vertragsbestandteil_id=freitext.vertragsbestandteil_id)
";
return $this->execQuery($qry,
- array($dienstverhaeltnis_id, $datestring, $datestring),
+ array($dienstverhaeltnis_id, $datestring, $dienstverhaeltnis_id, $datestring),
$this->getEncryptedColumns());
}
@@ -86,9 +129,38 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption
array($dienstverhaeltnis_id),
$this->getEncryptedColumns());
}
-
- public function getGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false)
+ public function getGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null,
+ $includefuture=false, $withvalorisationhistory=true)
+ {
+ if( !is_null($stichtag) && (time() > strtotime($stichtag))
+ && $withvalorisationhistory !== false )
+ {
+ $query = $this->getGehaltsbestandteileMitValorisierungsHistorie(
+ $dienstverhaeltnis_id, $stichtag, $includefuture
+ );
+ }
+ else
+ {
+ $query = $this->getGehaltsbestandteileOhneValorisierungsHistorie(
+ $dienstverhaeltnis_id, $stichtag, $includefuture
+ );
+ }
+
+ $gehaltsbestandteile = array();
+ if( null !== ($rows = getData($query)) )
+ {
+ foreach( $rows as $row ) {
+ $tmpgb = new Gehaltsbestandteil();
+ $tmpgb->hydrateByStdClass($row, true);
+ $gehaltsbestandteile[] = $tmpgb;
+ }
+ }
+
+ return $gehaltsbestandteile;
+ }
+
+ protected function getGehaltsbestandteileOhneValorisierungsHistorie($dienstverhaeltnis_id, $stichtag=null, $includefuture=false)
{
$stichtagclause = '';
if( !is_null($stichtag) )
@@ -111,25 +183,151 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption
{$stichtagclause}
EOSQL;
- $query = $this->loadWhere(
+ $result = $this->loadWhere(
$where,
$this->getEncryptedColumns()
);
+ return $result;
+ }
+
+ protected function getGehaltsbestandteileMitValorisierungsHistorie($dienstverhaeltnis_id, $stichtag, $includefuture=false)
+ {
+ $date = strftime('%Y-%m-%d', strtotime($stichtag));
+ $includefuture_clause = ($includefuture)
+ ? ' OR COALESCE(von, \'1970-01-01\'::date) > ' . $this->escape($date)
+ : '';
+ $sql = <<escape($dienstverhaeltnis_id)}
+ AND d.oe_kurzbz = vi.oe_kurzbz
+ WHERE
+ {$this->escape($date)} >= valorisierungsdatum
+ ORDER BY
+ valorisierungsdatum DESC
+ LIMIT 1
+ )
+WHERE
+ g.dienstverhaeltnis_id = {$this->escape($dienstverhaeltnis_id)}
+ AND (
+ {$this->escape($date)} BETWEEN COALESCE(von, '1970-01-01'::date) AND COALESCE(bis, '2170-01-01'::date)
+ {$includefuture_clause}
+ )
+EOSQL;
+
+ $result = $this->execReadOnlyQuery($sql, array(), $this->getEncryptedColumns());
+ return $result;
+ }
- $gehaltsbestandteile = array();
+ public function getGehaltsbestandteileValorisiertForChart($dienstverhaeltnis_id, $stichtag=null, $includefuture=false)
+ {
+ $stichtagclause = '';
+ if( !is_null($stichtag) )
+ {
+ $date = strftime('%Y-%m-%d', strtotime($stichtag));
+ $stichtagclause = 'AND (' . $this->escape($date)
+ . ' BETWEEN COALESCE(von, \'1970-01-01\'::date)'
+ . ' AND COALESCE(bis, \'2170-01-01\'::date)';
+ if( $includefuture )
+ {
+ $stichtagclause .= ' OR COALESCE(von, \'1970-01-01\'::date) > '
+ . $this->escape($date);
+ }
+ $stichtagclause .= ')';
+ }
+
+ // Note: replaced gb.betrag_valorisiert with vh.betrag_valorisiert!
+ $qry = "
+ SELECT
+ gb.gehaltsbestandteil_id,gb.dienstverhaeltnis_id,gb.vertragsbestandteil_id,gb.gehaltstyp_kurzbz,
+ gb.von,gb.bis,gb.anmerkung,gb.grundbetrag as grundbetrag,gb.valorisierungssperre,gb.insertamum,
+ gb.insertvon,gb.updateamum,gb.updatevon,gb.valorisierung,gb.auszahlungen,
+ vh.valorisierungsdatum, vh.betrag_valorisiert as betrag_valorisiert
+ FROM hr.tbl_gehaltsbestandteil gb LEFT JOIN hr.tbl_valorisierung_historie vh using (gehaltsbestandteil_id)
+ WHERE dienstverhaeltnis_id=?
+ $stichtagclause
+ ORDER BY gb.von,vh.valorisierungsdatum, gb.gehaltsbestandteil_id;
+ ";
+
+ $query = $this->execQuery($qry,
+ array($dienstverhaeltnis_id),
+ $this->getEncryptedColumns());
+
+ $gehaltsbestandteile = array();
if( null !== ($rows = getData($query)) )
{
+ // store for preserving the last records of every gehaltsbestandteil_id
+ $lastRecords = array();
+
foreach( $rows as $row ) {
$tmpgb = new Gehaltsbestandteil();
$tmpgb->hydrateByStdClass($row, true);
- $gehaltsbestandteile[] = $tmpgb;
+
+ 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;
+ $lastRecords[(string)$row->gehaltsbestandteil_id] = $tmpgb;
+ }
+
+ if ($row->betrag_valorisiert != null && $row->valorisierungsdatum != null
+ && $row->valorisierungsdatum != $row->von && $row->valorisierungsdatum != $row->bis) {
+
+ // create additional row
+ $tmpgbv = new Gehaltsbestandteil();
+ $tmpgbv->hydrateByStdClass($row, true);
+ $tmpgbv->setVon($row->valorisierungsdatum);
+ $tmpgbv->setBis($lastRecords[(string)$row->gehaltsbestandteil_id]->getBis());
+ // overwrite Grundbetrag with the current valorized loan
+ // (otherwise the chart would show the wrong value)
+ $tmpgbv->setGrundbetrag($row->betrag_valorisiert);
+ $gehaltsbestandteile[] = $tmpgbv;
+
+ // finish previous
+ $daybefore = new DateTimeImmutable($row->valorisierungsdatum);
+ $daybefore = $daybefore->sub(new \DateInterval('P1D'));
+ $lastRecords[(string)$row->gehaltsbestandteil_id]->setBis($daybefore->format('Y-m-d'));
+
+ // preserve as last row, because there might be another valorization
+ $lastRecords[(string)$row->gehaltsbestandteil_id] = $tmpgbv;
+
+ }
+
}
}
return $gehaltsbestandteile;
}
-
public function getGehaltsbestandteil($id)
{
$this->addSelect('*');
diff --git a/application/models/vertragsbestandteil/VertragsbestandteilLohnguide_model.php b/application/models/vertragsbestandteil/VertragsbestandteilLohnguide_model.php
new file mode 100644
index 000000000..6f3f8e47a
--- /dev/null
+++ b/application/models/vertragsbestandteil/VertragsbestandteilLohnguide_model.php
@@ -0,0 +1,11 @@
+dbTable = 'hr.tbl_vertragsbestandteil_lohnguide';
+ $this->pk = 'vertragsbestandteil_id';
+ }
+}
diff --git a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php
index cbc529d83..334a29dfd 100644
--- a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php
+++ b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php
@@ -37,7 +37,8 @@ class Vertragsbestandteil_model extends DB_Model
kf.arbeitgeber_frist, kf.arbeitnehmer_frist,
s.wochenstunden, s.teilzeittyp_kurzbz,
u.tage,
- z.zeitaufzeichnung, z.azgrelevant, z.homeoffice
+ z.zeitaufzeichnung, z.azgrelevant, z.homeoffice,
+ lg.stellenbezeichnung, lg.vordienstzeit, lg.fachrichtung_kurzbz, lg.modellstelle_kurzbz, lg.kommentar_person, lg.kommentar_modellstelle
FROM
hr.tbl_vertragsbestandteil v
LEFT JOIN
@@ -63,6 +64,8 @@ class Vertragsbestandteil_model extends DB_Model
hr.tbl_vertragsbestandteil_urlaubsanspruch u USING(vertragsbestandteil_id)
LEFT JOIN
hr.tbl_vertragsbestandteil_zeitaufzeichnung z USING(vertragsbestandteil_id)
+ LEFT JOIN
+ hr.tbl_vertragsbestandteil_lohnguide lg USING(vertragsbestandteil_id)
EOSQL;
return $sql;
}
@@ -183,6 +186,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/InfoTerminal.php b/application/views/Cis/InfoTerminal.php
new file mode 100644
index 000000000..7e89b9f0c
--- /dev/null
+++ b/application/views/Cis/InfoTerminal.php
@@ -0,0 +1,16 @@
+ 'Infoterminal',
+ 'tabulator5' => true,
+ 'primevue3' => true,
+);
+$this->load->view(
+ 'templates/CISVUE-Header',
+ $includesArray
+);
+?>
+
+
+load->view('templates/CISVUE-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/LvInfo.php b/application/views/Cis/LvInfo.php
deleted file mode 100644
index 49a7b7a85..000000000
--- a/application/views/Cis/LvInfo.php
+++ /dev/null
@@ -1,15 +0,0 @@
- 'LvInfo',
- 'customJSModules' => ['public/js/apps/Cis/LvInfo.js']
-);
-
-$this->load->view('templates/CISVUE-Header', $includesArray);
-?>
-
-
-
-
-
-
-load->view('templates/CISVUE-Footer', $includesArray); ?>
diff --git a/application/views/Cis/MyLv.php b/application/views/Cis/MyLv.php
deleted file mode 100644
index d8d5026a1..000000000
--- a/application/views/Cis/MyLv.php
+++ /dev/null
@@ -1,15 +0,0 @@
- 'MyLv',
- 'customJSModules' => ['public/js/apps/Cis/MyLv/Student.js'],
- 'customCSSs' => ['public/css/components/MyLv.css']
-);
-
-$this->load->view('templates/CISVUE-Header', $includesArray);
-?>
-
-
-
-
-
-load->view('templates/CISVUE-Footer', $includesArray); ?>
diff --git a/application/views/Cis/Profil.php b/application/views/Cis/Profil.php
deleted file mode 100644
index 788d44360..000000000
--- a/application/views/Cis/Profil.php
+++ /dev/null
@@ -1,18 +0,0 @@
- 'Stundenplan',
- 'customJSModules' => ['public/js/apps/Cis/Profil.js'],
- 'tabulator5' => true,
- 'primevue3' => true,
- 'customCSSs' => ['public/css/components/calendar.css', 'public/css/components/FilterComponent.css','public/css/components/Profil.css','public/css/components/FormUnderline.css'],
-
-);
-
-$this->load->view('templates/CISVUE-Header', $includesArray);
-?>
-
-
-
-
-
-load->view('templates/CISVUE-Footer', $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/Cis/Stundenplan.php b/application/views/Cis/Stundenplan.php
deleted file mode 100644
index bfab73109..000000000
--- a/application/views/Cis/Stundenplan.php
+++ /dev/null
@@ -1,15 +0,0 @@
- 'Stundenplan',
- 'customJSModules' => ['public/js/apps/Cis/Stundenplan.js'],
- 'customCSSs' => ['public/css/components/calendar.css']
-);
-
-$this->load->view('templates/CISVUE-Header', $includesArray);
-?>
-
-
-
-
-
-load->view('templates/CISVUE-Footer', $includesArray); ?>
diff --git a/application/views/CisRouterView/CisRouterView.php b/application/views/CisRouterView/CisRouterView.php
new file mode 100644
index 000000000..6ff428362
--- /dev/null
+++ b/application/views/CisRouterView/CisRouterView.php
@@ -0,0 +1,54 @@
+ '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/searchbar/searchbar.css',
+ 'public/css/Fhc.css',
+ 'public/css/components/dashboard.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.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',
+ ),
+
+);
+
+$this->load->view('templates/CISVUE-Header', $includesArray);
+?>
+>
+
+
+load->view('templates/CISVUE-Footer', $includesArray); ?>
diff --git a/application/views/CisVue/Cms/Content.php b/application/views/CisVue/Cms/Content.php
deleted file mode 100644
index f957bb7f9..000000000
--- a/application/views/CisVue/Cms/Content.php
+++ /dev/null
@@ -1,32 +0,0 @@
- ['public/js/apps/Cis/Cms.js'],
- 'primevue3'=>true,
- 'customCSSs' => [
- 'public/css/Cis4/Cms.css',
- #'skin/style.css.php'
- ]
-);
-
-// adds the tabulator5 dependency for all templates to replace the tablesorter
-$includesArray['tabulator5'] = true;
-
-if(defined('CIS4')){
- $this->load->view('templates/CISVUE-Header', $includesArray);
-}else{
- $this->load->view('templates/FHC-Header', $includesArray);
-}
-?>
-
-
-' : ' '); ?>
-
-
-load->view('templates/CISVUE-Footer', $includesArray);
-} else {
- $this->load->view('templates/FHC-Footer', $includesArray);
-}
- ?>
-
diff --git a/application/views/CisVue/Cms/RoomInformation.php b/application/views/CisVue/Cms/RoomInformation.php
deleted file mode 100644
index e7b197504..000000000
--- a/application/views/CisVue/Cms/RoomInformation.php
+++ /dev/null
@@ -1,20 +0,0 @@
- 'RoomInformation',
- 'customJSModules' => ['public/js/apps/Cis/RoomInformation.js'],
- 'customCSSs' => ['public/css/components/calendar.css']
-);
-
-$this->load->view('templates/CISVUE-Header', $includesArray);
-?>
-
-
-
Room Information:
-
-
-
-
-
-
-
-load->view('templates/CISVUE-Footer', $includesArray); ?>
diff --git a/application/views/CisVue/Dashboard.php b/application/views/CisVue/Dashboard.php
deleted file mode 100644
index 2f241af87..000000000
--- a/application/views/CisVue/Dashboard.php
+++ /dev/null
@@ -1,20 +0,0 @@
- 'Dashboard',
- 'tabulator5'=>true,
- 'primevue3' => true,
- 'customJSModules' => ['public/js/apps/Dashboard/Fhc.js'],
- 'customCSSs' => [
- 'public/css/components/dashboard.css'
- ],
-);
-
-$this->load->view('templates/CISVUE-Header', $includesArray);
-?>
-
-
-
-
-
-load->view('templates/CISVUE-Footer', $includesArray); ?>
-
diff --git a/application/views/LVVerwaltung.php b/application/views/LVVerwaltung.php
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 ="= htmlspecialchars(json_encode($ids)); ?>"
+ type-id ="= htmlspecialchars($typeid); ?>"
+
+ >
+
+
+
+load->view('templates/FHC-Footer', $includesArray); ?>
+
diff --git a/application/views/Studentenverwaltung.php b/application/views/Studentenverwaltung.php
index 2d0d22346..8dd2dd93d 100644
--- a/application/views/Studentenverwaltung.php
+++ b/application/views/Studentenverwaltung.php
@@ -7,19 +7,25 @@
'vue3' => true,
'primevue3' => true,
#'filtercomponent' => true,
- 'tabulator5' => true,
+ 'tabulator6' => true,
'tinymce5' => true,
'phrases' => array(
'global',
'ui',
'notiz',
),
+ 'tags' => true,
'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',
+ 'public/css/components/Detailheader.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'
],
@@ -34,8 +40,15 @@
!defined('GENERATE_ALIAS_STUDENT') ? true : GENERATE_ALIAS_STUDENT,
- 'showZgvDoktor' => !defined('ZGV_DOKTOR_ANZEIGEN') ? false : ZGV_DOKTOR_ANZEIGEN,
- 'showZgvErfuellt' => !defined('ZGV_ERFUELLT_ANZEIGEN') ? false : ZGV_ERFUELLT_ANZEIGEN
+ //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,
+ '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,
+ 'hasExcludedAreas' => defined('FAS_REIHUNGSTEST_EXCLUDE_GEBIETE') && !empty(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE),
+ 'stvTagsEnabled' => defined('STV_TAGS_ENABLED') ? STV_TAGS_ENABLED : false,
];
?>
@@ -45,6 +58,8 @@ $configArray = [
active-addons="= defined('ACTIVE_ADDONS') ? ACTIVE_ADDONS : ''; ?>"
stv-root="= site_url('Studentenverwaltung'); ?>"
cis-root="= CIS_ROOT; ?>"
+ avatar-url="= site_url('Cis/Pub/bild/person/' . getAuthPersonId()); ?>"
+ logout-url="= site_url('Cis/Auth/logout'); ?>"
:permissions="= htmlspecialchars(json_encode($permissions)); ?>"
:config="= htmlspecialchars(json_encode($configArray)); ?>"
>
diff --git a/application/views/Vertragsverwaltung.php b/application/views/Vertragsverwaltung.php
new file mode 100644
index 000000000..8fa6dff27
--- /dev/null
+++ b/application/views/Vertragsverwaltung.php
@@ -0,0 +1,50 @@
+ 'Vertragsverwaltung',
+ 'axios027' => true,
+ 'bootstrap5' => true,
+ 'fontawesome6' => true,
+ 'vue3' => true,
+ 'primevue3' => true,
+ 'filtercomponent' => true,
+ 'navigationcomponent' => true,
+ 'tabulator6' => true,
+ 'tinymce5' => true,
+ 'phrases' => array(
+ 'global',
+ 'ui',
+ ),
+ 'customCSSs' => [
+ 'public/css/components/vue-datepicker.css',
+ 'public/css/components/primevue.css',
+ 'public/css/Vertragsverwaltung.css',
+ 'public/css/components/Detailheader.css'
+ ],
+ 'customJSs' => [
+ #'vendor/npm-asset/primevue/tree/tree.min.js',
+ #'vendor/npm-asset/primevue/toast/toast.min.js'
+ ],
+ 'customJSModules' => [
+ 'public/js/apps/Vertragsverwaltung.js'
+ ]
+);
+
+$this->load->view('templates/FHC-Header', $includesArray);
+?>
+
+ !defined('DOMAIN') ? 'notDefined' : DOMAIN,
+];
+?>
+
+
+
+
+
+
+load->view('templates/FHC-Footer', $includesArray); ?>
+
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') ?>
-
+
x
@@ -288,7 +288,7 @@ $saved = isset($saved) && $saved === true;
-
+
diff --git a/application/views/dashboard/dashboard_demo_admin.php b/application/views/dashboard/preview.php
similarity index 67%
rename from application/views/dashboard/dashboard_demo_admin.php
rename to application/views/dashboard/preview.php
index 0d92146a8..f8c37c0c8 100644
--- a/application/views/dashboard/dashboard_demo_admin.php
+++ b/application/views/dashboard/preview.php
@@ -8,7 +8,12 @@ $this->load->view(
'axios027' => true,
'restclient' => true,
'vue3' => true,
- 'customJSModules' => ['public/js/apps/DashboardAdmin.js'],
+ 'vuedatepicker11' => true,
+ 'primevue3' => true,
+ 'customJSs' => [
+ 'vendor/moment/luxonjs/luxon.min.js'
+ ],
+ 'customJSModules' => ['public/js/apps/Dashboard/Preview.js'],
'customCSSs' => [
'public/css/components/dashboard.css'
],
@@ -23,9 +28,9 @@ $this->load->view(
-
Dashboard
+ Dashboard = $dashboard_kurzbz ?>
-
+
diff --git a/application/views/lehre/anrechnung/requestAnrechnung.php b/application/views/lehre/anrechnung/requestAnrechnung.php
index 328af2f4f..81b07b1ee 100644
--- a/application/views/lehre/anrechnung/requestAnrechnung.php
+++ b/application/views/lehre/anrechnung/requestAnrechnung.php
@@ -85,7 +85,7 @@ else
}
-
+
diff --git a/application/views/lehre/anrechnung/requestAnrechnungImportant.php b/application/views/lehre/anrechnung/requestAnrechnungImportant.php
index 0ee13d422..0ec44c047 100644
--- a/application/views/lehre/anrechnung/requestAnrechnungImportant.php
+++ b/application/views/lehre/anrechnung/requestAnrechnungImportant.php
@@ -1,71 +1,82 @@
+
+
+ config->item('display_infobox')['fristen']) && $this->config->item('display_infobox')['fristen'] === true): ?>
+
+