mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-10-12 15:04:04 +00:00
Compare commits
27
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0c4d102850 | ||
|
|
2e15f2c5ab | ||
|
|
784e5693b4 | ||
|
|
88b49b70e9 | ||
|
|
67a33f2ceb | ||
|
|
751445c199 | ||
|
|
916f5dd68e | ||
|
|
efc8fa1eeb | ||
|
|
d58edff92d | ||
|
|
643929a0c6 | ||
|
|
4ba2869632 | ||
|
|
293bb77179 | ||
|
|
3fe10d715d | ||
|
|
3034615455 | ||
|
|
36064afbba | ||
|
|
f3d031ab16 | ||
|
|
3d8c4fa4d0 | ||
|
|
272014bd78 | ||
|
|
76a8e00edf | ||
|
|
ce62713790 | ||
|
|
e369a8c03f | ||
|
|
faad2c4a9a | ||
|
|
2ffaf36270 | ||
|
|
c8c7d1566c | ||
|
|
9d4218bf38 | ||
|
|
67f30c7765 | ||
|
|
d40040efd8 |
@@ -129,13 +129,19 @@ $route['api/frontend/v1/treemenudata/stv/.*'] = 'api/frontend/v1/stv/students/in
|
|||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2';
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/semester/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStg/$1/$2/$3';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStgOrgform/$1/$2/$3/$4';
|
||||||
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/semester/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStgOrgform/$1/$2/$3/$4';
|
||||||
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByStgOrgform/$1/$2/$3';
|
||||||
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/stg/(:any)/orgform/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByStgOrgform/$1/$2/$3';
|
||||||
|
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2';
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
|
||||||
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/emp/(:any)/stg/(:any)/.*'] = 'api/frontend/v1/Lehrveranstaltung/getByEmp/$1/$2/$3';
|
||||||
|
|
||||||
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/le/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByLe/$1/$2';
|
||||||
|
$route['api/frontend/v1/treemenudata/lvverwaltung/stdsem/(:any)/lv/(:any)'] = 'api/frontend/v1/Lehrveranstaltung/getByLv/$1/$2';
|
||||||
|
|
||||||
|
|
||||||
// load routes from extensions, also look for environment-specific configs
|
// load routes from extensions, also look for environment-specific configs
|
||||||
$subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT . '/extensions'];
|
$subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT . '/extensions'];
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ $config['root'] = [
|
|||||||
'verband' => [
|
'verband' => [
|
||||||
'group'
|
'group'
|
||||||
]
|
]
|
||||||
],
|
]
|
||||||
'orgform'
|
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
$config['root']['stg']['orgform'] = $config['root']['stg'];
|
||||||
|
|||||||
@@ -1916,7 +1916,7 @@ class Abgabe extends FHCAPI_Controller
|
|||||||
|
|
||||||
if (!$mailres)
|
if (!$mailres)
|
||||||
{
|
{
|
||||||
$this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
|
$this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,10 @@ class Lehrveranstaltung extends FHCAPI_Controller
|
|||||||
{
|
{
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'getByEmp' => ['admin:r', 'assistenz:r'],
|
'getByEmp' => ['admin:r', 'assistenz:r'],
|
||||||
|
'getByLe' => ['admin:r', 'assistenz:r'],
|
||||||
|
'getByLv' => ['admin:r', 'assistenz:r'],
|
||||||
'getByStg' => ['admin:r', 'assistenz:r'],
|
'getByStg' => ['admin:r', 'assistenz:r'],
|
||||||
|
'getByStgOrgform' => ['admin:r', 'assistenz:r'],
|
||||||
'loadByLV' => ['admin:r', 'assistenz:r'],
|
'loadByLV' => ['admin:r', 'assistenz:r'],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@@ -77,41 +80,117 @@ class Lehrveranstaltung extends FHCAPI_Controller
|
|||||||
|
|
||||||
$this->terminateWithSuccess($tree);
|
$this->terminateWithSuccess($tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getByLe($studiensemester_kurzbz = null, $lehreinheit_id = null)
|
||||||
|
{
|
||||||
|
if (is_null($lehreinheit_id))
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
|
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||||
|
|
||||||
|
|
||||||
|
$lehreinheiten = $this->_ci->LehreinheitModel->getByLeStudiensemester($lehreinheit_id, $studiensemester_kurzbz);
|
||||||
|
$lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($lehreinheiten_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getByLv($studiensemester_kurzbz = null, $lehrveranstaltung_id = null)
|
||||||
|
{
|
||||||
|
if (is_null($lehrveranstaltung_id))
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
|
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||||
|
|
||||||
|
$tree = [];
|
||||||
|
|
||||||
|
$this->_ci->LehrveranstaltungModel->addSelect('studiengang_kz');
|
||||||
|
$lv = $this->_ci->LehrveranstaltungModel->load($lehrveranstaltung_id);
|
||||||
|
$lv = $this->getDataOrTerminateWithError($lv);
|
||||||
|
|
||||||
|
if (empty($lv))
|
||||||
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
|
$lehrveranstaltungen_data = array();
|
||||||
|
foreach ($this->_loadLvRows(current($lv)->studiengang_kz, $studiensemester_kurzbz) as $row)
|
||||||
|
{
|
||||||
|
if ((string)$row->lehrveranstaltung_id === (string)$lehrveranstaltung_id)
|
||||||
|
{
|
||||||
|
$lehrveranstaltungen_data[] = $row;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($lehrveranstaltungen_data))
|
||||||
|
{
|
||||||
|
|
||||||
|
$this->_ci->LehrveranstaltungModel->addSelect('
|
||||||
|
tbl_lehrveranstaltung.*,
|
||||||
|
tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
|
||||||
|
lehrveranstaltung_id,
|
||||||
|
lehrtyp_kurzbz,
|
||||||
|
studiengang_kz as lv_studiengang_kz,
|
||||||
|
UPPER(CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz)) as studiengang,
|
||||||
|
semester as semester,
|
||||||
|
tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
|
||||||
|
ects as lv_ects,
|
||||||
|
lehreverzeichnis as lv_lehreverzeichnis,
|
||||||
|
planfaktor as lv_planfaktor,
|
||||||
|
planlektoren as lv_planlektoren,
|
||||||
|
planpersonalkosten as lv_planpersonalkosten,
|
||||||
|
plankostenprolektor as lv_plankostenprolektor,
|
||||||
|
tbl_lehrveranstaltung.orgform_kurzbz as orgform_kurzbz,
|
||||||
|
tbl_lehrveranstaltung.sprache as sprache,
|
||||||
|
lehrform_kurzbz as lv_lehrform_kurzbz,
|
||||||
|
tbl_lehrveranstaltung.bezeichnung_english as lv_bezeichnung_english,
|
||||||
|
semesterstunden as lv_semesterstunden,
|
||||||
|
');
|
||||||
|
$this->_ci->LehrveranstaltungModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
|
||||||
|
$lehrveranstaltungen = $this->_ci->LehrveranstaltungModel->load($lehrveranstaltung_id);
|
||||||
|
$lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($lehrveranstaltungen_data as $lehrveranstaltung)
|
||||||
|
{
|
||||||
|
$lehreinheiten = $this->_ci->LehreinheitModel->getByLvidStudiensemester($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz);
|
||||||
|
$lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten);
|
||||||
|
|
||||||
|
if (!isset($lehrveranstaltung->_children))
|
||||||
|
{
|
||||||
|
$lehrveranstaltung->_children = $lehreinheiten_data;
|
||||||
|
}
|
||||||
|
$tree[] = $lehrveranstaltung;
|
||||||
|
}
|
||||||
|
|
||||||
|
$counter = 0;
|
||||||
|
$this->assignUniqueIndex($tree, $counter);
|
||||||
|
$this->terminateWithSuccess($tree);
|
||||||
|
}
|
||||||
|
|
||||||
public function getByStg($studiensemester_kurzbz = null, $stg_kz = null, $semester = null)
|
public function getByStg($studiensemester_kurzbz = null, $stg_kz = null, $semester = null)
|
||||||
|
{
|
||||||
|
$this->_getLvTree($studiensemester_kurzbz, $stg_kz, $semester, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getByStgOrgform($studiensemester_kurzbz = null, $stg_kz = null, $orgform = null, $semester = null)
|
||||||
|
{
|
||||||
|
$orgform_kurzbz = $this->getOrgformKurzbz($orgform);
|
||||||
|
$this->_getLvTree($studiensemester_kurzbz, $stg_kz, $semester, $orgform_kurzbz);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function _getLvTree($studiensemester_kurzbz, $stg_kz, $semester, $orgform_kurzbz)
|
||||||
{
|
{
|
||||||
$studiengang_kz = $this->getStudiengangKz($stg_kz);
|
$studiengang_kz = $this->getStudiengangKz($stg_kz);
|
||||||
|
|
||||||
if (is_null($studiengang_kz) || !preg_match("/^(-?[1-9][0-9]*|0)$/", (string)$studiengang_kz))
|
if (is_null($studiengang_kz) || !preg_match("/^(-?[1-9][0-9]*|0)$/", (string)$studiengang_kz))
|
||||||
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
$verband = null;
|
if (!is_null($semester) && !ctype_digit((string)$semester))
|
||||||
if (!is_null($semester) && !is_numeric($semester))
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
{
|
|
||||||
$verband = $this->getOrgformKurzbz($semester);
|
|
||||||
$semester = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
|
|
||||||
|
|
||||||
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
|
||||||
$studienplan_data = $this->_ci->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $semester, $verband);
|
|
||||||
|
|
||||||
$studienplan_ids = array();
|
$lehrveranstaltungen_data = $this->_loadLvRows($studiengang_kz, $studiensemester_kurzbz, $semester, $orgform_kurzbz);
|
||||||
$only_ids = array();
|
|
||||||
$placeholders = array();
|
|
||||||
|
|
||||||
if (hasData($studienplan_data))
|
|
||||||
{
|
|
||||||
foreach (getData($studienplan_data) as $studienplan) {
|
|
||||||
$placeholders[] = "(?, ?)";
|
|
||||||
$studienplan_ids[] = $studienplan->studienplan_id;
|
|
||||||
$studienplan_ids[] = $studienplan->semester;
|
|
||||||
$only_ids[] = $studienplan->studienplan_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$lehrveranstaltungen_data = $this->_ci->LehrveranstaltungModel->getLvsByStudiengang($studienplan_ids, $placeholders, $only_ids, $studiengang_kz, $studiensemester_kurzbz, $semester, $verband);
|
|
||||||
$lehrveranstaltungen_data = hasData($lehrveranstaltungen_data) ? getData($lehrveranstaltungen_data) : array();
|
|
||||||
|
|
||||||
$tree = [];
|
$tree = [];
|
||||||
foreach ($lehrveranstaltungen_data as $row)
|
foreach ($lehrveranstaltungen_data as $row)
|
||||||
@@ -244,6 +323,31 @@ class Lehrveranstaltung extends FHCAPI_Controller
|
|||||||
|
|
||||||
$this->LehreinheitModel->getLvsByFachbereich($fachbereich, $studiensemester_kurzbz, $mitarbeiter_uid);
|
$this->LehreinheitModel->getLvsByFachbereich($fachbereich, $studiensemester_kurzbz, $mitarbeiter_uid);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
private function _loadLvRows($studiengang_kz, $studiensemester_kurzbz, $semester = null, $orgform_kurzbz = null)
|
||||||
|
{
|
||||||
|
$this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
|
||||||
|
|
||||||
|
$studienplan_data = $this->_ci->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $semester, $orgform_kurzbz);
|
||||||
|
|
||||||
|
$studienplan_ids = array();
|
||||||
|
$only_ids = array();
|
||||||
|
$placeholders = array();
|
||||||
|
|
||||||
|
if (hasData($studienplan_data))
|
||||||
|
{
|
||||||
|
foreach (getData($studienplan_data) as $studienplan) {
|
||||||
|
$placeholders[] = "(?, ?)";
|
||||||
|
$studienplan_ids[] = $studienplan->studienplan_id;
|
||||||
|
$studienplan_ids[] = $studienplan->semester;
|
||||||
|
$only_ids[] = $studienplan->studienplan_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$lehrveranstaltungen_data = $this->_ci->LehrveranstaltungModel->getLvsByStudiengang($studienplan_ids, $placeholders, $only_ids, $studiengang_kz, $studiensemester_kurzbz, $semester, $orgform_kurzbz);
|
||||||
|
return hasData($lehrveranstaltungen_data) ? getData($lehrveranstaltungen_data) : array();
|
||||||
|
}
|
||||||
|
|
||||||
private function _setAuthUID()
|
private function _setAuthUID()
|
||||||
{
|
{
|
||||||
$this->_uid = getAuthUID();
|
$this->_uid = getAuthUID();
|
||||||
@@ -309,8 +413,8 @@ class Lehrveranstaltung extends FHCAPI_Controller
|
|||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
if (!$data)
|
if (!$data)
|
||||||
return $orgform_kurzbz;
|
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
return current($data)->orgform_kurzbz;
|
return current($data)->orgform_kurzbz;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -101,6 +101,9 @@ class Widget extends FHCAPI_Controller
|
|||||||
$tmpsetup = json_decode($widget->setup);
|
$tmpsetup = json_decode($widget->setup);
|
||||||
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
|
||||||
$widget->setup = $tmpsetup;
|
$widget->setup = $tmpsetup;
|
||||||
|
$widget->permitted = empty($widget->berechtigung_kurzbz)
|
||||||
|
|| $this->permissionlib->isBerechtigt($widget->berechtigung_kurzbz);
|
||||||
|
|
||||||
return $widget;
|
return $widget;
|
||||||
}, $widgets);
|
}, $widgets);
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ class Studiensemester extends FHCAPI_Controller
|
|||||||
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
|
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
|
||||||
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED,
|
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED,
|
||||||
'current' => self::PERM_LOGGED,
|
'current' => self::PERM_LOGGED,
|
||||||
'set' => self::PERM_LOGGED
|
'set' => self::PERM_LOGGED,
|
||||||
|
'getContainingOrNearestByDateRange' => self::PERM_LOGGED,
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
// Load model StudiensemesterModel
|
// Load model StudiensemesterModel
|
||||||
@@ -203,4 +204,15 @@ class Studiensemester extends FHCAPI_Controller
|
|||||||
|
|
||||||
$this->terminateWithSuccess(true);
|
$this->terminateWithSuccess(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getContainingOrNearestByDateRange()
|
||||||
|
{
|
||||||
|
$from = $this->input->get("from");
|
||||||
|
$to = $this->input->get("to");
|
||||||
|
|
||||||
|
$result = $this->StudiensemesterModel->getContainingOrNearestByDateRange($from, $to);
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -574,6 +574,19 @@ class Kontakt extends FHCAPI_Controller
|
|||||||
$person_id = $this->input->post('person_id');
|
$person_id = $this->input->post('person_id');
|
||||||
$standort_id = $this->input->post('standort_id');
|
$standort_id = $this->input->post('standort_id');
|
||||||
|
|
||||||
|
//check person_id: allow editing only of persons who are no mitarbeiter
|
||||||
|
if($person_id)
|
||||||
|
{
|
||||||
|
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||||
|
$this->BenutzerModel->addJoin('public.tbl_mitarbeiter ma', 'ON (ma.mitarbeiter_uid = public.tbl_benutzer.uid)');
|
||||||
|
|
||||||
|
$result = $this->BenutzerModel->loadWhere([
|
||||||
|
'person_id' => $person_id
|
||||||
|
]);
|
||||||
|
if(hasData($result))
|
||||||
|
return $this->terminateWithError($this->p->t('ui', 'editingMitarbeiterPVonly'), self::ERROR_TYPE_GENERAL);
|
||||||
|
}
|
||||||
|
|
||||||
$result = $this->KontaktModel->update(
|
$result = $this->KontaktModel->update(
|
||||||
[
|
[
|
||||||
'kontakt_id' => $kontakt_id
|
'kontakt_id' => $kontakt_id
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class SearchBarLib
|
|||||||
const ERROR_NOT_AUTH = 'ERR005';
|
const ERROR_NOT_AUTH = 'ERR005';
|
||||||
|
|
||||||
// List of allowed types of search
|
// List of allowed types of search
|
||||||
const ALLOWED_TYPES = ['mitarbeiter', 'mitarbeiter_ohne_zuordnung', 'organisationunit', 'raum', 'person', 'student','studentStv', 'prestudent', 'document', 'cms'];
|
const ALLOWED_TYPES = ['mitarbeiter', 'mitarbeiter_ohne_zuordnung', 'organisationunit', 'raum', 'person', 'student','studentStv', 'prestudent', 'document', 'cms', 'lehreinheit', 'lehrveranstaltung'];
|
||||||
|
|
||||||
const PHOTO_IMG_URL = '/cis/public/bild.php?src=person&person_id=';
|
const PHOTO_IMG_URL = '/cis/public/bild.php?src=person&person_id=';
|
||||||
|
|
||||||
@@ -180,10 +180,14 @@ class SearchBarLib
|
|||||||
protected function buildSearchClause(DB_Model $dbModel, array $columns, $searchstr)
|
protected function buildSearchClause(DB_Model $dbModel, array $columns, $searchstr)
|
||||||
{
|
{
|
||||||
$searchstr = preg_replace('/[[:punct:]]/', ' ', $searchstr);
|
$searchstr = preg_replace('/[[:punct:]]/', ' ', $searchstr);
|
||||||
|
$words = preg_split('/\s+/', trim($searchstr), -1, PREG_SPLIT_NO_EMPTY);
|
||||||
|
|
||||||
|
if (empty($words)) return array();
|
||||||
|
|
||||||
$document = implode(' || \' \' || ', $columns);
|
$document = implode(' || \' \' || ', $columns);
|
||||||
$query = '\'' . implode(':* & ', explode(' ', trim($searchstr))) . ':*\'';
|
$query = '\'' . implode(':* & ', $words) . ':*\'';
|
||||||
$reversequery = '\'*:' . implode(' & *:', explode(' ', trim($searchstr))) . '\'';
|
$reversequery = '\'*:' . implode(' & *:', $words) . '\'';
|
||||||
$nospacequery = '\'' . implode('', explode(' ', trim($searchstr))) . ':*\'';
|
$nospacequery = '\'' . implode('', $words) . ':*\'';
|
||||||
|
|
||||||
$searchclause = <<<EOSC
|
$searchclause = <<<EOSC
|
||||||
to_tsvector(lower(regexp_replace({$document}, '[[:punct:]]', ' ', 'g'))) @@ to_tsquery(lower({$query}))
|
to_tsvector(lower(regexp_replace({$document}, '[[:punct:]]', ' ', 'g'))) @@ to_tsquery(lower({$query}))
|
||||||
@@ -596,5 +600,98 @@ EOSC;
|
|||||||
// Otherwise return an empty array
|
// Otherwise return an empty array
|
||||||
return array();
|
return array();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function _lehreinheit($searchstr, $type)
|
||||||
|
{
|
||||||
|
$dbModel = new DB_Model();
|
||||||
|
|
||||||
|
$idwhere = '';
|
||||||
|
if (ctype_digit(trim($searchstr)))
|
||||||
|
{
|
||||||
|
$id = (int)trim($searchstr);
|
||||||
|
$idwhere = ' OR le.lehreinheit_id = ' . $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
$lehreinheit = $dbModel->execReadOnlyQuery('
|
||||||
|
SELECT
|
||||||
|
\'teachingunit\' AS renderer,
|
||||||
|
\''.$type.'\' AS type,
|
||||||
|
le.lehreinheit_id AS id,
|
||||||
|
le.studiensemester_kurzbz,
|
||||||
|
lv.bezeichnung,
|
||||||
|
\'lv_table_icon icon-\' AS foto,
|
||||||
|
UPPER(stg.typ || stg.kurzbz) AS studiengang,
|
||||||
|
le.lehrform_kurzbz,
|
||||||
|
lv.semester
|
||||||
|
FROM lehre.tbl_lehreinheit le
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung lv ON (lv.lehrveranstaltung_id = le.lehrveranstaltung_id)
|
||||||
|
JOIN public.tbl_studiengang stg ON (stg.studiengang_kz = lv.studiengang_kz)
|
||||||
|
JOIN public.tbl_studiensemester sem ON (sem.studiensemester_kurzbz = le.studiensemester_kurzbz)
|
||||||
|
WHERE (' .
|
||||||
|
$this->buildSearchClause(
|
||||||
|
$dbModel,
|
||||||
|
array(
|
||||||
|
'(stg.typ || stg.kurzbz)',
|
||||||
|
'lv.semester',
|
||||||
|
'lv.bezeichnung'
|
||||||
|
),
|
||||||
|
$searchstr
|
||||||
|
) . ')' . $idwhere . '
|
||||||
|
');
|
||||||
|
|
||||||
|
// If something has been found then return it
|
||||||
|
if (hasData($lehreinheit)) return getData($lehreinheit);
|
||||||
|
|
||||||
|
// Otherwise return an empty array
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function _lehrveranstaltung($searchstr, $type)
|
||||||
|
{
|
||||||
|
$dbModel = new DB_Model();
|
||||||
|
|
||||||
|
$idwhere = '';
|
||||||
|
|
||||||
|
if (ctype_digit(trim($searchstr)))
|
||||||
|
{
|
||||||
|
$id = (int)trim($searchstr);
|
||||||
|
$idwhere = ' OR tbl_lehrveranstaltung.lehrveranstaltung_id = ' . $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
$lehreinheit = $dbModel->execReadOnlyQuery('
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
\'teachingunit\' AS renderer,
|
||||||
|
\''.$type.'\' AS type,
|
||||||
|
lehrveranstaltung_id as id,
|
||||||
|
tbl_lehrveranstaltung.bezeichnung,
|
||||||
|
\'lv_table_icon icon-lv\' as foto,
|
||||||
|
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as studiengang,
|
||||||
|
semester,
|
||||||
|
lehrform_kurzbz,
|
||||||
|
tbl_organisationseinheit.bezeichnung as oe_bezeichnung
|
||||||
|
FROM lehre.tbl_lehrveranstaltung
|
||||||
|
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
|
JOIN public.tbl_organisationseinheit ON tbl_lehrveranstaltung.oe_kurzbz = tbl_organisationseinheit.oe_kurzbz
|
||||||
|
WHERE (' .
|
||||||
|
$this->buildSearchClause(
|
||||||
|
$dbModel,
|
||||||
|
array(
|
||||||
|
'(tbl_studiengang.typ || tbl_studiengang.kurzbz)',
|
||||||
|
'semester',
|
||||||
|
'tbl_lehrveranstaltung.bezeichnung'
|
||||||
|
),
|
||||||
|
$searchstr
|
||||||
|
) . ')' . $idwhere . '
|
||||||
|
');
|
||||||
|
|
||||||
|
// If something has been found then return it
|
||||||
|
if (hasData($lehreinheit)) return getData($lehreinheit);
|
||||||
|
|
||||||
|
// Otherwise return an empty array
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -159,8 +159,6 @@ class LvVwLib
|
|||||||
if (!$stg->mischform)
|
if (!$stg->mischform)
|
||||||
return [];
|
return [];
|
||||||
|
|
||||||
$this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
|
|
||||||
|
|
||||||
return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz);
|
return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -340,6 +340,20 @@ EOSQL;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function getByLeStudiensemester($lehreinheit_id, $studiensemester_kurzbz)
|
||||||
|
{
|
||||||
|
$qry = "WITH lehreinheiten AS (
|
||||||
|
SELECT *
|
||||||
|
FROM lehre.tbl_lehreinheit
|
||||||
|
WHERE lehreinheit_id = ?
|
||||||
|
AND studiensemester_kurzbz = ?
|
||||||
|
)," . $this->_getLeCTE();
|
||||||
|
|
||||||
|
$params = array($lehreinheit_id, $studiensemester_kurzbz);
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, $params);
|
||||||
|
|
||||||
|
}
|
||||||
public function getByLvidStudiensemester($lv_id, $studiensemester_kurzbz, $mitarbeiter_uid = null, $fachbereich_kurzbz = null)
|
public function getByLvidStudiensemester($lv_id, $studiensemester_kurzbz, $mitarbeiter_uid = null, $fachbereich_kurzbz = null)
|
||||||
{
|
{
|
||||||
$qry = "WITH lehreinheiten AS (
|
$qry = "WITH lehreinheiten AS (
|
||||||
@@ -347,35 +361,7 @@ EOSQL;
|
|||||||
FROM lehre.tbl_lehreinheit
|
FROM lehre.tbl_lehreinheit
|
||||||
WHERE lehrveranstaltung_id = ?
|
WHERE lehrveranstaltung_id = ?
|
||||||
AND studiensemester_kurzbz = ?
|
AND studiensemester_kurzbz = ?
|
||||||
),
|
)," . $this->_getLeCTE();
|
||||||
". $this->_getGruppenCTE() . ",
|
|
||||||
". $this->_getLektorenCTE() . ",
|
|
||||||
". $this->_getFachbereichCTE() . ",
|
|
||||||
". $this->_getTagsCTE() . "
|
|
||||||
|
|
||||||
SELECT lehreinheiten.*,
|
|
||||||
lehreinheiten.lehrform_kurzbz as lv_lehrform_kurzbz,
|
|
||||||
tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
|
|
||||||
tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
|
|
||||||
COALESCE(tag_data_agg.tags, '[]'::json) AS tags,
|
|
||||||
gruppen.gruppen,
|
|
||||||
mitarbeiter.lektoren,
|
|
||||||
mitarbeiter.le_planstunden,
|
|
||||||
mitarbeiter.vorname,
|
|
||||||
mitarbeiter.nachname,
|
|
||||||
mitarbeiter.semesterstunden,
|
|
||||||
fachbereich.bezeichnung as fachbereich,
|
|
||||||
UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang,
|
|
||||||
semester
|
|
||||||
FROM lehreinheiten
|
|
||||||
LEFT JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = lehreinheiten.lehrfach_id
|
|
||||||
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
|
||||||
LEFT JOIN tag_data_agg ON tag_data_agg.lehreinheit_id = lehreinheiten.lehreinheit_id
|
|
||||||
LEFT JOIN mitarbeiter ON lehreinheiten.lehreinheit_id = mitarbeiter.lehreinheit_id
|
|
||||||
LEFT JOIN fachbereich ON lehreinheiten.lehreinheit_id = fachbereich.lehreinheit_id
|
|
||||||
LEFT JOIN gruppen ON lehreinheiten.lehreinheit_id = gruppen.lehreinheit_id
|
|
||||||
WHERE true
|
|
||||||
";
|
|
||||||
|
|
||||||
$params = array($lv_id, $studiensemester_kurzbz);
|
$params = array($lv_id, $studiensemester_kurzbz);
|
||||||
|
|
||||||
@@ -395,9 +381,83 @@ EOSQL;
|
|||||||
return $this->execReadOnlyQuery($qry, $params);
|
return $this->execReadOnlyQuery($qry, $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getLVTmp($stg_kz = null)
|
public function getOffeneStunden($lehreinheit_ids)
|
||||||
{
|
{
|
||||||
$qry = "SELECT DISTINCT ON(lehrveranstaltung_id) *,
|
if (!is_array($lehreinheit_ids))
|
||||||
|
$lehreinheit_ids = [$lehreinheit_ids];
|
||||||
|
|
||||||
|
if (empty($lehreinheit_ids))
|
||||||
|
return success([]);
|
||||||
|
|
||||||
|
$db = new DB_Model();
|
||||||
|
$placeholders = implode(',', array_fill(0, count($lehreinheit_ids), '?'));
|
||||||
|
|
||||||
|
$qry = "WITH eventdauer AS (
|
||||||
|
SELECT
|
||||||
|
tbl_kalender_lehreinheit.lehreinheit_id,
|
||||||
|
tbl_kalender.von,
|
||||||
|
tbl_kalender.bis,
|
||||||
|
tbl_kalender.kalender_id
|
||||||
|
FROM lehre.tbl_lehreinheit
|
||||||
|
JOIN lehre.tbl_kalender_lehreinheit USING(lehreinheit_id)
|
||||||
|
JOIN lehre.tbl_kalender USING(kalender_id)
|
||||||
|
WHERE tbl_lehreinheit.lehreinheit_id IN ($placeholders)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM lehre.tbl_kalender nachfolger
|
||||||
|
WHERE nachfolger.vorgaenger_kalender_id = tbl_kalender.kalender_id)
|
||||||
|
AND tbl_kalender.status_kurzbz NOT IN ('deleted', 'todelete', 'archived')
|
||||||
|
GROUP BY tbl_kalender_lehreinheit.lehreinheit_id, tbl_kalender.von, tbl_kalender.bis, tbl_kalender.kalender_id
|
||||||
|
),
|
||||||
|
raster AS (
|
||||||
|
SELECT
|
||||||
|
eventdauer.lehreinheit_id,
|
||||||
|
eventdauer.kalender_id,
|
||||||
|
eventdauer.von,
|
||||||
|
eventdauer.bis,
|
||||||
|
vonstunde.stunde AS vonstunde_nr,
|
||||||
|
bisstunde.stunde AS bisstunde_nr
|
||||||
|
FROM eventdauer
|
||||||
|
LEFT JOIN lehre.tbl_stunde vonstunde ON eventdauer.von::time = vonstunde.beginn
|
||||||
|
LEFT JOIN lehre.tbl_stunde bisstunde ON eventdauer.bis::time = bisstunde.ende
|
||||||
|
),
|
||||||
|
unterrichtsdauer AS (
|
||||||
|
SELECT
|
||||||
|
raster.lehreinheit_id,
|
||||||
|
raster.kalender_id,
|
||||||
|
sum(EXTRACT(EPOCH FROM (LEAST(stunde.ende, raster.bis::time) - GREATEST(stunde.beginn, raster.von::time))) / 60) AS minuten
|
||||||
|
FROM raster JOIN lehre.tbl_stunde stunde ON stunde.beginn < raster.bis::time AND stunde.ende > raster.von::time
|
||||||
|
WHERE raster.vonstunde_nr IS NULL OR raster.bisstunde_nr IS NULL
|
||||||
|
GROUP BY raster.lehreinheit_id, raster.kalender_id
|
||||||
|
),
|
||||||
|
verplantestunden AS (
|
||||||
|
SELECT raster.lehreinheit_id, raster.kalender_id,
|
||||||
|
CASE
|
||||||
|
WHEN raster.vonstunde_nr IS NOT NULL AND raster.bisstunde_nr IS NOT NULL
|
||||||
|
THEN (raster.bisstunde_nr - raster.vonstunde_nr + 1)
|
||||||
|
ELSE coalesce(unterrichtsdauer.minuten, 0) / 45
|
||||||
|
END AS verplantestunde
|
||||||
|
FROM raster LEFT JOIN unterrichtsdauer ON unterrichtsdauer.lehreinheit_id = raster.lehreinheit_id AND unterrichtsdauer.kalender_id = raster.kalender_id
|
||||||
|
),
|
||||||
|
verplant_gesamt AS (
|
||||||
|
SELECT lehreinheit_id, SUM(verplantestunde) AS verplant
|
||||||
|
FROM verplantestunden
|
||||||
|
GROUP BY lehreinheit_id
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
lema.lehreinheit_id,
|
||||||
|
lema.mitarbeiter_uid,
|
||||||
|
lema.planstunden,
|
||||||
|
ROUND(coalesce(verplant_gesamt.verplant, 0), 2) AS verplant,
|
||||||
|
ROUND((lema.planstunden - coalesce(verplant_gesamt.verplant, 0)), 2) AS offenestunden
|
||||||
|
FROM lehre.tbl_lehreinheitmitarbeiter lema
|
||||||
|
LEFT JOIN verplant_gesamt ON verplant_gesamt.lehreinheit_id = lema.lehreinheit_id
|
||||||
|
WHERE lema.lehreinheit_id IN ($placeholders)";
|
||||||
|
|
||||||
|
return $db->execReadOnlyQuery($qry, array_merge($lehreinheit_ids, $lehreinheit_ids));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getLVTmp()
|
||||||
|
{
|
||||||
|
return "SELECT DISTINCT ON(lehrveranstaltung_id) *,
|
||||||
'' as stundenblockung,
|
'' as stundenblockung,
|
||||||
'' as lehreinheit_id,
|
'' as lehreinheit_id,
|
||||||
'' as wochenrythmus,
|
'' as wochenrythmus,
|
||||||
@@ -408,24 +468,33 @@ EOSQL;
|
|||||||
'' as studienplan_beeichnung,
|
'' as studienplan_beeichnung,
|
||||||
UPPER(CONCAT(vw_lehreinheit.stg_typ, vw_lehreinheit.stg_kurzbz)) as studiengang
|
UPPER(CONCAT(vw_lehreinheit.stg_typ, vw_lehreinheit.stg_kurzbz)) as studiengang
|
||||||
FROM campus.vw_lehreinheit
|
FROM campus.vw_lehreinheit
|
||||||
WHERE mitarbeiter_uid = ?
|
WHERE studiensemester_kurzbz = ? ";
|
||||||
AND studiensemester_kurzbz = ?";
|
|
||||||
|
|
||||||
if (!is_null($stg_kz)) {
|
|
||||||
$qry .= " AND lv_studiengang_kz = ?";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $qry;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz = null)
|
public function getLvsById($lehrveranstaltung_id, $studiensemester_kurzbz)
|
||||||
{
|
{
|
||||||
$qry = "WITH lvs AS (" . $this->getLVTmp($stg_kz) . ")
|
$where = ' AND lehrveranstaltung_id = ?';
|
||||||
|
$qry = "WITH lvs AS (" . $this->getLVTmp() . $where .")
|
||||||
SELECT lvs.*
|
SELECT lvs.*
|
||||||
FROM lvs
|
FROM lvs
|
||||||
";
|
";
|
||||||
|
|
||||||
|
$params = array($studiensemester_kurzbz, $lehrveranstaltung_id);
|
||||||
|
return $this->execReadOnlyQuery($qry, $params);
|
||||||
|
}
|
||||||
|
public function getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz = null)
|
||||||
|
{
|
||||||
|
$where = ' AND mitarbeiter_uid = ?';
|
||||||
|
|
||||||
|
if ($stg_kz != null)
|
||||||
|
$where .= " AND lv_studiengang_kz = ?";
|
||||||
|
|
||||||
|
$qry = "WITH lvs AS (" . $this->getLVTmp() . $where .")
|
||||||
|
SELECT lvs.*
|
||||||
|
FROM lvs";
|
||||||
|
|
||||||
|
$params = array($studiensemester_kurzbz, $mitarbeiter_uid);
|
||||||
|
|
||||||
$params = array($mitarbeiter_uid, $studiensemester_kurzbz);
|
|
||||||
if (!is_null($stg_kz))
|
if (!is_null($stg_kz))
|
||||||
{
|
{
|
||||||
$params[] = $stg_kz;
|
$params[] = $stg_kz;
|
||||||
@@ -632,6 +701,36 @@ EOSQL;
|
|||||||
return success('Contract successfully updated.');
|
return success('Contract successfully updated.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function _getLeCTE()
|
||||||
|
{
|
||||||
|
return $this->_getGruppenCTE() . ",
|
||||||
|
". $this->_getLektorenCTE() . ",
|
||||||
|
". $this->_getFachbereichCTE() . ",
|
||||||
|
". $this->_getTagsCTE() . "
|
||||||
|
|
||||||
|
SELECT lehreinheiten.*,
|
||||||
|
lehreinheiten.lehrform_kurzbz as lv_lehrform_kurzbz,
|
||||||
|
tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
|
||||||
|
tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
|
||||||
|
COALESCE(tag_data_agg.tags, '[]'::json) AS tags,
|
||||||
|
gruppen.gruppen,
|
||||||
|
mitarbeiter.lektoren,
|
||||||
|
mitarbeiter.le_planstunden,
|
||||||
|
mitarbeiter.vorname,
|
||||||
|
mitarbeiter.nachname,
|
||||||
|
mitarbeiter.semesterstunden,
|
||||||
|
fachbereich.bezeichnung as fachbereich,
|
||||||
|
UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang,
|
||||||
|
semester
|
||||||
|
FROM lehreinheiten
|
||||||
|
LEFT JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = lehreinheiten.lehrfach_id
|
||||||
|
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
|
LEFT JOIN tag_data_agg ON tag_data_agg.lehreinheit_id = lehreinheiten.lehreinheit_id
|
||||||
|
LEFT JOIN mitarbeiter ON lehreinheiten.lehreinheit_id = mitarbeiter.lehreinheit_id
|
||||||
|
LEFT JOIN fachbereich ON lehreinheiten.lehreinheit_id = fachbereich.lehreinheit_id
|
||||||
|
LEFT JOIN gruppen ON lehreinheiten.lehreinheit_id = gruppen.lehreinheit_id
|
||||||
|
WHERE true";
|
||||||
|
}
|
||||||
private function _getGruppenCTE()
|
private function _getGruppenCTE()
|
||||||
{
|
{
|
||||||
return "gruppen AS (
|
return "gruppen AS (
|
||||||
|
|||||||
@@ -292,13 +292,29 @@ class Studiensemester_model extends DB_Model
|
|||||||
COALESCE(
|
COALESCE(
|
||||||
(SELECT studiensemester_kurzbz FROM semester_interval_startdate),
|
(SELECT studiensemester_kurzbz FROM semester_interval_startdate),
|
||||||
(SELECT studiensemester_kurzbz FROM nearest_semester_interval_startdate)
|
(SELECT studiensemester_kurzbz FROM nearest_semester_interval_startdate)
|
||||||
) AS studiensemester_kurzbz
|
) AS studiensemester_kurzbz,
|
||||||
|
COALESCE(
|
||||||
|
(SELECT start FROM semester_interval_startdate),
|
||||||
|
(SELECT start FROM nearest_semester_interval_startdate)
|
||||||
|
) as start,
|
||||||
|
COALESCE(
|
||||||
|
(SELECT ende FROM semester_interval_startdate),
|
||||||
|
(SELECT ende FROM nearest_semester_interval_startdate)
|
||||||
|
) as ende
|
||||||
UNION
|
UNION
|
||||||
SELECT
|
SELECT
|
||||||
COALESCE(
|
COALESCE(
|
||||||
(SELECT studiensemester_kurzbz FROM semester_interval_enddate),
|
(SELECT studiensemester_kurzbz FROM semester_interval_enddate),
|
||||||
(SELECT studiensemester_kurzbz FROM nearest_semester_interval_enddate)
|
(SELECT studiensemester_kurzbz FROM nearest_semester_interval_enddate)
|
||||||
) AS studiensemester_kurzbz
|
) AS studiensemester_kurzbz,
|
||||||
|
COALESCE(
|
||||||
|
(SELECT start FROM semester_interval_enddate),
|
||||||
|
(SELECT start FROM nearest_semester_interval_enddate)
|
||||||
|
) as start,
|
||||||
|
COALESCE(
|
||||||
|
(SELECT ende FROM semester_interval_enddate),
|
||||||
|
(SELECT ende FROM nearest_semester_interval_enddate)
|
||||||
|
) as ende
|
||||||
|
|
||||||
EOSQL;
|
EOSQL;
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ $this->load->view('templates/FHC-Header', $includesArray);
|
|||||||
?>
|
?>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
document.body.classList.add("cis4");
|
||||||
if (window.self !== window.top)
|
if (window.self !== window.top)
|
||||||
document.body.classList.add("in-frame");
|
document.body.classList.add("in-frame");
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
* Manuela Thamer <[email protected]>
|
* Manuela Thamer <[email protected]>
|
||||||
*/
|
*/
|
||||||
require_once(dirname(__FILE__).'/basis_db.class.php');
|
require_once(dirname(__FILE__).'/basis_db.class.php');
|
||||||
|
require_once(dirname(__FILE__).'/mitarbeiter.class.php');
|
||||||
|
|
||||||
class entwicklungsteam extends basis_db
|
class entwicklungsteam extends basis_db
|
||||||
{
|
{
|
||||||
@@ -43,7 +44,6 @@ class entwicklungsteam extends basis_db
|
|||||||
public $ext_id;
|
public $ext_id;
|
||||||
|
|
||||||
public $besqual;
|
public $besqual;
|
||||||
public $studiengang_kz_old;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Konstruktor
|
* Konstruktor
|
||||||
@@ -74,7 +74,7 @@ class entwicklungsteam extends basis_db
|
|||||||
$qry = "SELECT * FROM bis.tbl_entwicklungsteam JOIN bis.tbl_besqual USING(besqualcode)
|
$qry = "SELECT * FROM bis.tbl_entwicklungsteam JOIN bis.tbl_besqual USING(besqualcode)
|
||||||
WHERE entwicklungsteam_id=".$this->db_add_param($entwicklungsteam_id);
|
WHERE entwicklungsteam_id=".$this->db_add_param($entwicklungsteam_id);
|
||||||
|
|
||||||
$qry.=";";
|
$qry.=";";
|
||||||
|
|
||||||
if($this->db_query($qry))
|
if($this->db_query($qry))
|
||||||
{
|
{
|
||||||
@@ -147,6 +147,11 @@ class entwicklungsteam extends basis_db
|
|||||||
$this->errormsg = 'Es muss ein Mitarbeiter angegeben werden';
|
$this->errormsg = 'Es muss ein Mitarbeiter angegeben werden';
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if(!$this->checkIfExistingUid($this->mitarbeiter_uid))
|
||||||
|
{
|
||||||
|
$this->errormsg = 'Bitte einen Eintrag aus dem Dropdown Personensuche auswählen!';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if($this->studiengang_kz=='')
|
if($this->studiengang_kz=='')
|
||||||
{
|
{
|
||||||
$this->errormsg = 'Es muss ein Studiengang angegeben werden';
|
$this->errormsg = 'Es muss ein Studiengang angegeben werden';
|
||||||
@@ -162,6 +167,26 @@ class entwicklungsteam extends basis_db
|
|||||||
$this->errormsg = 'Endedatum darf nicht vor Anfangsdatum liegen';
|
$this->errormsg = 'Endedatum darf nicht vor Anfangsdatum liegen';
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($this->beginn != '')
|
||||||
|
{
|
||||||
|
$beginnParts = explode('-', $this->beginn);
|
||||||
|
if (!checkdate((int)$beginnParts[1], (int)$beginnParts[2], (int)$beginnParts[0])) {
|
||||||
|
$this->errormsg = 'Anfangsdatum ist ungültig';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->ende != '')
|
||||||
|
{
|
||||||
|
$endeParts = explode('-', $this->ende);
|
||||||
|
if (!checkdate((int)$endeParts[1], (int)$endeParts[2], (int)$endeParts[0]))
|
||||||
|
{
|
||||||
|
$this->errormsg = 'Endedatum ist ungültig';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,30 +208,28 @@ class entwicklungsteam extends basis_db
|
|||||||
//Neuen Datensatz anlegen
|
//Neuen Datensatz anlegen
|
||||||
$qry = "INSERT INTO bis.tbl_entwicklungsteam (mitarbeiter_uid, studiengang_kz, besqualcode, beginn, ende,
|
$qry = "INSERT INTO bis.tbl_entwicklungsteam (mitarbeiter_uid, studiengang_kz, besqualcode, beginn, ende,
|
||||||
updateamum, updatevon, insertamum, insertvon) VALUES (".
|
updateamum, updatevon, insertamum, insertvon) VALUES (".
|
||||||
$this->db_add_param($this->mitarbeiter_uid).', '.
|
$this->db_add_param($this->mitarbeiter_uid).', '.
|
||||||
$this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '.
|
$this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '.
|
||||||
$this->db_add_param($this->besqualcode, FHC_INTEGER).', '.
|
$this->db_add_param($this->besqualcode, FHC_INTEGER).', '.
|
||||||
$this->db_add_param($this->beginn).', '.
|
$this->db_add_param($this->beginn).', '.
|
||||||
$this->db_add_param($this->ende).', '.
|
$this->db_add_param($this->ende).', '.
|
||||||
$this->db_add_param($this->updateamum).', '.
|
$this->db_add_param($this->updateamum).', '.
|
||||||
$this->db_add_param($this->updatevon).', '.
|
$this->db_add_param($this->updatevon).', '.
|
||||||
$this->db_add_param($this->insertamum).', '.
|
$this->db_add_param($this->insertamum).', '.
|
||||||
$this->db_add_param($this->insertvon).');';
|
$this->db_add_param($this->insertvon).');';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if($this->studiengang_kz_old=='')
|
|
||||||
$this->studiengang_kz_old = $this->studiengang_kz;
|
|
||||||
|
|
||||||
//Bestehenden Datensatz aktualisieren
|
//Bestehenden Datensatz aktualisieren
|
||||||
$qry= "UPDATE bis.tbl_entwicklungsteam SET".
|
$qry= "UPDATE bis.tbl_entwicklungsteam SET".
|
||||||
" besqualcode=".$this->db_add_param($this->besqualcode, FHC_INTEGER).",".
|
" besqualcode=".$this->db_add_param($this->besqualcode, FHC_INTEGER).",".
|
||||||
" beginn=".$this->db_add_param($this->beginn).",".
|
" beginn=".$this->db_add_param($this->beginn).",".
|
||||||
" studiengang_kz=".$this->db_add_param($this->studiengang_kz, FHC_INTEGER).",".
|
" studiengang_kz=".$this->db_add_param($this->studiengang_kz, FHC_INTEGER).",".
|
||||||
" ende=".$this->db_add_param($this->ende).",".
|
" ende=".$this->db_add_param($this->ende).",".
|
||||||
" updateamum=".$this->db_add_param($this->updateamum).",".
|
" mitarbeiter_uid=".$this->db_add_param($this->mitarbeiter_uid).",".
|
||||||
" updatevon=".$this->db_add_param($this->updatevon).
|
" updateamum=".$this->db_add_param($this->updateamum).",".
|
||||||
" WHERE entwicklungsteam_id=".$this->db_add_param($this->entwicklungsteam_id).";";
|
" updatevon=".$this->db_add_param($this->updatevon).
|
||||||
|
" WHERE entwicklungsteam_id=".$this->db_add_param($this->entwicklungsteam_id).";";
|
||||||
}
|
}
|
||||||
|
|
||||||
if($this->db_query($qry))
|
if($this->db_query($qry))
|
||||||
@@ -234,7 +257,7 @@ class entwicklungsteam extends basis_db
|
|||||||
if($studiengang_kz!=null)
|
if($studiengang_kz!=null)
|
||||||
$qry.=" AND studiengang_kz=".$this->db_add_param($studiengang_kz);
|
$qry.=" AND studiengang_kz=".$this->db_add_param($studiengang_kz);
|
||||||
|
|
||||||
$qry.=";";
|
$qry.=";";
|
||||||
|
|
||||||
if($this->db_query($qry))
|
if($this->db_query($qry))
|
||||||
{
|
{
|
||||||
@@ -316,7 +339,7 @@ class entwicklungsteam extends basis_db
|
|||||||
|
|
||||||
if ($sort != null)
|
if ($sort != null)
|
||||||
{
|
{
|
||||||
$qry .= " ORDER BY ".$sort;
|
$qry .= " ORDER BY ".$sort;
|
||||||
}
|
}
|
||||||
|
|
||||||
$qry .= ";";
|
$qry .= ";";
|
||||||
@@ -364,7 +387,7 @@ class entwicklungsteam extends basis_db
|
|||||||
$bismeldung_jahr = $datetime->format('Y');
|
$bismeldung_jahr = $datetime->format('Y');
|
||||||
|
|
||||||
//laden des Datensatzes
|
//laden des Datensatzes
|
||||||
$qry = "SELECT tbl_entwicklungsteam.*, tbl_besqual.*, tbl_studiengang.studiengang_kz, tbl_studiengang.melderelevant
|
$qry = "SELECT tbl_entwicklungsteam.*, tbl_besqual.*, tbl_studiengang.studiengang_kz, tbl_studiengang.melderelevant
|
||||||
FROM bis.tbl_entwicklungsteam
|
FROM bis.tbl_entwicklungsteam
|
||||||
JOIN bis.tbl_besqual USING(besqualcode)
|
JOIN bis.tbl_besqual USING(besqualcode)
|
||||||
JOIN public.tbl_studiengang USING(studiengang_kz)
|
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
@@ -375,7 +398,7 @@ class entwicklungsteam extends basis_db
|
|||||||
if($studiengang_kz!=null)
|
if($studiengang_kz!=null)
|
||||||
$qry.=" AND studiengang_kz=".$this->db_add_param($studiengang_kz);
|
$qry.=" AND studiengang_kz=".$this->db_add_param($studiengang_kz);
|
||||||
|
|
||||||
$qry.=";";
|
$qry.=";";
|
||||||
|
|
||||||
if($this->db_query($qry))
|
if($this->db_query($qry))
|
||||||
{
|
{
|
||||||
@@ -407,5 +430,20 @@ class entwicklungsteam extends basis_db
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Überprüft, ob die übergebene Uid in der Tabelle tbl_mitarbeiter vorhanden ist
|
||||||
|
* @param String $uid UID des Mitarbeiters
|
||||||
|
* @return true wenn vorhanden, false wenn nicht
|
||||||
|
*/
|
||||||
|
private function checkIfExistingUid($uid)
|
||||||
|
{
|
||||||
|
$mitarbeiter = new mitarbeiter();
|
||||||
|
|
||||||
|
if(!$mitarbeiter->checkIfExistingUid($uid))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|||||||
@@ -1995,5 +1995,23 @@ class mitarbeiter extends benutzer
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prueft ob eine existierende ma_uid übergeben wurde
|
||||||
|
* @param String $mitarbeiter_uid mitarbeiter_uid
|
||||||
|
* @return bool True wenn mitarbeiter_uid vorhanden sonst false.
|
||||||
|
*/
|
||||||
|
public function checkIfExistingUid($mitarbeiter_uid)
|
||||||
|
{
|
||||||
|
$qry = "Select 1 from public.tbl_mitarbeiter where mitarbeiter_uid =".$this->db_add_param($mitarbeiter_uid);
|
||||||
|
|
||||||
|
if ($result = $this->db_query($qry))
|
||||||
|
{
|
||||||
|
if ($this->db_num_rows($result) > 0)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|||||||
+25
-4
@@ -7,6 +7,11 @@ html {
|
|||||||
font-size: 0.875em;
|
font-size: 0.875em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.compat,
|
||||||
|
body.compat main#cis-main {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
.fhc-dark-bg{
|
.fhc-dark-bg{
|
||||||
background-color: var(--fhc-dark);
|
background-color: var(--fhc-dark);
|
||||||
color:var(--fhc-light) !important;
|
color:var(--fhc-light) !important;
|
||||||
@@ -454,8 +459,8 @@ html {
|
|||||||
|
|
||||||
/* desktop */
|
/* desktop */
|
||||||
@media (min-width: 992px) {
|
@media (min-width: 992px) {
|
||||||
body {
|
body.cis4 {
|
||||||
display: flex;
|
display: flex;
|
||||||
padding-top: var(--fhc-cis-header-height);
|
padding-top: var(--fhc-cis-header-height);
|
||||||
width: calc(100svw - var(--scrollbar-width, 0px));
|
width: calc(100svw - var(--scrollbar-width, 0px));
|
||||||
/* overflow: visible !important; */
|
/* overflow: visible !important; */
|
||||||
@@ -760,7 +765,7 @@ html {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.dashboard-item {
|
.dashboard-item {
|
||||||
overscroll-behavior: none;
|
overscroll-behavior: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.abgabe-zieldatum-border-red,
|
.abgabe-zieldatum-border-red,
|
||||||
@@ -853,4 +858,20 @@ html {
|
|||||||
border: 1px solid rgba(0, 0, 0, 0.15);
|
border: 1px solid rgba(0, 0, 0, 0.15);
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.cis-main-menu {
|
||||||
|
max-width: 100vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cis-main-menu ul {
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cis-main-menu ul li {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|||||||
@@ -44,5 +44,15 @@ export default {
|
|||||||
studiensemester_kurzbz
|
studiensemester_kurzbz
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
},
|
||||||
|
getContainingOrNearestByDateRange(from, to) {
|
||||||
|
return {
|
||||||
|
method: 'get',
|
||||||
|
url: 'api/frontend/v1/organisation/studiensemester/getContainingOrNearestByDateRange',
|
||||||
|
params: {
|
||||||
|
from,
|
||||||
|
to,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
};
|
};
|
||||||
@@ -17,6 +17,8 @@ const router = VueRouter.createRouter({
|
|||||||
component: LVVerwaltung,
|
component: LVVerwaltung,
|
||||||
children: [
|
children: [
|
||||||
{ name: 'emp', path: 'emp/:emp/:treemenu(.*)*', component: LVVerwaltung },
|
{ name: 'emp', path: 'emp/:emp/:treemenu(.*)*', component: LVVerwaltung },
|
||||||
|
{ name: 'le', path: 'le/:le', component: LVVerwaltung },
|
||||||
|
{ name: 'lv', path: 'lv/:lv', component: LVVerwaltung },
|
||||||
{ name: 'treemenu', path: ':treemenu(.*)*', component: LVVerwaltung }
|
{ name: 'treemenu', path: ':treemenu(.*)*', component: LVVerwaltung }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -103,6 +103,13 @@ export default {
|
|||||||
keyboard: this.keyboard
|
keyboard: this.keyboard
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
//to avoid pagelocks if more than one instance
|
||||||
|
beforeUnmount() {
|
||||||
|
if (this.modal) {
|
||||||
|
this.modal.dispose();
|
||||||
|
this.modal = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
popup(body, options, title, footer) {
|
popup(body, options, title, footer) {
|
||||||
const BsModal = this,
|
const BsModal = this,
|
||||||
slots = {};
|
slots = {};
|
||||||
|
|||||||
@@ -16,9 +16,15 @@ export default {
|
|||||||
return this.mode + '#' + this.path + '#' + this.query_string;
|
return this.mode + '#' + this.path + '#' + this.query_string;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
beforeMount: function() {
|
||||||
|
document.body.classList.add('compat');
|
||||||
|
},
|
||||||
mounted: function() {
|
mounted: function() {
|
||||||
this.srcUrl = this.buildSrcUrl();
|
this.srcUrl = this.buildSrcUrl();
|
||||||
},
|
},
|
||||||
|
beforeUnmount: function() {
|
||||||
|
document.body.classList.remove('compat');
|
||||||
|
},
|
||||||
watch: {
|
watch: {
|
||||||
propsWatchHelper: function() {
|
propsWatchHelper: function() {
|
||||||
if(this.lastLoadediFrameURL === '') {
|
if(this.lastLoadediFrameURL === '') {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import FhcCalendar from "../../Calendar/LvPlan.js";
|
import FhcCalendar from "../../Calendar/LvPlan.js";
|
||||||
|
|
||||||
import ApiLvPlan from '../../../api/factory/lvPlan.js';
|
import ApiLvPlan from '../../../api/factory/lvPlan.js';
|
||||||
|
import ApiStudienSemester from '../../../api/factory/studiensemester.js';
|
||||||
import ApiAuthinfo from '../../../api/factory/authinfo.js';
|
import ApiAuthinfo from '../../../api/factory/authinfo.js';
|
||||||
|
|
||||||
export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week";
|
export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week";
|
||||||
@@ -16,13 +17,12 @@ export default {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
studiensemester_kurzbz: null,
|
|
||||||
studiensemester_start: null,
|
|
||||||
studiensemester_ende: null,
|
|
||||||
uid: null,
|
uid: null,
|
||||||
isMitarbeiter: false,
|
isMitarbeiter: false,
|
||||||
isStudent: false,
|
isStudent: false,
|
||||||
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
||||||
|
startSemester: null,
|
||||||
|
endSemester: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
inject: ["isMobile"],
|
inject: ["isMobile"],
|
||||||
@@ -48,9 +48,12 @@ export default {
|
|||||||
return this.propsViewData?.mode;
|
return this.propsViewData?.mode;
|
||||||
},
|
},
|
||||||
downloadLinks() {
|
downloadLinks() {
|
||||||
if (!this.studiensemester_start || !this.studiensemester_ende || !this.uid)
|
const startDate = this.startSemester?.start;
|
||||||
return false;
|
const endDate = this.endSemester ? this.endSemester.ende : this.startSemester?.ende;
|
||||||
|
|
||||||
|
if (!startDate || !endDate || !this.uid)
|
||||||
|
return false;
|
||||||
|
|
||||||
let type = false;
|
let type = false;
|
||||||
type = this.isStudent ? 'student' : type;
|
type = this.isStudent ? 'student' : type;
|
||||||
type = this.isMitarbeiter ? 'lektor' : type;
|
type = this.isMitarbeiter ? 'lektor' : type;
|
||||||
@@ -61,10 +64,10 @@ export default {
|
|||||||
|
|
||||||
const opts = { zone: this.timezone };
|
const opts = { zone: this.timezone };
|
||||||
const start = luxon.DateTime
|
const start = luxon.DateTime
|
||||||
.fromISO(this.studiensemester_start, opts)
|
.fromISO(startDate, opts)
|
||||||
.toUnixInteger();
|
.toUnixInteger();
|
||||||
const ende = luxon.DateTime
|
const ende = luxon.DateTime
|
||||||
.fromISO(this.studiensemester_ende, opts)
|
.fromISO(endDate, opts)
|
||||||
.toUnixInteger();
|
.toUnixInteger();
|
||||||
|
|
||||||
const download_link = FHC_JS_DATA_STORAGE_OBJECT.app_root
|
const download_link = FHC_JS_DATA_STORAGE_OBJECT.app_root
|
||||||
@@ -109,16 +112,21 @@ export default {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
updateRange(rangeInterval) {
|
async updateRange(rangeInterval) {
|
||||||
this.$api
|
const semesterResponse = await this.$api.call(
|
||||||
.call(ApiLvPlan.studiensemesterDateInterval(
|
ApiStudienSemester.getContainingOrNearestByDateRange(
|
||||||
rangeInterval.end.startOf('week').toISODate()
|
rangeInterval.s.toISO().slice(0, 10),
|
||||||
))
|
rangeInterval.e.toISO().slice(0, 10),
|
||||||
.then(res => {
|
),
|
||||||
this.studiensemester_kurzbz = res.data.studiensemester_kurzbz;
|
);
|
||||||
this.studiensemester_start = res.data.start;
|
this.startSemester =
|
||||||
this.studiensemester_ende = res.data.ende;
|
semesterResponse.data.length
|
||||||
});
|
? semesterResponse.data[0]
|
||||||
|
: null;
|
||||||
|
this.endSemester =
|
||||||
|
semesterResponse.data.length > 1
|
||||||
|
? semesterResponse.data[1]
|
||||||
|
: null;
|
||||||
},
|
},
|
||||||
getPromiseFunc(start, end) {
|
getPromiseFunc(start, end) {
|
||||||
return [
|
return [
|
||||||
@@ -142,8 +150,11 @@ export default {
|
|||||||
<div class="cis-lvplan-personal d-flex flex-column h-100">
|
<div class="cis-lvplan-personal d-flex flex-column h-100">
|
||||||
<h2>
|
<h2>
|
||||||
{{ $p.t('lehre/stundenplan') }}
|
{{ $p.t('lehre/stundenplan') }}
|
||||||
<span v-if="studiensemester_kurzbz" class="ps-3">
|
<span v-if="startSemester?.studiensemester_kurzbz">
|
||||||
{{ studiensemester_kurzbz }}
|
{{ startSemester.studiensemester_kurzbz }}
|
||||||
|
<span v-if="endSemester?.studiensemester_kurzbz">
|
||||||
|
{{ "- " + endSemester.studiensemester_kurzbz }}
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</h2>
|
</h2>
|
||||||
<hr>
|
<hr>
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import FhcCalendar from "../../Calendar/LvPlan.js";
|
|||||||
import ApiLvPlan from "../.././../api/factory/lvPlan.js";
|
import ApiLvPlan from "../.././../api/factory/lvPlan.js";
|
||||||
import ApiOtherLvPlan from "../.././../api/factory/otherLvPlan.js";
|
import ApiOtherLvPlan from "../.././../api/factory/otherLvPlan.js";
|
||||||
import ApiAuthinfo from "../../../api/factory/authinfo.js";
|
import ApiAuthinfo from "../../../api/factory/authinfo.js";
|
||||||
|
import ApiStudienSemester from '../../../api/factory/studiensemester.js';
|
||||||
|
|
||||||
export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week";
|
export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week";
|
||||||
export const DEFAULT_MODE_LVPLAN_MOBILE = "List";
|
export const DEFAULT_MODE_LVPLAN_MOBILE = "List";
|
||||||
@@ -22,9 +23,6 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
localProps: {},
|
localProps: {},
|
||||||
studiensemester_kurzbz: null,
|
|
||||||
studiensemester_start: null,
|
|
||||||
studiensemester_ende: null,
|
|
||||||
isOtherPersonMitarbeiter: false,
|
isOtherPersonMitarbeiter: false,
|
||||||
isOtherPersonStudent: false,
|
isOtherPersonStudent: false,
|
||||||
currentStgBezeichnung: null,
|
currentStgBezeichnung: null,
|
||||||
@@ -36,6 +34,8 @@ export default {
|
|||||||
photo: "",
|
photo: "",
|
||||||
},
|
},
|
||||||
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
||||||
|
startSemester: null,
|
||||||
|
endSemester: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
inject: ["isMobile"],
|
inject: ["isMobile"],
|
||||||
@@ -67,11 +67,10 @@ export default {
|
|||||||
// do not show download links in otherLvPlan Mode
|
// do not show download links in otherLvPlan Mode
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (
|
const startDate = this.startSemester?.start;
|
||||||
!this.studiensemester_start ||
|
const endDate = this.endSemester ? this.endSemester.ende : this.startSemester?.ende;
|
||||||
!this.studiensemester_ende ||
|
|
||||||
!this.propsViewData.otherUid
|
if (!startDate || !endDate || !this.uid)
|
||||||
)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const type = this.isOtherPersonStudent
|
const type = this.isOtherPersonStudent
|
||||||
@@ -84,11 +83,11 @@ export default {
|
|||||||
|
|
||||||
const opts = { zone: this.timezone };
|
const opts = { zone: this.timezone };
|
||||||
const start = luxon.DateTime.fromISO(
|
const start = luxon.DateTime.fromISO(
|
||||||
this.studiensemester_start,
|
startDate,
|
||||||
opts,
|
opts,
|
||||||
).toUnixInteger();
|
).toUnixInteger();
|
||||||
const ende = luxon.DateTime.fromISO(
|
const ende = luxon.DateTime.fromISO(
|
||||||
this.studiensemester_ende,
|
endDate,
|
||||||
opts,
|
opts,
|
||||||
).toUnixInteger();
|
).toUnixInteger();
|
||||||
|
|
||||||
@@ -166,19 +165,21 @@ export default {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
updateRange(rangeInterval) {
|
async updateRange(rangeInterval) {
|
||||||
this.$api
|
const semesterResponse = await this.$api.call(
|
||||||
.call(
|
ApiStudienSemester.getContainingOrNearestByDateRange(
|
||||||
ApiLvPlan.studiensemesterDateInterval(
|
rangeInterval.s.toISO().slice(0, 10),
|
||||||
rangeInterval.end.startOf("week").toISODate(),
|
rangeInterval.e.toISO().slice(0, 10),
|
||||||
),
|
),
|
||||||
)
|
);
|
||||||
.then((res) => {
|
this.startSemester =
|
||||||
this.studiensemester_kurzbz =
|
semesterResponse.data.length
|
||||||
res.data.studiensemester_kurzbz;
|
? semesterResponse.data[0]
|
||||||
this.studiensemester_start = res.data.start;
|
: null;
|
||||||
this.studiensemester_ende = res.data.ende;
|
this.endSemester =
|
||||||
});
|
semesterResponse.data.length > 1
|
||||||
|
? semesterResponse.data[1]
|
||||||
|
: null;
|
||||||
},
|
},
|
||||||
getPromiseFunc(start, end) {
|
getPromiseFunc(start, end) {
|
||||||
return [
|
return [
|
||||||
@@ -250,8 +251,14 @@ export default {
|
|||||||
<div class="d-flex flex-column h-100">
|
<div class="d-flex flex-column h-100">
|
||||||
<h2>
|
<h2>
|
||||||
<div class="d-flex flex-row justify-content-between align-items-center">
|
<div class="d-flex flex-row justify-content-between align-items-center">
|
||||||
<span>
|
<span>
|
||||||
{{ $p.t('lehre/stundenplan') + (studiensemester_kurzbz ? " " + studiensemester_kurzbz : "") }}
|
{{ $p.t('lehre/stundenplan') }}
|
||||||
|
<span v-if="startSemester?.studiensemester_kurzbz">
|
||||||
|
{{ startSemester.studiensemester_kurzbz }}
|
||||||
|
<span v-if="endSemester?.studiensemester_kurzbz">
|
||||||
|
{{ "- " + endSemester.studiensemester_kurzbz }}
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<div @click="this.$router.push({name: 'ProfilView', params: {uid: propsViewData.otherUid}})" type="button" class="d-flex flex-row align-items-center gap-3">
|
<div @click="this.$router.push({name: 'ProfilView', params: {uid: propsViewData.otherUid}})" type="button" class="d-flex flex-row align-items-center gap-3">
|
||||||
<span v-if="otherPersonData.fullNameWithTitle?.length">
|
<span v-if="otherPersonData.fullNameWithTitle?.length">
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav id="nav-main" class="offcanvas offcanvas-start" tabindex="-1" aria-labelledby="nav-main-btn" data-bs-backdrop="false">
|
<nav id="nav-main" class="cis-main-menu offcanvas offcanvas-start" tabindex="-1" aria-labelledby="nav-main-btn" data-bs-backdrop="false">
|
||||||
<div id="nav-main-sticky">
|
<div id="nav-main-sticky">
|
||||||
<div class="d-flex flex-row h-100">
|
<div class="d-flex flex-row h-100">
|
||||||
<div class="offcanvas-body p-0">
|
<div class="offcanvas-body p-0">
|
||||||
|
|||||||
@@ -162,6 +162,7 @@ export default {
|
|||||||
<div class="btn-group w-100">
|
<div class="btn-group w-100">
|
||||||
<a :target="target"
|
<a :target="target"
|
||||||
:href="(entry.menu_open && hasFullLink) ? entry.url : null"
|
:href="(entry.menu_open && hasFullLink) ? entry.url : null"
|
||||||
|
draggable="false"
|
||||||
@click="toggleCollapse"
|
@click="toggleCollapse"
|
||||||
:class="{
|
:class="{
|
||||||
'btn btn-default rounded-0 text-start': true,
|
'btn btn-default rounded-0 text-start': true,
|
||||||
@@ -180,12 +181,15 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
<ul ref="children"
|
<ul ref="children"
|
||||||
class="nav w-100 collapse">
|
class="nav w-100 collapse">
|
||||||
<cis-menu-entry :highestMatchingUrlCount="highestMatchingUrlCount" :activeContent="activeContent" v-for="child in entry.childs" :key="child" :entry="child" :level="level + 1"/>
|
<li>
|
||||||
|
<cis-menu-entry :highestMatchingUrlCount="highestMatchingUrlCount" :activeContent="activeContent" v-for="child in entry.childs" :key="child" :entry="child" :level="level + 1"/>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</template>
|
</template>
|
||||||
<a v-else
|
<a v-else
|
||||||
:href="entry.url"
|
:href="entry.url"
|
||||||
:target="target"
|
:target="target"
|
||||||
|
draggable="false"
|
||||||
:class="{
|
:class="{
|
||||||
'btn btn-default rounded-0 w-100 text-start': true,
|
'btn btn-default rounded-0 w-100 text-start': true,
|
||||||
['btn-level-' + level]: true,
|
['btn-level-' + level]: true,
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ export default {
|
|||||||
// check if the lv has lvplan entries for this studiensemester
|
// check if the lv has lvplan entries for this studiensemester
|
||||||
if (this.studiensemester && this.event) {
|
if (this.studiensemester && this.event) {
|
||||||
return this.$fhcApi.factory.studium.getLvPlanForStudiensemester(this.studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id)
|
return this.$fhcApi.factory.studium.getLvPlanForStudiensemester(this.studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id)
|
||||||
.then(data => data.data)
|
.then(data => data.data?.retval)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
if (Array.isArray(res) && res.length > 0) {
|
if (Array.isArray(res) && res.length > 0) {
|
||||||
this.hasLvPlanEintraege = true;
|
this.hasLvPlanEintraege = true;
|
||||||
@@ -114,4 +114,4 @@ export default {
|
|||||||
|
|
||||||
|
|
||||||
`,
|
`,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: 'Cis-Renderer-Feiertag-CalendarEvent',
|
||||||
props: {
|
props: {
|
||||||
event: {
|
event: {
|
||||||
type: Object,
|
type: Object,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { formatDate } from "../../../../helpers/DateHelpers.js"
|
import { formatDate } from "../../../../helpers/DateHelpers.js"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: 'Cis-Renderer-Feiertag-ModalContent',
|
||||||
props:{
|
props:{
|
||||||
event: {
|
event: {
|
||||||
type: Object,
|
type: Object,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
export default {
|
export default {
|
||||||
|
name: 'Cis-Renderer-Feiertag-ModalTitle',
|
||||||
props:{
|
props:{
|
||||||
event: {
|
event: {
|
||||||
type: Object,
|
type: Object,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
export default {
|
export default {
|
||||||
|
name: 'Cis-Renderer-Lehreinheit-CalendarEvent',
|
||||||
props:{
|
props:{
|
||||||
event: {
|
event: {
|
||||||
type: Object,
|
type: Object,
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import ApiLvPlan from '../../../../api/factory/lvPlan.js';
|
|||||||
import ApiAddons from '../../../../api/factory/addons.js';
|
import ApiAddons from '../../../../api/factory/addons.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: 'Cis-Renderer-Lehreinheit-ModalContent',
|
||||||
components:{
|
components:{
|
||||||
LvMenu,
|
LvMenu,
|
||||||
},
|
},
|
||||||
@@ -49,6 +50,16 @@ export default {
|
|||||||
return this.event.ende;
|
return this.event.ende;
|
||||||
}
|
}
|
||||||
return numberPadding(this.event.ende.getHours()) + ":" + numberPadding(this.event.ende.getMinutes());
|
return numberPadding(this.event.ende.getHours()) + ":" + numberPadding(this.event.ende.getMinutes());
|
||||||
|
},
|
||||||
|
showLvMenu: function() {
|
||||||
|
const hideOnRoutes = [
|
||||||
|
'OtherLvPlan',
|
||||||
|
'StgOrgLvPlan'
|
||||||
|
];
|
||||||
|
if(hideOnRoutes.includes(this.$route.name)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@@ -162,6 +173,6 @@ export default {
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<lv-menu v-if="lvMenu.length && $route.name === 'MyLvPlan'" :containerStyles="['p-0']" :rowStyles="['m-0']" :menu="lvMenu" />
|
<lv-menu v-if="lvMenu.length && showLvMenu" :containerStyles="['p-0']" :rowStyles="['m-0']" :menu="lvMenu" />
|
||||||
</div>`,
|
</div>`,
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
export default {
|
export default {
|
||||||
|
name: 'Cis-Renderer-Lehreinheit-ModalTitle',
|
||||||
props:{
|
props:{
|
||||||
event: {
|
event: {
|
||||||
type: Object,
|
type: Object,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
export default {
|
export default {
|
||||||
|
name: 'Cis-Renderer-Reservierung-CalendarEvent',
|
||||||
props: {
|
props: {
|
||||||
event: {
|
event: {
|
||||||
type: Object,
|
type: Object,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { numberPadding, formatDate } from "../../../../helpers/DateHelpers.js"
|
|||||||
import LvMenu from "../../Mylv/LvMenu.js";
|
import LvMenu from "../../Mylv/LvMenu.js";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: 'Cis-Renderer-Reservierung-ModalContent',
|
||||||
props:{
|
props:{
|
||||||
event: {
|
event: {
|
||||||
type: Object,
|
type: Object,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
export default {
|
export default {
|
||||||
|
name: 'Cis-Renderer-Reservierung-ModalTitle',
|
||||||
props:{
|
props:{
|
||||||
event: {
|
event: {
|
||||||
type: Object,
|
type: Object,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import BsModal from "../Bootstrap/Modal.js";
|
import BsModal from "../Bootstrap/Modal.js";
|
||||||
import HeightTransition from "../Tranistion/HeightTransition.js";
|
import HeightTransition from "../Tranistion/HeightTransition.js";
|
||||||
|
import MissingPermissionWidget from "../DashboardWidget/MissingPermission.js";
|
||||||
|
|
||||||
import { enableDragDropTouch } from "../../../../vendor/drag-drop-touch-js/dragdroptouch/dist/drag-drop-touch.esm.min.js";
|
import { enableDragDropTouch } from "../../../../vendor/drag-drop-touch-js/dragdroptouch/dist/drag-drop-touch.esm.min.js";
|
||||||
|
|
||||||
@@ -112,6 +113,12 @@ export default {
|
|||||||
isPinned() {
|
isPinned() {
|
||||||
return this.place?.pinned ? true : false;
|
return this.place?.pinned ? true : false;
|
||||||
},
|
},
|
||||||
|
permitted() {
|
||||||
|
// widgets without a linked permission (or before the template loaded)
|
||||||
|
// are considered permitted; the backend sets permitted === false only
|
||||||
|
// when the user is missing the widget's required permission
|
||||||
|
return this.widgetTemplate?.permitted !== false;
|
||||||
|
},
|
||||||
ready() {
|
ready() {
|
||||||
return this.component && this.arguments !== null;
|
return this.component && this.arguments !== null;
|
||||||
}
|
}
|
||||||
@@ -169,7 +176,11 @@ export default {
|
|||||||
&& this.widgetTemplate.widget_id
|
&& this.widgetTemplate.widget_id
|
||||||
&& this.widgetTemplate.arguments
|
&& this.widgetTemplate.arguments
|
||||||
) {
|
) {
|
||||||
let component = (await import(this.widgetTemplate.setup.file)).default;
|
// render the "missing permission" screen instead of the actual
|
||||||
|
// widget when the user does not hold the widget's linked permission
|
||||||
|
let component = this.permitted
|
||||||
|
? (await import(this.widgetTemplate.setup.file)).default
|
||||||
|
: MissingPermissionWidget;
|
||||||
this.$options.components["widget" + this.widgetTemplate.widget_id] = component;
|
this.$options.components["widget" + this.widgetTemplate.widget_id] = component;
|
||||||
this.component = "widget" + this.widgetTemplate.widget_id;
|
this.component = "widget" + this.widgetTemplate.widget_id;
|
||||||
this.arguments = { ...this.widgetTemplate.arguments, ...this.config };
|
this.arguments = { ...this.widgetTemplate.arguments, ...this.config };
|
||||||
@@ -269,7 +280,7 @@ export default {
|
|||||||
</template>
|
</template>
|
||||||
<!-- widget link -->
|
<!-- widget link -->
|
||||||
<a
|
<a
|
||||||
v-if="widgetTemplate.setup.cis4link"
|
v-if="widgetTemplate.setup.cis4link && permitted"
|
||||||
:href="getWidgetC4Link(widgetTemplate)"
|
:href="getWidgetC4Link(widgetTemplate)"
|
||||||
class="col-auto ms-auto"
|
class="col-auto ms-auto"
|
||||||
:aria-label="$p.t('dashboard/widget_link')"
|
:aria-label="$p.t('dashboard/widget_link')"
|
||||||
|
|||||||
@@ -14,10 +14,14 @@ export default {
|
|||||||
callbacks: {}
|
callbacks: {}
|
||||||
}),
|
}),
|
||||||
computed: {
|
computed: {
|
||||||
|
// filter widgets away the user has no permissions for
|
||||||
|
availableWidgets() {
|
||||||
|
return (this.widgets || []).filter(widget => widget.permitted !== false);
|
||||||
|
},
|
||||||
hasAnyWidgets() {
|
hasAnyWidgets() {
|
||||||
if (!this.widgets)
|
if (!this.widgets)
|
||||||
return false;
|
return false;
|
||||||
if (!this.widgets.length && !this.hiddenWidgets?.length)
|
if (!this.availableWidgets.length && !this.hiddenWidgets?.length)
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -54,7 +58,7 @@ export default {
|
|||||||
<template v-slot:default>
|
<template v-slot:default>
|
||||||
<template v-if="widgets && hiddenWidgets">
|
<template v-if="widgets && hiddenWidgets">
|
||||||
<div
|
<div
|
||||||
v-if="!widgets.length && !hiddenWidgets.length"
|
v-if="!availableWidgets.length && !hiddenWidgets.length"
|
||||||
class="row g-2"
|
class="row g-2"
|
||||||
>
|
>
|
||||||
<div>{{ $p.t('dashboard/noWidgetsAvailable') }}</div>
|
<div>{{ $p.t('dashboard/noWidgetsAvailable') }}</div>
|
||||||
@@ -74,16 +78,17 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="widgets.length"
|
v-if="availableWidgets.length"
|
||||||
class="row g-2"
|
class="row g-2"
|
||||||
>
|
>
|
||||||
<div
|
<template
|
||||||
v-for="widget in widgets"
|
v-for="widget in availableWidgets"
|
||||||
:key="widget.widget_id"
|
:key="widget.widget_id"
|
||||||
class="widget-icon-container col-sm-6 col-md-4 col-lg-3 col-xl-2"
|
|
||||||
>
|
>
|
||||||
<widget-icon @select="pick" :widget="widget"></widget-icon>
|
<div v-if="widget.permitted" class="widget-icon-container col-sm-6 col-md-4 col-lg-3 col-xl-2">
|
||||||
</div>
|
<widget-icon @select="pick" :widget="widget"></widget-icon>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import AbstractWidget from './Abstract.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fallback screen rendered in place of a widget when the current user is missing
|
||||||
|
* the permission (berechtigung_kurzbz) linked to that widget. Used for widgets
|
||||||
|
* that are already on a user's dashboard but whose required permission the user
|
||||||
|
* no longer holds.
|
||||||
|
*/
|
||||||
|
export default {
|
||||||
|
mixins: [
|
||||||
|
AbstractWidget
|
||||||
|
],
|
||||||
|
created() {
|
||||||
|
this.$emit('setConfig', false);
|
||||||
|
},
|
||||||
|
template: /*html*/`
|
||||||
|
<div class="dashboard-widget-missing-permission d-flex flex-column justify-content-center align-items-center text-center h-100 p-3 text-body-secondary">
|
||||||
|
<i class="fa-solid fa-lock fa-2x mb-2" aria-hidden="true"></i>
|
||||||
|
<p class="mb-0">{{ $p.t('dashboard/widget_missing_permission') }}</p>
|
||||||
|
</div>`
|
||||||
|
}
|
||||||
@@ -61,6 +61,7 @@ export default {
|
|||||||
selected: [],
|
selected: [],
|
||||||
studiengang_kz: null,
|
studiengang_kz: null,
|
||||||
selectedStudiensemester: this.defaultSemester,
|
selectedStudiensemester: this.defaultSemester,
|
||||||
|
preselected: null,
|
||||||
dropdowns: {
|
dropdowns: {
|
||||||
studiensemester_array: [],
|
studiensemester_array: [],
|
||||||
sprachen_array: [],
|
sprachen_array: [],
|
||||||
@@ -73,7 +74,11 @@ export default {
|
|||||||
calcheightonly: true,
|
calcheightonly: true,
|
||||||
types: [
|
types: [
|
||||||
"mitarbeiter",
|
"mitarbeiter",
|
||||||
"mitarbeiter_ohne_zuordnung"
|
"mitarbeiter_ohne_zuordnung",
|
||||||
|
/*
|
||||||
|
"lehreinheit",
|
||||||
|
"lehrveranstaltung",
|
||||||
|
*/
|
||||||
],
|
],
|
||||||
actions: {
|
actions: {
|
||||||
employee: {
|
employee: {
|
||||||
@@ -86,6 +91,26 @@ export default {
|
|||||||
childactions: [
|
childactions: [
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
lehreinheit: {
|
||||||
|
defaultaction: {
|
||||||
|
type: "function",
|
||||||
|
action: (data) => {
|
||||||
|
this.onSelectLehreinheit(data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
childactions: [
|
||||||
|
]
|
||||||
|
},
|
||||||
|
lehrveranstaltung: {
|
||||||
|
defaultaction: {
|
||||||
|
type: "function",
|
||||||
|
action: (data) => {
|
||||||
|
this.onSelectLehrveranstaltung(data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
childactions: [
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -94,6 +119,8 @@ export default {
|
|||||||
filter() {
|
filter() {
|
||||||
let filter = {
|
let filter = {
|
||||||
emp: this.$route.params.emp,
|
emp: this.$route.params.emp,
|
||||||
|
le: this.$route.params.le,
|
||||||
|
lv: this.$route.params.lv,
|
||||||
studiensemester_kurzbz: this.selectedStudiensemester
|
studiensemester_kurzbz: this.selectedStudiensemester
|
||||||
};
|
};
|
||||||
let index;
|
let index;
|
||||||
@@ -105,7 +132,7 @@ export default {
|
|||||||
if (index > -1)
|
if (index > -1)
|
||||||
filter.semester = this.$route.params.treemenu[index+1];
|
filter.semester = this.$route.params.treemenu[index+1];
|
||||||
}
|
}
|
||||||
filter.activeFilter = filter.emp ? 'employee' : filter.stg ? 'verband' : null;
|
filter.activeFilter = filter.emp ? 'employee' : filter.stg ? 'verband' : filter.le ? 'lehreinheit' : filter.lv ? 'lehrveranstaltung' : null;
|
||||||
return filter;
|
return filter;
|
||||||
},
|
},
|
||||||
emp() {
|
emp() {
|
||||||
@@ -203,20 +230,50 @@ export default {
|
|||||||
},
|
},
|
||||||
onSelectEmployee(emp)
|
onSelectEmployee(emp)
|
||||||
{
|
{
|
||||||
|
let params = { ...this.$route.params }
|
||||||
|
delete params.le;
|
||||||
|
delete params.lv;
|
||||||
|
|
||||||
this.$router.push({
|
this.$router.push({
|
||||||
name: 'emp',
|
name: 'emp',
|
||||||
params: {
|
params: {
|
||||||
...this.$route.params,
|
...params,
|
||||||
emp
|
emp
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
onSelectLehreinheit(lehreinheit)
|
||||||
|
{
|
||||||
|
this.$router.push({
|
||||||
|
name: 'le',
|
||||||
|
params: {
|
||||||
|
le: lehreinheit.id,
|
||||||
|
stdsem: lehreinheit.studiensemester_kurzbz.toLowerCase()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
onSelectLehrveranstaltung(lehrveranstaltung)
|
||||||
|
{
|
||||||
|
this.$router.push({
|
||||||
|
name: 'lv',
|
||||||
|
params: {
|
||||||
|
lv: lehrveranstaltung.id,
|
||||||
|
stdsem: lehrveranstaltung?.studiensemester_kurzbz?.toLowerCase() ?? this.selectedStudiensemester.toLowerCase()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
onSelectVerband({ path: link, stg_kz })
|
onSelectVerband({ path: link, stg_kz })
|
||||||
{
|
{
|
||||||
|
|
||||||
|
let params = { ...this.$route.params }
|
||||||
|
delete params.le;
|
||||||
|
delete params.lv;
|
||||||
|
|
||||||
this.$router.push({
|
this.$router.push({
|
||||||
name: this.$route.name == 'emp' ? 'emp' : 'treemenu',
|
name: this.$route.name == 'emp' ? 'emp' : 'treemenu',
|
||||||
params: {
|
params: {
|
||||||
...this.$route.params,
|
...params,
|
||||||
treemenu: link.split('/')
|
treemenu: link.split('/')
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -295,7 +352,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
if (!this.$route.params.stdsem) {
|
if (this.$route.name !== 'le' && this.$route.name !== 'lv' && !this.$route.params.stdsem) {
|
||||||
this.$router.replace({
|
this.$router.replace({
|
||||||
name: 'stdsem',
|
name: 'stdsem',
|
||||||
params: {
|
params: {
|
||||||
@@ -477,7 +534,8 @@ export default {
|
|||||||
<template #top>
|
<template #top>
|
||||||
<lv-table ref="lvTable"
|
<lv-table ref="lvTable"
|
||||||
v-model:selected="selected"
|
v-model:selected="selected"
|
||||||
@row-clicked="handleRowClicked"
|
@row-clicked="handleRowClicked"
|
||||||
|
@select-LV="onSelectLehrveranstaltung"
|
||||||
:filter="filter"
|
:filter="filter"
|
||||||
>
|
>
|
||||||
<template #filterzuruecksetzen v-if="filter.activeFilter === 'employee'">
|
<template #filterzuruecksetzen v-if="filter.activeFilter === 'employee'">
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ export default {
|
|||||||
},
|
},
|
||||||
emits: [
|
emits: [
|
||||||
'update:selected',
|
'update:selected',
|
||||||
'row-clicked'
|
'row-clicked',
|
||||||
|
'selectLV',
|
||||||
],
|
],
|
||||||
watch: {
|
watch: {
|
||||||
filter: {
|
filter: {
|
||||||
@@ -106,8 +107,24 @@ export default {
|
|||||||
{
|
{
|
||||||
event: 'dataProcessed',
|
event: 'dataProcessed',
|
||||||
handler: (data) => {
|
handler: (data) => {
|
||||||
this.reexpandRows()
|
if (this.$route.params.le)
|
||||||
this.$emit('update:selected', {})
|
{
|
||||||
|
this.$refs.table.tabulator.selectRow(this.$refs.table.tabulator.getRows());
|
||||||
|
}
|
||||||
|
else if (this.$route.params.lv)
|
||||||
|
{
|
||||||
|
this.$refs.table.tabulator.selectRow(this.$refs.table.tabulator.getRows());
|
||||||
|
|
||||||
|
this.allRows = this.getAllRows(this.$refs.table.tabulator.getRows());
|
||||||
|
this.allRows.forEach(row => {
|
||||||
|
row.treeExpand()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.reexpandRows()
|
||||||
|
this.$emit('update:selected', {})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -221,35 +238,35 @@ export default {
|
|||||||
selectableRows: true,
|
selectableRows: true,
|
||||||
rowContextMenu: (component, e) => {
|
rowContextMenu: (component, e) => {
|
||||||
|
|
||||||
if (e.getData()?.lehreinheit_id === undefined)
|
if (e.getData()?.lehreinheit_id === undefined || !e.getData()?.lehreinheit_id)
|
||||||
return;
|
return [];
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: "LV-Teil kopieren",
|
label: this.$p.t('lehre', 'lvteilkopieren'),
|
||||||
menu: [
|
menu: [
|
||||||
{
|
{
|
||||||
label: "Alles",
|
label: this.$p.t('lehre', 'alles'),
|
||||||
action: (e, row) =>
|
action: (e, row) =>
|
||||||
{
|
{
|
||||||
this.copyLehreinheit(row, "alle");
|
this.copyLehreinheit(row, "alle");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Nur LV-Teil",
|
label: this.$p.t('lehre', 'nurlvteil'),
|
||||||
action: (e, row) =>
|
action: (e, row) =>
|
||||||
{
|
{
|
||||||
this.copyLehreinheit(row, "lvteil");
|
this.copyLehreinheit(row, "lvteil");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Nur mit Gruppen",
|
label: this.$p.t('lehre', 'nurmitgruppen'),
|
||||||
action: (e, row) =>
|
action: (e, row) =>
|
||||||
{
|
{
|
||||||
this.copyLehreinheit(row, "gruppen");
|
this.copyLehreinheit(row, "gruppen");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Nur mit Lehrenden",
|
label: this.$p.t('lehre', 'nurmitlehrende'),
|
||||||
action: (e, row) =>
|
action: (e, row) =>
|
||||||
{
|
{
|
||||||
this.copyLehreinheit(row, "lektoren");
|
this.copyLehreinheit(row, "lektoren");
|
||||||
@@ -258,7 +275,21 @@ export default {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Entfernen",
|
label: this.$p.t('lehre', 'zurlvspringen'),
|
||||||
|
action: (e, row) => {
|
||||||
|
this.openLV(row)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: this.$p.t('lehre', 'lvteillinkkopieren'),
|
||||||
|
action: (e, row) => {
|
||||||
|
let rowData = row.getData();
|
||||||
|
let link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/LVVerwaltung/stdsem/' + rowData.studiensemester_kurzbz.toLowerCase() + '/le/' + rowData.lehreinheit_id;
|
||||||
|
navigator.clipboard.writeText(link);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: this.$p.t('ui', 'entfernen'),
|
||||||
action: (e, row) => {
|
action: (e, row) => {
|
||||||
this.deleteLehreinheit(row)
|
this.deleteLehreinheit(row)
|
||||||
},
|
},
|
||||||
@@ -355,7 +386,7 @@ export default {
|
|||||||
},
|
},
|
||||||
buildApiUrl()
|
buildApiUrl()
|
||||||
{
|
{
|
||||||
if (!['emp', 'treemenu'].includes(this.$route.name))
|
if (!['emp', 'treemenu', 'le', 'lv'].includes(this.$route.name))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
let url = 'stdsem/' + this.$route.params.stdsem;
|
let url = 'stdsem/' + this.$route.params.stdsem;
|
||||||
@@ -364,6 +395,14 @@ export default {
|
|||||||
url += '/emp/' + this.$route.params.emp;
|
url += '/emp/' + this.$route.params.emp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.$route.params.le) {
|
||||||
|
url += '/le/' + this.$route.params.le;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.$route.params.lv) {
|
||||||
|
url += '/lv/' + this.$route.params.lv;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.$route.params.treemenu) {
|
if (this.$route.params.treemenu) {
|
||||||
url += '/' + this.$route.params.treemenu.join('/');
|
url += '/' + this.$route.params.treemenu.join('/');
|
||||||
}
|
}
|
||||||
@@ -502,6 +541,17 @@ export default {
|
|||||||
})
|
})
|
||||||
.catch(this.$fhcAlert.handleSystemError);
|
.catch(this.$fhcAlert.handleSystemError);
|
||||||
},
|
},
|
||||||
|
openLV(row)
|
||||||
|
{
|
||||||
|
let rowData = row.getData();
|
||||||
|
|
||||||
|
|
||||||
|
let data = {
|
||||||
|
id: rowData.lehrveranstaltung_id,
|
||||||
|
studiensemester_kurzbz: rowData.studiensemester_kurzbz
|
||||||
|
}
|
||||||
|
this.$emit('selectLV', data);
|
||||||
|
},
|
||||||
getAllRows(rows)
|
getAllRows(rows)
|
||||||
{
|
{
|
||||||
let result = [];
|
let result = [];
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ export default {
|
|||||||
this.$refs[modalRef].hide();
|
this.$refs[modalRef].hide();
|
||||||
},
|
},
|
||||||
reload() {
|
reload() {
|
||||||
this.$refs.table.reloadTable();
|
this.$refs.table?.reloadTable();
|
||||||
},
|
},
|
||||||
searchFirma(event) {
|
searchFirma(event) {
|
||||||
if (this.abortController.firmen) {
|
if (this.abortController.firmen) {
|
||||||
|
|||||||
+15
-2
@@ -30,6 +30,9 @@ export default {
|
|||||||
computed: {
|
computed: {
|
||||||
betreuerFormOpened() {
|
betreuerFormOpened() {
|
||||||
return this.newMode || this.editMode;
|
return this.newMode || this.editMode;
|
||||||
|
},
|
||||||
|
isMitarbeiter(){
|
||||||
|
return this.autocompleteSelectedBetreuer?.name?.includes('Mitarbeiter') ?? false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
@@ -430,6 +433,11 @@ export default {
|
|||||||
},
|
},
|
||||||
actionKontaktdatenBearbeiten() {
|
actionKontaktdatenBearbeiten() {
|
||||||
if (!this.autocompleteSelectedBetreuer) return;
|
if (!this.autocompleteSelectedBetreuer) return;
|
||||||
|
if (this.isMitarbeiter)
|
||||||
|
{
|
||||||
|
this.$fhcAlert.alertError(this.$p.t('ui', 'editingMitarbeiterPVonly'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.$refs.kontaktdatenModal.show();
|
this.$refs.kontaktdatenModal.show();
|
||||||
},
|
},
|
||||||
// stuff to do after new person has been saved
|
// stuff to do after new person has been saved
|
||||||
@@ -494,7 +502,12 @@ export default {
|
|||||||
<button class="btn btn-outline-secondary" @click="actionNewPerson">{{ $p.t('projektarbeit', 'neuePersonAnlegen') }}</button>
|
<button class="btn btn-outline-secondary" @click="actionNewPerson">{{ $p.t('projektarbeit', 'neuePersonAnlegen') }}</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<button class="btn btn-outline-secondary float-end" @click="actionKontaktdatenBearbeiten">{{ $p.t('projektarbeit', 'kontaktdatenBearbeiten') }}</button>
|
<button
|
||||||
|
class="btn btn-outline-secondary float-end"
|
||||||
|
@click="actionKontaktdatenBearbeiten"
|
||||||
|
>
|
||||||
|
{{ $p.t('projektarbeit', 'kontaktdatenBearbeiten') }}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -605,7 +618,7 @@ export default {
|
|||||||
</contact>
|
</contact>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</bs-modal>
|
</bs-modal>
|
||||||
|
|
||||||
`
|
`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
import TemplateFrame from "./template/frame.js";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'SearchbarResultTeachingUnit',
|
||||||
|
components: {
|
||||||
|
TemplateFrame
|
||||||
|
},
|
||||||
|
emits: [ 'actionexecuted' ],
|
||||||
|
props: {
|
||||||
|
res: Object,
|
||||||
|
actions: Object
|
||||||
|
},
|
||||||
|
template: `
|
||||||
|
<template-frame
|
||||||
|
class="searchbar-result-teachingunit"
|
||||||
|
:res="res"
|
||||||
|
:actions="actions"
|
||||||
|
:title="res.bezeichnung"
|
||||||
|
:image-fallback="res.foto"
|
||||||
|
@actionexecuted="$emit('actionexecuted')"
|
||||||
|
>
|
||||||
|
<div class="searchbar_table">
|
||||||
|
<div class="searchbar_tablerow">
|
||||||
|
<div class="searchbar_tablecell searchbar_label"> {{ res.type === 'lehreinheit' ? $p.t('lehre/lehreinheit') : $p.t('lehre/lehrveranstaltung') }}</div>
|
||||||
|
<div class="searchbar_tablecell searchbar_value">
|
||||||
|
{{ res.id }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="searchbar_tablerow">
|
||||||
|
<div class="searchbar_tablecell searchbar_label">{{ $p.t('lehre/studiengang') }}</div>
|
||||||
|
<div class="searchbar_tablecell searchbar_value">
|
||||||
|
{{ res.studiengang }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="searchbar_tablerow" v-if="res.oe_bezeichnung">
|
||||||
|
<div class="searchbar_tablecell searchbar_label">{{ $p.t('lehre/organisationseinheit') }}</div>
|
||||||
|
<div class="searchbar_tablecell searchbar_value">
|
||||||
|
{{ res.oe_bezeichnung }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="searchbar_tablerow" v-if="res.studiensemester_kurzbz">
|
||||||
|
<div class="searchbar_tablecell searchbar_label">{{ $p.t('lehre/studiensemester') }}</div>
|
||||||
|
<div class="searchbar_tablecell searchbar_value">
|
||||||
|
{{ res.studiensemester_kurzbz }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="searchbar_tablerow">
|
||||||
|
<div class="searchbar_tablecell searchbar_label">{{ $p.t('lehre/ausbildungssemester') }}</div>
|
||||||
|
<div class="searchbar_tablecell searchbar_value">
|
||||||
|
{{ res.semester }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="searchbar_tablerow">
|
||||||
|
<div class="searchbar_tablecell searchbar_label">{{ $p.t('lehre/lehrform') }}</div>
|
||||||
|
<div class="searchbar_tablecell searchbar_value">
|
||||||
|
{{ res.lehrform_kurzbz }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template-frame>`
|
||||||
|
};
|
||||||
@@ -8,6 +8,7 @@ import dms from "./result/dms.js";
|
|||||||
import cms from "./result/cms.js";
|
import cms from "./result/cms.js";
|
||||||
import mergedStudent from "./result/mergedstudent.js";
|
import mergedStudent from "./result/mergedstudent.js";
|
||||||
import mergedPerson from "./result/mergedperson.js";
|
import mergedPerson from "./result/mergedperson.js";
|
||||||
|
import teachingunit from "./result/teachingunit.js";
|
||||||
import { debounce } from "../../helpers/DebounceHelper.js";
|
import { debounce } from "../../helpers/DebounceHelper.js";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -23,6 +24,7 @@ export default {
|
|||||||
cms,
|
cms,
|
||||||
mergedStudent,
|
mergedStudent,
|
||||||
mergedPerson,
|
mergedPerson,
|
||||||
|
teachingunit,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
searchoptions: {
|
searchoptions: {
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ require_once('dbupdate_3.4/76160_lvv_favorites.php');
|
|||||||
require_once('dbupdate_3.4/77080_tabulator_presets_table.php');
|
require_once('dbupdate_3.4/77080_tabulator_presets_table.php');
|
||||||
require_once('dbupdate_3.4/78292_gehaltsanpassungtyp.php');
|
require_once('dbupdate_3.4/78292_gehaltsanpassungtyp.php');
|
||||||
require_once('dbupdate_3.4/54225_reihungstest_ablauf_fuer_quereinsteiger.php');
|
require_once('dbupdate_3.4/54225_reihungstest_ablauf_fuer_quereinsteiger.php');
|
||||||
|
require_once('dbupdate_3.4/77757_widgets_berechtigungen.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>';
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
<?php
|
||||||
|
/* Copyright (C) 2026 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.
|
||||||
|
*
|
||||||
|
* Beschreibung:
|
||||||
|
* Dashboard Widgets: Verknüpfung einer (einzelnen) Berechtigung pro Widget.
|
||||||
|
* Neue Spalte dashboard.tbl_widget.berechtigung_kurzbz mit FK auf
|
||||||
|
* system.tbl_berechtigung. Ist die Spalte NULL, erfordert das Widget keine
|
||||||
|
* gesonderte Berechtigung. Benutzer denen die verknüpfte Berechtigung fehlt,
|
||||||
|
* bekommen das Widget nicht mehr zur Auswahl angezeigt bzw. sehen (falls bereits
|
||||||
|
* am Dashboard) einen "Fehlende Berechtigung"-Screen.
|
||||||
|
*/
|
||||||
|
if (! defined('DB_NAME')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
// Add column dashboard.tbl_widget.berechtigung_kurzbz (FK => system.tbl_berechtigung)
|
||||||
|
if ($result = @$db->db_query("
|
||||||
|
SELECT 1
|
||||||
|
FROM information_schema.columns
|
||||||
|
WHERE table_schema = 'dashboard'
|
||||||
|
AND table_name = 'tbl_widget'
|
||||||
|
AND column_name = 'berechtigung_kurzbz';"))
|
||||||
|
{
|
||||||
|
if ($db->db_num_rows($result) == 0)
|
||||||
|
{
|
||||||
|
$qry = "
|
||||||
|
ALTER TABLE dashboard.tbl_widget
|
||||||
|
ADD COLUMN berechtigung_kurzbz VARCHAR(32) NULL;
|
||||||
|
|
||||||
|
ALTER TABLE dashboard.tbl_widget
|
||||||
|
ADD CONSTRAINT tbl_widget_berechtigung_fk
|
||||||
|
FOREIGN KEY (berechtigung_kurzbz)
|
||||||
|
REFERENCES system.tbl_berechtigung (berechtigung_kurzbz)
|
||||||
|
ON UPDATE CASCADE ON DELETE SET NULL;";
|
||||||
|
|
||||||
|
if (!$db->db_query($qry))
|
||||||
|
{
|
||||||
|
echo '<strong>dashboard.tbl_widget: '.$db->db_last_error().'</strong><br>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
echo 'dashboard.tbl_widget: Spalte berechtigung_kurzbz (FK system.tbl_berechtigung) hinzugefuegt<br>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+182
-2
@@ -49620,6 +49620,26 @@ array(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'dashboard',
|
||||||
|
'phrase' => 'widget_missing_permission',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'Ihnen fehlt die erforderliche Berechtigung, um dieses Widget anzuzeigen.',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'You do not have the permission required to display this widget.',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
// CIS4 phrases from legacy code end
|
// CIS4 phrases from legacy code end
|
||||||
// FHC4 Phrases Abschlusspruefung
|
// FHC4 Phrases Abschlusspruefung
|
||||||
array(
|
array(
|
||||||
@@ -53352,6 +53372,146 @@ and represent the current state of research on the topic. The prescribed citatio
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'lehre',
|
||||||
|
'phrase' => 'lvteilkopieren',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'LV-Teil kopieren',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'Copy teaching unit',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'lehre',
|
||||||
|
'phrase' => 'nurlvteil',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'Nur LV-Teil',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'Teaching unit only',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'lehre',
|
||||||
|
'phrase' => 'nurmitgruppen',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'Nur mit Gruppen',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'With groups only',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'lehre',
|
||||||
|
'phrase' => 'nurmitlehrende',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'Nur mit Lehrenden',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'With lecturers only',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'lehre',
|
||||||
|
'phrase' => 'zurlvspringen',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'Zur LV Springen',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'Go to teaching unit',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'lehre',
|
||||||
|
'phrase' => 'lvteillinkkopieren',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'Link zu diesem LV-Teil kopieren',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'Copy link to this teaching unit',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'lehre',
|
||||||
|
'phrase' => 'alles',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'Alles',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'Everything',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
array(
|
array(
|
||||||
'app' => 'core',
|
'app' => 'core',
|
||||||
'category' => 'lehre',
|
'category' => 'lehre',
|
||||||
@@ -61317,7 +61477,7 @@ I have been informed that I am under no obligation to consent to the transmissio
|
|||||||
'insertvon' => 'system'
|
'insertvon' => 'system'
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'app' => 'core',
|
'app' => 'core',
|
||||||
'category' => 'tabulator',
|
'category' => 'tabulator',
|
||||||
@@ -62591,8 +62751,28 @@ I have been informed that I am under no obligation to consent to the transmissio
|
|||||||
'insertvon' => 'system'
|
'insertvon' => 'system'
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
),
|
||||||
// ### Infocenter Onboarding END
|
// ### Infocenter Onboarding END
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'ui',
|
||||||
|
'phrase' => 'editingMitarbeiterPVonly',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'Kontaktdaten von Mitarbeiter*innen dürfen nur in der Personalverwaltung editiert werden.',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'Employee contact details may only be edited in the personnel administration system.',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
INSERT INTO lehre.tbl_projektarbeit
|
INSERT INTO lehre.tbl_projektarbeit
|
||||||
(projektarbeit_id, projekttyp_kurzbz, titel, lehreinheit_id, student_uid, firma_id, note, punkte, beginn, ende, faktor, freigegeben, gesperrtbis, stundensatz, themenbereich, anmerkung, updateamum, updatevon, insertamum, insertvon, ext_id, gesamtstunden, titel_english, sprache, seitenanzahl, abgabedatum, kontrollschlagwoerter, schlagwoerter, schlagwoerter_en, abstract, abstract_en, "final") VALUES
|
(projektarbeit_id, projekttyp_kurzbz, titel, lehreinheit_id, student_uid, firma_id, note, punkte, beginn, ende, faktor, freigegeben, gesperrtbis, stundensatz, themenbereich, anmerkung, updateamum, updatevon, insertamum, insertvon, ext_id, gesamtstunden, titel_english, sprache, seitenanzahl, abgabedatum, kontrollschlagwoerter, schlagwoerter, schlagwoerter_en, abstract, abstract_en, "final", lehrveranstaltung_id, studiensemester_kurzbz) VALUES
|
||||||
(1, 'Bachelor', 'Auswirkung der Sonneneinstrahlung auf die Gesundheit', 46111, 's46b413', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true),
|
(1, 'Bachelor', 'Auswirkung der Sonneneinstrahlung auf die Gesundheit', 46111, 's46b413', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)),
|
||||||
(2, 'Bachelor', 'Neue Unterrichtsmethoden mit KI', 46111, 's46b414', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true),
|
(2, 'Bachelor', 'Neue Unterrichtsmethoden mit KI', 46111, 's46b414', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)),
|
||||||
(3, 'Bachelor', 'Betrugsbekämpfung bei Anwesenheitskontrolle', 46111, 's46b415', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true),
|
(3, 'Bachelor', 'Betrugsbekämpfung bei Anwesenheitskontrolle', 46111, 's46b415', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)),
|
||||||
(4, 'Bachelor', 'Neuronale Netze', 46111, 's46b416', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true)
|
(4, 'Bachelor', 'Neuronale Netze', 46111, 's46b416', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1))
|
||||||
;
|
;
|
||||||
|
|
||||||
INSERT INTO lehre.tbl_projektbetreuer
|
INSERT INTO lehre.tbl_projektbetreuer
|
||||||
|
|||||||
Reference in New Issue
Block a user