Compare commits

..

2 Commits

250 changed files with 5508 additions and 20592 deletions
@@ -1,36 +0,0 @@
<?php
$filterCmptArray = array(
"app" => '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'
);
+12 -12
View File
@@ -6,30 +6,30 @@ use CI3_Events as Events;
Events::on('loadRenderers', function ($renderers) {
$fhc_core_renderers =& $renderers();
$fhc_core_renderers["lehreinheit"] = array(
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js'),
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js'),
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalContent.js'),
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
'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'
);
});
Events::on('loadRenderers', function ($renderers) {
$fhc_core_renderers =& $renderers();
$fhc_core_renderers["reservierung"] = array(
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js'),
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalTitle.js'),
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalContent.js'),
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
'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'
);
});
Events::on('loadRenderers', function ($renderers) {
$fhc_core_renderers =& $renderers();
$fhc_core_renderers["ferien"] = array(
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/calendarEvent.js'),
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalTitle.js'),
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalContent.js'),
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
'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'
);
});
-45
View File
@@ -1,45 +0,0 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['turnitin_link'] = 'https://technikum-wien.turnitin.com/sso/sp/redwood/saml/5IyfmBr2OcSIaWQTKlFCGj/start';
$config['old_abgabe_beurteilung_link'] = 'https://moodle.technikum-wien.at/mod/page/view.php?id=1005052';
$config['PAABGABE_EMAIL_JOB_INTERVAL'] = '1 day';
// used as APP_ROOT.URL_STUDENTS -> 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;
+1 -1
View File
@@ -4,7 +4,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
// CMS Content Id for CIS4 Menu Root
$config['cis_menu_root_content_id'] = 11091;
$config['cis_menu_root_content_id'] = 11087;
// send Mails for ProfilUpdate
$config['cis_send_profil_update_mails'] = true;
// Vilesci CI BaseUrl
-3
View File
@@ -7,6 +7,3 @@ $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 <fhc_base_dir>/public/.htaccess_sample for details
$config['use_fhcomplete_build_version_in_path'] = false;
-19
View File
@@ -163,13 +163,6 @@ $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'
)
)
),
@@ -342,18 +335,6 @@ $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'] = [
-7
View File
@@ -65,13 +65,6 @@ $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';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/index';
-13
View File
@@ -130,16 +130,3 @@ $config['students_tab_order'] = [
'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],
];
+50 -39
View File
@@ -14,10 +14,10 @@ class Abgabetool extends Auth_Controller
{
parent::__construct([
'index' => 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')
'getStudentProjektarbeitAbgabeFile' => self::PERM_LOGGED,
'Mitarbeiter' => self::PERM_LOGGED,
'Student' => self::PERM_LOGGED,
'Deadlines' => self::PERM_LOGGED
]);
}
@@ -29,69 +29,80 @@ class Abgabetool extends Auth_Controller
*/
public function index()
{
// TODO: routing from index based on berechtigung?
$viewData = array(
'uid'=>getAuthUID(),
);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']);
}
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
}
public function Student($student_uid_prop = '')
public function Student()
{
$viewData = array(
'uid'=>getAuthUID(),
);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]);
}
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
}
public function Mitarbeiter()
{
$viewData = array(
'uid'=>getAuthUID(),
);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']);
}
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
}
public function Assistenz($stg_kz_prop = '')
{
$viewData = array(
'uid'=>getAuthUID(),
);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolAssistenz']);
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]);
}
}
public function Deadlines()
{
$viewData = array(
'uid'=>getAuthUID(),
);
if(defined('CIS4') && CIS4) {
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
$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');
}
} else {
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'DeadlinesOverview']);
$this->terminateWithJsonError('Keine Zuordnung!');
}
}
}
+5
View File
@@ -33,4 +33,9 @@ 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]);
}
}
@@ -28,13 +28,13 @@ 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/editBakkZgv' => $this->permissionlib->isBerechtigt('student/editBakkZgv'),
'student/editMakkZgv' => $this->permissionlib->isBerechtigt('student/editMakkZgv'),
'student/editDokZgv' => $this->permissionlib->isBerechtigt('student/editDokZgv'),
'student/editBismelden' => $this->permissionlib->isBerechtigt('student/editBismelden')
],
'variables' => [
@@ -43,5 +43,3 @@ class Studentenverwaltung extends Auth_Controller
]);
}
}
@@ -1,30 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Vertragsverwaltung extends Auth_Controller
{
public function __construct()
{
$permissions = [];
$router = load_class('Router');
$permissions[$router->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')
]
]);
}
}
File diff suppressed because it is too large Load Diff
@@ -208,6 +208,7 @@ class Documents extends FHCAPI_Controller
$this->load->model('system/Vorlage_model', 'VorlageModel');
$result = $this->VorlageModel->load($xsl);
$this->addMeta("ress", $result);
$vorlage = current($this->getDataOrTerminateWithError($result));
if (!$vorlage)
show_404();
@@ -220,7 +221,7 @@ class Documents extends FHCAPI_Controller
'gedruckt' => true,
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
'uid' => $this->input->post_get('uid') ?: null,
'uid' => $this->input->post_get('uid') ?: '',
'archiv' => true,
'signiert' => !!$sign_user,
'stud_selfservice' => $vorlage->stud_selfservice
@@ -250,9 +251,6 @@ 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;
@@ -334,7 +332,6 @@ 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));
@@ -38,9 +38,34 @@ class Lehre extends FHCAPI_Controller
parent::__construct([
'lvStudentenMail' => self::PERM_LOGGED,
'LV' => self::PERM_LOGGED,
'Pruefungen' => 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
]);
$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');
}
//------------------------------------------------------------------------------------------------------------------
@@ -100,5 +125,557 @@ 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'] = "<p><a href='".APP_ROOT."cis/private/lehre/abgabe_lektor_frameset.html'>Zur Projektarbeitsübersicht</a></p>";
$maildata['bewertunglink'] = $num_rows_sem >= 1 && $paabgabetyp_kurzbz == 'end' ? "<p><a href='$mail_fulllink'>Zur Beurteilung der Arbeit</a></p>" : "";
$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 ? "<p><a href='$mail_link'>Zur Beurteilung der Arbeit</a></p>" : "";
$zweitbetmaildata['token'] = $num_rows_sem >= 1 && isset($begutachterMitToken->zugangstoken) && !$intern ? "<p>Zugangstoken: " . $begutachterMitToken->zugangstoken . "</p>" : "";
$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);
}
}
@@ -29,7 +29,7 @@ class Studium extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
'getStudienAllSemester'=> self::PERM_LOGGED,
'getAllStudienSemester'=> self::PERM_LOGGED,
'getStudiengaengeForStudienSemester'=> self::PERM_LOGGED,
'getStudienplaeneBySemester'=> self::PERM_LOGGED,
'getLvEvaluierungInfo'=> self::PERM_LOGGED,
@@ -51,7 +51,7 @@ class Studium extends FHCAPI_Controller
//------------------------------------------------------------------------------------------------------------------
// Public methods
public function getStudienAllSemester(){
public function getAllStudienSemester(){
$parameter_studiensemester = $this->input->get('studiensemester',true);
$parameter_studiengang = $this->input->get('studiengang',true);
@@ -59,24 +59,26 @@ class Studium extends FHCAPI_Controller
$parameter_studienplan = $this->input->get('studienplan',true);
$aktuelles_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->getAktOrNextSemester()));
if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester->studiensemester_kurzbz]);
$studentLehrverband = current($this->getDataOrTerminateWithError($studentLehrverband));
$lv_result =$this->StudentlehrverbandModel->loadWhere([
"student_uid" => getAuthUID(),
"studiensemester_kurzbz" => $aktuelles_studiensemester->studiensemester_kurzbz
]);
$lv_data = $this->getDataOrTerminateWithError($lv_result);
if ($studentLehrverband = current($lv_data)) {
$student_studiensemester = $studentLehrverband->studiensemester_kurzbz;
$student_studiengang = $studentLehrverband->studiengang_kz;
$student_semester = $studentLehrverband->semester;
}
$student_studiensemester = $studentLehrverband->studiensemester_kurzbz;
$student_studiengang = $studentLehrverband->studiengang_kz;
$student_semester = $studentLehrverband->semester;
$student_studienplan = $this->getStudienPlanFromPrestudentStatus(getAuthPersonId())->studienplan_id;
if(!isset($parameter_studiensemester))
$parameter_studiensemester = $student_studiensemester;
if(!isset($parameter_studiengang))
$parameter_studiengang = $student_studiengang;
if(!isset($parameter_semester))
$parameter_semester = $student_semester;
if(!isset($parameter_studienplan))
$parameter_studienplan = $student_studienplan;
$parameter_studiensemester = $parameter_studiensemester ?? $student_studiensemester;
$parameter_studiengang = $parameter_studiengang ?? $student_studiengang;
$parameter_semester = $parameter_semester ?? $student_semester;
$parameter_studienplan = $parameter_studienplan ?? $student_studienplan;
}
if(isset($parameter_studiensemester)){
@@ -1,53 +0,0 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Detailheader extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getHeader' => ['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));
}
}
@@ -1,237 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Foto extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'uploadFoto' => ['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;
}
}
@@ -47,22 +47,22 @@ class Setup extends FHCAPI_Controller
{
$tabs['details'] = array (
'title' => 'Details',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Details.js'),
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Details.js',
'config' => []
);
$tabs['gruppen'] = array (
'title' => 'Gruppen',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Gruppen.js'),
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Gruppen.js',
'config' => []
);
$tabs['lektor'] = array (
'title' => 'LektorInnenzuteilung',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'),
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Lektor.js',
'config' => []
);
$tabs['notiz'] = array (
'title' => 'Notizen',
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'),
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Notiz.js',
'config' => []
);
$this->terminateWithSuccess($tabs);
@@ -1,44 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizAnrechnung extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['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");
}
}
@@ -1,43 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizBestellung extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['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");
}
}
@@ -17,106 +17,5 @@ class NotizLehreinheit extends Notiz_Controller
'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");
}
}
}
@@ -1,44 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizMitarbeiter extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['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");
}
}
@@ -20,100 +20,33 @@ class NotizPerson extends Notiz_Controller
'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")
{
$this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
return $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);
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
return $this->outputJsonSuccess(true);
}
//stv: if person has permission of one studiengang of person -> permission to add/update/delete Note
private function _checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs)
public function loadDokumente()
{
$result = $this->PrestudentModel->loadWhere(['person_id' => $person_id]);
$data = $this->getDataOrTerminateWithError($result);
$notiz_id = $this->input->post('notiz_id');
$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);
// 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();
}
}
}
@@ -1,117 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizPrestudent extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['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);
}
}
}
@@ -1,32 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizProjekt extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['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");
}
}
@@ -1,32 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizProjektphase extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['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");
}
}
@@ -1,32 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class NotizProjekttask extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'isBerechtigt' => ['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");
}
}
@@ -25,8 +25,7 @@ class Studiensemester extends FHCAPI_Controller
array(
'getAll' => self::PERM_LOGGED,
'getAktNext' => self::PERM_LOGGED,
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED
'getStudienjahrByStudiensemester' => self::PERM_LOGGED
)
);
// Load model StudiensemesterModel
@@ -153,17 +152,4 @@ 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));
}
}
@@ -127,9 +127,9 @@ class Unterbrechung extends FHCAPI_Controller
$this->form_validation->set_rules(
'datum_wiedereinstieg',
'Datum Wiedereinstieg',
'required|is_valid_date|callback_isDateInFuture',
'required|callback_isValidDate|callback_isDateInFuture',
[
'is_valid_date' => $this->p->t('ui', 'error_invalid_date'),
'isValidDate' => $this->p->t('ui', 'error_invalid_date'),
'isDateInFuture' => $this->p->t('ui', 'error_invalid_date')
]
);
@@ -209,9 +209,18 @@ 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);
}
}
@@ -36,44 +36,15 @@ 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);
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;
$data = $this->getDataOrTerminateWithError($result);
//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);
$this->terminateWithSuccess($data);
}
public function insertAufnahmetermin()
@@ -89,6 +60,7 @@ 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;
@@ -252,11 +224,7 @@ class Aufnahmetermine extends FHCAPI_Controller
)
);
//check if existing placementtest
if(!hasData($result))
$this->terminateWithSuccess([]);
else
$data = getData($result);
$data = $this->getDataOrTerminateWithError($result);
$studienplan_arr = [];
$include_ids = [];
@@ -265,18 +233,12 @@ 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);
//check if existing placementtest
if(!hasData($result))
$this->terminateWithSuccess([]);
else
$dataRt = getData($resultRt);
$dataRt = $this->getDataOrTerminateWithError($resultRt);
foreach ($dataRt as $item)
{
@@ -392,7 +354,6 @@ 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)
{
@@ -403,27 +364,22 @@ 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, 1);
$result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz);
$data = $this->getDataOrTerminateWithError($result);
$weightedArray = [];
$basis_gebiet_id_arr = [];
$basis_gebiet_id_toString = '';
foreach ($data as $abl)
{
$weightedArray[$abl->gebiet_id] = $abl->gewicht;
$basis_gebiet_id_arr[]= $abl->gebiet_id;
}
$basis_gebiet_id_toString = implode(', ', $basis_gebiet_id_arr);
$result = $this->ReihungstestModel->getReihungstestErgebnisPerson(
$person_id,
$punkte,
$reihungstest_id,
$weightedArray,
$has_excluded_gebiete,
$basis_gebiet_id_toString
);
$result = $this->ReihungstestModel->getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray);
/* if (isError($result))
{
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}*/
$this->terminateWithSuccess($result);
}
@@ -200,8 +200,7 @@ class Config extends FHCAPI_Controller
'type' => 'select',
'values' => $buchungstyp_kurzbz_plus_all,
'value_key' => 'buchungstyp_kurzbz',
'label_key' => 'beschreibung',
'default' => 'all'
'label_key' => 'beschreibung'
],
'samestg' => [
'type' => 'bool',
@@ -227,8 +226,7 @@ class Config extends FHCAPI_Controller
'type' => 'select',
'values' => $buchungstyp_kurzbz_plus_all,
'value_key' => 'buchungstyp_kurzbz',
'label_key' => 'beschreibung',
'default' => 'all'
'label_key' => 'beschreibung'
],
'samestg' => [
'type' => 'bool',
@@ -506,7 +504,7 @@ class Config extends FHCAPI_Controller
{
$result['combinePeople'] = [
'title' => $this->p->t('stv', 'tab_combine_people'),
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/CombinePeople.js'),
'component' => './Stv/Studentenverwaltung/Details/CombinePeople.js',
'config' => $config['combinePeople']
];
}
@@ -753,10 +753,6 @@ class Dokumente extends FHCAPI_Controller
);
$data = $this->getDataOrTerminateWithError($result);
if(!(is_array($data) && count($data) > 0))
{
return null;
}
$student = current($data);
return $student->student_uid;
@@ -239,7 +239,7 @@ class Konto extends FHCAPI_Controller
$data[$field] = $this->input->post($field);
if (defined('FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE') && isset(unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']])) {
$data['studiengang_kz'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']];
$data['kostenstelle'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']];
}
$result = [];
@@ -43,7 +43,7 @@ class Prestudent extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
'ui', 'studierendenantrag', 'lehre', 'global'
'ui', 'studierendenantrag', 'lehre'
]);
}
@@ -98,9 +98,11 @@ class Prestudent extends FHCAPI_Controller
'person_id',
'berufstaetigkeit_code',
'ausbildungcode',
'zgv_code',
'zgvort',
'zgvdatum',
'zgvnation',
'zgvmas_code',
'zgvmaort',
'zgvmadatum',
'zgvmanation',
@@ -108,6 +110,7 @@ class Prestudent extends FHCAPI_Controller
'bismelden',
'anmerkung',
'dual',
'zgvdoktor_code',
'zgvdoktorort',
'zgvdoktordatum',
'zgvdoktornation',
@@ -122,57 +125,6 @@ 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);
@@ -636,7 +636,7 @@ class Status extends FHCAPI_Controller
$this->load->library('PrestudentLib');
$resFirstStudent = $this->prestudentlib->setFirstStudent(
$this->prestudentlib->setFirstStudent(
$prestudent_id,
$lastAufgenommener->studiensemester_kurzbz,
$lastAufgenommener->ausbildungssemester,
@@ -645,8 +645,9 @@ class Status extends FHCAPI_Controller
$this->input->post('statusgrund_id')
);
$this->db->trans_complete();
$this->getDataOrTerminateWithError($resFirstStudent);
$this->getDataOrTerminateWithError($result);
$this->db->trans_commit();
return $this->outputJsonSuccess(true);
}
@@ -108,10 +108,6 @@ class Student extends FHCAPI_Controller
$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(
@@ -140,9 +136,14 @@ class Student extends FHCAPI_Controller
);
}
$this->PrestudentModel->addSelect(
"public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
. $this->PrestudentModel->escape($studiensemester_kurzbz)
. ") AS statusofsemester"
"(
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->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
@@ -546,7 +547,6 @@ class Student extends FHCAPI_Controller
$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');
@@ -798,8 +798,8 @@ class Student extends FHCAPI_Controller
$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('gebdatum', 'Geburtsdatum', ['isValidDate', function($value) { return isValidDate($value); }], [
'isValidDate' => $this->p->t('ui', 'error_invalid_date')
]);
//$this->form_validation->set_rules('address[checked]', 'Address', 'required');
$this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [
@@ -611,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) . "
@@ -801,9 +801,14 @@ class Students extends FHCAPI_Controller
//add status per semester
$this->PrestudentModel->addSelect(
"public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
. $this->PrestudentModel->escape($studiensemester_kurzbz)
. ") AS statusofsemester"
"(
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();
@@ -850,41 +855,6 @@ class Students extends FHCAPI_Controller
{
$stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
$this->load->config('stv');
$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');
@@ -907,11 +877,8 @@ 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');
$this->PrestudentModel->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT');
$this->PrestudentModel->addSelect("b.uid");
$this->PrestudentModel->addSelect('tag_data_agg.tags');
$this->PrestudentModel->addSelect('titelpre');
$this->PrestudentModel->addSelect('nachname');
$this->PrestudentModel->addSelect('vorname');
@@ -930,9 +897,14 @@ class Students extends FHCAPI_Controller
//add status per semester
$this->PrestudentModel->addSelect(
"public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
. $this->PrestudentModel->escape($studiensemester_kurzbz)
. ") AS statusofsemester"
"(
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('UPPER(stg.typ || stg.kurzbz) AS studiengang');
@@ -969,7 +941,6 @@ class Students extends FHCAPI_Controller
$this->PrestudentModel->addSelect('mentor');
$this->PrestudentModel->addSelect('b.aktiv AS bnaktiv');
$this->PrestudentModel->addSelect('unruly');
$this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs);
@@ -1,48 +0,0 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Tags extends Tag_Controller
{
const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:rw'];
public function __construct()
{
parent::__construct([
'getTag' => 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'));
}
}
@@ -76,7 +76,9 @@ class Vertrag extends FHCAPI_Controller
if (isError($allOe)) $this->terminateWithError(getError($allOe), self::ERROR_TYPE_GENERAL);
$allOe = hasData($allOe) ? array_column(getData($allOe), 'oe_kurzbz') : [];
$allOe = hasData($allOe) ? getData($allOe) : [];
$this->addMeta('oe', $allOe);
// * then check if the user has permissions to cancel the corresponding lv-organisational units
if (!$this->permissionlib->isBerechtigtMultipleOe('admin', $allOe, 'suid') &&
@@ -1,62 +0,0 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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();
}
}
}
@@ -26,6 +26,9 @@ 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
@@ -238,7 +241,7 @@ class Vertraege extends FHCAPI_Controller
}
}
$this->db->trans_complete();
$this->terminateWithSuccess($vertrag_id);
$this->terminateWithSuccess(true);
}
public function updateContract()
@@ -355,7 +358,7 @@ class Vertraege extends FHCAPI_Controller
}
$this->db->trans_complete();
$this->terminateWithSuccess($vertrag_id);
$this->terminateWithSuccess(true);
}
public function loadContract($vertrag_id)
@@ -681,4 +684,37 @@ 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));
}
}
+8 -33
View File
@@ -33,26 +33,19 @@ class Widget extends Auth_Controller
return $this->outputJsonSuccess([
"widget_id" => 0,
"widget_kurzbz" => "notfound",
"arguments" => [
"arguments" => json_encode([
"className" => 'alert-danger',
"title" => 'Widget Not Found',
"msg" => 'The widget with the id ' . $widget_id . ' could not be found'
],
"setup" => [
]),
"setup" => json_encode([
"name" => 'Widget Not Found',
"file" => absoluteJsImportUrl('public/js/components/DashboardWidget/Default.js'),
"file" => 'DashboardWidget/Default.js',
"width" => 1,
"height" => 1
]
])
]);
$widget = current(getData($widget));
$widget->arguments = json_decode($widget->arguments);
$tmpsetup = json_decode($widget->setup);
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
$widget->setup = $tmpsetup;
return $this->outputJsonSuccess($widget);
return $this->outputJsonSuccess(current(getData($widget)));
}
public function getAll()
@@ -63,16 +56,7 @@ class Widget extends Auth_Controller
if (isError($result))
return $this->outputJsonError(getError($result));
$tmpwidgets = getData($result) ?: [];
$widgets = array_map(function($widget) {
$widget->arguments = json_decode($widget->arguments);
$tmpsetup = json_decode($widget->setup);
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
$widget->setup = $tmpsetup;
return $widget;
}, $tmpwidgets);
$this->outputJsonSuccess($widgets);
$this->outputJsonSuccess(getData($result) ?: []);
}
public function getWidgetsForDashboard()
@@ -87,16 +71,7 @@ class Widget extends Auth_Controller
]);
}
$tmpwidgets = getData($result) ?: [];
$widgets = array_map(function($widget) {
$widget->arguments = json_decode($widget->arguments);
$tmpsetup = json_decode($widget->setup);
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
$widget->setup = $tmpsetup;
return $widget;
}, $tmpwidgets);
$this->outputJsonSuccess($widgets);
$this->outputJsonSuccess(getData($result) ?: []);
}
public function setAllowed()
@@ -1,913 +0,0 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class AbgabetoolJob extends JOB_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->_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 = '<div style="font-family: Arial, sans-serif; color: #333;">';
$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 .= "
<div style='margin-top: 25px; padding: 12px; background-color: #fff5f5; border-left: 4px solid #dc3545; border-bottom: 1px solid #fee;'>
<strong style='font-size: 16px; color: #b02a37;'>Projekt: {$projektarbeit_titel}</strong><br/>
<div style='margin-top: 5px; font-size: 14px;'>
<strong>Studierende/r:</strong> {$studentFullName}
</div>
<div style='margin-top: 3px; font-size: 14px;'>
<strong>Betreuer:</strong> {$allBetreuerFormatted}
</div>
<span style='color: #666; font-size: 12px;'>
ID: {$projektarbeit_id} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
</span>
</div>";
// Start Table
$abgabenString .= '
<table style="width: 100%; border-collapse: collapse; margin-bottom: 25px;">
<thead>
<tr style="background-color: #f8f9fa; text-align: left;">
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 20%;">Datum</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 45%;">Abgabe/Bezeichnung</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 35%;">Status</th>
</tr>
</thead>
<tbody>';
$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 .= "
<tr>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$abgabedatumFormatted}</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
<strong>{$abgabe->bezeichnung}</strong>
</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; text-align: center;'>
<span style='color: #fff; background-color: {$sigBg}; padding: 3px 8px; border-radius: 3px; font-weight: bold; font-size: 11px;'>
{$sigLabel}
</span>
</td>
</tr>";
}
$abgabenString .= '</tbody></table>';
}
$abgabenString .= '</div>';
// 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 = '<div style="font-family: Arial, sans-serif; color: #333;">';
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 .= "
<div style='margin-top: 25px; padding: 12px; background-color: #f8f9fa; border-left: 4px solid #007bff; border-bottom: 1px solid #eee;'>
<strong style='font-size: 16px; color: #0056b3;'>Projekt: {$projektarbeit_titel}</strong><br/>
<div style='margin-top: 5px; font-size: 14px;'>
<strong>Studierende/r:</strong> {$studentFullName}
</div>
<div style='margin-top: 3px; font-size: 14px;'>
<strong>Betreuer:</strong> {$allBetreuerFormatted}
</div>
<span style='color: #666; font-size: 12px;'>
ID: {$projektarbeit_id} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
</span>
</div>";
// Start Table
$abgabenString .= '
<table style="width: 100%; border-collapse: collapse; margin-bottom: 25px;">
<thead>
<tr style="background-color: #eee; text-align: left;">
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 20%;">Zieldatum</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px;">Bezeichnung</th>
</tr>
</thead>
<tbody>';
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) ? "<br/><small style='color: #777; font-style: italic;'>{$abgabe->kurzbz}</small>" : "";
$abgabenString .= "
<tr>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$dateEmailFormatted}</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
<strong>{$abgabe->bezeichnung}</strong>{$kurzbzLine}
</td>
</tr>";
}
$abgabenString .= '</tbody></table>';
}
$abgabenString .= '</div>';
// 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 = '<div style="font-family: Arial, sans-serif; color: #333;">';
$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 .= "
<div style='margin-top: 25px; padding: 12px; background-color: #f8f9fa; border-left: 4px solid #007bff; border-bottom: 1px solid #eee;'>
<strong style='font-size: 16px; color: #0056b3;'>Projekt: {$projektarbeit_titel}</strong><br/>
<div style='margin-top: 5px; font-size: 14px;'>
<strong>Studierende/r:</strong> {$studentFullName}
</div>
<span style='color: #666; font-size: 12px;'>
ID: {$projektarbeit_id} | Rolle: {$betreuerRow->betreuerart_kurzbz} |
Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
</span>
</div>";
// start table
$abgabenString .= '
<table style="width: 100%; border-collapse: collapse; margin-bottom: 25px;">
<thead>
<tr style="background-color: #eee; text-align: left;">
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 20%;">Zieldatum</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px;">Bezeichnung</th>
</tr>
</thead>
<tbody>';
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) ? "<br/><small style='color: #777; font-style: italic;'>{$abgabe->kurzbz}</small>" : "";
$abgabenString .= "
<tr>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$dateEmailFormatted}</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
<strong>{$abgabe->bezeichnung}</strong>{$kurzbzLine}
</td>
</tr>";
}
$abgabenString .= '</tbody></table>';
}
// close container
$abgabenString .= '</div>';
// 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 = '
<table style="width: 100%; border-collapse: collapse; font-family: Arial, sans-serif; color: #333; margin-top: 15px; margin-bottom: 15px;">
<thead>
<tr style="background-color: #f2f2f2; text-align: left;">
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 15%;">Zieldatum</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 25%;">Studierende/r</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px;">Bezeichnung</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 15%;">Abgabedatum</th>
</tr>
</thead>
<tbody>';
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) ? "<br/><small style='color: #666; font-style: italic;'>{$abgabe->kurzbz}</small>" : "";
$abgabenString .= "
<tr>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$dateEmailFormatted}</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$studentFullName}</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
<strong>{$abgabe->bezeichnung}</strong>{$kurzbzLine}
</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>{$abgabedatumFormatted}</td>
</tr>";
}
$abgabenString .= '</tbody></table>';
$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 = '
<table style="width: 100%; border-collapse: collapse; font-family: Arial, sans-serif; color: #333; margin-top: 15px; margin-bottom: 15px;">
<thead>
<tr style="background-color: #f2f2f2; text-align: left;">
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px; width: 25%;">Zieldatum</th>
<th style="padding: 10px; border: 1px solid #ddd; font-size: 13px;">Bezeichnung / Hinweis</th>
</tr>
</thead>
<tbody>';
foreach ($abgaben as $abgabe) {
$dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
// handle the optional Kurzbezeichnung
$kurzbzLine = !empty($abgabe->kurzbz) ? "<br/><small style='color: #666; font-style: italic;'>{$abgabe->kurzbz}</small>" : "";
$abgabenString .= "
<tr>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px; vertical-align: top;'>
{$dateEmailFormatted}
</td>
<td style='padding: 10px; border: 1px solid #ddd; font-size: 13px;'>
<strong>{$abgabe->bezeichnung}</strong>{$kurzbzLine}
</td>
</tr>";
}
$abgabenString .= '</tbody></table>';
$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');
}
}
+1 -1
View File
@@ -35,7 +35,7 @@ class CI3_Events
});
self::$eventsSorted[$event] = true;
}
foreach (self::$events[$event] as $conf) {
$conf[1](...$args);
}
+1 -28
View File
@@ -266,7 +266,7 @@ class FHCAPI_Controller extends Auth_Controller
}
// ---------------------------------------------------------------
// Security Begin
// Security
// ---------------------------------------------------------------
/**
@@ -287,31 +287,4 @@ 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');
}
}
}
+61 -46
View File
@@ -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 = [
@@ -97,13 +97,13 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess(getData($result) ?: []);
return $this->terminateWithSuccess(getData($result) ?: []);
}
//Override function
protected function isBerechtigt($id, $typeId){
$this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
return $this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
}
public function loadNotiz()
@@ -112,6 +112,7 @@ 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,9 +143,14 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$uid = getAuthUID();
$json = $this->input->post('data');
$post_data = json_decode($json, true);
$this->form_validation->set_data($post_data);
if (isset($_POST['data']))
{
$data = json_decode($_POST['data']);
unset($_POST['data']);
foreach ($data as $k => $v) {
$_POST[$k] = $v;
}
}
//Form Validation
$this->form_validation->set_rules('titel', 'Titel', 'required', [
@@ -160,25 +166,26 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$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;
$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');
// Start DB transaction
$this->db->trans_start();
//Save note
$result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $uid,
"insertvon" => $uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid));
$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));
if (isError($result))
{
$this->db->trans_rollback();
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$notiz_id = $result->retval;
@@ -213,7 +220,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result))
{
$this->db->trans_rollback();
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$dms_id_arr[] = $result->retval['dms_id'];
}
@@ -228,28 +235,34 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result))
{
$this->db->trans_rollback();
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
}
}
$this->db->trans_commit();
$this->terminateWithSuccess($result);
return $this->terminateWithSuccess($result);
}
public function updateNotiz()
{
$this->load->library('form_validation');
$this->load->library('DmsLib');
$json = $this->input->post('data');
$post_data = json_decode($json, true);
if (isset($_POST['data']))
{
$data = json_decode($_POST['data']);
unset($_POST['data']);
foreach ($data as $k => $v) {
$_POST[$k] = $v;
}
}
$this->form_validation->set_data($post_data);
$notiz_id = $this->input->post('notiz_id');
$this->form_validation->set_rules('notiz_id', 'Notiz ID', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'notiz_id'])
]);
if(!$notiz_id)
{
$this->terminateWithError($this->p->t('ui','error_missingId',['id'=>'Notiz_id']), self::ERROR_TYPE_GENERAL);
}
//Form Validation
$this->form_validation->set_rules('titel', 'Titel', 'required', [
@@ -267,23 +280,25 @@ abstract class Notiz_Controller extends FHCAPI_Controller
//update Notiz
$uid = getAuthUID();
$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'];
$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');
$result = $this->NotizModel->update(
[
'notiz_id' => $post_data['notiz_id'],
'notiz_id' => $notiz_id
],
[
'titel' => $titel,
'updatevon' => $uid,
'updateamum' => date('c'),
'text' => $text,
'bearbeiter_uid' => isEmptyString($bearbeiter_uid) ? null : $bearbeiter_uid,
'verfasser_uid' => $verfasser_uid,
'bearbeiter_uid' => $bearbeiter_uid,
'start' => $start,
'ende' => $ende,
'erledigt' => $erledigt
@@ -291,7 +306,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
);
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
//update(1) loading all dms-entries with this notiz_id
@@ -299,7 +314,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' => $post_data['notiz_id']));
$result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $notiz_id));
$result = $this->getDataOrTerminateWithError($result);
foreach ($result as $doc) {
$dms_id_arr[$doc->dms_id] = array(
@@ -336,7 +351,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$result = $this->getDataOrTerminateWithError($result);
$dms_id = $result['dms_id'];
$result = $this->NotizdokumentModel->insert(array('notiz_id' => $post_data['notiz_id'], 'dms_id' => $dms_id));
$result = $this->NotizdokumentModel->insert(array('notiz_id' => $notiz_id, 'dms_id' => $dms_id));
$this->getDataOrTerminateWithError($result);
}
@@ -350,7 +365,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->getDataOrTerminateWithError($result);
}
$this->terminateWithSuccess($result);
return $this->terminateWithSuccess($result);
}
public function deleteNotiz()
@@ -401,15 +416,15 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result))
{
$this->db->trans_rollback();
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if(!hasData($result))
{
$this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
}
$this->db->trans_complete();
$this->terminateWithSuccess(getData($result));
return $this->terminateWithSuccess(getData($result));
}
public function loadDokumente()
@@ -425,14 +440,14 @@ abstract class Notiz_Controller extends FHCAPI_Controller
array('public.tbl_notiz.notiz_id' => $notiz_id)
);
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if(!hasData($result))
{
$this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess(getData($result));
return $this->terminateWithSuccess(getData($result));
}
public function getMitarbeiter($searchString)
@@ -442,7 +457,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess($result);
return $this->terminateWithSuccess($result);
}
public function getCountNotes($person_id)
@@ -461,4 +476,4 @@ abstract class Notiz_Controller extends FHCAPI_Controller
return $this->terminateWithSuccess($anzahl->anzahl ?: 0);
}
}
}
+18 -3
View File
@@ -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) . ', referer: ' . "http".(!empty($_SERVER['HTTPS'])?"s":"")."://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); // KEEP IT!!!
error_log(str_replace("\n", '', $ob_get_contents)); // KEEP IT!!!
}
/**
@@ -408,6 +408,22 @@ 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
// ------------------------------------------------------------------------
@@ -430,8 +446,7 @@ if (!function_exists('array_is_list')) {
// ------------------------------------------------------------------------
/**
* 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
* check if string can be converted to a date
*/
function is_valid_date($dateString)
{
+3 -215
View File
@@ -185,15 +185,7 @@ function generateJSModulesInclude($JSModules)
for ($tmpJSsCounter = 0; $tmpJSsCounter < count($tmpJSs); $tmpJSsCounter++)
{
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;
}
$toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL;
if ($tmpJSsCounter > 0) $toPrint = "\t\t".$toPrint;
@@ -258,210 +250,6 @@ function generateSkipLink($skipID)
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');
}
$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');
}
}
}
+1 -2
View File
@@ -180,8 +180,7 @@ 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_QUEUED)
|| $getStatusResponse->body->status == self::STATUS_STARTED)
{
// go on!
}
+1 -1
View File
@@ -723,7 +723,7 @@ class PrestudentLib
// Generate Alias
$alias = null;
$alias = '';
if (!defined('GENERATE_ALIAS_STUDENT')
|| GENERATE_ALIAS_STUDENT === true
) {
@@ -490,175 +490,6 @@ 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(
@@ -11,5 +11,4 @@ class Vertragstyp_model extends DB_Model
$this->dbTable = 'lehre.tbl_vertragstyp';
$this->pk = 'vertragstyp_kurzbz';
}
}
@@ -190,6 +190,4 @@ class Vertragvertragsstatus_model extends DB_Model
return $this->loadWhere($condition);
}
}
+15 -53
View File
@@ -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,22 +556,13 @@ 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 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
* @param $person_id ID of Person
* @param $punkte if true result is points else result is percentage of sum
* @param $reihungstest_id ID of Placementtest
* @param $weightedArray array of weighting per area (gewicht per gebiet_id)
* @return float result
*/
public function getReihungstestErgebnisPerson(
$person_id,
$punkte,
$reihungstest_id,
$weightedArray = null,
$has_excluded_gebiete = false,
$basis_gebiet_id_toString = null
)
public function getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray = null)
{
$parametersArray = array($reihungstest_id);
@@ -586,35 +577,6 @@ 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 = (
-8
View File
@@ -279,12 +279,4 @@ 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));
}
}
@@ -11,12 +11,4 @@ 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);
}
}
@@ -60,69 +60,5 @@ 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 >= NOW() - INTERVAL ?
OR campus.tbl_paabgabe.updateamum >= NOW() - INTERVAL ?)
AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
return $this->execQuery($query, [$interval, $interval, $relevantTypes]);
}
public function findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $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 >= NOW() - 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]);
}
}
@@ -11,10 +11,4 @@ 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);
}
}
@@ -109,36 +109,36 @@ class Projektarbeit_model extends DB_Model
*/
public function getStudentProjektarbeitenWithBetreuer($studentUID)
{
$betreuerQuery = "SELECT * FROM (SELECT DISTINCT ON(projektarbeit_id)
$betreuerQuery = "
SELECT
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_projektarbeit.note as note,
lehre.tbl_note.bezeichnung as note_bezeichnung,
lehre.tbl_projektbetreuer.note as note,
public.tbl_mitarbeiter.mitarbeiter_uid,
lehre.tbl_projektarbeit.titel as titel,
lehre.tbl_projektarbeit.sprache as sprache,
@@ -147,8 +147,9 @@ 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,
lehre.tbl_projektarbeit.insertamum as insertamum,
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,
(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
@@ -157,17 +158,15 @@ 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)
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
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
(projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom')
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')) as base
ORDER BY insertamum DESC";
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')";
return $this->execReadOnlyQuery($betreuerQuery, array($studentUID));
}
@@ -180,12 +179,8 @@ 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)
@@ -195,76 +190,16 @@ 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 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= ?";
$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= ?";
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) {
@@ -299,9 +234,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_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
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
FROM lehre.tbl_projektarbeit
LEFT JOIN lehre.tbl_projektbetreuer using(projektarbeit_id)
LEFT JOIN lehre.tbl_betreuerart using(betreuerart_kurzbz)
@@ -338,180 +273,7 @@ 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
@@ -537,17 +299,4 @@ class Projektarbeit_model extends DB_Model
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]);
}
}
@@ -232,41 +232,4 @@ 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));
}
}
@@ -243,20 +243,4 @@ class Organisationseinheit_model extends DB_Model
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));
}
}
@@ -657,7 +657,37 @@ 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);
@@ -682,7 +712,7 @@ class Studiengang_model extends DB_Model
$stg_ltg = array_values(array_filter($stg_ltg, function($stg_leitung){
return $stg_leitung->aktiv;
}));
$this->addFotoProperty($stg_ltg);
$addFotoProperty($stg_ltg);
$gf_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz);
if (isError($gf_ltg))
@@ -691,8 +721,8 @@ class Studiengang_model extends DB_Model
$gf_ltg = array_values(array_filter($gf_ltg, function($gf_leitung){
return $gf_leitung->aktiv;
}));
$this->addEmailProperty($gf_ltg);
$this->addFotoProperty($gf_ltg);
$addEmailProperty($gf_ltg);
$addFotoProperty($gf_ltg);
$stv_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz);
if (isError($stv_ltg))
@@ -701,8 +731,8 @@ class Studiengang_model extends DB_Model
$stv_ltg = array_values(array_filter($stv_ltg, function($stv_leitung){
return $stv_leitung->aktiv;
}));
$this->addEmailProperty($stv_ltg);
$this->addFotoProperty($stv_ltg);
$addEmailProperty($stv_ltg);
$addFotoProperty($stv_ltg);
$ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
if (isError($ass))
@@ -711,8 +741,8 @@ class Studiengang_model extends DB_Model
$ass = array_values(array_filter($ass, function($assistenz){
return $assistenz->aktiv;
}));
$this->addEmailProperty($ass);
$this->addFotoProperty($ass);
$addEmailProperty($ass);
$addFotoProperty($ass);
$hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv');
if (isError($hochschulvertr))
@@ -721,7 +751,7 @@ class Studiengang_model extends DB_Model
$hochschulvertr = array_values(array_filter($hochschulvertr, function($hochschul_vertreter){
return $hochschul_vertreter->aktiv;
}));
$this->addEmailProperty($hochschulvertr);
$addEmailProperty($hochschulvertr);
$stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz);
@@ -731,7 +761,7 @@ class Studiengang_model extends DB_Model
$stdv = array_values(array_filter($stdv, function($std_vertreter){
return $std_vertreter->aktiv;
}));
$this->addEmailProperty($stdv);
$addEmailProperty($stdv);
$jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester);
@@ -741,7 +771,7 @@ class Studiengang_model extends DB_Model
$jahrgangsvertr = array_values(array_filter($jahrgangsvertr, function($jahrgang_vertreter){
return $jahrgang_vertreter->aktiv;
}));
$this->addEmailProperty($jahrgangsvertr);
$addEmailProperty($jahrgangsvertr);
$result_object = new stdClass();
@@ -840,72 +870,4 @@ class Studiengang_model extends DB_Model
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);
}
}
@@ -420,17 +420,4 @@ class Person_model extends DB_Model
return success($result);
}
}
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]);
}
}
@@ -209,7 +209,7 @@ class Mitarbeiter_model extends DB_Model
{
$qry = "
SELECT
titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe, personalnummer, mitarbeiter_uid
titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe
FROM
public.tbl_person
JOIN public.tbl_benutzer b USING(person_id)
@@ -363,14 +363,14 @@ class Mitarbeiter_model extends DB_Model
$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)."%'
@@ -393,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);
@@ -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).")) AND gruppe_kurzbz is null)";
." AND ".$this->escape($sem_date_range->ende).")". $stringGroupLv. ")";
$query .="OR";
}
+54 -71
View File
@@ -242,91 +242,74 @@ class Message_model extends DB_Model
*/
public function getMessagesForTable($person_id, $offset, $limit)
{
$sql = <<<EOSQL
with filtered_messages as (
select
m.message_id, m.person_id as sender_id, mr.person_id as recipient_id
from
public.tbl_msg_message m
join
public.tbl_msg_recipient mr on mr.message_id = m.message_id
where
m.person_id = ?
group by
m.message_id, m.person_id, mr.person_id
union all
select
m.message_id, m.person_id as sender_id, mr.person_id as recipient_id
from
public.tbl_msg_message m
join
public.tbl_msg_recipient mr on mr.message_id = m.message_id
where
mr.person_id = ?
group by
m.message_id, m.person_id, mr.person_id
), lastmsgstatus as (
select
ms.*
from (
select
s.message_id, s.person_id, MAX(s.insertamum) as lastinserted
from
public.tbl_msg_status s
join
filtered_messages fm on fm.message_id = s.message_id and fm.recipient_id = s.person_id
group by
s.message_id, s.person_id
) ls
join
public.tbl_msg_status ms on ms.message_id = ls.message_id and ms.person_id = ls.person_id and ms.insertamum = ls.lastinserted
)
select
(select count(*) from filtered_messages) as total_msgs,
$sql_base = "
SELECT
m.message_id AS message_id,
m.subject AS subject,
m.body AS body,
m.insertamum AS insertamum,
m.relationmessage_id AS relationmessage_id,
(COALESCE(ps.titelpre,'') || ' ' || COALESCE(ps.vorname,'') || ' ' || COALESCE(ps.nachname,'') || ' ' || COALESCE(ps.titelpost,'')) as sender,
(COALESCE(pr.titelpre,'') || ' ' || COALESCE(pr.vorname,'') || ' ' || COALESCE(pr.nachname,'') || ' ' || COALESCE(pr.titelpost,'')) as recipient,
fm.sender_id,
fm.recipient_id,
ms.status,
ms.insertamum as statusdatum
from
filtered_messages fm
join
public.tbl_msg_message m on fm.message_id = m.message_id
join
lastmsgstatus ms on fm.message_id = ms.message_id and fm.recipient_id = ms.person_id
left join
public.tbl_person ps on ps.person_id = fm.sender_id
left join
public.tbl_person pr on pr.person_id = fm.recipient_id
order by
m.insertamum DESC
limit ?
offset ?;
EOSQL;
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = m.person_id) as sender,
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = r.person_id) as recipient,
m.person_id as sender_id,
r.person_id as recipient_id,
MAX(ss.status) as status,
MAX(ss.insertamum) as statusdatum
FROM public.tbl_msg_message m
JOIN public.tbl_msg_recipient r USING(message_id)
JOIN public.tbl_msg_status ss ON(r.message_id = ss.message_id AND ss.person_id = r.person_id)
WHERE m.person_id = ?
GROUP BY m.message_id, m.subject, m.body, m.insertamum, m.relationmessage_id, sender, recipient, sender_id, recipient_id
UNION ALL
SELECT
m.message_id AS message_id,
m.subject AS subject,
m.body AS body,
m.insertamum AS insertamum,
m.relationmessage_id AS relationmessage_id,
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = m.person_id) as sender,
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = r.person_id) as recipient,
m.person_id as sender_id,
r.person_id as recipient_id,
MAX(ss.status) as status,
MAX(ss.insertamum) as statusdatum
FROM public.tbl_msg_recipient r
JOIN public.tbl_msg_status ss USING(message_id, person_id)
JOIN public.tbl_msg_message m USING(message_id)
WHERE r.person_id = ?
GROUP BY m.message_id, m.subject, m.body, m.insertamum, m.relationmessage_id, sender, recipient, sender_id, recipient_id
";
$sql = "
SELECT COUNT(*) AS count FROM (
" . $sql_base . "
) a
";
$parametersArray = array($person_id, $person_id);
$count = $this->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);
$count = 0;
$data = $this->execQuery($sql, $parametersArray);
if (isError($data))
return $data;
$data = getData($data);
if($data)
{
$count = ceil($data[0]->total_msgs / $limit);
}
return success(['data' => $data, 'count' => $count]);
}
@@ -286,13 +286,7 @@ 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;
-47
View File
@@ -1,47 +0,0 @@
<?php
$includesArray = array(
'title' => '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);
?>
<div id="abgabetoolroot" class="h-100" style="max-width: 95%;" route=<?php echo json_encode($route) ?>
uid=<?php echo $uid ?>
student_uid_prop="<?php echo $student_uid_prop ?? '' ?>"
stg_kz_prop="<?php echo $stg_kz_prop ?? '' ?>"
>
</div>
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
+15
View File
@@ -0,0 +1,15 @@
<?php
$includesArray = array(
'title' => 'LvInfo',
'customJSModules' => ['public/js/apps/Cis/LvInfo.js']
);
$this->load->view('templates/CISVUE-Header', $includesArray);
?>
<div id="content">
<Info studien_semester="<?= $studien_semester ?>" lehrveranstaltung_id="<?= $lvid ?>"></Info>
</div>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
+18
View File
@@ -0,0 +1,18 @@
<?php
$includesArray = array(
'title' => '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);
?>
<div id="content" >
</div>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
@@ -21,25 +21,19 @@ $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/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/npm-asset/primevue/checkbox/checkbox.min.js',
'vendor/moment/luxonjs/luxon.min.js'
),
'customJSModules' => array(
'public/js/apps/Dashboard/Fhc.js',
'public/js/apps/Dashboard/Fhc.js'
),
);
+2 -6
View File
@@ -7,21 +7,19 @@
'vue3' => true,
'primevue3' => true,
#'filtercomponent' => true,
'tabulator6' => true,
'tabulator5' => 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/Detailheader.css'
'public/css/components/function.css'
],
'customJSs' => [
'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js',
@@ -47,8 +45,6 @@ $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,
];
?>
-50
View File
@@ -1,50 +0,0 @@
<?php
$includesArray = array(
'title' => '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);
?>
<?php
$configArray = [
'domain' => !defined('DOMAIN') ? 'notDefined' : DOMAIN,
];
?>
<div id="main">
<router-view
:permissions="<?= htmlspecialchars(json_encode($permissions)); ?>"
:config="<?= htmlspecialchars(json_encode($configArray)); ?>"
>
</router-view>
</div>
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
@@ -36,4 +36,4 @@ $this->load->view('templates/FHC-Header', $includesArray);
></cis-menu>
</header>
<main id="cis-main" class="flex-grow-1 p-4 pt-2" style="min-width: 0;">
<main id="cis-main" class="flex-grow-1 p-4 pt-2">
+4 -6
View File
@@ -17,7 +17,6 @@
$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;
@@ -192,13 +191,12 @@
// 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($extapphelper->getCustomJSs());
generateJSModulesInclude($extapphelper->getCustomJSModules());
generateJSsInclude($customJSs);
generateJSModulesInclude($customJSModules);
?>
</body>
</html>
+1 -6
View File
@@ -9,8 +9,6 @@
$title = isset($title) ? $title : null;
$refresh = isset($refresh) ? $refresh : null;
$customCSSs = isset($customCSSs) ? $customCSSs : null;
$customJSs = isset($customJSs) ? $customJSs : null;
$customJSModules = isset($customJSModules) ? $customJSModules : null;
$skipID = isset($skipID) ? $skipID : null;
?>
<!-- Header start -->
@@ -134,11 +132,8 @@
//Tags
if ($tags === true) generateCSSsInclude('public/css/tags.css');
$extapphelper = ExtendableAppsHelper::getInstance();
$extapphelper->init($customCSSs, $customJSs, $customJSModules);
// Eventually required CSS
generateCSSsInclude($extapphelper->getCustomCSSs()); // Eventually required CSS
generateCSSsInclude($customCSSs); // Eventually required CSS
?>
</head>
<body>
+16 -29
View File
@@ -264,7 +264,7 @@ else
tbl_bisio.bisio_id, tbl_bisio.bis, tbl_bisio.von,
tbl_zeugnisnote.note,tbl_mobilitaet.mobilitaetstyp_kurzbz,
(CASE WHEN bis.tbl_mobilitaet.studiensemester_kurzbz = vw_student_lehrveranstaltung.studiensemester_kurzbz THEN '1' ELSE '' END) as doubledegree,
tbl_note.lkt_ueberschreibbar, tbl_note.anmerkung, tbl_zeugnisnote.punkte
tbl_note.lkt_ueberschreibbar, tbl_note.anmerkung
FROM
campus.vw_student_lehrveranstaltung JOIN public.tbl_benutzer USING(uid)
JOIN public.tbl_person USING(person_id) JOIN public.tbl_student ON(uid=student_uid)
@@ -306,14 +306,7 @@ else
&& $elem->von < $stsemdatumbis && (anzahlTage($elem->von, $elem->bis) >= 30))
$inc.=' (o)';
if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true)
{
$note = $elem->punkte;
}
else
{
$note = $elem->note;
}
$note = $elem->note;
if($elem->lkt_ueberschreibbar == 'f') // angerechnet / intern angerechnet / nicht zugelassen
{
@@ -346,23 +339,20 @@ else
{
$worksheet->write($lines,8, trim($elem->matrikelnr), $format_highlight);
$pr = new Pruefung();
$pr->getPruefungen($elem->uid, "Termin2", $lvid, $stsem);
$pr->getPruefungen($elem->uid, "Termin2", $lvid, $sem);
$output2 = $pr->result;
if ($output2)
{
$resultPr = $output2[0];
$worksheet->write($lines,9, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date);
if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true)
$worksheet->write($lines,10, $resultPr->punkte, $format_highlightright);
else
$worksheet->write($lines,10, $resultPr->note, $format_highlightright);
}
else
{
$worksheet->write($lines,9, '', $format_highlightright_date);
$worksheet->write($lines,10, '', $format_highlightright);
$worksheet->write($lines,10, $resultPr->note, $format_highlightright);
}
else
{
$worksheet->write($lines,9, '', $format_highlightright_date);
$worksheet->write($lines,10, '', $format_highlightright);
}
}
// Nachprüfung
@@ -370,23 +360,20 @@ else
{
$worksheet->write($lines,12, trim($elem->matrikelnr), $format_highlight);
$pr = new Pruefung();
$pr->getPruefungen($elem->uid, "Termin3", $lvid, $stsem);
$pr->getPruefungen($elem->uid, "Termin3", $lvid, $sem);
$output3 = $pr->result;
if ($output3)
{
$resultPr = $output3[0];
$worksheet->write($lines,13, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date);
if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true)
$worksheet->write($lines,14, $resultPr->punkte, $format_highlightright);
else
$worksheet->write($lines,14, $resultPr->note, $format_highlightright);
}
else
{
$worksheet->write($lines,13, '', $format_highlightright_date);
$worksheet->write($lines,14, '', $format_highlightright);
$worksheet->write($lines,14, $resultPr->note, $format_highlightright);
}
else
{
$worksheet->write($lines,13, '', $format_highlightright_date);
$worksheet->write($lines,14, '', $format_highlightright);
}
}
$i++;
+1 -1
View File
@@ -1041,7 +1041,7 @@ function sendEmail($coodle_id)
."END:STANDARD\r\n"
."END:VTIMEZONE\r\n"
."BEGIN:VEVENT\r\n"
.$coodle->foldContentLine("ORGANIZER:MAILTO:".$erstellername." <".$coodle->ersteller_uid."@".DOMAIN).">\r\n"
.$coodle->foldContentLine("ORGANIZER:MAILTO:".$erstellername." <".$coodle->ersteller_uid."@".DOMAIN)."\r\n"
.rtrim($teilnehmer)."\r\n"
."DTSTART;TZID=Europe/Vienna:".$dtstart."\r\n"
."DTEND;TZID=Europe/Vienna:".$dtend."\r\n"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

