Merge remote-tracking branch 'origin/master' into feature-61164/AbgabetoolQualityGates

# Conflicts:
#	system/phrasesupdate.php
This commit is contained in:
Johann Hoffmann
2025-10-27 14:51:52 +01:00
138 changed files with 11074 additions and 499 deletions
+11
View File
@@ -0,0 +1,11 @@
<?php
/*It defines which tags are available in LVVerwaltung and whether they are editable
$config['lvverwaltung_tags'] = [
'tag_1' => ['readonly' => false],
'tag_1' => ['readonly' => true]
];
*/
$config['lvverwaltung_tags'] = [];
+11 -1
View File
@@ -64,7 +64,7 @@ $config['navigation_header'] = array(
'lehrveranstaltungen' => array( 'lehrveranstaltungen' => array(
'link' => site_url('lehre/lvplanung/LvTemplateUebersicht'), 'link' => site_url('lehre/lvplanung/LvTemplateUebersicht'),
'icon' => '', 'icon' => '',
'description' => 'Lehrveranstaltungen', 'description' => 'Lehrveranstaltungen Templates',
'sort' => 15 'sort' => 15
), ),
'reihungstest' => array( 'reihungstest' => array(
@@ -81,6 +81,16 @@ $config['navigation_header'] = array(
'sort' => 30, 'sort' => 30,
'requiredPermissions' => 'infocenter:r' 'requiredPermissions' => 'infocenter:r'
), ),
'lvverwaltung' => array(
'link' => site_url('LVVerwaltung'),
'icon' => '',
'description' => 'LV Verwaltung',
'requiredPermissions' => array(
'admin:r',
'assistenz:r'
),
'sort' => 35
),
'lehrauftrag' => array( 'lehrauftrag' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'), 'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
'description' => 'Lehrauftrag', 'description' => 'Lehrauftrag',
+1 -1
View File
@@ -72,7 +72,7 @@ class Documents extends Auth_Controller
$stgs = []; $stgs = [];
$stsemArray = []; $stsemArray = [];
$buchungstypen = implode('\',\'', defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : []); $buchungstypen = defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : [];
$person_ids = []; $person_ids = [];
foreach ($stati as $status) { foreach ($stati as $status) {
$person_ids[] = $status->person_id; $person_ids[] = $status->person_id;
+1 -1
View File
@@ -13,7 +13,7 @@ class ProfilUpdate extends Auth_Controller
{ {
parent::__construct([ parent::__construct([
'index' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r'], 'index' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r'],
'show' => ['basis/cis:r'], 'show' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r', 'basis/cis:r'],
'id' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r'] 'id' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r']
]); ]);
+42
View File
@@ -0,0 +1,42 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class LVVerwaltung extends Auth_Controller
{
public function __construct()
{
$permissions = [];
$router = load_class('Router');
$permissions[$router->method] = ['admin:r', 'assistenz:r'];
parent::__construct($permissions);
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
}
/**
* @return void
*/
public function _remap()
{
$this->load->view('LVVerwaltung', [
'permissions' => [
'lehre/lehrveranstaltung' => $this->permissionlib->isBerechtigt('lehre/lehrveranstaltung'),
'lv-plan/gruppenentfernen' => $this->permissionlib->isBerechtigt('lv-plan/gruppenentfernen'),
'lv-plan/lektorentfernen' => $this->permissionlib->isBerechtigt('lv-plan/lektorentfernen'),
],
'variables' => [
'semester_aktuell' => $this->variablelib->getVar('semester_aktuell')
],
'configs' => [
'showVertragsdetails' => defined('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN') && FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN,
'showGewichtung' => defined('CIS_GESAMTNOTE_GEWICHTUNG') && CIS_GESAMTNOTE_GEWICHTUNG,
'lehreinheitAnmerkungDefault' => defined('LEHREINHEIT_ANMERKUNG_DEFAULT') ? LEHREINHEIT_ANMERKUNG_DEFAULT : '',
'lehreinheitRaumtypDefault' => defined('DEFAULT_LEHREINHEIT_RAUMTYP') ? DEFAULT_LEHREINHEIT_RAUMTYP : '',
'lehreinheitRaumtypAlternativeDefault' => defined('DEFAULT_LEHREINHEIT_RAUMTYP_ALTERNATIV') ? DEFAULT_LEHREINHEIT_RAUMTYP_ALTERNATIV : ''
]
]);
}
}
@@ -0,0 +1,265 @@
<?php
/**
* Copyright (C) 2025 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Lehrveranstaltung extends FHCAPI_Controller
{
private $_ci;
private $_uid;
public function __construct()
{
parent::__construct([
'getByEmp' => ['admin:r', 'assistenz:r'],
'getByStg' => ['admin:r', 'assistenz:r'],
'loadByLV' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
$this->_setAuthUID();
$this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
$this->loadPhrases(
array(
'ui'
)
);
}
public function getByEmp($studiensemester_kurzbz = null, $mitarbeiter_uid = null, $stg_kz = null)
{
if (is_null($mitarbeiter_uid))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz);
$lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen);
$tree = [];
foreach ($lehrveranstaltungen_data as $lehrveranstaltung)
{
$lehreinheiten = $this->_ci->LehreinheitModel->getByLvidStudiensemester($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz, $mitarbeiter_uid);
$lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten);
if (!isset($lehrveranstaltung->_children))
{
$lehrveranstaltung->_children = $lehreinheiten_data;
}
$tree[] = $lehrveranstaltung;
}
$this->terminateWithSuccess($tree);
}
public function getByStg($studiensemester_kurzbz = null, $studiengang_kz = null, $semester = null)
{
if (is_null($studiengang_kz) || !preg_match("/^-?[1-9][0-9]*$/", (string)$studiengang_kz))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$verband = null;
if (!is_null($semester) && !is_numeric($semester))
{
$verband = $semester;
$semester = null;
}
$this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
$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();
$tree = [];
foreach ($lehrveranstaltungen_data as $row)
{
$rowData = $row;
$lehreinheiten_data = $this->_ci->LehreinheitModel->getByLvidStudiensemester($row->lehrveranstaltung_id, $studiensemester_kurzbz);
if (hasData($lehreinheiten_data))
{
$lehreinheiten = getData($lehreinheiten_data);
$rowData->_children = $lehreinheiten;
}
if (!isEmptyString($row->studienplan_lehrveranstaltung_id_parent))
{
$child = $this->_ci->StudienplanModel->loadStudienplanLehrveranstaltung($row->studienplan_lehrveranstaltung_id_parent);
if (hasData($child))
{
$child = getData($child)[0];
$searchId = $child->lehrveranstaltung_id;
foreach ($lehrveranstaltungen_data as &$searchParent)
{
if ($searchParent->lehrveranstaltung_id === $searchId)
{
if (!isset($searchParent->_children))
{
$searchParent->_children = [];
}
if (is_array($searchParent->_children))
{
$searchParent->_children[] = $row;
}
else
{
$searchParent->_children = [$searchParent->_children, $row];
}
break;
}
}
}
}
else
{
$tree[] = $rowData;
}
}
$counter = 0;
$this->assignUniqueIndex($tree, $counter);
$this->terminateWithSuccess($tree);
}
public function loadByLV($lehrveranstaltung_id = null)
{
if (is_null($lehrveranstaltung_id) || !ctype_digit((string)$lehrveranstaltung_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->_ci->LehrveranstaltungModel->addSelect('lehrveranstaltung_id, lehrform_kurzbz, lehre, bezeichnung as lvbezeichnung, sprache');
$lehrveranstaltung_result = $this->_ci->LehrveranstaltungModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung_id));
$lehrveranstaltung_result = $this->getDataOrTerminateWithError($lehrveranstaltung_result);
$lehrveranstaltung = $lehrveranstaltung_result[0];
$this->_ci->LehreinheitModel->addSelect('lehrveranstaltung_id_kompatibel');
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung_kompatibel', 'lehrveranstaltung_id');
$lehrfaecher = $this->_ci->LehreinheitModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung->lehrveranstaltung_id));
$lehrfaecher_array = [];
if (hasData($lehrfaecher))
$lehrfaecher_array = array_merge($lehrfaecher_array, array_column(getData($lehrfaecher), 'lehrveranstaltung_id_kompatibel'));
$lehrfaecher_array[] = $lehrveranstaltung->lehrveranstaltung_id;
$this->_ci->LehrveranstaltungModel->addDistinct('lehrfach_id');
$this->_ci->LehrveranstaltungModel->addSelect("tbl_lehrveranstaltung.lehrveranstaltung_id, CONCAT(tbl_lehrveranstaltung.bezeichnung || '(' || tbl_lehrveranstaltung.oe_kurzbz || ')') as lehrfach");
$this->_ci->LehrveranstaltungModel->db->where_in('tbl_lehrveranstaltung.lehrveranstaltung_id', $lehrfaecher_array);
$lehrfaecher_result = $this->_ci->LehrveranstaltungModel->load();
$lehrfaecher_array = hasData($lehrfaecher_result) ? getData($lehrfaecher_result) : array();
$lehrveranstaltung->lehrfaecher = $lehrfaecher_array;
$this->terminateWithSuccess($lehrveranstaltung);
}
/*
* (david) ggf. im naechsten release
* public function loadByOrganization($oe_kurzbz)
{
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
$lehrveranstaltungen = $this->LehrveranstaltungModel->getLvsByOrganization($oe_kurzbz);
$lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen);
$tree = [];
foreach ($lehrveranstaltungen_data as $lehrveranstaltung)
{
$lehreinheiten = $this->LehreinheitModel->getByLvidStudiensemester($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz);
$lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten);
if (!isset($lehrveranstaltung->_children))
{
$lehrveranstaltung->_children = $lehreinheiten_data;
}
$tree[] = $lehrveranstaltung;
}
$this->terminateWithSuccess($tree);
}*/
/*public function loadByFachbereich($fachbereich, $mitarbeiter_uid = null)
{
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
$this->LehreinheitModel->getLvsByFachbereich($fachbereich, $studiensemester_kurzbz, $mitarbeiter_uid);
}*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid)
show_error('User authentification failed');
}
private function assignUniqueIndex(&$nodes, &$counter)
{
foreach ($nodes as &$node)
{
$node->uniqueindex = $counter++;
if (!empty($node->_children) && is_array($node->_children))
{
$this->assignUniqueIndex($node->_children, $counter);
}
}
}
private function getStudiensemesterKurzbz($studiensemester_kurzbz = null)
{
if (!is_null($studiensemester_kurzbz))
{
$studiensemester_result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
if (isError($studiensemester_result) || !hasData($studiensemester_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
return getData($studiensemester_result)[0]->studiensemester_kurzbz;
}
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
}
}
@@ -637,7 +637,7 @@ class ProfilUpdate extends FHCAPI_Controller
//? Send email to the Studiengangsassistentinnen //? Send email to the Studiengangsassistentinnen
$this->StudentModel->addSelect(["public.tbl_studiengang.email"]); $this->StudentModel->addSelect(["public.tbl_studiengang.email"]);
$this->StudentModel->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_student.student_uid"); $this->StudentModel->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_student.student_uid");
$this->StudentModel->addJoin("public.tbl_prestudent", "public.tbl_benutzer.person_id = public.tbl_prestudent.person_id"); $this->StudentModel->addJoin("public.tbl_prestudent", "public.tbl_benutzer.person_id = public.tbl_prestudent.person_id and public.tbl_student.studiengang_kz = public.tbl_prestudent.studiengang_kz");
$this->StudentModel->addJoin("public.tbl_prestudentstatus", "public.tbl_prestudentstatus.prestudent_id = public.tbl_prestudent.prestudent_id"); $this->StudentModel->addJoin("public.tbl_prestudentstatus", "public.tbl_prestudentstatus.prestudent_id = public.tbl_prestudent.prestudent_id");
$this->StudentModel->addJoin("public.tbl_studiengang", "public.tbl_studiengang.studiengang_kz = public.tbl_prestudent.studiengang_kz"); $this->StudentModel->addJoin("public.tbl_studiengang", "public.tbl_studiengang.studiengang_kz = public.tbl_prestudent.studiengang_kz");
$this->StudentModel->addGroupBy(["public.tbl_studiengang.email"]); $this->StudentModel->addGroupBy(["public.tbl_studiengang.email"]);
@@ -706,7 +706,13 @@ class ProfilUpdate extends FHCAPI_Controller
private function setStatusOnUpdateRequest($id, $status, $status_message) private function setStatusOnUpdateRequest($id, $status, $status_message)
{ {
return $this->ProfilUpdateModel->update([$id], ["status" => $status, "status_timestamp" => "NOW()", "status_message" => $status_message]); return $this->ProfilUpdateModel->update([$id], [
"status" => $status,
"status_timestamp" => "NOW()",
"status_message" => $status_message,
"updateamum" => "NOW()",
"updatevon" => getAuthUID()
]);
} }
private function updateRequestedChange($id, $requested_change) private function updateRequestedChange($id, $requested_change)
@@ -716,13 +722,12 @@ class ProfilUpdate extends FHCAPI_Controller
private function deleteOldVersionFile($dms_id) private function deleteOldVersionFile($dms_id)
{ {
if (!isset($dms_id)) {
return true;
}
// starting the transaction // starting the transaction
$this->db->trans_start(); $this->db->trans_start();
if (!isset($dms_id)) {
return;
}
//? delete the file from the profilUpdate first //? delete the file from the profilUpdate first
$profilUpdateFileDelete = $this->ProfilUpdateModel->removeFileFromProfilUpdate($dms_id); $profilUpdateFileDelete = $this->ProfilUpdateModel->removeFileFromProfilUpdate($dms_id);
@@ -777,13 +782,8 @@ class ProfilUpdate extends FHCAPI_Controller
$res = $this->StudentModel->execReadOnlyQuery($query, [$student_uid]); $res = $this->StudentModel->execReadOnlyQuery($query, [$student_uid]);
$res = $this->getDataOrTerminateWithError($res, $this->p->t('profilUpdate', 'profilUpdate_loadingOE_error')); $res = $this->getDataOrTerminateWithError($res, $this->p->t('profilUpdate', 'profilUpdate_loadingOE_error'));
$res = array_map( $oe = ($res[0])->oe_kurzbz;
function ($item) { return $oe;
return $item->oe_kurzbz;
},
$res
);
return $res;
} }
private function handleAdresse($requested_change, $personID) private function handleAdresse($requested_change, $personID)
@@ -813,7 +813,7 @@ class ProfilUpdate extends FHCAPI_Controller
$insert_adresse_id = $insertID; $insert_adresse_id = $insertID;
$insert_adresse_id = $this->getDataOrTerminateWithError($insert_adresse_id, $this->p->t('profilUpdate', 'profilUpdate_insertAdresse_error')); $insert_adresse_id = $this->getDataOrTerminateWithError($insert_adresse_id, $this->p->t('profilUpdate', 'profilUpdate_insertAdresse_error'));
if ($insert_adresse_id) { if ($insert_adresse_id) {
$this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $insert_adresse_id); $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $insert_adresse_id, $personID);
} }
} }
//! DELETE //! DELETE
@@ -825,12 +825,33 @@ class ProfilUpdate extends FHCAPI_Controller
} }
//! UPDATE //! UPDATE
else { else {
$requested_change['updateamum'] = "NOW()"; $curadresse_res = $this->AdresseModel->load($adresse_id);
$requested_change['updatevon'] = getAuthUID(); $curadresse = ($this->getDataOrTerminateWithError($curadresse_res))[0];
$update_adresse_id = $this->AdresseModel->update($adresse_id, $requested_change);
$update_adresse_id = $this->getDataOrTerminateWithError($update_adresse_id, $this->p->t('profilUpdate', 'profilUpdate_updateAdresse_error'));
$this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $update_adresse_id);
if($curadresse->heimatadresse)
{
$tmpadresse = array_merge((array) $curadresse, $requested_change);
unset($tmpadresse["adresse_id"]);
$tmpadresse['insertamum'] = "NOW()";
$tmpadresse['insertvon'] = getAuthUID();
$tmpadresse['person_id'] = $personID;
unset($tmpadresse["heimatadresse"]);
unset($tmpadresse["updateamum"]);
unset($tmpadresse["updatevon"]);
$tmpadresse_res = $this->AdresseModel->insert($tmpadresse);
$tmpadresse_id = $this->getDataOrTerminateWithError($tmpadresse_res, $this->p->t('profilUpdate', 'profilUpdate_insertAdresse_error'));
$this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $tmpadresse_id, $personID);
}
else
{
$requested_change['updateamum'] = "NOW()";
$requested_change['updatevon'] = getAuthUID();
$update_adresse_id = $this->AdresseModel->update($adresse_id, $requested_change);
$update_adresse_id = $this->getDataOrTerminateWithError($update_adresse_id, $this->p->t('profilUpdate', 'profilUpdate_updateAdresse_error'));
$this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $update_adresse_id, $personID);
}
} }
return $insertID ?? null; return $insertID ?? null;
} }
@@ -852,7 +873,7 @@ class ProfilUpdate extends FHCAPI_Controller
$insert_kontakt_id = $insertID; $insert_kontakt_id = $insertID;
$insert_kontakt_id = $this->getDataOrTerminateWithError($insert_kontakt_id, $this->p->t('profilUpdate', 'profilUpdate_insertKontakt_error')); $insert_kontakt_id = $this->getDataOrTerminateWithError($insert_kontakt_id, $this->p->t('profilUpdate', 'profilUpdate_insertKontakt_error'));
if ($insert_kontakt_id) { if ($insert_kontakt_id) {
$this->handleDupplicateZustellKontakte($requested_change['zustellung'], $insert_kontakt_id); $this->handleDupplicateZustellKontakte($requested_change['zustellung'], $insert_kontakt_id, $requested_change['kontakttyp'], $personID);
} }
} }
//! DELETE //! DELETE
@@ -869,18 +890,18 @@ class ProfilUpdate extends FHCAPI_Controller
$update_kontakt_id = $this->KontaktModel->update($kontakt_id, $requested_change); $update_kontakt_id = $this->KontaktModel->update($kontakt_id, $requested_change);
$update_kontakt_id = $this->getDataOrTerminateWithError($update_kontakt_id, $this->p->t('profilUpdate', 'profilUpdate_updateKontakt_error')); $update_kontakt_id = $this->getDataOrTerminateWithError($update_kontakt_id, $this->p->t('profilUpdate', 'profilUpdate_updateKontakt_error'));
if ($update_kontakt_id) { if ($update_kontakt_id) {
$this->handleDupplicateZustellKontakte($requested_change['zustellung'], $update_kontakt_id); $this->handleDupplicateZustellKontakte($requested_change['zustellung'], $update_kontakt_id, $requested_change['kontakttyp'], $personID);
} }
} }
return isset($insertID) ? $insertID : null; return isset($insertID) ? $insertID : null;
} }
private function handleDupplicateZustellAdressen($zustellung, $adresse_id) private function handleDupplicateZustellAdressen($zustellung, $adresse_id, $person_id)
{ {
if ($zustellung) { if ($zustellung) {
$this->PersonModel->addSelect("public.tbl_adresse.adresse_id"); $this->PersonModel->addSelect("public.tbl_adresse.adresse_id");
$this->PersonModel->addJoin("public.tbl_adresse", "public.tbl_adresse.person_id = public.tbl_person.person_id"); $this->PersonModel->addJoin("public.tbl_adresse", "public.tbl_adresse.person_id = public.tbl_person.person_id");
$zustellAdressenArray = $this->PersonModel->loadWhere(["public.tbl_person.person_id" => $this->pid, "zustelladresse" => TRUE]); $zustellAdressenArray = $this->PersonModel->loadWhere(["public.tbl_person.person_id" => $person_id, "zustelladresse" => TRUE]);
if (isError($zustellAdressenArray)) { if (isError($zustellAdressenArray)) {
$this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_loadingZustellAdressen_error')); $this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_loadingZustellAdressen_error'));
} }
@@ -893,6 +914,8 @@ class ProfilUpdate extends FHCAPI_Controller
return $adresse->adresse_id != $adresse_id; return $adresse->adresse_id != $adresse_id;
}); });
$this->addMeta('bhzustelladressen', $zustellAdressenArray);
// remove the zustelladresse from all other zustelladressen // remove the zustelladresse from all other zustelladressen
foreach ($zustellAdressenArray as $adresse) { foreach ($zustellAdressenArray as $adresse) {
$this->AdresseModel->update($adresse->adresse_id, ["zustelladresse" => FALSE]); $this->AdresseModel->update($adresse->adresse_id, ["zustelladresse" => FALSE]);
@@ -902,12 +925,16 @@ class ProfilUpdate extends FHCAPI_Controller
} }
} }
private function handleDupplicateZustellKontakte($zustellung, $kontakt_id) private function handleDupplicateZustellKontakte($zustellung, $kontakt_id, $kontakttyp, $person_id)
{ {
if ($zustellung) { if ($zustellung) {
$this->PersonModel->addSelect("public.tbl_kontakt.kontakt_id"); $this->PersonModel->addSelect("public.tbl_kontakt.kontakt_id");
$this->PersonModel->addJoin("public.tbl_kontakt", "public.tbl_kontakt.person_id = public.tbl_person.person_id"); $this->PersonModel->addJoin("public.tbl_kontakt", "public.tbl_kontakt.person_id = public.tbl_person.person_id");
$zustellKontakteArray = $this->PersonModel->loadWhere(["public.tbl_person.person_id" => $this->pid, "zustellung" => TRUE]); $zustellKontakteArray = $this->PersonModel->loadWhere([
"public.tbl_person.person_id" => $person_id,
"zustellung" => TRUE,
"kontakttyp" => $kontakttyp
]);
if (!isSuccess($zustellKontakteArray)) { if (!isSuccess($zustellKontakteArray)) {
return error($this->p->t('profilUpdate', 'profilUpdate_loadingZustellkontakte_error')); return error($this->p->t('profilUpdate', 'profilUpdate_loadingZustellkontakte_error'));
} }
@@ -0,0 +1,110 @@
<?php
/**
* Copyright (C) 2025 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class DirektGruppe extends FHCAPI_Controller
{
private $_ci;
public function __construct()
{
parent::__construct([
'add' => ['admin:rw', 'assistenz:rw'],
'delete' => ['admin:rw', 'assistenz:rw'],
'getByLehreinheit' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
$this->loadPhrases([
'ui'
]);
$this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel');
$this->_ci->load->model('education/lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
}
public function add()
{
$uid = $this->input->post('uid');
$lehreinheit_id = $this->input->post('lehreinheit_id');
$this->checkPermission($lehreinheit_id, $uid);
$result = $this->_ci->LehreinheitgruppeModel->direktUserAdd($uid, $lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function delete()
{
$uid = $this->input->post('uid');
$lehreinheit_id = $this->input->post('lehreinheit_id');
$this->checkPermission($lehreinheit_id, $uid);
$result = $this->_ci->LehreinheitgruppeModel->direktUserDelete($uid, $lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function getByLehreinheit($lehreinheit_id = null)
{
$this->checkPermission($lehreinheit_id);
$gruppen = $this->_ci->LehreinheitgruppeModel->getDirectGroup($lehreinheit_id);
$this->terminateWithSuccess(hasData($gruppen) ? getData($gruppen) : array());
}
private function checkPermission($lehreinheit_id, $uid = false)
{
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id);
if (!hasData($lehreinheit_result) || isError($lehreinheit_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
if ($uid)
{
$benuzuer_result = $this->_ci->BenutzerModel->load(array($uid));
if (!hasData($benuzuer_result) || isError($benuzuer_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
}
$result = $this->_ci->LehreinheitModel->getOes($lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$oe_array = [];
if (hasData($result))
$oe_array = getData($result);
if (!$this->_ci->permissionlib->isBerechtigtMultipleOe('admin', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('assistenz', $oe_array, 'suid'))
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
}
}
@@ -0,0 +1,47 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Favorites extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'index' => self::PERM_LOGGED,
'set' => self::PERM_LOGGED
]);
// Load models
$this->load->model('system/Variable_model', 'VariableModel');
}
public function index()
{
$result = $this->VariableModel->getVariables(getAuthUID(), ['lv_favorites']);
$data = $this->getDataOrTerminateWithError($result);
if (!$data)
$this->terminateWithSuccess(null);
else
$this->terminateWithSuccess(isset($data['lv_favorites']) ? $data['lv_favorites'] : null);
}
public function set()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('favorites', 'Favorites', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$favorites = $this->input->post('favorites');
$result = $this->VariableModel->setVariable(getAuthUID(), 'lv_favorites', $favorites);
$this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(true);
}
}
@@ -0,0 +1,195 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Gruppe extends FHCAPI_Controller
{
private $_uid;
private $_ci;
public function __construct()
{
parent::__construct([
'add' => ['admin:rw', 'assistenz:rw'],
'delete' => ['admin:rw', 'assistenz:rw'],
'deleteFromLVPlan' => ['admin:rw', 'assistenz:rw'],
'getBenutzer' => ['admin:r', 'assistenz:r'],
'getAll' => ['admin:r', 'assistenz:r'],
'getByLehreinheit' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
$this->_setAuthUID();
$this->_ci->load->library('PhrasesLib');
$this->loadPhrases(
array(
'ui'
)
);
$this->_ci->load->model('organisation/Gruppe_model', 'GruppeModel');
$this->_ci->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
$this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel');
$this->_ci->load->model('person/Person_model', 'PersonModel');
$this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
}
public function delete()
{
$lehreinheitgruppe_id = $this->input->post('lehreinheitgruppe_id');
$lehreinheit_id = $this->input->post('lehreinheit_id');
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($lehreinheitgruppe_id) || !ctype_digit((string)$lehreinheitgruppe_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehreinheitgruppe_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheitgruppe_id' => $lehreinheitgruppe_id));
if (!hasData($lehreinheitgruppe_result) || isError($lehreinheitgruppe_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->checkPermission($lehreinheit_id);
$result = $this->_ci->LehreinheitgruppeModel->deleteGroup($lehreinheit_id, $lehreinheitgruppe_id);
if (isError($result))
$this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function add()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$gid = $this->input->post('gid');
$lehrverband = $this->input->post('lehrverband');
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($gid) || !ctype_digit((string)$gid) || is_null($lehrverband))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->checkPermission($lehreinheit_id);
$result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, !($lehrverband === 'false'));
if (isError($result))
$this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function getByLehreinheit($lehreinheit_id = null)
{
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->checkPermission($lehreinheit_id);
$gruppen = $this->_ci->LehreinheitgruppeModel->getByLehreinheit($lehreinheit_id);
$this->terminateWithSuccess(hasData($gruppen) ? getData($gruppen) : array());
}
public function deleteFromLVPlan()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$lehreinheitgruppe_id = $this->input->post('lehreinheitgruppe_id');
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($lehreinheitgruppe_id) || !ctype_digit((string)$lehreinheitgruppe_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehreinheitgruppe_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheitgruppe_id' => $lehreinheitgruppe_id));
if (!hasData($lehreinheitgruppe_result) || isError($lehreinheitgruppe_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->checkPermission($lehreinheit_id);
$result = $this->_ci->StundenplandevModel->deleteGroupPlanning($lehreinheit_id, $lehreinheitgruppe_id);
if (isError($result))
$this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function getAll()
{
$this->_ci->GruppeModel->addSelect('gruppe_kurzbz,
studiengang_kz,
semester,
bezeichnung,
gid,
\'false\' as lehrverband');
$gruppen_result = $this->_ci->GruppeModel->loadWhere(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null));
$gruppen_array = array();
if (isError($gruppen_result))
$this->terminateWithError(getError($gruppen_result), self::ERROR_TYPE_GENERAL);
if (hasData($gruppen_result))
$gruppen_array = getData($gruppen_result);
$this->_ci->LehrverbandModel->addSelect('CONCAT(UPPER(CONCAT(typ, kurzbz)), \'\', semester, verband, COALESCE(gruppe,\'\')) as gruppe_kurzbz,
studiengang_kz,
semester,
tbl_lehrverband.bezeichnung,
gid,
\'true\' as lehrverband');
$this->_ci->LehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
$this->_ci->LehrverbandModel->addOrder('verband');
$this->_ci->LehrverbandModel->addOrder('gruppe');
$lehrverband_result = $this->_ci->LehrverbandModel->loadWhere(array('tbl_lehrverband.aktiv' => true));
$lehrverband_array = array();
if (isError($lehrverband_result))
$this->terminateWithError(getError($lehrverband_result), self::ERROR_TYPE_GENERAL);
if (hasData($lehrverband_result))
$lehrverband_array = getData($lehrverband_result);
$all_gruppen = array_merge($gruppen_array, $lehrverband_array);
$this->terminateWithSuccess($all_gruppen);
}
public function getBenutzer()
{
$this->_ci->PersonModel->addSelect('vorname, nachname, uid, semester, UPPER(CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz)) as studiengang');
$this->_ci->PersonModel->addJoin('public.tbl_benutzer', 'person_id');
$this->_ci->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid', 'LEFT');
$this->_ci->PersonModel->addJoin('public.tbl_student', 'uid = student_uid', 'LEFT');
$this->_ci->PersonModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
$personen = $this->_ci->PersonModel->loadWhere(array('tbl_benutzer.aktiv' => true));
$this->terminateWithSuccess(hasData($personen) ? getData($personen) : array());
}
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid)
show_error('User authentification failed');
}
private function checkPermission($lehreinheit_id)
{
$lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id);
if (!hasData($lehreinheit_result) || isError($lehreinheit_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$result = $this->_ci->LehreinheitModel->getOes($lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$oe_array = [];
if (hasData($result))
$oe_array = getData($result);
if (!$this->_ci->permissionlib->isBerechtigtMultipleOe('admin', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('assistenz', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('lv-plan', $oe_array, 'suid'))
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
}
}
@@ -0,0 +1,446 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Lehreinheit extends FHCAPI_Controller
{
private $_uid;
private $_ci;
public function __construct()
{
parent::__construct([
'add' => ['admin:rw', 'assistenz:rw'],
'copy' => ['admin:rw', 'assistenz:rw'],
'delete' => ['admin:rw', 'assistenz:rw'],
'update' => ['admin:rw', 'assistenz:rw'],
'get' => ['admin:r', 'assistenz:r'],
'getStudiensemester' => ['admin:r', 'assistenz:r'],
'getLehrfach' => ['admin:r', 'assistenz:r'],
'getSprache' => ['admin:r', 'assistenz:r'],
'getRaumtyp' => ['admin:r', 'assistenz:r'],
'getLehrform' => ['admin:r', 'assistenz:r']
]);
$this->_ci = &get_instance();
$this->_setAuthUID();
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
$this->_ci->load->library('PhrasesLib');
$this->loadPhrases(
array(
'global',
'ui'
)
);
$this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel');
$this->_ci->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
}
public function get($lehreinheit_id)
{
$lehreinheit = $this->checkLehreinheit($lehreinheit_id);
$lehreinheit->lehrfaecher = $this->getLehrfaecher($lehreinheit);
$this->terminateWithSuccess($lehreinheit);
}
private function getLehrfaecher($lehreinheit)
{
$lehrfacher_array = array($lehreinheit->lehrfach_id);
$this->_ci->LehreinheitModel->addSelect('lehrveranstaltung_id_kompatibel');
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung_kompatibel', 'lehrveranstaltung_id');
$lehrfaecher = $this->_ci->LehreinheitModel->loadWhere(array('lehrveranstaltung_id' => $lehreinheit->lehrveranstaltung_id));
if (hasData($lehrfaecher))
$lehrfaecher_array = array_merge($lehrfacher_array, array_column(getData($lehrfaecher), 'lehrveranstaltung_id_kompatibel'));
$lehrfaecher_array[] = $lehreinheit->lehrveranstaltung_id;
$this->_ci->LehrveranstaltungModel->addDistinct('lehrfach_id');
$this->_ci->LehrveranstaltungModel->addSelect("tbl_lehrveranstaltung.lehrveranstaltung_id, CONCAT(tbl_lehrveranstaltung.bezeichnung || '(' || tbl_lehrveranstaltung.oe_kurzbz || ')') as lehrfach");
$this->_ci->LehrveranstaltungModel->db->where_in('tbl_lehrveranstaltung.lehrveranstaltung_id', $lehrfaecher_array);
$lehrfaecher_result = $this->_ci->LehrveranstaltungModel->load();
return hasData($lehrfaecher_result) ? getData($lehrfaecher_result) : array();
}
public function add()
{
$lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id');
if (is_null($lehrveranstaltung_id) || !ctype_digit((string)$lehrveranstaltung_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehrveranstaltung_result = $this->_ci->LehrveranstaltungModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung_id));
if (!hasData($lehrveranstaltung_result) || isError($lehrveranstaltung_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehrveranstaltung = getData($lehrveranstaltung_result)[0];
$oe_result = $this->_ci->LehrveranstaltungModel->getAllOe($lehrveranstaltung->lehrveranstaltung_id);
$oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array();
if (!$this->_ci->permissionlib->isBerechtigtMultipleOe('admin', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('assistenz', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('lv-plan', $oe_array, 'suid'))
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
$this->_ci->load->library('form_validation');
$updatableFields = array(
'lehrveranstaltung_id',
'studiensemester_kurzbz',
'lehrfach_id',
'lehrform_kurzbz',
'stundenblockung',
'wochenrythmus',
'gewicht',
'start_kw',
'raumtyp',
'raumtypalternativ',
'sprache',
'lehre',
'anmerkung',
'lvnr',
'unr',
);
foreach ($updatableFields as $field)
{
switch ($field) {
case 'lehrveranstaltung_id':
$this->form_validation->set_rules($field, 'Lehrveranstaltung ID', 'required|integer');
break;
case 'studiensemester_kurzbz':
$this->form_validation->set_rules($field, 'Studiensemester', 'required|max_length[16]');
break;
case 'lehrfach_id':
$this->form_validation->set_rules($field, 'Lehrfach ID', 'required|integer');
break;
case 'lehrform_kurzbz':
$this->form_validation->set_rules($field, 'Lehrform', 'required|max_length[8]');
break;
case 'stundenblockung':
$this->form_validation->set_rules($field, 'Stundenblockung', 'required|integer|greater_than_equal_to[0]');
break;
case 'wochenrythmus':
$this->form_validation->set_rules($field, 'Wochenrhytmus', 'required|integer|greater_than_equal_to[0]');
break;
case 'start_kw':
$this->form_validation->set_rules($field, 'Start KW', 'integer|greater_than[0]|less_than_equal_to[53]');
break;
case 'gewicht':
$this->form_validation->set_rules($field, 'Gewicht', 'numeric');
break;
case 'raumtyp':
$this->form_validation->set_rules($field, 'Raumtyp', 'required|max_length[16]');
break;
case 'raumtypalternativ':
$this->form_validation->set_rules($field, 'Raumtyp Alternativ', 'required|max_length[16]');
break;
case 'sprache':
$this->form_validation->set_rules($field, 'Sprache', 'required|max_length[16]');
break;
case 'lvnr':
$this->form_validation->set_rules($field, 'LVNR', 'integer');
break;
case 'unr':
$this->form_validation->set_rules($field, 'UNR', 'integer');
break;
case 'lehre':
$this->form_validation->set_rules($field, 'Lehre', 'trim');
break;
case 'anmerkung':
$this->form_validation->set_rules($field, 'Anmerkung', 'trim');
break;
}
}
if ($this->form_validation->run() === false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$updateData = array();
foreach ($updatableFields as $field)
{
$value = $this->input->post($field);
if ($value !== null)
{
$updateData[$field] = $value;
}
}
$updateData['insertvon'] = $this->_uid;
$updateData['insertamum'] = date('Y-m-d H:i:s');
$result = $this->_ci->LehreinheitModel->insert(
$updateData
);
if (!isset($updateData['unr']))
{
$unr = getData($result);
$this->_ci->LehreinheitModel->update($unr, array('unr' => $unr));
}
$this->terminateWithSuccess($result);
}
public function copy()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$art = $this->input->post('art');
$lehreinheit_old = $this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit_old->lehreinheit_id);
$lehreinheit_new = $lehreinheit_old;
$lehreinheit_new->unr = null;
unset($lehreinheit_new->lehreinheit_id);
$lehreinheit_new->updateamum = date('Y-m-d H:i:s');
$lehreinheit_new->updatevon = $this->_uid;
$lehreinheit_new->insertamum = date('Y-m-d H:i:s');
$lehreinheit_new->insertvon = $this->_uid;
$insert_result = $this->_ci->LehreinheitModel->insert($lehreinheit_new);
if (isError($insert_result))
$this->terminateWithError(getError($insert_result), self::ERROR_TYPE_GENERAL);
$lehreinheit_id_new = getData($insert_result);
$this->_ci->LehreinheitModel->update(array('lehreinheit_id' => $lehreinheit_id_new), array('unr' => $lehreinheit_id_new));
if (in_array($art, array('gruppen', 'alle')))
{
$gruppen_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
if (isError($gruppen_result))
$this->terminateWithError(getError($gruppen_result), self::ERROR_TYPE_GENERAL);
if (hasData($gruppen_result))
{
$gruppen = getData($gruppen_result);
foreach ($gruppen as $gruppe)
{
$gruppe_new = $gruppe;
unset($gruppe_new->lehreinheitgruppe_id);
$gruppe_new->lehreinheit_id = $lehreinheit_id_new;
$gruppe_new->insertamum = date('Y-m-d H:i:s');
$gruppe_new->insertvon = $this->_uid;
$gruppe_new->updateamum = date('Y-m-d H:i:s');
$gruppe_new->updatevon = $this->_uid;
$gruppe_new_result = $this->_ci->LehreinheitgruppeModel->insert($gruppe_new);
if (isError($gruppe_new_result))
$this->terminateWithError(getError($gruppe_new_result), self::ERROR_TYPE_GENERAL);
}
}
}
if (in_array($art, array('lektoren', 'alle')))
{
$lektoren_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
if (isError($lektoren_result))
$this->terminateWithError(getError($lektoren_result), self::ERROR_TYPE_GENERAL);
if (hasData($lektoren_result))
{
$lektoren = getData($lektoren_result);
foreach ($lektoren as $lektor)
{
$lektor_new = $lektor;
$lektor_new->lehreinheit_id = $lehreinheit_id_new;
$lektor_new->insertamum = date('Y-m-d H:i:s');
$lektor_new->insertvon = $this->_uid;
$lektor_new->updateamum = date('Y-m-d H:i:s');
$lektor_new->updatevon = $this->_uid;
unset($lektor_new->vertrag_id);
$lektor_new_result = $this->_ci->LehreinheitmitarbeiterModel->insert((array)$lektor_new);
if (isError($lektor_new_result))
$this->terminateWithError(getError($lektor_new_result), self::ERROR_TYPE_GENERAL);
}
}
}
$this->terminateWithSuccess("Erfolgeich gespeichert");
}
public function delete()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$lehreinheit = $this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit->lehreinheit_id);
$result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id);
if (isError($result))
$this->terminateWithValidationErrors(getError($result));
$this->terminateWithSuccess('Erfolgreich geloescht');
}
public function update()
{
$lehreinheit = $this->checkLehreinheit($this->input->post('lehreinheit_id'));
$this->checkPermission($lehreinheit->lehreinheit_id);
$this->_ci->load->library('form_validation');
$formData = $this->input->post('formData');
$updatableFields = array(
'lehrveranstaltung_id',
'studiensemester_kurzbz',
'lehrfach_id',
'lehrform_kurzbz',
'stundenblockung',
'wochenrythmus',
'gewicht',
'start_kw',
'raumtyp',
'raumtypalternativ',
'sprache',
'lehre',
'anmerkung',
'lvnr',
'unr',
);
$this->form_validation->set_data($formData);
foreach ($updatableFields as $field)
{
if (array_key_exists($field, $formData))
{
switch ($field)
{
case 'lehrveranstaltung_id':
$this->form_validation->set_rules($field, 'Lehrveranstaltung ID', 'required|integer');
break;
case 'studiensemester_kurzbz':
$this->form_validation->set_rules($field, 'Studiensemester', 'required|max_length[16]');
break;
case 'lehrfach_id':
$this->form_validation->set_rules($field, 'Lehrfach ID', 'required|integer');
break;
case 'lehrform_kurzbz':
$this->form_validation->set_rules($field, 'Lehrform', 'required|max_length[8]');
break;
case 'stundenblockung':
$this->form_validation->set_rules($field, 'Stundenblockung', 'required|integer|greater_than_equal_to[0]');
break;
case 'wochenrythmus':
$this->form_validation->set_rules($field, 'Wochenrhytmus', 'required|integer|greater_than_equal_to[0]');
break;
case 'start_kw':
$this->form_validation->set_rules($field, 'Start KW', 'integer|greater_than[0]|less_than_equal_to[53]');
break;
case 'gewicht':
$this->form_validation->set_rules($field, 'Gewicht', 'numeric|greater_than_equal_to[0]');
break;
case 'raumtyp':
$this->form_validation->set_rules($field, 'Raumtyp', 'required|max_length[16]');
break;
case 'raumtypalternativ':
$this->form_validation->set_rules($field, 'Raumtyp Alternativ', 'required|max_length[16]');
break;
case 'sprache':
$this->form_validation->set_rules($field, 'Sprache', 'required|max_length[16]');
break;
case 'lvnr':
$this->form_validation->set_rules($field, 'LVNR', 'integer');
break;
case 'unr':
$this->form_validation->set_rules($field, 'UNR', 'integer|greater_than_equal_to[0]');
break;
case 'lehre':
$this->form_validation->set_rules($field, 'Lehre', 'trim');
break;
case 'anmerkung':
$this->form_validation->set_rules($field, 'Anmerkung', 'trim');
break;
}
}
}
if ($this->form_validation->run() === false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$updateData = [];
foreach ($updatableFields as $field)
{
if (array_key_exists($field, $formData))
{
$updateData[$field] = $formData[$field];
}
}
$updateData['updatevon'] = $this->_uid;
$updateData['updateamum'] = date('Y-m-d H:i:s');
$result = $this->_ci->LehreinheitModel->update(
[
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
],
$updateData
);
if (isError($result))
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$this->terminateWithSuccess($this->p->t('global', 'gespeichert'));
}
private function checkPermission($lehreinheit_id)
{
$result = $this->_ci->LehreinheitModel->getOes($lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$oe_array = [];
if (hasData($result))
$oe_array = getData($result);
if (!$this->_ci->permissionlib->isBerechtigtMultipleOe('admin', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('assistenz', $oe_array, 'suid') &&
!$this->_ci->permissionlib->isBerechtigtMultipleOe('lv-plan', $oe_array, 'suid'))
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
}
private function checkLehreinheit($lehreinheit_id)
{
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id);
if (!hasData($lehreinheit_result) || isError($lehreinheit_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
return getData($lehreinheit_result)[0];
}
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid)
show_error('User authentification failed');
}
}
@@ -0,0 +1,409 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Lektor extends FHCAPI_Controller
{
private $_uid;
private $_ci;
public function __construct()
{
parent::__construct([
'add' => ['admin:rw', 'assistenz:rw'],
'update' => ['admin:rw', 'assistenz:rw'],
'cancelVertrag' => ['admin:rw', 'assistenz:rw'],
'deleteLVPlan' => ['admin:rw', 'assistenz:rw'],
'deletePerson' => ['admin:rw', 'assistenz:rw'],
'getLehrfunktionen' => ['admin:r', 'assistenz:r'],
'getLektoren' => ['admin:r', 'assistenz:r'],
'getLektorenByLE' => ['admin:r', 'assistenz:r'],
'getLektorDaten' => ['admin:r', 'assistenz:r'],
'getLektorVertrag' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
$this->_setAuthUID();
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
$this->_ci->load->library('PermissionLib');
$this->_ci->load->library('LektorLib');
$this->_ci->load->library('form_validation');
$this->loadPhrases([
'ui'
]);
$this->_ci->load->model('accounting/Vertrag_model', 'VertragModel');
$this->_ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$this->_ci->load->model('education/lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
$this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
$this->_ci->load->model('ressource/Stundensatz_model', 'StundensatzModel');
}
private function checkMitarbeiter($mitarbeiter_uid)
{
if (is_null($mitarbeiter_uid))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid);
if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
}
public function add()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$mitarbeiter_uid = $this->input->post('mitarbeiter_uid');
$this->checkLehreinheit($lehreinheit_id);
$this->checkMitarbeiter($mitarbeiter_uid);
$lehrfach_permission = $this->checkLehrfachPermission($lehreinheit_id, array('assistenz', 'admin'));
$lehreinheit_permission = $this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan'));
if (!$lehrfach_permission && !$lehreinheit_permission)
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
$result = $this->_ci->lektorlib->addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid);
if (isError($result)) $this->terminateWithError(getError($result));
$this->terminateWithSuccess("Erfolgreich gespeichert");
}
public function update()
{
$formData = $this->input->post('formData');
$lehreinheit_id = $this->input->post('lehreinheit_id');
$mitarbeiter_uid = $this->input->post('mitarbeiter_uid');
$this->checkLehreinheit($lehreinheit_id);
$this->checkMitarbeiter($mitarbeiter_uid);
$updatableFields = array(
'lehrfunktion_kurzbz',
'planstunden',
'stundensatz',
'faktor',
'anmerkung',
'bismelden',
'semesterstunden',
'mitarbeiter_uid'
);
$this->form_validation->set_data($formData);
foreach ($updatableFields as $field)
{
if (array_key_exists($field, $formData))
{
switch ($field)
{
case 'lehrfunktion_kurzbz':
$this->form_validation->set_rules($field, 'Lehrfunktion', 'required|max_length[16]');
break;
case 'planstunden':
$this->form_validation->set_rules($field, 'Planstunden', 'integer|greater_than_equal_to[0]');
break;
case 'stundensatz':
$formData['stundensatz'] = str_replace(',', '.', $formData['stundensatz']);
$this->form_validation->set_rules($field, 'Stundensatz', 'callback__check_stundensatz');
break;
case 'faktor':
$this->form_validation->set_rules($field, 'Faktor', 'numeric|greater_than_equal_to[0]');
break;
case 'anmerkung':
$this->form_validation->set_rules($field, 'Anmerkung', 'max_length[256]');
break;
case 'bismelden':
$this->form_validation->set_rules($field, 'Bis Melden', 'trim');
break;
case 'semesterstunden':
$formData['semesterstunden'] = str_replace(',', '.', $formData['semesterstunden']);
$this->form_validation->set_rules($field, 'Semesterstunden', 'callback__check_semesterstunden');
break;
case 'mitarbeiter_uid':
$this->form_validation->set_rules($field, 'Semesterstunden', 'required|max_length[32]');
break;
}
}
}
if (!$this->form_validation->run())
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
if (isset($formData['semesterstunden']) && (!is_numeric($formData['semesterstunden']) || $formData['semesterstunden'] === ''))
{
$formData['semesterstunden'] = null;
}
$lehreinheit_permission = $this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan'));
if (!$lehreinheit_permission)
$this->terminateWithError($this->p->t('ui', 'error_fieldWriteAccess'));
$result = $this->_ci->lektorlib->updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $formData);
if (isError($result)) $this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function _check_stundensatz($value)
{
$value = str_replace(',', '.', $value);
if (!is_numeric($value))
{
$this->form_validation->set_message('_check_decimal', 'Das Feld {field} muss eine Zahl sein.');
return false;
}
if ($value < 0 || $value >= 10000) {
$this->form_validation->set_message('_check_decimal', 'Das Feld {field} muss zwischen 0 und 10000 liegen.');
return false;
}
return true;
}
public function _check_semesterstunden($value)
{
if ($value === null || $value === '') {
return true;
}
if (!is_numeric($value))
{
$this->form_validation->set_message(
'_check_semesterstunden',
'Das Feld {field} muss eine Zahl sein.'
);
return false;
}
if ($value < 0)
{
$this->form_validation->set_message(
'_check_semesterstunden',
'Das Feld {field} muss eine Zahl größer oder gleich 0 sein.'
);
return false;
}
if ($value > 999.99)
{
$this->form_validation->set_message(
'_check_semesterstunden',
'Das Feld {field} darf maximal 999,99 betragen.'
);
return false;
}
return true;
}
public function getLehrfunktionen()
{
$this->_ci->load->model('education/Lehrfunktion_model', 'LehrfunktionModel');
$this->_ci->LehrfunktionModel->addOrder('lehrfunktion_kurzbz');
$this->terminateWithSuccess(getData($this->_ci->LehrfunktionModel->load()));
}
public function getLektoren()
{
$this->_ci->MitarbeiterModel->addSelect('uid, person_id, vorname, nachname');
$this->_ci->MitarbeiterModel->addJoin('public.tbl_benutzer', 'uid = mitarbeiter_uid');
$this->_ci->MitarbeiterModel->addJoin('public.tbl_person', 'person_id');
$this->terminateWithSuccess(getData($this->_ci->MitarbeiterModel->loadWhere(array('public.tbl_benutzer.aktiv' => true))));
}
private function checkLehreinheit($lehreinheit_id)
{
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehreinheit_result = $this->_ci->LehreinheitModel->load($lehreinheit_id);
if (!hasData($lehreinheit_result) || isError($lehreinheit_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
return getData($lehreinheit_result)[0];
}
public function getLektorenByLE($lehreinheit_id = null)
{
$this->checkLehreinheit($lehreinheit_id);
$le_mitarbeiter_data = $this->_ci->LehreinheitmitarbeiterModel->getLektorenByLe($lehreinheit_id);
$this->terminateWithSuccess(hasData($le_mitarbeiter_data) ? getData($le_mitarbeiter_data) : array());
}
public function getLektorDaten($lehreinheit_id = null, $mitarbeiter_uid = null)
{
$lehreinheit = $this->checkLehreinheit($lehreinheit_id);
if (is_null($mitarbeiter_uid))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid);
if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
$studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz));
$studiensemester = getData($studiensemester_result)[0];
$defaultStundensatz = $this->_ci->StundensatzModel->getDefaultStundensatz($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre');
$le_mitarbeiter_result = $this->_ci->LehreinheitmitarbeiterModel->getByLeLektor($lehreinheit_id, $mitarbeiter_uid);
$le_mitarbeiter_data = array();
if (hasData($le_mitarbeiter_result))
{
$le_mitarbeiter_data = getData($le_mitarbeiter_result)[0];
$le_mitarbeiter_data->default_stundensatz = $defaultStundensatz;
}
$vertrag = $this->getLektorVertrag($lehreinheit_id, $mitarbeiter_uid);
$le_mitarbeiter_data->vertrag = $vertrag;
$this->terminateWithSuccess($le_mitarbeiter_data);
}
private function getLektorVertrag($lehreinheit_id = null, $mitarbeiter_uid = null)
{
$this->_ci->load->model('accounting/Vertrag_model', 'VertragModel');
$vertrag = $this->_ci->VertragModel->getVertrag($mitarbeiter_uid, $lehreinheit_id);
return hasData($vertrag) ? getData($vertrag)[0] : null;
}
private function checkLehrfachPermission($lehreinheit_id, $permissions)
{
$lehrfach_oe_kurzbz = $this->_ci->LehreinheitModel->getLehrfachOe($lehreinheit_id);
if (isError($lehrfach_oe_kurzbz))
$this->terminateWithError(getError($lehrfach_oe_kurzbz), self::ERROR_TYPE_GENERAL);
$lehrfach_oe_kurzbz = array('');
if (hasData($lehrfach_oe_kurzbz))
$lehrfach_oe_kurzbz = array_column(getData($lehrfach_oe_kurzbz), 'oe_kurzbz');
return $this->checkPermissionGenerel($permissions, $lehrfach_oe_kurzbz);
}
private function checkPermissionGenerel($permissions, $oe_array)
{
$hasPermission = false;
foreach ($permissions as $permission)
{
if ($this->_ci->permissionlib->isBerechtigtMultipleOe($permission, $oe_array, 'suid'))
{
$hasPermission = true;
break;
}
}
return $hasPermission;
}
private function checkPermission($lehreinheit_id, $permissions)
{
$result = $this->_ci->LehreinheitModel->getOes($lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
$oe_array = [];
if (hasData($result))
$oe_array = getData($result);
return $this->checkPermissionGenerel($permissions, $oe_array);
}
public function cancelVertrag()
{
$vertrag_id = $this->input->post('vertrag_id');
$lehreinheit_id = $this->input->post('lehreinheit_id');
$mitarbeiter_uid = $this->input->post('mitarbeiter_uid');
$this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit_id, array('admin', 'lehre/lehrauftrag_bestellen'));
if (is_null($vertrag_id) || !ctype_digit((string)$vertrag_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$vertrag_result = $this->_ci->VertragModel->load($vertrag_id);
if (!hasData($vertrag_result) || isError($vertrag_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
if (is_null($mitarbeiter_uid))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid);
if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$result = $this->_ci->VertragModel->cancelVertrag($vertrag_id, $mitarbeiter_uid);
if (isError($result))
$this->terminateWithError(getError($result));
$this->terminateWithSuccess($result);
}
public function deletePerson()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$mitarbeiter_uid = $this->input->post('mitarbeiter_uid');
$this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit_id, array('admin', 'assistenz', 'lv-plan'));
if (is_null($mitarbeiter_uid))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid);
if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$delete_result =$this->_ci->LehreinheitmitarbeiterModel->deleteLektorFromLe($lehreinheit_id, $mitarbeiter_uid);
if (isError($delete_result))
$this->terminateWithError(getError($delete_result));
$this->terminateWithSuccess($delete_result);
}
public function deleteLVPlan()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$mitarbeiter_uid = $this->input->post('mitarbeiter_uid');
$this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit_id, array('lv-plan/lektorentfernen'));
if (is_null($mitarbeiter_uid))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$mitarbeiter_result = $this->_ci->MitarbeiterModel->load($mitarbeiter_uid);
if (!hasData($mitarbeiter_result) || isError($mitarbeiter_result))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$delete_result = $this->_ci->StundenplandevModel->deleteLektorPlanning($lehreinheit_id, $mitarbeiter_uid);
if (isError($delete_result))
$this->terminateWithError(getError($delete_result));
$this->terminateWithSuccess($delete_result);
}
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid)
show_error('User authentification failed');
}
}
@@ -0,0 +1,121 @@
<?php
/**
* Copyright (C) 2025 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Setup extends FHCAPI_Controller
{
private $_ci;
private $_uid;
public function __construct()
{
parent::__construct([
'getTabs' => ['admin:r', 'assistenz:r'],
'getStudiensemester' => ['admin:r', 'assistenz:r'],
'getSprache' => ['admin:r', 'assistenz:r'],
'getRaumtyp' => ['admin:r', 'assistenz:r'],
'getLehrform' => ['admin:r', 'assistenz:r'],
]);
$this->_ci = &get_instance();
$this->_setAuthUID();
$this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
}
public function getTabs()
{
$tabs['details'] = array (
'title' => 'Details',
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Details.js',
'config' => []
);
$tabs['gruppen'] = array (
'title' => 'Gruppen',
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Gruppen.js',
'config' => []
);
$tabs['lektor'] = array (
'title' => 'LektorInnenzuteilung',
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Lektor.js',
'config' => []
);
$tabs['notiz'] = array (
'title' => 'Notizen',
'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Notiz.js',
'config' => []
);
$this->terminateWithSuccess($tabs);
}
public function getStudiensemester()
{
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->_ci->StudiensemesterModel->addOrder('start', 'DESC');
$this->terminateWithSuccess(getData($this->_ci->StudiensemesterModel->load()));
}
public function getSprache()
{
$this->_ci->load->model('system/Sprache_model', 'SpracheModel');
$this->terminateWithSuccess(getData($this->_ci->SpracheModel->load()));
}
public function getRaumtyp()
{
$this->_ci->load->model('ressource/Raumtyp_model', 'RaumtypModel');
$this->_ci->RaumtypModel->addOrder('raumtyp_kurzbz');
$this->terminateWithSuccess(getData($this->_ci->RaumtypModel->loadWhere(array('aktiv' => true))));
}
public function getLehrform()
{
$language = $this->_getLanguageIndex();
$this->_ci->load->model('codex/lehrform_model', 'LehrformModel');
$this->_ci->LehrformModel->addSelect(
'*,
bezeichnung_kurz[('.$language.')] as bez_kurz,
bezeichnung_lang[('.$language.')] as bez
'
);
$this->terminateWithSuccess(getData($this->_ci->LehrformModel->load()));
}
private function _getLanguageIndex()
{
$this->_ci->load->model('system/Sprache_model', 'SpracheModel');
$this->_ci->SpracheModel->addSelect('index');
$result = $this->_ci->SpracheModel->loadWhere(array('sprache' => getUserLanguage()));
return hasData($result) ? getData($result)[0]->index : 1;
}
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid)
show_error('User authentification failed');
}
}
@@ -0,0 +1,117 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class StgTree extends FHCAPI_Controller
{
public function __construct()
{
$permissions = [];
$router = load_class('Router');
$permissions[$router->method] = ['admin:r', 'assistenz:r'];
parent::__construct($permissions);
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
}
public function _remap($method, $params = [])
{
if ($method == '' || $method == 'index')
return $this->getBase();
if (!$this->permissionlib->isBerechtigt('assistenz', 's', $method)
&& !$this->permissionlib->isBerechtigt('admin', 's', $method)
) {
return $this->_outputAuthError([$method => ['admin:r', 'assistenz:r']]);
}
return $this->getStudiengang($method);
show_404();
}
protected function getBase()
{
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
$this->StudiengangModel->addDistinct();
$this->StudiengangModel->addSelect("v.studiengang_kz AS link");
$this->StudiengangModel->addSelect(
"CONCAT(kurzbzlang, ' (', UPPER(CONCAT(typ, kurzbz)), ') - ', tbl_studiengang.bezeichnung) AS name",
false
);
$this->StudiengangModel->addSelect('erhalter_kz');
$this->StudiengangModel->addSelect('typ');
$this->StudiengangModel->addSelect('kurzbz');
$this->StudiengangModel->addSelect('studiengang_kz');
$this->StudiengangModel->addSelect('studiengang_kz AS stg_kz');
$this->StudiengangModel->addOrder('erhalter_kz');
$this->StudiengangModel->addOrder('typ');
$this->StudiengangModel->addOrder('kurzbz');
$stgs = $this->permissionlib->getSTG_isEntitledFor('admin') ?: [];
$stgs = array_merge($stgs, $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
if (!$stgs)
$this->terminateWithSuccess([]);
$this->StudiengangModel->db->where_in('studiengang_kz', $stgs);
$result = $this->StudiengangModel->loadWhere(['v.aktiv' => true]);
$list = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($list);
}
protected function getStudiengang($studiengang_kz)
{
$link = $studiengang_kz . '/';
$this->StudiengangModel->addJoin('public.tbl_lehrverband v', 'studiengang_kz');
$this->StudiengangModel->addDistinct();
$this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", semester) AS link", false);
$this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester ORDER BY verband, gruppe LIMIT 1)) AS name", false);
$this->StudiengangModel->addSelect("TRUE AS leaf", false);
$this->StudiengangModel->addSelect('semester');
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
$this->StudiengangModel->addOrder('semester');
$result = $this->StudiengangModel->loadWhere([
'v.studiengang_kz' => $studiengang_kz,
'v.aktiv' => true
]);
$list = $this->getDataOrTerminateWithError($result);
$result = $this->StudiengangModel->load($studiengang_kz);
$result = $this->getDataOrTerminateWithError($result);
if ($result)
{
if (current($result)->mischform)
{
$this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
$this->StudienordnungModel->addDistinct();
$this->StudienordnungModel->addSelect("CONCAT(studiengang_kz, '/', p.orgform_kurzbz) AS link");
$this->StudienordnungModel->addSelect("p.orgform_kurzbz AS name");
$this->StudienordnungModel->addSelect("TRUE as leaf", false);
$this->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id');
$result = $this->StudienordnungModel->loadWhere([
'aktiv' => true,
'studiengang_kz' => $studiengang_kz,
'p.orgform_kurzbz !=' => 'DDP'
]);
$result = $this->getDataOrTerminateWithError($result);
$list = array_merge($list, $result);
}
}
$this->terminateWithSuccess($list);
}
}
@@ -0,0 +1,50 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Tags extends Tag_Controller
{
const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:rw'];
public function __construct()
{
parent::__construct([
'getTag' => self::BERECHTIGUNG_KURZBZ,
'getTags' => self::BERECHTIGUNG_KURZBZ,
'addTag' => self::BERECHTIGUNG_KURZBZ,
'updateTag' => self::BERECHTIGUNG_KURZBZ,
'doneTag' => self::BERECHTIGUNG_KURZBZ,
'deleteTag' => self::BERECHTIGUNG_KURZBZ,
'updateLehre' => self::BERECHTIGUNG_KURZBZ,
'doneLehre' => self::BERECHTIGUNG_KURZBZ,
'deleteLehre' => self::BERECHTIGUNG_KURZBZ,
]);
$this->config->load('lvverwaltung');
}
public function getTag($readonly_tags = null)
{
parent::getTag($this->config->item('lvverwaltung_tags'));
}
public function getTags($tags = null)
{
parent::getTags($this->config->item('lvverwaltung_tags'));
}
public function addTag($withZuordnung = true, $updatable_tags = null)
{
parent::addTag(true, $this->config->item('lvverwaltung_tags'));
}
public function updateTag($updatable_tags = null)
{
parent::updateTag($this->config->item('lvverwaltung_tags'));
}
public function deleteTag($withZuordnung = true, $updatable_tags = null)
{
parent::deleteTag(true, $this->config->item('lvverwaltung_tags'));
}
public function doneTag($updatable_tags = null)
{
parent::doneTag($this->config->item('lvverwaltung_tags'));
}
}
@@ -0,0 +1,21 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class NotizLehreinheit extends Notiz_Controller
{
public function __construct()
{
parent::__construct([
'getUid' => ['admin:r', 'assistenz:r'],
'getNotizen' => ['admin:r', 'assistenz:r'],
'loadNotiz' => ['admin:r', 'assistenz:r'],
'addNewNotiz' => ['admin:rw', 'assistenz:rw'],
'updateNotiz' => ['admin:rw', 'assistenz:rw'],
'deleteNotiz' => ['admin:rw', 'assistenz:rw'],
'loadDokumente' => ['admin:r', 'assistenz:r'],
'getMitarbeiter' => ['admin:r', 'assistenz:r'],
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
}
}
@@ -60,17 +60,6 @@ class Favorites extends FHCAPI_Controller
$favorites = $this->input->post('favorites'); $favorites = $this->input->post('favorites');
$removed = [];
while (strlen($favorites) > 64) {
$favObj = json_decode($favorites);
if (!$favObj->list)
break;
$removed[] = array_shift($favObj->list);
$favorites = json_encode($favObj);
}
if ($removed)
$this->addMeta('removed', $removed);
$result = $this->VariableModel->setVariable(getAuthUID(), 'stv_favorites', $favorites); $result = $this->VariableModel->setVariable(getAuthUID(), 'stv_favorites', $favorites);
$this->getDataOrTerminateWithError($result); $this->getDataOrTerminateWithError($result);
@@ -434,7 +434,10 @@ class Kontakt extends FHCAPI_Controller
$this->FirmaModel->addJoin('public.tbl_firma f', 'ON (f.firma_id = st.firma_id)', 'LEFT'); $this->FirmaModel->addJoin('public.tbl_firma f', 'ON (f.firma_id = st.firma_id)', 'LEFT');
$this->KontakttypModel->addJoin('public.tbl_kontakttyp kt', 'ON (public.tbl_kontakt.kontakttyp = kt.kontakttyp)'); $this->KontakttypModel->addJoin('public.tbl_kontakttyp kt', 'ON (public.tbl_kontakt.kontakttyp = kt.kontakttyp)');
$result = $this->KontaktModel->loadWhere( $result = $this->KontaktModel->loadWhere(
array('person_id' => $person_id) array(
'person_id' => $person_id,
'public.tbl_kontakt.kontakttyp !=' => 'hidden'
)
); );
if (isError($result)) if (isError($result))
@@ -442,20 +445,18 @@ class Kontakt extends FHCAPI_Controller
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
} }
$this->terminateWithSuccess((getData($result) ?: [])); $this->terminateWithSuccess((getData($result) ?: []));
} }
public function getKontakttypen() public function getKontakttypen()
{ {
$this->load->model('person/Kontakttyp_model', 'KontakttypModel'); $this->load->model('person/Kontakttyp_model', 'KontakttypModel');
$this->KontakttypModel->addOrder('beschreibung', 'ASC');
$result = $this->KontakttypModel->loadWhere(array('kontakttyp !=' => 'hidden'));
$result = $this->KontakttypModel->load(); $data = $this->getDataOrTerminateWithError($result);
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); $this->terminateWithSuccess($data);
}
else
{
$this->terminateWithSuccess(getData($result) ?: []);
}
} }
public function loadContact() public function loadContact()
@@ -352,7 +352,7 @@ class Konto extends FHCAPI_Controller
continue; continue;
} }
$result = $this->KontoModel->insert([ $result = $this->KontoModel->insert([
'person_id' => $buchung['person_id'], 'person_id' => $buchung['person_id'],
'studiengang_kz' => $buchung['studiengang_kz'], 'studiengang_kz' => $buchung['studiengang_kz'],
@@ -361,7 +361,7 @@ class Konto extends FHCAPI_Controller
'buchungstyp_kurzbz' => $buchung['buchungstyp_kurzbz'], 'buchungstyp_kurzbz' => $buchung['buchungstyp_kurzbz'],
'credit_points' => $buchung['credit_points'], 'credit_points' => $buchung['credit_points'],
'zahlungsreferenz' => $buchung['zahlungsreferenz'], 'zahlungsreferenz' => $buchung['zahlungsreferenz'],
'betrag' => $betrag, 'betrag' => number_format($betrag, 2, '.', ''),
'buchungsdatum' => $buchungsdatum, 'buchungsdatum' => $buchungsdatum,
'mahnspanne' => '0', 'mahnspanne' => '0',
'buchungsnr_verweis' => $buchung['buchungsnr'], 'buchungsnr_verweis' => $buchung['buchungsnr'],
@@ -138,13 +138,24 @@ class Prestudent extends FHCAPI_Controller
{ {
$val = $this->input->post($prop, true); $val = $this->input->post($prop, true);
if ($val !== null || $prop === 'foerderrelevant') { if ($val !== null) {
if(in_array($prop, ['dual', 'bismelden', 'foerderrelevant']))
{
$val = boolval($val);
}
elseif (
$val === ''
&& in_array($prop, ['zgvnation', 'zgvmanation', 'zgvdoktornation', 'berufstaetigkeit_code', 'ausbildungcode'])
)
{
$val = null;
}
$update_prestudent[$prop] = $val; $update_prestudent[$prop] = $val;
} }
// allowed to be null, but has to be in postparameter // allowed to be null, but has to be in postparameter
if ( if (
in_array($prop, ['zgvdatum', 'zgvmadatum', 'zgvdoktordatum', 'zgv_code', 'zgvmas_code', 'zgvdoktor_code']) in_array($prop, ['foerderrelevant', 'zgvdatum', 'zgvmadatum', 'zgvdoktordatum', 'zgv_code', 'zgvmas_code', 'zgvdoktor_code'])
&& !isset($update_prestudent[$prop]) && !isset($update_prestudent[$prop])
&& array_key_exists($prop, $_POST) && array_key_exists($prop, $_POST)
) )
@@ -286,11 +286,11 @@ class Status extends FHCAPI_Controller
]); ]);
$this->form_validation->set_rules('_default', '', [ $this->form_validation->set_rules('_default', '', [
['meldestichtag_not_exceeded', function () use ($datum, $isBerechtigtNoStudstatusCheck) { ['meldestichtag_not_exceeded', function () use ($datum_string, $isBerechtigtNoStudstatusCheck) {
if ($isBerechtigtNoStudstatusCheck) if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so return true; // Skip if access right says so
$result = $this->prestudentstatuschecklib->checkIfMeldestichtagErreicht($datum); $result = $this->prestudentstatuschecklib->checkIfMeldestichtagErreicht($datum_string);
return !$this->getDataOrTerminateWithError($result); return !$this->getDataOrTerminateWithError($result);
}], }],
@@ -733,8 +733,9 @@ class Status extends FHCAPI_Controller
); );
$result = $this->prestudentstatuschecklib->checkIfMeldestichtagErreicht($oldstatus->datum); $result = $this->prestudentstatuschecklib->checkIfMeldestichtagErreicht($oldstatus->datum);
$isMeldestichtagErreicht = $this->getDataOrTerminateWithError($result);
if (!$this->getDataOrTerminateWithError($result)) if ($isMeldestichtagErreicht)
$this->terminateWithError( $this->terminateWithError(
$this->p->t('lehre', 'error_dataVorMeldestichtag'), $this->p->t('lehre', 'error_dataVorMeldestichtag'),
self::ERROR_TYPE_GENERAL, self::ERROR_TYPE_GENERAL,
@@ -276,7 +276,17 @@ class Student extends FHCAPI_Controller
$update_person = array(); $update_person = array();
foreach ($array_allowed_props_person as $prop) { foreach ($array_allowed_props_person as $prop) {
$val = $this->input->post($prop); $val = $this->input->post($prop);
if ($val !== null) { if ($val === null)
{
continue;
}
if($prop == 'foto')
{
$fotoval = ($val == '') ? null : str_replace('data:image/jpeg;base64,', '', $val);
$update_person[$prop] = $fotoval;
}
else
{
$update_person[$prop] = $val; $update_person[$prop] = $val;
} }
} }
@@ -0,0 +1,86 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class MeldezettelJob extends JOB_Controller
{
const INSERT_VON = 'meldezetteljob';
const DOKUMENT_KURZBZ = 'Meldezet';
private $_ci; // Code igniter instance
public function __construct()
{
parent::__construct();
$this->_ci =& get_instance();
$this->_ci->load->model('crm/Dokumentprestudent_model', 'DokumentprestudentModel');
}
/**
* Sets Meldezettel to "accepted" for all students with Meldeadresse.
*/
public function acceptMeldezettel()
{
$this->logInfo('Start Meldezettel Job');
$params = array(self::DOKUMENT_KURZBZ);
$qry = "
-- get all prestudents with meldeadresse, but no accepted Meldezettel
SELECT
DISTINCT prestudent_id
FROM
public.tbl_adresse
JOIN public.tbl_person USING (person_id)
JOIN public.tbl_prestudent ps USING (person_id)
WHERE
typ = 'm'
AND NOT EXISTS (
SELECT
1
FROM
public.tbl_dokumentprestudent
WHERE
prestudent_id = ps.prestudent_id
AND dokument_kurzbz = ?
)";
// get all prestudents with Meldeadresse and no accpeted Meldezettel
$result = $this->_ci->DokumentprestudentModel->execReadOnlyQuery($qry, $params);
if (isError($result))
{
$this->logError(getError($result));
}
$count = 0;
if (hasData($result))
{
$prestudents = getData($result);
foreach ($prestudents as $prestudent)
{
// set Meldezettel to accepted
$result = $this->_ci->DokumentprestudentModel->insert(
array(
'prestudent_id' => $prestudent->prestudent_id,
'dokument_kurzbz' => self::DOKUMENT_KURZBZ,
'datum' => date('Y-m-d'),
'insertamum' => strftime('%Y-%m-%d %H:%M'),
'insertvon' => self::INSERT_VON
)
);
if (isError($result))
$this->logError(getError($result));
else
$count++;
}
}
$this->logInfo('End Meldezettel Job', array('Number of changes ' => $count));
}
}
@@ -362,6 +362,8 @@ class InfoCenter extends Auth_Controller
$data[self::ORIGIN_PAGE] = $origin_page; $data[self::ORIGIN_PAGE] = $origin_page;
$data[self::PREV_FILTER_ID] = $this->input->get(self::PREV_FILTER_ID); $data[self::PREV_FILTER_ID] = $this->input->get(self::PREV_FILTER_ID);
$data['studiensemester'] = $this->variablelib->getVar('infocenter_studiensemester');
$this->load->view('system/infocenter/infocenterDetails.php', $data); $this->load->view('system/infocenter/infocenterDetails.php', $data);
} }
+2 -2
View File
@@ -393,10 +393,10 @@ abstract class Notiz_Controller extends FHCAPI_Controller
foreach ($result as $doc) { foreach ($result as $doc) {
$res = $this->dmslib->removeAll($doc->dms_id); $res = $this->dmslib->removeAll($doc->dms_id);
if (isError($result)) if (isError($res))
{ {
$this->db->trans_rollback(); $this->db->trans_rollback();
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); $this->terminateWithError(getError($res), self::ERROR_TYPE_GENERAL);
} }
} }
+126 -24
View File
@@ -29,13 +29,36 @@ class Tag_Controller extends FHCAPI_Controller
$this->load->model('person/Notiz_model', 'NotizModel'); $this->load->model('person/Notiz_model', 'NotizModel');
$this->load->model('system/Notiztyp_model', 'NotiztypModel'); $this->load->model('system/Notiztyp_model', 'NotiztypModel');
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
$this->loadPhrases([
'ui'
]);
} }
public function getTag() public function getTag($readonly_tags = null)
{ {
$language = $this->_getLanguageIndex(); $language = $this->_getLanguageIndex();
$id = $this->input->get('id'); $id = $this->input->get('id');
if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
{
$readonly_tags = $this->_filterTag($readonly_tags, true);
foreach ($readonly_tags as $key => $tag)
{
$readonly_tags[$key] = $this->NotizModel->db->escape($tag);
}
$tags = '(' . implode(',', $readonly_tags) . ')';
$this->NotizModel->addSelect("
CASE
WHEN tbl_notiz_typ.typ_kurzbz IN $tags
THEN TRUE
ELSE FALSE
END as readonly
");
}
$this->NotizModel->addSelect( $this->NotizModel->addSelect(
"tbl_notiz.titel, "tbl_notiz.titel,
tbl_notiz.text, tbl_notiz.text,
@@ -54,7 +77,7 @@ class Tag_Controller extends FHCAPI_Controller
$this->NotizModel->addJoin('public.tbl_benutzer verfasserbenutzer', 'tbl_notiz.verfasser_uid = verfasserbenutzer.uid', 'LEFT'); $this->NotizModel->addJoin('public.tbl_benutzer verfasserbenutzer', 'tbl_notiz.verfasser_uid = verfasserbenutzer.uid', 'LEFT');
$this->NotizModel->addJoin('public.tbl_person verfasserperson', 'verfasserbenutzer.person_id = verfasserperson.person_id', 'LEFT'); $this->NotizModel->addJoin('public.tbl_person verfasserperson', 'verfasserbenutzer.person_id = verfasserperson.person_id', 'LEFT');
$this->NotizModel->addJoin('public.tbl_benutzer bearbeiterbenutzer', 'tbl_notiz.verfasser_uid = bearbeiterbenutzer.uid', 'LEFT'); $this->NotizModel->addJoin('public.tbl_benutzer bearbeiterbenutzer', 'tbl_notiz.bearbeiter_uid = bearbeiterbenutzer.uid', 'LEFT');
$this->NotizModel->addJoin('public.tbl_person bearbeiterperson', 'bearbeiterbenutzer.person_id = bearbeiterperson.person_id', 'LEFT'); $this->NotizModel->addJoin('public.tbl_person bearbeiterperson', 'bearbeiterbenutzer.person_id = bearbeiterperson.person_id', 'LEFT');
$notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id)); $notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id));
@@ -62,7 +85,7 @@ class Tag_Controller extends FHCAPI_Controller
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array()); $this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array());
} }
public function getTags() public function getTags($tags = null)
{ {
$this->NotiztypModel->addSelect( $this->NotiztypModel->addSelect(
'typ_kurzbz as tag_typ_kurzbz, 'typ_kurzbz as tag_typ_kurzbz,
@@ -73,19 +96,36 @@ class Tag_Controller extends FHCAPI_Controller
' '
); );
$this->NotiztypModel->addOrder('prioritaet'); $this->NotiztypModel->addOrder('prioritaet');
if (is_array($tags) && !isEmptyArray($tags))
{
$tags = $this->_filterTag($tags, false);
$this->NotiztypModel->db->where_in('typ_kurzbz', $tags);
}
$notiztypen = $this->NotiztypModel->loadWhere(array('aktiv' => true)); $notiztypen = $this->NotiztypModel->loadWhere(array('aktiv' => true));
$this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array()); $this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array());
} }
public function addTag($withZuordnung = true) public function addTag($withZuordnung = true, $updatable_tags = null)
{ {
$postData = $this->getPostJson(); $postData = $this->getPostJson();
$checkTyp = $this->NotiztypModel->loadWhere(array('typ_kurzbz' => $postData->tag_typ_kurzbz)); $checkTyp = $this->NotiztypModel->loadWhere(array('typ_kurzbz' => $postData->tag_typ_kurzbz));
if (!hasData($checkTyp)) if (isError($checkTyp))
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); $this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
if (!hasData($checkTyp))
$this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
if (is_array($updatable_tags) && !isEmptyArray($updatable_tags))
{
$tags = $this->_filterTag($updatable_tags, false);
if (!in_array($postData->tag_typ_kurzbz, $tags))
$this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
}
if ($withZuordnung) if ($withZuordnung)
{ {
@@ -125,48 +165,88 @@ class Tag_Controller extends FHCAPI_Controller
} }
} }
private function addNotiz($postData) public function updateTag($updatable_tags = null)
{
return $this->NotizModel->insert(array(
'titel' => 'TAG', //TODO klären
'text' => $postData->notiz,
'verfasser_uid' => $this->_uid,
'erledigt' => false,
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => $this->_uid,
'typ' => $postData->tag_typ_kurzbz
));
}
public function updateTag()
{ {
$postData = $this->getPostJson(); $postData = $this->getPostJson();
$post_tag = $this->NotizModel->loadWhere(array('notiz_id' => $postData->id));
if (isError($post_tag))
$this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
if (!hasData($post_tag))
$this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
if (is_array($updatable_tags) && !isEmptyArray($updatable_tags))
{
$tags = $this->_filterTag($updatable_tags, false);
$post_tag_typ = getData($post_tag)[0]->typ;
if (!in_array($post_tag_typ, $tags))
$this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
}
$updateData = $this->NotizModel->update(array('notiz_id' => $postData->id), $updateData = $this->NotizModel->update(array('notiz_id' => $postData->id),
array('text' => $postData->notiz, array('text' => $postData->notiz,
'updateamum' => date('Y-m-d H:i:s'), 'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid, 'updatevon' => $this->_uid,
'bearbeiter_uid' => $this->_uid, 'bearbeiter_uid' => $this->_uid,
) )
); );
$this->terminateWithSuccess($updateData); $this->terminateWithSuccess($updateData);
} }
public function doneTag() public function doneTag($updatable_tags = null)
{ {
$postData = $this->getPostJson(); $postData = $this->getPostJson();
$post_tag = $this->NotizModel->loadWhere(array('notiz_id' => $postData->id));
if (isError($post_tag))
$this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
if (!hasData($post_tag))
$this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
if (is_array($updatable_tags) && !isEmptyArray($updatable_tags))
{
$tags = $this->_filterTag($updatable_tags, false);
$post_tag_typ = getData($post_tag)[0]->typ;
if (!in_array($post_tag_typ, $tags))
$this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
}
$updateData = $this->NotizModel->update(array('notiz_id' => $postData->id), $updateData = $this->NotizModel->update(array('notiz_id' => $postData->id),
array('erledigt' => !$postData->done, array('erledigt' => !$postData->done,
'text' => $postData->notiz,
'updateamum' => date('Y-m-d H:i:s'), 'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid, 'updatevon' => $this->_uid,
'bearbeiter_uid' => $this->_uid, 'bearbeiter_uid' => $this->_uid,
) )
); );
$this->terminateWithSuccess($updateData); $this->terminateWithSuccess($updateData);
} }
public function deleteTag($withZuordnung = true) public function deleteTag($withZuordnung = true, $updatable_tags = null)
{ {
$postData = $this->getPostJson(); $postData = $this->getPostJson();
$post_tag = $this->NotizModel->loadWhere(array('notiz_id' => $postData->id));
if (isError($post_tag))
$this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
if (!hasData($post_tag))
$this->terminateWithError($this->p->t('ui', 'fehlerBeimLesen'));
if (is_array($updatable_tags) && !isEmptyArray($updatable_tags))
{
$tags = $this->_filterTag($updatable_tags, false);
$post_tag_typ = getData($post_tag)[0]->typ;
if (!in_array($post_tag_typ, $tags))
$this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
}
$deleteNotiz = ""; $deleteNotiz = "";
if ($withZuordnung) if ($withZuordnung)
@@ -208,5 +288,27 @@ class Tag_Controller extends FHCAPI_Controller
return hasData($result) ? getData($result)[0]->index : 1; return hasData($result) ? getData($result)[0]->index : 1;
} }
private function _filterTag($tags, $readonly = true)
{
$filtered_tags = array_filter($tags, function ($tag) use ($readonly)
{
return isset($tag['readonly']) && $tag['readonly'] === $readonly;
});
return array_keys($filtered_tags);
}
private function addNotiz($postData)
{
return $this->NotizModel->insert(array(
'titel' => 'TAG', //TODO klären
'text' => $postData->notiz,
'verfasser_uid' => $this->_uid,
'erledigt' => false,
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => $this->_uid,
'typ' => $postData->tag_typ_kurzbz
));
}
} }
+13 -12
View File
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* Copyright (C) 2022 fhcomplete.org * Copyright (C) 2025 fhcomplete.org
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -177,7 +177,7 @@ class FilterCmptLib
$session = $this->getSession(); $session = $this->getSession();
// If session is NOT empty -> a filter was already loaded // If session is NOT empty -> a filter was already loaded
if ($session != null) if (!isError($session) && $session != null)
{ {
// Retrieve the filterId stored in the session // Retrieve the filterId stored in the session
$sessionFilterId = $this->_getSessionElement(FilterCmptLib::FILTER_ID); $sessionFilterId = $this->_getSessionElement(FilterCmptLib::FILTER_ID);
@@ -219,9 +219,7 @@ class FilterCmptLib
} }
} }
} }
else
// If the session is empty -> first time that this filter is loaded
if ($session == null)
{ {
// Load filter definition data from DB // Load filter definition data from DB
$definition = $this->_loadDefinition( $definition = $this->_loadDefinition(
@@ -602,7 +600,7 @@ class FilterCmptLib
{ {
$session = getSessionElement(self::SESSION_NAME, $this->_filterUniqueId); $session = getSessionElement(self::SESSION_NAME, $this->_filterUniqueId);
if (isset($session[$name])) if (!isError($session) && isset($session[$name]))
{ {
return $session[$name]; return $session[$name];
} }
@@ -623,7 +621,7 @@ class FilterCmptLib
if (!$this->_ci->permissionlib->hasAtLeastOne($this->_requiredPermissions, self::PERMISSION_FILTER_METHOD, self::PERMISSION_TYPE)) if (!$this->_ci->permissionlib->hasAtLeastOne($this->_requiredPermissions, self::PERMISSION_FILTER_METHOD, self::PERMISSION_TYPE))
{ {
$this->_setSession(error('The required permission is not help by the logged user')); $this->_setSession(error('The required permission is not held by the logged user'));
return false; return false;
} }
@@ -904,7 +902,7 @@ class FilterCmptLib
$filterCmptsSession = getSession(self::SESSION_NAME); $filterCmptsSession = getSession(self::SESSION_NAME);
// If something is present in session // If something is present in session
if ($filterCmptsSession != null) if (!isError($filterCmptsSession) && $filterCmptsSession != null)
{ {
// Loops in the session for all the filter components // Loops in the session for all the filter components
foreach ($filterCmptsSession as $filterCmpt => $filterCmptData) foreach ($filterCmptsSession as $filterCmpt => $filterCmptData)
@@ -951,9 +949,11 @@ class FilterCmptLib
{ {
$session = getSessionElement(self::SESSION_NAME, $this->_filterUniqueId); $session = getSessionElement(self::SESSION_NAME, $this->_filterUniqueId);
$session[$name] = $value; if (!isError($session) && $session != null)
{
setSessionElement(self::SESSION_NAME, $this->_filterUniqueId, $session); // stores the single value $session[$name] = $value;
setSessionElement(self::SESSION_NAME, $this->_filterUniqueId, $session); // stores the single value
}
} }
/** /**
@@ -965,7 +965,7 @@ class FilterCmptLib
$filterCmptsSession = getSession(self::SESSION_NAME); $filterCmptsSession = getSession(self::SESSION_NAME);
// If something is present in session // If something is present in session
if ($filterCmptsSession != null) if (!isError($filterCmptsSession) && $filterCmptsSession != null)
{ {
// Loops in the session for all the filter components // Loops in the session for all the filter components
foreach ($filterCmptsSession as $filterCmpt => $filterCmptData) foreach ($filterCmptsSession as $filterCmpt => $filterCmptData)
@@ -1174,3 +1174,4 @@ class FilterCmptLib
return $filterName; return $filterName;
} }
} }
+342
View File
@@ -0,0 +1,342 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class LektorLib
{
private $_ci; // Code igniter instance
public function __construct()
{
$this->_ci =& get_instance();
$this->_ci->load->model('education/lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
$this->_ci->load->model('organisation/Studiensemester_model','StudiensemesterModel');
$this->_ci->load->model('ressource/Stundensatz_model', 'StundensatzModel');
$this->_ci->load->model('vertragsbestandteil/Dienstverhaeltnis_model','DienstverhaeltnisModel');
$this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->_ci->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
}
public function addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid)
{
$this->_ci->LehreinheitModel->addSelect('tbl_lehreinheit.*, tbl_lehrveranstaltung.studiengang_kz, semesterstunden');
$this->_ci->LehreinheitModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
$lehreinheit_result = $this->_ci->LehreinheitModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
if (isError($lehreinheit_result)) return $lehreinheit_result;
if (!hasData($lehreinheit_result)) return error("Lehreinheit not found");
$lehreinheit = getData($lehreinheit_result)[0];
$already_assigned = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit->lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
if (isError($already_assigned)) return $already_assigned;
if (hasData($already_assigned)) return error('Lektor already assigned');
$studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz));
if (isError($studiensemester_result)) return $studiensemester_result;
$studiensemester = getData($studiensemester_result)[0];
$stundensatz = $this->_ci->StundensatzModel->getDefaultStundensatz($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre');
$echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'echterdv');
$echter_dv = false;
if (hasData($echter_dv_result))
{
$echter_dv = true;
}
$maxstunden = $this->getMaxStunden($mitarbeiter_uid, $studiensemester->studiensemester_kurzbz, $lehreinheit->studiengang_kz, $echter_dv);
$newData['semesterstunden'] = 0;
$newData['planstunden'] = 0;
if (!is_null($lehreinheit->semesterstunden))
{
$newData['semesterstunden'] = min($lehreinheit->semesterstunden, $maxstunden);
$newData['planstunden'] = min($lehreinheit->semesterstunden, $maxstunden);
}
$newData['lehreinheit_id'] = $lehreinheit->lehreinheit_id;
$newData['mitarbeiter_uid'] = $mitarbeiter_uid;
$newData['lehrfunktion_kurzbz'] = 'Lektor';
$newData['bismelden'] = true;
$newData['insertvon'] = getAuthUID();
$newData['insertamum'] = date('Y-m-d H:i:s');
$newData['stundensatz'] = $stundensatz;
$result = $this->_ci->LehreinheitmitarbeiterModel->insert($newData);
if (isError($result)) return $result;
return success("Lektor added successfully");
}
public function updateLektorFromLehreinheit($lehreinheit_id, $mitarbeiter_uid, $new_data)
{
$this->_ci->LehreinheitmitarbeiterModel->addSelect('lehre.tbl_lehreinheitmitarbeiter.*, lehre.tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.studiengang_kz');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
$lehreinheit_result = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
if (isError($lehreinheit_result)) return $lehreinheit_result;
if (!hasData($lehreinheit_result)) return error("Lehreinheit not found");
$lehreinheit = getData($lehreinheit_result)[0];
//TODO kollision check, wird vorerst nicht implementiert -> nur über das FAS möglich
if (isset($new_data['mitarbeiter_uid']) && $new_data['mitarbeiter_uid'] !== $mitarbeiter_uid)
{
$this->_ci->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
$this->_ci->StundenplandevModel->addGroupBy('stundenplandev_id');
$this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
$this->_ci->StundenplandevModel->addGroupBy('mitarbeiter_uid');
$verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
if (hasData($verplant))
return error('Wechsel vom Mitarbeiter nicht möglich da er bereits verplant ist!');
}
$warning = '';
if (isset($new_data['semesterstunden']))
{
$studiengang_result = $this->_ci->StudiengangModel->loadWhere(array('studiengang_kz' => $lehreinheit->studiengang_kz));
if (isError($studiengang_result)) return $studiengang_result;
if (!hasData($studiengang_result)) return error('Studiengang not found');
$studiengang = getData($studiengang_result)[0];
$studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz));
if (isError($studiensemester_result)) return $studiensemester_result;
$studiensemester = getData($studiensemester_result)[0];
$echter_dv_result = $this->_ci->DienstverhaeltnisModel->existsDienstverhaeltnis($mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'echterdv');
$echter_dv = false;
if (hasData($echter_dv_result))
{
$echter_dv = true;
}
$neue_stunden_eingerechnet = isset($new_data['bismelden']) ? $new_data['bismelden'] : $lehreinheit->bismelden;
$alte_stunden_eingerechnet = $lehreinheit->bismelden;
if (($new_data['semesterstunden'] > $lehreinheit->semesterstunden) || $neue_stunden_eingerechnet)
{
$stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv);
if (isError($stundengrenze_result)) return $stundengrenze_result;
$stundengrenze = getData($stundengrenze_result)[0];
$oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz);
$oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array('');
if ($alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($lehreinheit->semesterstunden) + {$this->_ci->LehreinheitmitarbeiterModel->db->escape($new_data['semesterstunden'])}) as summe");
else if ($alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) - ($lehreinheit->semesterstunden)) as summe");
else if (!$alte_stunden_eingerechnet && $neue_stunden_eingerechnet)
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden) + ({$this->_ci->LehreinheitmitarbeiterModel->db->escape($new_data['semesterstunden'])})) as summe");
else if (!$alte_stunden_eingerechnet && !$neue_stunden_eingerechnet)
$this->_ci->LehreinheitmitarbeiterModel->addSelect("(SUM(tbl_lehreinheitmitarbeiter.semesterstunden)) as summe");
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
$this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', (isset($new_data['mitarbeiter_uid']) ? $new_data['mitarbeiter_uid'] : $mitarbeiter_uid));
$this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $lehreinheit->studiensemester_kurzbz);
$this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true);
$this->_ci->LehreinheitmitarbeiterModel->db->where('lower(mitarbeiter_uid) NOT LIKE', '_dummy%');
$this->_ci->LehreinheitmitarbeiterModel->db->where_in('tbl_studiengang.oe_kurzbz', $oe_array);
if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE')
&& is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE)
&& count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) > 0)
{
$this->_ci->LehreinheitmitarbeiterModel->db->where_not_in('tbl_studiengang.oe_kurzbz', FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE);
}
$summe_result = $this->_ci->LehreinheitmitarbeiterModel->load();
if (isError($summe_result)) return $summe_result;
if (!hasData($summe_result)) return error('Fehler beim Ermitteln der Gesamtstunden');
$summe = getData($summe_result)[0]->summe;
if ($summe > $stundengrenze->stunden)
{
if (!$echter_dv && (!$this->_ci->permissionlib->isBerechtigt('admin')))
{
if (!$this->LehrauftragAufFirma(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid))
return error("ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden NICHT gespeichert!\n\n");
}
else
{
$warning .= "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $summe Stunden ($stundengrenze->stunden) wurde ueberschritten!\nDaten wurden gespeichert!\n\n";
}
$stunden_limit_result = $this->getStundenInstitut($mitarbeiter_uid, $lehreinheit->studiensemester_kurzbz, $oe_array);
if (hasData($stunden_limit_result))
{
$stunden_limit_array = getData($stunden_limit_result);
foreach ($stunden_limit_array as $stunden_limit)
{
$warning .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n";
}
}
}
}
}
$benutzer_result = $this->_ci->BenutzerModel->load(array(isset($formData['mitarbeiter_uid']) ? $formData['mitarbeiter_uid'] : $mitarbeiter_uid));
if (isError($benutzer_result)) return $benutzer_result;
if (!hasData($benutzer_result)) return error('Benutzer not found');
$benutzer_aktiv = getData($benutzer_result)[0]->aktiv;
if (!$benutzer_aktiv)
$warning .= "Achtung: Der/Die Benutzer*in ist inaktiv!\nBitte informieren Sie die Personalbteilung.\nDaten wurden gespeichert.\n\n";
$updatableFields = array(
'semesterstunden',
'planstunden',
'stundensatz',
'faktor',
'anmerkung',
'lehrfunktion_kurzbz',
'mitarbeiter_uid',
'bismelden'
);
$updateData = array();
foreach ($updatableFields as $field)
{
$value = isset($new_data[$field]) ? $new_data[$field] : null;
if ($value !== null)
{
$updateData[$field] = $value;
}
}
$updateData['updatevon'] = getAuthUID();
$updateData['updateamum'] = date('Y-m-d H:i:s');
$result = $this->_ci->LehreinheitmitarbeiterModel->update(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid), $updateData);
if (isError($result)) return $result;
if ($warning !== '') return success(['warning' => $warning]);
return success('Erfolgreich geupdated');
}
private function getMaxStunden($mitarbeiter_uid, $studiensemester_kurzbz, $studiengang_kz, $echter_dv)
{
$maxstunden = 9999;
$studiengang_result = $this->_ci->StudiengangModel->loadWhere(array('studiengang_kz' => $studiengang_kz));
if (isError($studiengang_result)) return $studiengang_result;
$studiengang = getData($studiengang_result)[0];
$stundengrenze_result = $this->_ci->OrganisationseinheitModel->getStundengrenze($studiengang->oe_kurzbz, $echter_dv);
if (isError($stundengrenze_result)) return $stundengrenze_result;
$stundengrenze = getData($stundengrenze_result)[0];
$maxstunden = $stundengrenze->stunden;
$lehrauftrag_firma = $this->LehrauftragAufFirma($mitarbeiter_uid);
if (!$echter_dv && !$lehrauftrag_firma)
{
$oe_result = $this->_ci->OrganisationseinheitModel->getChilds($stundengrenze->oe_kurzbz);
$oe_array = hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array('');
$stunden_summe_result = $this->getSumSemesterstunden($mitarbeiter_uid, $studiensemester_kurzbz, $oe_array);
$stunden_summe = hasData($stunden_summe_result) ? getData($stunden_summe_result)[0]->summe : 0;
if ($stunden_summe >= $maxstunden && (!$this->_ci->permissionlib->isBerechtigt('admin')))
{
$stunden_limit_result = $this->getStundenInstitut($mitarbeiter_uid, $studiensemester_kurzbz, $oe_array);
$error = "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $maxstunden Stunden ($stundengrenze->oe_kurzbz) wurde ueberschritten!\n
Daten wurden NICHT gespeichert!\n\n";
if (hasData($stunden_limit_result))
{
$stunden_limit_array = getData($stunden_limit_result);
foreach ($stunden_limit_array as $stunden_limit)
{
$error .= $stunden_limit->summe . ' Stunden ' . $stunden_limit->bezeichnung . "\n";
}
}
return error($error);
}
else
$maxstunden =- $stunden_summe;
}
return $maxstunden;
}
private function LehrauftragAufFirma($mitarbeiter_uid)
{
$this->_ci->MitarbeiterModel->addJoin('tbl_benutzer', 'tbl_mitarbeiter.mitarbeiter_uid = tbl_benutzer.uid');
$this->_ci->MitarbeiterModel->addJoin('tbl_person', 'person_id');
$this->_ci->MitarbeiterModel->addJoin('tbl_adresse', 'person_id', 'LEFT');
$this->_ci->MitarbeiterModel->addOrder('zustelladresse', 'DESC');
$this->_ci->MitarbeiterModel->addOrder('firma_id');
$this->_ci->MitarbeiterModel->addLimit(1);
$firma_result = $this->_ci->MitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $mitarbeiter_uid));
$firma = getData($firma_result)[0]->firma_id;
return !is_null($firma);
}
private function getSumSemesterstunden($mitarbeiter_uid, $studiensemester_kurzbz, $oe_array = array())
{
$this->_ci->LehreinheitmitarbeiterModel->addSelect('SUM(tbl_lehreinheitmitarbeiter.semesterstunden) as summe');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
$this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', $mitarbeiter_uid);
$this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $studiensemester_kurzbz);
$this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true);
$this->_ci->LehreinheitmitarbeiterModel->db->where('lower(mitarbeiter_uid) NOT LIKE', '_dummy%');
$this->_ci->LehreinheitmitarbeiterModel->db->where_in('tbl_studiengang.oe_kurzbz', $oe_array);
return $this->_ci->LehreinheitmitarbeiterModel->load();
}
private function getStundenInstitut($mitarbeiter_uid, $studiensemester_kurzbz, $oe_array = array())
{
$this->_ci->LehreinheitmitarbeiterModel->addSelect('SUM(tbl_lehreinheitmitarbeiter.semesterstunden) as summe, tbl_studiengang.bezeichnung');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehreinheit', 'lehreinheit_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
$this->_ci->LehreinheitmitarbeiterModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
$this->_ci->LehreinheitmitarbeiterModel->db->where('mitarbeiter_uid', $mitarbeiter_uid);
$this->_ci->LehreinheitmitarbeiterModel->db->where('studiensemester_kurzbz', $studiensemester_kurzbz);
$this->_ci->LehreinheitmitarbeiterModel->db->where('bismelden', true);
$this->_ci->LehreinheitmitarbeiterModel->db->where_in('tbl_studiengang.oe_kurzbz', $oe_array);
if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE')
&& is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE)
&& count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) > 0)
{
$this->_ci->LehreinheitmitarbeiterModel->db->where_not_in('tbl_studiengang.oe_kurzbz', FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE);
}
$this->_ci->LehreinheitmitarbeiterModel->addGroupBy('tbl_studiengang.bezeichnung');
return $this->_ci->LehreinheitmitarbeiterModel->load();
}
}
+27 -6
View File
@@ -183,7 +183,10 @@ class ProfilLib{
$zutrittskarte_ausgegebenam = $zutrittskarte_ausgegebenam ? current($zutrittskarte_ausgegebenam)->ausgegebenam : null; $zutrittskarte_ausgegebenam = $zutrittskarte_ausgegebenam ? current($zutrittskarte_ausgegebenam)->ausgegebenam : null;
//? formats date from 01-01-2000 to 01.01.2000 //? formats date from 01-01-2000 to 01.01.2000
$zutrittskarte_ausgegebenam = str_replace("-", ".", $zutrittskarte_ausgegebenam); if ($zutrittskarte_ausgegebenam !== NULL)
{
$zutrittskarte_ausgegebenam = (new DateTime($zutrittskarte_ausgegebenam))->format('d.m.Y');
}
return $zutrittskarte_ausgegebenam; return $zutrittskarte_ausgegebenam;
} }
@@ -196,7 +199,7 @@ class ProfilLib{
private function getAdressenInfo($pid) private function getAdressenInfo($pid)
{ {
$this->ci->load->model("person/Adresse_model","AdresseModel"); $this->ci->load->model("person/Adresse_model","AdresseModel");
$adresse_res = $this->ci->AdresseModel->addSelect(["adresse_id", "strasse", "tbl_adressentyp.bezeichnung as typ", "plz", "ort", "zustelladresse", "gemeinde", "nation"]); $adresse_res = $this->ci->AdresseModel->addSelect(["adresse_id", "strasse", "tbl_adressentyp.bezeichnung as typ", "plz", "ort", "heimatadresse", "zustelladresse", "gemeinde", "nation"]);
$adresse_res = $this->ci->AdresseModel->addOrder("zustelladresse", "DESC"); $adresse_res = $this->ci->AdresseModel->addOrder("zustelladresse", "DESC");
$adresse_res = $this->ci->AdresseModel->addJoin("tbl_adressentyp", "typ=adressentyp_kurzbz"); $adresse_res = $this->ci->AdresseModel->addJoin("tbl_adressentyp", "typ=adressentyp_kurzbz");
@@ -214,7 +217,7 @@ class ProfilLib{
* @param integer $uid the userID used to get the kontakt information * @param integer $uid the userID used to get the kontakt information
* @return array all the kontakt information corresponding to a userID * @return array all the kontakt information corresponding to a userID
*/ */
private function getKontaktInfo($pid) private function getKontaktInfo($pid, $includehidden=false)
{ {
$this->ci->load->model("person/Kontakt_model","KontaktModel"); $this->ci->load->model("person/Kontakt_model","KontaktModel");
$this->ci->KontaktModel->addSelect(['kontakttyp', 'kontakt_id', 'kontakt', 'tbl_kontakt.anmerkung', 'tbl_kontakt.zustellung']); $this->ci->KontaktModel->addSelect(['kontakttyp', 'kontakt_id', 'kontakt', 'tbl_kontakt.anmerkung', 'tbl_kontakt.zustellung']);
@@ -222,7 +225,13 @@ class ProfilLib{
$this->ci->KontaktModel->addJoin('public.tbl_firma', 'firma_id', 'LEFT'); $this->ci->KontaktModel->addJoin('public.tbl_firma', 'firma_id', 'LEFT');
$this->ci->KontaktModel->addOrder('kontakttyp, kontakt, tbl_kontakt.updateamum, tbl_kontakt.insertamum'); $this->ci->KontaktModel->addOrder('kontakttyp, kontakt, tbl_kontakt.updateamum, tbl_kontakt.insertamum');
$kontakte_res = $this->ci->KontaktModel->loadWhere(['person_id' => $pid]); $params = array('person_id' => $pid);
if(!$includehidden)
{
$params['kontakttyp <>'] = 'hidden';
}
$kontakte_res = $this->ci->KontaktModel->loadWhere($params);
if(isError($kontakte_res)){ if(isError($kontakte_res)){
return error(getData($kontakte_res)); return error(getData($kontakte_res));
} }
@@ -303,10 +312,22 @@ class ProfilLib{
private function getBenutzerFunktion($uid) private function getBenutzerFunktion($uid)
{ {
$this->ci->load->model("person/Benutzerfunktion_model","BenutzerfunktionModel"); $this->ci->load->model("person/Benutzerfunktion_model","BenutzerfunktionModel");
$this->ci->BenutzerfunktionModel->addSelect(["tbl_benutzerfunktion.bezeichnung as Bezeichnung", "tbl_organisationseinheit.bezeichnung as Organisationseinheit", "datum_von as Gültig_von", "datum_bis as Gültig_bis", "wochenstunden as Wochenstunden"]); $this->ci->BenutzerfunktionModel->addSelect([
"CASE WHEN (tbl_benutzerfunktion.bezeichnung IS NOT NULL AND tbl_benutzerfunktion.bezeichnung <> '' AND tbl_benutzerfunktion.bezeichnung <> tbl_funktion.beschreibung) THEN tbl_funktion.beschreibung || ' - ' || tbl_benutzerfunktion.bezeichnung ELSE tbl_funktion.beschreibung END as \"Bezeichnung\"",
"tbl_organisationseinheit.bezeichnung as Organisationseinheit",
"datum_von as Gültig_von",
"datum_bis as Gültig_bis",
"COALESCE(wochenstunden, '0'::numeric(5,2)) AS \"Wochenstunden\""
]);
$this->ci->BenutzerfunktionModel->addJoin("tbl_funktion", "funktion_kurzbz");
$this->ci->BenutzerfunktionModel->addJoin("tbl_organisationseinheit", "oe_kurzbz"); $this->ci->BenutzerfunktionModel->addJoin("tbl_organisationseinheit", "oe_kurzbz");
$benutzer_funktion_res = $this->ci->BenutzerfunktionModel->loadWhere(array('uid' => $uid)); $benutzer_funktion_res = $this->ci->BenutzerfunktionModel->loadWhere(
array(
'uid' => $uid,
'NOW()::date BETWEEN COALESCE(datum_von, \'1970-01-01\'::date) AND COALESCE(datum_bis, \'2170-12-01\'::date)' => null
)
);
if(isError($benutzer_funktion_res)){ if(isError($benutzer_funktion_res)){
return error(getData($benutzer_funktion_res)); return error(getData($benutzer_funktion_res));
} }
+4 -3
View File
@@ -229,9 +229,10 @@ class StundenplanLib
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
$is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter(getAuthUID())); $is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter(getAuthUID()));
if ($is_mitarbeiter) { if ($is_mitarbeiter && empty($ort_kurzbz)) {
$reservierungen = $this->_ci->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz); // request for personal lvplan show only reservations of logged in user
$reservierungen = $this->_ci->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date);
} else { } else {
// querying the reservierungen // querying the reservierungen
$reservierungen = $this->_ci->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz); $reservierungen = $this->_ci->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz);
@@ -384,6 +384,60 @@ class Vertrag_model extends DB_Model
} }
} }
public function getVertrag($mitarbeiter_uid, $lehreinheit_id)
{
$this->addSelect('tbl_lehreinheitmitarbeiter.*, tbl_vertrag.*, status.bezeichnung as vertragsstatus, status.vertragsstatus_kurzbz');
$this->addJoin('lehre.tbl_lehreinheitmitarbeiter', 'vertrag_id');
$this->addJoin('lehre.tbl_vertragstyp', 'vertragstyp_kurzbz', 'LEFT');
$this->addJoin('
(
SELECT DISTINCT ON(vertrag_id) vertrag_id,
bezeichnung,
tbl_vertragsstatus.vertragsstatus_kurzbz
FROM lehre.tbl_vertrag_vertragsstatus
JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz)
ORDER BY vertrag_id, datum DESC
) as status', 'status.vertrag_id = lehre.tbl_vertrag.vertrag_id', 'LEFT');
return $this->loadWhere(array('mitarbeiter_uid' => $mitarbeiter_uid, 'lehreinheit_id' => $lehreinheit_id));
}
public function cancelVertrag($vertrag_id, $mitarbeiter_uid)
{
$vertrag = $this->load($vertrag_id);
if (!hasData($vertrag))
return error("Contract not found");
$vertrag = getData($vertrag)[0];
$this->_updateVertragRelevant($vertrag->vertrag_id);
return $this->VertragvertragsstatusModel->insert(array(
'vertrag_id' => $vertrag->vertrag_id,
'vertragsstatus_kurzbz' => 'storno',
'uid' => $mitarbeiter_uid,
'datum' => 'NOW()',
'insertamum' => 'NOW()',
'insertvon' => getAuthUID()
));
}
public function deleteVertrag($vertrag_id)
{
$vertrag = $this->load($vertrag_id);
if (!hasData($vertrag))
return error("Contract not found");
$vertrag = getData($vertrag)[0];
$this->_updateVertragRelevant($vertrag->vertrag_id);
$this->VertragvertragsstatusModel->delete(array('vertrag_id' => $vertrag->vertrag_id));
return $this->delete(array('vertrag_id' => $vertrag->vertrag_id));
}
// ----------------------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------------------
// Private methods // Private methods
@@ -415,4 +469,20 @@ class Vertrag_model extends DB_Model
return $bezeichnung; return $bezeichnung;
} }
private function _updateVertragRelevant($vertrag_id)
{
$this->LehreinheitmitarbeiterModel->update(
array("vertrag_id" => $vertrag_id),
array(
'vertrag_id' => null
)
);
$this->ProjektbetreuerModel->update(
array("vertrag_id" => $vertrag_id),
array(
'vertrag_id' => null
)
);
}
} }
@@ -1,4 +1,6 @@
<?php <?php
use \CI3_Events as Events;
class Lehreinheit_model extends DB_Model class Lehreinheit_model extends DB_Model
{ {
@@ -15,6 +17,9 @@ class Lehreinheit_model extends DB_Model
$this->load->model('education/lehreinheitgruppe_model', 'LehreinheitgruppeModel'); $this->load->model('education/lehreinheitgruppe_model', 'LehreinheitgruppeModel');
$this->load->model('education/lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); $this->load->model('education/lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
$this->load->model('organisation/studiengang_model', 'StudiengangModel'); $this->load->model('organisation/studiengang_model', 'StudiengangModel');
$this->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
$this->load->model('ressource/stundenplan_model', 'StundenplanModel');
$this->load->model('system/Log_model', 'LogModel');
} }
/** /**
@@ -308,4 +313,424 @@ EOSQL;
return $this->execQuery($query, $params); return $this->execQuery($query, $params);
} }
public function getOes($lehreinheit_id)
{
$this->addSelect('tbl_lehrveranstaltung.studiengang_kz,
tbl_lehrveranstaltung.lehrveranstaltung_id');
$this->addJoin('lehre.tbl_lehrveranstaltung', 'tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_lehreinheit.lehrveranstaltung_id');
$result = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
if (isError($result)) return $result;
if (hasData($result))
{
$lehrveranstaltung = getData($result)[0];
$oe_result = $this->LehrveranstaltungModel->getAllOe($lehrveranstaltung->lehrveranstaltung_id);
return success(hasData($oe_result) ? array_column(getData($oe_result), 'oe_kurzbz') : array(''));
}
}
public function getLehrfachOe($lehreinheit_id)
{
$this->addSelect('lehrfach.oe_kurzbz');
$this->addJoin('lehre.tbl_lehrveranstaltung lehrfach', 'lehrfach.lehrveranstaltung_id = tbl_lehreinheit.lehrfach_id', 'LEFT');
return $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
}
public function getByLvidStudiensemester($lv_id, $studiensemester_kurzbz, $mitarbeiter_uid = null, $fachbereich_kurzbz = null)
{
$qry = "WITH lehreinheiten AS (
SELECT *
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
";
$params = array($lv_id, $studiensemester_kurzbz);
if ($mitarbeiter_uid !== null)
{
$qry .= " AND lehreinheiten.lehreinheit_id IN ( SELECT lehreinheit_id FROM lehre.tbl_lehreinheitmitarbeiter WHERE mitarbeiter_uid = ?) ";
$params[] = $mitarbeiter_uid;
}
if($fachbereich_kurzbz !== null)
{
$qry .= " AND EXISTS ( SELECT 1 FROM lehre.tbl_lehrveranstaltung JOIN public.tbl_fachbereich USING(oe_kurzbz) WHERE fachbereich_kurzbz= ? AND lehrveranstaltung_id=lehreinheiten.lehrfach_id)";
$params[] = $fachbereich_kurzbz;
}
$qry .= " ORDER BY lehrveranstaltung_id;";
return $this->execReadOnlyQuery($qry, $params);
}
private function getLVTmp($stg_kz = null)
{
$qry = "SELECT DISTINCT ON(lehrveranstaltung_id) *,
'' as stundenblockung,
'' as lehreinheit_id,
'' as wochenrythmus,
'' as raumtyp,
'' as raumtypalternativ,
'' as gruppen,
'' as studienplan_id,
'' 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;
}
public function getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz = null)
{
$qry = "WITH lvs AS (" . $this->getLVTmp($stg_kz) . ")
SELECT lvs.*
FROM lvs
";
$params = array($mitarbeiter_uid, $studiensemester_kurzbz);
if (!is_null($stg_kz))
{
$params[] = $stg_kz;
}
return $this->execReadOnlyQuery($qry, $params);
}
public function deleteLehreinheit($lehreinheit_id)
{
$lehreinheit = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
if (isError($lehreinheit)) return $lehreinheit;
if (!hasData($lehreinheit))
return error("Lehreinheit not found!");
$errorReasons = [];
$addError = function ($reason = null) use (&$errorReasons)
{
if ($reason !== null)
{
$errorReasons[] = $reason;
}
};
$stundenplandev_result = $this->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
$stundenplan_result = $this->StundenplanModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
if (hasData($stundenplan_result) || hasData($stundenplandev_result))
$addError('Dieser LV-Teil ist bereits im LV-Plan verplant und kann daher nicht geloescht werden!');
Events::trigger(
'lehreinheit_delete_check',
$addError,
$lehreinheit_id
);
if (!empty($errorReasons)) return error($errorReasons);
$this->db->trans_begin();
Events::trigger(
'lehreinheit_delete',
$addError,
$lehreinheit_id
);
$undosql = '';
$lehreinheit_gruppe_result = $this->LehreinheitgruppeModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
if (hasData($lehreinheit_gruppe_result))
{
foreach (getData($lehreinheit_gruppe_result) as $row)
{
$values = [
$this->db->escape($row->lehreinheitgruppe_id),
$this->db->escape($row->lehreinheit_id),
$this->db->escape($row->studiengang_kz),
$this->db->escape($row->semester),
$this->db->escape($row->verband),
$this->db->escape($row->gruppe),
$this->db->escape($row->gruppe_kurzbz),
$this->db->escape($row->updateamum),
$this->db->escape($row->updatevon),
$this->db->escape($row->insertamum),
$this->db->escape($row->insertvon)
];
$undosql .= "INSERT INTO lehre.tbl_lehreinheitgruppe (
lehreinheitgruppe_id,
lehreinheit_id,
studiengang_kz,
semester,
verband,
gruppe,
gruppe_kurzbz,
updateamum,
updatevon,
insertamum,
insertvon
) VALUES (" . implode(', ', $values) . ");\n";
}
$lehreinheit_gruppe_delete_result = $this->LehreinheitgruppeModel->delete(array('lehreinheit_id' => $lehreinheit_id));
if (isError($lehreinheit_gruppe_delete_result))
$addError(getError($lehreinheit_gruppe_delete_result));
}
$lehreinheit_mitarbeiter_result = $this->LehreinheitmitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
if (hasData($lehreinheit_mitarbeiter_result))
{
foreach (getData($lehreinheit_mitarbeiter_result) as $row)
{
$values = [
$this->db->escape($row->lehreinheit_id),
$this->db->escape($row->mitarbeiter_uid),
$this->db->escape($row->lehrfunktion_kurzbz),
$this->db->escape($row->planstunden),
$this->db->escape($row->stundensatz),
$this->db->escape($row->faktor),
$this->db->escape($row->anmerkung),
$this->db->escape($row->bismelden),
$this->db->escape($row->updateamum),
$this->db->escape($row->updatevon),
$this->db->escape($row->insertamum),
$this->db->escape($row->insertvon),
$this->db->escape($row->semesterstunden)
];
$undosql .= "INSERT INTO lehre.tbl_lehreinheitmitarbeiter (
lehreinheit_id,
mitarbeiter_uid,
lehrfunktion_kurzbz,
planstunden,
stundensatz,
faktor,
anmerkung,
bismelden,
updateamum,
updatevon,
insertamum,
insertvon,
semesterstunden
) VALUES (" . implode(', ', $values) . ");\n";
}
$lehreinheit_mitarbeiter_delete_result = $this->LehreinheitmitarbeiterModel->delete(array('lehreinheit_id' => $lehreinheit_id));
if (isError($lehreinheit_mitarbeiter_delete_result))
$addError(getError($lehreinheit_mitarbeiter_delete_result));
}
foreach (getData($lehreinheit) as $row)
{
$values = [
$this->db->escape($row->lehreinheit_id),
$this->db->escape($row->lehrveranstaltung_id),
$this->db->escape($row->studiensemester_kurzbz),
$this->db->escape($row->lehrfach_id),
$this->db->escape($row->lehrform_kurzbz),
$this->db->escape($row->stundenblockung),
$this->db->escape($row->wochenrythmus),
$this->db->escape($row->start_kw),
$this->db->escape($row->raumtyp),
$this->db->escape($row->raumtypalternativ),
$this->db->escape($row->sprache),
$this->db->escape($row->lehre),
$this->db->escape($row->anmerkung),
$this->db->escape($row->unr),
$this->db->escape($row->lvnr),
$this->db->escape($row->updateamum),
$this->db->escape($row->updatevon),
$this->db->escape($row->insertamum),
$this->db->escape($row->insertvon),
];
$undosql .= "INSERT INTO lehre.tbl_lehreinheit (
lehreinheit_id,
lehrveranstaltung_id,
studiensemester_kurzbz,
lehrfach_id,
lehrform_kurzbz,
stundenblockung,
wochenrythmus,
start_kw,
raumtyp,
raumtypalternativ,
sprache,
lehre,
anmerkung,
unr,
lvnr,
updateamum,
updatevon,
insertamum,
insertvon
) VALUES (" . implode(', ', $values) . ");\n";
}
$lehreinheit_result = $this->delete($lehreinheit_id);
$deleteSql = "DELETE FROM lehre.tbl_lehreinheitmitarbeiter WHERE lehreinheit_id = " . $this->db->escape($lehreinheit_id) ."; \n
DELETE FROM lehre.tbl_lehreinheitgruppe WHERE lehreinheit_id = " . $this->db->escape($lehreinheit_id) ."; \n
DELETE FROM lehre.tbl_lehreinheit WHERE lehreinheit_id = " . $this->db->escape($lehreinheit_id) .";";
if (isError($lehreinheit_result))
$addError($lehreinheit_result);
$log_result = $this->LogModel->insert([
'sql' => $deleteSql,
'sqlundo' => $undosql,
'beschreibung' => 'Lehreinheit loeschen - ' . $lehreinheit_id,
'mitarbeiter_uid' => getAuthUID(),
]);
if (isError($log_result))
$addError($log_result);
if (!empty($errorReasons))
{
$this->db->trans_rollback();
return error($errorReasons);
}
$this->db->trans_commit();
return success('Contract successfully updated.');
}
private function _getGruppenCTE()
{
return "gruppen AS (
SELECT
lehreinheit_id,
STRING_AGG(
CASE
WHEN (tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL OR tbl_lehreinheitgruppe.gruppe_kurzbz = '')
THEN
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) ||
COALESCE(TRIM(tbl_lehreinheitgruppe.semester::text), '') ||
COALESCE(TRIM(tbl_lehreinheitgruppe.verband), '') ||
COALESCE(TRIM(tbl_lehreinheitgruppe.gruppe), '')
ELSE
CASE
WHEN NOT tbl_gruppe.direktinskription THEN tbl_lehreinheitgruppe.gruppe_kurzbz
ELSE NULL
END
END,
' '
) AS gruppen
FROM lehre.tbl_lehreinheitgruppe
LEFT JOIN public.tbl_studiengang USING (studiengang_kz)
LEFT JOIN public.tbl_gruppe USING (gruppe_kurzbz)
JOIN lehreinheiten USING(lehreinheit_id)
GROUP BY lehreinheit_id
)";
}
private function _getLektorenCTE()
{
return "mitarbeiter AS (
SELECT
tbl_lehreinheitmitarbeiter.lehreinheit_id,
STRING_AGG(m.kurzbz, ' ') AS lektoren,
STRING_AGG(tbl_person.vorname, ' ') AS vorname,
STRING_AGG(tbl_person.nachname, ' ') AS nachname,
STRING_AGG(tbl_lehreinheitmitarbeiter.semesterstunden::text, ' ') AS semesterstunden,
STRING_AGG(tbl_lehreinheitmitarbeiter.planstunden::text, ' ') AS le_planstunden
FROM lehre.tbl_lehreinheitmitarbeiter
JOIN public.tbl_mitarbeiter m USING (mitarbeiter_uid)
JOIN lehreinheiten USING(lehreinheit_id)
JOIN public.tbl_benutzer ON mitarbeiter_uid = uid
JOIN public.tbl_person ON tbl_benutzer.person_id = tbl_person.person_id
GROUP BY tbl_lehreinheitmitarbeiter.lehreinheit_id
)";
}
private function _getFachbereichCTE()
{
return "fachbereich AS (
SELECT
CONCAT(tbl_organisationseinheit.bezeichnung, ' (', tbl_organisationseinheit.organisationseinheittyp_kurzbz, ')') as bezeichnung,
lehreinheiten.lehreinheit_id
FROM public.tbl_organisationseinheit
JOIN lehre.tbl_lehrveranstaltung AS lehrfach ON tbl_organisationseinheit.oe_kurzbz = lehrfach.oe_kurzbz
JOIN lehre.tbl_lehreinheit ON lehrfach.lehrveranstaltung_id = tbl_lehreinheit.lehrfach_id
JOIN lehreinheiten ON tbl_lehreinheit.lehreinheit_id = lehreinheiten.lehreinheit_id
)";
}
private function _getTagsCTE()
{
$this->load->config('lvverwaltung');
$tags = $this->config->item('tags');
$whereTags = '';
if (is_array($tags) && !isEmptyArray($tags))
{
$tags = array_keys($tags);
foreach ($tags as $key => $tag)
{
$tags[$key] = $this->db->escape($tag);
}
$whereTags = " AND tbl_notiz_typ.typ_kurzbz IN (" . implode(",", $tags) . ")";
}
return "tag_data_agg AS (
SELECT
lehreinheit_id,
COALESCE(json_agg(tag ORDER BY done), '[]'::json) AS tags
FROM (
SELECT DISTINCT ON (public.tbl_notiz.notiz_id)
tbl_notiz.notiz_id AS id,
typ_kurzbz,
array_to_json(tbl_notiz_typ.bezeichnung_mehrsprachig)->>0 AS beschreibung,
text AS notiz,
style,
erledigt AS done,
lehreinheit_id
FROM public.tbl_notizzuordnung
JOIN public.tbl_notiz ON tbl_notizzuordnung.notiz_id = tbl_notiz.notiz_id
JOIN public.tbl_notiz_typ ON tbl_notiz.typ = tbl_notiz_typ.typ_kurzbz
WHERE lehreinheit_id IN (SELECT lehreinheit_id FROM lehreinheiten)"
. $whereTags.
") AS tag
GROUP BY lehreinheit_id
)";
}
} }
@@ -14,6 +14,7 @@ class Lehreinheitgruppe_model extends DB_Model
$this->load->model('organisation/studiengang_model', 'StudiengangModel'); $this->load->model('organisation/studiengang_model', 'StudiengangModel');
$this->load->model('organisation/gruppe_model', 'GruppeModel'); $this->load->model('organisation/gruppe_model', 'GruppeModel');
$this->load->model('person/benutzergruppe_model', 'BenutzergruppeModel'); $this->load->model('person/benutzergruppe_model', 'BenutzergruppeModel');
$this->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
} }
/** /**
@@ -23,7 +24,15 @@ class Lehreinheitgruppe_model extends DB_Model
*/ */
public function getDirectGroup($lehreinheit_id) public function getDirectGroup($lehreinheit_id)
{ {
$this->addSelect('tbl_lehreinheitgruppe.*');
$this->addSelect('tbl_gruppe.*');
$this->addSelect('uid');
$this->addSelect('vorname');
$this->addSelect('nachname');
$this->addJoin('public.tbl_gruppe', 'gruppe_kurzbz'); $this->addJoin('public.tbl_gruppe', 'gruppe_kurzbz');
$this->addJoin('public.tbl_benutzergruppe', 'gruppe_kurzbz', 'LEFT');
$this->addJoin('public.tbl_benutzer', 'uid', 'LEFT');
$this->addJoin('public.tbl_person', 'person_id', 'LEFT');
return $this->loadWhere( return $this->loadWhere(
array( array(
'tbl_gruppe.direktinskription' => true, 'tbl_gruppe.direktinskription' => true,
@@ -264,4 +273,209 @@ class Lehreinheitgruppe_model extends DB_Model
} }
return $result; return $result;
} }
public function addGroup($lehreinheit_id, $gid, $verband)
{
$lehreinheit = $this->LehreinheitModel->load($lehreinheit_id);
if (!hasData($lehreinheit))
return error ('No Lehreinheit found!');
if ($verband === false)
{
$gruppen_result = $this->GruppeModel->loadWhere(array('gid' => $gid));
if (!hasData($gruppen_result))
return error('No group found for gid ' . $gid);
$gruppen_array = getData($gruppen_result)[0];
if (!isEmptyString($gruppen_array->gruppe_kurzbz))
{
$this->db->where('trim(gruppe_kurzbz)', $gruppen_array->gruppe_kurzbz);
}
else
{
$this->db->group_start();
$this->db->where("trim(gruppe_kurzbz) = ''");
$this->db->or_where("gruppe_kurzbz IS NULL");
$this->db->group_end();
}
}
else if ($verband === true)
{
$gruppen_result = $this->LehrverbandModel->loadWhere(array('gid' => $gid));
if (!hasData($gruppen_result))
return error('No group found for gid ' . $gid);
$gruppen_array = getData($gruppen_result)[0];
if (!isEmptyString($gruppen_array->verband))
{
$this->db->where('verband', $gruppen_array->verband);
}
else
{
$this->db->group_start();
$this->db->where("trim(verband) = ''");
$this->db->or_where("verband IS NULL");
$this->db->group_end();
}
if (!isEmptyString($gruppen_array->gruppe))
{
$this->db->where('gruppe', $gruppen_array->gruppe);
}
else
{
$this->db->group_start();
$this->db->where("trim(gruppe) = ''");
$this->db->or_where("gruppe IS NULL");
$this->db->group_end();
}
}
else
return error('Wrong type of verband');
$this->db->where('lehreinheit_id', $lehreinheit_id);
$this->db->where('studiengang_kz', $gruppen_array->studiengang_kz);
if (!isEmptyString($gruppen_array->semester))
{
$this->db->where('semester', $gruppen_array->semester);
}
else
{
$this->db->group_start();
$this->db->where("semester = ''");
$this->db->or_where("semester IS NULL");
$this->db->group_end();
}
$exist_result = $this->load();
if (!hasData($exist_result))
{
$new_group_result = $this->insert(array(
'lehreinheit_id' => $lehreinheit_id,
'studiengang_kz' => $gruppen_array->studiengang_kz,
'gruppe_kurzbz' => isset($gruppen_array->gruppe_kurzbz) ? $gruppen_array->gruppe_kurzbz : null,
'semester' => $gruppen_array->semester,
'verband' => isset($gruppen_array->verband) && !isEmptyString($gruppen_array->verband) ? $gruppen_array->verband : null,
'gruppe' => isset($gruppen_array->gruppe) && !isEmptyString($gruppen_array->gruppe) ? $gruppen_array->gruppe : null,
'insertamum' => date('Y-m-d H:i:s'),
'insertvon' => getAuthUID()
));
if (isError($new_group_result))
return error('Error when adding Group');
return success('Group assigned successfully to Lehreinheit');
}
else
return error('Group already assigned');
}
public function deleteGroup($lehreinheit_id, $lehreinheitgruppe_id)
{
$lehreinheit = $this->LehreinheitModel->load($lehreinheit_id);
if (!hasData($lehreinheit))
return error ('No Lehreinheit found!');
$lehreinheitgruppe = $this->load($lehreinheitgruppe_id);
if (!hasData($lehreinheitgruppe))
return error ('No Lehreinheitgruppe found!');
$this->addSelect('stundenplandev_id');
$this->addJoin('lehre.tbl_stundenplandev',
"tbl_stundenplandev.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
AND tbl_stundenplandev.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
AND tbl_stundenplandev.semester = tbl_lehreinheitgruppe.semester
AND trim(COALESCE(tbl_stundenplandev.verband, '')) = trim(COALESCE(tbl_lehreinheitgruppe.verband, ''))
AND trim(COALESCE(tbl_stundenplandev.gruppe, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe, ''))
AND trim(COALESCE(tbl_stundenplandev.gruppe_kurzbz, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, ''))"
);
$stundenplan_result = $this->loadWhere(array('tbl_lehreinheitgruppe.lehreinheitgruppe_id' => $lehreinheitgruppe_id));
if (hasData($stundenplan_result))
return error('Gruppe already verplant');
$delete_result = $this->delete($lehreinheitgruppe_id);
if (isError($delete_result))
return error('Error deleting Group');
return success('Group deleted');
}
public function getByLehreinheit($lehreinheit_id)
{
$lehreinheit = $this->LehreinheitModel->load($lehreinheit_id);
if (!hasData($lehreinheit))
return error ('No Lehreinheit found!');
$this->addSelect('tbl_lehreinheitgruppe.*');
$this->addSelect('tbl_gruppe.direktinskription');
$this->addSelect('tbl_gruppe.gruppe_kurzbz');
$this->addSelect("CASE
WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN
COALESCE (
UPPER(tbl_studiengang.typ || tbl_studiengang.kurzbz) ||
COALESCE(tbl_lehreinheitgruppe.semester::varchar, '') ||
COALESCE(tbl_lehreinheitgruppe.verband::varchar, '') ||
COALESCE(tbl_lehreinheitgruppe.gruppe, ''),
'')
ELSE tbl_lehreinheitgruppe.gruppe_kurzbz
END AS bezeichnung");
$this->addSelect("CASE
WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN
(
SELECT bezeichnung
FROM public.tbl_lehrverband
WHERE studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
AND semester = tbl_lehreinheitgruppe.semester
AND verband = tbl_lehreinheitgruppe.verband
AND gruppe = tbl_lehreinheitgruppe.gruppe
LIMIT 1
)
ELSE tbl_gruppe.beschreibung
END AS beschreibung");
$this->addSelect("CASE
WHEN tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL THEN
(
SELECT EXISTS (
SELECT 1
FROM lehre.tbl_stundenplandev
WHERE lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
AND studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
AND semester = tbl_lehreinheitgruppe.semester
AND TRIM(COALESCE(verband, '')) = TRIM(tbl_lehreinheitgruppe.verband)
AND TRIM(COALESCE(gruppe, '')) = TRIM(tbl_lehreinheitgruppe.gruppe)
AND (gruppe_kurzbz IS NULL OR gruppe_kurzbz = '')
)
)
ELSE
(
SELECT EXISTS (
SELECT 1
FROM lehre.tbl_stundenplandev
WHERE lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
AND gruppe_kurzbz = tbl_lehreinheitgruppe.gruppe_kurzbz
)
)
END AS verplant");
$this->addJoin('tbl_studiengang', 'studiengang_kz', 'LEFT');
$this->addJoin('public.tbl_gruppe', 'gruppe_kurzbz', 'LEFT');
$this->db->where('lehreinheit_id', $lehreinheit_id);
$this->db->group_start()
->where('tbl_gruppe.direktinskription !=', true)
->or_where('tbl_gruppe.direktinskription IS NULL')
->group_end();
return $this->load();
}
} }
@@ -10,6 +10,14 @@ class Lehreinheitmitarbeiter_model extends DB_Model
parent::__construct(); parent::__construct();
$this->dbTable = 'lehre.tbl_lehreinheitmitarbeiter'; $this->dbTable = 'lehre.tbl_lehreinheitmitarbeiter';
$this->pk = array('mitarbeiter_uid', 'lehreinheit_id'); $this->pk = array('mitarbeiter_uid', 'lehreinheit_id');
$this->hasSequence = false;
$this->load->model('accounting/Vertrag_model', 'VertragModel');
$this->load->model('ressource/stundenplandev_model', 'StundenplandevModel');
$this->load->model('ressource/stundenplan_model', 'StundenplanModel');
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
} }
/** /**
@@ -75,4 +83,67 @@ class Lehreinheitmitarbeiter_model extends DB_Model
]); ]);
} }
public function getLektorenByLe($lehreinheit_id)
{
$this->addSelect('vorname, nachname, tbl_lehreinheitmitarbeiter.*, stundenplan.verplant');
$this->addJoin('tbl_benutzer', 'uid = mitarbeiter_uid');
$this->addJoin('tbl_person', 'person_id');
$this->addJoin('(
SELECT 1 as verplant, lehreinheit_id, mitarbeiter_uid
FROM lehre.tbl_stundenplandev
GROUP BY lehreinheit_id, mitarbeiter_uid
) stundenplan', 'stundenplan.mitarbeiter_uid = tbl_lehreinheitmitarbeiter.mitarbeiter_uid AND stundenplan.lehreinheit_id = tbl_lehreinheitmitarbeiter.lehreinheit_id', 'LEFT');
return $this->loadWhere(array('tbl_lehreinheitmitarbeiter.lehreinheit_id' => $lehreinheit_id));
}
public function getByLeLektor($lehreinheit_id, $mitarbeiter_uid)
{
$this->addSelect('vorname, nachname, tbl_lehreinheitmitarbeiter.*');
$this->addJoin('tbl_benutzer', 'uid = mitarbeiter_uid');
$this->addJoin('tbl_person', 'person_id');
return $this->loadWhere(array('tbl_lehreinheitmitarbeiter.lehreinheit_id' => $lehreinheit_id, 'tbl_lehreinheitmitarbeiter.mitarbeiter_uid' => $mitarbeiter_uid));
}
public function deleteLektorFromLe($lehreinheit_id, $mitarbeiter_uid)
{
if (defined('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN') && FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN)
{
$vertrag_result = $this->VertragModel->getVertrag($mitarbeiter_uid, $lehreinheit_id);
if (hasData($vertrag_result))
return error("Loeschen nur nach Stornierung des Vertrags möglich");
}
$stundenplandev_result = $this->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
$stundenplan_result = $this->StundenplanModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
if (hasData($stundenplandev_result) || hasData($stundenplan_result))
return error("Diese/r LektorIn kann nicht gelöscht werden da er schon verplant ist");
$result = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
if (hasData($result))
{
$le_mitarbeiter_array = getData($result)[0];
if ($le_mitarbeiter_array->vertrag_id !== null)
{
$vertrag_result = $this->VertragModel->deleteVertrag($le_mitarbeiter_array->vertrag_id);
if (isError($vertrag_result))
return $vertrag_result;
}
$delete_result = $this->delete(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
if (isError($delete_result))
return $delete_result;
return success($delete_result);
}
}
} }
@@ -1019,4 +1019,240 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($qry, $params); return $this->execQuery($qry, $params);
} }
public function getLvsByOrganization($oe_kurzbz)
{
$qry="
SELECT
distinct on (lehrveranstaltung_id)
tbl_lehrveranstaltung.studiengang_kz as lv_studiengang_kz, tbl_lehrveranstaltung.semester as lv_semester,
tbl_lehrveranstaltung.kurzbz as lv_kurzbz, tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, tbl_lehrveranstaltung.ects as lv_ects,
tbl_lehrveranstaltung.lehreverzeichnis as lv_lehreverzeichnis, tbl_lehrveranstaltung.planfaktor as lv_planfaktor,
tbl_lehrveranstaltung.planlektoren as lv_planlektoren, tbl_lehrveranstaltung.planpersonalkosten as lv_planpersonalkosten,
tbl_lehrveranstaltung.plankostenprolektor as lv_plankostenprolektor, tbl_lehrveranstaltung.orgform_kurzbz as lv_orgform_kurzbz,
tbl_lehrveranstaltung.lehrveranstaltung_id,
tbl_lehrveranstaltung.lehrform_kurzbz as lehrform_kurzbz,
tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz,
tbl_lehrveranstaltung.bezeichnung_english as lv_bezeichnung_english,
tbl_lehrveranstaltung.studiengang_kz, tbl_lehrveranstaltung.semester, tbl_lehrveranstaltung.anmerkung, tbl_lehrveranstaltung.sprache, tbl_lehrveranstaltung.semesterstunden,
tbl_lehrveranstaltung.lehre, tbl_lehrveranstaltung.aktiv,
'' as studienplan_id, '' as studienplan_bezeichnung, tbl_lehrveranstaltung.lehrtyp_kurzbz
FROM
lehre.tbl_lehrveranstaltung
WHERE
tbl_lehrveranstaltung.oe_kurzbz= ?
AND tbl_lehrveranstaltung.aktiv
";
return $this->execReadOnlyQuery($qry, array($oe_kurzbz));
}
public function getLvsByFachbereich($fachbereich, $studiensemester_kurbz, $mitarbeiter_uid = null)
{
$qry = "";
if (!is_null($mitarbeiter_uid))
{
$qry = $this->getLvsFromStudienplanByEmp();
$params = array($fachbereich, $studiensemester_kurbz);
}
$qry .= "SELECT
distinct on(lehrveranstaltung_id)
lv_studiengang_kz, lv_semester, lv_kurzbz, lv_bezeichnung, lv_ects,
lv_lehreverzeichnis, lv_planfaktor, lv_planlektoren, lv_planpersonalkosten,
lv_plankostenprolektor, lv_orgform_kurzbz, lehrveranstaltung_id,
lehrform_kurzbz, lv_lehrform_kurzbz, lv_bezeichnung_english, studiengang_kz, semester, anmerkung, sprache, semesterstunden,
lehre, aktiv,
'' as studienplan_id, '' as studienplan_bezeichnung,
(SELECT lehrtyp_kurzbz FROM lehre.tbl_lehrveranstaltung WHERE lehrveranstaltung_id=vw_lehreinheit.lehrveranstaltung_id) as lehrtyp_kurzbz
FROM
campus.vw_lehreinheit
WHERE studiensemester_kurzbz = ?
AND fachbereich_kurzbz = ?";
$params[] = array($studiensemester_kurbz, $fachbereich);
if (!is_null($mitarbeiter_uid))
{
$qry .= " AND mitarbeiter_uid = ?";
$params[] = $mitarbeiter_uid;
}
else
{
$qry.=" AND lehrveranstaltung_id NOT IN (SELECT lehrveranstaltung_id
FROM
lehre.tbl_lehrveranstaltung
JOIN lehre.tbl_studienplan_lehrveranstaltung USING(lehrveranstaltung_id)
JOIN lehre.tbl_studienplan USING(studienplan_id)
JOIN lehre.tbl_studienordnung USING(studienordnung_id)
JOIN lehre.tbl_studienplan_semester USING(studienplan_id)
WHERE
tbl_lehrveranstaltung.oe_kurzbz=(Select oe_kurzbz from public.tbl_fachbereich where fachbereich_kurzbz= ?)
AND tbl_studienplan_semester.studiensemester_kurzbz= ?";
$params[] = array($fachbereich, $studiensemester_kurbz);
}
return $this->execReadOnlyQuery($qry, $params);
}
private function getLvsFromStudienplanByEmp()
{
return "
SELECT
distinct on (lehrveranstaltung_id)
tbl_lehrveranstaltung.studiengang_kz as lv_studiengang_kz,
tbl_lehrveranstaltung.semester as lv_semester,
tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
tbl_lehrveranstaltung.ects as lv_ects,
tbl_lehrveranstaltung.lehreverzeichnis as lv_lehreverzeichnis,
tbl_lehrveranstaltung.planfaktor as lv_planfaktor,
tbl_lehrveranstaltung.planlektoren as lv_planlektoren,
tbl_lehrveranstaltung.planpersonalkosten as lv_planpersonalkosten,
tbl_lehrveranstaltung.plankostenprolektor as lv_plankostenprolektor,
tbl_lehrveranstaltung.orgform_kurzbz as lv_orgform_kurzbz,
tbl_lehrveranstaltung.lehrveranstaltung_id,
tbl_lehrveranstaltung.lehrform_kurzbz as lehrform_kurzbz,
tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz,
tbl_lehrveranstaltung.bezeichnung_english as lv_bezeichnung_english,
tbl_lehrveranstaltung.studiengang_kz,
tbl_studienplan_lehrveranstaltung.semester,
tbl_lehrveranstaltung.anmerkung,
tbl_lehrveranstaltung.sprache,
tbl_lehrveranstaltung.semesterstunden,
tbl_lehrveranstaltung.lehre,
tbl_lehrveranstaltung.aktiv,
tbl_studienplan.studienplan_id::text,
tbl_studienplan.bezeichnung as studienplan_bezeichnung,
tbl_lehrveranstaltung.lehrtyp_kurzbz
FROM
lehre.tbl_lehrveranstaltung
JOIN lehre.tbl_studienplan_lehrveranstaltung USING(lehrveranstaltung_id)
JOIN lehre.tbl_studienplan USING(studienplan_id)
JOIN lehre.tbl_studienordnung USING(studienordnung_id)
JOIN lehre.tbl_studienplan_semester USING(studienplan_id)
WHERE
tbl_lehrveranstaltung.oe_kurzbz=(Select oe_kurzbz from public.tbl_fachbereich where fachbereich_kurzbz= ?)
AND tbl_studienplan_semester.studiensemester_kurzbz = ?
AND tbl_lehrveranstaltung.aktiv
UNION
";
}
public function getLvsByStudiengang($studienplan_ids, $placeholders, $only_ids, $studiengang_kz, $studiensemester_kurzbz, $semester = null, $verband = null)
{
$qry = "";
$params = array();
if (!empty($studienplan_ids))
{
$qry = $this->getLvsFromStudienplanByStudienplanID($placeholders);
$params = $studienplan_ids;
}
$qry .= "
SELECT DISTINCT on(lehrveranstaltung_id) lehrveranstaltung_id,
tbl_lehrveranstaltung.kurzbz as lv_kurzbz,
tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung,
tbl_lehrveranstaltung.bezeichnung_english as lv_bezeichnung_english,
studiengang_kz,
semester,
tbl_lehrveranstaltung.sprache,
ects as lv_ects,
semesterstunden,
tbl_lehrveranstaltung.anmerkung,
tbl_lehrveranstaltung.lehre,
lehreverzeichnis as lv_lehreverzeichnis,
tbl_lehrveranstaltung.aktiv,
planfaktor as lv_planfaktor,
planlektoren as lv_planlektoren,
planpersonalkosten as lv_planpersonalkosten,
plankostenprolektor as lv_plankostenprolektor,
tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz,
tbl_lehrveranstaltung.orgform_kurzbz,
''::text as studienplan_id,
'' as studienplan_bezeichnung,
'' as studienplan_lehrveranstaltung_id_parent,
tbl_lehrveranstaltung.lehrtyp_kurzbz,
UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang
FROM lehre.tbl_lehrveranstaltung
JOIN lehre.tbl_lehreinheit USING (lehrveranstaltung_id)
JOIN public.tbl_studiengang USING(studiengang_kz)
WHERE studiengang_kz = ?
AND studiensemester_kurzbz = ?
";
$params[] = $studiengang_kz;
$params[] = $studiensemester_kurzbz;
if (!is_null($semester))
{
$qry .= ' AND semester = ?';
$params[] = $semester;
}
if (!is_null($verband))
{
$qry .= ' AND (tbl_lehrveranstaltung.orgform_kurzbz = ? OR tbl_lehrveranstaltung.orgform_kurzbz IS NULL)';
$params[] = $verband;
}
if (!empty($only_ids))
{
$qry .= ' AND NOT EXISTS (SELECT 1 FROM lehre.tbl_studienplan_lehrveranstaltung where studienplan_id IN ?
AND lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND tbl_lehrveranstaltung.aktiv)';
$params[] = $only_ids;
}
return $this->execReadOnlyQuery($qry, $params);
}
private function getLvsFromStudienplanByStudienplanID($placeholders)
{
return "
SELECT
lehrveranstaltung_id, tbl_lehrveranstaltung.kurzbz as lv_kurzbz, tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, bezeichnung_english as lv_bezeichnung_english, studiengang_kz,
tbl_studienplan_lehrveranstaltung.semester, tbl_lehrveranstaltung.sprache,
ects as lv_ects, semesterstunden, anmerkung, lehre, lehreverzeichnis as lv_lehreverzeichnis, tbl_lehrveranstaltung.aktiv,
planfaktor as lv_planfaktor, planlektoren as lv_planlektoren, planpersonalkosten as lv_planpersonalkosten,
plankostenprolektor as lv_plankostenprolektor, lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.orgform_kurzbz,
tbl_studienplan_lehrveranstaltung.studienplan_id::text as studienplan_id, tbl_studienplan.bezeichnung as studienplan_bezeichnung, tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent::text,
tbl_lehrveranstaltung.lehrtyp_kurzbz, UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang
FROM
lehre.tbl_lehrveranstaltung
JOIN lehre.tbl_studienplan_lehrveranstaltung USING(lehrveranstaltung_id)
JOIN lehre.tbl_studienplan USING(studienplan_id)
JOIN tbl_studiengang USING(studiengang_kz)
WHERE
tbl_lehrveranstaltung.aktiv AND ((studienplan_id, tbl_studienplan_lehrveranstaltung.semester) IN ( " . implode(',', $placeholders) . "))
UNION
";
}
public function getAllOe($lv_id)
{
$qry = "SELECT DISTINCT oe_kurzbz
FROM lehre.tbl_studienplan_lehrveranstaltung
JOIN lehre.tbl_studienplan USING(studienplan_id)
JOIN lehre.tbl_studienordnung USING(studienordnung_id)
JOIN public.tbl_studiengang USING(studiengang_kz)
WHERE lehrveranstaltung_id = ?
UNION
(
SELECT oe_kurzbz
FROM public.tbl_studiengang
WHERE studiengang_kz = (
SELECT tbl_lehrveranstaltung.studiengang_kz
FROM lehre.tbl_lehrveranstaltung
WHERE lehrveranstaltung_id = ?
)
)
";
$params = array($lv_id, $lv_id);
return $this->execReadOnlyQuery($qry, $params);
}
} }
@@ -213,4 +213,34 @@ class Organisationseinheit_model extends DB_Model
return $result; return $result;
} }
/**
* Ermittelt die Stundenobergrenze fuer Lektoren
* Dabei wird im OE Baum nach oben nach Stundengrenzen gesucht und die niedrigste Stundengrenze ermittelt
* @param $oe_kurzbz Organisationseinheit
* @param $fixangestellt boolean legt fest ob die Grenze
* fuer Freie oder Fixangestellte Lektoren ermittelt werden soll
*/
public function getStundengrenze($oe_kurzbz, $fixangestellt = true)
{
$fixfrei = $fixangestellt ? 'fix' : 'frei';
$qry = "
WITH RECURSIVE oes(oe_kurzbz, oe_parent_kurzbz) as
(
SELECT oe_kurzbz, oe_parent_kurzbz FROM public.tbl_organisationseinheit
WHERE oe_kurzbz= ?
UNION ALL
SELECT o.oe_kurzbz, o.oe_parent_kurzbz FROM public.tbl_organisationseinheit o, oes
WHERE o.oe_kurzbz=oes.oe_parent_kurzbz
)
SELECT oe_kurzbz, warn_semesterstunden_{$fixfrei} AS stunden
FROM oes
JOIN public.tbl_organisationseinheit USING (oe_kurzbz)
ORDER BY warn_semesterstunden_{$fixfrei} ASC
LIMIT 1";
return $this->execReadOnlyQuery($qry, array($oe_kurzbz));
}
} }
@@ -107,6 +107,8 @@ class Studienplan_model extends DB_Model
)); ));
} }
// Deprecated
// im Lehrveranstaltung_model vorhanden
public function getAllOesForLv($lehrveranstaltung_id) public function getAllOesForLv($lehrveranstaltung_id)
{ {
$this->addDistinct('oe_kurzbz'); $this->addDistinct('oe_kurzbz');
@@ -135,6 +137,27 @@ class Studienplan_model extends DB_Model
]); ]);
} }
public function loadStudienplanLehrveranstaltung($lv_id)
{
$qry = "SELECT studienplan_lehrveranstaltung_id,
semester,
pflicht,
studienplan_id,
koordinator,
studienplan_lehrveranstaltung_id_parent,
lehrveranstaltung_id,
insertamum,
insertvon,
updateamum,
updatevon,
sort,
curriculum,
export
FROM lehre.tbl_studienplan_lehrveranstaltung WHERE studienplan_lehrveranstaltung_id = ? ";
return $this->execReadOnlyQuery($qry, array($lv_id));
}
public function getStudienplaeneForPerson($person_id) public function getStudienplaeneForPerson($person_id)
{ {
$this->addDistinct(); $this->addDistinct();
@@ -0,0 +1,42 @@
<?php
class Kontaktverifikation_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'public.tbl_kontakt_verifikation';
$this->pk = 'kontakt_verifikation_id';
}
/**
* Gets contact verification for a person and a verification code
* @param person_id
* @param kontakttyp
* @param verifikation_code
* @param expiration_days number of days after which verifikation code expires
* @return object success or error
*/
public function getKontaktVerifikation($person_id, $kontakttyp, $verifikation_code, $expiration_days = 1)
{
$qry = "
SELECT
kt.kontakt_id,
kv.verifikation_code
FROM
public.tbl_kontakt_verifikation kv
JOIN public.tbl_kontakt kt USING(kontakt_id)
WHERE kt.person_id = ?
AND kt.kontakttyp = ?
AND kv.verifikation_code = ?
AND kv.erstelldatum >= NOW() - INTERVAL '".$this->escape($expiration_days)." days'
ORDER BY
kt.kontakt_id DESC
LIMIT 1";
return $this->execQuery($qry, array($person_id, $kontakttyp, $verifikation_code));
}
}
+7 -3
View File
@@ -151,7 +151,7 @@ class Notiz_model extends DB_Model
* bestellung_id, lehreinheit_id, anrechnung_id, uid) * bestellung_id, lehreinheit_id, anrechnung_id, uid)
* @param $id the corresponding id, part of public.tbl_notizzuordnung * @param $id the corresponding id, part of public.tbl_notizzuordnung
*/ */
public function getNotizWithDocEntries($id, $type) public function getNotizWithDocEntries($id, $type, $withoutTags = true)
{ {
$qry = " $qry = "
SELECT SELECT
@@ -195,8 +195,12 @@ class Notiz_model extends DB_Model
LEFT JOIN LEFT JOIN
public.tbl_person person_bearbeiter ON (person_bearbeiter.person_id = p_bearbeiter.person_id) public.tbl_person person_bearbeiter ON (person_bearbeiter.person_id = p_bearbeiter.person_id)
WHERE WHERE
z.$type = ? z.$type = ?";
GROUP BY
if ($withoutTags)
$qry .= " AND n.typ IS NULL ";
$qry .= "GROUP BY
notiz_id, z.notizzuordnung_id, notiz_id, z.notizzuordnung_id,
person_verfasser.vorname, person_verfasser.nachname, person_verfasser.vorname, person_verfasser.nachname,
person_bearbeiter.vorname, person_bearbeiter.nachname person_bearbeiter.vorname, person_bearbeiter.nachname
+52 -64
View File
@@ -307,72 +307,60 @@ class Person_model extends DB_Model
public function checkDuplicate($person_id) public function checkDuplicate($person_id)
{ {
$qry = "SELECT person_id $qry = "
FROM public.tbl_prestudent p WITH person AS (
JOIN SELECT *
( FROM public.tbl_person
SELECT DISTINCT ON(prestudent_id) * WHERE person_id = ?
FROM public.tbl_prestudentstatus ),
WHERE prestudent_id IN allePersonen AS (
( SELECT p.person_id
SELECT prestudent_id FROM public.tbl_person p
FROM public.tbl_prestudent JOIN person
WHERE person_id IN ON lower(p.vorname) = lower(person.vorname)
( AND lower(p.nachname) = lower(person.nachname)
SELECT p2.person_id AND p.gebdatum = person.gebdatum
FROM public.tbl_person p ),
JOIN public.tbl_person p2 lastStatus AS (
ON lower(p.vorname) = lower(p2.vorname) SELECT DISTINCT ON (tbl_prestudentstatus.prestudent_id)
AND lower(p.nachname) = lower(p2.nachname) tbl_prestudentstatus.prestudent_id,
AND p.gebdatum = p2.gebdatum tbl_prestudentstatus.status_kurzbz,
AND p.person_id = ? tbl_prestudent.studiengang_kz,
) tbl_prestudent.person_id
) FROM public.tbl_prestudentstatus
ORDER BY prestudent_id, datum DESC, insertamum DESC JOIN public.tbl_prestudent USING (prestudent_id)
) ps USING(prestudent_id) WHERE tbl_prestudent.person_id IN (SELECT person_id FROM allePersonen)
JOIN public.tbl_status USING(status_kurzbz) ORDER BY tbl_prestudentstatus.prestudent_id, tbl_prestudentstatus.datum DESC, tbl_prestudentstatus.insertamum DESC
),
interessenten AS (
SELECT *
FROM lastStatus
WHERE status_kurzbz = 'Interessent' WHERE status_kurzbz = 'Interessent'
AND studiengang_kz IN ),
( keineInteressenten AS (
SELECT studiengang_kz SELECT *
FROM public.tbl_prestudent p FROM lastStatus
JOIN WHERE status_kurzbz != 'Interessent'
( ),
SELECT DISTINCT ON(prestudent_id) * doppeltePerson AS (
FROM public.tbl_prestudentstatus
WHERE prestudent_id IN
(
SELECT prestudent_id
FROM public.tbl_prestudent
WHERE person_id IN
(
SELECT p2.person_id
FROM public.tbl_person p
JOIN public.tbl_person p2
ON lower(p.vorname) = lower(p2.vorname)
AND lower(p.nachname) = lower(p2.nachname)
AND p.gebdatum = p2.gebdatum
AND p.person_id = ?
)
)
ORDER BY prestudent_id, datum DESC, insertamum DESC
) ps USING(prestudent_id)
JOIN public.tbl_status USING(status_kurzbz)
WHERE status_kurzbz = 'Abbrecher'
)
UNION
SELECT p2.person_id SELECT p2.person_id
FROM tbl_person p1 FROM public.tbl_person p1
JOIN tbl_prestudent ps ON p1.person_id = ps.person_id JOIN public.tbl_prestudent ps1 ON ps1.person_id = p1.person_id
INNER JOIN ( JOIN public.tbl_person p2
SELECT vorname, nachname, gebdatum, person.person_id ON lower(p1.vorname) = lower(p2.vorname)
FROM tbl_person person AND lower(p1.nachname) = lower(p2.nachname)
JOIN tbl_prestudent sps ON person.person_id = sps.person_id AND p1.gebdatum = p2.gebdatum
) p2 WHERE p1.person_id = ?
ON (lower(p1.vorname) = lower(p2.vorname) AND lower(p1.nachname) = lower(p2.nachname) AND p1.gebdatum = p2.gebdatum) AND p1.person_id <> p2.person_id
WHERE p1.person_id != p2.person_id AND (p1.person_id = ?)"; )
SELECT DISTINCT(interessenten.person_id)
FROM interessenten
JOIN keineInteressenten
ON interessenten.studiengang_kz = keineInteressenten.studiengang_kz
WHERE interessenten.person_id = ?
UNION
SELECT DISTINCT person_id
FROM doppeltePerson";
return $this->execQuery($qry, array($person_id, $person_id, $person_id)); return $this->execQuery($qry, array($person_id, $person_id, $person_id));
} }
@@ -63,6 +63,7 @@ class Profil_update_model extends DB_Model
$this->addSelect(["public.tbl_profil_update.*", "public.tbl_person.vorname"]); $this->addSelect(["public.tbl_profil_update.*", "public.tbl_person.vorname"]);
$this->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_profil_update.uid"); $this->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_profil_update.uid");
$this->addJoin("public.tbl_person", "public.tbl_person.person_id = public.tbl_benutzer.person_id"); $this->addJoin("public.tbl_person", "public.tbl_person.person_id = public.tbl_benutzer.person_id");
$this->db->order_by('COALESCE(public.tbl_profil_update.updateamum, public.tbl_profil_update.insertamum)', 'DESC', false);
$res = $this->loadWhere($whereClause); $res = $this->loadWhere($whereClause);
if (isError($res)) { if (isError($res)) {
return $res; return $res;
@@ -118,13 +119,47 @@ class Profil_update_model extends DB_Model
$parameters = []; $parameters = [];
$query = " $query = "
SELECT SELECT
profil_update_id, tbl_profil_update.uid, (tbl_person.vorname || ' ' || tbl_person.nachname) AS name , topic, requested_change, tbl_profil_update.updateamum, tbl_profil_update.updatevon, tbl_profil_update.insertamum, tbl_profil_update.insertvon, status, public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] as status_translated, status_timestamp, status_message, attachment_id profil_update_id,
tbl_profil_update.uid,
(tbl_person.vorname || ' ' || tbl_person.nachname) AS name ,
topic,
requested_change,
tbl_profil_update.updateamum,
tbl_profil_update.updatevon,
tbl_profil_update.insertamum,
tbl_profil_update.insertvon,
status,
public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] as status_translated,
status_timestamp,
status_message,
attachment_id,
UPPER(public.tbl_studiengang.typ || public.tbl_studiengang.kurzbz) AS studiengang,
COALESCE(of.orgform_kurzbz, public.tbl_studiengang.orgform_kurzbz) AS orgform,
NULL as oezuordnung
FROM public.tbl_profil_update FROM public.tbl_profil_update
JOIN public.tbl_profil_update_status ON public.tbl_profil_update_status.status_kurzbz = public.tbl_profil_update.status JOIN public.tbl_profil_update_status ON public.tbl_profil_update_status.status_kurzbz = public.tbl_profil_update.status
JOIN public.tbl_student ON public.tbl_student.student_uid=public.tbl_profil_update.uid JOIN public.tbl_student ON public.tbl_student.student_uid=public.tbl_profil_update.uid
JOIN public.tbl_benutzer ON public.tbl_benutzer.uid = public.tbl_student.student_uid JOIN public.tbl_benutzer ON public.tbl_benutzer.uid = public.tbl_student.student_uid
JOIN public.tbl_person ON public.tbl_benutzer.person_id=public.tbl_person.person_id JOIN public.tbl_person ON public.tbl_benutzer.person_id=public.tbl_person.person_id
JOIN public.tbl_studiengang ON public.tbl_studiengang.studiengang_kz=public.tbl_student.studiengang_kz JOIN public.tbl_studiengang ON public.tbl_studiengang.studiengang_kz=public.tbl_student.studiengang_kz
LEFT JOIN (
select
pss.prestudent_id, COALESCE(sp.orgform_kurzbz, pss.orgform_kurzbz) as orgform_kurzbz
from (
select
prestudent_id, max(insertamum) as insertamum
from
public.tbl_prestudentstatus
where
datum <= NOW()
group by
prestudent_id
) mpss
join
public.tbl_prestudentstatus pss on pss.prestudent_id = mpss.prestudent_id and pss.insertamum = mpss.insertamum
left join
lehre.tbl_studienplan sp on pss.studienplan_id = sp.studienplan_id
) of ON of.prestudent_id = public.tbl_student.prestudent_id
Where public.tbl_studiengang.oe_kurzbz IN ? "; Where public.tbl_studiengang.oe_kurzbz IN ? ";
$parameters[] = $oe_berechtigung; $parameters[] = $oe_berechtigung;
if ($whereClause) { if ($whereClause) {
@@ -144,12 +179,33 @@ class Profil_update_model extends DB_Model
} }
} }
if ($mitarbeiterBerechtigung) { if ($mitarbeiterBerechtigung) {
$this->addSelect(["profil_update_id", "tbl_profil_update.uid", "(tbl_person.vorname || ' ' || tbl_person.nachname) AS name", "topic", "requested_change", "tbl_profil_update.updateamum", "tbl_profil_update.updatevon", "tbl_profil_update.insertamum", "tbl_profil_update.insertvon", "status", "public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] AS status_translated", "status_timestamp", "status_message", "attachment_id"]); $this->addSelect([
"profil_update_id",
"tbl_profil_update.uid",
"(tbl_person.vorname || ' ' || tbl_person.nachname) AS name",
"topic",
"requested_change",
"tbl_profil_update.updateamum",
"tbl_profil_update.updatevon",
"tbl_profil_update.insertamum",
"tbl_profil_update.insertvon",
"status",
"public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] AS status_translated",
"status_timestamp",
"status_message",
"attachment_id",
"COALESCE(NULL) as studiengang",
"COALESCE(NULL) as orgform",
"oe.bezeichnung as oezuordnung"
]);
$this->addJoin('tbl_profil_update_status', 'tbl_profil_update_status.status_kurzbz=tbl_profil_update.status'); $this->addJoin('tbl_profil_update_status', 'tbl_profil_update_status.status_kurzbz=tbl_profil_update.status');
$this->addJoin('tbl_mitarbeiter', 'tbl_mitarbeiter.mitarbeiter_uid=tbl_profil_update.uid'); $this->addJoin('tbl_mitarbeiter', 'tbl_mitarbeiter.mitarbeiter_uid=tbl_profil_update.uid');
$this->addJoin('tbl_benutzer', 'tbl_benutzer.uid=tbl_profil_update.uid'); $this->addJoin('tbl_benutzer', 'tbl_benutzer.uid=tbl_profil_update.uid');
$this->addJoin('tbl_person', 'tbl_benutzer.person_id=tbl_person.person_id'); $this->addJoin('tbl_person', 'tbl_benutzer.person_id=tbl_person.person_id');
$this->addJoin('tbl_benutzerfunktion bf', 'bf.uid = tbl_benutzer.uid AND bf.funktion_kurzbz = \'oezuordnung\' AND NOW() >= COALESCE(bf.datum_von, \'1970-01-01\'::date) AND NOW() <= COALESCE(bf.datum_bis, \'2170-12-31\'::date)', 'LEFT');
$this->addJoin('tbl_organisationseinheit oe', 'oe.oe_kurzbz = bf.oe_kurzbz', 'LEFT');
$mitarbeiterRequests = $this->loadWhere($whereClause); $mitarbeiterRequests = $this->loadWhere($whereClause);
if (isError($mitarbeiterRequests)) if (isError($mitarbeiterRequests))
return error("db error: " . getData($mitarbeiterRequests)); return error("db error: " . getData($mitarbeiterRequests));
$mitarbeiterRequests = getData($mitarbeiterRequests) ?: []; $mitarbeiterRequests = getData($mitarbeiterRequests) ?: [];
@@ -179,8 +235,11 @@ class Profil_update_model extends DB_Model
private function formatProfilRequest($request) private function formatProfilRequest($request)
{ {
$request->requested_change = json_decode($request->requested_change); $request->requested_change = json_decode($request->requested_change);
$request->insertamum_iso = !is_null($request->insertamum) ? date_create($request->insertamum)->format('Y-m-d') : null;
$request->insertamum = !is_null($request->insertamum) ? date_create($request->insertamum)->format('d.m.Y') : null; $request->insertamum = !is_null($request->insertamum) ? date_create($request->insertamum)->format('d.m.Y') : null;
$request->updateamum_iso = !is_null($request->updateamum) ? date_create($request->updateamum)->format('Y-m-d') : null;
$request->updateamum = !is_null($request->updateamum) ? date_create($request->updateamum)->format('d.m.Y') : null; $request->updateamum = !is_null($request->updateamum) ? date_create($request->updateamum)->format('d.m.Y') : null;
$request->status_timestamp_iso = !is_null($request->status_timestamp) ? date_create($request->status_timestamp)->format('Y-m-d') : null;
$request->status_timestamp = !is_null($request->status_timestamp) ? date_create($request->status_timestamp)->format('d.m.Y') : null; $request->status_timestamp = !is_null($request->status_timestamp) ? date_create($request->status_timestamp)->format('d.m.Y') : null;
} }
@@ -430,4 +430,18 @@ class Mitarbeiter_model extends DB_Model
return $this->execQuery($qry, $parametersArray); return $this->execQuery($qry, $parametersArray);
} }
public function isLehrauftragFirma($mitarbeiter_uid)
{
$this->addSelect('firma_id');
$this->addJoin('public.tbl_benutzer', 'uid = mitarbeiter_uid');
$this->addJoin('public.tbl_person', 'person_id');
$this->addJoin('public.tbl_adresse', 'person_id', 'LEFT');
$this->addOrder('zustelladresse', 'DESC');
$this->addOrder('firma_id');
$this->addLimit(1);
$firma_result = $this->loadWhere(array('mitarbeiter_uid' => $mitarbeiter_uid));
$firma = getData($firma_result)[0]->firma_id;
return !is_null($firma);
}
} }
@@ -76,7 +76,7 @@ class Reservierung_model extends DB_Model
* *
* @return stdClass * @return stdClass
*/ */
public function getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz = null) public function getReservierungenMitarbeiter($start_date, $end_date)
{ {
$raum_reservierungen_query = "SELECT res.*, beginn, ende, $raum_reservierungen_query = "SELECT res.*, beginn, ende,
@@ -89,7 +89,6 @@ class Reservierung_model extends DB_Model
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde
WHERE res.uid = ? AND datum >= ? AND datum <= ?"; WHERE res.uid = ? AND datum >= ? AND datum <= ?";
// $subquery = is_null($ort_kurzbz)? $lvplan_reservierungen_query:$raum_reservierungen_query;
$subquery = $raum_reservierungen_query; $subquery = $raum_reservierungen_query;
@@ -10,6 +10,9 @@ class Stundenplandev_model extends DB_Model
parent::__construct(); parent::__construct();
$this->dbTable = 'lehre.tbl_stundenplandev'; $this->dbTable = 'lehre.tbl_stundenplandev';
$this->pk = 'stundenplandev_id'; $this->pk = 'stundenplandev_id';
$this->load->model('education/lehreinheit_model', 'LehreinheitModel');
$this->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel');
} }
@@ -157,4 +160,85 @@ class Stundenplandev_model extends DB_Model
return $this->execQuery($qry, $params); return $this->execQuery($qry, $params);
} }
public function deleteGroupPlanning($lehreinheit_id, $lehreinheitgruppe_id)
{
$lehreinheit = $this->LehreinheitModel->load($lehreinheit_id);
if (!hasData($lehreinheit))
return error ('No Lehreinheit found!');
$lehreinheitgruppe = $this->LehreinheitgruppeModel->load($lehreinheitgruppe_id);
if (!hasData($lehreinheitgruppe))
return error ('No Lehreinheitgruppe found!');
$this->addJoin('lehre.tbl_stundenplan_betriebsmittel', 'stundenplandev_id');
$this->addJoin('lehre.tbl_lehreinheitgruppe', 'lehreinheit_id');
$this->db->where('tbl_lehreinheitgruppe.lehreinheitgruppe_id', $lehreinheitgruppe_id);
$this->db->group_start();
$this->db->group_start();
$this->db->where('tbl_lehreinheitgruppe.gruppe_kurzbz IS NOT NULL', null, false);
$this->db->where('tbl_lehreinheitgruppe.gruppe_kurzbz = tbl_stundenplandev.gruppe_kurzbz', null, false);
$this->db->group_end();
$this->db->or_group_start();
$this->db->where('tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL', null, false);
$this->db->where('tbl_lehreinheitgruppe.studiengang_kz = tbl_stundenplandev.studiengang_kz', null, false);
$this->db->where('tbl_lehreinheitgruppe.semester = tbl_stundenplandev.semester', null, false);
$this->db->where('tbl_lehreinheitgruppe.verband = tbl_stundenplandev.verband', null, false);
$this->db->where('tbl_lehreinheitgruppe.gruppe = tbl_stundenplandev.gruppe', null, false);
$this->db->group_end();
$this->db->group_end();
$betriebsmittel_result = $this->load();
$betriebsmittel_array = hasData($betriebsmittel_result) ? getData($betriebsmittel_result) : array();
if (sizeof($betriebsmittel_array) > 0)
{
return error ('Gruppe kann nicht entfernt werden da bereits Ressourcen zugeordnet wurden');
}
$this->addSelect('stundenplandev_id');
$this->addJoin('lehre.tbl_lehreinheitgruppe',
"tbl_stundenplandev.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id
AND tbl_stundenplandev.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz
AND tbl_stundenplandev.semester = tbl_lehreinheitgruppe.semester
AND trim(COALESCE(tbl_stundenplandev.verband, '')) = trim(COALESCE(tbl_lehreinheitgruppe.verband, ''))
AND trim(COALESCE(tbl_stundenplandev.gruppe, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe, ''))
AND trim(COALESCE(tbl_stundenplandev.gruppe_kurzbz, '')) = trim(COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, ''))"
);
$stundenplan_result = $this->loadWhere(array('tbl_lehreinheitgruppe.lehreinheitgruppe_id' => $lehreinheitgruppe_id));
if (hasData($stundenplan_result))
{
$stundenplan_ids = array_column(getData($stundenplan_result), 'stundenplandev_id');
$this->db->where_in('stundenplandev_id', $stundenplan_ids);
$delete_result = $this->db->delete('lehre.tbl_stundenplandev');
if ($delete_result)
return success('Group deleted successfully from Stundenplandev');
else
return error('Error deleting Group from Stundenplandev');
}
}
public function deleteLektorPlanning($lehreinheit_id, $mitarbeiter_uid)
{
//TODO (david) prüfen ob der check notwendig ist
/*$this->addDistinct('mitarbeiter_uid');
$this->addSelect('mitarbeiter_uid');
$stundenplan_result = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id));
$stundenplan_array = hasData($stundenplan_result) ? (getData($stundenplan_result)) : array();
if (sizeof($stundenplan_array) <= 1)
return error('Diese/r LektorIn kann nicht aus dem LVPlan entfernt werden da dies der/die letzte verplante LektorIn ist');*/
$this->addJoin('lehre.tbl_stundenplan_betriebsmittel', 'stundenplandev_id');
$betriebsmittel_result = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'tbl_stundenplandev.mitarbeiter_uid' => $mitarbeiter_uid));
$betriebsmittel_array = hasData($betriebsmittel_result) ? getData($betriebsmittel_result) : array();
if (sizeof($betriebsmittel_array) > 0)
return error('Gruppe kann nicht entfernt werden da bereits Ressourcen zugeordnet wurden');
return $this->delete(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
}
} }
@@ -42,4 +42,20 @@ class Stundensatz_model extends DB_Model
return $this->execQuery($qry, $params); return $this->execQuery($qry, $params);
} }
public function getDefaultStundensatz($mitarbeiter_uid, $beginn, $ende = null, $typ = null)
{
$stundensatz_result = $this->getStundensatzByDatum($mitarbeiter_uid, $beginn, $ende, $typ);
$default_stundensatz = hasData($stundensatz_result) ? getData($stundensatz_result)[0]->stundensatz : null;
if (defined('FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ') && !FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ)
{
$this->load->model('vertragsbestandteil/Dienstverhaeltnis_model','DienstverhaeltnisModel');
$echterdv_result = $this->DienstverhaeltnisModel->existsDienstverhaeltnis($mitarbeiter_uid, $beginn, $ende, 'echterdv');
if (hasData($echterdv_result))
{
$default_stundensatz = null;
}
}
return $default_stundensatz;
}
} }
@@ -253,4 +253,25 @@ EOSQL;
} }
return $dvs; return $dvs;
} }
public function existsDienstverhaeltnis($mitarbeiter_uid, $start, $ende = null, $vertragsart_kurzbz = null)
{
$this->addOrder('von', 'DESC');
$this->db->where('mitarbeiter_uid', $mitarbeiter_uid);
if (!is_null($vertragsart_kurzbz))
$this->db->where('vertragsart_kurzbz', $this->escape($vertragsart_kurzbz));
$this->db->where('von <=', $ende);
if (!is_null($ende))
{
$this->db->group_start();
$this->db->where('bis >=', $start);
$this->db->or_where('bis IS NULL', null, false);
$this->db->group_end();
}
$this->addLimit(1);
return $this->load();
}
} }
+4
View File
@@ -2,10 +2,14 @@
$includesArray = array( $includesArray = array(
'title' => 'Profil Änderungen', 'title' => 'Profil Änderungen',
'vue3' => true, 'vue3' => true,
'primevue3' => true,
'bootstrap5' => true, 'bootstrap5' => true,
'fontawesome6'=> true, 'fontawesome6'=> true,
'axios027' => true, 'axios027' => true,
'tabulator5' => true, 'tabulator5' => true,
'customJSs' => array(
'vendor/moment/luxonjs/luxon.min.js'
),
'customJSModules' => array( 'customJSModules' => array(
'public/js/apps/Cis/ProfilUpdateRequests.js' 'public/js/apps/Cis/ProfilUpdateRequests.js'
), ),
+39
View File
@@ -0,0 +1,39 @@
<?php
$includesArray = array(
'title' => 'LVVerwaltung',
'axios027' => true,
'bootstrap5' => true,
'fontawesome6' => true,
'vue3' => true,
'primevue3' => true,
'tabulator6' => true,
'tinymce5' => true,
'tags' => true,
'customCSSs' => [
'public/css/components/vue-datepicker.css',
'public/css/components/primevue.css',
'public/css/Studentenverwaltung.css',
'public/css/Lvverwaltung.css'
],
'customJSModules' => [
'public/js/apps/LVVerwaltung.js'
]
);
$this->load->view('templates/FHC-Header', $includesArray);
?>
<div id="main">
<router-view
default-semester="<?= $variables['semester_aktuell']; ?>"
lv-root="<?= site_url('LVVerwaltung'); ?>"
:permissions="<?= htmlspecialchars(json_encode($permissions));?>"
:config="<?= htmlspecialchars(json_encode($configs)); ?>"
>
</router-view>
</div>
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
@@ -18,6 +18,9 @@
<?php (!isset($notiz->kurzbzlang)) ?: print_r('(' . nl2br($notiz->kurzbzlang) . ') - ') ?> <?php (!isset($notiz->kurzbzlang)) ?: print_r('(' . nl2br($notiz->kurzbzlang) . ') - ') ?>
<?php echo nl2br($notiz->text) ?> <?php echo nl2br($notiz->text) ?>
</td> </td>
<td>
<a href="mailto:<?php echo htmlspecialchars($notiz->email)?>?body=<?php echo rawurlencode($notiz->text);; ?>"><i class="fa fa-envelope"></i></a>
</td>
</tr> </tr>
<?php endforeach; ?> <?php endforeach; ?>
</tbody> </tbody>
@@ -57,7 +57,7 @@
<div class="row<?php if ($lockedbyother) echo ' alert-danger' ?>"> <div class="row<?php if ($lockedbyother) echo ' alert-danger' ?>">
<div class="col-lg-8"> <div class="col-lg-8">
<h3 class="page-header"> <h3 class="page-header">
Infocenter Details: <?php echo $stammdaten->vorname.' '.$stammdaten->nachname ?> Infocenter Details: <a target="_blank" title="Studentenverwaltung" href="<?php echo site_url('/Studentenverwaltung/' . $studiensemester . '/person/' . $stammdaten->person_id) ?>"><?php echo $stammdaten->vorname.' '.$stammdaten->nachname ?> <i class="fa fa-external-link" style="font-size:small"></i></a>
</h3> </h3>
</div> </div>
<div class="col-lg-4"> <div class="col-lg-4">
@@ -182,7 +182,7 @@
</div> </div>
<?php if (isset($stammdaten->zugangscode)): ?> <?php if (isset($stammdaten->zugangscode)): ?>
<div class="col-xs-6 text-right"> <div class="col-xs-6 text-right">
<a href="<?php echo CIS_ROOT.'addons/bewerbung/cis/registration.php?code='.html_escape($stammdaten->zugangscode).'&emailAdresse='.$lastMailAdress ?>" <a href="<?php echo CIS_ROOT.'addons/bewerbung/cis/registration.php?code='.html_escape($stammdaten->zugangscode).'&emailAdresse='.$lastMailAdress.'&keepEmailUnverified=true' ?>"
target='_blank'><i class="glyphicon glyphicon-new-window"></i>&nbsp;<?php echo $this->p->t('infocenter','zugangBewerbung') ?></a> target='_blank'><i class="glyphicon glyphicon-new-window"></i>&nbsp;<?php echo $this->p->t('infocenter','zugangBewerbung') ?></a>
</div> </div>
<?php endif; ?> <?php endif; ?>
+173 -34
View File
@@ -382,7 +382,7 @@ function writePruefungsTable(e, data, anmeldung)
} }
else if(new Date() > minimumFrist) else if(new Date() > minimumFrist)
{ {
button = "<p><a href='#' title='<?php echo $p->t('pruefung/anmeldenMoeglichBis'); ?> "+frist+"'><input style='width: 140px; background-color: green;' type='button' value='"+termin+" "+time+"' onclick='openDialog(\""+e.lehrveranstaltung[0].lehrveranstaltung_id+"\", \""+d.pruefungstermin_id+"\", \""+e.lehrveranstaltung[0].bezeichnung.replace("'", "&apos;")+"\", \""+d.von+"\", \""+d.bis+"\");'></a></p>"; button = "<p><a href='#' title='<?php echo $p->t('pruefung/anmeldenMoeglichBis'); ?> "+frist+"'><input style='width: 140px; background-color: green;' type='button' value='"+termin+" "+time+"' onclick='openDialog(\""+e.lehrveranstaltung[0].lehrveranstaltung_id+"\", \""+d.pruefungstermin_id+"\", \""+e.lehrveranstaltung[0].bezeichnung.replace("'", "&apos;")+"\", \""+d.von+"\", \""+d.bis+"\", \""+e.lehrveranstaltung[0].ects +"\");'></a></p>";
} }
} }
else else
@@ -479,13 +479,15 @@ function showPruefungsDetails(prfId, lvId)
* @param {type} lvBezeichnung Bezeichnung der Lehrveranstaltung * @param {type} lvBezeichnung Bezeichnung der Lehrveranstaltung
* @param {type} terminVon Beginn der Prüfung * @param {type} terminVon Beginn der Prüfung
* @param {type} terminBis Ende der Prüfung * @param {type} terminBis Ende der Prüfung
* @param {type} ects der LV
* @returns {undefined} * @returns {undefined}
*/ */
function openDialog(lehrveranstaltung_id, termin_id, lvBezeichnung, terminVon, terminBis) function openDialog(lehrveranstaltung_id, termin_id, lvBezeichnung, terminVon, terminBis, ects)
{ {
$("#lehrveranstaltungHidden").val(lehrveranstaltung_id); $("#lehrveranstaltungHidden").val(lehrveranstaltung_id);
$("#terminHidden").val(termin_id); $("#terminHidden").val(termin_id);
$("#lehrveranstaltung").html(lvBezeichnung); $("#lehrveranstaltung").html(lvBezeichnung);
$("#ectsangabe").val(ects);
$.ajax({ $.ajax({
dataType: 'json', dataType: 'json',
@@ -582,6 +584,12 @@ function saveAnmeldung(lehrveranstaltung_id, termin_id)
if($('#prestudent_studiengang').length) if($('#prestudent_studiengang').length)
studiengang_kz = $('#prestudent_studiengang option:selected').val(); studiengang_kz = $('#prestudent_studiengang option:selected').val();
var ects = null;
if ($('#ectsangabe').length)
{
ects = $('#ectsangabe').val();
}
$.ajax({ $.ajax({
dataType: 'json', dataType: 'json',
url: "./pruefungsanmeldung.json.php", url: "./pruefungsanmeldung.json.php",
@@ -593,7 +601,8 @@ function saveAnmeldung(lehrveranstaltung_id, termin_id)
bemerkung: bemerkungen, bemerkung: bemerkungen,
uid: uid, uid: uid,
studienverpflichtung_id: studienverpflichtung_id, studienverpflichtung_id: studienverpflichtung_id,
studiengang_kz: studiengang_kz studiengang_kz: studiengang_kz,
ects: ects
}, },
error: loadError, error: loadError,
success: function(data){ success: function(data){
@@ -804,6 +813,7 @@ function writeAnmeldungen(data, showMessage = true)
var pruefung_id = data.result.anmeldungen[0].pruefung_id; var pruefung_id = data.result.anmeldungen[0].pruefung_id;
var lehrveranstaltung_id = data.result.anmeldungen[0].lehrveranstaltung_id; var lehrveranstaltung_id = data.result.anmeldungen[0].lehrveranstaltung_id;
var ort_kurzbz = data.result.ort_kurzbz; var ort_kurzbz = data.result.ort_kurzbz;
var anderer_raum = data.result.anderer_raum;
var lv_bezeichnung = data.result.lv_bezeichnung; var lv_bezeichnung = data.result.lv_bezeichnung;
var lv_lehrtyp = data.result.lv_lehrtyp; var lv_lehrtyp = data.result.lv_lehrtyp;
var prf_termin = data.result.datum; var prf_termin = data.result.datum;
@@ -816,24 +826,33 @@ function writeAnmeldungen(data, showMessage = true)
count++; count++;
var vorname = d.student.vorname !== "null" ? d.student.vorname : ""; var vorname = d.student.vorname !== "null" ? d.student.vorname : "";
var nachname = d.student.nachname !== "null" ? d.student.nachname : ""; var nachname = d.student.nachname !== "null" ? d.student.nachname : "";
let ects = "";
<?php if (defined('CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE') && (CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE === true)): ?>
ects = d.ects !== null ? "(" + d.ects + " ECTS) ": "";
<?php endif; ?>
switch(d.status_kurzbz) switch(d.status_kurzbz)
{ {
case 'angemeldet': case 'angemeldet':
liste += "<li class='ui-state-default' id='"+d.student.uid+"'><span class='ui-icon ui-icon-arrowthick-2-n-s'></span><a href='#' onclick='showKommentar(\""+vorname+"\",\""+nachname+"\", \""+d.pruefungsanmeldung_id+"\", \""+d.kommentar+"\", \""+terminId+"\", \""+lehrveranstaltung_id+"\");'>"+vorname+" "+nachname+"</a>"; liste += "<li class='ui-state-default' id='"+d.student.uid+"'><span class='ui-icon ui-icon-arrowthick-2-n-s'></span><a href='#' onclick='showKommentar(\""+vorname+"\",\""+nachname+"\", \""+d.pruefungsanmeldung_id+"\", \""+d.kommentar+"\", \""+terminId+"\", \""+lehrveranstaltung_id+"\");'>"+ects+vorname+" "+nachname+"</a>";
liste += "<div style='width: 3%; text-align: right;'>"+count+"</div><div style='text-align: center; width: 34%;'><input style='vertical-align: top; height: 24px;' type='button' value='<?php echo $p->t('pruefung/bestaetigen'); ?>' onclick='anmeldungBestaetigen(\""+d.pruefungsanmeldung_id+"\", \""+terminId+"\", \""+lehrveranstaltung_id+"\");'>"; liste += "<div style='width: 3%; text-align: right;'>"+count+"</div><div style='text-align: center; width: 34%;'><input style='vertical-align: top; height: 24px;' type='button' value='<?php echo $p->t('pruefung/bestaetigen'); ?>' onclick='anmeldungBestaetigen(\""+d.pruefungsanmeldung_id+"\", \""+terminId+"\", \""+lehrveranstaltung_id+"\");'>";
liste += "<input style='vertical-align: top; height: 24px; background-color: #dd514c;' type='button' value='X' onclick='anmeldungLoeschen(\""+d.pruefungsanmeldung_id+"\", \""+terminId+"\", \""+lehrveranstaltung_id+"\");'></div>"; liste += "<input style='vertical-align: top; height: 24px; background-color: #dd514c;' type='button' value='X' onclick='anmeldungLoeschen(\""+d.pruefungsanmeldung_id+"\", \""+terminId+"\", \""+lehrveranstaltung_id+"\");'></div>";
if(d.wuensche !== null) if(d.wuensche !== null)
{ {
liste += "<div class='anmerkungInfo'><a href='#' title='<?php echo $p->t('pruefung/anmerkungDesStudenten'); ?>"+d.wuensche+"'><img style='width: 20px;' src='../../../../skin/images/button_lvinfo.png'></a></div>"; let msg = $('<div>').text(d.wuensche).html();
liste += `<div class='anmerkungInfo'><a href='#' data-msg="${msg}" onclick="openKommentarDialog(this.dataset.msg)"><img style='width: 20px;' src='../../../../skin/images/button_lvinfo.png'></a></div>`;
} }
liste += "</li>"; liste += "</li>";
break; break;
case 'bestaetigt': case 'bestaetigt':
liste += "<li class='ui-state-default' id='"+d.student.uid+"'><span class='ui-icon ui-icon-arrowthick-2-n-s'></span><a href='#' onclick='showKommentar(\""+vorname+"\",\""+nachname+"\", \""+d.pruefungsanmeldung_id+"\", \""+d.kommentar+"\", \""+terminId+"\", \""+lehrveranstaltung_id+"\");'>"+vorname+" "+nachname+"</a>"; liste += "<li class='ui-state-default' id='"+d.student.uid+"'><span class='ui-icon ui-icon-arrowthick-2-n-s'></span><a href='#' onclick='showKommentar(\""+vorname+"\",\""+nachname+"\", \""+d.pruefungsanmeldung_id+"\", \""+d.kommentar+"\", \""+terminId+"\", \""+lehrveranstaltung_id+"\");'>"+ects+vorname+" "+nachname+"</a>";
liste += "<div style='width: 2%; text-align: right;'>"+count+"</div><div style='text-align: center; width: 20%;'><a href='#' title='<?php echo $p->t('pruefung/statusAenderungVon'); ?>: "+d.statusupdatevon+"'><?php echo $p->t('pruefung/bestaetigt'); ?></a></div>"; liste += "<div style='width: 2%; text-align: right;'>"+count+"</div><div style='text-align: center; width: 20%;'><a href='#' title='<?php echo $p->t('pruefung/statusAenderungVon'); ?>: "+d.statusupdatevon+"'><?php echo $p->t('pruefung/bestaetigt'); ?></a></div>";
if(d.wuensche !== null) if(d.wuensche !== null)
{ {
liste += "<div class='anmerkungInfo'><a href='#' title='<?php echo $p->t('pruefung/anmerkungDesStudenten'); ?>"+d.wuensche+"'><img style='width: 20px;' src='../../../../skin/images/button_lvinfo.png'></a></div>"; let msg = $('<div>').text(d.wuensche).html();
liste += `<div class='anmerkungInfo'><a href='#' data-msg="${msg}" onclick="openKommentarDialog(this.dataset.msg)"><img style='width: 20px;' src='../../../../skin/images/button_lvinfo.png'></a></div>`;
} }
break; break;
@@ -844,13 +863,14 @@ function writeAnmeldungen(data, showMessage = true)
}); });
liste += "</ul>"; liste += "</ul>";
$("#anmeldung_hinzufuegen").html("<input id='anmeldung_hinzufuegen_uid' type='text' placeholder='StudentIn-UID' /><input type='button' value='<?php echo $p->t('global/hinzufuegen'); ?>' onclick='saveAnmeldung(\""+lehrveranstaltung_id+"\",\""+terminId+"\");'/>"); $("#anmeldung_hinzufuegen").html("<input id='anmeldung_hinzufuegen_uid' type='text' placeholder='StudentIn-UID' /><input type='button' value='<?php echo $p->t('global/hinzufuegen'); ?>' onclick='saveAnmeldung(\""+lehrveranstaltung_id+"\",\""+terminId+"\");'/>");
$("#reihungSpeichernButton").html("<input type='button' value='<?php echo $p->t('pruefung/reihungSpeichern'); ?>' onclick='saveReihung(\""+terminId+"\", \""+lehrveranstaltung_id+"\");'><input type='button' value='<?php echo $p->t('pruefung/alleBestaetigen'); ?>' onclick='alleBestaetigen(\""+terminId+"\", \""+lehrveranstaltung_id+"\");'>"); $("#reihungSpeichernButton").html("<label for='emails'>E-Mail: <input type='email' id='emails' multiple /> <br /><br />" +
"<input type='button' value='<?php echo $p->t('pruefung/reihungSpeichern'); ?>' onclick='saveReihung(\""+terminId+"\", \""+lehrveranstaltung_id+"\");'><input type='button' value='<?php echo $p->t('pruefung/alleBestaetigen'); ?>' onclick='alleBestaetigen(\""+terminId+"\", \""+lehrveranstaltung_id+"\");'>");
$("#lvdaten").html(lv_bezeichnung+" ("+prf_termin+")"); $("#lvdaten").html(lv_bezeichnung+" ("+prf_termin+")");
$("#anmeldeDaten").html(liste); $("#anmeldeDaten").html(liste);
$("#listeDrucken").html(listenLinks); $("#listeDrucken").html(listenLinks);
if(ort_kurzbz !== null) if(ort_kurzbz !== null || anderer_raum !== null)
{ {
$("#raumLink").html("<span><?php echo $p->t('pruefung/pruefungsraum'); ?></span>"+ort_kurzbz); $("#raumLink").html("<span><?php echo $p->t('pruefung/pruefungsraum'); ?></span>"+ (ort_kurzbz ?? anderer_raum));
} }
else else
{ {
@@ -883,11 +903,17 @@ function writeAnmeldungen(data, showMessage = true)
function openRaumDialog(terminId, lehrveranstaltung_id) function openRaumDialog(terminId, lehrveranstaltung_id)
{ {
getRaeume(terminId); getRaeume(terminId);
$("#raum").html('<h2><?php echo $p->t('pruefung/pruefungsraum'); ?></h2><input onChange="changeStateOfRaumDropdown();" type="checkbox" /><span><?php echo $p->t('pruefung/imBuero'); ?></span><br /><span style="font-weight: bold;"><?php echo $p->t('pruefung/raum'); ?>: </span><select id="raeumeDropdown"></select>'); $("#raum").html('<h2><?php echo $p->t('pruefung/pruefungsraum'); ?></h2><div id="raumInfos"><input onChange="changeStateOfRaumDropdown();" type="checkbox" /><span><?php echo $p->t('pruefung/imBuero'); ?></span><br /><span style="font-weight: bold;"><?php echo $p->t('pruefung/raum'); ?>: </span><select id="raeumeDropdown"></select><br /></div><input onChange="changeStateOfRaumInputs();" id="andererRaum" type="checkbox"/><span><?php echo $p->t('pruefung/andererRaum'); ?></span> <input type="text" id="andereRaumInput" placeholder="<?php echo $p->t('pruefung/andererRaum'); ?>"/><br />');
$("#raumSpeichernButton").html("<input type='button' value='<?php echo $p->t('pruefung/raumSpeichern'); ?>' onclick='saveRaum(\""+terminId+"\", \""+lehrveranstaltung_id+"\");'/>"); $("#raumSpeichernButton").html("<input type='button' value='<?php echo $p->t('pruefung/raumSpeichern'); ?>' onclick='saveRaum(\""+terminId+"\", \""+lehrveranstaltung_id+"\");'/>");
$("#raumDialog").dialog("open"); $("#raumDialog").dialog("open");
} }
function openKommentarDialog(text)
{
$('#kommentarimDialog').text(text);
$('#kommentarDialog').dialog('open');
}
/** /**
* speichert die Reihung der Studenten einer Prüfungsanmeldung * speichert die Reihung der Studenten einer Prüfungsanmeldung
* @param {type} terminId ID des Prüfungstermines * @param {type} terminId ID des Prüfungstermines
@@ -1011,6 +1037,30 @@ function anmeldungLoeschen(pruefungsanmeldung_id, termin_id, lehrveranstaltung_i
*/ */
function alleBestaetigen(termin_id, lehrveranstaltung_id) function alleBestaetigen(termin_id, lehrveranstaltung_id)
{ {
const input = $('#emails').val();
let emails = '';
if (input)
{
emails = input.split(",").map(s => s.trim());
const re = /^([\w-+]+(?:\.[\w-+]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,63}(?:\.[a-z]{2})?)$/i;
let valid = true;
$.each(emails, function(index, email)
{
if (re.test(email) === false)
{
alert("<?php echo $p->t('pruefung/bitteEmailAngeben')?>");
valid = false;
return false;
}
});
if (!valid)
return false;
}
$.ajax({ $.ajax({
dataType: 'json', dataType: 'json',
url: "./pruefungsanmeldung.json.php", url: "./pruefungsanmeldung.json.php",
@@ -1018,7 +1068,8 @@ function alleBestaetigen(termin_id, lehrveranstaltung_id)
data: { data: {
method: "alleBestaetigen", method: "alleBestaetigen",
termin_id: termin_id, termin_id: termin_id,
lehrveranstaltung_id: lehrveranstaltung_id lehrveranstaltung_id: lehrveranstaltung_id,
emails: emails
}, },
error: loadError, error: loadError,
success: function(data){ success: function(data){
@@ -1090,15 +1141,12 @@ function loadStudiengaenge()
} }
/** /**
* Lädt alle Prüfungen zu einem Studiengang * Lädt alle Prüfungen zu einem Studiensemester
* @param {type} studiengang_kz Studiengangskennzahl * @param {type} studiensemester Studiensemester
* @returns {undefined} * @returns {undefined}
*/ */
function loadPruefungStudiengang(studiengang_kz, studiensemester) function loadPruefungStudiengang(studiensemester)
{ {
if(studiengang_kz === undefined)
studiengang_kz = $("#select_studiengang option:selected").val();
if(studiensemester === undefined) if(studiensemester === undefined)
studiensemester = $("#filter_studiensemester option:selected").val(); studiensemester = $("#filter_studiensemester option:selected").val();
@@ -1107,8 +1155,7 @@ function loadPruefungStudiengang(studiengang_kz, studiensemester)
url: "./pruefungsanmeldung.json.php", url: "./pruefungsanmeldung.json.php",
type: "POST", type: "POST",
data: { data: {
method: "getPruefungenStudiengang", method: "getPruefungenStudiensemester",
studiengang_kz: studiengang_kz,
studiensemester: studiensemester studiensemester: studiensemester
}, },
error: loadError, error: loadError,
@@ -1118,25 +1165,61 @@ function loadPruefungStudiengang(studiengang_kz, studiensemester)
$("#pruefungenListe").empty(); $("#pruefungenListe").empty();
if(data.result.length > 0) if(data.result.length > 0)
{ {
var liste = ""; $('#table4').show()
data.result.forEach(function(e){ let rows = '';
liste += "<ul><li>"+e.bezeichnung+"<ul>";
try data.result.forEach(function(e)
{ {
e.pruefung[0].termine.forEach(function(d){ let termine = [];
liste += "<li> <a onclick='showAnmeldungen(\""+d.pruefungstermin_id+"\", \""+e.lehrveranstaltung_id+"\");'>"+convertDateTime(d.von)+" "+convertDateTime(d.von, "time")+" - "+convertDateTime(d.bis, "time")+"</a></li>"; if (e.pruefung) {
e.pruefung.forEach(p => {
if (p.termine) {
termine = termine.concat(p.termine);
}
}); });
} }
catch(err)
if (termine.length === 0)
{ {
var errmsg = err.message; rows += `
<tr>
<td></td>
<td>${e.bezeichnung}</td>
<td colspan="5">Keine Termine</td>
</tr>`;
}
else
{
termine.forEach(function(d) {
let vonDate = convertDateTime(d.von);
let vonTime = convertDateTime(d.von, 'time');
let bisTime = convertDateTime(d.bis, 'time');
let onClick = `showAnmeldungen(${d.pruefungstermin_id}, ${e.lehrveranstaltung_id})`;
rows += `
<tr>
<td><input type="checkbox"
class="termin-checkbox"
data-termin-id="${d.pruefungstermin_id}"
data-lv-id="${e.lehrveranstaltung_id}"
data-datum="${vonDate}"
/></td>
<td>${e.studiengang}</td>
<td>${e.bezeichnung}</td>
<td>${vonDate}</td>
<td>${vonTime}</td>
<td>${bisTime}</td>
<td><a onclick="${onClick}"><?php echo $p->t('pruefung/pruefungsbewertungAnmeldungen'); ?></a></td>
</tr>`;
});
} }
liste += "</ul></li></ul>";
}); });
$("#pruefungenListe").append(liste); $("#pruefungenListe").html(rows);
setTablesorter('table4')
} }
else else
{ {
$('#table4').hide()
$("#pruefungenListe").html("<?php echo $p->t('pruefung/keinePruefungenVorhanden'); ?>"); $("#pruefungenListe").html("<?php echo $p->t('pruefung/keinePruefungenVorhanden'); ?>");
} }
} }
@@ -1148,6 +1231,42 @@ function loadPruefungStudiengang(studiengang_kz, studiensemester)
}); });
} }
function terminezusammenlegen(termine, lv_id)
{
if(termine.length <= 1)
return;
$.ajax({
dataType: 'json',
url: "./pruefungsanmeldung.json.php",
type: "POST",
data: {
method: "terminezusammenlegen",
'termine[]': termine,
lv_id: lv_id
},
error: loadError,
success: function(data){
if(data.error === 'false')
{
loadPruefungStudiengang()
$("#anmeldung_hinzufuegen").empty();
$("#lvdaten").empty();
$("#anmeldeDaten").empty();
$("#reihungSpeichernButton").empty();
$("#kommentar").empty();
$("#kommentarSpeichernButton").empty();
$("#raumLink").empty();
$("#listeDrucken").empty();
}
else
{
messageBox("message", data.errormsg, "red", "highlight", 10000);
}
}
});
}
/** /**
* Zeigt das Formularfeld zur Eingabe eines Kommentars in der Anmeldungsverwaltung an. * Zeigt das Formularfeld zur Eingabe eines Kommentars in der Anmeldungsverwaltung an.
* @param {String} vorname Vorname des Studenten * @param {String} vorname Vorname des Studenten
@@ -1241,6 +1360,7 @@ function loadStudiensemester()
data.result.forEach(function(d){ data.result.forEach(function(d){
selectData += "<option "+((d.studiensemester_kurzbz === data.aktSem) ? "selected" : "")+" value='"+d.studiensemester_kurzbz+"'>"+d.studiensemester_kurzbz+"</option>"; selectData += "<option "+((d.studiensemester_kurzbz === data.aktSem) ? "selected" : "")+" value='"+d.studiensemester_kurzbz+"'>"+d.studiensemester_kurzbz+"</option>";
}); });
$('#studiensemester').html(selectData); $('#studiensemester').html(selectData);
loadPruefungsfenster(); loadPruefungsfenster();
loadLehrveranstaltungen(); loadLehrveranstaltungen();
@@ -1540,7 +1660,7 @@ function loadPruefungsDetails(prfId)
if(data.result.length === 0) if(data.result.length === 0)
{ {
messageBox("message", "<?php echo $p->t('pruefung/keinePruefungsfensterGespeichert'); ?>", "red", "highlight", 10000); messageBox("message", "<?php echo $p->t('pruefung/keinePruefungsfensterGespeichert'); ?>", "red", "highlight", 10000);
$("#pruefungsfenster").html("<option value='null'></option>"); $("#pruefungsfenster").html("<option value='null'><?php echo $p->t('pruefung/keinePruefungsfensterGespeichert'); ?></option>");
} }
else else
{ {
@@ -2188,10 +2308,28 @@ function changeStateOfRaumDropdown()
} }
} }
function changeStateOfRaumInputs()
{
if ($("#andererRaum").prop("checked") === true)
{
$("#raumInfos").hide();
}
else
{
$("#raumInfos").show();
}
}
function saveRaum(terminId, lehrveranstaltung_id) function saveRaum(terminId, lehrveranstaltung_id)
{ {
var ort_kurzbz; var ort_kurzbz;
if($("#raum input[type=checkbox]").prop("checked") === true) let anderer_raum = '';
if ($("#andererRaum").prop("checked") === true && $('#andereRaumInput').val() !== '')
{
ort_kurzbz = "";
anderer_raum = $('#andereRaumInput').val();
}
else if($("#raum input[type=checkbox]").prop("checked") === true)
{ {
ort_kurzbz = "buero"; ort_kurzbz = "buero";
} }
@@ -2206,7 +2344,8 @@ function saveRaum(terminId, lehrveranstaltung_id)
data: { data: {
method: "saveRaum", method: "saveRaum",
ort_kurzbz: ort_kurzbz, ort_kurzbz: ort_kurzbz,
terminId: terminId terminId: terminId,
anderer_raum: anderer_raum
}, },
error: loadError error: loadError
}).done(function(data){ }).done(function(data){
@@ -106,9 +106,14 @@ switch($method)
case 'getStudiengaenge': case 'getStudiengaenge':
$data = getStudiengaenge(); $data = getStudiengaenge();
break; break;
case 'getPruefungenStudiengang': case 'getPruefungenStudiensemester':
$studiensemester = filter_input(INPUT_POST,"studiensemester"); $studiensemester = filter_input(INPUT_POST,"studiensemester");
$data = getPruefungenStudiengang($uid, $studiensemester); $data = getPruefungenStudiengangBySemester($studiensemester);
break;
case 'terminezusammenlegen':
$termine = filter_input(INPUT_POST, 'termine', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
$lv_id = filter_input(INPUT_POST, 'lv_id');
$data = terminezusammenlegen($termine, $lv_id);
break; break;
case 'saveKommentar': case 'saveKommentar':
$data = saveKommentar(); $data = saveKommentar();
@@ -120,7 +125,8 @@ switch($method)
case 'saveRaum': case 'saveRaum':
$terminId = $_REQUEST["terminId"]; $terminId = $_REQUEST["terminId"];
$ort_kurzbz = $_REQUEST["ort_kurzbz"]; $ort_kurzbz = $_REQUEST["ort_kurzbz"];
$data = saveRaum($terminId, $ort_kurzbz, $uid); $anderer_raum = $_REQUEST["anderer_raum"];
$data = saveRaum($terminId, $ort_kurzbz, $uid, $anderer_raum);
break; break;
case 'getLvKompatibel': case 'getLvKompatibel':
$lvid = filter_input(INPUT_POST, "lehrveranstaltung_id"); $lvid = filter_input(INPUT_POST, "lehrveranstaltung_id");
@@ -397,6 +403,7 @@ function saveAnmeldung($aktStudiensemester = null, $uid = null)
$lv_besucht = false; $lv_besucht = false;
$studienverpflichtung_id = filter_input(INPUT_POST, "studienverpflichtung_id"); $studienverpflichtung_id = filter_input(INPUT_POST, "studienverpflichtung_id");
$studiengang_kz = filter_input(INPUT_POST, "studiengang_kz"); $studiengang_kz = filter_input(INPUT_POST, "studiengang_kz");
$ects = filter_input(INPUT_POST, "ects");
//Defaulteinstellung für Anzahlprüfungsversuche (wird durch Addon "ktu" überschrieben) //Defaulteinstellung für Anzahlprüfungsversuche (wird durch Addon "ktu" überschrieben)
$maxAnzahlVersuche = 0; $maxAnzahlVersuche = 0;
@@ -731,6 +738,10 @@ function saveAnmeldung($aktStudiensemester = null, $uid = null)
else else
$anmeldung->anrechnung_id = $anrechnung->anrechnung_id; $anmeldung->anrechnung_id = $anrechnung->anrechnung_id;
if (defined('CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE') && (CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE === true))
{
$anmeldung->ects = $ects;
}
if($anmeldung->save(true)) if($anmeldung->save(true))
{ {
$pruefung = new pruefungCis($termin->pruefung_id); $pruefung = new pruefungCis($termin->pruefung_id);
@@ -960,9 +971,13 @@ function alleBestaetigen($uid)
global $p; global $p;
$lehrveranstaltung_id = $_REQUEST["lehrveranstaltung_id"]; $lehrveranstaltung_id = $_REQUEST["lehrveranstaltung_id"];
$pruefungstermin_id = $_REQUEST["termin_id"]; $pruefungstermin_id = $_REQUEST["termin_id"];
$emails = $_REQUEST["emails"];
$pruefungstermin = new pruefungstermin($pruefungstermin_id); $pruefungstermin = new pruefungstermin($pruefungstermin_id);
$pruefungsanmeldung = new pruefungsanmeldung(); $pruefungsanmeldung = new pruefungsanmeldung();
$pranmeldungen = $pruefungsanmeldung->getAnmeldungenByTermin($pruefungstermin_id, $lehrveranstaltung_id); $pranmeldungen = $pruefungsanmeldung->getAnmeldungenByTermin($pruefungstermin_id, $lehrveranstaltung_id);
$mail_benutzer = [];
$mail_inhalt = [];
foreach($pranmeldungen as $a) foreach($pranmeldungen as $a)
{ {
$anmeldung = new pruefungsanmeldung($a->pruefungsanmeldung_id); $anmeldung = new pruefungsanmeldung($a->pruefungsanmeldung_id);
@@ -976,6 +991,13 @@ function alleBestaetigen($uid)
$ma = new mitarbeiter($uid); $ma = new mitarbeiter($uid);
$datum = new datum(); $datum = new datum();
$ort = new ort($termin->ort_kurzbz); $ort = new ort($termin->ort_kurzbz);
$ortbezeichnung = $ort->bezeichnung;
if (is_null($termin->ort_kurzbz) && !is_null($termin->anderer_raum))
{
$ortbezeichnung = $termin->anderer_raum;
}
$pruefung = new pruefungCis($termin->pruefung_id); $pruefung = new pruefungCis($termin->pruefung_id);
$to = $anm->uid."@".DOMAIN; $to = $anm->uid."@".DOMAIN;
@@ -995,17 +1017,66 @@ function alleBestaetigen($uid)
} }
else else
$html .= $p->t('pruefung/emailBodyTermin')." ".$datum->formatDatum($termin->von, "d.m.Y")." ".$p->t('pruefung/emailBodyUm')." ".$datum->formatDatum($termin->von, "H:i")."<br>"; $html .= $p->t('pruefung/emailBodyTermin')." ".$datum->formatDatum($termin->von, "d.m.Y")." ".$p->t('pruefung/emailBodyUm')." ".$datum->formatDatum($termin->von, "H:i")."<br>";
$html .= $p->t('pruefung/anmeldungErfolgreich')." ".$ort->bezeichnung."<br>"; $html .= $p->t('pruefung/anmeldungErfolgreich')." ".$ortbezeichnung."<br>";
$html .= "<br>"; $html .= "<br>";
$html .= "<a href='".APP_ROOT."cis/private/lehre/pruefung/pruefungsanmeldung.php'>".$p->t('pruefung/emailBodyLinkZurAnmeldung')."</a><br>"; $html .= "<a href='".APP_ROOT."cis/private/lehre/pruefung/pruefungsanmeldung.php'>".$p->t('pruefung/emailBodyLinkZurAnmeldung')."</a><br>";
$html .= "<br>"; $html .= "<br>";
$mail_benutzer[] = [
'uid' => $anm->uid
];
if (empty($mail_inhalt))
{
$mail_inhalt = array(
'von' => $ma->vorname." ".$ma->nachname,
'lv' => $lv->bezeichnung,
'ort' => $ortbezeichnung,
'datum' => $datum->formatDatum($termin->von, "d.m.Y") . ' ' . $p->t('pruefung/emailBodyUm') . ' ' . (isset($von) ? $von : $datum->formatDatum($termin->von, "H:i")),
'dauer' => $pruefung->einzeln ? ($pruefung->pruefungsintervall . ' ' . $p->t('pruefung/emailBodyMinuten')): '');
}
$mail = new mail($to, $from, $subject,$p->t('pruefung/emailBodyBitteHtmlSicht')); $mail = new mail($to, $from, $subject,$p->t('pruefung/emailBodyBitteHtmlSicht'));
$mail->setHTMLContent($html); $mail->setHTMLContent($html);
$mail->send(); $mail->send();
} }
} }
} }
if (!empty($emails) && !empty($mail_inhalt))
{
foreach ($emails as $email)
{
$from = "noreply@".DOMAIN;
$subject = $p->t('pruefung/emailSubjectAnmeldungBestaetigung');
$html = $p->t('pruefung/sammelemailBody',array($mail_inhalt['lv'], $mail_inhalt['datum'], $mail_inhalt['von']));
if ($mail_inhalt['ort'])
{
$html .= $p->t('pruefung/sammelemailBody2',array($mail_inhalt['ort']));
}
$html .= "<br /><table border='1'>
<thead>
<tr>
<th>UID</th>
</tr>
</thead>
<tbody>";
foreach($mail_benutzer as $benutzer)
{
$html .= "<tr>
<td>" . htmlspecialchars($benutzer['uid']) . "</td>
</tr>";
}
$html .= "</tbody></table><br />";
$mail = new mail($email, $from, $subject, $p->t('pruefung/emailBodyBitteHtmlSicht'));
$mail->setHTMLContent($html);
$mail->send();
}
}
$data['result']=true; $data['result']=true;
$data['error']='false'; $data['error']='false';
$data['errormsg']=''; $data['errormsg']='';
@@ -1032,6 +1103,12 @@ function anmeldungBestaetigen($uid)
$ort = new ort($termin->ort_kurzbz); $ort = new ort($termin->ort_kurzbz);
$pruefung = new pruefungCis($termin->pruefung_id); $pruefung = new pruefungCis($termin->pruefung_id);
$ortbezeichnung = $ort->bezeichnung;
if (is_null($termin->ort_kurzbz) && !is_null($termin->anderer_raum))
{
$ortbezeichnung = $termin->anderer_raum;
}
$to = $anmeldung->uid."@".DOMAIN; $to = $anmeldung->uid."@".DOMAIN;
$from = "noreply@".DOMAIN; $from = "noreply@".DOMAIN;
$subject = $p->t('pruefung/emailSubjectAnmeldungBestaetigung'); $subject = $p->t('pruefung/emailSubjectAnmeldungBestaetigung');
@@ -1049,7 +1126,7 @@ function anmeldungBestaetigen($uid)
} }
else else
$html .= $p->t('pruefung/emailBodyTermin')." ".$datum->formatDatum($termin->von, "d.m.Y")." ".$p->t('pruefung/emailBodyUm')." ".$datum->formatDatum($termin->von, "H:i")."<br>"; $html .= $p->t('pruefung/emailBodyTermin')." ".$datum->formatDatum($termin->von, "d.m.Y")." ".$p->t('pruefung/emailBodyUm')." ".$datum->formatDatum($termin->von, "H:i")."<br>";
$html .= $p->t('pruefung/anmeldungErfolgreich')." ".$ort->bezeichnung."<br>"; $html .= $p->t('pruefung/anmeldungErfolgreich')." ".$ortbezeichnung."<br>";
$html .= "<br>"; $html .= "<br>";
$html .= "<a href='".APP_ROOT."cis/private/lehre/pruefung/pruefungsanmeldung.php'>".$p->t('pruefung/emailBodyLinkZurAnmeldung')."</a><br>"; $html .= "<a href='".APP_ROOT."cis/private/lehre/pruefung/pruefungsanmeldung.php'>".$p->t('pruefung/emailBodyLinkZurAnmeldung')."</a><br>";
$html .= "<br>"; $html .= "<br>";
@@ -1166,6 +1243,258 @@ function getPruefungenStudiengang($uid, $aktStudiensemester)
return $data; return $data;
} }
function getPruefungenStudiengangBySemester($aktStudiensemester)
{
$result = array();
$pruefungen = new pruefungCis();
$pruefungen->getPruefungByStudiensemester($aktStudiensemester);
if(!empty($pruefungen->lehrveranstaltungen))
{
$lehrveranstaltungen = [];
foreach ($pruefungen->lehrveranstaltungen as $prf)
{
$pruefung = new pruefungCis();
$pruefung->load($prf->pruefung_id);
if ($pruefung->storniert)
continue;
$pruefung->getTermineByPruefung();
$lvid = $prf->lehrveranstaltung_id;
if (!isset($lehrveranstaltungen[$lvid]))
{
$lv = new stdClass();
$lehrveranstaltung = new lehrveranstaltung();
$lehrveranstaltung->load($lvid);
$studiengang = new studiengang();
$studiengang->load($lehrveranstaltung->studiengang_kz);
$lv->bezeichnung = $lehrveranstaltung->bezeichnung;
$lv->lehrveranstaltung_id = $lvid;
$lv->studiengang = $studiengang->kuerzel;
$lv->pruefung = [];
$lehrveranstaltungen[$lvid] = $lv;
}
$lehrveranstaltungen[$lvid]->pruefung[] = $pruefung;
}
$result = array_values($lehrveranstaltungen);
}
$data['result']=$result;
$data['error']='false';
$data['errormsg']='';
return $data;
}
function terminezusammenlegen($termine, $lv_id)
{
$result = array();
$alle_termine = array();
$error = false;
$terminkollision = defined('CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION') ? CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION : false;
foreach($termine as $termin)
{
$pruefungstermin = new pruefungstermin();
$pruefungstermin->load($termin);
$pruefung = new pruefungCis();
$pruefung->load($pruefungstermin->pruefung_id);
$pruefung->getLehrveranstaltungenByPruefung();
$lehrveranstaltungen = array_column($pruefung->lehrveranstaltungen, 'lehrveranstaltung_id');
if (!in_array($lv_id, $lehrveranstaltungen))
continue;
$pruefung->lehrveranstaltung_id = $lv_id;
$pruefung->termin = $pruefungstermin;
$alle_termine[] = $pruefung;
}
if (count($alle_termine) >= 1)
{
usort($alle_termine, function($a, $b) {
return strcmp($a->termin->von, $b->termin->von);
});
$first_termin = $alle_termine[0];
$first_mitarbeiter = $first_termin->mitarbeiter_uid;
$first_date = date('Y-m-d', strtotime($first_termin->termin->von));
$first_studiensemester = $first_termin->studiensemester_kurzbz;
$first_sammelklausur = $first_termin->termin->sammelklausur;
$first_ort = $first_termin->termin->ort_kurzbz;
$first_raum = $first_termin->termin->anderer_raum;
$first_lv = $first_termin->lehrveranstaltung_id;
$first_titel = $first_termin->titel;
$max_von = strtotime($first_termin->termin->von);
$max_bis = strtotime($first_termin->termin->bis);
$teilnehmer_min = (int)$first_termin->termin->teilnehmer_min;
$teilnehmer_max = (int)$first_termin->termin->teilnehmer_max;
$prevEnd = $max_bis;
foreach ($alle_termine as $termin)
{
if (date('Y-m-d', strtotime($termin->termin->von)) !== $first_date)
{
$data['errormsg'] = 'Nicht der gleiche Tag!';
$error = true;
}
if ($termin->mitarbeiter_uid !== $first_mitarbeiter)
{
$data['errormsg'] = 'Unterschiedliche Lektoren!';
$error = true;
}
if ($termin->studiensemester_kurzbz !== $first_studiensemester)
{
$data['errormsg'] = 'Unterschiedliche Studiensemester!';
$error = true;
}
if ($termin->termin->sammelklausur !== $first_sammelklausur)
{
$data['errormsg'] = 'Sammelklausur unterschiedlich!';
$error = true;
}
if (!($termin->termin->ort_kurzbz === $first_ort || $first_termin->termin->anderer_raum == $first_raum))
{
$data['errormsg'] = 'Ort/Raum unterschiedlich!';
$error = true;
}
if ($termin->lehrveranstaltung_id !== $first_lv)
{
$data['errormsg'] = 'Lehrveranstaltungen unterscheiden sich!';
$error = true;
}
$start = strtotime($termin->termin->von);
$max_von = min($max_von, $start);
$max_bis = max($max_bis, strtotime($termin->termin->bis));
$teilnehmer_min = min($teilnehmer_min, (int)$termin->termin->teilnehmer_min);
$teilnehmer_max = max($teilnehmer_max, (int)$termin->termin->teilnehmer_max);
if (($start - $prevEnd > 0) && $first_ort)
{
$stunde = new stunde();
$gapStartStr = date('Y-m-d H:i:s', $prevEnd);
$gapEndStr = date('Y-m-d H:i:s', $start);
$gapStartArr = explode(' ', $gapStartStr);
$gapEndArr = explode(' ', $gapEndStr);
$stunden = $stunde->getStunden($gapStartArr[1], $gapEndArr[1]);
$reservierung = new reservierung();
$reserviert = false;
$reservierungs_stunden = $reservierung->getReservierungen($first_ort, $gapStartArr[0]);
$need_stunden = array_diff($stunden, $reservierungs_stunden);
foreach ($need_stunden as $h)
{
if ($reservierung->isReserviert($first_ort, $gapStartArr[0], $h))
$reserviert = true;
}
if (!$terminkollision && $reserviert && !$first_sammelklausur)
{
$error = true;
$data['errormsg'] = 'Kann nicht zusammengelegt werden, da der Raum reserviert ist';
}
else
{
$reservierung->studiengang_kz = "0";
$reservierung->ort_kurzbz = $first_ort;
$reservierung->uid = $first_mitarbeiter;
$reservierung->datum = $gapStartArr[0];
$reservierung->titel = $first_titel;
if (strlen($first_titel) > 10)
{
$reservierung->titel = "Prüfung";
}
$reservierung->beschreibung = "Prüfung";
$reservierung->insertamum = date('Y-m-d G:i:s');
$reservierung->insertvon = get_uid();
$reservierungError = false;
foreach ($need_stunden as $h)
{
$reservierung->stunde = $h;
if (!$reservierungError)
{
if (!$reservierung->save(true))
{
$error = true;
$data['errormsg'] = $reservierung->errormsg;
$reservierungError = true;
}
}
}
}
}
$prevEnd = strtotime($termin->termin->bis);
}
if (!$error)
{
$first_pruefungstermin = new pruefungstermin();
$first_pruefungstermin->load($first_termin->termin->pruefungstermin_id);
$first_pruefungstermin->von = date('Y-m-d H:i:s', $max_von);
$first_pruefungstermin->bis = date('Y-m-d H:i:s', $max_bis);
$first_pruefungstermin->teilnehmer_min = $teilnehmer_min;
$first_pruefungstermin->teilnehmer_max = $teilnehmer_max;
$first_pruefungstermin->save();
$alle_termine = array_slice($alle_termine, 1);
foreach ($alle_termine as $termin)
{
$anmeldung_termin = new pruefungsanmeldung();
$anmeldungen_termine = $anmeldung_termin->getAnmeldungenByTermin($termin->termin->pruefungstermin_id);
if (count($anmeldungen_termine) === 0)
{
$first_pruefungstermin->delete($termin->termin->pruefungstermin_id);
}
$i = 0;
$anmeldungen_termine_count = count($anmeldungen_termine);
foreach ($anmeldungen_termine as $anmeldungtermin)
{
$anmeldung = new pruefungsanmeldung();
$anmeldung->load($anmeldungtermin->pruefungsanmeldung_id);
$old_pruefuengstermin_id = $anmeldung->pruefungstermin_id;
$anmeldung->pruefungstermin_id = $first_termin->termin->pruefungstermin_id;
if ($anmeldung->save(false) && ($i === $anmeldungen_termine_count - 1))
{
$first_pruefungstermin->delete($old_pruefuengstermin_id);
}
$i ++;
}
}
}
}
$data['result']= $result;
$data['error']= $error ? 'true' : 'false';
//$data['errormsg']='';
return $data;
}
/** /**
* *
* @return typespeichert ein Kommentar zu einer Prüfungsanmeldung * @return typespeichert ein Kommentar zu einer Prüfungsanmeldung
@@ -1246,7 +1575,7 @@ function compareRaeume($a, $b)
return strcmp($a->ort_kurzbz, $b->ort_kurzbz); return strcmp($a->ort_kurzbz, $b->ort_kurzbz);
} }
function saveRaum($terminId, $ort_kurzbz, $uid) function saveRaum($terminId, $ort_kurzbz, $uid, $anderer_raum = '')
{ {
$terminkollision = defined('CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION') ? CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION : false; $terminkollision = defined('CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION') ? CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION : false;
$pruefungstermin = new pruefungstermin($terminId); $pruefungstermin = new pruefungstermin($terminId);
@@ -1265,7 +1594,24 @@ function saveRaum($terminId, $ort_kurzbz, $uid)
{ {
$pruefung = new pruefungCis($pruefungstermin->pruefung_id); $pruefung = new pruefungCis($pruefungstermin->pruefung_id);
$mitarbeiter = new mitarbeiter($pruefung->mitarbeiter_uid); $mitarbeiter = new mitarbeiter($pruefung->mitarbeiter_uid);
if($ort_kurzbz === "buero")
if ($ort_kurzbz === "" && $anderer_raum !== "")
{
$pruefungstermin->anderer_raum = $anderer_raum;
if($pruefungstermin->save(false))
{
$data['result']="reserviert";
$data['error']='false';
$data['errormsg']='';
}
else
{
$data['error']='true';
$data['errormsg']=$pruefungstermin->errormsg;
}
}
else if($ort_kurzbz === "buero")
{ {
$pruefungstermin->ort_kurzbz = $mitarbeiter->ort_kurzbz; $pruefungstermin->ort_kurzbz = $mitarbeiter->ort_kurzbz;
if($pruefungstermin->save(false)) if($pruefungstermin->save(false))
@@ -321,6 +321,20 @@ $studiensemester->getAll();
</td> </td>
</tr> </tr>
<?php endif; ?> <?php endif; ?>
<?php
if (defined('CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE')
&& CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE === true):
?>
<tr>
<td style="vertical-align: top; font-weight: bold;">
<?php echo $p->t('pruefung/ects'); ?>:
</td>
<td>
<input type="number" size="3" id="ectsangabe" placeholder="<?php echo $p->t('pruefung/ects'); ?>"/>
</td>
</tr>
<?php endif; ?>
<tr id="studiengang"> <tr id="studiengang">
</tr> </tr>
<tr> <tr>
@@ -235,12 +235,18 @@ $rechte->getBerechtigungen($uid);
<th><?php echo $p->t('global/datum'); ?></th> <th><?php echo $p->t('global/datum'); ?></th>
<th><?php echo $p->t('benotungstool/note'); ?></th> <th><?php echo $p->t('benotungstool/note'); ?></th>
<th><?php echo $p->t('global/anmerkung'); ?></th> <th><?php echo $p->t('global/anmerkung'); ?></th>
<?php
if (defined('CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE') && (CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE === true)):
?>
<th><?php echo $p->t('pruefung/ects'); ?></th>
<?php endif; ?>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<?php <?php
$count = 0; $count = 0;
/*@var $anmeldung pruefungsanmeldung */
foreach($anmeldungen as $anmeldung) foreach($anmeldungen as $anmeldung)
{ {
$student = new student($anmeldung->uid); $student = new student($anmeldung->uid);
@@ -269,6 +275,8 @@ $rechte->getBerechtigungen($uid);
echo '<td>'.$date.'</td>'; echo '<td>'.$date.'</td>';
echo '<td></td>'; echo '<td></td>';
echo '<td></td>'; echo '<td></td>';
if (defined('CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE') && (CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE === true))
echo '<td>'. $anmeldung->ects .'</td>';
echo '</tr>'; echo '</tr>';
} }
?> ?>
@@ -233,6 +233,11 @@ $rechte->getBerechtigungen($uid);
<th><?php echo $p->t('global/datum'); ?></th> <th><?php echo $p->t('global/datum'); ?></th>
<th><?php echo $p->t('benotungstool/note'); ?></th> <th><?php echo $p->t('benotungstool/note'); ?></th>
<th><?php echo $p->t('global/anmerkung'); ?></th> <th><?php echo $p->t('global/anmerkung'); ?></th>
<?php
if (defined('CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE') && (CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE === true)):
?>
<th><?php echo $p->t('pruefung/ects'); ?></th>
<?php endif; ?>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -265,6 +270,8 @@ $rechte->getBerechtigungen($uid);
echo '<td>'.$date.'</td>'; echo '<td>'.$date.'</td>';
echo '<td></td>'; echo '<td></td>';
echo '<td></td>'; echo '<td></td>';
if (defined('CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE') && (CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE === true))
echo '<td>'. $anmeldung->ects .'</td>';
echo '</tr>'; echo '</tr>';
} }
?> ?>
@@ -76,7 +76,7 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung
width: 850px; width: 850px;
padding: 1.8em 1.5em 1.8em 1em; padding: 1.8em 1.5em 1.8em 1em;
/*border-radius: 25px;*/ /*border-radius: 25px;*/
border: 1px solid #dddddd; /*border: 1px solid #dddddd;*/
/*box-shadow: 0em 0em 2em 0.5em #888888 inset;*/ /*box-shadow: 0em 0em 2em 0.5em #888888 inset;*/
} }
@@ -95,7 +95,7 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung
#prfWrapper { #prfWrapper {
position: absolute; position: absolute;
height: 70%; height: 70%;
width: 300px; width: 40%;
top: 180px; top: 180px;
padding: 1.8em 1.5em 1.8em 1em; padding: 1.8em 1.5em 1.8em 1em;
/*border-radius: 25px;*/ /*border-radius: 25px;*/
@@ -117,9 +117,9 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung
#anmWrapper { #anmWrapper {
position: absolute; position: absolute;
/*top: 45px;*/ /*top: 45px;*/
left: 350px; left: 45%;
top: 180px; top: 180px;
width: 500px; width: 40%;
height: 70%; height: 70%;
padding: 1.8em 1.5em 1.8em 1em; padding: 1.8em 1.5em 1.8em 1em;
/*border-radius: 25px;*/ /*border-radius: 25px;*/
@@ -228,7 +228,6 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung
<script> <script>
$(document).ready(function() $(document).ready(function()
{ {
loadStudiengaenge();
$("#filter_studiensemester").css("visibility","visible"); $("#filter_studiensemester").css("visibility","visible");
$("#raumDialog").dialog({ $("#raumDialog").dialog({
@@ -236,17 +235,66 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung
autoOpen: false, autoOpen: false,
width: "400px" width: "400px"
}); });
$("#kommentarDialog").dialog({
modal: true,
autoOpen: false,
width: "400px",
buttons: {
Ok: function() {
$(this).dialog('close');
}
}
});
$("#table4").tablesorter({
widgets: ["zebra"],
headers: {
0: { sorter: false },
3: { sorter: 'shortDate',
dateFormat: 'ddmmyyyy' },
4: { sorter: 'time' },
5: { sorter: 'time' }
}
});
$('#zusammenlegen').on('click', function() {
let ausgewaehlte_termine = $('.termin-checkbox:checked');
if (ausgewaehlte_termine.length === 0)
return;
let erster_termin = ausgewaehlte_termine.first();
let erstes_datum = erster_termin.data('datum');
let erste_lvid = erster_termin.data('lv-id');
let termine = [];
ausgewaehlte_termine.each(function() {{
let termin = $(this);
let datum = termin.data('datum');
let lv_id = termin.data('lv-id');
if (erstes_datum !== datum)
return alert("Die ausgewählten Termine liegen nicht am selben Tag und können daher nicht zusammengelegt werden.")
if (erste_lvid !== lv_id)
return alert("Bei den ausgewählten Terminen handelt es sich um unterschiedliche Lehrveranstaltungen, die daher nicht zusammengelegt werden können.")
termine.push(termin.data('termin-id'));
}})
if (termine.length > 0)
{
terminezusammenlegen(termine, erste_lvid);
}
})
loadPruefungStudiengang();
}); });
</script> </script>
<h1><?php echo $p->t('pruefung/anmeldungenVerwalten'); ?></h1> <h1><?php echo $p->t('pruefung/anmeldungenVerwalten'); ?></h1>
<div id='stgWrapper'> <div id='stgWrapper'>
<div id='studiengaenge'>
<div>
<h2><?php echo $p->t('global/studiengang'); ?></h2>
<div id='stgListe'>
</div>
</div>
<div> <div>
<h2><?php echo $p->t('global/studiensemester'); ?></h2> <h2><?php echo $p->t('global/studiensemester'); ?></h2>
<?php <?php
@@ -255,7 +303,6 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung
$studiensemester->getPlusMinus(null, 5); $studiensemester->getPlusMinus(null, 5);
foreach($studiensemester->studiensemester as $sem) foreach($studiensemester->studiensemester as $sem)
{ {
/*@var $sem studiensemester */
if ($aktuellesSemester == $sem->studiensemester_kurzbz) if ($aktuellesSemester == $sem->studiensemester_kurzbz)
{ {
echo '<option selected value="'.$sem->studiensemester_kurzbz.'">'.$sem->bezeichnung.'</option>'; echo '<option selected value="'.$sem->studiensemester_kurzbz.'">'.$sem->bezeichnung.'</option>';
@@ -273,9 +320,21 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung
<div id='prfWrapper'> <div id='prfWrapper'>
<div id='pruefungen'> <div id='pruefungen'>
<h2><?php echo $p->t('pruefung/pruefungPruefungenTitle'); ?></h2> <h2><?php echo $p->t('pruefung/pruefungPruefungenTitle'); ?></h2>
<ul id="pruefungenListe"> <button id="zusammenlegen">Termine zusammenlegen</button>
<table id="table4" class="tablesorter" style="display:none">
</ul> <thead>
<tr>
<th></th>
<th><?php echo $p->t('global/studiengang'); ?></th>
<th><?php echo $p->t('global/lehrveranstaltung'); ?></th>
<th><?php echo $p->t('global/datum'); ?></th>
<th><?php echo $p->t('global/von'); ?></th>
<th><?php echo $p->t('global/bis'); ?></th>
<th><?php echo $p->t('pruefung/pruefungsbewertungAnmeldungen'); ?></th>
</tr>
</thead>
<tbody id="pruefungenListe"></tbody>
</table>
</div> </div>
</div> </div>
<div id='anmWrapper'> <div id='anmWrapper'>
@@ -311,6 +370,9 @@ if (empty($pruefung->result) && !$rechte->isBerechtigt('lehre/pruefungsanmeldung
</div> </div>
</div> </div>
</div> </div>
<div id="kommentarDialog" title="<?php echo $p->t('pruefung/anmerkungDesStudenten'); ?>" style="display:none;">
<div id="kommentarimDialog"></div>
</div>
</div> </div>
<div id="message"></div> <div id="message"></div>
+51 -14
View File
@@ -69,6 +69,8 @@ if(isset($_GET['getAnmeldung']))
$lehrveranstaltung_id=$_GET['lehrveranstaltung_id']; $lehrveranstaltung_id=$_GET['lehrveranstaltung_id'];
$stsem = $_GET['stsem']; $stsem = $_GET['stsem'];
$semester = $_GET['semester'];
$studienplan_id = $_GET['studienplan_id'];
echo $p->t('studienplan/LehrveranstalungWaehlen').' echo $p->t('studienplan/LehrveranstalungWaehlen').'
<form action="'.$_SERVER['PHP_SELF'].'?uid='.$db->convert_html_chars($uid).'" method="POST"> <form action="'.$_SERVER['PHP_SELF'].'?uid='.$db->convert_html_chars($uid).'" method="POST">
@@ -83,6 +85,10 @@ if(isset($_GET['getAnmeldung']))
$datum = new datum(); $datum = new datum();
$kompatibel[]=$lehrveranstaltung_id; $kompatibel[]=$lehrveranstaltung_id;
$kompatibel = array_unique($kompatibel); $kompatibel = array_unique($kompatibel);
$stsem_obj = new studiensemester();
$aktornext = $stsem_obj->getaktorNext();
$lvregel = new lvregel();
foreach($kompatibel as $lvid) foreach($kompatibel as $lvid)
{ {
$lvangebot = new lvangebot(); $lvangebot = new lvangebot();
@@ -95,19 +101,50 @@ if(isset($_GET['getAnmeldung']))
$angebot = $lvangebot->result[0]; $angebot = $lvangebot->result[0];
if($angebot->AnmeldungMoeglich()) if($angebot->AnmeldungMoeglich())
{ {
$anzahl++; $kompatible_lv = $lehrveranstaltung->getStudienplanLehrveranstaltung($lvid, $studienplan_id);
// LV wird angeboten und Anmeldefenster ist offen
$bngruppe = new benutzergruppe(); $lvregelExists = false;
if(!$bngruppe->load($uid, $lvangebot->result[0]->gruppe_kurzbz, $stsem)) $abgeschlossen = false;
$semesterlock = false;
$regelerfuellt = true;
if ($kompatible_lv)
{ {
// User ist noch nicht angemeldet $lvregelExists = $lvregel->exists($kompatible_lv);
echo '<br><input type="radio" value="'.$lvid.'" name="lv"/>'.$lv->bezeichnung.' (Anmeldung bis '.$datum->formatDatum($angebot->anmeldefenster_ende,"d.m.Y").')';
if(!$lvregel->checkSemester($kompatible_lv, $semester))
{
$semesterlock=true;
}
else
{
if($stsem === $aktornext)
{
$result = $lvregel->isZugangsberechtigt($uid, $kompatible_lv, $stsem);
if((is_array($result)) && ($result[0] !== true))
{
$regelerfuellt=false;
}
}
}
} }
else
if (!$semesterlock && $regelerfuellt)
{ {
// Bereits angemeldet $anzahl++;
echo '<br><input type="radio" disabled="true" value="'.$lvid.'" name="lv" /><span class="ok">'.$lv->bezeichnung.'</span><img src="../../../skin/images/information.png" title="'.$p->t('studienplan/bereitsAngemeldet').'"/>'; // LV wird angeboten und Anmeldefenster ist offen
$bngruppe = new benutzergruppe();
if(!$bngruppe->load($uid, $lvangebot->result[0]->gruppe_kurzbz, $stsem))
{
// User ist noch nicht angemeldet
echo '<br><input type="radio" value="'.$lvid.'" name="lv"/>'.$lv->bezeichnung.' (Anmeldung bis '.$datum->formatDatum($angebot->anmeldefenster_ende,"d.m.Y").')';
}
else
{
// Bereits angemeldet
echo '<br><input type="radio" disabled="true" value="'.$lvid.'" name="lv" /><span class="ok">'.$lv->bezeichnung.'</span><img src="../../../skin/images/information.png" title="'.$p->t('studienplan/bereitsAngemeldet').'"/>';
}
} }
} }
/* else /* else
@@ -170,9 +207,9 @@ echo '
$("#dialog").dialog({ autoOpen: false, width: "auto" }); $("#dialog").dialog({ autoOpen: false, width: "auto" });
}); });
function OpenAnmeldung(lehrveranstaltung_id, stsem) function OpenAnmeldung(lehrveranstaltung_id, stsem, semester, studienplan_id)
{ {
$("#dialog").load("studienplan.php?getAnmeldung=true&lehrveranstaltung_id="+lehrveranstaltung_id+"&stsem="+stsem+"&uid='.$db->convert_html_chars($uid).'"); $("#dialog").load("studienplan.php?getAnmeldung=true&lehrveranstaltung_id="+lehrveranstaltung_id+"&stsem="+stsem+"&semester="+semester+"&studienplan_id="+studienplan_id+"&uid='.$db->convert_html_chars($uid).'");
$("#dialog").dialog("open"); $("#dialog").dialog("open");
} }
</script> </script>
@@ -359,7 +396,7 @@ drawTree($tree,0);
function drawTree($tree, $depth) function drawTree($tree, $depth)
{ {
global $uid, $stsem_arr, $noten_arr, $lvangebot_arr, $aktornext; global $uid, $stsem_arr, $noten_arr, $lvangebot_arr, $aktornext, $studienplan_id;
global $datum_obj, $db, $lv_arr, $p, $note_pruef_arr, $student; global $datum_obj, $db, $lv_arr, $p, $note_pruef_arr, $student;
global $anrechnung; global $anrechnung;
@@ -639,12 +676,12 @@ function drawTree($tree, $depth)
$tdclass[]='angebot'; $tdclass[]='angebot';
if($angemeldet) if($angemeldet)
{ {
$tdinhalt.= '<a href="#" onclick="OpenAnmeldung(\''.$row_tree->lehrveranstaltung_id.'\',\''.$stsem.'\'); return false;"><img src="../../../skin/images/ja.png" title="'.$p->t('studienplan/legendeAngemeldet').'" /></a>'; $tdinhalt.= '<a href="#" onclick="OpenAnmeldung(\''.$row_tree->lehrveranstaltung_id.'\',\''.$stsem.'\',\''.$semester.'\',\''.$studienplan_id.'\'); return false;"><img src="../../../skin/images/ja.png" title="'.$p->t('studienplan/legendeAngemeldet').'" /></a>';
} }
else else
{ {
if($anmeldungmoeglich) if($anmeldungmoeglich)
$tdinhalt.= '<a href="#" onclick="OpenAnmeldung(\''.$row_tree->lehrveranstaltung_id.'\',\''.$stsem.'\'); return false;"><img src="../../../skin/images/anmelden.png" title="'.$p->t('studienplan/anmelden').'" height="15px" /></a>'; $tdinhalt.= '<a href="#" onclick="OpenAnmeldung(\''.$row_tree->lehrveranstaltung_id.'\',\''.$stsem.'\', \''.$semester.'\', \''.$studienplan_id.'\'); return false;"><img src="../../../skin/images/anmelden.png" title="'.$p->t('studienplan/anmelden').'" height="15px" /></a>';
else else
$tdinhalt.= '<span title="'.$anmeldeinformation.'">-</a>'; $tdinhalt.= '<span title="'.$anmeldeinformation.'">-</a>';
+3
View File
@@ -249,6 +249,9 @@ define('CIS_INFOSCREEN_NEWS_ANZEIGEN',false);
//User, welcher für das Anlegen von Anrechnungen bei der Prüfungsanmeldung verwendet wird //User, welcher für das Anlegen von Anrechnungen bei der Prüfungsanmeldung verwendet wird
define('CIS_PRUEFUNGSANMELDUNG_USER','p.pruefungsanmeldung'); define('CIS_PRUEFUNGSANMELDUNG_USER','p.pruefungsanmeldung');
//Gibt an, ob die Studierenden bei der Anmeldung zu einer Prüfung den Ausmas an ECTS angeben können
define('CIS_PRUEFUNGSANMELDUNG_ECTS_ANGABE', false);
// Anmeldefristen für Prüfungen in Tagen; // Anmeldefristen für Prüfungen in Tagen;
// Wenn nicht definiert: 3 // Wenn nicht definiert: 3
//define('CIS_PRUEFUNGSANMELDUNG_FRIST',3); //define('CIS_PRUEFUNGSANMELDUNG_FRIST',3);
+6
View File
@@ -162,6 +162,12 @@ define('CIS_LV_LEKTORINNENZUTEILUNG_VERTRAGSPRUEFUNG_VON', '');
// Legt fest, ob Vertragsdetails zum Projektauftrag im Reiter Projektarbeit angezeigt werden // Legt fest, ob Vertragsdetails zum Projektauftrag im Reiter Projektarbeit angezeigt werden
define('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN', false); define('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN', false);
// Legt default Stunden pro Projektarbeitsbetreuung für Bachelorarbeiten fest
define('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR', '5.0');
// Legt default Stunden pro Projektarbeitsbetreuung für Masterarbeiten fest
define('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER', '5.0');
// Anzeigeoptionen für LV-Plan Menü // Anzeigeoptionen für LV-Plan Menü
define('CIS_LVPLAN_EXPORT_ANZEIGEN',true); define('CIS_LVPLAN_EXPORT_ANZEIGEN',true);
define('CIS_LVPLAN_PERSONENAUSWAHL_ANZEIGEN',true); define('CIS_LVPLAN_PERSONENAUSWAHL_ANZEIGEN',true);
+4 -2
View File
@@ -1165,12 +1165,14 @@ function StudentProjektbetreuerDetailReset()
if(document.getElementById('student-projektarbeit-menulist-projekttyp').value=='Diplom') if(document.getElementById('student-projektarbeit-menulist-projekttyp').value=='Diplom')
{ {
document.getElementById('student-projektbetreuer-textbox-stunden').value='5.0'; document.getElementById('student-projektbetreuer-textbox-stunden').value=
<?php if (defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER') && FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER) echo FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER; else echo '5'; ?>;
document.getElementById('student-projektbetreuer-menulist-betreuerart').value='Erstbegutachter'; document.getElementById('student-projektbetreuer-menulist-betreuerart').value='Erstbegutachter';
} }
else if(document.getElementById('student-projektarbeit-menulist-projekttyp').value=='Bachelor') else if(document.getElementById('student-projektarbeit-menulist-projekttyp').value=='Bachelor')
{ {
document.getElementById('student-projektbetreuer-textbox-stunden').value='4.0'; document.getElementById('student-projektbetreuer-textbox-stunden').value=
<?php if (defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR') && FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR) echo FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR; else echo '4'; ?>;
document.getElementById('student-projektbetreuer-menulist-betreuerart').value='Begutachter'; document.getElementById('student-projektbetreuer-menulist-betreuerart').value='Begutachter';
} }
else if(document.getElementById('student-projektarbeit-menulist-projekttyp').value=='Praktikum') else if(document.getElementById('student-projektarbeit-menulist-projekttyp').value=='Praktikum')
+12 -4
View File
@@ -888,9 +888,10 @@ class dokument extends basis_db
* Akzeptiert ein bestimmtes Dokument * Akzeptiert ein bestimmtes Dokument
* @param char $dokument_kurzbz Bezeichner Dokument. * @param char $dokument_kurzbz Bezeichner Dokument.
* @param int $person_id Personenkennzeichen. * @param int $person_id Personenkennzeichen.
* @param array $studiengang_typen einschränken nach Studiengang Typ.
* @return boolean true wenn akzeptiert bzw geprüft ohne Akzeptieren, false wenn Fehler * @return boolean true wenn akzeptiert bzw geprüft ohne Akzeptieren, false wenn Fehler
*/ */
public function akzeptiereDokument($dokument_kurzbz, $person_id) public function akzeptiereDokument($dokument_kurzbz, $person_id, $studiengang_typen = null)
{ {
$db = new basis_db(); $db = new basis_db();
$arrayDoksZuAkzeptieren = array(); $arrayDoksZuAkzeptieren = array();
@@ -902,7 +903,6 @@ class dokument extends basis_db
tbl_prestudent ps, tbl_studiengang sg tbl_prestudent ps, tbl_studiengang sg
WHERE WHERE
ps.studiengang_kz = sg.studiengang_kz ps.studiengang_kz = sg.studiengang_kz
AND sg.typ = 'm'
AND person_id = ".$this->db_add_param($person_id)." AND person_id = ".$this->db_add_param($person_id)."
AND not exists( AND not exists(
SELECT * SELECT *
@@ -910,6 +910,11 @@ class dokument extends basis_db
where dok.prestudent_id = ps.prestudent_id where dok.prestudent_id = ps.prestudent_id
and dokument_kurzbz = ".$this->db_add_param($dokument_kurzbz).")"; and dokument_kurzbz = ".$this->db_add_param($dokument_kurzbz).")";
if (isset($studiengang_typen) && is_array($studiengang_typen) && !empty($studiengang_typen))
{
$qry .= ' AND sg.typ IN ('. $db->db_implode4SQL($studiengang_typen).')';
}
//gibt ein Array von zu akzeptierenden Dokumenten zurück //gibt ein Array von zu akzeptierenden Dokumenten zurück
if ($db->db_query($qry)) if ($db->db_query($qry))
{ {
@@ -923,11 +928,14 @@ class dokument extends basis_db
} }
//für alle prestudent_ids das Dokument akzeptieren //für alle prestudent_ids das Dokument akzeptieren
$qry = "INSERT INTO public.tbl_dokumentprestudent(dokument_kurzbz, prestudent_id) VALUES"; $qry = "INSERT INTO public.tbl_dokumentprestudent(dokument_kurzbz, prestudent_id, datum, insertamum) VALUES";
foreach ($arrayDoksZuAkzeptieren as $prestudent_id) foreach ($arrayDoksZuAkzeptieren as $prestudent_id)
{ {
$qry .= "(".$this->db_add_param($dokument_kurzbz). ",". $prestudent_id. ")"; $qry .= "(".$this->db_add_param($dokument_kurzbz).
",".$this->db_add_param($prestudent_id, FHC_INTEGER).
",".$this->db_add_param(date('Y-m-d')).
",".$this->db_add_param(strftime('%Y-%m-%d %H:%M')). ")";
if (next($arrayDoksZuAkzeptieren) == true) if (next($arrayDoksZuAkzeptieren) == true)
{ {
+28
View File
@@ -2861,5 +2861,33 @@ class lehrveranstaltung extends basis_db
return false; return false;
} }
} }
public function getStudienplanLehrveranstaltung($lehrveranstaltung_id, $studienplan_id)
{
$qry = "SELECT studienplan_lehrveranstaltung_id
FROM lehre.tbl_lehrveranstaltung
JOIN lehre.tbl_studienplan_lehrveranstaltung USING(lehrveranstaltung_id)
WHERE lehrveranstaltung_id = ".$this->db_add_param($lehrveranstaltung_id)."
AND tbl_studienplan_lehrveranstaltung.studienplan_id = ".$this->db_add_param($studienplan_id);"";
if($result = $this->db_query($qry))
{
if($row = $this->db_fetch_object($result))
{
return $row->studienplan_lehrveranstaltung_id;
}
else
{
$this->errormsg = 'Fehler beim Ermitteln der studienplan_lehrveranstaltung_id';
return false;
}
}
else
{
$this->errormsg='Fehler bei Datenbankabfrage ' .$this->db_last_error();
}
return null;
}
} }
?> ?>
+32
View File
@@ -464,6 +464,7 @@ class pruefungCis extends basis_db
$obj->anmeldung_von= $row->anmeldung_von; $obj->anmeldung_von= $row->anmeldung_von;
$obj->anmeldung_bis = $row->anmeldung_bis; $obj->anmeldung_bis = $row->anmeldung_bis;
$obj->ort_kurzbz = $row->ort_kurzbz; $obj->ort_kurzbz = $row->ort_kurzbz;
$obj->anderer_raum = $row->anderer_raum;
$obj->sammelklausur = $row->sammelklausur; $obj->sammelklausur = $row->sammelklausur;
array_push($this->termine, $obj); array_push($this->termine, $obj);
} }
@@ -646,6 +647,37 @@ class pruefungCis extends basis_db
return false; return false;
} }
public function getPruefungByStudiensemester($studiensemester_kurzbz)
{
if(empty($studiensemester_kurzbz))
{
$this->errormsg = "Kein Studiensemester übergeben.</br>";
return false;
}
$qry = 'SELECT *
FROM campus.tbl_lehrveranstaltung_pruefung
JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
JOIN campus.tbl_pruefung USING (pruefung_id)
WHERE tbl_pruefung.studiensemester_kurzbz = ' . $this->db_add_param($studiensemester_kurzbz);
if($this->db_query($qry))
{
while($row = $this->db_fetch_object())
{
$obj = new stdClass();
$obj->lehrveranstaltung_pruefung_id = $row->lehrveranstaltung_pruefung_id;
$obj->lehrveranstaltung_id = $row->lehrveranstaltung_id;
$obj->pruefung_id = $row->pruefung_id;
$obj->storniert = $row->storniert;
$obj->bezeichnung = $row->bezeichnung;
array_push($this->lehrveranstaltungen, $obj);
}
return true;
}
return false;
}
/** /**
* Lädt alle Prüfung-Lehrveranstaltung Kombinationen * Lädt alle Prüfung-Lehrveranstaltung Kombinationen
* @return boolean true, wenn ok; false, im Fehlerfall * @return boolean true, wenn ok; false, im Fehlerfall
+9 -3
View File
@@ -39,6 +39,7 @@ class pruefungsanmeldung extends basis_db {
public $statusupdatevon; //varchar(32) public $statusupdatevon; //varchar(32)
public $statusupdateamum; //timestamp public $statusupdateamum; //timestamp
public $anrechnung_id; //integer public $anrechnung_id; //integer
public $ects; //integer
public $pruefungstyp_kurzbz; //varchar(32) public $pruefungstyp_kurzbz; //varchar(32)
public $insertamum; // timestamp public $insertamum; // timestamp
@@ -94,7 +95,7 @@ class pruefungsanmeldung extends basis_db {
if($new) if($new)
{ {
$qry = 'INSERT INTO campus.tbl_pruefungsanmeldung (uid, pruefungstermin_id, lehrveranstaltung_id, status_kurzbz, wuensche, reihung, kommentar, anrechnung_id, pruefungstyp_kurzbz) VALUES (' $qry = 'INSERT INTO campus.tbl_pruefungsanmeldung (uid, pruefungstermin_id, lehrveranstaltung_id, status_kurzbz, wuensche, reihung, kommentar, anrechnung_id, pruefungstyp_kurzbz, ects) VALUES ('
. $this->db_add_param($this->uid).', ' . $this->db_add_param($this->uid).', '
. $this->db_add_param($this->pruefungstermin_id).', ' . $this->db_add_param($this->pruefungstermin_id).', '
. $this->db_add_param($this->lehrveranstaltung_id).', ' . $this->db_add_param($this->lehrveranstaltung_id).', '
@@ -103,7 +104,8 @@ class pruefungsanmeldung extends basis_db {
. $this->db_add_param($this->reihung).', ' . $this->db_add_param($this->reihung).', '
. $this->db_add_param($this->kommentar).', ' . $this->db_add_param($this->kommentar).', '
. $this->db_add_param($this->anrechnung_id).', ' . $this->db_add_param($this->anrechnung_id).', '
. $this->db_add_param($this->pruefungstyp_kurzbz).');'; . $this->db_add_param($this->pruefungstyp_kurzbz).', '
. $this->db_add_param($this->ects).');';
} }
else else
{ {
@@ -116,7 +118,8 @@ class pruefungsanmeldung extends basis_db {
. 'reihung='.$this->db_add_param($this->reihung).', ' . 'reihung='.$this->db_add_param($this->reihung).', '
. 'kommentar='.$this->db_add_param($this->kommentar).', ' . 'kommentar='.$this->db_add_param($this->kommentar).', '
. 'anrechnung_id='.$this->db_add_param($this->anrechnung_id).', ' . 'anrechnung_id='.$this->db_add_param($this->anrechnung_id).', '
. 'pruefungstyp_kurzbz='.$this->db_add_param($this->pruefungstyp_kurzbz) . 'pruefungstyp_kurzbz='.$this->db_add_param($this->pruefungstyp_kurzbz).', '
. 'ects='.$this->db_add_param($this->ects)
. ' WHERE pruefungsanmeldung_id='.$this->db_add_param($this->pruefungsanmeldung_id).';'; . ' WHERE pruefungsanmeldung_id='.$this->db_add_param($this->pruefungsanmeldung_id).';';
} }
@@ -167,6 +170,7 @@ class pruefungsanmeldung extends basis_db {
$this->statusupdatevon = $row->statusupdatevon; $this->statusupdatevon = $row->statusupdatevon;
$this->anrechnung_id = $row->anrechnung_id; $this->anrechnung_id = $row->anrechnung_id;
$this->pruefungstyp_kurzbz = $row->pruefungstyp_kurzbz; $this->pruefungstyp_kurzbz = $row->pruefungstyp_kurzbz;
$this->ects = $row->ects;
$this->insertamum = $row->insertamum; $this->insertamum = $row->insertamum;
} }
return true; return true;
@@ -221,6 +225,7 @@ class pruefungsanmeldung extends basis_db {
$anmeldung->statusupdatevon = $row->statusupdatevon; $anmeldung->statusupdatevon = $row->statusupdatevon;
$anmeldung->anrechnung_id = $row->anrechnung_id; $anmeldung->anrechnung_id = $row->anrechnung_id;
$anmeldung->pruefungstyp_kurzbz = $row->pruefungstyp_kurzbz; $anmeldung->pruefungstyp_kurzbz = $row->pruefungstyp_kurzbz;
$anmeldung->ects = $row->ects;
array_push($anmeldungen, $anmeldung); array_push($anmeldungen, $anmeldung);
} }
return $anmeldungen; return $anmeldungen;
@@ -280,6 +285,7 @@ class pruefungsanmeldung extends basis_db {
$anmeldung->statusupdatevon = $row->statusupdatevon; $anmeldung->statusupdatevon = $row->statusupdatevon;
$anmeldung->anrechnung_id = $row->anrechnung_id; $anmeldung->anrechnung_id = $row->anrechnung_id;
$anmeldung->pruefungstyp_kurzbz = $row->pruefungstyp_kurzbz; $anmeldung->pruefungstyp_kurzbz = $row->pruefungstyp_kurzbz;
$anmeldung->ects = $row->ects;
$anmeldung->datum_anmeldung = $row->datum_anmeldung; $anmeldung->datum_anmeldung = $row->datum_anmeldung;
array_push($anmeldungen, $anmeldung); array_push($anmeldungen, $anmeldung);
} }
+21 -1
View File
@@ -37,6 +37,7 @@ class pruefungstermin extends basis_db{
public $anmeldung_von; //date public $anmeldung_von; //date
public $anmeldung_bis; //date public $anmeldung_bis; //date
public $ort_kurzbz; //varchar(16) public $ort_kurzbz; //varchar(16)
public $anderer_raum; //text
public $sammelklausur; //boolean public $sammelklausur; //boolean
/** /**
@@ -93,6 +94,7 @@ class pruefungstermin extends basis_db{
$this->anmeldung_von= $row->anmeldung_von; $this->anmeldung_von= $row->anmeldung_von;
$this->anmeldung_bis = $row->anmeldung_bis; $this->anmeldung_bis = $row->anmeldung_bis;
$this->ort_kurzbz = $row->ort_kurzbz; $this->ort_kurzbz = $row->ort_kurzbz;
$this->anderer_raum = $row->anderer_raum;
$this->sammelklausur = $row->sammelklausur; $this->sammelklausur = $row->sammelklausur;
} }
return true; return true;
@@ -179,7 +181,8 @@ class pruefungstermin extends basis_db{
. 'teilnehmer_min='.$this->db_add_param($this->teilnehmer_min).', ' . 'teilnehmer_min='.$this->db_add_param($this->teilnehmer_min).', '
. 'anmeldung_von='.$this->db_add_param($this->anmeldung_von).', ' . 'anmeldung_von='.$this->db_add_param($this->anmeldung_von).', '
. 'anmeldung_bis='.$this->db_add_param($this->anmeldung_bis).', ' . 'anmeldung_bis='.$this->db_add_param($this->anmeldung_bis).', '
. 'ort_kurzbz='.$this->db_add_param($this->ort_kurzbz).' ' . 'ort_kurzbz='.$this->db_add_param($this->ort_kurzbz).', '
. 'anderer_raum='.$this->db_add_param($this->anderer_raum).' '
. 'WHERE pruefungstermin_id='.$this->db_add_param($this->pruefungstermin_id).';'; . 'WHERE pruefungstermin_id='.$this->db_add_param($this->pruefungstermin_id).';';
} }
@@ -228,6 +231,7 @@ class pruefungstermin extends basis_db{
$obj->anmeldung_von= $row->anmeldung_von; $obj->anmeldung_von= $row->anmeldung_von;
$obj->anmeldung_bis = $row->anmeldung_bis; $obj->anmeldung_bis = $row->anmeldung_bis;
$obj->ort_kurzbz = $row->ort_kurzbz; $obj->ort_kurzbz = $row->ort_kurzbz;
$obj->anderer_raum = $row->anderer_raum;
$obj->sammelklausur = $row->sammelklausur; $obj->sammelklausur = $row->sammelklausur;
array_push($this->result, $obj); array_push($this->result, $obj);
} }
@@ -240,4 +244,20 @@ class pruefungstermin extends basis_db{
} }
} }
public function delete($pruefungstermin_id)
{
$qry = "DELETE FROM campus.tbl_pruefungstermin WHERE pruefungstermin_id=".$this->db_add_param($pruefungstermin_id).";";
if($this->db_query($qry))
{
return true;
}
else
{
$this->errormsg='Fehler beim Löschen des Eintrages';
return false;
}
}
} }
+32
View File
@@ -322,5 +322,37 @@ class reservierung extends basis_db
} }
} }
public function getReservierungen($ort_kurzbz, $datum)
{
$datum_obj = new Datum();
if(!$datum_obj->checkDatum($datum))
{
$this->errormsg='Datum hat ein ungueltiges Format';
return false;
}
$qry = "SELECT stunde FROM campus.tbl_reservierung
WHERE
ort_kurzbz=".$this->db_add_param($ort_kurzbz)." AND
datum=".$this->db_add_param($datum);
if($this->db_query($qry))
{
$result = array();
while($row = $this->db_fetch_object())
{
$result[] = $row->stunde;
}
}
else
{
$this->errormsg = "Prüfungstypen konnten nicht geladen werden.";
return false;
}
return $result;
}
} }
?> ?>
+12
View File
@@ -57,6 +57,7 @@ $this->phrasen['pruefung/listeOhneNamenDrucken'] = 'Liste ohne Namen drucken';
$this->phrasen['pruefung/pruefungsraum'] = 'Prüfungsraum: '; $this->phrasen['pruefung/pruefungsraum'] = 'Prüfungsraum: ';
$this->phrasen['pruefung/pruefungsort'] = 'Prüfungsort '; $this->phrasen['pruefung/pruefungsort'] = 'Prüfungsort ';
$this->phrasen['pruefung/imBuero'] = ' im Büro'; $this->phrasen['pruefung/imBuero'] = ' im Büro';
$this->phrasen['pruefung/andererRaum'] = 'anderer Raum';
$this->phrasen['pruefung/raum'] = ' Raum'; $this->phrasen['pruefung/raum'] = ' Raum';
$this->phrasen['pruefung/raumSpeichern'] = ' Raum speichern'; $this->phrasen['pruefung/raumSpeichern'] = ' Raum speichern';
$this->phrasen['pruefung/reihunghErfolgreichGeaendert'] = 'Reihung erfolgreich geändert.'; $this->phrasen['pruefung/reihunghErfolgreichGeaendert'] = 'Reihung erfolgreich geändert.';
@@ -77,6 +78,7 @@ $this->phrasen['pruefung/unbegrenzt'] = 'unbegrenzt';
$this->phrasen['pruefung/bewertungenZu'] = 'Bewertungen zu'; $this->phrasen['pruefung/bewertungenZu'] = 'Bewertungen zu';
$this->phrasen['pruefung/keineAuswahl'] = 'Keine Auswahl'; $this->phrasen['pruefung/keineAuswahl'] = 'Keine Auswahl';
$this->phrasen['pruefung/alleBestaetigen'] = 'Alle bestätigen'; $this->phrasen['pruefung/alleBestaetigen'] = 'Alle bestätigen';
$this->phrasen['pruefung/bitteEmailAngeben'] = 'Bitte geben Sie eine gültige E-Mail-Adresse ein.';
// pruefungsbewertung // pruefungsbewertung
$this->phrasen['pruefung/pruefungsbewertungTitle'] = 'Prüfungsbewertung'; $this->phrasen['pruefung/pruefungsbewertungTitle'] = 'Prüfungsbewertung';
@@ -95,6 +97,7 @@ $this->phrasen['pruefung/lvVonStudiengang'] = 'Lehrveranstaltungen von Studienga
$this->phrasen['pruefung/lvAlle'] = 'Alle Lehrveranstaltungen'; $this->phrasen['pruefung/lvAlle'] = 'Alle Lehrveranstaltungen';
$this->phrasen['pruefung/anmeldungSpeichern'] = 'Anmeldung speichern'; $this->phrasen['pruefung/anmeldungSpeichern'] = 'Anmeldung speichern';
$this->phrasen['pruefung/studienverpflichtung'] = 'Studienverpflichtung'; $this->phrasen['pruefung/studienverpflichtung'] = 'Studienverpflichtung';
$this->phrasen['pruefung/ects'] = 'ECTS';
// liste // liste
$this->phrasen['pruefung/anmeldungsliste'] = 'Anmeldungsliste'; $this->phrasen['pruefung/anmeldungsliste'] = 'Anmeldungsliste';
@@ -139,6 +142,15 @@ $this->phrasen['pruefung/emailBodyOrt'] = 'Ort:';
$this->phrasen['pruefung/emailBodyLinkZurAnmeldung'] = 'Link zur Anmeldung'; $this->phrasen['pruefung/emailBodyLinkZurAnmeldung'] = 'Link zur Anmeldung';
$this->phrasen['pruefung/emailBodyBitteHtmlSicht'] = 'Bitte sehen Sie sich die Nachricht in HTML Sicht an, um den Link vollständig darzustellen.'; $this->phrasen['pruefung/emailBodyBitteHtmlSicht'] = 'Bitte sehen Sie sich die Nachricht in HTML Sicht an, um den Link vollständig darzustellen.';
// Sammelmail
$this->phrasen['pruefung/sammelemailBody'] = 'Die Anmeldungen zur Prüfung %s am %s wurde von %s bestätigt. <br />';
$this->phrasen['pruefung/sammelemailBody2'] = 'Ort: %s<br />';
$this->phrasen['pruefung/sammelemailBodyBestaetigt'] = 'Bestätigt von';
$this->phrasen['pruefung/sammelemailBodyPruefung'] = 'Prüfung';
$this->phrasen['pruefung/sammelemailBodyTermin'] = 'Termin';
$this->phrasen['pruefung/sammelemailBodyDauer'] = 'Dauer';
$this->phrasen['pruefung/emailLektorSubjectAnmeldung'] = 'Anmeldung zur Prüfung'; $this->phrasen['pruefung/emailLektorSubjectAnmeldung'] = 'Anmeldung zur Prüfung';
$this->phrasen['pruefung/emailLektorStudentIn'] = 'StudentIn'; $this->phrasen['pruefung/emailLektorStudentIn'] = 'StudentIn';
$this->phrasen['pruefung/emailLektorHatSichZurPruefung'] = 'hat sich zur Prüfung'; $this->phrasen['pruefung/emailLektorHatSichZurPruefung'] = 'hat sich zur Prüfung';
+10
View File
@@ -57,6 +57,7 @@ $this->phrasen['pruefung/listeOhneNamenDrucken'] = 'Liste ohne Namen drucken';
$this->phrasen['pruefung/pruefungsraum'] = 'Prüfungsraum: '; $this->phrasen['pruefung/pruefungsraum'] = 'Prüfungsraum: ';
$this->phrasen['pruefung/pruefungsort'] = 'Prüfungsort '; $this->phrasen['pruefung/pruefungsort'] = 'Prüfungsort ';
$this->phrasen['pruefung/imBuero'] = ' im Büro'; $this->phrasen['pruefung/imBuero'] = ' im Büro';
$this->phrasen['pruefung/andererRaum'] = 'other Room';
$this->phrasen['pruefung/raum'] = ' Raum'; $this->phrasen['pruefung/raum'] = ' Raum';
$this->phrasen['pruefung/raumSpeichern'] = ' Raum speichern'; $this->phrasen['pruefung/raumSpeichern'] = ' Raum speichern';
$this->phrasen['pruefung/reihunghErfolgreichGeaendert'] = 'Reihung erfolgreich geändert.'; $this->phrasen['pruefung/reihunghErfolgreichGeaendert'] = 'Reihung erfolgreich geändert.';
@@ -77,6 +78,7 @@ $this->phrasen['pruefung/unbegrenzt'] = 'unlimited';
$this->phrasen['pruefung/bewertungenZu'] = 'Bewertungen zu'; $this->phrasen['pruefung/bewertungenZu'] = 'Bewertungen zu';
$this->phrasen['pruefung/keineAuswahl'] = 'Keine Auswahl'; $this->phrasen['pruefung/keineAuswahl'] = 'Keine Auswahl';
$this->phrasen['pruefung/alleBestaetigen'] = 'Confirm all'; $this->phrasen['pruefung/alleBestaetigen'] = 'Confirm all';
$this->phrasen['pruefung/bitteEmailAngeben'] = 'Please enter a valid E-Mail Address.';
// pruefungsbewertung // pruefungsbewertung
$this->phrasen['pruefung/pruefungsbewertungTitle'] = 'Prüfungsbewertung'; $this->phrasen['pruefung/pruefungsbewertungTitle'] = 'Prüfungsbewertung';
@@ -139,6 +141,14 @@ $this->phrasen['pruefung/emailBodyOrt'] = 'Ort:';
$this->phrasen['pruefung/emailBodyLinkZurAnmeldung'] = 'Link zur Anmeldung'; $this->phrasen['pruefung/emailBodyLinkZurAnmeldung'] = 'Link zur Anmeldung';
$this->phrasen['pruefung/emailBodyBitteHtmlSicht'] = 'Bitte sehen Sie sich die Nachricht in HTML Sicht an, um den Link vollständig darzustellen.'; $this->phrasen['pruefung/emailBodyBitteHtmlSicht'] = 'Bitte sehen Sie sich die Nachricht in HTML Sicht an, um den Link vollständig darzustellen.';
// Sammelmail
$this->phrasen['pruefung/sammelemailBody'] = 'The exam registrations for %s on %s have been confirmed by %s. <br />';
$this->phrasen['pruefung/sammelemailBody2'] = 'Place: %s<br />';
$this->phrasen['pruefung/sammelemailBodyBestaetigt'] = 'Confirmed by';
$this->phrasen['pruefung/sammelemailBodyPruefung'] = 'Exam';
$this->phrasen['pruefung/sammelemailBodyTermin'] = 'Exam date';
$this->phrasen['pruefung/sammelemailBodyDauer'] = 'Duration';
$this->phrasen['pruefung/emailLektorSubjectAnmeldung'] = 'Anmeldung zur Prüfung'; $this->phrasen['pruefung/emailLektorSubjectAnmeldung'] = 'Anmeldung zur Prüfung';
$this->phrasen['pruefung/emailLektorStudentIn'] = 'StudentIn'; $this->phrasen['pruefung/emailLektorStudentIn'] = 'StudentIn';
$this->phrasen['pruefung/emailLektorHatSichZurPruefung'] = 'hat sich zur Prüfung'; $this->phrasen['pruefung/emailLektorHatSichZurPruefung'] = 'hat sich zur Prüfung';
+40
View File
@@ -0,0 +1,40 @@
textarea[name="anmerkung"] {
position: absolute;
max-height: 300px;
}
.lv_table_icon::before
{
font-family: 'Font Awesome 6 Free';
font-weight: 900;
margin-left: 5px;
display: inline-block;
}
.lv_table_icon.icon-modul::before
{
content: '\f468';
color: #4e4ed2;
}
.lv_table_icon.icon-lv::before
{
content: '\f466';
color: black;
}
.lv_table_icon.icon-::before
{
content: '\f073';
color: #f3c541;
}
.modal-dialog.modal-xxl {
max-width: 95% !important;
}
.tabulator-menu .tabulator-menu-item.tabulator-menu-item-submenu:after
{
border-color: black;
}
+153 -1
View File
@@ -1 +1,153 @@
@import '../../vendor/olifolkerd/tabulator6/dist/css/tabulator_simple.min.css'; @import '../../vendor/olifolkerd/tabulator6/dist/css/tabulator_simple.min.css';
.tabulator-row {
border-bottom: none;
}
.tabulator-row .tabulator-frozen,
.tabulator-row .tabulator-cell {
border-bottom: 1px solid #dee2e6;
}
.tabulator-row.tabulator-row-even {
background-color: transparent;
}
.tabulator-headers .tabulator-frozen,
.tabulator-row.tabulator-row-odd .tabulator-frozen,
.tabulator-row.tabulator-row-odd .tabulator-cell {
background-color: #fff;
}
.tabulator-row.tabulator-row-even .tabulator-frozen,
.tabulator-row.tabulator-row-even .tabulator-cell {
background-color: #f2f2f2;
}
.tabulator-row.tabulator-selectable:hover .tabulator-frozen,
.tabulator-row.tabulator-selectable:hover .tabulator-cell {
background-color: #ececec;
}
.tabulator-row.tabulator-selected .tabulator-frozen,
.tabulator-row.tabulator-selected .tabulator-cell {
background-color: #9abcea;
}
.tabulator-row.tabulator-selected:hover .tabulator-frozen,
.tabulator-row.tabulator-selected:hover .tabulator-cell {
background-color: #769bcc;
}
.tabulator .tabulator-col-resize-handle:last-of-type {
z-index: 999999;
}
/* classes for rows that are not selectable in the tabulator, except for rows that are used for calculation */
.tabulator-row.tabulator-unselectable:not(.tabulator-calcs) {
color: #adb5bd !important;
pointer-events: none !important;
}
.tabulator-row.tabulator-unselectable a {
pointer-events: auto !important;
}
/* using bootstrap background classes to style the background color of tabulator rows */
/* bg-warning */
/* odd-rows */
.tabulator-headers .tabulator-frozen.bg-warning,
.tabulator-row.tabulator-row-odd .tabulator-frozen.bg-warning,
.tabulator-row.tabulator-row-odd .tabulator-cell.bg-warning {
background-color: #fcf8e3;
}
/* even-rows */
.tabulator-headers .tabulator-frozen.bg-warning,
.tabulator-row.tabulator-row-even .tabulator-frozen.bg-warning,
.tabulator-row.tabulator-row-even .tabulator-cell.bg-warning {
background-color: #fcf8e3;
}
/* bg-success */
/* odd-rows */
.tabulator-headers .tabulator-frozen.bg-success,
.tabulator-row.tabulator-row-odd .tabulator-frozen.bg-success,
.tabulator-row.tabulator-row-odd .tabulator-cell.bg-success {
background-color: #dff0d8;
}
/* even-rows */
.tabulator-headers .tabulator-frozen.bg-success,
.tabulator-row.tabulator-row-even .tabulator-frozen.bg-success,
.tabulator-row.tabulator-row-even .tabulator-cell.bg-success {
background-color: #dff0d8;
}
/* bg-info */
/* odd-rows */
.tabulator-headers .tabulator-frozen.bg-info,
.tabulator-row.tabulator-row-odd .tabulator-frozen.bg-info,
.tabulator-row.tabulator-row-odd .tabulator-cell.bg-info {
background-color: #d9edf7;
}
/* even-rows */
.tabulator-headers .tabulator-frozen.bg-info,
.tabulator-row.tabulator-row-even .tabulator-frozen.bg-info,
.tabulator-row.tabulator-row-even .tabulator-cell.bg-info {
background-color: #d9edf7;
}
/* special bootstrap5 styling for tableWidget and their accordion-item ::after content */
.accordion-button::after{
content:none !important;
}
.tabulator {
font-size: 1rem;
}
.tabulator-initialfontsize .tabulator {
font-size: 14px;
}
.tabulator-row.tabulator-unselectable .tabulator-cell {
pointer-events: all;
}
.tabulator-tooltip {
color: #fff;
background-color: #000;
}
.tabulator-row.tabulator-unselectable:not(.tabulator-calcs) {
color: #777 !important;
}
.tabulator-cell .btn {
padding: 0 .375rem;
font-size: calc(1rem - 2px / 1.5); /* substract border (2 x 1px) modified by the line-height (1.5) */
border-radius: .2rem;
vertical-align: baseline;
}
.tabulator-row.tabulator-selectable:focus {
box-shadow: 0 0 0 .24rem rgba(13,110,253,.25);
z-index: 1;
outline: 0;
}
.btn-select-col-selected
{
background-color: #e6e6e6;
}
.accordion-item-dark, .accordion-item-dark:focus{
background-color:#CED4DA !important;
border-color:#ADB5BD !important;
box-shadow: none !important;
}
/**
* Make keyboard-focused list items look like the mouse-hovered list items
*/
.tabulator-edit-list .tabulator-edit-list-item.focused {
color: #fff;
background: #1d68cd;
}
+4 -1
View File
@@ -16,7 +16,10 @@
*/ */
import person from "./notiz/person.js"; import person from "./notiz/person.js";
import lehreinheit from "./notiz/lehreinheit.js";
export default { export default {
person person,
lehreinheit
}; };
@@ -0,0 +1,29 @@
/**
* Copyright (C) 2025 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import Person from './person.js';
export default {
...Person,
getNotizen(id, type) {
return {
method: 'get',
url: 'api/frontend/v1/notiz/notizLehreinheit/getNotizen/' + encodeURIComponent(id) + '/' + encodeURIComponent(type)
};
},
};
+36
View File
@@ -0,0 +1,36 @@
export default {
getByLV(lehrveranstaltung_id)
{
return {
method: 'get',
url: '/api/frontend/v1/Lehrveranstaltung/loadByLV/' + encodeURIComponent(lehrveranstaltung_id)
};
},
getByStg(studiensemester_kurzbz, studiengang_kz, semester = null)
{
let path = "/api/frontend/v1/Lehrveranstaltung/getByStg/" + encodeURIComponent(studiensemester_kurzbz) + "/" + encodeURIComponent(studiengang_kz);
if (semester)
path += "/" + encodeURIComponent(semester);
return path;
},
getByEmp(studiensemester_kurzbz, mitarbeiter_uid, stg = null)
{
let path = "/api/frontend/v1/Lehrveranstaltung/getByEmp/" + encodeURIComponent(studiensemester_kurzbz) + "/" + encodeURIComponent(mitarbeiter_uid);
if (stg)
path += "/" + encodeURIComponent(stg);
return path;
},
getTable(url)
{
return {
method: 'get',
url: url
};
},
}
@@ -0,0 +1,30 @@
export default {
getStudiensemester()
{
return {
method: 'get',
url: '/api/frontend/v1/lv/setup/getStudiensemester/'
};
},
getSprache()
{
return {
method: 'get',
url: '/api/frontend/v1/lv/setup/getSprache/'
};
},
getLehrform()
{
return {
method: 'get',
url: '/api/frontend/v1/lv/setup/getLehrform/'
};
},
getRaumtyp()
{
return {
method: 'get',
url: '/api/frontend/v1/lv/setup/getRaumtyp/'
};
},
}
@@ -0,0 +1,26 @@
export default {
add(newData)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/DirektGruppe/add/',
params: newData
};
},
delete(deleteData)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/DirektGruppe/delete/',
params: deleteData
};
},
getByLehreinheit(lehreinheit_id)
{
return {
method: 'get',
url: '/api/frontend/v1/lv/DirektGruppe/getByLehreinheit/' + encodeURIComponent(lehreinheit_id)
};
},
}
+56
View File
@@ -0,0 +1,56 @@
export default {
delete(deleteData)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/gruppe/delete/',
params: deleteData
};
},
add(newData)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/gruppe/add/',
params: newData
};
},
getByLehreinheit(lehreinheit_id)
{
return {
method: 'get',
url: '/api/frontend/v1/lv/gruppe/getByLehreinheit/' + encodeURIComponent(lehreinheit_id)
};
},
deleteFromLVPlan(deleteData)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/gruppe/deleteFromLVPlan/',
params: deleteData
};
},
/*------------- details -------- */
getAll()
{
return {
method: 'get',
url: '/api/frontend/v1/lv/gruppe/getAll/'
};
},
getBenutzer()
{
return {
method: 'get',
url: '/api/frontend/v1/lv/gruppe/getBenutzer/'
};
}
}
@@ -0,0 +1,41 @@
export default {
copy(data)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/lehreinheit/copy/',
params: data
};
},
delete(data)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/lehreinheit/delete/',
params: data
};
},
add(newData)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/lehreinheit/add/',
params: newData
};
},
get(lehreinheit)
{
return {
method: 'get',
url: '/api/frontend/v1/lv/lehreinheit/get/' + encodeURIComponent(lehreinheit)
};
},
update(updatedData)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/lehreinheit/update/',
params: updatedData
};
},
}
+78
View File
@@ -0,0 +1,78 @@
export default {
getLehrfunktionen()
{
return {
method: 'get',
url: '/api/frontend/v1/lv/lektor/getLehrfunktionen/'
};
},
getLektoren()
{
return {
method: 'get',
url: '/api/frontend/v1/lv/lektor/getLektoren/'
};
},
getByLehreinheit(lehreinheit_id)
{
return {
method: 'get',
url: '/api/frontend/v1/lv/lektor/getLektorenByLE/' + encodeURIComponent(lehreinheit_id)
};
},
add(newData)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/lektor/add/',
params: newData
};
},
update(updatedData)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/lektor/update/',
params: updatedData
};
},
deletePerson(deleteData)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/lektor/deletePerson/',
params: deleteData
};
},
deleteFromLVPlan(deleteData)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/lektor/deleteLVPlan/',
params: deleteData
};
},
getLektorDaten(lehreinheit_id, mitarbeiter_uid)
{
return {
method: 'get',
url: '/api/frontend/v1/lv/lektor/getLektorDaten/' + encodeURIComponent(lehreinheit_id) + '/' + encodeURIComponent(mitarbeiter_uid)
};
},
}
+9
View File
@@ -0,0 +1,9 @@
export default {
getTabs()
{
return {
method: 'get',
url: '/api/frontend/v1/lv/setup/getTabs/'
};
},
}
@@ -0,0 +1,43 @@
/**
* Copyright (C) 2025 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export default {
get(path) {
let url = 'api/frontend/v1/lv/StgTree';
if (path)
url += '/' + path;
return {
method: 'get',
url
};
},
favorites: {
get() {
return {
method: 'get',
url: 'api/frontend/v1/lv/favorites'
};
},
set(favorites) {
return {
method: 'post',
url: 'api/frontend/v1/lv/favorites/set',
params: { favorites }
};
}
}
};
+54
View File
@@ -0,0 +1,54 @@
export default {
getTag(data)
{
return {
method: 'get',
url: 'api/frontend/v1/lv/Tags/getTag',
params: data
};
},
getTags(data)
{
return {
method: 'get',
url: 'api/frontend/v1/lv/Tags/getTags'
};
},
addTag(data)
{
return {
method: 'post',
url: 'api/frontend/v1/lv/Tags/addTag',
params: data
};
},
updateTag(data)
{
return {
method: 'post',
url: 'api/frontend/v1/lv/Tags/updateTag',
params: data
};
},
doneTag(data)
{
return {
method: 'post',
url: 'api/frontend/v1/lv/Tags/doneTag',
params: data
};
},
deleteTag(data)
{
return {
method: 'post',
url: 'api/frontend/v1/lv/Tags/deleteTag',
params: data
};
},
};
@@ -0,0 +1,22 @@
export default {
getByLeEmp(lehreinheit_id, mitarbeiter_uid)
{
return {
method: 'get',
url: '/api/frontend/v1/lv/lektor/getLektorDaten/' + encodeURIComponent(lehreinheit_id) + '/' + encodeURIComponent(mitarbeiter_uid),
};
},
cancelByLeEmp(needUpdate)
{
return {
method: 'post',
url: '/api/frontend/v1/lv/lektor/cancelVertrag/',
params: needUpdate
};
},
}
+2 -2
View File
@@ -50,7 +50,7 @@ const app = Vue.createApp({
defaultaction: { defaultaction: {
type: "link", type: "link",
renderif: function(data) { renderif: function(data) {
if(data.content_id === "N/A"){ if(data.content_id === null){
return false; return false;
} }
return true; return true;
@@ -79,7 +79,7 @@ const app = Vue.createApp({
icon: "fas fa-info-circle", icon: "fas fa-info-circle",
type: "link", type: "link",
renderif: function(data) { renderif: function(data) {
if(data.content_id === "N/A"){ if(data.content_id === null){
return false; return false;
} }
return true; return true;
+102
View File
@@ -0,0 +1,102 @@
import LVVerwaltung from "../components/LVVerwaltung/LVVerwaltung.js";
import Phrasen from "../plugins/Phrasen.js";
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
const router = VueRouter.createRouter({
history: VueRouter.createWebHistory(`/${ciPath}/LVVerwaltung`),
routes: [
{
name: 'index',
path: `/`,
component: LVVerwaltung
},
{
name: `byEmp`,
path: `/emp/:studiensemester_kurzbz/:emp/:stg?/:semester?`,
component: LVVerwaltung,
props: route => {
let {emp, stg, semester, studiensemester_kurzbz} = route.params;
if (emp === '')
emp = undefined;
if (stg === '')
stg = undefined;
if (studiensemester_kurzbz === '')
studiensemester_kurzbz = undefined;
return {
studiensemester_kurzbz: studiensemester_kurzbz,
emp: emp,
stg: stg,
semester: semester
};
},
beforeEnter: (to, from, next) => {
const { studiensemester_kurzbz } = to.params;
const isSemester = /^(SS|WS)\d{4}$/.test(studiensemester_kurzbz);
if (!isSemester)
return next({ path: '/' });
else
next();
}
},
/*{
name: `byFachbereich`,
path: `/fachbereich/:fachbereich/:emp?`,
component: LVVerwaltung
},*/
{
name: `byStg`,
path: '/stg/:studiensemester_kurzbz/:stg?/:semester?/',
component: LVVerwaltung,
props: route => {
let { studiensemester_kurzbz, stg, semester } = route.params;
if (semester === '')
semester = undefined;
if (studiensemester_kurzbz === '')
studiensemester_kurzbz = undefined;
if (stg === '')
stg = undefined;
return {
studiensemester_kurzbz: studiensemester_kurzbz,
stg: stg,
semester: semester,
};
},
beforeEnter: (to, from, next) => {
const studiensemester_kurzbz = to.params?.studiensemester_kurzbz
const isSemester = /^(SS|WS)\d{4}$/.test(studiensemester_kurzbz);
if (!isSemester)
return next({ path: '/' });
else
next();
}
},
{
path: '/:pathMatch(.*)*',
redirect: '/'
},
]
});
const app = Vue.createApp();
app
.use(router)
.use(primevue.config.default, {
zIndex: {
overlay: 1100
}
})
.use(Phrasen)
.mount('#main');
+10 -27
View File
@@ -2,6 +2,8 @@ import raum_contentmittitel from './Content_types/Raum_contentmittitel.js'
import general from './Content_types/General.js' import general from './Content_types/General.js'
import BsConfirm from "../../Bootstrap/Confirm.js"; import BsConfirm from "../../Bootstrap/Confirm.js";
import news_content from './Content_types/News_content.js'; import news_content from './Content_types/News_content.js';
import iframe_content from './Content_types/Iframe_content.js';
import ApiCms from '../../../api/factory/cms.js'; import ApiCms from '../../../api/factory/cms.js';
export default { export default {
@@ -24,42 +26,23 @@ export default {
raum_contentmittitel, raum_contentmittitel,
news_content, news_content,
general, general,
iframe_content
}, },
data() { data() {
return { return {
content_type: null,
content: null, content: null,
content_id_internal: this.content_id content_id_internal: this.content_id
}; };
}, },
methods: { methods: {
fetchContent(){ fetchContent(){
return this.$api this.$api
.call(ApiCms.content(this.content_id_internal, this.version, this.sprache, this.sichtbar)) .call(ApiCms.content(this.content_id_internal, this.version, this.sprache, this.sichtbar))
.then(res => { .then(res => {
this.content = res.data.content; this.$nextTick(function() {
this.content_type = res.data.type; this.content = res.data.content;
this.content_type = res.data.type;
document.querySelectorAll("#cms [data-confirm]").forEach((el) => {
el.addEventListener("click", (evt) => {
evt.preventDefault();
BsConfirm.popup(el.dataset.confirm)
.then(() => {
Axios.get(el.href)
.then((res) => {
// TODO(chris): check for success then show message and/or reload
location = location;
})
.catch((err) => console.error("ERROR:", err));
})
.catch(() => {
});
});
});
document.querySelectorAll("#cms [data-href]").forEach((el) => {
el.href = el.dataset.href.replace(
/^ROOT\//,
FHC_JS_DATA_STORAGE_OBJECT.app_root
);
}); });
}); });
} }
@@ -83,6 +66,8 @@ export default {
return "raum_contentmittitel"; return "raum_contentmittitel";
case "news": case "news":
return "news_content"; return "news_content";
case "iframe":
return "iframe_content";
default: default:
return "general"; return "general";
}; };
@@ -91,8 +76,6 @@ export default {
created() { created() {
this.fetchContent(); this.fetchContent();
}, },
mounted() {
},
template: /*html*/ ` template: /*html*/ `
<!-- div that contains the content --> <!-- div that contains the content -->
<div id="fhc-cms-content" v-if="content"> <div id="fhc-cms-content" v-if="content">
@@ -0,0 +1,31 @@
import { replaceRelativeLegacyLink } from "../../../../helpers/LegacyLinkReplaceHelper.js";
export default {
name: "iframe_content",
props: {
content: { type: String, required: true }
},
computed: {
srcUrl() {
const parser = new DOMParser()
const doc = parser.parseFromString(`<div>${this.content}</div>`, "text/html");
const iframe = doc.querySelector("iframe[src]");
if (!iframe)
return "";
let url = iframe.getAttribute("src") || "";
return replaceRelativeLegacyLink(url);
}
},
template: `
<div class="w-100">
<iframe
v-if="srcUrl"
:src="srcUrl"
style="width:100%; height:90vh; border:0; display:block;"
></iframe>
<div v-else class="alert alert-warning">Keine URL gefunden.</div>
</div>
`
};
@@ -11,6 +11,7 @@ import RoleInformation from "./ProfilComponents/RoleInformation.js";
import ProfilInformation from "./ProfilComponents/ProfilInformation.js"; import ProfilInformation from "./ProfilComponents/ProfilInformation.js";
import ApiProfilUpdate from '../../../api/factory/profilUpdate.js'; import ApiProfilUpdate from '../../../api/factory/profilUpdate.js';
import { dateFilter } from '../../../tabulator/filters/Dates.js';
export default { export default {
components: { components: {
@@ -40,7 +41,7 @@ export default {
persistence: { persistence: {
columns: false columns: false
}, },
height: 300, minHeight: 300,
layout: "fitColumns", layout: "fitColumns",
responsiveLayout: "collapse", responsiveLayout: "collapse",
responsiveLayoutCollapseUseFormatters: false, responsiveLayoutCollapseUseFormatters: false,
@@ -74,18 +75,24 @@ export default {
{ {
title: Vue.computed(() => this.preloadedPhrasen.gueltigVonPhrase), title: Vue.computed(() => this.preloadedPhrasen.gueltigVonPhrase),
field: "Gültig_von", field: "Gültig_von",
headerFilter: true, headerFilterFunc: 'dates',
headerFilter: dateFilter,
resizable: true, resizable: true,
minWidth: 200, minWidth: 200,
visible: true visible: true,
formatter:"datetime",
formatterParams: this.datetimeFormatterParams()
}, },
{ {
title: Vue.computed(() => this.preloadedPhrasen.gueltigBisPhrase), title: Vue.computed(() => this.preloadedPhrasen.gueltigBisPhrase),
field: "Gültig_bis", field: "Gültig_bis",
headerFilter: true, headerFilterFunc: 'dates',
headerFilter: dateFilter,
resizable: true, resizable: true,
minWidth: 200, minWidth: 200,
visible: true visible: true,
formatter:"datetime",
formatterParams: this.datetimeFormatterParams()
}, },
{ {
title: Vue.computed(() => this.preloadedPhrasen.wochenstundenPhrase), title: Vue.computed(() => this.preloadedPhrasen.wochenstundenPhrase),
@@ -102,7 +109,7 @@ export default {
persistence: { persistence: {
columns: false columns: false
}, },
height: 300, minHeight: 300,
layout: "fitColumns", layout: "fitColumns",
responsiveLayout: "collapse", responsiveLayout: "collapse",
responsiveLayoutCollapseUseFormatters: false, responsiveLayoutCollapseUseFormatters: false,
@@ -138,9 +145,12 @@ export default {
{ {
title: Vue.computed(() => this.preloadedPhrasen.ausgabedatumPhrase), title: Vue.computed(() => this.preloadedPhrasen.ausgabedatumPhrase),
field: "Ausgegeben_am", field: "Ausgegeben_am",
headerFilter: true, headerFilterFunc: 'dates',
headerFilter: dateFilter,
minWidth: 200, minWidth: 200,
visible: true visible: true,
formatter:"datetime",
formatterParams: this.datetimeFormatterParams()
}, },
], ],
} }
@@ -211,6 +221,15 @@ export default {
setTableColumnTitles() { // reevaluates computed phrasen setTableColumnTitles() { // reevaluates computed phrasen
if(this.$refs.betriebsmittelTable) this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns) if(this.$refs.betriebsmittelTable) this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns)
if(this.$refs.funktionenTable) this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns) if(this.$refs.funktionenTable) this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)
},
datetimeFormatterParams: function() {
const params = {
inputFormat:"yyyy-MM-dd",
outputFormat:"dd.MM.yyyy",
invalidPlaceholder:"(invalid date)",
timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone
};
return params;
} }
}, },
@@ -309,7 +328,7 @@ export default {
}, },
template: /*html*/ ` template: /*html*/ `
<div class="container-fluid text-break fhc-form" > <div class="container-fluid text-break fhc-form" >
<edit-profil v-if="showModal" ref="editModal" @hideBsModal="hideEditProfilModal" :value="JSON.parse(JSON.stringify(filteredEditData))" :titel="$p.t('profil','profilBearbeiten')"></edit-profil> <edit-profil v-if="showModal" ref="editModal" :isMitarbeiter="true" @hideBsModal="hideEditProfilModal" :value="JSON.parse(JSON.stringify(filteredEditData))" :titel="$p.t('profil','profilBearbeiten')"></edit-profil>
<div class="row"> <div class="row">
<div class="d-md-none col-12 "> <div class="d-md-none col-12 ">
<!--TODO: uncomment when implemented <!--TODO: uncomment when implemented
@@ -5,6 +5,8 @@ import RoleInformation from "./ProfilComponents/RoleInformation.js";
import ProfilEmails from "./ProfilComponents/ProfilEmails.js"; import ProfilEmails from "./ProfilComponents/ProfilEmails.js";
import ProfilInformation from "./ProfilComponents/ProfilInformation.js"; import ProfilInformation from "./ProfilComponents/ProfilInformation.js";
import { dateFilter } from '../../../tabulator/filters/Dates.js';
export default { export default {
components: { components: {
CoreFilterCmpt, CoreFilterCmpt,
@@ -24,7 +26,7 @@ export default {
persistence: { persistence: {
columns: false columns: false
}, },
height: 300, minHeight: 300,
layout: "fitColumns", layout: "fitColumns",
responsiveLayout: "collapse", responsiveLayout: "collapse",
responsiveLayoutCollapseUseFormatters: false, responsiveLayoutCollapseUseFormatters: false,
@@ -60,18 +62,24 @@ export default {
{ {
title: Vue.computed(() => this.$p.t('global/gueltigVon')), title: Vue.computed(() => this.$p.t('global/gueltigVon')),
field: "Gültig_von", field: "Gültig_von",
headerFilter: true, headerFilterFunc: 'dates',
headerFilter: dateFilter,
resizable: true, resizable: true,
minWidth: 200, minWidth: 200,
visible: true visible: true,
formatter:"datetime",
formatterParams: this.datetimeFormatterParams()
}, },
{ {
title: Vue.computed(() => this.$p.t('global/gueltigBis')), title: Vue.computed(() => this.$p.t('global/gueltigBis')),
field: "Gültig_bis", field: "Gültig_bis",
headerFilter: true, headerFilterFunc: 'dates',
headerFilter: dateFilter,
resizable: true, resizable: true,
minWidth: 200, minWidth: 200,
visible: true visible: true,
formatter:"datetime",
formatterParams: this.datetimeFormatterParams()
}, },
{ {
title: Vue.computed(() => this.$p.t('profil/wochenstunden')), title: Vue.computed(() => this.$p.t('profil/wochenstunden')),
@@ -91,6 +99,15 @@ export default {
funktionenTableBuilt: function () { funktionenTableBuilt: function () {
this.$refs.funktionenTable.tabulator.setData(this.data.funktionen); this.$refs.funktionenTable.tabulator.setData(this.data.funktionen);
}, },
datetimeFormatterParams: function() {
const params = {
inputFormat:"yyyy-MM-dd",
outputFormat:"dd.MM.yyyy",
invalidPlaceholder:"(invalid date)",
timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone
};
return params;
}
}, },
watch: { watch: {
'data.funktionen'(newVal) { 'data.funktionen'(newVal) {
+13 -7
View File
@@ -120,10 +120,10 @@ export const Profil = {
}, },
sortProfilUpdates: (ele1, ele2) => { sortProfilUpdates: (ele1, ele2) => {
let result = 0; let result = 0;
if (ele1.status === "pending") { if (ele1.status.toLowerCase() === "pending") {
result = -1; result = -1;
} else if (ele1.status === "accepted") { } else if (ele1.status.toLowerCase() === "accepted") {
result = ele2.status === "rejected" ? -1 : 1; result = ele2.status.toLowerCase() === "rejected" ? -1 : 1;
} else { } else {
result = 1; result = 1;
} }
@@ -226,10 +226,13 @@ export const Profil = {
kontakteArray = kontakteArray.concat( kontakteArray = kontakteArray.concat(
this.data.profilUpdates this.data.profilUpdates
.filter((update) => { .filter((update) => {
return update.requested_change.zustellung; return update.status === 'Pending' && update.requested_change.zustellung;
}) })
.map((kontant) => { .map((kontant) => {
return kontant.requested_change.kontakt_id; return {
kontakt_id: kontant.requested_change.kontakt_id,
kontakttyp: kontant.requested_change.kontakttyp
};
}) })
); );
} }
@@ -241,7 +244,7 @@ export const Profil = {
.every((kontakt) => .every((kontakt) =>
this.data.profilUpdates.some( this.data.profilUpdates.some(
(update) => (update) =>
update.requested_change.kontakt_id == kontakt.kontakt_id update.status === 'Pending' && update.requested_change.kontakt_id == kontakt.kontakt_id
) )
) )
) { ) {
@@ -251,7 +254,10 @@ export const Profil = {
return kontakt.zustellung; return kontakt.zustellung;
}) })
.map((kon) => { .map((kon) => {
return kon.kontakt_id; return {
kontakt_id: kon.kontakt_id,
kontakttyp: kon.kontakttyp
};
}) })
); );
} }
@@ -4,7 +4,7 @@ export default {
view:String, view:String,
withZustelladresse:{ withZustelladresse:{
type:Boolean, type:Boolean,
default:false, default:true,
}, },
}, },
data(){ data(){
@@ -10,21 +10,34 @@ export default {
type: String, type: String,
} }
}, },
inject: [ inject: {
'studiengang_kz', // inject info that should not be displayed // inject info that should not be displayed
], 'studiengang_kz': {
from: 'studiengang_kz',
default: false
},
},
computed: { computed: {
getLinkGruppeListe() { getLinkGruppeListe() {
if(this.studiengang_kz === false) {
return '';
}
return this.data.gruppe?.value && this.data.verband?.value && this.data.semester?.value ? FHC_JS_DATA_STORAGE_OBJECT.app_root return this.data.gruppe?.value && this.data.verband?.value && this.data.semester?.value ? FHC_JS_DATA_STORAGE_OBJECT.app_root
+ 'cis/private/stud_in_grp.php?kz='+this.studiengang_kz+'&sem=' + this.data.semester.value + 'cis/private/stud_in_grp.php?kz='+this.studiengang_kz+'&sem=' + this.data.semester.value
+ '&verband=' + this.data.verband.value + '&grp=' + this.data.gruppe.value : '' + '&verband=' + this.data.verband.value + '&grp=' + this.data.gruppe.value : ''
}, },
getLinkVerbandListe() { getLinkVerbandListe() {
if(this.studiengang_kz === false) {
return '';
}
return this.data.verband?.value && this.data.semester?.value ? FHC_JS_DATA_STORAGE_OBJECT.app_root return this.data.verband?.value && this.data.semester?.value ? FHC_JS_DATA_STORAGE_OBJECT.app_root
+ 'cis/private/stud_in_grp.php?kz='+this.studiengang_kz+'&sem=' + this.data.semester.value + 'cis/private/stud_in_grp.php?kz='+this.studiengang_kz+'&sem=' + this.data.semester.value
+ '&verband=' + this.data.verband.value : '' + '&verband=' + this.data.verband.value : ''
}, },
getLinkSemesterListe() { getLinkSemesterListe() {
if(this.studiengang_kz === false) {
return '';
}
return this.data.semester?.value ? FHC_JS_DATA_STORAGE_OBJECT.app_root return this.data.semester?.value ? FHC_JS_DATA_STORAGE_OBJECT.app_root
+ 'cis/private/stud_in_grp.php?kz='+this.studiengang_kz+'&sem=' + this.data.semester.value : '' + 'cis/private/stud_in_grp.php?kz='+this.studiengang_kz+'&sem=' + this.data.semester.value : ''
} }
@@ -14,6 +14,10 @@ export default {
}, },
mixins: [BsModal], mixins: [BsModal],
props: { props: {
isMitarbeiter: {
type: Boolean,
default: false
},
value: Object, value: Object,
titel: String, titel: String,
zustelladressenCount: Function, zustelladressenCount: Function,
@@ -47,6 +51,7 @@ export default {
provide() { provide() {
return { return {
updateFileID: this.updateFileIDFunction, updateFileID: this.updateFileIDFunction,
isMitarbeiter: this.isMitarbeiter
}; };
}, },
@@ -10,17 +10,13 @@ export default {
props: { props: {
data: Object, data: Object,
isMitarbeiter: {
type: Boolean,
default: false,
},
files: { files: {
type: Array, type: Array,
default: [] default: []
}, },
}, },
inject: ["getZustelladressenCount", "updateFileID"], inject: ["getZustelladressenCount", "updateFileID", "isMitarbeiter"],
data() { data() {
return { return {
@@ -164,10 +160,8 @@ export default {
<div class="gy-3 row justify-content-center align-items-center"> <div class="gy-3 row justify-content-center align-items-center">
<!-- warning message for too many zustellungs Adressen --> <!-- warning message for too many zustellungs Adressen -->
<div v-if="showZustellAdressenWarning" class="col-12 "> <div v-if="showZustellAdressenWarning" class="col-12 ">
<div class="card bg-danger mx-2"> <div class="alert alert-warning mx-2">
<div class="card-body text-white ">
<span>{{$p.t('profilUpdate','zustell_adressen_warning')}}</span> <span>{{$p.t('profilUpdate','zustell_adressen_warning')}}</span>
</div>
</div> </div>
</div> </div>
<!-- End of warning --> <!-- End of warning -->
@@ -177,7 +171,7 @@ export default {
<div class="form-check mb-2"> <div class="form-check mb-2">
<input class="form-check-input" type="checkbox" @change="updateValue($event,'zustelladresse')" :checked="data.zustelladresse" id="flexCheckDefault"> <input class="form-check-input" type="checkbox" @change="updateValue($event,'zustelladresse')" :checked="data.zustelladresse" id="flexCheckDefault">
<label class="form-check-label" for="flexCheckDefault"> <label class="form-check-label" for="flexCheckDefault">
{{$p.t('person','zustelladresse')}} {{$p.t('person','zustelladresse')}} {{$p.t('profilUpdate','infoZustelladresse')}}
</label> </label>
</div> </div>
</div> </div>
@@ -30,12 +30,15 @@ export default {
// if the kontakt is already a zustellungskontakt when the user is editing the kontakt, then no warning is shown and the zustellung will be overwritten // if the kontakt is already a zustellungskontakt when the user is editing the kontakt, then no warning is shown and the zustellung will be overwritten
if (JSON.parse(this.originalValue).zustellung) { if (JSON.parse(this.originalValue).zustellung) {
return false; return false;
} }
const kontakteOfSelectedType = this.zustellKontakteCount.filter((element) => {
return element.kontakttyp === this.data?.kontakttyp
});
// if zustellKontakteCount is not 0 and the own kontakt has the flag zustellung set to true // if zustellKontakteCount is not 0 and the own kontakt has the flag zustellung set to true
if (!this.zustellKontakteCount.includes(this.data.kontakt_id)) { if (!this.zustellKontakteCount.some((element) => element.kontakt_id === this.data.kontakt_id)) {
return this.data.zustellung && this.zustellKontakteCount.length; return this.data.zustellung && kontakteOfSelectedType.length;
} }
return this.zustellKontakteCount.length >= 2 && this.data.zustellung; return this.kontakteOfSelectedType.length >= 2 && this.data.zustellung;
}, },
isChanged: function () { isChanged: function () {
//? returns true if the original passed data object was changed //? returns true if the original passed data object was changed
@@ -57,16 +60,6 @@ export default {
<div class="gy-3 row align-items-center justify-content-center"> <div class="gy-3 row align-items-center justify-content-center">
<!-- warning message for too many zustellungs Kontakte -->
<div v-if="showZustellKontakteWarning" class="col-12 ">
<div class="card bg-danger mx-2">
<div class="card-body text-white ">
<span>{{$p.t('profilUpdate','zustell_kontakte_warning')}}</span>
</div>
</div>
</div>
<!-- End of warning -->
<div v-if="!data.kontakt_id" class="col-12"> <div v-if="!data.kontakt_id" class="col-12">
@@ -108,6 +101,14 @@ export default {
</div> </div>
<!-- warning message for too many zustellungs Kontakte -->
<div v-if="showZustellKontakteWarning" class="col-12 ">
<div class="alert alert-warning mx-2">
<span>{{$p.t('profilUpdate','zustell_kontakte_warning')}}</span>
</div>
</div>
<!-- End of warning -->
<div class="d-flex flex-row justify-content-start col-12 allign-middle"> <div class="d-flex flex-row justify-content-start col-12 allign-middle">
<span style="opacity: 0.65; font-size: .85rem; " class="px-2">{{$p.t('profilUpdate','zustellungsKontakt')}}</span> <span style="opacity: 0.65; font-size: .85rem; " class="px-2">{{$p.t('profilUpdate','zustellungsKontakt')}}</span>
@@ -16,7 +16,7 @@ export default {
mixins: [BsModal], mixins: [BsModal],
props: { props: {
titel: { titel: {
type: Object, type: String,
}, },
files: { files: {
type: Array, type: Array,
@@ -57,7 +57,7 @@ export default {
}, },
template: /*html*/` template: /*html*/`
<bs-modal v-show="!loading" ref="modalContainer" v-bind="$props" body-class="" dialog-class="modal-lg" class="bootstrap-alert" :backdrop="false"> <bs-modal ref="modalContainer" v-bind="$props" body-class="" dialog-class="modal-lg" class="bootstrap-alert" :backdrop="false">
<template #title> <template #title>
<p style="opacity:0.8" class="ms-2" v-if="!updateID">{{$p.t('profilUpdate','profilBildUpdateMessage',[titel])}}</p> <p style="opacity:0.8" class="ms-2" v-if="!updateID">{{$p.t('profilUpdate','profilBildUpdateMessage',[titel])}}</p>
</template> </template>
@@ -6,6 +6,7 @@ import Status from "./EditProfilComponents/Status.js";
import TextInputDokument from "./EditProfilComponents/TextInputDokument.js"; import TextInputDokument from "./EditProfilComponents/TextInputDokument.js";
export default { export default {
name: 'EditProfilSelect',
components: { components: {
Kontakt, Kontakt,
EditKontakt, EditKontakt,
@@ -14,7 +15,7 @@ export default {
Status, Status,
TextInputDokument, TextInputDokument,
}, },
inject: ["profilUpdateTopic"], inject: ["profilUpdateTopic", "isMitarbeiter"],
props: { props: {
list: Object, list: Object,
@@ -148,15 +149,31 @@ export default {
<div class="list-group"> <div class="list-group">
<template v-for="item in data"> <template v-for="item in data">
<div class="d-flex flex-row align-items-center"> <div class="d-flex flex-row align-items-center">
<button style="position:relative" type="button" class=" list-group-item list-group-item-action" @click="updateOptions($event,item)" > <button
style="position:relative"
type="button" class="list-group-item list-group-item-action"
@click="updateOptions($event,item)"
:disabled="(this.isMitarbeiter === false && item.listview === 'Adresse' && item.data.heimatadresse === true)"
>
<!-- render title of options --> <!-- render title of options -->
<p v-if="item.title" class="my-1" >{{item.title}}</p> <p v-if="item.title" class="my-1" >{{item.title}}</p>
<!-- else render list view of items --> <!-- else render list view of items -->
<div v-else class="my-2 me-4" > <div v-else class="my-2 me-4" >
<component :is="item.listview" v-bind="item"></component> <component :is="item.listview" v-bind="item"></component>
<div
v-if="(this.isMitarbeiter === false && item.listview === 'Adresse' && item.data.heimatadresse === true)"
class="gy-2 row justify-content-center align-items-center"
>
<div class="col-1">&nbsp;</div>
<div class="col-11">
<div class="alert alert-info mt-4" role="alert">
{{ $p.t('profilUpdate','infoHeimatadresse') }}
</div>
</div>
</div>
</div> </div>
</button> </button>
<button v-if="item.listview" @click="deleteItem(item)" type="button" class="mx-3 btn btn-danger btn-circle" :aria-label="$p.t('profilUpdate','deleteItem')" :title="$p.t('profilUpdate','deleteItem')" ><i class="fa fa-trash" aria-hide="true"></i></button> <button v-if="item.listview" :disabled="(this.isMitarbeiter === false && item.listview === 'Adresse' && item.data.heimatadresse === true)" @click="deleteItem(item)" type="button" class="mx-3 btn btn-danger btn-circle" :aria-label="$p.t('profilUpdate','deleteItem')" :title="$p.t('profilUpdate','deleteItem')" ><i class="fa fa-trash" aria-hide="true"></i></button>
</div> </div>
</template> </template>
</div> </div>
@@ -11,6 +11,7 @@ import FetchProfilUpdates from "./ProfilComponents/FetchProfilUpdates.js";
import EditProfil from "./ProfilModal/EditProfil.js"; import EditProfil from "./ProfilModal/EditProfil.js";
import ApiProfilUpdate from '../../../api/factory/profilUpdate.js'; import ApiProfilUpdate from '../../../api/factory/profilUpdate.js';
import { dateFilter } from '../../../tabulator/filters/Dates.js';
export default { export default {
components: { components: {
@@ -39,7 +40,7 @@ export default {
persistence: { persistence: {
columns: false columns: false
}, },
height: 200, minHeight: 200,
layout: "fitColumns", layout: "fitColumns",
columns: [{ columns: [{
title: Vue.computed(() => this.preloadedPhrasen.zutrittsGruppenPhrase), title: Vue.computed(() => this.preloadedPhrasen.zutrittsGruppenPhrase),
@@ -51,7 +52,7 @@ export default {
persistence: { persistence: {
columns: false columns: false
}, },
height: 300, minHeight: 300,
layout: "fitColumns", layout: "fitColumns",
responsiveLayout: "collapse", responsiveLayout: "collapse",
responsiveLayoutCollapseUseFormatters: false, responsiveLayoutCollapseUseFormatters: false,
@@ -85,9 +86,12 @@ export default {
{ {
title: Vue.computed(() =>this.preloadedPhrasen.ausgabedatum) , title: Vue.computed(() =>this.preloadedPhrasen.ausgabedatum) ,
field: "Ausgegeben_am", field: "Ausgegeben_am",
headerFilter: true, headerFilterFunc: 'dates',
headerFilter: dateFilter,
minWidth: 200, minWidth: 200,
visible: true visible: true,
formatter:"datetime",
formatterParams: this.datetimeFormatterParams()
}, },
], ],
}, },
@@ -160,6 +164,15 @@ export default {
this.$refs.editModal.show(); this.$refs.editModal.show();
}); });
}, },
datetimeFormatterParams: function() {
const params = {
inputFormat:"yyyy-MM-dd",
outputFormat:"dd.MM.yyyy",
invalidPlaceholder:"(invalid date)",
timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone
};
return params;
}
}, },
computed: { computed: {
@@ -113,7 +113,17 @@ export default {
}, },
template: /*html*/ ` template: /*html*/ `
<bs-modal v-show="!loading" ref="modalContainer" v-bind="$props" body-class="" dialog-class="modal-lg" class="bootstrap-alert" :backdrop="false" > <bs-modal
v-show="!loading"
ref="modalContainer"
v-bind="$props"
header-class="bg-light"
footer-class="bg-light"
body-class=""
dialog-class="modal-lg"
class="bootstrap-alert"
:backdrop="false"
>
<template v-slot:title> <template v-slot:title>
{{title}} {{title}}
@@ -210,8 +220,8 @@ export default {
<template v-if="data.status === profilUpdateStates['Pending']" v-slot:footer> <template v-if="data.status === profilUpdateStates['Pending']" v-slot:footer>
<div class="form-underline flex-fill"> <div class="flex-fill">
<div class="form-underline-titel">{{$p.t('global','nachricht')}}</div> <div>{{$p.t('global','nachricht')}}</div>
<div class="d-flex flex-row gap-2"> <div class="d-flex flex-row gap-2">
<input class="form-control " v-model="data.status_message" /> <input class="form-control " v-model="data.status_message" />
@@ -4,6 +4,7 @@ import Alert from "../../../components/Bootstrap/Alert.js";
import Loading from "../../../components/Loader.js"; import Loading from "../../../components/Loader.js";
import ApiProfilUpdate from '../../../api/factory/profilUpdate.js'; import ApiProfilUpdate from '../../../api/factory/profilUpdate.js';
import { dateFilter } from '../../../tabulator/filters/Dates.js';
const sortProfilUpdates = (ele1, ele2, thisPointer) => { const sortProfilUpdates = (ele1, ele2, thisPointer) => {
let result = 0; let result = 0;
@@ -184,13 +185,13 @@ export default {
}, },
height: 600, height: 600,
layout: "fitColumns", layout: "fitDataStretchFrozen",
columns: [ columns: [
{ {
title: this.$p.t("profilUpdate", "UID"), title: this.$p.t("profilUpdate", "UID"),
field: "uid", field: "uid",
minWidth: 200, minWidth: 100,
resizable: true, resizable: true,
headerFilter: true, headerFilter: true,
//responsive:0, //responsive:0,
@@ -203,27 +204,59 @@ export default {
headerFilter: true, headerFilter: true,
//responsive:0, //responsive:0,
}, },
{
title: this.$p.t("lehre", "studiengang") + ' (' + this.$p.t("profil", "studentIn") + ')',
field: "studiengang",
minWidth: 50,
resizable: true,
headerFilter: "list",
headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"},
//responsive:0,
},
{
title: this.$p.t("lehre", "organisationsform") + ' (' + this.$p.t("profil", "studentIn") + ')',
field: "orgform",
minWidth: 50,
resizable: true,
headerFilter: "list",
headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"},
//responsive:0,
},
{
title: this.$p.t("lehre", "organisationseinheit") + ' (' + this.$p.t("profil", "mitarbeiterIn") + ')',
field: "oezuordnung",
minWidth: 200,
resizable: true,
headerFilter: "list",
headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"},
//responsive:0,
},
{ {
title: this.$p.t("profilUpdate", "Topic"), title: this.$p.t("profilUpdate", "Topic"),
field: "topic", field: "topic",
resizable: true, resizable: true,
minWidth: 200, minWidth: 200,
headerFilter: true, headerFilter: "list",
headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"},
//responsive:0, //responsive:0,
}, },
{ {
title: this.$p.t("profilUpdate", "insertamum"), title: this.$p.t("profilUpdate", "insertamum"),
field: "insertamum", field: "insertamum_iso",
resizable: true, resizable: true,
headerFilter: true, headerFilterFunc: 'dates',
headerFilter: dateFilter,
minWidth: 200, minWidth: 200,
formatter:"datetime",
formatterParams: this.datetimeFormatterParams(),
//responsive:0, //responsive:0,
}, },
{ {
title: this.$p.t("profilUpdate", "Status"), title: this.$p.t("profilUpdate", "Status"),
field: "status_translated", field: "status_translated",
hozAlign: "center", hozAlign: "center",
headerFilter: true, headerFilter: "list",
headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"},
formatter: (cell, para) => { formatter: (cell, para) => {
let iconClasses = ""; let iconClasses = "";
let status = cell.getRow().getData().status; let status = cell.getRow().getData().status;
@@ -248,20 +281,11 @@ export default {
{ {
title: this.$p.t("profilUpdate", "actions"), title: this.$p.t("profilUpdate", "actions"),
headerSort: false, headerSort: false,
frozen: true,
formatter: (cell, params) => { formatter: (cell, params) => {
let STATUS_PENDING = let details = this.$p.t('global', 'details');
cell.getRow().getData().status ==
this.profilUpdateStates["Pending"];
let html = `<div class="d-flex justify-content-evenly align-items-center"> let html = `<div class="d-flex justify-content-evenly align-items-center">
<button class="btn border-primary border-2" id="showButton"><i class="fa-solid fa-eye fhc-primary-color"></i></button> <button class="btn btn-secondary" id="showButton">${details}</button>
${
STATUS_PENDING ?
`<button class="btn border-success border-2" id="acceptButton"><i class='fa fa-lg fa-circle-check text-success'></i></button>
<button class="btn border-danger border-2" id="denyButton"><i class=' fa fa-lg fa-circle-xmark text-danger'></i></button>`
:
``
}
</div>`; </div>`;
// Convert the HTML string to an HTML node // Convert the HTML string to an HTML node
@@ -276,19 +300,6 @@ export default {
this.showAcceptDenyModal(cell.getRow().getData()); this.showAcceptDenyModal(cell.getRow().getData());
}); });
if (STATUS_PENDING) {
node
.querySelector("#acceptButton")
.addEventListener("click", () => {
this.acceptProfilUpdate(cell.getRow().getData());
});
node
.querySelector("#denyButton")
.addEventListener("click", () => {
this.denyProfilUpdate(cell.getRow().getData());
});
}
return node; return node;
}, },
minWidth: 200, minWidth: 200,
@@ -370,6 +381,15 @@ export default {
this.showAcceptDenyModal(arrayRowData[0]); this.showAcceptDenyModal(arrayRowData[0]);
} }
} }
},
datetimeFormatterParams: function() {
const params = {
inputFormat:"yyyy-MM-dd",
outputFormat:"dd.MM.yyyy",
invalidPlaceholder:"(invalid date)",
timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone
};
return params;
} }
}, },
watch: { watch: {
@@ -382,7 +402,7 @@ export default {
}, },
}, },
created() { created() {
this.$p.loadCategory("profilUpdate").then(() => { this.$p.loadCategory(["profilUpdate", "lehre", "profil", "global"]).then(() => {
this.categoryLoaded = true; this.categoryLoaded = true;
}); });
}, },

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