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 3e0a5248f..80a8f03b3 100644
--- a/application/config/Events.php
+++ b/application/config/Events.php
@@ -6,30 +6,30 @@ use CI3_Events as Events;
Events::on('loadRenderers', function ($renderers) {
$fhc_core_renderers =& $renderers();
$fhc_core_renderers["lehreinheit"] = array(
- 'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js',
- 'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js',
- 'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/modalContent.js',
- 'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
+ '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' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js',
- 'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/modalTitle.js',
- 'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/modalContent.js',
- 'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
+ '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' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/calendarEvent.js',
- 'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalTitle.js',
- 'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalContent.js',
- 'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
+ '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/cis.php b/application/config/cis.php
index 82655f244..430539392 100644
--- a/application/config/cis.php
+++ b/application/config/cis.php
@@ -4,6 +4,12 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
// CMS Content Id for CIS4 Menu Root
-$config['cis_menu_root_content_id'] = 11087;
+$config['cis_menu_root_content_id'] = 11091;
// send Mails for ProfilUpdate
$config['cis_send_profil_update_mails'] = true;
+// Vilesci CI BaseUrl
+$config['cis_vilesci_base_url'] = defined('VILESCI_ROOT') ? VILESCI_ROOT : APP_ROOT;
+$config['cis_vilesci_index_page'] = 'index.ci.php';
+// Cis CI BaseUrl
+$config['cis_base_url'] = defined('CIS_ROOT') ? CIS_ROOT : APP_ROOT;
+$config['cis_index_page'] = 'cis.php';
diff --git a/application/config/javascript.php b/application/config/javascript.php
index 6f82810e2..7b8342ef8 100644
--- a/application/config/javascript.php
+++ b/application/config/javascript.php
@@ -7,3 +7,6 @@ $config['use_vuejs_dev_version'] = false;
$config['use_bundled_javascript'] = false;
// systemerror_mailto use in FHC-Alert Plugin - if empty Link will not be rendered
$config['systemerror_mailto'] = '';
+// use fhcomplete_build_version as path element after public (requires apache mod_rewrite)
+// see /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 5cbb6512c..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',
@@ -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')
),
+
);
+
+$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/routes.php b/application/config/routes.php
index 360005db7..aa4ba9db8 100644
--- a/application/config/routes.php
+++ b/application/config/routes.php
@@ -1,6 +1,6 @@
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';
@@ -63,6 +63,14 @@ $route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1';
$route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1';
$route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1';
+$route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1';
+
+$route['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';
// Studierendenverwaltung List Routes
$route['api/frontend/v1/stv/[sS]tudents/inout'] = 'api/frontend/v1/stv/Students/index';
@@ -70,39 +78,39 @@ $route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv
// (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';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/outgoing'] = 'api/frontend/v1/stv/Students/getOutgoing';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/gemeinsamestudien'] = 'api/frontend/v1/stv/Students/getGemeinsamestudien';
+$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/(:num)/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudents/$1';
-$route['api/frontend/v1/stv/[sS]tudents/(:num)/prestudent/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2';
-$route['api/frontend/v1/stv/[sS]tudents/(:num)/prestudent/([WS]S[0-9]{4})/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2/$3';
-$route['api/frontend/v1/stv/[sS]tudents/(:num)/prestudent/([WS]S[0-9]{4})/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudents/$1/$2/$4';
+$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/(:num)/([A-Z]{2,3})/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2';
-$route['api/frontend/v1/stv/[sS]tudents/(:num)/([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/(:num)/([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/(:num)/([A-Z]{2,3})/prestudent/([WS]S[0-9]{4})/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getPrestudentsOrgform/$1/$2/$3/$5';
+$route['api/frontend/v1/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})/(:num)/(:num)/grp/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsSpezialgruppe/$1/$2/$3/$4';
+$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})/(:num)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(:num)/(:num)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(:num)/(:num)/(:any)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3/$4';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/(:num)/(:num)/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getStudents/$1/$2/$3/$4/$5';
+$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})/(:num)/([A-Z]{2,3})/(:num)/grp/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgformSpezialgruppe/$1/$2/$3/$4/$5';
+$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})/(:num)/([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})/(:num)/([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})/(:num)/([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})/(:num)/([A-Z]{2,3})/(:num)/(:any)/(:any)'] = 'api/frontend/v1/stv/Students/getStudentsOrgform/$1/$2/$3/$4/$5/$6';
+$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';
@@ -111,24 +119,30 @@ $route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/prestudent/(:num)'] = 'a
// // (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
-$subdir = 'application/config/extensions';
-$dirlist = scandir($subdir);
+// load routes from extensions, also look for environment-specific configs
+$subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT . '/extensions'];
-if ($dirlist)
+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/searchcis.php b/application/config/searchcis.php
index e3d1e2213..12bad025d 100644
--- a/application/config/searchcis.php
+++ b/application/config/searchcis.php
@@ -27,7 +27,7 @@ $config['student']['resultfields'] = [
"(p.vorname || ' ' || p.nachname) AS name",
"ARRAY[s.student_uid || '@' || '" . DOMAIN . "'] AS email",
"CASE
- WHEN p.foto IS NOT NULL THEN 'data:image/jpeg' || CONVERT_FROM(DECODE('3b','hex'), 'UTF8') || 'base64,' || p.foto
+ 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"
diff --git a/application/config/searchfunctions.php b/application/config/searchfunctions.php
index 276652997..ddf7692d5 100644
--- a/application/config/searchfunctions.php
+++ b/application/config/searchfunctions.php
@@ -29,7 +29,7 @@ $config['similar'] = [
$config['vector'] = [
'priority' => 1,
- 'rank' => "ts_rank({field}, to_tsquery('simple', {word}))",
- 'compare' => "to_tsquery('simple', {word}) @@ {field}"
+ '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
index 96c118ac8..d507f7250 100644
--- a/application/config/searchstv.php
+++ b/application/config/searchstv.php
@@ -7,5 +7,43 @@ $CI =& get_instance();
$config['student'] = $CI->config->item('student', 'search');
+$config['student']['searchfields']['pkz'] = [
+ 'alias' => ['personenkennzeichen', 'personalid'],
+ 'comparison' => 'equals',
+ 'field' => 'matrikelnr'
+];
+$config['student']['searchfields']['matrnr'] = [
+ 'alias' => ['matrikelnr', 'matrikelnummer', 'matrno', 'matriculationno', 'matriculationnumber', 'studno', 'studentno', 'studentnumber'],
+ 'comparison' => 'equals',
+ 'field' => 'matr_nr',
+ 'join' => [
+ [
+ 'table' => "public.tbl_prestudent",
+ 'using' => "prestudent_id"
+ ],
+ [
+ 'table' => "public.tbl_person",
+ 'using' => "person_id"
+ ]
+ ]
+];
$config['prestudent'] = $CI->config->item('prestudent', 'search');
+$config['prestudent']['searchfields']['pkz'] = [
+ 'alias' => ['personenkennzeichen', 'personalid'],
+ 'comparison' => 'equals',
+ 'field' => 'matrikelnr',
+ 'join' => [
+ 'table' => "public.tbl_student",
+ 'using' => "prestudent_id"
+ ]
+];
+$config['prestudent']['searchfields']['matrnr'] = [
+ 'alias' => ['matrikelnr', 'matrikelnummer', 'matrno', 'matriculationno', 'matriculationnumber', 'studno', 'studentno', 'studentnumber'],
+ 'comparison' => 'equals',
+ 'field' => 'matr_nr',
+ 'join' => [
+ 'table' => "public.tbl_person",
+ 'using' => "person_id"
+ ]
+];
diff --git a/application/config/stv.php b/application/config/stv.php
index aa885c9e1..34a30a96e 100644
--- a/application/config/stv.php
+++ b/application/config/stv.php
@@ -58,8 +58,16 @@ $config['tabs'] =
//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'];
@@ -79,3 +87,59 @@ if (!defined('ZGV_DOKTOR_ANZEIGEN') || !ZGV_DOKTOR_ANZEIGEN) {
$fieldsZgvDoktor
);
}
+
+$config['tabs']['projektarbeit']['defaultProjektbetreuerStunden'] =
+ defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR')
+ ? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR
+ : '0.0';
+$config['tabs']['projektarbeit']['defaultProjektbetreuerStundenDiplom'] =
+ defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER')
+ ? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER
+ : '0.0';
+$config['tabs']['projektarbeit']['defaultProjektbetreuerStundensatz'] = '80.0';
+
+$config['student_tab_order'] = [
+ 'details',
+ 'notes',
+ 'messages',
+ 'contact',
+ 'prestudent',
+ 'status',
+ 'documents',
+ 'archive',
+ 'banking',
+ 'grades',
+ 'exam',
+ 'exemptions',
+ 'projektarbeit',
+ 'finalexam',
+ 'mobility',
+ 'jointstudies',
+ 'admissionDates',
+ 'groups',
+ 'functions',
+ 'coursedates',
+ 'resources',
+];
+$config['students_tab_order'] = [
+ 'banking',
+ 'status',
+ 'messages',
+ 'groups',
+ 'finalexam',
+ 'combinePeople',
+ 'archive',
+];
+
+$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/controllers/Cis/Abgabetool.php b/application/controllers/Cis/Abgabetool.php
index 1895f7472..04338b1a9 100644
--- a/application/controllers/Cis/Abgabetool.php
+++ b/application/controllers/Cis/Abgabetool.php
@@ -14,10 +14,10 @@ class Abgabetool extends Auth_Controller
{
parent::__construct([
'index' => self::PERM_LOGGED,
- 'getStudentProjektarbeitAbgabeFile' => self::PERM_LOGGED,
- 'Mitarbeiter' => self::PERM_LOGGED,
- 'Student' => self::PERM_LOGGED,
- 'Deadlines' => 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')
]);
}
@@ -29,80 +29,69 @@ class Abgabetool extends Auth_Controller
*/
public function index()
{
+ // TODO: routing from index based on berechtigung?
$viewData = array(
'uid'=>getAuthUID(),
);
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
+ 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()
+ public function Student($student_uid_prop = '')
{
-
$viewData = array(
'uid'=>getAuthUID(),
);
-
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
+
+ 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(),
);
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
+ 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(),
);
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
- }
-
-
- public function getStudentProjektarbeitAbgabeFile()
- {
- $this->_ci =& get_instance();
- $this->_ci->load->helper('download');
-
- $paabgabe_id = $this->_ci->input->get('paabgabe_id');
- $student_uid = $this->_ci->input->get('student_uid');
-
- if (!isset($paabgabe_id) || isEmptyString($paabgabe_id) || !isset($student_uid) || isEmptyString($student_uid))
- $this->terminateWithJsonError($this->p->t('global', 'wrongParameters'), 'general');
-
- $this->_ci->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- $isZugeteilterBetreuer = count($this->_ci->ProjektarbeitModel->checkZuordnung($student_uid, getAuthUID())->retval) > 0;
-
- if(getAuthUID() == $student_uid || $isZugeteilterBetreuer) {
- $file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
- if(file_exists($file_path)) {
-
- header('Content-Description: File Transfer');
- header('Content-Type: application/octet-stream');
- header('Expires: 0');
- header('Cache-Control: must-revalidate');
- header('Pragma: public');
- header('Content-Disposition: attachment; filename="'.basename($file_path).'"');
- header('Content-Length: ' . filesize($file_path));
-
- flush(); // send headers first just in case
- readfile($file_path); // read file content to output buffer
-
- } else {
- $this->terminateWithJsonError('File not found');
- }
+ if(defined('CIS4') && CIS4) {
+ $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
} else {
- $this->terminateWithJsonError('Keine Zuordnung!');
+ $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/MyLv.php b/application/controllers/Cis/MyLv.php
index 49a938553..819d56b05 100644
--- a/application/controllers/Cis/MyLv.php
+++ b/application/controllers/Cis/MyLv.php
@@ -33,9 +33,4 @@ class MyLv extends Auth_Controller
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLv']);
}
-
- public function Info($studien_semester,$lvid)
- {
- $this->load->view('Cis/LvInfo',['lvid'=> $lvid, 'studien_semester' => $studien_semester]);
- }
}
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/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
index 9b61b78ef..b0ff5c554 100644
--- a/application/controllers/NeueNachricht.php
+++ b/application/controllers/NeueNachricht.php
@@ -20,11 +20,18 @@ class NeueNachricht extends Auth_Controller
*/
public function _remap()
{
+ $typeid = $this->input->post('typeid');
+ $ids = ($this->input->post('ids') && strpos($this->input->post('ids'), ','))
+ ? explode(',', $this->input->post('ids'))
+ : $this->input->post('ids');
+
//now working
$this->load->view('Nachrichten', [
'permissions' => [
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'),
- ]
+ ],
+ 'ids' => $ids,
+ 'typeid' => $typeid
]);
}
}
diff --git a/application/controllers/Studentenverwaltung.php b/application/controllers/Studentenverwaltung.php
index 2ce19c58a..1699ba740 100644
--- a/application/controllers/Studentenverwaltung.php
+++ b/application/controllers/Studentenverwaltung.php
@@ -28,10 +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'),
'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')
@@ -39,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
index 1362aee18..72f396b4f 100644
--- a/application/controllers/api/frontend/v1/AuthInfo.php
+++ b/application/controllers/api/frontend/v1/AuthInfo.php
@@ -20,6 +20,10 @@ if (!defined('BASEPATH')) exit('No direct script access allowed');
class AuthInfo extends FHCAPI_Controller
{
+ protected $uid;
+ protected $pid;
+ protected $isMitarbeiter;
+ protected $isStudent;
/**
* Object initialization
@@ -28,10 +32,16 @@ class AuthInfo extends FHCAPI_Controller
{
parent::__construct([
'getAuthUID' => self::PERM_LOGGED,
+ 'getAuthInfo' => self::PERM_LOGGED,
]);
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
+
$this->uid = getAuthUID();
$this->pid = getAuthPersonID();
+ $this->isMitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter($this->uid)) ?? false;
+ $this->isStudent = getData($this->StudentModel->isStudent($this->uid)) ?? false;
}
//------------------------------------------------------------------------------------------------------------------
@@ -47,6 +57,14 @@ class AuthInfo extends FHCAPI_Controller
$this->terminateWithSuccess(['uid'=>$this->uid]);
}
-
+ public function getAuthInfo()
+ {
+ $data = (object) array(
+ 'uid' => $this->uid,
+ 'isMitarbeiter' => $this->isMitarbeiter,
+ 'isStudent' => $this->isStudent
+ );
+ $this->terminateWithSuccess($data);
+ }
}
diff --git a/application/controllers/api/frontend/v1/Documents.php b/application/controllers/api/frontend/v1/Documents.php
index 2d2c410cf..13c0a2eba 100644
--- a/application/controllers/api/frontend/v1/Documents.php
+++ b/application/controllers/api/frontend/v1/Documents.php
@@ -208,7 +208,6 @@ class Documents extends FHCAPI_Controller
$this->load->model('system/Vorlage_model', 'VorlageModel');
$result = $this->VorlageModel->load($xsl);
- $this->addMeta("ress", $result);
$vorlage = current($this->getDataOrTerminateWithError($result));
if (!$vorlage)
show_404();
@@ -221,7 +220,7 @@ class Documents extends FHCAPI_Controller
'gedruckt' => true,
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
- 'uid' => $this->input->post_get('uid') ?: '',
+ 'uid' => $this->input->post_get('uid') ?: null,
'archiv' => true,
'signiert' => !!$sign_user,
'stud_selfservice' => $vorlage->stud_selfservice
@@ -251,6 +250,9 @@ class Documents extends FHCAPI_Controller
'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;
@@ -332,6 +334,7 @@ class Documents extends FHCAPI_Controller
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));
@@ -442,6 +445,10 @@ class Documents extends FHCAPI_Controller
'betreuerart_kurzbz',
'studiensemester_kurzbz'
] as $key) {
+ if (in_array($xsl, array('Ausbildungsver', 'AusbVerEng')) && $key === 'uid')
+ {
+ continue;
+ }
$value = $this->input->post_get($key);
if ($value !== null)
$params .= '&' . $key . '=' . urlencode($value);
diff --git a/application/controllers/api/frontend/v1/Lehre.php b/application/controllers/api/frontend/v1/Lehre.php
index d5d0282bd..10d945a3e 100644
--- a/application/controllers/api/frontend/v1/Lehre.php
+++ b/application/controllers/api/frontend/v1/Lehre.php
@@ -38,34 +38,9 @@ class Lehre extends FHCAPI_Controller
parent::__construct([
'lvStudentenMail' => self::PERM_LOGGED,
'LV' => self::PERM_LOGGED,
- 'Pruefungen' => self::PERM_LOGGED,
- 'getStudentProjektarbeiten' => self::PERM_LOGGED, // TODO: abgabetool berechtigung?
- 'getStudentProjektabgaben' => self::PERM_LOGGED,
- 'postStudentProjektarbeitZwischenabgabe' => self::PERM_LOGGED,
- 'postStudentProjektarbeitEndupload' => self::PERM_LOGGED,
- 'getMitarbeiterProjektarbeiten' => self::PERM_LOGGED,
- 'postProjektarbeitAbgabe' => self::PERM_LOGGED,
- 'deleteProjektarbeitAbgabe' => self::PERM_LOGGED,
- 'postSerientermin' => self::PERM_LOGGED,
- 'fetchDeadlines' => self::PERM_LOGGED // TODO: mitarbeiter recht prüfen
+ 'Pruefungen' => self::PERM_LOGGED
]);
-
- $this->load->library('PhrasesLib');
-
- $this->loadPhrases(
- array(
- 'global',
- 'ui',
- 'abgabetool'
- )
- );
-
- $this->load->helper('hlp_sancho_helper');
- require_once(FHCPATH . 'include/studiengang.class.php');
- require_once(FHCPATH . 'include/student.class.php');
- require_once(FHCPATH . 'include/projektarbeit.class.php');
- require_once(FHCPATH . 'include/projektbetreuer.class.php');
}
//------------------------------------------------------------------------------------------------------------------
@@ -125,557 +100,5 @@ class Lehre extends FHCAPI_Controller
$this->terminateWithSuccess($result);
}
-
- /**
- * fetches all projektabgabetermine for a given projektarbeit_id used in cis4 student abgabetool
- */
- public function getStudentProjektabgaben() {
- $projektarbeit_id = $this->input->get("projektarbeit_id",TRUE);
-
- // TODO: error messages
-
- if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- $projektarbeit_obj = new projektarbeit();
- if($projektarbeit_id==-1)
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- if(!$projektarbeit_obj->load($projektarbeit_id))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- $paIsCurrent = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
-
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
- $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id);
-
- // TODO: fetch zweitbetreuer
-
- $this->terminateWithSuccess(array($ret, $paIsCurrent));
- }
-
- /**
- * fetches all projektarbeiten and betreuer for a given student_uid used in cis4 student abgabetool
- */
- public function getStudentProjektarbeiten($uid)
- {
- $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- if (!isset($uid) || isEmptyString($uid))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- $isZugeteilterBetreuer = count($this->ProjektarbeitModel->checkZuordnung($uid, getAuthUID())->retval) > 0;
- $this->addMeta('isZugeteilterBetreuer', $isZugeteilterBetreuer);
- $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID());
-
- if ($isMitarbeiter && $isZugeteilterBetreuer){
- $projektarbeiten = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer($uid);
- } else {
- $projektarbeiten = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer(getAuthUID());
- }
-
- $this->terminateWithSuccess(array($projektarbeiten, DOMAIN, $uid));
- }
-
-
-
- /**
- * projektarbeit - upload for zwischenabgaben in cis4 student abgabetool
- */
- public function postStudentProjektarbeitZwischenabgabe()
- {
-
- $projektarbeit_id = $_POST['projektarbeit_id'];
- $paabgabe_id = $_POST['paabgabe_id'];
- $student_uid = $_POST['student_uid'];
- $bperson_id = $_POST['bperson_id'];
- $paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
-
- if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
- || !isset($paabgabe_id) || isEmptyString($paabgabe_id)
- || !isset($student_uid) || isEmptyString($student_uid)
- || !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- 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')) {
-
- exec('chmod 640 "'.PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'.'"');
-
- $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->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
- $this->terminateWithSuccess($res);
- } else {
- $this->terminateWithError('Error moving File');
- }
-
- } else {
- $this->terminateWithError('File missing');
- }
-
- }
-
- /**
- * upload für finale abgaben aka Endupload in cis4 student abgabetool
- */
- public function postStudentProjektarbeitEndupload()
- {
-
- $projektarbeit_id = $_POST['projektarbeit_id'];
- $paabgabe_id = $_POST['paabgabe_id'];
- $student_uid = $_POST['student_uid'];
- $sprache = $_POST['sprache'];
- $abstract = $_POST['abstract'];
- $abstract_en = $_POST['abstract_en'];
- $schlagwoerter = $_POST['schlagwoerter'];
- $schlagwoerter_en = $_POST['schlagwoerter_en'];
- $seitenanzahl = $_POST['seitenanzahl'];
- $bperson_id = $_POST['bperson_id'];
- $paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
-
- if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
- || !isset($paabgabe_id) || isEmptyString($paabgabe_id)
- || !isset($student_uid) || isEmptyString($student_uid)
- || !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- // TODO: maybe check for other params aswell?
-
- 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')) {
-
- // Loads Libraries
- $this->load->library('SignatureLib');
-
- // Check if the document is signed
- $signaturVorhanden = true;
- $signList = SignatureLib::list(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf');
- if (is_array($signList) && count($signList) > 0)
- {
- // The document is signed
- $uploadedDocumentSigned = 'The document is signed';
- }
- elseif ($signList === null)
- {
- $uploadedDocumentSigned = 'WARNING: signature server error';
- }
- else
- {
- $signaturVorhanden = false;
- $uploadedDocumentSigned = 'No document signature found';
- }
- $this->addMeta('signaturInfo', $uploadedDocumentSigned);
-
- if ($signaturVorhanden === false)
- {
- $this->signaturFehltEmail($student_uid);
- }
-
- // TODO error handle get data has data the updates
- // update projektarbeit cols
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
- $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en
- ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl);
-
-
- // update paabgabe datum
- $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->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
-
- $this->terminateWithSuccess($res);
- } else {
- $this->terminateWithError('Error moving File');
- }
-
- } else {
- $this->terminateWithError('File missing');
- }
-
- }
-
- private function signaturFehltEmail($student_uid) {
-
-
- // Mail an Studiengang wenn keine Signatur gefunden wurde
- $student = new student();
- if(!$student->load($student_uid))
- $this->terminateWithError($this->p->t('global','userNichtGefunden'), 'general');
-
- $stg_obj = new studiengang();
- if(!$stg_obj->load($student->studiengang_kz))
- $this->terminateWithError($this->p->t('global','fehlerBeimLesenAusDatenbank'), 'general');
-
- $subject = 'Abgabe ohne Signatur';
- $tomail = $stg_obj->email;
- $data = array(
- 'vorname' => $student->vorname,
- 'nachname' => $student->nachname,
- 'studiengang' => $stg_obj->bezeichnung
- );
-
- $mailres = sendSanchoMail(
- 'ParbeitsbeurteilungSiganturFehlt',
- $data,
- $tomail,
- $subject,
- 'sancho_header_min_bw.jpg',
- 'sancho_footer_min_bw.jpg'
- );
- }
-
- private function sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid) {
-
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- $resBetr = $this->ProjektarbeitModel->getProjektbetreuerAnrede($bperson_id);
-
- $projektarbeit_obj = new projektarbeit();
-
- if(!$projektarbeit_obj->load($projektarbeit_id))
- $this->terminateWithError('Ungueltiger Eintrag');
-
- $num_rows_sem = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
-
- if( null === $num_rows_sem || false === $num_rows_sem )
- {
- $this->terminateWithError($this->p->t('abgabetool','fehlerAktualitaetProjektarbeit'), 'general');
- }
-
- foreach($resBetr->retval as $betreuerRow) {
-
- // query student benutzer view for every betreuer row
- $studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0];
-
- // TODO: hasdata, getData etc
-
- // 1. Begutachter mail ohne Token
- $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_obj->projekttyp_kurzbz;
- $subject = $projektarbeit_obj->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'] = $num_rows_sem >= 1 && $paabgabetyp_kurzbz == 'end' ? "Zur Beurteilung der Arbeit
" : "";
- $maildata['token'] = "";
-
- $mailres = sendSanchoMail(
- 'ParbeitsbeurteilungEndupload',
- $maildata,
- $betreuerRow->mitarbeiter_uid."@".DOMAIN,
- $subject,
- 'sancho_header_min_bw.jpg',
- 'sancho_footer_min_bw.jpg',
- get_uid()."@".DOMAIN);
-
- if(!$mailres)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general');
- }
-
- // 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern
- if ($paabgabetyp_kurzbz == 'end')
- {
- // Zweitbegutachter holen
- $zweitbegutachter = new projektbetreuer();
- $zweitbegutachterRes = $zweitbegutachter->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid);
-
- if ($zweitbegutachterRes)
- {
- $zweitbegutachterResults = $zweitbegutachter->result;
-
- foreach ($zweitbegutachterResults as $begutachter)
- {
- // token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft)
- $tokenGenRes = $zweitbegutachter->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id);
-
- if (!$tokenGenRes)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailZweitBegutachter'), 'general');
- }
-
- // Zweitbegutachter (evtl. mit Token) holen
- $zweitbegutachterMitToken = new projektbetreuer();
- $begutachterMitTokenRes = $zweitbegutachterMitToken->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id);
-
- if (!$begutachterMitTokenRes)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailZweitBegutachter'), 'general');
- }
-
- // Email an Zweitbegutachter senden
- if (isset($zweitbegutachterMitToken->result[0]))
- {
- $begutachterMitToken = $zweitbegutachterMitToken->result[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'] = $num_rows_sem >= 1 ? "Zur Beurteilung der Arbeit
" : "";
- $zweitbetmaildata['token'] = $num_rows_sem >= 1 && 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', 'fehlerMailBegutachter'), 'general');
- }
- }
- }
- }
- }
- }
- }
-
- 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);
-
- if (in_array($boolParamStrLower, $trueStrings, true)) {
- $showAllBool = true;
- } elseif (in_array($boolParamStrLower, $falseStrings, true)) {
- $showAllBool = false;
- } else {
-// $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
- }
-
- $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool);
-
- $this->terminateWithSuccess(array($projektarbeiten, DOMAIN));
- }
-
- public function postProjektarbeitAbgabe() {
- $projektarbeit_id = $_POST['projektarbeit_id'];
- $paabgabe_id = $_POST['paabgabe_id'];
- $paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
- $datum = $_POST['datum'];
- $fixtermin = $_POST['fixtermin'];
- $kurzbz = $_POST['kurzbz'];
-
- if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
- || !isset($paabgabe_id) || isEmptyString($paabgabe_id)
- || !isset($datum) || isEmptyString($datum)
- || !isset($datum) || isEmptyString($datum)
- || !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
-
- if($paabgabe_id == -1) {
- $result = $this->PaabgabeModel->insert(
- array(
- 'projektarbeit_id' => $projektarbeit_id,
- 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
- 'fixtermin' => $fixtermin,
- 'datum' => $datum,
- 'kurzbz' => $kurzbz,
- 'insertvon' => getAuthUID(),
- 'insertamum' => date('Y-m-d H:i:s')
- )
- );
-
- $this->terminateWithSuccess($result);
- } else {
- $result = $this->PaabgabeModel->update(
- $paabgabe_id,
- array(
- 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
- 'datum' => $datum,
- 'kurzbz' => $kurzbz,
- 'updatevon' => getAuthUID(),
- 'updateamum' => date('Y-m-d H:i:s')
- )
- );
-
- $this->terminateWithSuccess($result);
- }
- }
-
- public function deleteProjektarbeitAbgabe() {
- $paabgabe_id = $_POST['paabgabe_id'];
-
- if (!isset($paabgabe_id) || isEmptyString($paabgabe_id))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
-
- $result = $this->PaabgabeModel->load($paabgabe_id);
- $result = $this->getDataOrTerminateWithError($result);
-
- if(count($result) == 0)
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- // TODO: berechtigung?
- if($result[0]->insertvon === getAuthUID()) {
- $result = $this->PaabgabeModel->delete($paabgabe_id);
- $result = $this->getDataOrTerminateWithError($result);
- $this->terminateWithSuccess($result);
- }
-
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
- }
-
- /**
- * 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 = $_POST['projektarbeit_ids'];
- $datum = $_POST['datum'];
- $paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
- $bezeichnung = $_POST['bezeichnung'];
- $kurzbz = $_POST['kurzbz'];
-
- if (!isset($projektarbeit_ids) || !is_array($projektarbeit_ids) || empty($projektarbeit_ids)
- || !isset($datum) || isEmptyString($datum)
- || !isset($kurzbz) || isEmptyString($kurzbz)
- || !isset($bezeichnung) || isEmptyString($bezeichnung)
- || !isset($paabgabetyp_kurzbz) || isEmptyString($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
-
- // TODO: check berechtigung &/|| zuordnung?
-
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- $res = [];
- foreach ($projektarbeit_ids as $projektarbeit_id) {
-
- $result = $this->PaabgabeModel->insert(
- array(
- 'projektarbeit_id' => $projektarbeit_id,
- 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
- 'fixtermin' => false,
- 'datum' => $datum,
- 'kurzbz' => $kurzbz,
- 'insertvon' => getAuthUID(),
- 'insertamum' => date('Y-m-d H:i:s')
- )
- );
-
- $data = $this->getDataOrTerminateWithError($result);
-
-// $res[] = $data;
-
- // send mail to student
- $result = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
- $data = $this->getDataOrTerminateWithError($result);
-
-// $this->addMeta('emaildata'.$projektarbeit_id, $data);
-
- $datetime = new DateTime($datum);
- $dateEmailFormatted = $datetime->format('d.m.Y');
-
- $anredeFillString = $data[0]->anrede=="Herr"?"r":"";
-
- $fullFormattedNameString = trim($data[0]->titelpre." ".$data[0]->vorname." ".$data[0]->nachname." ".$data[0]->titelpost);
- $res[] = $fullFormattedNameString;
-
- // Prepare mail content
- $body_fields = array(
- 'anrede' => $data[0]->anrede,
- 'anredeFillString' => $anredeFillString,
- 'datum' => $dateEmailFormatted,
- 'bezeichnung' => $bezeichnung,
- 'fullFormattedNameString' => $fullFormattedNameString,
- 'kurzbz' => $kurzbz
- );
-
- $email = $data[0]->uid."@".DOMAIN;
-
- sendSanchoMail(
- 'neuerAbgabetermin',
- $body_fields,
- $email,
- $this->p->t('abgabetool', 'neuerTerminBachelorMasterbetreuung')
- );
- }
-
- $this->terminateWithSuccess($res);
-
- }
-
- public function fetchDeadlines() {
- $person_id = $_POST['person_id'];
-
- if (!isset($person_id) || isEmptyString($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);
-
- $this->terminateWithSuccess($data);
- }
}
diff --git a/application/controllers/api/frontend/v1/Lehrveranstaltung.php b/application/controllers/api/frontend/v1/Lehrveranstaltung.php
new file mode 100644
index 000000000..935602391
--- /dev/null
+++ b/application/controllers/api/frontend/v1/Lehrveranstaltung.php
@@ -0,0 +1,277 @@
+.
+ */
+
+if (!defined('BASEPATH'))
+ exit('No direct script access allowed');
+
+class Lehrveranstaltung extends FHCAPI_Controller
+{
+ private $_ci;
+ private $_uid;
+
+ public function __construct()
+ {
+ parent::__construct([
+ 'getByEmp' => ['admin:r', 'assistenz:r'],
+ 'getByStg' => ['admin:r', 'assistenz:r'],
+ 'loadByLV' => ['admin:r', 'assistenz:r'],
+ ]);
+
+ $this->_ci = &get_instance();
+ $this->_setAuthUID();
+
+ $this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel');
+ $this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+ $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ $this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
+
+ $this->loadPhrases(
+ array(
+ 'ui'
+ )
+ );
+ }
+
+ public function getByEmp($studiensemester_kurzbz = null, $mitarbeiter_uid = null, $stg_kz = null)
+ {
+
+ if (is_null($mitarbeiter_uid))
+ $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
+
+ $lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz);
+ $lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen);
+
+ $tree = [];
+
+ foreach ($lehrveranstaltungen_data as $lehrveranstaltung)
+ {
+ $lehreinheiten = $this->_ci->LehreinheitModel->getByLvidStudiensemester($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz, $mitarbeiter_uid);
+ $lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten);
+
+ if (!isset($lehrveranstaltung->_children))
+ {
+ $lehrveranstaltung->_children = $lehreinheiten_data;
+ }
+ $tree[] = $lehrveranstaltung;
+ }
+
+ $this->terminateWithSuccess($tree);
+ }
+ public function getByStg($studiensemester_kurzbz = null, $studiengang_kz = null, $semester = null)
+ {
+ if (is_null($studiengang_kz) || !preg_match("/^-?[1-9][0-9]*$/", (string)$studiengang_kz))
+ $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ $verband = null;
+ if (!is_null($semester) && !is_numeric($semester))
+ {
+ $verband = $semester;
+ $semester = null;
+ }
+
+ $this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
+
+ $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
+ $studienplan_data = $this->_ci->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $semester, $verband);
+
+ $studienplan_ids = array();
+ $only_ids = array();
+ $placeholders = array();
+
+ if (hasData($studienplan_data))
+ {
+ foreach (getData($studienplan_data) as $studienplan) {
+ $placeholders[] = "(?, ?)";
+ $studienplan_ids[] = $studienplan->studienplan_id;
+ $studienplan_ids[] = $studienplan->semester;
+ $only_ids[] = $studienplan->studienplan_id;
+ }
+ }
+
+ $lehrveranstaltungen_data = $this->_ci->LehrveranstaltungModel->getLvsByStudiengang($studienplan_ids, $placeholders, $only_ids, $studiengang_kz, $studiensemester_kurzbz, $semester, $verband);
+ $lehrveranstaltungen_data = hasData($lehrveranstaltungen_data) ? getData($lehrveranstaltungen_data) : array();
+
+ $tree = [];
+ foreach ($lehrveranstaltungen_data as $row)
+ {
+ $rowData = $row;
+
+ $lehreinheiten_data = $this->_ci->LehreinheitModel->getByLvidStudiensemester($row->lehrveranstaltung_id, $studiensemester_kurzbz);
+
+ if (hasData($lehreinheiten_data))
+ {
+ $lehreinheiten = getData($lehreinheiten_data);
+
+ if (!isset($row->_children))
+ {
+ $row->_children = $lehreinheiten;
+ }
+ else
+ {
+ if (!is_array($row->_children))
+ {
+ $row->_children = [$row->_children];
+ }
+ $row->_children = array_merge($row->_children, $lehreinheiten);
+ }
+ }
+
+ if (!isEmptyString($row->studienplan_lehrveranstaltung_id_parent))
+ {
+ $child = $this->_ci->StudienplanModel->loadStudienplanLehrveranstaltung($row->studienplan_lehrveranstaltung_id_parent);
+
+ if (hasData($child))
+ {
+ $child = getData($child)[0];
+ $searchId = $child->lehrveranstaltung_id;
+
+ foreach ($lehrveranstaltungen_data as &$searchParent)
+ {
+ if ($searchParent->lehrveranstaltung_id === $searchId)
+ {
+ if (!isset($searchParent->_children))
+ {
+ $searchParent->_children = [];
+ }
+
+ if (is_array($searchParent->_children))
+ {
+ $searchParent->_children[] = $row;
+ }
+ else
+ {
+ $searchParent->_children = [$searchParent->_children, $row];
+ }
+ break;
+ }
+ }
+
+ }
+ }
+ else
+ {
+ $tree[] = $rowData;
+ }
+ }
+
+ $counter = 0;
+ $this->assignUniqueIndex($tree, $counter);
+ $this->terminateWithSuccess($tree);
+ }
+
+
+ public function loadByLV($lehrveranstaltung_id = null)
+ {
+ if (is_null($lehrveranstaltung_id) || !ctype_digit((string)$lehrveranstaltung_id))
+ $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ $this->_ci->LehrveranstaltungModel->addSelect('lehrveranstaltung_id, lehrform_kurzbz, lehre, bezeichnung as lvbezeichnung, sprache');
+ $lehrveranstaltung_result = $this->_ci->LehrveranstaltungModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung_id));
+ $lehrveranstaltung_result = $this->getDataOrTerminateWithError($lehrveranstaltung_result);
+ $lehrveranstaltung = $lehrveranstaltung_result[0];
+
+ $this->_ci->LehreinheitModel->addSelect('lehrveranstaltung_id_kompatibel');
+ $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung_kompatibel', 'lehrveranstaltung_id');
+ $lehrfaecher = $this->_ci->LehreinheitModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung->lehrveranstaltung_id));
+
+ $lehrfaecher_array = [];
+ if (hasData($lehrfaecher))
+ $lehrfaecher_array = array_merge($lehrfaecher_array, array_column(getData($lehrfaecher), 'lehrveranstaltung_id_kompatibel'));
+
+ $lehrfaecher_array[] = $lehrveranstaltung->lehrveranstaltung_id;
+
+ $this->_ci->LehrveranstaltungModel->addDistinct('lehrfach_id');
+ $this->_ci->LehrveranstaltungModel->addSelect("tbl_lehrveranstaltung.lehrveranstaltung_id, CONCAT(tbl_lehrveranstaltung.bezeichnung || '(' || tbl_lehrveranstaltung.oe_kurzbz || ')') as lehrfach");
+ $this->_ci->LehrveranstaltungModel->db->where_in('tbl_lehrveranstaltung.lehrveranstaltung_id', $lehrfaecher_array);
+ $lehrfaecher_result = $this->_ci->LehrveranstaltungModel->load();
+
+ $lehrfaecher_array = hasData($lehrfaecher_result) ? getData($lehrfaecher_result) : array();
+
+ $lehrveranstaltung->lehrfaecher = $lehrfaecher_array;
+ $this->terminateWithSuccess($lehrveranstaltung);
+ }
+
+ /*
+ * (david) ggf. im naechsten release
+ * public function loadByOrganization($oe_kurzbz)
+ {
+ $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
+
+ $lehrveranstaltungen = $this->LehrveranstaltungModel->getLvsByOrganization($oe_kurzbz);
+ $lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen);
+ $tree = [];
+
+ foreach ($lehrveranstaltungen_data as $lehrveranstaltung)
+ {
+ $lehreinheiten = $this->LehreinheitModel->getByLvidStudiensemester($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz);
+ $lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten);
+
+ if (!isset($lehrveranstaltung->_children))
+ {
+
+ $lehrveranstaltung->_children = $lehreinheiten_data;
+ }
+ $tree[] = $lehrveranstaltung;
+ }
+ $this->terminateWithSuccess($tree);
+ }*/
+
+ /*public function loadByFachbereich($fachbereich, $mitarbeiter_uid = null)
+ {
+ $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
+
+ $this->LehreinheitModel->getLvsByFachbereich($fachbereich, $studiensemester_kurzbz, $mitarbeiter_uid);
+ }*/
+ private function _setAuthUID()
+ {
+ $this->_uid = getAuthUID();
+
+ if (!$this->_uid)
+ show_error('User authentification failed');
+ }
+
+ private function assignUniqueIndex(&$nodes, &$counter)
+ {
+ foreach ($nodes as &$node)
+ {
+ $node->uniqueindex = $counter++;
+ if (!empty($node->_children) && is_array($node->_children))
+ {
+ $this->assignUniqueIndex($node->_children, $counter);
+ }
+ }
+ }
+
+ private function getStudiensemesterKurzbz($studiensemester_kurzbz = null)
+ {
+ if (!is_null($studiensemester_kurzbz))
+ {
+ $studiensemester_result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
+
+ if (isError($studiensemester_result) || !hasData($studiensemester_result))
+ $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+
+ return getData($studiensemester_result)[0]->studiensemester_kurzbz;
+ }
+
+ $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/LvMenu.php b/application/controllers/api/frontend/v1/LvMenu.php
index 393c4d5c3..45936d9f5 100644
--- a/application/controllers/api/frontend/v1/LvMenu.php
+++ b/application/controllers/api/frontend/v1/LvMenu.php
@@ -51,7 +51,7 @@ class LvMenu extends FHCAPI_Controller
$this->load->library("PermissionLib", null, 'PermissionLib');
- $this->load->library("PhrasesLib");
+ $this->load->library("PhrasesLib", null, 'PhrasesLib');
$this->loadPhrases(array('global', 'lehre'));
}
@@ -269,6 +269,8 @@ class LvMenu extends FHCAPI_Controller
'lehrfach_id'=>$lehrfach_id,
'lektor_der_lv'=>$lektor_der_lv,
'lehrfach_oe_kurzbz_arr'=>$lehrfach_oe_kurzbz_arr,
+ 'permissionLib' => &$this->PermissionLib,
+ 'phrasesLib' => &$this->PhrasesLib
];
Events::trigger('lvMenuBuild',
@@ -331,6 +333,7 @@ class LvMenu extends FHCAPI_Controller
'id'=>'core_menu_lvinfo',
'position'=>'10',
'name'=>$this->p->t('lehre', 'lehrveranstaltungsinformation'),
+ 'phrase' => 'lehre/lehrveranstaltungsinformation',
'icon'=>'../../../skin/images/button_lvinfo.png',
'link'=>'',
'c4_icon'=> base_url('skin/images/button_lvinfo.png'),
@@ -349,6 +352,7 @@ class LvMenu extends FHCAPI_Controller
'id'=>'core_menu_feedback',
'position'=>'60',
'name'=>$this->p->t('lehre', 'feedback'),
+ 'phrase' => 'lehre/feedback',
'c4_icon'=> base_url('skin/images/button_feedback.png'),
'c4_link'=> base_url('feedback.php?lvid='.$lvid),
);
@@ -366,6 +370,7 @@ class LvMenu extends FHCAPI_Controller
'id'=>'core_menu_gesamtnote',
'position'=>'80',
'name'=>$this->p->t('lehre', 'gesamtnote'),
+ 'phrase' => 'lehre/gesamtnote',
'c4_icon'=> base_url('skin/images/button_endnote.png'),
'c4_link'=> base_url('cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem))
//'c4_link'=> base_url('benotungstool/lvgesamtnoteverwalten.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem))
@@ -378,6 +383,7 @@ class LvMenu extends FHCAPI_Controller
'id'=>'core_menu_gesamtnote',
'position'=>'80',
'name'=>$this->p->t('lehre', 'gesamtnote'),
+ 'phrase'=>'lehre/gesamtnote',
'c4_icon'=>base_url('skin/images/button_endnote.png'),
'c4_link'=>'#',
'c4_linkList'=>[[$this->p->t('lehre', 'noteneingabedeaktiviert'),'#']],
@@ -450,6 +456,7 @@ class LvMenu extends FHCAPI_Controller
'id'=>'core_menu_mailanstudierende',
'position'=>'100',
'name'=>$this->p->t('lehre', 'mail'),
+ 'phrase' => 'lehre/mail',
'c4_icon'=>base_url('skin/images/button_feedback.png'),
'c4_icon2' => 'fa-regular fa-envelope',
'c4_link'=>$mailto,
@@ -474,6 +481,7 @@ class LvMenu extends FHCAPI_Controller
'id'=>'core_menu_abmeldung',
'position'=>'120',
'name'=>$this->p->t('lehre', 'abmelden'),
+ 'phrase'=>'lehre/abmelden',
'c4_icon'=>base_url('skin/images/button_studiupload.png'),
'c4_link'=>base_url('abmeldung.php?lvid='.urlencode($lvid).'&stsem='.urlencode($angezeigtes_stsem)),
);
@@ -508,6 +516,7 @@ class LvMenu extends FHCAPI_Controller
'id' => 'core_menu_anerkennungNachgewiesenerKenntnisse',
'position' => '128',
'name' => $this->p->t('lehre', 'anrechnung'),
+ 'phrase' => 'lehre/anrechnung',
'c4_icon' => base_url('skin/images/button_listen.png'),
'c4_icon2' => 'fa-regular fa-folder-open',
'c4_link' => base_url('cis.php/lehre/anrechnung/RequestAnrechnung?studiensemester='.urlencode($angezeigtes_stsem).'&lv_id='.urlencode($lvid))
@@ -525,6 +534,7 @@ class LvMenu extends FHCAPI_Controller
'id' => 'core_menu_anerkennungNachgewiesenerKenntnisse_empfehlen',
'position' => '128',
'name' => $this->p->t('lehre', 'anrechnungen'),
+ 'phrase' => 'lehre/anrechnung',
'c4_icon'=> base_url('skin/images/button_listen.png'),
'c4_icon2' => 'fa-regular fa-folder-open',
'c4_link' => base_url('cis.php/lehre/anrechnung/ReviewAnrechnungUebersicht?studiensemester='.urlencode($angezeigtes_stsem))
diff --git a/application/controllers/api/frontend/v1/LvPlan.php b/application/controllers/api/frontend/v1/LvPlan.php
index 3b6b55911..28b48e3f1 100644
--- a/application/controllers/api/frontend/v1/LvPlan.php
+++ b/application/controllers/api/frontend/v1/LvPlan.php
@@ -176,6 +176,7 @@ class LvPlan extends FHCAPI_Controller
{
$this->load->model('ressource/Stunde_model', 'StundeModel');
+ $this->StundeModel->addOrder('stunde', 'ASC');
$stunden = $this->StundeModel->load();
$stunden = $this->getDataOrTerminateWithError($stunden);
diff --git a/application/controllers/api/frontend/v1/ProfilUpdate.php b/application/controllers/api/frontend/v1/ProfilUpdate.php
index 929ea49d6..f97546288 100644
--- a/application/controllers/api/frontend/v1/ProfilUpdate.php
+++ b/application/controllers/api/frontend/v1/ProfilUpdate.php
@@ -573,8 +573,7 @@ class ProfilUpdate extends FHCAPI_Controller
{
// 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
@@ -587,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);
}
}
@@ -638,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']);
@@ -657,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) {
@@ -681,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'));
}
@@ -704,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)
@@ -714,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);
@@ -775,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)
@@ -811,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
@@ -823,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;
}
@@ -850,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
@@ -867,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'));
}
@@ -891,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]);
@@ -900,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/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 363b6e534..b4c251555 100644
--- a/application/controllers/api/frontend/v1/Searchbar.php
+++ b/application/controllers/api/frontend/v1/Searchbar.php
@@ -39,6 +39,8 @@ class Searchbar extends FHCAPI_Controller
'searchCis' => self::PERM_LOGGED,
'searchStv' => self::PERM_LOGGED
]);
+
+ $this->load->model('system/Webservicelog_model', 'WebservicelogModel');
}
//------------------------------------------------------------------------------------------------------------------
@@ -103,6 +105,17 @@ class Searchbar extends FHCAPI_Controller
// 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']);
diff --git a/application/controllers/api/frontend/v1/Studium.php b/application/controllers/api/frontend/v1/Studium.php
index fb4d3ce3c..d17f0c1a1 100644
--- a/application/controllers/api/frontend/v1/Studium.php
+++ b/application/controllers/api/frontend/v1/Studium.php
@@ -58,8 +58,8 @@ class Studium extends FHCAPI_Controller
$parameter_semester = $this->input->get('semester',true);
$parameter_studienplan = $this->input->get('studienplan',true);
- $aktuelles_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->getAkt()));
-
+ $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));
diff --git a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php
index 05d7c66c2..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);
@@ -370,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)) {
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/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
index dbc11735a..77b46f97b 100644
--- a/application/controllers/api/frontend/v1/messages/Messages.php
+++ b/application/controllers/api/frontend/v1/messages/Messages.php
@@ -1,6 +1,5 @@
['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'],
- 'getVorlagentext' => ['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
@@ -37,26 +38,37 @@ class Messages extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
- 'ui'
+ 'ui', 'messages'
]);
}
- public function getMessages($id, $type_id, $size, $page)
+ public function getMessages($id, $type_id, $size=null, $page=null)
{
if($type_id != 'person_id'){
$id = $this->_getPersonId($id, $type_id);
}
- $offset = $size * ($page - 1);
- $limit = $size;
+ 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);
- $data = $this->getDataOrTerminateWithError($result);
+ if (hasData($result))
+ {
+ $data = getData($result);
+ $this->addMeta('count', $data['count']);
+ $this->terminateWithSuccess($data['data']);
+ }
- $this->addMeta('count', $data['count']);
-
- $this->terminateWithSuccess($data['data']);
+ $this->terminateWithSuccess(array());
}
public function getVorlagen()
@@ -66,33 +78,23 @@ class Messages extends FHCAPI_Controller
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$result = $this->BenutzerfunktionModel->getBenutzerfunktionByUid($uid, 'oezuordnung');
- $data = $this->getDataOrTerminateWithError($result);
- $oe_kurzbz = current($data);
+ if (hasData($result))
+ {
+ $this->load->model('system/Vorlage_model', 'VorlageModel');
- $this->load->model('system/Vorlage_model', 'VorlageModel');
+ $data = getData($result);
- $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz->oe_kurzbz);
- $data = $this->getDataOrTerminateWithError($result);
+ $oe_kurzbz = array_column($data, 'oe_kurzbz');
+ $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz);
- $this->terminateWithSuccess($data);
+ $this->terminateWithSuccess(hasData($result) ? getData($result) : array());
+ }
- //If admin
- $this->VorlageModel->addOrder('vorlage_kurzbz', 'ASC');
- $result = $this->VorlageModel->loadWhere(
- array(
- 'mimetype' => 'text/html'
- ));
-
-
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess($data);
+ $this->terminateWithSuccess(array());
}
- public function getVorlagentext($vorlage_kurzbz)
+ public function getDataVorlage($vorlage_kurzbz)
{
- //$this->terminateWithError("vor " . $vorlage_kurzbz, self::ERROR_TYPE_GENERAL);
- //$studiengang_kz = 227; //TODO(Manu) dynamisieren NULL
$studiengang_kz = 0;
$this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
$this->VorlagestudiengangModel->addOrder('version', 'DESC');
@@ -104,30 +106,53 @@ class Messages extends FHCAPI_Controller
]);
$data = $this->getDataOrTerminateWithError($result);
-
- //not correct with Vorlage
$vorlage = current($data);
-
- //$this->terminateWithSuccess($data);
- $this->terminateWithSuccess($vorlage->text);
+ $this->terminateWithSuccess($vorlage);
}
- public function getMessageVarsPerson($id, $typeId)
+ public function getMessageVarsPerson($typeId)
{
- $person_id = ($typeId == 'mitarbeiter_uid') ? $this->_getPersonId($id, $typeId) : $id;
- $result = $this->MessageModel->getMsgVarsDataByPersonId($person_id);
- $data = $this->getDataOrTerminateWithError($result);
+ $ids = $this->input->post('ids');
+ $messageVarsPerson = [];
- $this->terminateWithSuccess($data);
+ 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($id, $typeId)
+ public function getMsgVarsPrestudent($typeId)
{
- $prestudent_id = ($typeId == 'uid') ? $this->_getPrestudentIdFromUid($id) : $id;
- $result = $this->MessageModel->getMsgVarsDataByPrestudentId($prestudent_id);
- $data = $this->getDataOrTerminateWithError($result);
+ $ids = $this->input->post('ids');
+ if(!is_array($ids)) {
+ $ids = array($ids);
+ }
+ $messageVarsPrestudent = [];
- $this->terminateWithSuccess($data);
+ 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()
@@ -138,27 +163,45 @@ class Messages extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
- public function getNameOfDefaultRecipient($id, $type_id)
+ public function getNameOfDefaultRecipients($type_id)
{
- $id = ($type_id != 'person_id') ? $this->_getPersonId($id, $type_id) : $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;
+ }
+ }
- $result = $this->PersonModel->load($id);
- $data = $this->getDataOrTerminateWithError($result);
- $name = current($data);
-
- $this->terminateWithSuccess($name->vorname . " " . $name->nachname );
+ $this->terminateWithSuccess($recipients);
}
- public function sendMessage($recipient_id)
+ public function sendMessage($typeId)
{
- //has to be uid
- // $this->terminateWithError("uid", $recipient_id, self::ERROR_TYPE_GENERAL);
-
- //default setting
- $receiversPersonId = $this->_getPersonId($recipient_id, 'uid');
-
+ $resultReturn = [];
$uid = getAuthUID();
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$result = $this->BenutzerModel->loadWhere(
@@ -196,49 +239,61 @@ class Messages extends FHCAPI_Controller
$body = $this->input->post('body');
$relationmessage_id = $this->input->post('relationmessage_id');
- $typeId = $this->input->post('type_id');
- $id = $this->input->post('id');
-
- if($typeId == 'uid')
+ if (isset($_POST['ids']))
{
- $prestudent_id = $this-> _getPrestudentIdFromUid($id);
-
- //parseMessagetext for variables Prestudent
- $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);
- $this->terminateWithError($bodyParsed, self::ERROR_TYPE_GENERAL);
-
- }
- elseif($typeId == 'person_id')
- {
- $result = $this->MessagesModel->parseMessageTextPerson($id, $body);
- $bodyParsed = $this->getDataOrTerminateWithError($result);
- }
- elseif($typeId == 'prestudent_id')
- {
- // $this->terminateWithError("prestudent_id ", self::ERROR_TYPE_GENERAL);
-
- $result = $this->MessagesModel->parseMessageTextPrestudent($id, $body);
- $bodyParsed = $this->getDataOrTerminateWithError($result);
- }
- else
- {
- $this->terminateWithError("type_id " . $typeId . " not valid", self::ERROR_TYPE_GENERAL);
+ $ids = json_decode($_POST['ids']);
+ unset($_POST['ids']);
+ foreach ($data as $k => $v) {
+ $_POST[$k] = $v;
+ }
}
- $result = $this->messagelib->sendMessageUser($receiversPersonId, $subject, $bodyParsed, $benutzer->person_id, null, $relationmessage_id);
+ if (!is_array($ids)) {
+ $ids = [$ids];
+ }
- $this->terminateWithSuccess($result);
+ 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($id, $type_id)
+ public function getPreviewText($type_id)
{
if (isset($_POST['data']))
{
@@ -246,39 +301,60 @@ class Messages extends FHCAPI_Controller
unset($_POST['data']);
}
else
- $this->terminateWithError("Textbody missing ", self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($this->p->t('messages', 'errorMissingOrInvalidParameters', ['parameter'=> "Textbody"]), self::ERROR_TYPE_GENERAL);
- switch($type_id)
+ if (isset($_POST['ids']))
{
- case 'uid':
- $prestudent_id = $this->_getPrestudentIdFromUid($id);
- $result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $data);
- break;
- case 'prestudent_id':
- $result = $this->MessagesModel->parseMessageTextPrestudent($id, $data);
- break;
- case 'person_id':
- $result = $this->MessagesModel->parseMessageTextPerson($id, $data);
- break;
- case 'mitarbeiter_uid':
- {
- $person_id = $this->_getPersonId($id, $type_id);
- $result = $this->MessagesModel->parseMessageTextPerson($person_id, $data);
- }
- break;
- default:
- $this->terminateWithError("MESSAGES::getPreviewText logic for type_id " . $type_id . " not defined yet", self::ERROR_TYPE_GENERAL);
- break;
+ $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 = $this->getDataOrTerminateWithError($result);
+ $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)
{
- //TODO(Manu) validation of messageId: if number
+ 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.*');
@@ -301,7 +377,6 @@ class Messages extends FHCAPI_Controller
$replyBody = $this->_getReplyBody($body, $dataMessage[0]->nachname, $dataMessage[0]->vorname, $dataMessage[0]->insertamum);
$dataMessage[0]->replyBody = $replyBody;
- $dataMessage[0]->rest = "Help Manu";
$dataMessage[0]->replySubject = $prefix . $subject;
$this->terminateWithSuccess($dataMessage);
@@ -349,6 +424,11 @@ class Messages extends FHCAPI_Controller
['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);
@@ -356,8 +436,11 @@ class Messages extends FHCAPI_Controller
$this->terminateWithSuccess($person->person_id);
}
- public function getUid($id, $typeId)
+ 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);
@@ -365,39 +448,50 @@ class Messages extends FHCAPI_Controller
elseif ($typeId == 'person_id')
{
$this->load->model('person/Benutzer_model', 'BenutzerModel');
- $result = $this->BenutzerModel->loadWhere(
- ['person_id' => $id]
- );
+ 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');
- $result = $this->PrestudentModel->loadWhere(
- ['prestudent_id' => $id]
- );
+ foreach ($ids as $id)
+ {
+ $result = $this->PrestudentModel->loadWhere(
+ ['prestudent_id' => $id]
+ );
- $data = $this->getDataOrTerminateWithError($result);
- $person = current($data);
- $person_id = $person->person_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]
- );
+ $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($id);
+ $this->terminateWithSuccess($ids);
}
else
{
- $this->terminateWithError("MESSAGES::getUID logic for type_id " . $typeId . " not defined yet", self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL);
}
- $data = $this->getDataOrTerminateWithError($result);
- $benutzer = current($data);
-
- $this->terminateWithSuccess($benutzer->uid);
+ $this->terminateWithSuccess($benutzerIds);
}
private function _getPersonId($id, $typeId)
@@ -416,8 +510,17 @@ class Messages extends FHCAPI_Controller
['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;
@@ -425,15 +528,18 @@ class Messages extends FHCAPI_Controller
private function _getPrestudentIdFromUid($uid)
{
- // $this->terminateWithError($uid, self::ERROR_TYPE_GENERAL);
$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);
- // $this->terminateWithError($student->prestudent_id, self::ERROR_TYPE_GENERAL);
+
return $student->prestudent_id;
}
@@ -455,4 +561,4 @@ class Messages extends FHCAPI_Controller
date_format(date_create($sentDate), 'd.m.Y H:i'), $receiverName, $receiverSurname, $body
);
}
-}
\ No newline at end of file
+}
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/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 bb56ea71a..3c6b72d2f 100644
--- a/application/controllers/api/frontend/v1/organisation/Studiensemester.php
+++ b/application/controllers/api/frontend/v1/organisation/Studiensemester.php
@@ -25,7 +25,8 @@ class Studiensemester extends FHCAPI_Controller
array(
'getAll' => self::PERM_LOGGED,
'getAktNext' => self::PERM_LOGGED,
- 'getStudienjahrByStudiensemester' => self::PERM_LOGGED
+ 'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
+ 'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED
)
);
// Load model StudiensemesterModel
@@ -152,4 +153,17 @@ class Studiensemester extends FHCAPI_Controller
$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
index d8bc067f9..def4f6502 100644
--- a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
+++ b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
@@ -20,8 +20,6 @@ class Abschlusspruefung extends FHCAPI_Controller
'getBeurteilungen' => ['admin:rw', 'assistenz:rw'],
'getAkadGrade' => ['admin:rw', 'assistenz:rw'],
'getMitarbeiter' => ['admin:rw', 'assistenz:rw'],
- 'getAllMitarbeiter' => ['admin:rw', 'assistenz:rw'],
- 'getAllPersons' => ['admin:rw', 'assistenz:rw'],
'getPruefer' => ['admin:rw', 'assistenz:rw'],
'getTypStudiengang' => ['admin:rw', 'assistenz:rw'],
'checkForExistingExams' => ['admin:rw', 'assistenz:rw'],
@@ -102,35 +100,45 @@ class Abschlusspruefung extends FHCAPI_Controller
{
$abschlusspruefung_id = $this->input->post('id');
- $this->AbschlusspruefungModel->addSelect('lehre.tbl_abschlusspruefung.*');
- $this->AbschlusspruefungModel->addSelect("
- CASE
- WHEN pruefer1 IS NOT NULL
- THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, ''))
- ELSE NULL
- END AS p1
- ");
- $this->AbschlusspruefungModel->addSelect("
- CASE
- WHEN pruefer2 IS NOT NULL
- THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, ''))
- ELSE NULL
- END AS p2
- ");
- $this->AbschlusspruefungModel->addSelect("
- CASE
- WHEN pruefer3 IS NOT NULL
- THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, ''))
- ELSE NULL
- END AS p3
- ");
- $this->AbschlusspruefungModel->addSelect("
- CASE
- WHEN vorsitz IS NOT NULL
- THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' )
- ELSE NULL
- END AS pv
- ");
+ $this->AbschlusspruefungModel->addSelect(
+ 'lehre.tbl_abschlusspruefung.*,
+ p1.person_id AS p1_person_id, p1.vorname AS p1_vorname, p1.nachname AS p1_nachname,
+ p1.titelpre AS p1_titelpre, p1.titelpost AS p1_titelpost,
+ p2.person_id AS p2_person_id, p2.vorname AS p2_vorname, p2.nachname AS p2_nachname,
+ p2.titelpre AS p2_titelpre, p2.titelpost AS p2_titelpost,
+ p3.person_id AS p3_person_id, p3.vorname AS p3_vorname, p3.nachname AS p3_nachname,
+ p3.titelpre AS p3_titelpre, p3.titelpost AS p3_titelpost,
+ pv.person_id AS pv_person_id, pv.vorname AS pv_vorname, pv.nachname AS pv_nachname,
+ pv.titelpre AS pv_titelpre, pv.titelpost AS pv_titelpost, ben.uid AS pv_uid'
+ );
+ //~ $this->AbschlusspruefungModel->addSelect("
+ //~ CASE
+ //~ WHEN pruefer1 IS NOT NULL
+ //~ THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, ''))
+ //~ ELSE NULL
+ //~ END AS p1
+ //~ ");
+ //~ $this->AbschlusspruefungModel->addSelect("
+ //~ CASE
+ //~ WHEN pruefer2 IS NOT NULL
+ //~ THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, ''))
+ //~ ELSE NULL
+ //~ END AS p2
+ //~ ");
+ //~ $this->AbschlusspruefungModel->addSelect("
+ //~ CASE
+ //~ WHEN pruefer3 IS NOT NULL
+ //~ THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, ''))
+ //~ ELSE NULL
+ //~ END AS p3
+ //~ ");
+ //~ $this->AbschlusspruefungModel->addSelect("
+ //~ CASE
+ //~ WHEN vorsitz IS NOT NULL
+ //~ THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' )
+ //~ ELSE NULL
+ //~ END AS pv
+ //~ ");
$this->AbschlusspruefungModel->addJoin('public.tbl_benutzer ben', 'ON (ben.uid = lehre.tbl_abschlusspruefung.vorsitz)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person pv', 'ON (pv.person_id = ben.person_id)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person p1', 'ON (p1.person_id = lehre.tbl_abschlusspruefung.pruefer1)', 'LEFT');
@@ -220,8 +228,10 @@ class Abschlusspruefung extends FHCAPI_Controller
$this->terminateWithSuccess($typStudiengang);
}
- public function getMitarbeiter($searchString)
+ public function getMitarbeiter()
{
+ $searchString = $this->input->get('searchString') ?? '';
+
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'mitAkadGrad');
@@ -232,8 +242,10 @@ class Abschlusspruefung extends FHCAPI_Controller
$this->terminateWithSuccess($result ?: []);
}
- public function getPruefer($searchString)
+ public function getPruefer()
{
+ $searchString = $this->input->get('searchString') ?? '';
+
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid');
@@ -444,58 +456,4 @@ class Abschlusspruefung extends FHCAPI_Controller
}
$this->terminateWithSuccess('step3');
}
-
- /*
- * returns list of all Mitarbeiter
- * as key value list to be used in select or autocomplete
- */
- public function getAllMitarbeiter()
- {
- $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
-
- $sql = "
- SELECT
- ma.mitarbeiter_uid as mitarbeiter_uid,
- CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid, ')') as label
- FROM
- public.tbl_mitarbeiter ma
- JOIN public.tbl_benutzer bn ON (bn.uid = ma.mitarbeiter_uid)
- JOIN public.tbl_person p ON (p.person_id = bn.person_id)
- ORDER BY
- p.nachname ASC
- ";
-
- $result = $this->MitarbeiterModel->execReadOnlyQuery($sql);
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess($data);
- }
-
- /*
- * returns list of all Persons
- * as key value list to be used in select or autocomplete
- */
- public function getAllPersons()
- {
- $this->load->model('person/Person_model', 'PersonModel');
-
- $sql = "
- SELECT
- p.vorname, p.nachname, p.person_id,
- CONCAT(p.nachname, ' ', p.vorname) as label
- FROM
- public.tbl_person p
- -- JOIN public.tbl_benutzer bn ON (p.person_id = bn.person_id)
- -- and bn.aktiv = 'true'
- ORDER BY
- p.nachname ASC
- ";
-
- //TODO(manu) check if filter active benutzer
-
- $result = $this->PersonModel->execReadOnlyQuery($sql);
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess($data);
- }
}
diff --git a/application/controllers/api/frontend/v1/stv/Archiv.php b/application/controllers/api/frontend/v1/stv/Archiv.php
index cc636951d..6b8388fbb 100644
--- a/application/controllers/api/frontend/v1/stv/Archiv.php
+++ b/application/controllers/api/frontend/v1/stv/Archiv.php
@@ -39,7 +39,7 @@ class Archiv extends FHCAPI_Controller
'archive' => ['admin:w', 'assistenz:w'],
'download' => ['admin:w', 'assistenz:w'],
'update' => ['admin:w'],
- 'delete' => ['admin:w', 'assistenz:w']
+ 'delete' => ['admin:w', 'assistenz:w'],
]);
// Load models
@@ -107,13 +107,9 @@ class Archiv extends FHCAPI_Controller
$result = $this->AkteModel->load($akte_id);
-
if (!hasData($result)) $this->terminateWithError('Akte not found');
- $data = $this->getDataOrTerminateWithError($result);
-
$data = getData($result)[0];
- //$this->addMeta("daa", $data->inhalt);
$fileObj = new stdClass();
if (isset($data->inhalt) && $data->inhalt != '')
@@ -133,12 +129,7 @@ class Archiv extends FHCAPI_Controller
//header("Content-type: $data->mimetype");
header('Content-Disposition: attachment; filename="'.$data->titel.'"');
readfile($filename);
- //echo base64_decode($data->inhalt);
die();
- //~ $fileObj->file = $data->inhalt;
- //~ $fileObj->name = $data->titel;
- //~ $fileObj->mimetype = $data->mimetype;
- //~ $fileObj->disposition = 'attachment';
}
else
{
@@ -146,12 +137,6 @@ class Archiv extends FHCAPI_Controller
$result = $this->aktelib->get($akte_id);
}
-
- /* $fileObj->filename
- * $fileObj->file
- * $fileObj->name
- * $fileObj->mimetype
- * $fileObj->disposition*/
}
/**
diff --git a/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php
index 86b739c90..437ba42ad 100644
--- a/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php
+++ b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php
@@ -36,15 +36,44 @@ class Aufnahmetermine extends FHCAPI_Controller
// 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);
- $data = $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;
- $this->terminateWithSuccess($data);
+ //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()
@@ -60,7 +89,6 @@ class Aufnahmetermine extends FHCAPI_Controller
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;
@@ -224,7 +252,11 @@ class Aufnahmetermine extends FHCAPI_Controller
)
);
- $data = $this->getDataOrTerminateWithError($result);
+ //check if existing placementtest
+ if(!hasData($result))
+ $this->terminateWithSuccess([]);
+ else
+ $data = getData($result);
$studienplan_arr = [];
$include_ids = [];
@@ -233,12 +265,18 @@ class Aufnahmetermine extends FHCAPI_Controller
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);
- $dataRt = $this->getDataOrTerminateWithError($resultRt);
+ //check if existing placementtest
+ if(!hasData($result))
+ $this->terminateWithSuccess([]);
+ else
+ $dataRt = getData($resultRt);
foreach ($dataRt as $item)
{
@@ -298,7 +336,7 @@ class Aufnahmetermine extends FHCAPI_Controller
$reihungstestangetreten =
(isset($formData['reihungstestangetreten']) && !empty($formData['reihungstestangetreten']))
? $formData['reihungstestangetreten']
- : null;
+ : false;
$aufnahmegruppe_kurzbz =
(isset($formData['aufnahmegruppe_kurzbz']) && !empty($formData['aufnahmegruppe_kurzbz']))
? $formData['aufnahmegruppe_kurzbz']
@@ -354,6 +392,7 @@ class Aufnahmetermine extends FHCAPI_Controller
$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)
{
@@ -364,22 +403,27 @@ class Aufnahmetermine extends FHCAPI_Controller
$studiengang_kz = $this->input->get('studiengang_kz');
$this->load->model('testtool/Ablauf_model', 'AblaufModel');
- $result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz);
+ $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);
-
-/* if (isError($result))
- {
- $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
- }*/
-
+ $result = $this->ReihungstestModel->getReihungstestErgebnisPerson(
+ $person_id,
+ $punkte,
+ $reihungstest_id,
+ $weightedArray,
+ $has_excluded_gebiete,
+ $basis_gebiet_id_toString
+ );
$this->terminateWithSuccess($result);
}
diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php
index adf9f729e..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']
]);
@@ -45,13 +48,257 @@ class Config extends FHCAPI_Controller
'lehre',
'stv',
'konto',
- 'abschlusspruefung'
+ 'abschlusspruefung',
+ 'projektarbeit'
]);
// Load Config
$this->load->config('stv');
}
+ /**
+ * get App config
+ */
+ public function get()
+ {
+ $this->load->model('system/Variable_model', 'VariableModel');
+ $this->load->config('stv');
+
+ $config = [];
+
+ #number_displayed_past_studiensemester
+ $result = $this->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $number_displayed_past_studiensemester_default = $this->config->item('number_displayed_past_studiensemester_default');
+
+ $config['number_displayed_past_studiensemester'] = [
+ "type" => "number",
+ "label" => $this->p->t('stv', 'settings_no_displayed_past_sem'),
+ "value" => $data['number_displayed_past_studiensemester']
+ ?? $number_displayed_past_studiensemester_default
+ ];
+
+ #font_size
+ $result = $this->VariableModel->getVariables(getAuthUID(), ['stv_font_size']);
+ $data = $this->getDataOrTerminateWithError($result);
+ $config['font_size'] = [
+ "type" => "select",
+ "label" => $this->p->t('stv', 'settings_fontsize'),
+ "value" => $data['stv_font_size'] ?? "fs_normal",
+ "options" => [
+ "fs_xx-small" => $this->p->t('stv', 'settings_fontsize_xx-small'),
+ "fs_x-small" => $this->p->t('stv', 'settings_fontsize_x-small'),
+ "fs_small" => $this->p->t('stv', 'settings_fontsize_small'),
+ "fs_normal" => $this->p->t('stv', 'settings_fontsize_normal'),
+ "fs_big" => $this->p->t('stv', 'settings_fontsize_big'),
+ "fs_huge" => $this->p->t('stv', 'settings_fontsize_huge')
+ ]
+ ];
+
+ #others
+ Events::trigger('stv_config_get', function & () use (&$config) {
+ return $config;
+ });
+
+ $this->terminateWithSuccess($config);
+ }
+
+ /**
+ * set App config
+ */
+ public function set()
+ {
+ $this->load->model('system/Variable_model', 'VariableModel');
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules(
+ 'number_displayed_past_studiensemester',
+ $this->p->t('stv', 'settings_no_displayed_past_sem'),
+ 'required|integer'
+ );
+ $this->form_validation->set_rules(
+ 'font_size',
+ $this->p->t('stv', 'settings_fontsize'),
+ 'required|in_list[fs_xx-small,fs_x-small,fs_small,fs_normal,fs_big,fs_huge]'
+ );
+
+ Events::trigger('stv_config_validation', $this->form_validation);
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+
+ $this->VariableModel->setVariable(
+ getAuthUID(),
+ 'number_displayed_past_studiensemester',
+ $this->input->post('number_displayed_past_studiensemester')
+ );
+ $this->VariableModel->setVariable(
+ getAuthUID(),
+ 'stv_font_size',
+ $this->input->post('font_size')
+ );
+
+ Events::trigger('stv_config_set', $this->input);
+
+ $this->terminateWithSuccess();
+ }
+
+ /*
+ * Get the config for the student filters
+ *
+ * @return void
+ */
+ public function filter()
+ {
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ $this->load->model('crm/Buchungstyp_model', 'BuchungstypModel');
+
+ $this->BuchungstypModel->addOrder('beschreibung');
+
+ $result = $this->BuchungstypModel->load();
+
+ $buchungstyp_kurzbz = $this->getDataOrTerminateWithError($result);
+ $buchungstyp_kurzbz_plus_all = array_merge([[
+ 'buchungstyp_kurzbz' => 'all',
+ 'beschreibung' => $this->p->t('stv', 'konto_all_types')
+ ]], $buchungstyp_kurzbz);
+
+ $this->load->model('crm/Statusgrund_model', 'StatusgrundModel');
+
+ $result = $this->StatusgrundModel->getAktiveGruende();
+
+ $statusgruende = $this->getDataOrTerminateWithError($result);
+
+ $result = [];
+
+ $result[] = [
+ 'id' => 'filter_konto_count_0',
+ 'label' => $this->p->t('stv', 'filter_konto_count_0'),
+ 'type' => 'konto',
+ 'fixed' => [
+ 'missing' => true,
+ 'usestdsem' => true
+ ],
+ 'dynamic' => [
+ 'buchungstyp_kurzbz' => [
+ 'type' => 'select',
+ 'values' => $buchungstyp_kurzbz,
+ 'value_key' => 'buchungstyp_kurzbz',
+ 'label_key' => 'beschreibung'
+ ]
+ ]
+ ];
+ $result[] = [
+ 'id' => 'filter_konto_missing_counter',
+ 'label' => $this->p->t('stv', 'filter_konto_missing_counter'),
+ 'type' => 'konto_counter',
+ 'dynamic' => [
+ 'buchungstyp_kurzbz' => [
+ 'type' => 'select',
+ 'values' => $buchungstyp_kurzbz_plus_all,
+ 'value_key' => 'buchungstyp_kurzbz',
+ 'label_key' => 'beschreibung',
+ '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 = [];
@@ -59,16 +306,21 @@ class Config extends FHCAPI_Controller
$result['details'] = [
'title' => $this->p->t('stv', 'tab_details'),
- 'component' => './Stv/Studentenverwaltung/Details/Details.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Details.js'),
'config' => $config['details']
];
+
$result['notes'] = [
'title' => $this->p->t('stv', 'tab_notes'),
- 'component' => './Stv/Studentenverwaltung/Details/Notizen.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Notizen.js'),
+ 'config' => $config['notes'],
+ 'showSuffix' => ($config['notes']['showCountNotes'] ?? false),
+ 'suffixhelper' => absoluteJsImportUrl('public/js/helpers/Stv/Studentenverwaltung/Details/Notizen/NotizenSuffixHelper.js')
];
+
$result['contact'] = [
'title' => $this->p->t('stv', 'tab_contact'),
- 'component' => './Stv/Studentenverwaltung/Details/Kontakt.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Kontakt.js'),
'config' => [
'showBankaccount' => $this->permissionlib->isBerechtigt('mitarbeiter/bankdaten')
|| $this->permissionlib->isBerechtigt('student/bankdaten')
@@ -76,20 +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' => './Stv/Studentenverwaltung/Details/Dokumente.js'
+ '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'),
@@ -101,20 +356,22 @@ class Config extends FHCAPI_Controller
];
$result['resources'] = [
'title' => $this->p->t('stv', 'tab_resources'),
- 'component' => './Stv/Studentenverwaltung/Details/Betriebsmittel.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Betriebsmittel.js'),
+ 'showOnlyWithUid' => true
];
$result['groups'] = [
'title' => $this->p->t('stv', 'tab_groups'),
- 'component' => './Stv/Studentenverwaltung/Details/Gruppen.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Groups.js'),
+ 'showOnlyWithUid' => true
];
$result['messages'] = [
'title' => $this->p->t('stv', 'tab_messages'),
- 'component' => './Stv/Studentenverwaltung/Details/Messages.js'
+ '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,
@@ -127,29 +384,42 @@ class Config extends FHCAPI_Controller
$result['exam'] = [
'title' => $this->p->t('stv', 'tab_exam'),
- 'component' => './Stv/Studentenverwaltung/Details/Pruefung.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js'),
+ 'showOnlyWithUid' => true
];
$result['exemptions'] = [
'title' => $this->p->t('lehre', 'anrechnungen'),
- 'component' => './Stv/Studentenverwaltung/Details/Anrechnungen.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Anrechnungen.js'),
'config' => $config['exemptions']
];
$result['finalexam'] = [
'title' => $this->p->t('stv', 'tab_finalexam'),
- 'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung.js'),
+ 'showOnlyWithUid' => true,
'config' => $config['finalexam']
];
+ $result['projektarbeit'] = [
+ 'title' => $this->p->t('stv', 'tab_projektarbeit'),
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit.js'),
+ 'config' => array_merge(
+ $config['projektarbeit'],
+ ['showVertragsdetails' =>
+ defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') && FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN]
+ )
+ ];
+
$result['mobility'] = [
'title' => $this->p->t('stv', 'tab_mobility'),
- 'component' => './Stv/Studentenverwaltung/Details/Mobility.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Mobility.js'),
+ 'showOnlyWithUid' => true
];
$result['archive'] = [
'title' => $this->p->t('stv', 'tab_archive'),
- 'component' => './Stv/Studentenverwaltung/Details/Archiv.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Archiv.js'),
'config' => [
'showEdit' => $this->permissionlib->isBerechtigt('admin')
]
@@ -157,29 +427,33 @@ class Config extends FHCAPI_Controller
$result['jointstudies'] = [
'title' => $this->p->t('stv', 'tab_jointstudies'),
- 'component' => './Stv/Studentenverwaltung/Details/JointStudies.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/JointStudies.js'),
+ 'showOnlyWithUid' => true
];
$result['coursedates'] = [
'title' => $this->p->t('stv', 'tab_courseDates'),
- 'component' => './Stv/Studentenverwaltung/Details/Lehrveranstaltungstermine.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Lehrveranstaltungstermine.js')
];
$result['admissionDates'] = [
'title' => $this->p->t('stv', 'tab_admissionDates'),
- 'component' => './Stv/Studentenverwaltung/Details/Aufnahmetermine.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Aufnahmetermine.js')
];
$result['functions'] = [
'title' => $this->p->t('stv', 'tab_functions'),
- 'component' => './Stv/Studentenverwaltung/Details/Funktionen.js'
+ '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()
@@ -188,7 +462,7 @@ class Config extends FHCAPI_Controller
$config = $this->config->item('tabs');
$result['banking'] = [
'title' => $this->p->t('stv', 'tab_banking'),
- 'component' => './Stv/Studentenverwaltung/Details/Konto.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Konto.js'),
'config' => [
'showZahlungsbestaetigung' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN),
'showBuchungsnr' => $this->permissionlib->isBerechtigt('admin'),
@@ -198,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'),
@@ -211,22 +490,44 @@ class Config extends FHCAPI_Controller
];
$result['finalexam'] = [
'title' => $this->p->t('stv', 'tab_finalexam'),
- 'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung.js'),
+ 'showOnlyWithUid' => true,
'config' => $config['finalexam']
];
$result['archive'] = [
'title' => $this->p->t('stv', 'tab_archive'),
- 'component' => './Stv/Studentenverwaltung/Details/Archiv.js',
+ '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()
@@ -502,4 +803,34 @@ class Config extends FHCAPI_Controller
return $list;
}
+
+ /**
+ * Sort tab list
+ *
+ * @param array $input
+ * @param array $config
+ *
+ * @return array
+ */
+ protected function sortTabList($input, $config)
+ {
+ // prepare config
+ if (!$config || !is_array($config))
+ $config = [];
+ else
+ $config = array_flip($config);
+
+ // fill missing items in config
+ foreach (array_keys($input) as $key) {
+ if (!isset($config[$key]))
+ $config[$key] = count($config);
+ }
+
+ // do the sorting
+ uksort($input, function ($a, $b) use ($config) {
+ return $config[$a] - $config[$b];
+ });
+
+ return $input;
+ }
}
diff --git a/application/controllers/api/frontend/v1/stv/Dokumente.php b/application/controllers/api/frontend/v1/stv/Dokumente.php
index 18c976eb6..913a57dc4 100644
--- a/application/controllers/api/frontend/v1/stv/Dokumente.php
+++ b/application/controllers/api/frontend/v1/stv/Dokumente.php
@@ -2,6 +2,7 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
+use \CI3_Events as Events;
use \DateTime as DateTime;
class Dokumente extends FHCAPI_Controller
@@ -19,6 +20,8 @@ class Dokumente extends FHCAPI_Controller
'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
@@ -75,52 +78,32 @@ class Dokumente extends FHCAPI_Controller
$this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL);
$resultPreDoc = $this->_getPrestudentDokumente($prestudent_id);
-
- $arrayAccepted = [];
$person_id = $this->_getPersonId($prestudent_id);
- $docNames = array_map(function ($item) {
- return $item->dokument_kurzbz;
- }, $resultPreDoc);
+ $mergedArray = [];
- foreach($docNames as $doc)
+ foreach ($resultPreDoc as $pre)
{
- $result = $this->AkteModel->getAktenFAS($person_id, $doc, $studiengang_kz, $prestudent_id, true);
+ $result = $this->AkteModel->getAktenFAS($person_id, $pre->dokument_kurzbz, $studiengang_kz, $prestudent_id, true);
if (isError($result))
- {
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
- }
+
if (hasData($result))
{
- $data = getData($result);
- foreach ($data as $value)
+ foreach (getData($result) as $doc)
{
- array_push($arrayAccepted, $value);
+ $merged = clone $doc;
+ $merged->docdatum = $pre->docdatum;
+ $merged->insertvonma = $pre->insertvonma;
+ $merged->bezeichnung = $pre->bezeichnung;
+ $mergedArray[] = $merged;
}
}
- }
-
- //Mapping with document_kurzbz
- $preDocMap = [];
- foreach ($resultPreDoc as $pre) {
- $preDocMap[$pre->dokument_kurzbz] = $pre;
- }
-
- $mergedArray = [];
- foreach ($arrayAccepted as $doc) {
- $merged = clone $doc;
-
- if (isset($preDocMap[$doc->dokument_kurzbz])) {
- $merged->docdatum = $preDocMap[$doc->dokument_kurzbz]->docdatum;
- $merged->insertvonma = $preDocMap[$doc->dokument_kurzbz]->insertvonma;
- $merged->bezeichnung = $preDocMap[$doc->dokument_kurzbz]->bezeichnung;
- } else {
- $merged->akzeptiertdatum = null;
- $merged->akzeptiertvon = null;
+ else
+ {
+ $mergedArray[] = $pre;
}
-
- $mergedArray[] = $merged;
}
$this->terminateWithSuccess($mergedArray);
@@ -566,4 +549,426 @@ class Dokumente extends FHCAPI_Controller
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 b8fe6f3d7..951eb01a4 100644
--- a/application/controllers/api/frontend/v1/stv/Favorites.php
+++ b/application/controllers/api/frontend/v1/stv/Favorites.php
@@ -35,8 +35,6 @@ class Favorites extends FHCAPI_Controller
// Load models
$this->load->model('system/Variable_model', 'VariableModel');
-
- // TODO(chris): variable table might be to small to store favorites!
}
public function index()
diff --git a/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php b/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php
index 97dad48fd..8f3d6419a 100644
--- a/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php
+++ b/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php
@@ -83,7 +83,7 @@ class GemeinsameStudien extends FHCAPI_Controller
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
- $this->StudiensemesterModel->addOrder('studienjahr_kurzbz', 'DESC');
+ $this->StudiensemesterModel->addOrder('start', 'DESC');
$result = $this->StudiensemesterModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
diff --git a/application/controllers/api/frontend/v1/stv/Grades.php b/application/controllers/api/frontend/v1/stv/Grades.php
index dd8f53a27..128316d2b 100644
--- a/application/controllers/api/frontend/v1/stv/Grades.php
+++ b/application/controllers/api/frontend/v1/stv/Grades.php
@@ -60,7 +60,8 @@ class Grades extends FHCAPI_Controller
{
$this->load->model('codex/Note_model', 'NoteModel');
- $this->NoteModel->addOrder('note');
+ $this->NoteModel->addOrder('notenwert', 'ASC');
+ $this->NoteModel->addOrder('bezeichnung', 'ASC');
$result = $this->NoteModel->load();
diff --git a/application/controllers/api/frontend/v1/stv/Gruppen.php b/application/controllers/api/frontend/v1/stv/Gruppen.php
index c30816f2a..b10cfb328 100644
--- a/application/controllers/api/frontend/v1/stv/Gruppen.php
+++ b/application/controllers/api/frontend/v1/stv/Gruppen.php
@@ -9,6 +9,8 @@ class Gruppen extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
+ 'add' => ['admin:rw', 'assistenz:rw'],
+ 'search' => ['admin:r', 'assistenz:r'],
'getGruppen' => ['admin:r', 'assistenz:r'],
'deleteGruppe' => ['admin:rw', 'assistenz:rw'],
]);
@@ -18,7 +20,9 @@ class Gruppen extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
- 'ui', 'gruppenmanagement'
+ 'ui',
+ 'gruppenmanagement',
+ 'lehre'
]);
// Load models
@@ -26,15 +30,141 @@ class Gruppen extends FHCAPI_Controller
$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');
+ $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(
@@ -49,29 +179,48 @@ class Gruppen extends FHCAPI_Controller
public function deleteGruppe()
{
- $student_uid = $this->input->post('id');
+ $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(
- array(
- 'gruppe_kurzbz' => $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)
+ if ($generation->generiert)
{
$this->terminateWithError($this->p->t('gruppenmanagement', 'error_deleteGeneratedGroups'), self::ERROR_TYPE_GENERAL);
}
- $result = $this->BenutzergruppeModel->delete(
- array(
- 'gruppe_kurzbz' => $gruppe_kurzbz,
- 'uid' => $student_uid
- )
- );
+ $result = $this->BenutzergruppeModel->delete([
+ 'gruppe_kurzbz' => $gruppe_kurzbz,
+ 'uid' => $uid
+ ]);
$data = $this->getDataOrTerminateWithError($result);
diff --git a/application/controllers/api/frontend/v1/stv/Kontakt.php b/application/controllers/api/frontend/v1/stv/Kontakt.php
index 9b713b5f9..d246a04d9 100644
--- a/application/controllers/api/frontend/v1/stv/Kontakt.php
+++ b/application/controllers/api/frontend/v1/stv/Kontakt.php
@@ -52,6 +52,7 @@ class Kontakt extends FHCAPI_Controller
// Extra Permissionchecks
$permsMa = [];
$permsStud = [];
+ $permsDefault = null;
switch ($this->router->method) {
case 'getBankverbindung':
case 'loadBankverbindung':
@@ -68,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':
@@ -76,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'
@@ -91,7 +92,7 @@ class Kontakt extends FHCAPI_Controller
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);
+ $this->checkPermissionsForPerson($person_id, $permsMa, $permsStud, $permsDefault);
} elseif ($this->router->method == 'loadAddress'
|| $this->router->method == 'loadContact'
|| $this->router->method == 'loadBankverbindung'
@@ -135,7 +136,7 @@ class Kontakt extends FHCAPI_Controller
$person_id = current($data)->person_id;
- $this->checkPermissionsForPerson($person_id, $permsMa, $permsStud);
+ $this->checkPermissionsForPerson($person_id, $permsMa, $permsStud, $permsDefault);
}
}
public function getAdressen($person_id)
@@ -434,7 +435,10 @@ class Kontakt extends FHCAPI_Controller
$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))
@@ -442,20 +446,18 @@ class Kontakt extends FHCAPI_Controller
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess((getData($result) ?: []));
+
}
public function getKontakttypen()
{
$this->load->model('person/Kontakttyp_model', 'KontakttypModel');
+ $this->KontakttypModel->addOrder('beschreibung', 'ASC');
+ $result = $this->KontakttypModel->loadWhere(array('kontakttyp !=' => 'hidden'));
- $result = $this->KontakttypModel->load();
- if (isError($result)) {
- $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
- else
- {
- $this->terminateWithSuccess(getData($result) ?: []);
- }
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
}
public function loadContact()
diff --git a/application/controllers/api/frontend/v1/stv/Konto.php b/application/controllers/api/frontend/v1/stv/Konto.php
index a33680ea0..d59bc76b0 100644
--- a/application/controllers/api/frontend/v1/stv/Konto.php
+++ b/application/controllers/api/frontend/v1/stv/Konto.php
@@ -48,7 +48,8 @@ class Konto extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
- 'konto'
+ 'konto',
+ 'lehre'
]);
}
@@ -112,7 +113,7 @@ class Konto extends FHCAPI_Controller
*
* @return void
*/
- public function getBuchungstypen()
+ public function getBuchungstypen($studiensemester_kurzbz = null)
{
$this->load->model('crm/Buchungstyp_model', 'BuchungstypModel');
@@ -122,6 +123,7 @@ class Konto extends FHCAPI_Controller
$data = $this->getDataOrTerminateWithError($result);
+ $this->_getOEHBeitrag($data, $studiensemester_kurzbz);
$this->terminateWithSuccess($data);
}
@@ -239,7 +241,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 = [];
@@ -352,7 +354,7 @@ class Konto extends FHCAPI_Controller
continue;
}
-
+
$result = $this->KontoModel->insert([
'person_id' => $buchung['person_id'],
'studiengang_kz' => $buchung['studiengang_kz'],
@@ -361,7 +363,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'],
@@ -494,4 +496,43 @@ class Konto extends FHCAPI_Controller
$this->terminateWithSuccess();
}
+
+ private function _getOEHBeitrag(&$data, $studiensemester_kurzbz = null)
+ {
+ if (is_null($studiensemester_kurzbz))
+ {
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+ $studiensemester_akt = $this->variablelib->getVar('semester_aktuell');
+ }
+ else
+ {
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ if ($this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
+ $studiensemester_akt = $studiensemester_kurzbz;
+ else
+ $this->terminateWithError($this->p->t('lehre', 'error_noStudiensemester'));
+ }
+
+ $this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel');
+ $oehBeitrag = $this->OehbeitragModel->getByStudiensemester($studiensemester_akt);
+
+ $oehStandardbetrag = null;
+ if (hasData($oehBeitrag))
+ {
+ $oeh = getData($oehBeitrag)[0];
+ $summe = ($oeh->studierendenbeitrag + $oeh->versicherung) * -1;
+ $oehStandardbetrag = number_format((float)$summe, 2, '.', '');
+ }
+
+ if ($oehStandardbetrag !== null)
+ {
+ $data = array_map(function ($buchungstyp) use ($oehStandardbetrag) {
+ if (isset($buchungstyp->buchungstyp_kurzbz) && (strtolower($buchungstyp->buchungstyp_kurzbz) === 'oeh'))
+ {
+ $buchungstyp->standardbetrag = $oehStandardbetrag;
+ }
+ return $buchungstyp;
+ }, $data);
+ }
+ }
}
diff --git a/application/controllers/api/frontend/v1/stv/Lehrverband.php b/application/controllers/api/frontend/v1/stv/Lehrverband.php
new file mode 100644
index 000000000..72610dd63
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Lehrverband.php
@@ -0,0 +1,63 @@
+ ['admin:r', 'assistenz:r'],
+ 'getTree' => ['admin:r', 'assistenz:r'],
+ 'getSpecialgroups' => ['admin:r', 'assistenz:r']
+ ]);
+ }
+
+ public function hasOrgforms($studiengang_kz)
+ {
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $result = $this->StudiengangModel->load($studiengang_kz);
+
+ $data = $this->getDataOrTerminateWithError($result);
+ if ($data) {
+ $data = current($data)->mischform;
+ }
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getTree($studiengang_kz)
+ {
+ $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
+
+ $result = $this->LehrverbandModel->loadWhere([
+ 'studiengang_kz' => $studiengang_kz,
+ 'aktiv' => true
+ ]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getSpecialgroups($studiengang_kz)
+ {
+ $this->load->model('organisation/Gruppe_model', 'GruppeModel');
+
+ $where = [
+ 'studiengang_kz' => $studiengang_kz,
+ 'lehre' => true,
+ 'sichtbar' => true,
+ 'aktiv' => true,
+ 'direktinskription' => false
+ ];
+
+ $result = $this->GruppeModel->loadWhere($where);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/stv/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 4d0aa5fe1..d8c8d1ff2 100644
--- a/application/controllers/api/frontend/v1/stv/Prestudent.php
+++ b/application/controllers/api/frontend/v1/stv/Prestudent.php
@@ -43,7 +43,7 @@ class Prestudent extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
- 'ui', 'studierendenantrag', 'lehre'
+ 'ui', 'studierendenantrag', 'lehre', 'global'
]);
}
@@ -98,11 +98,9 @@ class Prestudent extends FHCAPI_Controller
'person_id',
'berufstaetigkeit_code',
'ausbildungcode',
- 'zgv_code',
'zgvort',
'zgvdatum',
'zgvnation',
- 'zgvmas_code',
'zgvmaort',
'zgvmadatum',
'zgvmanation',
@@ -110,7 +108,6 @@ class Prestudent extends FHCAPI_Controller
'bismelden',
'anmerkung',
'dual',
- 'zgvdoktor_code',
'zgvdoktorort',
'zgvdoktordatum',
'zgvdoktornation',
@@ -125,6 +122,57 @@ class Prestudent extends FHCAPI_Controller
'standort_code'
];
+ // add zgv code fields only if user has permission
+ $this->load->library('PermissionLib');
+ $prestudentres = $this->PrestudentModel->load($prestudent_id);
+ if(!hasData($prestudentres))
+ {
+ $this->terminateWithError($this->p->t('ui', 'error_fieldNotFound', ['field' => 'Prestudent ' . $prestudent_id]));
+ }
+ $prestudent = (getData($prestudentres))[0];
+ $bakkZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array();
+ $makkZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array();
+ $dokZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array();
+
+ if(in_array($prestudent->studiengang_kz, $bakkZgvStg))
+ {
+ $array_allowed_props_prestudent[] = 'zgv_code';
+ }
+ else if(!is_null($this->input->post('zgv_code')))
+ {
+ $this->terminateWithError(
+ $this->p->t('global', 'zgv')
+ . ' - ' .
+ $this->p->t('ui', 'error_keineBerechtigungStg')
+ );
+ }
+
+ if(in_array($prestudent->studiengang_kz, $makkZgvStg))
+ {
+ $array_allowed_props_prestudent[] = 'zgvmas_code';
+ }
+ else if(!is_null($this->input->post('zgvmas_code')))
+ {
+ $this->terminateWithError(
+ $this->p->t('lehre', 'zgvMaster')
+ . ' - ' .
+ $this->p->t('ui', 'error_keineBerechtigungStg')
+ );
+ }
+
+ if(in_array($prestudent->studiengang_kz, $dokZgvStg))
+ {
+ $array_allowed_props_prestudent[] = 'zgvdoktor_code';
+ }
+ else if(!is_null($this->input->post('zgvdoktor_code')))
+ {
+ $this->terminateWithError(
+ $this->p->t('lehre', 'zgvDoktor')
+ . ' - ' .
+ $this->p->t('ui', 'error_keineBerechtigungStg')
+ );
+ }
+
// add UDFs
$result = $this->udflib->getDefinitionForModel($this->PrestudentModel);
@@ -138,13 +186,24 @@ class Prestudent extends FHCAPI_Controller
{
$val = $this->input->post($prop, true);
- if ($val !== null || $prop === 'foerderrelevant') {
+ 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, ['zgvdatum', 'zgvmadatum', 'zgvdoktordatum', 'zgv_code', 'zgvmas_code', 'zgvdoktor_code'])
+ in_array($prop, ['foerderrelevant', 'zgvdatum', 'zgvmadatum', 'zgvdoktordatum', 'zgv_code', 'zgvmas_code', 'zgvdoktor_code'])
&& !isset($update_prestudent[$prop])
&& array_key_exists($prop, $_POST)
)
diff --git a/application/controllers/api/frontend/v1/stv/Projektarbeit.php b/application/controllers/api/frontend/v1/stv/Projektarbeit.php
new file mode 100644
index 000000000..8740ef3d6
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Projektarbeit.php
@@ -0,0 +1,413 @@
+ ['admin:r', 'assistenz:r'],
+ 'loadProjektarbeit' => ['admin:r', 'assistenz:r'],
+ 'insertProjektarbeit' => ['admin:rw', 'assistenz:rw'],
+ 'updateProjektarbeit' => ['admin:rw', 'assistenz:rw'],
+ 'deleteProjektarbeit' => ['admin:rw', 'assistenz:rw'],
+ 'getTypenProjektarbeit' => ['admin:r', 'assistenz:r'],
+ 'getFirmen' => ['admin:r', 'assistenz:r'],
+ 'getLehrveranstaltungen' => ['admin:r', 'assistenz:r'],
+ 'getNoten' => ['admin:r', 'assistenz:r'],
+ 'getStudiensemester' => ['admin:r', 'assistenz:r']
+ ]);
+
+ // Load Libraries
+ $this->load->library('form_validation');
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui',
+ 'person',
+ 'projektarbeit'
+ ]);
+
+ // Load models
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $this->load->model('education/Projekttyp_model', 'ProjekttypModel');
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+ $this->load->model('ressource/Firma_model', 'FirmaModel');
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+ $this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
+ $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
+ $this->load->model('education/Note_model', 'NoteModel');
+ $this->load->model('education/Projektbetreuer_model', 'BetreuerModel');
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ // load libraries
+ $this->load->library('PermissionLib');
+ }
+
+ /**
+ * Get projekt works for a uid.
+ */
+ public function getProjektarbeit()
+ {
+ $student_uid = $this->input->get('uid');
+
+ if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->ProjektarbeitModel->getProjektarbeit($student_uid);
+
+ if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ if (!hasData($result)) $this->terminateWithSuccess([]);
+
+ $projektarbeiten = getData($result);
+
+ foreach ($projektarbeiten as $projektarbeit)
+ {
+ $projektarbeit_id = $projektarbeit->projektarbeit_id;
+ $abgabeRes = $this->PaabgabeModel->getEndabgabe($projektarbeit_id);
+
+ if (isError($abgabeRes)) $this->terminateWithError(getError($abgabeRes), self::ERROR_TYPE_GENERAL);
+
+ if (hasData($abgabeRes))
+ {
+ $paabgabe = getData($abgabeRes)[0];
+ $projektarbeit->abgabedatum = $paabgabe->abgabedatum;
+ }
+ }
+
+ $this->terminateWithSuccess($projektarbeiten);
+ }
+
+ /**
+ * Load a single Projektarbeit by id.
+ */
+ public function loadProjektarbeit()
+ {
+ $projektarbeit_id = $this->input->get('projektarbeit_id');
+
+ if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id)) return $this->terminateWithError('Projektarbeit Id missing', self::ERROR_TYPE_GENERAL);
+
+ $this->ProjektarbeitModel->addSelect(
+ 'lehre.tbl_projektarbeit.projektarbeit_id, titel, titel_english, themenbereich, projekttyp_kurzbz, lehrveranstaltung_id, lehreinheit_id,
+ firma_id, beginn, ende, gesperrtbis, note, final, freigegeben, tbl_projektarbeit.anmerkung, fa.name AS firma_name'
+ );
+ $this->ProjektarbeitModel->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
+ $this->ProjektarbeitModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
+ $this->ProjektarbeitModel->addJoin('public.tbl_firma fa', 'firma_id', 'LEFT');
+ $result = $this->ProjektarbeitModel->loadWhere(
+ array('projektarbeit_id' => $projektarbeit_id)
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(current($data));
+ }
+
+ /**
+ * Inwert a Projektarbeit.
+ */
+ public function insertProjektarbeit()
+ {
+ $student_uid = $this->input->post('uid');
+
+ if (!$student_uid) return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
+
+ if (!$this->_hasBerechtigungForStudent($student_uid))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
+
+ $formData = $this->input->post('formData');
+
+ if ($this->_validate($formData) == false)
+ {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }
+
+ $projektarbeit = $this->_getProjektarbeitArr($formData);
+
+ $result = $this->ProjektarbeitModel->insert(
+ array_merge($projektarbeit, ['insertamum' => date('c'), 'insertvon' => getAuthUID(), 'student_uid' => $student_uid])
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ /**
+ * Update a Projektarbeit by ID.
+ */
+ public function updateProjektarbeit()
+ {
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+
+ if (!$projektarbeit_id || !is_numeric($projektarbeit_id))
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL);
+
+ if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
+
+ $formData = $this->input->post('formData');
+
+ if ($this->_validate($formData) == false)
+ {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }
+
+ $projektarbeit = $this->_getProjektarbeitArr($formData);
+
+ $result = $this->ProjektarbeitModel->update(
+ $projektarbeit_id,
+ array_merge($projektarbeit, ['updateamum' => date('c'), 'updatevon' => getAuthUID()])
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ /**
+ * Delete Projektarbeit by ID after validation.
+ */
+ public function deleteProjektarbeit()
+ {
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+
+ if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id))
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID'], self::ERROR_TYPE_GENERAL));
+
+ if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
+
+ $validate = $this->_validateDelete($projektarbeit_id);
+
+ if (isError($validate)) return $this->terminateWithError(getError($validate), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->ProjektarbeitModel->delete(
+ ['projektarbeit_id' => $projektarbeit_id]
+ );
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ if (!hasData($result))
+ {
+ $this->outputJson($result);
+ }
+
+ return $this->terminateWithSuccess(current(getData($result)) ? : null);
+ }
+
+ /**
+ * Get all active projekt work types.
+ */
+ public function getTypenProjektarbeit()
+ {
+ $result = $this->ProjekttypModel->loadWhere(['aktiv' => true]);
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ /**
+ * Gets companies by search string.
+ */
+ public function getFirmen()
+ {
+ $searchString = $this->input->get('searchString');
+
+ if (!isset($searchString))
+ $this->terminateWithError($this->p->t('ui', 'error_fieldRequired', ['field' => 'Search term']), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->FirmaModel->searchFirmen($searchString, $aktiv = true);
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ /**
+ * Get Lehrveranstaltungen by params, incling lehreinheiten for a specific Studiensemester..
+ */
+ public function getLehrveranstaltungen()
+ {
+ $student_uid = $this->input->get('student_uid');
+ $studiengang_kz = $this->input->get('studiengang_kz');
+ $studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz');
+ $additional_lehrveranstaltung_id = $this->input->get('additional_lehrveranstaltung_id');
+
+ if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
+ if (!isset($studiensemester_kurzbz)) $this->terminateWithError('Studiensemster missing', self::ERROR_TYPE_GENERAL);
+
+ // get Lvs
+ $lvsResult = $this->LehrveranstaltungModel->getLvsForProjektarbeit($student_uid, $studiengang_kz, $additional_lehrveranstaltung_id);
+
+ if (isError($lvsResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL);
+
+ $lvs = hasData($lvsResult) ? getData($lvsResult) : [];
+
+ foreach ($lvs as $lv)
+ {
+ // add Lehreinheiten for each Lv for the semester
+ $lehreinheiten = $this->LehreinheitModel->getLesForLv(
+ $lv->lehrveranstaltung_id, $studiensemester_kurzbz
+ );
+
+ foreach ($lehreinheiten as $lehreinheit)
+ {
+ if (!isEmptyArray($lehreinheit->lektoren))
+ {
+ $this->MitarbeiterModel->addSelect('kurzbz');
+ $this->MitarbeiterModel->db->where_in('tbl_mitarbeiter.mitarbeiter_uid', $lehreinheit->lektoren);
+ $maResult = $this->MitarbeiterModel->load();
+
+ if (isError($maResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL);
+
+ $lehreinheit->lektoren = array_column(getData($maResult), 'kurzbz');
+ }
+ }
+
+ $lv->lehreinheiten = $lehreinheiten;
+ }
+
+ return $this->terminateWithSuccess($lvs);
+ }
+
+ /**
+ * Get all noten.
+ */
+ public function getNoten()
+ {
+ $this->NoteModel->addOrder('notenwert', 'ASC');
+ $this->NoteModel->addOrder('bezeichnung', 'ASC');
+
+ $result = $this->NoteModel->load();
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ /**
+ * Get all Studiensemester, sorted.
+ */
+ public function getStudiensemester()
+ {
+ $this->StudiensemesterModel->addOrder('start', 'DESC');
+ $result = $this->StudiensemesterModel->load();
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ /**
+ * Validate Projektarbeit data.
+ * @param formData
+ * @return bool true if data valid
+ */
+ private function _validate($formData)
+ {
+ $this->form_validation->set_data($formData);
+
+ $this->form_validation->set_rules('projekttyp_kurzbz', 'Projekttyp', 'required', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Projekttyp'])
+ ]);
+
+ $this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'required|is_natural', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehreinheit']),
+ 'is_natural' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit'])
+ ]);
+
+ $this->form_validation->set_rules('beginn', 'Beginn', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Beginn'])
+ ]);
+
+ $this->form_validation->set_rules('ende', 'Ende', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Ende'])
+ ]);
+
+ $this->form_validation->set_rules('gesperrtbis', 'Ende', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Gesperrt bis'])
+ ]);
+
+ return $this->form_validation->run();
+ }
+
+ /**
+ * Extract Projektarbeit data from passed form data.
+ * @param formData
+ * @return array
+ */
+ private function _getProjektarbeitArr($formData)
+ {
+ return [
+ 'titel' => $formData['titel'],
+ 'titel_english' => $formData['titel_english'] ?? null,
+ 'themenbereich' => $formData['themenbereich'] ?? null,
+ 'projekttyp_kurzbz' => $formData['projekttyp_kurzbz'],
+ 'firma_id' => $formData['firma_id'] ?? null,
+ 'lehreinheit_id' => $formData['lehreinheit_id'],
+ 'beginn' => isset($formData['beginn']) && !isEmptyString($formData['beginn']) ? $formData['beginn'] : null,
+ 'ende' => isset($formData['ende']) && !isEmptyString($formData['ende']) ? $formData['ende'] : null,
+ 'note' => $formData['note'] ?? null,
+ 'final' => $formData['final'] ?? null,
+ 'freigegeben' => $formData['freigegeben'] ?? null,
+ 'anmerkung' => $formData['anmerkung'] ?? null,
+ 'gesperrtbis' => isset($formData['gesperrtbis']) && !isEmptyString($formData['gesperrtbis']) ? $formData['gesperrtbis'] : null
+ ];
+ }
+
+ /**
+ * Check if deletion of a Projektarbeit is possible.
+ * @param $projektarbeit_id
+ * @return object success if deletion possible, error otherwise.
+ */
+ private function _validateDelete($projektarbeit_id)
+ {
+ $this->BetreuerModel->addSelect('1');
+ $result = $this->BetreuerModel->loadWhere(['projektarbeit_id' => $projektarbeit_id]);
+
+ if (isError($result)) return $result;
+
+ if (hasData($result)) return error($this->p->t('projektarbeit', 'error_betreuerNichtGeloescht'));
+
+ $this->PaabgabeModel->addSelect('1');
+ $result = $this->PaabgabeModel->loadWhere(['projektarbeit_id' => $projektarbeit_id]);
+
+ if (isError($result)) return $result;
+
+ if (hasData($result)) return error($this->p->t('projektarbeit', 'error_paabgabeNichtGeloescht'));
+
+ return success();
+ }
+
+ /**
+ * Checks permissions for a student.
+ * @param $student_uid
+ * @return bool true if authorized
+ */
+ private function _hasBerechtigungForStudent($student_uid)
+ {
+ if (!$student_uid)
+ return false;
+
+ $this->load->model('crm/Student_model', 'StudentModel');
+
+ $this->StudentModel->addSelect('studiengang_kz');
+ $result = $this->StudentModel->load([$student_uid]);
+ if (isError($result) || !hasData($result))
+ return false;
+
+ $studiengang_kz = getData($result)[0]->studiengang_kz;
+
+ if ($this->permissionlib->isBerechtigt('admin', 'suid', $studiengang_kz))
+ return true;
+ if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $studiengang_kz))
+ return true;
+
+ return false;
+ }
+}
diff --git a/application/controllers/api/frontend/v1/stv/Projektbetreuer.php b/application/controllers/api/frontend/v1/stv/Projektbetreuer.php
new file mode 100644
index 000000000..904fa6167
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Projektbetreuer.php
@@ -0,0 +1,435 @@
+ ['admin:r', 'assistenz:r'],
+ 'saveProjektbetreuer' => ['admin:rw', 'assistenz:rw'],
+ 'deleteProjektbetreuer' => ['admin:rw', 'assistenz:rw'],
+ 'getBetreuerarten' => ['admin:r', 'assistenz:r'],
+ 'getNoten' => ['admin:r', 'assistenz:r'],
+ 'getDefaultStundensaetze' => ['admin:r', 'assistenz:r'],
+ 'getProjektbetreuerBySearchQuery' => ['admin:r', 'assistenz:r'],
+ 'getPerson' => ['admin:r', 'assistenz:r'],
+ 'validateProjektbetreuer' => ['admin:r', 'assistenz:r']
+ ]);
+
+ // Load Libraries
+ $this->load->library('form_validation');
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui',
+ 'person',
+ 'projektarbeit'
+ ]);
+
+ // Load models
+ $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
+ $this->load->model('education/Betreuerart_model', 'BetreuerartModel');
+ $this->load->model('ressource/Stundensatz_model', 'StundensatzModel');
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $this->load->model('education/Note_model', 'NoteModel');
+ $this->load->model('person/Person_model', 'PersonModel');
+
+ // load libraries
+ $this->load->library('PermissionLib');
+ }
+
+ /**
+ * Gets Projektbetreuer data for a Projektarbeit.
+ */
+ public function getProjektbetreuer()
+ {
+ $projektarbeit_id = $this->input->get('projektarbeit_id');
+
+ if (!isset($projektarbeit_id))
+ $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL);
+
+ $qry = "
+ SELECT * FROM (
+ SELECT
+ projektarbeit_id, person_id, nachname, vorname, note, punkte, round(stunden, 1) AS stunden,
+ stundensatz, betreuerart_kurzbz, vertrag_id, titelpre, titelpost,
+ CASE
+ WHEN EXISTS
+ (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=pers.person_id)
+ THEN 'Mitarbeiter'
+ WHEN EXISTS
+ (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=pers.person_id)
+ THEN 'Student'
+ ELSE 'Person'
+ END AS status
+ FROM
+ lehre.tbl_projektbetreuer
+ JOIN public.tbl_person pers USING (person_id)
+ WHERE
+ projektarbeit_id = ?
+ ) betreuer
+ ORDER BY
+ CASE WHEN status = 'Mitarbeiter' THEN 0 WHEN status = 'Person' THEN 1 ELSE 2 END";
+
+ $result = $this->ProjektbetreuerModel->execReadOnlyQuery($qry, [$projektarbeit_id]);
+
+ if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ if (!hasData($result)) $this->terminateWithSuccess([]);
+
+ $projektbetreuer = getData($result);
+
+ //~ foreach ($projektbetreuer as $projektarbeit)
+ //~ {
+ //~ $projektarbeit_id = $projektarbeit->projektarbeit_id;
+ //~ $abgabeRes = $this->PaabgabeModel->getEndabgabe($projektarbeit_id);
+
+ //~ if (isError($abgabeRes)) $this->terminateWithError(getError($abgabeRes), self::ERROR_TYPE_GENERAL);
+
+ //~ if (hasData($abgabeRes))
+ //~ {
+ //~ $paabgabe = getData($abgabeRes)[0];
+ //~ $projektarbeit->abgabedatum = $paabgabe->abgabedatum;
+ //~ }
+ //~ }
+
+ // add thesis download link (from external extension)
+ foreach ($projektbetreuer as $pb)
+ {
+ $downloadLink = null;
+ Events::trigger(
+ 'projektbeurteilung_download_link',
+ $pb->projektarbeit_id,
+ $pb->betreuerart_kurzbz,
+ $pb->person_id,
+ function ($value) use (&$downloadLink) {
+ $downloadLink = $value;
+ }
+ );
+ $pb->beurteilungDownloadLink = $downloadLink;
+ }
+
+ $this->terminateWithSuccess($this->_addFullNameToBetreuer($projektbetreuer));
+ }
+
+ /**
+ * Saves (adds or updates) a single Projektbetreuer for a Projektarbeit.
+ */
+ public function saveProjektbetreuer()
+ {
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+
+ if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id))
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL);
+
+ if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
+
+ $projektbetreuer = $this->input->post('projektbetreuer');
+
+ if ($this->_validate($projektbetreuer) == false) $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ // check if assessor has already been assigned
+ if (isset($projektbetreuer['person_id']))
+ {
+ $this->ProjektbetreuerModel->addSelect('1');
+ $betreuerRes = $this->ProjektbetreuerModel->loadWhere(
+ [
+ 'person_id' => $projektbetreuer['person_id'],
+ 'projektarbeit_id' => $projektbetreuer['projektarbeit_id'],
+ 'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz']
+ ]
+ );
+
+ if (hasData($betreuerRes)
+ && (!isset($projektbetreuer['person_id_old']) || $projektbetreuer['person_id'] != $projektbetreuer['person_id_old'])) {
+ return $this->terminateWithError($this->p->t('projektarbeit', 'betreuerZugewiesen'), self::ERROR_TYPE_GENERAL);
+ }
+ }
+
+ $result = null;
+
+ $stunden = isset($projektbetreuer['stunden']) && !isEmptyString($projektbetreuer['stunden']) ? $projektbetreuer['stunden'] : null;
+ $stundensatz =
+ isset($projektbetreuer['stundensatz']) && !isEmptyString($projektbetreuer['stundensatz']) ? $projektbetreuer['stundensatz'] : null;
+
+ $betreuer = [
+ 'projektarbeit_id' => $projektarbeit_id,
+ 'person_id' => $projektbetreuer['person_id'],
+ 'note' => $projektbetreuer['note'],
+ 'stunden' => $stunden,
+ 'stundensatz' => $stundensatz,
+ 'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz']
+ ];
+
+ if (isset($projektbetreuer['person_id_old']) && isset($projektbetreuer['betreuerart_kurzbz_old']))
+ {
+ $result = $this->ProjektbetreuerModel->update(
+ [
+ 'projektarbeit_id' => $projektarbeit_id,
+ 'person_id' => $projektbetreuer['person_id_old'],
+ 'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz_old']
+ ],
+ array_merge($betreuer, ['updateamum' => date('c'), 'updatevon' => getAuthUID()])
+ );
+ }
+ else
+ {
+ $result = $this->ProjektbetreuerModel->insert(
+ array_merge($betreuer, ['insertamum' => date('c'), 'insertvon' => getAuthUID()])
+ );
+ }
+
+ if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ /**
+ * Delete a Projektbetreuer assignment to a Projektarbeit.
+ */
+ public function deleteProjektbetreuer()
+ {
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+ $person_id = $this->input->post('person_id');
+ $betreuerart_kurzbz = $this->input->post('betreuerart_kurzbz');
+
+ if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id))
+ {
+ return $this->terminateWithError(
+ $this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'projektarbeit').' ID'], self::ERROR_TYPE_GENERAL)
+ );
+ }
+
+ if (!isset($person_id) || !is_numeric($person_id))
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID'], self::ERROR_TYPE_GENERAL));
+
+ if (!isset($betreuerart_kurzbz))
+ {
+ return $this->terminateWithError(
+ $this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'betreuerart')], self::ERROR_TYPE_GENERAL)
+ );
+ }
+
+ // check permission
+ if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
+
+ $validate = $this->_validateDelete($projektarbeit_id, $person_id, $betreuerart_kurzbz);
+
+ if (isError($validate)) return $this->terminateWithError(getError($validate), self::ERROR_TYPE_GENERAL);
+
+ // check if there is a Projektarbeitsbeurteilung - if yes, it is handled (possibly deleted) by external extension.
+ $beurteilungDeleteSuccess = true;
+
+ Events::trigger(
+ 'projektarbeitsbeurteilung_delete',
+ $projektarbeit_id,
+ function ($value) use (&$beurteilungDeleteSuccess) {
+ $beurteilungDeleteSuccess = $value;
+ }
+ );
+
+ // if there is still a Beurteilung, Projektarbeit cannot be deleted - return with error
+ if (!$beurteilungDeleteSuccess) return $this->terminateWithError($this->p->t('projektarbeit', 'error_paarbeitHatBeurteilung'));
+
+ $result = $this->ProjektbetreuerModel->delete(
+ ['projektarbeit_id' => $projektarbeit_id, 'person_id' => $person_id, 'betreuerart_kurzbz' => $betreuerart_kurzbz]
+ );
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ if (!hasData($result))
+ {
+ $this->outputJson($result);
+ }
+
+ return $this->terminateWithSuccess(getData($result));
+ }
+
+ /**
+ * Get all active Betreuerarten.
+ */
+ public function getBetreuerarten()
+ {
+ $result = $this->BetreuerartModel->loadWhere(['aktiv' => true]);
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ /**
+ * Get all Noten.
+ */
+ public function getNoten()
+ {
+ $result = $this->NoteModel->load();
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ /**
+ * Get default Stundensätze for an employee in a semester.
+ */
+ public function getDefaultStundensaetze()
+ {
+ $person_id = $this->input->get('person_id');
+ $studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz');
+
+ $result = $this->StundensatzModel->getStundensatzForMitarbeiter($person_id, $studiensemester_kurzbz);
+
+ return $this->terminateWithSuccess($result);
+ }
+
+ /**
+ * Get all Projektbetreuer by search string.
+ */
+ public function getProjektbetreuerBySearchQuery()
+ {
+ $searchString = $this->input->get('searchString');
+
+ if (!isset($searchString))
+ $this->terminateWithError($this->p->t('ui', 'error_fieldRequired', ['field' => 'Search term']), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->PersonModel->searchPerson($searchString);
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ if (!hasData($result)) $this->terminateWithSuccess([]);
+
+ $persons = $this->_addFullNameToBetreuer(getData($result));
+
+ // sort persons by type (employees first)
+ usort($persons, function ($a, $b) {
+ $statusRanks = ['Mitarbeiter' => 0, 'Person' => 1, 'Student' => 2];
+ return (isset($statusRanks[$a->status]) ? $statusRanks[$a->status] : count($statusRanks) + 1)
+ - (isset($statusRanks[$b->status]) ? $statusRanks[$b->status] : count($statusRanks) + 1);
+ });
+
+ return $this->terminateWithSuccess($persons);
+ }
+
+ /**
+ * Get person info by Id.
+ */
+ public function getPerson()
+ {
+ $person_id = $this->input->get('person_id');
+
+ if (!isset($person_id))
+ $this->terminateWithError($this->p->t('ui', 'error_fieldRequired', ['field' => 'Person']), self::ERROR_TYPE_GENERAL);
+
+ $this->PersonModel->addSelect("CASE
+ WHEN EXISTS
+ (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=tbl_person.person_id)
+ THEN 'Mitarbeiter'
+ WHEN EXISTS
+ (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=tbl_person.person_id)
+ THEN 'Student'
+ ELSE 'Person'
+ END AS status");
+ $result = $this->PersonModel->addSelect('titelpre, titelpost, vorname, nachname, person_id');
+ $result = $this->PersonModel->load($person_id);
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? $this->_addFullNameToBetreuer(getData($result))[0] : []);
+ }
+
+ /**
+ * Validate list of Projektbetreuer.
+ */
+ public function validateProjektbetreuer()
+ {
+ $projektbetreuerArr = $this->input->post('projektbetreuer');
+
+ if (!is_array($projektbetreuerArr)) $projektbetreuerArr = [$projektbetreuerArr];
+
+ foreach ($projektbetreuerArr as $pb)
+ {
+ if ($this->_validate($pb) == false)
+ {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }
+ }
+
+ $this->terminateWithSuccess([]);
+ }
+
+ /**
+ * Validation funciton for checking Projektbetreuer input.
+ * @param $formData Betreuer data
+ * @return bool true when data is valid
+ */
+ private function _validate($formData)
+ {
+ $this->form_validation->set_data($formData);
+
+ $this->form_validation->set_rules('betreuerart_kurzbz', 'Betreuerart', 'required', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('projektarbeit', 'betreuerart')])
+ ]);
+
+ $this->form_validation->set_rules('person_id', 'Person', 'required', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('projektarbeit', 'betreuer')])
+ ]);
+
+ $this->form_validation->set_rules('stunden', 'Stunden', 'numeric', [
+ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => $this->p->t('projektarbeit', 'stunden')])
+ ]);
+
+ $this->form_validation->set_rules('stundensatz', 'Stundensatz', 'numeric', [
+ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => $this->p->t('projektarbeit', 'stundensatz')])
+ ]);
+
+
+ return $this->form_validation->run();
+ }
+
+ /**
+ * Check possibility of deletion of a Projektbetreuer.
+ * @param projektarbeit_id
+ * @param person_id
+ * @param betreuerart_kurzbz
+ * @return object success when delete possible, error otherwise
+ */
+ private function _validateDelete($projektarbeit_id, $person_id, $betreuerart_kurzbz)
+ {
+ // check if contract exists
+ $this->ProjektbetreuerModel->addSelect('vertrag_id');
+ $result = $this->ProjektbetreuerModel->loadWhere(
+ ['projektarbeit_id' => $projektarbeit_id, 'person_id' => $person_id, 'betreuerart_kurzbz' => $betreuerart_kurzbz]
+ );
+
+ if (isError($result)) return $result;
+
+ // if contract exists, no deletion is possible
+ if (hasData($result) && getData($result)[0]->vertrag_id != null) return error($this->p->t('projektarbeit', 'error_betreuerHatVertrag'));
+
+ return success();
+ }
+
+ /**
+ * Add full name to array with Betreuer.
+ * @param $betreuerArr
+ * @return array including Betreuer with their full names
+ */
+ private function _addFullNameToBetreuer($betreuerArr)
+ {
+ foreach ($betreuerArr as $betreuer)
+ {
+ $betreuer->name = ($betreuer->titelpre ? $betreuer->titelpre . ' ' : '') .
+ $betreuer->nachname . ' ' . $betreuer->vorname . ($betreuer->titelpost ? ' ' . $betreuer->titelpre : '').
+ ' (' . $betreuer->status . ')';
+ }
+
+ return $betreuerArr;
+ }
+}
diff --git a/application/controllers/api/frontend/v1/stv/Pruefung.php b/application/controllers/api/frontend/v1/stv/Pruefung.php
index e205c85b8..4521c2033 100644
--- a/application/controllers/api/frontend/v1/stv/Pruefung.php
+++ b/application/controllers/api/frontend/v1/stv/Pruefung.php
@@ -18,6 +18,8 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
+use \DateTime as DateTime;
+
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about addresses
@@ -111,7 +113,7 @@ class Pruefung extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
- 'global', 'ui','lehre'
+ 'global', 'ui', 'lehre', 'exam'
]);
}
@@ -172,174 +174,11 @@ class Pruefung extends FHCAPI_Controller
*
* @param lehrveranstaltung_id, student_uid, lehreinheit_id
*
- * @return values on success
- * retval 0: pruefung inserted
- * reval 1: pruefung and zeugnisnote inserted
- * retval 2: pruefung inserted, no insert Zeugnisnote
- * (change after date of examination)
- * retval 3: pruefung of type Termin2 inserted
- * and pruefung of type Termin1 as well
- * retval 5: prueufungen Termin 2 and 1 inserted
- * and no insert Zeugnisnote (change after date of examination)
+ * @return void
*/
public function insertPruefung()
{
- $authUID = getAuthUID();
-
- $this->load->library('form_validation');
-
- $this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [
- 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]),
- ]);
- $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [
- 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]),
- ]);
- $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [
- 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]),
- ]);
- $this->form_validation->set_rules(
- 'datum',
- $this->p->t('global', 'datum'),
- ['is_valid_date']
- );
-
- if ($this->form_validation->run() == false)
- {
- $this->terminateWithValidationErrors($this->form_validation->error_array());
- }
-
- //calculate studiensemester_kurzbz this from lehreinheit (case newPruefung)
- $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
- if (!$studiensemester_kurzbz)
- {
- $this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
-
- $result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id'));
-
- $lehreinheit = $this->getDataOrTerminateWithError($result);
- $studiensemester_kurzbz = current($lehreinheit)->studiensemester_kurzbz;
-
- if (isError($result))
- {
- $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
- }
-
- $result = $this->PruefungModel->insert([
- 'lehreinheit_id' => $this->input->post('lehreinheit_id'),
- 'student_uid' => $this->input->post('student_uid'),
- 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
- 'datum' => $this->input->post('datum'),
- 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
- 'note' => $this->input->post('note'),
- 'anmerkung' => $this->input->post('anmerkung'),
- 'insertamum' => date('c'),
- 'insertvon' => $authUID,
- ]);
-
- $this->getDataOrTerminateWithError($result);
-
- //check if existing zeugnisnote
- $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
-
- $result = $this->ZeugnisnoteModel->loadWhere(array(
- 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),
- 'student_uid' => $this->input->post('student_uid'),
- 'studiensemester_kurzbz' => $studiensemester_kurzbz));
-
- if (isError($result))
- {
- $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
-
- if (!hasData($result))
- {
- //insert zeugnisnote, if not existing
- $result = $this->ZeugnisnoteModel->insert(array(
- 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),
- 'student_uid' => $this->input->post('student_uid'),
- 'studiensemester_kurzbz' => $studiensemester_kurzbz,
- 'note' => $this->input->post('note'),
- 'uebernahmedatum' => date('c'),
- 'benotungsdatum' => $this->input->post('datum'),
- 'insertamum' => date('c'),
- 'insertvon' => $authUID
- ));
-
- if (isError($result))
- {
- $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
- $this->terminateWithSuccess(1);
- }
-
- $return_code = 0;
-
- //handling Termin1 if not existing
- if($this->input->post('pruefungstyp_kurzbz') == "Termin2")
- {
- $resultP = $this->PruefungModel->loadWhere(array(
- 'lehreinheit_id' => $this->input->post('lehreinheit_id'),
- 'student_uid' => $this->input->post('student_uid'),
- 'pruefungstyp_kurzbz' => 'Termin1'));
-
- if (isError($resultP))
- {
- $this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL);
- }
- if(!hasData($resultP))
- {
- //check if existing Zeugnisnote
- $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
- $this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id');
-
- $resultP = $this->ZeugnisnoteModel->loadWhere(array(
- 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),
- 'student_uid' => $this->input->input->post('student_uid'),
- 'lehre.tbl_zeugnisnote.studiensemester_kurzbz' => $studiensemester_kurzbz));
- if (isError($resultP))
- {
- $this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL);
- }
- if (!hasData($resultP))
- {
- $this->terminateWithError("Zeugnisnote existiert nicht", self::ERROR_TYPE_GENERAL);
- }
- $dataNote = current(getData($resultP));
-
- $resultN = $this->PruefungModel->insert([
- 'lehreinheit_id' => $this->input->post('lehreinheit_id'),
- 'student_uid' => $this->input->post('student_uid'),
- 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
- 'datum' => $dataNote->benotungsdatum,
- 'pruefungstyp_kurzbz' => 'Termin1',
- 'note' => $dataNote->note,
- 'punkte' => $dataNote->punkte,
- 'anmerkung' => 'automatisiert aus Zeugnisnote erstellt',
- 'insertamum' => date('c'),
- 'insertvon' => $authUID,
- ]);
-
- if (isError($resultN)) {
- $this->terminateWithError(getError($resultN), self::ERROR_TYPE_GENERAL);
- }
- $return_code = 3;
- }
- }
-
- $note = current(getData($result));
- $uebernahmedatum = new DateTime($note->uebernahmedatum);
- $benotungsdatum = new DateTime($note->benotungsdatum);
-
- $checkDate = $uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum
- ? $benotungsdatum
- : $uebernahmedatum;
-
- if ($checkDate >= $this->input->post('datum') && $note !== $note->note)
- {
- $this->terminateWithSuccess($return_code + 2);
- }
- $this->terminateWithSuccess($return_code + 2);
+ $this->insertOrUpdatePruefung();
}
/**
@@ -348,8 +187,6 @@ class Pruefung extends FHCAPI_Controller
* @param pruefung_id
*
* @return success or error
- *
- * no impact on lehre.tbl_zeugnisnote
*/
public function updatePruefung($pruefung_id)
{
@@ -359,48 +196,7 @@ class Pruefung extends FHCAPI_Controller
if (!$oldpruefung)
show_404(); // Pruefung that should be updated does not exist
- $authUID = getAuthUID();
-
- $this->load->library('form_validation');
-
- $this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [
- 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]),
- ]);
- $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [
- 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]),
- ]);
- $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [
- 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]),
- ]);
- $this->form_validation->set_rules(
- 'datum',
- $this->p->t('global', 'datum'),
- ['is_valid_date']
- );
-
- if ($this->form_validation->run() == false)
- {
- $this->terminateWithValidationErrors($this->form_validation->error_array());
- }
-
- $result = $this->PruefungModel->update(
- [
- 'pruefung_id' => $pruefung_id
- ],
- [ 'lehreinheit_id' => $this->input->post('lehreinheit_id'),
- 'student_uid' => $this->input->post('student_uid'),
- 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
- 'note' => $this->input->post('note'),
- 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
- 'datum' => $this->input->post('datum'),
- 'anmerkung' => $this->input->post('anmerkung'),
- 'updatevon' => $authUID,
- 'updateamum' => date('c'),
- ]
- );
- $this->getDataOrTerminateWithError($result);
-
- return $this->outputJsonSuccess(true);
+ $this->insertOrUpdatePruefung($pruefung_id);
}
/**
@@ -574,4 +370,198 @@ class Pruefung extends FHCAPI_Controller
return $this->terminateWithSuccess($data);
}
+
+ protected function insertOrUpdatePruefung($pruefung_id=null)
+ {
+ $authUID = getAuthUID();
+
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]),
+ ]);
+ $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]),
+ ]);
+ $this->form_validation->set_rules(
+ 'datum',
+ $this->p->t('global', 'datum'),
+ ['is_valid_date']
+ );
+
+ if ($this->form_validation->run() == false)
+ {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }
+
+ $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+
+ $this->PruefungModel->db->trans_start();
+
+ if ($this->input->post('pruefungstyp_kurzbz') == "Termin2")
+ {
+ //Wenn ein 2. Termin angelegt wird, und kein 1. Termin vorhanden ist,
+ //dann wird auch ein 1. Termin angelegt mit der derzeitigen Zeugnisnote
+ $resultP = $this->PruefungModel->loadWhere(array(
+ 'lehreinheit_id' => $this->input->post('lehreinheit_id'),
+ 'student_uid' => $this->input->post('student_uid'),
+ 'pruefungstyp_kurzbz' => 'Termin1'));
+
+ $termin1 = $this->getDataOrTerminateWithError($resultP);
+ if (!$termin1)
+ {
+ //check if existing Zeugnisnote
+ $this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id');
+
+ $this->ZeugnisnoteModel->db->where(
+ 'lehre.tbl_zeugnisnote.studiensemester_kurzbz',
+ 'lehre.tbl_lehreinheit.studiensemester_kurzbz',
+ false
+ );
+ $resultP = $this->ZeugnisnoteModel->loadWhere(array(
+ 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),
+ 'student_uid' => $this->input->post('student_uid')
+ ));
+
+ $zeugnisnoten = $this->getDataOrTerminateWithError($resultP);
+ if ($zeugnisnoten)
+ {
+ $zeugnisnote = current($zeugnisnoten);
+
+ $resultN = $this->PruefungModel->insert([
+ 'lehreinheit_id' => $this->input->post('lehreinheit_id'),
+ 'student_uid' => $this->input->post('student_uid'),
+ 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
+ 'datum' => $zeugnisnote->benotungsdatum,
+ 'pruefungstyp_kurzbz' => 'Termin1',
+ 'note' => $zeugnisnote->note,
+ 'punkte' => $zeugnisnote->punkte,
+ 'anmerkung' => 'automatisiert aus Zeugnisnote erstellt',
+ 'insertamum' => date('c'),
+ 'insertvon' => $authUID,
+ ]);
+
+ $this->getDataOrTerminateWithError($resultN);
+ }
+ //Wenn keine Zeugnisnote vorhanden ist, dann wird kein
+ //1.Termin angelegt
+ }
+ }
+
+ if(intval($pruefung_id) > 0)
+ {
+ $result = $this->PruefungModel->update(
+ [
+ 'pruefung_id' => $pruefung_id
+ ],
+ [ 'lehreinheit_id' => $this->input->post('lehreinheit_id'),
+ 'student_uid' => $this->input->post('student_uid'),
+ 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
+ 'note' => $this->input->post('note'),
+ 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
+ 'datum' => $this->input->post('datum'),
+ 'anmerkung' => $this->input->post('anmerkung'),
+ 'updatevon' => $authUID,
+ 'updateamum' => date('c'),
+ ]
+ );
+ }
+ else
+ {
+ $result = $this->PruefungModel->insert([
+ 'lehreinheit_id' => $this->input->post('lehreinheit_id'),
+ 'student_uid' => $this->input->post('student_uid'),
+ 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
+ 'datum' => $this->input->post('datum'),
+ 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
+ 'note' => $this->input->post('note'),
+ 'anmerkung' => $this->input->post('anmerkung'),
+ 'insertamum' => date('c'),
+ 'insertvon' => $authUID,
+ 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
+ ]);
+ }
+
+ $this->getDataOrTerminateWithError($result);
+
+ //get studiensemester_kurzbz and lehreveranstaltung_id from lehreinheit
+ $this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
+
+ $result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id'));
+
+ $lehreinheiten = $this->getDataOrTerminateWithError($result);
+
+ if (!$lehreinheiten) {
+ $this->terminateWithValidationErrors([
+ 'lehreinheit_id' => $this->p->t('ui', 'error_fieldNotFound', [
+ 'field' => $this->p->t('lehre', 'lehreinheit')
+ ])
+ ]);
+ }
+ $lehreinheit = current($lehreinheiten);
+ $studiensemester_kurzbz = $lehreinheit->studiensemester_kurzbz;
+ $lehrveranstaltung_id = $lehreinheit->lehrveranstaltung_id;
+
+ //check if existing zeugnisnote
+ $result = $this->ZeugnisnoteModel->loadWhere(array(
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id,
+ 'student_uid' => $this->input->post('student_uid'),
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz
+ ));
+
+ $zeugnisnoten = $this->getDataOrTerminateWithError($result);
+
+ if (!$zeugnisnoten)
+ {
+ //insert zeugnisnote, if not existing
+ $result = $this->ZeugnisnoteModel->insert(array(
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id,
+ 'student_uid' => $this->input->post('student_uid'),
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'note' => $this->input->post('note'),
+ 'uebernahmedatum' => date('c'),
+ 'benotungsdatum' => $this->input->post('datum'),
+ 'insertamum' => date('c'),
+ 'insertvon' => $authUID,
+ 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
+ ));
+
+ $this->getDataOrTerminateWithError($result);
+
+ $this->PruefungModel->db->trans_complete();
+ $this->terminateWithSuccess();
+ }
+
+ $note = current($zeugnisnoten);
+ $uebernahmedatum = new DateTime($note->uebernahmedatum);
+ $benotungsdatum = new DateTime($note->benotungsdatum);
+ $pruefungsdatum = new DateTime($this->input->post('datum'));
+
+ $checkDate = $note->uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum
+ ? $benotungsdatum
+ : $uebernahmedatum;
+
+ if ($checkDate > $pruefungsdatum && $this->input->post('note') !== $note->note)
+ {
+ $this->PruefungModel->db->trans_complete();
+ $this->terminateWithSuccess($this->p->t('exam', 'hinweis_changeAfterExamDate'));
+ }
+
+ //update zeugnisnote, if existing and valid datum
+ $result = $this->ZeugnisnoteModel->update([
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id,
+ 'student_uid' => $this->input->post('student_uid'),
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz
+ ], [
+ 'note' => $this->input->post('note'),
+ 'uebernahmedatum' => date('c'),
+ 'benotungsdatum' => $this->input->post('datum'),
+ 'updateamum' => date('c'),
+ 'updatevon' => $authUID,
+ 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
+ ]);
+
+ $this->PruefungModel->db->trans_complete();
+ $this->terminateWithSuccess();
+ }
}
diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php
index 629d5512a..3c0a639cd 100644
--- a/application/controllers/api/frontend/v1/stv/Status.php
+++ b/application/controllers/api/frontend/v1/stv/Status.php
@@ -24,7 +24,6 @@ class Status extends FHCAPI_Controller
'updateStatus' => ['admin:rw', 'assistenz:rw'],
'advanceStatus' => ['admin:rw', 'assistenz:rw'],
'confirmStatus' => ['admin:rw', 'assistenz:rw'],
-
]);
//Load Models
@@ -115,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)
@@ -287,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]);
@@ -440,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();
@@ -628,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,
@@ -645,9 +645,8 @@ class Status extends FHCAPI_Controller
$this->input->post('statusgrund_id')
);
- $this->getDataOrTerminateWithError($result);
-
- $this->db->trans_commit();
+ $this->db->trans_complete();
+ $this->getDataOrTerminateWithError($resFirstStudent);
return $this->outputJsonSuccess(true);
}
@@ -732,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,
@@ -901,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]);
@@ -918,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(
@@ -943,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(
@@ -968,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(
@@ -993,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(
@@ -1018,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(
@@ -1077,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
*
@@ -1101,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');
@@ -1111,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');
@@ -1134,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
@@ -1340,6 +1364,7 @@ class Status extends FHCAPI_Controller
'updateamum' => date('c'),
'updatevon' => $authUID
];
+ $nullableFields = ['statusgrund_id', 'anmerkung', 'rt_stufe'];
foreach ([
'orgform_kurzbz',
'anmerkung',
@@ -1348,8 +1373,17 @@ class Status extends FHCAPI_Controller
'rt_stufe',
'statusgrund_id'
] as $key)
- if ($this->input->post($key))
+ {
+ if (in_array($key, $nullableFields))
+ {
+ $updateData[$key] = ($this->input->post($key) === '') ? null : $this->input->post($key);
+ }
+ else if ($this->input->post($key))
+ {
$updateData[$key] = $this->input->post($key);
+ }
+ }
+
if ($this->input->post('bestaetigtam')) {
$updateData['bestaetigtam'] = $this->input->post('bestaetigtam');
diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php
index 2518e9af9..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', 'lehre'
+ 'ui', 'lehre', 'person'
]);
}
@@ -106,30 +107,42 @@ class Student extends FHCAPI_Controller
$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(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
+ "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');
@@ -145,9 +158,9 @@ class Student extends FHCAPI_Controller
'LEFT');*/
$result = $this->PrestudentModel->loadWhere(['tbl_prestudent.prestudent_id' => $prestudent_id]);
-
+
$student = $this->getDataOrTerminateWithError($result);
-
+
if (!$student)
return show_404();
@@ -159,7 +172,7 @@ class Student extends FHCAPI_Controller
{
$laufendesStudiensemester = '';
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
- $result = $this->StudiensemesterModel->getNearest();
+ $result = $this->StudiensemesterModel->getAktOrNextSemester();
if(hasData($result)) {
$laufendesStudiensemester = (getData($result))[0]->studiensemester_kurzbz;
}
@@ -207,7 +220,7 @@ class Student extends FHCAPI_Controller
]);
$this->load->library('UDFLib');
-
+
$result = $this->udflib->getCiValidations($this->PersonModel, $this->input->post());
$udf_field_validations = $this->getDataOrTerminateWithError($result);
@@ -218,7 +231,7 @@ 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;
@@ -231,7 +244,6 @@ class Student extends FHCAPI_Controller
$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) {
@@ -253,7 +265,6 @@ class Student extends FHCAPI_Controller
'gebdatum',
'gebort',
'geburtsnation',
- 'svnr',
'ersatzkennzeichen',
'staatsbuergerschaft',
'matr_nr',
@@ -276,13 +287,23 @@ 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))
+ if($this->isLaufendesSemester($studiensemester_kurzbz))
{
$array_allowed_props_student = ['matrikelnr', 'verband', 'semester', 'gruppe'];
}
@@ -299,6 +320,10 @@ class Student extends FHCAPI_Controller
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;
}
}
@@ -414,7 +439,32 @@ class Student extends FHCAPI_Controller
), ''));
}
- 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');
@@ -432,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);
}
@@ -455,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'),
@@ -540,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 = [
@@ -564,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,
@@ -617,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)
@@ -705,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 12785d6d7..f87e527e0 100644
--- a/application/controllers/api/frontend/v1/stv/Students.php
+++ b/application/controllers/api/frontend/v1/stv/Students.php
@@ -44,7 +44,12 @@ class Students extends FHCAPI_Controller
}
// Load Libraries
- $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+ $this->load->library('PhrasesLib');
+ $this->loadPhrases(
+ array(
+ 'lehre'
+ )
+ );
}
/**
@@ -68,7 +73,7 @@ class Students extends FHCAPI_Controller
* /(studiengang_kz)/(orgform)/prestudent/(studiensemester_kurzbz)/(filter) => getPrestudentsOrgform
* /(studiengang_kz)/(orgform)/prestudent/(studiensemester_kurzbz)/(filter)/(otherfilter) => getPrestudentsOrgform
*
- * /(studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe) => getStudentsSpezialguppe
+ * /(studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe) => getStudentsSpezialgruppe
*
* /(studiensemester_kurzbz)/(studiengang_kz) => getStudents
* /(studiensemester_kurzbz)/(studiengang_kz)/(semester) => getStudents
@@ -94,39 +99,183 @@ class Students extends FHCAPI_Controller
}
/**
+ * @param string $studiensemester_kurzbz
+ *
* @return void
*/
- public function getIncoming()
+ public function getIncoming($studiensemester_kurzbz)
{
$this->addMeta('ci_method', __FUNCTION__);
- // TODO(chris): IMPLEMENT!
- $this->terminateWithSuccess([]);
+ $this->addMeta('ci_params', [
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz
+ ]);
+
+
+ $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
*/
- public function getOutgoing()
+ public function getOutgoing($studiensemester_kurzbz)
{
$this->addMeta('ci_method', __FUNCTION__);
- // TODO(chris): IMPLEMENT!
- $this->terminateWithSuccess([]);
+ $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
*/
- public function getGemeinsamestudien()
+ public function getGemeinsamestudien($studiensemester_kurzbz)
{
$this->addMeta('ci_method', __FUNCTION__);
- // TODO(chris): IMPLEMENT!
- $this->terminateWithSuccess([]);
+ $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);
}
- public function getPrestudents($studiengang_kz,
- $studiensemester_kurzbz = null, $filter = null
- )
- {
+ public function getPrestudents(
+ $studiengang_kz,
+ $studiensemester_kurzbz = null,
+ $filter = null
+ ) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiengang_kz' => $studiengang_kz,
@@ -137,10 +286,12 @@ class Students extends FHCAPI_Controller
$this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter);
}
- public function getPrestudentsOrgform($studiengang_kz, $orgform_kurzbz,
- $studiensemester_kurzbz = null, $filter = null
- )
- {
+ 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,
@@ -220,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';
@@ -289,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', [
@@ -303,42 +457,18 @@ 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();
- //add status per semester
- $this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
- );
-
$this->addFilter($studiensemester_kurzbz);
$result = $this->PrestudentModel->loadWhere($where);
@@ -348,10 +478,13 @@ class Students extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
- public function getStudents($studiensemester_kurzbz,
- $studiengang_kz, $semester = null, $verband = null, $gruppe = null
- )
- {
+ 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,
@@ -364,10 +497,14 @@ class Students extends FHCAPI_Controller
$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
- )
- {
+ 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,
@@ -381,10 +518,12 @@ class Students extends FHCAPI_Controller
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, $orgform_kurzbz);
}
- public function getStudentsSpezialgruppe($studiensemester_kurzbz,
- $studiengang_kz, $semester, $gruppe_kurzbz,
- $orgform_kurzbz = null)
- {
+ public function getStudentsSpezialgruppe(
+ $studiensemester_kurzbz,
+ $studiengang_kz,
+ $semester,
+ $gruppe_kurzbz
+ ) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
@@ -396,10 +535,13 @@ class Students extends FHCAPI_Controller
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, null);
}
- public function getStudentsOrgformSpezialgruppe($studiensemester_kurzbz,
- $orgform_kurzbz, $studiengang_kz, $semester, $gruppe_kurzbz
- )
- {
+ 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,
@@ -423,8 +565,15 @@ class Students extends FHCAPI_Controller
*
* @return void
*/
- protected function fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester = null, $verband = null, $gruppe = null, $gruppe_kurzbz = null, $orgform_kurzbz = null)
- {
+ 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');
@@ -433,21 +582,6 @@ class Students extends FHCAPI_Controller
$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');
@@ -455,18 +589,6 @@ class Students extends FHCAPI_Controller
$this->PrestudentModel->addSelect('v.gruppe');
$this->PrestudentModel->addSelect("'' AS priorisierung_relativ");
- //add status per semester
- $this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
- );
-
$where = [];
@@ -489,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) . "
@@ -499,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);
@@ -533,39 +654,18 @@ class Students extends FHCAPI_Controller
$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');
-
- //add status per semester
- $this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
- );
+ $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();
@@ -602,40 +702,12 @@ class Students extends FHCAPI_Controller
$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');
- //add status per semester
- $this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
- );
-
$this->addSelectPrioRel();
@@ -674,33 +746,12 @@ class Students extends FHCAPI_Controller
$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');
- //add status per semester
- $this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
- );
-
$this->addSelectPrioRel();
$this->addFilter($studiensemester_kurzbz);
@@ -714,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
@@ -724,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');
@@ -746,15 +911,23 @@ 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');
@@ -765,6 +938,13 @@ class Students extends FHCAPI_Controller
// 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');
@@ -799,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);
@@ -821,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
@@ -836,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);
}
/**
@@ -848,40 +1022,20 @@ class Students extends FHCAPI_Controller
*/
protected function addFilter($studiensemester_kurzbz)
{
- $filter = json_decode($this->input->get('filter'), true);
+ $filter = $this->input->post('filter');
+
if (!is_array($filter))
{
- $this->addMeta('addfilter', 'invalid filter: ' . $this->input->get('filter'));
+ $this->addMeta('addfilter', 'invalid filter: ' . json_encode($this->input->post('filter')));
return;
}
- 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');
- }
- 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 4060704de..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);
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
index bb14bc511..c0683e999 100644
--- a/application/controllers/api/frontend/v1/vertraege/Vertraege.php
+++ b/application/controllers/api/frontend/v1/vertraege/Vertraege.php
@@ -26,9 +26,6 @@ class Vertraege extends FHCAPI_Controller
'deleteLehrauftrag' =>['vertrag/mitarbeiter:w'],
'deleteBetreuung' =>['vertrag/mitarbeiter:w'],
'getMitarbeiter' => ['vertrag/mitarbeiter:r'],
- 'getHeader' => ['vertrag/mitarbeiter:r'],
- 'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
- 'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
]);
//Load Models and Libraries
@@ -241,7 +238,7 @@ class Vertraege extends FHCAPI_Controller
}
}
$this->db->trans_complete();
- $this->terminateWithSuccess(true);
+ $this->terminateWithSuccess($vertrag_id);
}
public function updateContract()
@@ -358,7 +355,7 @@ class Vertraege extends FHCAPI_Controller
}
$this->db->trans_complete();
- $this->terminateWithSuccess(true);
+ $this->terminateWithSuccess($vertrag_id);
}
public function loadContract($vertrag_id)
@@ -684,37 +681,4 @@ class Vertraege extends FHCAPI_Controller
}
return $this->terminateWithSuccess(getData($result));
}
-
- public function getPersonAbteilung($mitarbeiter_uid)
- {
- $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
-
- $result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid);
-
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess(current($data));
- }
-
- public function getLeitungOrg($oekurzbz)
- {
- $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
-
- $result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz);
-
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess(current($data));
- }
-
- public function getHeader($person_id)
- {
- $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
-
- $result = $this->Mitarbeitermodel->getHeader($person_id);
-
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess(current($data));
- }
}
diff --git a/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php b/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php
index 01edb33d1..cf76746ef 100644
--- a/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php
+++ b/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php
@@ -51,13 +51,17 @@ class Vorlagen extends FHCAPI_Controller
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$result = $this->BenutzerfunktionModel->getBenutzerfunktionByUid($uid, 'oezuordnung');
- $data = $this->getDataOrTerminateWithError($result);
- $oe_kurzbz = current($data);
+ if (hasData($result))
+ {
+ $data = getData($result);
- $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz->oe_kurzbz);
- $data = $this->getDataOrTerminateWithError($result);
+ $oe_kurzbz = array_column($data, 'oe_kurzbz');
+ $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz);
+
+ $this->terminateWithSuccess(hasData($result) ? getData($result) : array());
+ }
+ $this->terminateWithSuccess(array());
- $this->terminateWithSuccess($data);
}
}
\ 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/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 f6db9509f..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, $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, $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, $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, $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[$funktion]) || !isset($preset[$funktion]['widgets']))
- $result[$funktion] = [];
- else
- $result[$funktion] = $preset[$funktion]['widgets'];
- }
- 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 debcfe391..8dc4870ea 100644
--- a/application/controllers/jobs/AntragJob.php
+++ b/application/controllers/jobs/AntragJob.php
@@ -200,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');
@@ -230,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);
@@ -257,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,
@@ -268,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/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/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php
index 57aca0876..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
*/
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/FHCAPI_Controller.php b/application/core/FHCAPI_Controller.php
index dad56334d..e81506d4b 100644
--- a/application/core/FHCAPI_Controller.php
+++ b/application/core/FHCAPI_Controller.php
@@ -266,7 +266,7 @@ class FHCAPI_Controller extends Auth_Controller
}
// ---------------------------------------------------------------
- // Security
+ // Security Begin
// ---------------------------------------------------------------
/**
@@ -287,4 +287,31 @@ class FHCAPI_Controller extends Auth_Controller
'required_permissions' => $this->_rpsToString($requiredPermissions, $this->router->method)
], self::ERROR_TYPE_AUTH);
}
+
+ // ---------------------------------------------------------------
+ // Security End
+ // ---------------------------------------------------------------
+
+ /**
+ * Checks the client's total request size (Content-Length) against the minimum
+ * effective PHP limit (min of upload_max_filesize, post_max_size, memory_limit).
+ * This preempts failures that result in vague "missing parameters" errors on large files.
+ *
+ * @return void
+ */
+ protected function checkUploadSize() {
+ // this number represents bytes
+ $content_length_bytes = (int)$this->input->server('CONTENT_LENGTH');
+ $content_length = $content_length_bytes / 1000000;
+
+ //get max serverside size upload -> this comes in megabytes
+ $max_upload = (int)(ini_get('upload_max_filesize'));
+ $max_post = (int)(ini_get('post_max_size'));
+ $memory_limit = (int)(ini_get('memory_limit'));
+ $max_upload_mb = min($max_upload, $max_post, $memory_limit); // smallest of 3 config values
+
+ if($content_length >= $max_upload_mb) {
+ $this->terminateWithError($this->p->t('global', 'filesizeExceeded'), 'general');
+ }
+ }
}
diff --git a/application/core/Notiz_Controller.php b/application/core/Notiz_Controller.php
index 472ac7669..7269c3b09 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,7 +291,7 @@ 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
@@ -313,7 +299,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$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(
@@ -350,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);
}
@@ -364,7 +350,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->getDataOrTerminateWithError($result);
}
- return $this->terminateWithSuccess($result);
+ $this->terminateWithSuccess($result);
}
public function deleteNotiz()
@@ -392,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);
}
}
@@ -415,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()
@@ -431,6 +417,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$notiz_id = $this->input->post('notiz_id');
$this->NotizModel->addSelect('campus.tbl_dms_version.*');
+ $this->NotizModel->addSelect($this->NotizModel->escape(base_url('content/notizdokdownload.php?id=')) . ' || public.tbl_notiz_dokument.dms_id AS preview');
$this->NotizModel->addJoin('public.tbl_notiz_dokument', 'ON (public.tbl_notiz_dokument.notiz_id = public.tbl_notiz.notiz_id)');
$this->NotizModel->addJoin('campus.tbl_dms_version', 'ON (public.tbl_notiz_dokument.dms_id = campus.tbl_dms_version.dms_id)');
@@ -439,14 +426,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)
@@ -456,7 +443,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 10e54780e..5b9bac6c5 100644
--- a/application/core/Tag_Controller.php
+++ b/application/core/Tag_Controller.php
@@ -29,13 +29,36 @@ class Tag_Controller extends FHCAPI_Controller
$this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
+
+ $this->loadPhrases([
+ 'ui'
+ ]);
}
- public function getTag()
+ public function getTag($readonly_tags = null)
{
$language = $this->_getLanguageIndex();
$id = $this->input->get('id');
+ if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
+ {
+ $readonly_tags = $this->_filterTag($readonly_tags, true);
+
+ foreach ($readonly_tags as $key => $tag)
+ {
+ $readonly_tags[$key] = $this->NotizModel->db->escape($tag);
+ }
+ $tags = '(' . implode(',', $readonly_tags) . ')';
+
+ $this->NotizModel->addSelect("
+ CASE
+ WHEN tbl_notiz_typ.typ_kurzbz IN $tags
+ THEN TRUE
+ ELSE FALSE
+ END as readonly
+ ");
+ }
+
$this->NotizModel->addSelect(
"tbl_notiz.titel,
tbl_notiz.text,
@@ -54,7 +77,7 @@ class Tag_Controller extends FHCAPI_Controller
$this->NotizModel->addJoin('public.tbl_benutzer verfasserbenutzer', 'tbl_notiz.verfasser_uid = verfasserbenutzer.uid', 'LEFT');
$this->NotizModel->addJoin('public.tbl_person verfasserperson', 'verfasserbenutzer.person_id = verfasserperson.person_id', 'LEFT');
- $this->NotizModel->addJoin('public.tbl_benutzer bearbeiterbenutzer', 'tbl_notiz.verfasser_uid = bearbeiterbenutzer.uid', 'LEFT');
+ $this->NotizModel->addJoin('public.tbl_benutzer bearbeiterbenutzer', 'tbl_notiz.bearbeiter_uid = bearbeiterbenutzer.uid', 'LEFT');
$this->NotizModel->addJoin('public.tbl_person bearbeiterperson', 'bearbeiterbenutzer.person_id = bearbeiterperson.person_id', 'LEFT');
$notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id));
@@ -62,7 +85,7 @@ class Tag_Controller extends FHCAPI_Controller
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array());
}
- public function getTags()
+ public function getTags($tags = null)
{
$this->NotiztypModel->addSelect(
'typ_kurzbz as tag_typ_kurzbz,
@@ -73,19 +96,36 @@ class Tag_Controller extends FHCAPI_Controller
'
);
$this->NotiztypModel->addOrder('prioritaet');
+
+ if (is_array($tags) && !isEmptyArray($tags))
+ {
+ $tags = $this->_filterTag($tags, false);
+ $this->NotiztypModel->db->where_in('typ_kurzbz', $tags);
+ }
+
$notiztypen = $this->NotiztypModel->loadWhere(array('aktiv' => true));
$this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array());
}
- public function addTag($withZuordnung = true)
+ public function addTag($withZuordnung = true, $updatable_tags = null)
{
$postData = $this->getPostJson();
$checkTyp = $this->NotiztypModel->loadWhere(array('typ_kurzbz' => $postData->tag_typ_kurzbz));
- if (!hasData($checkTyp))
- $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
+ if (isError($checkTyp))
+ $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
+ if (!hasData($checkTyp))
+ $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
+
+ if (is_array($updatable_tags) && !isEmptyArray($updatable_tags))
+ {
+ $tags = $this->_filterTag($updatable_tags, false);
+
+ if (!in_array($postData->tag_typ_kurzbz, $tags))
+ $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
+ }
if ($withZuordnung)
{
@@ -125,48 +165,88 @@ class Tag_Controller extends FHCAPI_Controller
}
}
- private function addNotiz($postData)
- {
- return $this->NotizModel->insert(array(
- 'titel' => 'TAG', //TODO klären
- 'text' => $postData->notiz,
- 'verfasser_uid' => $this->_uid,
- 'erledigt' => false,
- 'insertamum' => date('Y-m-d H:i:s'),
- 'insertvon' => $this->_uid,
- 'typ' => $postData->tag_typ_kurzbz
- ));
-
- }
- public function updateTag()
+ public function updateTag($updatable_tags = null)
{
$postData = $this->getPostJson();
+ $post_tag = $this->NotizModel->loadWhere(array('notiz_id' => $postData->id));
+
+ if (isError($post_tag))
+ $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
+
+ if (!hasData($post_tag))
+ $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
+
+ if (is_array($updatable_tags) && !isEmptyArray($updatable_tags))
+ {
+ $tags = $this->_filterTag($updatable_tags, false);
+
+ $post_tag_typ = getData($post_tag)[0]->typ;
+
+ if (!in_array($post_tag_typ, $tags))
+ $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
+ }
+
$updateData = $this->NotizModel->update(array('notiz_id' => $postData->id),
array('text' => $postData->notiz,
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid,
'bearbeiter_uid' => $this->_uid,
- )
+ )
);
$this->terminateWithSuccess($updateData);
}
- public function doneTag()
+ public function doneTag($updatable_tags = null)
{
$postData = $this->getPostJson();
+ $post_tag = $this->NotizModel->loadWhere(array('notiz_id' => $postData->id));
+
+ if (isError($post_tag))
+ $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
+
+ if (!hasData($post_tag))
+ $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
+
+ if (is_array($updatable_tags) && !isEmptyArray($updatable_tags))
+ {
+ $tags = $this->_filterTag($updatable_tags, false);
+
+ $post_tag_typ = getData($post_tag)[0]->typ;
+
+ if (!in_array($post_tag_typ, $tags))
+ $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
+ }
+
$updateData = $this->NotizModel->update(array('notiz_id' => $postData->id),
array('erledigt' => !$postData->done,
+ 'text' => $postData->notiz,
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid,
'bearbeiter_uid' => $this->_uid,
)
);
-
$this->terminateWithSuccess($updateData);
}
- public function deleteTag($withZuordnung = true)
+ public function deleteTag($withZuordnung = true, $updatable_tags = null)
{
$postData = $this->getPostJson();
+ $post_tag = $this->NotizModel->loadWhere(array('notiz_id' => $postData->id));
+
+ if (isError($post_tag))
+ $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
+
+ if (!hasData($post_tag))
+ $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
+
+ if (is_array($updatable_tags) && !isEmptyArray($updatable_tags))
+ {
+ $tags = $this->_filterTag($updatable_tags, false);
+
+ $post_tag_typ = getData($post_tag)[0]->typ;
+
+ if (!in_array($post_tag_typ, $tags))
+ $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
+ }
$deleteNotiz = "";
if ($withZuordnung)
@@ -208,5 +288,27 @@ class Tag_Controller extends FHCAPI_Controller
return hasData($result) ? getData($result)[0]->index : 1;
}
+ private function _filterTag($tags, $readonly = true)
+ {
+ $filtered_tags = array_filter($tags, function ($tag) use ($readonly)
+ {
+ return isset($tag['readonly']) && $tag['readonly'] === $readonly;
+ });
+
+ return array_keys($filtered_tags);
+ }
+
+ private function addNotiz($postData)
+ {
+ return $this->NotizModel->insert(array(
+ 'titel' => 'TAG', //TODO klären
+ 'text' => $postData->notiz,
+ 'verfasser_uid' => $this->_uid,
+ 'erledigt' => false,
+ 'insertamum' => date('Y-m-d H:i:s'),
+ 'insertvon' => $this->_uid,
+ 'typ' => $postData->tag_typ_kurzbz
+ ));
+ }
}
\ No newline at end of file
diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php
index 00c0a1b93..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,22 +408,6 @@ 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
// ------------------------------------------------------------------------
@@ -446,7 +430,8 @@ if (!function_exists('array_is_list')) {
// ------------------------------------------------------------------------
/**
- * 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)
{
@@ -515,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 24c02eac5..27dfba5a1 100644
--- a/application/helpers/hlp_header_helper.php
+++ b/application/helpers/hlp_header_helper.php
@@ -185,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;
@@ -246,3 +254,214 @@ function generateSkipLink($skipID)
$toPrint.='" class="fhcSkipLink" aria-label="Skip to main content">';
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 d90a98241..3d8a2ea26 100644
--- a/application/libraries/AntragLib.php
+++ b/application/libraries/AntragLib.php
@@ -128,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,
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/FilterCmptLib.php b/application/libraries/FilterCmptLib.php
index 272899de6..b1de89245 100644
--- a/application/libraries/FilterCmptLib.php
+++ b/application/libraries/FilterCmptLib.php
@@ -1,7 +1,7 @@
getSession();
// If session is NOT empty -> a filter was already loaded
- if ($session != null)
+ if (!isError($session) && $session != null)
{
// Retrieve the filterId stored in the session
$sessionFilterId = $this->_getSessionElement(FilterCmptLib::FILTER_ID);
@@ -219,9 +219,7 @@ class FilterCmptLib
}
}
}
-
- // If the session is empty -> first time that this filter is loaded
- if ($session == null)
+ else
{
// Load filter definition data from DB
$definition = $this->_loadDefinition(
@@ -602,7 +600,7 @@ class FilterCmptLib
{
$session = getSessionElement(self::SESSION_NAME, $this->_filterUniqueId);
- if (isset($session[$name]))
+ if (!isError($session) && isset($session[$name]))
{
return $session[$name];
}
@@ -623,7 +621,7 @@ class FilterCmptLib
if (!$this->_ci->permissionlib->hasAtLeastOne($this->_requiredPermissions, self::PERMISSION_FILTER_METHOD, self::PERMISSION_TYPE))
{
- $this->_setSession(error('The required permission is not help by the logged user'));
+ $this->_setSession(error('The required permission is not held by the logged user'));
return false;
}
@@ -904,7 +902,7 @@ class FilterCmptLib
$filterCmptsSession = getSession(self::SESSION_NAME);
// If something is present in session
- if ($filterCmptsSession != null)
+ if (!isError($filterCmptsSession) && $filterCmptsSession != null)
{
// Loops in the session for all the filter components
foreach ($filterCmptsSession as $filterCmpt => $filterCmptData)
@@ -951,9 +949,11 @@ class FilterCmptLib
{
$session = getSessionElement(self::SESSION_NAME, $this->_filterUniqueId);
- $session[$name] = $value;
-
- setSessionElement(self::SESSION_NAME, $this->_filterUniqueId, $session); // stores the single value
+ if (!isError($session) && $session != null)
+ {
+ $session[$name] = $value;
+ setSessionElement(self::SESSION_NAME, $this->_filterUniqueId, $session); // stores the single value
+ }
}
/**
@@ -965,7 +965,7 @@ class FilterCmptLib
$filterCmptsSession = getSession(self::SESSION_NAME);
// If something is present in session
- if ($filterCmptsSession != null)
+ if (!isError($filterCmptsSession) && $filterCmptsSession != null)
{
// Loops in the session for all the filter components
foreach ($filterCmptsSession as $filterCmpt => $filterCmptData)
@@ -1174,3 +1174,4 @@ class FilterCmptLib
return $filterName;
}
}
+
diff --git a/application/libraries/LektorLib.php b/application/libraries/LektorLib.php
new file mode 100644
index 000000000..bbe630eaf
--- /dev/null
+++ b/application/libraries/LektorLib.php
@@ -0,0 +1,350 @@
+_ci =& get_instance();
+ $this->_ci->load->model('education/lehreinheit_model', 'LehreinheitModel');
+ $this->_ci->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
+ $this->_ci->load->model('organisation/Studiensemester_model','StudiensemesterModel');
+ $this->_ci->load->model('ressource/Stundensatz_model', 'StundensatzModel');
+ $this->_ci->load->model('vertragsbestandteil/Dienstverhaeltnis_model','DienstverhaeltnisModel');
+ $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
+ $this->_ci->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
+ $this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
+ $this->_ci->load->library('PhrasesLib', array('lehre'));
+ }
+
+ public function addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid)
+ {
+ $this->_ci->LehreinheitModel->addSelect('tbl_lehreinheit.*, tbl_lehrveranstaltung.studiengang_kz, semesterstunden');
+ $this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
+ $lehreinheit_result = $this->_ci->LehreinheitModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
+
+ if (isError($lehreinheit_result)) return $lehreinheit_result;
+
+ if (!hasData($lehreinheit_result)) return error("Lehreinheit not found");
+
+ $lehreinheit = getData($lehreinheit_result)[0];
+
+ $already_assigned = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit->lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
+
+ if (isError($already_assigned)) return $already_assigned;
+
+ if (hasData($already_assigned)) return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt"));
+
+ $studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz));
+ if (isError($studiensemester_result)) return $studiensemester_result;
+ $studiensemester = getData($studiensemester_result)[0];
+
+ $stundensatz = $this->_ci->StundensatzModel->getDefaultStundensatz($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre');
+ $echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'echterdv');
+
+ $echter_dv = false;
+
+ if (hasData($echter_dv_result))
+ {
+ $echter_dv = true;
+ }
+
+ $maxstunden = $this->getMaxStunden($mitarbeiter_uid, $studiensemester->studiensemester_kurzbz, $lehreinheit->studiengang_kz, $echter_dv);
+
+ $newData['semesterstunden'] = 0;
+ $newData['planstunden'] = 0;
+ if (!is_null($lehreinheit->semesterstunden))
+ {
+ $newData['semesterstunden'] = min($lehreinheit->semesterstunden, $maxstunden);
+ $newData['planstunden'] = min($lehreinheit->semesterstunden, $maxstunden);
+ }
+
+ $newData['lehreinheit_id'] = $lehreinheit->lehreinheit_id;
+ $newData['mitarbeiter_uid'] = $mitarbeiter_uid;
+ $newData['lehrfunktion_kurzbz'] = 'Lektor';
+ $newData['bismelden'] = true;
+ $newData['insertvon'] = getAuthUID();
+ $newData['insertamum'] = date('Y-m-d H:i:s');
+ $newData['stundensatz'] = $stundensatz;
+ $result = $this->_ci->LehreinheitmitarbeiterModel->insert($newData);
+
+ if (isError($result)) return $result;
+
+ return success("Lektor added successfully");
+ }
+
+ public function updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $new_data)
+ {
+ $this->_ci->LehreinheitmitarbeiterModel->addSelect('lehre.tbl_lehreinheitmitarbeiter.*, lehre.tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.studiengang_kz');
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
+ $lehreinheit_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
+
+ if (isError($lehreinheit_result)) return $lehreinheit_result;
+
+ if (!hasData($lehreinheit_result)) return error("Lehreinheit not found");
+
+ $lehreinheit = getData($lehreinheit_result)[0];
+
+
+ //TODO kollision check, wird vorerst nicht implementiert -> nur über das FAS möglich
+ if (isset($new_data['mitarbeiter_uid']) && $new_data['mitarbeiter_uid'] !== $mitarbeiter_uid)
+ {
+ $this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
+ $this->_ci->StundenplandevModel->addGroupBy('stundenplandev_id');
+ $this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
+ $this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
+ $verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
+
+ if (hasData($verplant))
+ return error($this->_ci->phraseslib->t("lehre", "lektorbereitsverplant"));
+
+ $lehreinheit_data = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $new_data['mitarbeiter_uid'], 'lehreinheit_id' => $lehreinheit_id));
+
+ if (hasData($lehreinheit_data))
+ return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt"));
+
+ }
+ $warning = '';
+ if (isset($new_data['semesterstunden']))
+ {
+ $studiengang_result = $this->_ci->StudiengangModel->loadWhere(array('studiengang_kz' => $lehreinheit->studiengang_kz));
+ if (isError($studiengang_result)) return $studiengang_result;
+ if (!hasData($studiengang_result)) return error('Studiengang not found');
+ $studiengang = getData($studiengang_result)[0];
+
+ $studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz));
+ if (isError($studiensemester_result)) return $studiensemester_result;
+ $studiensemester = getData($studiensemester_result)[0];
+
+ $echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'echterdv');
+
+ $echter_dv = false;
+
+ if (hasData($echter_dv_result))
+ {
+ $echter_dv = true;
+ }
+
+ $neue_stunden_eingerechnet = isset($new_data['bismelden']) ? $new_data['bismelden'] : $lehreinheit->bismelden;
+ $alte_stunden_eingerechnet = $lehreinheit->bismelden;
+
+ if (($new_data['semesterstunden'] > $lehreinheit->semesterstunden) || $neue_stunden_eingerechnet)
+ {
+ $stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv);
+ if (isError($stundengrenze_result)) return $stundengrenze_result;
+
+ $stundengrenze = getData($stundengrenze_result)[0];
+
+ $oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz);
+ $oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array('');
+
+ if ($alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
+ $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($lehreinheit->semesterstunden) + {$this->_ci->LehreinheitmitarbeiterModel->db->escape($new_data['semesterstunden'])}) as summe");
+ else if ($alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
+ $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($lehreinheit->semesterstunden)) as summe");
+ else if (!$alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
+ $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) + ({$this->_ci->LehreinheitmitarbeiterModel->db->escape($new_data['semesterstunden'])})) as summe");
+ else if (!$alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
+ $this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden)) as summe");
+
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
+
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', (isset($new_data['mitarbeiter_uid']) ? $new_data['mitarbeiter_uid'] : $mitarbeiter_uid));
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $lehreinheit->studiensemester_kurzbz);
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true);
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('lower(mitarbeiter_uid) NOT LIKE', '_dummy%');
+
+ $this->_ci->LehreinheitmitarbeiterModel->db->where_in('tbl_studiengang.oe_kurzbz', $oe_array);
+
+
+ if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE')
+ && is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE)
+ && count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) > 0)
+ {
+ $this->_ci->LehreinheitmitarbeiterModel->db->where_not_in('tbl_studiengang.oe_kurzbz', FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE);
+ }
+
+ $summe_result = $this->_ci->LehreinheitmitarbeiterModel->load();
+
+ if (isError($summe_result)) return $summe_result;
+
+ if (!hasData($summe_result)) return error('Fehler beim Ermitteln der Gesamtstunden');
+
+ $summe = getData($summe_result)[0]->summe;
+
+ if ($summe > $stundengrenze->stunden)
+ {
+
+ if (!$echter_dv && (!$this->_ci->permissionlib->isBerechtigt('admin')))
+ {
+ if (!$this->LehrauftragAufFirma(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid))
+ return error("ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden NICHT gespeichert!\n\n");
+ }
+ else
+ {
+ $warning .= "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden gespeichert!\n\n";
+ }
+
+ $stunden_limit_result = $this->getStundenInstitut($mitarbeiter_uid, $lehreinheit->studiensemester_kurzbz, $oe_array);
+
+ if (hasData($stunden_limit_result))
+ {
+ $stunden_limit_array = getData($stunden_limit_result);
+ foreach ($stunden_limit_array as $stunden_limit)
+ {
+ $warning .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n";
+ }
+ }
+ }
+ }
+ }
+
+ $benutzer_result = $this->_ci->BenutzerModel->load(array(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid));
+
+ if (isError($benutzer_result)) return $benutzer_result;
+
+ if (!hasData($benutzer_result)) return error('Benutzer not found');
+
+ $benutzer_aktiv = getData($benutzer_result)[0]->aktiv;
+
+ if (!$benutzer_aktiv)
+ $warning .= "Achtung: Der/Die Benutzer*in ist inaktiv!\nBitte informieren Sie die Personalbteilung.\nDaten wurden gespeichert.\n\n";
+
+ $updatableFields = array(
+ 'semesterstunden',
+ 'planstunden',
+ 'stundensatz',
+ 'faktor',
+ 'anmerkung',
+ 'lehrfunktion_kurzbz',
+ 'mitarbeiter_uid',
+ 'bismelden'
+ );
+
+ $updateData = array();
+ foreach ($updatableFields as $field)
+ {
+ $value = isset($new_data[$field]) ? $new_data[$field] : null;
+
+ if ($value !== null)
+ {
+ $updateData[$field] = $value;
+ }
+ }
+ $updateData['updatevon'] = getAuthUID();
+ $updateData['updateamum'] = date('Y-m-d H:i:s');
+
+ $result = $this->_ci->LehreinheitmitarbeiterModel->update(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid), $updateData);
+
+ if (isError($result)) return $result;
+
+ if ($warning !== '') return success(['warning' => $warning]);
+
+ return success('Erfolgreich geupdated');
+ }
+
+ private function getMaxStunden($mitarbeiter_uid, $studiensemester_kurzbz, $studiengang_kz, $echter_dv)
+ {
+ $maxstunden = 9999;
+
+ $studiengang_result = $this->_ci->StudiengangModel->loadWhere(array('studiengang_kz' => $studiengang_kz));
+ if (isError($studiengang_result)) return $studiengang_result;
+
+ $studiengang = getData($studiengang_result)[0];
+
+ $stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv);
+ if (isError($stundengrenze_result)) return $stundengrenze_result;
+
+ $stundengrenze = getData($stundengrenze_result)[0];
+ $maxstunden = $stundengrenze->stunden;
+
+ $lehrauftrag_firma = $this->LehrauftragAufFirma($mitarbeiter_uid);
+
+ if (!$echter_dv && !$lehrauftrag_firma)
+ {
+ $oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz);
+ $oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array('');
+
+ $stunden_summe_result = $this->getSumSemesterstunden($mitarbeiter_uid, $studiensemester_kurzbz, $oe_array);
+
+ $stunden_summe = hasData($stunden_summe_result) ? getData($stunden_summe_result)[0]->summe : 0;
+
+ if ($stunden_summe >= $maxstunden && (!$this->_ci->permissionlib->isBerechtigt('admin')))
+ {
+ $stunden_limit_result = $this->getStundenInstitut($mitarbeiter_uid, $studiensemester_kurzbz, $oe_array);
+
+ $error = "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $maxstunden Stunden ($stundengrenze->oe_kurzbz) wurde ueberschritten!\n
+ Daten wurden NICHT gespeichert!\n\n";
+
+ if (hasData($stunden_limit_result))
+ {
+ $stunden_limit_array = getData($stunden_limit_result);
+
+ foreach ($stunden_limit_array as $stunden_limit)
+ {
+ $error .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n";
+ }
+ }
+ return error($error);
+ }
+ else
+ $maxstunden =- $stunden_summe;
+ }
+ return $maxstunden;
+ }
+
+ private function LehrauftragAufFirma($mitarbeiter_uid)
+ {
+ $this->_ci->MitarbeiterModel->addJoin('tbl_benutzer', 'tbl_mitarbeiter.mitarbeiter_uid = tbl_benutzer.uid');
+ $this->_ci->MitarbeiterModel->addJoin('tbl_person', 'person_id');
+ $this->_ci->MitarbeiterModel->addJoin('tbl_adresse', 'person_id', 'LEFT');
+ $this->_ci->MitarbeiterModel->addOrder('zustelladresse', 'DESC');
+ $this->_ci->MitarbeiterModel->addOrder('firma_id');
+ $this->_ci->MitarbeiterModel->addLimit(1);
+ $firma_result = $this->_ci->MitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $mitarbeiter_uid));
+ $firma = getData($firma_result)[0]->firma_id;
+ return !is_null($firma);
+ }
+
+ private function getSumSemesterstunden($mitarbeiter_uid, $studiensemester_kurzbz, $oe_array = array())
+ {
+ $this->_ci->LehreinheitmitarbeiterModel->addSelect('SUM(tbl_lehreinheitmitarbeiter.semesterstunden) as summe');
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', $mitarbeiter_uid);
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $studiensemester_kurzbz);
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true);
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('lower(mitarbeiter_uid) NOT LIKE', '_dummy%');
+ $this->_ci->LehreinheitmitarbeiterModel->db->where_in('tbl_studiengang.oe_kurzbz', $oe_array);
+ return $this->_ci->LehreinheitmitarbeiterModel->load();
+ }
+
+ private function getStundenInstitut($mitarbeiter_uid, $studiensemester_kurzbz, $oe_array = array())
+ {
+ $this->_ci->LehreinheitmitarbeiterModel->addSelect('SUM(tbl_lehreinheitmitarbeiter.semesterstunden) as summe, tbl_studiengang.bezeichnung');
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
+ $this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', $mitarbeiter_uid);
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $studiensemester_kurzbz);
+ $this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true);
+ $this->_ci->LehreinheitmitarbeiterModel->db->where_in('tbl_studiengang.oe_kurzbz', $oe_array);
+
+ if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE')
+ && is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE)
+ && count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) > 0)
+ {
+ $this->_ci->LehreinheitmitarbeiterModel->db->where_not_in('tbl_studiengang.oe_kurzbz', FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE);
+ }
+
+ $this->_ci->LehreinheitmitarbeiterModel->addGroupBy('tbl_studiengang.bezeichnung');
+ return $this->_ci->LehreinheitmitarbeiterModel->load();
+ }
+}
diff --git a/application/libraries/PermissionLib.php b/application/libraries/PermissionLib.php
index 42502f999..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;
+ }
}
}
@@ -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 2d795369f..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,
@@ -603,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,
@@ -615,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,
@@ -641,7 +723,7 @@ class PrestudentLib
// Generate Alias
- $alias = '';
+ $alias = null;
if (!defined('GENERATE_ALIAS_STUDENT')
|| GENERATE_ALIAS_STUDENT === true
) {
@@ -889,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
index 2a130d263..97cb8ce5d 100644
--- a/application/libraries/ProfilLib.php
+++ b/application/libraries/ProfilLib.php
@@ -183,7 +183,10 @@ class ProfilLib{
$zutrittskarte_ausgegebenam = $zutrittskarte_ausgegebenam ? current($zutrittskarte_ausgegebenam)->ausgegebenam : null;
//? formats date from 01-01-2000 to 01.01.2000
- $zutrittskarte_ausgegebenam = str_replace("-", ".", $zutrittskarte_ausgegebenam);
+ if ($zutrittskarte_ausgegebenam !== NULL)
+ {
+ $zutrittskarte_ausgegebenam = (new DateTime($zutrittskarte_ausgegebenam))->format('d.m.Y');
+ }
return $zutrittskarte_ausgegebenam;
}
@@ -196,7 +199,7 @@ class ProfilLib{
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", "zustelladresse", "gemeinde", "nation"]);
+ $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");
@@ -214,7 +217,7 @@ class ProfilLib{
* @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)
+ 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']);
@@ -222,7 +225,13 @@ class ProfilLib{
$this->ci->KontaktModel->addJoin('public.tbl_firma', 'firma_id', 'LEFT');
$this->ci->KontaktModel->addOrder('kontakttyp, kontakt, tbl_kontakt.updateamum, tbl_kontakt.insertamum');
- $kontakte_res = $this->ci->KontaktModel->loadWhere(['person_id' => $pid]);
+ $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));
}
@@ -303,10 +312,22 @@ class ProfilLib{
private function getBenutzerFunktion($uid)
{
$this->ci->load->model("person/Benutzerfunktion_model","BenutzerfunktionModel");
- $this->ci->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->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));
+ $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));
}
diff --git a/application/libraries/StundenplanLib.php b/application/libraries/StundenplanLib.php
index 6d53a2e2e..7ed64da2c 100644
--- a/application/libraries/StundenplanLib.php
+++ b/application/libraries/StundenplanLib.php
@@ -229,9 +229,10 @@ class StundenplanLib
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
$is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter(getAuthUID()));
-
- if ($is_mitarbeiter) {
- $reservierungen = $this->_ci->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz);
+
+ 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);
diff --git a/application/libraries/dashboard/DashboardLib.php b/application/libraries/dashboard/DashboardLib.php
index f6d7d6599..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);
@@ -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,11 +214,11 @@ 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']);
}
}
diff --git a/application/libraries/vertragsbestandteil/AbstractBestandteil.php b/application/libraries/vertragsbestandteil/AbstractBestandteil.php
index ccd05f5e2..4e1e8b9d0 100644
--- a/application/libraries/vertragsbestandteil/AbstractBestandteil.php
+++ b/application/libraries/vertragsbestandteil/AbstractBestandteil.php
@@ -40,7 +40,9 @@ abstract class AbstractBestandteil implements IValidation
if( is_bool($new_value) && ($old_value !== $new_value) ) {
$this->modifiedcolumns[$columnname] = $columnname;
- } else if($old_value != $new_value) {
+ } else if(is_null($old_value) xor is_null($new_value)) {
+ $this->modifiedcolumns[$columnname] = $columnname;
+ } else if($old_value != $new_value) {
$this->modifiedcolumns[$columnname] = $columnname;
}
}
diff --git a/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php b/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php
index 9551e0f51..52d24be64 100644
--- a/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php
+++ b/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php
@@ -146,17 +146,22 @@ class GehaltsbestandteilLib
$this->setUIDtoPGSQL();
$dv = $this->fetchDienstverhaeltnis($gehaltsbestandteil->getDienstverhaeltnis_id());
- if($dv && $this->PermissionLib->isberechtigt('basis/gehaelter', 'd', $dv->getOe_kurzbz()))
+ if($dv && $this->PermissionLib->isberechtigt('basis/gehaelter', 'd', $dv->getOe_kurzbz()))
{
- // delete Gehaltsabrechnung
- $ret = $this->CI->gehaltslib->deleteAbrechnung($gehaltsbestandteil);
-
- //
$ret = $this->GehaltsbestandteilModel->delete($gehaltsbestandteil->getGehaltsbestandteil_id());
-
+
if (isError($ret))
{
- throw new Exception('error deleting gehaltsbestandteil');
+ // delete Gehaltsabrechnung
+ $ret = $this->CI->gehaltslib->deleteAbrechnung($gehaltsbestandteil);
+
+ //
+ $ret = $this->GehaltsbestandteilModel->delete($gehaltsbestandteil->getGehaltsbestandteil_id());
+
+ if (isError($ret))
+ {
+ throw new Exception('error deleting gehaltsbestandteil');
+ }
}
} else {
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 101b90171..d004740e1 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';
diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php
new file mode 100644
index 000000000..71104fa91
--- /dev/null
+++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php
@@ -0,0 +1,161 @@
+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()
+ {
+ $value = $this->vordienstzeit;
+
+ if ($value === null || $value === '') {
+ $result = null; // allow null value
+ } else {
+ $result = filter_var($value, FILTER_VALIDATE_INT, [
+ 'options' => [
+ 'min_range' => 0,
+ 'max_range' => 100
+ ]
+ ]);
+
+ if ($result === false) {
+ $this->validationerrors[] = 'Vordienstjahre muss eine ganze Zahl (0 bis 100) enthalten oder leer sein.';
+ }
+ }
+
+ return parent::validate();
+ }
+}
diff --git a/application/models/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/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php
index ff56c3268..ad5c3e141 100644
--- a/application/models/crm/Prestudent_model.php
+++ b/application/models/crm/Prestudent_model.php
@@ -1,5 +1,7 @@
execQuery($query, array($person_id));
}
+
+ /**
+ * Adds a filter to the query builder
+ *
+ * @param array $filter
+ * @return boolean
+ */
+ public function addFilter($filter)
+ {
+ if (!isset($filter['type']))
+ return false;
+
+ switch ($filter['type']) {
+ case 'konto':
+ $bt = '';
+ $stdsem = '';
+ $comp = '!=';
+
+ if (isset($filter['buchungstyp_kurzbz']) && $filter['buchungstyp_kurzbz'] != 'all')
+ $bt = ' AND buchungstyp_kurzbz=' . $this->escape($filter['buchungstyp_kurzbz']);
+
+ if (isset($filter['studiensemester_kurzbz']))
+ $stdsem = ' AND studiensemester_kurzbz=' . $this->escape($filter['studiensemester_kurzbz']);
+
+ if (isset($filter['missing']) && $filter['missing']) {
+ $comp = '=';
+ $this->db->where('get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) !=', 'Incoming');
+ }
+
+ $this->db->where('(
+ SELECT count(*)
+ FROM public.tbl_konto
+ WHERE person_id=tbl_prestudent.person_id
+ ' . $bt . '
+ ' . $stdsem . '
+ ) ' . $comp, 0);
+ break;
+
+ case 'konto_counter':
+ $bt = '';
+ $samestg = '';
+ $past = '';
+
+ if (isset($filter['buchungstyp_kurzbz']) && $filter['buchungstyp_kurzbz'] != 'all')
+ $bt = ' AND buchungstyp_kurzbz = ' . $this->escape($filter['buchungstyp_kurzbz']);
+
+ if (isset($filter['samestg']) && $filter['samestg'])
+ $samestg = ' AND studiengang_kz = tbl_prestudent.studiengang_kz';
+
+ if (isset($filter['past']) && $filter['past'])
+ $past = ' AND buchungsdatum < NOW()';
+
+ $this->db->where('(
+ SELECT sum(betrag)
+ FROM public.tbl_konto
+ WHERE person_id = tbl_prestudent.person_id
+ ' . $bt . '
+ ' . $samestg . '
+ ' . $past . '
+ ) !=', 0);
+ break;
+
+ case 'zgv':
+ $this->db
+ ->group_start()
+ ->group_start()
+ ->where('zgv_code IS NOT NULL')
+ ->where('zgvdatum IS NULL')
+ ->group_end()
+ ->or_group_start()
+ ->where('zgvmas_code IS NOT NULL')
+ ->where('zgvmadatum IS NULL')
+ ->group_end()
+ ->or_group_start()
+ ->where('zgvdoktor_code IS NOT NULL')
+ ->where('zgvdoktordatum IS NULL')
+ ->group_end()
+ ->group_end();
+ break;
+
+ case 'documents':
+ $this->db->where('(
+ SELECT count(*)
+ FROM public.tbl_dokumentstudiengang
+ WHERE dokument_kurzbz NOT IN (
+ SELECT dokument_kurzbz
+ FROM tbl_dokumentprestudent
+ WHERE prestudent_id=tbl_prestudent.prestudent_id
+ )
+ AND studiengang_kz=tbl_prestudent.studiengang_kz
+ ) !=', 0);
+ break;
+
+ case 'statusgrund':
+ if (!isset($filter['statusgrund_id']))
+ return false;
+
+ if (isset($filter['studiensemester_kurzbz']))
+ $stdsem = ' AND studiensemester_kurzbz=' . $this->escape($filter['studiensemester_kurzbz']);
+
+ $this->db->where('(
+ SELECT count(*)
+ FROM public.tbl_prestudentstatus
+ WHERE prestudent_id = tbl_prestudent.prestudent_id
+ AND statusgrund_id = ' . $this->escape($filter['statusgrund_id']) . '
+ ' . $stdsem . '
+ ) !=', 0);
+ break;
+ }
+
+ Events::trigger('prestudent_add_filter', $filter);
+
+ return true;
+ }
}
diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php
index de91319b9..c0ed8595e 100644
--- a/application/models/crm/Prestudentstatus_model.php
+++ b/application/models/crm/Prestudentstatus_model.php
@@ -290,7 +290,11 @@ class Prestudentstatus_model extends DB_Model
*/
public function getLastStatusPerson($person_id, $studiensemester_kurzbz = null)
{
- $query = 'SELECT *
+ $query = 'SELECT p.*, ps.*, s.*,
+ stg.kurzbz AS studiengang_kurzbz, stg.kurzbzlang AS studiengang_kurzbzlang,
+ UPPER(typ::varchar(1) || kurzbz) AS studiengang_kuerzel,
+ stg.typ AS studiengang_typ, stg.bezeichnung AS studiengang_bezeichnung, stg.english AS studiengang_bezeichnung_english,
+ stg.orgform_kurzbz AS studiengang_orgform
FROM public.tbl_prestudent p
JOIN (
SELECT DISTINCT ON(prestudent_id) *
@@ -298,7 +302,8 @@ class Prestudentstatus_model extends DB_Model
WHERE prestudent_id IN (SELECT prestudent_id FROM public.tbl_prestudent WHERE person_id = ?)
ORDER BY prestudent_id, datum desc, insertamum desc
) ps USING(prestudent_id)
- JOIN public.tbl_status USING(status_kurzbz)';
+ JOIN public.tbl_status s USING(status_kurzbz)
+ JOIN public.tbl_studiengang stg USING (studiengang_kz)';
$parametersArray = array($person_id);
diff --git a/application/models/crm/Reihungstest_model.php b/application/models/crm/Reihungstest_model.php
index a685b01cd..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 = '
@@ -556,13 +556,22 @@ class Reihungstest_model extends DB_Model
* Calculates Result of Placement Test for a given Person and given placementtest
* and with taking account of weighting per area
*
- * @param $person_id ID of Person
- * @param $punkte if true result is points else result is percentage of sum
- * @param $reihungstest_id ID of Placementtest
- * @param $weightedArray array of weighting per area (gewicht per gebiet_id)
- * @return float result
+ * @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)
+ public function getReihungstestErgebnisPerson(
+ $person_id,
+ $punkte,
+ $reihungstest_id,
+ $weightedArray = null,
+ $has_excluded_gebiete = false,
+ $basis_gebiet_id_toString = null
+ )
{
$parametersArray = array($reihungstest_id);
@@ -577,6 +586,35 @@ class Reihungstest_model extends DB_Model
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 = (
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/Lehreinheit_model.php b/application/models/education/Lehreinheit_model.php
index d4bc7a22f..2f955c295 100644
--- a/application/models/education/Lehreinheit_model.php
+++ b/application/models/education/Lehreinheit_model.php
@@ -1,4 +1,6 @@
load->model('education/lehreinheitgruppe_model', 'LehreinheitgruppeModel');
$this->load->model('education/lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
$this->load->model('organisation/studiengang_model', 'StudiengangModel');
+ $this->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
+ $this->load->model('ressource/stundenplan_model', 'StundenplanModel');
+ $this->load->model('system/Log_model', 'LogModel');
}
/**
@@ -28,6 +33,11 @@ class Lehreinheit_model extends DB_Model
{
$lehreinheiten = array();
+ $this->addSelect(
+ 'lehreinheit_id, lehrveranstaltung_id, studiensemester_kurzbz, lehrform_kurzbz,
+ stundenblockung, wochenrythmus, start_kw, raumtyp, raumtypalternativ,
+ sprache, lehre, unr, lvnr, lehrfach_id, gewicht'
+ );
$this->addOrder('lehreinheit_id');
$les = $this->loadWhere(
array('lehrveranstaltung_id' => $lehrveranstaltung_id,
@@ -303,4 +313,430 @@ EOSQL;
return $this->execQuery($query, $params);
}
+
+
+ public function getOes($lehreinheit_id)
+ {
+ $this->addSelect('tbl_lehrveranstaltung.studiengang_kz,
+ tbl_lehrveranstaltung.lehrveranstaltung_id');
+ $this->addJoin('lehre.tbl_lehrveranstaltung', 'tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_lehreinheit.lehrveranstaltung_id');
+ $result = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
+
+ if (isError($result)) return $result;
+
+ if (hasData($result))
+ {
+ $lehrveranstaltung = getData($result)[0];
+ $oe_result = $this->LehrveranstaltungModel->getAllOe($lehrveranstaltung->lehrveranstaltung_id);
+ return success(hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array(''));
+ }
+ }
+
+ public function getLehrfachOe($lehreinheit_id)
+ {
+ $this->addSelect('lehrfach.oe_kurzbz');
+ $this->addJoin('lehre.tbl_lehrveranstaltung lehrfach', 'lehrfach.lehrveranstaltung_id = tbl_lehreinheit.lehrfach_id', 'LEFT');
+ return $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
+ }
+
+
+ public function getByLvidStudiensemester($lv_id, $studiensemester_kurzbz, $mitarbeiter_uid = null, $fachbereich_kurzbz = null)
+ {
+ $qry = "WITH lehreinheiten AS (
+ SELECT *
+ FROM lehre.tbl_lehreinheit
+ WHERE lehrveranstaltung_id = ?
+ AND studiensemester_kurzbz = ?
+ ),
+ ". $this->_getGruppenCTE() . ",
+ ". $this->_getLektorenCTE() . ",
+ ". $this->_getFachbereichCTE() . ",
+ ". $this->_getTagsCTE() . "
+
+ SELECT lehreinheiten.*,
+ lehreinheiten.lehrform_kurzbz as lv_lehrform_kurzbz,
+ tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
+ tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
+ COALESCE(tag_data_agg.tags, '[]'::json) AS tags,
+ gruppen.gruppen,
+ mitarbeiter.lektoren,
+ mitarbeiter.le_planstunden,
+ mitarbeiter.vorname,
+ mitarbeiter.nachname,
+ mitarbeiter.semesterstunden,
+ fachbereich.bezeichnung as fachbereich,
+ UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang,
+ semester
+ FROM lehreinheiten
+ LEFT JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = lehreinheiten.lehrfach_id
+ LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
+ LEFT JOIN tag_data_agg ON tag_data_agg.lehreinheit_id = lehreinheiten.lehreinheit_id
+ LEFT JOIN mitarbeiter ON lehreinheiten.lehreinheit_id = mitarbeiter.lehreinheit_id
+ LEFT JOIN fachbereich ON lehreinheiten.lehreinheit_id = fachbereich.lehreinheit_id
+ LEFT JOIN gruppen ON lehreinheiten.lehreinheit_id = gruppen.lehreinheit_id
+ WHERE true
+ ";
+
+ $params = array($lv_id, $studiensemester_kurzbz);
+
+ if ($mitarbeiter_uid !== null)
+ {
+ $qry .= " AND lehreinheiten.lehreinheit_id IN ( SELECT lehreinheit_id FROM lehre.tbl_lehreinheitmitarbeiter WHERE mitarbeiter_uid = ?) ";
+ $params[] = $mitarbeiter_uid;
+ }
+
+ if($fachbereich_kurzbz !== null)
+ {
+ $qry .= " AND EXISTS ( SELECT 1 FROM lehre.tbl_lehrveranstaltung JOIN public.tbl_fachbereich USING(oe_kurzbz) WHERE fachbereich_kurzbz= ? AND lehrveranstaltung_id=lehreinheiten.lehrfach_id)";
+ $params[] = $fachbereich_kurzbz;
+ }
+ $qry .= " ORDER BY lehrveranstaltung_id;";
+
+ return $this->execReadOnlyQuery($qry, $params);
+ }
+
+ private function getLVTmp($stg_kz = null)
+ {
+ $qry = "SELECT DISTINCT ON(lehrveranstaltung_id) *,
+ '' as stundenblockung,
+ '' as lehreinheit_id,
+ '' as wochenrythmus,
+ '' as raumtyp,
+ '' as raumtypalternativ,
+ '' as gruppen,
+ '' as studienplan_id,
+ '' as studienplan_beeichnung,
+ UPPER(CONCAT(vw_lehreinheit.stg_typ, vw_lehreinheit.stg_kurzbz)) as studiengang
+ FROM campus.vw_lehreinheit
+ WHERE mitarbeiter_uid = ?
+ AND studiensemester_kurzbz = ?";
+
+ if (!is_null($stg_kz)) {
+ $qry .= " AND lv_studiengang_kz = ?";
+ }
+
+ return $qry;
+ }
+
+ public function getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz = null)
+ {
+ $qry = "WITH lvs AS (" . $this->getLVTmp($stg_kz) . ")
+ SELECT lvs.*
+ FROM lvs
+ ";
+
+ $params = array($mitarbeiter_uid, $studiensemester_kurzbz);
+ if (!is_null($stg_kz))
+ {
+ $params[] = $stg_kz;
+ }
+ return $this->execReadOnlyQuery($qry, $params);
+ }
+
+ public function deleteLehreinheit($lehreinheit_id)
+ {
+ $lehreinheit = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
+
+ if (isError($lehreinheit)) return $lehreinheit;
+
+ if (!hasData($lehreinheit))
+ return error("Lehreinheit not found!");
+
+ $errorReasons = [];
+ $addError = function ($reason = null) use (&$errorReasons)
+ {
+ if ($reason !== null)
+ {
+ $errorReasons[] = $reason;
+ }
+ };
+
+ $stundenplandev_result = $this->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
+ $stundenplan_result = $this->StundenplanModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
+
+ if (hasData($stundenplan_result) || hasData($stundenplandev_result))
+ $addError('Dieser LV-Teil ist bereits im LV-Plan verplant und kann daher nicht geloescht werden!');
+
+ Events::trigger(
+ 'lehreinheit_delete_check',
+ $addError,
+ $lehreinheit_id
+ );
+
+ if (!empty($errorReasons)) return error($errorReasons);
+
+ $this->db->trans_begin();
+
+ Events::trigger(
+ 'lehreinheit_delete',
+ $addError,
+ $lehreinheit_id
+ );
+
+ $undosql = '';
+
+ $lehreinheit_gruppe_result = $this->LehreinheitgruppeModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
+ if (hasData($lehreinheit_gruppe_result))
+ {
+ foreach (getData($lehreinheit_gruppe_result) as $row)
+ {
+ $values = [
+ $this->db->escape($row->lehreinheitgruppe_id),
+ $this->db->escape($row->lehreinheit_id),
+ $this->db->escape($row->studiengang_kz),
+ $this->db->escape($row->semester),
+ $this->db->escape($row->verband),
+ $this->db->escape($row->gruppe),
+ $this->db->escape($row->gruppe_kurzbz),
+ $this->db->escape($row->updateamum),
+ $this->db->escape($row->updatevon),
+ $this->db->escape($row->insertamum),
+ $this->db->escape($row->insertvon)
+ ];
+
+ $undosql .= "INSERT INTO lehre.tbl_lehreinheitgruppe (
+ lehreinheitgruppe_id,
+ lehreinheit_id,
+ studiengang_kz,
+ semester,
+ verband,
+ gruppe,
+ gruppe_kurzbz,
+ updateamum,
+ updatevon,
+ insertamum,
+ insertvon
+ ) VALUES (" . implode(', ', $values) . ");\n";
+ }
+
+ $lehreinheit_gruppe_delete_result = $this->LehreinheitgruppeModel->delete(array('lehreinheit_id' => $lehreinheit_id));
+
+ if (isError($lehreinheit_gruppe_delete_result))
+ $addError(getError($lehreinheit_gruppe_delete_result));
+ }
+
+ $lehreinheit_mitarbeiter_result = $this->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
+ if (hasData($lehreinheit_mitarbeiter_result))
+ {
+ foreach (getData($lehreinheit_mitarbeiter_result) as $row)
+ {
+ $values = [
+ $this->db->escape($row->lehreinheit_id),
+ $this->db->escape($row->mitarbeiter_uid),
+ $this->db->escape($row->lehrfunktion_kurzbz),
+ $this->db->escape($row->planstunden),
+ $this->db->escape($row->stundensatz),
+ $this->db->escape($row->faktor),
+ $this->db->escape($row->anmerkung),
+ $this->db->escape($row->bismelden),
+ $this->db->escape($row->updateamum),
+ $this->db->escape($row->updatevon),
+ $this->db->escape($row->insertamum),
+ $this->db->escape($row->insertvon),
+ $this->db->escape($row->semesterstunden)
+ ];
+
+ $undosql .= "INSERT INTO lehre.tbl_lehreinheitmitarbeiter (
+ lehreinheit_id,
+ mitarbeiter_uid,
+ lehrfunktion_kurzbz,
+ planstunden,
+ stundensatz,
+ faktor,
+ anmerkung,
+ bismelden,
+ updateamum,
+ updatevon,
+ insertamum,
+ insertvon,
+ semesterstunden
+ ) VALUES (" . implode(', ', $values) . ");\n";
+ }
+
+ $lehreinheit_mitarbeiter_delete_result = $this->LehreinheitmitarbeiterModel->delete(array('lehreinheit_id' => $lehreinheit_id));
+ if (isError($lehreinheit_mitarbeiter_delete_result))
+ $addError(getError($lehreinheit_mitarbeiter_delete_result));
+ }
+
+ foreach (getData($lehreinheit) as $row)
+ {
+ $values = [
+ $this->db->escape($row->lehreinheit_id),
+ $this->db->escape($row->lehrveranstaltung_id),
+ $this->db->escape($row->studiensemester_kurzbz),
+ $this->db->escape($row->lehrfach_id),
+ $this->db->escape($row->lehrform_kurzbz),
+ $this->db->escape($row->stundenblockung),
+ $this->db->escape($row->wochenrythmus),
+ $this->db->escape($row->start_kw),
+ $this->db->escape($row->raumtyp),
+ $this->db->escape($row->raumtypalternativ),
+ $this->db->escape($row->sprache),
+ $this->db->escape($row->lehre),
+ $this->db->escape($row->anmerkung),
+ $this->db->escape($row->unr),
+ $this->db->escape($row->lvnr),
+ $this->db->escape($row->updateamum),
+ $this->db->escape($row->updatevon),
+ $this->db->escape($row->insertamum),
+ $this->db->escape($row->insertvon),
+ ];
+
+ $undosql .= "INSERT INTO lehre.tbl_lehreinheit (
+ lehreinheit_id,
+ lehrveranstaltung_id,
+ studiensemester_kurzbz,
+ lehrfach_id,
+ lehrform_kurzbz,
+ stundenblockung,
+ wochenrythmus,
+ start_kw,
+ raumtyp,
+ raumtypalternativ,
+ sprache,
+ lehre,
+ anmerkung,
+ unr,
+ lvnr,
+ updateamum,
+ updatevon,
+ insertamum,
+ insertvon
+ ) VALUES (" . implode(', ', $values) . ");\n";
+ }
+ $lehreinheit_result = $this->delete($lehreinheit_id);
+
+ $deleteSql = "DELETE FROM lehre.tbl_lehreinheitmitarbeiter WHERE lehreinheit_id = " . $this->db->escape($lehreinheit_id) ."; \n
+ DELETE FROM lehre.tbl_lehreinheitgruppe WHERE lehreinheit_id = " . $this->db->escape($lehreinheit_id) ."; \n
+ DELETE FROM lehre.tbl_lehreinheit WHERE lehreinheit_id = " . $this->db->escape($lehreinheit_id) .";";
+ if (isError($lehreinheit_result))
+ $addError($lehreinheit_result);
+
+ $log_result = $this->LogModel->insert([
+ 'sql' => $deleteSql,
+ 'sqlundo' => $undosql,
+ 'beschreibung' => 'Lehreinheit loeschen - ' . $lehreinheit_id,
+ 'mitarbeiter_uid' => getAuthUID(),
+ ]);
+
+ if (isError($log_result))
+ $addError($log_result);
+
+ if (!empty($errorReasons))
+ {
+ $this->db->trans_rollback();
+ return error($errorReasons);
+ }
+
+ $this->db->trans_commit();
+ return success('Contract successfully updated.');
+ }
+
+ private function _getGruppenCTE()
+ {
+ return "gruppen AS (
+ SELECT
+ lehreinheit_id,
+ STRING_AGG(
+ CASE
+ WHEN (tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL OR tbl_lehreinheitgruppe.gruppe_kurzbz = '')
+ THEN
+ UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) ||
+ COALESCE(TRIM(tbl_lehreinheitgruppe.semester::text), '') ||
+ COALESCE(TRIM(tbl_lehreinheitgruppe.verband), '') ||
+ COALESCE(TRIM(tbl_lehreinheitgruppe.gruppe), '')
+ ELSE
+ CASE
+ WHEN NOT tbl_gruppe.direktinskription THEN tbl_lehreinheitgruppe.gruppe_kurzbz
+ ELSE NULL
+ END
+ END,
+ ' '
+ ORDER BY
+ UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz),
+ COALESCE(TRIM(tbl_lehreinheitgruppe.semester::text), ''),
+ COALESCE(TRIM(tbl_lehreinheitgruppe.verband), ''),
+ COALESCE(TRIM(tbl_lehreinheitgruppe.gruppe), ''),
+ COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, '')
+ ) AS gruppen
+ FROM lehre.tbl_lehreinheitgruppe
+ LEFT JOIN public.tbl_studiengang USING (studiengang_kz)
+ LEFT JOIN public.tbl_gruppe USING (gruppe_kurzbz)
+ JOIN lehreinheiten USING(lehreinheit_id)
+ GROUP BY lehreinheit_id
+ )";
+ }
+ private function _getLektorenCTE()
+ {
+ return "mitarbeiter AS (
+ SELECT
+ tbl_lehreinheitmitarbeiter.lehreinheit_id,
+ STRING_AGG(m.kurzbz, ' ') AS lektoren,
+ STRING_AGG(tbl_person.vorname, ' ') AS vorname,
+ STRING_AGG(tbl_person.nachname, ' ') AS nachname,
+ STRING_AGG(tbl_lehreinheitmitarbeiter.semesterstunden::text, ' ') AS semesterstunden,
+ STRING_AGG(tbl_lehreinheitmitarbeiter.planstunden::text, ' ') AS le_planstunden
+ FROM lehre.tbl_lehreinheitmitarbeiter
+ JOIN public.tbl_mitarbeiter m USING (mitarbeiter_uid)
+ JOIN lehreinheiten USING(lehreinheit_id)
+ JOIN public.tbl_benutzer ON mitarbeiter_uid = uid
+ JOIN public.tbl_person ON tbl_benutzer.person_id = tbl_person.person_id
+ GROUP BY tbl_lehreinheitmitarbeiter.lehreinheit_id
+ )";
+ }
+
+ private function _getFachbereichCTE()
+ {
+ return "fachbereich AS (
+ SELECT
+ CONCAT(tbl_organisationseinheit.bezeichnung, ' (', tbl_organisationseinheit.organisationseinheittyp_kurzbz, ')') as bezeichnung,
+ lehreinheiten.lehreinheit_id
+ FROM public.tbl_organisationseinheit
+ JOIN lehre.tbl_lehrveranstaltung AS lehrfach ON tbl_organisationseinheit.oe_kurzbz = lehrfach.oe_kurzbz
+ JOIN lehre.tbl_lehreinheit ON lehrfach.lehrveranstaltung_id = tbl_lehreinheit.lehrfach_id
+ JOIN lehreinheiten ON tbl_lehreinheit.lehreinheit_id = lehreinheiten.lehreinheit_id
+ )";
+ }
+
+ private function _getTagsCTE()
+ {
+ $this->load->config('lvverwaltung');
+ $tags = $this->config->item('tags');
+
+ $whereTags = '';
+ if (is_array($tags) && !isEmptyArray($tags))
+ {
+ $tags = array_keys($tags);
+
+ foreach ($tags as $key => $tag)
+ {
+ $tags[$key] = $this->db->escape($tag);
+ }
+
+ $whereTags = " AND tbl_notiz_typ.typ_kurzbz IN (" . implode(",", $tags) . ")";
+ }
+
+ return "tag_data_agg AS (
+ SELECT
+ lehreinheit_id,
+ COALESCE(json_agg(tag ORDER BY done), '[]'::json) AS tags
+ FROM (
+ SELECT DISTINCT ON (public.tbl_notiz.notiz_id)
+ tbl_notiz.notiz_id AS id,
+ typ_kurzbz,
+ array_to_json(tbl_notiz_typ.bezeichnung_mehrsprachig)->>0 AS beschreibung,
+ text AS notiz,
+ style,
+ erledigt AS done,
+ lehreinheit_id
+ FROM public.tbl_notizzuordnung
+ JOIN public.tbl_notiz ON tbl_notizzuordnung.notiz_id = tbl_notiz.notiz_id
+ JOIN public.tbl_notiz_typ ON tbl_notiz.typ = tbl_notiz_typ.typ_kurzbz
+ WHERE lehreinheit_id IN (SELECT lehreinheit_id FROM lehreinheiten)"
+ . $whereTags.
+ ") AS tag
+ GROUP BY lehreinheit_id
+ )";
+ }
+
}
diff --git a/application/models/education/Lehreinheitgruppe_model.php b/application/models/education/Lehreinheitgruppe_model.php
index 2a6f9571a..dee8bbfe1 100644
--- a/application/models/education/Lehreinheitgruppe_model.php
+++ b/application/models/education/Lehreinheitgruppe_model.php
@@ -14,6 +14,7 @@ class Lehreinheitgruppe_model extends DB_Model
$this->load->model('organisation/studiengang_model', 'StudiengangModel');
$this->load->model('organisation/gruppe_model', 'GruppeModel');
$this->load->model('person/benutzergruppe_model', 'BenutzergruppeModel');
+ $this->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
}
/**
@@ -23,7 +24,15 @@ class Lehreinheitgruppe_model extends DB_Model
*/
public function getDirectGroup($lehreinheit_id)
{
+ $this->addSelect('tbl_lehreinheitgruppe.*');
+ $this->addSelect('tbl_gruppe.*');
+ $this->addSelect('uid');
+ $this->addSelect('vorname');
+ $this->addSelect('nachname');
$this->addJoin('public.tbl_gruppe', 'gruppe_kurzbz');
+ $this->addJoin('public.tbl_benutzergruppe', 'gruppe_kurzbz', 'LEFT');
+ $this->addJoin('public.tbl_benutzer', 'uid', 'LEFT');
+ $this->addJoin('public.tbl_person', 'person_id', 'LEFT');
return $this->loadWhere(
array(
'tbl_gruppe.direktinskription' => true,
@@ -264,4 +273,209 @@ class Lehreinheitgruppe_model extends DB_Model
}
return $result;
}
+
+ public function addGroup($lehreinheit_id, $gid, $verband)
+ {
+ $lehreinheit = $this->LehreinheitModel->load($lehreinheit_id);
+
+ if (!hasData($lehreinheit))
+ return error ('No Lehreinheit found!');
+
+ if ($verband === false)
+ {
+ $gruppen_result = $this->GruppeModel->loadWhere(array('gid' => $gid));
+
+ if (!hasData($gruppen_result))
+ return error('No group found for gid ' . $gid);
+
+ $gruppen_array = getData($gruppen_result)[0];
+
+ if (!isEmptyString($gruppen_array->gruppe_kurzbz))
+ {
+ $this->db->where('trim(gruppe_kurzbz)', $gruppen_array->gruppe_kurzbz);
+ }
+ else
+ {
+ $this->db->group_start();
+ $this->db->where("trim(gruppe_kurzbz) = ''");
+ $this->db->or_where("gruppe_kurzbz IS NULL");
+ $this->db->group_end();
+ }
+ }
+ else if ($verband === true)
+ {
+ $gruppen_result = $this->LehrverbandModel->loadWhere(array('gid' => $gid));
+
+ if (!hasData($gruppen_result))
+ return error('No group found for gid ' . $gid);
+
+ $gruppen_array = getData($gruppen_result)[0];
+
+ if (!isEmptyString($gruppen_array->verband))
+ {
+ $this->db->where('verband', $gruppen_array->verband);
+ }
+ else
+ {
+ $this->db->group_start();
+ $this->db->where("trim(verband) = ''");
+ $this->db->or_where("verband IS NULL");
+ $this->db->group_end();
+ }
+
+ if (!isEmptyString($gruppen_array->gruppe))
+ {
+ $this->db->where('gruppe', $gruppen_array->gruppe);
+ }
+ else
+ {
+ $this->db->group_start();
+ $this->db->where("trim(gruppe) = ''");
+ $this->db->or_where("gruppe IS NULL");
+ $this->db->group_end();
+ }
+ }
+ else
+ return error('Wrong type of verband');
+
+ $this->db->where('lehreinheit_id', $lehreinheit_id);
+ $this->db->where('studiengang_kz', $gruppen_array->studiengang_kz);
+
+ if (!isEmptyString($gruppen_array->semester))
+ {
+ $this->db->where('semester', $gruppen_array->semester);
+ }
+ else
+ {
+ $this->db->group_start();
+ $this->db->where("semester = ''");
+ $this->db->or_where("semester IS NULL");
+ $this->db->group_end();
+ }
+
+ $exist_result = $this->load();
+
+ if (!hasData($exist_result))
+ {
+ $new_group_result = $this->insert(array(
+ 'lehreinheit_id' => $lehreinheit_id,
+ 'studiengang_kz' => $gruppen_array->studiengang_kz,
+ 'gruppe_kurzbz' => isset($gruppen_array->gruppe_kurzbz) ? $gruppen_array->gruppe_kurzbz : null,
+ 'semester' => $gruppen_array->semester,
+ 'verband' => isset($gruppen_array->verband) && !isEmptyString($gruppen_array->verband) ? $gruppen_array->verband : null,
+ 'gruppe' => isset($gruppen_array->gruppe) && !isEmptyString($gruppen_array->gruppe) ? $gruppen_array->gruppe : null,
+ 'insertamum' => date('Y-m-d H:i:s'),
+ 'insertvon' => getAuthUID()
+ ));
+
+ if (isError($new_group_result))
+ return error('Error when adding Group');
+
+ return success('Group assigned successfully to Lehreinheit');
+ }
+ else
+ return error($this->p->t('lehre', 'grpbereitszugeteilt'));
+ }
+
+ public function deleteGroup($lehreinheit_id, $lehreinheitgruppe_id)
+ {
+ $lehreinheit = $this->LehreinheitModel->load($lehreinheit_id);
+
+ if (!hasData($lehreinheit))
+ return error ('No Lehreinheit found!');
+
+ $lehreinheitgruppe = $this->load($lehreinheitgruppe_id);
+
+ if (!hasData($lehreinheitgruppe))
+ return error ('No Lehreinheitgruppe found!');
+
+ $this->addSelect('stundenplandev_id');
+ $this->addJoin('lehre.tbl_stundenplandev',
+ "tbl_stundenplandev.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
+ AND tbl_stundenplandev.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
+ AND tbl_stundenplandev.semester = tbl_lehreinheitgruppe.semester
+ AND trim(COALESCE(tbl_stundenplandev.verband, '')) = trim(COALESCE(tbl_lehreinheitgruppe.verband, ''))
+ AND trim(COALESCE(tbl_stundenplandev.gruppe, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe, ''))
+ AND trim(COALESCE(tbl_stundenplandev.gruppe_kurzbz, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, ''))"
+ );
+ $stundenplan_result = $this->loadWhere(array('tbl_lehreinheitgruppe.lehreinheitgruppe_id' => $lehreinheitgruppe_id));
+
+ if (hasData($stundenplan_result))
+ return error($this->p->t('lehre', 'grpbereitsverplant'));
+
+ $delete_result = $this->delete($lehreinheitgruppe_id);
+
+ if (isError($delete_result))
+ return error('Error deleting Group');
+
+ return success('Group deleted');
+ }
+
+ public function getByLehreinheit($lehreinheit_id)
+ {
+ $lehreinheit = $this->LehreinheitModel->load($lehreinheit_id);
+
+ if (!hasData($lehreinheit))
+ return error ('No Lehreinheit found!');
+
+ $this->addSelect('tbl_lehreinheitgruppe.*');
+ $this->addSelect('tbl_gruppe.direktinskription');
+ $this->addSelect('tbl_gruppe.gruppe_kurzbz');
+ $this->addSelect("CASE
+ WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN
+ COALESCE (
+ UPPER(tbl_studiengang.typ || tbl_studiengang.kurzbz) ||
+ COALESCE(tbl_lehreinheitgruppe.semester::varchar, '') ||
+ COALESCE(tbl_lehreinheitgruppe.verband::varchar, '') ||
+ COALESCE(tbl_lehreinheitgruppe.gruppe, ''),
+ '')
+ ELSE tbl_lehreinheitgruppe.gruppe_kurzbz
+ END AS bezeichnung");
+ $this->addSelect("CASE
+ WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN
+ (
+ SELECT bezeichnung
+ FROM public.tbl_lehrverband
+ WHERE studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
+ AND semester = tbl_lehreinheitgruppe.semester
+ AND verband = tbl_lehreinheitgruppe.verband
+ AND gruppe = tbl_lehreinheitgruppe.gruppe
+ LIMIT 1
+ )
+ ELSE tbl_gruppe.beschreibung
+ END AS beschreibung");
+ $this->addSelect("CASE
+ WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN
+ (
+ SELECT EXISTS (
+ SELECT 1
+ FROM lehre.tbl_stundenplandev
+ WHERE lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
+ AND studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
+ AND semester = tbl_lehreinheitgruppe.semester
+ AND TRIM(COALESCE(verband, '')) = TRIM(tbl_lehreinheitgruppe.verband)
+ AND TRIM(COALESCE(gruppe, '')) = TRIM(tbl_lehreinheitgruppe.gruppe)
+ AND (gruppe_kurzbz IS NULL OR gruppe_kurzbz = '')
+ )
+ )
+ ELSE
+ (
+ SELECT EXISTS (
+ SELECT 1
+ FROM lehre.tbl_stundenplandev
+ WHERE lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
+ AND gruppe_kurzbz = tbl_lehreinheitgruppe.gruppe_kurzbz
+ )
+ )
+ END AS verplant");
+ $this->addJoin('tbl_studiengang', 'studiengang_kz', 'LEFT');
+ $this->addJoin('public.tbl_gruppe', 'gruppe_kurzbz', 'LEFT');
+
+ $this->db->where('lehreinheit_id', $lehreinheit_id);
+ $this->db->group_start()
+ ->where('tbl_gruppe.direktinskription !=', true)
+ ->or_where('tbl_gruppe.direktinskription IS NULL')
+ ->group_end();
+ return $this->load();
+ }
}
diff --git a/application/models/education/Lehreinheitmitarbeiter_model.php b/application/models/education/Lehreinheitmitarbeiter_model.php
index ae1ac55d2..efdb2e74d 100644
--- a/application/models/education/Lehreinheitmitarbeiter_model.php
+++ b/application/models/education/Lehreinheitmitarbeiter_model.php
@@ -10,6 +10,14 @@ class Lehreinheitmitarbeiter_model extends DB_Model
parent::__construct();
$this->dbTable = 'lehre.tbl_lehreinheitmitarbeiter';
$this->pk = array('mitarbeiter_uid', 'lehreinheit_id');
+ $this->hasSequence = false;
+
+ $this->load->model('accounting/Vertrag_model', 'VertragModel');
+ $this->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
+ $this->load->model('ressource/stundenplan_model', 'StundenplanModel');
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
+ $this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
}
/**
@@ -75,4 +83,67 @@ class Lehreinheitmitarbeiter_model extends DB_Model
]);
}
+ public function getLektorenByLe($lehreinheit_id)
+ {
+ $this->addSelect('vorname, nachname, tbl_lehreinheitmitarbeiter.*, stundenplan.verplant');
+ $this->addJoin('tbl_benutzer', 'uid = mitarbeiter_uid');
+ $this->addJoin('tbl_person', 'person_id');
+
+ $this->addJoin('(
+ SELECT 1 as verplant, lehreinheit_id, mitarbeiter_uid
+ FROM lehre.tbl_stundenplandev
+ GROUP BY lehreinheit_id, mitarbeiter_uid
+
+ ) stundenplan', 'stundenplan.mitarbeiter_uid = tbl_lehreinheitmitarbeiter.mitarbeiter_uid AND stundenplan.lehreinheit_id = tbl_lehreinheitmitarbeiter.lehreinheit_id', 'LEFT');
+
+ return $this->loadWhere(array('tbl_lehreinheitmitarbeiter.lehreinheit_id' => $lehreinheit_id));
+ }
+
+ public function getByLeLektor($lehreinheit_id, $mitarbeiter_uid)
+ {
+ $this->addSelect('vorname, nachname, tbl_lehreinheitmitarbeiter.*');
+ $this->addJoin('tbl_benutzer', 'uid = mitarbeiter_uid');
+ $this->addJoin('tbl_person', 'person_id');
+ return $this->loadWhere(array('tbl_lehreinheitmitarbeiter.lehreinheit_id' => $lehreinheit_id, 'tbl_lehreinheitmitarbeiter.mitarbeiter_uid' => $mitarbeiter_uid));
+ }
+
+ public function deleteLektorFromLe($lehreinheit_id, $mitarbeiter_uid)
+ {
+ if (defined('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN') && FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN)
+ {
+ $vertrag_result = $this->VertragModel->getVertrag($mitarbeiter_uid, $lehreinheit_id);
+
+ if (hasData($vertrag_result))
+ return error("Loeschen nur nach Stornierung des Vertrags möglich");
+ }
+
+ $stundenplandev_result = $this->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
+ $stundenplan_result = $this->StundenplanModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
+
+ if (hasData($stundenplandev_result) || hasData($stundenplan_result))
+ return error("Diese/r LektorIn kann nicht gelöscht werden da er schon verplant ist");
+
+ $result = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
+
+ if (hasData($result))
+ {
+ $le_mitarbeiter_array = getData($result)[0];
+
+ if ($le_mitarbeiter_array->vertrag_id !== null)
+ {
+ $vertrag_result = $this->VertragModel->deleteVertrag($le_mitarbeiter_array->vertrag_id);
+ if (isError($vertrag_result))
+ return $vertrag_result;
+ }
+
+ $delete_result = $this->delete(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
+
+ if (isError($delete_result))
+ return $delete_result;
+
+ return success($delete_result);
+ }
+ }
+
+
}
diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php
index 3eb4d33a2..5422c290e 100644
--- a/application/models/education/Lehrveranstaltung_model.php
+++ b/application/models/education/Lehrveranstaltung_model.php
@@ -316,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)
@@ -386,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
@@ -1019,4 +1053,297 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($qry, $params);
}
+
+ public function getLvsByOrganization($oe_kurzbz)
+ {
+ $qry="
+ SELECT
+ distinct on (lehrveranstaltung_id)
+ tbl_lehrveranstaltung.studiengang_kz as lv_studiengang_kz, tbl_lehrveranstaltung.semester as lv_semester,
+ tbl_lehrveranstaltung.kurzbz as lv_kurzbz, tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, tbl_lehrveranstaltung.ects as lv_ects,
+ tbl_lehrveranstaltung.lehreverzeichnis as lv_lehreverzeichnis, tbl_lehrveranstaltung.planfaktor as lv_planfaktor,
+ tbl_lehrveranstaltung.planlektoren as lv_planlektoren, tbl_lehrveranstaltung.planpersonalkosten as lv_planpersonalkosten,
+ tbl_lehrveranstaltung.plankostenprolektor as lv_plankostenprolektor, tbl_lehrveranstaltung.orgform_kurzbz as lv_orgform_kurzbz,
+ tbl_lehrveranstaltung.lehrveranstaltung_id,
+ tbl_lehrveranstaltung.lehrform_kurzbz as lehrform_kurzbz,
+ tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz,
+ tbl_lehrveranstaltung.bezeichnung_english as lv_bezeichnung_english,
+ tbl_lehrveranstaltung.studiengang_kz, tbl_lehrveranstaltung.semester, tbl_lehrveranstaltung.anmerkung, tbl_lehrveranstaltung.sprache, tbl_lehrveranstaltung.semesterstunden,
+ tbl_lehrveranstaltung.lehre, tbl_lehrveranstaltung.aktiv,
+ '' as studienplan_id, '' as studienplan_bezeichnung, tbl_lehrveranstaltung.lehrtyp_kurzbz
+ FROM
+ lehre.tbl_lehrveranstaltung
+ WHERE
+ tbl_lehrveranstaltung.oe_kurzbz= ?
+ AND tbl_lehrveranstaltung.aktiv
+ ";
+
+ return $this->execReadOnlyQuery($qry, array($oe_kurzbz));
+ }
+
+ public function getLvsByFachbereich($fachbereich, $studiensemester_kurbz, $mitarbeiter_uid = null)
+ {
+ $qry = "";
+ if (!is_null($mitarbeiter_uid))
+ {
+ $qry = $this->getLvsFromStudienplanByEmp();
+ $params = array($fachbereich, $studiensemester_kurbz);
+ }
+
+ $qry .= "SELECT
+ distinct on(lehrveranstaltung_id)
+ lv_studiengang_kz, lv_semester, lv_kurzbz, lv_bezeichnung, lv_ects,
+ lv_lehreverzeichnis, lv_planfaktor, lv_planlektoren, lv_planpersonalkosten,
+ lv_plankostenprolektor, lv_orgform_kurzbz, lehrveranstaltung_id,
+ lehrform_kurzbz, lv_lehrform_kurzbz, lv_bezeichnung_english, studiengang_kz, semester, anmerkung, sprache, semesterstunden,
+ lehre, aktiv,
+ '' as studienplan_id, '' as studienplan_bezeichnung,
+ (SELECT lehrtyp_kurzbz FROM lehre.tbl_lehrveranstaltung WHERE lehrveranstaltung_id=vw_lehreinheit.lehrveranstaltung_id) as lehrtyp_kurzbz
+ FROM
+ campus.vw_lehreinheit
+ WHERE studiensemester_kurzbz = ?
+ AND fachbereich_kurzbz = ?";
+
+ $params[] = array($studiensemester_kurbz, $fachbereich);
+
+ if (!is_null($mitarbeiter_uid))
+ {
+ $qry .= " AND mitarbeiter_uid = ?";
+ $params[] = $mitarbeiter_uid;
+ }
+ else
+ {
+ $qry.=" AND lehrveranstaltung_id NOT IN (SELECT lehrveranstaltung_id
+ FROM
+ lehre.tbl_lehrveranstaltung
+ JOIN lehre.tbl_studienplan_lehrveranstaltung USING(lehrveranstaltung_id)
+ JOIN lehre.tbl_studienplan USING(studienplan_id)
+ JOIN lehre.tbl_studienordnung USING(studienordnung_id)
+ JOIN lehre.tbl_studienplan_semester USING(studienplan_id)
+ WHERE
+ tbl_lehrveranstaltung.oe_kurzbz=(Select oe_kurzbz from public.tbl_fachbereich where fachbereich_kurzbz= ?)
+ AND tbl_studienplan_semester.studiensemester_kurzbz= ?";
+
+ $params[] = array($fachbereich, $studiensemester_kurbz);
+ }
+
+ return $this->execReadOnlyQuery($qry, $params);
+ }
+
+ private function getLvsFromStudienplanByEmp()
+ {
+ return "
+ SELECT
+ distinct on (lehrveranstaltung_id)
+ tbl_lehrveranstaltung.studiengang_kz as lv_studiengang_kz,
+ tbl_lehrveranstaltung.semester as lv_semester,
+ tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
+ tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
+ tbl_lehrveranstaltung.ects as lv_ects,
+ tbl_lehrveranstaltung.lehreverzeichnis as lv_lehreverzeichnis,
+ tbl_lehrveranstaltung.planfaktor as lv_planfaktor,
+ tbl_lehrveranstaltung.planlektoren as lv_planlektoren,
+ tbl_lehrveranstaltung.planpersonalkosten as lv_planpersonalkosten,
+ tbl_lehrveranstaltung.plankostenprolektor as lv_plankostenprolektor,
+ tbl_lehrveranstaltung.orgform_kurzbz as lv_orgform_kurzbz,
+ tbl_lehrveranstaltung.lehrveranstaltung_id,
+ tbl_lehrveranstaltung.lehrform_kurzbz as lehrform_kurzbz,
+ tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz,
+ tbl_lehrveranstaltung.bezeichnung_english as lv_bezeichnung_english,
+ tbl_lehrveranstaltung.studiengang_kz,
+ tbl_studienplan_lehrveranstaltung.semester,
+ tbl_lehrveranstaltung.anmerkung,
+ tbl_lehrveranstaltung.sprache,
+ tbl_lehrveranstaltung.semesterstunden,
+ tbl_lehrveranstaltung.lehre,
+ tbl_lehrveranstaltung.aktiv,
+ tbl_studienplan.studienplan_id::text,
+ tbl_studienplan.bezeichnung as studienplan_bezeichnung,
+ tbl_lehrveranstaltung.lehrtyp_kurzbz
+ FROM
+ lehre.tbl_lehrveranstaltung
+ JOIN lehre.tbl_studienplan_lehrveranstaltung USING(lehrveranstaltung_id)
+ JOIN lehre.tbl_studienplan USING(studienplan_id)
+ JOIN lehre.tbl_studienordnung USING(studienordnung_id)
+ JOIN lehre.tbl_studienplan_semester USING(studienplan_id)
+ WHERE
+ tbl_lehrveranstaltung.oe_kurzbz=(Select oe_kurzbz from public.tbl_fachbereich where fachbereich_kurzbz= ?)
+ AND tbl_studienplan_semester.studiensemester_kurzbz = ?
+ AND tbl_lehrveranstaltung.aktiv
+ UNION
+ ";
+ }
+
+ public function getLvsByStudiengang($studienplan_ids, $placeholders, $only_ids, $studiengang_kz, $studiensemester_kurzbz, $semester = null, $verband = null)
+ {
+ $qry = "";
+ $params = array();
+
+ if (!empty($studienplan_ids))
+ {
+ $qry = $this->getLvsFromStudienplanByStudienplanID($placeholders);
+ $params = $studienplan_ids;
+ }
+
+ $qry .= "
+ SELECT DISTINCT on(lehrveranstaltung_id) lehrveranstaltung_id,
+ tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
+ tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
+ tbl_lehrveranstaltung.bezeichnung_english as lv_bezeichnung_english,
+ studiengang_kz,
+ semester,
+ tbl_lehrveranstaltung.sprache,
+ ects as lv_ects,
+ semesterstunden,
+ tbl_lehrveranstaltung.anmerkung,
+ tbl_lehrveranstaltung.lehre,
+ lehreverzeichnis as lv_lehreverzeichnis,
+ tbl_lehrveranstaltung.aktiv,
+ planfaktor as lv_planfaktor,
+ planlektoren as lv_planlektoren,
+ planpersonalkosten as lv_planpersonalkosten,
+ plankostenprolektor as lv_plankostenprolektor,
+ tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz,
+ tbl_lehrveranstaltung.orgform_kurzbz,
+ ''::text as studienplan_id,
+ '' as studienplan_bezeichnung,
+ '' as studienplan_lehrveranstaltung_id_parent,
+ tbl_lehrveranstaltung.lehrtyp_kurzbz,
+ UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang
+ FROM lehre.tbl_lehrveranstaltung
+ JOIN lehre.tbl_lehreinheit USING (lehrveranstaltung_id)
+ JOIN public.tbl_studiengang USING(studiengang_kz)
+ WHERE studiengang_kz = ?
+ AND studiensemester_kurzbz = ?
+ ";
+
+ $params[] = $studiengang_kz;
+ $params[] = $studiensemester_kurzbz;
+ if (!is_null($semester))
+ {
+ $qry .= ' AND semester = ?';
+ $params[] = $semester;
+ }
+ if (!is_null($verband))
+ {
+ $qry .= ' AND (tbl_lehrveranstaltung.orgform_kurzbz = ? OR tbl_lehrveranstaltung.orgform_kurzbz IS NULL)';
+ $params[] = $verband;
+ }
+
+ if (!empty($only_ids))
+ {
+
+ $qry .= ' AND NOT EXISTS (SELECT 1 FROM lehre.tbl_studienplan_lehrveranstaltung where studienplan_id IN ?
+ AND lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND tbl_lehrveranstaltung.aktiv)';
+
+ $params[] = $only_ids;
+ }
+
+ return $this->execReadOnlyQuery($qry, $params);
+ }
+ private function getLvsFromStudienplanByStudienplanID($placeholders)
+ {
+ return "
+ SELECT
+ lehrveranstaltung_id, tbl_lehrveranstaltung.kurzbz as lv_kurzbz, tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, bezeichnung_english as lv_bezeichnung_english, studiengang_kz,
+ tbl_studienplan_lehrveranstaltung.semester, tbl_lehrveranstaltung.sprache,
+ ects as lv_ects, semesterstunden, anmerkung, lehre, lehreverzeichnis as lv_lehreverzeichnis, tbl_lehrveranstaltung.aktiv,
+ planfaktor as lv_planfaktor, planlektoren as lv_planlektoren, planpersonalkosten as lv_planpersonalkosten,
+ plankostenprolektor as lv_plankostenprolektor, lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.orgform_kurzbz,
+ tbl_studienplan_lehrveranstaltung.studienplan_id::text as studienplan_id, tbl_studienplan.bezeichnung as studienplan_bezeichnung, tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent::text,
+ tbl_lehrveranstaltung.lehrtyp_kurzbz, UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang
+ FROM
+ lehre.tbl_lehrveranstaltung
+ JOIN lehre.tbl_studienplan_lehrveranstaltung USING(lehrveranstaltung_id)
+ JOIN lehre.tbl_studienplan USING(studienplan_id)
+ JOIN tbl_studiengang USING(studiengang_kz)
+ WHERE
+ tbl_lehrveranstaltung.aktiv AND ((studienplan_id, tbl_studienplan_lehrveranstaltung.semester) IN ( " . implode(',', $placeholders) . "))
+ UNION
+ ";
+ }
+
+ public function getAllOe($lv_id)
+ {
+ $qry = "SELECT DISTINCT oe_kurzbz
+ FROM lehre.tbl_studienplan_lehrveranstaltung
+ JOIN lehre.tbl_studienplan USING(studienplan_id)
+ JOIN lehre.tbl_studienordnung USING(studienordnung_id)
+ JOIN public.tbl_studiengang USING(studiengang_kz)
+ WHERE lehrveranstaltung_id = ?
+
+ UNION
+
+ (
+ SELECT oe_kurzbz
+ FROM public.tbl_studiengang
+ WHERE studiengang_kz = (
+ SELECT tbl_lehrveranstaltung.studiengang_kz
+ FROM lehre.tbl_lehrveranstaltung
+ WHERE lehrveranstaltung_id = ?
+ )
+ )
+ ";
+
+ $params = array($lv_id, $lv_id);
+
+ return $this->execReadOnlyQuery($qry, $params);
+ }
+
+ /**
+ * Gets Lehrveranstaltungen for a student, as needed for a Projektarbeit.
+ * @param student_uid
+ * @param studiengang_kz optional, all Lvs of this Studiengang will be included
+ * @param additional_lehrveranstaltung_id optional, this lv will be added to result
+ * @return object success or error
+ */
+ public function getLvsForProjektarbeit($student_uid, $studiengang_kz = null, $additional_lehrveranstaltung_id = null)
+ {
+ $params = array($student_uid, $student_uid);
+
+ $qry = "
+ SELECT *
+ FROM
+ lehre.tbl_lehrveranstaltung
+ WHERE
+ (
+ lehrveranstaltung_id IN (
+
+ SELECT
+ lehrveranstaltung_id
+ FROM
+ campus.vw_student_lehrveranstaltung
+ WHERE
+ uid=?
+
+ UNION
+
+ SELECT
+ lehrveranstaltung_id
+ FROM
+ lehre.tbl_zeugnisnote
+ WHERE
+ student_uid=?
+ )";
+
+ if (isset($studiengang_kz))
+ {
+ $params[] = $studiengang_kz;
+ $qry .= " OR (studiengang_kz = ? AND semester IS NOT NULL)";
+ }
+
+ if (isset($additional_lehrveranstaltung_id))
+ {
+ $params[] = $additional_lehrveranstaltung_id;
+ $qry .= " OR lehrveranstaltung_id = ?";
+ }
+
+ $qry .= "
+ )
+ AND projektarbeit = TRUE
+ ORDER BY
+ semester, bezeichnung";
+
+ return $this->execQuery($qry, $params);
+ }
}
diff --git a/application/models/education/Note_model.php b/application/models/education/Note_model.php
index 80b454398..87a1501e0 100644
--- a/application/models/education/Note_model.php
+++ b/application/models/education/Note_model.php
@@ -11,4 +11,12 @@ class Note_model extends DB_Model
$this->dbTable = 'lehre.tbl_note';
$this->pk = 'note';
}
+
+ public function getAllActive() {
+ $qry ="SELECT *
+ FROM lehre.tbl_note
+ WHERE aktiv = true";
+
+ return $this->execReadOnlyQuery($qry);
+ }
}
\ No newline at end of file
diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php
index 343a86706..99b9b75f1 100644
--- a/application/models/education/Paabgabe_model.php
+++ b/application/models/education/Paabgabe_model.php
@@ -60,5 +60,69 @@ class Paabgabe_model extends DB_Model
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 4083dbf6e..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;
}
@@ -97,36 +109,36 @@ class Projektarbeit_model extends DB_Model
*/
public function getStudentProjektarbeitenWithBetreuer($studentUID)
{
- $betreuerQuery = "
- SELECT
+ $betreuerQuery = "SELECT * FROM (SELECT DISTINCT ON(projektarbeit_id)
vorname as bvorname,
nachname as bnachname,
titelpre as btitelpre,
titelpost AS btitelpost,
- titelpost AS btitelpost,
tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
- (SELECT person_id
- FROM lehre.tbl_projektbetreuer
+ (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
+ 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)
+ 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,
-
+ 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_projektbetreuer.note as note,
+ 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,
@@ -135,9 +147,8 @@ class Projektarbeit_model extends DB_Model
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,
- (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuer_person_id = tbl_projektbetreuer.person_id) AS babgeschickt,
- (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_abgeschickt,
+ 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
@@ -146,15 +157,17 @@ class Projektarbeit_model extends DB_Model
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)
- WHERE
- tbl_projektarbeit.student_uid = ? AND
+ 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')";
-
+ AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')) as base
+ ORDER BY insertamum DESC";
+
return $this->execReadOnlyQuery($betreuerQuery, array($studentUID));
}
@@ -167,8 +180,12 @@ class Projektarbeit_model extends DB_Model
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)
@@ -178,16 +195,76 @@ class Projektarbeit_model extends DB_Model
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 trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first,
- public.tbl_mitarbeiter.mitarbeiter_uid, anrede
- FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id)
- JOIN public.tbl_benutzer ON(public.tbl_benutzer.person_id=public.tbl_person.person_id)
- JOIN public.tbl_mitarbeiter ON(public.tbl_benutzer.uid=public.tbl_mitarbeiter.mitarbeiter_uid)
- WHERE public.tbl_person.person_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) {
@@ -222,9 +299,9 @@ class Projektarbeit_model extends DB_Model
*
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_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
- tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_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)
@@ -261,4 +338,216 @@ class Projektarbeit_model extends DB_Model
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/organisation/Organisationseinheit_model.php b/application/models/organisation/Organisationseinheit_model.php
index ba91964f6..9f64580a9 100644
--- a/application/models/organisation/Organisationseinheit_model.php
+++ b/application/models/organisation/Organisationseinheit_model.php
@@ -213,4 +213,50 @@ class Organisationseinheit_model extends DB_Model
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 02f972690..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(
@@ -657,37 +660,7 @@ class Studiengang_model extends DB_Model
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model('crm/Student_model', 'StudentModel');
-
- $addEmailProperty= function(&$benutzerfunktionen){
- if(count($benutzerfunktionen) && defined('DOMAIN'))
- {
- $benutzerfunktionen = array_map(function($benutzer)
- {
- $benutzer->email = $benutzer->alias."@".DOMAIN;
- return $benutzer;
- },$benutzerfunktionen) ;
- }
-
- };
- $addFotoProperty= function(&$collection){
- $collection = array_map(function($item){
- $person_id = $this->PersonModel->getByUid($item->uid);
- if(isError($person_id))
- return error($person_id);
- $person_id = current(getData($person_id))->person_id;
- $this->PersonModel->addSelect('foto');
- $foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id));
- if(isError($foto))
- return error($foto);
- $foto = current(getData($foto))->foto;
- $item->foto = $foto;
- return $item;
- },$collection);
- };
-
- $this->load->model('crm/Student_model', 'StudentModel');
-
$student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]);
if (isError($student))
return error($student);
@@ -712,7 +685,7 @@ class Studiengang_model extends DB_Model
$stg_ltg = array_values(array_filter($stg_ltg, function($stg_leitung){
return $stg_leitung->aktiv;
}));
- $addFotoProperty($stg_ltg);
+ $this->addFotoProperty($stg_ltg);
$gf_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz);
if (isError($gf_ltg))
@@ -721,8 +694,8 @@ class Studiengang_model extends DB_Model
$gf_ltg = array_values(array_filter($gf_ltg, function($gf_leitung){
return $gf_leitung->aktiv;
}));
- $addEmailProperty($gf_ltg);
- $addFotoProperty($gf_ltg);
+ $this->addEmailProperty($gf_ltg);
+ $this->addFotoProperty($gf_ltg);
$stv_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz);
if (isError($stv_ltg))
@@ -731,8 +704,8 @@ class Studiengang_model extends DB_Model
$stv_ltg = array_values(array_filter($stv_ltg, function($stv_leitung){
return $stv_leitung->aktiv;
}));
- $addEmailProperty($stv_ltg);
- $addFotoProperty($stv_ltg);
+ $this->addEmailProperty($stv_ltg);
+ $this->addFotoProperty($stv_ltg);
$ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
if (isError($ass))
@@ -741,8 +714,8 @@ class Studiengang_model extends DB_Model
$ass = array_values(array_filter($ass, function($assistenz){
return $assistenz->aktiv;
}));
- $addEmailProperty($ass);
- $addFotoProperty($ass);
+ $this->addEmailProperty($ass);
+ $this->addFotoProperty($ass);
$hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv');
if (isError($hochschulvertr))
@@ -751,7 +724,7 @@ class Studiengang_model extends DB_Model
$hochschulvertr = array_values(array_filter($hochschulvertr, function($hochschul_vertreter){
return $hochschul_vertreter->aktiv;
}));
- $addEmailProperty($hochschulvertr);
+ $this->addEmailProperty($hochschulvertr);
$stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz);
@@ -761,7 +734,7 @@ class Studiengang_model extends DB_Model
$stdv = array_values(array_filter($stdv, function($std_vertreter){
return $std_vertreter->aktiv;
}));
- $addEmailProperty($stdv);
+ $this->addEmailProperty($stdv);
$jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester);
@@ -771,7 +744,7 @@ class Studiengang_model extends DB_Model
$jahrgangsvertr = array_values(array_filter($jahrgangsvertr, function($jahrgang_vertreter){
return $jahrgang_vertreter->aktiv;
}));
- $addEmailProperty($jahrgangsvertr);
+ $this->addEmailProperty($jahrgangsvertr);
$result_object = new stdClass();
@@ -801,4 +774,141 @@ class Studiengang_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($studiengang_kz, $orgform_kurzbz, $studiensemester_kurzbz));
}
+
+ /**
+ * Get active Studiengänge with Kuerzel by given Studiengang-Kennzahlen.
+ * Helpful to easily get Studiengänge the user is entitled for.
+ *
+ * @param $studiengang_kz_arr
+ * @param $studiensemester_kurzbz
+ * @return array|stdClass|null Returns one row per Studiengang. Not considering the Orgforms.
+ */
+ public function getByStgs($studiengang_kz_arr, $studiensemester_kurzbz)
+ {
+ if (is_numeric($studiengang_kz_arr))
+ {
+ $studiengang_kz_arr = [$studiengang_kz_arr];
+ }
+
+ $qry = '
+ SELECT
+ DISTINCT stg.*, UPPER(typ::varchar(1) || kurzbz) AS kuerzel
+ FROM
+ public.tbl_studiengang stg
+ JOIN lehre.tbl_studienordnung sto USING(studiengang_kz)
+ JOIN lehre.tbl_studienplan stpl USING(studienordnung_id)
+ JOIN lehre.tbl_studienplan_semester stplsem USING(studienplan_id)
+ WHERE
+ stg.studiengang_kz IN ?
+ AND stplsem.studiensemester_kurzbz = ?
+ ORDER BY
+ stg.kurzbzlang
+ ';
+
+ return $this->execQuery($qry, [$studiengang_kz_arr, $studiensemester_kurzbz]);
+ }
+
+ /**
+ * Get OrgForms of given Studiengang and Studiensemester.
+ *
+ * @param $studiengang_kz
+ * @param $studiensemester_kurzbz
+ * @return array|stdClass|null
+ */
+ public function getOrgformsByStg($studiengang_kz, $studiensemester_kurzbz)
+ {
+ $qry = '
+ SELECT
+ stpl.orgform_kurzbz
+ FROM
+ public.tbl_studiengang stg
+ JOIN lehre.tbl_studienordnung sto USING(studiengang_kz)
+ JOIN lehre.tbl_studienplan stpl USING(studienordnung_id)
+ JOIN lehre.tbl_studienplan_semester stplsem USING(studienplan_id)
+ WHERE
+ stg.studiengang_kz = ?
+ AND stg.aktiv = TRUE
+ AND stplsem.studiensemester_kurzbz = ?
+ GROUP BY
+ stpl.orgform_kurzbz
+ ORDER BY
+ CASE stpl.orgform_kurzbz
+ WHEN \'VZ\' THEN 1
+ WHEN \'BB\' THEN 2
+ WHEN \'DUA\' THEN 3
+ ELSE 4
+ END,
+ stpl.orgform_kurzbz;
+ ';
+
+ return $this->execQuery($qry, [$studiengang_kz, $studiensemester_kurzbz]);
+ }
+
+ public function getStudiengaengeFiltered($allowed_stg) {
+ $query ="SELECT DISTINCT
+ public.tbl_studiengang.studiengang_kz,
+ public.tbl_studiengang.bezeichnung,
+ public.tbl_studiengang.kurzbzlang,
+ public.tbl_studiengang.orgform_kurzbz
+ FROM public.tbl_studiengang JOIN lehre.tbl_studienordnung USING(studiengang_kz)
+ JOIN lehre.tbl_studienplan USING(studienordnung_id)
+ JOIN lehre.tbl_studienplan_semester USING(studienplan_id)
+ WHERE public.tbl_studiengang.aktiv = true
+
+ AND public.tbl_studiengang.studiengang_kz IN ?
+ ORDER BY public.tbl_studiengang.kurzbzlang";
+
+ return $this->execReadOnlyQuery($query, [$allowed_stg]);
+ }
+
+ public function getAssistenzForStudiengangKZ($stg_kz) {
+ $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
+
+ $stg_obj = $this->load($stg_kz);
+ if(isError($stg_obj))
+ return error($stg_obj);
+ if(getData($stg_obj))
+ {
+ $stg_obj = current(getData($stg_obj));
+ }
+
+ $ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
+ if (isError($ass))
+ return $ass;
+ $ass = getData($ass) ?: [];
+ $ass = array_values(array_filter($ass, function($assistenz){
+ return $assistenz->aktiv;
+ }));
+
+ $this->addEmailProperty($ass);
+
+ return success($ass);
+ }
+
+ private function addEmailProperty(&$benutzerfunktionen) {
+ if(count($benutzerfunktionen) && defined('DOMAIN'))
+ {
+ $benutzerfunktionen = array_map(function($benutzer)
+ {
+ $benutzer->email = $benutzer->alias."@".DOMAIN;
+ return $benutzer;
+ },$benutzerfunktionen) ;
+ }
+ }
+
+ private function addFotoProperty (&$collection) {
+ $collection = array_map(function($item){
+ $person_id = $this->PersonModel->getByUid($item->uid);
+ if(isError($person_id))
+ return error($person_id);
+ $person_id = current(getData($person_id))->person_id;
+ $this->PersonModel->addSelect('foto');
+ $foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id));
+ if(isError($foto))
+ return error($foto);
+ $foto = current(getData($foto))->foto;
+ $item->foto = $foto;
+ return $item;
+ },$collection);
+ }
}
diff --git a/application/models/organisation/Studienplan_model.php b/application/models/organisation/Studienplan_model.php
index 569aebd0b..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');
@@ -135,6 +137,26 @@ class Studienplan_model extends DB_Model
]);
}
+ 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();
diff --git a/application/models/person/Benutzerfunktion_model.php b/application/models/person/Benutzerfunktion_model.php
index 8c43e4f84..dff422b7d 100644
--- a/application/models/person/Benutzerfunktion_model.php
+++ b/application/models/person/Benutzerfunktion_model.php
@@ -261,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/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 1835296fe..64fce8944 100644
--- a/application/models/person/Notiz_model.php
+++ b/application/models/person/Notiz_model.php
@@ -151,7 +151,7 @@ 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
@@ -195,15 +195,18 @@ class Notiz_model extends DB_Model
LEFT JOIN
public.tbl_person person_bearbeiter ON (person_bearbeiter.person_id = p_bearbeiter.person_id)
WHERE
- z.$type = ?
- GROUP BY
+ z.$type = ?";
+
+ if ($withoutTags)
+ $qry .= " AND n.typ IS NULL ";
+
+ $qry .= "GROUP BY
notiz_id, z.notizzuordnung_id,
person_verfasser.vorname, person_verfasser.nachname,
person_bearbeiter.vorname, person_bearbeiter.nachname
";
return $this->execQuery($qry, array($type, $id));
-
}
diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php
index 997048972..e72b24de4 100644
--- a/application/models/person/Person_model.php
+++ b/application/models/person/Person_model.php
@@ -151,12 +151,21 @@ class Person_model extends DB_Model
*/
public function searchPerson($filter)
{
- $this->addSelect('vorname, nachname, gebdatum, person_id');
+ $this->addSelect('vorname, nachname, gebdatum, person_id, titelpre, titelpost');
+ $this->addSelect("CASE
+ WHEN EXISTS
+ (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=tbl_person.person_id)
+ THEN 'Mitarbeiter'
+ WHEN EXISTS
+ (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=tbl_person.person_id)
+ THEN 'Student'
+ ELSE 'Person'
+ END AS status");
$result = $this->loadWhere(
- 'lower(nachname) like '.$this->db->escape('%'.$filter.'%')."
+ 'lower(nachname) like '.$this->db->escape('%'.mb_strtolower($filter).'%')."
OR lower(vorname) like ".$this->db->escape('%'.$filter.'%')."
- OR lower(nachname || ' ' || vorname) like ".$this->db->escape('%'.$filter.'%')."
- OR lower(vorname || ' ' || nachname) like ".$this->db->escape('%'.$filter.'%')
+ OR lower(nachname || ' ' || vorname) like ".$this->db->escape('%'.mb_strtolower($filter).'%')."
+ OR lower(vorname || ' ' || nachname) like ".$this->db->escape('%'.mb_strtolower($filter).'%')
);
return $result;
@@ -307,72 +316,60 @@ class Person_model extends DB_Model
public function checkDuplicate($person_id)
{
- $qry = "SELECT person_id
- FROM public.tbl_prestudent p
- JOIN
- (
- SELECT DISTINCT ON(prestudent_id) *
- FROM public.tbl_prestudentstatus
- WHERE prestudent_id IN
- (
- SELECT prestudent_id
- FROM public.tbl_prestudent
- WHERE person_id IN
- (
- SELECT p2.person_id
- FROM public.tbl_person p
- JOIN public.tbl_person p2
- ON lower(p.vorname) = lower(p2.vorname)
- AND lower(p.nachname) = lower(p2.nachname)
- AND p.gebdatum = p2.gebdatum
- AND p.person_id = ?
- )
- )
- ORDER BY prestudent_id, datum DESC, insertamum DESC
- ) ps USING(prestudent_id)
- JOIN public.tbl_status USING(status_kurzbz)
+ $qry = "
+ WITH person AS (
+ SELECT *
+ FROM public.tbl_person
+ WHERE person_id = ?
+ ),
+ allePersonen AS (
+ SELECT p.person_id
+ FROM public.tbl_person p
+ JOIN person
+ ON lower(p.vorname) = lower(person.vorname)
+ AND lower(p.nachname) = lower(person.nachname)
+ AND p.gebdatum = person.gebdatum
+ ),
+ lastStatus AS (
+ SELECT DISTINCT ON (tbl_prestudentstatus.prestudent_id)
+ tbl_prestudentstatus.prestudent_id,
+ tbl_prestudentstatus.status_kurzbz,
+ tbl_prestudent.studiengang_kz,
+ tbl_prestudent.person_id
+ FROM public.tbl_prestudentstatus
+ JOIN public.tbl_prestudent USING (prestudent_id)
+ WHERE tbl_prestudent.person_id IN (SELECT person_id FROM allePersonen)
+ ORDER BY tbl_prestudentstatus.prestudent_id, tbl_prestudentstatus.datum DESC, tbl_prestudentstatus.insertamum DESC
+ ),
+ interessenten AS (
+ SELECT *
+ FROM lastStatus
WHERE status_kurzbz = 'Interessent'
- AND studiengang_kz IN
- (
- SELECT studiengang_kz
- FROM public.tbl_prestudent p
- JOIN
- (
- SELECT DISTINCT ON(prestudent_id) *
- FROM public.tbl_prestudentstatus
- WHERE prestudent_id IN
- (
- SELECT prestudent_id
- FROM public.tbl_prestudent
- WHERE person_id IN
- (
- SELECT p2.person_id
- FROM public.tbl_person p
- JOIN public.tbl_person p2
- ON lower(p.vorname) = lower(p2.vorname)
- AND lower(p.nachname) = lower(p2.nachname)
- AND p.gebdatum = p2.gebdatum
- AND p.person_id = ?
- )
- )
- ORDER BY prestudent_id, datum DESC, insertamum DESC
- ) ps USING(prestudent_id)
- JOIN public.tbl_status USING(status_kurzbz)
- WHERE status_kurzbz = 'Abbrecher'
- )
-
- UNION
-
+ ),
+ keineInteressenten AS (
+ SELECT *
+ FROM lastStatus
+ WHERE status_kurzbz != 'Interessent'
+ ),
+ doppeltePerson AS (
SELECT p2.person_id
- FROM tbl_person p1
- JOIN tbl_prestudent ps ON p1.person_id = ps.person_id
- INNER JOIN (
- SELECT vorname, nachname, gebdatum, person.person_id
- FROM tbl_person person
- JOIN tbl_prestudent sps ON person.person_id = sps.person_id
- ) p2
- ON (lower(p1.vorname) = lower(p2.vorname) AND lower(p1.nachname) = lower(p2.nachname) AND p1.gebdatum = p2.gebdatum)
- WHERE p1.person_id != p2.person_id AND (p1.person_id = ?)";
+ FROM public.tbl_person p1
+ JOIN public.tbl_prestudent ps1 ON ps1.person_id = p1.person_id
+ JOIN public.tbl_person p2
+ ON lower(p1.vorname) = lower(p2.vorname)
+ AND lower(p1.nachname) = lower(p2.nachname)
+ AND p1.gebdatum = p2.gebdatum
+ WHERE p1.person_id = ?
+ AND p1.person_id <> p2.person_id
+ )
+ SELECT DISTINCT(interessenten.person_id)
+ FROM interessenten
+ JOIN keineInteressenten
+ ON interessenten.studiengang_kz = keineInteressenten.studiengang_kz
+ WHERE interessenten.person_id = ?
+ UNION
+ SELECT DISTINCT person_id
+ FROM doppeltePerson";
return $this->execQuery($qry, array($person_id, $person_id, $person_id));
}
@@ -423,4 +420,17 @@ class Person_model extends DB_Model
return success($result);
}
}
-}
\ No newline at end of file
+
+ public function loadAllStudentUIDSForPersonID($person_id) {
+ $qry = "SELECT
+ CONCAT(tp.vorname, ' ', tp.nachname) AS name,
+ ARRAY_AGG(DISTINCT b.uid ORDER BY b.uid) AS uids
+ FROM public.tbl_student s
+ JOIN public.tbl_benutzer b ON s.student_uid = b.uid
+ JOIN public.tbl_person tp ON b.person_id = tp.person_id
+ GROUP BY tp.vorname, tp.nachname, b.aktiv, b.person_id
+ HAVING b.person_id = ? AND b.aktiv IS TRUE;";
+
+ return $this->execReadOnlyQuery($qry, [$person_id]);
+ }
+}
diff --git a/application/models/person/Profil_update_model.php b/application/models/person/Profil_update_model.php
index ffb04b7e7..039810537 100644
--- a/application/models/person/Profil_update_model.php
+++ b/application/models/person/Profil_update_model.php
@@ -63,6 +63,7 @@ class Profil_update_model extends DB_Model
$this->addSelect(["public.tbl_profil_update.*", "public.tbl_person.vorname"]);
$this->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_profil_update.uid");
$this->addJoin("public.tbl_person", "public.tbl_person.person_id = public.tbl_benutzer.person_id");
+ $this->db->order_by('COALESCE(public.tbl_profil_update.updateamum, public.tbl_profil_update.insertamum)', 'DESC', false);
$res = $this->loadWhere($whereClause);
if (isError($res)) {
return $res;
@@ -118,13 +119,48 @@ class Profil_update_model extends DB_Model
$parameters = [];
$query = "
SELECT
- profil_update_id, tbl_profil_update.uid, (tbl_person.vorname || ' ' || tbl_person.nachname) AS name , topic, requested_change, tbl_profil_update.updateamum, tbl_profil_update.updatevon, tbl_profil_update.insertamum, tbl_profil_update.insertvon, status, public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] as status_translated, status_timestamp, status_message, attachment_id
+ profil_update_id,
+ tbl_profil_update.uid,
+ (tbl_person.vorname || ' ' || tbl_person.nachname) AS name ,
+ topic,
+ requested_change,
+ tbl_profil_update.updateamum,
+ tbl_profil_update.updatevon,
+ tbl_profil_update.insertamum,
+ tbl_profil_update.insertvon,
+ status,
+ public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] as status_translated,
+ status_timestamp,
+ status_message,
+ attachment_id,
+ UPPER(public.tbl_studiengang.typ || public.tbl_studiengang.kurzbz) AS studiengang,
+ COALESCE(of.orgform_kurzbz, public.tbl_studiengang.orgform_kurzbz) AS orgform,
+ NULL as oezuordnung,
+ tbl_student.semester
FROM public.tbl_profil_update
JOIN public.tbl_profil_update_status ON public.tbl_profil_update_status.status_kurzbz = public.tbl_profil_update.status
JOIN public.tbl_student ON public.tbl_student.student_uid=public.tbl_profil_update.uid
JOIN public.tbl_benutzer ON public.tbl_benutzer.uid = public.tbl_student.student_uid
JOIN public.tbl_person ON public.tbl_benutzer.person_id=public.tbl_person.person_id
JOIN public.tbl_studiengang ON public.tbl_studiengang.studiengang_kz=public.tbl_student.studiengang_kz
+ LEFT JOIN (
+ select
+ pss.prestudent_id, COALESCE(sp.orgform_kurzbz, pss.orgform_kurzbz) as orgform_kurzbz
+ from (
+ select
+ prestudent_id, max(insertamum) as insertamum
+ from
+ public.tbl_prestudentstatus
+ where
+ datum <= NOW()
+ group by
+ prestudent_id
+ ) mpss
+ join
+ public.tbl_prestudentstatus pss on pss.prestudent_id = mpss.prestudent_id and pss.insertamum = mpss.insertamum
+ left join
+ lehre.tbl_studienplan sp on pss.studienplan_id = sp.studienplan_id
+ ) of ON of.prestudent_id = public.tbl_student.prestudent_id
Where public.tbl_studiengang.oe_kurzbz IN ? ";
$parameters[] = $oe_berechtigung;
if ($whereClause) {
@@ -144,12 +180,33 @@ class Profil_update_model extends DB_Model
}
}
if ($mitarbeiterBerechtigung) {
- $this->addSelect(["profil_update_id", "tbl_profil_update.uid", "(tbl_person.vorname || ' ' || tbl_person.nachname) AS name", "topic", "requested_change", "tbl_profil_update.updateamum", "tbl_profil_update.updatevon", "tbl_profil_update.insertamum", "tbl_profil_update.insertvon", "status", "public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] AS status_translated", "status_timestamp", "status_message", "attachment_id"]);
+ $this->addSelect([
+ "profil_update_id",
+ "tbl_profil_update.uid",
+ "(tbl_person.vorname || ' ' || tbl_person.nachname) AS name",
+ "topic",
+ "requested_change",
+ "tbl_profil_update.updateamum",
+ "tbl_profil_update.updatevon",
+ "tbl_profil_update.insertamum",
+ "tbl_profil_update.insertvon",
+ "status",
+ "public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] AS status_translated",
+ "status_timestamp",
+ "status_message",
+ "attachment_id",
+ "COALESCE(NULL) as studiengang",
+ "COALESCE(NULL) as orgform",
+ "oe.bezeichnung as oezuordnung"
+ ]);
$this->addJoin('tbl_profil_update_status', 'tbl_profil_update_status.status_kurzbz=tbl_profil_update.status');
$this->addJoin('tbl_mitarbeiter', 'tbl_mitarbeiter.mitarbeiter_uid=tbl_profil_update.uid');
$this->addJoin('tbl_benutzer', 'tbl_benutzer.uid=tbl_profil_update.uid');
$this->addJoin('tbl_person', 'tbl_benutzer.person_id=tbl_person.person_id');
+ $this->addJoin('tbl_benutzerfunktion bf', 'bf.uid = tbl_benutzer.uid AND bf.funktion_kurzbz = \'oezuordnung\' AND NOW() >= COALESCE(bf.datum_von, \'1970-01-01\'::date) AND NOW() <= COALESCE(bf.datum_bis, \'2170-12-31\'::date)', 'LEFT');
+ $this->addJoin('tbl_organisationseinheit oe', 'oe.oe_kurzbz = bf.oe_kurzbz', 'LEFT');
$mitarbeiterRequests = $this->loadWhere($whereClause);
+
if (isError($mitarbeiterRequests))
return error("db error: " . getData($mitarbeiterRequests));
$mitarbeiterRequests = getData($mitarbeiterRequests) ?: [];
@@ -179,8 +236,11 @@ class Profil_update_model extends DB_Model
private function formatProfilRequest($request)
{
$request->requested_change = json_decode($request->requested_change);
+ $request->insertamum_iso = !is_null($request->insertamum) ? date_create($request->insertamum)->format('Y-m-d') : null;
$request->insertamum = !is_null($request->insertamum) ? date_create($request->insertamum)->format('d.m.Y') : null;
+ $request->updateamum_iso = !is_null($request->updateamum) ? date_create($request->updateamum)->format('Y-m-d') : null;
$request->updateamum = !is_null($request->updateamum) ? date_create($request->updateamum)->format('d.m.Y') : null;
+ $request->status_timestamp_iso = !is_null($request->status_timestamp) ? date_create($request->status_timestamp)->format('Y-m-d') : null;
$request->status_timestamp = !is_null($request->status_timestamp) ? date_create($request->status_timestamp)->format('d.m.Y') : null;
}
diff --git a/application/models/ressource/Betriebsmittelperson_model.php b/application/models/ressource/Betriebsmittelperson_model.php
index 6da9a384d..219af51b8 100644
--- a/application/models/ressource/Betriebsmittelperson_model.php
+++ b/application/models/ressource/Betriebsmittelperson_model.php
@@ -97,7 +97,7 @@ class Betriebsmittelperson_model extends DB_Model
return $this->loadWhere($condition);
}
- public function getBetriebsmittelData($id, $type_id)
+ public function getBetriebsmittelData($id, $type_id, $betriesmitteltypes = null)
{
switch ($type_id) {
case 'person_id':
@@ -113,6 +113,15 @@ class Betriebsmittelperson_model extends DB_Model
return error("ID nicht gültig");
}
+ $cond .= " = ? ";
+ $params[] = $id;
+
+ if ($betriesmitteltypes && !isEmptyArray($betriesmitteltypes))
+ {
+ $cond .= " AND bm.betriebsmitteltyp IN ?";
+ $params[] = $betriesmitteltypes;
+ }
+
$query = "
SELECT
bm.nummer, bmp.person_id, bm.betriebsmitteltyp, bmp.anmerkung as anmerkung,
@@ -126,9 +135,9 @@ class Betriebsmittelperson_model extends DB_Model
JOIN
wawi.tbl_betriebsmittel bm ON (bmp.betriebsmittel_id = bm.betriebsmittel_id)
WHERE
- " . $cond . " = ? ";
+ " . $cond;
- return $this->execQuery($query, array($id));
+ return $this->execQuery($query, $params);
}
/**
diff --git a/application/models/ressource/Firma_model.php b/application/models/ressource/Firma_model.php
index 431f0815f..5ae53eeaf 100644
--- a/application/models/ressource/Firma_model.php
+++ b/application/models/ressource/Firma_model.php
@@ -12,17 +12,24 @@ class Firma_model extends DB_Model
$this->pk = 'firma_id';
}
- public function searchFirmen($filter)
+ public function searchFirmen($filter, $aktiv = null)
{
+ $params = [];
$filter = strtoLower($filter);
$qry = "
- SELECT
+ SELECT
f.name, f.firma_id
- FROM
- public.tbl_firma f
- WHERE
- lower (f.name) LIKE '%". $this->db->escape_like_str($filter)."%'";
+ FROM
+ public.tbl_firma f
+ WHERE
+ lower (f.name) LIKE '%". $this->db->escape_like_str($filter)."%'";
- return $this->execQuery($qry);
+ if (isset($aktiv) && is_bool($aktiv))
+ {
+ $params[] = $aktiv;
+ $qry .= " AND aktiv = ?";
+ }
+
+ return $this->execQuery($qry, $params);
}
}
diff --git a/application/models/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php
index bf4672070..d8bbd7d63 100644
--- a/application/models/ressource/Mitarbeiter_model.php
+++ b/application/models/ressource/Mitarbeiter_model.php
@@ -209,7 +209,7 @@ class Mitarbeiter_model extends DB_Model
{
$qry = "
SELECT
- titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe
+ 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)
@@ -353,27 +353,33 @@ class Mitarbeiter_model extends DB_Model
{
$filter = strtoLower($filter);
+ $returnwert = "p.person_id, p.nachname, p.vorname, p.titelpost, p.titelpre";
+
if ($mode == "mitAkadGrad")
- $returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
+ $returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
elseif ($mode == "ohneMaUid")
- $returnwert = "p.person_id, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter";
+ $returnwert .= ", CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter";
else
- $returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
+ $returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
$qry = "
- SELECT " . $returnwert . "
- FROM
+ SELECT " . $returnwert . "
+ FROM
public.tbl_mitarbeiter ma
- JOIN
+ JOIN
public.tbl_benutzer b on (ma.mitarbeiter_uid = b.uid)
- JOIN
+ JOIN
public.tbl_person p on (p.person_id = b.person_id)
- WHERE
+ 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);
}
@@ -387,14 +393,14 @@ class Mitarbeiter_model extends DB_Model
public function getMitarbeiterFromLV($lehrveranstaltung_id)
{
$qry = "SELECT DISTINCT
- lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid
- FROM
+ lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid
+ FROM
lehre.tbl_lehreinheitmitarbeiter, campus.vw_mitarbeiter, lehre.tbl_lehreinheit
- WHERE
+ WHERE
lehrveranstaltung_id= ?
- AND
- mitarbeiter_uid=uid
- AND
+ AND
+ mitarbeiter_uid=uid
+ AND
tbl_lehreinheitmitarbeiter.lehreinheit_id=tbl_lehreinheit.lehreinheit_id;";
$parametersArray = array($lehrveranstaltung_id);
@@ -430,4 +436,18 @@ class Mitarbeiter_model extends DB_Model
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 789ff3d9c..0c391ea20 100644
--- a/application/models/ressource/Reservierung_model.php
+++ b/application/models/ressource/Reservierung_model.php
@@ -76,7 +76,7 @@ class Reservierung_model extends DB_Model
*
* @return stdClass
*/
- public function getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz = null)
+ public function getReservierungenMitarbeiter($start_date, $end_date)
{
$raum_reservierungen_query = "SELECT res.*, beginn, ende,
@@ -89,7 +89,6 @@ class Reservierung_model extends DB_Model
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde
WHERE res.uid = ? AND datum >= ? AND datum <= ?";
-// $subquery = is_null($ort_kurzbz)? $lvplan_reservierungen_query:$raum_reservierungen_query;
$subquery = $raum_reservierungen_query;
diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php
index 389be582d..d0a97ed9d 100644
--- a/application/models/ressource/Stundenplan_model.php
+++ b/application/models/ressource/Stundenplan_model.php
@@ -470,12 +470,12 @@ 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).")". $stringGroupLv. ")";
+ ." AND ".$this->escape($sem_date_range->ende).")) AND gruppe_kurzbz is null)";
$query .="OR";
}
@@ -535,4 +535,53 @@ 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 e0a185f9b..ba51e514e 100644
--- a/application/models/system/Message_model.php
+++ b/application/models/system/Message_model.php
@@ -242,74 +242,93 @@ class Message_model extends DB_Model
*/
public function getMessagesForTable($person_id, $offset, $limit)
{
- $sql_base = "
- SELECT
+ $limitoffset = (!is_null($offset) && !is_null($limit)) ? 'limit ? offset ?' : '';
+ $sql = <<execQuery($sql, $parametersArray);
-
- if (isError($count))
- return $count;
-
- $count = ceil(current(getData($count))->count/$limit);
- $sql = "
- SELECT * FROM (
- " . $sql_base . "
- ) a
- ORDER BY insertamum DESC
- LIMIT ?
- OFFSET ?
- ";
-
- $parametersArray = array($person_id, $person_id, $limit, $offset);
+ $parametersArray = $limitoffset
+ ? array($person_id, $person_id, $limit, $offset)
+ : array($person_id, $person_id);
+ $count = 0;
$data = $this->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]);
}
diff --git a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php
index f81a2d518..1143398ca 100644
--- a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php
+++ b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php
@@ -253,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 fa74f1395..7a0877f12 100644
--- a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php
+++ b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php
@@ -295,7 +295,13 @@ EOSQL;
foreach( $rows as $row ) {
$tmpgb = new Gehaltsbestandteil();
$tmpgb->hydrateByStdClass($row, true);
-
+
+ if ($row->betrag_valorisiert != null && $row->valorisierungsdatum != null
+ && $row->valorisierungsdatum == $row->von) {
+ // neuer Gehaltsbestandteil mit Valorisierungsdatum aber auch valorisiert
+ $tmpgb->setGrundbetrag($row->betrag_valorisiert);
+ }
+
// prevent duplication (caused by the join with historic values)
if (!isset($lastRecords[(string)$row->gehaltsbestandteil_id])) {
$gehaltsbestandteile[] = $tmpgb;
diff --git a/application/models/vertragsbestandteil/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 ce741268d..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;
}
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/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/Profil.php b/application/views/Cis/Profil.php
deleted file mode 100644
index f66ebf8a9..000000000
--- a/application/views/Cis/Profil.php
+++ /dev/null
@@ -1,18 +0,0 @@
- 'Profil',
- '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/CisRouterView/CisRouterView.php b/application/views/CisRouterView/CisRouterView.php
index ab22fbb81..6ff428362 100644
--- a/application/views/CisRouterView/CisRouterView.php
+++ b/application/views/CisRouterView/CisRouterView.php
@@ -21,19 +21,25 @@ $includesArray = array(
'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/inputnumber/inputnumber.min.js',
- 'vendor/npm-asset/primevue/textarea/textarea.min.js',
'vendor/npm-asset/primevue/checkbox/checkbox.min.js',
+ 'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js',
+ 'vendor/npm-asset/primevue/speeddial/speeddial.min.js',
+ 'vendor/npm-asset/primevue/textarea/textarea.min.js',
+ 'vendor/npm-asset/primevue/timeline/timeline.min.js',
+ 'vendor/npm-asset/primevue/inplace/inplace.min.js',
+ 'vendor/npm-asset/primevue/message/message.min.js',
+ 'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js',
'vendor/moment/luxonjs/luxon.min.js'
),
'customJSModules' => array(
- 'public/js/apps/Dashboard/Fhc.js'
+ 'public/js/apps/Dashboard/Fhc.js',
),
);
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
index cf34bfd53..0d0e8e707 100644
--- a/application/views/Nachrichten.php
+++ b/application/views/Nachrichten.php
@@ -40,6 +40,10 @@ $configArray = [
cis-root="= CIS_ROOT; ?>"
:permissions="= htmlspecialchars(json_encode($permissions)); ?>"
:config="= htmlspecialchars(json_encode($configArray)); ?>"
+
+ :id ="= htmlspecialchars(json_encode($ids)); ?>"
+ type-id ="= htmlspecialchars($typeid); ?>"
+
>
diff --git a/application/views/Studentenverwaltung.php b/application/views/Studentenverwaltung.php
index 01e611657..8dd2dd93d 100644
--- a/application/views/Studentenverwaltung.php
+++ b/application/views/Studentenverwaltung.php
@@ -7,22 +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/components/function.css'
+ 'public/css/components/function.css',
+ 'public/css/components/Detailheader.css'
],
'customJSs' => [
- 'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js'
+ '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'
],
@@ -44,6 +47,8 @@ $configArray = [
'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,
];
?>
@@ -53,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/system/infocenter/anmerkungenZurBewerbung.php b/application/views/system/infocenter/anmerkungenZurBewerbung.php
index ca012ff3e..3ffe5f9a2 100644
--- a/application/views/system/infocenter/anmerkungenZurBewerbung.php
+++ b/application/views/system/infocenter/anmerkungenZurBewerbung.php
@@ -18,6 +18,9 @@
kurzbzlang)) ?: print_r('(' . nl2br($notiz->kurzbzlang) . ') - ') ?>
text) ?>
+
+
+
diff --git a/application/views/system/infocenter/infocenterDetails.php b/application/views/system/infocenter/infocenterDetails.php
index 51b913b6c..fb023c5fd 100644
--- a/application/views/system/infocenter/infocenterDetails.php
+++ b/application/views/system/infocenter/infocenterDetails.php
@@ -57,7 +57,7 @@
diff --git a/application/views/system/infocenter/onboarding.php b/application/views/system/infocenter/onboarding.php
new file mode 100644
index 000000000..1f5bae847
--- /dev/null
+++ b/application/views/system/infocenter/onboarding.php
@@ -0,0 +1,47 @@
+load->view(
+ 'templates/FHC-Header',
+ array(
+ 'title' => 'Info Center',
+ 'jquery3' => true,
+ 'jqueryui1' => true,
+ 'jquerycheckboxes1' => true,
+ 'bootstrap3' => true,
+ 'fontawesome4' => true,
+ 'sbadmintemplate3' => true,
+ 'tablesorter2' => true,
+ 'ajaxlib' => true,
+ 'filterwidget' => true,
+ 'navigationwidget' => true,
+ 'dialoglib' => true,
+ 'phrases' => array(
+ 'person' => array('vorname', 'nachname'),
+ 'ui' => array('bitteEintragWaehlen')
+ ),
+ 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'),
+ 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js')
+ )
+ );
+?>
+
+
+
+ widgetlib->widget('NavigationWidget'); ?>
+
+
+
+
+
+ load->view('system/infocenter/onboardingData.php'); ?>
+
+
+
+
+
+load->view('templates/FHC-Footer'); ?>
diff --git a/application/views/system/infocenter/onboardingData.php b/application/views/system/infocenter/onboardingData.php
new file mode 100644
index 000000000..5ee66fdde
--- /dev/null
+++ b/application/views/system/infocenter/onboardingData.php
@@ -0,0 +1,116 @@
+>0 as bezeichnung
+ FROM public.tbl_rueckstellung
+ JOIN public.tbl_rueckstellung_status USING(status_kurzbz)
+ JOIN public.tbl_person sp ON tbl_rueckstellung.person_id = sp.person_id
+ WHERE tbl_rueckstellung.rueckstellung_id =
+ (
+ SELECT srueck.rueckstellung_id
+ FROM public.tbl_rueckstellung srueck
+ WHERE srueck.person_id = tbl_rueckstellung.person_id
+ AND datum_bis >= NOW()
+ ORDER BY srueck.datum_bis DESC LIMIT 1
+ )
+ ) rueck ON rueck.person_id = p.person_id
+ WHERE p.person_id NOT IN (SELECT person_id FROM public.tbl_prestudent)';
+
+ $filterWidgetArray = array(
+ 'query' => $query,
+ 'app' => InfoCenter::APP,
+ 'datasetName' => 'onboarding',
+ 'filter_id' => $this->input->get('filter_id'),
+ 'requiredPermissions' => 'infocenter',
+ 'datasetRepresentation' => 'tablesorter',
+ 'checkboxes' => 'PersonId',
+ 'additionalColumns' => array('Details'),
+ 'columnsAliases' => array(
+ 'PersonId',
+ ucfirst($this->p->t('person', 'vorname')) ,
+ ucfirst($this->p->t('person', 'nachname')),
+ ucfirst($this->p->t('global', 'sperrdatum')),
+ ucfirst($this->p->t('global', 'gesperrtVon')),
+ ucfirst($this->p->t('infocenter', 'rueckstelldatum')),
+ ucfirst($this->p->t('infocenter', 'rueckstellgrund')),
+ ),
+
+ 'formatRow' => function($datasetRaw) {
+ /* NOTE: Dont use $this here for PHP Version compatibility */
+ $datasetRaw->{'Details'} = sprintf(
+ '
Details ',
+ site_url('system/infocenter/InfoCenter/showDetails'),
+ $datasetRaw->{'PersonId'},
+ 'onboarding',
+ (isset($_GET['fhc_controller_id']) ? $_GET['fhc_controller_id'] : ''),
+ (isset($_GET['filter_id']) ? $_GET['filter_id'] : '')
+ );
+
+ if ($datasetRaw->{'LockDate'} == null)
+ {
+ $datasetRaw->{'LockDate'} = '-';
+ }
+
+ if ($datasetRaw->{'LockUser'} == null)
+ {
+ $datasetRaw->{'LockUser'} = '-';
+ }
+
+ if ($datasetRaw->{'HoldDate'} == null)
+ {
+ $datasetRaw->{'HoldDate'} = '-';
+ }
+ else
+ {
+ $datasetRaw->{'HoldDate'} = date_format(date_create($datasetRaw->{'HoldDate'}), 'Y-m-d H:i');
+ }
+
+ if ($datasetRaw->{'Rueckstellgrund'} === null)
+ {
+ $datasetRaw->{'Rueckstellgrund'} = '-';
+ }
+
+ return $datasetRaw;
+ },
+
+ 'markRow' => function($datasetRaw) {
+
+ if ($datasetRaw->LockDate != null)
+ {
+ return FilterWidget::DEFAULT_MARK_ROW_CLASS;
+ }
+ }
+
+
+
+ );
+
+ echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray);
+?>
diff --git a/application/views/system/infocenter/stammdaten.php b/application/views/system/infocenter/stammdaten.php
index f143c9c03..c632b079f 100644
--- a/application/views/system/infocenter/stammdaten.php
+++ b/application/views/system/infocenter/stammdaten.php
@@ -32,12 +32,6 @@
gebdatum), 'd.m.Y') ?>
-
- p->t('person','svnr')) ?>
-
- svnr ?>
-
-
p->t('person','staatsbuergerschaft')) ?>
@@ -112,6 +106,7 @@
kontakte as $kontakt): ?>
kontakttyp === 'email'): ?>
@@ -125,14 +120,16 @@
kontakttyp.'" data-id="'. $kontakt->kontakt_id .'" data-value="' . $kontakt->kontakt .'">';?>
kontakttyp === 'email'): ?>
- kontakt;
+ kontakt; ?>
+ kontakttyp === 'email_unverifiziert'): ?>
+ kontakt;
endif;
echo $kontakt->kontakt;
- if ($kontakt->kontakttyp === 'email'):
+ if ($kontakt->kontakttyp === 'email'):
?>
-
- '?>
+
+ '?>
anmerkung; ?>
@@ -146,9 +143,9 @@
strasse ?>
-
+
plz ?>
-
+
ort ?>
nationkurztext)): ?>
@@ -188,7 +185,8 @@
zugangscode)): ?>
diff --git a/application/views/templates/CISVUE-Header.php b/application/views/templates/CISVUE-Header.php
index 358fc75c9..804a43821 100644
--- a/application/views/templates/CISVUE-Header.php
+++ b/application/views/templates/CISVUE-Header.php
@@ -36,4 +36,4 @@ $this->load->view('templates/FHC-Header', $includesArray);
>
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php
index c816ebf2e..d2eb229f1 100644
--- a/application/views/templates/FHC-Footer.php
+++ b/application/views/templates/FHC-Footer.php
@@ -17,6 +17,7 @@
$use_vuejs_dev_version = $this->config->item('use_vuejs_dev_version');
// By default set the parameters to null
+ $customCSSs = isset($customCSSs) ? $customCSSs : null;
$customJSs = isset($customJSs) ? $customJSs : null;
$customJSModules = isset($customJSModules) ? $customJSModules : null;
@@ -191,12 +192,13 @@
// NOTE: keep it as the last but one
if ($addons === true) generateAddonsJSsInclude($calledPath.'/'.$calledMethod);
-
-
+ $extapphelper = ExtendableAppsHelper::getInstance();
+ $extapphelper->init($customCSSs, $customJSs, $customJSModules);
+
// Eventually required JS
// NOTE: keep it as the latest
- generateJSsInclude($customJSs);
- generateJSModulesInclude($customJSModules);
+ generateJSsInclude($extapphelper->getCustomJSs());
+ generateJSModulesInclude($extapphelper->getCustomJSModules());
?>