mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 12:19:28 +00:00
Merge branch 'master' into feature-69180/AnwUID4CSV
This commit is contained in:
@@ -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' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js',
|
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js'),
|
||||||
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js',
|
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js'),
|
||||||
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/modalContent.js',
|
'modalContent' => absoluteJsImportUrl('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' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js',
|
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js'),
|
||||||
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/modalTitle.js',
|
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalTitle.js'),
|
||||||
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/modalContent.js',
|
'modalContent' => absoluteJsImportUrl('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' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/calendarEvent.js',
|
'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/calendarEvent.js'),
|
||||||
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalTitle.js',
|
'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalTitle.js'),
|
||||||
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalContent.js',
|
'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalContent.js'),
|
||||||
'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
|
'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<?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
|
||||||
|
|
||||||
|
$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';
|
||||||
@@ -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'] = 11087;
|
$config['cis_menu_root_content_id'] = 11091;
|
||||||
// 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,3 +7,6 @@ $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,6 +65,13 @@ $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,
|
||||||
'getStudentProjektarbeitAbgabeFile' => self::PERM_LOGGED,
|
'Mitarbeiter' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
|
||||||
'Mitarbeiter' => self::PERM_LOGGED,
|
'Assistenz' => array('basis/abgabe_assistenz:rw'),
|
||||||
'Student' => self::PERM_LOGGED,
|
'Student' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
|
||||||
'Deadlines' => self::PERM_LOGGED
|
'Deadlines' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw')
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,80 +29,69 @@ 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(),
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
|
if(defined('CIS4') && CIS4) {
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
|
||||||
|
} else {
|
||||||
|
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function Student()
|
public function Student($student_uid_prop = '')
|
||||||
{
|
{
|
||||||
|
|
||||||
$viewData = array(
|
$viewData = array(
|
||||||
'uid'=>getAuthUID(),
|
'uid'=>getAuthUID(),
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
|
if(defined('CIS4') && CIS4) {
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
|
||||||
|
} else {
|
||||||
|
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function Mitarbeiter()
|
public function Mitarbeiter()
|
||||||
{
|
{
|
||||||
|
|
||||||
$viewData = array(
|
$viewData = array(
|
||||||
'uid'=>getAuthUID(),
|
'uid'=>getAuthUID(),
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
|
if(defined('CIS4') && CIS4) {
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
|
||||||
|
} else {
|
||||||
|
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function Assistenz($stg_kz_prop = '')
|
||||||
|
{
|
||||||
|
|
||||||
|
$viewData = array(
|
||||||
|
'uid'=>getAuthUID(),
|
||||||
|
);
|
||||||
|
|
||||||
|
if(defined('CIS4') && CIS4) {
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolAssistenz']);
|
||||||
|
} else {
|
||||||
|
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function Deadlines()
|
public function Deadlines()
|
||||||
{
|
{
|
||||||
|
|
||||||
$viewData = array(
|
$viewData = array(
|
||||||
'uid'=>getAuthUID(),
|
'uid'=>getAuthUID(),
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
|
if(defined('CIS4') && CIS4) {
|
||||||
}
|
$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->terminateWithJsonError('Keine Zuordnung!');
|
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'DeadlinesOverview']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -38,34 +38,9 @@ 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');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
@@ -125,557 +100,5 @@ 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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,22 +47,22 @@ class Setup extends FHCAPI_Controller
|
|||||||
{
|
{
|
||||||
$tabs['details'] = array (
|
$tabs['details'] = array (
|
||||||
'title' => 'Details',
|
'title' => 'Details',
|
||||||
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Details.js',
|
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Details.js'),
|
||||||
'config' => []
|
'config' => []
|
||||||
);
|
);
|
||||||
$tabs['gruppen'] = array (
|
$tabs['gruppen'] = array (
|
||||||
'title' => 'Gruppen',
|
'title' => 'Gruppen',
|
||||||
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Gruppen.js',
|
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Gruppen.js'),
|
||||||
'config' => []
|
'config' => []
|
||||||
);
|
);
|
||||||
$tabs['lektor'] = array (
|
$tabs['lektor'] = array (
|
||||||
'title' => 'LektorInnenzuteilung',
|
'title' => 'LektorInnenzuteilung',
|
||||||
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Lektor.js',
|
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'),
|
||||||
'config' => []
|
'config' => []
|
||||||
);
|
);
|
||||||
$tabs['notiz'] = array (
|
$tabs['notiz'] = array (
|
||||||
'title' => 'Notizen',
|
'title' => 'Notizen',
|
||||||
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Notiz.js',
|
'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'),
|
||||||
'config' => []
|
'config' => []
|
||||||
);
|
);
|
||||||
$this->terminateWithSuccess($tabs);
|
$this->terminateWithSuccess($tabs);
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ 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
|
||||||
@@ -152,4 +153,17 @@ 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' => './Stv/Studentenverwaltung/Details/CombinePeople.js',
|
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/CombinePeople.js'),
|
||||||
'config' => $config['combinePeople']
|
'config' => $config['combinePeople']
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -636,7 +636,7 @@ class Status extends FHCAPI_Controller
|
|||||||
|
|
||||||
$this->load->library('PrestudentLib');
|
$this->load->library('PrestudentLib');
|
||||||
|
|
||||||
$this->prestudentlib->setFirstStudent(
|
$resFirstStudent = $this->prestudentlib->setFirstStudent(
|
||||||
$prestudent_id,
|
$prestudent_id,
|
||||||
$lastAufgenommener->studiensemester_kurzbz,
|
$lastAufgenommener->studiensemester_kurzbz,
|
||||||
$lastAufgenommener->ausbildungssemester,
|
$lastAufgenommener->ausbildungssemester,
|
||||||
@@ -645,9 +645,8 @@ class Status extends FHCAPI_Controller
|
|||||||
$this->input->post('statusgrund_id')
|
$this->input->post('statusgrund_id')
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->getDataOrTerminateWithError($result);
|
$this->db->trans_complete();
|
||||||
|
$this->getDataOrTerminateWithError($resFirstStudent);
|
||||||
$this->db->trans_commit();
|
|
||||||
|
|
||||||
return $this->outputJsonSuccess(true);
|
return $this->outputJsonSuccess(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,19 +33,26 @@ class Widget extends Auth_Controller
|
|||||||
return $this->outputJsonSuccess([
|
return $this->outputJsonSuccess([
|
||||||
"widget_id" => 0,
|
"widget_id" => 0,
|
||||||
"widget_kurzbz" => "notfound",
|
"widget_kurzbz" => "notfound",
|
||||||
"arguments" => json_encode([
|
"arguments" => [
|
||||||
"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" => json_encode([
|
"setup" => [
|
||||||
"name" => 'Widget Not Found',
|
"name" => 'Widget Not Found',
|
||||||
"file" => 'DashboardWidget/Default.js',
|
"file" => absoluteJsImportUrl('public/js/components/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()
|
||||||
@@ -56,7 +63,16 @@ class Widget extends Auth_Controller
|
|||||||
if (isError($result))
|
if (isError($result))
|
||||||
return $this->outputJsonError(getError($result));
|
return $this->outputJsonError(getError($result));
|
||||||
|
|
||||||
$this->outputJsonSuccess(getData($result) ?: []);
|
$tmpwidgets = getData($result) ?: [];
|
||||||
|
$widgets = array_map(function($widget) {
|
||||||
|
$widget->arguments = json_decode($widget->arguments);
|
||||||
|
$tmpsetup = json_decode($widget->setup);
|
||||||
|
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
||||||
|
$widget->setup = $tmpsetup;
|
||||||
|
return $widget;
|
||||||
|
}, $tmpwidgets);
|
||||||
|
|
||||||
|
$this->outputJsonSuccess($widgets);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getWidgetsForDashboard()
|
public function getWidgetsForDashboard()
|
||||||
@@ -71,7 +87,16 @@ class Widget extends Auth_Controller
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->outputJsonSuccess(getData($result) ?: []);
|
$tmpwidgets = getData($result) ?: [];
|
||||||
|
$widgets = array_map(function($widget) {
|
||||||
|
$widget->arguments = json_decode($widget->arguments);
|
||||||
|
$tmpsetup = json_decode($widget->setup);
|
||||||
|
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
||||||
|
$widget->setup = $tmpsetup;
|
||||||
|
return $widget;
|
||||||
|
}, $tmpwidgets);
|
||||||
|
|
||||||
|
$this->outputJsonSuccess($widgets);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setAllowed()
|
public function setAllowed()
|
||||||
|
|||||||
@@ -0,0 +1,621 @@
|
|||||||
|
<?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
|
// Security Begin
|
||||||
// ---------------------------------------------------------------
|
// ---------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -287,4 +287,31 @@ 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,7 +185,15 @@ function generateJSModulesInclude($JSModules)
|
|||||||
|
|
||||||
for ($tmpJSsCounter = 0; $tmpJSsCounter < count($tmpJSs); $tmpJSsCounter++)
|
for ($tmpJSsCounter = 0; $tmpJSsCounter < count($tmpJSs); $tmpJSsCounter++)
|
||||||
{
|
{
|
||||||
$toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL;
|
if($ci->config->item('use_fhcomplete_build_version_in_path'))
|
||||||
|
{
|
||||||
|
$relurl = preg_replace('#public/#', 'public/' . $ci->config->item('fhcomplete_build_version') . '/', $tmpJSs[$tmpJSsCounter]);
|
||||||
|
$toPrint = sprintf($jsInclude, base_url($relurl)).PHP_EOL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
if ($tmpJSsCounter > 0) $toPrint = "\t\t".$toPrint;
|
if ($tmpJSsCounter > 0) $toPrint = "\t\t".$toPrint;
|
||||||
|
|
||||||
@@ -250,6 +258,14 @@ function generateSkipLink($skipID)
|
|||||||
function absoluteJsImportUrl($relurl)
|
function absoluteJsImportUrl($relurl)
|
||||||
{
|
{
|
||||||
$ci =& get_instance();
|
$ci =& get_instance();
|
||||||
$url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version');
|
$ci->load->config('javascript');
|
||||||
|
if($ci->config->item('use_fhcomplete_build_version_in_path'))
|
||||||
|
{
|
||||||
|
$url = base_url(preg_replace('#^public/#', 'public/' . $ci->config->item('fhcomplete_build_version') . '/', $relurl));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version');
|
||||||
|
}
|
||||||
return $url;
|
return $url;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -723,7 +723,7 @@ class PrestudentLib
|
|||||||
|
|
||||||
|
|
||||||
// Generate Alias
|
// Generate Alias
|
||||||
$alias = '';
|
$alias = null;
|
||||||
if (!defined('GENERATE_ALIAS_STUDENT')
|
if (!defined('GENERATE_ALIAS_STUDENT')
|
||||||
|| GENERATE_ALIAS_STUDENT === true
|
|| GENERATE_ALIAS_STUDENT === true
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -279,4 +279,12 @@ 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,4 +11,12 @@ 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,5 +60,52 @@ 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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,4 +11,10 @@ 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 = "
|
$betreuerQuery = "SELECT * FROM (SELECT DISTINCT ON(projektarbeit_id)
|
||||||
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_projektbetreuer.note as note,
|
lehre.tbl_projektarbeit.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,9 +147,8 @@ 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,
|
||||||
(SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuer_person_id = tbl_projektbetreuer.person_id) AS babgeschickt,
|
lehre.tbl_projektarbeit.insertamum as insertamum,
|
||||||
(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
|
||||||
@@ -158,15 +157,17 @@ 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)
|
||||||
WHERE
|
LEFT JOIN lehre.tbl_note ON(lehre.tbl_projektarbeit.note = lehre.tbl_note.note)
|
||||||
tbl_projektarbeit.student_uid = ? AND
|
WHERE
|
||||||
|
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')";
|
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')) as base
|
||||||
|
ORDER BY insertamum DESC";
|
||||||
|
|
||||||
return $this->execReadOnlyQuery($betreuerQuery, array($studentUID));
|
return $this->execReadOnlyQuery($betreuerQuery, array($studentUID));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,8 +180,12 @@ 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)
|
||||||
@@ -190,16 +195,54 @@ 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 trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first,
|
$qry_betr="SELECT DISTINCT ON(public.tbl_person.person_id) trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first, anrede
|
||||||
public.tbl_mitarbeiter.mitarbeiter_uid, anrede
|
FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id)
|
||||||
FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id)
|
WHERE public.tbl_person.person_id= ?";
|
||||||
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 getProjektarbeitBenutzer($uid) {
|
public function getProjektarbeitBenutzer($uid) {
|
||||||
@@ -235,8 +278,8 @@ 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.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id,
|
||||||
tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
|
tbl_projektbetreuer.person_id as betreuer_person_id, tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
|
||||||
tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz
|
tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, public.tbl_student.student_uid
|
||||||
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)
|
||||||
@@ -273,7 +316,134 @@ 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
|
||||||
@@ -299,4 +469,17 @@ 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,4 +232,41 @@ 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,4 +243,20 @@ 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,37 +657,7 @@ 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);
|
||||||
@@ -712,7 +682,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;
|
||||||
}));
|
}));
|
||||||
$addFotoProperty($stg_ltg);
|
$this->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))
|
||||||
@@ -721,8 +691,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;
|
||||||
}));
|
}));
|
||||||
$addEmailProperty($gf_ltg);
|
$this->addEmailProperty($gf_ltg);
|
||||||
$addFotoProperty($gf_ltg);
|
$this->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))
|
||||||
@@ -731,8 +701,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;
|
||||||
}));
|
}));
|
||||||
$addEmailProperty($stv_ltg);
|
$this->addEmailProperty($stv_ltg);
|
||||||
$addFotoProperty($stv_ltg);
|
$this->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))
|
||||||
@@ -741,8 +711,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;
|
||||||
}));
|
}));
|
||||||
$addEmailProperty($ass);
|
$this->addEmailProperty($ass);
|
||||||
$addFotoProperty($ass);
|
$this->addFotoProperty($ass);
|
||||||
|
|
||||||
$hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv');
|
$hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv');
|
||||||
if (isError($hochschulvertr))
|
if (isError($hochschulvertr))
|
||||||
@@ -751,7 +721,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;
|
||||||
}));
|
}));
|
||||||
$addEmailProperty($hochschulvertr);
|
$this->addEmailProperty($hochschulvertr);
|
||||||
|
|
||||||
|
|
||||||
$stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz);
|
$stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz);
|
||||||
@@ -761,7 +731,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;
|
||||||
}));
|
}));
|
||||||
$addEmailProperty($stdv);
|
$this->addEmailProperty($stdv);
|
||||||
|
|
||||||
|
|
||||||
$jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester);
|
$jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester);
|
||||||
@@ -771,7 +741,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;
|
||||||
}));
|
}));
|
||||||
$addEmailProperty($jahrgangsvertr);
|
$this->addEmailProperty($jahrgangsvertr);
|
||||||
|
|
||||||
|
|
||||||
$result_object = new stdClass();
|
$result_object = new stdClass();
|
||||||
@@ -870,4 +840,72 @@ 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
<?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/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,19 +21,24 @@ $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/inputnumber/inputnumber.min.js',
|
|
||||||
'vendor/npm-asset/primevue/textarea/textarea.min.js',
|
|
||||||
'vendor/npm-asset/primevue/checkbox/checkbox.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/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">
|
<main id="cis-main" class="flex-grow-1 p-4 pt-2" style="min-width: 0;">
|
||||||
@@ -311,6 +311,7 @@ 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', []);
|
||||||
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|||||||
+169
-72
@@ -479,91 +479,181 @@ 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, vorname, nachname, wahlname, student_uid as uid, bezeichnung,
|
lehrveranstaltung_id,
|
||||||
gesamt as gesamtstunden, anwesend, nichtanwesend, trunc(100-(nichtanwesend/gesamt)*100,2) as prozent
|
vorname,
|
||||||
FROM
|
nachname,
|
||||||
(
|
wahlname,
|
||||||
SELECT
|
student_uid AS uid,
|
||||||
vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid,
|
bezeichnung,
|
||||||
count(stundenplan_id) as gesamt,
|
gesamt AS gesamtstunden,
|
||||||
case when anwesend.summe is null then 0 else anwesend.summe end as anwesend,
|
anwesend,
|
||||||
case when nichtanwesend.summe is null then 0 else nichtanwesend.summe end as nichtanwesend
|
nichtanwesend,
|
||||||
|
trunc(100-(nichtanwesend/gesamt)*100,2) AS prozent
|
||||||
|
|
||||||
|
FROM(
|
||||||
|
SELECT
|
||||||
|
vorname,
|
||||||
|
nachname,
|
||||||
|
wahlname,
|
||||||
|
lehrveranstaltung_id,
|
||||||
|
bezeichnung,
|
||||||
|
student_uid,
|
||||||
|
COUNT(stundenplan_id) AS gesamt,
|
||||||
|
CASE WHEN anwesend.summe IS NULL THEN 0 ELSE anwesend.summe END AS anwesend,
|
||||||
|
CASE WHEN nichtanwesend.summe IS NULL THEN 0 ELSE nichtanwesend.summe END AS nichtanwesend
|
||||||
|
|
||||||
FROM
|
FROM
|
||||||
(
|
(
|
||||||
SELECT
|
SELECT
|
||||||
sum(stundenplan_id) as stundenplan_id, datum, stunde, lehrveranstaltung_id,
|
SUM(stundenplan_id) AS stundenplan_id,
|
||||||
bezeichnung, studiensemester_kurzbz, studiengang_kz,
|
datum,
|
||||||
TRIM(
|
stunde,
|
||||||
CASE WHEN stp.gruppe_kurzbz is not null then stp.gruppe_kurzbz
|
lehrveranstaltung_id,
|
||||||
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
|
bezeichnung,
|
||||||
|
studiensemester_kurzbz,
|
||||||
|
studiengang_kz
|
||||||
|
|
||||||
FROM
|
FROM
|
||||||
lehre.tbl_lehrveranstaltung lv
|
lehre.tbl_lehrveranstaltung lv
|
||||||
JOIN lehre.tbl_lehreinheit le using (lehrveranstaltung_id)
|
JOIN
|
||||||
JOIN lehre.tbl_stundenplan stp using (lehreinheit_id,studiengang_kz)
|
lehre.tbl_lehreinheit le USING (lehrveranstaltung_id)
|
||||||
|
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 datum, stunde, lehrveranstaltung_id, bezeichnung, studiensemester_kurzbz, studiengang_kz, stp.gruppe_kurzbz, stp.semester, stp.verband, stp.gruppe
|
GROUP BY
|
||||||
|
datum,
|
||||||
|
stunde,
|
||||||
|
lehrveranstaltung_id,
|
||||||
|
bezeichnung,
|
||||||
|
studiensemester_kurzbz,
|
||||||
|
studiengang_kz,
|
||||||
|
stp.gruppe_kurzbz,
|
||||||
|
stp.semester,
|
||||||
|
stp.verband,
|
||||||
|
stp.gruppe
|
||||||
)x
|
)x
|
||||||
JOIN (
|
JOIN (
|
||||||
SELECT semester::text as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
|
|
||||||
FROM
|
|
||||||
public.tbl_studentlehrverband
|
|
||||||
WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
|
||||||
|
|
||||||
UNION
|
|
||||||
|
|
||||||
SELECT semester||verband as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
|
|
||||||
FROM
|
|
||||||
public.tbl_studentlehrverband
|
|
||||||
WHERE
|
|
||||||
studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
|
||||||
|
|
||||||
UNION
|
|
||||||
|
|
||||||
SELECT semester||verband||gruppe as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
|
|
||||||
FROM
|
|
||||||
public.tbl_studentlehrverband
|
|
||||||
WHERE
|
|
||||||
studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
|
||||||
|
|
||||||
UNION
|
|
||||||
|
|
||||||
SELECT gruppe_kurzbz as gruppe, public.tbl_benutzergruppe.studiensemester_kurzbz, uid as student_uid, studiengang_kz
|
|
||||||
FROM
|
|
||||||
public.tbl_benutzergruppe
|
|
||||||
JOIN
|
|
||||||
public.tbl_gruppe using (gruppe_kurzbz)
|
|
||||||
WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
|
||||||
|
|
||||||
)a using (gruppe, studiensemester_kurzbz, studiengang_kz)
|
|
||||||
JOIN public.tbl_benutzer b on b.uid = student_uid
|
|
||||||
JOIN public.tbl_person p using(person_id)
|
|
||||||
LEFT JOIN(
|
|
||||||
SELECT
|
SELECT
|
||||||
lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe
|
le.lehrveranstaltung_id,
|
||||||
FROM
|
slv.student_uid,
|
||||||
campus.tbl_anwesenheit a
|
le.studiensemester_kurzbz,
|
||||||
JOIN lehre.tbl_lehreinheit le using (lehreinheit_id)
|
st.prestudent_id
|
||||||
JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
|
|
||||||
WHERE
|
FROM
|
||||||
anwesend = true AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
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
|
GROUP BY
|
||||||
lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
|
le.lehrveranstaltung_id,
|
||||||
)anwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
|
slv.student_uid,
|
||||||
|
le.studiensemester_kurzbz,
|
||||||
|
st.prestudent_id
|
||||||
|
|
||||||
|
UNION
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
le.lehrveranstaltung_id,
|
||||||
|
bg.uid AS student_uid,
|
||||||
|
bg.studiensemester_kurzbz,
|
||||||
|
st.prestudent_id
|
||||||
|
|
||||||
|
FROM
|
||||||
|
public.tbl_benutzergruppe bg
|
||||||
|
JOIN
|
||||||
|
lehre.tbl_lehreinheitgruppe leg USING (gruppe_kurzbz)
|
||||||
|
JOIN
|
||||||
|
lehre.tbl_lehreinheit le USING(lehreinheit_id, studiensemester_kurzbz)
|
||||||
|
JOIN
|
||||||
|
public.tbl_student st ON bg.uid = st.student_uid
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
bg.studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||||
|
|
||||||
|
GROUP BY
|
||||||
|
le.lehrveranstaltung_id,
|
||||||
|
bg.uid,
|
||||||
|
bg.studiensemester_kurzbz,
|
||||||
|
st.prestudent_id
|
||||||
|
|
||||||
|
)a USING (lehrveranstaltung_id, studiensemester_kurzbz)
|
||||||
|
JOIN
|
||||||
|
public.tbl_benutzer b on b.uid = student_uid
|
||||||
|
JOIN
|
||||||
|
public.tbl_person p using(person_id)
|
||||||
LEFT JOIN(
|
LEFT JOIN(
|
||||||
SELECT lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe
|
SELECT
|
||||||
|
lehrveranstaltung_id,
|
||||||
|
studiensemester_kurzbz,
|
||||||
|
uid AS student_uid,
|
||||||
|
SUM(einheiten) AS summe
|
||||||
|
|
||||||
FROM
|
FROM
|
||||||
campus.tbl_anwesenheit a
|
campus.tbl_anwesenheit a
|
||||||
JOIN lehre.tbl_lehreinheit le using (lehreinheit_id)
|
JOIN
|
||||||
JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
|
lehre.tbl_lehreinheit le USING(lehreinheit_id)
|
||||||
|
JOIN
|
||||||
|
lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
|
||||||
|
|
||||||
WHERE
|
WHERE
|
||||||
anwesend = false AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
anwesend = true
|
||||||
|
AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||||
|
|
||||||
GROUP BY
|
GROUP BY
|
||||||
lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
|
lehrveranstaltung_id,
|
||||||
)nichtanwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
|
bezeichnung,
|
||||||
|
uid,
|
||||||
|
studiensemester_kurzbz
|
||||||
|
|
||||||
|
)anwesend USING(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
|
||||||
|
LEFT JOIN(
|
||||||
|
SELECT
|
||||||
|
lehrveranstaltung_id,
|
||||||
|
studiensemester_kurzbz,
|
||||||
|
uid AS student_uid,
|
||||||
|
SUM(einheiten) AS summe
|
||||||
|
|
||||||
|
FROM
|
||||||
|
campus.tbl_anwesenheit a
|
||||||
|
JOIN
|
||||||
|
lehre.tbl_lehreinheit le USING (lehreinheit_id)
|
||||||
|
JOIN
|
||||||
|
lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
anwesend = false
|
||||||
|
AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
|
||||||
|
|
||||||
|
GROUP BY
|
||||||
|
lehrveranstaltung_id,
|
||||||
|
bezeichnung,
|
||||||
|
uid,
|
||||||
|
studiensemester_kurzbz
|
||||||
|
)nichtanwesend USING(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
|
||||||
|
|
||||||
WHERE
|
WHERE
|
||||||
lehrveranstaltung_id > 0
|
lehrveranstaltung_id > 0
|
||||||
";
|
";
|
||||||
@@ -573,8 +663,15 @@ 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, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid, anwesend.summe, nichtanwesend.summe
|
vorname,
|
||||||
|
nachname,
|
||||||
|
wahlname,
|
||||||
|
lehrveranstaltung_id,
|
||||||
|
bezeichnung,
|
||||||
|
student_uid,
|
||||||
|
anwesend.summe,
|
||||||
|
nichtanwesend.summe
|
||||||
)m";
|
)m";
|
||||||
|
|
||||||
if($lehrveranstaltung_id != '')
|
if($lehrveranstaltung_id != '')
|
||||||
|
|||||||
@@ -168,6 +168,11 @@ 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;
|
||||||
|
|||||||
@@ -53,8 +53,10 @@ $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.</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/procotoringConfirmText']='<b>Ich stimme der digitalen Beaufsichtigung beim Online-Reihungstest (Proctoring) zu.</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. <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';
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<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,7 +407,6 @@ 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 {
|
||||||
@@ -856,3 +855,9 @@ 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);
|
||||||
|
}
|
||||||
@@ -0,0 +1,308 @@
|
|||||||
|
/* 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 */
|
||||||
|
}
|
||||||
@@ -38,15 +38,104 @@
|
|||||||
--fhc-blue-primary: #006095;
|
--fhc-blue-primary: #006095;
|
||||||
--fhc-blue-primary-highlight: #0086CB;
|
--fhc-blue-primary-highlight: #0086CB;
|
||||||
|
|
||||||
--fhc-red-10: #842029;
|
/* --- Green --- */
|
||||||
--fhc-red-20: #800000;
|
--fhc-green-5: rgb(240, 250, 240);
|
||||||
|
--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);
|
||||||
|
|
||||||
--fhc-green-10: #008000;
|
/* --- Red --- */
|
||||||
|
--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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,136 @@
|
|||||||
|
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" }}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -16,17 +16,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
studiengangInformation() {
|
getAllStudiensemesterAndAktOrNext() {
|
||||||
return {
|
return {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/api/frontend/v1/Studgang/getStudiengangInfo'
|
url: '/api/frontend/v1/Studiensemester/getStudiengangInfo'
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
getStudiengangByKz(studiengang_kz) {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz',
|
|
||||||
params: { studiengang_kz }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
@@ -1,5 +1,27 @@
|
|||||||
export default {
|
/**
|
||||||
|
* 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 {
|
||||||
|
getAllStudiensemesterAndAktOrNext() {
|
||||||
|
return {
|
||||||
|
method: 'get',
|
||||||
|
url: '/api/frontend/v1/organisation/Studiensemester/getAllStudiensemesterAndAktOrNext',
|
||||||
|
};
|
||||||
|
},
|
||||||
getAll(order = null, start = null)
|
getAll(order = null, start = null)
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
@@ -8,4 +30,4 @@ export default {
|
|||||||
params: { order, start }
|
params: { order, start }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
@@ -18,80 +18,5 @@ 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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
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');
|
||||||
@@ -14,6 +14,7 @@ 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";
|
||||||
|
|
||||||
@@ -56,6 +57,12 @@ 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',
|
||||||
@@ -228,13 +235,16 @@ const app = Vue.createApp({
|
|||||||
components: {},
|
components: {},
|
||||||
computed: {
|
computed: {
|
||||||
isMobile() {
|
isMobile() {
|
||||||
return /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
const smallScreen = window.matchMedia("(max-width: 767px)").matches;
|
||||||
|
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: {
|
||||||
@@ -273,6 +283,7 @@ 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)
|
||||||
@@ -313,6 +324,7 @@ 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);
|
||||||
|
|||||||
@@ -46,7 +46,8 @@ export default {
|
|||||||
"hiddenBsModal",
|
"hiddenBsModal",
|
||||||
"hidePreventedBsModal",
|
"hidePreventedBsModal",
|
||||||
"showBsModal",
|
"showBsModal",
|
||||||
"shownBsModal"
|
"shownBsModal",
|
||||||
|
"toggleFullscreen"
|
||||||
],
|
],
|
||||||
methods: {
|
methods: {
|
||||||
dispose() {
|
dispose() {
|
||||||
@@ -66,6 +67,7 @@ export default {
|
|||||||
},
|
},
|
||||||
toggleFullscreen() {
|
toggleFullscreen() {
|
||||||
this.fullscreen = !this.fullscreen
|
this.fullscreen = !this.fullscreen
|
||||||
|
this.$emit('toggleFullscreen')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
|||||||
@@ -0,0 +1,151 @@
|
|||||||
|
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,8 +1,9 @@
|
|||||||
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: {
|
||||||
@@ -12,8 +13,14 @@ export const AbgabeStudentDetail = {
|
|||||||
Checkbox: primevue.checkbox,
|
Checkbox: primevue.checkbox,
|
||||||
Dropdown: primevue.dropdown,
|
Dropdown: primevue.dropdown,
|
||||||
Textarea: primevue.textarea,
|
Textarea: primevue.textarea,
|
||||||
VueDatePicker
|
Accordion: primevue.accordion,
|
||||||
|
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,
|
||||||
@@ -26,6 +33,7 @@ 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,
|
||||||
@@ -41,16 +49,40 @@ export const AbgabeStudentDetail = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
validate: function(termin) {
|
getNoteBezeichnung(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.$p.t('global/warningChooseFile'));
|
this.$fhcAlert.alertWarning(this.$capitalize(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;
|
||||||
},
|
},
|
||||||
triggerEndupload() {
|
async triggerEndupload() {
|
||||||
if (!this.validate(this.enduploadTermin))
|
|
||||||
|
if (!await this.validate(this.enduploadTermin, true))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -63,7 +95,6 @@ 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'])
|
||||||
@@ -74,15 +105,21 @@ 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.$fhcApi.factory.lehre.postStudentProjektarbeitEndupload(formData)
|
this.loading = true
|
||||||
|
this.$api.call(ApiAbgabe.postStudentProjektarbeitEndupload(formData))
|
||||||
.then(res => {
|
.then(res => {
|
||||||
this.handleUploadRes(res)
|
this.handleUploadRes(res, this.enduploadTermin)
|
||||||
})
|
}).finally(()=> {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
|
||||||
this.$refs.modalContainerEnduploadZusatzdaten.hide()
|
this.$refs.modalContainerEnduploadZusatzdaten.hide()
|
||||||
},
|
},
|
||||||
downloadAbgabe(termin) {
|
downloadAbgabe(termin) {
|
||||||
this.$fhcApi.factory.lehre.getStudentProjektarbeitAbgabeFile(termin.paabgabe_id, this.projektarbeit.student_uid)
|
const url = `/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${termin.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;
|
||||||
|
|
||||||
|
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)
|
||||||
@@ -93,16 +130,17 @@ 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}`
|
||||||
},
|
},
|
||||||
upload(termin) {
|
async upload(termin) {
|
||||||
|
|
||||||
if (!this.validate(termin))
|
// only do this on endupload
|
||||||
|
if (! await this.validate(termin))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(termin.bezeichnung === 'Endupload') {
|
if(termin.bezeichnung?.paabgabetyp_kurzbz === 'end') {
|
||||||
// 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()
|
||||||
@@ -117,166 +155,401 @@ 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)
|
this.handleUploadRes(res, termin)
|
||||||
})
|
}).finally(()=> {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
handleUploadRes(res) {
|
handleUploadRes(res, termin) {
|
||||||
if(res.meta.status == "success") {
|
if(res.meta.status == "success") {
|
||||||
this.$fhcAlert.alertSuccess('File erfolgreich hochgeladen')
|
this.$fhcAlert.alertSuccess(this.$capitalize(this.$p.t('abgabetool/c4fileUploadSuccessv3')))
|
||||||
|
|
||||||
|
// 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('File upload error')
|
this.$fhcAlert.alertError(this.$capitalize(this.$p.t('abgabetool/c4fileUploadErrorv3')))
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
this.form.seitenanzahl = newVal.seitenanzahl ?? 1
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
getEid() {
|
getMoodleLink() {
|
||||||
return this.$p.t('abgabetool/c4eidesstattlicheErklaerung')
|
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() {
|
||||||
|
return this.$capitalize(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>{{$p.t('abgabetool/c4abgabeStudentenbereich')}}</h5>
|
<h5>{{$capitalize( $p.t('abgabetool/c4abgabeStudentenbereich') )}}</h5>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<p> {{projektarbeit?.betreuer}}</p>
|
<div class="col-8">
|
||||||
<p> {{projektarbeit?.titel}}</p>
|
<p> {{$capitalize( $p.t('person/student') ) }}: {{projektarbeit?.student}}</p>
|
||||||
</div>
|
<p> {{$capitalize( $p.t('abgabetool/c4titel') ) }}: {{projektarbeit?.titel}}</p>
|
||||||
<div id="uploadWrapper">
|
<p> {{$capitalize( $p.t('abgabetool/c4betreuer') ) }}: {{projektarbeit ? $p.t('abgabetool/c4betrart' + projektarbeit.betreuerart_kurzbz) + ' ' + projektarbeit.betreuer : ''}}</p>
|
||||||
<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="row" v-for="termin in projektarbeit.abgabetermine">
|
<div class="col-4">
|
||||||
<div class="col-1 d-flex justify-content-center align-items-start">
|
<p>{{ $p.t('abgabetool/c4checkoutStgMoodleInfos') }}
|
||||||
<i v-if="termin.fixtermin" class="fa-solid fa-2x fa-circle-check fhc-bullet-red"></i>
|
<a :href="getMoodleLink" target="_blank">Moodle</a>
|
||||||
<i v-else="" class="fa-solid fa-2x fa-circle-xmark fhc-bullet-green"></i>
|
</p>
|
||||||
<!--
|
|
||||||
<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 ref="modalContainerEnduploadZusatzdaten" class="bootstrap-prompt" dialogClass="modal-lg">
|
<bs-modal
|
||||||
|
ref="modalContainerEnduploadZusatzdaten"
|
||||||
|
class="bootstrap-prompt"
|
||||||
|
dialogClass="bordered-modal modal-lg">
|
||||||
<template v-slot:title>
|
<template v-slot:title>
|
||||||
<div>
|
<div>
|
||||||
{{$p.t('abgabetool/c4enduploadZusatzdaten')}}
|
{{$capitalize( $p.t('abgabetool/c4enduploadZusatzdaten') )}}
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-3 align-items-start">
|
<div class="row mb-3 align-items-start">
|
||||||
|
|
||||||
@@ -285,13 +558,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">Titel: {{ projektarbeit?.titel }}</p>
|
<p class="ml-4 mr-4">{{$capitalize( $p.t('abgabetool/c4titel') )}}: {{ 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">{{$p.t('abgabetool/c4Sprache')}}</div>
|
<div class="row">{{$capitalize( $p.t('abgabetool/c4Sprache') )}}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<Dropdown
|
<Dropdown
|
||||||
:style="{'width': '100%'}"
|
:style="{'width': '100%'}"
|
||||||
@@ -312,35 +585,37 @@ export const AbgabeStudentDetail = {
|
|||||||
<!-- -->
|
<!-- -->
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
<div class="row mb-3 align-items-start">
|
<div class="row mb-3 align-items-start">
|
||||||
<div class="row">{{$p.t('abgabetool/c4schlagwoerterGer')}}</div>
|
<div class="row">{{$capitalize( $p.t('abgabetool/c4schlagwoerterGer') )}}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<Textarea v-model="form.schlagwoerter"></Textarea>
|
<Textarea v-model="form.schlagwoerter" class="w-100"></Textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-3 align-items-start">
|
<div class="row mb-3 align-items-start">
|
||||||
<div class="row">{{$p.t('abgabetool/c4schlagwoerterEng')}}</div>
|
<div class="row">{{$capitalize( $p.t('abgabetool/c4schlagwoerterEng') )}}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<Textarea v-model="form.schlagwoerter_en"></Textarea>
|
<Textarea v-model="form.schlagwoerter_en" class="w-100"></Textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-3 align-items-start">
|
<div class="row mb-3 align-items-start">
|
||||||
<div class="row">{{$p.t('abgabetool/c4abstractGer')}}</div>
|
<div class="row">{{$capitalize( $p.t('abgabetool/c4abstractGer') )}}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<Textarea v-model="form.abstract" rows="10"></Textarea>
|
<Textarea v-model="form.abstract" rows="10" maxlength="5000" class="w-100"></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">{{$p.t('abgabetool/c4abstractEng')}}</div>
|
<div class="row">{{$capitalize( $p.t('abgabetool/c4abstractEng') )}}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<Textarea v-model="form.abstract_en" rows="10"></Textarea>
|
<Textarea v-model="form.abstract_en" rows="10" maxlength="5000" class="w-100"></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">{{$p.t('abgabetool/c4seitenanzahl')}}</div>
|
<div class="row">{{$capitalize( $p.t('abgabetool/c4seitenanzahl') )}}</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<InputNumber
|
<InputNumber
|
||||||
v-model="form.seitenanzahl"
|
v-model="form.seitenanzahl"
|
||||||
@@ -353,7 +628,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>{{ $p.t('abgabetool/c4gelesenUndAkzeptiert') }}</p></div>
|
<div class="col-2"><p>{{$capitalize( $p.t('abgabetool/c4gelesenUndAkzeptiert') )}}</p></div>
|
||||||
<div class="col-1">
|
<div class="col-1">
|
||||||
|
|
||||||
<Checkbox
|
<Checkbox
|
||||||
@@ -368,7 +643,8 @@ export const AbgabeStudentDetail = {
|
|||||||
|
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:footer>
|
<template v-slot:footer>
|
||||||
<button class="btn btn-primary" :disabled="getEnduploadErlaubt" @click="triggerEndupload">{{$p.t('ui/hochladen')}}</button>
|
<div v-show="!allowedToSaveZusatzdaten">{{ $p.t('abgabetool/c4zusatzdatenausfuellen') }}</div>
|
||||||
|
<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,8 +1,9 @@
|
|||||||
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",
|
||||||
@@ -10,10 +11,20 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
BsModal,
|
BsModal,
|
||||||
CoreFilterCmpt,
|
CoreFilterCmpt,
|
||||||
AbgabeDetail,
|
AbgabeDetail,
|
||||||
VerticalSplit,
|
Checkbox: primevue.checkbox,
|
||||||
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),
|
||||||
|
turnitin_link: Vue.computed(() => this.turnitin_link),
|
||||||
|
old_abgabe_beurteilung_link: Vue.computed(() => this.old_abgabe_beurteilung_link)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
viewData: {
|
viewData: {
|
||||||
@@ -21,44 +32,32 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
required: true,
|
required: true,
|
||||||
default: () => ({name: '', uid: ''}),
|
default: () => ({name: '', uid: ''}),
|
||||||
validator(value) {
|
validator(value) {
|
||||||
return value && value.name && value.uid
|
return value && value.uid // && value.name -> extensive viewData use only for cis4 onwards
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
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,
|
||||||
// TODO: fetch types
|
abgabeTypeOptions: null,
|
||||||
allAbgabeTypes: [
|
notenOptions: null,
|
||||||
{
|
allowedNotenOptions: 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),
|
||||||
@@ -72,34 +71,78 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
tableBuiltResolve: null,
|
tableBuiltResolve: null,
|
||||||
tableBuiltPromise: null,
|
tableBuiltPromise: null,
|
||||||
abgabeTableOptions: {
|
abgabeTableOptions: {
|
||||||
height: 700,
|
minHeight: 250,
|
||||||
index: 'projektarbeit_id',
|
index: 'projektarbeit_id',
|
||||||
layout: 'fitDataStretch',
|
layout: 'fitDataStretch',
|
||||||
placeholder: this.$p.t('global/noDataAvailable'),
|
placeholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),
|
||||||
selectable: true,
|
selectable: true,
|
||||||
selectableCheck: this.selectionCheck,
|
selectableCheck: this.selectionCheck,
|
||||||
|
rowHeight: 80,
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
formatter: 'rowSelection',
|
formatter: function (cell, formatterParams, onRendered) {
|
||||||
titleFormatter: 'rowSelection',
|
// create the built-in checkbox
|
||||||
titleFormatterParams: {
|
if(!cell.getRow().getData().selectable) return
|
||||||
rowRange: "active" // Only toggle the values of the active filtered rows
|
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;
|
||||||
},
|
},
|
||||||
hozAlign:"center",
|
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,
|
headerSort: false,
|
||||||
frozen: true,
|
formatterParams: {
|
||||||
width: 70
|
handleClick: this.selectHandler
|
||||||
|
},
|
||||||
|
titleFormatterParams: {
|
||||||
|
handleClick: this.selectAllHandler
|
||||||
|
},
|
||||||
|
width: 50,
|
||||||
|
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/c4details'))), field: 'details', formatter: this.detailFormatter, widthGrow: 1, tooltip: false, cssClass: 'sticky-col'},
|
||||||
{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/c4personenkennzeichen'))), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: 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/c4kontakt'))), field: 'mail', formatter: this.mailFormatter, widthGrow: 1, tooltip: false, visible: false},
|
||||||
{title: Vue.computed(() => this.$p.t('abgabetool/c4vorname')), field: 'vorname', formatter: this.centeredTextFormatter, widthGrow: 1},
|
{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/c4nachname')), field: 'nachname', 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/c4projekttyp')), field: 'projekttyp_kurzbz', 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/c4stg')), field: 'stg', formatter: this.centeredTextFormatter, widthGrow: 2},
|
{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/c4sem')), field: 'studiensemester_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},
|
{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/c4titel')), field: 'titel', formatter: this.centeredTextFormatter, maxWidth: 500, widthGrow: 8},
|
{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/c4betreuerart')), field: 'betreuerart_beschreibung',formatter: this.centeredTextFormatter, widthGrow: 8}
|
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4betreuerart'))), field: 'betreuerart_beschreibung',formatter: this.centeredTextFormatter, widthGrow: 1}
|
||||||
],
|
],
|
||||||
persistence: false,
|
persistence: false,
|
||||||
},
|
},
|
||||||
@@ -123,12 +166,54 @@ 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
|
||||||
},
|
},
|
||||||
@@ -176,17 +261,17 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
},
|
},
|
||||||
addSeries() {
|
addSeries() {
|
||||||
this.saving = true
|
this.saving = true
|
||||||
this.$fhcApi.factory.lehre.postSerientermin(
|
this.$api.call(ApiAbgabe.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.selectedData?.map(projekt => projekt.projektarbeit_id)
|
this.serienTermin.upload_allowed,
|
||||||
).then(res => {
|
this.selectedData?.map(projekt => projekt.projektarbeit_id),
|
||||||
|
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'))
|
||||||
}
|
}
|
||||||
@@ -210,44 +295,38 @@ 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
|
|
||||||
|
|
||||||
'paabgabe_id': -1,
|
const paIsBenotet = pa.note !== null
|
||||||
'projektarbeit_id': pa.projektarbeit_id,
|
|
||||||
'fixtermin': false,
|
|
||||||
'kurzbz': '',
|
|
||||||
'datum': new Date().toISOString().split('T')[0],
|
|
||||||
'paabgabetyp_kurzbz': '',
|
|
||||||
'bezeichnung': '',
|
|
||||||
'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 = {
|
termin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)
|
||||||
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()
|
||||||
@@ -276,7 +355,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%">' +
|
||||||
'<p style="max-width: 100%; word-wrap: break-word; white-space: normal;">'+val+'</p></div>'
|
'<a style="max-width: 100%; word-wrap: break-word; white-space: normal;">'+val+'</a></div>'
|
||||||
},
|
},
|
||||||
tableResolve(resolve) {
|
tableResolve(resolve) {
|
||||||
this.tableBuiltResolve = resolve
|
this.tableBuiltResolve = resolve
|
||||||
@@ -290,16 +369,13 @@ 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]
|
||||||
|
|
||||||
const d = data[0]?.retval?.map(projekt => {
|
this.tableData = data[0]?.retval?.map(projekt => {
|
||||||
let mode = 'detailTermine'
|
|
||||||
|
projekt.selectable = projekt.betreuerart_kurzbz !== 'Zweitbegutachter'
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...projekt,
|
...projekt,
|
||||||
@@ -316,12 +392,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(d);
|
this.$refs.abgabeTable.tabulator.setData(this.tableData);
|
||||||
},
|
},
|
||||||
loadProjektarbeiten(all = false, callback) {
|
loadProjektarbeiten(all = false, callback) {
|
||||||
this.$fhcApi.factory.lehre.getMitarbeiterProjektarbeiten(this.viewData?.uid ?? null, all)
|
this.$api.call(ApiAbgabe.getMitarbeiterProjektarbeiten(all))
|
||||||
.then(res => {
|
.then(res => {
|
||||||
if(res?.data) this.setupData(res.data)
|
if(res?.data) this.setupData(res.data)
|
||||||
}).finally(() => {
|
}).finally(() => {
|
||||||
@@ -332,7 +408,7 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
},
|
},
|
||||||
loadAbgaben(details) {
|
loadAbgaben(details) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
this.$fhcApi.factory.lehre.getStudentProjektabgaben(details)
|
this.$api.call(ApiAbgabe.getStudentProjektabgaben(details))
|
||||||
.then(res => {
|
.then(res => {
|
||||||
resolve(res)
|
resolve(res)
|
||||||
})
|
})
|
||||||
@@ -347,7 +423,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
|
this.abgabeTableOptions.height = window.visualViewport.height - rect.top - 80
|
||||||
this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)
|
this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)
|
||||||
},
|
},
|
||||||
async setupMounted() {
|
async setupMounted() {
|
||||||
@@ -356,68 +432,121 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
|
|
||||||
this.loadProjektarbeiten()
|
this.loadProjektarbeiten()
|
||||||
|
|
||||||
|
|
||||||
this.$refs.verticalsplit.collapseBottom()
|
|
||||||
this.calcMaxTableHeight()
|
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)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}).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="col-3 d-flex justify-content-center align-items-center">
|
<div class="row mt-2">
|
||||||
{{$p.t('abgabetool/c4zieldatum')}}
|
<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>
|
</div>
|
||||||
<div class="col-3 d-flex justify-content-center align-items-center">
|
<div class="col-12 col-md-9">
|
||||||
{{$p.t('abgabetool/c4abgabetyp')}}
|
<VueDatePicker
|
||||||
</div>
|
style="width: 95%;"
|
||||||
<div class="col-6 d-flex justify-content-center align-items-center">
|
v-model="serienTermin.datum"
|
||||||
{{$p.t('abgabetool/c4abgabekurzbz')}}
|
:clearable="false"
|
||||||
|
:enable-time-picker="false"
|
||||||
|
:format="formatDate"
|
||||||
|
:text-input="true"
|
||||||
|
auto-apply>
|
||||||
|
</VueDatePicker>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
|
||||||
<div class="col-3 d-flex justify-content-center align-items-center">
|
<div class="row mt-2">
|
||||||
<div>
|
<div class="col-12 col-md-3 fw-bold align-content-center">{{$capitalize( $p.t('abgabetool/c4upload_allowed') )}}</div>
|
||||||
<VueDatePicker
|
<div class="col-12 col-md-9">
|
||||||
style="width: 95%;"
|
<Checkbox
|
||||||
v-model="serienTermin.datum"
|
v-model="serienTermin.upload_allowed"
|
||||||
:clearable="false"
|
:binary="true"
|
||||||
:enable-time-picker="false"
|
:pt="{ root: { class: 'ml-auto' }}"
|
||||||
:format="formatDate"
|
>
|
||||||
:text-input="true"
|
</Checkbox>
|
||||||
auto-apply>
|
|
||||||
</VueDatePicker>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-3 d-flex justify-content-center align-items-center">
|
</div>
|
||||||
<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="allAbgabeTypes"
|
:options="getAllowedAbgabeTypeOptions"
|
||||||
:optionLabel="getOptionLabelAbgabetyp">
|
:optionLabel="getOptionLabelAbgabetyp">
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6 d-flex justify-content-center align-items-center">
|
</div>
|
||||||
<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>
|
||||||
|
|
||||||
@@ -427,56 +556,56 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
</template>
|
</template>
|
||||||
</bs-modal>
|
</bs-modal>
|
||||||
|
|
||||||
<vertical-split ref="verticalsplit">
|
<bs-modal ref="modalContainerAbgabeDetail" class="bootstrap-prompt"
|
||||||
|
dialogClass="modal-xl" :allowFullscreenExpand="true"
|
||||||
<template #top>
|
@toggle-fullscreen="handleToggleFullscreenDetail">
|
||||||
<h2>{{$p.t('abgabetool/abgabetoolTitle')}}</h2>
|
<template v-slot:title>
|
||||||
<hr>
|
<div>
|
||||||
<core-filter-cmpt
|
{{$p.t('abgabetool/c4abgabeMitarbeiterDetailTitle')}}
|
||||||
: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>
|
||||||
</vertical-split>
|
<template v-slot:default>
|
||||||
|
<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,13 +1,24 @@
|
|||||||
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
|
|
||||||
import AbgabeDetail from "./AbgabeStudentDetail.js";
|
import AbgabeDetail from "./AbgabeStudentDetail.js";
|
||||||
import VerticalSplit from "../../verticalsplit/verticalsplit.js";
|
import ApiAbgabe from '../../../api/factory/abgabe.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: {
|
||||||
CoreFilterCmpt,
|
Accordion: primevue.accordion,
|
||||||
|
AccordionTab: primevue.accordiontab,
|
||||||
|
BsModal,
|
||||||
AbgabeDetail,
|
AbgabeDetail,
|
||||||
VerticalSplit
|
FhcOverlay
|
||||||
|
},
|
||||||
|
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: {
|
||||||
@@ -24,147 +35,221 @@ export const AbgabetoolStudent = {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
tabulatorUuid: Vue.ref(0),
|
activeTabIndex: [0],
|
||||||
domain: '',
|
abgabeTypeOptions: null,
|
||||||
student_uid: null,
|
phrasenPromise: null,
|
||||||
|
phrasenResolved: false,
|
||||||
|
loading: false,
|
||||||
|
notenOptions: null,
|
||||||
detail: null,
|
detail: null,
|
||||||
projektarbeiten: null,
|
projektarbeiten: null,
|
||||||
selectedProjektarbeit: null,
|
selectedProjektarbeit: null,
|
||||||
tableBuiltResolve: null,
|
moodle_link: 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?.retval?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)
|
const pa = this.projektarbeiten?.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 = true
|
termin.allowedToUpload = false
|
||||||
|
|
||||||
// TODO: fixtermin logic?
|
if(termin.paabgabetyp_kurzbz == 'end') {
|
||||||
if(termin.bezeichnung == 'Endupload' && this.isPastDate(termin.datum)) {
|
// old assumed production logic when qgates are required
|
||||||
|
// termin.allowedToUpload = !this.isPastDate(termin.datum) && this.checkQualityGatesStrict(pa.abgabetermine)
|
||||||
|
|
||||||
// termin.allowedToUpload = false
|
// new larifari we want qgates but they are optional fhtw mode
|
||||||
} else {
|
termin.allowedToUpload = !this.isPastDate(termin.datum) && this.checkQualityGatesOptional(pa.abgabetermine)
|
||||||
|
|
||||||
|
|
||||||
|
// development purposes
|
||||||
|
// termin.allowedToUpload = this.checkQualityGatesStrict(pa.abgabetermine)
|
||||||
// termin.allowedToUpload = true
|
// termin.allowedToUpload = true
|
||||||
|
|
||||||
|
} else if(termin.fixtermin) {
|
||||||
|
termin.allowedToUpload = !this.isPastDate(termin.datum)
|
||||||
|
} else {
|
||||||
|
// this could confuse people since we should dont show people this flag
|
||||||
|
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()
|
||||||
|
|
||||||
this.$refs.verticalsplit.showBoth()
|
}).finally(()=>{this.loading=false})
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
},
|
},
|
||||||
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 '-'
|
||||||
},
|
},
|
||||||
tableResolve(resolve) {
|
buildMailToLink(projekt) {
|
||||||
this.tableBuiltResolve = resolve
|
// should always be "projekt.mitarbeiter_uid +'@'+ this.domain", built in backend
|
||||||
},
|
return 'mailto:' + projekt.email
|
||||||
buildMailToLink(abgabe) {
|
|
||||||
return 'mailto:' + abgabe.mitarbeiter_uid +'@'+ this.domain
|
|
||||||
},
|
},
|
||||||
buildBetreuer(abgabe) {
|
buildBetreuer(abgabe) {
|
||||||
return abgabe.betreuerart_beschreibung + ': ' + (abgabe.btitelpre ? abgabe.btitelpre + ' ' : '') + abgabe.bvorname + ' ' + abgabe.bnachname + (abgabe.btitelpost ? ' ' + abgabe.btitelpost : '')
|
return (abgabe.btitelpre ? abgabe.btitelpre + ' ' : '') + abgabe.bvorname + ' ' + abgabe.bnachname + (abgabe.btitelpost ? ' ' + abgabe.btitelpost : '')
|
||||||
},
|
},
|
||||||
setupData(data){
|
async setupData(data){
|
||||||
this.projektarbeiten = data[0]
|
// this.projektarbeiten = data[0]
|
||||||
this.domain = data[1]
|
const projektarbeiten = data[0] ?? null
|
||||||
this.student_uid = data[2]
|
if(!projektarbeiten) return
|
||||||
const d = data[0]?.retval?.map(projekt => {
|
this.projektarbeiten = projektarbeiten.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,
|
||||||
@@ -172,7 +257,8 @@ export const AbgabetoolStudent = {
|
|||||||
betreuerart_kurzbz: projekt.betreuerart_kurzbz,
|
betreuerart_kurzbz: projekt.betreuerart_kurzbz,
|
||||||
mode
|
mode
|
||||||
},
|
},
|
||||||
beurteilung: projekt.beurteilungLink ?? null,
|
beurteilung1: projekt.downloadLink1 ?? 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),
|
||||||
@@ -182,43 +268,49 @@ export const AbgabetoolStudent = {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
this.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns)
|
|
||||||
this.$refs.abgabeTable.tabulator.setData(d);
|
|
||||||
},
|
},
|
||||||
loadProjektarbeiten() {
|
loadProjektarbeiten() {
|
||||||
this.$fhcApi.factory.lehre.getStudentProjektarbeiten(this.student_uid_prop || this.viewData?.uid || null)
|
this.$api.call(ApiAbgabe.getStudentProjektarbeiten(this.student_uid))
|
||||||
.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.$fhcApi.factory.lehre.getStudentProjektabgaben(details)
|
this.$api.call(ApiAbgabe.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()
|
||||||
|
},
|
||||||
this.$refs.verticalsplit.collapseBottom()
|
getAccTabHeaderForProjektarbeit(projektarbeit) {
|
||||||
//this.calcMaxTableHeight()
|
let title = ''
|
||||||
|
|
||||||
|
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: {
|
||||||
@@ -227,37 +319,152 @@ 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
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
async 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: `
|
||||||
<vertical-split ref="verticalsplit">
|
<template v-if="phrasenResolved">
|
||||||
<template #top>
|
<FhcOverlay :active="loading"></FhcOverlay>
|
||||||
<h2>{{$p.t('abgabetool/abgabetoolTitle')}}</h2>
|
|
||||||
<hr>
|
<bs-modal ref="modalContainerAbgabeDetail" class="bootstrap-prompt"
|
||||||
|
dialogClass="modal-xl" :allowFullscreenExpand="true">
|
||||||
<core-filter-cmpt
|
<template v-slot:title>
|
||||||
@uuidDefined="handleUuidDefined"
|
<div>
|
||||||
:title="''"
|
{{$capitalize( $p.t('abgabetool/c4abgabeStudentDetailTitle') )}}
|
||||||
ref="abgabeTable"
|
</div>
|
||||||
:tabulator-options="abgabeTableOptions"
|
|
||||||
:tabulator-events="abgabeTableEventHandlers"
|
|
||||||
tableOnly
|
|
||||||
:sideMenu="false"
|
|
||||||
/>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
<template #bottom>
|
|
||||||
<div v-show="selectedProjektarbeit">
|
|
||||||
<AbgabeDetail :viewMode="isViewMode" :projektarbeit="selectedProjektarbeit"></AbgabeDetail>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
</vertical-split>
|
<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>
|
||||||
|
<div class="d-flex row w-100">
|
||||||
|
<div class="text-start" :class="projektarbeit.note != null ? 'col-6' : 'col-12'">
|
||||||
|
<span>{{getAccTabHeaderForProjektarbeit(projektarbeit)}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="col-6 text-end">
|
||||||
|
<span>{{getNoteBezeichnung(projektarbeit)}}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-4 col-md-3 fw-bold">{{$capitalize( $p.t('abgabetool/c4details') )}}</div>
|
||||||
|
<div class="col-8 col-md-9">
|
||||||
|
<button @click="setDetailComponent(projektarbeit.details)" class="btn btn-primary">
|
||||||
|
{{$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>
|
||||||
|
</Accordion>
|
||||||
|
</template>
|
||||||
`,
|
`,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
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",
|
||||||
@@ -25,19 +26,21 @@ 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: this.$p.t('global/noDataAvailable'),
|
placeholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),
|
||||||
columns: [
|
columns: [
|
||||||
{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/c4zieldatum'))), field: 'datum', 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/c4fixterminv4'))), field: 'fixterminstring', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},
|
||||||
{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/c4abgabetyp'))), field: 'typ_bezeichnung', formatter: this.centeredTextFormatter, widthGrow: 1},
|
||||||
{title: Vue.computed(() => this.$p.t('abgabetool/c4abgabekurzbz')), field: 'kurzbz', formatter: this.centeredTextFormatter, widthGrow: 3},
|
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabekurzbz'))), field: 'kurzbz', formatter: this.centeredTextFormatter, widthGrow: 3},
|
||||||
{title: Vue.computed(() => this.$p.t('person/studentIn')), field: 'student', formatter: this.centeredTextFormatter, widthGrow: 2},
|
{title: Vue.computed(() => this.$capitalize(this.$p.t('person/studentIn'))), field: 'student', formatter: this.centeredTextFormatter, widthGrow: 2},
|
||||||
{title: Vue.computed(() => this.$p.t('abgabetool/c4stg')), field: 'stg', formatter: this.centeredTextFormatter,widthGrow: 1},
|
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', formatter: this.centeredTextFormatter,widthGrow: 1},
|
||||||
{title: Vue.computed(() => this.$p.t('abgabetool/c4sem')), field: 'semester', formatter: this.centeredTextFormatter, widthGrow: 1}
|
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'semester', formatter: this.centeredTextFormatter, widthGrow: 1}
|
||||||
],
|
],
|
||||||
persistence: false,
|
persistence: false,
|
||||||
},
|
},
|
||||||
@@ -84,7 +87,7 @@ export const DeadlineOverview = {
|
|||||||
this.tableBuiltResolve = resolve
|
this.tableBuiltResolve = resolve
|
||||||
},
|
},
|
||||||
loadDeadlines() {
|
loadDeadlines() {
|
||||||
this.$fhcApi.factory.lehre.fetchDeadlines(this.person_uid_prop ?? null)
|
this.$api.call(ApiAbgabe.fetchDeadlines(this.person_uid_prop ?? null))
|
||||||
.then(res => {
|
.then(res => {
|
||||||
if(res?.data) this.setupData(res.data)
|
if(res?.data) this.setupData(res.data)
|
||||||
})
|
})
|
||||||
@@ -109,7 +112,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
|
this.deadlineTableOptions.height = window.visualViewport.height - rect.top - 30
|
||||||
this.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)
|
this.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)
|
||||||
},
|
},
|
||||||
async setupMounted() {
|
async setupMounted() {
|
||||||
@@ -127,7 +130,8 @@ export const DeadlineOverview = {
|
|||||||
|
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
this.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])
|
||||||
|
this.phrasenPromise.then(()=> {this.phrasenResolved = true})
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.setupMounted()
|
this.setupMounted()
|
||||||
|
|||||||
@@ -0,0 +1,83 @@
|
|||||||
|
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;
|
||||||
@@ -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 {console.log(this.event.lektor);
|
} 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")
|
||||||
|
|||||||
@@ -151,10 +151,6 @@ 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 };
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
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;
|
||||||
@@ -16,8 +16,6 @@ export default {
|
|||||||
|
|
||||||
__widgetsStarted[id] = new Promise((resolve, reject) => {
|
__widgetsStarted[id] = new Promise((resolve, reject) => {
|
||||||
axios.get(__path, {params:{id}}).then(res => {
|
axios.get(__path, {params:{id}}).then(res => {
|
||||||
res.data.retval.arguments = JSON.parse(res.data.retval.arguments);
|
|
||||||
res.data.retval.setup = JSON.parse(res.data.retval.setup);
|
|
||||||
__widgets[id] = res.data.retval;
|
__widgets[id] = res.data.retval;
|
||||||
__widgetsStarted[id] = undefined;
|
__widgetsStarted[id] = undefined;
|
||||||
resolve(__widgets[id]);
|
resolve(__widgets[id]);
|
||||||
|
|||||||
@@ -380,7 +380,8 @@ export default {
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const fhcApiAxios = axios.create({
|
const fhcApiAxios = axios.create({
|
||||||
timeout: 500000,
|
timeout: 500000,
|
||||||
baseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root
|
baseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root
|
||||||
|
|||||||
@@ -86,9 +86,11 @@ require_once('dbupdate_3.4/40314_electronic_onboarding_anbindung_ida.php');
|
|||||||
require_once('dbupdate_3.4/47972_pruefungsverwaltung_ects_angabe.php');
|
require_once('dbupdate_3.4/47972_pruefungsverwaltung_ects_angabe.php');
|
||||||
require_once('dbupdate_3.4/62063_lv_evaluierung.php');
|
require_once('dbupdate_3.4/62063_lv_evaluierung.php');
|
||||||
require_once('dbupdate_3.4/67490_studstatus_suche_abort_controller_haengt.php');
|
require_once('dbupdate_3.4/67490_studstatus_suche_abort_controller_haengt.php');
|
||||||
|
require_once('dbupdate_3.4/61164_abgabetool_quality_gates.php');
|
||||||
require_once('dbupdate_3.4/69065_Projektarbeiten_Firmen_verwalten.php');
|
require_once('dbupdate_3.4/69065_Projektarbeiten_Firmen_verwalten.php');
|
||||||
require_once('dbupdate_3.4/68744_StV_settings.php');
|
require_once('dbupdate_3.4/68744_StV_settings.php');
|
||||||
require_once('dbupdate_3.4/62889_reihungstest_ueberwachung_mit_constructor.php');
|
require_once('dbupdate_3.4/62889_reihungstest_ueberwachung_mit_constructor.php');
|
||||||
|
require_once('dbupdate_3.4/71399_dashboard_update_widget_paths.php');
|
||||||
|
|
||||||
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
|
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
|
||||||
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
|
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
|
||||||
@@ -167,8 +169,8 @@ $tabellen=array(
|
|||||||
"campus.tbl_news" => array("news_id","uid","studiengang_kz","fachbereich_kurzbz","semester","betreff","text","datum","verfasser","updateamum","updatevon","insertamum","insertvon","datum_bis","content_id"),
|
"campus.tbl_news" => array("news_id","uid","studiengang_kz","fachbereich_kurzbz","semester","betreff","text","datum","verfasser","updateamum","updatevon","insertamum","insertvon","datum_bis","content_id"),
|
||||||
"campus.tbl_notenschluessel" => array("lehreinheit_id","note","punkte"),
|
"campus.tbl_notenschluessel" => array("lehreinheit_id","note","punkte"),
|
||||||
"campus.tbl_notenschluesseluebung" => array("uebung_id","note","punkte"),
|
"campus.tbl_notenschluesseluebung" => array("uebung_id","note","punkte"),
|
||||||
"campus.tbl_paabgabetyp" => array("paabgabetyp_kurzbz","bezeichnung"),
|
"campus.tbl_paabgabetyp" => array("paabgabetyp_kurzbz","bezeichnung","aktiv","upload_allowed_default","benotbar"),
|
||||||
"campus.tbl_paabgabe" => array("paabgabe_id","projektarbeit_id","paabgabetyp_kurzbz","fixtermin","datum","kurzbz","abgabedatum", "insertvon","insertamum","updatevon","updateamum"),
|
"campus.tbl_paabgabe" => array("paabgabe_id","projektarbeit_id","paabgabetyp_kurzbz","fixtermin","datum","kurzbz","abgabedatum", "insertvon","insertamum","updatevon","updateamum","note","upload_allowed","beurteilungsnotiz"),
|
||||||
"campus.tbl_pruefungsfenster" => array("pruefungsfenster_id","studiensemester_kurzbz","oe_kurzbz","start","ende"),
|
"campus.tbl_pruefungsfenster" => array("pruefungsfenster_id","studiensemester_kurzbz","oe_kurzbz","start","ende"),
|
||||||
"campus.tbl_pruefung" => array("pruefung_id","mitarbeiter_uid","studiensemester_kurzbz","pruefungsfenster_id","pruefungstyp_kurzbz","titel","beschreibung","methode","einzeln","storniert","insertvon","insertamum","updatevon","updateamum","pruefungsintervall"),
|
"campus.tbl_pruefung" => array("pruefung_id","mitarbeiter_uid","studiensemester_kurzbz","pruefungsfenster_id","pruefungstyp_kurzbz","titel","beschreibung","methode","einzeln","storniert","insertvon","insertamum","updatevon","updateamum","pruefungsintervall"),
|
||||||
"campus.tbl_pruefungstermin" => array("pruefungstermin_id","pruefung_id","von","bis","teilnehmer_max","teilnehmer_min","anmeldung_von","anmeldung_bis","ort_kurzbz","sammelklausur", "anderer_raum"),
|
"campus.tbl_pruefungstermin" => array("pruefungstermin_id","pruefung_id","von","bis","teilnehmer_max","teilnehmer_min","anmeldung_von","anmeldung_bis","ort_kurzbz","sammelklausur", "anderer_raum"),
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ if($result = @$db->db_query("SELECT 1 FROM dashboard.tbl_widget WHERE widget_kur
|
|||||||
'hallowelt',
|
'hallowelt',
|
||||||
'Hallo Welt Widget',
|
'Hallo Welt Widget',
|
||||||
'{"css": "d-flex justify-content-center align-items-center h-100", "title": "Hallo Welt"}'::jsonb,
|
'{"css": "d-flex justify-content-center align-items-center h-100", "title": "Hallo Welt"}'::jsonb,
|
||||||
'{"file": "DashboardWidget/Default.js", "icon": "https://upload.wikimedia.org/wikipedia/commons/8/8a/Farben-Testbild.svg", "name": "Hallo Welt", "width": {"max": 99}, "height": {"max": 99}, "hideFooter": false}'::jsonb
|
'{"file": "public/js/components/DashboardWidget/Default.js", "icon": "https://upload.wikimedia.org/wikipedia/commons/8/8a/Farben-Testbild.svg", "name": "Hallo Welt", "width": {"max": 99}, "height": {"max": 99}, "hideFooter": false}'::jsonb
|
||||||
);
|
);
|
||||||
EOWHW;
|
EOWHW;
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@ if($result = @$db->db_query("SELECT 1 FROM dashboard.tbl_widget WHERE widget_kur
|
|||||||
'news',
|
'news',
|
||||||
'News Widget',
|
'News Widget',
|
||||||
'{}'::jsonb,
|
'{}'::jsonb,
|
||||||
'{"file": "DashboardWidget/News.js", "icon": "/skin/images/fh_technikum_wien_illustration_klein.png", "name": "News", "width": {"max": 4, "min": 1}, "height": {"max": 2, "min": 1}, "cis4link": "/CisVue/Cms/news", "hideFooter": false}'::jsonb
|
'{"file": "public/js/components/DashboardWidget/News.js", "icon": "/skin/images/fh_technikum_wien_illustration_klein.png", "name": "News", "width": {"max": 4, "min": 1}, "height": {"max": 2, "min": 1}, "cis4link": "/CisVue/Cms/news", "hideFooter": false}'::jsonb
|
||||||
);
|
);
|
||||||
EOWHW;
|
EOWHW;
|
||||||
|
|
||||||
@@ -103,7 +103,7 @@ if($result = @$db->db_query("SELECT 1 FROM dashboard.tbl_widget WHERE widget_kur
|
|||||||
'url',
|
'url',
|
||||||
'Bookmark Widget',
|
'Bookmark Widget',
|
||||||
'{}'::jsonb,
|
'{}'::jsonb,
|
||||||
'{"file": "DashboardWidget/Url.js", "icon": "/skin/images/fh_technikum_wien_illustration_klein.png", "name": "Bookmark", "width": 1, "height": {"max": 2, "min": 1}, "hideFooter": true}'::jsonb
|
'{"file": "public/js/components/DashboardWidget/Url.js", "icon": "/skin/images/fh_technikum_wien_illustration_klein.png", "name": "Bookmark", "width": 1, "height": {"max": 2, "min": 1}, "hideFooter": true}'::jsonb
|
||||||
);
|
);
|
||||||
EOWHW;
|
EOWHW;
|
||||||
|
|
||||||
@@ -135,7 +135,7 @@ if($result = @$db->db_query("SELECT 1 FROM dashboard.tbl_widget WHERE widget_kur
|
|||||||
'ampel',
|
'ampel',
|
||||||
'Ampel Widget',
|
'Ampel Widget',
|
||||||
'{}'::jsonb,
|
'{}'::jsonb,
|
||||||
'{"file": "DashboardWidget/Ampel.js", "icon": "/skin/images/fh_technikum_wien_illustration_klein.png", "name": "Ampel", "width": 1, "height": {"max": 2, "min": 1}, "hideFooter": false}'::jsonb
|
'{"file": "public/js/components/DashboardWidget/Ampel.js", "icon": "/skin/images/fh_technikum_wien_illustration_klein.png", "name": "Ampel", "width": 1, "height": {"max": 2, "min": 1}, "hideFooter": false}'::jsonb
|
||||||
);
|
);
|
||||||
EOWHW;
|
EOWHW;
|
||||||
|
|
||||||
@@ -162,7 +162,7 @@ if($result = @$db->db_query("SELECT 1 FROM dashboard.tbl_widget WHERE widget_kur
|
|||||||
widget_kurzbz = 'lvplan',
|
widget_kurzbz = 'lvplan',
|
||||||
beschreibung = 'LV-Plan Widget',
|
beschreibung = 'LV-Plan Widget',
|
||||||
arguments = '{"bodyClass": "p-0"}'::jsonb,
|
arguments = '{"bodyClass": "p-0"}'::jsonb,
|
||||||
setup = '{"file": "DashboardWidget/LvPlan.js", "icon": "/skin/images/fh_technikum_wien_illustration_klein.png", "name": "LV-Plan", "width": {"max": 4, "min": 1}, "height": {"max": 3, "min": 1}, "cis4link": "/Cis/LvPlan", "hideFooter": false}'::jsonb
|
setup = '{"file": "public/js/components/DashboardWidget/LvPlan.js", "icon": "/skin/images/fh_technikum_wien_illustration_klein.png", "name": "LV-Plan", "width": {"max": 4, "min": 1}, "height": {"max": 3, "min": 1}, "cis4link": "/Cis/LvPlan", "hideFooter": false}'::jsonb
|
||||||
WHERE
|
WHERE
|
||||||
widget_kurzbz = 'stundenplan';
|
widget_kurzbz = 'stundenplan';
|
||||||
EOWHW;
|
EOWHW;
|
||||||
@@ -195,7 +195,7 @@ if($result = @$db->db_query("SELECT 1 FROM dashboard.tbl_widget WHERE widget_kur
|
|||||||
'lvplan',
|
'lvplan',
|
||||||
'LV-Plan Widget',
|
'LV-Plan Widget',
|
||||||
'{"bodyClass": "p-0"}'::jsonb,
|
'{"bodyClass": "p-0"}'::jsonb,
|
||||||
'{"file": "DashboardWidget/LvPlan.js", "icon": "/skin/images/fh_technikum_wien_illustration_klein.png", "name": "LV-Plan", "width": {"max": 4, "min": 1}, "height": {"max": 3, "min": 1}, "cis4link": "/Cis/LvPlan", "hideFooter": false}'::jsonb
|
'{"file": "public/js/components/DashboardWidget/LvPlan.js", "icon": "/skin/images/fh_technikum_wien_illustration_klein.png", "name": "LV-Plan", "width": {"max": 4, "min": 1}, "height": {"max": 3, "min": 1}, "cis4link": "/Cis/LvPlan", "hideFooter": false}'::jsonb
|
||||||
);
|
);
|
||||||
EOWHW;
|
EOWHW;
|
||||||
|
|
||||||
@@ -227,7 +227,7 @@ if($result = @$db->db_query("SELECT 1 FROM dashboard.tbl_widget WHERE widget_kur
|
|||||||
'studiengang',
|
'studiengang',
|
||||||
'Das Studiengang-Widget enthält Informationen über den Studiengang eines Studenten.',
|
'Das Studiengang-Widget enthält Informationen über den Studiengang eines Studenten.',
|
||||||
'{}'::jsonb,
|
'{}'::jsonb,
|
||||||
'{"file": "DashboardWidget/Studiengang.js", "icon": "/skin/images/fh_technikum_wien_illustration_klein.png", "name": "Studiengang", "width": {"max": 2, "min": 1}, "height": {"max": 4, "min": 1}, "hideFooter": true}'::jsonb
|
'{"file": "public/js/components/DashboardWidget/Studiengang.js", "icon": "/skin/images/fh_technikum_wien_illustration_klein.png", "name": "Studiengang", "width": {"max": 2, "min": 1}, "height": {"max": 4, "min": 1}, "hideFooter": true}'::jsonb
|
||||||
);
|
);
|
||||||
EOWHW;
|
EOWHW;
|
||||||
|
|
||||||
@@ -349,4 +349,4 @@ EOGP;
|
|||||||
echo 'dashboard.tbl_dashboard_preset: Added Student Preset for Dashboard "CIS"<br>';
|
echo 'dashboard.tbl_dashboard_preset: Added Student Preset for Dashboard "CIS"<br>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,379 @@
|
|||||||
|
<?php
|
||||||
|
if (! defined('DB_NAME')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table_schema = 'campus' AND table_name = 'tbl_paabgabetyp' AND column_name = 'aktiv'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
$qry = "ALTER TABLE campus.tbl_paabgabetyp
|
||||||
|
ADD COLUMN IF NOT EXISTS aktiv BOOLEAN DEFAULT true;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabetyp: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>paabgabetyp column aktiv default true hinzugefuegt';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table_schema = 'campus' AND table_name = 'tbl_paabgabetyp' AND column_name = 'upload_allowed_default'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
$qry = "ALTER TABLE campus.tbl_paabgabetyp
|
||||||
|
ADD COLUMN IF NOT EXISTS upload_allowed_default BOOLEAN DEFAULT true;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabetyp: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>paabgabetyp column upload_allowed_default default true hinzugefuegt';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table_schema = 'campus' AND table_name = 'tbl_paabgabetyp' AND column_name = 'benotbar'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
$qry = "ALTER TABLE campus.tbl_paabgabetyp
|
||||||
|
ADD COLUMN IF NOT EXISTS benotbar BOOLEAN DEFAULT true;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabetyp: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>paabgabetyp column benotbar default true hinzugefuegt';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO DEFINE ACTUAL VALUES BENOTBAR / UPLOAD_ALLOWED_DEFAULT / AKTIV FOR EACH PAABGABETYPE - DEVLOPER DEFAULTS BELOW
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM campus.tbl_paabgabetyp WHERE paabgabetyp_kurzbz='qualgate1'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "INSERT INTO campus.tbl_paabgabetyp (paabgabetyp_kurzbz, bezeichnung, benotbar, upload_allowed_default, aktiv)
|
||||||
|
VALUES('qualgate1', 'Quality Gate 1', true, true, true);";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabetyp: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>paabgabetyp quality gate 1 hinzugefuegt';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set new cols for zwischenabgabe
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM campus.tbl_paabgabetyp WHERE paabgabetyp_kurzbz='qualgate2'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "UPDATE campus.tbl_paabgabetyp
|
||||||
|
SET benotbar = false,
|
||||||
|
upload_allowed_default = true,
|
||||||
|
aktiv = true
|
||||||
|
WHERE paabgabetyp_kurzbz='zwischen';";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabetyp: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>paabgabetyp zwischen updated benotbar = false, upload_allowed_default = true, aktiv = true';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set new cols for note
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM campus.tbl_paabgabetyp WHERE paabgabetyp_kurzbz='qualgate2'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "UPDATE campus.tbl_paabgabetyp
|
||||||
|
SET benotbar = false,
|
||||||
|
upload_allowed_default = false,
|
||||||
|
aktiv = false
|
||||||
|
WHERE paabgabetyp_kurzbz='note';";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabetyp: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>paabgabetyp note updated benotbar = false, upload_allowed_default = false, aktiv = false';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set new cols for abstract / entwurf
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM campus.tbl_paabgabetyp WHERE paabgabetyp_kurzbz='qualgate2'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "UPDATE campus.tbl_paabgabetyp
|
||||||
|
SET benotbar = false,
|
||||||
|
upload_allowed_default = true,
|
||||||
|
aktiv = true
|
||||||
|
WHERE paabgabetyp_kurzbz='abstract';";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabetyp: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>paabgabetyp abstract updated benotbar = false, upload_allowed_default = true, aktiv = true';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set new cols for endabgabe / end
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM campus.tbl_paabgabetyp WHERE paabgabetyp_kurzbz='qualgate2'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "UPDATE campus.tbl_paabgabetyp
|
||||||
|
SET benotbar = false,
|
||||||
|
upload_allowed_default = true,
|
||||||
|
aktiv = true
|
||||||
|
WHERE paabgabetyp_kurzbz='end';";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabetyp: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>paabgabetyp end updated benotbar = false, upload_allowed_default = true, aktiv = true';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set new cols for endabgabe im sekretariat / enda
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM campus.tbl_paabgabetyp WHERE paabgabetyp_kurzbz='qualgate2'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "UPDATE campus.tbl_paabgabetyp
|
||||||
|
SET benotbar = false,
|
||||||
|
upload_allowed_default = false,
|
||||||
|
aktiv = false
|
||||||
|
WHERE paabgabetyp_kurzbz='enda';";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabetyp: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>paabgabetyp enda updated benotbar = false, upload_allowed_default = false, aktiv = false';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM campus.tbl_paabgabetyp WHERE paabgabetyp_kurzbz='qualgate2'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "INSERT INTO campus.tbl_paabgabetyp (paabgabetyp_kurzbz, bezeichnung, benotbar, upload_allowed_default, aktiv)
|
||||||
|
VALUES('qualgate2', 'Quality Gate 2', true, true, true);";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabetyp: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>paabgabetyp quality gate 2 hinzugefuegt';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table_schema = 'campus' AND table_name = 'tbl_paabgabe' AND column_name = 'note'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
$qry = "ALTER TABLE campus.tbl_paabgabe
|
||||||
|
ADD COLUMN IF NOT EXISTS note SMALLINT DEFAULT NULL,
|
||||||
|
ADD CONSTRAINT tbl_paabgabe_note_fkey
|
||||||
|
FOREIGN KEY (note)
|
||||||
|
REFERENCES lehre.tbl_note(note)
|
||||||
|
ON UPDATE CASCADE ON DELETE RESTRICT;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabe: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>paabgabe column note default 9 (noch nicht eingetragen) hinzugefuegt';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table_schema = 'campus' AND table_name = 'tbl_paabgabe' AND column_name = 'upload_allowed'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "ALTER TABLE campus.tbl_paabgabe
|
||||||
|
ADD COLUMN IF NOT EXISTS upload_allowed boolean DEFAULT true;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabe: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>paabgabe column upload_allowed default false hinzugefuegt';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table_schema = 'campus' AND table_name = 'tbl_paabgabe' AND column_name = 'beurteilungsnotiz'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "ALTER TABLE campus.tbl_paabgabe
|
||||||
|
ADD COLUMN IF NOT EXISTS beurteilungsnotiz text DEFAULT NULL;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.tbl_paabgabe: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo "<br>paabgabe column beurteilungsnotiz default '' hinzugefuegt";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'basis/abgabe_student'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung)
|
||||||
|
SELECT 'basis/abgabe_student', 'Recht um Abgabetool für Studenten zu bedienen'";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>system.tbl_berechtigung: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo "<br>system.tbl_berechtigung insert basis/abgabe_student hinzugefuegt";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'basis/abgabe_lektor'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung)
|
||||||
|
SELECT 'basis/abgabe_lektor', 'Recht um Abgabetool für Lektoren zu bedienen'";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>system.tbl_berechtigung: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo "<br>system.tbl_berechtigung insert basis/abgabe_lektor hinzugefuegt";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'basis/abgabe_assistenz'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung)
|
||||||
|
SELECT 'basis/abgabe_assistenz', 'Recht um Abgabetool für Assistenzen zu bedienen'";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>system.tbl_berechtigung: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo "<br>system.tbl_berechtigung insert basis/abgabe_assistenz hinzugefuegt";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM information_schema.routines WHERE routine_schema = 'campus' AND routine_name = 'get_betreuer_details'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "CREATE OR REPLACE FUNCTION campus.get_betreuer_details(b_person_id INT)
|
||||||
|
RETURNS TABLE (
|
||||||
|
full_name TEXT
|
||||||
|
)
|
||||||
|
LANGUAGE sql
|
||||||
|
AS $$
|
||||||
|
SELECT DISTINCT
|
||||||
|
trim(
|
||||||
|
COALESCE(titelpre,'') || ' ' ||
|
||||||
|
COALESCE(vorname,'') || ' ' ||
|
||||||
|
COALESCE(nachname,'') || ' ' ||
|
||||||
|
COALESCE(titelpost,'')
|
||||||
|
) AS full_name
|
||||||
|
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 public.tbl_person.person_id = b_person_id;
|
||||||
|
$$;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>campus.get_betreuer_details: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo "<br>campus.get_betreuer_details function hinzugefuegt";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'basis/abgabe_assistenz'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung)
|
||||||
|
SELECT 'basis/abgabe_assistenz', 'Recht um Abgabetool für Assistenzen zu bedienen'";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>system.tbl_berechtigung: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo "<br>system.tbl_berechtigung insert basis/abgabe_assistenz hinzugefuegt";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM public.tbl_vorlage WHERE vorlage_kurzbz = 'PaabgabeUpdatesBetSM'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "INSERT INTO public.tbl_vorlage (vorlage_kurzbz, bezeichnung, anmerkung, mimetype)
|
||||||
|
VALUES ('PaabgabeUpdatesBetSM', 'PaabgabeUpdatesBetSM', null, 'text/html')
|
||||||
|
ON CONFLICT (vorlage_kurzbz) DO NOTHING;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>system.tbl_vorlage: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo "<br>system.tbl_vorlage PaabgabeUpdatesBetSM hinzugefuegt";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM public.tbl_vorlage WHERE vorlage_kurzbz = 'PaabgabeUpdatesSammelmail'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "INSERT INTO public.tbl_vorlage (vorlage_kurzbz, bezeichnung, anmerkung, mimetype)
|
||||||
|
VALUES ('PaabgabeUpdatesSammelmail', 'PaabgabeUpdatesSammelmail', null, 'text/html')
|
||||||
|
ON CONFLICT (vorlage_kurzbz) DO NOTHING;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>system.tbl_vorlage: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo "<br>system.tbl_vorlage PaabgabeUpdatesSammelmail hinzugefuegt";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM public.tbl_vorlage WHERE vorlage_kurzbz = 'PAAChangesBetSM'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "INSERT INTO public.tbl_vorlage (vorlage_kurzbz, bezeichnung, anmerkung, mimetype)
|
||||||
|
VALUES ('PAAChangesBetSM', 'PAAChangesBetSM', null, 'text/html')
|
||||||
|
ON CONFLICT (vorlage_kurzbz) DO NOTHING;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>system.tbl_vorlage: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo "<br>system.tbl_vorlage PAAChangesBetSM hinzugefuegt";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM public.tbl_vorlage WHERE vorlage_kurzbz = 'PAAChangesAssSM'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "INSERT INTO public.tbl_vorlage (vorlage_kurzbz, bezeichnung, anmerkung, mimetype)
|
||||||
|
VALUES ('PAAChangesAssSM', 'PAAChangesAssSM', null, 'text/html')
|
||||||
|
ON CONFLICT (vorlage_kurzbz) DO NOTHING;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>system.tbl_vorlage: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo "<br>system.tbl_vorlage PAAChangesAssSM hinzugefuegt";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result = $db->db_query("SELECT 1 FROM public.tbl_vorlage WHERE vorlage_kurzbz = 'QualGateNegativ'"))
|
||||||
|
{
|
||||||
|
if($db->db_num_rows($result) === 0)
|
||||||
|
{
|
||||||
|
$qry = "INSERT INTO public.tbl_vorlage (vorlage_kurzbz, bezeichnung, anmerkung, mimetype)
|
||||||
|
VALUES ('QualGateNegativ', 'QualGateNegativ', null, 'text/html')
|
||||||
|
ON CONFLICT (vorlage_kurzbz) DO NOTHING;";
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong>system.tbl_vorlage: '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo "<br>system.tbl_vorlage QualGateNegativ hinzugefuegt";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
<?php
|
||||||
|
/* Copyright (C) 2017 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 2 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*
|
||||||
|
* Authors: Harald Bamberger <harald.bamberger@technikum-wien.at>,
|
||||||
|
*
|
||||||
|
* Beschreibung:
|
||||||
|
* Dashboard DB Aenderungen
|
||||||
|
*/
|
||||||
|
if (! defined('DB_NAME')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
$corewidgetssql = 'select tw.* from dashboard.tbl_widget tw where regexp_match((setup->\'file\')::text, \'^"DashboardWidget\') is not NULL';
|
||||||
|
if (($rescore = $db->db_query($corewidgetssql)))
|
||||||
|
{
|
||||||
|
if ($db->db_num_rows($rescore) > 0)
|
||||||
|
{
|
||||||
|
$coreqry = <<<EOCOREQRY
|
||||||
|
|
||||||
|
update
|
||||||
|
dashboard.tbl_widget
|
||||||
|
set
|
||||||
|
setup = jsonb_set(setup, '{file}', regexp_replace((setup->'file')::text, '^"DashboardWidget', '"public/js/components/DashboardWidget')::jsonb)
|
||||||
|
where
|
||||||
|
regexp_match((setup->'file')::text, '^"DashboardWidget') is not NULL;
|
||||||
|
|
||||||
|
EOCOREQRY;
|
||||||
|
|
||||||
|
if (!$db->db_query($coreqry))
|
||||||
|
{
|
||||||
|
echo '<strong>Dashboard Core Widgets Paths Update: '.$db->db_last_error().'</strong><br>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
echo '<br>Dashboard Core Widgets Paths updated.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$extwidgetssql = 'select tw.* from dashboard.tbl_widget tw where regexp_match((setup->\'file\')::text, \'^"../../\') is not NULL';
|
||||||
|
if (($resext = $db->db_query($extwidgetssql)))
|
||||||
|
{
|
||||||
|
if ($db->db_num_rows($resext) > 0)
|
||||||
|
{
|
||||||
|
$extqry = <<<EOEXTQRY
|
||||||
|
|
||||||
|
update
|
||||||
|
dashboard.tbl_widget
|
||||||
|
set
|
||||||
|
setup = jsonb_set(setup, '{file}', regexp_replace((setup->'file')::text, '^"../../', '"public/')::jsonb)
|
||||||
|
where
|
||||||
|
regexp_match((setup->'file')::text, '^"../../') is not NULL;
|
||||||
|
|
||||||
|
EOEXTQRY;
|
||||||
|
|
||||||
|
if (!$db->db_query($extqry))
|
||||||
|
{
|
||||||
|
echo '<strong>Dashboard Extensions Widgets Paths Update: '.$db->db_last_error().'</strong><br>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
echo '<br>Dashboard Extensions Widgets Paths updated.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+2466
-23
File diff suppressed because it is too large
Load Diff
@@ -80,9 +80,9 @@ $trenner->loadVariables($getuid);
|
|||||||
|
|
||||||
$sql_query = "SELECT *,
|
$sql_query = "SELECT *,
|
||||||
(SELECT orgform_kurzbz
|
(SELECT orgform_kurzbz
|
||||||
FROM tbl_prestudentstatus
|
FROM tbl_prestudentstatus
|
||||||
WHERE prestudent_id=(Select prestudent_id from tbl_student where student_uid=xy.uid limit 1)
|
WHERE prestudent_id=(Select prestudent_id from tbl_student where student_uid=xy.uid limit 1)
|
||||||
ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1
|
ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1
|
||||||
) as organisationsform
|
) as organisationsform
|
||||||
FROM (SELECT DISTINCT ON(tbl_projektarbeit.projektarbeit_id) public.tbl_studiengang.bezeichnung as stgbez,tbl_projekttyp.bezeichnung AS prjbez,* FROM lehre.tbl_projektarbeit
|
FROM (SELECT DISTINCT ON(tbl_projektarbeit.projektarbeit_id) public.tbl_studiengang.bezeichnung as stgbez,tbl_projekttyp.bezeichnung AS prjbez,* FROM lehre.tbl_projektarbeit
|
||||||
LEFT JOIN public.tbl_benutzer on(uid=student_uid)
|
LEFT JOIN public.tbl_benutzer on(uid=student_uid)
|
||||||
|
|||||||
Reference in New Issue
Block a user