+54 -75
View File
@@ -86,88 +86,67 @@ echo '<?xml version="1.0" encoding="ISO-8859-1" ?>';
<h3>Formel / Formula</h3>
<div style="font-size: large; padding-top: 15px">
<math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<mfrac>
<mn>5</mn>
<mn>3</mn>
</mfrac>
<mo>+</mo>
<mfrac>
<mn>7</mn>
<mn>6</mn>
</mfrac>
<mo>=</mo>
<mfrac>
<mn>10</mn>
<mn>6</mn>
</mfrac>
<mo>+</mo>
<mfrac>
<mn>7</mn>
<mn>6</mn>
</mfrac>
<mo>=</mo>
<mfrac>
<mn>17</mn>
<mn>6</mn>
</mfrac>
</mrow>
<mfrac>
<mn> 5 </mn>
<mn> 3 </mn>
</mfrac>
<mo> + </mo>
<mfrac>
<mn> 7 </mn>
<mn> 6 </mn>
</mfrac>
<mo> = </mo>
<mfrac>
<mn> 10 </mn>
<mn> 6 </mn>
</mfrac>
<mo> + </mo>
<mfrac>
<mn> 7 </mn>
<mn> 6 </mn>
</mfrac>
<mo> = </mo>
<mfrac>
<mn> 17 </mn>
<mn> 6 </mn>
</mfrac>
</math><br/><br/>
<math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<munderover>
<mo>&sum;</mo>
<mrow>
<mi>k</mi>
<mo>=</mo>
<mn>1</mn>
</mrow>
<mn>5</mn>
</munderover>
<mrow>
<msup>
<mrow>
<mo>(</mo>
<mo>-</mo>
<mn>1</mn>
<mo>)</mo>
</mrow>
<mrow>
<mi>k</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
</msup>
<mfrac>
<mrow>
<msup>
<mi>x</mi>
<mrow>
<mn>2</mn>
<mi>k</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
</msup>
</mrow>
<mrow>
<mo>(</mo>
<mn>2</mn>
<mi>k</mi>
<mo>+</mo>
<mn>1</mn>
<mo>)</mo>
<mo>!</mo>
</mrow>
</mfrac>
</mrow>
</mrow>
<mrow>
<munderover>
<mo movablelimits="false">&sum;</mo>
<mn><mi>k</mi>=1</mn>
<mn>5</mn>
</munderover>
<mrow>
<msup>
<mo>(-1)</mo>
<mn><mi>k</mi>+1</mn>
</msup>
</mrow>
<mfrac>
<mrow>
<msup>
<mi>x</mi>
<mn>2<mi>k</mi> + 1</mn>
</msup>
</mrow>
<mrow>
<mo>(2<mi>k</mi>+1)!</mo>
</mrow>
</mfrac>
</mrow>
</math>
</div>
</div>
<div class="col-sm-6">
<h3>Bild / Picture</h3>
<img alt="Beispielbild" src="MathML_Beispiel.png" height="140" style="border: 1px solid black">
<img alt="Beispielbild" src="MathML_Beispiel.jpg" border="1" height="154" width="233"></img>
</div>
</div>
</div>
+4 -4
View File
@@ -1172,8 +1172,8 @@ if ($frage_id != '')
echo "</td></tr>";
//Vorschau fuer das Text-Feld
echo "<tr><td style='width: 50%'>Vorschau:<br />
<div id='vorschau_frage' style='border: 1px solid black; padding: 5px' align='center'>$frage->text</div></td>
<td style='width: 50%'>Derzeit:<br /><div id='aktuell' style='border: 1px solid black; padding: 5px' align='center'>$frage->text</div>
<div id='vorschau_frage' style='border: 1px solid black' align='center'>$frage->text</div></td>
<td style='width: 50%'>Derzeit:<br /><div id='aktuell' style='border: 1px solid black' align='center'>$frage->text</div>
</td></tr>";
echo "</table>";
echo '</td><td style="border-left: 1px solid black" valign="top">';
@@ -1280,8 +1280,8 @@ if ($frage_id != '')
echo "/></td></tr>";
echo "<tr><td colspan='2' align='right'><input type='submit' name='submitvorschlag' value='Speichern' />".($vorschlag_id != ''?"<input type='button' value='Abbrechen' onclick=\"document.location.href='$PHP_SELF?gebiet_id=$gebiet_id&amp;stg_kz=$stg_kz&amp;nummer=$nummer&amp;frage_id=$frage->frage_id'\" />":'')."</td></tr>";
//Vorschau fuer das Text-Feld
echo "<tr><td colspan='2'>Vorschau:<br /><div id='vorschau_vorschlag' style='border: 1px solid black; padding: 5px' align='center'>$vorschlag->text</div>
Derzeit:<br /><div id='aktuellvorschlag' style='border: 1px solid black; padding: 5px' align='center'>$vorschlag->text</div></td></tr>";
echo "<tr><td colspan='2'>Vorschau:<br /><div id='vorschau_vorschlag' style='border: 1px solid black' align='center'>$vorschlag->text</div>
Derzeit:<br /><div id='aktuellvorschlag' style='border: 1px solid black' align='center'>$vorschlag->text</div></td></tr>";
echo "</table>";
echo "</form>";
echo '</td></tr></table>';
+2 -2
View File
@@ -581,14 +581,14 @@ if($frage->frage_id!='')
else
$value=$p->t('testtool/blaettern').' &gt;&gt;';
echo "<a href='$PHP_SELF?gebiet_id=$gebiet_id&amp;frage_id=$nextfrage' class='Item' style='padding-left: 5px'>$value</a>";
echo " <a href='$PHP_SELF?gebiet_id=$gebiet_id&amp;frage_id=$nextfrage' class='Item'>$value</a>";
}
else
{
if(!$demo)
{
//Wenns der letzte Eintrag ist, wieder zum ersten springen
echo "<a href='$PHP_SELF?gebiet_id=$gebiet_id' class='Item' style='padding-left: 5px'>".$p->t('testtool/blaettern')." &gt;&gt;</a>";
echo " <a href='$PHP_SELF?gebiet_id=$gebiet_id' class='Item'>".$p->t('testtool/blaettern')." &gt;&gt;</a>";
}
}
}
+8 -22
View File
@@ -340,26 +340,13 @@ else
}
}
if (
(
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) &&
!isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code']) &&
!isset($_SESSION['externe_ueberwachung']) && !isset($_SESSION['externe_ueberwachung_verified'])
)
||
(
isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true &&
isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === true &&
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])
)
||
(
isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true &&
isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === true &&
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])
)
)
if ((isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) &&
!isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code'])) ||
(isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true &&
isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === true &&
isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true &&
isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === true &&
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])))
{
$pruefling = new pruefling();
@@ -678,11 +665,10 @@ elseif (isset($prestudent_id))
else
{
// Letzten Status für des Prestudenten einholen
$ps_master = new Prestudent($prestudent_id);
$ps_master = new Prestudent();
$ps_master->getLastStatus($prestudent_id);
$sto = new Studienordnung();
$sto->getStudienordnungFromStudienplan($ps_master->studienplan_id);
$stg = new Studiengang($ps_master->studiengang_kz);
// Name des Studiengangs aus Studienordnung laden, ansonsten Fallback auf Studiengang
$stg_name = $sto->studiengangbezeichnung;
$stg_name_eng = $sto->studiengangbezeichnung_englisch;
-1
View File
@@ -311,7 +311,6 @@ define('EXTERNE_UEBERWACHUNG_TRIAL_TEST', false);
define('EXTERNE_UEBERWACHUNG_EXAM_PARAMS', []);
define('EXTERNE_UEBERWACHUNG_EXAM_RULES', []);
define('EXTERNE_UEBERWACHUNG_EXAM_SCORE', []);
define('EXTERNE_UEBERWACHUNG_EXAM_WARNINGS', []);
?>
-2
View File
@@ -371,6 +371,4 @@ define('STATUS_VORRUECKEN_ANZEIGEN', true);
//externe Ueberwachung im Testtool erlauben
define('TESTTOOL_EXTERNE_UEBERWACHUNG_ALLOWED', false);
//enable tags in StudVW
define('STV_TAGS_ENABLED', false);
?>
@@ -798,10 +798,6 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#updatevon" />
<splitter class="tree-splitter"/>
<treecol id="student-prestudent-tree-rolle-fgm" label="FGM" flex="1" hidden="true" persist="hidden, width, ordinal"
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#fgm" />
<splitter class="tree-splitter"/>
</treecols>
<template>
@@ -827,7 +823,6 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#insertvon"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#updateamum"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#updatevon"/>
<treecell properties="Aktiv_rdf:http://www.technikum-wien.at/prestudentrolle/rdf#aktiv rdf:http://www.technikum-wien.at/prestudentrolle/rdf#stichtagsaktiv" label="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#fgm"/>
</treerow>
</treeitem>
</treechildren>
+66 -164
View File
@@ -479,182 +479,91 @@ class anwesenheit extends basis_db
*/
public function loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid=null, $lehrveranstaltung_id=null)
{
$qry = "SELECT
lehrveranstaltung_id,
vorname,
nachname,
wahlname,
student_uid AS uid,
bezeichnung,
gesamt AS gesamtstunden,
anwesend,
nichtanwesend,
CASE WHEN gesamt = 0 THEN 100.00 ELSE trunc(100-(nichtanwesend/(gesamt))*100,2) END AS prozent
FROM(
SELECT
vorname,
nachname,
wahlname,
lehrveranstaltung_id,
bezeichnung,
student_uid,
--COUNT(stundenplan_id) AS gesamts,
COALESCE(anwesend.summe, 0) + COALESCE(nichtanwesend.summe, 0) AS gesamt,
COALESCE(anwesend.summe, 0) AS anwesend,
COALESCE(nichtanwesend.summe, 0) AS nichtanwesend
$qry = "SELECT
lehrveranstaltung_id, vorname, nachname, wahlname, student_uid as uid, bezeichnung,
gesamt as gesamtstunden, anwesend, nichtanwesend, trunc(100-(nichtanwesend/gesamt)*100,2) as prozent
FROM
(
SELECT
vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid,
count(stundenplan_id) as gesamt,
case when anwesend.summe is null then 0 else anwesend.summe end as anwesend,
case when nichtanwesend.summe is null then 0 else nichtanwesend.summe end as nichtanwesend
FROM
(
SELECT
SUM(stundenplan_id) AS stundenplan_id,
datum,
stunde,
lehrveranstaltung_id,
bezeichnung,
studiensemester_kurzbz,
studiengang_kz
SELECT
sum(stundenplan_id) as stundenplan_id, datum, stunde, lehrveranstaltung_id,
bezeichnung, studiensemester_kurzbz, studiengang_kz,
TRIM(
CASE WHEN stp.gruppe_kurzbz is not null then stp.gruppe_kurzbz
else stp.semester||(case when verband is null then '' else stp.verband end)||(case when stp.gruppe is null then '' else stp.gruppe end) end) as gruppe
FROM
lehre.tbl_lehrveranstaltung lv
JOIN
lehre.tbl_lehreinheit le USING (lehrveranstaltung_id)
JOIN
lehre.tbl_stundenplan stp USING (lehreinheit_id,studiengang_kz)
JOIN lehre.tbl_lehreinheit le using (lehrveranstaltung_id)
JOIN lehre.tbl_stundenplan stp using (lehreinheit_id,studiengang_kz)
WHERE
studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
AND (titel NOT LIKE '%Nebenprüfung%' OR titel IS NULL)
GROUP BY
datum,
stunde,
lehrveranstaltung_id,
bezeichnung,
studiensemester_kurzbz,
studiengang_kz,
stp.gruppe_kurzbz,
stp.semester,
stp.verband,
stp.gruppe
AND (titel not like '%Nebenprüfung%' OR titel is null)
group by datum, stunde, lehrveranstaltung_id, bezeichnung, studiensemester_kurzbz, studiengang_kz, stp.gruppe_kurzbz, stp.semester, stp.verband, stp.gruppe
)x
JOIN (
SELECT
le.lehrveranstaltung_id,
slv.student_uid,
le.studiensemester_kurzbz,
st.prestudent_id
FROM
public.tbl_studentlehrverband slv
JOIN
lehre.tbl_lehreinheitgruppe leg
ON slv.studiengang_kz = leg.studiengang_kz
AND slv.semester = leg.semester
AND (
NULLIF(btrim(leg.verband::text), '') IS NULL
OR NULLIF(btrim(slv.verband::text), '') = NULLIF(btrim(leg.verband::text), '')
)
AND (
NULLIF(btrim(leg.gruppe::text), '') IS NULL
OR NULLIF(btrim(slv.gruppe::text), '') = NULLIF(btrim(leg.gruppe::text), '')
)
JOIN
lehre.tbl_lehreinheit le USING (lehreinheit_id, studiensemester_kurzbz)
JOIN
public.tbl_student st USING(student_uid)
WHERE
leg.gruppe_kurzbz IS NULL
AND le.studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
GROUP BY
le.lehrveranstaltung_id,
slv.student_uid,
le.studiensemester_kurzbz,
st.prestudent_id
SELECT semester::text as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
FROM
public.tbl_studentlehrverband
WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
UNION
SELECT semester||verband as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
FROM
public.tbl_studentlehrverband
WHERE
studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
UNION
SELECT semester||verband||gruppe as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
FROM
public.tbl_studentlehrverband
WHERE
studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
UNION
SELECT gruppe_kurzbz as gruppe, public.tbl_benutzergruppe.studiensemester_kurzbz, uid as student_uid, studiengang_kz
FROM
public.tbl_benutzergruppe
JOIN
public.tbl_gruppe using (gruppe_kurzbz)
WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
)a using (gruppe, studiensemester_kurzbz, studiengang_kz)
JOIN public.tbl_benutzer b on b.uid = student_uid
JOIN public.tbl_person p using(person_id)
LEFT JOIN(
SELECT
le.lehrveranstaltung_id,
bg.uid AS student_uid,
bg.studiensemester_kurzbz,
st.prestudent_id
FROM
public.tbl_benutzergruppe bg
JOIN
lehre.tbl_lehreinheitgruppe leg USING (gruppe_kurzbz)
JOIN
lehre.tbl_lehreinheit le USING(lehreinheit_id, studiensemester_kurzbz)
JOIN
public.tbl_student st ON bg.uid = st.student_uid
WHERE
bg.studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
GROUP BY
le.lehrveranstaltung_id,
bg.uid,
bg.studiensemester_kurzbz,
st.prestudent_id
)a USING (lehrveranstaltung_id, studiensemester_kurzbz)
JOIN
public.tbl_benutzer b on b.uid = student_uid
JOIN
public.tbl_person p using(person_id)
LEFT JOIN(
SELECT
lehrveranstaltung_id,
studiensemester_kurzbz,
uid AS student_uid,
SUM(einheiten) AS summe
lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe
FROM
campus.tbl_anwesenheit a
JOIN
lehre.tbl_lehreinheit le USING(lehreinheit_id)
JOIN
lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
JOIN lehre.tbl_lehreinheit le using (lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
WHERE
anwesend = true
AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
anwesend = true AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
GROUP BY
lehrveranstaltung_id,
bezeichnung,
uid,
studiensemester_kurzbz
)anwesend USING(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
)anwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
LEFT JOIN(
SELECT
lehrveranstaltung_id,
studiensemester_kurzbz,
uid AS student_uid,
SUM(einheiten) AS summe
SELECT lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe
FROM
campus.tbl_anwesenheit a
JOIN
lehre.tbl_lehreinheit le USING (lehreinheit_id)
JOIN
lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
JOIN lehre.tbl_lehreinheit le using (lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
WHERE
anwesend = false
AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
anwesend = false AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
GROUP BY
lehrveranstaltung_id,
bezeichnung,
uid,
studiensemester_kurzbz
)nichtanwesend USING(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
)nichtanwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
WHERE
lehrveranstaltung_id > 0
";
@@ -664,15 +573,8 @@ class anwesenheit extends basis_db
if(!is_null($lehrveranstaltung_id))
$qry.=" AND lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id);
$qry.=" GROUP BY
vorname,
nachname,
wahlname,
lehrveranstaltung_id,
bezeichnung,
student_uid,
anwesend.summe,
nichtanwesend.summe
$qry.="group by
vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid, anwesend.summe, nichtanwesend.summe
)m";
if($lehrveranstaltung_id != '')
-5
View File
@@ -168,11 +168,6 @@ class externeUeberwachung extends basis_db
$payload = array_merge($payload, EXTERNE_UEBERWACHUNG_EXAM_PARAMS);
}
if (defined('EXTERNE_UEBERWACHUNG_EXAM_WARNINGS'))
{
$payload['visibleWarnings'] = EXTERNE_UEBERWACHUNG_EXAM_WARNINGS;
}
if (defined('EXTERNE_UEBERWACHUNG_EXAM_RULES'))
{
$payload['rules'] = EXTERNE_UEBERWACHUNG_EXAM_RULES;
+1 -48
View File
@@ -345,7 +345,6 @@ class gebiet extends basis_db
}
//Pruefen ob jede Fragen mindestens 2 Vorschlaege hat
//Angepasst am 28.01.2026 auf ein Warning.
$qry = "SELECT frage_id, nummer FROM testtool.tbl_frage
WHERE (SELECT count(*) as anzahl FROM testtool.tbl_vorschlag WHERE frage_id=tbl_frage.frage_id)<2
AND gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." AND NOT demo;";
@@ -353,7 +352,7 @@ class gebiet extends basis_db
{
while($row = $this->db_fetch_object())
{
$this->warningmsg .= "Frage Nummer $row->nummer (ID: $row->frage_id) hat weniger als 2 Vorschlaege.\n";
$this->errormsg .= "Frage Nummer $row->nummer (ID: $row->frage_id) hat weniger als 2 Vorschlaege.\n";
}
}
@@ -449,52 +448,6 @@ class gebiet extends basis_db
}
}
//Pruefen ob es leere Fragen (ohne Text, Bild oder Audio) gibt
$qry = "SELECT
fr.frage_id,
fr.nummer,
fs.sprache
FROM
testtool.tbl_frage fr
JOIN testtool.tbl_frage_sprache fs
USING (frage_id)
WHERE
(fs.text IS NULL
OR fs.text = '')
AND fs.bild IS NULL
AND fs.audio IS NULL
AND demo = false
AND gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)."
AND EXISTS (
SELECT
1
FROM
testtool.tbl_frage fr2
JOIN testtool.tbl_frage_sprache fs2
USING (frage_id)
WHERE
fs2.sprache = fs.sprache
AND fr2.gebiet_id = fr.gebiet_id
AND fr2.frage_id != fr.frage_id
AND (
(fs2.text IS NOT NULL
AND fs2.text != '')
OR fs2.bild IS NOT NULL
OR fs2.audio IS NOT NULL
)
AND demo = false
)
ORDER BY
fs.sprache,
fr.nummer;";
if($this->db_query($qry))
{
while($row = $this->db_fetch_object())
{
$this->warningmsg .= "Frage Nummer $row->nummer (ID: $row->frage_id), Sprache $row->sprache hat keinen Text, Bild oder Audio.\n";
}
}
if($this->errormsg=='')
return true;
else
-2
View File
@@ -270,8 +270,6 @@ class LehreListHelper
} else if ($row->bisio_id != '' && $row->status != 'Incoming' && ($row->von > $stsemdatumvon || $row->von == '')) {
// if bis datum is not yet known but von is available already
$zusatz .= '(o)(ab '.$datum->formatDatum($row->von, 'd.m.Y').')';
} else if ($row->bisio_id != '' && $row->status != 'Incoming' && ($row->von <= $stsemdatumvon || $row->von == '') && ($row->bis == '' || $row->bis > date('Y-m-d'))){
$zusatz .= '(o)(ab '.$datum->formatDatum($row->von, 'd.m.Y').')';
}
-1
View File
@@ -705,7 +705,6 @@ class prestudent extends person
$rolle->studienplan_bezeichnung = $row->studienplan_bezeichnung;
$rolle->bestaetigtam = $row->bestaetigtam;
$rolle->bestaetigtvon = $row->bestaetigtvon;
$rolle->fgm = $row->fgm;
$rolle->anmerkung_status = $row->anmerkung;
$rolle->bewerbung_abgeschicktamum = $row->bewerbung_abgeschicktamum;
$rolle->rt_stufe = $row->rt_stufe;
+1 -8
View File
@@ -513,7 +513,6 @@ class statistik extends basis_db
$this->json=array();
$this->countRows=0;
set_time_limit(600);
$parseHtml = (strpos($this->preferences, 'parseHTML: true') !== false);
// In case a decryption function is used then perform password substitution
$this->sql = $this->replaceSQLDecryptionPassword($this->sql);
@@ -566,13 +565,7 @@ class statistik extends basis_db
for($spalte=0;$spalte<$anzahl_spalten;$spalte++)
{
$name = $this->db_field_name($this->data,$spalte);
if ($parseHtml) {
// HTML direkt rendern
$this->html .= '<td>'.($row->$name).'</td>';
} else {
// wie bisher escapen
$this->html .= '<td>'.$this->convert_html_chars($row->$name).'</td>';
}
$this->html.= '<td>'.$this->convert_html_chars($row->$name).'</td>';
// Umwandeln von Punkt in Komma bei Float-Werten
if (is_numeric($row->$name))
{
+2 -4
View File
@@ -53,10 +53,8 @@ $this->phrasen['testtool/fuerFolgendeStgAngemeldet']='Für folgende Studiengäng
$this->phrasen['testtool/invalideGebiete']='Ein oder mehrere Fragengebiet/e inkorrekt!<br>Bitte melden Sie dies der Betreuungsperson.';
$this->phrasen['testtool/confirmationText']='<b>Ich bestätige, den Online-Reihungstest persönlich, selbständig, ohne Hilfe einer zusätzlichen Person und ohne Hilfsmittel zu absolvieren.<br>
I confirm that I will complete the online placement test personally, independently, without the help of an additional person and without any aids.</b>';
$this->phrasen['testtool/dsgvoConfirmText']='<b>Ich habe die <a href ="'. APP_ROOT. 'cms/dms.php?id=373121" target="_blank">Datenschutzerklärung</a> gelesen. <br />
I have read the <a href ="'. APP_ROOT. 'cms/dms.php?id=374814" target="_blank">privacy policy</a>.</b>';
$this->phrasen['testtool/procotoringConfirmText']='<b>Ich stimme der digitalen Beaufsichtigung beim Online-Reihungstest (Proctoring) zu. <br />
I agree to the digital supervision of the online placement test (proctoring).</b>';
$this->phrasen['testtool/dsgvoConfirmText']='<b>Ich habe die <a href ="'. APP_ROOT. 'cms/dms.php?id=373121" target="_blank">Datenschutzerklärung</a> gelesen.</b>';
$this->phrasen['testtool/procotoringConfirmText']='<b>Ich stimme der digitalen Beaufsichtigung beim Online-Reihungstest (Proctoring) zu.</b>';
$this->phrasen['testtool/loginNoetig']='Bitte beachten Sie, dass der Reihungstest erst <b>unmittelbar</b> vor Ihrem <b>Reihungstesttermin</b> von uns aktiviert wird.<br>
Please note that the test will be activated by us <b>immediately</b> before your <b>placement test date</b>.';
$this->phrasen['testtool/start']='Reihungstest jetzt starten';
-9
View File
@@ -1,9 +0,0 @@
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^[0-9]{10}/(.*)$ $1 [L]
RewriteCond %{REQUEST_URI} ^(.*?)/public/index.ci.php/
RewriteRule ^index.ci.php/(.*)$ %1/index.ci.php/$1 [R=303]
</IfModule>
+1 -6
View File
@@ -407,6 +407,7 @@ html {
background-color: var(--fhc-background);
border-color: var(--fhc-border);
padding: var(--fhc-cis-main-py) var(--fhc-cis-main-px);
min-width: 0; /* fix flex-grow with tabulator exceeding width */
}
#cis-main .fa-arrow-up-right-from-square {
@@ -855,9 +856,3 @@ html {
background-color: var(--fhc-secondary);
}
.bordered-modal {
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 0.5rem;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
}
+6 -102
View File
@@ -12,22 +12,22 @@ html {
font-size: .875em;
}
html.fs_xx-small {
font-size: .625em;
font-size: .5em;
}
html.fs_x-small {
font-size: .6875em;
font-size: .625em;
}
html.fs_small {
font-size: .75em;
}
html.fs_normal {
font-size: .8125em;
font-size: .875em;
}
html.fs_big {
font-size: .875em;
font-size: 1em;
}
html.fs_huge {
font-size: 1em;
font-size: 1.125em;
}
#appMenu {
@@ -74,12 +74,6 @@ html.fs_huge {
color: var(--gray-500);
}
/* Aufnahme Termine: background color green*/
.stv-details-admission-table .row-green{
background-color: lightgreen !important;
//color: var(--green-200);
}
/* Dropdown Toolbar Interessent, submenu */
.dropend .dropdown-toggle.d-flex::after {
height: 0;
@@ -122,15 +116,6 @@ html.fs_huge {
position: inherit;
z-index: 1;
}
.sidebar-collapsed #sidebarMenu {
display: none !important;
}
.sidebar-collapsed .container-fluid > .row > main {
flex: 0 0 100%;
max-width: 100%;
}
}
@@ -183,7 +168,7 @@ html.fs_huge {
}
.has-filter .fa-filter {
color: var(--bs-danger);
color: var(--bs-success);
}
.override_filtercmpt_actions_style div.d-flex.align-items-baseline {
align-items: end !important;
@@ -200,84 +185,3 @@ html.fs_huge {
.tiny-90 div.tox.tox-tinymce {
height: 90% !important;
}
/* slim begin */
.stv .form-label {
margin-bottom: .15rem;
font-weight: bold;
}
.stv .form-control,
.stv .form-select,
.stv .input-group-text {
padding-top: .15rem;
padding-bottom: .15rem;
}
:root {
--bs-body-line-height: 1.2;
}
.stv .tabulator-row .tabulator-cell,
.stv .tabulator-header-filter input {
padding-top: 1px !important;
padding-bottom: 1px !important;
}
.stv .tabulator-row {
min-height: 18px;
}
.stv .btn {
--bs-btn-padding-y: 0.25rem;
--bs-btn-line-height: 1.2;
}
.stv .p-button.p-button-icon-only {
padding-top: 0;
padding-bottom: 0;
}
.stv .p-tabview .p-tabview-nav li .p-tabview-nav-link {
padding: 0.25rem .5rem;
}
/*
.stv .p-tabview .p-tabview-panels {
background-color: #e5eff5;
}
.stv .p-tabview .p-tabview-nav li.p-highlight .p-tabview-nav-link {
background: #e5eff5;
border-color: #dee2e6 #dee2e6 #e5eff5 #dee2e6;
}
*/
.stv-details-details-foto img {
max-height: 120px;
}
.stv .tabulator-row .tabulator-frozen,
.stv .tabulator-row .tabulator-cell {
border-bottom: none;
}
/*
.stv .p-treetable .p-treetable-thead > tr > th,
.stv .p-treetable .p-treetable-tbody > tr {
background-color: #e5eff5;
}
.stv .p-treetable .p-treetable-tbody > tr.p-highlight {
background: #007bff;
color: #fff;
}
.stv .p-treetable.p-treetable-hoverable-rows .p-treetable-tbody > tr:not(.p-highlight):hover {
background: #fff;
color: #212529;
}
.tabulator-row.tabulator-row-even .tabulator-cell {
background-color: #e5eff5;
}
*/
/* slim ende */
-20
View File
@@ -1,20 +0,0 @@
@import './components/verticalsplit.css';
html {
font-size: .875em;
}
.vv{
display: flex;
flex-direction: column;
height: 100vh;
}
.vv> header {
flex: 0 0 auto;
}
.vv> div {
flex: 1 1 auto;
}
.vv {
margin-left: 0 !important;
}
-64
View File
@@ -1,64 +0,0 @@
.foto-container:hover .fotoedit {
opacity: 1 !important;
}
.bg-unruly {
background-color: #ad1010 !important;
color: white;
}
/*.fotosperre {
z-index: 1;
font-size: 1rem;
width: 1.25rem;
height: 1.25rem;
}*/
.foto-container .fotoedit {
opacity: 0;
transition: opacity 0.3s;
backdrop-filter: blur(2px);
}
.fotoedit {
background-color: rgba(0, 0, 0, 0.4);
color: white;
border: none;
z-index: 4;
font-size: 1rem;
width: 1.8rem;
height: 1.8rem;
opacity:0;
transition: opacity 0.2s;
top:20%;
}
/* fotoeditMa {
background-color: rgba(0, 0, 0, 0.4);
color: white;
border: none;
z-index: 4;
font-size: 1rem;
opacity:0;
transition: opacity 0.2s;
top:20%;
}*/
.buttonleft {
margin-left: .25rem;
}
.buttonright {
margin-right: .25rem;
}
/*.fotoEditMa {
z-index: 104;
font-size: 1rem;
width: 2.5rem;
height: 2.5rem;
opacity:0;
transition: opacity 0.2s;
top:13%;"
z-index: 104; font-size: 1rem; width: 2.5rem; height: 2.5rem; opacity:0; transition: opacity 0.2s; top:13%;"
}*/
-308
View File
@@ -1,308 +0,0 @@
/* Base Header */
.verpasst-header {
background-color: var(--fhc-red-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 34px;
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}
/* Hover State */
.verpasst-header:hover {
background-color: var(--fhc-red-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Active / Expanded State */
.p-accordion-tab-active > .verpasst-header {
background-color: var(--fhc-red-50);
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
/* Hover State Active*/
.p-accordion-tab-active > .verpasst-header:hover {
background-color: var(--fhc-red-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.abzugeben-header {
background-color: var(--fhc-yellow-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 34px;
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}
/* Hover State */
.abzugeben-header:hover {
background-color: var(--fhc-yellow-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Active / Expanded State */
.p-accordion-tab-active > .abzugeben-header {
background-color: var(--fhc-yellow-50);
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
/* Hover State Active*/
.p-accordion-tab-active > .abzugeben-header:hover {
background-color: var(--fhc-yellow-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.beurteilungerforderlich-header {
background-color: var(--fhc-orange-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 34px;
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}
/* Hover State */
.beurteilungerforderlich-header:hover {
background-color: var(--fhc-orange-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Active / Expanded State */
.p-accordion-tab-active > .beurteilungerforderlich-header {
background-color: var(--fhc-orange-50);
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
/* Hover State Active*/
.p-accordion-tab-active > .beurteilungerforderlich-header:hover {
background-color: var(--fhc-orange-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.verspaetet-header {
background-color: var(--fhc-pink-40);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 34px;
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}
/* Hover State */
.verspaetet-header:hover {
background-color: var(--fhc-pink-20);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Active / Expanded State */
.p-accordion-tab-active > .verspaetet-header {
background-color: var(--fhc-pink-30);
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
/* Hover State Active*/
.p-accordion-tab-active > .verspaetet-header:hover {
background-color: var(--fhc-pink-20);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.abgegeben-header {
background-color: var(--fhc-green-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 34px;
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}
/* Hover State */
.abgegeben-header:hover {
background-color: var(--fhc-green-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Active / Expanded State */
.p-accordion-tab-active > .abgegeben-header {
background-color: var(--fhc-green-50);
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
/* Hover State Active*/
.p-accordion-tab-active > .abgegeben-header:hover {
background-color: var(--fhc-green-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.bestanden-header {
background-color: var(--fhc-green-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 34px;
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}
/* Hover State */
.bestanden-header:hover {
background-color: var(--fhc-green-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Active / Expanded State */
.p-accordion-tab-active > .bestanden-header {
background-color: var(--fhc-green-50);
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
/* Hover State Active*/
.p-accordion-tab-active > .bestanden-header:hover {
background-color: var(--fhc-green-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.nichtbestanden-header {
background-color: var(--fhc-red-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 34px;
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}
/* Hover State */
.nichtbestanden-header:hover {
background-color: var(--fhc-red-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Active / Expanded State */
.p-accordion-tab-active > .nichtbestanden-header {
background-color: var(--fhc-red-50);
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
/* Hover State Active*/
.p-accordion-tab-active > .nichtbestanden-header:hover {
background-color: var(--fhc-red-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.erledigt-header {
background-color: var(--fhc-red-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 34px;
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}
/* Hover State */
.erledigt-header:hover {
background-color: var(--fhc-red-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Active / Expanded State */
.p-accordion-tab-active > .erledigt-header {
background-color: var(--fhc-red-50);
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
/* Hover State Active*/
.p-accordion-tab-active > .erledigt-header:hover {
background-color: var(--fhc-red-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.standard-header {
background-color: var(--fhc-white-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 34px;
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}
/* Hover State */
.standard-header:hover {
background-color: var(--fhc-white-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Active / Expanded State */
.p-accordion-tab-active > .standard-header {
background-color: var(--fhc-white-50);
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
/* Hover State Active*/
.p-accordion-tab-active > .standard-header:hover {
background-color: var(--fhc-white-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
#abgabetoolroot .modal-header{
background-color: var(--fhc-blue-primary);
color: var(--fhc-white-50);
}
#abgabetoolroot .modal-header .btn-close{
filter: invert(1);
}
#abgabetoolroot .modal-footer {
background-color: var(--fhc-white-20);
}
.bordered-modal {
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 0.5rem;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
}
.bordered-modal .modal-body {
overflow-y: visible;
}
.p-accordion .p-accordion-header .p-accordion-header-link {
padding: 12px!important;
}
/* 1. Stick the Header */
#abgabetable .tabulator-header .tabulator-col.sticky-col {
position: sticky;
left: 0;
z-index: 10; /* Must be higher than other headers */
background-color: #fff; /* Opaque background is required */
border-right: 2px solid #ddd; /* Optional: Separator line */
}
/* 2. Stick the Data Cells */
#abgabetable .tabulator-tableholder .tabulator-row .tabulator-cell.sticky-col {
position: sticky;
left: 0;
z-index: 10; /* Ensure it floats above other cells */
background-color: #fff; /* Match your row background color */
border-right: 2px solid #ddd; /* Optional: Separator line */
}
/* 3. Fix for Hover Effects (Optional) */
/* If you use hover rows, you need to ensure the sticky cell matches the hover color */
#abgabetable .tabulator-row:hover .tabulator-cell.sticky-col {
background-color: #ccc; /* Match your existing hover color */
}

Some files were not shown because too many files have changed in this diff Show More