Compare commits

..
Author SHA1 Message Date
Andreas Österreicher 0c4d102850 Merge branch 'bug-83698/StudVW_Projektarbeit_Kontaktdaten' 2026-10-07 09:11:42 +02:00
Andreas Österreicher 2e15f2c5ab Edit Dialog von Kontaktdaten bei Projektbetreuer die Mitarbeiter sind wird nicht angezeigt 2026-10-07 09:10:51 +02:00
Harald Bamberger 784e5693b4 compat component add/remove css class via lifecycle hooks to apply compat specific rules 2026-10-06 15:22:16 +02:00
Andreas Österreicher 88b49b70e9 Fehlermeldung korrigiert beim Endupload wenn Zweitbetreuer keine E-Mail hinterlegt hat 2026-10-06 14:47:45 +02:00
Harald Bamberger 67a33f2ceb revert dashboard item overscroll-behavior to auto, so scrolling the page is not only possible on the page borders 2026-10-06 14:15:46 +02:00
Harald Bamberger 751445c199 Merge branch 'feature-83444/lvverwaltung_suche_nach_le_und_lv_inkl_router' 2026-10-06 10:59:19 +02:00
Harald Bamberger 916f5dd68e disable search for lv and le for the moment 2026-10-06 10:58:20 +02:00
Harald Bamberger efc8fa1eeb Merge branch 'master' into feature-83444/lvverwaltung_suche_nach_le_und_lv_inkl_router 2026-10-06 10:27:46 +02:00
Harald Bamberger d58edff92d fix propertyname for api response 2026-10-05 18:26:42 +02:00
Harald Bamberger 643929a0c6 add cis4 class to body to make it harder for cms content style sheets to override padding, add names to calendar events renderer components, show lvmenu not only for route MyLvPlan but e.g. also in Dashboard LvPlan Widget 2026-10-05 17:56:57 +02:00
Harald Bamberger 4ba2869632 Merge branch 'master' into bugfix-83059_incorrect-ical-semester-parameters 2026-10-05 11:22:59 +02:00
Andreas Österreicher 293bb77179 Merge branch 'bug-44023/EingabemaskeEntwicklungsteamNamenOhneUid2' 2026-10-02 13:23:02 +02:00
Andreas Österreicher 3fe10d715d Fixed Saving of Entwicklungsteam 2026-10-02 13:14:41 +02:00
Manuela Thamer 3034615455 fix pagelock of modals
prevent editing contact data of employees
2026-10-01 17:27:54 +02:00
ma0048 e369a8c03f LV-Verwaltung:
- Semester unter Orgform im Verbandsbaum
- Kombinierte LV/LE-Suche
- Semester/Orgform/Lehrform in Suchergebnissen
2026-09-28 08:42:37 +02:00
ma0048 faad2c4a9a lv auch anzeigen wenn keine lvteile in dem semester dran haengen
phrasen hinzugefuegt
2026-09-18 12:34:47 +02:00
ma0048 2ffaf36270 suche fuer lehreinheiten und lehrveranstaltungen in der lvverwaltung 2026-09-15 15:46:48 +02:00
Harald Bamberger c8c7d1566c Merge branch 'master' into bugfix-83059_incorrect-ical-semester-parameters 2026-09-11 11:43:23 +02:00
adisposkofh 9d4218bf38 implemented displayed semester/ical dates changes from my lv plan to other lv plan 2026-09-09 11:36:19 +02:00
adisposkofh 67f30c7765 fixed issue with wrong semester displayed and wrong ical dates used in my lv plan 2026-09-09 11:30:43 +02:00
76 changed files with 1250 additions and 1226 deletions
+8 -2
View File
@@ -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)/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)/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
$subdirs = ['application/config/extensions', 'application/config/' . ENVIRONMENT . '/extensions'];
+3 -2
View File
@@ -26,7 +26,8 @@ $config['root'] = [
'verband' => [
'group'
]
],
'orgform'
]
]
];
$config['root']['stg']['orgform'] = $config['root']['stg'];
@@ -1916,7 +1916,7 @@ class Abgabe extends FHCAPI_Controller
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([
'getByEmp' => ['admin:r', 'assistenz:r'],
'getByLe' => ['admin:r', 'assistenz:r'],
'getByLv' => ['admin:r', 'assistenz:r'],
'getByStg' => ['admin:r', 'assistenz:r'],
'getByStgOrgform' => ['admin:r', 'assistenz:r'],
'loadByLV' => ['admin:r', 'assistenz:r'],
]);
@@ -77,41 +80,117 @@ class Lehrveranstaltung extends FHCAPI_Controller
$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)
{
$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);
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);
$verband = null;
if (!is_null($semester) && !is_numeric($semester))
{
$verband = $this->getOrgformKurzbz($semester);
$semester = null;
}
$this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
if (!is_null($semester) && !ctype_digit((string)$semester))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$studienplan_data = $this->_ci->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $semester, $verband);
$studienplan_ids = array();
$only_ids = array();
$placeholders = array();
if (hasData($studienplan_data))
{
foreach (getData($studienplan_data) as $studienplan) {
$placeholders[] = "(?, ?)";
$studienplan_ids[] = $studienplan->studienplan_id;
$studienplan_ids[] = $studienplan->semester;
$only_ids[] = $studienplan->studienplan_id;
}
}
$lehrveranstaltungen_data = $this->_ci->LehrveranstaltungModel->getLvsByStudiengang($studienplan_ids, $placeholders, $only_ids, $studiengang_kz, $studiensemester_kurzbz, $semester, $verband);
$lehrveranstaltungen_data = hasData($lehrveranstaltungen_data) ? getData($lehrveranstaltungen_data) : array();
$lehrveranstaltungen_data = $this->_loadLvRows($studiengang_kz, $studiensemester_kurzbz, $semester, $orgform_kurzbz);
$tree = [];
foreach ($lehrveranstaltungen_data as $row)
@@ -244,6 +323,31 @@ class Lehrveranstaltung extends FHCAPI_Controller
$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()
{
$this->_uid = getAuthUID();
@@ -309,8 +413,8 @@ class Lehrveranstaltung extends FHCAPI_Controller
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
return $orgform_kurzbz;
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
return current($data)->orgform_kurzbz;
}
}
}
@@ -21,7 +21,7 @@ class NotizAnrechnung extends Notiz_Controller
// Load language phrases
$this->loadPhrases([
'ui', 'lehre'
'ui'
]);
}
@@ -28,7 +28,8 @@ class Studiensemester extends FHCAPI_Controller
'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED,
'current' => self::PERM_LOGGED,
'set' => self::PERM_LOGGED
'set' => self::PERM_LOGGED,
'getContainingOrNearestByDateRange' => self::PERM_LOGGED,
)
);
// Load model StudiensemesterModel
@@ -203,4 +204,15 @@ class Studiensemester extends FHCAPI_Controller
$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);
}
}
@@ -25,7 +25,7 @@ class Anrechnungen extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
'ui', 'lehre', 'anrechnung'
'ui', 'lehre'
]);
// Load models
@@ -45,12 +45,6 @@ class Anrechnungen extends FHCAPI_Controller
{
$this->load->model('education/Anrechnungbegruendung_model', 'AnrechnungbegrueundungsModel');
// Begruendung in the users language, German name if no translation exists
$language_index = getUserLanguage() == 'German' ? 1 : 2;
$this->AnrechnungbegrueundungsModel->addSelect(
'begruendung_id, COALESCE(bezeichnung_mehrsprachig[' . $language_index . '], bezeichnung) AS bezeichnung',
false
);
$result = $this->AnrechnungbegrueundungsModel->load();
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
@@ -124,22 +118,22 @@ class Anrechnungen extends FHCAPI_Controller
: null;
$this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung'])
]);
$this->form_validation->set_rules('begruendung', 'Begruendung', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'begruendung')])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Begruendung'])
]);
if($_POST['begruendung'] == 2)
{
$this->form_validation->set_rules('lehrveranstaltung_id_kompatibel', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'lehrveranstaltung_bez_kompatibel')])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung Kompatibel'])
]);
}
$this->form_validation->set_rules('genehmigtVon', 'GenehmigtVon', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'genehmigtVon')])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'GenehmigtVon'])
]);
if ($this->form_validation->run() == false)
@@ -196,22 +190,22 @@ class Anrechnungen extends FHCAPI_Controller
$_POST['genehmigtVon'] = (isset($formData['genehmigt_von']) && !empty($formData['genehmigt_von'])) ? $formData['genehmigt_von'] : null;
$this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung'])
]);
$this->form_validation->set_rules('begruendung', 'Begruendung', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'begruendung')])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Begruendung'])
]);
if($_POST['begruendung'] == 2)
{
$this->form_validation->set_rules('lehrveranstaltung_id_kompatibel', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'lehrveranstaltung_bez_kompatibel')])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung Kompatibel'])
]);
}
$this->form_validation->set_rules('genehmigtVon', 'GenehmigtVon', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'genehmigtVon')])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'GenehmigtVon'])
]);
if ($this->form_validation->run() == false)
@@ -574,6 +574,19 @@ class Kontakt extends FHCAPI_Controller
$person_id = $this->input->post('person_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(
[
'kontakt_id' => $kontakt_id
@@ -168,15 +168,12 @@ class AnrechnungJob extends JOB_Controller
// Get all yesterdays Anrechnungen, that did not process further than first status
// (If Anrechnung is new, but STGL already started the process yesterday,
// he does not need to be informed about this new Anrechnung anymore)
// Studiengang of the prestudent, not of the LV (same source as the permission checks)
$this->AnrechnungModel->addSelect('anrechnung_id, studiensemester_kurzbz, prestudent.studiengang_kz, lv.bezeichnung, vorname, nachname');
$this->AnrechnungModel->addSelect('anrechnung_id, studiensemester_kurzbz, lv.studiengang_kz, lv.bezeichnung, vorname, nachname');
$this->AnrechnungModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
$this->AnrechnungModel->addJoin('public.tbl_student student', 'prestudent_id');
$this->AnrechnungModel->addJoin('public.tbl_benutzer benutzer', 'ON (benutzer.uid = student.student_uid)');
$this->AnrechnungModel->addJoin('public.tbl_person person', 'person_id');
// After tbl_person: tbl_prestudent also has person_id, that would make USING (person_id) ambiguous
$this->AnrechnungModel->addJoin('public.tbl_prestudent prestudent', 'ON (prestudent.prestudent_id = student.prestudent_id)');
$this->AnrechnungModel->addOrder('prestudent.studiengang_kz, lv.bezeichnung');
$this->AnrechnungModel->addOrder('lv.studiengang_kz, lv.bezeichnung');
$result = $this->AnrechnungModel->loadWhere(
'(lehre.tbl_anrechnung.insertamum)::date = (NOW() - INTERVAL \'24 HOURS\')::DATE
@@ -128,7 +128,7 @@ class approveAnrechnungDetail extends Auth_Controller
// Validate data
if (isEmptyArray($data))
{
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
// Get STGLs person data
@@ -159,7 +159,7 @@ class approveAnrechnungDetail extends Auth_Controller
}
else
{
return $this->outputJsonError($this->p->t('anrechnung', 'keineAnrechnungenGenehmigt'));
return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.');
}
}
@@ -173,7 +173,7 @@ class approveAnrechnungDetail extends Auth_Controller
// Validate data
if (isEmptyArray($data))
{
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
// Get STGLs person data
@@ -217,7 +217,7 @@ class approveAnrechnungDetail extends Auth_Controller
if(isEmptyString($anrechnung_id))
{
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
$retval = array();
@@ -225,7 +225,7 @@ class approveAnrechnungDetail extends Auth_Controller
// Check if Anrechnungs-LV has lector
if (!$this->anrechnunglib->LVhasLector($anrechnung_id))
{
$this->terminateWithJsonError($this->p->t('anrechnung', 'lvHatKeineLektoren'));
$this->terminateWithJsonError('LV has no lector');
}
// Get Fachbereichsleitung or LV Leitung.
@@ -258,13 +258,13 @@ class approveAnrechnungDetail extends Auth_Controller
if ($empfehlungsanfrage_an == '')
{
$this->terminateWithJsonError(
$this->p->t('anrechnung', 'empfehlungNichtAngefordert') . "\n" . $this->p->t('anrechnung', 'lvHatKeineLektoren')
"Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt."
);
}
if (isEmptyArray($retval))
{
$this->terminateWithJsonError($this->p->t('anrechnung', 'empfehlungNichtAngefordert'));
$this->terminateWithJsonError("Empfehlung wurde nicht angefordert");
}
else
{
@@ -285,12 +285,6 @@ class approveAnrechnungDetail extends Auth_Controller
$this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen'));
}
// Exit if user has no write permission for the Studiengang of the Anrechnung
if (!$this->anrechnunglib->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $anrechnung_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Delete last status approved / rejected.
// If last status is 'approved', Genehmigung is resetted.
$result = $this->AnrechnungModel->withdrawApprovement($anrechnung_id);
@@ -319,12 +313,6 @@ class approveAnrechnungDetail extends Auth_Controller
show_error('Wrong parameter.');
}
// Exit if user has no write permission for the Studiengang of the Anrechnung
if (!$this->anrechnunglib->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $anrechnung_id))
{
return $this->outputJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Get boolean empfehlung of given Anrechnung
if (!$result = getData($this->AnrechnungModel->load($anrechnung_id))[0])
{
@@ -345,7 +333,7 @@ class approveAnrechnungDetail extends Auth_Controller
// Return if Anrechnung was not waiting for recommendation or if Anrechnung has already been recommended
if ($last_status != self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR || !is_null($empfehlung))
{
return $this->outputJsonError($this->p->t('anrechnung', 'keineEmpfehlungZumZuruecknehmen'));
return $this->outputJsonError('No recommendation to withdraw.');
}
// Reset status to 'inProgressDP'
@@ -353,7 +341,7 @@ class approveAnrechnungDetail extends Auth_Controller
if (isError($result))
{
return $this->outputJsonError($this->p->t('anrechnung', 'antragNichtZurueckgenommen'));
return $this->outputJsonError('Could not withdraw this application.');
}
// Success output to AJAX
@@ -371,20 +359,7 @@ class approveAnrechnungDetail extends Auth_Controller
// Validate data
if (isEmptyString($anrechnung_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'systemfehler'));
}
// Exit if user has no write permission for the Studiengang of the Anrechnung
if (!$this->anrechnunglib->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $anrechnung_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Exit if the posted Notiz is not an Empfehlungsnotiz of this Anrechnung
$result = $this->NotizModel->getNotizByAnrechnung($anrechnung_id, self::ANRECHNUNG_NOTIZTITEL_EMPFEHLUNGSNOTIZ_BY_STGL);
if (!isEmptyString($notiz_id) && !in_array($notiz_id, array_column(hasData($result) ? getData($result) : array(), 'notiz_id')))
{
$this->terminateWithJsonError($this->p->t('ui', 'keineBerechtigung'));
$this->terminateWithJsonError($this->p->t('ui', 'systemFehler'));
}
// Save Empfehlungstext
@@ -448,8 +423,14 @@ class approveAnrechnungDetail extends Auth_Controller
show_error('Failed loading Anrechnung');
}
// Check if user is entitled for the Studiengang of the Anrechnung
if (!$this->anrechnunglib->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $anrechnung_id))
$result = $this->LehrveranstaltungModel->loadWhere(array(
'lehrveranstaltung_id' => getData($result)[0]->lehrveranstaltung_id
));
$studiengang_kz = getData($result)[0]->studiengang_kz;
// Check if user is entitled
if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $studiengang_kz))
{
show_error('You are not entitled to read this page');
}
@@ -468,8 +449,14 @@ class approveAnrechnungDetail extends Auth_Controller
show_error('Failed retrieving Anrechnung');
}
// Check if user is entitled for the Studiengang of the Anrechnung
if (!$this->anrechnunglib->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $result->anrechnung_id))
$result = $this->LehrveranstaltungModel->loadWhere(array(
'lehrveranstaltung_id' => $result->lehrveranstaltung_id
));
$studiengang_kz = getData($result)[0]->studiengang_kz;
// Check if user is entitled
if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $studiengang_kz))
{
show_error('You are not entitled to read this document');
}
@@ -123,7 +123,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
// Validate data
if (isEmptyArray($data))
{
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
$json = array(
@@ -154,7 +154,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
}
else
{
return $this->outputJsonError($this->p->t('anrechnung', 'keineAnrechnungenGenehmigt'));
return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.');
}
}
@@ -168,7 +168,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
// Validate data
if (isEmptyArray($data))
{
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
// Reject Anrechnung
@@ -191,7 +191,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
}
else
{
return $this->outputJsonError($this->p->t('anrechnung', 'keineAnrechnungenAbgelehnt'));
return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.');
}
}
@@ -204,7 +204,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
if(isEmptyArray($data))
{
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
$retval = array();
@@ -254,10 +254,10 @@ class approveAnrechnungUebersicht extends Auth_Controller
{
if ($counter > 0)
{
$this->terminateWithJsonError($this->p->t('anrechnung', 'lvsOhneLektoren', array($counter)));
$this->terminateWithJsonError('Bei '. $counter.' LV sind keine LektorInnen zugeteilt.');
}
$this->terminateWithJsonError($this->p->t('anrechnung', 'keineEmpfehlungenAngefordert'));
$this->terminateWithJsonError('Es wurden keine Empfehlungen angefordert');
}
$this->outputJsonSuccess($retval);
@@ -312,8 +312,19 @@ class approveAnrechnungUebersicht extends Auth_Controller
show_error('Failed retrieving Anrechnung');
}
// Check if user is entitled for the Studiengang of the Anrechnung
if (!$this->anrechnunglib->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $result->anrechnung_id))
$result = $this->LehrveranstaltungModel->loadWhere(array(
'lehrveranstaltung_id' => $result->lehrveranstaltung_id
));
if(!$result = getData($result)[0])
{
show_error('Failed loading Lehrveranstaltung');
}
$studiengang_kz = $result->studiengang_kz;
// Check if user is entitled
if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $studiengang_kz))
{
show_error('You are not entitled to read this document');
}
@@ -76,13 +76,6 @@ class CreateAnrechnung extends Auth_Controller
// Get Anrechnungsbegruendungen
$this->load->model('education/Anrechnungbegruendung_model', 'AnrechnungbegruendungModel');
// Begruendung in the users language, German name if no translation exists
$language_index = getUserLanguage() == 'German' ? 1 : 2;
$this->AnrechnungbegruendungModel->addSelect(
'begruendung_id, COALESCE(bezeichnung_mehrsprachig[' . $language_index . '], bezeichnung) AS bezeichnung',
false
);
$begruendung_arr = getData($this->AnrechnungbegruendungModel->load());
$viewData = array(
@@ -101,12 +94,6 @@ class CreateAnrechnung extends Auth_Controller
{
$prestudent_id = $this->input->post('prestudent_id');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
// Exit if user has no permission for the Studiengang of the student
if (!$this->anrechnunglib->isBerechtigtForPrestudent(self::BERECHTIGUNG_ANRECHNUNG_ANLEGEN, 's', $prestudent_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Get Student UID
$student_uid = $this->StudentModel->getUID($prestudent_id);
@@ -149,19 +136,6 @@ class CreateAnrechnung extends Auth_Controller
{
$this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen'));
}
// Exit if user has no write permission for the Studiengang of the student
if (!$this->anrechnunglib->isBerechtigtForPrestudent(self::BERECHTIGUNG_ANRECHNUNG_ANLEGEN, 'suid', $prestudent_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Exit if the Lehrveranstaltung is not one of the LVs the form offers for this student
$result = $this->LehrveranstaltungModel->getLvsByStudent($this->StudentModel->getUID($prestudent_id), $studiensemester_kurzbz);
if (!in_array($lehrveranstaltung_id, array_column(hasData($result) ? getData($result) : array(), 'lehrveranstaltung_id')))
{
$this->terminateWithJsonError($this->p->t('anrechnung', 'lvNichtZugeteilt'));
}
// Exit if application already exists
if (self::_applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id))
@@ -88,10 +88,6 @@ class requestAnrechnung extends Auth_Controller
// Get Anrechung data
$anrechnungData = $this->anrechnunglib->getAnrechnungDataByLv($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id);
// Check if a new Antrag is for a Lehrveranstaltung outside the Studienplan (e.g. LV of a parallel study)
$is_not_in_studienplan = !is_numeric($anrechnungData->anrechnung_id)
&& !hasData($this->LehrveranstaltungModel->getLvInStudienplan($prestudent_id, $lehrveranstaltung_id));
// Get Antrag data
$antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id, $anrechnungData->anrechnung_id);
@@ -99,8 +95,7 @@ class requestAnrechnung extends Auth_Controller
'antragData' => $antragData,
'anrechnungData' => $anrechnungData,
'is_expired' => $is_expired,
'is_blocked' => $is_blocked,
'is_not_in_studienplan' => $is_not_in_studienplan
'is_blocked' => $is_blocked
);
$this->load->view('lehre/anrechnung/requestAnrechnung.php', $viewData);
@@ -159,7 +154,7 @@ class requestAnrechnung extends Auth_Controller
// Exit if application already exists
if (self::_applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id))
{
return $this->outputJsonError($this->p->t('global', 'antragBereitsGestellt'));
return $this->outputJsonError($this->p->t('anrechnung', 'antragBereitsGestellt'));
}
// Exit if application is a past ( < actual ) studysemester
@@ -167,30 +162,6 @@ class requestAnrechnung extends Auth_Controller
{
return $this->outputJsonError($this->p->t('anrechnung', 'antragNichtFuerVerganganeSS'));
}
// Exit if student is not assigned to the Lehrveranstaltung
if (!hasData($this->LehrveranstaltungModel->getLvByStudent($this->_uid, $studiensemester_kurzbz, $lehrveranstaltung_id)))
{
return $this->outputJsonError($this->p->t('anrechnung', 'lvNichtZugeteilt'));
}
// Exit if Lehrveranstaltung is not in the Studienplan of the student (e.g. LV of a parallel study)
if (!hasData($this->LehrveranstaltungModel->getLvInStudienplan($prestudent_id, $lehrveranstaltung_id)))
{
return $this->outputJsonError($this->p->t('anrechnung', 'lvNichtImStudienplan'));
}
// Exit if application deadline is expired
if ($this->_isExpired($studiensemester_kurzbz))
{
return $this->outputJsonError($this->p->t('anrechnung', 'deadlineUeberschritten'));
}
// Exit if Lehrveranstaltung was already graded with application blocking grades
if (self::_LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id))
{
return $this->outputJsonError($this->p->t('anrechnung', 'antragBenotungBlockiert'));
}
// Upload document
$result = self::_uploadFile();
@@ -116,7 +116,7 @@ class reviewAnrechnungDetail extends Auth_Controller
if(isEmptyArray($data))
{
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
// Get lectors person data
@@ -173,7 +173,7 @@ class reviewAnrechnungDetail extends Auth_Controller
if(isEmptyArray($data))
{
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
// Get lectors person data
@@ -91,7 +91,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller
if(isEmptyArray($data))
{
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
foreach ($data as $item)
@@ -140,7 +140,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller
if(isEmptyArray($data))
{
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
foreach ($data as $item)
+16 -126
View File
@@ -14,8 +14,6 @@ class AnrechnungLib
const ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_STGL = 'AnrechnungNotizSTGL';
const ANRECHNUNG_NOTIZTITEL_EMPFEHLUNGSNOTIZ_BY_STGL = 'AnrechnungEmpfehlungsnotizSTGL';
const BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN = 'lehre/anrechnung_genehmigen';
public function __construct()
{
$this->ci =& get_instance();
@@ -59,7 +57,7 @@ class AnrechnungLib
// Load LV, but check if student is assigned to that LV. Break, if not.
if(!$lv = getData($this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id))[0])
{
show_error($this->ci->p->t('anrechnung', 'lvNichtZugeteilt'));
show_error('You are not assigned to this course yet.');
}
}
@@ -75,14 +73,8 @@ class AnrechnungLib
show_error(getError($student));
}
// Studiengang of the prestudent, not of the LV (same source as the permission checks)
if (!$prestudent = getData($this->ci->PrestudentModel->load($prestudent_id))[0])
{
show_error('Failed loading prestudent data.');
}
// Get studiengang bezeichnung
if (!$studiengang = getData($this->ci->StudiengangModel->load($prestudent->studiengang_kz))[0])
if (!$studiengang = getData($this->ci->StudiengangModel->load($lv->studiengang_kz))[0])
{
show_error('Failed loading studiengang data.');
}
@@ -101,20 +93,15 @@ class AnrechnungLib
$latest_zgv_bezeichnung = hasData($result) ? getData($result)[0]->bezeichnung : '';
// Get Sum of berufliche and schulische ECTS
$result = $this->ci->LehrveranstaltungModel->getEctsSumSchulisch($uid, $prestudent_id, $prestudent->studiengang_kz);
$result = $this->ci->LehrveranstaltungModel->getEctsSumSchulisch($uid, $prestudent_id, $lv->studiengang_kz);
$sumEctsSchulisch = getData($result)[0]->ectssumschulisch;
$result = $this->ci->LehrveranstaltungModel->getEctsSumBeruflich($uid);
$sumEctsBeruflich = getData($result)[0]->ectssumberuflich;
// English names only if the LV or Studiengang has one
$english = getUserLanguage() != 'German';
// Set the given studiensemester
$antrag_data->lv_id = $lv_id;
$antrag_data->lv_bezeichnung = $english && !isEmptyString($lv->bezeichnung_english)
? $lv->bezeichnung_english
: $lv->bezeichnung;
$antrag_data->lv_bezeichnung = $lv->bezeichnung;
$antrag_data->ects = $lv->ects;
$antrag_data->sumEctsSchulisch = $sumEctsSchulisch;
$antrag_data->sumEctsBeruflich = $sumEctsBeruflich;
@@ -124,9 +111,7 @@ class AnrechnungLib
$antrag_data->student_uid = $uid;
$antrag_data->matrikelnr = $student->matrikelnr;
$antrag_data->studiengang_kz = $studiengang->studiengang_kz;
$antrag_data->stg_bezeichnung = $english && !isEmptyString($studiengang->english)
? $studiengang->english
: $studiengang->bezeichnung;
$antrag_data->stg_bezeichnung = $studiengang->bezeichnung;
$antrag_data->lektoren = $lv_lektoren_arr;
$antrag_data->zgv = $latest_zgv_bezeichnung;
@@ -473,12 +458,6 @@ class AnrechnungLib
*/
public function approveAnrechnung($anrechnung_id)
{
// Exit if user has no write permission for the Studiengang of the Anrechnung
if (!$this->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $anrechnung_id))
{
return false;
}
// Check last Anrechnungstatus
if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
@@ -528,12 +507,6 @@ class AnrechnungLib
*/
public function rejectAnrechnung($anrechnung_id, $begruendung)
{
// Exit if user has no write permission for the Studiengang of the Anrechnung
if (!$this->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $anrechnung_id))
{
return false;
}
// Check last Anrechnungstatus
if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
@@ -582,12 +555,6 @@ class AnrechnungLib
*/
public function requestRecommendation($anrechnung_id)
{
// Exit if user has no write permission for the Studiengang of the Anrechnung
if (!$this->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $anrechnung_id))
{
return false;
}
// Check last Anrechnungstatus
if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
@@ -608,7 +575,7 @@ class AnrechnungLib
$this->ci->db->trans_start(false);
// Insert new status inProgressLektor
$this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR);
$result = $this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR);
/**
* Anyway update empfehlung_anrechnung to be null
@@ -628,7 +595,7 @@ class AnrechnungLib
if ($this->ci->db->trans_status() === false)
{
$this->ci->db->trans_rollback();
return false;
return error($result->msg, EXIT_ERROR);
}
return true; // recommended
@@ -642,12 +609,6 @@ class AnrechnungLib
*/
public function recommendAnrechnung($anrechnung_id)
{
// Exit if user did not receive the request for recommendation
if (!$this->isEmpfehlungsberechtigt($anrechnung_id))
{
return false;
}
// Check last Anrechnungstatus
if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
@@ -659,7 +620,7 @@ class AnrechnungLib
// Exit if already approved or rejected
if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED)
{
return false; // dont approve
return success(false); // dont approve
}
// Start DB transaction
@@ -696,12 +657,6 @@ class AnrechnungLib
*/
public function dontRecommendAnrechnung($anrechnung_id, $begruendung)
{
// Exit if user did not receive the request for recommendation
if (!$this->isEmpfehlungsberechtigt($anrechnung_id))
{
return false;
}
// Check last Anrechnungstatus
if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
@@ -794,7 +749,7 @@ class AnrechnungLib
$result = $this->ci->AnrechnungModel->load($anrechnung_id);
if (!hasData($result))
{
show_error('Failed loading Anrechnung');
showError('Anrechnung existiert nicht');
}
// Get lectors of lehrveranstaltung
@@ -815,72 +770,16 @@ class AnrechnungLib
*/
public function isEmpfehlungsberechtigt($anrechnung_id)
{
// load() without an ID loads all Anrechnungen
if (!is_numeric($anrechnung_id))
if($this->ci->config->item('fbl') === TRUE)
{
return false;
return true;
}
// Get lv-leitungen or, if not present, all lectors of lv.
$lector_arr = $this->getLectors($anrechnung_id);
// Get Leitungen of the LV-OE (fbl), or lv-leitungen or, if not present, all lectors of lv.
$receiver_arr = $this->ci->config->item('fbl') === TRUE
? $this->getLeitungOfLvOe($anrechnung_id)
: $this->getLectors($anrechnung_id);
// True if user received the request for recommendation
return is_array($receiver_arr) && in_array(getAuthUID(), array_column($receiver_arr, 'uid'));
// Return false if lv-leitung is present and user is not lv-leitung. Otherways return always true.
return in_array(getAuthUID(), array_column($lector_arr, 'uid'));
}
/**
* Check the permission for the Studiengang of the Anrechnung.
* The Studiengang of an Anrechnung is the Studiengang of its prestudent, not of the LV.
*
* @param $berechtigung_kurzbz
* @param $art
* @param $anrechnung_id
* @return bool
*/
public function isBerechtigtForAnrechnung($berechtigung_kurzbz, $art, $anrechnung_id)
{
// load() without an ID loads all Anrechnungen
if (!is_numeric($anrechnung_id))
{
return false;
}
$result = $this->ci->AnrechnungModel->load($anrechnung_id);
return hasData($result)
&& $this->isBerechtigtForPrestudent($berechtigung_kurzbz, $art, getData($result)[0]->prestudent_id);
}
/**
* Check the permission for the Studiengang of the prestudent.
*
* @param $berechtigung_kurzbz
* @param $art
* @param $prestudent_id
* @return bool
*/
public function isBerechtigtForPrestudent($berechtigung_kurzbz, $art, $prestudent_id)
{
// load() without an ID loads all prestudents
if (!is_numeric($prestudent_id))
{
return false;
}
$result = $this->ci->PrestudentModel->load($prestudent_id);
// Without a Studiengang, isBerechtigt checks the permission for any OE
if (!hasData($result))
{
return false;
}
$this->ci->load->library('PermissionLib');
return $this->ci->permissionlib->isBerechtigt($berechtigung_kurzbz, $art, getData($result)[0]->studiengang_kz);
}
/**
* Get LV Leitung. If not present, get all LV lectors.
@@ -957,11 +856,6 @@ class AnrechnungLib
$this->ci->AnrechnungModel->addSelect('lehrveranstaltung_id');
$result = $this->ci->AnrechnungModel->load($anrechnung_id);
if (!hasData($result))
{
return false;
}
$lehrveranstaltung_id = getData($result)[0]->lehrveranstaltung_id;
// Get Leitungen
@@ -995,11 +889,7 @@ class AnrechnungLib
$anrechnung_data->prestudent_id = $anrechnung->prestudent_id;
$anrechnung_data->lehrveranstaltung_id = $anrechnung->lehrveranstaltung_id;
$anrechnung_data->begruendung_id = $anrechnung->begruendung_id;
// Begruendung in the users language, German name if no translation exists
$language_index = getUserLanguage() == 'German' ? 0 : 1;
$anrechnung_data->begruendung = !empty($anrechnung->bezeichnung_mehrsprachig[$language_index])
? $anrechnung->bezeichnung_mehrsprachig[$language_index]
: $anrechnung->bezeichnung;
$anrechnung_data->begruendung = $anrechnung->bezeichnung;
$anrechnung_data->anmerkung = $anrechnung->anmerkung_student;
$anrechnung_data->dms_id = $anrechnung->dms_id;
$anrechnung_data->insertamum = (new DateTime($anrechnung->insertamum))->format('d.m.Y');
+101 -4
View File
@@ -33,7 +33,7 @@ class SearchBarLib
const ERROR_NOT_AUTH = 'ERR005';
// 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=';
@@ -180,10 +180,14 @@ class SearchBarLib
protected function buildSearchClause(DB_Model $dbModel, array $columns, $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);
$query = '\'' . implode(':* & ', explode(' ', trim($searchstr))) . ':*\'';
$reversequery = '\'*:' . implode(' & *:', explode(' ', trim($searchstr))) . '\'';
$nospacequery = '\'' . implode('', explode(' ', trim($searchstr))) . ':*\'';
$query = '\'' . implode(':* & ', $words) . ':*\'';
$reversequery = '\'*:' . implode(' & *:', $words) . '\'';
$nospacequery = '\'' . implode('', $words) . ':*\'';
$searchclause = <<<EOSC
to_tsvector(lower(regexp_replace({$document}, '[[:punct:]]', ' ', 'g'))) @@ to_tsquery(lower({$query}))
@@ -596,5 +600,98 @@ EOSC;
// Otherwise return an empty 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)
return [];
$this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz);
}
@@ -61,7 +61,7 @@ class Anrechnung_model extends DB_Model
if ($this->db->trans_status() === false)
{
$this->db->trans_rollback();
return error($this->p->t('ui', 'fehlerBeimSpeichern'), EXIT_ERROR);
return error('Failed inserting Anrechnung', EXIT_ERROR);
}
return success($lastInsert_anrechnung_id);
@@ -166,7 +166,7 @@ class Anrechnung_model extends DB_Model
// Get last Anrechnungstatus
if (!$result = getData($this->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
return error($this->p->t('ui', 'fehlerBeimLesen'));
return error('Failed loading Anrechnung');
}
$last_status = $result->status_kurzbz;
@@ -175,7 +175,7 @@ class Anrechnung_model extends DB_Model
// Exit, if last status is not approved / rejected
if ($last_status != self::ANRECHNUNGSTATUS_APPROVED && $last_status != self::ANRECHNUNGSTATUS_REJECTED)
{
return error($this->p->t('anrechnung', 'keineGenehmigungZumZuruecknehmen'));
return error('Nothing to withdraw. Application is still in progress');
}
// Start DB transaction
@@ -197,7 +197,7 @@ class Anrechnung_model extends DB_Model
if ($this->db->trans_status() === false)
{
$this->db->trans_rollback();
return error($this->p->t('anrechnung', 'antragNichtZurueckgenommen'), EXIT_ERROR);
return error('Failed withdrawing Genehmigung', EXIT_ERROR);
}
return success();
@@ -211,31 +211,21 @@ class Anrechnung_model extends DB_Model
*/
public function getAnrechnungsData($prestudent_id)
{
// Names in the users language, German if no translation exists
$english = getUserLanguage() != 'German';
$language_index = $english ? 2 : 1;
$lv_bezeichnung = $english
? 'COALESCE(NULLIF(lehre.tbl_lehrveranstaltung.bezeichnung_english, \'\'), lehre.tbl_lehrveranstaltung.bezeichnung)'
: 'lehre.tbl_lehrveranstaltung.bezeichnung';
$lv_comp_bezeichnung = $english
? 'COALESCE(NULLIF(lv_comp.bezeichnung_english, \'\'), lv_comp.bezeichnung)'
: 'lv_comp.bezeichnung';
$qry = '
SELECT
lehre.tbl_anrechnung.anrechnung_id,
lehre.tbl_anrechnung.prestudent_id,
lehre.tbl_anrechnung.lehrveranstaltung_id,
' . $lv_bezeichnung . ' AS bez_lehrveranstaltung,
COALESCE(lehre.tbl_anrechnung_begruendung.bezeichnung_mehrsprachig[' . $language_index . '], lehre.tbl_anrechnung_begruendung.bezeichnung) AS begruendung,
COALESCE(lehre.tbl_anrechnungstatus.bezeichnung_mehrsprachig[' . $language_index . '], lehre.tbl_anrechnung_anrechnungstatus.status_kurzbz) AS status,
lehre.tbl_lehrveranstaltung.bezeichnung AS bez_lehrveranstaltung,
lehre.tbl_anrechnung_begruendung.bezeichnung AS begruendung,
lehre.tbl_anrechnung_anrechnungstatus.status_kurzbz AS status,
genehmigt_von,
lehre.tbl_anrechnung.insertamum,
lehre.tbl_anrechnung.insertvon,
lehre.tbl_anrechnung.updateamum,
lehre.tbl_anrechnung.updatevon,
lehrveranstaltung_id_kompatibel,
' . $lv_comp_bezeichnung . ' as lehrveranstaltung_bez_kompatibel,
lv_comp.bezeichnung as lehrveranstaltung_bez_kompatibel,
count(nz.notizzuordnung_id) AS notizen_anzahl
FROM
lehre.tbl_anrechnung
@@ -31,7 +31,7 @@ class Anrechnungszeitraum_model extends DB_Model
if (isError($result))
{
return error($this->p->t('ui', 'fehlerBeimSpeichern'));
return error('Fehler bei Anrechnungszeitraum speichern.');
}
// Return new anrechnungszeitraum_id
@@ -50,7 +50,7 @@ class Anrechnungszeitraum_model extends DB_Model
if (isError($result))
{
return error($this->p->t('anrechnung', 'fehlerBeimLoeschen'));
return error('Fehler bei Anrechnungszeitraum löschen.');
}
return success($result->retval);
@@ -78,7 +78,7 @@ class Anrechnungszeitraum_model extends DB_Model
if (isError($result))
{
return error($this->p->t('ui', 'fehlerBeimSpeichern'));
return error('Fehler bei Anrechnungszeitraum update.');
}
return success($result->retval);
@@ -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)
{
$qry = "WITH lehreinheiten AS (
@@ -347,35 +361,7 @@ EOSQL;
FROM lehre.tbl_lehreinheit
WHERE lehrveranstaltung_id = ?
AND studiensemester_kurzbz = ?
),
". $this->_getGruppenCTE() . ",
". $this->_getLektorenCTE() . ",
". $this->_getFachbereichCTE() . ",
". $this->_getTagsCTE() . "
SELECT lehreinheiten.*,
lehreinheiten.lehrform_kurzbz as lv_lehrform_kurzbz,
tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
COALESCE(tag_data_agg.tags, '[]'::json) AS tags,
gruppen.gruppen,
mitarbeiter.lektoren,
mitarbeiter.le_planstunden,
mitarbeiter.vorname,
mitarbeiter.nachname,
mitarbeiter.semesterstunden,
fachbereich.bezeichnung as fachbereich,
UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang,
semester
FROM lehreinheiten
LEFT JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = lehreinheiten.lehrfach_id
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
LEFT JOIN tag_data_agg ON tag_data_agg.lehreinheit_id = lehreinheiten.lehreinheit_id
LEFT JOIN mitarbeiter ON lehreinheiten.lehreinheit_id = mitarbeiter.lehreinheit_id
LEFT JOIN fachbereich ON lehreinheiten.lehreinheit_id = fachbereich.lehreinheit_id
LEFT JOIN gruppen ON lehreinheiten.lehreinheit_id = gruppen.lehreinheit_id
WHERE true
";
)," . $this->_getLeCTE();
$params = array($lv_id, $studiensemester_kurzbz);
@@ -395,9 +381,83 @@ EOSQL;
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 lehreinheit_id,
'' as wochenrythmus,
@@ -408,24 +468,33 @@ EOSQL;
'' as studienplan_beeichnung,
UPPER(CONCAT(vw_lehreinheit.stg_typ, vw_lehreinheit.stg_kurzbz)) as studiengang
FROM campus.vw_lehreinheit
WHERE mitarbeiter_uid = ?
AND studiensemester_kurzbz = ?";
if (!is_null($stg_kz)) {
$qry .= " AND lv_studiengang_kz = ?";
}
return $qry;
WHERE studiensemester_kurzbz = ? ";
}
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.*
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))
{
$params[] = $stg_kz;
@@ -632,6 +701,36 @@ EOSQL;
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()
{
return "gruppen AS (
@@ -658,26 +658,6 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($query, array($uid, $studiensemester_kurzbz, $lehrveranstaltung_id));
}
/**
* Gets the Lehrveranstaltung if it is in a Studienplan of the prestudent.
* Checks the Studienplaene of all statuses, because the status of a future semester can be missing.
* @param $prestudent_id
* @param $lehrveranstaltung_id
* @return array|null
*/
public function getLvInStudienplan($prestudent_id, $lehrveranstaltung_id)
{
$query = '
SELECT DISTINCT spl.lehrveranstaltung_id
FROM public.tbl_prestudentstatus ps
JOIN lehre.tbl_studienplan_lehrveranstaltung spl USING (studienplan_id)
WHERE ps.prestudent_id = ?
AND spl.lehrveranstaltung_id = ?;
';
return $this->execQuery($query, array($prestudent_id, $lehrveranstaltung_id));
}
/**
* Get Lehreinheit.
*
@@ -292,13 +292,29 @@ class Studiensemester_model extends DB_Model
COALESCE(
(SELECT studiensemester_kurzbz FROM 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
SELECT
COALESCE(
(SELECT studiensemester_kurzbz FROM 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;
@@ -19,14 +19,12 @@ $includesArray = array(
'anrechnungszeitraumHinzufuegen',
'anrechnungszeitraumSpeichern',
'anrechnungszeitraumStart',
'anrechnungszeitraumEnde',
'anrechnungszeitraumBearbeiten'
'anrechnungszeitraumEnde'
),
'ui' => array(
'aktion',
'geloescht',
'gespeichert',
'systemfehler',
'frageSicherLoeschen',
'spaltenEinstellen'
),
@@ -115,7 +113,7 @@ if (defined("CIS4")) {
<input type="hidden" id="defaultStudiensemester_kurzbz"
value="<?php echo $studiensemester_kurzbz ?>">
<div class="col-xs-4">
<label for="studiensemester" class="small"><?php echo ucfirst($this->p->t('lehre', 'studiensemester')); ?></label>
<label for="studiensemester" class="small">Studiensemester</label>
<?php
echo $this->widgetlib->widget(
'Studiensemester_widget',
@@ -130,11 +128,11 @@ if (defined("CIS4")) {
?>
</div>
<div class="col-xs-4">
<label for="azrStart" class="small"><?php echo $this->p->t('anrechnung', 'anrechnungszeitraumStart'); ?></label>
<label for="azrStart" class="small">Anr.-Zeitraum Start</label>
<input type="date" id="azrStart" value="" class="form-control" required>
</div>
<div class="col-xs-4">
<label for="azrEnde" class="small"><?php echo $this->p->t('anrechnung', 'anrechnungszeitraumEnde'); ?></label>
<label for="azrEnde" class="small">Anr.-Zeitraum Ende</label>
<input type="date" id="azrEnde" value="" class="form-control" required>
</div>
</div>
@@ -7,7 +7,7 @@ $includesArray = array(
'jqueryui1' => true,
'bootstrap5' => true,
'cis' => true,
'fontawesome6' => true,
'fontawesome4' => true,
'ajaxlib' => true,
'dialoglib' => true,
'phrases' => array(
@@ -47,9 +47,7 @@ $includesArray = array(
'erfolgreichZurueckgenommen',
'empfehlungPositivConfirmed',
'empfehlungNegativConfirmed',
'anrechnungEctsTooltipTextBeiUeberschreitung',
'hoechstgrenzeUeberschritten',
'browserNichtUnterstuetzt'
'anrechnungEctsTooltipTextBeiUeberschreitung'
)
),
'customCSSs' => array(
@@ -163,12 +161,12 @@ if (defined("CIS4")) {
</span>
</th>
<td>
<?php echo $this->p->t('anrechnung', 'totalEcts'); ?>: <span
Total: <span
id="sumEctsTotal"><?php echo number_format($antragData->sumEctsSchulisch + $antragData->sumEctsBeruflich, 1) ?></span>
[<?php echo $this->p->t('anrechnung', 'schulisch'); ?>: <span id="sumEctsSchulisch"
[Schulisch: <span id="sumEctsSchulisch"
value="<?php echo $antragData->sumEctsSchulisch ?>"><?php echo $antragData->sumEctsSchulisch ?></span>
/
<?php echo $this->p->t('anrechnung', 'beruflich'); ?>: <span id="sumEctsBeruflich"
Beruflich: <span id="sumEctsBeruflich"
value="<?php echo $antragData->sumEctsBeruflich ?>"><?php echo $antragData->sumEctsBeruflich ?></span>
]
<div class="p-1 align-items-center" id="sumEctsMsg"></div>
@@ -500,7 +498,7 @@ if (defined("CIS4")) {
<div class="col-4">
<!-- -Statusleiste -->
<div class="mb-5 alert text-center">
<?php echo $this->p->t('global', 'status'); ?>: <b><span class="text-uppercase" id="approveAnrechnungDetail-status_kurzbz"
Status: <b><span class="text-uppercase" id="approveAnrechnungDetail-status_kurzbz"
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span></b>
@@ -5,7 +5,7 @@ $includesArray = array(
'jquery3' => true,
'jqueryui1' => true,
'bootstrap5' => true,
'fontawesome6' => true,
'fontawesome4' => true,
'tabulator5' => true,
'tabulator5JQuery' => true,
'ajaxlib' => true,
@@ -15,9 +15,7 @@ $includesArray = array(
'phrases' => array(
'global' => array(
'begruendung',
'zgv',
'details',
'status'
'zgv'
),
'anrechnung' => array(
'nachweisdokumente',
@@ -25,9 +23,7 @@ $includesArray = array(
'empfehlungsanfrageAn',
'empfehlungsanfrageAm',
'confirmTextAntragHatBereitsEmpfehlung',
'herkunft',
'ectsSummeKurz',
'browserNichtUnterstuetzt'
'herkunft'
),
'ui' => array(
'anzeigen',
@@ -141,8 +137,7 @@ if (defined("CIS4")) {
</div>
<button type="submit"
class="btn btn-outline-secondary col-auto"><?php echo ucfirst($this->p->t('ui', 'anzeigen')); ?>
</button>
class="btn btn-outline-secondary col-auto"><?php echo ucfirst($this->p->t('ui', 'anzeigen')); ?></button>
</form>
</div>
</div>
@@ -180,11 +175,9 @@ if (defined("CIS4")) {
</li>
<li class="list-group-item list-group-item-secondary"><?php echo $this->p->t('anrechnung', 'genehmigungNegativKenntnisseNichtGleichwertigWeilHinweis'); ?></li>
</ol>
<textarea class="form-control"
name="begruendung" id="approveAnrechnungUebersicht-begruendung"
<textarea class="form-control" name="begruendung" id="approveAnrechnungUebersicht-begruendung"
rows="2"
placeholder="<?php echo $this->p->t('anrechnung', 'textUebernehmenOderEigenenBegruendungstext'); ?>"
required></textarea>
placeholder="<?php echo $this->p->t('anrechnung', 'textUebernehmenOderEigenenBegruendungstext'); ?>" required></textarea>
</div>
<!-- Action Button 'Abbrechen'-->
@@ -234,17 +227,17 @@ if (defined("CIS4")) {
<button id="show-inProgressLektor" class="btn btn-outline-secondary btn-clearfilter" type="button"
data-bs-toggle="tooltip" data-bs-placement="left"
title="<?php echo $this->p->t('ui', 'alleInBearbeitungLektor'); ?>"><i
class='fa-regular fa-clock'></i>
class='fa fa-clock-o'></i>
</button>
<button id="show-recommended" class="btn btn-outline-secondary btn-clearfilter" type="button"
data-bs-toggle="tooltip" data-bs-placement="left"
title="<?php echo $this->p->t('ui', 'nurEmpfohleneAnzeigen'); ?>"><i
class='fa-regular fa-thumbs-up'></i>
class='fa fa-thumbs-o-up'></i>
</button>
<button id="show-not-recommended" class="btn btn-outline-secondary btn-clearfilter" type="button"
data-bs-toggle="tooltip" data-bs-placement="left"
title="<?php echo $this->p->t('ui', 'nurNichtEmpfohleneAnzeigen'); ?>"><i
class='fa-regular fa-thumbs-down'></i>
class='fa fa-thumbs-o-down'></i>
</button>
<button id="show-approved" class="btn btn-outline-secondary btn-clearfilter" type="button"
data-bs-toggle="tooltip" data-bs-placement="left"
@@ -6,9 +6,6 @@ $STUDIENSEMESTER = $studiensemester_selected;
$STUDIENGAENGE_ENTITLED = implode(', ', $studiengaenge_entitled); // alle STG mit Lese- und Schreibberechtigung
$ORGANISATIONSEINHEITEN_SCHREIBBERECHTIGT = "'" . implode('\',\'', $oes_schreibberechtigt) . "'"; // alle OE nur mit Schreibberechtigung; singlequote für jeden string notwendig
$LANGUAGE_INDEX = getUserLanguage() == 'German' ? '1' : '2';
// English names only if the Studiengang or LV has one
$STG_BEZEICHNUNG = getUserLanguage() == 'German' ? 'stg.bezeichnung' : 'COALESCE(NULLIF(stg.english, \'\'), stg.bezeichnung)';
$LV_BEZEICHNUNG = getUserLanguage() == 'German' ? 'lv.bezeichnung' : 'COALESCE(NULLIF(lv.bezeichnung_english, \'\'), lv.bezeichnung)';
$query = '
WITH anrechnungen AS
@@ -24,7 +21,7 @@ $query = '
END "schreibberechtigt",
anrechnung.studiensemester_kurzbz,
stg.studiengang_kz,
' . $STG_BEZEICHNUNG . ' AS stg_bezeichnung,
stg.bezeichnung AS stg_bezeichnung,
lv.orgform_kurzbz,
(SELECT ausbildungssemester
FROM public.tbl_prestudentstatus press
@@ -34,12 +31,12 @@ $query = '
ORDER BY press.datum DESC
LIMIT 1
),
' . $LV_BEZEICHNUNG . ' AS lv_bezeichnung,
lv.bezeichnung AS lv_bezeichnung,
lv.ects::numeric(4,1),
get_ects_summe_schulisch(student.student_uid, anrechnung.prestudent_id, stg.studiengang_kz) AS ectsSumSchulisch,
get_ects_summe_beruflich(student.student_uid) AS ectsSumBeruflich,
(person.nachname || \' \' || person.vorname) AS "student",
COALESCE(begruendung.bezeichnung_mehrsprachig[' . $LANGUAGE_INDEX . '], begruendung.bezeichnung) AS "begruendung",
begruendung.bezeichnung AS "begruendung",
dmsversion.name AS "dokument_bezeichnung",
anrechnung.anmerkung_student,
(SELECT COALESCE(
@@ -181,17 +178,17 @@ $filterWidgetArray = array(
'lehrveranstaltung_id',
'begruendung_id',
'dms_id',
$this->p->t('anrechnung', 'schreibberechtigt'),
'Schreibberechtigt',
'studiensemester_kurzbz',
'studiengang_kz',
ucfirst($this->p->t('lehre', 'studiengang')),
ucfirst($this->p->t('lehre', 'organisationsform')),
$this->p->t('lehre', 'semester'),
'Semester',
ucfirst($this->p->t('lehre', 'lehrveranstaltung')),
$this->p->t('anrechnung', 'ectsLv'),
$this->p->t('anrechnung', 'ectsLvUndBisher'),
$this->p->t('anrechnung', 'ectsBisherSchulisch'),
$this->p->t('anrechnung', 'ectsBisherBeruflich'),
'ECTS (LV)',
'ECTS (LV + Bisher)',
'ECTS (Bisher schulisch)',
'ECTS (Bisher beruflich',
ucfirst($this->p->t('global', 'begruendung')),
ucfirst($this->p->t('person', 'studentIn')),
ucfirst($this->p->t('anrechnung', 'nachweisdokumente')),
@@ -200,7 +197,7 @@ $filterWidgetArray = array(
ucfirst($this->p->t('anrechnung', 'antragdatum')),
ucfirst($this->p->t('anrechnung', 'empfehlung')),
'status_kurzbz',
$this->p->t('global', 'status'),
'Status',
'PrestudentID',
ucfirst($this->p->t('anrechnung', 'empfehlungsanfrageAm')),
ucfirst($this->p->t('anrechnung', 'empfehlungsanfrageAn'))
@@ -5,7 +5,7 @@ $includesArray = array(
'jquery3' => true,
'jqueryui1' => true,
'bootstrap5' => true,
'fontawesome6' => true,
'fontawesome4' => true,
'ajaxlib' => true,
'dialoglib' => true,
'tabulator5' => true,
@@ -20,9 +20,7 @@ $includesArray = array(
'antragBearbeiten'
),
'ui' => array(
'hochladen',
'errorDokumentZuGross',
'systemfehler'
'hochladen'
),
'lehre' => array(
'studiensemester',
@@ -3,15 +3,13 @@
$STUDIENSEMESTER = $studiensemester_selected;
$STUDIENGAENGE_ENTITLED = implode(', ', $studiengaenge_entitled);
$LANGUAGE_INDEX = getUserLanguage() == 'German' ? '1' : '2';
// English name only if the Studiengang has one
$STG_BEZEICHNUNG = getUserLanguage() == 'German' ? 'stg.bezeichnung' : 'COALESCE(NULLIF(stg.english, \'\'), stg.bezeichnung)';
$query = '
SELECT pst.prestudent_id,
person.person_id,
pststatus.studienplan_id,
stg.studiengang_kz,
' . $STG_BEZEICHNUNG . ' AS "stg_bezeichnung",
stg.bezeichnung AS "stg_bezeichnung",
ausbildungssemester,
nachname,
vorname,
@@ -49,7 +47,7 @@ $filterWidgetArray = array(
'studienplan_id',
'studiengang_kz',
ucfirst($this->p->t('lehre', 'studiengang')),
$this->p->t('lehre', 'semester'),
'Semester',
ucfirst($this->p->t('person', 'nachname')),
ucfirst($this->p->t('person', 'vorname')),
ucfirst($this->p->t('global', 'zgv'))
@@ -11,7 +11,7 @@ $includesArray = array(
'jquery3' => true,
'jqueryui1' => true,
'bootstrap5' => true,
'fontawesome6' => true,
'fontawesome4' => true,
'ajaxlib' => true,
'dialoglib' => true,
'cis'=>true,
@@ -36,10 +36,8 @@ $includesArray = array(
'anrechnung' => array(
'deadlineUeberschritten',
'benotungDerLV',
'lvNichtImStudienplan',
'anrechnungEctsTextBeiUeberschreitung',
'anrechnungEctsTooltipTextBeiUeberschreitung',
'hoechstgrenzeUeberschritten'
'anrechnungEctsTooltipTextBeiUeberschreitung'
),
'person' => array(
'student',
@@ -160,9 +158,9 @@ else
</div>
</th>
<td colspan="3">
<?php echo $this->p->t('anrechnung', 'totalEcts'); ?>: <span id="sumEctsTotal"><?php echo number_format($antragData->sumEctsSchulisch + $antragData->sumEctsBeruflich, 1) ?></span>
[ <?php echo $this->p->t('anrechnung', 'schulisch'); ?>: <span id="sumEctsSchulisch"><?php echo $antragData->sumEctsSchulisch ?></span> |
<?php echo $this->p->t('anrechnung', 'beruflich'); ?>: <span id="sumEctsBeruflich"><?php echo $antragData->sumEctsBeruflich ?></span> ]
Total ECTS: <span id="sumEctsTotal"><?php echo number_format($antragData->sumEctsSchulisch + $antragData->sumEctsBeruflich, 1) ?></span>
[ Schulisch: <span id="sumEctsSchulisch"><?php echo $antragData->sumEctsSchulisch ?></span> |
Beruflich: <span id="sumEctsBeruflich"><?php echo $antragData->sumEctsBeruflich ?></span> ]
<div class="p-1 align-items-center" id="requestAnrechnung-maxEctsUeberschrittenMsg"></div>
</td>
</tr>
@@ -186,31 +184,43 @@ else
<div class="col-lg-12">
<div class="border border-dark border-3 rounded p-3" >
<p ><?php echo $this->p->t('anrechnung', 'antragStellenText'); ?></p>
<div class="ps-3 ">
<div class="form-check mb-1">
<input class="form-check-input" type="radio" name="begruendung" value="1" <?php echo $anrechnungData->begruendung_id == '1' ? 'checked' : ''; ?> required />
<?php echo $this->p->t('anrechnung', 'antragStellenWegenZeugnis'); ?>&emsp;
<div class="d-inline" id="requestAnrechnung-anrechnungGrundZeugnisTooltip" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true"
data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungGrundZeugnisTooltipText'); ?>" >
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
<div class="form-check mb-1">
<input class="form-check-input" type="radio" name="begruendung" value="5" <?php echo $anrechnungData->begruendung_id == '5' ? 'checked' : ''; ?> required />
<?php echo $this->p->t('anrechnung', 'antragStellenWegenHochschulzeugnis'); ?>&emsp;
<div class="d-inline" id="requestAnrechnung-anrechnungGrundHochschulzeugnisTooltip" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true"
data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungGrundZeugnisTooltipText'); ?>">
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
<div class="form-check mb-1">
<input class="form-check-input" type="radio" name="begruendung" value="4" <?php echo $anrechnungData->begruendung_id == '4' ? 'checked' : ''; ?> required />
<?php echo $this->p->t('anrechnung', 'antragStellenWegenPraxis'); ?>&emsp;
<div class="d-inline" id="requestAnrechnung-anrechnungGrundBerufTooltip" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true"
data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungGrundBerufTooltipText'); ?>">
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
</div>
</div>
</div>
@@ -275,7 +285,7 @@ else
required>
<div class="mx-4 " id="requestAnrechnung-uploadTooltip" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true"
data-bs-title="<?php echo $this->p->t('ui', 'uploadTooltipText'); ?>">
<i class="fa-regular fa-lg fa-circle-question" aria-hidden="true"></i>
<i class="fa fa-lg fa-question-circle-o" aria-hidden="true"></i>
</div>
<a class="mx-4 float-end <?php echo !empty($anrechnungData->dms_id) ? '' : 'visually-hidden' ?>"
id="requestAnrechnung-downloadDocLink"
@@ -283,6 +293,9 @@ else
target="_blank"><?php echo htmlentities($anrechnungData->dokumentname) ?>
</a>
</div>
</div>
</div>
</div>
@@ -290,35 +303,38 @@ else
<!-- Herkunft der Kenntnisse -->
<div class="row mb-3">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<span class="fw-bold"><?php echo $this->p->t('anrechnung', 'herkunftDerKenntnisse'); ?></span>&emsp;
<div class="d-inline" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungInfoTooltipText'); ?>">
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
<div class="card">
<div class="card-header">
<span class="fw-bold"><?php echo $this->p->t('anrechnung', 'herkunftDerKenntnisse'); ?></span>&emsp;
<div class="d-inline" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungInfoTooltipText'); ?>">
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
<div class="card-body">
<textarea class="form-control" name="anmerkung" rows="1" id="requestAnrechnung-herkunftDerKenntnisse"
maxlength="<?php echo CHAR_LENGTH125 ?>" required><?php echo $anrechnungData->anmerkung; ?></textarea>
<small><span class="text-muted float-end"><?php echo $this->p->t('ui', 'maxZeichen'); ?> :<span id="requestAnrechnung-herkunftDerKenntnisse-charCounter"><?php echo CHAR_LENGTH125 ?></span></span></small>
</div>
</div>
</div>
<div class="card-body">
<textarea class="form-control" name="anmerkung" rows="1" id="requestAnrechnung-herkunftDerKenntnisse"
maxlength="<?php echo CHAR_LENGTH125 ?>" required><?php echo $anrechnungData->anmerkung; ?></textarea>
<small><span class="text-muted float-end"><?php echo $this->p->t('ui', 'maxZeichen'); ?> :<span id="requestAnrechnung-herkunftDerKenntnisse-charCounter"><?php echo CHAR_LENGTH125 ?></span></span></small>
</div>
</div>
</div>
</div>
<!-- Bestaetigung-->
<div class="row mb-3">
<div class="col-lg-12">
<div class="border border-3 rounded border-dark p-3" >
<div class="form-check">
<div class="form-check">
<input class="form-check-input border-3" type="checkbox" name="bestaetigung" required>
<small class=" fw-bold"><?php echo $this->p->t('anrechnung', 'bestaetigungstext'); ?></small>
</div>
</div>
</div>
</div>
</div>
<!-- Button 'Anrechnung beantragen'-->
<div class="float-end">
<input type="submit" id="requestAnrechnung-apply-anrechnung" class="btn btn-primary"
<input type="submit" id="requestAnrechnung-apply-anrechnung" class="btn btn-primary"
value="<?php echo $this->p->t('anrechnung', 'anrechnungBeantragen'); ?>">
</div>
</form>
@@ -327,18 +343,16 @@ else
</div>
<div class="col-4">
<!-- Status panel -->
<div class="alert text-center" id="requestAnrechnung-status"><?php echo $this->p->t('global', 'status'); ?>:
<span class="fw-bold text-uppercase" id="requestAnrechnung-status_kurzbz"
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span>
<div class="alert text-center" id="requestAnrechnung-status">Status: <span class="fw-bold text-uppercase" id="requestAnrechnung-status_kurzbz"
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span>
</div>
<!-- Sperregrund panel (hidden by default) -->
<div class="alert bg-danger-subtle text-center visually-hidden" id="requestAnrechnung-sperre"
data-anrechnung_id="<?php echo empty($anrechnungData->anrechnung_id) ? '' : $anrechnungData->anrechnung_id; ?>"
data-expired="<?php echo json_encode($is_expired); ?>"
data-blocked="<?php echo json_encode($is_blocked) ?>"
data-not_in_studienplan="<?php echo json_encode($is_not_in_studienplan) ?>">
data-blocked="<?php echo json_encode($is_blocked) ?>">
</div>
<?php $this->load->view('lehre/anrechnung/requestAnrechnungImportant'); ?>
</div>
@@ -3,10 +3,10 @@
<?php if (isset($this->config->item('display_infobox')['fristen']) && $this->config->item('display_infobox')['fristen'] === true): ?>
<div class="accordion-item">
<h2 class="accordion-header">
<div class="d-flex">
<div class="bg-info-subtle accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#Beantragung" aria-expanded="true" aria-controls="Beantragung">
<div class="bg-info-subtle accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#Beantragung" aria-expanded="true" aria-controls="Beantragung">
<div class="d-flex">
<i class="me-2 fa fa-lg fa-info-circle" aria-hidden="true"></i>&ensp;
<?php echo $this->p->t('anrechnung', 'requestAnrechnungInfoFristenTitle'); ?>
</div>
@@ -23,10 +23,9 @@
<?php if (isset($this->config->item('display_infobox')['referenzbeispiele_ects']) && $this->config->item('display_infobox')['referenzbeispiele_ects'] === true): ?>
<div class="accordion-item">
<h2 class="accordion-header">
<div class="d-flex">
<div class="bg-info-subtle accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#Referenzbeispiele" aria-expanded="false" aria-controls="Referenzbeispiele">
<div class="bg-info-subtle accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#Referenzbeispiele" aria-expanded="false" aria-controls="Referenzbeispiele">
<div class="d-flex">
<i class="me-2 fa fa-lg fa-info-circle" aria-hidden="true"></i>&ensp;
<?php echo $this->p->t('anrechnung', 'requestAnrechnungInfoEctsBerechnungTitle'); ?>
</div>
@@ -64,10 +63,9 @@
<?php if (isset($this->config->item('display_infobox')['herkunft_kenntnisse']) && $this->config->item('display_infobox')['herkunft_kenntnisse'] === true): ?>
<div class="accordion-item">
<h2 class="accordion-header">
<div class="d-flex">
<div class="bg-info-subtle accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#HerkunftKenntnisse" aria-expanded="false" aria-controls="HerkunftKenntnisse">
<div class="bg-info-subtle accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#HerkunftKenntnisse" aria-expanded="false" aria-controls="HerkunftKenntnisse">
<div class="d-flex">
<i class="me-2 fa fa-lg fa-info-circle" aria-hidden="true"></i>&ensp;
<?php echo $this->p->t('anrechnung', 'requestAnrechnungInfoHerkunftKenntnisseTitle'); ?>
</div>
@@ -7,7 +7,7 @@ $includesArray = array(
'jqueryui1' => true,
'bootstrap5' => true,
'cis' => true,
'fontawesome6' => true,
'fontawesome4' => true,
'ajaxlib' => true,
'dialoglib' => true,
'phrases' => array(
@@ -39,8 +39,7 @@ $includesArray = array(
),
'anrechnung' => array(
'empfehlungPositivConfirmed',
'empfehlungNegativConfirmed',
'browserNichtUnterstuetzt'
'empfehlungNegativConfirmed'
)
),
'customCSSs' => array(
@@ -152,6 +151,7 @@ if (defined("CIS4")) {
<div class="col-lg-8">
<table class="table table-bordered table-condensed table-fixed mb-0">
<tbody>
<tr>
<th class="col-4">
<?php echo ucfirst($this->p->t('global', 'zgv')); ?>
@@ -191,6 +191,7 @@ if (defined("CIS4")) {
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
@@ -213,6 +214,7 @@ if (defined("CIS4")) {
<?php echo $this->p->t('anrechnung', 'empfehlungdatum'); ?>:
<span
id="reviewAnrechnungDetail-empfehlungAm"><?php echo $empfehlungData->empfehlung_am ?></span>
</div>
</div>
<div class="card-body">
@@ -378,11 +380,11 @@ if (defined("CIS4")) {
<div class="col-4 ">
<div class="mb-5 alert text-center">
<?php echo $this->p->t('global', 'status'); ?>:
Status:
<b><span class="text-uppercase" id="reviewAnrechnungDetail-status_kurzbz"
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span></b>
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span></b>
</div>
<?php $this->load->view('lehre/anrechnung/reviewAnrechnungInfo'); ?>
@@ -5,7 +5,7 @@ $includesArray = array(
'jquery3' => true,
'jqueryui1' => true,
'bootstrap5' => true,
'fontawesome6' => true,
'fontawesome4' => true,
'tabulator5' => true,
'tabulator5JQuery' => true,
'cis' => true,
@@ -15,15 +15,12 @@ $includesArray = array(
'phrases' => array(
'global' => array(
'begruendung',
'zgv',
'details',
'status'
'zgv'
),
'anrechnung' => array(
'nachweisdokumente',
'empfehlung',
'herkunft',
'browserNichtUnterstuetzt'
'herkunft'
),
'ui' => array(
'anzeigen',
@@ -106,8 +103,7 @@ if (defined("CIS4")) {
<h3 class="fw-normal">
<?php echo $this->p->t('anrechnung', 'anrechnungenPruefen'); ?>
<small class="text-secondary fs-6">|
<?php echo ucfirst($this->p->t('global', 'uebersicht')); ?>
</small>
<?php echo ucfirst($this->p->t('global', 'uebersicht')); ?></small>
</h3>
</div>
</div>
@@ -131,8 +127,7 @@ if (defined("CIS4")) {
?>
</div>
<button type="submit"
class="btn btn-outline-secondary col-auto"><?php echo ucfirst($this->p->t('ui', 'anzeigen')); ?>
</button>
class="btn btn-outline-secondary col-auto"><?php echo ucfirst($this->p->t('ui', 'anzeigen')); ?></button>
</form>
</div>
</div>
@@ -150,12 +145,10 @@ if (defined("CIS4")) {
<?php echo $this->p->t('anrechnung', 'empfehlungenNegativQuestion'); ?>
</h4>
<div class="mb-4">
<b>
<span>&ensp;<?php echo $this->p->t('anrechnung', 'bitteBegruendungAngeben'); ?></span>
<b><span>&ensp;<?php echo $this->p->t('anrechnung', 'bitteBegruendungAngeben'); ?></span>
<span class="text-danger">
<?php echo $this->p->t('anrechnung', 'begruendungWirdFuerAlleUebernommen'); ?>
</span>
</b>
</span></b>
</div>
<ul class="list-group mb-4">
@@ -223,12 +216,12 @@ if (defined("CIS4")) {
<button id="show-recommended" class="btn btn-outline-secondary btn-clearfilter" type="button"
data-bs-toggle="tooltip" data-bs-placement="left" data-bs-html="true"
title="<?php echo $this->p->t('ui', 'nurEmpfohleneAnzeigen'); ?>"><i
class='fa-regular fa-thumbs-up'></i>
class='fa fa-thumbs-o-up'></i>
</button>
<button id="show-not-recommended" class="btn btn-outline-secondary btn-clearfilter"
type="button" data-bs-toggle="tooltip" data-bs-placement="left" data-bs-html="true"
title="<?php echo $this->p->t('ui', 'nurNichtEmpfohleneAnzeigen'); ?>"><i
class='fa-regular fa-thumbs-down'></i>
class='fa fa-thumbs-o-down'></i>
</button>
<button id="show-approved" class="btn btn-outline-secondary btn-clearfilter" type="button"
data-bs-toggle="tooltip" data-bs-placement="left" data-bs-html="true"
@@ -2,9 +2,6 @@
$STUDIENSEMESTER = $studiensemester_selected;
$LEKTOR_UID = getAuthUID();
$LANGUAGE_INDEX = getUserLanguage() == 'German' ? '1' : '2';
// English names only if the Studiengang or LV has one
$STG_BEZEICHNUNG = getUserLanguage() == 'German' ? 'stg.bezeichnung' : 'COALESCE(NULLIF(stg.english, \'\'), stg.bezeichnung)';
$LV_BEZEICHNUNG = getUserLanguage() == 'German' ? 'lv.bezeichnung' : 'COALESCE(NULLIF(lv.bezeichnung_english, \'\'), lv.bezeichnung)';
$query = '
WITH anrechnungen AS
@@ -16,11 +13,11 @@ $query = '
anrechnung.dms_id,
anrechnung.studiensemester_kurzbz,
stg.studiengang_kz,
' . $STG_BEZEICHNUNG . ' AS "stg_bezeichnung",
' . $LV_BEZEICHNUNG . ' AS "lv_bezeichnung",
stg.bezeichnung AS "stg_bezeichnung",
lv.bezeichnung AS "lv_bezeichnung",
lv.ects,
(person.nachname || \' \' || person.vorname) AS "student",
COALESCE(begruendung.bezeichnung_mehrsprachig[' . $LANGUAGE_INDEX . '], begruendung.bezeichnung) AS "begruendung",
begruendung.bezeichnung AS "begruendung",
dmsversion.name AS "dokument_bezeichnung",
anrechnung.anmerkung_student,
(SELECT COALESCE(
@@ -132,7 +129,7 @@ $filterWidgetArray = array(
'requiredPermissions' => 'lehre/anrechnung_empfehlen',
'datasetRepresentation' => 'tabulator',
'columnsAliases' => array(
$this->p->t('anrechnung', 'empfehlungsberechtigt'),
'Empfehlungsberechtigt',
'anrechnung_id',
'lehrveranstaltung_id',
'begruendung_id',
@@ -141,7 +138,7 @@ $filterWidgetArray = array(
'studiengang_kz',
ucfirst($this->p->t('lehre', 'studiengang')),
ucfirst($this->p->t('lehre', 'lehrveranstaltung')),
$this->p->t('lehre', 'ects'),
'ECTS',
ucfirst($this->p->t('person', 'studentIn')),
ucfirst($this->p->t('global', 'begruendung')),
ucfirst($this->p->t('anrechnung', 'nachweisdokumente')),
@@ -150,7 +147,7 @@ $filterWidgetArray = array(
ucfirst($this->p->t('anrechnung', 'antragdatum')),
ucfirst($this->p->t('anrechnung', 'empfehlung')),
'status_kurzbz',
$this->p->t('global', 'status')
'Status'
),
'datasetRepOptions' => '{
height: func_height(this),
@@ -21,6 +21,7 @@ $this->load->view('templates/FHC-Header', $includesArray);
?>
<script type="text/javascript">
document.body.classList.add("cis4");
if (window.self !== window.top)
document.body.classList.add("in-frame");
</script>
-3
View File
@@ -313,9 +313,6 @@ class TableWidget extends Widget
// If session is NOT empty -> a table was already loaded
if ($session != null)
{
// Aliases from the current request, otherwise the headers keep the language of the first load
$this->tablewidgetlib->setSessionElement(TableWidgetLib::SESSION_COLUMNS_ALIASES, $this->_columnsAliases);
// Get SESSION_DATASET_RELOAD from the session
$sessionReloadDataset = $this->tablewidgetlib->getSessionElement(TableWidgetLib::SESSION_DATASET_RELOAD);
+63 -25
View File
@@ -21,6 +21,7 @@
* Manuela Thamer <[email protected]>
*/
require_once(dirname(__FILE__).'/basis_db.class.php');
require_once(dirname(__FILE__).'/mitarbeiter.class.php');
class entwicklungsteam extends basis_db
{
@@ -43,7 +44,6 @@ class entwicklungsteam extends basis_db
public $ext_id;
public $besqual;
public $studiengang_kz_old;
/**
* Konstruktor
@@ -74,7 +74,7 @@ class entwicklungsteam extends basis_db
$qry = "SELECT * FROM bis.tbl_entwicklungsteam JOIN bis.tbl_besqual USING(besqualcode)
WHERE entwicklungsteam_id=".$this->db_add_param($entwicklungsteam_id);
$qry.=";";
$qry.=";";
if($this->db_query($qry))
{
@@ -147,6 +147,11 @@ class entwicklungsteam extends basis_db
$this->errormsg = 'Es muss ein Mitarbeiter angegeben werden';
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=='')
{
$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';
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;
}
@@ -183,30 +208,28 @@ class entwicklungsteam extends basis_db
//Neuen Datensatz anlegen
$qry = "INSERT INTO bis.tbl_entwicklungsteam (mitarbeiter_uid, studiengang_kz, besqualcode, beginn, ende,
updateamum, updatevon, insertamum, insertvon) VALUES (".
$this->db_add_param($this->mitarbeiter_uid).', '.
$this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '.
$this->db_add_param($this->besqualcode, FHC_INTEGER).', '.
$this->db_add_param($this->beginn).', '.
$this->db_add_param($this->ende).', '.
$this->db_add_param($this->updateamum).', '.
$this->db_add_param($this->updatevon).', '.
$this->db_add_param($this->insertamum).', '.
$this->db_add_param($this->insertvon).');';
$this->db_add_param($this->mitarbeiter_uid).', '.
$this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '.
$this->db_add_param($this->besqualcode, FHC_INTEGER).', '.
$this->db_add_param($this->beginn).', '.
$this->db_add_param($this->ende).', '.
$this->db_add_param($this->updateamum).', '.
$this->db_add_param($this->updatevon).', '.
$this->db_add_param($this->insertamum).', '.
$this->db_add_param($this->insertvon).');';
}
else
{
if($this->studiengang_kz_old=='')
$this->studiengang_kz_old = $this->studiengang_kz;
//Bestehenden Datensatz aktualisieren
$qry= "UPDATE bis.tbl_entwicklungsteam SET".
" besqualcode=".$this->db_add_param($this->besqualcode, FHC_INTEGER).",".
" beginn=".$this->db_add_param($this->beginn).",".
" studiengang_kz=".$this->db_add_param($this->studiengang_kz, FHC_INTEGER).",".
" ende=".$this->db_add_param($this->ende).",".
" updateamum=".$this->db_add_param($this->updateamum).",".
" updatevon=".$this->db_add_param($this->updatevon).
" WHERE entwicklungsteam_id=".$this->db_add_param($this->entwicklungsteam_id).";";
" besqualcode=".$this->db_add_param($this->besqualcode, FHC_INTEGER).",".
" beginn=".$this->db_add_param($this->beginn).",".
" studiengang_kz=".$this->db_add_param($this->studiengang_kz, FHC_INTEGER).",".
" ende=".$this->db_add_param($this->ende).",".
" mitarbeiter_uid=".$this->db_add_param($this->mitarbeiter_uid).",".
" updateamum=".$this->db_add_param($this->updateamum).",".
" updatevon=".$this->db_add_param($this->updatevon).
" WHERE entwicklungsteam_id=".$this->db_add_param($this->entwicklungsteam_id).";";
}
if($this->db_query($qry))
@@ -234,7 +257,7 @@ class entwicklungsteam extends basis_db
if($studiengang_kz!=null)
$qry.=" AND studiengang_kz=".$this->db_add_param($studiengang_kz);
$qry.=";";
$qry.=";";
if($this->db_query($qry))
{
@@ -316,7 +339,7 @@ class entwicklungsteam extends basis_db
if ($sort != null)
{
$qry .= " ORDER BY ".$sort;
$qry .= " ORDER BY ".$sort;
}
$qry .= ";";
@@ -364,7 +387,7 @@ class entwicklungsteam extends basis_db
$bismeldung_jahr = $datetime->format('Y');
//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
JOIN bis.tbl_besqual USING(besqualcode)
JOIN public.tbl_studiengang USING(studiengang_kz)
@@ -375,7 +398,7 @@ class entwicklungsteam extends basis_db
if($studiengang_kz!=null)
$qry.=" AND studiengang_kz=".$this->db_add_param($studiengang_kz);
$qry.=";";
$qry.=";";
if($this->db_query($qry))
{
@@ -407,5 +430,20 @@ class entwicklungsteam extends basis_db
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;
}
}
?>
+18
View File
@@ -1995,5 +1995,23 @@ class mitarbeiter extends benutzer
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;
}
}
}
?>
+8 -3
View File
@@ -7,6 +7,11 @@ html {
font-size: 0.875em;
}
body.compat,
body.compat main#cis-main {
background-color: #fff;
}
.fhc-dark-bg{
background-color: var(--fhc-dark);
color:var(--fhc-light) !important;
@@ -454,8 +459,8 @@ html {
/* desktop */
@media (min-width: 992px) {
body {
display: flex;
body.cis4 {
display: flex;
padding-top: var(--fhc-cis-header-height);
width: calc(100svw - var(--scrollbar-width, 0px));
/* overflow: visible !important; */
@@ -760,7 +765,7 @@ html {
}
.dashboard-item {
overscroll-behavior: none;
overscroll-behavior: auto;
}
.abgabe-zieldatum-border-red,
+1 -1
View File
@@ -585,7 +585,7 @@ var FHC_TableWidget = {
let defaultPersistence = {
sort: true,
columns: ["width", "visible"],
columns: true,
filter: false,
headerFilter: false,
group: false,
+11 -1
View File
@@ -44,5 +44,15 @@ export default {
studiensemester_kurzbz
}
};
}
},
getContainingOrNearestByDateRange(from, to) {
return {
method: 'get',
url: 'api/frontend/v1/organisation/studiensemester/getContainingOrNearestByDateRange',
params: {
from,
to,
}
};
},
};
+2
View File
@@ -17,6 +17,8 @@ const router = VueRouter.createRouter({
component: LVVerwaltung,
children: [
{ 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 }
]
},
+7
View File
@@ -103,6 +103,13 @@ export default {
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) {
const BsModal = this,
slots = {};
+6
View File
@@ -16,9 +16,15 @@ export default {
return this.mode + '#' + this.path + '#' + this.query_string;
}
},
beforeMount: function() {
document.body.classList.add('compat');
},
mounted: function() {
this.srcUrl = this.buildSrcUrl();
},
beforeUnmount: function() {
document.body.classList.remove('compat');
},
watch: {
propsWatchHelper: function() {
if(this.lastLoadediFrameURL === '') {
+30 -19
View File
@@ -1,6 +1,7 @@
import FhcCalendar from "../../Calendar/LvPlan.js";
import ApiLvPlan from '../../../api/factory/lvPlan.js';
import ApiStudienSemester from '../../../api/factory/studiensemester.js';
import ApiAuthinfo from '../../../api/factory/authinfo.js';
export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week";
@@ -16,13 +17,12 @@ export default {
},
data() {
return {
studiensemester_kurzbz: null,
studiensemester_start: null,
studiensemester_ende: null,
uid: null,
isMitarbeiter: false,
isStudent: false,
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
startSemester: null,
endSemester: null,
};
},
inject: ["isMobile"],
@@ -48,9 +48,12 @@ export default {
return this.propsViewData?.mode;
},
downloadLinks() {
if (!this.studiensemester_start || !this.studiensemester_ende || !this.uid)
return false;
const startDate = this.startSemester?.start;
const endDate = this.endSemester ? this.endSemester.ende : this.startSemester?.ende;
if (!startDate || !endDate || !this.uid)
return false;
let type = false;
type = this.isStudent ? 'student' : type;
type = this.isMitarbeiter ? 'lektor' : type;
@@ -61,10 +64,10 @@ export default {
const opts = { zone: this.timezone };
const start = luxon.DateTime
.fromISO(this.studiensemester_start, opts)
.fromISO(startDate, opts)
.toUnixInteger();
const ende = luxon.DateTime
.fromISO(this.studiensemester_ende, opts)
.fromISO(endDate, opts)
.toUnixInteger();
const download_link = FHC_JS_DATA_STORAGE_OBJECT.app_root
@@ -109,16 +112,21 @@ export default {
}
});
},
updateRange(rangeInterval) {
this.$api
.call(ApiLvPlan.studiensemesterDateInterval(
rangeInterval.end.startOf('week').toISODate()
))
.then(res => {
this.studiensemester_kurzbz = res.data.studiensemester_kurzbz;
this.studiensemester_start = res.data.start;
this.studiensemester_ende = res.data.ende;
});
async updateRange(rangeInterval) {
const semesterResponse = await this.$api.call(
ApiStudienSemester.getContainingOrNearestByDateRange(
rangeInterval.s.toISO().slice(0, 10),
rangeInterval.e.toISO().slice(0, 10),
),
);
this.startSemester =
semesterResponse.data.length
? semesterResponse.data[0]
: null;
this.endSemester =
semesterResponse.data.length > 1
? semesterResponse.data[1]
: null;
},
getPromiseFunc(start, end) {
return [
@@ -142,8 +150,11 @@ export default {
<div class="cis-lvplan-personal d-flex flex-column h-100">
<h2>
{{ $p.t('lehre/stundenplan') }}
<span v-if="studiensemester_kurzbz" class="ps-3">
{{ studiensemester_kurzbz }}
<span v-if="startSemester?.studiensemester_kurzbz">
{{ startSemester.studiensemester_kurzbz }}
<span v-if="endSemester?.studiensemester_kurzbz">
{{ "- " + endSemester.studiensemester_kurzbz }}
</span>
</span>
</h2>
<hr>
+32 -25
View File
@@ -5,6 +5,7 @@ import FhcCalendar from "../../Calendar/LvPlan.js";
import ApiLvPlan from "../.././../api/factory/lvPlan.js";
import ApiOtherLvPlan from "../.././../api/factory/otherLvPlan.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_MOBILE = "List";
@@ -22,9 +23,6 @@ export default {
data() {
return {
localProps: {},
studiensemester_kurzbz: null,
studiensemester_start: null,
studiensemester_ende: null,
isOtherPersonMitarbeiter: false,
isOtherPersonStudent: false,
currentStgBezeichnung: null,
@@ -36,6 +34,8 @@ export default {
photo: "",
},
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
startSemester: null,
endSemester: null,
};
},
inject: ["isMobile"],
@@ -67,11 +67,10 @@ export default {
// do not show download links in otherLvPlan Mode
return false;
if (
!this.studiensemester_start ||
!this.studiensemester_ende ||
!this.propsViewData.otherUid
)
const startDate = this.startSemester?.start;
const endDate = this.endSemester ? this.endSemester.ende : this.startSemester?.ende;
if (!startDate || !endDate || !this.uid)
return false;
const type = this.isOtherPersonStudent
@@ -84,11 +83,11 @@ export default {
const opts = { zone: this.timezone };
const start = luxon.DateTime.fromISO(
this.studiensemester_start,
startDate,
opts,
).toUnixInteger();
const ende = luxon.DateTime.fromISO(
this.studiensemester_ende,
endDate,
opts,
).toUnixInteger();
@@ -166,19 +165,21 @@ export default {
},
});
},
updateRange(rangeInterval) {
this.$api
.call(
ApiLvPlan.studiensemesterDateInterval(
rangeInterval.end.startOf("week").toISODate(),
),
)
.then((res) => {
this.studiensemester_kurzbz =
res.data.studiensemester_kurzbz;
this.studiensemester_start = res.data.start;
this.studiensemester_ende = res.data.ende;
});
async updateRange(rangeInterval) {
const semesterResponse = await this.$api.call(
ApiStudienSemester.getContainingOrNearestByDateRange(
rangeInterval.s.toISO().slice(0, 10),
rangeInterval.e.toISO().slice(0, 10),
),
);
this.startSemester =
semesterResponse.data.length
? semesterResponse.data[0]
: null;
this.endSemester =
semesterResponse.data.length > 1
? semesterResponse.data[1]
: null;
},
getPromiseFunc(start, end) {
return [
@@ -250,8 +251,14 @@ export default {
<div class="d-flex flex-column h-100">
<h2>
<div class="d-flex flex-row justify-content-between align-items-center">
<span>
{{ $p.t('lehre/stundenplan') + (studiensemester_kurzbz ? " " + studiensemester_kurzbz : "") }}
<span>
{{ $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>
<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">
@@ -73,7 +73,7 @@ export default {
// check if the lv has lvplan entries for this studiensemester
if (this.studiensemester && this.event) {
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 => {
if (Array.isArray(res) && res.length > 0) {
this.hasLvPlanEintraege = true;
@@ -114,4 +114,4 @@ export default {
`,
};
};
@@ -1,5 +1,6 @@
export default {
name: 'Cis-Renderer-Feiertag-CalendarEvent',
props: {
event: {
type: Object,
@@ -1,6 +1,7 @@
import { formatDate } from "../../../../helpers/DateHelpers.js"
export default {
name: 'Cis-Renderer-Feiertag-ModalContent',
props:{
event: {
type: Object,
@@ -1,4 +1,5 @@
export default {
name: 'Cis-Renderer-Feiertag-ModalTitle',
props:{
event: {
type: Object,
@@ -1,4 +1,5 @@
export default {
name: 'Cis-Renderer-Lehreinheit-CalendarEvent',
props:{
event: {
type: Object,
@@ -5,6 +5,7 @@ import ApiLvPlan from '../../../../api/factory/lvPlan.js';
import ApiAddons from '../../../../api/factory/addons.js';
export default {
name: 'Cis-Renderer-Lehreinheit-ModalContent',
components:{
LvMenu,
},
@@ -49,6 +50,16 @@ export default {
return this.event.ende;
}
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: {
@@ -162,6 +173,6 @@ export default {
</tr>
</tbody>
</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>`,
}
@@ -1,4 +1,5 @@
export default {
name: 'Cis-Renderer-Lehreinheit-ModalTitle',
props:{
event: {
type: Object,
@@ -1,4 +1,5 @@
export default {
name: 'Cis-Renderer-Reservierung-CalendarEvent',
props: {
event: {
type: Object,
@@ -2,6 +2,7 @@ import { numberPadding, formatDate } from "../../../../helpers/DateHelpers.js"
import LvMenu from "../../Mylv/LvMenu.js";
export default {
name: 'Cis-Renderer-Reservierung-ModalContent',
props:{
event: {
type: Object,
@@ -1,4 +1,5 @@
export default {
name: 'Cis-Renderer-Reservierung-ModalTitle',
props:{
event: {
type: Object,
@@ -61,6 +61,7 @@ export default {
selected: [],
studiengang_kz: null,
selectedStudiensemester: this.defaultSemester,
preselected: null,
dropdowns: {
studiensemester_array: [],
sprachen_array: [],
@@ -73,7 +74,11 @@ export default {
calcheightonly: true,
types: [
"mitarbeiter",
"mitarbeiter_ohne_zuordnung"
"mitarbeiter_ohne_zuordnung",
/*
"lehreinheit",
"lehrveranstaltung",
*/
],
actions: {
employee: {
@@ -86,6 +91,26 @@ export default {
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() {
let filter = {
emp: this.$route.params.emp,
le: this.$route.params.le,
lv: this.$route.params.lv,
studiensemester_kurzbz: this.selectedStudiensemester
};
let index;
@@ -105,7 +132,7 @@ export default {
if (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;
},
emp() {
@@ -203,20 +230,50 @@ export default {
},
onSelectEmployee(emp)
{
let params = { ...this.$route.params }
delete params.le;
delete params.lv;
this.$router.push({
name: 'emp',
params: {
...this.$route.params,
...params,
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 })
{
let params = { ...this.$route.params }
delete params.le;
delete params.lv;
this.$router.push({
name: this.$route.name == 'emp' ? 'emp' : 'treemenu',
params: {
...this.$route.params,
...params,
treemenu: link.split('/')
}
});
@@ -295,7 +352,7 @@ export default {
}
},
created() {
if (!this.$route.params.stdsem) {
if (this.$route.name !== 'le' && this.$route.name !== 'lv' && !this.$route.params.stdsem) {
this.$router.replace({
name: 'stdsem',
params: {
@@ -477,7 +534,8 @@ export default {
<template #top>
<lv-table ref="lvTable"
v-model:selected="selected"
@row-clicked="handleRowClicked"
@row-clicked="handleRowClicked"
@select-LV="onSelectLehrveranstaltung"
:filter="filter"
>
<template #filterzuruecksetzen v-if="filter.activeFilter === 'employee'">
@@ -57,7 +57,8 @@ export default {
},
emits: [
'update:selected',
'row-clicked'
'row-clicked',
'selectLV',
],
watch: {
filter: {
@@ -106,8 +107,24 @@ export default {
{
event: 'dataProcessed',
handler: (data) => {
this.reexpandRows()
this.$emit('update:selected', {})
if (this.$route.params.le)
{
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,
rowContextMenu: (component, e) => {
if (e.getData()?.lehreinheit_id === undefined)
return;
if (e.getData()?.lehreinheit_id === undefined || !e.getData()?.lehreinheit_id)
return [];
return [
{
label: "LV-Teil kopieren",
label: this.$p.t('lehre', 'lvteilkopieren'),
menu: [
{
label: "Alles",
label: this.$p.t('lehre', 'alles'),
action: (e, row) =>
{
this.copyLehreinheit(row, "alle");
},
},
{
label: "Nur LV-Teil",
label: this.$p.t('lehre', 'nurlvteil'),
action: (e, row) =>
{
this.copyLehreinheit(row, "lvteil");
},
},
{
label: "Nur mit Gruppen",
label: this.$p.t('lehre', 'nurmitgruppen'),
action: (e, row) =>
{
this.copyLehreinheit(row, "gruppen");
},
},
{
label: "Nur mit Lehrenden",
label: this.$p.t('lehre', 'nurmitlehrende'),
action: (e, row) =>
{
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) => {
this.deleteLehreinheit(row)
},
@@ -355,7 +386,7 @@ export default {
},
buildApiUrl()
{
if (!['emp', 'treemenu'].includes(this.$route.name))
if (!['emp', 'treemenu', 'le', 'lv'].includes(this.$route.name))
return null;
let url = 'stdsem/' + this.$route.params.stdsem;
@@ -364,6 +395,14 @@ export default {
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) {
url += '/' + this.$route.params.treemenu.join('/');
}
@@ -502,6 +541,17 @@ export default {
})
.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)
{
let result = [];
@@ -134,7 +134,7 @@ export default {
event: 'tableBuilt',
handler: async () => {
await this.$p.loadCategory(['anrechnung', 'global', 'ui', 'lehre']);
await this.$p.loadCategory(['anrechnungen', 'global', 'ui', 'lehre']);
const setHeader = (field, text) => {
const col = this.$refs.table.tabulator.getColumn(field);
@@ -158,10 +158,6 @@ export default {
setHeader( 'genehmigt_von', this.$p.t('anrechnung', 'genehmigtVon'));
setHeader( 'notizen_anzahl', this.$p.t('anrechnung', 'existingNotes'));
setHeader( 'insertamum', this.$p.t('global', 'datum'));
setHeader( 'actions', this.$p.t('global', 'aktionen'));
// Render the action buttons again, their phrases can arrive after the data
this.$refs.table.tabulator.redraw(true);
}
}
];
@@ -284,12 +280,6 @@ export default {
resetLvKompatibel(){
this.formData.lehrveranstaltung_id_kompatibel = null;
this.handleInput();
},
lvBezeichnung(lv) {
// English name only if the LV has one
return this.$p.user_language.value != 'German' && lv.bezeichnung_english
? lv.bezeichnung_english
: lv.bezeichnung;
}
},
created() {
@@ -390,7 +380,7 @@ export default {
:key="entry.lehrveranstaltung_id"
:value="entry.lehrveranstaltung_id"
>
{{lvBezeichnung(entry)}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
{{entry.bezeichnung}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
</option>
</form-input>
</div>
@@ -417,7 +407,7 @@ export default {
<div v-if="formData.begruendung_id == '2'" class="row mb-3">
<form-input
type="select"
:label="$p.t('anrechnung/lehrveranstaltung_bez_kompatibel')"
label="Lehrveranstaltung Kompatibel"
name="lehrveranstaltung_id_kompatibel"
v-model="formData.lehrveranstaltung_id_kompatibel"
>
@@ -426,7 +416,7 @@ export default {
:key="entry.lehrveranstaltung_id"
:value="entry.lehrveranstaltung_id"
>
{{lvBezeichnung(entry)}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
{{entry.bezeichnung}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
</option>
</form-input>
</div>
@@ -263,7 +263,7 @@ export default {
this.$refs[modalRef].hide();
},
reload() {
this.$refs.table.reloadTable();
this.$refs.table?.reloadTable();
},
searchFirma(event) {
if (this.abortController.firmen) {
@@ -236,7 +236,7 @@ export default {
selectableRows: 1,
index: 'projektarbeit_id',
persistence:{
columns: ["width", "visible"], //persist column layout
columns: true, //persist column layout
},
persistenceID: 'stv-details-projektarbeit-20260217'
}
@@ -30,6 +30,9 @@ export default {
computed: {
betreuerFormOpened() {
return this.newMode || this.editMode;
},
isMitarbeiter(){
return this.autocompleteSelectedBetreuer?.name?.includes('Mitarbeiter') ?? false;
}
},
props: {
@@ -124,7 +127,7 @@ export default {
selectableRows: 1,
index: 'betreuer_id',
persistence:{
columns: ["width", "visible"], //persist column layout
columns: true, //persist column layout
},
persistenceID: 'stv-details-projektbetreuer-20260217'
},
@@ -430,6 +433,11 @@ export default {
},
actionKontaktdatenBearbeiten() {
if (!this.autocompleteSelectedBetreuer) return;
if (this.isMitarbeiter)
{
this.$fhcAlert.alertError(this.$p.t('ui', 'editingMitarbeiterPVonly'));
return;
}
this.$refs.kontaktdatenModal.show();
},
// 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>
</div>
<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>
@@ -605,7 +618,7 @@ export default {
</contact>
</div>
</div>
</bs-modal>
`
}
+1 -1
View File
@@ -135,7 +135,7 @@ export default {
persistence: {
sort: true,
page: true,
columns: ["width", "visible"],
columns: true,
filter: false //to avoids js errors
},
persistenceID: 'core-contracts-2026050501',
+1 -2
View File
@@ -136,8 +136,7 @@ export const CoreFilterCmpt = {
selectedData: [],
persistence: {
sort: true,
// Not true: that also stores the title, and the stored title hides a translated header
columns: ["width", "visible"],
columns: true,
filter: false,
headerFilter: false,
group: false,
@@ -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 mergedStudent from "./result/mergedstudent.js";
import mergedPerson from "./result/mergedperson.js";
import teachingunit from "./result/teachingunit.js";
import { debounce } from "../../helpers/DebounceHelper.js";
export default {
@@ -23,6 +24,7 @@ export default {
cms,
mergedStudent,
mergedPerson,
teachingunit,
},
props: {
searchoptions: {
@@ -9,7 +9,7 @@ function func_tableBuilt(table) {
table.tabulator(
"addColumn",
{
title: FHC_PhrasesLib.t("ui", "aktion"),
title: "Aktion",
align: "center",
width: 150,
formatter: addActionButtons,
@@ -193,7 +193,7 @@ var adminAnrechnung = {
var anrechnungstart = row.getData().anrechnungstart;
var anrechnungende = row.getData().anrechnungende;
$(".modal-header #azrModalLabel").text(FHC_PhrasesLib.t("anrechnung", "anrechnungszeitraumBearbeiten"));
$(".modal-header #azrModalLabel").text("Anrechnungszeitraum bearbeiten");
$(".modal-body #anrechnungszeitraum_id").val(anrechnungszeitraum_id);
$(".modal-body #studiensemester").val(studiensemester_kurzbz).change();
@@ -15,7 +15,7 @@ $(function(){
var canPromise = !! window.Promise;
if(!canPromise)
{
alert(FHC_PhrasesLib.t("anrechnung", "browserNichtUnterstuetzt"));
alert("Diese Seite kann mit ihrem Browser nicht angezeigt werden. Bitte verwenden Sie Firefox, Chrome oder Edge um die Seite anzuzeigen");
window.location.href='about:blank';
return;
}
@@ -630,7 +630,7 @@ var approveAnrechnungDetail = {
){
$('#sumEctsMsg')
.html("<span class='flex-fill fw-bold'>" + FHC_PhrasesLib.t("anrechnung", "hoechstgrenzeUeberschritten") + " </span><i class='mx-4 fa fa-lg fa-info-circle'></i>")
.html("<span class='flex-fill fw-bold'>Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz ist überschritten. </span><i class='mx-4 fa fa-lg fa-info-circle'></i>")
.addClass('bg-danger-subtle')
.tooltip({
title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"),
@@ -55,7 +55,7 @@ function hf_filterTrueFalse(headerValue, rowValue) {
return rowValue == "false";
}
if (headerValue === "-") {
if ((headerValue = "-")) {
return rowValue == null;
}
}
@@ -73,13 +73,13 @@ function func_tableBuilt(table) {
table.tabulator(
"addColumn",
{
title: FHC_PhrasesLib.t("global", "details"),
title: "Details",
field: "details",
hozAlign: "center",
width: 100,
formatter: "link",
formatterParams: {
label: FHC_PhrasesLib.t("global", "details"),
label: "Details",
url: function (cell) {
return (
BASE_URL +
@@ -173,11 +173,15 @@ var format_ectsSumBisherUndNeu = function (cell, formatterParams, onRendered) {
"</u></b></span>"
: ectsSumBisherUndNeuBeruflich;
return FHC_PhrasesLib.t("anrechnung", "ectsSummeKurz", [
ectsSumBisherUndNeuTotal,
ectsSumBisherUndNeuSchulisch,
ectsSumBisherUndNeuBeruflich,
]);
return (
"T: " +
ectsSumBisherUndNeuTotal +
" [ S: " +
ectsSumBisherUndNeuSchulisch +
" | B: " +
ectsSumBisherUndNeuBeruflich +
" ]"
);
};
// Formats row selectable/unselectable
@@ -240,7 +244,7 @@ function func_tooltips(e, cell, onRendered) {
//onRendered - onRendered callback registration function
// Return tooltip if row is unselectable
if (!func_selectableCheck(cell.getRow())) {
return FHC_PhrasesLib.t("ui", "nichtSelektierbarAufgrundVon") + FHC_PhrasesLib.t("global", "status");
return FHC_PhrasesLib.t("ui", "nichtSelektierbarAufgrundVon") + "Status";
}
}
@@ -313,7 +317,7 @@ $(function () {
var canPromise = !!window.Promise;
if (!canPromise) {
alert(
FHC_PhrasesLib.t("anrechnung", "browserNichtUnterstuetzt")
"Diese Seite kann mit ihrem Browser nicht angezeigt werden. Bitte verwenden Sie Firefox, Chrome oder Edge um die Seite anzuzeigen"
);
window.location.href = "about:blank";
return;
@@ -846,7 +850,7 @@ var approveAnrechnung = {
},
showNumberSelectedRows(rows) {
$("#number-selected").html(
FHC_PhrasesLib.t("ui", "ausgewaehlteZeilen") + ": <strong>" + rows.length + "</strong>"
"Ausgewählte Zeilen: <strong>" + rows.length + "</strong>"
);
},
};
@@ -170,11 +170,7 @@ var createAnrechnung = {
// Append Lehrveranstaltungen
for (let lv of lehrveranstaltungen){
// English name only if the LV has one
let bezeichnung = FHC_JS_DATA_STORAGE_OBJECT.user_language != 'German' && lv.bezeichnung_english
? lv.bezeichnung_english
: lv.bezeichnung;
$('#select-lehrveranstaltung').append('<option value="'+ lv.lehrveranstaltung_id +'">'+ bezeichnung +'</option>');
$('#select-lehrveranstaltung').append('<option value="'+ lv.lehrveranstaltung_id +'">'+ lv.bezeichnung +'</option>');
}
}
},
@@ -181,10 +181,9 @@ var requestAnrechnung = {
const anrechnung_id = $('#requestAnrechnung-sperre').data('anrechnung_id');
const is_expired = $('#requestAnrechnung-sperre').data('expired');
const is_blocked = $('#requestAnrechnung-sperre').data('blocked');
const is_not_in_studienplan = $('#requestAnrechnung-sperre').data('not_in_studienplan');
// If Deadline is expired, LV is blocked by grades or LV is not in the Studienplan, AND not already angerechnet
if ((is_expired || is_blocked || is_not_in_studienplan) && anrechnung_id == '')
// If Deadline is expired or is blocked by grades of LV, AND not already angerechnet
if ((is_expired || is_blocked) && anrechnung_id == '')
{
// Hide status panel
$('#requestAnrechnung-status').hide();
@@ -195,10 +194,7 @@ var requestAnrechnung = {
.html(function(){
let sperregrund = FHC_PhrasesLib.t('global', 'bearbeitungGesperrt') + ': ';
if (is_not_in_studienplan) {
sperregrund += FHC_PhrasesLib.t('anrechnung', 'lvNichtImStudienplan');
}
else if (is_expired) {
if (is_expired) {
sperregrund += FHC_PhrasesLib.t('anrechnung', 'deadlineUeberschritten');
}
else if (is_blocked){
@@ -298,7 +294,7 @@ var requestAnrechnung = {
)
{
$('#requestAnrechnung-maxEctsUeberschrittenMsg')
.html("<span class='flex-fill fw-bold'>" + FHC_PhrasesLib.t("anrechnung", "hoechstgrenzeUeberschritten") + " </span><i class='mx-4 fa fa-lg fa-info-circle'></i>")
.html("<span class='flex-fill fw-bold'>Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz ist überschritten. </span><i class='mx-4 fa fa-lg fa-info-circle'></i>")
.addClass('bg-danger-subtle')
.tooltip({
title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"),
@@ -355,12 +351,11 @@ var requestAnrechnung = {
},
getMsgBeiEctsUeberschreitung: function(begruendung_id, ects, sumEctsSchulisch, sumEctsBeruflich){
const phraseUsed = '<span class="d-block">Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz wird überschritten.</span><span class=" fw-bold">Bisherige ECTS + ECTS dieser LV: Total: {0} [ Schulisch: {1} | Beruflich: {2} ]</span>&emsp;';
return $('<div class="p-1" id="sumEctsMsg"></div>')
.html(FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTextBeiUeberschreitung",
begruendung_id == 4
? [(sumEctsSchulisch + sumEctsBeruflich + ects), sumEctsSchulisch, (sumEctsBeruflich + ects)] // beruflich
: [(sumEctsSchulisch + sumEctsBeruflich + ects), (sumEctsSchulisch + ects), sumEctsBeruflich])) // schulisch
.append('&emsp;<i class="fa fa-lg fa-info-circle"></i>')
.html(phraseUsed) // schulisch
.append('<i class="fa fa-lg fa-info-circle"></i>')
.addClass('bg-danger-subtle')
.tooltip({
title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"),
@@ -16,7 +16,7 @@ $(function(){
var canPromise = !! window.Promise;
if(!canPromise)
{
alert(FHC_PhrasesLib.t("anrechnung", "browserNichtUnterstuetzt"));
alert("Diese Seite kann mit ihrem Browser nicht angezeigt werden. Bitte verwenden Sie Firefox, Chrome oder Edge um die Seite anzuzeigen");
window.location.href='about:blank';
return;
}
@@ -48,7 +48,7 @@ function hf_filterTrueFalse(headerValue, rowValue) {
return rowValue == "false";
}
if (headerValue === "-") {
if ((headerValue = "-")) {
return rowValue == null;
}
}
@@ -63,13 +63,13 @@ function func_tableBuilt(table) {
table.tabulator(
"addColumn",
{
title: FHC_PhrasesLib.t("global", "details"),
title: "Details",
field: "details",
align: "center",
width: 100,
formatter: "link",
formatterParams: {
label: FHC_PhrasesLib.t("global", "details"),
label: "Details",
url: function (cell) {
return (
BASE_URL +
@@ -122,7 +122,7 @@ function func_tooltips(e, cell, onRendered) {
// Return tooltip if row is unselectable
if (!func_selectableCheck(cell.getRow())) {
return FHC_PhrasesLib.t("ui", "nichtSelektierbarAufgrundVon") + FHC_PhrasesLib.t("global", "status");
return FHC_PhrasesLib.t("ui", "nichtSelektierbarAufgrundVon") + "Status";
}
}
@@ -175,7 +175,7 @@ $(function () {
var canPromise = !!window.Promise;
if (!canPromise) {
alert(
FHC_PhrasesLib.t("anrechnung", "browserNichtUnterstuetzt")
"Diese Seite kann mit ihrem Browser nicht angezeigt werden. Bitte verwenden Sie Firefox, Chrome oder Edge um die Seite anzuzeigen"
);
window.location.href = "about:blank";
return;
+1 -2
View File
@@ -104,7 +104,6 @@ require_once('dbupdate_3.4/77080_tabulator_presets_table.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/77757_widgets_berechtigungen.php');
require_once('dbupdate_3.4/83598_anrechnung_begruendung_mehrsprachig.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
@@ -264,7 +263,7 @@ $tabellen=array(
"lehre.tbl_anrechnung" => array("anrechnung_id","prestudent_id","lehrveranstaltung_id","begruendung_id","lehrveranstaltung_id_kompatibel","genehmigt_von","insertamum","insertvon","updateamum","updatevon","ext_id", "dms_id", "studiensemester_kurzbz", "anmerkung_student", "empfehlung_anrechnung", "begruendung_ects", "begruendung_lvinhalt"),
"lehre.tbl_anrechnungstatus" => array("status_kurzbz", "bezeichnung_mehrsprachig"),
"lehre.tbl_anrechnung_anrechnungstatus" => array("anrechnungstatus_id", "anrechnung_id", "status_kurzbz", "datum", "insertamum", "insertvon"),
"lehre.tbl_anrechnung_begruendung" => array("begruendung_id","bezeichnung","bezeichnung_mehrsprachig"),
"lehre.tbl_anrechnung_begruendung" => array("begruendung_id","bezeichnung"),
"lehre.tbl_anrechnungszeitraum" => array("anrechnungszeitraum_id","studiensemester_kurzbz","anrechnungstart","anrechnungende", "insertamum", "insertvon"),
"lehre.tbl_betreuerart" => array("betreuerart_kurzbz","beschreibung","aktiv"),
"lehre.tbl_ferien" => array("bezeichnung","studiengang_kz","vondatum","bisdatum"),
@@ -1,31 +0,0 @@
<?php
if (! defined('DB_NAME')) exit('No direct script access allowed');
// Add multilingual name to Anrechnung Begruendung (German, English)
if ($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table_schema = 'lehre' AND table_name = 'tbl_anrechnung_begruendung' AND column_name = 'bezeichnung_mehrsprachig'"))
{
if ($db->db_num_rows($result) == 0)
{
// Unknown names keep the German name as English name
$qry = "
ALTER TABLE lehre.tbl_anrechnung_begruendung ADD COLUMN bezeichnung_mehrsprachig character varying(128)[];
UPDATE lehre.tbl_anrechnung_begruendung SET bezeichnung_mehrsprachig = ARRAY[
bezeichnung,
CASE bezeichnung
WHEN 'schulisches Zeugnis' THEN 'school certificate'
WHEN 'kompatible Lehrveranstaltung' THEN 'compatible course'
WHEN 'Prüfung' THEN 'examination'
WHEN 'berufliche Praxis' THEN 'professional practice'
WHEN 'Hochschulzeugnis' THEN 'university certificate'
ELSE bezeichnung
END
];
";
if (!$db->db_query($qry))
echo '<strong>lehre.tbl_anrechnung_begruendung: ' . $db->db_last_error() . '</strong><br>';
else
echo '<br>lehre.tbl_anrechnung_begruendung: Spalte bezeichnung_mehrsprachig hinzugefuegt';
}
}
+168 -528
View File
@@ -13216,7 +13216,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Sum of previous recognized ECTS. Lateral Entries are considered with ECTS of the recognized semester.<br><br>Maximum ECTS limits are applied since October 2021:<br><br>max. 60 ECTS school qualification (BHS and AHS only)<br>max. 60 ECTS professional qualification<br>max. 90 ECTS OVERALL for school and professional qualification',
'text' => 'Sum of previous recognized ECTS. Lateral Entries are considered with ECTS of the recognized semester.<br><br>Maximum ECTS limits are applied since Octobre 2021:<br><br>max. 60 ECTS school qualification (BHS and AHS only)<br>max. 60 ECTS professional qualification<br>max. 90 ECTS OVERALL for school and professional qualification',
'description' => '',
'insertvon' => 'system'
)
@@ -13236,7 +13236,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Maximum ECTS limits are applied since October 2021:<br>max. 60 ECTS school qualification (BHS and AHS only)<br>max. 60 ECTS professional qualification<br>max. 90 ECTS OVERALL for school and professional qualification',
'text' => 'Maximum ECTS limits are applied since Octobre 2021:<br>max. 60 ECTS school qualification (BHS and AHS only)<br>max. 60 ECTS professional qualification<br>max. 90 ECTS OVERALL for school and professional qualification',
'description' => '',
'insertvon' => 'system'
)
@@ -13250,533 +13250,13 @@ Any unusual occurrences
'phrases' => array(
array(
'sprache' => 'German',
'text' => '<span class="d-block">Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz wird überschritten.</span><span class="fw-bold">Bisherige ECTS + ECTS dieser LV: Total: {0} [ Schulisch: {1} | Beruflich: {2} ]</span>',
'text' => 'Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz wird überschritten.<span class="fw-bold">Bisherige ECTS + ECTS dieser LV: Total: {0} [ Schulisch: {1} | Beruflich: {2} ]</span>',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => '<span class="d-block">Exceedance of maximum limit for exemption (see § 12 para. 3, Regulations of the UASTW).</span><span class="fw-bold">Former ECTS + ECTS of this course: Total: {0} [ School qualification: {1} | Professional qualification: {2} ]</span>',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'hoechstgrenzeUeberschritten',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz ist überschritten.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The maximum limit for exemption (see § 12 para. 3, Regulations of the UASTW) is exceeded.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'totalEcts',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Total ECTS',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Total ECTS',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'schulisch',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Schulisch',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'School qualification',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'beruflich',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Beruflich',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Professional qualification',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'browserNichtUnterstuetzt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Diese Seite kann mit ihrem Browser nicht angezeigt werden. Bitte verwenden Sie Firefox, Chrome oder Edge um die Seite anzuzeigen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'This page cannot be displayed in your browser. Please use Firefox, Chrome or Edge to display the page',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'ectsSummeKurz',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'T: {0} [ S: {1} | B: {2} ]',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'T: {0} [ S: {1} | P: {2} ]',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'schreibberechtigt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Schreibberechtigt',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Write access',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'empfehlungsberechtigt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Empfehlungsberechtigt',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Entitled to recommend',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'ectsLv',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ECTS (LV)',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'ECTS (course)',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'ectsLvUndBisher',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ECTS (LV + Bisher)',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'ECTS (course + previous)',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'ectsBisherSchulisch',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ECTS (Bisher schulisch)',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'ECTS (previous school qualification)',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'ectsBisherBeruflich',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ECTS (Bisher beruflich)',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'ECTS (previous professional qualification)',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'anrechnungszeitraumBearbeiten',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Anrechnungszeitraum bearbeiten',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Edit application period',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'fehlerDatenuebertragung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Fehler beim Übertragen der Daten.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Error while transferring the data.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'keineAnrechnungenGenehmigt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Es wurden keine Anrechnungen genehmigt.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No applications have been approved.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'keineAnrechnungenAbgelehnt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Es wurden keine Anrechnungen abgelehnt.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No applications have been rejected.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'empfehlungNichtAngefordert',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Empfehlung wurde nicht angefordert.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Recommendation has not been requested.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'keineEmpfehlungenAngefordert',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Es wurden keine Empfehlungen angefordert.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No recommendations have been requested.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'lvHatKeineLektoren',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Der LV sind keine LektorInnen zugeteilt.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No lecturers are assigned to the course.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'lvsOhneLektoren',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Bei {0} LV sind keine LektorInnen zugeteilt.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No lecturers are assigned to {0} courses.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'keineEmpfehlungZumZuruecknehmen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Es gibt keine Empfehlungsanforderung zum Zurücknehmen.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'There is no request for recommendation to withdraw.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'antragNichtZurueckgenommen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Der Antrag konnte nicht zurückgenommen werden.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The application could not be withdrawn.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'lvNichtImStudienplan',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Diese Lehrveranstaltung ist nicht Teil Ihres Studienplans. Wenn Sie mehrere Studiengänge studieren, melden Sie sich mit dem Account des passenden Studiengangs an. Sonst wenden Sie sich an Ihre Studiengangsassistenz.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'This course is not part of your study plan. If you study more than one degree program, log in with the account of the matching degree program. Otherwise, contact your degree program assistant.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'lvNichtZugeteilt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Die Lehrveranstaltung ist diesem Account nicht zugeteilt.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The course is not assigned to this account.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'keineGenehmigungZumZuruecknehmen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Es gibt keine Genehmigung oder Ablehnung zum Zurücknehmen. Der Antrag ist noch in Bearbeitung.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'There is no approval or rejection to withdraw. The application is still in progress.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'fehlerBeimLoeschen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Fehler beim Löschen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Error while deleting',
'text' => '<br>Exceedance of maximum limit for exemption (see § 12 para. 3, Regulations of the UASTW).<br><b>Former ECTS + ECTS of this course: Total: {0} [ School qualification: {1} | Professional qualification: {2} ]</b> ',
'description' => '',
'insertvon' => 'system'
)
@@ -15368,7 +14848,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Set application period',
'text' => 'Set appplication period',
'description' => '',
'insertvon' => 'system'
)
@@ -15388,7 +14868,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Add application period',
'text' => 'Add appplication period',
'description' => '',
'insertvon' => 'system'
)
@@ -53892,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(
'app' => 'core',
'category' => 'lehre',
@@ -61857,7 +61477,7 @@ I have been informed that I am under no obligation to consent to the transmissio
'insertvon' => 'system'
)
)
),
),
array(
'app' => 'core',
'category' => 'tabulator',
@@ -63131,8 +62751,28 @@ I have been informed that I am under no obligation to consent to the transmissio
'insertvon' => 'system'
)
)
)
),
// ### 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'
)
)
)
);