Merge branch 'refs/heads/master' into demo

# Conflicts:
#	application/models/education/Lehrveranstaltung_model.php
#	application/models/organisation/Studienplan_model.php
#	application/models/person/Notiz_model.php
#	application/models/ressource/Mitarbeiter_model.php
#	public/js/components/Stv/Studentenverwaltung.js
#	public/js/components/Stv/Studentenverwaltung/Verband.js
#	system/dbupdate_3.4.php
#	system/phrasesupdate.php
This commit is contained in:
ma0048
2025-08-27 09:22:35 +02:00
439 changed files with 39555 additions and 7354 deletions
+16 -11
View File
@@ -55,7 +55,7 @@ use SimpleXMLElement as SimpleXMLElement;
* $doc->create($outputformat);
* $doc->output(true);
* $doc->close();
*
*
* New:
* $xml_data = $this->documentexportlib->getDataXML($data);
* $images = [[
@@ -397,20 +397,24 @@ class DocumentExportLib
$vorlage_stg = current(getData($result));
foreach ($vorlage_stg as $k => $v)
$vorlage->$k = $v;
if ($sign_user)
{
$this->addSignToData($xml_data);
}
$result = $this->create($temp_folder, $outputformat, $vorlage, $xml_data, $images);
if (isError($result))
return $result;
$temp_filename = getData($result);
if ($sign_user) {
$this->addSignToData($xml_data);
if ($sign_user)
{
$result = $this->sign($temp_folder, $temp_filename, $outputformat, $sign_user, $sign_profile);
if (isError($result))
return $result;
$temp_filename = getData($result);
}
@@ -445,6 +449,7 @@ class DocumentExportLib
if ($xml_data->firstChild->tagName == 'error')
return error($xml_data->firstChild->textContent);
$styles_xsl = null;
// styles.xml erstellen
if ($vorlage->style) {
$styles_xsl = new DOMDocument();
@@ -461,7 +466,7 @@ class DocumentExportLib
// Template holen
$vorlage_found = false;
$vorlage_filename = $vorlage->vorlage_kurzbz . ($vorlage->mimetype == 'application/vnd.oasis.opendocument.spreadsheet' ? '.ods' : '.odt');
$aktive_addons = array_filter(array_map('trim', explode(";", ACTIVE_ADDONS)));
foreach($aktive_addons as $addon) {
$zipfile = DOC_ROOT . 'addons/' . $addon . '/system/vorlage_zip/' . $vorlage_filename;
@@ -652,7 +657,7 @@ class DocumentExportLib
foreach ($files as $file)
if (is_file($file))
unlink($file);
chdir($source_folder);
rmdir($temp_folder);
}
@@ -703,12 +708,12 @@ class DocumentExportLib
{
if ($outputformat)
return $outputformat;
if ($mimetype == 'application/vnd.oasis.opendocument.spreadsheet')
return 'ods';
if ($mimetype == 'application/vnd.oasis.opendocument.text')
return 'odt';
return 'pdf';
}
}
+2 -7
View File
@@ -500,11 +500,6 @@ class PrestudentLib
$student = current(getData($result));
$this->_ci->load->library('VariableLib', ['uid' => $authUID]);
$semester_aktuell = $this->_ci->variablelib->getVar('semester_aktuell');
// Update Aktionen
// Status updaten
@@ -545,8 +540,8 @@ class PrestudentLib
// Studentlehrverband updaten
$result = $this->_ci->StudentlehrverbandModel->update([
'student_uid' => $student->student_uid,
'studiensemester_kurzbz' => $semester_aktuell
], [
'studiensemester_kurzbz' => $studiensemester_kurzbz
], [
'semester' => $ausbildungssemester,
'verband' => '',
'gruppe' => '',
+588
View File
@@ -0,0 +1,588 @@
<?php
if (! defined("BASEPATH")) exit("No direct script access allowed");
class ProfilLib{
public function __construct()
{
$this->ci =& get_instance();
}
public function getView($uid)
{
// loading required models
$this->ci->load->model("ressource/Mitarbeiter_model","MitarbeiterModel");
$this->ci->load->model("person/Person_model","PersonModel");
$res = new stdClass();
// checking the uid
if ($uid == getAuthUID()) {
$isMitarbeiter = $this->ci->MitarbeiterModel->isMitarbeiter(getAuthUID());
if(isError($isMitarbeiter))
{
return error(getData($isMitarbeiter));
}
$isMitarbeiter = getData($isMitarbeiter);
if ($isMitarbeiter) {
$res->view = "MitarbeiterProfil";
$res->data = $this->mitarbeiterProfil();
$res->data->pid = getAuthPersonId();
} else {
$res->view = "StudentProfil";
$res->data = $this->studentProfil();
$res->data->pid = getAuthPersonId();
}
$res->data->fotoStatus=$this->isFotoAkzeptiert(getAuthPersonId());
}
// UID is availabe when accessing Profil/View/:uid
else {
$isMitarbeiter = $this->ci->MitarbeiterModel->isMitarbeiter($uid);
if(isError($isMitarbeiter))
{
return error(getData($isMitarbeiter));
}
$isMitarbeiter = getData($isMitarbeiter);
if ($isMitarbeiter) {
$res->view = "ViewMitarbeiterProfil";
$res->data = $this->viewMitarbeiterProfil($uid);
} else {
$res->view = "ViewStudentProfil";
$res->data = $this->viewStudentProfil($uid);
}
}
return success($res);
}
//PRIVATE METHODS ###############################################
/**
* function that returns the data used for the student profile
* @access private
* @return stdClass student data
*/
private function studentProfil()
{
$pid = getAuthPersonId();
$uid = getAuthUID();
$betriebsmittelperson_res = $this->getBetriebsmittelInfo($pid);
$kontakte_res = $this->getKontaktInfo($pid);
$zutrittskarte_ausgegebenam = $this->getZutrittskarteDatum($uid);
$adresse_res = $this->getAdressenInfo($pid);
$mailverteiler_res = $this->getMailverteiler($uid);
$person_res = $this->getPersonInfo($uid, true);
$zutrittsgruppe_res = $this->getZutrittsgruppen($uid);
$student_res = $this->getStudentInfo($uid);
$matr_res = $this->getMatrikelNummer($uid);
$profilUpdates = $this->getProfilUpdates($uid);
$res = new stdClass();
$res->username = $uid;
//? Person Information
foreach ($person_res as $key => $value) {
$res->$key = $value;
}
//? Student Information
foreach ($student_res as $key => $value) {
$res->$key = trim($value);
}
$intern_email = array();
$intern_email["type"] = "intern";
$intern_email["email"] = DOMAIN? $uid . "@" . DOMAIN :"";
$res->emails = [$intern_email];
$res->adressen = $adresse_res;
$res->zutrittsdatum = $zutrittskarte_ausgegebenam;
$res->kontakte = $kontakte_res;
$res->mittel = $betriebsmittelperson_res;
$res->matrikelnummer = $matr_res->matr_nr;
$res->zuttritsgruppen = $zutrittsgruppe_res;
$res->mailverteiler = $mailverteiler_res;
$res->profilUpdates = $profilUpdates;
return $res;
}
/**
* function that returns the data used for the mitarbeiter profile
* @access private
* @return stdClass mitarbeiter data
*/
private function mitarbeiterProfil()
{
$pid = getAuthPersonId();
$uid = getAuthUID();
$zutrittskarte_ausgegebenam = $this->getZutrittskarteDatum($uid);
$adresse_res = $this->getAdressenInfo($pid);
$kontakte_res = $this->getKontaktInfo($pid);
$mailverteiler_res = $this->getMailverteiler($uid);
$person_res = $this->getPersonInfo($uid, true);
$benutzer_funktion_res = $this->getBenutzerFunktion($uid);
$betriebsmittelperson_res = $this->getBetriebsmittelInfo($pid);
$profilUpdates = $this->getProfilUpdates($uid);
$telefon_res = $this->getTelefonInfo($uid);
$mitarbeiter_res = $this->getMitarbeiterInfo($uid);
$res = new stdClass();
$res->username = $uid;
//? Person Information
foreach ($person_res as $key => $value) {
$res->$key = $value;
}
//? Mitarbeiter Information
foreach ($mitarbeiter_res as $key => $value) {
$res->$key = $value;
}
$res->adressen = $adresse_res;
$res->zutrittsdatum = $zutrittskarte_ausgegebenam;
$res->kontakte = $kontakte_res;
$res->mittel = $betriebsmittelperson_res;
$res->mailverteiler = $mailverteiler_res;
$intern_email = array();
$intern_email["type"] = "intern";
$intern_email["email"] = DOMAIN? $uid . "@" . DOMAIN : "";
$extern_email = array();
$extern_email["type"] = "alias";
$extern_email["email"] = $mitarbeiter_res->alias? ($mitarbeiter_res->alias . "@" . DOMAIN) : null;
$res->emails = $extern_email["email"]?[$intern_email, $extern_email]:[$intern_email];
$res->funktionen = $benutzer_funktion_res;
$res->standort_telefon = $telefon_res;
$res->profilUpdates = $profilUpdates;
return $res;
}
/**
* gets the date of issue of the FH access card corresponding to a user
* @access private
* @param integer $uid the userID used to get the date of issue of the FH access card
* @return string the date of issue of the FH access card corresponding to a userID
*/
private function getZutrittskarteDatum($uid)
{
$this->ci->load->model("ressource/Betriebsmittelperson_model","BetriebsmittelpersonModel");
$zutrittskarte_ausgegebenam = $this->ci->BetriebsmittelpersonModel->getBetriebsmittelByUid($uid, "Zutrittskarte");
if(isError($zutrittskarte_ausgegebenam)){
return error(getData($zutrittskarte_ausgegebenam));
}
$zutrittskarte_ausgegebenam = getData($zutrittskarte_ausgegebenam);
$zutrittskarte_ausgegebenam = $zutrittskarte_ausgegebenam ? current($zutrittskarte_ausgegebenam)->ausgegebenam : null;
//? formats date from 01-01-2000 to 01.01.2000
$zutrittskarte_ausgegebenam = str_replace("-", ".", $zutrittskarte_ausgegebenam);
return $zutrittskarte_ausgegebenam;
}
/**
* gets the address information corresponding to a user
* @access private
* @param integer $uid the userID used to get the address information
* @return array all the address information corresponding to a userID
*/
private function getAdressenInfo($pid)
{
$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->addOrder("zustelladresse", "DESC");
$adresse_res = $this->ci->AdresseModel->addJoin("tbl_adressentyp", "typ=adressentyp_kurzbz");
$adresse_res = $this->ci->AdresseModel->loadWhere(["person_id" => $pid]);
if(isError($adresse_res)){
return error(getData($adresse_res));
}
$adresse_res = getData($adresse_res) ?? [];
return $adresse_res;
}
/**
* gets the kontakt information corresponding to a user
* @access private
* @param integer $uid the userID used to get the kontakt information
* @return array all the kontakt information corresponding to a userID
*/
private function getKontaktInfo($pid)
{
$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->addJoin('public.tbl_standort', 'standort_id', 'LEFT');
$this->ci->KontaktModel->addJoin('public.tbl_firma', 'firma_id', 'LEFT');
$this->ci->KontaktModel->addOrder('kontakttyp, kontakt, tbl_kontakt.updateamum, tbl_kontakt.insertamum');
$kontakte_res = $this->ci->KontaktModel->loadWhere(['person_id' => $pid]);
if(isError($kontakte_res)){
return error(getData($kontakte_res));
}
$kontakte_res = getData($kontakte_res);
return $kontakte_res;
}
/**
* gets all the mailverteiler using the tables: tbl_benutzer, tbl_benutzergruppe, tbl_gruppe
* @access private
* @param integer $uid the userID used to retrieve the mailverteiler
* @return array returns the mailvertailer corresponding to a userID
*/
private function getMailverteiler($uid)
{
$this->ci->load->model("person/Person_model","PersonModel");
$this->ci->PersonModel->addSelect('gruppe_kurzbz, beschreibung');
$this->ci->PersonModel->addJoin('tbl_benutzer', 'person_id');
$this->ci->PersonModel->addJoin('tbl_benutzergruppe', 'uid');
$this->ci->PersonModel->addJoin('tbl_gruppe', 'gruppe_kurzbz');
$mailverteiler_res = $this->ci->PersonModel->loadWhere(array('mailgrp' => true, 'uid' => $uid));
if(isError($mailverteiler_res)){
return error(getData($mailverteiler_res));
}
$mailverteiler_res = getData($mailverteiler_res) ?? [];
$mailverteiler_res = gettype($mailverteiler_res) === 'array' ? $mailverteiler_res : [];
$mailverteiler_res = array_map(function ($element) {
$element->mailto = "mailto:" . $element->gruppe_kurzbz . "@" . DOMAIN;
return $element;
}, $mailverteiler_res);
return $mailverteiler_res;
}
/**
* gets the person information corresponding to a user
* @access private
* @param integer $uid the userID used to get the person information
* @param integer $geburtsInfo flag wether to add the columns gebort, gebdatum, foto_sperre or not
* @return array all the person informaion corresponding to a userID
*/
private function getPersonInfo($uid, $geburtsInfo = null)
{
$this->ci->load->model("person/Benutzer_model","BenutzerModel");
$selectClause = ["foto", "foto_sperre", "anrede", "titelpost as postnomen", "titelpre as titel", "vorname", "nachname"];
/** @param integer $geburtsInfo */
if ($geburtsInfo) {
array_push($selectClause, "gebort");
array_push($selectClause, "TO_CHAR(gebdatum, 'DD.MM.YYYY') as gebdatum");
}
$this->ci->BenutzerModel->addSelect($selectClause);
$this->ci->BenutzerModel->addJoin("tbl_person", "person_id");
$person_res = $this->ci->BenutzerModel->load([$uid]);
if(isError($person_res)){
return error(getData($person_res));
}
$person_res = getData($person_res);
$person_res = $person_res ? current($person_res) : null;
if(isset($person_res)){
if( ($person_res->foto === null) || ((getAuthUID() !== $uid) && ($person_res->foto_sperre !== false)) )
{
$dummy_foto = base64_encode(file_get_contents(DOC_ROOT.'skin/images/profilbild_dummy.jpg'));
$person_res->foto = $dummy_foto;
}
}
return $person_res;
}
/**
* gets all the Benutzerfunktionen of a corresponding user
* @access private
* @param integer $uid the userID used to retrieve the Benutzerfunktionen
* @return array returns the Benutzerfunktionen corresponding to a userID
*/
private function getBenutzerFunktion($uid)
{
$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->addJoin("tbl_organisationseinheit", "oe_kurzbz");
$benutzer_funktion_res = $this->ci->BenutzerfunktionModel->loadWhere(array('uid' => $uid));
if(isError($benutzer_funktion_res)){
return error(getData($benutzer_funktion_res));
}
$benutzer_funktion_res = getData($benutzer_funktion_res);
return $benutzer_funktion_res;
}
/**
* gets all the Betriebsmittel of a corresponding user
* @access private
* @param integer $uid the userID used to retrieve the Betriebsmittel
* @return array returns the Betriebsmittel corresponding to a userID
*/
private function getBetriebsmittelInfo($pid)
{
$this->ci->load->model("ressource/Betriebsmittelperson_model","BetriebsmittelpersonModel");
$this->ci->BetriebsmittelpersonModel->addSelect(["CONCAT(betriebsmitteltyp, ' ' ,beschreibung) as Betriebsmittel", "nummer as Nummer", "ausgegebenam as Ausgegeben_am"]);
//? betriebsmittel are not needed in a view
$betriebsmittelperson_res = $this->ci->BetriebsmittelpersonModel->getBetriebsmittel($pid);
if(isError($betriebsmittelperson_res)){
return error(getData($betriebsmittelperson_res));
}
$betriebsmittelperson_res = getData($betriebsmittelperson_res);
return $betriebsmittelperson_res;
}
/**
* gets the profil updates corresponding to a user
* @access private
* @param integer $uid the userID used to get the profil updates
* @return array all the profil updates corresponding to a userID
*/
private function getProfilUpdates($uid)
{
$this->ci->load->model("person/Profil_update_model","ProfilUpdateModel");
$profilUpdates = $this->ci->ProfilUpdateModel->getProfilUpdatesWhere(['uid' => $uid]);
if(isError($profilUpdates)){
return error(getData($profilUpdates));
}
$profilUpdates = getData($profilUpdates);
return $profilUpdates;
}
/**
* gets the telefon information corresponding to a user
* @access private
* @param integer $uid the userID used to get the telefon information
* @return array all the telefon informaion corresponding to a userID
*/
private function getTelefonInfo($uid)
{
$this->ci->load->model("ressource/Mitarbeiter_model","MitarbeiterModel");
$this->ci->MitarbeiterModel->addSelect(["kontakt"]);
$this->ci->MitarbeiterModel->addJoin("tbl_kontakt", "tbl_mitarbeiter.standort_id = tbl_kontakt.standort_id");
$this->ci->MitarbeiterModel->addLimit(1);
$telefon_res = $this->ci->MitarbeiterModel->loadWhere(["mitarbeiter_uid" => $uid, "kontakttyp" => "telefon"]);
if(isError($telefon_res)){
return error(getData($telefon_res));
}
$telefon_res = getData($telefon_res);
$telefon_res = $telefon_res ? current($telefon_res) : null;
return $telefon_res;
}
/**
* gets the mitarbeiter information corresponding to a user
* @access private
* @param integer $uid the userID used to get the mitarbeiter information
* @return array all the mitarbeiter informaion corresponding to a userID
*/
private function getMitarbeiterInfo($uid)
{
$this->ci->load->model("ressource/Mitarbeiter_model","MitarbeiterModel");
$this->ci->MitarbeiterModel->addSelect(["kurzbz", "telefonklappe", "alias", "ort_kurzbz"]);
$this->ci->MitarbeiterModel->addJoin("tbl_benutzer", "tbl_benutzer.uid = tbl_mitarbeiter.mitarbeiter_uid");
$mitarbeiter_res = $this->ci->MitarbeiterModel->load($uid);
if(isError($mitarbeiter_res)){
return error(getData($mitarbeiter_res));
}
$mitarbeiter_res = getData($mitarbeiter_res);
$mitarbeiter_res = $mitarbeiter_res ? current($mitarbeiter_res) : null;
return $mitarbeiter_res;
}
/**
* gets the Zutrittsgruppen corresponding to a user
* @access private
* @param integer $uid the userID used to get the Zutrittsgruppen
* @return array all the Zutrittsgruppen corresponding to a userID
*/
private function getZutrittsgruppen($uid)
{
$this->ci->load->model("person/Benutzergruppe_model","BenutzergruppeModel");
$this->ci->BenutzergruppeModel->addSelect(['bezeichnung']);
$this->ci->BenutzergruppeModel->addJoin('tbl_gruppe', 'gruppe_kurzbz');
$zutrittsgruppe_res = $this->ci->BenutzergruppeModel->loadWhere(array("uid" => $uid, "zutrittssystem" => true));
if(isError($zutrittsgruppe_res)){
return error(getData($zutrittsgruppe_res));
}
$zutrittsgruppe_res = getData($zutrittsgruppe_res);
return $zutrittsgruppe_res;
}
/**
* gets the student information corresponding to a user
* @access private
* @param integer $uid the userID used to get the student information
* @return array all the student informaion corresponding to a userID
*/
private function getStudentInfo($uid)
{
$this->ci->load->model("crm/Student_model","StudentModel");
$this->ci->StudentModel->addSelect(['tbl_studiengang.bezeichnung as studiengang', 'tbl_studiengang.studiengang_kz as studiengang_kz', 'tbl_student.semester', 'tbl_student.verband', 'tbl_student.gruppe', 'tbl_student.matrikelnr as personenkennzeichen']);
$this->ci->StudentModel->addJoin('tbl_studiengang', "tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz");
$student_res = $this->ci->StudentModel->load([$uid]);
if(isError($student_res)){
return error(getData($student_res));
}
$student_res = getData($student_res);
$student_res = $student_res ? current($student_res) : null;
return $student_res;
}
/**
* gets the Matrikelnummer corresponding to a user
* @access private
* @param integer $uid the userID used to get the Matrikelnummer
* @return object the Matrikelnummer corresponding to a userID
*/
private function getMatrikelNummer($uid)
{
$this->ci->load->model("person/Benutzer_model","BenutzerModel");
$this->ci->BenutzerModel->addSelect(["matr_nr"]);
$this->ci->BenutzerModel->addJoin("tbl_person", "person_id");
$matr_res = $this->ci->BenutzerModel->load([$uid]);
if(isError($matr_res)){
return error(getData($matr_res));
}
$matr_res = getData($matr_res);
$matr_res = $matr_res ? current($matr_res) : [];
return $matr_res;
}
/**
* checks whether the foto of a user is accepted or not
* @access private
* @param integer $pid the personId of the student or mitarbeiter
* @return bool whether the foto is accepted or not
*/
private function isFotoAkzeptiert($pid)
{
$this->ci->load->model('person/Fotostatusperson_model','FotostatusModel');
$fotostatus = $this->ci->FotostatusModel->execReadOnlyQuery("
select distinct on (person_id) person_id, insertamum, fotostatus_kurzbz
from public.tbl_person_fotostatus
where person_id = ?
order by person_id, insertamum desc",[$pid]);
if(isError($fotostatus)){
return error(getData($fotostatus));
}
$fotostatus = getData($fotostatus);
if(is_array($fotostatus) && count($fotostatus) > 0){
$fotostatus = current($fotostatus)->fotostatus_kurzbz == 'akzeptiert';
}
else
$fotostatus = false;
return $fotostatus;
}
/**
* function that returns the data used for viewing another mitarbeiter profile
* @access private
* @param integer $uid the userID to retrieve the mitarbeiter data
* @return stdClass restricted mitarbeiter data
*/
private function viewMitarbeiterProfil($uid)
{
$mailverteiler_res = $this->getMailverteiler($uid);
$benutzer_funktion_res = $this->getBenutzerFunktion($uid);
$benutzer_res = $this->getBenutzerAlias($uid);
$person_res = $this->getPersonInfo($uid);
$mitarbeiter_res = $this->getMitarbeiterInfo($uid);
$telefon_res = $this->getTelefonInfo($uid);
$res = new stdClass();
$res->username = $uid;
//? Person Info
foreach ($person_res as $key => $val) {
$res->$key = $val;
}
//? Mitarbeiter Info
foreach ($mitarbeiter_res as $key => $val) {
$res->$key = $val;
}
$intern_email = array();
$intern_email["type"] = "intern";
$intern_email["email"] = DOMAIN? $uid . "@" . DOMAIN:"";
$extern_email = array();
$extern_email["type"] = "alias";
$extern_email["email"] = $benutzer_res->alias ? ($benutzer_res->alias . "@" . DOMAIN) : null;
$res->emails = $extern_email?[$intern_email, $extern_email]:[$intern_email];
$res->funktionen = $benutzer_funktion_res;
$res->mailverteiler = $mailverteiler_res;
$res->standort_telefon = isset($telefon_res) ? $telefon_res->kontakt : null;
return $res;
}
/**
* gets the alias of a corresponding user
* @access private
* @param integer $uid the userID used to get the alias
* @return string the alias of the userID
*/
private function getBenutzerAlias($uid)
{
$this->ci->load->model("person/Benutzer_model","BenutzerModel");
$this->ci->BenutzerModel->addSelect(["alias"]);
$benutzer_res = $this->ci->BenutzerModel->load([$uid]);
if(isError($benutzer_res)){
return error(getData($benutzer_res));
}
$benutzer_res = getData($benutzer_res);
$benutzer_res = $benutzer_res ? current($benutzer_res) : null;
return $benutzer_res;
}
/**
* function that returns the data used for viewing another student profile
* @access private
* @param integer $uid the userID to retrieve the student data
* @return stdClass restricted student data
*/
private function viewStudentProfil($uid)
{
$mailverteiler_res = $this->getMailverteiler($uid);
$person_res = $this->getPersonInfo($uid);
$student_res = $this->getStudentInfo($uid);
$matr_res = $this->getMatrikelNummer($uid);
$res = new stdClass();
$res->username = $uid;
//? Person Information
foreach ($person_res as $key => $value) {
$res->$key = $value;
}
//? Student Information
foreach ($student_res as $key => $value) {
$res->$key = $value;
}
$intern_email = array();
$intern_email["type"] = "intern";
$intern_email["email"] = DOMAIN? $uid . "@" . DOMAIN:"";
$res->emails = [$intern_email];
$res->matrikelnummer = $matr_res->matr_nr;
$res->mailverteiler = $mailverteiler_res;
return $res;
}
}
+7
View File
@@ -115,6 +115,7 @@ class SearchBarLib
$sql = '
SELECT
\'employee\' AS renderer,
\''.$type.'\' AS type,
b.uid AS uid,
p.person_id AS person_id,
@@ -205,6 +206,7 @@ EOSC;
$employees = $dbModel->execReadOnlyQuery('
SELECT
\'employee\' AS renderer,
\''.$type.'\' AS type,
b.uid AS uid,
p.person_id AS person_id,
@@ -268,6 +270,7 @@ EOSC;
$ous = $dbModel->execReadOnlyQuery('
SELECT
\'' . $type . '\' AS renderer,
\''.$type.'\' AS type,
o.oe_kurzbz AS oe_kurzbz,
\'[\' || ot.bezeichnung || \'] \' || o.bezeichnung AS name,
@@ -365,6 +368,7 @@ EOSC;
$gesperrtes_foto = base64_encode(file_get_contents(DOC_ROOT.'skin/images/profilbild_dummy.jpg'));
$students = $dbModel->execReadOnlyQuery('
SELECT
\'' . $type . '\' AS renderer,
\''.$type.'\' AS type,
s.student_uid AS uid,
CONCAT(s.student_uid,\'@'.DOMAIN.'\') AS email,
@@ -413,6 +417,7 @@ EOSC;
$students = $dbModel->execReadOnlyQuery('
SELECT
\'student\' AS renderer,
\''.$type.'\' AS type,
s.student_uid AS uid,
s.matrikelnr,
@@ -458,6 +463,7 @@ EOSC;
$prestudent = $dbModel->execReadOnlyQuery('
SELECT
\'' . $type . '\' AS renderer,
\''.$type.'\' AS type,
ps.prestudent_id,
ps.studiengang_kz,
@@ -517,6 +523,7 @@ EOSC;
$rooms = $dbModel->execReadOnlyQuery('
SELECT
\'room\' AS renderer,
\''.$type.'\' AS type,
COALESCE(ort.ort_kurzbz, \'N/A\') as ort_kurzbz,
COALESCE(ort.gebteil, \'N/A\') as building,
File diff suppressed because it is too large Load Diff
+791
View File
@@ -0,0 +1,791 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
use \DateTimeZone as DateTimeZone;
use \DateInterval as DateInterval;
use \DatePeriod as DatePeriod;
class StundenplanLib
{
private $_ci; // Code igniter instance
/**
* fetches Stundenplan events for the loggedin user between start and end
* or for a lv
*
* @param string $start
* @param string $end
* @param string|null $lehrveranstaltung_id
* @return stdClass
* @access public
*/
public function getStundenplan($start, $end, $lehrveranstaltung_id = null)
{
if (!$lehrveranstaltung_id && $lehrveranstaltung_id !== 0)
return $this->getEventsUser($start, $end);
return $this->getEventsLv($lehrveranstaltung_id, $start, $end);
}
/**
* fetches Stundenplan events for the loggedin user between start and end
*
* @param string $start
* @param string $end
* @return stdClass
* @access public
*/
public function getEventsUser($start, $end)
{
$this->_ci =& get_instance();
$this->_ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$uid = getAuthUID();
if (is_null($uid))
return error("No UID");
$is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter($uid));
if ($is_mitarbeiter)
return $this->getEventsEmployee($uid, $start, $end);
return $this->getEventsStudent($uid, $start, $end);
}
/**
* fetches Stundenplan events for a student between start and end
*
* @param string $student_uid
* @param string $start
* @param string $end
* @return stdClass
* @access public
*/
public function getEventsStudent($student_uid, $start, $end)
{
$this->_ci =& get_instance();
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
$semester_range = $this->studienSemesterErmitteln($start, $end);
if (isError($semester_range))
return $semester_range;
$semester_range = getData($semester_range);
$this->sortStudienSemester($semester_range);
$function_error = $this->applyLoadUeberSemesterHaelfte($semester_range);
if ($function_error)
return $function_error;
// getting the gruppen_kurzbz of the student in the different studiensemester
$benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($student_uid, $semester_range);
if (isError($benutzer_gruppen))
return $benutzer_gruppen;
$benutzer_gruppen = getData($benutzer_gruppen);
// getting the student_lehrverbaende of the student in the different studiensemester
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range);
if (isError($student_lehrverband))
return $student_lehrverband;
$student_lehrverband = getData($student_lehrverband);
$stundenplan_query = $this->_ci->StundenplanModel->getStundenplanQuery(
$start,
$end,
$semester_range,
$benutzer_gruppen,
$student_lehrverband
);
if (!$stundenplan_query)
return success([]);
$stundenplan_data = $this->_ci->StundenplanModel->stundenplanGruppierung($stundenplan_query);
if (isError($stundenplan_data))
return $stundenplan_data;
$stundenplan_data = getData($stundenplan_data) ?? [];
$function_error = $this->expandObjectInformation($stundenplan_data);
if ($function_error)
return $function_error;
return success($stundenplan_data);
}
/**
* fetches Stundenplan events for an employee between start and end
*
* @param string $uid
* @param string $start
* @param string $end
* @return stdClass
* @access public
*/
public function getEventsEmployee($uid, $start, $end)
{
$this->_ci =& get_instance();
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
$stundenplan_data = $this->_ci->StundenplanModel->getStundenplanMitarbeiter($start, $end, $uid);
if (isError($stundenplan_data))
return $stundenplan_data;
$stundenplan_data = getData($stundenplan_data) ?? [];
$function_error = $this->expandObjectInformation($stundenplan_data);
if ($function_error)
return $function_error;
return success($stundenplan_data);
}
/**
* fetches Stundenplan events for a LV between start and end
*
* @param integer $lehrveranstaltung_id
* @param string $start
* @param string $end
* @return stdClass
* @access public
*/
public function getEventsLv($lehrveranstaltung_id, $start, $end)
{
$this->_ci =& get_instance();
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
$stundenplan_data = $this->_ci->StundenplanModel->getStundenplanLVA($start, $end, $lehrveranstaltung_id);
if (isError($stundenplan_data))
return $stundenplan_data;
$stundenplan_data = getData($stundenplan_data) ?? [];
$function_error = $this->expandObjectInformation($stundenplan_data);
if ($function_error)
return $function_error;
// query lv itself in case its Stundenplan is being queried and it has no entries
$this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$lv_result = $this->_ci->LehrveranstaltungModel->load($lehrveranstaltung_id);
if (isError($lv_result))
return $lv_result;
if (!hasData($lv_result))
return error('LV not found');
return success($stundenplan_data);
}
/**
* Get stundenplan for a room
*
* @param string $ort_kurzbz
* @param string $start_date
* @param string $end_date
* @return stdClass
*/
public function getRoomplan($ort_kurzbz, $start_date, $end_date)
{
$this->_ci =& get_instance();
// Load Config
$this->_ci->load->config('calendar');
// Load Models
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
$query = $this->_ci->StundenplanModel->getRoomQuery($ort_kurzbz, $start_date, $end_date);
$roomplan_data = $this->_ci->StundenplanModel->stundenplanGruppierung($query);
if (isError($roomplan_data))
return $roomplan_data;
$this->expandObjectInformation($roomplan_data->retval);
return $roomplan_data;
}
/**
* Get reservations (for a room or all)
*
* @param string $start_date
* @param string $end_date
* @param string $ort_kurzbz
* @return stdClass
*/
public function getReservierungen($start_date, $end_date, $ort_kurzbz = '')
{
$this->_ci =& get_instance();
// Load Config
$this->_ci->load->config('calendar');
// Load Models
$this->_ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$this->_ci->load->model('ressource/Reservierung_model', 'ReservierungModel');
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
$is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter(getAuthUID()));
if ($is_mitarbeiter) {
$reservierungen = $this->_ci->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz);
} else {
// querying the reservierungen
$reservierungen = $this->_ci->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz);
}
if (isError($reservierungen))
return $reservierungen;
$function_error = $this->expandObjectInformation($reservierungen->retval);
if (!is_null($function_error))
return $function_error;
return $reservierungen;
}
public function getLektorenFromLehrveranstaltung($lehrveranstaltung_id, $semester, $studiengang_kz, $studiensemester_kurzbz){
$this->_ci =& get_instance();
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
$this->_ci->load->model('organisation/Studiensemester_model','StudiensemesterModel');
$studiensemester = $this->_ci->StudiensemesterModel->loadWhere(["studiensemester_kurzbz"=>$studiensemester_kurzbz]);
if(isError($studiensemester))
{
return error(getData($studiensemester));
}
$studiensemester = current(getData($studiensemester));
$lektoren = $this->_ci->StundenplanModel->execReadOnlyQuery("
SELECT DISTINCT uid
FROM campus.vw_stundenplan
WHERE lehrveranstaltung_id = ? AND
studiengang_kz = ? AND
semester = ? AND
(datum BETWEEN ? AND ?)
",[$lehrveranstaltung_id, $studiengang_kz, $semester, $studiensemester->start, $studiensemester->ende]);
if(isError($lektoren))
{
return error(getData($lektoren));
}
$lektoren = getData($lektoren);
if(isset($lektoren)){
$lektoren = array_map(function($lektor){
return $lektor->uid;
},$lektoren);
}
return success($lektoren);
}
public function expandObjectInformation($data)
{
$this->_ci =& get_instance();
// Load Config
$this->_ci->load->config('calendar');
// Load Model
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
foreach ($data as $item)
{
$tz = new DateTimeZone($this->_ci->config->item('timezone'));
$isostart = new DateTime($item->datum . ' ' . $item->beginn, $tz);
$item->isostart = $isostart->format(DateTime::ATOM);
$isoend = new DateTime($item->datum . ' ' . $item->ende, $tz);
$item->isoend = $isoend->format(DateTime::ATOM);
$lektor_obj_array = array();
$gruppe_obj_array = array();
// load lektor object
foreach ($item->lektor as $lv_lektor)
{
$this->_ci->StundenplanModel->addLimit(1);
$lektor_object = $this->_ci->StundenplanModel->execReadOnlyQuery("
SELECT mitarbeiter_uid, vorname, nachname, kurzbz
FROM public.tbl_mitarbeiter
JOIN public.tbl_benutzer benutzer ON benutzer.uid = mitarbeiter_uid
JOIN public.tbl_person person ON person.person_id = benutzer.person_id
WHERE kurzbz = ?", [$lv_lektor]);
if (isError($lektor_object)) {
$this->_ci->show_error(getError($lektor_object));
}
if(isError($lektor_object))
{
return error(getData($lektor_object));
}
$lektor_object = getData($lektor_object);
if(count($lektor_object) == 0)
{
return error("No lektor object");
}
$lektor_object = current($lektor_object);
// only provide needed information of the mitarbeiter object
$lektor_obj_array[] = $lektor_object;
}
// load gruppe object
foreach ($item->gruppe as $lv_gruppe)
{
$lv_gruppe = strtr($lv_gruppe, ['(' => '', ')' => '', '"' => '']);
$lv_gruppe_array = explode(",", $lv_gruppe);
list($gruppe, $verband, $semester, $studiengang_kz, $gruppen_kuerzel) = $lv_gruppe_array;
$lv_gruppe_object = new stdClass();
$lv_gruppe_object->gruppe = $gruppe;
$lv_gruppe_object->verband = $verband;
$lv_gruppe_object->semester = $semester;
$lv_gruppe_object->studiengang_kz = $studiengang_kz;
$lv_gruppe_object->kuerzel = $gruppen_kuerzel;
$gruppe_obj_array[] = $lv_gruppe_object;
}
if($item->ort_kurzbz) {
$ort_content_object = $this->_ci->StundenplanModel->execReadOnlyQuery("
SELECT content_id
FROM public.tbl_ort
WHERE ort_kurzbz = ?", [$item->ort_kurzbz]);
if (isError($ort_content_object)) {
return error(getData($ort_content_object));
}
$ort_content_object = getData($ort_content_object)[0];
if($ort_content_object) {
$item->ort_content_id = $ort_content_object->content_id;
}
}
$item->gruppe = $gruppe_obj_array;
$item->lektor = $lektor_obj_array;
}
}
public function fetchFerienTageEvents($start_date, $end_date, $studiengang_kz)
{
$this->_ci =& get_instance();
// Load Config
$this->_ci->load->config('calendar');
$this->_ci->load->model('organisation/Ferien_model', 'FerienModel');
$tz = new DateTimeZone($this->_ci->config->item('timezone'));
$ferienEvents = $this->_ci->FerienModel->execReadOnlyQuery("
SELECT *
FROM lehre.tbl_ferien
WHERE (bisdatum >= ? AND vondatum < ?) AND (studiengang_kz = 0 OR studiengang_kz = ?)
", [$start_date, $end_date, $studiengang_kz]);
if (isError($ferienEvents))
return $ferienEvents;
$ferienEvents = getData($ferienEvents);
if (!$ferienEvents)
return success([]);
$ferienEvents = array_map(function ($event) {
$event_start = new DateTime($event->vondatum);
$event_end = new DateTime($event->bisdatum);
$event_end->modify('+1 day');
$interval = new DateInterval('P1D');
$period = new DatePeriod($event_start, $interval, $event_end);
$event->dates = iterator_to_array($period);
return $event;
}, $ferienEvents);
$start_date = new DateTime($start_date);
$start_date->setTime(0, 0, 0);
$end_date = new DateTime($end_date);
$end_date->setTime(23, 59, 59);
$ferienEventsFlattened = [];
foreach ($ferienEvents as $ferien_event) {
foreach ($ferien_event->dates as $date) {
if ($date < $start_date || $date > $end_date)
continue;
$event = new stdClass();
$event->bezeichnung = $ferien_event->bezeichnung;
$event->datum = $date->format('Y-m-d');
$event->type = 'ferien';
$ferienEventsFlattened[] = $event;
}
};
$today = new DateTime();
$ferienEventsFlattened = array_map(function ($event) use ($today, $tz) {
$ferien_event = (object)array(
'type' => 'ferien',
'beginn' => $today->format('H:i:s'),
'ende' => $today->format('H:i:s'),
'isostart' => (new DateTime($event->datum . ' 00:00:00', $tz))->format('c'),
'isoend' => (new DateTime($event->datum . ' 23:59:59', $tz))->format('c'),
'allDayEvent' => true,
'datum' => $event->datum,
'topic' => $event->bezeichnung,
'titel' => $event->bezeichnung,
'farbe' => '00689E'
);
return $ferien_event;
}, $ferienEventsFlattened);
return success($ferienEventsFlattened);
}
// start of the private functions ########################################################################################################
// function used to sort an array of studiensemester strings
private function sortStudienSemester(&$semester_range){
usort(
$semester_range,
function($first,$second)
{
$sem_first = null;
$year_first = null;
$match_first = null;
$sem_second = null;
$year_second = null;
$match_second = null;
preg_match('/([WS]+)([0-9]+)/',$first,$match_first);
preg_match('/([WS]+)([0-9]+)/',$second,$match_second);
$sem_first = $match_first[1];
$year_first = intval($match_first[2]);
$sem_second = $match_second[1];
$year_second = intval($match_second[2]);
if($year_first < $year_second)
{
return -1;
}
else if($year_first > $year_second)
{
return 1;
}
else if($year_first == $year_second && $sem_first > $sem_second)
{
return 1;
}
else if($year_first == $year_second && $sem_first < $sem_second)
{
return -1;
}
return 0;
}
);
}
private function fetchBenutzerGruppenFromStudiensemester($student_uid, $semester_range)
{
$this->_ci->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel');
$benutzer_gruppen = [];
// for each studiensemester fetch the benutzer gruppen and add them to an associate $bentuzer_gruppen array
/*
[
['WS2023'] => [['gruppe1_SS2023','gruppe2_SS2023'],['gruppe1_WS2023','gruppe2_WS2023']],
['SS2024'] => [['gruppe1_WS2023','gruppe2_WS2023'],['gruppe1_SS2024','gruppe2_SS2024']],
['WS2024'] => [['gruppe1_SS2024','gruppe2_SS2024'],['gruppe1_WS2024','gruppe2_WS2024']],
]
*/
foreach($semester_range as $semester_key => $semester_array)
{
$benutzer_gruppen[$semester_key] = [];
// each semester could have ajoint semesters that need to be checked
foreach($semester_array as $semester=>$semester_date_range)
{
// for each active semester query the benutzer_gruppen associated to the semester
$benutzer_query = $this->_ci->BenutzergruppeModel->execReadOnlyQuery("
SELECT * FROM tbl_benutzergruppe where uid = ? AND studiensemester_kurzbz = ?",[$student_uid, $semester]);
if(isError($benutzer_query)){
return error(getData($benutzer_query));
}
$benutzer_query_result = getData($benutzer_query)??[];
array_push(
$benutzer_gruppen[$semester_key],
array_map(
function($item)
{
return "'".$item->gruppe_kurzbz. "'";
},
$benutzer_query_result
)
);
}
}
// merge the gruppen of each studiensemester together for the original studiensemester
/*
[
['WS2023'] => ['gruppe1_SS2023','gruppe2_SS2023','gruppe1_WS2023','gruppe2_WS2023'],
['SS2024'] => ['gruppe1_WS2023','gruppe2_WS2023','gruppe1_SS2024','gruppe2_SS2024'],
['WS2024'] => ['gruppe1_SS2024','gruppe2_SS2024','gruppe1_WS2024','gruppe2_WS2024'],
]
*/
$benutzer_gruppen = array_map(
function($gruppe)
{
$merged_gruppe = [];
foreach($gruppe as $gruppen_array)
{
$merged_gruppe = array_merge($merged_gruppe, $gruppen_array);
}
return $merged_gruppe;
},
$benutzer_gruppen
);
return success($benutzer_gruppen);
}
private function fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range)
{
$this->_ci->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel');
$student_lehrverband = [];
// for each studiensemester fetch the studentlehrverbaende and add them to an associate $student_lehrverband array
/*
[
['WS2023'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ] ],
['SS2024'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ] ],
['WS2024'] => [ [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ] ],
]
*/
foreach($semester_range as $semester_key => $semester_array)
{
$student_lehrverband[$semester_key] = [];
foreach($semester_array as $semester=>$semester_date_range)
{
// for each active semester query the student_lehrverband associated to the semester
$lehrverband_query = $this->_ci->BenutzergruppeModel->execReadOnlyQuery("
SELECT * FROM tbl_studentlehrverband where student_uid = ? AND studiensemester_kurzbz = ?", [$student_uid, $semester]);
if(isError($lehrverband_query)){
return error(getData($lehrverband_query));
}
$lehrverband_query_result = getData($lehrverband_query)??[];
$converted_studentLehrverband= array_map(
function ($item)
{
$result = new stdClass();
$result->studiengang_kz = $item->studiengang_kz;
$result->semester = $item->semester;
$result->verband = $item->verband;
$result->gruppe = $item->gruppe;
return $result;
},
$lehrverband_query_result);
array_push($student_lehrverband[$semester_key], $converted_studentLehrverband);
}
}
// merge the studentlehrverband of each studiensemester together for the original studiensemester
/*
[
['WS2023'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ],
['SS2024'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ],
['WS2024'] => [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ],
]
*/
$student_lehrverband = array_map(
function($studentlehrverband)
{
$merged_studentlehrverband = [];
foreach($studentlehrverband as $studentlehrverband_array)
{
$merged_studentlehrverband = array_merge($merged_studentlehrverband, $studentlehrverband_array);
}
return $merged_studentlehrverband;
},
$student_lehrverband
);
return success($student_lehrverband);
}
private function applyLoadUeberSemesterHaelfte(&$semester_range)
{
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
/*
@var($semester_collection)
convert the array of studiensemester into an associative array with the studiensemester as the key
and the values of each key are the studiensemester needed for the query associated to that studiensemester
example:
#INPUT:
['WS2023','SS2024','WS2024']
#OUTPUT:
[
'WS2023' => ['SS2023','WS2023']
'SS2024' => ['WS2023','SS2024']
'WS2024' => ['SS2024','WS2024']
]
*/
$semester_collection = [];
foreach($semester_range as $studiensemester)
{
$previous_studiensemester = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester);
if(isError($previous_studiensemester))
{
return error(getData($previous_studiensemester));
}
$previous_studiensemester = getData($previous_studiensemester);
if (count($previous_studiensemester) == 0) {
return error('no previous semester');
}
$previous_studiensemester = current($previous_studiensemester)->studiensemester_kurzbz;
$semester_collection[$studiensemester] = [$previous_studiensemester, $studiensemester];
}
/*
@var($studienSemesterDateRanges)
fetches for each studiensemester the start and end date, (SS) summer studiensemester are extended by 1 month to cover the summerbreak
based on the LVPLAN_LOAD_UEBER_SEMESTERHAELFTE constant it will load both the semester and the previous semester with the full date range
or the semester with the full date range and the previous semester with the half date range:
#INPUT:
[
'WS2023' => ['SS2023','WS2023']
'SS2024' => ['WS2023','SS2024']
'WS2024' => ['SS2024','WS2024']
]
#OUTPUT: depends whether LVPLAN_LOAD_UEBER_SEMESTERHAELFTE is true or false
~ if LVPLAN_LOAD_UEBER_SEMESTERHAELFTE == true
[
"SS2024": [
"WS2023": [
"start"=> "2024-02-03",
"ende"=> "2024-08-31"
],
"SS2024": [
"start"=> "2024-02-03",
"ende"=> "2024-08-31"
]
]
]
~ if LVPLAN_LOAD_UEBER_SEMESTERHAELFTE == false
[
"SS2024": [
"WS2023": [
"start"=> "2024-02-03",
"ende"=> "2024-05-17"
],
"SS2024": [
"start"=> "2024-02-03",
"ende"=> "2024-08-31"
]
]
]
*/
$studienSemesterDateRanges=[];
foreach($semester_collection as $semester_original => $semester_adjoint)
{
$semester_start_ende = $this->_ci->StudiensemesterModel->getStartEndeFromStudiensemester($semester_original);
if(isError($semester_start_ende))
{
return error(getData($semester_start_ende));
}
$semester_start_ende = current(getData($semester_start_ende));
// initialize empty arrays to add key value pairs
$studienSemesterDateRanges[$semester_original] = [];
// check if the studiensemester is a summer semester and add 1 month to bridge the school summer break
$match = null;
preg_match("/^(SS)([0-9]+)/",$semester_original,$match);
if(count($match) >0)
{
$one_month = new DateInterval('P1M');
$one_day = DateInterval::createFromDateString('1 days');
$summer_studiensemester_end_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->ende);
$summer_studiensemester_end_date->add($one_month);
$summer_studiensemester_end_date->sub($one_day);
$semester_start_ende->ende = date_format($summer_studiensemester_end_date,'Y-m-d');
}
if (defined('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE') && LVPLAN_LOAD_UEBER_SEMESTERHAELFTE === true)
{
foreach($semester_adjoint as $adjoint)
{
$studienSemesterDateRanges[$semester_original][$adjoint]=$semester_start_ende;
}
}
else
{
//TODO: half of a DateInterval might not be correctly calculated
// calculate the half of the studiensemester
$studiensemester_start_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->start);
$studiensemester_end_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->ende);
$studiensemester_time_difference = $studiensemester_start_date->diff($studiensemester_end_date);
$half_dateNumber = ceil($studiensemester_time_difference->d/2)+ceil(($studiensemester_time_difference->m*30)/2);
$half_dateInterval = new DateInterval('P'.strval($half_dateNumber) .'D');
$studiensemester_half = date_format($studiensemester_start_date->add($half_dateInterval),'Y-m-d');
$first_half = new stdClass();
$first_half->start = $semester_start_ende->start;
$first_half->ende = $studiensemester_half;
$studienSemesterDateRanges[$semester_original][$semester_adjoint[0]] = $first_half;
$studienSemesterDateRanges[$semester_original][$semester_adjoint[1]] = $semester_start_ende;
}
$semester_range = $studienSemesterDateRanges;
}
}
private function studienSemesterErmitteln($start_date, $end_date)
{
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
// gets all studiensemester from the student from start_date to end_date
$semester_range = $this->_ci->StudiensemesterModel->getByDateRange($start_date, $end_date);
if (isError($semester_range))
return $semester_range;
$semester_range = array_map(
function ($sem) {
return $sem->studiensemester_kurzbz;
},
getData($semester_range) ?: []
);
// if no studiensemester is found for the given timespan, get the nearest studiensemester
if (count($semester_range) == 0)
{
$aktuelle_studiensemester = $this->_ci->StudiensemesterModel->getNearest();
if (isError($aktuelle_studiensemester))
return $aktuelle_studiensemester;
$aktuelle_studiensemester = getData($aktuelle_studiensemester);
if (count($aktuelle_studiensemester) == 0) {
return error("No aktuelles semester");
}
$aktuelle_studiensemester = current($aktuelle_studiensemester)->studiensemester_kurzbz;
// push aktuelles semester in active semester array
array_push($semester_range, $aktuelle_studiensemester);
}
return success($semester_range);
}
}
@@ -107,7 +107,7 @@ class DashboardLib
$emptyoverride = new stdClass();
$emptyoverride->dashboard_id = $dashboard->dashboard_id;
$emptyoverride->uid = $uid;
$emptyoverride->override = '{"widgets": {"' . self::USEROVERRIDE_SECTION . '": {}}}';
$emptyoverride->override = '{"' . self::USEROVERRIDE_SECTION . '": {"widgets":{}}, "custom": { "widgets" : {}}}';
return $emptyoverride;
}
@@ -127,7 +127,7 @@ class DashboardLib
$emptypreset->dashboard_id = $dashboard->dashboard_id;
$emptypreset->funktion_kurzbz = $funktion_kurzbz;
$section = ($funktion_kurzbz !== null) ? $funktion_kurzbz : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL;
$emptypreset->preset = '{"widgets": {"' . $section . '": {}}}';
$emptypreset->preset = '{"' . $section . '": { "widgets" : {}},"custom": { "widgets" : {}}}';
return $emptypreset;
}
@@ -206,21 +206,22 @@ class DashboardLib
public function addWidgetToWidgets(&$widgets, $section, $widget, $widgetid)
{
$section = ($section !== null) ? $section : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL;
if (!isset($widgets[$section]) || !is_array($widgets[$section]))
if (!isset($widgets[$section]) || !isset($widgets[$section]["widgets"]) || !is_array($widgets[$section]))
{
$widgets[$section] = array();
$widgets[$section]["widgets"] = array();
}
$widgets[$section][$widgetid] = $widget;
$widgets[$section]["widgets"][$widgetid] = $widget;
}
public function removeWidgetFromWidgets(&$widgets, $section, $widgetid)
{
$section = ($section !== null) ? $section : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL;
if (isset($widgets[$section]) && isset($widgets[$section][$widgetid]))
if (isset($widgets[$section]) && isset($widgets[$section]["widgets"][$widgetid]))
{
unset($widgets[$section][$widgetid]);
if(empty($widgets[$section]) && $section !== self::USEROVERRIDE_SECTION) {
unset($widgets[$section]["widgets"][$widgetid]);
if(empty($widgets[$section]["widgets"]) && $section !== self::USEROVERRIDE_SECTION) {
unset($widgets[$section]);
}
return true;
@@ -131,6 +131,11 @@ class VertragsbestandteilLib
return $this->VertragsbestandteilModel->getVertragsbestandteil($vertragsbestandteil_id);
}
public function fetchLastVertragsbestandteilStundenBeforeAltersteilzeit($dienstverhaeltnis_id)
{
return $this->VertragsbestandteilModel->getLastVertragsbestanteilStundenBeforeAltersteilzeit($dienstverhaeltnis_id);
}
public function storeDienstverhaeltnis(Dienstverhaeltnis $dv)
{
if( intval($dv->getDienstverhaeltnis_id()) > 0 )