mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-25 08:34:29 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3e8e977eef | ||
|
|
94eb7021bb |
@@ -6,30 +6,30 @@ use CI3_Events as Events;
|
|||||||
Events::on('loadRenderers', function ($renderers) {
|
Events::on('loadRenderers', function ($renderers) {
|
||||||
$fhc_core_renderers =& $renderers();
|
$fhc_core_renderers =& $renderers();
|
||||||
$fhc_core_renderers["lehreinheit"] = array(
|
$fhc_core_renderers["lehreinheit"] = array(
|
||||||
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js'),
|
'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js',
|
||||||
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js'),
|
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js',
|
||||||
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalContent.js'),
|
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/modalContent.js',
|
||||||
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
|
'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
Events::on('loadRenderers', function ($renderers) {
|
Events::on('loadRenderers', function ($renderers) {
|
||||||
$fhc_core_renderers =& $renderers();
|
$fhc_core_renderers =& $renderers();
|
||||||
$fhc_core_renderers["reservierung"] = array(
|
$fhc_core_renderers["reservierung"] = array(
|
||||||
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js'),
|
'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js',
|
||||||
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalTitle.js'),
|
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/modalTitle.js',
|
||||||
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalContent.js'),
|
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/modalContent.js',
|
||||||
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
|
'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
Events::on('loadRenderers', function ($renderers) {
|
Events::on('loadRenderers', function ($renderers) {
|
||||||
$fhc_core_renderers =& $renderers();
|
$fhc_core_renderers =& $renderers();
|
||||||
$fhc_core_renderers["ferien"] = array(
|
$fhc_core_renderers["ferien"] = array(
|
||||||
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/calendarEvent.js'),
|
'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/calendarEvent.js',
|
||||||
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalTitle.js'),
|
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalTitle.js',
|
||||||
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalContent.js'),
|
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalContent.js',
|
||||||
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
|
'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,43 +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;
|
|
||||||
@@ -4,7 +4,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
|
|||||||
|
|
||||||
|
|
||||||
// CMS Content Id for CIS4 Menu Root
|
// 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
|
// send Mails for ProfilUpdate
|
||||||
$config['cis_send_profil_update_mails'] = true;
|
$config['cis_send_profil_update_mails'] = true;
|
||||||
// Vilesci CI BaseUrl
|
// Vilesci CI BaseUrl
|
||||||
|
|||||||
@@ -7,6 +7,3 @@ $config['use_vuejs_dev_version'] = false;
|
|||||||
$config['use_bundled_javascript'] = false;
|
$config['use_bundled_javascript'] = false;
|
||||||
// systemerror_mailto use in FHC-Alert Plugin - if empty Link will not be rendered
|
// systemerror_mailto use in FHC-Alert Plugin - if empty Link will not be rendered
|
||||||
$config['systemerror_mailto'] = '';
|
$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;
|
|
||||||
|
|||||||
@@ -65,13 +65,6 @@ $route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1';
|
|||||||
$route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1';
|
$route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1';
|
||||||
$route['Cis/MyLv/.*'] = 'Cis/MyLv/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
|
// Studierendenverwaltung List Routes
|
||||||
$route['api/frontend/v1/stv/[sS]tudents/inout'] = 'api/frontend/v1/stv/Students/index';
|
$route['api/frontend/v1/stv/[sS]tudents/inout'] = 'api/frontend/v1/stv/Students/index';
|
||||||
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/index';
|
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/index';
|
||||||
|
|||||||
@@ -14,10 +14,10 @@ class Abgabetool extends Auth_Controller
|
|||||||
{
|
{
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'index' => self::PERM_LOGGED,
|
'index' => self::PERM_LOGGED,
|
||||||
'Mitarbeiter' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
|
'getStudentProjektarbeitAbgabeFile' => self::PERM_LOGGED,
|
||||||
'Assistenz' => array('basis/abgabe_assistenz:rw'),
|
'Mitarbeiter' => self::PERM_LOGGED,
|
||||||
'Student' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
|
'Student' => self::PERM_LOGGED,
|
||||||
'Deadlines' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw')
|
'Deadlines' => self::PERM_LOGGED
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,69 +29,80 @@ class Abgabetool extends Auth_Controller
|
|||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
// TODO: routing from index based on berechtigung?
|
|
||||||
|
|
||||||
$viewData = array(
|
$viewData = array(
|
||||||
'uid'=>getAuthUID(),
|
'uid'=>getAuthUID(),
|
||||||
);
|
);
|
||||||
|
|
||||||
if(defined('CIS4') && CIS4) {
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
|
|
||||||
} else {
|
|
||||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function Student($student_uid_prop = '')
|
public function Student()
|
||||||
{
|
{
|
||||||
|
|
||||||
$viewData = array(
|
$viewData = array(
|
||||||
'uid'=>getAuthUID(),
|
'uid'=>getAuthUID(),
|
||||||
);
|
);
|
||||||
|
|
||||||
if(defined('CIS4') && CIS4) {
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
|
|
||||||
} else {
|
|
||||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function Mitarbeiter()
|
public function Mitarbeiter()
|
||||||
{
|
{
|
||||||
|
|
||||||
$viewData = array(
|
$viewData = array(
|
||||||
'uid'=>getAuthUID(),
|
'uid'=>getAuthUID(),
|
||||||
);
|
);
|
||||||
|
|
||||||
if(defined('CIS4') && CIS4) {
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
|
|
||||||
} else {
|
|
||||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function Assistenz($stg_kz_prop = '')
|
|
||||||
{
|
|
||||||
|
|
||||||
$viewData = array(
|
|
||||||
'uid'=>getAuthUID(),
|
|
||||||
);
|
|
||||||
|
|
||||||
if(defined('CIS4') && CIS4) {
|
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolAssistenz']);
|
|
||||||
} else {
|
|
||||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function Deadlines()
|
public function Deadlines()
|
||||||
{
|
{
|
||||||
|
|
||||||
$viewData = array(
|
$viewData = array(
|
||||||
'uid'=>getAuthUID(),
|
'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 {
|
} else {
|
||||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'DeadlinesOverview']);
|
$this->terminateWithJsonError('Keine Zuordnung!');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,9 +32,9 @@ class Studentenverwaltung extends Auth_Controller
|
|||||||
'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'),
|
'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'),
|
||||||
'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'),
|
'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'),
|
||||||
'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'),
|
'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'),
|
||||||
'student/editBakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array(),
|
'student/editBakkZgv' => $this->permissionlib->isBerechtigt('student/editBakkZgv'),
|
||||||
'student/editMakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array(),
|
'student/editMakkZgv' => $this->permissionlib->isBerechtigt('student/editMakkZgv'),
|
||||||
'student/editDokZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array(),
|
'student/editDokZgv' => $this->permissionlib->isBerechtigt('student/editDokZgv'),
|
||||||
'student/editBismelden' => $this->permissionlib->isBerechtigt('student/editBismelden')
|
'student/editBismelden' => $this->permissionlib->isBerechtigt('student/editBismelden')
|
||||||
],
|
],
|
||||||
'variables' => [
|
'variables' => [
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -38,9 +38,34 @@ class Lehre extends FHCAPI_Controller
|
|||||||
parent::__construct([
|
parent::__construct([
|
||||||
'lvStudentenMail' => self::PERM_LOGGED,
|
'lvStudentenMail' => self::PERM_LOGGED,
|
||||||
'LV' => 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);
|
$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()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'getStudienAllSemester'=> self::PERM_LOGGED,
|
'getAllStudienSemester'=> self::PERM_LOGGED,
|
||||||
'getStudiengaengeForStudienSemester'=> self::PERM_LOGGED,
|
'getStudiengaengeForStudienSemester'=> self::PERM_LOGGED,
|
||||||
'getStudienplaeneBySemester'=> self::PERM_LOGGED,
|
'getStudienplaeneBySemester'=> self::PERM_LOGGED,
|
||||||
'getLvEvaluierungInfo'=> self::PERM_LOGGED,
|
'getLvEvaluierungInfo'=> self::PERM_LOGGED,
|
||||||
@@ -51,7 +51,7 @@ class Studium extends FHCAPI_Controller
|
|||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
// Public methods
|
// Public methods
|
||||||
|
|
||||||
public function getStudienAllSemester(){
|
public function getAllStudienSemester(){
|
||||||
|
|
||||||
$parameter_studiensemester = $this->input->get('studiensemester',true);
|
$parameter_studiensemester = $this->input->get('studiensemester',true);
|
||||||
$parameter_studiengang = $this->input->get('studiengang',true);
|
$parameter_studiengang = $this->input->get('studiengang',true);
|
||||||
@@ -59,24 +59,26 @@ class Studium extends FHCAPI_Controller
|
|||||||
$parameter_studienplan = $this->input->get('studienplan',true);
|
$parameter_studienplan = $this->input->get('studienplan',true);
|
||||||
|
|
||||||
$aktuelles_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->getAktOrNextSemester()));
|
$aktuelles_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->getAktOrNextSemester()));
|
||||||
|
|
||||||
if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
|
if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
|
||||||
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester->studiensemester_kurzbz]);
|
$lv_result =$this->StudentlehrverbandModel->loadWhere([
|
||||||
$studentLehrverband = current($this->getDataOrTerminateWithError($studentLehrverband));
|
"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;
|
$student_studienplan = $this->getStudienPlanFromPrestudentStatus(getAuthPersonId())->studienplan_id;
|
||||||
|
|
||||||
if(!isset($parameter_studiensemester))
|
$parameter_studiensemester = $parameter_studiensemester ?? $student_studiensemester;
|
||||||
$parameter_studiensemester = $student_studiensemester;
|
$parameter_studiengang = $parameter_studiengang ?? $student_studiengang;
|
||||||
if(!isset($parameter_studiengang))
|
$parameter_semester = $parameter_semester ?? $student_semester;
|
||||||
$parameter_studiengang = $student_studiengang;
|
$parameter_studienplan = $parameter_studienplan ?? $student_studienplan;
|
||||||
if(!isset($parameter_semester))
|
|
||||||
$parameter_semester = $student_semester;
|
|
||||||
if(!isset($parameter_studienplan))
|
|
||||||
$parameter_studienplan = $student_studienplan;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isset($parameter_studiensemester)){
|
if(isset($parameter_studiensemester)){
|
||||||
|
|||||||
@@ -47,22 +47,22 @@ class Setup extends FHCAPI_Controller
|
|||||||
{
|
{
|
||||||
$tabs['details'] = array (
|
$tabs['details'] = array (
|
||||||
'title' => 'Details',
|
'title' => 'Details',
|
||||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Details.js'),
|
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Details.js',
|
||||||
'config' => []
|
'config' => []
|
||||||
);
|
);
|
||||||
$tabs['gruppen'] = array (
|
$tabs['gruppen'] = array (
|
||||||
'title' => 'Gruppen',
|
'title' => 'Gruppen',
|
||||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Gruppen.js'),
|
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Gruppen.js',
|
||||||
'config' => []
|
'config' => []
|
||||||
);
|
);
|
||||||
$tabs['lektor'] = array (
|
$tabs['lektor'] = array (
|
||||||
'title' => 'LektorInnenzuteilung',
|
'title' => 'LektorInnenzuteilung',
|
||||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'),
|
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Lektor.js',
|
||||||
'config' => []
|
'config' => []
|
||||||
);
|
);
|
||||||
$tabs['notiz'] = array (
|
$tabs['notiz'] = array (
|
||||||
'title' => 'Notizen',
|
'title' => 'Notizen',
|
||||||
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'),
|
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Notiz.js',
|
||||||
'config' => []
|
'config' => []
|
||||||
);
|
);
|
||||||
$this->terminateWithSuccess($tabs);
|
$this->terminateWithSuccess($tabs);
|
||||||
|
|||||||
@@ -25,8 +25,7 @@ class Studiensemester extends FHCAPI_Controller
|
|||||||
array(
|
array(
|
||||||
'getAll' => self::PERM_LOGGED,
|
'getAll' => self::PERM_LOGGED,
|
||||||
'getAktNext' => self::PERM_LOGGED,
|
'getAktNext' => self::PERM_LOGGED,
|
||||||
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
|
'getStudienjahrByStudiensemester' => self::PERM_LOGGED
|
||||||
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED
|
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
// Load model StudiensemesterModel
|
// Load model StudiensemesterModel
|
||||||
@@ -153,17 +152,4 @@ class Studiensemester extends FHCAPI_Controller
|
|||||||
|
|
||||||
$this->terminateWithSuccess((getData(success($studienjahrObj))));
|
$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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -504,7 +504,7 @@ class Config extends FHCAPI_Controller
|
|||||||
{
|
{
|
||||||
$result['combinePeople'] = [
|
$result['combinePeople'] = [
|
||||||
'title' => $this->p->t('stv', 'tab_combine_people'),
|
'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']
|
'config' => $config['combinePeople']
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ class Konto extends FHCAPI_Controller
|
|||||||
$data[$field] = $this->input->post($field);
|
$data[$field] = $this->input->post($field);
|
||||||
|
|
||||||
if (defined('FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE') && isset(unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']])) {
|
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 = [];
|
$result = [];
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ class Prestudent extends FHCAPI_Controller
|
|||||||
|
|
||||||
// Load language phrases
|
// Load language phrases
|
||||||
$this->loadPhrases([
|
$this->loadPhrases([
|
||||||
'ui', 'studierendenantrag', 'lehre', 'global'
|
'ui', 'studierendenantrag', 'lehre'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,9 +98,11 @@ class Prestudent extends FHCAPI_Controller
|
|||||||
'person_id',
|
'person_id',
|
||||||
'berufstaetigkeit_code',
|
'berufstaetigkeit_code',
|
||||||
'ausbildungcode',
|
'ausbildungcode',
|
||||||
|
'zgv_code',
|
||||||
'zgvort',
|
'zgvort',
|
||||||
'zgvdatum',
|
'zgvdatum',
|
||||||
'zgvnation',
|
'zgvnation',
|
||||||
|
'zgvmas_code',
|
||||||
'zgvmaort',
|
'zgvmaort',
|
||||||
'zgvmadatum',
|
'zgvmadatum',
|
||||||
'zgvmanation',
|
'zgvmanation',
|
||||||
@@ -108,6 +110,7 @@ class Prestudent extends FHCAPI_Controller
|
|||||||
'bismelden',
|
'bismelden',
|
||||||
'anmerkung',
|
'anmerkung',
|
||||||
'dual',
|
'dual',
|
||||||
|
'zgvdoktor_code',
|
||||||
'zgvdoktorort',
|
'zgvdoktorort',
|
||||||
'zgvdoktordatum',
|
'zgvdoktordatum',
|
||||||
'zgvdoktornation',
|
'zgvdoktornation',
|
||||||
@@ -122,57 +125,6 @@ class Prestudent extends FHCAPI_Controller
|
|||||||
'standort_code'
|
'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
|
// add UDFs
|
||||||
$result = $this->udflib->getDefinitionForModel($this->PrestudentModel);
|
$result = $this->udflib->getDefinitionForModel($this->PrestudentModel);
|
||||||
|
|
||||||
|
|||||||
@@ -636,7 +636,7 @@ class Status extends FHCAPI_Controller
|
|||||||
|
|
||||||
$this->load->library('PrestudentLib');
|
$this->load->library('PrestudentLib');
|
||||||
|
|
||||||
$resFirstStudent = $this->prestudentlib->setFirstStudent(
|
$this->prestudentlib->setFirstStudent(
|
||||||
$prestudent_id,
|
$prestudent_id,
|
||||||
$lastAufgenommener->studiensemester_kurzbz,
|
$lastAufgenommener->studiensemester_kurzbz,
|
||||||
$lastAufgenommener->ausbildungssemester,
|
$lastAufgenommener->ausbildungssemester,
|
||||||
@@ -645,8 +645,9 @@ class Status extends FHCAPI_Controller
|
|||||||
$this->input->post('statusgrund_id')
|
$this->input->post('statusgrund_id')
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->db->trans_complete();
|
$this->getDataOrTerminateWithError($result);
|
||||||
$this->getDataOrTerminateWithError($resFirstStudent);
|
|
||||||
|
$this->db->trans_commit();
|
||||||
|
|
||||||
return $this->outputJsonSuccess(true);
|
return $this->outputJsonSuccess(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,9 +136,14 @@ class Student extends FHCAPI_Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
$this->PrestudentModel->addSelect(
|
$this->PrestudentModel->addSelect(
|
||||||
"public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
|
"(
|
||||||
. $this->PrestudentModel->escape($studiensemester_kurzbz)
|
SELECT status_kurzbz
|
||||||
. ") AS statusofsemester"
|
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');
|
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
|
||||||
|
|||||||
@@ -801,9 +801,14 @@ class Students extends FHCAPI_Controller
|
|||||||
|
|
||||||
//add status per semester
|
//add status per semester
|
||||||
$this->PrestudentModel->addSelect(
|
$this->PrestudentModel->addSelect(
|
||||||
"public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
|
"(
|
||||||
. $this->PrestudentModel->escape($studiensemester_kurzbz)
|
SELECT status_kurzbz
|
||||||
. ") AS statusofsemester"
|
FROM public.tbl_prestudentstatus pss
|
||||||
|
WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
|
||||||
|
AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
|
||||||
|
ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
|
||||||
|
LIMIT 1
|
||||||
|
) AS statusofsemester"
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->addSelectPrioRel();
|
$this->addSelectPrioRel();
|
||||||
@@ -892,9 +897,14 @@ class Students extends FHCAPI_Controller
|
|||||||
|
|
||||||
//add status per semester
|
//add status per semester
|
||||||
$this->PrestudentModel->addSelect(
|
$this->PrestudentModel->addSelect(
|
||||||
"public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
|
"(
|
||||||
. $this->PrestudentModel->escape($studiensemester_kurzbz)
|
SELECT status_kurzbz
|
||||||
. ") AS statusofsemester"
|
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');
|
$this->PrestudentModel->addSelect('UPPER(stg.typ || stg.kurzbz) AS studiengang');
|
||||||
|
|||||||
@@ -76,7 +76,9 @@ class Vertrag extends FHCAPI_Controller
|
|||||||
|
|
||||||
if (isError($allOe)) $this->terminateWithError(getError($allOe), self::ERROR_TYPE_GENERAL);
|
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
|
// * then check if the user has permissions to cancel the corresponding lv-organisational units
|
||||||
if (!$this->permissionlib->isBerechtigtMultipleOe('admin', $allOe, 'suid') &&
|
if (!$this->permissionlib->isBerechtigtMultipleOe('admin', $allOe, 'suid') &&
|
||||||
|
|||||||
@@ -33,26 +33,19 @@ class Widget extends Auth_Controller
|
|||||||
return $this->outputJsonSuccess([
|
return $this->outputJsonSuccess([
|
||||||
"widget_id" => 0,
|
"widget_id" => 0,
|
||||||
"widget_kurzbz" => "notfound",
|
"widget_kurzbz" => "notfound",
|
||||||
"arguments" => [
|
"arguments" => json_encode([
|
||||||
"className" => 'alert-danger',
|
"className" => 'alert-danger',
|
||||||
"title" => 'Widget Not Found',
|
"title" => 'Widget Not Found',
|
||||||
"msg" => 'The widget with the id ' . $widget_id . ' could not be found'
|
"msg" => 'The widget with the id ' . $widget_id . ' could not be found'
|
||||||
],
|
]),
|
||||||
"setup" => [
|
"setup" => json_encode([
|
||||||
"name" => 'Widget Not Found',
|
"name" => 'Widget Not Found',
|
||||||
"file" => absoluteJsImportUrl('public/js/components/DashboardWidget/Default.js'),
|
"file" => 'DashboardWidget/Default.js',
|
||||||
"width" => 1,
|
"width" => 1,
|
||||||
"height" => 1
|
"height" => 1
|
||||||
]
|
])
|
||||||
]);
|
]);
|
||||||
|
return $this->outputJsonSuccess(current(getData($widget)));
|
||||||
$widget = current(getData($widget));
|
|
||||||
$widget->arguments = json_decode($widget->arguments);
|
|
||||||
$tmpsetup = json_decode($widget->setup);
|
|
||||||
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
|
||||||
$widget->setup = $tmpsetup;
|
|
||||||
|
|
||||||
return $this->outputJsonSuccess($widget);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getAll()
|
public function getAll()
|
||||||
@@ -63,16 +56,7 @@ class Widget extends Auth_Controller
|
|||||||
if (isError($result))
|
if (isError($result))
|
||||||
return $this->outputJsonError(getError($result));
|
return $this->outputJsonError(getError($result));
|
||||||
|
|
||||||
$tmpwidgets = getData($result) ?: [];
|
$this->outputJsonSuccess(getData($result) ?: []);
|
||||||
$widgets = array_map(function($widget) {
|
|
||||||
$widget->arguments = json_decode($widget->arguments);
|
|
||||||
$tmpsetup = json_decode($widget->setup);
|
|
||||||
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
|
||||||
$widget->setup = $tmpsetup;
|
|
||||||
return $widget;
|
|
||||||
}, $tmpwidgets);
|
|
||||||
|
|
||||||
$this->outputJsonSuccess($widgets);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWidgetsForDashboard()
|
public function getWidgetsForDashboard()
|
||||||
@@ -87,16 +71,7 @@ class Widget extends Auth_Controller
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$tmpwidgets = getData($result) ?: [];
|
$this->outputJsonSuccess(getData($result) ?: []);
|
||||||
$widgets = array_map(function($widget) {
|
|
||||||
$widget->arguments = json_decode($widget->arguments);
|
|
||||||
$tmpsetup = json_decode($widget->setup);
|
|
||||||
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
|
||||||
$widget->setup = $tmpsetup;
|
|
||||||
return $widget;
|
|
||||||
}, $tmpwidgets);
|
|
||||||
|
|
||||||
$this->outputJsonSuccess($widgets);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setAllowed()
|
public function setAllowed()
|
||||||
|
|||||||
@@ -1,621 +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->config('abgabe');
|
|
||||||
$this->loadPhrases([
|
|
||||||
'abgabetool'
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function notifyAssistenzAboutChangedAbgaben() {
|
|
||||||
|
|
||||||
$this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutChangedAbgaben');
|
|
||||||
|
|
||||||
$interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
|
|
||||||
$relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ');
|
|
||||||
// get all new or changed termine in interval
|
|
||||||
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes);
|
|
||||||
|
|
||||||
$retval = getData($result);
|
|
||||||
|
|
||||||
if(count($retval) == 0) {
|
|
||||||
$this->_ci->logInfo("Keine Emails an Assistenzen über neue oder veränderte Termine versandt");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// group changed/new abgaben for projektarbeiten
|
|
||||||
$projektarbeiten = [];
|
|
||||||
foreach($retval as $newOrChangedAbgabe) {
|
|
||||||
// Check if the current item has a 'projektarbeit_id' field.
|
|
||||||
// Replace 'projektarbeit_id' with the actual key name if it's different.
|
|
||||||
if (isset($newOrChangedAbgabe->projektarbeit_id)) {
|
|
||||||
$projektarbeitId = $newOrChangedAbgabe->projektarbeit_id;
|
|
||||||
|
|
||||||
// If the 'projektarbeit_id' is not yet a key in $projektarbeiten,
|
|
||||||
// initialize it as an empty array.
|
|
||||||
if (!isset($projektarbeiten[$projektarbeitId])) {
|
|
||||||
$projektarbeiten[$projektarbeitId] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the current row to the array associated with its 'projektarbeit_id'.
|
|
||||||
$projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// for each projektarbeit fetch their assistenz and same them in their own dictionary to avoid too many mails
|
|
||||||
$assistenzMap = [];
|
|
||||||
// for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails
|
|
||||||
$projektarbeitBetreuerMap = [];
|
|
||||||
forEach($projektarbeiten as $projektarbeit_id => $abgaben) {
|
|
||||||
|
|
||||||
$assistenzResult = $this->_ci->OrganisationseinheitModel->getAssistenzForOE($abgaben[0]->stg_oe_kurzbz);
|
|
||||||
|
|
||||||
forEach($assistenzResult->retval as $assistenzRow) {
|
|
||||||
if (!isset($assistenzMap[$assistenzRow->person_id])) {
|
|
||||||
$assistenzMap[$assistenzRow->person_id] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the current $assistenzRow to the $assistenzMap as an array associated with its projektarbeit_id.
|
|
||||||
$assistenzMap[$assistenzRow->person_id][] = [$projektarbeit_id, $assistenzRow];
|
|
||||||
}
|
|
||||||
|
|
||||||
$betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id);
|
|
||||||
|
|
||||||
forEach($betreuerResult->retval as $betreuerRow) {
|
|
||||||
if (!isset($projektarbeitBetreuerMap[$projektarbeit_id])) {
|
|
||||||
$projektarbeitBetreuerMap[$projektarbeit_id] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id.
|
|
||||||
$projektarbeitBetreuerMap[$projektarbeit_id][] = $betreuerRow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$count = 0;
|
|
||||||
foreach($assistenzMap as $assistenz_person_id => $tupelArr) {
|
|
||||||
|
|
||||||
$abgabenString = '<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(count($retval) == 0) {
|
|
||||||
$this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// group changed/new abgaben for projektarbeiten
|
|
||||||
$projektarbeiten = [];
|
|
||||||
foreach($retval as $newOrChangedAbgabe) {
|
|
||||||
// Check if the current item has a 'projektarbeit_id' field.
|
|
||||||
// Replace 'projektarbeit_id' with the actual key name if it's different.
|
|
||||||
if (isset($newOrChangedAbgabe->projektarbeit_id)) {
|
|
||||||
$projektarbeitId = $newOrChangedAbgabe->projektarbeit_id;
|
|
||||||
|
|
||||||
// If the 'projektarbeit_id' is not yet a key in $projektarbeiten,
|
|
||||||
// initialize it as an empty array.
|
|
||||||
if (!isset($projektarbeiten[$projektarbeitId])) {
|
|
||||||
$projektarbeiten[$projektarbeitId] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the current row to the array associated with its 'projektarbeit_id'.
|
|
||||||
$projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails
|
|
||||||
$betreuerMap = [];
|
|
||||||
forEach($projektarbeiten as $projektarbeit_id => $abgaben) {
|
|
||||||
$betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id);
|
|
||||||
|
|
||||||
forEach($betreuerResult->retval as $betreuerRow) {
|
|
||||||
if (!isset($betreuerMap[$betreuerRow->person_id])) {
|
|
||||||
$betreuerMap[$betreuerRow->person_id] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id.
|
|
||||||
$betreuerMap[$betreuerRow->person_id][] = [$projektarbeit_id, $betreuerRow];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$count = 0;
|
|
||||||
// now iterate over the betreuerMap and build 1 email about all projektarbeiten and their new/changed termine
|
|
||||||
// $tupel = [$projektarbeit_id, $betreuerRow], each betreuer has 0..n [projektarbeit_id, changedAbgaben] tupel
|
|
||||||
forEach($betreuerMap as $betreuer_person_id => $tupelArr) {
|
|
||||||
|
|
||||||
// start the container
|
|
||||||
$abgabenString = '<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;
|
|
||||||
|
|
||||||
forEach($tupelArr as $tupel) {
|
|
||||||
$projektarbeit_id = $tupel[0];
|
|
||||||
$betreuerRow = $tupel[1];
|
|
||||||
|
|
||||||
$changedAbgaben = $projektarbeiten[$projektarbeit_id];
|
|
||||||
|
|
||||||
$relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($betreuerRow) {
|
|
||||||
if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $betreuerRow->uid) {
|
|
||||||
return $abgabetermin;
|
|
||||||
} else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $betreuerRow->uid) {
|
|
||||||
return $abgabetermin;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
if(count($relevantAbgaben) == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// format the Student Name
|
|
||||||
$s = $relevantAbgaben[0];
|
|
||||||
$nameParts = [];
|
|
||||||
if (!empty($s->titelpre)) $nameParts[] = $s->titelpre;
|
|
||||||
$nameParts[] = $s->vorname;
|
|
||||||
$nameParts[] = $s->nachname;
|
|
||||||
if (!empty($s->titelpost)) $nameParts[] = $s->titelpost;
|
|
||||||
$studentFullName = implode(' ', $nameParts);
|
|
||||||
|
|
||||||
$projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben';
|
|
||||||
|
|
||||||
// project header section
|
|
||||||
$abgabenString .= "
|
|
||||||
<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];
|
|
||||||
|
|
||||||
$path = $this->_ci->config->item('URL_MITARBEITER');
|
|
||||||
$url = CIS_ROOT.$path;
|
|
||||||
|
|
||||||
$body_fields = array(
|
|
||||||
'anrede' => $anrede,
|
|
||||||
'anredeFillString' => $anredeFillString,
|
|
||||||
'fullFormattedNameString' => $fullFormattedNameString,
|
|
||||||
'abgabenString' => $abgabenString,
|
|
||||||
'linkAbgabetool' => $url
|
|
||||||
);
|
|
||||||
|
|
||||||
$email = $betreuerRow->uid ? $betreuerRow->uid."@".DOMAIN : $betreuerRow->private_email;
|
|
||||||
|
|
||||||
// send email with bundled info
|
|
||||||
sendSanchoMail(
|
|
||||||
'PAAChangesBetSM',
|
|
||||||
$body_fields,
|
|
||||||
$email,
|
|
||||||
$this->p->t('abgabetool', 'changedAbgabeterminev2')
|
|
||||||
);
|
|
||||||
|
|
||||||
$count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->_ci->logInfo($count . " Emails erfolgreich versandt");
|
|
||||||
$this->_ci->logInfo('End job FHC-Core->notifyBetreuerAboutChangedAbgaben');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function notifyBetreuerMail() {
|
|
||||||
// send all new projektarbeit abgabe UPLOADS since the last job run to the related betreuer
|
|
||||||
// this job gathers all new or changed file uploads via field 'abgabedatum', enduploads still
|
|
||||||
// send an email directly after happening since they are kind of important
|
|
||||||
|
|
||||||
$this->_ci->logInfo('Start job FHC-Core->notifyBetreuerMail');
|
|
||||||
|
|
||||||
// dont filter for relevant types since this mail should gather all UPLOAD info
|
|
||||||
|
|
||||||
$interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
|
|
||||||
|
|
||||||
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval);
|
|
||||||
$retval = getData($result);
|
|
||||||
|
|
||||||
// retval are paabgaben joined with projektarbeit and betreuer
|
|
||||||
if(count($retval) == 0) {
|
|
||||||
$this->logInfo("Keine Emails über neue Paabgaben an Betreuer versandt");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// group contents per betreuer person_id
|
|
||||||
$betreuer_uids = [];
|
|
||||||
forEach($retval as $paabgabe) {
|
|
||||||
if(!isset($betreuer_uids[$paabgabe->person_id])) {
|
|
||||||
$betreuer_uids[$paabgabe->person_id] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
$betreuer_uids[$paabgabe->person_id][] = $paabgabe;
|
|
||||||
}
|
|
||||||
|
|
||||||
$count = 0;
|
|
||||||
forEach ($betreuer_uids as $person_id => $abgaben) {
|
|
||||||
// $person_id is from betreuer
|
|
||||||
|
|
||||||
$result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($person_id);
|
|
||||||
$data = getData($result)[0];
|
|
||||||
|
|
||||||
$anrede = $data->anrede;
|
|
||||||
$anredeFillString = $data->anrede == "Herr" ? "r" : "";
|
|
||||||
$fullFormattedNameString = $data->first;
|
|
||||||
|
|
||||||
// sorting $abgaben array by datum
|
|
||||||
usort($abgaben, function ($a, $b) {
|
|
||||||
return strtotime($a->datum) <=> strtotime($b->datum);
|
|
||||||
});
|
|
||||||
|
|
||||||
$projektarbeit_titel = $abgaben[0]->titel;
|
|
||||||
|
|
||||||
// initialize the table and headers
|
|
||||||
$abgabenString = '
|
|
||||||
<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;
|
|
||||||
|
|
||||||
// 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');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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)
|
'required_permissions' => $this->_rpsToString($requiredPermissions, $this->router->method)
|
||||||
], self::ERROR_TYPE_AUTH);
|
], 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');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -185,15 +185,7 @@ function generateJSModulesInclude($JSModules)
|
|||||||
|
|
||||||
for ($tmpJSsCounter = 0; $tmpJSsCounter < count($tmpJSs); $tmpJSsCounter++)
|
for ($tmpJSsCounter = 0; $tmpJSsCounter < count($tmpJSs); $tmpJSsCounter++)
|
||||||
{
|
{
|
||||||
if($ci->config->item('use_fhcomplete_build_version_in_path'))
|
$toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL;
|
||||||
{
|
|
||||||
$relurl = preg_replace('#public/#', 'public/' . $ci->config->item('fhcomplete_build_version') . '/', $tmpJSs[$tmpJSsCounter]);
|
|
||||||
$toPrint = sprintf($jsInclude, base_url($relurl)).PHP_EOL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($tmpJSsCounter > 0) $toPrint = "\t\t".$toPrint;
|
if ($tmpJSsCounter > 0) $toPrint = "\t\t".$toPrint;
|
||||||
|
|
||||||
@@ -258,14 +250,6 @@ function generateSkipLink($skipID)
|
|||||||
function absoluteJsImportUrl($relurl)
|
function absoluteJsImportUrl($relurl)
|
||||||
{
|
{
|
||||||
$ci =& get_instance();
|
$ci =& get_instance();
|
||||||
$ci->load->config('javascript');
|
$url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version');
|
||||||
if($ci->config->item('use_fhcomplete_build_version_in_path'))
|
|
||||||
{
|
|
||||||
$url = base_url(preg_replace('#^public/#', 'public/' . $ci->config->item('fhcomplete_build_version') . '/', $relurl));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version');
|
|
||||||
}
|
|
||||||
return $url;
|
return $url;
|
||||||
}
|
}
|
||||||
@@ -723,7 +723,7 @@ class PrestudentLib
|
|||||||
|
|
||||||
|
|
||||||
// Generate Alias
|
// Generate Alias
|
||||||
$alias = null;
|
$alias = '';
|
||||||
if (!defined('GENERATE_ALIAS_STUDENT')
|
if (!defined('GENERATE_ALIAS_STUDENT')
|
||||||
|| GENERATE_ALIAS_STUDENT === true
|
|| GENERATE_ALIAS_STUDENT === true
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -279,12 +279,4 @@ class Student_model extends DB_Model
|
|||||||
{
|
{
|
||||||
return $student_uid . '@' . DOMAIN;
|
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->dbTable = 'lehre.tbl_note';
|
||||||
$this->pk = 'note';
|
$this->pk = 'note';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getAllActive() {
|
|
||||||
$qry ="SELECT *
|
|
||||||
FROM lehre.tbl_note
|
|
||||||
WHERE aktiv = true";
|
|
||||||
|
|
||||||
return $this->execReadOnlyQuery($qry);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -60,58 +60,5 @@ class Paabgabe_model extends DB_Model
|
|||||||
|
|
||||||
return $this->execReadOnlyQuery($qry, array($person_id));
|
return $this->execReadOnlyQuery($qry, array($person_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function findAbgabenNewOrUpdatedSince($interval, $relevantTypes)
|
|
||||||
{
|
|
||||||
|
|
||||||
$query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, campus.tbl_paabgabe.kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum,
|
|
||||||
campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum,
|
|
||||||
campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel,
|
|
||||||
UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz,
|
|
||||||
public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz,
|
|
||||||
public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
|
|
||||||
FROM campus.tbl_paabgabe
|
|
||||||
JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz)
|
|
||||||
JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
|
|
||||||
JOIN lehre.tbl_lehreinheit using(lehreinheit_id)
|
|
||||||
JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id)
|
|
||||||
JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz)
|
|
||||||
JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
|
|
||||||
JOIN public.tbl_person USING (person_id)
|
|
||||||
|
|
||||||
WHERE (campus.tbl_paabgabe.insertamum >= NOW() - INTERVAL ?
|
|
||||||
OR campus.tbl_paabgabe.updateamum >= NOW() - INTERVAL ?)
|
|
||||||
AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
|
|
||||||
|
|
||||||
return $this->execQuery($query, [$interval, $interval, $relevantTypes]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function findAbgabenNewOrUpdatedSinceByAbgabedatum($interval) {
|
|
||||||
|
|
||||||
$query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum,
|
|
||||||
campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum,
|
|
||||||
campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel,
|
|
||||||
lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id,
|
|
||||||
public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
|
|
||||||
|
|
||||||
FROM campus.tbl_paabgabe
|
|
||||||
JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz)
|
|
||||||
JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
|
|
||||||
JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
|
|
||||||
JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
|
|
||||||
JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
|
|
||||||
|
|
||||||
WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL
|
|
||||||
AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ?
|
|
||||||
ORDER BY abgabedatum DESC
|
|
||||||
";
|
|
||||||
|
|
||||||
return $this->execQuery($query, [$interval]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function loadByIDs($paabgabe_ids) {
|
|
||||||
$qry = "SELECT * FROM campus.tbl_paabgabe WHERE paabgabe_id IN ?";
|
|
||||||
|
|
||||||
return $this->execReadOnlyQuery($qry, [$paabgabe_ids]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,10 +11,4 @@ class Paabgabetyp_model extends DB_Model
|
|||||||
$this->dbTable = 'campus.tbl_paabgabetyp';
|
$this->dbTable = 'campus.tbl_paabgabetyp';
|
||||||
$this->pk = 'paabgabetyp_kurzbz';
|
$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)
|
public function getStudentProjektarbeitenWithBetreuer($studentUID)
|
||||||
{
|
{
|
||||||
$betreuerQuery = "SELECT * FROM (SELECT DISTINCT ON(projektarbeit_id)
|
$betreuerQuery = "
|
||||||
|
SELECT
|
||||||
vorname as bvorname,
|
vorname as bvorname,
|
||||||
nachname as bnachname,
|
nachname as bnachname,
|
||||||
titelpre as btitelpre,
|
titelpre as btitelpre,
|
||||||
titelpost AS btitelpost,
|
titelpost AS btitelpost,
|
||||||
|
titelpost AS btitelpost,
|
||||||
tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
|
tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
|
||||||
|
|
||||||
(SELECT person_id
|
(SELECT person_id
|
||||||
FROM lehre.tbl_projektbetreuer
|
FROM lehre.tbl_projektbetreuer
|
||||||
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
|
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
|
||||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id,
|
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id,
|
||||||
(SELECT betreuerart_kurzbz
|
(SELECT betreuerart_kurzbz
|
||||||
FROM lehre.tbl_projektbetreuer
|
FROM lehre.tbl_projektbetreuer
|
||||||
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
|
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
|
||||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz,
|
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz,
|
||||||
(SELECT tbl_betreuerart.beschreibung
|
(SELECT tbl_betreuerart.beschreibung
|
||||||
FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
|
FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
|
||||||
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
|
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,
|
tbl_betreuerart.betreuerart_kurzbz,
|
||||||
person_id as bperson_id,
|
person_id as bperson_id,
|
||||||
projektarbeit_id,
|
projektarbeit_id,
|
||||||
lehre.tbl_projekttyp.bezeichnung as projekttypbezeichnung,
|
lehre.tbl_projekttyp.bezeichnung as projekttypbezeichnung,
|
||||||
lehre.tbl_projekttyp.projekttyp_kurzbz as projekttypkurzbz,
|
|
||||||
lehre.tbl_lehreinheit.studiensemester_kurzbz,
|
lehre.tbl_lehreinheit.studiensemester_kurzbz,
|
||||||
lehre.tbl_lehrveranstaltung.studiengang_kz,
|
lehre.tbl_lehrveranstaltung.studiengang_kz,
|
||||||
public.tbl_studiengang.kurzbzlang,
|
public.tbl_studiengang.kurzbzlang,
|
||||||
lehre.tbl_projektarbeit.note as note,
|
lehre.tbl_projektbetreuer.note as note,
|
||||||
lehre.tbl_note.bezeichnung as note_bezeichnung,
|
|
||||||
public.tbl_mitarbeiter.mitarbeiter_uid,
|
public.tbl_mitarbeiter.mitarbeiter_uid,
|
||||||
lehre.tbl_projektarbeit.titel as titel,
|
lehre.tbl_projektarbeit.titel as titel,
|
||||||
lehre.tbl_projektarbeit.sprache as sprache,
|
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 as schlagwoerter,
|
||||||
lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
|
lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
|
||||||
lehre.tbl_projektarbeit.abstract as abstract,
|
lehre.tbl_projektarbeit.abstract as abstract,
|
||||||
lehre.tbl_projektarbeit.abstract_en as abstract_en,
|
lehre.tbl_projektarbeit.abstract_en as abstract_en,
|
||||||
lehre.tbl_projektarbeit.insertamum as insertamum,
|
(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
|
(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
|
FROM lehre.tbl_projektarbeit
|
||||||
@@ -157,17 +158,15 @@ class Projektarbeit_model extends DB_Model
|
|||||||
LEFT JOIN public.tbl_benutzer USING(person_id)
|
LEFT JOIN public.tbl_benutzer USING(person_id)
|
||||||
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
||||||
LEFT JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
|
LEFT JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
|
||||||
LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||||
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_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_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid)
|
||||||
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
LEFT JOIN lehre.tbl_note ON(lehre.tbl_projektarbeit.note = lehre.tbl_note.note)
|
WHERE
|
||||||
WHERE
|
tbl_projektarbeit.student_uid = ? AND
|
||||||
tbl_projektarbeit.student_uid = ? AND mitarbeiter_uid IS NOT NULL AND
|
|
||||||
(projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom')
|
(projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom')
|
||||||
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')) as base
|
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')";
|
||||||
ORDER BY insertamum DESC";
|
|
||||||
|
|
||||||
return $this->execReadOnlyQuery($betreuerQuery, array($studentUID));
|
return $this->execReadOnlyQuery($betreuerQuery, array($studentUID));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,12 +179,8 @@ class Projektarbeit_model extends DB_Model
|
|||||||
campus.tbl_paabgabe.fixtermin,
|
campus.tbl_paabgabe.fixtermin,
|
||||||
campus.tbl_paabgabe.kurzbz,
|
campus.tbl_paabgabe.kurzbz,
|
||||||
campus.tbl_paabgabe.datum,
|
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.paabgabetyp_kurzbz,
|
||||||
campus.tbl_paabgabetyp.bezeichnung,
|
campus.tbl_paabgabetyp.bezeichnung,
|
||||||
campus.tbl_paabgabetyp.benotbar,
|
|
||||||
campus.tbl_paabgabe.abgabedatum,
|
campus.tbl_paabgabe.abgabedatum,
|
||||||
campus.tbl_paabgabe.insertvon
|
campus.tbl_paabgabe.insertvon
|
||||||
FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz)
|
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));
|
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) {
|
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
|
$qry_betr="SELECT distinct trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first,
|
||||||
FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id)
|
public.tbl_mitarbeiter.mitarbeiter_uid, anrede
|
||||||
WHERE public.tbl_person.person_id= ?";
|
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]);
|
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) {
|
public function getProjektarbeitBenutzer($uid) {
|
||||||
@@ -299,9 +234,9 @@ class Projektarbeit_model extends DB_Model
|
|||||||
*
|
*
|
||||||
FROM
|
FROM
|
||||||
(SELECT tbl_person.vorname, tbl_person.nachname, tbl_studiengang.typ, tbl_studiengang.kurzbz,
|
(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_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id,
|
||||||
tbl_projektbetreuer.person_id as betreuer_person_id, tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
|
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_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz
|
||||||
FROM lehre.tbl_projektarbeit
|
FROM lehre.tbl_projektarbeit
|
||||||
LEFT JOIN lehre.tbl_projektbetreuer using(projektarbeit_id)
|
LEFT JOIN lehre.tbl_projektbetreuer using(projektarbeit_id)
|
||||||
LEFT JOIN lehre.tbl_betreuerart using(betreuerart_kurzbz)
|
LEFT JOIN lehre.tbl_betreuerart using(betreuerart_kurzbz)
|
||||||
@@ -338,134 +273,7 @@ class Projektarbeit_model extends DB_Model
|
|||||||
|
|
||||||
return $this->execReadOnlyQuery($qry, array($projektarbeit_id));
|
return $this->execReadOnlyQuery($qry, array($projektarbeit_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function getProjektarbeitenForStudiengang($studiengang_kz, $benotet) {
|
|
||||||
$new_qry = "SELECT DISTINCT ON(tmp.projektarbeit_id) *, campus.get_betreuer_details(tmp.zweitbetreuer_person_id) as zweitbetreuer_full_name, campus.get_betreuer_details(tmp.betreuer_person_id) as erstbetreuer_full_name
|
|
||||||
FROM(
|
|
||||||
SELECT
|
|
||||||
DISTINCT ON(tbl_projektarbeit.projektarbeit_id)
|
|
||||||
tbl_projektarbeit.projekttyp_kurzbz,
|
|
||||||
tbl_projektarbeit.titel,
|
|
||||||
tbl_projektarbeit.projektarbeit_id,
|
|
||||||
tbl_studiengang.typ, tbl_studiengang.kurzbz,
|
|
||||||
student_benutzer.uid as student_uid,
|
|
||||||
student_person.vorname as student_vorname,
|
|
||||||
student_person.nachname as student_nachname,
|
|
||||||
tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz,
|
|
||||||
betreuer_benutzer.uid as betreuer_benutzer_uid,
|
|
||||||
betreuer_person.vorname as betreuer_vorname,
|
|
||||||
betreuer_person.nachname as betreuer_nachname,
|
|
||||||
lehre.tbl_projektbetreuer.betreuerart_kurzbz as betreuerart,
|
|
||||||
lehre.tbl_projektbetreuer.person_id as betreuer_person_id,
|
|
||||||
lehre.tbl_projektarbeit.sprache as sprache,
|
|
||||||
lehre.tbl_projektarbeit.seitenanzahl as seitenanzahl,
|
|
||||||
lehre.tbl_projektarbeit.kontrollschlagwoerter as kontrollschlagwoerter,
|
|
||||||
lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter,
|
|
||||||
lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
|
|
||||||
lehre.tbl_projektarbeit.abstract as abstract,
|
|
||||||
lehre.tbl_projektarbeit.abstract_en as abstract_en,
|
|
||||||
lehre.tbl_projektarbeit.insertamum as insertamum,
|
|
||||||
lehre.tbl_projektarbeit.note as note,
|
|
||||||
(
|
|
||||||
SELECT orgform_kurzbz
|
|
||||||
FROM tbl_prestudentstatus
|
|
||||||
WHERE prestudent_id = (SELECT prestudent_id
|
|
||||||
FROM tbl_student
|
|
||||||
WHERE student_uid = student_benutzer.uid
|
|
||||||
LIMIT 1)
|
|
||||||
ORDER BY datum DESC, insertamum DESC, ext_id DESC
|
|
||||||
LIMIT 1
|
|
||||||
)
|
|
||||||
as organisationsform,
|
|
||||||
(
|
|
||||||
SELECT person_id
|
|
||||||
FROM lehre.tbl_projektbetreuer
|
|
||||||
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
|
|
||||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
|
|
||||||
LIMIT 1
|
|
||||||
)
|
|
||||||
AS zweitbetreuer_person_id,
|
|
||||||
(
|
|
||||||
SELECT betreuerart_kurzbz
|
|
||||||
FROM lehre.tbl_projektbetreuer
|
|
||||||
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
|
|
||||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
|
|
||||||
LIMIT 1
|
|
||||||
)
|
|
||||||
AS zweitbetreuer_betreuerart_kurzbz,
|
|
||||||
(
|
|
||||||
SELECT tbl_betreuerart.beschreibung
|
|
||||||
FROM lehre.tbl_projektbetreuer
|
|
||||||
JOIN lehre.tbl_betreuerart USING (betreuerart_kurzbz)
|
|
||||||
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
|
|
||||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
|
|
||||||
LIMIT 1
|
|
||||||
)
|
|
||||||
AS zweitbetreuer_betreuerart_beschreibung,
|
|
||||||
(
|
|
||||||
SELECT trim(COALESCE(titelpre, '') || ' ' || COALESCE(vorname, '') || ' ' || COALESCE(nachname, '') || ' ' ||
|
|
||||||
COALESCE(titelpost, ''))
|
|
||||||
FROM public.tbl_person
|
|
||||||
JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id)
|
|
||||||
LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
|
|
||||||
LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid)
|
|
||||||
WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
|
|
||||||
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
|
|
||||||
LIMIT 1
|
|
||||||
)
|
|
||||||
as zweitbetreuer_full_name,
|
|
||||||
(
|
|
||||||
SELECT
|
|
||||||
COALESCE(tbl_studienplan.orgform_kurzbz,
|
|
||||||
tbl_prestudentstatus.orgform_kurzbz, tbl_studiengang.orgform_kurzbz) as
|
|
||||||
orgform
|
|
||||||
FROM
|
|
||||||
public.tbl_prestudent
|
|
||||||
JOIN public.tbl_prestudentstatus USING(prestudent_id)
|
|
||||||
JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
|
|
||||||
JOIN public.tbl_studiengang USING(studiengang_kz)
|
|
||||||
LEFT JOIN lehre.tbl_studienplan USING(studienplan_id)
|
|
||||||
WHERE
|
|
||||||
prestudent_id=tbl_student.prestudent_id
|
|
||||||
ORDER BY tbl_prestudentstatus.datum DESC LIMIT 1
|
|
||||||
) as orgform,
|
|
||||||
(SELECT status_kurzbz FROM public.tbl_prestudentstatus
|
|
||||||
WHERE prestudent_id=tbl_student.prestudent_id
|
|
||||||
ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as studienstatus
|
|
||||||
FROM lehre.tbl_projektarbeit
|
|
||||||
LEFT JOIN public.tbl_benutzer student_benutzer ON (student_benutzer.uid = lehre.tbl_projektarbeit.student_uid)
|
|
||||||
LEFT JOIN public.tbl_person student_person ON (student_benutzer.person_id = student_person.person_id)
|
|
||||||
LEFT JOIN public.tbl_student on(student_benutzer.uid = public.tbl_student.student_uid)
|
|
||||||
LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
|
|
||||||
LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
|
|
||||||
LEFT JOIN public.tbl_studiengang ON (public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz)
|
|
||||||
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
|
|
||||||
LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
|
|
||||||
LEFT JOIN public.tbl_person betreuer_person ON (betreuer_person.person_id = lehre.tbl_projektbetreuer.person_id)
|
|
||||||
LEFT JOIN public.tbl_benutzer betreuer_benutzer ON (betreuer_person.person_id = betreuer_benutzer.person_id)
|
|
||||||
WHERE (projekttyp_kurzbz = 'Bachelor' OR projekttyp_kurzbz = 'Diplom')
|
|
||||||
AND student_benutzer.aktiv AND (
|
|
||||||
lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbegutachter'
|
|
||||||
OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Begutachter'
|
|
||||||
OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Betreuer'
|
|
||||||
OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbetreuer'
|
|
||||||
OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Senatsvorsitz'
|
|
||||||
)
|
|
||||||
AND public.tbl_studiengang.studiengang_kz = ?";
|
|
||||||
|
|
||||||
if($benotet == 0) {
|
|
||||||
$new_qry .= " AND lehre.tbl_projektarbeit.note IS NULL ";
|
|
||||||
} else if ($benotet == 1) {
|
|
||||||
$new_qry .= " AND lehre.tbl_projektarbeit.note IS NOT NULL ";
|
|
||||||
}
|
|
||||||
|
|
||||||
$new_qry .= " ORDER BY tbl_projektarbeit.projektarbeit_id DESC, student_person.nachname ASC
|
|
||||||
) as tmp";
|
|
||||||
|
|
||||||
return $this->execReadOnlyQuery($new_qry, array($studiengang_kz));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param
|
* @param
|
||||||
@@ -491,17 +299,4 @@ class Projektarbeit_model extends DB_Model
|
|||||||
|
|
||||||
return false;
|
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));
|
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));
|
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/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
||||||
$this->load->model('person/Person_model', 'PersonModel');
|
$this->load->model('person/Person_model', 'PersonModel');
|
||||||
$this->load->model('crm/Student_model', 'StudentModel');
|
$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()]);
|
$student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]);
|
||||||
if (isError($student))
|
if (isError($student))
|
||||||
return error($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){
|
$stg_ltg = array_values(array_filter($stg_ltg, function($stg_leitung){
|
||||||
return $stg_leitung->aktiv;
|
return $stg_leitung->aktiv;
|
||||||
}));
|
}));
|
||||||
$this->addFotoProperty($stg_ltg);
|
$addFotoProperty($stg_ltg);
|
||||||
|
|
||||||
$gf_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz);
|
$gf_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz);
|
||||||
if (isError($gf_ltg))
|
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){
|
$gf_ltg = array_values(array_filter($gf_ltg, function($gf_leitung){
|
||||||
return $gf_leitung->aktiv;
|
return $gf_leitung->aktiv;
|
||||||
}));
|
}));
|
||||||
$this->addEmailProperty($gf_ltg);
|
$addEmailProperty($gf_ltg);
|
||||||
$this->addFotoProperty($gf_ltg);
|
$addFotoProperty($gf_ltg);
|
||||||
|
|
||||||
$stv_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz);
|
$stv_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz);
|
||||||
if (isError($stv_ltg))
|
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){
|
$stv_ltg = array_values(array_filter($stv_ltg, function($stv_leitung){
|
||||||
return $stv_leitung->aktiv;
|
return $stv_leitung->aktiv;
|
||||||
}));
|
}));
|
||||||
$this->addEmailProperty($stv_ltg);
|
$addEmailProperty($stv_ltg);
|
||||||
$this->addFotoProperty($stv_ltg);
|
$addFotoProperty($stv_ltg);
|
||||||
|
|
||||||
$ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
|
$ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
|
||||||
if (isError($ass))
|
if (isError($ass))
|
||||||
@@ -711,8 +741,8 @@ class Studiengang_model extends DB_Model
|
|||||||
$ass = array_values(array_filter($ass, function($assistenz){
|
$ass = array_values(array_filter($ass, function($assistenz){
|
||||||
return $assistenz->aktiv;
|
return $assistenz->aktiv;
|
||||||
}));
|
}));
|
||||||
$this->addEmailProperty($ass);
|
$addEmailProperty($ass);
|
||||||
$this->addFotoProperty($ass);
|
$addFotoProperty($ass);
|
||||||
|
|
||||||
$hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv');
|
$hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv');
|
||||||
if (isError($hochschulvertr))
|
if (isError($hochschulvertr))
|
||||||
@@ -721,7 +751,7 @@ class Studiengang_model extends DB_Model
|
|||||||
$hochschulvertr = array_values(array_filter($hochschulvertr, function($hochschul_vertreter){
|
$hochschulvertr = array_values(array_filter($hochschulvertr, function($hochschul_vertreter){
|
||||||
return $hochschul_vertreter->aktiv;
|
return $hochschul_vertreter->aktiv;
|
||||||
}));
|
}));
|
||||||
$this->addEmailProperty($hochschulvertr);
|
$addEmailProperty($hochschulvertr);
|
||||||
|
|
||||||
|
|
||||||
$stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz);
|
$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){
|
$stdv = array_values(array_filter($stdv, function($std_vertreter){
|
||||||
return $std_vertreter->aktiv;
|
return $std_vertreter->aktiv;
|
||||||
}));
|
}));
|
||||||
$this->addEmailProperty($stdv);
|
$addEmailProperty($stdv);
|
||||||
|
|
||||||
|
|
||||||
$jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester);
|
$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){
|
$jahrgangsvertr = array_values(array_filter($jahrgangsvertr, function($jahrgang_vertreter){
|
||||||
return $jahrgang_vertreter->aktiv;
|
return $jahrgang_vertreter->aktiv;
|
||||||
}));
|
}));
|
||||||
$this->addEmailProperty($jahrgangsvertr);
|
$addEmailProperty($jahrgangsvertr);
|
||||||
|
|
||||||
|
|
||||||
$result_object = new stdClass();
|
$result_object = new stdClass();
|
||||||
@@ -840,72 +870,4 @@ class Studiengang_model extends DB_Model
|
|||||||
|
|
||||||
return $this->execQuery($qry, [$studiengang_kz, $studiensemester_kurzbz]);
|
return $this->execQuery($qry, [$studiengang_kz, $studiensemester_kurzbz]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getStudiengaengeFiltered($allowed_stg) {
|
|
||||||
$query ="SELECT DISTINCT
|
|
||||||
public.tbl_studiengang.studiengang_kz,
|
|
||||||
public.tbl_studiengang.bezeichnung,
|
|
||||||
public.tbl_studiengang.kurzbzlang,
|
|
||||||
public.tbl_studiengang.orgform_kurzbz
|
|
||||||
FROM public.tbl_studiengang JOIN lehre.tbl_studienordnung USING(studiengang_kz)
|
|
||||||
JOIN lehre.tbl_studienplan USING(studienordnung_id)
|
|
||||||
JOIN lehre.tbl_studienplan_semester USING(studienplan_id)
|
|
||||||
WHERE public.tbl_studiengang.aktiv = true
|
|
||||||
|
|
||||||
AND public.tbl_studiengang.studiengang_kz IN ?
|
|
||||||
ORDER BY public.tbl_studiengang.kurzbzlang";
|
|
||||||
|
|
||||||
return $this->execReadOnlyQuery($query, [$allowed_stg]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getAssistenzForStudiengangKZ($stg_kz) {
|
|
||||||
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
|
||||||
|
|
||||||
$stg_obj = $this->load($stg_kz);
|
|
||||||
if(isError($stg_obj))
|
|
||||||
return error($stg_obj);
|
|
||||||
if(getData($stg_obj))
|
|
||||||
{
|
|
||||||
$stg_obj = current(getData($stg_obj));
|
|
||||||
}
|
|
||||||
|
|
||||||
$ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
|
|
||||||
if (isError($ass))
|
|
||||||
return $ass;
|
|
||||||
$ass = getData($ass) ?: [];
|
|
||||||
$ass = array_values(array_filter($ass, function($assistenz){
|
|
||||||
return $assistenz->aktiv;
|
|
||||||
}));
|
|
||||||
|
|
||||||
$this->addEmailProperty($ass);
|
|
||||||
|
|
||||||
return success($ass);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function addEmailProperty(&$benutzerfunktionen) {
|
|
||||||
if(count($benutzerfunktionen) && defined('DOMAIN'))
|
|
||||||
{
|
|
||||||
$benutzerfunktionen = array_map(function($benutzer)
|
|
||||||
{
|
|
||||||
$benutzer->email = $benutzer->alias."@".DOMAIN;
|
|
||||||
return $benutzer;
|
|
||||||
},$benutzerfunktionen) ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function addFotoProperty (&$collection) {
|
|
||||||
$collection = array_map(function($item){
|
|
||||||
$person_id = $this->PersonModel->getByUid($item->uid);
|
|
||||||
if(isError($person_id))
|
|
||||||
return error($person_id);
|
|
||||||
$person_id = current(getData($person_id))->person_id;
|
|
||||||
$this->PersonModel->addSelect('foto');
|
|
||||||
$foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id));
|
|
||||||
if(isError($foto))
|
|
||||||
return error($foto);
|
|
||||||
$foto = current(getData($foto))->foto;
|
|
||||||
$item->foto = $foto;
|
|
||||||
return $item;
|
|
||||||
},$collection);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -420,20 +420,4 @@ class Person_model extends DB_Model
|
|||||||
return success($result);
|
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,
|
|
||||||
ARRAY_AGG(DISTINCT CONCAT(stg.typ, stg.kurzbz)) AS stg_oes,
|
|
||||||
s.semester
|
|
||||||
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
|
|
||||||
JOIN public.tbl_studiengang stg ON s.studiengang_kz = stg.studiengang_kz
|
|
||||||
GROUP BY tp.vorname, tp.nachname, b.aktiv, b.person_id, s.semester
|
|
||||||
HAVING b.person_id = ? AND b.aktiv IS TRUE";
|
|
||||||
|
|
||||||
return $this->execReadOnlyQuery($qry, [$person_id]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -470,12 +470,12 @@ class Stundenplan_model extends DB_Model
|
|||||||
}
|
}
|
||||||
foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband)
|
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
|
// 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).")";
|
$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
|
// 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)
|
$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";
|
$query .="OR";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -242,89 +242,74 @@ class Message_model extends DB_Model
|
|||||||
*/
|
*/
|
||||||
public function getMessagesForTable($person_id, $offset, $limit)
|
public function getMessagesForTable($person_id, $offset, $limit)
|
||||||
{
|
{
|
||||||
$sql = <<<EOSQL
|
$sql_base = "
|
||||||
with filtered_messages as (
|
SELECT
|
||||||
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
|
|
||||||
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,
|
|
||||||
m.message_id AS message_id,
|
m.message_id AS message_id,
|
||||||
m.subject AS subject,
|
m.subject AS subject,
|
||||||
m.body AS body,
|
m.body AS body,
|
||||||
m.insertamum AS insertamum,
|
m.insertamum AS insertamum,
|
||||||
m.relationmessage_id AS relationmessage_id,
|
m.relationmessage_id AS relationmessage_id,
|
||||||
(COALESCE(ps.titelpre,'') || ' ' || COALESCE(ps.vorname,'') || ' ' || COALESCE(ps.nachname,'') || ' ' || COALESCE(ps.titelpost,'')) as sender,
|
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = m.person_id) as sender,
|
||||||
(COALESCE(pr.titelpre,'') || ' ' || COALESCE(pr.vorname,'') || ' ' || COALESCE(pr.nachname,'') || ' ' || COALESCE(pr.titelpost,'')) as recipient,
|
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = r.person_id) as recipient,
|
||||||
fm.sender_id,
|
m.person_id as sender_id,
|
||||||
fm.recipient_id,
|
r.person_id as recipient_id,
|
||||||
ms.status,
|
MAX(ss.status) as status,
|
||||||
ms.insertamum as statusdatum
|
MAX(ss.insertamum) as statusdatum
|
||||||
from
|
FROM public.tbl_msg_message m
|
||||||
filtered_messages fm
|
JOIN public.tbl_msg_recipient r USING(message_id)
|
||||||
join
|
JOIN public.tbl_msg_status ss ON(r.message_id = ss.message_id AND ss.person_id = r.person_id)
|
||||||
public.tbl_msg_message m on fm.message_id = m.message_id
|
WHERE m.person_id = ?
|
||||||
join
|
GROUP BY m.message_id, m.subject, m.body, m.insertamum, m.relationmessage_id, sender, recipient, sender_id, recipient_id
|
||||||
lastmsgstatus ms on fm.message_id = ms.message_id and fm.recipient_id = ms.person_id
|
UNION ALL
|
||||||
left join
|
SELECT
|
||||||
public.tbl_person ps on ps.person_id = fm.sender_id
|
m.message_id AS message_id,
|
||||||
left join
|
m.subject AS subject,
|
||||||
public.tbl_person pr on pr.person_id = fm.recipient_id
|
m.body AS body,
|
||||||
order by
|
m.insertamum AS insertamum,
|
||||||
m.insertamum DESC
|
m.relationmessage_id AS relationmessage_id,
|
||||||
limit ?
|
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = m.person_id) as sender,
|
||||||
offset ?;
|
(SELECT COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,'') FROM public.tbl_person WHERE person_id = r.person_id) as recipient,
|
||||||
EOSQL;
|
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);
|
$parametersArray = array($person_id, $person_id, $limit, $offset);
|
||||||
|
|
||||||
$count = 0;
|
|
||||||
$data = $this->execQuery($sql, $parametersArray);
|
$data = $this->execQuery($sql, $parametersArray);
|
||||||
|
|
||||||
if (isError($data))
|
if (isError($data))
|
||||||
return $data;
|
return $data;
|
||||||
|
|
||||||
$data = getData($data);
|
$data = getData($data);
|
||||||
if($data)
|
|
||||||
{
|
|
||||||
$count = ceil($data[0]->total_msgs / $limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
return success(['data' => $data, 'count' => $count]);
|
return success(['data' => $data, 'count' => $count]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -286,13 +286,7 @@ EOSQL;
|
|||||||
foreach( $rows as $row ) {
|
foreach( $rows as $row ) {
|
||||||
$tmpgb = new Gehaltsbestandteil();
|
$tmpgb = new Gehaltsbestandteil();
|
||||||
$tmpgb->hydrateByStdClass($row, true);
|
$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)
|
// prevent duplication (caused by the join with historic values)
|
||||||
if (!isset($lastRecords[(string)$row->gehaltsbestandteil_id])) {
|
if (!isset($lastRecords[(string)$row->gehaltsbestandteil_id])) {
|
||||||
$gehaltsbestandteile[] = $tmpgb;
|
$gehaltsbestandteile[] = $tmpgb;
|
||||||
|
|||||||
@@ -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); ?>
|
|
||||||
@@ -21,25 +21,19 @@ $includesArray = array(
|
|||||||
'public/css/components/FilterComponent.css',
|
'public/css/components/FilterComponent.css',
|
||||||
'public/css/components/Profil.css',
|
'public/css/components/Profil.css',
|
||||||
'public/css/components/FormUnderline.css',
|
'public/css/components/FormUnderline.css',
|
||||||
'public/css/components/abgabetool/abgabe.css',
|
|
||||||
'public/css/Cis4/Cms.css',
|
'public/css/Cis4/Cms.css',
|
||||||
'public/css/Cis4/Studium.css',
|
'public/css/Cis4/Studium.css',
|
||||||
),
|
),
|
||||||
'customJSs' => array(
|
'customJSs' => array(
|
||||||
'vendor/npm-asset/primevue/accordion/accordion.min.js',
|
'vendor/npm-asset/primevue/accordion/accordion.min.js',
|
||||||
'vendor/npm-asset/primevue/accordiontab/accordiontab.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/inputnumber/inputnumber.min.js',
|
||||||
'vendor/npm-asset/primevue/speeddial/speeddial.min.js',
|
|
||||||
'vendor/npm-asset/primevue/textarea/textarea.min.js',
|
'vendor/npm-asset/primevue/textarea/textarea.min.js',
|
||||||
'vendor/npm-asset/primevue/timeline/timeline.min.js',
|
'vendor/npm-asset/primevue/checkbox/checkbox.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'
|
'vendor/moment/luxonjs/luxon.min.js'
|
||||||
),
|
),
|
||||||
'customJSModules' => array(
|
'customJSModules' => array(
|
||||||
'public/js/apps/Dashboard/Fhc.js',
|
'public/js/apps/Dashboard/Fhc.js'
|
||||||
),
|
),
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -36,4 +36,4 @@ $this->load->view('templates/FHC-Header', $includesArray);
|
|||||||
></cis-menu>
|
></cis-menu>
|
||||||
</header>
|
</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">
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.8 KiB |
@@ -86,88 +86,67 @@ echo '<?xml version="1.0" encoding="ISO-8859-1" ?>';
|
|||||||
<h3>Formel / Formula</h3>
|
<h3>Formel / Formula</h3>
|
||||||
<div style="font-size: large; padding-top: 15px">
|
<div style="font-size: large; padding-top: 15px">
|
||||||
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
||||||
<mrow>
|
<mfrac>
|
||||||
<mfrac>
|
<mn> 5 </mn>
|
||||||
<mn>5</mn>
|
<mn> 3 </mn>
|
||||||
<mn>3</mn>
|
</mfrac>
|
||||||
</mfrac>
|
|
||||||
<mo>+</mo>
|
<mo> + </mo>
|
||||||
<mfrac>
|
<mfrac>
|
||||||
<mn>7</mn>
|
<mn> 7 </mn>
|
||||||
<mn>6</mn>
|
<mn> 6 </mn>
|
||||||
</mfrac>
|
</mfrac>
|
||||||
<mo>=</mo>
|
<mo> = </mo>
|
||||||
<mfrac>
|
|
||||||
<mn>10</mn>
|
<mfrac>
|
||||||
<mn>6</mn>
|
<mn> 10 </mn>
|
||||||
</mfrac>
|
<mn> 6 </mn>
|
||||||
<mo>+</mo>
|
</mfrac>
|
||||||
<mfrac>
|
<mo> + </mo>
|
||||||
<mn>7</mn>
|
<mfrac>
|
||||||
<mn>6</mn>
|
|
||||||
</mfrac>
|
<mn> 7 </mn>
|
||||||
<mo>=</mo>
|
<mn> 6 </mn>
|
||||||
<mfrac>
|
</mfrac>
|
||||||
<mn>17</mn>
|
<mo> = </mo>
|
||||||
<mn>6</mn>
|
<mfrac>
|
||||||
</mfrac>
|
<mn> 17 </mn>
|
||||||
</mrow>
|
|
||||||
|
<mn> 6 </mn>
|
||||||
|
</mfrac>
|
||||||
</math><br/><br/>
|
</math><br/><br/>
|
||||||
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
<math xmlns="http://www.w3.org/1998/Math/MathML">
|
||||||
<mrow>
|
<mrow>
|
||||||
<munderover>
|
<munderover>
|
||||||
<mo>∑</mo>
|
<mo movablelimits="false">∑</mo>
|
||||||
<mrow>
|
<mn><mi>k</mi>=1</mn>
|
||||||
<mi>k</mi>
|
<mn>5</mn>
|
||||||
<mo>=</mo>
|
</munderover>
|
||||||
<mn>1</mn>
|
<mrow>
|
||||||
</mrow>
|
<msup>
|
||||||
<mn>5</mn>
|
<mo>(-1)</mo>
|
||||||
</munderover>
|
<mn><mi>k</mi>+1</mn>
|
||||||
<mrow>
|
</msup>
|
||||||
<msup>
|
</mrow>
|
||||||
<mrow>
|
<mfrac>
|
||||||
<mo>(</mo>
|
<mrow>
|
||||||
<mo>-</mo>
|
<msup>
|
||||||
<mn>1</mn>
|
<mi>x</mi>
|
||||||
<mo>)</mo>
|
<mn>2<mi>k</mi> + 1</mn>
|
||||||
</mrow>
|
</msup>
|
||||||
<mrow>
|
</mrow>
|
||||||
<mi>k</mi>
|
<mrow>
|
||||||
<mo>+</mo>
|
<mo>(2<mi>k</mi>+1)!</mo>
|
||||||
<mn>1</mn>
|
</mrow>
|
||||||
</mrow>
|
</mfrac>
|
||||||
</msup>
|
</mrow>
|
||||||
<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>
|
|
||||||
</math>
|
</math>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<h3>Bild / Picture</h3>
|
<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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1172,8 +1172,8 @@ if ($frage_id != '')
|
|||||||
echo "</td></tr>";
|
echo "</td></tr>";
|
||||||
//Vorschau fuer das Text-Feld
|
//Vorschau fuer das Text-Feld
|
||||||
echo "<tr><td style='width: 50%'>Vorschau:<br />
|
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>
|
<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; padding: 5px' align='center'>$frage->text</div>
|
<td style='width: 50%'>Derzeit:<br /><div id='aktuell' style='border: 1px solid black' align='center'>$frage->text</div>
|
||||||
</td></tr>";
|
</td></tr>";
|
||||||
echo "</table>";
|
echo "</table>";
|
||||||
echo '</td><td style="border-left: 1px solid black" valign="top">';
|
echo '</td><td style="border-left: 1px solid black" valign="top">';
|
||||||
@@ -1280,8 +1280,8 @@ if ($frage_id != '')
|
|||||||
echo "/></td></tr>";
|
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&stg_kz=$stg_kz&nummer=$nummer&frage_id=$frage->frage_id'\" />":'')."</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&stg_kz=$stg_kz&nummer=$nummer&frage_id=$frage->frage_id'\" />":'')."</td></tr>";
|
||||||
//Vorschau fuer das Text-Feld
|
//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>
|
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; padding: 5px' align='center'>$vorschlag->text</div></td></tr>";
|
Derzeit:<br /><div id='aktuellvorschlag' style='border: 1px solid black' align='center'>$vorschlag->text</div></td></tr>";
|
||||||
echo "</table>";
|
echo "</table>";
|
||||||
echo "</form>";
|
echo "</form>";
|
||||||
echo '</td></tr></table>';
|
echo '</td></tr></table>';
|
||||||
|
|||||||
@@ -581,14 +581,14 @@ if($frage->frage_id!='')
|
|||||||
else
|
else
|
||||||
$value=$p->t('testtool/blaettern').' >>';
|
$value=$p->t('testtool/blaettern').' >>';
|
||||||
|
|
||||||
echo "<a href='$PHP_SELF?gebiet_id=$gebiet_id&frage_id=$nextfrage' class='Item' style='padding-left: 5px'>$value</a>";
|
echo " <a href='$PHP_SELF?gebiet_id=$gebiet_id&frage_id=$nextfrage' class='Item'>$value</a>";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(!$demo)
|
if(!$demo)
|
||||||
{
|
{
|
||||||
//Wenns der letzte Eintrag ist, wieder zum ersten springen
|
//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')." >></a>";
|
echo " <a href='$PHP_SELF?gebiet_id=$gebiet_id' class='Item'>".$p->t('testtool/blaettern')." >></a>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-22
@@ -340,26 +340,13 @@ else
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if ((isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) &&
|
||||||
(
|
!isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code'])) ||
|
||||||
isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) &&
|
(isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true &&
|
||||||
!isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code']) &&
|
isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === true &&
|
||||||
!isset($_SESSION['externe_ueberwachung']) && !isset($_SESSION['externe_ueberwachung_verified'])
|
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'])))
|
||||||
(
|
|
||||||
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'])
|
|
||||||
)
|
|
||||||
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
$pruefling = new pruefling();
|
$pruefling = new pruefling();
|
||||||
|
|
||||||
@@ -678,11 +665,10 @@ elseif (isset($prestudent_id))
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Letzten Status für des Prestudenten einholen
|
// Letzten Status für des Prestudenten einholen
|
||||||
$ps_master = new Prestudent($prestudent_id);
|
$ps_master = new Prestudent();
|
||||||
$ps_master->getLastStatus($prestudent_id);
|
$ps_master->getLastStatus($prestudent_id);
|
||||||
$sto = new Studienordnung();
|
$sto = new Studienordnung();
|
||||||
$sto->getStudienordnungFromStudienplan($ps_master->studienplan_id);
|
$sto->getStudienordnungFromStudienplan($ps_master->studienplan_id);
|
||||||
$stg = new Studiengang($ps_master->studiengang_kz);
|
|
||||||
// Name des Studiengangs aus Studienordnung laden, ansonsten Fallback auf Studiengang
|
// Name des Studiengangs aus Studienordnung laden, ansonsten Fallback auf Studiengang
|
||||||
$stg_name = $sto->studiengangbezeichnung;
|
$stg_name = $sto->studiengangbezeichnung;
|
||||||
$stg_name_eng = $sto->studiengangbezeichnung_englisch;
|
$stg_name_eng = $sto->studiengangbezeichnung_englisch;
|
||||||
|
|||||||
@@ -311,7 +311,6 @@ define('EXTERNE_UEBERWACHUNG_TRIAL_TEST', false);
|
|||||||
define('EXTERNE_UEBERWACHUNG_EXAM_PARAMS', []);
|
define('EXTERNE_UEBERWACHUNG_EXAM_PARAMS', []);
|
||||||
define('EXTERNE_UEBERWACHUNG_EXAM_RULES', []);
|
define('EXTERNE_UEBERWACHUNG_EXAM_RULES', []);
|
||||||
define('EXTERNE_UEBERWACHUNG_EXAM_SCORE', []);
|
define('EXTERNE_UEBERWACHUNG_EXAM_SCORE', []);
|
||||||
define('EXTERNE_UEBERWACHUNG_EXAM_WARNINGS', []);
|
|
||||||
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|||||||
+66
-164
@@ -479,182 +479,91 @@ class anwesenheit extends basis_db
|
|||||||
*/
|
*/
|
||||||
public function loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid=null, $lehrveranstaltung_id=null)
|
public function loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid=null, $lehrveranstaltung_id=null)
|
||||||
{
|
{
|
||||||
$qry = "SELECT
|
$qry = "SELECT
|
||||||
lehrveranstaltung_id,
|
lehrveranstaltung_id, vorname, nachname, wahlname, student_uid as uid, bezeichnung,
|
||||||
vorname,
|
gesamt as gesamtstunden, anwesend, nichtanwesend, trunc(100-(nichtanwesend/gesamt)*100,2) as prozent
|
||||||
nachname,
|
FROM
|
||||||
wahlname,
|
(
|
||||||
student_uid AS uid,
|
SELECT
|
||||||
bezeichnung,
|
vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid,
|
||||||
gesamt AS gesamtstunden,
|
count(stundenplan_id) as gesamt,
|
||||||
anwesend,
|
case when anwesend.summe is null then 0 else anwesend.summe end as anwesend,
|
||||||
nichtanwesend,
|
case when nichtanwesend.summe is null then 0 else nichtanwesend.summe end as 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
|
|
||||||
|
|
||||||
FROM
|
FROM
|
||||||
(
|
(
|
||||||
SELECT
|
SELECT
|
||||||
SUM(stundenplan_id) AS stundenplan_id,
|
sum(stundenplan_id) as stundenplan_id, datum, stunde, lehrveranstaltung_id,
|
||||||
datum,
|
bezeichnung, studiensemester_kurzbz, studiengang_kz,
|
||||||
stunde,
|
TRIM(
|
||||||
lehrveranstaltung_id,
|
CASE WHEN stp.gruppe_kurzbz is not null then stp.gruppe_kurzbz
|
||||||
bezeichnung,
|
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
|
||||||
studiensemester_kurzbz,
|
|
||||||
studiengang_kz
|
|
||||||
|
|
||||||
FROM
|
FROM
|
||||||
lehre.tbl_lehrveranstaltung lv
|
lehre.tbl_lehrveranstaltung lv
|
||||||
JOIN
|
JOIN lehre.tbl_lehreinheit le using (lehrveranstaltung_id)
|
||||||
lehre.tbl_lehreinheit le USING (lehrveranstaltung_id)
|
JOIN lehre.tbl_stundenplan stp using (lehreinheit_id,studiengang_kz)
|
||||||
JOIN
|
|
||||||
lehre.tbl_stundenplan stp USING (lehreinheit_id,studiengang_kz)
|
|
||||||
|
|
||||||
WHERE
|
WHERE
|
||||||
studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||||
AND (titel NOT LIKE '%Nebenprüfung%' OR titel IS NULL)
|
AND (titel not like '%Nebenprüfung%' OR titel is null)
|
||||||
|
|
||||||
GROUP BY
|
group by datum, stunde, lehrveranstaltung_id, bezeichnung, studiensemester_kurzbz, studiengang_kz, stp.gruppe_kurzbz, stp.semester, stp.verband, stp.gruppe
|
||||||
datum,
|
|
||||||
stunde,
|
|
||||||
lehrveranstaltung_id,
|
|
||||||
bezeichnung,
|
|
||||||
studiensemester_kurzbz,
|
|
||||||
studiengang_kz,
|
|
||||||
stp.gruppe_kurzbz,
|
|
||||||
stp.semester,
|
|
||||||
stp.verband,
|
|
||||||
stp.gruppe
|
|
||||||
)x
|
)x
|
||||||
JOIN (
|
JOIN (
|
||||||
SELECT
|
SELECT semester::text as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
|
||||||
le.lehrveranstaltung_id,
|
FROM
|
||||||
slv.student_uid,
|
public.tbl_studentlehrverband
|
||||||
le.studiensemester_kurzbz,
|
WHERE studiensemester_kurzbz = ".$this->db_add_param($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
|
|
||||||
|
|
||||||
UNION
|
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
|
SELECT
|
||||||
le.lehrveranstaltung_id,
|
lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe
|
||||||
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
|
|
||||||
|
|
||||||
FROM
|
FROM
|
||||||
campus.tbl_anwesenheit a
|
campus.tbl_anwesenheit a
|
||||||
JOIN
|
JOIN lehre.tbl_lehreinheit le using (lehreinheit_id)
|
||||||
lehre.tbl_lehreinheit le USING(lehreinheit_id)
|
JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
|
||||||
JOIN
|
|
||||||
lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
|
|
||||||
|
|
||||||
WHERE
|
WHERE
|
||||||
anwesend = true
|
anwesend = true AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||||
AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
|
||||||
|
|
||||||
GROUP BY
|
GROUP BY
|
||||||
lehrveranstaltung_id,
|
lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
|
||||||
bezeichnung,
|
)anwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
|
||||||
uid,
|
|
||||||
studiensemester_kurzbz
|
|
||||||
|
|
||||||
)anwesend USING(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
|
|
||||||
LEFT JOIN(
|
LEFT JOIN(
|
||||||
SELECT
|
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
|
FROM
|
||||||
campus.tbl_anwesenheit a
|
campus.tbl_anwesenheit a
|
||||||
JOIN
|
JOIN lehre.tbl_lehreinheit le using (lehreinheit_id)
|
||||||
lehre.tbl_lehreinheit le USING (lehreinheit_id)
|
JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
|
||||||
JOIN
|
|
||||||
lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
|
|
||||||
|
|
||||||
WHERE
|
WHERE
|
||||||
anwesend = false
|
anwesend = false AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||||
AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
|
||||||
|
|
||||||
GROUP BY
|
GROUP BY
|
||||||
lehrveranstaltung_id,
|
lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
|
||||||
bezeichnung,
|
)nichtanwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
|
||||||
uid,
|
|
||||||
studiensemester_kurzbz
|
|
||||||
)nichtanwesend USING(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
|
|
||||||
|
|
||||||
WHERE
|
WHERE
|
||||||
lehrveranstaltung_id > 0
|
lehrveranstaltung_id > 0
|
||||||
";
|
";
|
||||||
@@ -664,15 +573,8 @@ class anwesenheit extends basis_db
|
|||||||
if(!is_null($lehrveranstaltung_id))
|
if(!is_null($lehrveranstaltung_id))
|
||||||
$qry.=" AND lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id);
|
$qry.=" AND lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id);
|
||||||
|
|
||||||
$qry.=" GROUP BY
|
$qry.="group by
|
||||||
vorname,
|
vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid, anwesend.summe, nichtanwesend.summe
|
||||||
nachname,
|
|
||||||
wahlname,
|
|
||||||
lehrveranstaltung_id,
|
|
||||||
bezeichnung,
|
|
||||||
student_uid,
|
|
||||||
anwesend.summe,
|
|
||||||
nichtanwesend.summe
|
|
||||||
)m";
|
)m";
|
||||||
|
|
||||||
if($lehrveranstaltung_id != '')
|
if($lehrveranstaltung_id != '')
|
||||||
|
|||||||
@@ -168,11 +168,6 @@ class externeUeberwachung extends basis_db
|
|||||||
$payload = array_merge($payload, EXTERNE_UEBERWACHUNG_EXAM_PARAMS);
|
$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'))
|
if (defined('EXTERNE_UEBERWACHUNG_EXAM_RULES'))
|
||||||
{
|
{
|
||||||
$payload['rules'] = EXTERNE_UEBERWACHUNG_EXAM_RULES;
|
$payload['rules'] = EXTERNE_UEBERWACHUNG_EXAM_RULES;
|
||||||
|
|||||||
@@ -345,7 +345,6 @@ class gebiet extends basis_db
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Pruefen ob jede Fragen mindestens 2 Vorschlaege hat
|
//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
|
$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
|
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;";
|
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())
|
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=='')
|
if($this->errormsg=='')
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -513,7 +513,6 @@ class statistik extends basis_db
|
|||||||
$this->json=array();
|
$this->json=array();
|
||||||
$this->countRows=0;
|
$this->countRows=0;
|
||||||
set_time_limit(600);
|
set_time_limit(600);
|
||||||
$parseHtml = (strpos($this->preferences, 'parseHTML: true') !== false);
|
|
||||||
|
|
||||||
// In case a decryption function is used then perform password substitution
|
// In case a decryption function is used then perform password substitution
|
||||||
$this->sql = $this->replaceSQLDecryptionPassword($this->sql);
|
$this->sql = $this->replaceSQLDecryptionPassword($this->sql);
|
||||||
@@ -566,13 +565,7 @@ class statistik extends basis_db
|
|||||||
for($spalte=0;$spalte<$anzahl_spalten;$spalte++)
|
for($spalte=0;$spalte<$anzahl_spalten;$spalte++)
|
||||||
{
|
{
|
||||||
$name = $this->db_field_name($this->data,$spalte);
|
$name = $this->db_field_name($this->data,$spalte);
|
||||||
if ($parseHtml) {
|
$this->html.= '<td>'.$this->convert_html_chars($row->$name).'</td>';
|
||||||
// HTML direkt rendern
|
|
||||||
$this->html .= '<td>'.($row->$name).'</td>';
|
|
||||||
} else {
|
|
||||||
// wie bisher escapen
|
|
||||||
$this->html .= '<td>'.$this->convert_html_chars($row->$name).'</td>';
|
|
||||||
}
|
|
||||||
// Umwandeln von Punkt in Komma bei Float-Werten
|
// Umwandeln von Punkt in Komma bei Float-Werten
|
||||||
if (is_numeric($row->$name))
|
if (is_numeric($row->$name))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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/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>
|
$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>';
|
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 />
|
$this->phrasen['testtool/dsgvoConfirmText']='<b>Ich habe die <a href ="'. APP_ROOT. 'cms/dms.php?id=373121" target="_blank">Datenschutzerklärung</a> gelesen.</b>';
|
||||||
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.</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/loginNoetig']='Bitte beachten Sie, dass der Reihungstest erst <b>unmittelbar</b> vor Ihrem <b>Reihungstesttermin</b> von uns aktiviert wird.<br>
|
$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>.';
|
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';
|
$this->phrasen['testtool/start']='Reihungstest jetzt starten';
|
||||||
|
|||||||
@@ -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>
|
|
||||||
|
|
||||||
@@ -407,6 +407,7 @@ html {
|
|||||||
background-color: var(--fhc-background);
|
background-color: var(--fhc-background);
|
||||||
border-color: var(--fhc-border);
|
border-color: var(--fhc-border);
|
||||||
padding: var(--fhc-cis-main-py) var(--fhc-cis-main-px);
|
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 {
|
#cis-main .fa-arrow-up-right-from-square {
|
||||||
@@ -855,9 +856,3 @@ html {
|
|||||||
background-color: var(--fhc-secondary);
|
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);
|
|
||||||
}
|
|
||||||
@@ -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 */
|
|
||||||
}
|
|
||||||
@@ -51,14 +51,6 @@
|
|||||||
background-color: #6d4c41;
|
background-color: #6d4c41;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tag_dark_grey {
|
|
||||||
background-color: #595959;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tag_light_grey {
|
|
||||||
background-color: #9a9a9a;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tag_blau {
|
.tag_blau {
|
||||||
background-color: #508498;
|
background-color: #508498;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,104 +38,15 @@
|
|||||||
--fhc-blue-primary: #006095;
|
--fhc-blue-primary: #006095;
|
||||||
--fhc-blue-primary-highlight: #0086CB;
|
--fhc-blue-primary-highlight: #0086CB;
|
||||||
|
|
||||||
/* --- Green --- */
|
--fhc-red-10: #842029;
|
||||||
--fhc-green-5: rgb(240, 250, 240);
|
--fhc-red-20: #800000;
|
||||||
--fhc-green-10: rgb(220, 245, 220);
|
|
||||||
--fhc-green-20: rgb(190, 235, 190);
|
|
||||||
--fhc-green-30: rgb(150, 220, 150);
|
|
||||||
--fhc-green-40: rgb(110, 200, 110);
|
|
||||||
--fhc-green-50: rgb(70, 170, 70);
|
|
||||||
--fhc-green-60: rgb(50, 145, 50);
|
|
||||||
--fhc-green-70: rgb(35, 120, 35);
|
|
||||||
--fhc-green-80: rgb(25, 95, 25);
|
|
||||||
--fhc-green-90: rgb(15, 70, 15);
|
|
||||||
|
|
||||||
/* --- Red --- */
|
--fhc-green-10: #008000;
|
||||||
--fhc-red-5: rgb(255, 245, 246);
|
|
||||||
--fhc-red-10: rgb(255, 225, 228);
|
|
||||||
--fhc-red-20: rgb(250, 190, 195);
|
|
||||||
--fhc-red-30: rgb(240, 150, 160);
|
|
||||||
--fhc-red-40: rgb(225, 110, 120);
|
|
||||||
--fhc-red-50: rgb(200, 70, 85);
|
|
||||||
--fhc-red-60: rgb(170, 50, 65);
|
|
||||||
--fhc-red-70: rgb(140, 35, 50);
|
|
||||||
--fhc-red-80: rgb(110, 20, 35);
|
|
||||||
--fhc-red-90: rgb(85, 10, 25);
|
|
||||||
|
|
||||||
/* --- Yellow --- */
|
|
||||||
--fhc-yellow-5: rgb(255, 255, 240);
|
|
||||||
--fhc-yellow-10: rgb(255, 250, 210);
|
|
||||||
--fhc-yellow-20: rgb(255, 240, 160);
|
|
||||||
--fhc-yellow-30: rgb(255, 225, 100);
|
|
||||||
--fhc-yellow-40: rgb(250, 210, 50);
|
|
||||||
--fhc-yellow-50: rgb(240, 190, 0);
|
|
||||||
--fhc-yellow-60: rgb(220, 165, 0);
|
|
||||||
--fhc-yellow-70: rgb(190, 135, 0);
|
|
||||||
--fhc-yellow-80: rgb(160, 105, 0);
|
|
||||||
--fhc-yellow-90: rgb(120, 75, 0);
|
|
||||||
|
|
||||||
/* --- Pink --- */
|
|
||||||
--fhc-pink-5: rgb(255, 245, 250);
|
|
||||||
--fhc-pink-10: rgb(255, 225, 235);
|
|
||||||
--fhc-pink-20: rgb(250, 195, 215);
|
|
||||||
--fhc-pink-30: rgb(245, 160, 190);
|
|
||||||
--fhc-pink-40: rgb(235, 120, 160);
|
|
||||||
--fhc-pink-50: rgb(220, 80, 130);
|
|
||||||
--fhc-pink-60: rgb(190, 60, 110);
|
|
||||||
--fhc-pink-70: rgb(160, 40, 90);
|
|
||||||
--fhc-pink-80: rgb(130, 25, 70);
|
|
||||||
--fhc-pink-90: rgb(100, 15, 50);
|
|
||||||
|
|
||||||
/* --- Orange --- */
|
|
||||||
--fhc-orange-5: rgb(255, 250, 240);
|
|
||||||
--fhc-orange-10: rgb(255, 235, 200);
|
|
||||||
--fhc-orange-20: rgb(255, 210, 140);
|
|
||||||
--fhc-orange-30: rgb(255, 185, 80);
|
|
||||||
--fhc-orange-40: rgb(255, 155, 40);
|
|
||||||
--fhc-orange-50: rgb(255, 128, 0);
|
|
||||||
--fhc-orange-60: rgb(230, 110, 0);
|
|
||||||
--fhc-orange-70: rgb(200, 90, 0);
|
|
||||||
--fhc-orange-80: rgb(170, 70, 0);
|
|
||||||
--fhc-orange-90: rgb(130, 50, 0);
|
|
||||||
|
|
||||||
--fhc-beige-10: rgba(245, 233, 215, 0.5);
|
--fhc-beige-10: rgba(245, 233, 215, 0.5);
|
||||||
--fhc-beige-20: rgba(172, 153, 125, 0.5);
|
--fhc-beige-20: rgba(172, 153, 125, 0.5);
|
||||||
|
|
||||||
/* --- Purple --- */
|
|
||||||
--fhc-purple-5: rgb(250, 245, 255);
|
|
||||||
--fhc-purple-10: rgb(240, 230, 255);
|
|
||||||
--fhc-purple-20: rgb(220, 200, 250);
|
|
||||||
--fhc-purple-30: rgb(190, 160, 245);
|
|
||||||
--fhc-purple-40: rgb(160, 120, 235);
|
|
||||||
--fhc-purple-50: rgb(130, 80, 220);
|
|
||||||
--fhc-purple-60: rgb(110, 60, 190);
|
|
||||||
--fhc-purple-70: rgb(90, 40, 160);
|
|
||||||
--fhc-purple-80: rgb(70, 25, 130);
|
|
||||||
--fhc-purple-90: rgb(50, 15, 100);
|
|
||||||
|
|
||||||
/* --- Teal --- */
|
|
||||||
--fhc-teal-5: rgb(240, 252, 252);
|
|
||||||
--fhc-teal-10: rgb(220, 245, 245);
|
|
||||||
--fhc-teal-20: rgb(180, 235, 235);
|
|
||||||
--fhc-teal-30: rgb(130, 220, 220);
|
|
||||||
--fhc-teal-40: rgb(80, 200, 200);
|
|
||||||
--fhc-teal-50: rgb(30, 170, 170);
|
|
||||||
--fhc-teal-60: rgb(20, 140, 140);
|
|
||||||
--fhc-teal-70: rgb(15, 115, 115);
|
|
||||||
--fhc-teal-80: rgb(10, 90, 90);
|
|
||||||
--fhc-teal-90: rgb(5, 65, 65);
|
|
||||||
|
|
||||||
/* --- Indigo --- */
|
|
||||||
--fhc-indigo-5: rgb(245, 247, 255);
|
|
||||||
--fhc-indigo-10: rgb(230, 235, 255);
|
|
||||||
--fhc-indigo-20: rgb(200, 210, 250);
|
|
||||||
--fhc-indigo-30: rgb(160, 175, 245);
|
|
||||||
--fhc-indigo-40: rgb(120, 140, 235);
|
|
||||||
--fhc-indigo-50: rgb(80, 100, 220);
|
|
||||||
--fhc-indigo-60: rgb(60, 80, 190);
|
|
||||||
--fhc-indigo-70: rgb(45, 60, 160);
|
|
||||||
--fhc-indigo-80: rgb(30, 40, 130);
|
|
||||||
--fhc-indigo-90: rgb(20, 25, 100);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,144 +0,0 @@
|
|||||||
export default {
|
|
||||||
getConfig() {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/Abgabe/getConfig'
|
|
||||||
};
|
|
||||||
},
|
|
||||||
getConfigStudent() {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/Abgabe/getConfigStudent'
|
|
||||||
};
|
|
||||||
},
|
|
||||||
getStudentProjektarbeiten(uid) {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/Abgabe/getStudentProjektarbeiten',
|
|
||||||
params: { uid }
|
|
||||||
};
|
|
||||||
},
|
|
||||||
getStudentProjektabgaben(detail) {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/Abgabe/getStudentProjektabgaben',
|
|
||||||
params: { projektarbeit_id: detail.projektarbeit_id, student_uid: detail.student_uid }
|
|
||||||
};
|
|
||||||
},
|
|
||||||
postStudentProjektarbeitEndupload(formData) {
|
|
||||||
return {
|
|
||||||
method: 'post',
|
|
||||||
url: '/api/frontend/v1/Abgabe/postStudentProjektarbeitEndupload',
|
|
||||||
params: formData,
|
|
||||||
config: {Headers: { "Content-Type": "multipart/form-data" }}
|
|
||||||
};
|
|
||||||
},
|
|
||||||
postStudentProjektarbeitZwischenabgabe(formData) {
|
|
||||||
return {
|
|
||||||
method: 'post',
|
|
||||||
url: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZwischenabgabe',
|
|
||||||
params: formData,
|
|
||||||
config: {Headers: { "Content-Type": "multipart/form-data" }}
|
|
||||||
};
|
|
||||||
},
|
|
||||||
getMitarbeiterProjektarbeiten(all) {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/Abgabe/getMitarbeiterProjektarbeiten',
|
|
||||||
params: { showall: all }
|
|
||||||
};
|
|
||||||
},
|
|
||||||
postProjektarbeitAbgabe(termin) {
|
|
||||||
|
|
||||||
let dateString = termin.datum
|
|
||||||
if(termin.datum instanceof Date) {
|
|
||||||
const year = termin.datum.getFullYear();
|
|
||||||
const month = String(termin.datum.getMonth() + 1).padStart(2, '0');
|
|
||||||
const day = String(termin.datum.getDate()).padStart(2, '0');
|
|
||||||
|
|
||||||
dateString = `${year}-${month}-${day}`
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
method: 'post',
|
|
||||||
url: '/api/frontend/v1/Abgabe/postProjektarbeitAbgabe',
|
|
||||||
params: {
|
|
||||||
paabgabe_id: termin.paabgabe_id,
|
|
||||||
paabgabetyp_kurzbz: termin.bezeichnung.paabgabetyp_kurzbz,
|
|
||||||
datum: dateString,
|
|
||||||
note: termin.note_pk,
|
|
||||||
upload_allowed: !!termin.upload_allowed,
|
|
||||||
beurteilungsnotiz: termin.beurteilungsnotiz ?? '',
|
|
||||||
fixtermin: termin.fixtermin,
|
|
||||||
insertvon: termin.insertvon,
|
|
||||||
kurzbz: termin.kurzbz,
|
|
||||||
projektarbeit_id: termin.projektarbeit_id,
|
|
||||||
betreuer_person_id: termin.betreuer_person_id
|
|
||||||
}
|
|
||||||
};
|
|
||||||
},
|
|
||||||
deleteProjektarbeitAbgabe(paabgabe_id) {
|
|
||||||
return {
|
|
||||||
method: 'post',
|
|
||||||
url: '/api/frontend/v1/Abgabe/deleteProjektarbeitAbgabe',
|
|
||||||
params: { paabgabe_id }
|
|
||||||
};
|
|
||||||
},
|
|
||||||
postSerientermin(datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, upload_allowed, projektarbeit_ids, fixtermin) {
|
|
||||||
return {
|
|
||||||
method: 'post',
|
|
||||||
url: '/api/frontend/v1/Abgabe/postSerientermin',
|
|
||||||
params: { datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, upload_allowed, projektarbeit_ids, fixtermin }
|
|
||||||
};
|
|
||||||
},
|
|
||||||
fetchDeadlines(person_id) {
|
|
||||||
return {
|
|
||||||
method: 'post',
|
|
||||||
url: '/api/frontend/v1/Abgabe/fetchDeadlines',
|
|
||||||
params: { person_id }
|
|
||||||
};
|
|
||||||
},
|
|
||||||
getPaAbgabetypen() {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/Abgabe/getPaAbgabetypen'
|
|
||||||
};
|
|
||||||
},
|
|
||||||
//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API
|
|
||||||
getNoten(){
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/Abgabe/getNoten'
|
|
||||||
};
|
|
||||||
},
|
|
||||||
getProjektarbeitenForStudiengang(studiengang_kz, benotet = 0) {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/Abgabe/getProjektarbeitenForStudiengang',
|
|
||||||
params: { studiengang_kz, benotet }
|
|
||||||
};
|
|
||||||
},
|
|
||||||
// TODO: this could also very well be generic info api
|
|
||||||
getStudiengaenge() {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/Abgabe/getStudiengaenge'
|
|
||||||
};
|
|
||||||
},
|
|
||||||
postStudentProjektarbeitZusatzdaten(formData) {
|
|
||||||
return {
|
|
||||||
method: 'post',
|
|
||||||
url: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZusatzdaten',
|
|
||||||
params: formData,
|
|
||||||
config: {Headers: { "Content-Type": "multipart/form-data" }}
|
|
||||||
};
|
|
||||||
},
|
|
||||||
getSignaturStatusForProjektarbeitAbgaben(paabgabe_ids, student_uid) {
|
|
||||||
return {
|
|
||||||
method: 'post',
|
|
||||||
url: '/api/frontend/v1/Abgabe/getSignaturStatusForProjektarbeitAbgaben',
|
|
||||||
params: {paabgabe_ids, student_uid},
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,27 +1,5 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2025 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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
getAllStudiensemesterAndAktOrNext() {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/organisation/Studiensemester/getAllStudiensemesterAndAktOrNext',
|
|
||||||
};
|
|
||||||
},
|
|
||||||
getAll(order = null, start = null)
|
getAll(order = null, start = null)
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
@@ -30,4 +8,4 @@ export default {
|
|||||||
params: { order, start }
|
params: { order, start }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
export default {
|
||||||
|
getAllStudienSemester(studiensemester=undefined, studiengang=undefined, semester=undefined, studienplan=undefined) {
|
||||||
|
return {
|
||||||
|
method: 'get',
|
||||||
|
url: '/api/frontend/v1/Studium/getAllStudienSemester',
|
||||||
|
params: {studiensemester, studiengang, semester, studienplan}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
getStudiengaengeForStudienSemester(studiensemester) {
|
||||||
|
return {
|
||||||
|
method: 'get',
|
||||||
|
url: `/api/frontend/v1/Studium/getStudiengaengeForStudienSemester/${studiensemester}`,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
getStudienplaeneBySemester(studiengang, studiensemester) {
|
||||||
|
return {
|
||||||
|
method: 'get',
|
||||||
|
url: `/api/frontend/v1/Studium/getStudienplaeneBySemester`,
|
||||||
|
params: {
|
||||||
|
studiengang,
|
||||||
|
studiensemester,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
getLvPlanForStudiensemester(studiensemester_kurzbz, lvid) {
|
||||||
|
return {
|
||||||
|
method: 'get',
|
||||||
|
url: `/api/frontend/v1/LvPlan/getLvPlanForStudiensemester/${studiensemester}/${lvid}`,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
getLvEvaluierungInfo(studiensemester_kurzbz, lvid) {
|
||||||
|
return {
|
||||||
|
method: 'get',
|
||||||
|
url: `/api/frontend/v1/Studium/getLvEvaluierungInfo/${studiensemester_kurzbz}/${lvid}`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -18,5 +18,80 @@ export default {
|
|||||||
`/api/frontend/v1/Lehre/Pruefungen/${lehrveranstaltung_id}`
|
`/api/frontend/v1/Lehre/Pruefungen/${lehrveranstaltung_id}`
|
||||||
, {}
|
, {}
|
||||||
);
|
);
|
||||||
|
},
|
||||||
|
getStudentProjektarbeiten(uid) {
|
||||||
|
return this.$fhcApi.get(
|
||||||
|
`/api/frontend/v1/Lehre/getStudentProjektarbeiten/${uid}`
|
||||||
|
, {}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
getStudentProjektabgaben(detail) {
|
||||||
|
return this.$fhcApi.get(
|
||||||
|
`/api/frontend/v1/Lehre/getStudentProjektabgaben`
|
||||||
|
, {
|
||||||
|
projektarbeit_id: detail.projektarbeit_id,
|
||||||
|
student_uid: detail.student_uid
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
postStudentProjektarbeitEndupload(formData) {
|
||||||
|
const url = '/api/frontend/v1/Lehre/postStudentProjektarbeitEndupload';
|
||||||
|
const headers = {Headers: { "Content-Type": "multipart/form-data" }}
|
||||||
|
return this.$fhcApi.post(url, formData, headers)
|
||||||
|
},
|
||||||
|
postStudentProjektarbeitZwischenabgabe(formData) {
|
||||||
|
const url = '/api/frontend/v1/Lehre/postStudentProjektarbeitZwischenabgabe';
|
||||||
|
const headers = {Headers: { "Content-Type": "multipart/form-data" }}
|
||||||
|
return this.$fhcApi.post(url, formData, headers)
|
||||||
|
},
|
||||||
|
getStudentProjektarbeitAbgabeFile(paabgabe_id, student_uid) {
|
||||||
|
const url = `/Cis/Abgabetool/getStudentProjektarbeitAbgabeFile?paabgabe_id=${paabgabe_id}&student_uid=${student_uid}`;
|
||||||
|
|
||||||
|
window.location = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url
|
||||||
|
},
|
||||||
|
getMitarbeiterProjektarbeiten(uid, all) {
|
||||||
|
return this.$fhcApi.get(
|
||||||
|
`/api/frontend/v1/Lehre/getMitarbeiterProjektarbeiten?showall=${all}`
|
||||||
|
, {}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
postProjektarbeitAbgabe(termin) {
|
||||||
|
const payload = {
|
||||||
|
paabgabe_id: termin.paabgabe_id,
|
||||||
|
paabgabetyp_kurzbz: termin.bezeichnung.paabgabetyp_kurzbz,
|
||||||
|
datum: termin.datum,
|
||||||
|
fixtermin: termin.fixtermin,
|
||||||
|
insertvon: termin.insertvon,
|
||||||
|
kurzbz: termin.kurzbz,
|
||||||
|
projektarbeit_id: termin.projektarbeit_id
|
||||||
|
}
|
||||||
|
const url = '/api/frontend/v1/Lehre/postProjektarbeitAbgabe';
|
||||||
|
|
||||||
|
return this.$fhcApi.post(url, payload, null)
|
||||||
|
|
||||||
|
},
|
||||||
|
deleteProjektarbeitAbgabe(paabgabe_id) {
|
||||||
|
const payload = {
|
||||||
|
paabgabe_id
|
||||||
|
}
|
||||||
|
const url = '/api/frontend/v1/Lehre/deleteProjektarbeitAbgabe';
|
||||||
|
|
||||||
|
return this.$fhcApi.post(url, payload, null)
|
||||||
|
},
|
||||||
|
postSerientermin(datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, projektarbeit_ids) {
|
||||||
|
const payload = {
|
||||||
|
datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, projektarbeit_ids
|
||||||
|
}
|
||||||
|
const url = '/api/frontend/v1/Lehre/postSerientermin';
|
||||||
|
|
||||||
|
return this.$fhcApi.post(url, payload, null)
|
||||||
|
},
|
||||||
|
fetchDeadlines(person_id) {
|
||||||
|
const payload = {
|
||||||
|
person_id
|
||||||
|
}
|
||||||
|
const url = '/api/frontend/v1/Lehre/fetchDeadlines';
|
||||||
|
|
||||||
|
return this.$fhcApi.post(url, payload, null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
import PluginsPhrasen from '../../plugins/Phrasen.js';
|
|
||||||
import AbgabetoolStudent from "../../components/Cis/Abgabetool/AbgabetoolStudent.js";
|
|
||||||
import AbgabetoolMitarbeiter from "../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js";
|
|
||||||
import AbgabetoolAssistenz from "../../components/Cis/Abgabetool/AbgabetoolAssistenz.js";
|
|
||||||
import DeadlineOverview from "../../components/Cis/Abgabetool/DeadlineOverview.js";
|
|
||||||
import {capitalize} from "../../helpers/StringHelpers.js";
|
|
||||||
|
|
||||||
const app = Vue.createApp({
|
|
||||||
name: 'AbgabetoolApp',
|
|
||||||
components: {
|
|
||||||
AbgabetoolStudent,
|
|
||||||
AbgabetoolMitarbeiter,
|
|
||||||
AbgabetoolAssistenz,
|
|
||||||
DeadlineOverview
|
|
||||||
},
|
|
||||||
data: function() {
|
|
||||||
return {
|
|
||||||
comp: null,
|
|
||||||
uid: null,
|
|
||||||
student_uid: null,
|
|
||||||
stg_kz: null
|
|
||||||
};
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
viewData() {
|
|
||||||
return { uid: this.uid}
|
|
||||||
},
|
|
||||||
student_uid_computed() {
|
|
||||||
return this.student_uid ?? this.uid
|
|
||||||
},
|
|
||||||
stg_kz_computed() {
|
|
||||||
return this.stg_kz ?? null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
|
|
||||||
const root = document.getElementById('abgabetoolroot')
|
|
||||||
const route = root.getAttribute("route");
|
|
||||||
this.comp = route
|
|
||||||
|
|
||||||
const uid = root.getAttribute("uid");
|
|
||||||
this.uid = uid
|
|
||||||
|
|
||||||
const stg_kz = root.getAttribute("stg_kz_prop");
|
|
||||||
this.stg_kz = stg_kz
|
|
||||||
|
|
||||||
const student_uid = root.getAttribute("student_uid_prop");
|
|
||||||
this.student_uid = student_uid
|
|
||||||
|
|
||||||
},
|
|
||||||
template: `
|
|
||||||
<template v-if="comp && uid">
|
|
||||||
<AbgabetoolStudent v-if="comp == 'AbgabetoolStudent'" :viewData="viewData" :student_uid_prop="student_uid_computed"></AbgabetoolStudent>
|
|
||||||
<AbgabetoolMitarbeiter v-if="comp == 'AbgabetoolMitarbeiter'" :viewData="viewData"></AbgabetoolMitarbeiter>
|
|
||||||
<AbgabetoolAssistenz v-if="comp == 'AbgabetoolAssistenz'" :viewData="viewData" :stg_kz_prop="stg_kz_computed"></AbgabetoolAssistenz>
|
|
||||||
<DeadlineOverview v-if="comp == 'DeadlinesOverview'" :viewData="viewData"></DeadlineOverview>
|
|
||||||
</template>
|
|
||||||
`
|
|
||||||
});
|
|
||||||
app.config.globalProperties.$capitalize = capitalize;
|
|
||||||
app.use(primevue.config.default, {
|
|
||||||
zIndex: {
|
|
||||||
overlay: 9000,
|
|
||||||
tooltip: 8000
|
|
||||||
}
|
|
||||||
})
|
|
||||||
app.directive('tooltip', primevue.tooltip);
|
|
||||||
app.use(PluginsPhrasen);
|
|
||||||
app.mount('#abgabetoolroot');
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
import FhcSearchbar from "../components/searchbar/searchbar.js";
|
import FhcSearchbar from "../components/searchbar/searchbar.js";
|
||||||
import CisMenu from "../components/Cis/Menu.js";
|
import CisMenu from "../components/Cis/Menu.js";
|
||||||
import PluginsPhrasen from '../plugins/Phrasen.js';
|
|
||||||
import ApiSearchbar from '../api/factory/searchbar.js';
|
import ApiSearchbar from '../api/factory/searchbar.js';
|
||||||
import Theme from "../plugins/Theme.js";
|
import Theme from "../plugins/Theme.js";
|
||||||
|
import FhcBase from '../plugins/FhcBase/FhcBase.js';
|
||||||
|
// import PluginsPhrasen from '../plugins/Phrasen.js';
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
name: 'CisApp',
|
name: 'CisApp',
|
||||||
components: {
|
components: {
|
||||||
@@ -148,6 +148,7 @@ app.use(primevue.config.default, {
|
|||||||
tooltip: 8000
|
tooltip: 8000
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
app.use(PluginsPhrasen);
|
// app.use(PluginsPhrasen);
|
||||||
|
app.use(FhcBase);
|
||||||
app.use(Theme);
|
app.use(Theme);
|
||||||
app.mount('#cis-header');
|
app.mount('#cis-header');
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import PluginsPhrasen from '../../plugins/Phrasen.js';
|
import PluginsPhrasen from '../../plugins/Phrasen.js';
|
||||||
import {setScrollbarWidth} from "../../helpers/CssVarCalcHelpers.js";
|
import {setScrollbarWidth} from "../../helpers/CssVarCalcHelpers.js";
|
||||||
|
import FhcBase from "../../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
name: 'DocumentsApp',
|
name: 'DocumentsApp',
|
||||||
@@ -89,5 +90,5 @@ const app = Vue.createApp({
|
|||||||
|
|
||||||
setScrollbarWidth();
|
setScrollbarWidth();
|
||||||
|
|
||||||
app.use(PluginsPhrasen);
|
app.use(FhcBase);
|
||||||
app.mount('#content');
|
app.mount('#content');
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import ProfilUpdateView from "../../components/Cis/ProfilUpdate/ProfilUpdateView.js";
|
import ProfilUpdateView from "../../components/Cis/ProfilUpdate/ProfilUpdateView.js";
|
||||||
import PluginsPhrasen from "../../plugins/Phrasen.js";
|
|
||||||
|
|
||||||
import ApiProfilUpdate from '../../api/factory/profilUpdate.js';
|
import ApiProfilUpdate from '../../api/factory/profilUpdate.js';
|
||||||
|
import FhcBase from "../../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
// TODO: sobald in verwendung den vue router pfad zu ProfilUpdateView definieren und diese app in component auslagern
|
// TODO: sobald in verwendung den vue router pfad zu ProfilUpdateView definieren und diese app in component auslagern
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
@@ -34,4 +33,4 @@ const app = Vue.createApp({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
app.use(PluginsPhrasen).mount("#content");
|
app.use(FhcBase).mount("#content");
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import {CoreNavigationCmpt} from '../../components/navigation/Navigation.js';
|
import {CoreNavigationCmpt} from '../../components/navigation/Navigation.js';
|
||||||
import DashboardAdmin from '../../components/Dashboard/Admin.js';
|
import DashboardAdmin from '../../components/Dashboard/Admin.js';
|
||||||
import PluginsPhrasen from '../../plugins/Phrasen.js';
|
import FhcBase from "../../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
name: 'AdminApp',
|
name: 'AdminApp',
|
||||||
@@ -12,5 +12,5 @@ const app = Vue.createApp({
|
|||||||
DashboardAdmin
|
DashboardAdmin
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
app.use(PluginsPhrasen);
|
app.use(FhcBase);
|
||||||
app.mount('#main');
|
app.mount('#main');
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import FhcDashboard from '../../components/Dashboard/Dashboard.js';
|
import FhcDashboard from '../../components/Dashboard/Dashboard.js';
|
||||||
import PluginsPhrasen from '../../plugins/Phrasen.js';
|
import FhcBase from '../../plugins/FhcBase/FhcBase.js';
|
||||||
|
|
||||||
import Theme from '../../plugins/Theme.js';
|
import Theme from '../../plugins/Theme.js';
|
||||||
import contrast from '../../directives/contrast.js';
|
import contrast from '../../directives/contrast.js';
|
||||||
import {setScrollbarWidth} from "../../helpers/CssVarCalcHelpers.js";
|
import {setScrollbarWidth} from "../../helpers/CssVarCalcHelpers.js";
|
||||||
@@ -14,7 +15,6 @@ import Info from "../../components/Cis/Mylv/Semester/Studiengang/Lv/Info.js";
|
|||||||
import RoomInformation, {DEFAULT_MODE_RAUMINFO} from "../../components/Cis/Mylv/RoomInformation.js";
|
import RoomInformation, {DEFAULT_MODE_RAUMINFO} from "../../components/Cis/Mylv/RoomInformation.js";
|
||||||
import AbgabetoolStudent from "../../components/Cis/Abgabetool/AbgabetoolStudent.js";
|
import AbgabetoolStudent from "../../components/Cis/Abgabetool/AbgabetoolStudent.js";
|
||||||
import AbgabetoolMitarbeiter from "../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js";
|
import AbgabetoolMitarbeiter from "../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js";
|
||||||
import AbgabetoolAssistenz from "../../components/Cis/Abgabetool/AbgabetoolAssistenz.js";
|
|
||||||
import DeadlineOverview from "../../components/Cis/Abgabetool/DeadlineOverview.js";
|
import DeadlineOverview from "../../components/Cis/Abgabetool/DeadlineOverview.js";
|
||||||
import Studium from "../../components/Cis/Studium/Studium.js";
|
import Studium from "../../components/Cis/Studium/Studium.js";
|
||||||
|
|
||||||
@@ -57,12 +57,6 @@ const router = VueRouter.createRouter({
|
|||||||
component: AbgabetoolMitarbeiter,
|
component: AbgabetoolMitarbeiter,
|
||||||
props: true
|
props: true
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: `/Cis/Abgabetool/Assistenz/:stg_kz_prop?`,
|
|
||||||
name: 'AbgabetoolAssistenz',
|
|
||||||
component: AbgabetoolAssistenz,
|
|
||||||
props: true
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
path: `/Cis/Abgabetool/Deadlines/:person_uid_prop?`,
|
path: `/Cis/Abgabetool/Deadlines/:person_uid_prop?`,
|
||||||
name: 'DeadlineOverview',
|
name: 'DeadlineOverview',
|
||||||
@@ -235,16 +229,13 @@ const app = Vue.createApp({
|
|||||||
components: {},
|
components: {},
|
||||||
computed: {
|
computed: {
|
||||||
isMobile() {
|
isMobile() {
|
||||||
const smallScreen = window.matchMedia("(max-width: 767px)").matches;
|
return /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
||||||
const touchCapable = ("ontouchstart" in window) || navigator.maxTouchPoints > 0;
|
|
||||||
return smallScreen;// && touchCapable;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
provide() {
|
provide() {
|
||||||
return { // provide injectable & watchable language property
|
return { // provide injectable & watchable language property
|
||||||
language: Vue.computed(() => this.$p.user_language),
|
language: Vue.computed(() => this.$p.user_language),
|
||||||
renderers: Vue.computed(() => this.renderers),
|
renderers: Vue.computed(() => this.renderers),
|
||||||
isMobile: this.isMobile
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -283,7 +274,6 @@ const app = Vue.createApp({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
async created(){
|
async created(){
|
||||||
|
|
||||||
await this.$api
|
await this.$api
|
||||||
.call(ApiRenderers.loadRenderers())
|
.call(ApiRenderers.loadRenderers())
|
||||||
.then(res => res.data)
|
.then(res => res.data)
|
||||||
@@ -324,7 +314,6 @@ const app = Vue.createApp({
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.addEventListener('click', this.handleClick);
|
document.addEventListener('click', this.handleClick);
|
||||||
|
|
||||||
},
|
},
|
||||||
beforeUnmount() {
|
beforeUnmount() {
|
||||||
document.removeEventListener('click', this.handleClick);
|
document.removeEventListener('click', this.handleClick);
|
||||||
@@ -342,7 +331,7 @@ app.use(primevue.config.default, {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
app.directive('tooltip', primevue.tooltip);
|
app.directive('tooltip', primevue.tooltip);
|
||||||
app.use(PluginsPhrasen);
|
app.use(FhcBase);
|
||||||
app.use(Theme);
|
app.use(Theme);
|
||||||
app.directive('contrast', contrast);
|
app.directive('contrast', contrast);
|
||||||
app.mount('#fhccontent');
|
app.mount('#fhccontent');
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import {CoreNavigationCmpt} from '../components/navigation/Navigation.js';
|
import {CoreNavigationCmpt} from '../components/navigation/Navigation.js';
|
||||||
import DashboardAdmin from '../components/Dashboard/Admin.js';
|
import DashboardAdmin from '../components/Dashboard/Admin.js';
|
||||||
import Phrases from "../plugin/Phrasen.js"
|
import FhcBase from "../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
Vue.createApp({
|
Vue.createApp({
|
||||||
name: 'DashboardAdminApp',
|
name: 'DashboardAdminApp',
|
||||||
@@ -13,4 +13,4 @@ Vue.createApp({
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
}
|
}
|
||||||
}).use(Phrases).mount('#main');
|
}).use(FhcBase).mount('#main');
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import LVVerwaltung from "../components/LVVerwaltung/LVVerwaltung.js";
|
import LVVerwaltung from "../components/LVVerwaltung/LVVerwaltung.js";
|
||||||
import Phrasen from "../plugins/Phrasen.js";
|
import FhcBase from "../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
||||||
|
|
||||||
@@ -98,5 +98,5 @@ app
|
|||||||
overlay: 1100
|
overlay: 1100
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.use(Phrasen)
|
.use(FhcBase)
|
||||||
.mount('#main');
|
.mount('#main');
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import {LogsViewerTabulatorEventHandlers} from './TabulatorSetup.js';
|
|||||||
import {CoreFilterCmpt} from '../../components/filter/Filter.js';
|
import {CoreFilterCmpt} from '../../components/filter/Filter.js';
|
||||||
import {CoreNavigationCmpt} from '../../components/navigation/Navigation.js';
|
import {CoreNavigationCmpt} from '../../components/navigation/Navigation.js';
|
||||||
|
|
||||||
import PluginsPhrasen from '../../plugins/Phrasen.js';
|
import FhcBase from "../../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
const logsViewerApp = Vue.createApp({
|
const logsViewerApp = Vue.createApp({
|
||||||
data: function() {
|
data: function() {
|
||||||
@@ -42,5 +42,5 @@ const logsViewerApp = Vue.createApp({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
logsViewerApp.use(PluginsPhrasen).mount('#main');
|
logsViewerApp.use(FhcBase).mount('#main');
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
//TODO Manu
|
//TODO Manu
|
||||||
//use this instead of Nachrichten.js
|
//use this instead of Nachrichten.js
|
||||||
import NewMessage from "../../components/Messages/Details/NewMessage/NewDiv.js";
|
import NewMessage from "../../components/Messages/Details/NewMessage/NewDiv.js";
|
||||||
import Phrasen from "../../plugin/Phrasen.js";
|
import FhcBase from "../../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
||||||
|
|
||||||
@@ -23,5 +23,5 @@ app
|
|||||||
overlay: 1100
|
overlay: 1100
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.use(Phrasen)
|
.use(FhcBase)
|
||||||
.mount('#main');
|
.mount('#main');
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import NewMessage from "../components/Messages/Details/NewMessage/NewDiv.js";
|
import NewMessage from "../components/Messages/Details/NewMessage/NewDiv.js";
|
||||||
|
import FhcBase from "../plugins/FhcBase/FhcBase.js";
|
||||||
import Phrasen from "../plugins/Phrasen.js";
|
|
||||||
|
|
||||||
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
||||||
|
|
||||||
@@ -23,5 +22,5 @@ app
|
|||||||
overlay: 1100
|
overlay: 1100
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.use(Phrasen)
|
.use(FhcBase)
|
||||||
.mount('#main');
|
.mount('#main');
|
||||||
@@ -16,10 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import FhcStudentenverwaltung from "../components/Stv/Studentenverwaltung.js";
|
import FhcStudentenverwaltung from "../components/Stv/Studentenverwaltung.js";
|
||||||
import fhcapifactory from "./api/fhcapifactory.js";
|
import FhcBase from "../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
import PluginsPhrasen from "../plugins/Phrasen.js";
|
|
||||||
|
|
||||||
|
|
||||||
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
||||||
|
|
||||||
@@ -217,5 +214,5 @@ app
|
|||||||
overlay: 1100
|
overlay: 1100
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.use(PluginsPhrasen)
|
.use(FhcBase)
|
||||||
.mount('#main');
|
.mount('#main');
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import StudierendenantragAntrag from "../../components/Studierendenantrag/Antrag.js";
|
import StudierendenantragAntrag from "../../components/Studierendenantrag/Antrag.js";
|
||||||
import StudierendenantragStatus from "../../components/Studierendenantrag/Status.js";
|
import StudierendenantragStatus from "../../components/Studierendenantrag/Status.js";
|
||||||
import StudierendenantragInfoblock from "../../components/Studierendenantrag/Infoblock.js";
|
import StudierendenantragInfoblock from "../../components/Studierendenantrag/Infoblock.js";
|
||||||
import PluginsPhrasen from '../../plugins/Phrasen.js';
|
import FhcBase from "../../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
name: 'AntragApp',
|
name: 'AntragApp',
|
||||||
@@ -21,5 +21,5 @@ const app = Vue.createApp({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
app
|
app
|
||||||
.use(PluginsPhrasen)
|
.use(FhcBase)
|
||||||
.mount('#wrapper');
|
.mount('#wrapper');
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import StudierendenantragLeitung from '../../../components/Studierendenantrag/Leitung.js';
|
import StudierendenantragLeitung from '../../../components/Studierendenantrag/Leitung.js';
|
||||||
import PluginsPhrasen from '../../../plugins/Phrasen.js';
|
import FhcBase from "../../../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
name: 'LeitungApp',
|
name: 'LeitungApp',
|
||||||
@@ -8,6 +8,6 @@ const app = Vue.createApp({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
app
|
app
|
||||||
.use(PluginsPhrasen)
|
.use(FhcBase)
|
||||||
.use(primevue.config.default,{zIndex: {overlay: 9999}})
|
.use(primevue.config.default,{zIndex: {overlay: 9999}})
|
||||||
.mount('#wrapper');
|
.mount('#wrapper');
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import LvZuweisung from '../../../components/Studierendenantrag/Lvzuweisung.js';
|
import LvZuweisung from '../../../components/Studierendenantrag/Lvzuweisung.js';
|
||||||
import PluginsPhrasen from '../../../plugins/Phrasen.js';
|
import FhcBase from "../../../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
name: 'LvzuweisungApp',
|
name: 'LvzuweisungApp',
|
||||||
@@ -13,5 +13,5 @@ const app = Vue.createApp({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
app
|
app
|
||||||
.use(PluginsPhrasen)
|
.use(FhcBase)
|
||||||
.mount('#wrapper');
|
.mount('#wrapper');
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import LvPopup from '../../../components/Studierendenantrag/Leitung/LvPopup.js';
|
import LvPopup from '../../../components/Studierendenantrag/Leitung/LvPopup.js';
|
||||||
import PluginsPhrasen from '../../../plugins/Phrasen.js';
|
import FhcBase from "../../../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
name: 'StudentApp',
|
name: 'StudentApp',
|
||||||
@@ -8,5 +8,5 @@ const app = Vue.createApp({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
app
|
app
|
||||||
.use(PluginsPhrasen)
|
.use(FhcBase)
|
||||||
.mount('#wrapper');
|
.mount('#wrapper');
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
import LvTemplateUebersicht from '../../../lehre/lvplanung/LvTemplateUebersicht.js';
|
import LvTemplateUebersicht from '../../../lehre/lvplanung/LvTemplateUebersicht.js';
|
||||||
import {CoreNavigationCmpt} from '../../../components/navigation/Navigation.js';
|
import {CoreNavigationCmpt} from '../../../components/navigation/Navigation.js';
|
||||||
import PluginsPhrasen from "../../../plugins/Phrasen.js";
|
import FhcBase from "../../../plugins/FhcBase/FhcBase.js";
|
||||||
|
|
||||||
|
|
||||||
const lvTemplatesApp = Vue.createApp({
|
const lvTemplatesApp = Vue.createApp({
|
||||||
@@ -30,5 +30,5 @@ const lvTemplatesApp = Vue.createApp({
|
|||||||
|
|
||||||
lvTemplatesApp
|
lvTemplatesApp
|
||||||
.use(primevue.config.default,{zIndex: {overlay: 9999}})
|
.use(primevue.config.default,{zIndex: {overlay: 9999}})
|
||||||
.use(PluginsPhrasen)
|
.use(FhcBase)
|
||||||
.mount('#main')
|
.mount('#main')
|
||||||
@@ -46,8 +46,7 @@ export default {
|
|||||||
"hiddenBsModal",
|
"hiddenBsModal",
|
||||||
"hidePreventedBsModal",
|
"hidePreventedBsModal",
|
||||||
"showBsModal",
|
"showBsModal",
|
||||||
"shownBsModal",
|
"shownBsModal"
|
||||||
"toggleFullscreen"
|
|
||||||
],
|
],
|
||||||
methods: {
|
methods: {
|
||||||
dispose() {
|
dispose() {
|
||||||
@@ -67,7 +66,6 @@ export default {
|
|||||||
},
|
},
|
||||||
toggleFullscreen() {
|
toggleFullscreen() {
|
||||||
this.fullscreen = !this.fullscreen
|
this.fullscreen = !this.fullscreen
|
||||||
this.$emit('toggleFullscreen')
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -137,16 +135,10 @@ export default {
|
|||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div v-if="$slots.title" class="modal-header" :class="headerClass">
|
<div v-if="$slots.title" class="modal-header" :class="headerClass">
|
||||||
<h5 class="modal-title"><slot name="title"/></h5>
|
<h5 class="modal-title"><slot name="title"/></h5>
|
||||||
<div class="d-flex align-items-center ms-auto gap-2">
|
<div class="d-flex align-items-center ms-auto">
|
||||||
<button
|
<button type="button" class="btn ms-auto" style="filter: invert(1)" v-if="allowFullscreenExpand" @click="toggleFullscreen">
|
||||||
type="button"
|
<i v-if="!fullscreen" class="fa-solid fa-expand"></i>
|
||||||
class="btn mb-1"
|
<i v-else class="fa-solid fa-compress"></i>
|
||||||
v-if="allowFullscreenExpand"
|
|
||||||
@click="toggleFullscreen"
|
|
||||||
:aria-label="fullscreen ? 'Exit Fullscreen' : 'Enter Fullscreen'"
|
|
||||||
>
|
|
||||||
<i v-if="!fullscreen" class="fa-solid fa-expand"></i>
|
|
||||||
<i v-else class="fa-solid fa-compress"></i>
|
|
||||||
</button>
|
</button>
|
||||||
<button v-if="!noCloseBtn" type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
<button v-if="!noCloseBtn" type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,151 +0,0 @@
|
|||||||
export default {
|
|
||||||
name: 'BootstrapOffcanvas',
|
|
||||||
data: () => ({
|
|
||||||
offcanvas: null
|
|
||||||
}),
|
|
||||||
props: {
|
|
||||||
backdrop: {
|
|
||||||
type: [Boolean, String],
|
|
||||||
default: true,
|
|
||||||
validator(value) {
|
|
||||||
return ['static', true, false].includes(value);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
keyboard: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true
|
|
||||||
},
|
|
||||||
scroll: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
placement: {
|
|
||||||
type: String,
|
|
||||||
default: 'start', // start | end | top | bottom
|
|
||||||
validator(value) {
|
|
||||||
return ['start', 'end', 'top', 'bottom'].includes(value);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
noCloseBtn: Boolean,
|
|
||||||
headerClass: {
|
|
||||||
type: [String, Array, Object],
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
bodyClass: {
|
|
||||||
type: [String, Array, Object],
|
|
||||||
default: 'p-4'
|
|
||||||
},
|
|
||||||
footerClass: {
|
|
||||||
type: [String, Array, Object],
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
dialogClass: [String, Array, Object]
|
|
||||||
},
|
|
||||||
emits: [
|
|
||||||
"hideBsOffcanvas",
|
|
||||||
"hiddenBsOffcanvas",
|
|
||||||
"hidePreventedBsOffcanvas",
|
|
||||||
"showBsOffcanvas",
|
|
||||||
"shownBsOffcanvas"
|
|
||||||
],
|
|
||||||
methods: {
|
|
||||||
dispose() {
|
|
||||||
return this.offcanvas?.dispose();
|
|
||||||
},
|
|
||||||
hide() {
|
|
||||||
return this.offcanvas?.hide();
|
|
||||||
},
|
|
||||||
show(relatedTarget) {
|
|
||||||
return this.offcanvas?.show(relatedTarget);
|
|
||||||
},
|
|
||||||
toggle() {
|
|
||||||
return this.offcanvas?.toggle();
|
|
||||||
},
|
|
||||||
popup(body, options, title, footer) {
|
|
||||||
const BsOffcanvas = this,
|
|
||||||
slots = {};
|
|
||||||
|
|
||||||
if (body !== undefined)
|
|
||||||
slots.default = () => body;
|
|
||||||
if (title !== undefined)
|
|
||||||
slots.title = () => title;
|
|
||||||
if (footer !== undefined)
|
|
||||||
slots.footer = () => footer;
|
|
||||||
|
|
||||||
let includedPrimevue = false;
|
|
||||||
if (typeof primevue !== 'undefined')
|
|
||||||
includedPrimevue = true;
|
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const instance = Vue.createApp({
|
|
||||||
name: 'OffcanvasTmpApp',
|
|
||||||
setup() {
|
|
||||||
return () =>
|
|
||||||
Vue.h(BsOffcanvas, {
|
|
||||||
class: 'offcanvas-wrapper',
|
|
||||||
ref: 'offcanvas',
|
|
||||||
...options
|
|
||||||
}, slots);
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.$refs.offcanvas.show();
|
|
||||||
},
|
|
||||||
beforeUnmount() {
|
|
||||||
if (this.$refs.offcanvas)
|
|
||||||
this.$refs.offcanvas.result !== false ? resolve(this.$refs.offcanvas.result) : reject();
|
|
||||||
},
|
|
||||||
unmounted() {
|
|
||||||
wrapper.parentElement.removeChild(wrapper);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
const wrapper = document.createElement('div');
|
|
||||||
|
|
||||||
if (includedPrimevue) {
|
|
||||||
instance.use(primevue.config.default, { zIndex: { overlay: 9999 } });
|
|
||||||
}
|
|
||||||
|
|
||||||
import('../../plugins/Phrasen.js').then((Phrasen) => {
|
|
||||||
instance.use(Phrasen.default);
|
|
||||||
instance.mount(wrapper);
|
|
||||||
document.body.appendChild(wrapper);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
if (this.$refs.offcanvas) {
|
|
||||||
this.offcanvas = new bootstrap.Offcanvas(this.$refs.offcanvas, {
|
|
||||||
backdrop: this.backdrop,
|
|
||||||
keyboard: this.keyboard,
|
|
||||||
scroll: this.scroll
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
template: `
|
|
||||||
<div ref="offcanvas"
|
|
||||||
class="bootstrap-offcanvas offcanvas"
|
|
||||||
:class="['offcanvas-' + placement, dialogClass]"
|
|
||||||
tabindex="-1"
|
|
||||||
@[\`hide.bs.offcanvas\`]="$emit('hideBsOffcanvas')"
|
|
||||||
@[\`hidden.bs.offcanvas\`]="$emit('hiddenBsOffcanvas')"
|
|
||||||
@[\`hidePrevented.bs.offcanvas\`]="$emit('hidePreventedBsOffcanvas')"
|
|
||||||
@[\`show.bs.offcanvas\`]="$emit('showBsOffcanvas')"
|
|
||||||
@[\`shown.bs.offcanvas\`]="$emit('shownBsOffcanvas')"
|
|
||||||
>
|
|
||||||
<div class="offcanvas-header" :class="headerClass" v-if="$slots.title">
|
|
||||||
<h5 class="offcanvas-title">
|
|
||||||
<slot name="title"></slot>
|
|
||||||
</h5>
|
|
||||||
<button v-if="!noCloseBtn" type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="offcanvas-body" :class="bodyClass">
|
|
||||||
<slot></slot>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="$slots.footer" class="offcanvas-footer" :class="footerClass">
|
|
||||||
<slot name="footer"></slot>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
`
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,9 +1,8 @@
|
|||||||
import Upload from '../../../components/Form/Upload/Dms.js';
|
import Upload from '../../../components/Form/Upload/Dms.js';
|
||||||
import BsModal from '../../Bootstrap/Modal.js';
|
import BsModal from '../../Bootstrap/Modal.js';
|
||||||
import VueDatePicker from '../../vueDatepicker.js.php';
|
import VueDatePicker from '../../vueDatepicker.js.php';
|
||||||
import ApiAbgabe from '../../../api/factory/abgabe.js'
|
|
||||||
import FhcOverlay from "../../Overlay/FhcOverlay.js";
|
|
||||||
|
|
||||||
|
const today = new Date()
|
||||||
export const AbgabeStudentDetail = {
|
export const AbgabeStudentDetail = {
|
||||||
name: "AbgabeStudentDetail",
|
name: "AbgabeStudentDetail",
|
||||||
components: {
|
components: {
|
||||||
@@ -13,14 +12,8 @@ export const AbgabeStudentDetail = {
|
|||||||
Checkbox: primevue.checkbox,
|
Checkbox: primevue.checkbox,
|
||||||
Dropdown: primevue.dropdown,
|
Dropdown: primevue.dropdown,
|
||||||
Textarea: primevue.textarea,
|
Textarea: primevue.textarea,
|
||||||
Accordion: primevue.accordion,
|
VueDatePicker
|
||||||
AccordionTab: primevue.accordiontab,
|
|
||||||
Message: primevue.message,
|
|
||||||
Inplace: primevue.inplace,
|
|
||||||
VueDatePicker,
|
|
||||||
FhcOverlay
|
|
||||||
},
|
},
|
||||||
inject: ['notenOptions', 'isMobile', 'isViewMode', 'moodle_link'],
|
|
||||||
props: {
|
props: {
|
||||||
projektarbeit: {
|
projektarbeit: {
|
||||||
type: Object,
|
type: Object,
|
||||||
@@ -33,7 +26,6 @@ export const AbgabeStudentDetail = {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
loading: false,
|
|
||||||
eidAkzeptiert: false,
|
eidAkzeptiert: false,
|
||||||
enduploadTermin: null,
|
enduploadTermin: null,
|
||||||
allActiveLanguages: FHC_JS_DATA_STORAGE_OBJECT.server_languages,
|
allActiveLanguages: FHC_JS_DATA_STORAGE_OBJECT.server_languages,
|
||||||
@@ -49,40 +41,16 @@ export const AbgabeStudentDetail = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
getNoteBezeichnung(termin){
|
validate: function(termin) {
|
||||||
const noteOpt = this.notenOptions.find(opt => opt.note == termin.note)
|
|
||||||
|
|
||||||
if(noteOpt?.bezeichnung) {
|
|
||||||
return noteOpt?.positiv ? this.$capitalize(this.$p.t('abgabetool/c4positivBenotet')) + ' ✅' : this.$capitalize(this.$p.t('abgabetool/c4negativBenotet')) + ' ❌'
|
|
||||||
} else if(noteOpt?.benotbar === true && !termin.note) {
|
|
||||||
return this.$capitalize(this.$p.t('abgabetool/c4notYetGraded'));
|
|
||||||
} else {
|
|
||||||
return ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async validate(termin, endupload = false) {
|
|
||||||
if(!termin.file.length) {
|
if(!termin.file.length) {
|
||||||
this.$fhcAlert.alertWarning(this.$capitalize(this.$p.t('global/warningChooseFile')));
|
this.$fhcAlert.alertWarning(this.$p.t('global/warningChooseFile'));
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if(endupload) {
|
|
||||||
if(await this.$fhcAlert.confirm({
|
|
||||||
message: this.$p.t('abgabetool/confirmEnduploadSpeichern'),
|
|
||||||
acceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),
|
|
||||||
acceptClass: 'p-button-primary',
|
|
||||||
rejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),
|
|
||||||
rejectClass: 'p-button-secondary'
|
|
||||||
}) === false) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
async triggerEndupload() {
|
triggerEndupload() {
|
||||||
|
if (!this.validate(this.enduploadTermin))
|
||||||
if (!await this.validate(this.enduploadTermin, true))
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -95,6 +63,7 @@ export const AbgabeStudentDetail = {
|
|||||||
formData.append('student_uid', this.projektarbeit.student_uid)
|
formData.append('student_uid', this.projektarbeit.student_uid)
|
||||||
formData.append('bperson_id', this.projektarbeit.bperson_id)
|
formData.append('bperson_id', this.projektarbeit.bperson_id)
|
||||||
|
|
||||||
|
// TODO: validate/check for null etc.
|
||||||
formData.append('sprache', this.form['sprache'].sprache)
|
formData.append('sprache', this.form['sprache'].sprache)
|
||||||
formData.append('abstract', this.form['abstract'])
|
formData.append('abstract', this.form['abstract'])
|
||||||
formData.append('abstract_en', this.form['abstract_en'])
|
formData.append('abstract_en', this.form['abstract_en'])
|
||||||
@@ -105,21 +74,15 @@ export const AbgabeStudentDetail = {
|
|||||||
for (let i = 0; i < this.enduploadTermin.file.length; i++) {
|
for (let i = 0; i < this.enduploadTermin.file.length; i++) {
|
||||||
formData.append('file', this.enduploadTermin.file[i]);
|
formData.append('file', this.enduploadTermin.file[i]);
|
||||||
}
|
}
|
||||||
this.loading = true
|
this.$fhcApi.factory.lehre.postStudentProjektarbeitEndupload(formData)
|
||||||
this.$api.call(ApiAbgabe.postStudentProjektarbeitEndupload(formData))
|
|
||||||
.then(res => {
|
.then(res => {
|
||||||
this.handleUploadRes(res, this.enduploadTermin)
|
this.handleUploadRes(res)
|
||||||
}).finally(()=> {
|
})
|
||||||
this.loading = false
|
|
||||||
})
|
|
||||||
|
|
||||||
this.$refs.modalContainerEnduploadZusatzdaten.hide()
|
this.$refs.modalContainerEnduploadZusatzdaten.hide()
|
||||||
},
|
},
|
||||||
downloadAbgabe(termin) {
|
downloadAbgabe(termin) {
|
||||||
const url = `/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${termin.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;
|
this.$fhcApi.factory.lehre.getStudentProjektarbeitAbgabeFile(termin.paabgabe_id, this.projektarbeit.student_uid)
|
||||||
|
|
||||||
window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url)
|
|
||||||
// this.$api.call(ApiAbgabe.getStudentProjektarbeitAbgabeFile(termin.paabgabe_id, this.projektarbeit.student_uid))
|
|
||||||
},
|
},
|
||||||
formatDate(dateParam) {
|
formatDate(dateParam) {
|
||||||
const date = new Date(dateParam)
|
const date = new Date(dateParam)
|
||||||
@@ -130,17 +93,16 @@ export const AbgabeStudentDetail = {
|
|||||||
const day = padZero(date.getDate());
|
const day = padZero(date.getDate());
|
||||||
const year = date.getFullYear();
|
const year = date.getFullYear();
|
||||||
|
|
||||||
return `${day}.${month}.${year}`
|
return `${day}.${month}.${year}`;
|
||||||
},
|
},
|
||||||
async upload(termin) {
|
upload(termin) {
|
||||||
|
|
||||||
// only do this on endupload
|
if (!this.validate(termin))
|
||||||
if (! await this.validate(termin))
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(termin.bezeichnung?.paabgabetyp_kurzbz === 'end') {
|
if(termin.bezeichnung === 'Endupload') {
|
||||||
// open endupload form modal for further inputs
|
// open endupload form modal for further inputs
|
||||||
this.enduploadTermin = termin
|
this.enduploadTermin = termin
|
||||||
this.$refs.modalContainerEnduploadZusatzdaten.show()
|
this.$refs.modalContainerEnduploadZusatzdaten.show()
|
||||||
@@ -155,401 +117,166 @@ export const AbgabeStudentDetail = {
|
|||||||
for (let i = 0; i < termin.file.length; i++) {
|
for (let i = 0; i < termin.file.length; i++) {
|
||||||
formData.append('file', termin.file[i]);
|
formData.append('file', termin.file[i]);
|
||||||
}
|
}
|
||||||
|
this.$fhcApi.factory.lehre.postStudentProjektarbeitZwischenabgabe(formData)
|
||||||
this.loading = true
|
|
||||||
this.$api.call(ApiAbgabe.postStudentProjektarbeitZwischenabgabe(formData))
|
|
||||||
.then(res => {
|
.then(res => {
|
||||||
this.handleUploadRes(res, termin)
|
this.handleUploadRes(res)
|
||||||
}).finally(()=> {
|
})
|
||||||
this.loading = false
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
handleUploadRes(res, termin) {
|
handleUploadRes(res) {
|
||||||
if(res.meta.status == "success") {
|
if(res.meta.status == "success") {
|
||||||
this.$fhcAlert.alertSuccess(this.$capitalize(this.$p.t('abgabetool/c4fileUploadSuccessv3')))
|
this.$fhcAlert.alertSuccess('File erfolgreich hochgeladen')
|
||||||
|
|
||||||
// update 'abgabedatum' for successful upload -> shows the pdf icon and date once set
|
|
||||||
termin.abgabedatum = new Date().toISOString().split('T')[0];
|
|
||||||
if(res?.data?.signatur !== undefined) {
|
|
||||||
termin.signatur = res.data.signatur
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
this.$fhcAlert.alertError(this.$capitalize(this.$p.t('abgabetool/c4fileUploadErrorv3')))
|
this.$fhcAlert.alertError('File upload error')
|
||||||
}
|
}
|
||||||
|
|
||||||
if(res.meta.signaturInfo) {
|
if(res.meta.signaturInfo) {
|
||||||
this.$fhcAlert.alertInfo(res.meta.signaturInfo)
|
this.$fhcAlert.alertInfo(res.meta.signaturInfo)
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
dateDiffInDays(datum, today){
|
||||||
|
const oneDayMs = 1000 * 60 * 60 * 24
|
||||||
|
return Math.round((new Date(datum) - new Date(today)) / oneDayMs)
|
||||||
|
},
|
||||||
|
getDateStyle(termin, mode) {
|
||||||
|
const datum = new Date(termin.datum)
|
||||||
|
const abgabedatum = new Date(termin.abgabedatum)
|
||||||
|
|
||||||
|
// todo: rework styling but keep the color pattern logic
|
||||||
|
// https://wiki.fhcomplete.info/doku.php?id=cis:abgabetool_fuer_studierende
|
||||||
|
let color = 'white'
|
||||||
|
let fontColor = 'black'
|
||||||
|
let icon = '';
|
||||||
|
if (termin.abgabedatum === null) {
|
||||||
|
if(datum < today) {
|
||||||
|
color = 'red'
|
||||||
|
fontColor = 'white'
|
||||||
|
icon = 'fa-triangle-exclamation'
|
||||||
|
} else if (datum > today && this.dateDiffInDays(datum, today) <= 12) {
|
||||||
|
color = 'yellow'
|
||||||
|
icon = 'fa-circle-exclamation'
|
||||||
|
}
|
||||||
|
} else if(abgabedatum > datum) {
|
||||||
|
color = 'pink' // aka "hellrot"
|
||||||
|
fontColor = 'white'
|
||||||
|
icon = 'fa-circle-question'
|
||||||
|
} else {
|
||||||
|
color = 'green'
|
||||||
|
icon = 'fa-square-check'
|
||||||
|
}
|
||||||
|
|
||||||
|
//return `font-color: ${fontColor} ; background-color: ${color}; border-radius: 50%;`
|
||||||
|
if( typeof mode !== 'undefined' || mode === 'icon') {
|
||||||
|
return icon;
|
||||||
|
} else {
|
||||||
|
return 'abgabe-zieldatum-border-' + color;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
openBeurteilungLink(link) {
|
||||||
|
window.open(link, '_blank')
|
||||||
},
|
},
|
||||||
getOptionLabel(option) {
|
getOptionLabel(option) {
|
||||||
return option.sprache
|
return option.sprache
|
||||||
},
|
}
|
||||||
getTerminNoteBezeichnung(termin) {
|
|
||||||
const noteOpt = this.notenOptions.find(opt => opt.note == termin.note)
|
|
||||||
return noteOpt ? noteOpt.bezeichnung : ''
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
projektarbeit(newVal) {
|
projektarbeit(newVal) {
|
||||||
// default select german if projektarbeit sprache was null
|
// default select german if projektarbeit sprache was null
|
||||||
this.form.sprache = newVal.sprache ? this.allActiveLanguages.find(lang => lang.sprache == newVal.sprache) : this.allActiveLanguages.find(lang => lang.sprache == 'German')
|
this.form.sprache = newVal.sprache ? this.allActiveLanguages.find(lang => lang.sprache == newVal.sprache) : this.allActiveLanguages.find(lang => lang.sprache == 'German')
|
||||||
this.form.abstract = newVal.abstract ?? ''
|
this.form.abstract = newVal.abstract
|
||||||
this.form.abstract_en = newVal.abstract_en ?? ''
|
this.form.abstract_en = newVal.abstract_en
|
||||||
this.form.schlagwoerter = newVal.schlagwoerter ?? ''
|
this.form.schlagwoerter = newVal.schlagwoerter
|
||||||
this.form.schlagwoerter_en = newVal.schlagwoerter_en ?? ''
|
this.form.schlagwoerter_en = newVal.schlagwoerter_en
|
||||||
this.form.kontrollschlagwoerter = newVal.kontrollschlagwoerter ?? ''
|
this.form.kontrollschlagwoerter = newVal.kontrollschlagwoerter
|
||||||
this.form.seitenanzahl = newVal.seitenanzahl ?? 1
|
this.form.seitenanzahl = newVal.seitenanzahl
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
getMoodleLink() {
|
|
||||||
return this.moodle_link + this.projektarbeit.studiengang_kz
|
|
||||||
},
|
|
||||||
getMessagePtStyle() {
|
|
||||||
// adjust outer spacing and internal padding to appear similar to doenload button in size
|
|
||||||
return {
|
|
||||||
root: {
|
|
||||||
style: {
|
|
||||||
margin: '0px'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
wrapper: {
|
|
||||||
style: {
|
|
||||||
padding: '6px'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getEid() {
|
getEid() {
|
||||||
return this.$capitalize(this.$p.t('abgabetool/c4eidesstattlicheErklaerung'))
|
return this.$p.t('abgabetool/c4eidesstattlicheErklaerung')
|
||||||
},
|
|
||||||
allowedToSaveZusatzdaten() {
|
|
||||||
return this.form.schlagwoerter.length > 0 && this.form.schlagwoerter_en.length > 0 && this.form.abstract.length > 0 && this.form.abstract_en.length > 0 && this.form.seitenanzahl > 0
|
|
||||||
},
|
|
||||||
getAllowedToSendEndupload() {
|
|
||||||
return this.eidAkzeptiert && this.allowedToSaveZusatzdaten
|
|
||||||
},
|
|
||||||
qualityGateTerminAvailable() {
|
|
||||||
let qgatefound = false
|
|
||||||
this.projektarbeit?.abgabetermine.forEach(abgabe => {
|
|
||||||
if(abgabe.paabgabetyp_kurzbz == 'qualgate1'
|
|
||||||
|| abgabe.paabgabetyp_kurzbz == 'qualgate2') {
|
|
||||||
qgatefound = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return qgatefound
|
|
||||||
},
|
|
||||||
getTooltipVerspaetet() {
|
|
||||||
return {
|
|
||||||
value: this.$capitalize(this.$p.t('abgabetool/c4tooltipVerspaetet')),
|
|
||||||
class: "custom-tooltip"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getTooltipVerpasst() {
|
|
||||||
return {
|
|
||||||
value: this.$capitalize(this.$p.t('abgabetool/c4tooltipVerpasst')),
|
|
||||||
class: "custom-tooltip"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getTooltipAbzugeben() {
|
|
||||||
return {
|
|
||||||
value: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbzugeben')),
|
|
||||||
class: "custom-tooltip"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getTooltipStandard() {
|
|
||||||
return {
|
|
||||||
value: this.$capitalize(this.$p.t('abgabetool/c4tooltipStandardv2')),
|
|
||||||
class: "custom-tooltip"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getTooltipAbgegeben() {
|
|
||||||
return {
|
|
||||||
value: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgegeben')),
|
|
||||||
class: "custom-tooltip"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getTooltipFixtermin() {
|
|
||||||
return {
|
|
||||||
value: this.$capitalize(this.$p.t('abgabetool/c4tooltipFixtermin')),
|
|
||||||
class: "custom-tooltip"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getTooltipAbgabeDetected() {
|
|
||||||
return {
|
|
||||||
value: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgabeDetected')),
|
|
||||||
class: "custom-tooltip"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getTooltipNotAllowedToUpload() {
|
|
||||||
if(this.isViewMode) {
|
|
||||||
return {
|
|
||||||
value: this.$capitalize(this.$p.t('abgabetool/c4studentAbgabeNotAllowedInViewMode')),
|
|
||||||
class: "custom-tooltip"
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
value: this.$capitalize(this.$p.t('abgabetool/c4studentAbgabeNotAllowedRegular')),
|
|
||||||
class: "custom-tooltip"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getTooltipBeurteilungerforderlich() {
|
|
||||||
return {
|
|
||||||
value: this.$capitalize(this.$p.t('abgabetool/c4tooltipBeurteilungerforderlich')),
|
|
||||||
class: "custom-tooltip"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getTooltipBestanden() {
|
|
||||||
return {
|
|
||||||
value: this.$p.t('abgabetool/c4tooltipBestanden'),
|
|
||||||
class: "custom-tooltip"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getTooltipNichtBestanden() {
|
|
||||||
return {
|
|
||||||
value: this.$p.t('abgabetool/c4tooltipNichtBestanden'),
|
|
||||||
class: "custom-tooltip"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
getEnduploadErlaubt() {
|
||||||
|
return !this.eidAkzeptiert
|
||||||
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
|
||||||
},
|
},
|
||||||
template: `
|
template: `
|
||||||
<FhcOverlay :active="loading"></FhcOverlay>
|
|
||||||
|
|
||||||
<div v-if="projektarbeit">
|
<div v-if="projektarbeit">
|
||||||
|
|
||||||
<h5>{{$capitalize( $p.t('abgabetool/c4abgabeStudentenbereich') )}}</h5>
|
<h5>{{$p.t('abgabetool/c4abgabeStudentenbereich')}}</h5>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-8">
|
<p> {{projektarbeit?.betreuer}}</p>
|
||||||
<p> {{$capitalize( $p.t('person/student') ) }}: {{projektarbeit?.student}}</p>
|
<p> {{projektarbeit?.titel}}</p>
|
||||||
<p> {{$capitalize( $p.t('abgabetool/c4titel') ) }}: {{projektarbeit?.titel}}</p>
|
</div>
|
||||||
<p> {{$capitalize( $p.t('abgabetool/c4betreuer') ) }}: {{projektarbeit ? $p.t('abgabetool/c4betrart' + projektarbeit.betreuerart_kurzbz) + ' ' + projektarbeit.betreuer : ''}}</p>
|
<div id="uploadWrapper">
|
||||||
|
<div class="row" style="margin-bottom: 12px;">
|
||||||
|
<div class="col-1 fw-bold text-center">{{$p.t('abgabetool/c4fixtermin')}}</div>
|
||||||
|
<div class="col-2 fw-bold">{{$p.t('abgabetool/c4zieldatum')}}</div>
|
||||||
|
<div class="col-2 fw-bold">{{$p.t('abgabetool/c4abgabetyp')}}</div>
|
||||||
|
<div class="col-3 fw-bold">{{$p.t('abgabetool/c4abgabekurzbz')}}</div>
|
||||||
|
<div class="col-1 fw-bold text-center">{{$p.t('abgabetool/c4abgabedatum')}}</div>
|
||||||
|
<div class="col-3 fw-bold">
|
||||||
|
{{$p.t('abgabetool/c4fileupload')}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-4">
|
<div class="row" v-for="termin in projektarbeit.abgabetermine">
|
||||||
<p>{{ $p.t('abgabetool/c4checkoutStgMoodleInfos') }}
|
<div class="col-1 d-flex justify-content-center align-items-start">
|
||||||
<a :href="getMoodleLink" target="_blank">Moodle</a>
|
<i v-if="termin.fixtermin" class="fa-solid fa-2x fa-circle-check fhc-bullet-red"></i>
|
||||||
</p>
|
<i v-else="" class="fa-solid fa-2x fa-circle-xmark fhc-bullet-green"></i>
|
||||||
|
<!--
|
||||||
|
<p class="fhc-bullet" :class="{ 'fhc-bullet-red': termin.fixtermin, 'fhc-bullet-green': !termin.fixtermin }"></p>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
<div class="col-2 d-flex justify-content-start align-items-start">
|
||||||
|
<div class="position-relative" :class="getDateStyle(termin)">
|
||||||
|
<VueDatePicker
|
||||||
|
v-model="termin.datum"
|
||||||
|
:clearable="false"
|
||||||
|
:disabled="true"
|
||||||
|
:enable-time-picker="false"
|
||||||
|
:format="formatDate"
|
||||||
|
:text-input="true"
|
||||||
|
auto-apply>
|
||||||
|
</VueDatePicker>
|
||||||
|
<i class="position-absolute abgabe-zieldatum-overlay fa-solid fa-2x" :class="getDateStyle(termin, 'icon')"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-2 d-flex justify-content-start align-items-start">{{ termin.bezeichnung }}</div>
|
||||||
|
<div class="col-3 d-flex justify-content-start align-items-start">
|
||||||
|
<Textarea style="margin-bottom: 4px;" v-model="termin.kurzbz" rows="3" cols="45" :disabled="true"></Textarea>
|
||||||
|
</div>
|
||||||
|
<div class="col-1 d-flex flex-column justify-content-start align-items-center">
|
||||||
|
{{ termin.abgabedatum?.split("-").reverse().join(".") }}
|
||||||
|
<a v-if="termin?.abgabedatum" @click="downloadAbgabe(termin)" style="margin-left:4px; cursor: pointer;">
|
||||||
|
<i class="fa-solid fa-3x fa-file-pdf"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="col-3" v-if="!viewMode">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-8">
|
||||||
|
<Upload v-if="termin && termin.allowedToUpload" accept=".pdf" v-model="termin.file"></Upload>
|
||||||
|
</div>
|
||||||
|
<div class="col-4">
|
||||||
|
<button class="btn btn-primary border-0" @click="upload(termin)" :disabled="!termin.allowedToUpload">
|
||||||
|
Upload
|
||||||
|
<i style="margin-left: 8px" class="fa-solid fa-upload"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Accordion :multiple="true">
|
|
||||||
<template v-for="termin in this.projektarbeit?.abgabetermine">
|
|
||||||
<AccordionTab :headerClass="termin.dateStyle + '-header'">
|
|
||||||
<template #header>
|
|
||||||
<div class="d-flex flex-nowrap align-items-center w-100">
|
|
||||||
<div class="flex-shrink-0 d-flex align-items-center justify-content-center" style="width: 36px; height: 36px; margin-left: -66px;">
|
|
||||||
<i v-if="termin.dateStyle == 'verspaetet'" v-tooltip.right="getTooltipVerspaetet" class="fa-solid fa-triangle-exclamation"></i>
|
|
||||||
<i v-else-if="termin.dateStyle == 'verpasst'" v-tooltip.right="getTooltipVerpasst" class="fa-solid fa-calendar-xmark"></i>
|
|
||||||
<i v-else-if="termin.dateStyle == 'abzugeben'" v-tooltip.right="getTooltipAbzugeben" class="fa-solid fa-hourglass-half"></i>
|
|
||||||
<i v-else-if="termin.dateStyle == 'standard'" v-tooltip.right="getTooltipStandard" class="fa-solid fa-clock"></i>
|
|
||||||
<i v-else-if="termin.dateStyle == 'abgegeben'" v-tooltip.right="getTooltipAbgegeben" class="fa-solid fa-paperclip"></i>
|
|
||||||
<i v-else-if="termin.dateStyle == 'beurteilungerforderlich'" v-tooltip.right="getTooltipBeurteilungerforderlich" class="fa-solid fa-list-check"></i>
|
|
||||||
<i v-else-if="termin.dateStyle == 'bestanden'" v-tooltip.right="getTooltipBestanden" class="fa-solid fa-check"></i>
|
|
||||||
<i v-else-if="termin.dateStyle == 'nichtbestanden'" v-tooltip.right="getTooltipNichtBestanden" class="fa-solid fa-circle-exclamation"></i>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="text-start px-2" style="min-width: 150px; max-width: 300px; margin-left: 40px">
|
|
||||||
<span>{{ termin ? $p.t('abgabetool/c4paatyp' + termin.paabgabetyp_kurzbz) : '' }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="text-start px-2" style="min-width: 100px;">
|
|
||||||
<span>{{ formatDate(termin.datum) }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="px-1">
|
|
||||||
<i v-if="termin?.fixtermin" v-tooltip.right="getTooltipFixtermin" class="fa-solid fa-lock"></i>
|
|
||||||
<i v-if="termin?.abgabedatum && isMobile" v-tooltip.right="getTooltipAbgabeDetected" class="fa-solid fa-file"></i>
|
|
||||||
</div>
|
|
||||||
<div v-if="termin?.abgabedatum && !isMobile" class="px-1">
|
|
||||||
<i v-tooltip.right="getTooltipAbgabeDetected" class="fa-solid fa-file"></i>
|
|
||||||
</div>
|
|
||||||
<div class="flex-grow-1 text-end pe-2">
|
|
||||||
<span class="fw-bold">{{getNoteBezeichnung(termin)}}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<div v-if="isMobile" class="row mt-2 align-items-center">
|
|
||||||
<Inplace
|
|
||||||
closable
|
|
||||||
:closeButtonProps="{
|
|
||||||
style: {
|
|
||||||
position: 'relative',
|
|
||||||
bottom: '100px',
|
|
||||||
left: '80%',
|
|
||||||
zIndex: 1
|
|
||||||
}
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
<template #display>{{ $capitalize($p.t('abgabetool/c4tapForTooltipInfo'))}}</template>
|
|
||||||
<template #content>
|
|
||||||
<div class="col-auto">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12 col-md-3 fw-bold align-content-center">{{ $capitalize($p.t('abgabetool/c4abgabeZeitstatus')) }}</div>
|
|
||||||
<div class="col-12 col-md-9">{{$p.t('abgabetool/c4tooltip' + $capitalize(termin?.dateStyle) )}}</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12 col-md-3 fw-bold align-content-center">{{ $capitalize($p.t('abgabetool/c4fixterminv4')) }}</div>
|
|
||||||
<div class="col-12 col-md-9">{{!termin?.fixtermin}}</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12 col-md-3 fw-bold align-content-center">{{ $capitalize($p.t('abgabetool/c4fileUploaded')) }}</div>
|
|
||||||
<div class="col-12 col-md-9">{{termin?.abgabedatum !== null}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</Inplace>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mt-2">
|
|
||||||
<div class="col-12 col-md-3 align-content-center">
|
|
||||||
<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4zieldatum') )}}</div>
|
|
||||||
<div class="row fw-light" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4abgabeuntil2359') )}}</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-md-9">
|
|
||||||
<VueDatePicker
|
|
||||||
v-model="termin.datum"
|
|
||||||
:clearable="false"
|
|
||||||
:disabled="true"
|
|
||||||
:enable-time-picker="false"
|
|
||||||
:format="formatDate"
|
|
||||||
:text-input="true"
|
|
||||||
auto-apply>
|
|
||||||
</VueDatePicker>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mt-2">
|
|
||||||
<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t('abgabetool/c4abgabetyp') )}}</div>
|
|
||||||
<div class="col-12 col-md-9">
|
|
||||||
{{ termin ? $p.t('abgabetool/c4paatyp' + termin.paabgabetyp_kurzbz) : '' }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mt-2" v-if="termin.note">
|
|
||||||
<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t('abgabetool/c4note') )}}</div>
|
|
||||||
<div class="col-12 col-md-9">
|
|
||||||
<div class="col-auto d-flex justify-content-start align-items-start">
|
|
||||||
{{ getTerminNoteBezeichnung(termin) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mt-2" v-if="termin.paabgabetyp_kurzbz === 'qualgate1' || termin.paabgabetyp_kurzbz === 'qualgate2'">
|
|
||||||
<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t('abgabetool/c4notizQualGatev2') )}}</div>
|
|
||||||
<div class="col-12 col-md-9">
|
|
||||||
<Textarea style="margin-bottom: 4px;" v-model="termin.beurteilungsnotiz" rows="1" class="w-100" disabled></Textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="termin.kurzbz && termin.kurzbz.length > 0" class="row mt-2">
|
|
||||||
<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t('abgabetool/c4abgabekurzbz') )}}</div>
|
|
||||||
<div class="col-12 col-md-9">
|
|
||||||
<Textarea style="margin-bottom: 4px;" v-model="termin.kurzbz" rows="1" class="w-100" :disabled="true"></Textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mt-2" v-if="termin.upload_allowed">
|
|
||||||
<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t('abgabetool/c4abgabedatum') )}}</div>
|
|
||||||
<div class="col-12 col-md-9">
|
|
||||||
<template v-if="termin?.abgabedatum">
|
|
||||||
<div class="row">
|
|
||||||
<div style="width:100px; align-content: center;">
|
|
||||||
<h6>{{ termin.abgabedatum?.split("-").reverse().join(".") }}</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-auto">
|
|
||||||
<button v-if="termin?.abgabedatum" @click="downloadAbgabe(termin)" class="btn btn-primary">
|
|
||||||
<a> {{$capitalize($p.t('abgabetool/c4downloadAbgabe') )}} <i class="fa fa-file-pdf" style="margin-left:4px; cursor: pointer;"></i></a>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<template v-if="termin.paabgabetyp_kurzbz == 'end'">
|
|
||||||
<div v-if="termin?.signatur !== undefined && termin?.signatur !== null" class="col-auto">
|
|
||||||
<Message v-if="termin?.signatur == true" severity="success" :closable="false" :pt="getMessagePtStyle"> {{ $p.t('abgabetool/c4signaturGefunden') }} </Message>
|
|
||||||
<Message v-else-if="termin?.signatur == false" severity="error" :closable="false" :pt="getMessagePtStyle"> {{ $p.t('abgabetool/c4keineSignatur') }} </Message>
|
|
||||||
<Message v-else-if="termin?.signatur == 'error'" severity="warn" :closable="false" :pt="getMessagePtStyle"> {{ $p.t('abgabetool/c4signaturServerError') }} </Message>
|
|
||||||
</div>
|
|
||||||
<!-- <div v-else class="col-auto">-->
|
|
||||||
<!-- <Message severity="info" :closable="false" :pt="getMessagePtStyle"> {{ $p.t('abgabetool/c4noFileFound') }} </Message>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
{{ $capitalize( $p.t('abgabetool/c4nochNichtsAbgegeben') )}}
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mt-2" v-if="termin.upload_allowed">
|
|
||||||
<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t('abgabetool/c4fileupload') )}}</div>
|
|
||||||
<div class="col-12 col-md-9">
|
|
||||||
<div class="row" v-if="termin?.allowedToUpload">
|
|
||||||
<div class="col-12 col-sm-6 mb-2">
|
|
||||||
<Upload
|
|
||||||
accept=".pdf"
|
|
||||||
v-model="termin.file"
|
|
||||||
></Upload>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-sm-6">
|
|
||||||
<button
|
|
||||||
class="btn btn-primary border-0 w-100"
|
|
||||||
@click="upload(termin)"
|
|
||||||
>
|
|
||||||
{{$capitalize( $p.t('abgabetool/c4upload') )}}
|
|
||||||
<i class="fa-solid fa-upload"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row" v-else-if="!termin?.allowedToUpload || isViewMode" v-tooltip.right="getTooltipNotAllowedToUpload">
|
|
||||||
<div class="col-12 col-sm-6 mb-2">
|
|
||||||
<Upload
|
|
||||||
disabled
|
|
||||||
accept=".pdf"
|
|
||||||
v-model="termin.file"
|
|
||||||
></Upload>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-sm-6">
|
|
||||||
<button
|
|
||||||
class="btn btn-primary border-0 w-100"
|
|
||||||
@click="upload(termin)"
|
|
||||||
disabled
|
|
||||||
>
|
|
||||||
{{$capitalize( $p.t('abgabetool/c4upload') )}}
|
|
||||||
<i class="fa-solid fa-upload"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</AccordionTab>
|
|
||||||
</template>
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<div v-if="projektarbeit?.abgabetermine.length == 0" style="display:flex; justify-content: center; align-content: center;">
|
|
||||||
<h5>{{ $capitalize( $p.t('abgabetool/c4keineAbgabetermineGefunden') )}}</h5>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<bs-modal
|
<bs-modal ref="modalContainerEnduploadZusatzdaten" class="bootstrap-prompt" dialogClass="modal-lg">
|
||||||
ref="modalContainerEnduploadZusatzdaten"
|
|
||||||
class="bootstrap-prompt"
|
|
||||||
dialogClass="bordered-modal modal-lg">
|
|
||||||
<template v-slot:title>
|
<template v-slot:title>
|
||||||
<div>
|
<div>
|
||||||
{{$capitalize( $p.t('abgabetool/c4enduploadZusatzdaten') )}}
|
{{$p.t('abgabetool/c4enduploadZusatzdaten')}}
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-3 align-items-start">
|
<div class="row mb-3 align-items-start">
|
||||||
|
|
||||||
@@ -558,13 +285,13 @@ export const AbgabeStudentDetail = {
|
|||||||
</div>
|
</div>
|
||||||
<div class="row mb-3 align-items-start">
|
<div class="row mb-3 align-items-start">
|
||||||
|
|
||||||
<p class="ml-4 mr-4">{{$capitalize( $p.t('abgabetool/c4titel') )}}: {{ projektarbeit?.titel }}</p>
|
<p class="ml-4 mr-4">Titel: {{ projektarbeit?.titel }}</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:default>
|
<template v-slot:default>
|
||||||
<div class="row mb-3 align-items-start">
|
<div class="row mb-3 align-items-start">
|
||||||
<div class="row">{{$capitalize( $p.t('abgabetool/c4Sprache') )}}</div>
|
<div class="row">{{$p.t('abgabetool/c4Sprache')}}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<Dropdown
|
<Dropdown
|
||||||
:style="{'width': '100%'}"
|
:style="{'width': '100%'}"
|
||||||
@@ -585,37 +312,35 @@ export const AbgabeStudentDetail = {
|
|||||||
<!-- -->
|
<!-- -->
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
<div class="row mb-3 align-items-start">
|
<div class="row mb-3 align-items-start">
|
||||||
<div class="row">{{$capitalize( $p.t('abgabetool/c4schlagwoerterGer') )}}</div>
|
<div class="row">{{$p.t('abgabetool/c4schlagwoerterGer')}}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<Textarea v-model="form.schlagwoerter" class="w-100"></Textarea>
|
<Textarea v-model="form.schlagwoerter"></Textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-3 align-items-start">
|
<div class="row mb-3 align-items-start">
|
||||||
<div class="row">{{$capitalize( $p.t('abgabetool/c4schlagwoerterEng') )}}</div>
|
<div class="row">{{$p.t('abgabetool/c4schlagwoerterEng')}}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<Textarea v-model="form.schlagwoerter_en" class="w-100"></Textarea>
|
<Textarea v-model="form.schlagwoerter_en"></Textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-3 align-items-start">
|
<div class="row mb-3 align-items-start">
|
||||||
<div class="row">{{$capitalize( $p.t('abgabetool/c4abstractGer') )}}</div>
|
<div class="row">{{$p.t('abgabetool/c4abstractGer')}}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<Textarea v-model="form.abstract" rows="10" maxlength="5000" class="w-100"></Textarea>
|
<Textarea v-model="form.abstract" rows="10"></Textarea>
|
||||||
<p>{{ form.abstract?.length ? form.abstract.length : 0 }} / 5000 characters</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-3 align-items-start">
|
<div class="row mb-3 align-items-start">
|
||||||
<div class="row">{{$capitalize( $p.t('abgabetool/c4abstractEng') )}}</div>
|
<div class="row">{{$p.t('abgabetool/c4abstractEng')}}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<Textarea v-model="form.abstract_en" rows="10" maxlength="5000" class="w-100"></Textarea>
|
<Textarea v-model="form.abstract_en" rows="10"></Textarea>
|
||||||
<p>{{ form.abstract_en?.length ? form.abstract_en.length : 0 }} / 5000 characters</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-3 align-items-start">
|
<div class="row mb-3 align-items-start">
|
||||||
<div class="row">{{$capitalize( $p.t('abgabetool/c4seitenanzahl') )}}</div>
|
<div class="row">{{$p.t('abgabetool/c4seitenanzahl')}}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<InputNumber
|
<InputNumber
|
||||||
v-model="form.seitenanzahl"
|
v-model="form.seitenanzahl"
|
||||||
@@ -628,7 +353,7 @@ export const AbgabeStudentDetail = {
|
|||||||
<div v-html="getEid"></div>
|
<div v-html="getEid"></div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-9"></div>
|
<div class="col-9"></div>
|
||||||
<div class="col-2"><p>{{$capitalize( $p.t('abgabetool/c4gelesenUndAkzeptiert') )}}</p></div>
|
<div class="col-2"><p>{{ $p.t('abgabetool/c4gelesenUndAkzeptiert') }}</p></div>
|
||||||
<div class="col-1">
|
<div class="col-1">
|
||||||
|
|
||||||
<Checkbox
|
<Checkbox
|
||||||
@@ -643,8 +368,7 @@ export const AbgabeStudentDetail = {
|
|||||||
|
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:footer>
|
<template v-slot:footer>
|
||||||
<div v-show="!allowedToSaveZusatzdaten">{{ $p.t('abgabetool/c4zusatzdatenausfuellen') }}</div>
|
<button class="btn btn-primary" :disabled="getEnduploadErlaubt" @click="triggerEndupload">{{$p.t('ui/hochladen')}}</button>
|
||||||
<button class="btn btn-primary" :disabled="!getAllowedToSendEndupload" @click="triggerEndupload">{{$capitalize( $p.t('ui/hochladen') )}}</button>
|
|
||||||
</template>
|
</template>
|
||||||
</bs-modal>
|
</bs-modal>
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,9 +1,8 @@
|
|||||||
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
|
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
|
||||||
import AbgabeDetail from "./AbgabeMitarbeiterDetail.js";
|
import AbgabeDetail from "./AbgabeMitarbeiterDetail.js";
|
||||||
|
import VerticalSplit from "../../verticalsplit/verticalsplit.js"
|
||||||
import BsModal from '../../Bootstrap/Modal.js';
|
import BsModal from '../../Bootstrap/Modal.js';
|
||||||
import VueDatePicker from '../../vueDatepicker.js.php';
|
import VueDatePicker from '../../vueDatepicker.js.php';
|
||||||
import ApiAbgabe from '../../../api/factory/abgabe.js'
|
|
||||||
import FhcOverlay from "../../Overlay/FhcOverlay.js";
|
|
||||||
|
|
||||||
export const AbgabetoolMitarbeiter = {
|
export const AbgabetoolMitarbeiter = {
|
||||||
name: "AbgabetoolMitarbeiter",
|
name: "AbgabetoolMitarbeiter",
|
||||||
@@ -11,21 +10,10 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
BsModal,
|
BsModal,
|
||||||
CoreFilterCmpt,
|
CoreFilterCmpt,
|
||||||
AbgabeDetail,
|
AbgabeDetail,
|
||||||
Checkbox: primevue.checkbox,
|
VerticalSplit,
|
||||||
Dropdown: primevue.dropdown,
|
Dropdown: primevue.dropdown,
|
||||||
Textarea: primevue.textarea,
|
Textarea: primevue.textarea,
|
||||||
VueDatePicker,
|
VueDatePicker
|
||||||
FhcOverlay
|
|
||||||
},
|
|
||||||
provide() {
|
|
||||||
return {
|
|
||||||
abgabeTypeOptions: Vue.computed(() => this.abgabeTypeOptions),
|
|
||||||
abgabetypenBetreuer: Vue.computed(() => this.abgabetypenBetreuer),
|
|
||||||
allowedNotenOptions: Vue.computed(() => this.allowedNotenOptions),
|
|
||||||
notenOptionsNonFinal: Vue.computed(() => this.notenOptionsNonFinal),
|
|
||||||
turnitin_link: Vue.computed(() => this.turnitin_link),
|
|
||||||
old_abgabe_beurteilung_link: Vue.computed(() => this.old_abgabe_beurteilung_link)
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
viewData: {
|
viewData: {
|
||||||
@@ -33,33 +21,44 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
required: true,
|
required: true,
|
||||||
default: () => ({name: '', uid: ''}),
|
default: () => ({name: '', uid: ''}),
|
||||||
validator(value) {
|
validator(value) {
|
||||||
return value && value.uid // && value.name -> extensive viewData use only for cis4 onwards
|
return value && value.name && value.uid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
tableData: null,
|
|
||||||
abgabetypenBetreuer: null,
|
|
||||||
detailIsFullscreen: false,
|
|
||||||
phrasenPromise: null,
|
|
||||||
phrasenResolved: false,
|
|
||||||
turnitin_link: null,
|
|
||||||
old_abgabe_beurteilung_link: null,
|
|
||||||
saving: false,
|
saving: false,
|
||||||
loading: false,
|
loading: false,
|
||||||
abgabeTypeOptions: null,
|
// TODO: fetch types
|
||||||
notenOptions: null,
|
allAbgabeTypes: [
|
||||||
allowedNotenOptions: null,
|
{
|
||||||
notenOptionsNonFinal: null,
|
paabgabetyp_kurzbz: 'abstract',
|
||||||
|
bezeichnung: 'Entwurf'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
paabgabetyp_kurzbz: 'zwischen',
|
||||||
|
bezeichnung: 'Zwischenabgabe'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
paabgabetyp_kurzbz: 'note',
|
||||||
|
bezeichnung: 'Benotung'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
paabgabetyp_kurzbz: 'end',
|
||||||
|
bezeichnung: 'Endupload'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
paabgabetyp_kurzbz: 'enda',
|
||||||
|
bezeichnung: 'Endabgabe im Sekretariat'
|
||||||
|
}
|
||||||
|
],
|
||||||
serienTermin: Vue.reactive({
|
serienTermin: Vue.reactive({
|
||||||
datum: new Date(),
|
datum: new Date(),
|
||||||
bezeichnung: {
|
bezeichnung: {
|
||||||
paabgabetyp_kurzbz: 'zwischen',
|
paabgabetyp_kurzbz: 'zwischen',
|
||||||
bezeichnung: 'Zwischenabgabe'
|
bezeichnung: 'Zwischenabgabe'
|
||||||
},
|
},
|
||||||
kurzbz: '',
|
kurzbz: ''
|
||||||
upload_allowed: false
|
|
||||||
}),
|
}),
|
||||||
showAll: false,
|
showAll: false,
|
||||||
tabulatorUuid: Vue.ref(0),
|
tabulatorUuid: Vue.ref(0),
|
||||||
@@ -73,78 +72,34 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
tableBuiltResolve: null,
|
tableBuiltResolve: null,
|
||||||
tableBuiltPromise: null,
|
tableBuiltPromise: null,
|
||||||
abgabeTableOptions: {
|
abgabeTableOptions: {
|
||||||
minHeight: 250,
|
height: 700,
|
||||||
index: 'projektarbeit_id',
|
index: 'projektarbeit_id',
|
||||||
layout: 'fitDataStretch',
|
layout: 'fitDataStretch',
|
||||||
placeholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),
|
placeholder: this.$p.t('global/noDataAvailable'),
|
||||||
selectable: true,
|
selectable: true,
|
||||||
selectableCheck: this.selectionCheck,
|
selectableCheck: this.selectionCheck,
|
||||||
rowHeight: 80,
|
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
formatter: function (cell, formatterParams, onRendered) {
|
formatter: 'rowSelection',
|
||||||
// create the built-in checkbox
|
titleFormatter: 'rowSelection',
|
||||||
if(!cell.getRow().getData().selectable) return
|
|
||||||
let checkbox = document.createElement("input");
|
|
||||||
checkbox.type = "checkbox";
|
|
||||||
|
|
||||||
// Handle select manually
|
|
||||||
checkbox.addEventListener("click", (e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
|
|
||||||
// call our function
|
|
||||||
if (formatterParams && formatterParams.handleClick) {
|
|
||||||
formatterParams.handleClick(e, cell);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
cell.getRow().getData().checkbox = checkbox
|
|
||||||
|
|
||||||
let wrapper = document.createElement("div");
|
|
||||||
wrapper.style.cssText = "display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;";
|
|
||||||
|
|
||||||
wrapper.appendChild(checkbox);
|
|
||||||
|
|
||||||
return wrapper;
|
|
||||||
},
|
|
||||||
titleFormatter: function (cell, formatterParams, onRendered) {
|
|
||||||
// create the built-in checkbox
|
|
||||||
let checkbox = document.createElement("input");
|
|
||||||
checkbox.type = "checkbox";
|
|
||||||
|
|
||||||
// Handle "select all" manually
|
|
||||||
checkbox.addEventListener("click", (e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
|
|
||||||
// call our function
|
|
||||||
if (formatterParams && formatterParams.handleClick) {
|
|
||||||
formatterParams.handleClick(e, cell);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return checkbox;
|
|
||||||
},
|
|
||||||
hozAlign: "center",
|
|
||||||
headerSort: false,
|
|
||||||
formatterParams: {
|
|
||||||
handleClick: this.selectHandler
|
|
||||||
},
|
|
||||||
titleFormatterParams: {
|
titleFormatterParams: {
|
||||||
handleClick: this.selectAllHandler
|
rowRange: "active" // Only toggle the values of the active filtered rows
|
||||||
},
|
},
|
||||||
width: 50,
|
hozAlign:"center",
|
||||||
cssClass: 'sticky-col'
|
headerSort: false,
|
||||||
|
frozen: true,
|
||||||
|
width: 70
|
||||||
},
|
},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', formatter: this.detailFormatter, widthGrow: 1, tooltip: false, cssClass: 'sticky-col'},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4details')), field: 'details', formatter: this.detailFormatter, widthGrow: 1, tooltip: false},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4personenkennzeichen'))), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4personenkennzeichen')), field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4kontakt'))), field: 'mail', formatter: this.mailFormatter, widthGrow: 1, tooltip: false, visible: false},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4kontakt')), field: 'mail', formatter: this.mailFormatter, widthGrow: 1, tooltip: false},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4vorname'))), field: 'vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4vorname')), field: 'vorname', formatter: this.centeredTextFormatter, widthGrow: 1},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nachname'))), field: 'nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4nachname')), field: 'nachname', formatter: this.centeredTextFormatter, widthGrow: 1},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4projekttyp'))), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4projekttyp')), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4stg')), field: 'stg', formatter: this.centeredTextFormatter, widthGrow: 2},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4sem')), field: 'studiensemester_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4titel'))), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, maxWidth: 500, widthGrow: 8},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4titel')), field: 'titel', formatter: this.centeredTextFormatter, maxWidth: 500, widthGrow: 8},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4betreuerart'))), field: 'betreuerart_beschreibung',formatter: this.centeredTextFormatter, widthGrow: 1}
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4betreuerart')), field: 'betreuerart_beschreibung',formatter: this.centeredTextFormatter, widthGrow: 8}
|
||||||
],
|
],
|
||||||
persistence: false,
|
persistence: false,
|
||||||
},
|
},
|
||||||
@@ -168,54 +123,12 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
{
|
{
|
||||||
event: "rowSelectionChanged",
|
event: "rowSelectionChanged",
|
||||||
handler: async(data) => {
|
handler: async(data) => {
|
||||||
this.selectedData.filter(sd => !data.includes(sd)).forEach(fsd => {
|
|
||||||
if(fsd.checkbox) fsd.checkbox.checked = false
|
|
||||||
})
|
|
||||||
|
|
||||||
data.forEach(d => {
|
|
||||||
if(d.checkbox) d.checkbox.checked = true
|
|
||||||
})
|
|
||||||
|
|
||||||
this.selectedData = data
|
this.selectedData = data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]};
|
]};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
selectHandler(e, cell) {
|
|
||||||
const row = cell.getRow();
|
|
||||||
|
|
||||||
if(row.isSelected()) {
|
|
||||||
row.deselect();
|
|
||||||
} else {
|
|
||||||
row.select();
|
|
||||||
}
|
|
||||||
|
|
||||||
// stop built-in handler
|
|
||||||
e.stopPropagation();
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
selectAllHandler(e, cell) {
|
|
||||||
const table = cell.getTable();
|
|
||||||
const rows = table.getRows();
|
|
||||||
|
|
||||||
// custom select all logic
|
|
||||||
const allowed = rows.filter(r => r.getData().selectable);
|
|
||||||
const selected = allowed.every(r => r.isSelected());
|
|
||||||
|
|
||||||
if(selected) {
|
|
||||||
allowed.forEach(r => r.deselect());
|
|
||||||
} else {
|
|
||||||
allowed.forEach(r => r.select());
|
|
||||||
}
|
|
||||||
|
|
||||||
// stop built-in handler
|
|
||||||
e.stopPropagation();
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
handleToggleFullscreenDetail() {
|
|
||||||
this.detailIsFullscreen = !this.detailIsFullscreen
|
|
||||||
},
|
|
||||||
getOptionLabelAbgabetyp(option){
|
getOptionLabelAbgabetyp(option){
|
||||||
return option.bezeichnung
|
return option.bezeichnung
|
||||||
},
|
},
|
||||||
@@ -263,17 +176,17 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
},
|
},
|
||||||
addSeries() {
|
addSeries() {
|
||||||
this.saving = true
|
this.saving = true
|
||||||
this.$api.call(ApiAbgabe.postSerientermin(
|
this.$fhcApi.factory.lehre.postSerientermin(
|
||||||
this.serienTermin.datum.toISOString(),
|
this.serienTermin.datum.toISOString(),
|
||||||
this.serienTermin.bezeichnung.paabgabetyp_kurzbz,
|
this.serienTermin.bezeichnung.paabgabetyp_kurzbz,
|
||||||
this.serienTermin.bezeichnung.bezeichnung,
|
this.serienTermin.bezeichnung.bezeichnung,
|
||||||
this.serienTermin.kurzbz,
|
this.serienTermin.kurzbz,
|
||||||
this.serienTermin.upload_allowed,
|
this.selectedData?.map(projekt => projekt.projektarbeit_id)
|
||||||
this.selectedData?.map(projekt => projekt.projektarbeit_id),
|
).then(res => {
|
||||||
false
|
|
||||||
)).then(res => {
|
|
||||||
if (res.meta.status === "success" && res.data) {
|
if (res.meta.status === "success" && res.data) {
|
||||||
this.$fhcAlert.alertSuccess(this.$p.t('abgabetool/serienTerminGespeichert'))
|
this.$fhcAlert.alertSuccess(this.$p.t('abgabetool/serienTerminGespeichert'))
|
||||||
|
// TODO: sticky lifetime erhöhen um sinnvoll lesen zu können?
|
||||||
|
this.$fhcAlert.alertInfo(this.$p.t('abgabetool/serienTerminEmailSentInfo', [this.createInfoString(res.data)]));
|
||||||
} else {
|
} else {
|
||||||
this.$fhcAlert.alertError(this.$p.t('abgabetool/errorSerienterminSpeichern'))
|
this.$fhcAlert.alertError(this.$p.t('abgabetool/errorSerienterminSpeichern'))
|
||||||
}
|
}
|
||||||
@@ -297,45 +210,44 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
return new Date(date) < new Date(Date.now())
|
return new Date(date) < new Date(Date.now())
|
||||||
},
|
},
|
||||||
setDetailComponent(details){
|
setDetailComponent(details){
|
||||||
this.loading=true
|
|
||||||
this.loadAbgaben(details).then((res)=> {
|
this.loadAbgaben(details).then((res)=> {
|
||||||
const pa = this.projektarbeiten?.retval?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)
|
const pa = this.projektarbeiten?.retval?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)
|
||||||
pa.abgabetermine = res.data[0].retval
|
pa.abgabetermine = res.data[0].retval
|
||||||
pa.isCurrent = res.data[1]
|
pa.isCurrent = res.data[1]
|
||||||
|
pa.abgabetermine.push({ // new abgatermin row
|
||||||
|
|
||||||
let paIsBenotet = false
|
'paabgabe_id': -1,
|
||||||
if(pa.note !== undefined && pa.note !== null) {
|
'projektarbeit_id': pa.projektarbeit_id,
|
||||||
// check if the note is not defined as a non final projektarbeit note
|
'fixtermin': false,
|
||||||
const opt = this.notenOptionsNonFinal.find(opt => opt.note)
|
'kurzbz': '',
|
||||||
// if thats the case allow further work
|
'datum': new Date().toISOString().split('T')[0],
|
||||||
if(opt) paIsBenotet = false
|
'paabgabetyp_kurzbz': '',
|
||||||
// else the PA is to be considered finished
|
'bezeichnung': '',
|
||||||
paIsBenotet = true
|
'abgabedatum': null,
|
||||||
}
|
'insertvon': this.viewData?.uid ?? ''
|
||||||
|
|
||||||
|
})
|
||||||
pa.abgabetermine.forEach(termin => {
|
pa.abgabetermine.forEach(termin => {
|
||||||
termin.note = this.allowedNotenOptions.find(opt => opt.note == termin.note)
|
|
||||||
termin.file = []
|
termin.file = []
|
||||||
|
termin.allowedToSave = termin.insertvon == this.viewData?.uid && pa.betreuerart_kurzbz != 'Zweitbegutachter'
|
||||||
// update 08-01-2026: everybody is allowed to do everything in client, critical checks happen at backend level
|
|
||||||
// termin.allowedToSave = true
|
|
||||||
|
|
||||||
// update 21-01-2026: actually blocking operations on finished projektarbeiten seems like a decent idea
|
|
||||||
termin.allowedToSave = paIsBenotet ? false : true
|
|
||||||
|
|
||||||
// lektoren are not allowed to delete deadlines with existing submissions
|
|
||||||
termin.allowedToDelete = termin.allowedToSave && !termin.abgabedatum
|
termin.allowedToDelete = termin.allowedToSave && !termin.abgabedatum
|
||||||
|
|
||||||
termin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)
|
termin.bezeichnung = {
|
||||||
|
bezeichnung: termin.bezeichnung,
|
||||||
|
paabgabetyp_kurzbz: termin.paabgabetyp_kurzbz
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
pa.betreuer = this.buildBetreuer(pa)
|
||||||
pa.student_uid = details.student_uid
|
pa.student_uid = details.student_uid
|
||||||
pa.student = `${pa.vorname} ${pa.nachname}`
|
pa.student = `${pa.vorname} ${pa.nachname}`
|
||||||
|
|
||||||
this.selectedProjektarbeit = pa
|
this.selectedProjektarbeit = pa
|
||||||
this.$refs.modalContainerAbgabeDetail.show()
|
|
||||||
|
|
||||||
|
this.$refs.verticalsplit.showBoth()
|
||||||
|
|
||||||
|
|
||||||
}).finally(()=>{this.loading = false})
|
})
|
||||||
},
|
},
|
||||||
centeredTextFormatter(cell) {
|
centeredTextFormatter(cell) {
|
||||||
const val = cell.getValue()
|
const val = cell.getValue()
|
||||||
@@ -364,7 +276,7 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
const val = cell.getValue()
|
const val = cell.getValue()
|
||||||
|
|
||||||
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%">' +
|
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%">' +
|
||||||
'<a style="max-width: 100%; word-wrap: break-word; white-space: normal;">'+val+'</a></div>'
|
'<p style="max-width: 100%; word-wrap: break-word; white-space: normal;">'+val+'</p></div>'
|
||||||
},
|
},
|
||||||
tableResolve(resolve) {
|
tableResolve(resolve) {
|
||||||
this.tableBuiltResolve = resolve
|
this.tableBuiltResolve = resolve
|
||||||
@@ -378,13 +290,16 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
buildStg(projekt) {
|
buildStg(projekt) {
|
||||||
return (projekt.typ + projekt.kurzbz)?.toUpperCase()
|
return (projekt.typ + projekt.kurzbz)?.toUpperCase()
|
||||||
},
|
},
|
||||||
|
buildBetreuer(abgabe) {
|
||||||
|
// TODO: preload and insert own titled name of betreuer somehow
|
||||||
|
return abgabe.betreuerart_beschreibung + ': ' + (abgabe.btitelpre ? abgabe.btitelpre + ' ' : '') + abgabe.bvorname + ' ' + abgabe.bnachname + (abgabe.btitelpost ? ' ' + abgabe.btitelpost : '')
|
||||||
|
},
|
||||||
setupData(data){
|
setupData(data){
|
||||||
this.projektarbeiten = data[0]
|
this.projektarbeiten = data[0]
|
||||||
this.domain = data[1]
|
this.domain = data[1]
|
||||||
|
|
||||||
this.tableData = data[0]?.retval?.map(projekt => {
|
const d = data[0]?.retval?.map(projekt => {
|
||||||
|
let mode = 'detailTermine'
|
||||||
projekt.selectable = projekt.betreuerart_kurzbz !== 'Zweitbegutachter'
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...projekt,
|
...projekt,
|
||||||
@@ -401,12 +316,12 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
titel: projekt.titel
|
titel: projekt.titel
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
this.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns)
|
this.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns)
|
||||||
this.$refs.abgabeTable.tabulator.setData(this.tableData);
|
this.$refs.abgabeTable.tabulator.setData(d);
|
||||||
},
|
},
|
||||||
loadProjektarbeiten(all = false, callback) {
|
loadProjektarbeiten(all = false, callback) {
|
||||||
this.$api.call(ApiAbgabe.getMitarbeiterProjektarbeiten(all))
|
this.$fhcApi.factory.lehre.getMitarbeiterProjektarbeiten(this.viewData?.uid ?? null, all)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
if(res?.data) this.setupData(res.data)
|
if(res?.data) this.setupData(res.data)
|
||||||
}).finally(() => {
|
}).finally(() => {
|
||||||
@@ -417,7 +332,7 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
},
|
},
|
||||||
loadAbgaben(details) {
|
loadAbgaben(details) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
this.$api.call(ApiAbgabe.getStudentProjektabgaben(details))
|
this.$fhcApi.factory.lehre.getStudentProjektabgaben(details)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
resolve(res)
|
resolve(res)
|
||||||
})
|
})
|
||||||
@@ -432,7 +347,7 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
if(!tableDataSet) return
|
if(!tableDataSet) return
|
||||||
const rect = tableDataSet.getBoundingClientRect();
|
const rect = tableDataSet.getBoundingClientRect();
|
||||||
|
|
||||||
this.abgabeTableOptions.height = window.visualViewport.height - rect.top - 80
|
this.abgabeTableOptions.height = window.visualViewport.height - rect.top
|
||||||
this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)
|
this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)
|
||||||
},
|
},
|
||||||
async setupMounted() {
|
async setupMounted() {
|
||||||
@@ -441,125 +356,68 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
|
|
||||||
this.loadProjektarbeiten()
|
this.loadProjektarbeiten()
|
||||||
|
|
||||||
this.calcMaxTableHeight()
|
|
||||||
|
|
||||||
|
this.$refs.verticalsplit.collapseBottom()
|
||||||
|
this.calcMaxTableHeight()
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
'serienTermin.bezeichnung'(newVal) {
|
|
||||||
if(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {
|
|
||||||
this.serienTermin.kurzbz = newVal.bezeichnung
|
|
||||||
}
|
|
||||||
|
|
||||||
this.serienTermin.upload_allowed = newVal.upload_allowed_default
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
getAllowedAbgabeTypeOptions() {
|
|
||||||
return this.abgabeTypeOptions.filter(opt => this.abgabetypenBetreuer.includes(opt.paabgabetyp_kurzbz))
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])
|
|
||||||
this.phrasenPromise.then(()=> {this.phrasenResolved = true})
|
|
||||||
// fetch config to avoid hard coded links
|
|
||||||
this.$api.call(ApiAbgabe.getConfig()).then(res => {
|
|
||||||
this.turnitin_link = res.data?.turnitin_link
|
|
||||||
this.old_abgabe_beurteilung_link = res.data?.old_abgabe_beurteilung_link
|
|
||||||
this.abgabetypenBetreuer = res.data?.abgabetypenBetreuer
|
|
||||||
}).catch(e => {
|
|
||||||
this.loading = false
|
|
||||||
})
|
|
||||||
|
|
||||||
// fetch noten options
|
|
||||||
//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API
|
|
||||||
this.$api.call(ApiAbgabe.getNoten()).then(res => {
|
|
||||||
if(res.meta.status == 'success') {
|
|
||||||
this.notenOptions = res.data[0]
|
|
||||||
|
|
||||||
this.allowedNotenOptions = this.notenOptions.filter(
|
|
||||||
opt => res.data[1].includes(opt.note)
|
|
||||||
)
|
|
||||||
|
|
||||||
this.notenOptionsNonFinal = this.notenOptions.filter(
|
|
||||||
opt => res.data[2].includes(opt.note)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
}).catch(e => {
|
|
||||||
this.loading = false
|
|
||||||
})
|
|
||||||
|
|
||||||
// fetch abgabetypen options
|
|
||||||
this.$api.call(ApiAbgabe.getPaAbgabetypen()).then(res => {
|
|
||||||
this.abgabeTypeOptions = res.data
|
|
||||||
}).catch(e => {
|
|
||||||
this.loading = false
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.setupMounted()
|
this.setupMounted()
|
||||||
},
|
},
|
||||||
template: `
|
template: `
|
||||||
<template v-if="phrasenResolved">
|
|
||||||
<FhcOverlay :active="loading || saving"></FhcOverlay>
|
|
||||||
|
|
||||||
<bs-modal ref="modalContainerAddSeries" class="bootstrap-prompt"
|
<bs-modal ref="modalContainerAddSeries" class="bootstrap-prompt"
|
||||||
dialogClass="modal-lg">
|
dialogClass="modal-lg">
|
||||||
<template v-slot:title>
|
<template v-slot:title>
|
||||||
<div>
|
<div>
|
||||||
{{ $p.t('abgabetool/neueTerminserie') }}
|
{{ $p.t('abgabetool/neueTerminserie') }}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:default>
|
<template v-slot:default>
|
||||||
|
<div class="row">
|
||||||
<div class="row mt-2">
|
<div class="col-3 d-flex justify-content-center align-items-center">
|
||||||
<div class="col-12 col-md-3 align-content-center">
|
{{$p.t('abgabetool/c4zieldatum')}}
|
||||||
<div class="row fw-bold" style="margin-left: 2px">{{$capitalize( $p.t('abgabetool/c4zieldatum') )}}</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-md-9">
|
<div class="col-3 d-flex justify-content-center align-items-center">
|
||||||
<VueDatePicker
|
{{$p.t('abgabetool/c4abgabetyp')}}
|
||||||
style="width: 95%;"
|
</div>
|
||||||
v-model="serienTermin.datum"
|
<div class="col-6 d-flex justify-content-center align-items-center">
|
||||||
:clearable="false"
|
{{$p.t('abgabetool/c4abgabekurzbz')}}
|
||||||
:enable-time-picker="false"
|
|
||||||
:format="formatDate"
|
|
||||||
:text-input="true"
|
|
||||||
auto-apply>
|
|
||||||
</VueDatePicker>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row">
|
||||||
<div class="row mt-2">
|
<div class="col-3 d-flex justify-content-center align-items-center">
|
||||||
<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t('abgabetool/c4upload_allowed') )}}</div>
|
<div>
|
||||||
<div class="col-12 col-md-9">
|
<VueDatePicker
|
||||||
<Checkbox
|
style="width: 95%;"
|
||||||
v-model="serienTermin.upload_allowed"
|
v-model="serienTermin.datum"
|
||||||
:binary="true"
|
:clearable="false"
|
||||||
:pt="{ root: { class: 'ml-auto' }}"
|
:enable-time-picker="false"
|
||||||
>
|
:format="formatDate"
|
||||||
</Checkbox>
|
:text-input="true"
|
||||||
|
auto-apply>
|
||||||
|
</VueDatePicker>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="col-3 d-flex justify-content-center align-items-center">
|
||||||
|
<Dropdown
|
||||||
<div class="row mt-2">
|
|
||||||
<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t('abgabetool/c4abgabetyp') )}}</div>
|
|
||||||
<div class="col-12 col-md-9"
|
|
||||||
v-if="abgabetypenBetreuer && abgabeTypeOptions"
|
|
||||||
>
|
|
||||||
<Dropdown
|
|
||||||
:style="{'width': '100%'}"
|
:style="{'width': '100%'}"
|
||||||
v-model="serienTermin.bezeichnung"
|
v-model="serienTermin.bezeichnung"
|
||||||
:options="getAllowedAbgabeTypeOptions"
|
:options="allAbgabeTypes"
|
||||||
:optionLabel="getOptionLabelAbgabetyp">
|
:optionLabel="getOptionLabelAbgabetyp">
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="col-6 d-flex justify-content-center align-items-center">
|
||||||
|
<Textarea style="margin-bottom: 4px;" v-model="serienTermin.kurzbz" rows="3" cols="40"></Textarea>
|
||||||
<div class="row mt-2">
|
|
||||||
<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t('abgabetool/c4abgabekurzbz') )}}</div>
|
|
||||||
<div class="col-12 col-md-9">
|
|
||||||
<Textarea style="margin-bottom: 4px;" v-model="serienTermin.kurzbz" rows="1" class="w-100"></Textarea>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -569,56 +427,56 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
</template>
|
</template>
|
||||||
</bs-modal>
|
</bs-modal>
|
||||||
|
|
||||||
<bs-modal ref="modalContainerAbgabeDetail" class="bootstrap-prompt"
|
<vertical-split ref="verticalsplit">
|
||||||
dialogClass="modal-xl" :allowFullscreenExpand="true"
|
|
||||||
@toggle-fullscreen="handleToggleFullscreenDetail">
|
<template #top>
|
||||||
<template v-slot:title>
|
<h2>{{$p.t('abgabetool/abgabetoolTitle')}}</h2>
|
||||||
<div>
|
<hr>
|
||||||
{{$p.t('abgabetool/c4abgabeMitarbeiterDetailTitle')}}
|
<core-filter-cmpt
|
||||||
|
:title="''"
|
||||||
|
@uuidDefined="handleUuidDefined"
|
||||||
|
ref="abgabeTable"
|
||||||
|
:newBtnShow="true"
|
||||||
|
:newBtnLabel="$p.t('abgabetool/neueTerminserie')"
|
||||||
|
:newBtnDisabled="!selectedData.length"
|
||||||
|
@click:new=openAddSeriesModal
|
||||||
|
:tabulator-options="abgabeTableOptions"
|
||||||
|
:tabulator-events="abgabeTableEventHandlers"
|
||||||
|
tableOnly
|
||||||
|
:sideMenu="false"
|
||||||
|
:useSelectionSpan="false"
|
||||||
|
>
|
||||||
|
<template #actions>
|
||||||
|
<button @click="toggleShowAll(!showAll)" role="button" class="btn btn-secondary ml-2">
|
||||||
|
<i v-show="!showAll" class="fa fa-eye"></i>
|
||||||
|
<i v-show="showAll" class="fa fa-eye-slash"></i>
|
||||||
|
{{ $p.t('abgabetool/showAll') }}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button @click="showDeadlines" role="button" class="btn btn-secondary ml-2">
|
||||||
|
<i class="fa fa-hourglass-end"></i>
|
||||||
|
{{ $p.t('abgabetool/showDeadlines') }}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div v-show="saving">
|
||||||
|
{{ $p.t('abgabetool/currentlySaving') }} <i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
|
||||||
|
</div>
|
||||||
|
<div v-show="loading">
|
||||||
|
{{ $p.t('abgabetool/currentlyLoading') }} <i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
</core-filter-cmpt>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
<template #bottom>
|
||||||
|
<div v-show="selectedProjektarbeit" ref="selProj">
|
||||||
|
<AbgabeDetail :projektarbeit="selectedProjektarbeit"></AbgabeDetail>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:default>
|
</vertical-split>
|
||||||
<AbgabeDetail :projektarbeit="selectedProjektarbeit" :isFullscreen="detailIsFullscreen"></AbgabeDetail>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
</bs-modal>
|
|
||||||
|
|
||||||
<!-- low max height on this vsplit wrapper to avoid padding scrolls, elements have their inherent height anyways -->
|
|
||||||
<div id="abgabetable" style="max-height:40vw;">
|
|
||||||
|
|
||||||
<h2>{{$p.t('abgabetool/abgabetoolTitle')}}</h2>
|
|
||||||
<hr>
|
|
||||||
<core-filter-cmpt
|
|
||||||
:title="''"
|
|
||||||
@uuidDefined="handleUuidDefined"
|
|
||||||
ref="abgabeTable"
|
|
||||||
:newBtnShow="true"
|
|
||||||
:newBtnLabel="$p.t('abgabetool/neueTerminserie')"
|
|
||||||
:newBtnDisabled="!selectedData.length"
|
|
||||||
@click:new=openAddSeriesModal
|
|
||||||
:tabulator-options="abgabeTableOptions"
|
|
||||||
:tabulator-events="abgabeTableEventHandlers"
|
|
||||||
tableOnly
|
|
||||||
:sideMenu="false"
|
|
||||||
:useSelectionSpan="false"
|
|
||||||
>
|
|
||||||
<template #actions>
|
|
||||||
<button @click="toggleShowAll(!showAll)" role="button" class="btn btn-secondary ml-2">
|
|
||||||
<i v-show="!showAll" class="fa fa-eye"></i>
|
|
||||||
<i v-show="showAll" class="fa fa-eye-slash"></i>
|
|
||||||
{{ $p.t('abgabetool/showAll') }}
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button @click="showDeadlines" role="button" class="btn btn-secondary ml-2">
|
|
||||||
<i class="fa fa-hourglass-end"></i>
|
|
||||||
{{ $p.t('abgabetool/showDeadlines') }}
|
|
||||||
</button>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
</core-filter-cmpt>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
`,
|
`,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +1,13 @@
|
|||||||
|
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
|
||||||
import AbgabeDetail from "./AbgabeStudentDetail.js";
|
import AbgabeDetail from "./AbgabeStudentDetail.js";
|
||||||
import ApiAbgabe from '../../../api/factory/abgabe.js'
|
import VerticalSplit from "../../verticalsplit/verticalsplit.js";
|
||||||
import BsModal from "../../Bootstrap/Modal.js";
|
|
||||||
import FhcOverlay from "../../Overlay/FhcOverlay.js";
|
|
||||||
|
|
||||||
const today = new Date()
|
|
||||||
export const AbgabetoolStudent = {
|
export const AbgabetoolStudent = {
|
||||||
name: "AbgabetoolStudent",
|
name: "AbgabetoolStudent",
|
||||||
components: {
|
components: {
|
||||||
Accordion: primevue.accordion,
|
CoreFilterCmpt,
|
||||||
AccordionTab: primevue.accordiontab,
|
|
||||||
BsModal,
|
|
||||||
AbgabeDetail,
|
AbgabeDetail,
|
||||||
FhcOverlay
|
VerticalSplit
|
||||||
},
|
|
||||||
provide() {
|
|
||||||
return {
|
|
||||||
notenOptions: Vue.computed(() => this.notenOptions),
|
|
||||||
isViewMode: Vue.computed(() => this.isViewMode),
|
|
||||||
moodle_link: Vue.computed(() => this.moodle_link)
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
student_uid_prop: {
|
student_uid_prop: {
|
||||||
@@ -35,221 +24,147 @@ export const AbgabetoolStudent = {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
activeTabIndex: [0],
|
tabulatorUuid: Vue.ref(0),
|
||||||
abgabeTypeOptions: null,
|
domain: '',
|
||||||
phrasenPromise: null,
|
student_uid: null,
|
||||||
phrasenResolved: false,
|
|
||||||
loading: false,
|
|
||||||
notenOptions: null,
|
|
||||||
detail: null,
|
detail: null,
|
||||||
projektarbeiten: null,
|
projektarbeiten: null,
|
||||||
selectedProjektarbeit: null,
|
selectedProjektarbeit: null,
|
||||||
moodle_link: null
|
tableBuiltResolve: null,
|
||||||
};
|
tableBuiltPromise: null,
|
||||||
|
abgabeTableOptions: {
|
||||||
|
minHeight: 250,
|
||||||
|
index: 'projektarbeit_id',
|
||||||
|
layout: 'fitColumns',
|
||||||
|
placeholder: this.$p.t('global/noDataAvailable'),
|
||||||
|
columns: [
|
||||||
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4details')), field: 'details', formatter: this.detailFormatter, widthGrow: 1, tooltip: false},
|
||||||
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4beurteilung')), field: 'beurteilung', formatter: this.beurteilungFormatter, widthGrow: 1, tooltip: false},
|
||||||
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4sem')), field: 'sem', formatter: this.centeredTextFormatter, widthGrow: 1},
|
||||||
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4stg')), field: 'stg', formatter: this.centeredTextFormatter, widthGrow: 1},
|
||||||
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4kontakt')), field: 'mail', formatter: this.mailFormatter, widthGrow: 1},
|
||||||
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4betreuer')), field: 'betreuer', formatter: this.centeredTextFormatter,widthGrow: 2},
|
||||||
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4projekttyp')), field: 'typ', formatter: this.centeredTextFormatter, widthGrow: 1},
|
||||||
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4titel')), field: 'titel', formatter: this.centeredTextFormatter, widthGrow: 8}
|
||||||
|
],
|
||||||
|
persistence: false,
|
||||||
|
},
|
||||||
|
abgabeTableEventHandlers: [{
|
||||||
|
event: "tableBuilt",
|
||||||
|
handler: async () => {
|
||||||
|
this.tableBuiltResolve()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
event: "cellClick",
|
||||||
|
handler: async (e, cell) => {
|
||||||
|
|
||||||
|
if(cell.getColumn().getField() === "details") {
|
||||||
|
const val = cell.getValue()
|
||||||
|
|
||||||
|
if(val.mode === 'detailTermine') {
|
||||||
|
this.setDetailComponent(cell.getValue())
|
||||||
|
} else if (val.mode === 'beurteilungDownload') {
|
||||||
|
const pdfExportLink = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id
|
||||||
|
// const pdfExportLink2 = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/lehre/projektbeurteilungDocumentExport.php?betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id
|
||||||
|
window.open(pdfExportLink, '_blank')
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (cell.getColumn().getField() === "beurteilung") {
|
||||||
|
const val = cell.getValue()
|
||||||
|
|
||||||
|
if(val != '-') window.open(val, '_blank')
|
||||||
|
}
|
||||||
|
e.stopPropagation()
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
dateDiffInDays(datumParam) {
|
|
||||||
let datum = datumParam
|
|
||||||
if(datumParam instanceof Date && !isNaN(datum.getTime()))
|
|
||||||
{
|
|
||||||
const year = datumParam.getFullYear();
|
|
||||||
const month = datumParam.getMonth() + 1; // getMonth() is 0-indexed
|
|
||||||
const day = datumParam.getDate();
|
|
||||||
const pad = (num) => String(num).padStart(2, '0');
|
|
||||||
datum = `${year}-${pad(month)}-${pad(day)}`
|
|
||||||
}
|
|
||||||
|
|
||||||
const dateToday = luxon.DateTime.now().startOf('day');
|
|
||||||
const dateDatum = luxon.DateTime.fromISO(datum).startOf('day');
|
|
||||||
const duration = dateDatum.diff(dateToday, 'days');
|
|
||||||
|
|
||||||
return duration.values.days;
|
|
||||||
},
|
|
||||||
getDateStyleClass(termin) {
|
|
||||||
const datum = new Date(termin.datum)
|
|
||||||
const abgabedatum = new Date(termin.abgabedatum)
|
|
||||||
|
|
||||||
termin.diffindays = this.dateDiffInDays(termin.datum)
|
|
||||||
|
|
||||||
const isLate = termin.abgabedatum && abgabedatum > datum;
|
|
||||||
|
|
||||||
// GRADE STATUS
|
|
||||||
if (termin.note) {
|
|
||||||
if(Number.isInteger(termin.note)) {
|
|
||||||
const opt = this.notenOptions.find(opt => opt.note == termin.note)
|
|
||||||
if(opt.positiv) return 'bestanden'
|
|
||||||
}
|
|
||||||
if (termin.note.positiv) return 'bestanden';
|
|
||||||
return 'nichtbestanden';
|
|
||||||
}
|
|
||||||
|
|
||||||
// ACTION REQUIRED FOR GRADE
|
|
||||||
if (termin.bezeichnung?.benotbar && datum < today) {
|
|
||||||
return 'beurteilungerforderlich';
|
|
||||||
}
|
|
||||||
|
|
||||||
// SUBMISSION STATUS
|
|
||||||
if (termin.upload_allowed) {
|
|
||||||
if (termin.abgabedatum) {
|
|
||||||
return isLate ? 'verspaetet' : 'abgegeben';
|
|
||||||
}
|
|
||||||
|
|
||||||
// no submission yet
|
|
||||||
if (datum < today) return 'verpasst';
|
|
||||||
if (termin.diffindays <= 12) return 'abzugeben';
|
|
||||||
return 'standard';
|
|
||||||
}
|
|
||||||
|
|
||||||
// GENERIC STATUS
|
|
||||||
return datum < today ? 'verpasst' : 'standard';
|
|
||||||
},
|
|
||||||
checkQualityGatesStrict(termine) {
|
|
||||||
let qgate1Passed = false
|
|
||||||
let qgate2Passed = false
|
|
||||||
|
|
||||||
termine.forEach(t => {
|
|
||||||
const noteOption = this.notenOptions?.find(opt => opt.note == t.note)
|
|
||||||
if(noteOption && noteOption.positiv) {
|
|
||||||
if(t.paabgabetyp_kurzbz == 'qualgate1') {
|
|
||||||
qgate1Passed = true
|
|
||||||
} else if(t.paabgabetyp_kurzbz == 'qualgate2') {
|
|
||||||
qgate2Passed = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
return qgate1Passed && qgate2Passed
|
|
||||||
},
|
|
||||||
checkQualityGatesOptional(termine) {
|
|
||||||
const qgate1found = termine.find(t => t.paabgabetyp_kurzbz == 'qualgate1')
|
|
||||||
const qgate2found = termine.find(t => t.paabgabetyp_kurzbz == 'qualgate2')
|
|
||||||
|
|
||||||
let qgate1positiv = true
|
|
||||||
if(qgate1found) {
|
|
||||||
qgate1positiv = false
|
|
||||||
|
|
||||||
termine.forEach(t => {
|
|
||||||
const noteOption = this.notenOptions?.find(opt => opt.note == t.note)
|
|
||||||
if(noteOption && noteOption.positiv) {
|
|
||||||
if (t.paabgabetyp_kurzbz == 'qualgate1') {
|
|
||||||
qgate1positiv = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
let qgate2positiv = true
|
|
||||||
if(qgate2found) {
|
|
||||||
qgate2positiv = false
|
|
||||||
|
|
||||||
termine.forEach(t => {
|
|
||||||
const noteOption = this.notenOptions?.find(opt => opt.note == t.note)
|
|
||||||
if(noteOption && noteOption.positiv) {
|
|
||||||
if (t.paabgabetyp_kurzbz == 'qualgate2') {
|
|
||||||
qgate2positiv = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return qgate1positiv && qgate2positiv
|
|
||||||
},
|
|
||||||
isPastDate(date) {
|
isPastDate(date) {
|
||||||
return new Date(date) < new Date(Date.now())
|
return new Date(date) < new Date(Date.now())
|
||||||
},
|
},
|
||||||
setDetailComponent(details){
|
setDetailComponent(details){
|
||||||
this.loading = true
|
|
||||||
this.loadAbgaben(details).then((res)=> {
|
this.loadAbgaben(details).then((res)=> {
|
||||||
const pa = this.projektarbeiten?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)
|
const pa = this.projektarbeiten?.retval?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)
|
||||||
pa.abgabetermine = res.data[0].retval
|
pa.abgabetermine = res.data[0].retval
|
||||||
|
|
||||||
const paIsBenotet = pa.note !== null
|
|
||||||
|
|
||||||
pa.abgabetermine.forEach(termin => {
|
pa.abgabetermine.forEach(termin => {
|
||||||
termin.file = []
|
termin.file = []
|
||||||
termin.allowedToUpload = false
|
termin.allowedToUpload = true
|
||||||
|
|
||||||
if(termin.paabgabetyp_kurzbz == 'end') {
|
// TODO: fixtermin logic?
|
||||||
// old assumed production logic when qgates are required
|
if(termin.bezeichnung == 'Endupload' && this.isPastDate(termin.datum)) {
|
||||||
// termin.allowedToUpload = !this.isPastDate(termin.datum) && this.checkQualityGatesStrict(pa.abgabetermine)
|
|
||||||
|
|
||||||
// new larifari we want qgates but they are optional fhtw mode
|
// termin.allowedToUpload = false
|
||||||
termin.allowedToUpload = !this.isPastDate(termin.datum) && this.checkQualityGatesOptional(pa.abgabetermine)
|
|
||||||
|
|
||||||
|
|
||||||
// development purposes
|
|
||||||
// termin.allowedToUpload = this.checkQualityGatesStrict(pa.abgabetermine)
|
|
||||||
// termin.allowedToUpload = true
|
|
||||||
|
|
||||||
} else if(termin.fixtermin) {
|
|
||||||
termin.allowedToUpload = !this.isPastDate(termin.datum)
|
|
||||||
} else {
|
} else {
|
||||||
// this could confuse people since we should dont show people this flag
|
// termin.allowedToUpload = true
|
||||||
termin.allowedToUpload = termin.upload_allowed
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// blocks client upload button if projektarbeitet is already beurteilt und thus further abgaben on any termin should be blocked
|
|
||||||
if(paIsBenotet) termin.allowedToUpload = false
|
|
||||||
|
|
||||||
|
|
||||||
termin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)
|
|
||||||
termin.dateStyle = this.getDateStyleClass(termin)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
pa.betreuer = this.buildBetreuer(pa)
|
pa.betreuer = this.buildBetreuer(pa)
|
||||||
pa.student_uid = this.student_uid
|
pa.student_uid = this.student_uid
|
||||||
|
|
||||||
this.selectedProjektarbeit = pa
|
this.selectedProjektarbeit = pa
|
||||||
|
|
||||||
this.$refs.modalContainerAbgabeDetail.show()
|
|
||||||
|
|
||||||
}).finally(()=>{this.loading=false})
|
this.$refs.verticalsplit.showBoth()
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
},
|
},
|
||||||
centeredTextFormatter(cell) {
|
centeredTextFormatter(cell) {
|
||||||
const val = cell.getValue()
|
const val = cell.getValue()
|
||||||
|
|
||||||
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%;">' +
|
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%">' +
|
||||||
'<p style="max-width: 100%; word-wrap: break-word; white-space: normal;">'+val+'</p></div>'
|
'<p style="max-width: 100%; word-wrap: break-word; white-space: normal;">'+val+'</p></div>'
|
||||||
},
|
},
|
||||||
detailFormatter(cell) {
|
detailFormatter(cell) {
|
||||||
const val = cell.getValue()
|
const val = cell.getValue()
|
||||||
|
|
||||||
if(val.mode === 'detailTermine') {
|
if(val.mode === 'detailTermine') {
|
||||||
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%;">' +
|
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%">' +
|
||||||
'<a><i class="fa fa-folder-open" style="color:#00649C"></i></a></div>'
|
'<a><i class="fa fa-folder-open" style="color:#00649C"></i></a></div>'
|
||||||
} else if (val.mode === 'beurteilungDownload') {
|
} else if (val.mode === 'beurteilungDownload') {
|
||||||
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%;">' +
|
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%">' +
|
||||||
'<a><i class="fa fa-file-pdf" style="color:#00649C"></i></a></div>'
|
'<a><i class="fa fa-file-pdf" style="color:#00649C"></i></a></div>'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mailFormatter(cell) {
|
mailFormatter(cell) {
|
||||||
const val = cell.getValue()
|
const val = cell.getValue()
|
||||||
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%;">' +
|
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%">' +
|
||||||
'<a href='+val+'><i class="fa fa-envelope" style="color:#00649C"></i></a></div>'
|
'<a href='+val+'><i class="fa fa-envelope" style="color:#00649C"></i></a></div>'
|
||||||
},
|
},
|
||||||
beurteilungFormatter(cell) {
|
beurteilungFormatter(cell) {
|
||||||
const val = cell.getValue()
|
const val = cell.getValue()
|
||||||
if(val) {
|
if(val) {
|
||||||
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%;">' +
|
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%">' +
|
||||||
'<a><i class="fa fa-file-pdf" style="color:#00649C"></i></a></div>'
|
'<a><i class="fa fa-file-pdf" style="color:#00649C"></i></a></div>'
|
||||||
} else return '-'
|
} else return '-'
|
||||||
},
|
},
|
||||||
buildMailToLink(projekt) {
|
tableResolve(resolve) {
|
||||||
// should always be "projekt.mitarbeiter_uid +'@'+ this.domain", built in backend
|
this.tableBuiltResolve = resolve
|
||||||
return 'mailto:' + projekt.email
|
},
|
||||||
|
buildMailToLink(abgabe) {
|
||||||
|
return 'mailto:' + abgabe.mitarbeiter_uid +'@'+ this.domain
|
||||||
},
|
},
|
||||||
buildBetreuer(abgabe) {
|
buildBetreuer(abgabe) {
|
||||||
return (abgabe.btitelpre ? abgabe.btitelpre + ' ' : '') + abgabe.bvorname + ' ' + abgabe.bnachname + (abgabe.btitelpost ? ' ' + abgabe.btitelpost : '')
|
return abgabe.betreuerart_beschreibung + ': ' + (abgabe.btitelpre ? abgabe.btitelpre + ' ' : '') + abgabe.bvorname + ' ' + abgabe.bnachname + (abgabe.btitelpost ? ' ' + abgabe.btitelpost : '')
|
||||||
},
|
},
|
||||||
async setupData(data){
|
setupData(data){
|
||||||
// this.projektarbeiten = data[0]
|
this.projektarbeiten = data[0]
|
||||||
const projektarbeiten = data[0] ?? null
|
this.domain = data[1]
|
||||||
if(!projektarbeiten) return
|
this.student_uid = data[2]
|
||||||
this.projektarbeiten = projektarbeiten.map(projekt => {
|
const d = data[0]?.retval?.map(projekt => {
|
||||||
let mode = 'detailTermine'
|
let mode = 'detailTermine'
|
||||||
|
|
||||||
|
if (projekt.babgeschickt || projekt.zweitbetreuer_abgeschickt) {
|
||||||
|
// mode = 'beurteilungDownload' // build dl link for both betreuer documents
|
||||||
|
projekt.beurteilungLink = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz='+projekt.betreuerart_kurzbz+'&projektarbeit_id='+projekt.projektarbeit_id+'&person_id=' + projekt.bperson_id
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...projekt,
|
|
||||||
details: {
|
details: {
|
||||||
student_uid: this.student_uid,
|
student_uid: this.student_uid,
|
||||||
projektarbeit_id: projekt.projektarbeit_id,
|
projektarbeit_id: projekt.projektarbeit_id,
|
||||||
@@ -257,8 +172,7 @@ export const AbgabetoolStudent = {
|
|||||||
betreuerart_kurzbz: projekt.betreuerart_kurzbz,
|
betreuerart_kurzbz: projekt.betreuerart_kurzbz,
|
||||||
mode
|
mode
|
||||||
},
|
},
|
||||||
beurteilung1: projekt.downloadLink1 ?? null,
|
beurteilung: projekt.beurteilungLink ?? null,
|
||||||
beurteilung2: projekt.downloadLink2 ?? null,
|
|
||||||
sem: projekt.studiensemester_kurzbz,
|
sem: projekt.studiensemester_kurzbz,
|
||||||
stg: projekt.kurzbzlang,
|
stg: projekt.kurzbzlang,
|
||||||
mail: this.buildMailToLink(projekt),
|
mail: this.buildMailToLink(projekt),
|
||||||
@@ -268,49 +182,43 @@ export const AbgabetoolStudent = {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
this.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns)
|
||||||
|
this.$refs.abgabeTable.tabulator.setData(d);
|
||||||
},
|
},
|
||||||
loadProjektarbeiten() {
|
loadProjektarbeiten() {
|
||||||
this.$api.call(ApiAbgabe.getStudentProjektarbeiten(this.student_uid))
|
this.$fhcApi.factory.lehre.getStudentProjektarbeiten(this.student_uid_prop || this.viewData?.uid || null)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
if(res?.data) this.setupData(res.data)
|
if(res?.data) this.setupData(res.data)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
loadAbgaben(details) {
|
loadAbgaben(details) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
this.$api.call(ApiAbgabe.getStudentProjektabgaben(details))
|
this.$fhcApi.factory.lehre.getStudentProjektabgaben(details)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
resolve(res)
|
resolve(res)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
handleUuidDefined(uuid) {
|
||||||
|
this.tabulatorUuid = uuid
|
||||||
|
},
|
||||||
|
calcMaxTableHeight() {
|
||||||
|
const tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''
|
||||||
|
const tableDataSet = document.getElementById('filterTableDataset' + tableID);
|
||||||
|
if(!tableDataSet) return
|
||||||
|
const rect = tableDataSet.getBoundingClientRect();
|
||||||
|
|
||||||
|
this.abgabeTableOptions.height = window.visualViewport.height - rect.top
|
||||||
|
this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)
|
||||||
|
},
|
||||||
async setupMounted() {
|
async setupMounted() {
|
||||||
|
this.tableBuiltPromise = new Promise(this.tableResolve)
|
||||||
|
await this.tableBuiltPromise
|
||||||
|
|
||||||
this.loadProjektarbeiten()
|
this.loadProjektarbeiten()
|
||||||
},
|
|
||||||
getAccTabHeaderForProjektarbeit(projektarbeit) {
|
this.$refs.verticalsplit.collapseBottom()
|
||||||
let title = ''
|
//this.calcMaxTableHeight()
|
||||||
|
|
||||||
title += projektarbeit.titel ?? this.$p.t('abgabetool/keinTitel')
|
|
||||||
|
|
||||||
return title
|
|
||||||
},
|
|
||||||
getMailLink(projektarbeit) {
|
|
||||||
if(projektarbeit.email) {
|
|
||||||
return 'mailto:'+projektarbeit.email
|
|
||||||
} else return ''
|
|
||||||
},
|
|
||||||
getNoteBezeichnung(projektarbeit) {
|
|
||||||
if(projektarbeit.note && this.notenOptions) {
|
|
||||||
const noteOpt = this.notenOptions.find(opt => opt.note == projektarbeit.note)
|
|
||||||
return noteOpt?.bezeichnung
|
|
||||||
} else {
|
|
||||||
return ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
handleDownloadBeurteilung1(projektarbeit) {
|
|
||||||
window.open(projektarbeit.beurteilung1)
|
|
||||||
},
|
|
||||||
handleDownloadBeurteilung2(projektarbeit) {
|
|
||||||
window.open(projektarbeit.beurteilung2)
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@@ -319,152 +227,37 @@ export const AbgabetoolStudent = {
|
|||||||
computed: {
|
computed: {
|
||||||
isViewMode() {
|
isViewMode() {
|
||||||
return this.student_uid !== this.viewData.uid
|
return this.student_uid !== this.viewData.uid
|
||||||
},
|
|
||||||
student_uid() {
|
|
||||||
return this.student_uid_prop || this.viewData?.uid || null
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async created() {
|
created() {
|
||||||
this.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])
|
|
||||||
this.phrasenPromise.then(()=> {this.phrasenResolved = true})
|
|
||||||
|
|
||||||
this.loading = true
|
|
||||||
//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API
|
|
||||||
await this.$api.call(ApiAbgabe.getNoten()).then(res => {
|
|
||||||
if(res.meta.status == 'success') {
|
|
||||||
this.notenOptions = res.data[0]
|
|
||||||
|
|
||||||
this.allowedNotenOptions = this.notenOptions.filter(
|
|
||||||
opt => res.data[1].includes(opt.note)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}).finally(() => {
|
|
||||||
this.loading = false
|
|
||||||
})
|
|
||||||
|
|
||||||
// fetch abgabetypen options
|
|
||||||
this.$api.call(ApiAbgabe.getPaAbgabetypen()).then(res => {
|
|
||||||
this.abgabeTypeOptions = res.data
|
|
||||||
}).catch(e => {
|
|
||||||
this.loading = false
|
|
||||||
})
|
|
||||||
|
|
||||||
// fetch config to avoid hard coded links
|
|
||||||
this.$api.call(ApiAbgabe.getConfigStudent()).then(res => {
|
|
||||||
this.moodle_link = res.data?.moodle_link
|
|
||||||
}).catch(e => {
|
|
||||||
this.loading = false
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.setupMounted()
|
this.setupMounted()
|
||||||
},
|
},
|
||||||
template: `
|
template: `
|
||||||
<template v-if="phrasenResolved">
|
<vertical-split ref="verticalsplit">
|
||||||
<FhcOverlay :active="loading"></FhcOverlay>
|
<template #top>
|
||||||
|
<h2>{{$p.t('abgabetool/abgabetoolTitle')}}</h2>
|
||||||
<bs-modal ref="modalContainerAbgabeDetail" class="bootstrap-prompt"
|
<hr>
|
||||||
dialogClass="modal-xl" :allowFullscreenExpand="true">
|
|
||||||
<template v-slot:title>
|
|
||||||
<div>
|
|
||||||
{{$capitalize( $p.t('abgabetool/c4abgabeStudentDetailTitle') )}}
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<template v-slot:default>
|
|
||||||
<AbgabeDetail :projektarbeit="selectedProjektarbeit"></AbgabeDetail>
|
|
||||||
</template>
|
|
||||||
</bs-modal>
|
|
||||||
|
|
||||||
<h2>{{$capitalize( $p.t('abgabetool/abgabetoolTitle') )}}</h2>
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
<div v-if="projektarbeiten === null">
|
|
||||||
{{$capitalize( $p.t('abgabetool/c4abgabeStudentNoProjectsFound') )}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<Accordion :multiple="true" :activeIndex="activeTabIndex">
|
|
||||||
<template v-for="projektarbeit in projektarbeiten">
|
|
||||||
<AccordionTab>
|
|
||||||
|
|
||||||
<template #header>
|
<core-filter-cmpt
|
||||||
<div class="d-flex row w-100">
|
@uuidDefined="handleUuidDefined"
|
||||||
<div class="text-start" :class="projektarbeit.note != null ? 'col-6' : 'col-12'">
|
:title="''"
|
||||||
<span>{{getAccTabHeaderForProjektarbeit(projektarbeit)}}</span>
|
ref="abgabeTable"
|
||||||
</div>
|
:tabulator-options="abgabeTableOptions"
|
||||||
<div class="col-6 text-end">
|
:tabulator-events="abgabeTableEventHandlers"
|
||||||
<span>{{getNoteBezeichnung(projektarbeit)}}</span>
|
tableOnly
|
||||||
</div>
|
:sideMenu="false"
|
||||||
</div>
|
/>
|
||||||
</template>
|
|
||||||
|
</template>
|
||||||
<div class="row">
|
<template #bottom>
|
||||||
<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t('abgabetool/c4details') )}}</div>
|
<div v-show="selectedProjektarbeit">
|
||||||
<div class="col-8 col-md-9">
|
<AbgabeDetail :viewMode="isViewMode" :projektarbeit="selectedProjektarbeit"></AbgabeDetail>
|
||||||
<button @click="setDetailComponent(projektarbeit.details)" class="btn btn-primary">
|
</div>
|
||||||
{{$capitalize( $p.t('abgabetool/c4projektdetailsOeffnen') )}} <a><i class="fa fa-folder-open"></i></a>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-2">
|
|
||||||
<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t('abgabetool/c4beurteilung') )}}</div>
|
|
||||||
<div class="col-8 col-md-9">
|
|
||||||
<button v-if="projektarbeit.beurteilung1" @click="handleDownloadBeurteilung1(projektarbeit)" class="btn btn-primary">
|
|
||||||
<a> {{$capitalize( $p.t('abgabetool/c4downloadBeurteilungErstbetreuer') )}} <i class="fa fa-file-pdf" style="margin-left:4px; cursor: pointer;"></i></a>
|
|
||||||
</button>
|
|
||||||
<a v-else>{{$capitalize( $p.t('abgabetool/c4nobeurteilungVorhanden') )}}</a>
|
|
||||||
<button v-if="projektarbeit.beurteilung2" @click="handleDownloadBeurteilung2(projektarbeit)" class="btn btn-primary" style="margin-left: 4px;">
|
|
||||||
<a> {{$capitalize( $p.t('abgabetool/c4downloadBeurteilungZweitbetreuer') )}} <i class="fa fa-file-pdf" style="margin-left:4px; cursor: pointer;"></i></a>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-2">
|
|
||||||
<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t('abgabetool/c4sem') )}}</div>
|
|
||||||
<div class="col-8 col-md-9">
|
|
||||||
{{ projektarbeit.sem }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-2">
|
|
||||||
<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t('abgabetool/c4stg') )}}</div>
|
|
||||||
<div class="col-8 col-md-9">
|
|
||||||
<div class="col-1 d-flex justify-content-start align-items-start">
|
|
||||||
{{ projektarbeit.stg }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-2">
|
|
||||||
<div class="col-4 col-md-3 fw-bold">{{ projektarbeit?.betreuerart_kurzbz ? $capitalize( $p.t('abgabetool/c4betrart' + projektarbeit.betreuerart_kurzbz) ) : $capitalize( $p.t('abgabetool/c4betreuer') ) }}</div>
|
|
||||||
<div class="col-8 col-md-9">
|
|
||||||
{{ projektarbeit.betreuerart_kurzbz ? projektarbeit.betreuer : '' }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-2">
|
|
||||||
<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t('abgabetool/c4betreuerEmailKontakt') )}}</div>
|
|
||||||
<div class="col-8 col-md-9">
|
|
||||||
<a :href="getMailLink(projektarbeit)"><i class="fa fa-envelope" style="color:#00649C"></i></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div v-if="projektarbeit.zweitbetreuer_person_id || projektarbeit.zweitbetreuer" class="row mt-2">
|
|
||||||
<div class="col-4 col-md-3 fw-bold">{{ projektarbeit.zweitbetreuer_betreuerart_kurzbz ? $p.t('abgabetool/c4betrart' + projektarbeit.zweitbetreuer_betreuerart_kurzbz) : '' }}</div>
|
|
||||||
<div class="col-8 col-md-9">
|
|
||||||
{{ projektarbeit.zweitbetreuer?.first }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-2">
|
|
||||||
<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t('abgabetool/c4projekttyp') )}}</div>
|
|
||||||
<div class="col-8 col-md-9">
|
|
||||||
{{ projektarbeit.projekttypbezeichnung }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-2">
|
|
||||||
<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t('abgabetool/c4titel') )}}</div>
|
|
||||||
<div class="col-8 col-md-9">
|
|
||||||
{{ projektarbeit.titel }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</AccordionTab>
|
|
||||||
</template>
|
</template>
|
||||||
</Accordion>
|
</vertical-split>
|
||||||
</template>
|
|
||||||
`,
|
`,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
|
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
|
||||||
import ApiAbgabe from '../../../api/factory/abgabe.js'
|
|
||||||
|
|
||||||
export const DeadlineOverview = {
|
export const DeadlineOverview = {
|
||||||
name: "DeadlineOverview",
|
name: "DeadlineOverview",
|
||||||
@@ -26,21 +25,19 @@ export const DeadlineOverview = {
|
|||||||
tabulatorUuid: Vue.ref(0),
|
tabulatorUuid: Vue.ref(0),
|
||||||
tableBuiltResolve: null,
|
tableBuiltResolve: null,
|
||||||
tableBuiltPromise: null,
|
tableBuiltPromise: null,
|
||||||
phrasenPromise: null,
|
|
||||||
phrasenResolved: false,
|
|
||||||
deadlineTableOptions: {
|
deadlineTableOptions: {
|
||||||
height: 700,
|
height: 700,
|
||||||
index: 'projektarbeit_id',
|
index: 'projektarbeit_id',
|
||||||
layout: 'fitColumns',
|
layout: 'fitColumns',
|
||||||
placeholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),
|
placeholder: this.$p.t('global/noDataAvailable'),
|
||||||
columns: [
|
columns: [
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zieldatum'))), field: 'datum', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4zieldatum')), field: 'datum', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4fixterminv4'))), field: 'fixterminstring', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4fixtermin')), field: 'fixterminstring', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabetyp'))), field: 'typ_bezeichnung', formatter: this.centeredTextFormatter, widthGrow: 1},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4abgabetyp')), field: 'typ_bezeichnung', formatter: this.centeredTextFormatter, widthGrow: 1},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabekurzbz'))), field: 'kurzbz', formatter: this.centeredTextFormatter, widthGrow: 3},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4abgabekurzbz')), field: 'kurzbz', formatter: this.centeredTextFormatter, widthGrow: 3},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('person/studentIn'))), field: 'student', formatter: this.centeredTextFormatter, widthGrow: 2},
|
{title: Vue.computed(() => this.$p.t('person/studentIn')), field: 'student', formatter: this.centeredTextFormatter, widthGrow: 2},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', formatter: this.centeredTextFormatter,widthGrow: 1},
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4stg')), field: 'stg', formatter: this.centeredTextFormatter,widthGrow: 1},
|
||||||
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'semester', formatter: this.centeredTextFormatter, widthGrow: 1}
|
{title: Vue.computed(() => this.$p.t('abgabetool/c4sem')), field: 'semester', formatter: this.centeredTextFormatter, widthGrow: 1}
|
||||||
],
|
],
|
||||||
persistence: false,
|
persistence: false,
|
||||||
},
|
},
|
||||||
@@ -87,7 +84,7 @@ export const DeadlineOverview = {
|
|||||||
this.tableBuiltResolve = resolve
|
this.tableBuiltResolve = resolve
|
||||||
},
|
},
|
||||||
loadDeadlines() {
|
loadDeadlines() {
|
||||||
this.$api.call(ApiAbgabe.fetchDeadlines(this.person_uid_prop ?? null))
|
this.$fhcApi.factory.lehre.fetchDeadlines(this.person_uid_prop ?? null)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
if(res?.data) this.setupData(res.data)
|
if(res?.data) this.setupData(res.data)
|
||||||
})
|
})
|
||||||
@@ -112,7 +109,7 @@ export const DeadlineOverview = {
|
|||||||
if(!tableDataSet) return
|
if(!tableDataSet) return
|
||||||
const rect = tableDataSet.getBoundingClientRect();
|
const rect = tableDataSet.getBoundingClientRect();
|
||||||
|
|
||||||
this.deadlineTableOptions.height = window.visualViewport.height - rect.top - 30
|
this.deadlineTableOptions.height = window.visualViewport.height - rect.top
|
||||||
this.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)
|
this.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)
|
||||||
},
|
},
|
||||||
async setupMounted() {
|
async setupMounted() {
|
||||||
@@ -130,8 +127,7 @@ export const DeadlineOverview = {
|
|||||||
|
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])
|
|
||||||
this.phrasenPromise.then(()=> {this.phrasenResolved = true})
|
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.setupMounted()
|
this.setupMounted()
|
||||||
|
|||||||
@@ -1,83 +0,0 @@
|
|||||||
export const AbgabeterminStatusLegende = {
|
|
||||||
name: 'AbgabeterminStatusLegende',
|
|
||||||
template: `
|
|
||||||
<div class="text-center">
|
|
||||||
<div class="col" style="width: 80%; margin-left: 12px;">
|
|
||||||
|
|
||||||
<div class="row" style="margin-bottom: 2px">
|
|
||||||
<div class="col-auto verspaetet-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">
|
|
||||||
<i class="fa-solid fa-triangle-exclamation"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto" style="display: flex; align-items: center;">
|
|
||||||
<h5>{{ $capitalize($p.t('abgabetool/c4tooltipVerspaetet')) }}</h5>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row" style="margin-bottom: 2px">
|
|
||||||
<div class="col-auto verpasst-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">
|
|
||||||
<i class="fa-solid fa-calendar-xmark"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto" style="display: flex; align-items: center;">
|
|
||||||
<h5>{{ $capitalize($p.t('abgabetool/c4tooltipVerpasst')) }}</h5>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row" style="margin-bottom: 2px">
|
|
||||||
<div class="col-auto abzugeben-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">
|
|
||||||
<i class="fa-solid fa-hourglass-half"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto" style="display: flex; align-items: center;">
|
|
||||||
<h5>{{ $capitalize($p.t('abgabetool/c4tooltipAbzugeben')) }}</h5>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row" style="margin-bottom: 2px">
|
|
||||||
<div class="col-auto standard-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">
|
|
||||||
<i class="fa-solid fa-clock"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto" style="display: flex; align-items: center;">
|
|
||||||
<h5>{{ $capitalize($p.t('abgabetool/c4tooltipStandardv2')) }}</h5>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row" style="margin-bottom: 2px">
|
|
||||||
<div class="col-auto abgegeben-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">
|
|
||||||
<i class="fa-solid fa-paperclip"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto" style="display: flex; align-items: center;">
|
|
||||||
<h5>{{ $capitalize($p.t('abgabetool/c4tooltipAbgegeben')) }}</h5>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row" style="margin-bottom: 2px">
|
|
||||||
<div class="col-auto beurteilungerforderlich-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">
|
|
||||||
<i class="fa-solid fa-list-check"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto" style="display: flex; align-items: center;">
|
|
||||||
<h5>{{ $capitalize($p.t('abgabetool/c4tooltipBeurteilungerforderlich')) }}</h5>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row" style="margin-bottom: 2px">
|
|
||||||
<div class="col-auto bestanden-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">
|
|
||||||
<i class="fa-solid fa-check"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto" style="display: flex; align-items: center;">
|
|
||||||
<h5>{{ $capitalize($p.t('abgabetool/c4tooltipBestanden')) }}</h5>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row" style="margin-bottom: 2px">
|
|
||||||
<div class="col-auto nichtbestanden-header" style="height: 36px; width:36px; padding: 0px; display: flex; align-items: center; justify-content: center;">
|
|
||||||
<i class="fa-solid fa-circle-exclamation"></i>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto" style="display: flex; align-items: center;">
|
|
||||||
<h5>{{ $capitalize($p.t('abgabetool/c4tooltipNichtBestanden')) }}</h5>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
`
|
|
||||||
};
|
|
||||||
export default AbgabeterminStatusLegende;
|
|
||||||
@@ -3,7 +3,6 @@ import FhcSearchbar from "../searchbar/searchbar.js";
|
|||||||
import CisSprachen from "./Sprachen.js"
|
import CisSprachen from "./Sprachen.js"
|
||||||
import ThemeSwitch from "./ThemeSwitch.js";
|
import ThemeSwitch from "./ThemeSwitch.js";
|
||||||
import ApiCisMenu from '../../api/factory/cis/menu.js';
|
import ApiCisMenu from '../../api/factory/cis/menu.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
CisMenuEntry,
|
CisMenuEntry,
|
||||||
|
|||||||
@@ -2,9 +2,10 @@ import BsModal from "../../Bootstrap/Modal.js";
|
|||||||
import LvMenu from "./LvMenu.js";
|
import LvMenu from "./LvMenu.js";
|
||||||
|
|
||||||
import ApiAddons from '../../../api/factory/addons.js';
|
import ApiAddons from '../../../api/factory/addons.js';
|
||||||
|
import ApiStudium from '../../../api/factory/studium.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: "LvUebersicht",
|
||||||
props:{
|
props:{
|
||||||
event:{
|
event:{
|
||||||
type:Object,
|
type:Object,
|
||||||
@@ -63,7 +64,7 @@ export default {
|
|||||||
|
|
||||||
// check lv evaluierung info
|
// check lv evaluierung info
|
||||||
if (this.studium_studiensemester) {
|
if (this.studium_studiensemester) {
|
||||||
this.$fhcApi.factory.studium.getLvEvaluierungInfo(this.studium_studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id)
|
this.$api.call(ApiStudium.getLvEvaluierungInfo(this.studium_studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id))
|
||||||
.then(data => data.data)
|
.then(data => data.data)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
this.lvEvaluierungMessage = res.message;
|
this.lvEvaluierungMessage = res.message;
|
||||||
@@ -72,7 +73,7 @@ export default {
|
|||||||
|
|
||||||
// check if the lv has lvplan entries for this studiensemester
|
// check if the lv has lvplan entries for this studiensemester
|
||||||
if (this.studiensemester && this.event) {
|
if (this.studiensemester && this.event) {
|
||||||
return this.$fhcApi.factory.studium.getLvPlanForStudiensemester(this.studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id)
|
this.$api.call(ApiStudium.getLvPlanForStudiensemester(this.studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id))
|
||||||
.then(data => data.data)
|
.then(data => data.data)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
if (Array.isArray(res) && res.length > 0) {
|
if (Array.isArray(res) && res.length > 0) {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ export default {
|
|||||||
this.event.lektor.slice(0, 3).map(lektor => lektor.kurzbz).join("\n")
|
this.event.lektor.slice(0, 3).map(lektor => lektor.kurzbz).join("\n")
|
||||||
+ "\n" + this.$p.t('lehre/weitereLektoren', [this.event.lektor.length - 3])
|
+ "\n" + this.$p.t('lehre/weitereLektoren', [this.event.lektor.length - 3])
|
||||||
].join(": "));
|
].join(": "));
|
||||||
} else {;
|
} else {
|
||||||
tooltipArray.push([
|
tooltipArray.push([
|
||||||
this.$p.t('lehre/lektor'),
|
this.$p.t('lehre/lektor'),
|
||||||
this.event.lektor.map(lektor => lektor.kurzbz).join("\n")
|
this.event.lektor.map(lektor => lektor.kurzbz).join("\n")
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import LvUebersicht from "../Mylv/LvUebersicht.js";
|
import LvUebersicht from "../Mylv/LvUebersicht.js";
|
||||||
|
import ApiStudium from '../../../api/factory/studium.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: "Studium",
|
||||||
data(){
|
data(){
|
||||||
return {
|
return {
|
||||||
studienSemester :[],
|
studienSemester :[],
|
||||||
@@ -97,28 +98,28 @@ export default {
|
|||||||
return value;
|
return value;
|
||||||
},
|
},
|
||||||
changeSelectedStudienSemester(studiensemester_kurzbz) {
|
changeSelectedStudienSemester(studiensemester_kurzbz) {
|
||||||
this.$fhcApi.factory.studium.getAllStudienSemester(studiensemester_kurzbz, this.selectedStudiengang, this.selectedSemester, this.selectedStudienordnung)
|
this.$api.call(ApiStudium.getAllStudienSemester(studiensemester_kurzbz, this.selectedStudiengang, this.selectedSemester, this.selectedStudienordnung))
|
||||||
.then(data => data.data)
|
.then(data => data.data)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
this.extractPropertyValues(res);
|
this.extractPropertyValues(res);
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
changeSelectedStudienGang(studiengang_kz) {
|
changeSelectedStudienGang(studiengang_kz) {
|
||||||
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, studiengang_kz, this.selectedSemester, this.selectedStudienordnung)
|
this.$api.call(ApiStudium.getAllStudienSemester(this.selectedStudiensemester, studiengang_kz, this.selectedSemester, this.selectedStudienordnung))
|
||||||
.then(data => data.data)
|
.then(data => data.data)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
this.extractPropertyValues(res);
|
this.extractPropertyValues(res);
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
changeSelectedSemester(semester) {
|
changeSelectedSemester(semester) {
|
||||||
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, semester, this.selectedStudienordnung)
|
this.$api.call(ApiStudium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, semester, this.selectedStudienordnung))
|
||||||
.then(data => data.data)
|
.then(data => data.data)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
this.extractPropertyValues(res);
|
this.extractPropertyValues(res);
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
changeSelectedStudienPlan(studienplan_id) {
|
changeSelectedStudienPlan(studienplan_id) {
|
||||||
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, this.selectedSemester, studienplan_id)
|
this.$api.call(ApiStudium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, this.selectedSemester, studienplan_id))
|
||||||
.then(data => data.data)
|
.then(data => data.data)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
this.extractPropertyValues(res);
|
this.extractPropertyValues(res);
|
||||||
@@ -256,8 +257,8 @@ export default {
|
|||||||
const studienordnung = JSON.parse(this.getDataFromLocalStorage("studienordnung")) ?? undefined;
|
const studienordnung = JSON.parse(this.getDataFromLocalStorage("studienordnung")) ?? undefined;
|
||||||
|
|
||||||
// only fetch default data if no data is stored in the local storage
|
// only fetch default data if no data is stored in the local storage
|
||||||
|
|
||||||
this.$fhcApi.factory.studium.getAllStudienSemester(studiensemester, studiengang, semester, studienordnung)
|
this.$api.call(ApiStudium.getAllStudienSemester(studiensemester, studiengang, semester, studienordnung))
|
||||||
.then(data => data.data)
|
.then(data => data.data)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
this.extractPropertyValues(res);
|
this.extractPropertyValues(res);
|
||||||
|
|||||||
@@ -151,6 +151,10 @@ export default {
|
|||||||
db: this.dashboard
|
db: this.dashboard
|
||||||
}
|
}
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
|
res.data.retval.forEach(widget => {
|
||||||
|
widget.arguments = JSON.parse(widget.arguments);
|
||||||
|
widget.setup = JSON.parse(widget.setup);
|
||||||
|
});
|
||||||
this.widgets = res.data.retval;
|
this.widgets = res.data.retval;
|
||||||
}).catch(err => console.error('ERROR:', err));
|
}).catch(err => console.error('ERROR:', err));
|
||||||
|
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ export default {
|
|||||||
},
|
},
|
||||||
async created() {
|
async created() {
|
||||||
this.widget = await CachedWidgetLoader.loadWidget(this.id);
|
this.widget = await CachedWidgetLoader.loadWidget(this.id);
|
||||||
let component = (await import(this.widget.setup.file)).default;
|
let component = (await import("../" + this.widget.setup.file)).default;
|
||||||
this.$options.components["widget" + this.widget.widget_id] = component;
|
this.$options.components["widget" + this.widget.widget_id] = component;
|
||||||
this.component = "widget" + this.widget.widget_id;
|
this.component = "widget" + this.widget.widget_id;
|
||||||
this.arguments = { ...this.widget.arguments, ...this.config };
|
this.arguments = { ...this.widget.arguments, ...this.config };
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default {
|
|||||||
<li class="form-upload-dms-item">
|
<li class="form-upload-dms-item">
|
||||||
<span class="col-auto"><i class="fa fa-file me-1"></i></span>
|
<span class="col-auto"><i class="fa fa-file me-1"></i></span>
|
||||||
<span class="col">{{ modelValue.name }}</span>
|
<span class="col">{{ modelValue.name }}</span>
|
||||||
<a v-if="preview" :href="preview" target="_blank" class="col-auto btn btn-outline-secondary btn-p-0 me-2">
|
<a v-if="preview" :href="preview" target="_blank" class="col-auto btn btn-outline-secondary btn-p-0 me-1">
|
||||||
<i class="fa fa-download"></i>
|
<i class="fa fa-download"></i>
|
||||||
</a>
|
</a>
|
||||||
<button class="col-auto btn btn-outline-secondary btn-p-0" @click="$emit('delete')">
|
<button class="col-auto btn btn-outline-secondary btn-p-0" @click="$emit('delete')">
|
||||||
|
|||||||
@@ -243,7 +243,6 @@ export default {
|
|||||||
title: this.$p.t('global', 'aktionen')
|
title: this.$p.t('global', 'aktionen')
|
||||||
});
|
});
|
||||||
*/
|
*/
|
||||||
this.$emit('tabulator_tablebuilt');
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ export default {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
tablebuilt: false,
|
|
||||||
isVisibleDiv: false,
|
isVisibleDiv: false,
|
||||||
messageId: null
|
messageId: null
|
||||||
}
|
}
|
||||||
@@ -140,10 +139,8 @@ export default {
|
|||||||
},
|
},
|
||||||
resetMessageId(){
|
resetMessageId(){
|
||||||
this.messageId = null;
|
this.messageId = null;
|
||||||
},
|
|
||||||
tableBuilt: function() {
|
|
||||||
this.tablebuilt = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
template: `
|
template: `
|
||||||
<div class="core-messages h-100 pb-3">
|
<div class="core-messages h-100 pb-3">
|
||||||
@@ -158,7 +155,6 @@ export default {
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
<message-modal
|
<message-modal
|
||||||
v-if="tablebuilt || id.length > 1"
|
|
||||||
ref="modalMsg"
|
ref="modalMsg"
|
||||||
:type-id="typeId"
|
:type-id="typeId"
|
||||||
:id="id"
|
:id="id"
|
||||||
@@ -170,9 +166,8 @@ export default {
|
|||||||
</message-modal>
|
</message-modal>
|
||||||
|
|
||||||
<!--in same page-->
|
<!--in same page-->
|
||||||
<div v-if="isVisibleDiv" class="overflow-auto m-3" style="max-height: 500px; border: 1px solid #ccc;">
|
<div v-show="isVisibleDiv" class="overflow-auto m-3" style="max-height: 500px; border: 1px solid #ccc;">
|
||||||
<form-only
|
<form-only
|
||||||
v-if="tablebuilt || id.length > 1"
|
|
||||||
ref="templateNewDivMessage"
|
ref="templateNewDivMessage"
|
||||||
:type-id="typeId"
|
:type-id="typeId"
|
||||||
:id="id"
|
:id="id"
|
||||||
@@ -192,7 +187,6 @@ export default {
|
|||||||
:openMode="openMode"
|
:openMode="openMode"
|
||||||
@newMessage="handleMessage"
|
@newMessage="handleMessage"
|
||||||
@replyToMessage="handleMessage"
|
@replyToMessage="handleMessage"
|
||||||
@tabulator_tablebuilt="tableBuilt"
|
|
||||||
>
|
>
|
||||||
</table-messages>
|
</table-messages>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ export default {
|
|||||||
|
|
||||||
let button = document.createElement('button');
|
let button = document.createElement('button');
|
||||||
button.className = 'btn btn-outline-secondary btn-action';
|
button.className = 'btn btn-outline-secondary btn-action';
|
||||||
button.title = this.$p.t('notiz', 'notiz_edit');
|
button.title = this.$p.t('ui', 'notiz_edit');
|
||||||
button.innerHTML = '<i class="fa fa-edit"></i>';
|
button.innerHTML = '<i class="fa fa-edit"></i>';
|
||||||
button.addEventListener(
|
button.addEventListener(
|
||||||
'click',
|
'click',
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
export const FhcOverlay = {
|
|
||||||
name: 'FhcOverlay',
|
|
||||||
props: {
|
|
||||||
active: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
template: `
|
|
||||||
<div v-show="active"
|
|
||||||
style="
|
|
||||||
position: fixed;
|
|
||||||
inset: 0;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
background: rgba(255,255,255,0.5);
|
|
||||||
z-index: 99999999999;
|
|
||||||
pointer-events: none;
|
|
||||||
">
|
|
||||||
<i class="fa-solid fa-spinner fa-pulse fa-5x"></i>
|
|
||||||
</div>
|
|
||||||
`
|
|
||||||
};
|
|
||||||
export default FhcOverlay;
|
|
||||||
@@ -40,7 +40,7 @@ export default {
|
|||||||
return this.$fhcAlert.alertError(this.$p.t('stv', 'error_combinePeople_samePerson'));
|
return this.$fhcAlert.alertError(this.$p.t('stv', 'error_combinePeople_samePerson'));
|
||||||
}
|
}
|
||||||
|
|
||||||
let linkCombinePeople = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'vilesci/stammdaten/personen_wartung.php?person_id_1=' + person1_id + '&person_id_2='+ person2_id;
|
let linkCombinePeople = this.cisRoot + 'vilesci/stammdaten/personen_wartung.php?person_id_1=' + person1_id + '&person_id_2='+ person2_id;
|
||||||
this.openLink(linkCombinePeople);
|
this.openLink(linkCombinePeople);
|
||||||
},
|
},
|
||||||
openLink(url) {
|
openLink(url) {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import { splitMailsHelper } from "../../../../helpers/EmailHelpers.js"
|
|
||||||
export default {
|
export default {
|
||||||
name: "Kontaktieren",
|
name: "Kontaktieren",
|
||||||
computed: {
|
computed: {
|
||||||
@@ -23,16 +22,60 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
async splitMails(mails, event) {
|
||||||
|
let splititem = ",";
|
||||||
|
let maillist = mails.join(splititem);
|
||||||
|
let mailto = "";
|
||||||
|
|
||||||
|
if (maillist.length > 2024)
|
||||||
|
{
|
||||||
|
if (await this.$fhcAlert.confirm({message: this.$p.t('stv', 'zuvieleEMails') }) === false)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let firstrun = true;
|
||||||
|
let useBcc = event?.ctrlKey || event?.metaKey;
|
||||||
|
while (maillist.length > 0)
|
||||||
|
{
|
||||||
|
if (maillist.length > 2024)
|
||||||
|
{
|
||||||
|
let splitposition = maillist.lastIndexOf(splititem, 1900);
|
||||||
|
mailto = maillist.substring(0, splitposition);
|
||||||
|
maillist = maillist.substring(splitposition + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mailto = maillist;
|
||||||
|
maillist = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
let mailLink = useBcc ? `mailto:?bcc=${mailto}` : `mailto:${mailto}`;
|
||||||
|
|
||||||
|
if (firstrun)
|
||||||
|
{
|
||||||
|
window.location.href = mailLink;
|
||||||
|
firstrun = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (await this.$fhcAlert.confirm({message: this.$p.t('stv', 'weitereEMail')}) === true)
|
||||||
|
{
|
||||||
|
window.location.href = mailLink;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
internMail(event) {
|
internMail(event) {
|
||||||
if (this.internMails.length)
|
if (this.internMails.length)
|
||||||
{
|
{
|
||||||
splitMailsHelper(this.privateMails, event, null, this.$fhcAlert, this.$p)
|
this.splitMails(this.internMails, event);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
privateMail(event) {
|
privateMail(event) {
|
||||||
if (this.privateMails.length)
|
if (this.privateMails.length)
|
||||||
{
|
{
|
||||||
splitMailsHelper(this.privateMails, event, null, this.$fhcAlert, this.$p)
|
this.splitMails(this.privateMails, event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -32,15 +32,15 @@ export default {
|
|||||||
},
|
},
|
||||||
hasZGVBakkPermission: {
|
hasZGVBakkPermission: {
|
||||||
from: 'hasZGVBakkPermission',
|
from: 'hasZGVBakkPermission',
|
||||||
default: []
|
default: false
|
||||||
},
|
},
|
||||||
hasZGVMasterPermission: {
|
hasZGVMasterPermission: {
|
||||||
from: 'hasZGVMasterPermission',
|
from: 'hasZGVMasterPermission',
|
||||||
default: []
|
default: false
|
||||||
},
|
},
|
||||||
hasZGVDoctorPermission: {
|
hasZGVDoctorPermission: {
|
||||||
from: 'hasZGVDoctorPermission',
|
from: 'hasZGVDoctorPermission',
|
||||||
default: []
|
default: false
|
||||||
},
|
},
|
||||||
hasBismeldenPermission: {
|
hasBismeldenPermission: {
|
||||||
from: 'hasBismeldenPermission',
|
from: 'hasBismeldenPermission',
|
||||||
@@ -89,15 +89,6 @@ export default {
|
|||||||
computed: {
|
computed: {
|
||||||
deltaLength() {
|
deltaLength() {
|
||||||
return Object.keys(this.deltaArray).length;
|
return Object.keys(this.deltaArray).length;
|
||||||
},
|
|
||||||
disableZgvBakk: function() {
|
|
||||||
return !this.hasZGVBakkPermission.includes(this.modelValue.studiengang_kz.toString());
|
|
||||||
},
|
|
||||||
disableZgvMaster: function() {
|
|
||||||
return !this.hasZGVMasterPermission.includes(this.modelValue.studiengang_kz.toString());
|
|
||||||
},
|
|
||||||
disableZgvDoctor: function() {
|
|
||||||
return !this.hasZGVDoctorPermission.includes(this.modelValue.studiengang_kz.toString());
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@@ -298,7 +289,7 @@ export default {
|
|||||||
dropdown
|
dropdown
|
||||||
name="zgv_code"
|
name="zgv_code"
|
||||||
@complete="filterZgvs"
|
@complete="filterZgvs"
|
||||||
:disabled="disableZgvBakk"
|
:disabled="!hasZGVBakkPermission"
|
||||||
>
|
>
|
||||||
<template #option="slotProps">
|
<template #option="slotProps">
|
||||||
<div
|
<div
|
||||||
@@ -317,6 +308,7 @@ export default {
|
|||||||
type="text"
|
type="text"
|
||||||
v-model="data.zgvort"
|
v-model="data.zgvort"
|
||||||
name="zgvort"
|
name="zgvort"
|
||||||
|
:disabled="!hasZGVBakkPermission"
|
||||||
>
|
>
|
||||||
</form-input>
|
</form-input>
|
||||||
<form-input
|
<form-input
|
||||||
@@ -333,6 +325,7 @@ export default {
|
|||||||
format="dd.MM.yyyy"
|
format="dd.MM.yyyy"
|
||||||
preview-format="dd.MM.yyyy"
|
preview-format="dd.MM.yyyy"
|
||||||
:teleport="true"
|
:teleport="true"
|
||||||
|
:disabled="!hasZGVBakkPermission"
|
||||||
>
|
>
|
||||||
</form-input>
|
</form-input>
|
||||||
<form-input
|
<form-input
|
||||||
@@ -342,6 +335,7 @@ export default {
|
|||||||
type="select"
|
type="select"
|
||||||
v-model="data.zgvnation"
|
v-model="data.zgvnation"
|
||||||
name="zgvnation"
|
name="zgvnation"
|
||||||
|
:disabled="!hasZGVBakkPermission"
|
||||||
>
|
>
|
||||||
<!-- TODO(chris): gesperrte nationen können nicht ausgewählt werden! Um das zu realisieren müsste man ein pseudo select machen -->
|
<!-- TODO(chris): gesperrte nationen können nicht ausgewählt werden! Um das zu realisieren müsste man ein pseudo select machen -->
|
||||||
<option value=""> </option>
|
<option value=""> </option>
|
||||||
@@ -362,7 +356,7 @@ export default {
|
|||||||
dropdown
|
dropdown
|
||||||
name="zgvmas_code"
|
name="zgvmas_code"
|
||||||
@complete="filterMasterZgvs"
|
@complete="filterMasterZgvs"
|
||||||
:disabled="disableZgvMaster"
|
:disabled="!hasZGVMasterPermission"
|
||||||
>
|
>
|
||||||
<template #option="slotProps">
|
<template #option="slotProps">
|
||||||
<div
|
<div
|
||||||
@@ -381,6 +375,7 @@ export default {
|
|||||||
type="text"
|
type="text"
|
||||||
v-model="data.zgvmaort"
|
v-model="data.zgvmaort"
|
||||||
name="zgvmaort"
|
name="zgvmaort"
|
||||||
|
:disabled="!hasZGVMasterPermission"
|
||||||
>
|
>
|
||||||
</form-input>
|
</form-input>
|
||||||
<form-input
|
<form-input
|
||||||
@@ -397,6 +392,7 @@ export default {
|
|||||||
format="dd.MM.yyyy"
|
format="dd.MM.yyyy"
|
||||||
preview-format="dd.MM.yyyy"
|
preview-format="dd.MM.yyyy"
|
||||||
:teleport="true"
|
:teleport="true"
|
||||||
|
:disabled="!hasZGVMasterPermission"
|
||||||
>
|
>
|
||||||
</form-input>
|
</form-input>
|
||||||
<form-input
|
<form-input
|
||||||
@@ -406,6 +402,7 @@ export default {
|
|||||||
type="select"
|
type="select"
|
||||||
v-model="data.zgvmanation"
|
v-model="data.zgvmanation"
|
||||||
name="zgvmanation"
|
name="zgvmanation"
|
||||||
|
:disabled="!hasZGVMasterPermission"
|
||||||
>
|
>
|
||||||
<!-- TODO(chris): gesperrte nationen können nicht ausgewählt werden! Um das zu realisieren müsste man ein pseudo select machen -->
|
<!-- TODO(chris): gesperrte nationen können nicht ausgewählt werden! Um das zu realisieren müsste man ein pseudo select machen -->
|
||||||
<option value=""> </option>
|
<option value=""> </option>
|
||||||
@@ -427,7 +424,7 @@ export default {
|
|||||||
dropdown
|
dropdown
|
||||||
name="zgvdoktor_code"
|
name="zgvdoktor_code"
|
||||||
@complete="filterDoktorZgvs"
|
@complete="filterDoktorZgvs"
|
||||||
:disabled="disableZgvDoctor"
|
:disabled="!hasZGVDoctorPermission"
|
||||||
>
|
>
|
||||||
<template #option="slotProps">
|
<template #option="slotProps">
|
||||||
<div
|
<div
|
||||||
@@ -446,6 +443,7 @@ export default {
|
|||||||
type="text"
|
type="text"
|
||||||
v-model="data.zgvdoktorort"
|
v-model="data.zgvdoktorort"
|
||||||
name="zgvdoktorort"
|
name="zgvdoktorort"
|
||||||
|
:disabled="!hasZGVDoctorPermission"
|
||||||
>
|
>
|
||||||
</form-input>
|
</form-input>
|
||||||
<form-input
|
<form-input
|
||||||
@@ -462,6 +460,7 @@ export default {
|
|||||||
format="dd.MM.yyyy"
|
format="dd.MM.yyyy"
|
||||||
preview-format="dd.MM.yyyy"
|
preview-format="dd.MM.yyyy"
|
||||||
:teleport="true"
|
:teleport="true"
|
||||||
|
:disabled="!hasZGVDoctorPermission"
|
||||||
>
|
>
|
||||||
</form-input>
|
</form-input>
|
||||||
<form-input
|
<form-input
|
||||||
@@ -471,6 +470,7 @@ export default {
|
|||||||
type="select"
|
type="select"
|
||||||
v-model="data.zgvdoktornation"
|
v-model="data.zgvdoktornation"
|
||||||
name="zgvdoktornation"
|
name="zgvdoktornation"
|
||||||
|
:disabled="!hasZGVDoctorPermission"
|
||||||
>
|
>
|
||||||
<!-- TODO(chris): gesperrte nationen können nicht ausgewählt werden! Um das zu realisieren müsste man ein pseudo select machen -->
|
<!-- TODO(chris): gesperrte nationen können nicht ausgewählt werden! Um das zu realisieren müsste man ein pseudo select machen -->
|
||||||
<option value=""> </option>
|
<option value=""> </option>
|
||||||
@@ -487,6 +487,7 @@ export default {
|
|||||||
type="checkbox"
|
type="checkbox"
|
||||||
v-model="data.zgv_erfuellt"
|
v-model="data.zgv_erfuellt"
|
||||||
name="zgv_erfuellt"
|
name="zgv_erfuellt"
|
||||||
|
:disabled="!hasZGVBakkPermission"
|
||||||
>
|
>
|
||||||
</form-input>
|
</form-input>
|
||||||
</div>
|
</div>
|
||||||
@@ -498,6 +499,7 @@ export default {
|
|||||||
type="checkbox"
|
type="checkbox"
|
||||||
v-model="data.zgvmas_erfuellt"
|
v-model="data.zgvmas_erfuellt"
|
||||||
name="zgvmas_erfuellt"
|
name="zgvmas_erfuellt"
|
||||||
|
:disabled="!hasZGVMasterPermission"
|
||||||
>
|
>
|
||||||
</form-input>
|
</form-input>
|
||||||
</div>
|
</div>
|
||||||
@@ -509,6 +511,7 @@ export default {
|
|||||||
type="checkbox"
|
type="checkbox"
|
||||||
v-model="data.zgvdoktor_erfuellt"
|
v-model="data.zgvdoktor_erfuellt"
|
||||||
name="zgvdoktor_erfuellt"
|
name="zgvdoktor_erfuellt"
|
||||||
|
:disabled="!hasZGVDoctorPermission"
|
||||||
>
|
>
|
||||||
</form-input>
|
</form-input>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -91,15 +91,7 @@ export default{
|
|||||||
layoutColumnsOnNewData: false,
|
layoutColumnsOnNewData: false,
|
||||||
height: 'auto',
|
height: 'auto',
|
||||||
index: 'pruefung_id',
|
index: 'pruefung_id',
|
||||||
persistenceID: 'stv-details-pruefung-list-2026012701',
|
persistenceID: 'stv-details-pruefung-list-2025112402'
|
||||||
persistence: {
|
|
||||||
sort: false,
|
|
||||||
columns: ["width", "visible", "frozen"],
|
|
||||||
filter: false,
|
|
||||||
headerFilter: false,
|
|
||||||
group: false,
|
|
||||||
page: false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
tabulatorEvents: [
|
tabulatorEvents: [
|
||||||
{
|
{
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user