merge master into feature-55992/FHC4_Studierendenverwaltung_Messaging

This commit is contained in:
ma0068
2025-04-22 14:58:56 +02:00
379 changed files with 25421 additions and 4365 deletions
+1 -1
View File
@@ -4,6 +4,6 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
// CMS Content Id for CIS4 Menu Root
$config['cis_menu_root_content_id'] = 11066;
$config['cis_menu_root_content_id'] = 11087;
// send Mails for ProfilUpdate
$config['cis_send_profil_update_mails'] = true;
+1 -2
View File
@@ -61,8 +61,7 @@ $route['api/v1/organisation/[O|o]rganisationseinheit/(:any)'] = 'api/v1/organisa
$route['api/v1/ressource/[B|b]etriebsmittelperson/(:any)'] = 'api/v1/ressource/betriebsmittelperson2/$1';
$route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1';
$route['CisVue'] = 'CisVue/dashboard';
$route['Cis/Stundenplan/(:any)'] = 'Cis/Stundenplan';
$route['Cis/Stundenplan/.*'] = 'Cis/Stundenplan/index/$1';
// load routes from extensions
$subdir = 'application/config/extensions';
+76
View File
@@ -0,0 +1,76 @@
<?php
$config['tabs'] =
[
'details' => [
//all fields can be configured to be hidden, see class attribute stv-details-details-name for name
'hiddenFields' => [],
'hideUDFs' => false
],
'prestudent' => [
//all fields can be configured to be hidden, see class attribute stv-details-prestudent-name for name
'hiddenFields' => [
//propably used by FH-Communities
'aufnahmeschluessel', 'standort_code', 'facheinschlaegigBerufstaetig'
],
'hideUDFs' => false
],
'finalexam' => [
'documents' => [
'pruefungsprotokoll' => [
'de' => [
'Bakk' => 'PrProtBA',
'Master' => 'PrProtMA',
],
'en' => [
'Bakk' => 'PrProtBAEng',
'Master' => 'PrProtMAEng',
],
],
'pruefungszeugnis' => [
'de' => [
'Bakk' => 'Bakkzeugnis',
'Master' => 'Diplomzeugnis',
],
'en' => [
'Bakk' => 'BakkzeugnisEng',
'Master' => 'DiplomzeugnisEng',
],
],
'urkunde' => [
'de' => [
'Bakk' => 'Bakkurkunde',
'Master' => 'Diplomurkunde',
],
'en' => [
'Bakk' => 'BakkurkundeEng',
'Master' => 'DiplomurkundeEng',
],
],
],
]
];
// List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined
$fieldsZgvDoktor = ['zgvdoktorort', 'zgvdoktordatum', 'zgvdoktornation', 'zgvdoktor_erfuellt', 'zgvdoktor_code'];
// List of fields to show when ZGV_ERFUELLT_ANZEIGEN is defined
$fieldsZgvErfuellt = ['zgv_erfuellt', 'zgvmas_erfuellt','zgvdoktor_erfuellt'];
//order important: to show zgf_erfuellt_doktor just in case visibility of doktor is true
if (!defined('ZGV_ERFUELLT_ANZEIGEN') || !ZGV_ERFUELLT_ANZEIGEN) {
$config['tabs']['prestudent']['hiddenFields'] = array_merge(
$config['tabs']['prestudent']['hiddenFields'], $fieldsZgvErfuellt
);
}
if (!defined('ZGV_DOKTOR_ANZEIGEN') || !ZGV_DOKTOR_ANZEIGEN) {
$config['tabs']['prestudent']['hiddenFields'] = array_merge(
$config['tabs']['prestudent']['hiddenFields'],
$fieldsZgvDoktor
);
}
@@ -0,0 +1,30 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
*
*/
class InfoTerminal extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct([
'index' => ['basis/cis:r'],
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @return void
*/
public function index()
{
$this->load->view('Cis/InfoTerminal.php', []);
}
}
+6 -1
View File
@@ -26,7 +26,12 @@ class MyLv extends Auth_Controller
*/
public function index()
{
$this->load->view('Cis/MyLv');
$viewData = array(
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLv']);
}
public function Info($studien_semester,$lvid)
+7 -2
View File
@@ -55,7 +55,10 @@ class Profil extends Auth_Controller
*/
public function index()
{
$this->load->view('Cis/Profil');
$viewData = array(
);
$this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'profilIndex']);
}
/**
@@ -65,7 +68,9 @@ class Profil extends Auth_Controller
*/
public function View($uid)
{
$this->load->view('Cis/Profil');
$viewData = array ('uid' => $uid);
$this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'profilViewUid']);
}
/**
+6 -1
View File
@@ -25,6 +25,11 @@ class Stundenplan extends Auth_Controller
*/
public function index()
{
$this->load->view('Cis/Stundenplan');
$viewData = array(
'uid'=>getAuthUID(),
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Stundenplan']);
}
}
+1 -1
View File
@@ -36,6 +36,6 @@ class Cis4 extends Auth_Controller
'person_id' => $personData->person_id
);
$this->load->view('CisVue/Dashboard.php',['viewData' => $viewData]);
$this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'FhcDashboard']);
}
}
+16 -47
View File
@@ -60,7 +60,14 @@ class Cms extends Auth_Controller
$content = current($content);
$this->load->view('CisVue/Cms/Content', ['content_id' => $content_id, 'template_kurzbz' => $content->template_kurzbz, 'version' => $version, 'sprache' => $sprache, 'sichtbar' => $sichtbar]);
$viewData = array(
'content_id' => $content_id,
'template_kurzbz' => $content->template_kurzbz,
'version' => $version,
'sichtbar' => $sichtbar
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Content']);
}
/**
@@ -75,53 +82,15 @@ class Cms extends Auth_Controller
* @return void
*/
public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
{
$this->load->view('CisVue/Cms/Content', ['infoscreen' => $infoscreen, 'studiengang_kz' => $studiengang_kz, 'semester' => $semester, 'mischen' => $mischen, 'titel' => $titel, 'edit' => $edit, 'sichtbar' => $sichtbar]);
{
$viewData = array();
$this->load->view('CisRouterView/CisRouterView.php', ['viewData'=>$viewData, 'route' => 'News']);
}
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
{
$get_page = intval($this->input->get('page', true));
$get_page_size = intval($this->input->get('page_size', true));
if ($get_page) {
$page = $get_page;
}
if ($get_page_size) {
$page_size = $get_page_size;
} else {
$page_size = $this->page_size;
}
$news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size);
if (isError($news)) {
$this->terminateWithJsonError(getError($news));
}
$news = hasData($news) ? getData($news) : null;
if ($news) {
echo json_encode($news);
} else {
show_error("News: No data found");
}
}
public function getNewsRowCount($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10)
{
list($studiengang_kz, $semester) = $this->cmslib->getStgAndSem($studiengang_kz, $semester);
$all = $edit;
$num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->page_size, $all, $mischen);
if (isError($num_rows)) {
$this->terminateWithJsonError(getError($num_rows));
}
$num_rows = hasData($num_rows) ? getData($num_rows) : null;
if ($num_rows) {
echo json_encode($num_rows);
} else {
show_error("News number rows: No data found");
}
}
public function getRoomInformation($ort_kurzbz){
$this->load->view('CisVue/Cms/RoomInformation',['ort_kurzbz'=>$ort_kurzbz]);
$viewData = array(
'ort_kurzbz' => $ort_kurzbz
);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'CmsRoom']);
}
}
+6 -8
View File
@@ -29,17 +29,15 @@ class Dashboard extends Auth_Controller
{
$this->load->model('person/Person_model','PersonModel');
$begruesung = $this->PersonModel->getFirstName(getAuthUID());
if(isError($begruesung))
{
show_error("name couldn't be loaded for username ".getAuthUID());
}
$begruesung = getData($begruesung);
$personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
$viewData = array(
'name' => $begruesung
'uid' => getAuthUID(),
'name' => $personData->vorname,
'person_id' => $personData->person_id
);
$this->load->view('CisVue/Dashboard.php', ['viewData' => $viewData]);
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData]);
}
}
+294
View File
@@ -0,0 +1,294 @@
<?php
/**
* Copyright (C) 2024 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');
/**
* This controller handles output and access to documents.
* It creates a XML file, transforms it with the XSL-FO Vorlage from the
* database and generates a PDF file with unoconv or docsbox.
* This file is then outputted as download.
*
* It is the CodeIgniter version of content/pdfExport.php when not using the
* get paremeters: "archivdokument" and "archive".
* Use exportSigned() instead of providing the "sign" get parameter and
* export() otherwise.
*/
class Documents extends Auth_Controller
{
public function __construct()
{
parent::__construct([
'export' => self::PERM_LOGGED,
'exportSigned' => self::PERM_LOGGED
]);
// Load Phrases
$this->loadPhrases([
'stv'
]);
}
/**
* Download a not signed document.
*
* @param string $xml
* @param string $xsl
*
* @return void
*/
public function export($xml, $xsl)
{
return $this->_export($xml, $xsl);
}
/**
* Download a signed document.
*
* @param string $xml
* @param string $xsl
*
* @return void
*/
public function exportSigned($xml, $xsl)
{
return $this->_export($xml, $xsl, getAuthUID());
}
/**
* Helper function for export() and exportSigned()
*
* @param string $xml
* @param string $xsl
* @param string $sign_user (optional)
*
* @return void
*/
protected function _export($xml, $xsl, $sign_user = null)
{
$xsl_oe_kurzbz = null;
$version = $this->input->post_get('version') ?: null;
// Get the OE or STG of the document
$xsl_oe_kurzbz = $this->input->post_get('xsl_oe_kurzbz')
?: $this->input->post_get('xsl_stg_kz')
?: $this->input->post_get('stg_kz');
if (is_null($xsl_oe_kurzbz)) {
$uid = $this->input->post_get('uid');
if ($uid) {
$uid = current(explode(';', $uid));
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load([$uid]);
if (!isError($result) && hasData($result))
$xsl_oe_kurzbz = current(getData($result))->studiengang_kz;
}
}
if (is_null($xsl_oe_kurzbz)) {
$prestudent_id = $this->input->post_get('prestudent_id');
if ($prestudent_id) {
$prestudent_id = current(explode(';', $prestudent_id));
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$result = $this->PrestudentModel->load($prestudent_id);
if (!isError($result) && hasData($result))
$xsl_oe_kurzbz = current(getData($result))->studiengang_kz;
}
}
if (is_null($xsl_oe_kurzbz))
$xsl_oe_kurzbz = 0;
// Access rights
if ($xsl == 'AccountInfo') {
$this->load->model('resource/Mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('crm/Student_model', 'StudentModel');
$uids = $this->input->post_get('uid');
if ($uids) {
$uids = explode(';', $uids);
foreach ($uids as $uid) {
$result = $this->MitarbeiterModel->load($uid);
if (!isError($result) && hasData($result)) {
if (!$this->permissionlib->isBerechtigt('admin', 'suid', 0)
&& !$this->permissionlib->isBerechtigt('mitarbeiter', 'suid', 0))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'mitarbeiter:rw']]);
} else {
$result = $this->StudentModel->load([$uid]);
if (!isError($result) && hasData($result)) {
$student = current(getData($result));
if (!$this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz)
&& !$this->permissionlib->isBerechtigt('admin', 'suid', 0)
&& !$this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz)
&& !$this->permissionlib->isBerechtigt('assistenz', 'suid', 0)
&& !$this->permissionlib->isBerechtigt('support', 'suid', 0))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw', 'support:rw']]);
}
}
}
}
} else {
$this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
$result = $this->VorlagestudiengangModel->getCurrent($xsl, $xsl_oe_kurzbz, $version);
if (isError($result))
return show_error(getError($result));
if (!hasData($result))
return show_404();
$access_rights = current(getData($result))->berechtigung;
if (!$access_rights)
return show_404();
$allowed = false;
foreach ($access_rights as $access_right) {
if ($this->permissionlib->isBerechtigt($access_right)) {
$allowed = true;
break;
}
}
if (!$allowed)
return $this->_outputAuthError([$this->router->method => $access_rights]);
}
// Output format
$outputformat = $this->input->post_get('output') ?: 'pdf';
if ($outputformat != 'pdf'
// An der FHTW darf das Studienblatt und das Prüfungsprotokoll auch in anderen Formaten exportiert werden
&& !(CAMPUS_NAME == 'FH Technikum Wien'
&& ($xsl == 'Studienblatt'
|| $xsl == 'StudienblattEng'
|| $xsl == 'PrProtBA'
|| $xsl == 'PrProtBAEng'
|| $xsl == 'PrProtMA'
|| $xsl == 'PrProtMAEng'
)
)
&& !$this->permissionlib->isBerechtigt('system/change_outputformat', null, $xsl_oe_kurzbz)
) {
$outputformat = 'pdf';
}
// XML Params
$params = 'xmlformat=xml';
foreach ([
'uid',
'stg_kz',
'person_id',
'id',
'prestudent_id',
'buchungsnummern',
'ss',
'abschlusspruefung_id',
'typ',
'all',
'preoutgoing_id',
'lvid',
'projekt_kurzbz',
'von',
'bis',
'stundevon',
'stundebis',
'sem',
'lehreinheit',
'mitarbeiter_uid',
'studienordnung_id',
'fixangestellt',
'standort',
'abrechnungsmonat',
'form',
'projektarbeit_id',
'betreuerart_kurzbz',
'studiensemester_kurzbz'
] as $key) {
$value = $this->input->post_get($key);
if ($value !== null)
$params .= '&' . $key . '=' . urlencode($value);
}
$value = $this->input->post_get('vertrag_id');
if ($value !== null) {
foreach ($value as $id)
$params .= '&vertrag_id[]=' . urlencode($id);
}
$this->load->library('DocumentExportLib');
$this->load->model('system/Vorlage_model', 'VorlageModel');
$result = $this->VorlageModel->load($xsl);
if (isError($result))
return show_error(getError($result));
if (!hasData($result))
show_404();
$vorlage = current(getData($result));
if ($sign_user && !$vorlage->signierbar)
return show_error($this->p->t("stv", "grades_error_sign"));
// Filename
$filename = ($vorlage->bezeichnung ?: $vorlage->vorlage_kurzbz);
switch ($xsl) {
case 'LV_Informationen':
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$result = $this->StudiengangModel->load($this->input->post_get('stg_kz'));
if (!isError($result) && hasData($result))
$filename .= '_' . sanitizeProblemChars(current(getData($result))->kurzbzlang);
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$result = $this->StudiensemesterModel->load($this->input->post_get('ss'));
if (!isError($result) && hasData($result))
$filename .= '_' . sanitizeProblemChars(current(getData($result))->studiensemester_kurzbz);
break;
case 'Honorarvertrag':
$uid = str_replace(';', '', $this->input->post_get('uid') ?: '');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->BenutzerModel->addJoin('public.tbl_person', 'person_id', 'LEFT');
$result = $this->BenutzerModel->load([$uid]);
if (!isError($result) && hasData($result)) {
$user = current(getData($result));
$filename .= '_' . sanitizeProblemChars($user->nachname) . '_' . sanitizeProblemChars($user->vorname);
}
break;
case 'Studienordnung':
$filename = 'Studienordnung-Studienplan-';
$this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
$result = $this->StudienordnungModel->load($this->input->post_get('studienordnung_id'));
if (!isError($result) && hasData($result)) {
$so = current(getData($result));
$filename .= sprintf("%'.04d", $so->studiengang_kz) . '-' . $so->studiengangkurzbzlang;
}
break;
default:
$uid = str_replace(';', '', $this->input->post_get('uid') ?: '');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->BenutzerModel->addJoin('public.tbl_person', 'person_id', 'LEFT');
$result = $this->BenutzerModel->load([$uid]);
if (!isError($result) && hasData($result)) {
$user = current(getData($result));
$filename .= '_' . sanitizeProblemChars($user->nachname);
}
break;
}
// XML Data
$result = $this->documentexportlib->getDataURL($xml, $params);
if (isError($result))
return show_error(getError($result));
$data = getData($result);
// Output
$this->documentexportlib->showContent($filename, $vorlage, $data, $xsl_oe_kurzbz, $version, $outputformat, $sign_user);
}
}
@@ -30,7 +30,8 @@ class Studentenverwaltung extends Auth_Controller
'admin' => $this->permissionlib->isBerechtigt('admin'),
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'),
'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'),
'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht')
'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'),
'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'),
],
'variables' => [
'semester_aktuell' => $this->variablelib->getVar('semester_aktuell')
@@ -0,0 +1,52 @@
<?php
/**
* Copyright (C) 2024 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 AuthInfo extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getAuthUID' => self::PERM_LOGGED,
]);
$this->uid = getAuthUID();
$this->pid = getAuthPersonID();
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* returns the uid of the currently logged in user
* @access public
*
*/
public function getAuthUID()
{
$this->terminateWithSuccess(['uid'=>$this->uid]);
}
}
@@ -30,6 +30,7 @@ class Bookmark extends FHCAPI_Controller
'getBookmarks' => self::PERM_LOGGED,
'delete' => self::PERM_LOGGED,
'insert' => self::PERM_LOGGED,
'update' => self::PERM_LOGGED,
]);
$this->load->model('dashboard/Bookmark_model', 'BookmarkModel');
@@ -50,7 +51,8 @@ class Bookmark extends FHCAPI_Controller
*/
public function getBookmarks()
{
$bookmarks = $this->BookmarkModel->loadWhere(["uid"=>$this->uid]);
$this->BookmarkModel->addOrder("bookmark_id");
$bookmarks = $this->BookmarkModel->loadWhere(["uid"=>$this->uid]);
$bookmarks = $this->getDataOrTerminateWithError($bookmarks);
@@ -104,6 +106,33 @@ class Bookmark extends FHCAPI_Controller
$this->terminateWithSuccess($insert_into_result);
}
/**
* updates bookmark in the bookmark table
* @access public
* @return void
*/
public function update($bookmark_id)
{
// form validation
$this->load->library('form_validation');
$this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
$this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
$url = $this->input->post('url',true);
$title = $this->input->post('title',true);
$now = new DateTime();
$now = $now->format('Y-m-d H:i:s');
$update_result = $this->BookmarkModel->update($bookmark_id,['url'=>$url, 'title'=>$title,'updateamum'=>$now]);
$update_result = $this->getDataOrTerminateWithError($update_result);
$this->terminateWithSuccess($update_result);
}
}
@@ -0,0 +1,58 @@
<?php
/**
* Copyright (C) 2024 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 Cis4FhcApi extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getViewData' => self::PERM_LOGGED,
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* fetches ViewData
*/
public function getViewData()
{
$this->load->model('person/Person_model','PersonModel');
$personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
$viewData = array(
'uid' => getAuthUID(),
'name' => $personData->vorname,
'person_id' => $personData->person_id
);
$this->terminateWithSuccess($viewData);
}
}
@@ -0,0 +1,58 @@
<?php
/**
* Copyright (C) 2024 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 CisMenu extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getMenu' => self::PERM_LOGGED,
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* fetches the menu for CIS from the database based on the userLanguage
*/
public function getMenu()
{
$this->load->model('content/Content_model', 'ContentModel');
$this->load->config('cis');
$cis4_content_id =$this->config->item('cis_menu_root_content_id');
$result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(),getUserLanguage());
$result = $this->getDataOrTerminateWithError($result);
$menu = $result->childs ?? [];
$this->terminateWithSuccess($menu);
}
}
+27 -15
View File
@@ -106,7 +106,6 @@ class Cms extends FHCAPI_Controller
$this->terminateWithSuccess($content_id);
}
//todo: there is the method news and getNews but only one should exist
public function news()
{
@@ -125,25 +124,35 @@ class Cms extends FHCAPI_Controller
//get the data or terminate with error
$news = $this->getDataOrTerminateWithError($news);
// array that keeps track of which news don't have a betreff and have to be removed from the news array
$newsToRemove = array();
// collect the content of the news
foreach($news as $news_element){
$this->addMeta("content_id",$news_element->content_id);
foreach($news as $index=>$news_element){
//todo: quick fix, for query builder error when fetching content
$this->NewsModel->resetQuery();
$content = $this->cmslib->getContent($news_element->content_id);
$content = getData($content);
$news_element->content_obj = $content;
if(isError($content))
{
// removes the news from the news array, so that the response does not include a invalid news
array_push($newsToRemove,$index);
//add the error to the api response? visual feedback
//$this->addError(print_r($content->retval,true));
continue;
}
$content = getData($content);
$news_element->content_obj = $content;
}
//removes all news that don't have a betreff
foreach($newsToRemove as $removeNewsIndex)
{
unset($news[$removeNewsIndex]);
}
$withContent = function($news) {
return $news->content_obj != null;
};
};
$newsWithContent = array_filter($news, $withContent);
$this->terminateWithSuccess($newsWithContent);
}
@@ -176,15 +185,18 @@ class Cms extends FHCAPI_Controller
// getting the GET parameters
$page = intval($this->input->get('page', true));
$page_size = intval($this->input->get('page_size', true));
$sprache = $this->input->get('sprache', true);
if(!$sprache)
{
$sprache = getUserLanguage();
}
// default value for the page_size is 10
$page_size = $page_size ?? 10;
$news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size);
$news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size, $sprache);
$news = $this->getDataOrTerminateWithError($news);
$this->addMeta('test', $this->p->t('global', 'studiengangsleitung'));
$this->addMeta('phrases', json_decode($this->p->getJson()));
$this->terminateWithSuccess($news);
@@ -0,0 +1,422 @@
<?php
/**
* Copyright (C) 2024 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');
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about documents
* Listens to ajax post calls to change the documents data
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*
* This controller handles output and access to documents.
* It checks permissions to render documents in an alternative format
* or it creates a XML file, transforms it with the XSL-FO Vorlage from the
* database and generates a PDF file with unoconv or docsbox.
* This file is then archivated in the database.
*
* The last part is the CodeIgniter version of content/pdfExport.php when not
* using the get paremeter: "archivdokument" but using the get parameter:
* "archive".
* Use archiveSigned() instead of providing the "sign" get parameter and
* archive() otherwise.
*/
class Documents extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'permissionAlternativeFormat' => self::PERM_LOGGED,
'archive' => ['admin:rw', 'assistenz:rw'],
'archiveSigned' => ['admin:rw', 'assistenz:rw']
]);
// Load Phrases
$this->loadPhrases([
'stv'
]);
}
/**
* Checks if the current user has permission to render documents in an
* alternative format.
*
* @param string $oe_kurzbz Or studiengang_kz
*
* @return void
*/
public function permissionAlternativeFormat($oe_kurzbz)
{
$this->terminateWithSuccess($this->permissionlib->isBerechtigt('system/change_outputformat', null, $oe_kurzbz));
}
/**
* Download a not signed document.
*
* @param string $xml (optional)
* @param string $xsl (optional)
*
* @return void
*/
public function archive($xml = null, $xsl = null)
{
return $this->_archive($xml, $xsl);
}
/**
* Download a signed document.
*
* @param string $xml (optional)
* @param string $xsl (optional)
*
* @return void
*/
public function archiveSigned($xml = null, $xsl = null)
{
return $this->_archive($xml, $xsl, getAuthUID());
}
/**
* Helper function for archive() and archiveSigned()
*
* @param string $xml
* @param string $xsl
* @param string $sign_user (optional)
*
* @return void
*/
public function _archive($xml, $xsl, $sign_user = null)
{
if (!$xml || !$xsl) {
$this->load->library('form_validation');
if (!$xml) {
$xml = $this->input->post_get('xml');
$this->form_validation->set_rules('xml', 'xml', 'required');
}
if (!$xsl) {
$xsl = $this->input->post_get('xsl');
$this->form_validation->set_rules('xsl', 'xsl', 'required');
}
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$xsl_oe_kurzbz = null;
$version = $this->input->post_get('version') ?: null;
// Get the OE or STG of the document
$xsl_oe_kurzbz = $this->input->post_get('xsl_oe_kurzbz')
?: $this->input->post_get('xsl_stg_kz')
?: $this->input->post_get('stg_kz');
if (is_null($xsl_oe_kurzbz)) {
$uid = $this->input->post_get('uid');
if ($uid) {
$uid = current(explode(';', $uid));
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load([$uid]);
if (!isError($result) && hasData($result))
$xsl_oe_kurzbz = current(getData($result))->studiengang_kz;
}
}
if (is_null($xsl_oe_kurzbz)) {
$prestudent_id = $this->input->post_get('prestudent_id');
if ($prestudent_id) {
$prestudent_id = current(explode(';', $prestudent_id));
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$result = $this->PrestudentModel->load($prestudent_id);
if (!isError($result) && hasData($result))
$xsl_oe_kurzbz = current(getData($result))->studiengang_kz;
}
}
if (is_null($xsl_oe_kurzbz))
$xsl_oe_kurzbz = 0;
// Vorlage
$this->load->model('system/Vorlage_model', 'VorlageModel');
$result = $this->VorlageModel->load($xsl);
$vorlage = current($this->getDataOrTerminateWithError($result));
if (!$vorlage)
show_404();
// Akte Data
$akteData = [
'dokument_kurzbz' => $vorlage->dokument_kurzbz ?: 'Zeugnis',
'mimetype' => 'application/pdf',
'erstelltam' => date('Y-m-d'),
'gedruckt' => true,
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
'uid' => $this->input->post_get('uid') ?: '',
'archiv' => true,
'signiert' => !!$sign_user,
'stud_selfservice' => $vorlage->stud_selfservice
];
$studiengang_kz = null;
if ($akteData['uid']) {
$this->load->model('crm/Student_model', 'StudentModel');
$this->StudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
$result = $this->StudentModel->load([$akteData['uid']]);
$student = current($this->getDataOrTerminateWithError($result));
$ss = $this->input->post_get('ss');
if ($ss !== null) {
$this->load->model('crm/prestudentstatus_model', 'PrestudentstatusModel');
$result = $this->PrestudentstatusModel->getLastStatus($student->prestudent_id, $ss);
$status = current($this->getDataOrTerminateWithError($result));
if (!$status)
$this->terminateWithError($this->p->t("stv", "grades_error_prestudentstatus"));
$semester = $status->ausbildungssemester;
$this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
$this->StudentlehrverbandModel->addJoin('public.tbl_benutzer', 'uid = student_uid');
$this->StudentlehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
$result = $this->StudentlehrverbandModel->load([
'studiensemester_kurzbz' => $ss,
'student_uid' => $akteData['uid']
]);
$res = current($this->getDataOrTerminateWithError($result));
$studiengang_kz = $res->studiengang_kz;
$akteData['person_id'] = $res->person_id;
switch ($xsl) {
case 'Ausbildungsver':
case 'AusbVerEng':
$akteData['titel'] = mb_substr($xsl .
"_" .
strtoupper($res->typ) .
strtoupper($res->kurzbz) .
"_" .
$semester .
"_" .
$ss, 0, 64);
$akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64);
break;
case 'LVZeugnisEng':
case 'LVZeugnis':
case 'Zertifikat':
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->load($this->input->post_get('lvid'));
$lv = current($this->getDataOrTerminateWithError($result));
$akteData['dokument_kurzbz'] = $xsl;
$akteData['titel'] = mb_substr($xsl .
"_" .
strtoupper($res->typ) .
strtoupper($res->kurzbz) .
"_" .
$semester .
'_' .
$ss .
'_' .
str_replace(' ', '_', $lv->bezeichnung), 0, 60);
$akteData['bezeichnung'] = mb_substr($xsl .
" " .
strtoupper($res->typ) .
strtoupper($res->kurzbz) .
" " .
$semester .
". Semester" .
' ' .
$ss .
' ' .
$lv->bezeichnung, 0, 64);
break;
case 'SZeugnis':
$akteData['titel'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64);
$akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64);
break;
default:
$akteData['titel'] = mb_substr($xsl .
"_" .
strtoupper($res->typ) .
strtoupper($res->kurzbz) .
"_" .
$semester .
"_" .
$ss, 0, 64);
$akteData['bezeichnung'] = mb_substr($xsl .
" " .
strtoupper($res->typ) .
strtoupper($res->kurzbz) .
" " .
$semester .
". Semester" .
' ' .
$ss, 0, 64);
break;
}
} else {
$studiengang_kz = $student->studiengang_kz;
$akteData['person_id'] = $student->person_id;
$akteData['titel'] = $vorlage->bezeichnung . '_' . $student->kuerzel;
$akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64);
}
} else {
$prestudent_id = $this->input->post_get('prestudent_id');
if ($prestudent_id) {
$this->load->model('crm/prestudent_model', 'PrestudentModel');
$this->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
$result = $this->PrestudentModel->load($prestudent_id);
$prestudent = current($this->getDataOrTerminateWithError($result));
$studiengang_kz = $prestudent->studiengang_kz;
$akteData['person_id'] = $prestudent->person_id;
$akteData['titel'] = mb_substr($xsl . "_" . $prestudent->kuerzel, 0, 64);
$akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $prestudent->kuerzel, 0, 64);
}
}
// Access rights
if (!$this->permissionlib->isBerechtigt('admin', 'suid', $studiengang_kz)
&& !$this->permissionlib->isBerechtigt('assistenz', 'suid', $studiengang_kz))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
if ($xsl == 'AccountInfo') {
$this->load->model('resource/Mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('crm/Student_model', 'StudentModel');
$uids = $this->input->post_get('uid');
if ($uids) {
$uids = explode(';', $uids);
foreach ($uids as $uid) {
$result = $this->MitarbeiterModel->load($uid);
if (!isError($result) && hasData($result)) {
if (!$this->permissionlib->isBerechtigt('admin', 'suid', 0)
&& !$this->permissionlib->isBerechtigt('mitarbeiter', 'suid', 0))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'mitarbeiter:rw']]);
} else {
$result = $this->StudentModel->load([$uid]);
if (!isError($result) && hasData($result)) {
$student = current(getData($result));
if (!$this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz)
&& !$this->permissionlib->isBerechtigt('admin', 'suid', 0)
&& !$this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz)
&& !$this->permissionlib->isBerechtigt('assistenz', 'suid', 0)
&& !$this->permissionlib->isBerechtigt('support', 'suid', 0))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw', 'support:rw']]);
}
}
}
}
} else {
$this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
$result = $this->VorlagestudiengangModel->getCurrent($xsl, $xsl_oe_kurzbz, $version);
$access_rights = current($this->getDataOrTerminateWithError($result));
if (!$access_rights || !$access_rights->berechtigung)
return show_404();
$allowed = false;
foreach ($access_rights->berechtigung as $access_right) {
if ($this->permissionlib->isBerechtigt($access_right)) {
$allowed = true;
break;
}
}
if (!$allowed)
return $this->_outputAuthError([$this->router->method => $access_rights]);
}
// Output format
$outputformat = $this->input->post_get('output') ?: 'pdf';
if ($outputformat != 'pdf'
// An der FHTW darf das Studienblatt und das Prüfungsprotokoll auch in anderen Formaten exportiert werden
&& !(CAMPUS_NAME == 'FH Technikum Wien'
&& ($xsl == 'Studienblatt'
|| $xsl == 'StudienblattEng'
|| $xsl == 'PrProtBA'
|| $xsl == 'PrProtBAEng'
|| $xsl == 'PrProtMA'
|| $xsl == 'PrProtMAEng'
)
)
&& !$this->permissionlib->isBerechtigt('system/change_outputformat', null, $xsl_oe_kurzbz)
) {
$outputformat = 'pdf';
}
// XML Params
$params = 'xmlformat=xml';
foreach ([
'uid',
'stg_kz',
'person_id',
'id',
'prestudent_id',
'buchungsnummern',
'ss',
'abschlusspruefung_id',
'typ',
'all',
'preoutgoing_id',
'lvid',
'projekt_kurzbz',
'von',
'bis',
'stundevon',
'stundebis',
'sem',
'lehreinheit',
'mitarbeiter_uid',
'studienordnung_id',
'fixangestellt',
'standort',
'abrechnungsmonat',
'form',
'projektarbeit_id',
'betreuerart_kurzbz',
'studiensemester_kurzbz'
] as $key) {
$value = $this->input->post_get($key);
if ($value !== null)
$params .= '&' . $key . '=' . urlencode($value);
}
$value = $this->input->post_get('vertrag_id');
if ($value !== null) {
foreach ($value as $id)
$params .= '&vertrag_id[]=' . urlencode($id);
}
if (!$vorlage->archivierbar)
$this->terminateWithError($this->p->t("stv", "grades_error_archive"));
if ($sign_user && !$vorlage->signierbar)
$this->terminateWithError($this->p->t("stv", "grades_error_sign"));
$this->load->library('DocumentExportLib');
// XML Data
$result = $this->documentexportlib->getDataURL($xml, $params);
$data = $this->getDataOrTerminateWithError($result);
$this->documentexportlib->addArchiveToData($data);
// Output
$result = $this->documentexportlib->getContent($vorlage, $data, $xsl_oe_kurzbz, $version, $outputformat, $sign_user);
$content = $this->getDataOrTerminateWithError($result);
$akteData['titel'] .= '.pdf';
$akteData['inhalt'] = base64_encode($content);
$this->load->model('crm/Akte_model', 'AkteModel');
$result = $this->AkteModel->insert($akteData);
$this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(true);
}
}
@@ -113,7 +113,7 @@ class Filter extends FHCAPI_Controller
*/
public function applyFilterFields()
{
$this->form_validation->set_rules('filterFields', 'filterFields', 'required');
$this->form_validation->set_rules('filterFields[]', 'filterFields', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
@@ -30,6 +30,7 @@ class Lehre extends FHCAPI_Controller
parent::__construct([
'lvStudentenMail' => self::PERM_LOGGED,
'LV' => self::PERM_LOGGED,
'Pruefungen' => self::PERM_LOGGED,
]);
@@ -76,6 +77,23 @@ class Lehre extends FHCAPI_Controller
$this->terminateWithSuccess($result);
}
/**
* fetches all Pruefungen of a student for a specific lehrveranstaltung
* if the student passed the Pruefung on the first attempt, no information about the Pruefungen is stored in the database
* @param mixed $lehrveranstaltung_id
* @return void
*/
public function Pruefungen($lehrveranstaltung_id)
{
$this->load->model('education/Pruefung_model', 'PruefungModel');
$result = $this->PruefungModel->getByStudentAndLv(getAuthUID(), $lehrveranstaltung_id, getUserLanguage());
$result = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($result);
}
@@ -58,6 +58,22 @@ class LvMenu extends FHCAPI_Controller
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* alternative function to get multiple lvMenus with a single http request
*/
public function getMultipleLvMenu($lvMenuOptionList){
$result =[];
foreach($lvMenuOptionList as $lvMenuOptions){
$lvMenu = $this->getLvMenu($lvMenuOptions['lvid'],$lvMenuOptions['studiensemester_kurzbz']);
if(isError($lvMenu)){
// TODO: some lvMenu threw an error, handle error here
}
$result[$lvMenuOptions['lvid']]=$lvMenu;
}
$this->terminateWithSuccess($result);
}
/**
*
*/
@@ -91,20 +107,24 @@ class LvMenu extends FHCAPI_Controller
$lvres = $this->Lehrveranstaltung_model->load($lvid);
if(!hasData($lvres))
{
$this->terminateWithError('LV ' . $lvid . ' not found.');
$this->terminateWithError('LV ' . $lvid . ' not found.');
}
$lv = (getData($lvres))[0];
$this->addMeta('lvInfo',$lv);
// define studiengang_kz / semester / lehrverzeichnis
$studiengang_kz = $lv->studiengang_kz;
$semester = $lv->semester;
$short = $lv->lehreverzeichnis;
// return empty menu for studiengang_kz = 0
if($studiengang_kz == 0){
$this->terminateWithSuccess("organisatorische_einheit");
}
// load studiengang
$stgres = $this->Studiengang_model->load($lv->studiengang_kz);
$stgres = $this->Studiengang_model->load(strval($studiengang_kz));
if(!hasData($stgres))
{
$this->terminateWithError('Stg ' . $lv->studiengang_kz . ' nof found.');
$this->terminateWithError('Stg ' . $lv->studiengang_kz . ' not found.');
}
$stg = (getData($stgres))[0];
$kurzbz = strtoupper($stg->typ . $stg->kurzbz);
@@ -284,24 +304,6 @@ class LvMenu extends FHCAPI_Controller
}
private function fhc_menu_digitale_anwesenheiten(&$menu, $angemeldet, $studiengang_kz, $semester, $lvid, $angezeigtes_stsem){
// DIGITALE ANWESENHEITEN
if (defined('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN') && CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN && $angemeldet) {
$menu[] = array
(
'id' => 'core_menu_digitale_anwesenheitslisten',
'position' => '50',
'name' => $this->p->t('lehre', 'digiAnw'),
'c4_icon' => base_url('skin/images/button_kreuzerltool.png'),
'c4_link' => base_url("index.ci.php/extensions/FHC-Core-Anwesenheiten/?stg_kz=$studiengang_kz&sem=$semester&lvid=$lvid&sem_kurzbz=$angezeigtes_stsem&nav=false"),
'c4_linkList' => []
);
}
}
private function fhc_menu_lvinfo(&$menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr){
// LVINFO
@@ -73,11 +73,22 @@ class Phrasen extends FHCAPI_Controller
// gets all languages that are set as active in the database
public function getAllLanguages()
{
$langs = getDBActiveLanguages();
$this->load->model('system/Sprache_model', 'SprachenModel');
// Add order clause by index and select the sprache,bezeichnung and index column
$this->SprachenModel->addOrder('index');
$this->SprachenModel->addSelect('sprache, bezeichnung, index');
// Retrieves from public.tbl_sprache
$langs = $this->SprachenModel->loadWhere(array('content' => true));
$langs = $this->getDataOrTerminateWithError($langs);
$langs = array_map(function($lang){
return $lang->sprache;
$data = new stdClass();
$data->sprache = $lang->sprache;
$data->bezeichnung = $lang->bezeichnung[($lang->index-1)];
return $data;
}, $langs);
$this->terminateWithSuccess($langs);
}
@@ -499,7 +499,7 @@ class Profil extends FHCAPI_Controller
/** @param integer $geburtsInfo */
if ($geburtsInfo) {
array_push($selectClause, "gebort");
array_push($selectClause, "gebdatum");
array_push($selectClause, "TO_CHAR(gebdatum, 'DD.MM.YYYY') as gebdatum");
}
$this->BenutzerModel->addSelect($selectClause);
$this->BenutzerModel->addJoin("tbl_person", "person_id");
@@ -567,7 +567,7 @@ class Profil extends FHCAPI_Controller
*/
private function getStudentInfo($uid)
{
$this->StudentModel->addSelect(['tbl_studiengang.bezeichnung as studiengang', 'tbl_student.semester', 'tbl_student.verband', 'tbl_student.gruppe', 'tbl_student.matrikelnr as personenkennzeichen']);
$this->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->StudentModel->addJoin('tbl_studiengang', "tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz");
$student_res = $this->StudentModel->load([$uid]);
@@ -0,0 +1,65 @@
<?php
/**
* Copyright (C) 2024 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 Studgang extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
parent::__construct([
'getStudiengangInfo'=> self::PERM_LOGGED,
]);
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
// Loads phrases system
$this->loadPhrases([
'global'
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
public function getStudiengangInfo(){
$isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID());
$isMitarbeiter = $this->getDataOrTerminateWithError($isMitarbeiter);
if($isMitarbeiter) {
$this->terminateWithSuccess(null);
}
// fetches the Studiengang Information which is used next to the news
$studiengangInfo = $this->StudiengangModel->getStudiengangInfoForNews();
$studiengangInfo= $this->getDataOrTerminateWithError($studiengangInfo);
$this->terminateWithSuccess($studiengangInfo);
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
}
@@ -33,6 +33,7 @@ class Stundenplan extends FHCAPI_Controller
'Reservierungen' => self::PERM_LOGGED,
'getStundenplan' => self::PERM_LOGGED,
'getLehreinheitStudiensemester' => self::PERM_LOGGED,
'studiensemesterDateInterval' => self::PERM_LOGGED,
]);
$this->load->library('LogLib');
@@ -56,6 +57,15 @@ class Stundenplan extends FHCAPI_Controller
//------------------------------------------------------------------------------------------------------------------
// Public methods
//TODO: delete this function if we don't use the old calendar export endpoints anymore
public function studiensemesterDateInterval($date){
$this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
$studiensemester =$this->StudiensemesterModel->getByDate(date_format(date_create($date),'Y-m-d'));
$studiensemester =current($this->getDataOrTerminateWithError($studiensemester));
$this->terminateWithSuccess($studiensemester);
}
/**
* fetches Stunden layout from database
* @access public
@@ -107,7 +117,7 @@ class Stundenplan extends FHCAPI_Controller
* @access public
*
*/
//TODO: getStundenplan fuer Mitarbeiter anpassen
public function getStundenplan(){
$this->load->model('ressource/Mitarbeiter_model','MitarbeiterModel');
@@ -126,42 +136,63 @@ class Stundenplan extends FHCAPI_Controller
// storing the get parameter in local variables
$start_date = $this->input->get('start_date', TRUE);
$end_date = $this->input->get('end_date', TRUE);
$lv_id = $this->input->get('lv_id', TRUE);
$student_uid = getAuthUID();
if(is_null($student_uid))
{
$this->terminateWithError("No UID");
}
$semester_range = $this->studienSemesterErmitteln($start_date,$end_date);
$this->sortStudienSemester($semester_range);
$this->applyLoadUeberSemesterHaelfte($semester_range);
if($lv_id) { // fetch Stundenplan for lva, irrelevant of who is requesting it (for now)
$stundenplan_data = $this->StundenplanModel->getStundenplanLVA($start_date, $end_date, $lv_id);
$stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? [];
$this->expand_object_information($stundenplan_data);
// query lv itself in case its Stundenplan is being queried and it has no entries
$this->load->model('education/Lehrveranstaltung_model','LehrveranstaltungModel');
$lv = getData($this->LehrveranstaltungModel->load($lv_id))[0];
$this->addMeta('lv', $lv);
$this->terminateWithSuccess($stundenplan_data);
}
$is_mitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter($student_uid));
if($is_mitarbeiter)
{
$this->terminateWithError("Not possible to look at the Student Calendar as a Mitarbeiter");
$stundenplan_data = $this->StundenplanModel->getStundenplanMitarbeiter($start_date, $end_date, $student_uid);
$stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? [];
$this->expand_object_information($stundenplan_data);
$this->terminateWithSuccess($stundenplan_data);
} else {
// getting the gruppen_kurzbz of the student in the different studiensemester
$benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($semester_range);
// getting the student_lehrverbaende of the student in the different studiensemester
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($semester_range);
$stundenplan_query = $this->StundenplanModel->getStundenplanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband);
if(!$stundenplan_query)
{
$this->terminateWithSuccess([]);
}
$stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($stundenplan_query);
$stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? [];
$this->expand_object_information($stundenplan_data);
$this->returnObj['$stundenplan_query'] = $stundenplan_query;
$this->returnObj['$student_lehrverband'] = $student_lehrverband;
$this->returnObj['$benutzer_gruppen'] = $benutzer_gruppen;
$this->terminateWithSuccess($stundenplan_data);
}
$semester_range = $this->studienSemesterErmitteln($start_date,$end_date);
$this->sortStudienSemester($semester_range);
$this->applyLoadUeberSemesterHaelfte($semester_range);
// getting the gruppen_kurzbz of the student in the different studiensemester
$benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($semester_range);
// getting the student_lehrverbaende of the student in the different studiensemester
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($semester_range);
$stundenplan_query = $this->StundenplanModel->getStundenplanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband);
if(!$stundenplan_query)
{
$this->terminateWithSuccess([]);
}
$stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($stundenplan_query);
$stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? [];
$this->expand_object_information($stundenplan_data);
$this->terminateWithSuccess($stundenplan_data);
}
// gets the reservierungen of a room if the ort_kurzbz parameter is supplied otherwise gets the reservierungen of the stundenplan of a student
@@ -174,19 +205,25 @@ class Stundenplan extends FHCAPI_Controller
$this->form_validation->set_rules('end_date', "EndDate", "required");
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
// storing the get parameter in local variables
$this->load->model('ressource/Mitarbeiter_model','MitarbeiterModel');
// storing the get parameter in local variables
$start_date = $this->input->get('start_date', TRUE);
$end_date = $this->input->get('end_date', TRUE);
// querying the reservierungen
$reservierungen = $this->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz);
$reservierungen = $this->getDataOrTerminateWithError($reservierungen) ?? [];
$is_mitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter(getAuthUID()));
if($is_mitarbeiter)
{
$reservierungen = $this->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz);
} else {
// querying the reservierungen
$reservierungen = $this->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz);
}
$reservierungen = $this->getDataOrTerminateWithError($reservierungen) ?? [];
$this->expand_object_information($reservierungen);
$this->terminateWithSuccess($reservierungen);
}
public function getLehreinheitStudiensemester($lehreinheit_id){
@@ -246,6 +283,23 @@ class Stundenplan extends FHCAPI_Controller
$gruppe_obj_array[] = $lv_gruppe_object;
}
if($item->ort_kurzbz) {
$ort_content_object = $this->StundenplanModel->execReadOnlyQuery("
SELECT content_id
FROM public.tbl_ort
WHERE ort_kurzbz = ?", [$item->ort_kurzbz]);
if (isError($ort_content_object)) {
$this->show_error(getError($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;
@@ -536,7 +590,7 @@ class Stundenplan extends FHCAPI_Controller
private function studienSemesterErmitteln($start_date,$end_date){
// gets all studiensemester from the student from start_date to end_date
$semester_range = $this->StudiensemesterModel->getByDate($start_date,$end_date);
$semester_range = $this->StudiensemesterModel->getByDateRange($start_date,$end_date);
$semester_range = array_map(
function($sem)
{
@@ -342,7 +342,7 @@ class BetriebsmittelP extends FHCAPI_Controller
$this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess(current(getData($result)));
return $this->terminateWithSuccess(current(getData($result)));
}
public function deleteBetriebsmittel($betriebsmittelperson_id)
@@ -358,7 +358,7 @@ class BetriebsmittelP extends FHCAPI_Controller
if (!hasData($result)) {
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL);
}
return $this->outputJsonSuccess(current(getData($result)));
$this->terminateWithSuccess(current(getData($result)));
}
public function getTypenBetriebsmittel()
@@ -0,0 +1,57 @@
<?php
/**
* FH-Complete
*
* @package FHC-API
* @author FHC-Team
* @copyright Copyright (c) 2016, fhcomplete.org
* @license GPLv3
* @link http://fhcomplete.org
* @since Version 1.0
* @filesource
*/
// ------------------------------------------------------------------------
if (!defined('BASEPATH')) exit('No direct script access allowed');
class StudiengangEP extends FHCAPI_Controller
{
/**
* StudiengangEP API constructor.
*/
public function __construct()
{
parent::__construct(
array(
'getStudiengangByKz' => self::PERM_LOGGED
)
);
// Load model StudiengangModel
$this->load->model('organisation/studiengang_model', 'StudiengangModel');
}
/**
* @return void
*/
public function getStudiengangByKz()
{
$studiengang_kz = intval($this->input->get('studiengang_kz'));
$this->StudiengangModel->addSelect('studiengang_kz, kurzbz, kurzbzlang, '
. 'typ, bezeichnung, english, aktiv, orgform_kurzbz, sprache, '
. 'oe_kurzbz');
$result = $this->StudiengangModel->load($studiengang_kz);
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
}
$stg = null;
if(hasData($result))
{
$stg = (getData($result))[0];
}
$this->terminateWithSuccess($stg);
}
}
@@ -0,0 +1,80 @@
<?php
/**
* FH-Complete
*
* @package FHC-API
* @author FHC-Team
* @copyright Copyright (c) 2016, fhcomplete.org
* @license GPLv3
* @link http://fhcomplete.org
* @since Version 1.0
* @filesource
*/
// ------------------------------------------------------------------------
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Studienjahr extends FHCAPI_Controller
{
/**
* Studienjahr API constructor.
*/
public function __construct()
{
parent::__construct(
array(
'getAll' => self::PERM_LOGGED,
'getNext' => self::PERM_LOGGED
)
);
// Load model StudiensemesterModel
$this->load->model('organisation/studienjahr_model', 'StudienjahrModel');
}
/**
* Get all Studienjahre.
*
* @param null|string $order Sorting order for the Studienjahr, 'asc' or 'desc'. Defaults to 'asc'.
* @param null|string $start Starting Studienjahre with given studienjahr_kurzbz
*/
public function getAll()
{
$order = $this->input->get('order');
$start = $this->input->get('studienjahr_kurzbz');
if (strcasecmp($order, 'DESC') == 0) {
$this->StudienjahrModel->addOrder('studienjahr_kurzbz', 'DESC');
} else {
$this->StudienjahrModel->addOrder('studienjahr_kurzbz', 'ASC');
}
if ($start) {
$result = $this->StudienjahrModel->loadWhere([
'studienjahr_kurzbz >= ' => $start
]);
} else {
$result = $this->StudienjahrModel->load();
}
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
}
$this->terminateWithSuccess((getData($result) ?: []));
}
public function getNext()
{
$this->StudienjahrModel->addJoin('public.tbl_studiensemester', 'studienjahr_kurzbz');
$this->StudienjahrModel->addOrder('start');
$this->StudienjahrModel->addLimit(1);
$result = $this->StudienjahrModel->loadWhere(['start >' => 'NOW()']);
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
}
$this->terminateWithSuccess(current(getData($result)));
}
}
@@ -24,7 +24,8 @@ class Studiensemester extends FHCAPI_Controller
parent::__construct(
array(
'getAll' => self::PERM_LOGGED,
'getAktNext' => self::PERM_LOGGED
'getAktNext' => self::PERM_LOGGED,
'getStudienjahrByStudiensemester' => self::PERM_LOGGED
)
);
// Load model StudiensemesterModel
@@ -115,4 +116,40 @@ class Studiensemester extends FHCAPI_Controller
$this->terminateWithSuccess((getData($result) ?: ''));
}
/**
* Get Studienjahr by Studiensemester.
* input param semester: studiensemester_kurzbz
*/
public function getStudienjahrByStudiensemester()
{
$semester = $this->input->get('semester');
$studienjahrObj = null;
if (!is_numeric($semester))
{
$this->StudiensemesterModel->addSelect('studienjahr_kurzbz');
$result = $this->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz =' => $semester));
}
if (hasData($result))
{
$studienjahr = getData($result)[0]->studienjahr_kurzbz;
$startstudienjahr = substr($studienjahr, 0, 4);
$endstudienjahr = substr($studienjahr, 0, 2) . substr($studienjahr, -2);
$studienjahrObj = new StdClass();
$studienjahrObj->studienjahr_kurzbz = $studienjahr;
$studienjahrObj->startstudienjahr = $startstudienjahr;
$studienjahrObj->endstudienjahr= $endstudienjahr;
}
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
}
$this->terminateWithSuccess((getData(success($studienjahrObj))));
}
}
@@ -0,0 +1,420 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Abschlusspruefung extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getAbschlusspruefung' => ['admin:r', 'assistenz:r'],
'loadAbschlusspruefung' => ['admin:r', 'assistenz:r'],
'insertAbschlusspruefung' => ['admin:rw', 'assistenz:rw'],
'updateAbschlusspruefung' => ['admin:rw', 'assistenz:rw'],
'deleteAbschlusspruefung' => ['admin:rw', 'assistenz:rw'],
'getTypenAbschlusspruefung' => ['admin:rw', 'assistenz:rw'],
'getNoten' => ['admin:rw', 'assistenz:rw'],
'getTypenAntritte' => ['admin:rw', 'assistenz:rw'],
'getBeurteilungen' => ['admin:rw', 'assistenz:rw'],
'getAkadGrade' => ['admin:rw', 'assistenz:rw'],
'getMitarbeiter' => ['admin:rw', 'assistenz:rw'],
'getPruefer' => ['admin:rw', 'assistenz:rw'],
'getTypStudiengang' => ['admin:rw', 'assistenz:rw'],
'checkForExistingExams' => ['admin:rw', 'assistenz:rw'],
]);
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$this->load->library('form_validation');
// Load language phrases
$this->loadPhrases([
'ui',
'person',
'abschlusspruefung'
]);
// Load models
$this->load->model('education/Abschlusspruefung_model', 'AbschlusspruefungModel');
}
public function getAbschlusspruefung($student_uid)
{
$result = $this->AbschlusspruefungModel->getAbschlusspruefungForPrestudent($student_uid);
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess((getData($result) ?: []));
}
public function loadAbschlusspruefung()
{
$abschlusspruefung_id = $this->input->post('id');
$this->AbschlusspruefungModel->addSelect('lehre.tbl_abschlusspruefung.*');
$this->AbschlusspruefungModel->addSelect("
CASE
WHEN pruefer1 IS NOT NULL
THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, ''))
ELSE NULL
END AS p1
");
$this->AbschlusspruefungModel->addSelect("
CASE
WHEN pruefer2 IS NOT NULL
THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, ''))
ELSE NULL
END AS p2
");
$this->AbschlusspruefungModel->addSelect("
CASE
WHEN pruefer3 IS NOT NULL
THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, ''))
ELSE NULL
END AS p3
");
$this->AbschlusspruefungModel->addSelect("
CASE
WHEN vorsitz IS NOT NULL
THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' )
ELSE NULL
END AS pv
");
$this->AbschlusspruefungModel->addJoin('public.tbl_benutzer ben', 'ON (ben.uid = lehre.tbl_abschlusspruefung.vorsitz)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person pv', 'ON (pv.person_id = ben.person_id)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person p1', 'ON (p1.person_id = lehre.tbl_abschlusspruefung.pruefer1)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person p2', 'ON (p2.person_id = lehre.tbl_abschlusspruefung.pruefer2)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person p3', 'ON (p3.person_id = lehre.tbl_abschlusspruefung.pruefer3)', 'LEFT');
$result = $this->AbschlusspruefungModel->loadWhere(
array('abschlusspruefung_id' => $abschlusspruefung_id)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
public function getTypenAbschlusspruefung()
{
$this->load->model('education/Pruefungstyp_model', 'PruefungstypModel');
$result = $this->PruefungstypModel->loadWhere(
array('abschluss' => true)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getTypenAntritte()
{
$this->load->model('education/Pruefungsantritt_model', 'PruefungsantrittModel');
$result = $this->PruefungsantrittModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getBeurteilungen()
{
$this->load->model('education/Abschlussbeurteilung_model', 'AbschlussbeurteilungModel');
$result = $this->AbschlussbeurteilungModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getAkadGrade()
{
$studiengang_kz= $this->input->post('studiengang_kz');
$this->load->model('education/Akadgrad_model', 'AkadgradModel');
$result = $this->AkadgradModel->loadWhere(
array('studiengang_kz' => $studiengang_kz)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getTypStudiengang()
{
$studiengang_kz= $this->input->post('studiengang_kz');
/* if (!$studiengang_kzs || !is_array($studiengang_kzs)) {
$this->load->library('form_validation');
$this->form_validation->set_rules('studiengang_kzs', '', 'required|is_null', [
'is_null' => $this->p->t('ui', 'error_fieldMustBeArray')
]);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
}*/
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$result = $this->StudiengangModel->loadWhere(
array('studiengang_kz' => $studiengang_kz)
);
$data = $this->getDataOrTerminateWithError($result);
$typStudiengang = current($data)->typ;
$this->terminateWithSuccess($typStudiengang);
}
public function getMitarbeiter($searchString)
{
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'mitAkadGrad');
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess($result ?: []);
}
public function getPruefer($searchString)
{
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid');
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess($result ?: []);
}
public function getNoten()
{
$this->load->model('education/Note_model', 'NoteModel');
$this->NoteModel->addOrder('note', 'ASC');
$result = $this->NoteModel->load();
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess(getData($result) ?: []);
}
public function insertAbschlusspruefung()
{
$this->load->library('form_validation');
$student_uid = $this->input->post('uid');
if(!$student_uid)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
}
$formData = $this->input->post('formData');
$_POST['pruefungstyp_kurzbz'] = $formData['pruefungstyp_kurzbz'];
$_POST['akadgrad_id']= $formData['akadgrad_id'];
$_POST['vorsitz'] = isset($formData['vorsitz']['mitarbeiter_uid']) ? $formData['vorsitz']['mitarbeiter_uid'] : $formData['vorsitz'];
$_POST['pruefer1'] = isset($formData['pruefer1']['person_id']) ? $formData['pruefer1']['person_id'] : $formData['pruefer1'];
$_POST['pruefer2'] = isset($formData['pruefer2']['person_id']) ? $formData['pruefer2']['person_id'] : $formData['pruefer2'];
$_POST['pruefer3'] = isset($formData['pruefer3']['person_id']) ? $formData['pruefer3']['person_id'] : $formData['pruefer3'];
$_POST['pruefungsantritt_kurzbz'] = $formData['pruefungsantritt_kurzbz'];
$_POST['abschlussbeurteilung_kurzbz'] = $formData['abschlussbeurteilung_kurzbz'];
$_POST['datum']= $formData['datum'];
$_POST['sponsion']= $formData['sponsion'];
$_POST['anmerkung'] = $formData['anmerkung'];
$_POST['protokoll']= $formData['protokoll'];
$_POST['note'] = $formData['note'];
$this->form_validation->set_rules('pruefungstyp_kurzbz', 'Typ', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ'])
]);
$this->form_validation->set_rules('akadgrad_id', 'AkadGrad', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'AkadGrad'])
]);
$this->form_validation->set_rules('datum', 'Datum', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Datum'])
]);
$this->form_validation->set_rules('sponsion', 'Sponsion', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Sponsion'])
]);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$result = $this->AbschlusspruefungModel->insert([
'student_uid' => $student_uid,
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
'akadgrad_id' => $this->input->post('akadgrad_id'),
'vorsitz' => $this->input->post('vorsitz'),
'pruefungsantritt_kurzbz' => $this->input->post('pruefungsantritt_kurzbz'),
'abschlussbeurteilung_kurzbz' => $this->input->post('abschlussbeurteilung_kurzbz'),
'datum' => $this->input->post('datum'), //TODO(Manu) check if minute format like FAS
'sponsion' => $this->input->post('sponsion'),
'pruefer1' => $this->input->post('pruefer1'),
'pruefer2' => $this->input->post('pruefer2'),
'pruefer3' => $this->input->post('pruefer3'),
'protokoll' => $this->input->post('protokoll'),
'note' => $this->input->post('note'),
'anmerkung' => $this->input->post('anmerkung'),
'insertamum' => date('c'),
'insertvon' => getAuthUID()
]);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function updateAbschlusspruefung()
{
$this->load->library('form_validation');
$abschlusspruefung_id = $this->input->post('id');
if(!$abschlusspruefung_id)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Abschlussprüfung ID']), self::ERROR_TYPE_GENERAL);
}
$formData = $this->input->post('formData');
$_POST['student_uid'] = $formData['student_uid'];
$_POST['pruefungstyp_kurzbz'] = $formData['pruefungstyp_kurzbz'];
$_POST['akadgrad_id']= $formData['akadgrad_id'];
$_POST['vorsitz'] = isset($formData['vorsitz']['mitarbeiter_uid']) ? $formData['vorsitz']['mitarbeiter_uid'] : $formData['vorsitz'];
$_POST['pruefer1'] = isset($formData['pruefer1']['person_id']) ? $formData['pruefer1']['person_id'] : $formData['pruefer1'];
$_POST['pruefer2'] = isset($formData['pruefer2']['person_id']) ? $formData['pruefer2']['person_id'] : $formData['pruefer2'];
$_POST['pruefer3'] = isset($formData['pruefer3']['person_id']) ? $formData['pruefer3']['person_id'] : $formData['pruefer3'];
$_POST['pruefungsantritt_kurzbz'] = $formData['pruefungsantritt_kurzbz'];
$_POST['abschlussbeurteilung_kurzbz'] = $formData['abschlussbeurteilung_kurzbz'];
$_POST['datum']= $formData['datum'];
$_POST['sponsion']= $formData['sponsion'];
$_POST['anmerkung'] = $formData['anmerkung'];
$_POST['protokoll']= $formData['protokoll'];
$_POST['note'] = $formData['note'];
$this->form_validation->set_rules('pruefungstyp_kurzbz', 'Typ', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ'])
]);
$this->form_validation->set_rules('akadgrad_id', 'AkadGrad', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'AkadGrad'])
]);
$this->form_validation->set_rules('datum', 'Datum', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Datum'])
]);
$this->form_validation->set_rules('sponsion', 'Sponsion', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Sponsion'])
]);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$result = $this->AbschlusspruefungModel->update(
[
'abschlusspruefung_id' => $abschlusspruefung_id
],
[
'student_uid' => $this->input->post('student_uid'),
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
'akadgrad_id' => $this->input->post('akadgrad_id'),
'vorsitz' => $this->input->post('vorsitz'),
'pruefungsantritt_kurzbz' => $this->input->post('pruefungsantritt_kurzbz'),
'abschlussbeurteilung_kurzbz' => $this->input->post('abschlussbeurteilung_kurzbz'),
'datum' => $this->input->post('datum'),
'sponsion' => $this->input->post('sponsion'),
'pruefer1' => $this->input->post('pruefer1'),
'pruefer2' => $this->input->post('pruefer2'),
'pruefer3' => $this->input->post('pruefer3'),
'protokoll' => $this->input->post('protokoll'),
'note' => $this->input->post('note'),
'anmerkung' => $this->input->post('anmerkung'),
'insertamum' => date('c'),
'insertvon' => getAuthUID()
]
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function deleteAbschlusspruefung()
{
$abschlusspruefung_id = $this->input->post('id');
$result = $this->AbschlusspruefungModel->delete(
array('abschlusspruefung_id' => $abschlusspruefung_id)
);
if (isError($result))
{
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if (!hasData($result))
{
$this->outputJson($result);
}
return $this->terminateWithSuccess(current(getData($result)) ? : null);
}
public function checkForExistingExams()
{
$warning = false;
$output = [];
$student_uids = $this->input->post('uids');
if (empty($student_uids)) {
throw new InvalidArgumentException("Keine UID(s) übergeben.");
}
if( !is_array($student_uids) )
{
$student_uids = array($student_uids);
}
foreach ($student_uids as $uid)
{
$result = $this->AbschlusspruefungModel->loadWhere(
array('student_uid' => $uid)
);
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
if (!hasData($result))
{
$warning = true;
$output[] = $uid;
}
}
if($warning)
{
$uids = is_array($output) ? implode(", ", $output) : $output;
return $this->terminateWithError($this->p->t('abschlusspruefung', 'error_studentOhneFinalExam', ['id'=> $uids]), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess('step3');
}
}
@@ -45,7 +45,7 @@ class Address extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
public function getPlaces($plz)
public function getPlaces($plz = null)
{
$this->load->model('codex/Gemeinde_model', 'GemeindeModel');
@@ -53,7 +53,7 @@ class Address extends FHCAPI_Controller
$this->form_validation->set_data(['address.plz' => $plz]);
$this->form_validation->set_rules('address.plz', 'PLZ', 'numeric|less_than[10000]');
$this->form_validation->set_rules('address.plz', 'PLZ', 'required|numeric|less_than[10000]');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
@@ -44,16 +44,23 @@ class Config extends FHCAPI_Controller
'person',
'lehre',
'stv',
'konto'
'konto',
'abschlusspruefung'
]);
// Load Config
$this->load->config('stv');
}
public function student()
{
$result = [];
$config = $this->config->item('tabs');
$result['details'] = [
'title' => $this->p->t('stv', 'tab_details'),
'component' => './Stv/Studentenverwaltung/Details/Details.js'
'component' => './Stv/Studentenverwaltung/Details/Details.js',
'config' => $config['details']
];
$result['notes'] = [
'title' => $this->p->t('stv', 'tab_notes'),
@@ -69,7 +76,8 @@ class Config extends FHCAPI_Controller
];
$result['prestudent'] = [
'title' => $this->p->t('stv', 'tab_prestudent'),
'component' => './Stv/Studentenverwaltung/Details/Prestudent.js'
'component' => './Stv/Studentenverwaltung/Details/Prestudent.js',
'config' => $config['prestudent']
];
$result['status'] = [
'title' => 'Status',
@@ -95,12 +103,35 @@ class Config extends FHCAPI_Controller
'title' => $this->p->t('stv', 'tab_messages'),
'component' => './Stv/Studentenverwaltung/Details/Messages.js'
];
/* TODO(chris): Ausgeblendet für Testing
$result['grades'] = [
'title' => $this->p->t('stv', 'tab_grades'),
'component' => './Stv/Studentenverwaltung/Details/Noten.js'
'component' => './Stv/Studentenverwaltung/Details/Noten.js',
'showOnlyWithUid' => true,
'config' => [
'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE,
'edit' => 'both', // Possible values: both|header|inline
'delete' => 'both', // Possible values: both|header|inline
'documents' => 'both', // Possible values: both|header|inline
'documentslist' => $this->gradesDocumentsList()
]
];
$result['exam'] = [
'title' => $this->p->t('stv', 'tab_exam'),
'component' => './Stv/Studentenverwaltung/Details/Pruefung.js'
];
$result['finalexam'] = [
'title' => $this->p->t('stv', 'tab_finalexam'),
'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js',
'config' => $config['finalexam']
];
$result['mobility'] = [
'title' => $this->p->t('stv', 'tab_mobility'),
'component' => './Stv/Studentenverwaltung/Details/Mobility.js'
];
*/
Events::trigger('stv_conf_student', function & () use (&$result) {
return $result;
@@ -112,6 +143,7 @@ class Config extends FHCAPI_Controller
public function students()
{
$result = [];
$config = $this->config->item('tabs');
$result['banking'] = [
'title' => $this->p->t('stv', 'tab_banking'),
'component' => './Stv/Studentenverwaltung/Details/Konto.js',
@@ -135,6 +167,11 @@ class Config extends FHCAPI_Controller
'changeStatusToAbsolvent' => $this->permissionlib->isBerechtigt('admin')
]
];
$result['finalexam'] = [
'title' => $this->p->t('stv', 'tab_finalexam'),
'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js',
'config' => $config['finalexam']
];
Events::trigger('stv_conf_students', function & () use (&$result) {
return $result;
@@ -234,4 +271,186 @@ class Config extends FHCAPI_Controller
]
] + $this->kontoColumns();
}
/**
* Helper function to generate the default documentslist config for the
* grades tab.
*
* The resulting array consists of elements which are associative arrays
* that can have the following entries:
* title (required) on the first level this can be HTML code.
* permissioncheck (optional) an URL to an FHCAPI endpoint which returns
* true or false.
* link (optional) an URL that will be called if "action" and
* "children" are not defined.
* action (optional) an associative array that describes an
* POST action that will be called if "children" is
* not defined.
* It can have the following entries:
* - url (required) an URL to an FHCAPI endpoint.
* - post (optional) an associative array with the POST data to
* be sent.
* - response (optional) a string that will be displayed on success.
* children (optional) an array of child elements
*
* All strings that start with { and end with } in the URLs and the
* actions post parameter will be replaced with the corresponding
* attribute of the current dataset (e.G: {uid} will be replaced with the
* uid of the current dataset)
*
* @return array
*/
protected function gradesDocumentsList()
{
$permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}");
$title_ger = $this->p->t("global", "deutsch");
$title_eng = $this->p->t("global", "englisch");
$title_ff = $this->p->t("stv", "document_certificate");
$title_lv = $this->p->t("stv", "document_coursecertificate");
$link_ff = "documents/export/" .
"zertifikat.rdf.php/" .
"Zertifikat" .
"?stg_kz={studiengang_kz_lv}" .
"&uid={uid}" .
"&ss={studiensemester_kurzbz}" .
"&lvid={lehrveranstaltung_id}";
$link_lv_ger = "documents/export/" .
"lehrveranstaltungszeugnis.rdf.php/" .
"LVZeugnis" .
"?stg_kz={studiengang_kz}" .
"&uid={uid}" .
"&ss={studiensemester_kurzbz}" .
"&lvid={lehrveranstaltung_id}";
$link_lv_eng = "documents/export/" .
"lehrveranstaltungszeugnis.rdf.php/" .
"LVZeugnisEng" .
"?stg_kz={studiengang_kz}" .
"&uid={uid}" .
"&ss={studiensemester_kurzbz}" .
"&lvid={lehrveranstaltung_id}";
$archive_url = "api/frontend/v1/documents/archiveSigned";
$archive_response = $this->p->t("stv", "document_signed_and_archived");
$archive_post_ff = [
"xml" => "zertifikat.rdf.php",
"xsl" => "Zertifikat",
"stg_kz" => "{studiengang_kz_lv}",
"uid" => "{uid}",
"ss" => "{studiensemester_kurzbz}",
"lvid" => "{lehrveranstaltung_id}"
];
$archive_post_lv_ger = [
"xml" => "lehrveranstaltungszeugnis.rdf.php",
"xsl" => "LVZeugnis",
"stg_kz" => "{studiengang_kz}",
"uid" => "{uid}",
"ss" => "{studiensemester_kurzbz}",
"lvid" => "{lehrveranstaltung_id}"
];
$archive_post_lv_eng = [
"xml" => "lehrveranstaltungszeugnis.rdf.php",
"xsl" => "LVZeugnisEng",
"stg_kz" => "{studiengang_kz}",
"uid" => "{uid}",
"ss" => "{studiensemester_kurzbz}",
"lvid" => "{lehrveranstaltung_id}"
];
$list = [
[
'title' => '<i class="fa fa-download" title="' . $this->p->t("stv", "document_download") . '"></i>',
'children' => [
[
'title' => $title_ff,
'link' => site_url($link_ff)
],
[
'title' => $title_lv,
'children' => [
[
'title' => $title_ger,
'link' => site_url($link_lv_ger),
'children' => [
[
'title' => 'PDF',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_ger)
],
[
'title' => 'DOC',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_ger . "&output=doc")
],
[
'title' => 'ODT',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_ger . "&output=odt")
]
]
],
[
'title' => $title_eng,
'link' => site_url($link_lv_eng),
'children' => [
[
'title' => 'PDF',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_eng)
],
[
'title' => 'DOC',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_eng . "&output=doc")
],
[
'title' => 'ODT',
'permissioncheck' => $permissioncheck,
'link' => site_url($link_lv_eng . "&output=odt")
]
]
]
]
]
]
],
[
'title' => '<i class="fas fa-archive" title="' . $this->p->t("stv", "document_archive") . '"></i>',
'children' => [
[
'title' => $title_ff,
'action' => [
'url' => site_url($archive_url),
'post' => $archive_post_ff,
'response' => $archive_response
]
],
[
'title' => $title_lv,
'children' => [
[
'title' => $title_ger,
'action' => [
'url' => site_url($archive_url),
'post' => $archive_post_lv_ger,
'response' => $archive_response
]
],
[
'title' => $title_eng,
'action' => [
'url' => site_url($archive_url),
'post' => $archive_post_lv_eng,
'response' => $archive_response
]
]
]
]
]
]
];
return $list;
}
}
@@ -0,0 +1,685 @@
<?php
/**
* Copyright (C) 2024 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');
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about grades
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Grades extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'list' => 'student/noten:r',
'getCertificate' => 'student/noten:r',
'getTeacherProposal' => 'student/noten:r',
'getRepeaterGrades' => 'student/noten:r',
'updateCertificate' => ['admin:w', 'assistenz:w'],
'deleteCertificate' => ['admin:w', 'assistenz:w'],
'copyTeacherProposalToCertificate' => 'student/noten:w',
'copyRepeaterGradeToCertificate' => 'student/noten:w',
'getGradeFromPoints' => 'student/noten:r'
]);
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
// Load Phrases
$this->loadPhrases([
'stv',
'person',
'lehre'
]);
}
/**
* List all possible grades
* (Entries in lehre.tbl_note)
*
* @return void
*/
public function list()
{
$this->load->model('codex/Note_model', 'NoteModel');
$this->NoteModel->addOrder('note');
$result = $this->NoteModel->load();
$grades = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($grades);
}
/**
* List grades for the certificate of a prestudent.
* (Entries in lehre.tbl_zeugnisnote)
*
* @param string $prestudent_id
* @param string|null $all (optional) If null only the current semesters grades will be loaded, otherwise all semesters grades will be loaded.
*
* @return void
*/
public function getCertificate($prestudent_id, $all = null)
{
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$result = $this->StudentModel->loadWhere([
'prestudent_id' => $prestudent_id
]);
$student = $this->getDataOrTerminateWithError($result);
if (!$student)
$this->terminateWithSuccess([]);
$student_uid = current($student)->student_uid;
$studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : null;
$result = $this->ZeugnisnoteModel->getZeugnisnoten($student_uid, $studiensemester_kurzbz);
$grades = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($grades);
}
/**
* List grades of a prestudent that teachers gave.
* (Entries in campus.tbl_lvgesamtnote)
*
* @param string $prestudent_id
* @param string|null $all (optional) If null only the current semesters grades will be loaded, otherwise all semesters grades will be loaded.
*
* @return void
*/
public function getTeacherProposal($prestudent_id, $all = null)
{
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel');
$result = $this->StudentModel->loadWhere([
'prestudent_id' => $prestudent_id
]);
$student = $this->getDataOrTerminateWithError($result);
if (!$student)
$this->terminateWithSuccess([]);
$student_uid = current($student)->student_uid;
$studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : null;
$result = $this->LvgesamtnoteModel->getLvGesamtNoten(null, $student_uid, $studiensemester_kurzbz);
$grades = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($grades);
}
/**
* List grades of a prestudent that an assistant marked as already done
* or as not allowed because of the repeating of a semester.
*
* @param string $prestudent_id
* @param string|null $all (optional) If null only the current semesters grades will be loaded, otherwise all semesters grades will be loaded.
*
* @return void
*/
public function getRepeaterGrades($prestudent_id, $all = null)
{
$this->load->library('AntragLib');
$studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : false;
$result = $this->antraglib->getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz);
$grades = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($grades);
}
/**
* Update or Insert a grade for the certificate of a prestudent.
* (Entry in lehre.tbl_zeugnisnote)
*
* @return void
*/
public function updateCertificate()
{
$this->load->library('form_validation');
$this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer");
$this->form_validation->set_rules("student_uid", $this->p->t('person', 'student'), "required");
$this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t('lehre', 'studiensemester'), "required");
$this->form_validation->set_rules('note', $this->p->t('lehre', 'note'), 'required|numeric');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$student_uid = $this->input->post('student_uid');
$lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id');
$note = $this->input->post('note');
$authUID = getAuthUID();
$now = date('c');
// NOTE(chris): Stg Permissions
if (!$this->hasPermissionUpdate($lehrveranstaltung_id, $student_uid))
return $this->_outputAuthError([$this->router->method => ['admin', 'assistenz']]);
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$result = $this->ZeugnisnoteModel->load([
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'student_uid' => $student_uid,
'lehrveranstaltung_id' => $lehrveranstaltung_id
]);
$current = $this->getDataOrTerminateWithError($result);
if ($current) {
$result = $this->ZeugnisnoteModel->update([
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'student_uid' => $student_uid,
'lehrveranstaltung_id' => $lehrveranstaltung_id
], [
'note' => $note,
'benotungsdatum' => $now,
'updateamum' => $now,
'updatevon' => $authUID
]);
} else {
$result = $this->ZeugnisnoteModel->insert([
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'student_uid' => $student_uid,
'lehrveranstaltung_id' => $lehrveranstaltung_id,
'note' => $note,
'benotungsdatum' => $now,
'insertamum' => $now,
'insertvon' => $authUID
]);
}
$this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(true);
}
/**
* Delete a grade from the certificate of a prestudent.
* (Entry in lehre.tbl_zeugnisnote)
*
* @return void
*/
public function deleteCertificate()
{
$this->load->library('form_validation');
$this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer");
$this->form_validation->set_rules("student_uid", $this->p->t('person', 'student'), "required");
$this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t('lehre', 'studiensemester'), "required");
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$student_uid = $this->input->post('student_uid');
$lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id');
// NOTE(chris): Stg Permissions
if (!$this->hasPermissionDelete($lehrveranstaltung_id, $student_uid))
return $this->_outputAuthError([$this->router->method => ['admin', 'assistenz']]);
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$result = $this->ZeugnisnoteModel->delete([
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'student_uid' => $student_uid,
'lehrveranstaltung_id' => $lehrveranstaltung_id
]);
$this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(true);
}
/**
* Copy a grade that teachers gave to the certificate of a prestudent.
* (Entry in campus.tbl_lvgesamtnote to an entry in lehre.tbl_zeugnisnote)
*
* @return void
*/
public function copyTeacherProposalToCertificate()
{
$this->load->library('form_validation');
$this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer");
$this->form_validation->set_rules("student_uid", $this->p->t('person', 'student'), "required");
$this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t('lehre', 'studiensemester'), "required");
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id');
$student_uid = $this->input->post('student_uid');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$authUID = getAuthUID();
// NOTE(chris): Stg Permissions
if (!$this->hasPermissionCopy($lehrveranstaltung_id, $student_uid))
return $this->_outputAuthError([$this->router->method => 'student/noten']);
$this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel');
$result = $this->LvgesamtnoteModel->load([
'student_uid' => $student_uid,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'lehrveranstaltung_id' => $lehrveranstaltung_id
]);
$teacherGrade = $this->getDataOrTerminateWithError($result);
if (!$teacherGrade)
show_404();
$teacherGrade = current($teacherGrade);
$data = [
'note' => $teacherGrade->note,
'punkte' => $teacherGrade->punkte,
'uebernahmedatum' => date('c'),
'benotungsdatum' => $teacherGrade->benotungsdatum,
'bemerkung' => $teacherGrade->bemerkung
];
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$this->ZeugnisnoteModel->addJoin('lehre.tbl_note n', 'note');
$result = $this->ZeugnisnoteModel->load([
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'student_uid' => $student_uid,
'lehrveranstaltung_id' => $lehrveranstaltung_id
]);
$certificateGrade = $this->getDataOrTerminateWithError($result);
if ($certificateGrade) {
$certificateGrade = current($certificateGrade);
if (!$certificateGrade->lkt_ueberschreibbar)
$this->terminateWithError($this->p->t("stv", "grades_error_overwrite"));
// NOTE(chris): update
$data['updateamum'] = $data['uebernahmedatum'];
$data['updatevon'] = $authUID;
$this->ZeugnisnoteModel->update([
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'student_uid' => $student_uid,
'lehrveranstaltung_id' => $lehrveranstaltung_id
], $data);
} else {
// NOTE(chris): insert
$data['insertamum'] = $data['uebernahmedatum'];
$data['insertvon'] = $authUID;
$data['lehrveranstaltung_id'] = $lehrveranstaltung_id;
$data['student_uid'] = $student_uid;
$data['studiensemester_kurzbz'] = $studiensemester_kurzbz;
$this->ZeugnisnoteModel->insert($data);
if (defined('FAS_PRUEFUNG_BEI_NOTENEINGABE_ANLEGEN')
&& FAS_PRUEFUNG_BEI_NOTENEINGABE_ANLEGEN) {
$result = $this->addTestsForGrade(
$studiensemester_kurzbz,
$student_uid,
$lehrveranstaltung_id,
$teacherGrade->note,
$teacherGrade->punkte
);
$this->getDataOrTerminateWithError($result);
}
}
$this->terminateWithSuccess(true);
}
/**
* Copy a grade that was marked by an assistant as already done or not
* allowed because of the repeating of a semester to the certificate of a
* prestudent.
*
* @return void
*/
public function copyRepeaterGradeToCertificate()
{
$this->load->library('form_validation');
$this->form_validation->set_rules("studierendenantrag_lehrveranstaltung_id", "studierendenantrag_lehrveranstaltung_id", "required|integer");
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$id = $this->input->post('studierendenantrag_lehrveranstaltung_id');
$authUID = getAuthUID();
$this->load->model('education/Studierendenantraglehrveranstaltung_model', 'StudierendenantraglehrveranstaltungModel');
$this->StudierendenantraglehrveranstaltungModel->addSelect("tbl_studierendenantrag_lehrveranstaltung.*");
$this->StudierendenantraglehrveranstaltungModel->addSelect("student_uid");
$this->StudierendenantraglehrveranstaltungModel->addJoin("campus.tbl_studierendenantrag", "studierendenantrag_id");
$this->StudierendenantraglehrveranstaltungModel->addJoin("public.tbl_student", "prestudent_id", "LEFT");
$result = $this->StudierendenantraglehrveranstaltungModel->load($id);
$repeaterGrade = $this->getDataOrTerminateWithError($result);
if (!$repeaterGrade)
show_404();
$repeaterGrade = current($repeaterGrade);
// NOTE(chris): Stg Permissions
if (!$this->hasPermissionCopy($repeaterGrade->lehrveranstaltung_id, $repeaterGrade->student_uid))
return $this->_outputAuthError([$this->router->method => 'student/noten']);
$data = [
'note' => $repeaterGrade->note,
'uebernahmedatum' => date('c'),
'benotungsdatum' => $repeaterGrade->insertamum,
'bemerkung' => $repeaterGrade->anmerkung
];
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$result = $this->ZeugnisnoteModel->load([
$repeaterGrade->studiensemester_kurzbz,
$repeaterGrade->student_uid,
$repeaterGrade->lehrveranstaltung_id
]);
$certificateGrade = $this->getDataOrTerminateWithError($result);
if ($certificateGrade) {
// NOTE(chris): update
$data['updateamum'] = $data['uebernahmedatum'];
$data['updatevon'] = $authUID;
$this->ZeugnisnoteModel->update([
$repeaterGrade->studiensemester_kurzbz,
$repeaterGrade->student_uid,
$repeaterGrade->lehrveranstaltung_id
], $data);
} else {
// NOTE(chris): insert
$data['insertamum'] = $data['uebernahmedatum'];
$data['insertvon'] = $authUID;
$data['lehrveranstaltung_id'] = $repeaterGrade->lehrveranstaltung_id;
$data['student_uid'] = $repeaterGrade->student_uid;
$data['studiensemester_kurzbz'] = $repeaterGrade->studiensemester_kurzbz;
$this->ZeugnisnoteModel->insert($data);
}
$this->terminateWithSuccess(true);
}
/**
* Loads the grade from the points using the gradingkey
*
* @return void
*/
public function getGradeFromPoints()
{
$this->load->library('form_validation');
$this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer");
$this->form_validation->set_rules("points", $this->p->t("stv", "grades_points"), "required|numeric");
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$this->load->model('education/Notenschluesselaufteilung_model', 'NotenschluesselaufteilungModel');
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
$result = $this->NotenschluesselaufteilungModel->getNote(
$this->input->post('points'),
$this->input->post('lehrveranstaltung_id'),
$studiensemester_kurzbz
);
$note = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($note);
}
/**
* Helper function that adds tests for a student
* (Entries in lehre.tbl_pruefung)
*
* @param string $studiensemester_kurzbz
* @param string $student_uid
* @param integer $lehrveranstaltung_id
* @param integer $note
* @param numeric $punkte
*
* @return stdClass
*/
protected function addTestsForGrade($studiensemester_kurzbz, $student_uid, $lehrveranstaltung_id, $note, $punkte)
{
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
// Get Lehreinheit
$result = $this->LehrveranstaltungModel->getLeByStudent($student_uid, $studiensemester_kurzbz, $lehrveranstaltung_id);
if (isError($result))
return $result;
if (!hasData($result))
return error($this->p->t("stv", "grades_error_lehreinheit_id"));
$le = current(getData($result));
// Prepare
$this->load->model('education/LePruefung_model', 'LePruefungModel');
$data = [
"student_uid" => $student_uid,
"lehreinheit_id" => $le->lehreinheit_id,
"datum" => date('Y-m-d'),
"pruefungstyp_kurzbz" => "Termin1",
"note" => $note
];
if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE)
$data["punkte"] = $punkte;
// Get Anwesenheit
$this->load->model('education/Anwesenheit_model', 'AnwesenheitModel');
$result = $this->AnwesenheitModel->loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid, $lehrveranstaltung_id);
if (isError($result))
return $result;
$anwesenheit = getData($result);
if ($anwesenheit && (float)current($anwesenheit)->prozent < FAS_ANWESENHEIT_ROT) {
// Get Anwesenheitsbefreiung
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$result = $this->BenutzerfunktionModel->getBenutzerFunktionByUidInStdsem($student_uid, $studiensemester_kurzbz, 'awbefreit');
if (isError($result))
return $result;
$anwesenheitsbefreit = hasData($result);
// Wenn nicht Anwesenheitsbefreit und Anwesenheit unter einem bestimmten Prozentsatz fällt dann wird ein Pruefungsantritt abgezogen
if (!$anwesenheitsbefreit) {
$data2 = $data;
$data2["note"] = 7;
if (isset($data2["punkte"]))
unset($data2["punkte"]);
$result = $this->LePruefungModel->insert($data2);
if (isError($result))
return $result;
$data["pruefungstyp_kurzbz"] = "Termin2";
}
}
return $this->LePruefungModel->insert($data);
}
/**
* Helper function to check permissions for updateCertificate()
*
* @param integer $lehrveranstaltung_id
* @param string $student_uid
*
* @return boolean
*/
protected function hasPermissionUpdate($lehrveranstaltung_id, $student_uid)
{
if ($lehrveranstaltung_id === null || $student_uid === null)
return true;
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load([$student_uid]);
if (isError($result) || !hasData($result))
return false;
$student = current(getData($result));
if ($this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz))
return true;
if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz))
return true;
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
$result = $this->StudienplanModel->getAllOesForLv($lehrveranstaltung_id);
if (isError($result))
return false;
$oes = getData($result) ?: [];
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->getStg($lehrveranstaltung_id);
if (isError($result))
return false;
if (hasData($result))
$oes[] = current(getData($result));
foreach ($oes as $oe) {
if ($this->permissionlib->isBerechtigt('admin', 'suid', $oe->oe_kurzbz))
return true;
if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $oe->oe_kurzbz))
return true;
}
return false;
}
/**
* Helper function to check permissions for deleteCertificate()
*
* @param integer $lehrveranstaltung_id
* @param string $student_uid
*
* @return boolean
*/
protected function hasPermissionDelete($lehrveranstaltung_id, $student_uid)
{
if ($lehrveranstaltung_id === null || $student_uid === null)
return true;
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load([$student_uid]);
if (isError($result) || !hasData($result))
return false;
$student = current(getData($result));
if ($this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz))
return true;
if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz))
return true;
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id);
if (isError($result) || !hasData($result))
return false;
$oe = current(getData($result));
if ($this->permissionlib->isBerechtigt('admin', 'suid', $oe->oe_kurzbz))
return true;
if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $oe->oe_kurzbz))
return true;
return false;
}
/**
* Helper function to check permissions for
* copyTeacherProposalToCertificate() and copyRepeaterGradeToCertificate()
*
* @param integer $lehrveranstaltung_id
* @param string $student_uid
*
* @return boolean
*/
protected function hasPermissionCopy($lehrveranstaltung_id, $student_uid)
{
if ($lehrveranstaltung_id === null || $student_uid === null)
return true;
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load([$student_uid]);
if (isError($result) || !hasData($result))
return false;
$student = current(getData($result));
if ($this->permissionlib->isBerechtigt('student/noten', 'suid', $student->studiengang_kz))
return true;
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id);
if (isError($result) || !hasData($result))
return false;
$oe = current(getData($result));
if ($this->permissionlib->isBerechtigt('student/noten', 'suid', $oe->oe_kurzbz))
return true;
return false;
}
}
@@ -97,7 +97,14 @@ class Kontakt extends FHCAPI_Controller
|| $this->router->method == 'deleteContact'
|| $this->router->method == 'deleteBankverbindung'
) {
$id = current(array_slice($this->uri->rsegments, 2));
if($this->input->post('address_id'))
$id = $this->input->post('address_id');
if($this->input->post('adresse_id'))
$id = $this->input->post('adresse_id');
if($this->input->post('bankverbindung_id'))
$id = $this->input->post('bankverbindung_id');
if($this->input->post('kontakt_id'))
$id = $this->input->post('kontakt_id');
$model = 'person/Adresse_model';
if ($this->router->method == 'loadContact'
@@ -125,7 +132,12 @@ class Kontakt extends FHCAPI_Controller
}
public function getAdressen($person_id)
{
$this->AdresseModel->addSelect('public.tbl_adresse.*');
$this->AdresseModel->addSelect("public.tbl_adresse.*,
(CASE
WHEN public.tbl_adresse.updateamum >= public.tbl_adresse.insertamum
THEN public.tbl_adresse.updateamum
ELSE public.tbl_adresse.insertamum
END) AS lastUpdate");
$this->AdresseModel->addSelect('t.*');
$this->AdresseModel->addSelect('f.firma_id');
$this->AdresseModel->addSelect('f.name as firmenname');
@@ -143,15 +155,26 @@ class Kontakt extends FHCAPI_Controller
public function addNewAddress($person_id)
{
$this->form_validation->set_rules('plz', 'PLZ', 'required|numeric', [
$this->form_validation->set_data(['address.plz' => $_POST['plz']]);
$this->form_validation->set_rules('address.plz', 'PLZ', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']),
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ'])
]);
if(isset($_POST['gemeinde']) && isset($_POST['ort']))
$this->form_validation->set_rules('plz', 'Postleitzahl', 'callback_validateLocationCombination', [
'validateLocationCombination' => $this->p->t('ui', 'error_location_combination')
]);
if(isset($_POST['nation']) && $_POST['nation'] == 'A')
{
$this->form_validation->set_rules('address.plz', 'PLZ', 'required|numeric', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']),
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ'])
]);
}
if(isset($_POST['gemeinde']) && isset($_POST['ort']) && isset($_POST['nation']) && $_POST['nation'] == 'A')
{
$this->form_validation->set_rules('address.plz', 'Postleitzahl', 'callback_validateLocationCombination', [
'validateLocationCombination' => $this->p->t('ui', 'error_location_combination')
]);
}
if ($this->form_validation->run() == false)
{
@@ -196,25 +219,37 @@ class Kontakt extends FHCAPI_Controller
]
);
if (isError($result))
{
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->outputJsonSuccess(true);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function updateAddress($address_id)
public function updateAddress()
{
$address_id = $this->input->post('adresse_id');
$this->form_validation->set_data(['address.plz' => $_POST['plz']]);
$uid = getAuthUID();
$this->form_validation->set_rules('plz', 'PLZ', 'required|numeric', [
$this->form_validation->set_rules('address.plz', 'PLZ', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']),
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ'])
]);
if(isset($_POST['gemeinde']) && isset($_POST['ort']))
$this->form_validation->set_rules('plz', 'Postleitzahl', 'callback_validateLocationCombination', [
if(isset($_POST['nation']) && $_POST['nation'] == 'A')
{
$this->form_validation->set_rules('address.plz', 'PLZ', 'required|numeric', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']),
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ'])
]);
}
if(isset($_POST['gemeinde']) && isset($_POST['ort']) && isset($_POST['nation']) && $_POST['nation'] == 'A')
{
$this->form_validation->set_rules('address.plz', 'Postleitzahl', 'callback_validateLocationCombination', [
'validateLocationCombination' => $this->p->t('ui', 'error_location_combination')
]);
}
if ($this->form_validation->run() == false)
{
@@ -272,15 +307,15 @@ class Kontakt extends FHCAPI_Controller
]
);
if (isError($result))
{
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->outputJsonSuccess(true);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function loadAddress($adresse_id)
public function loadAddress()
{
$adresse_id = $this->input->post('address_id');
$this->load->model('person/Adresse_model', 'AdresseModel');
$this->AdresseModel->addSelect('public.tbl_adresse.*');
@@ -306,8 +341,10 @@ class Kontakt extends FHCAPI_Controller
$this->terminateWithSuccess(current(getData($result)) ? : null);
}
public function deleteAddress($adresse_id)
public function deleteAddress()
{
$adresse_id = $this->input->post('address_id');
$this->load->model('person/Adresse_model', 'AdresseModel');
$result = $this->AdresseModel->load([
'adresse_id'=> $adresse_id,
@@ -366,10 +403,10 @@ class Kontakt extends FHCAPI_Controller
$this->load->model('organisation/standort_model', 'StandortModel');
$result = $this->StandortModel->searchStandorte($searchString);
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess($result ?: []);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getStandorteByFirma($firma_id)
@@ -386,11 +423,11 @@ class Kontakt extends FHCAPI_Controller
public function getKontakte($person_id)
{
$this->KontaktModel->addSelect("public.tbl_kontakt.*,
TO_CHAR (CASE
WHEN public.tbl_kontakt.updateamum >= public.tbl_kontakt.insertamum
THEN public.tbl_kontakt.updateamum
ELSE public.tbl_kontakt.insertamum
END::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS lastUpdate, st.bezeichnung, f.name");
(CASE
WHEN public.tbl_kontakt.updateamum >= public.tbl_kontakt.insertamum
THEN public.tbl_kontakt.updateamum
ELSE public.tbl_kontakt.insertamum
END) AS lastUpdate, st.bezeichnung, f.name");
$this->StandortModel->addJoin('public.tbl_standort st', 'ON (public.tbl_kontakt.standort_id = st.standort_id)', 'LEFT');
$this->FirmaModel->addJoin('public.tbl_firma f', 'ON (f.firma_id = st.firma_id)', 'LEFT');
$result = $this->KontaktModel->loadWhere(
@@ -418,8 +455,9 @@ class Kontakt extends FHCAPI_Controller
}
}
public function loadContact($kontakt_id)
public function loadContact()
{
$kontakt_id = $this->input->post('kontakt_id');
$this->load->model('person/Kontakt_model', 'KontaktModel');
$this->KontaktModel->addSelect('*, public.tbl_kontakt.*');
@@ -439,7 +477,6 @@ class Kontakt extends FHCAPI_Controller
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Kontakt_id']), self::ERROR_TYPE_GENERAL);
}
// $this->outputJsonSuccess(current(getData($result)));
$this->terminateWithSuccess(current(getData($result)));
}
@@ -492,11 +529,12 @@ class Kontakt extends FHCAPI_Controller
{
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
return $this->outputJsonSuccess(true);
$this->terminateWithSuccess($result);
}
public function updateContact($kontakt_id)
public function updateContact()
{
$kontakt_id = $this->input->post('kontakt_id');
$this->load->model('person/Kontakt_model', 'KontaktModel');
if(!$kontakt_id)
@@ -523,13 +561,6 @@ class Kontakt extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
/* if(isset($_POST['standort']))
{
$standort_id = $_POST['standort']['standort_id'];
}
else
$standort_id = null;*/
$uid = getAuthUID();
$kontakttyp = $this->input->post('kontakttyp');
$anmerkung = $this->input->post('anmerkung');
@@ -538,8 +569,6 @@ class Kontakt extends FHCAPI_Controller
$person_id = $this->input->post('person_id');
$standort_id = $this->input->post('standort_id');
//return $this->terminateWithError("in update " . $standort_id, self::ERROR_TYPE_GENERAL);
$result = $this->KontaktModel->update(
[
'kontakt_id' => $kontakt_id
@@ -557,15 +586,14 @@ class Kontakt extends FHCAPI_Controller
]
);
if (isError($result))
{
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->outputJsonSuccess(true);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function deleteContact($kontakt_id)
public function deleteContact()
{
$kontakt_id = $this->input->post('kontakt_id');
$this->load->model('person/Kontakt_model', 'KontaktModel');
$result = $this->KontaktModel->delete(
@@ -643,15 +671,15 @@ class Kontakt extends FHCAPI_Controller
'orgform_kurzbz' => $orgform_kurzbz
]
);
if (isError($result))
{
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
return $this->outputJsonSuccess(true);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function loadBankverbindung($bankverbindung_id)
public function loadBankverbindung()
{
$bankverbindung_id = $this->input->post('bankverbindung_id');
$this->load->model('person/Bankverbindung_model', 'BankverbindungModel');
$this->BankverbindungModel->addSelect('*');
@@ -719,15 +747,15 @@ class Kontakt extends FHCAPI_Controller
]
);
if (isError($result))
{
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->outputJsonSuccess(true);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function deleteBankverbindung($bankverbindung_id)
public function deleteBankverbindung()
{
$bankverbindung_id = $this->input->post('bankverbindung_id');
$this->load->model('person/Bankverbindung_model', 'BankverbindungModel');
$result = $this->BankverbindungModel->delete(
@@ -740,7 +768,7 @@ class Kontakt extends FHCAPI_Controller
}
if (!hasData($result))
{
$this->outputJson($result);
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Bankverbindung_id']), self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess(current(getData($result)) ? : null);
}
@@ -0,0 +1,528 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Mobility extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getMobilitaeten' => ['admin:r', 'assistenz:r'],
'loadMobility' => ['admin:r', 'assistenz:r'],
'insertMobility' => ['admin:rw', 'assistenz:rw'],
'updateMobility' => ['admin:rw', 'assistenz:rw'],
'deleteMobility' => ['admin:rw', 'assistenz:rw'],
'getProgramsMobility' => ['admin:r', 'assistenz:r'],
'getLVList' => ['admin:r', 'assistenz:r'],
'getAllLehreinheiten' => ['admin:r', 'assistenz:r'],
'getLvsandLesByStudent' => ['admin:r', 'assistenz:r'],
'getPurposes' => ['admin:r', 'assistenz:r'],
'getSupports' => ['admin:r', 'assistenz:r'],
'getListPurposes' => ['admin:r', 'assistenz:r'],
'getListSupports' => ['admin:r', 'assistenz:r'],
'deleteMobilityPurpose' => ['admin:r', 'assistenz:r'],
'addMobilityPurpose' => ['admin:r', 'assistenz:r'],
'deleteMobilitySupport' => ['admin:r', 'assistenz:r'],
'addMobilitySupport' => ['admin:r', 'assistenz:r'],
]);
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
$this->load->library('form_validation');
// Load language phrases
$this->loadPhrases([
'ui',
'mobility'
]);
// Load models
$this->load->model('codex/Bisio_model', 'BisioModel');
}
public function getMobilitaeten($student_uid)
{
$this->BisioModel->addSelect("*");
$this->BisioModel->addJoin('bis.tbl_mobilitaetsprogramm mp', 'ON (mp.mobilitaetsprogramm_code = bis.tbl_bisio.mobilitaetsprogramm_code)', 'LEFT');
$this->BisioModel->addJoin('lehre.tbl_lehreinheit le', 'ON (le.lehreinheit_id = bis.tbl_bisio.lehreinheit_id)','LEFT');
$this->BisioModel->addOrder('von', 'DESC');
$this->BisioModel->addOrder('bis', 'DESC');
$this->BisioModel->addOrder('bisio_id', 'DESC');
$result = $this->BisioModel->loadWhere(
array('student_uid' => $student_uid)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getProgramsMobility()
{
$this->load->model('codex/Mobilitaetsprogramm_model', 'MobilitaetsprogrammModel');
$result = $this->MobilitaetsprogrammModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function insertMobility()
{
$this->load->library('form_validation');
$authUID = getAuthUID();
$student_uid = $this->input->post('uid');
if(!$student_uid)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
}
$formData = $this->input->post('formData');
$_POST['von'] = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null;
$_POST['bis'] = (isset($formData['bis']) && !empty($formData['bis'])) ? $formData['bis'] : null;
$_POST['nation_code'] = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A';
$_POST['mobilitaetsprogramm_code'] = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null;
$_POST['herkunftsland_code'] = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A';
$_POST['ects_erworben'] = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null;
$_POST['ects_angerechnet'] = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null;
$_POST['lehreinheit_id'] = (isset($formData['lehreinheit_id']) && !empty($formData['lehreinheit_id'])) ? $formData['lehreinheit_id'] : null;
$this->form_validation->set_rules('nation_code', 'Nation_code', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Nation_code'])
]);
$this->form_validation->set_rules('herkunftsland_code', 'Herkunftsland_code', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Herkunftsland_code'])
]);
$this->form_validation->set_rules('mobilitaetsprogramm_code', 'Mobilitaetsprogramm_code', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Mobilitaetsprogramm_code'])
]);
$this->form_validation->set_rules('von', 'VonDatum', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum'])
]);
$this->form_validation->set_rules('bis', 'VBisDatum', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VBisDatum'])
]);
$this->form_validation->set_rules('ects_erworben', 'Ects_erworben', 'numeric', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_erworben'])
]);
$this->form_validation->set_rules('ects_angerechnet', 'Ects_angerechnet', 'numeric', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_angerechnet'])
]);
$this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'numeric', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit'])
]);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$ort = (isset($formData['ort']) && !empty($formData['ort'])) ? $formData['ort'] : null;
$universitaet = (isset($formData['universitaet']) && !empty($formData['universitaet'])) ? $formData['universitaet'] : null;
$localPurposes = (isset($formData['localPurposes']) && !empty($formData['localPurposes'])) ? $formData['localPurposes'] : null;
$localSupports = (isset($formData['localSupports']) && !empty($formData['localSupports'])) ? $formData['localSupports'] : null;
$result = $this->BisioModel->insert([
'student_uid' => $student_uid,
'von' => $_POST['von'],
'bis' => $_POST['bis'],
'mobilitaetsprogramm_code' => $_POST['mobilitaetsprogramm_code'],
'nation_code' => $_POST['nation_code'],
'herkunftsland_code' => $_POST['herkunftsland_code'],
'lehreinheit_id' => $_POST['lehreinheit_id'],
'ort' => $ort,
'universitaet' => $universitaet,
'ects_erworben' => $_POST['ects_erworben'] ,
'ects_angerechnet' => $_POST['ects_angerechnet'],
'insertamum' => date('c'),
'insertvon' => $authUID,
]);
$bisio_id = $this->getDataOrTerminateWithError($result);
//check if localData (purposes)
if(count($localPurposes) > 0){
foreach ($localPurposes as $zweck){
$zweck = (int)$zweck;
$this->addMobilityPurpose($bisio_id, $zweck);
}
}
//check if localData (supports)
if(count($localSupports) > 0){
foreach ($localSupports as $support){
$this->addMobilitySupport($bisio_id, $support);
}
}
$this->terminateWithSuccess($bisio_id);
}
public function loadMobility($bisio_id)
{
$this->BisioModel->addSelect("*");
$this->BisioModel->addJoin('bis.tbl_mobilitaetsprogramm mp', 'ON (mp.mobilitaetsprogramm_code = bis.tbl_bisio.mobilitaetsprogramm_code)', 'LEFT');
$this->BisioModel->addJoin('lehre.tbl_lehreinheit le', 'ON (le.lehreinheit_id = bis.tbl_bisio.lehreinheit_id)','LEFT');
$result = $this->BisioModel->loadWhere(
array('bisio_id' => $bisio_id)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
public function updateMobility()
{
$this->load->library('form_validation');
$authUID = getAuthUID();
$student_uid = $this->input->post('uid');
if(!$student_uid)
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
}
$formData = $this->input->post('formData');
$_POST['von'] = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null;
$_POST['bis'] = (isset($formData['bis']) && !empty($formData['bis'])) ? $formData['bis'] : null;
$_POST['nation_code'] = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A';
$_POST['mobilitaetsprogramm_code'] = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null;
$_POST['herkunftsland_code'] = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A';
$_POST['ects_erworben'] = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null;
$_POST['ects_angerechnet'] = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null;
$_POST['lehreinheit_id'] = (isset($formData['lehreinheit_id']) && !empty($formData['lehreinheit_id'])) ? $formData['lehreinheit_id'] : null;
$this->form_validation->set_rules('nation_code', 'Nation_code', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Nation_code'])
]);
$this->form_validation->set_rules('herkunftsland_code', 'Herkunftsland_code', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Herkunftsland_code'])
]);
$this->form_validation->set_rules('mobilitaetsprogramm_code', 'Mobilitaetsprogramm_code', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Mobilitaetsprogramm_code'])
]);
$this->form_validation->set_rules('von', 'VonDatum', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum'])
]);
$this->form_validation->set_rules('bis', 'VBisDatum', 'is_valid_date', [
'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VBisDatum'])
]);
$this->form_validation->set_rules('ects_erworben', 'Ects_erworben', 'numeric', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_erworben'])
]);
$this->form_validation->set_rules('ects_angerechnet', 'Ects_angerechnet', 'numeric', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_angerechnet'])
]);
$this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'numeric', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit'])
]);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$result = $this->BisioModel->update(
[
'bisio_id' => $formData['bisio_id']
],
[
'student_uid' => $student_uid,
'von' => $_POST['von'],
'bis' => $_POST['bis'],
'mobilitaetsprogramm_code' => $_POST['mobilitaetsprogramm_code'],
'nation_code' => $_POST['nation_code'],
'herkunftsland_code' => $_POST['herkunftsland_code'],
'lehreinheit_id' => $_POST['lehreinheit_id'],
'ort' => $formData['ort'],
'universitaet' => $formData['universitaet'],
'ects_erworben' => $_POST['ects_erworben'] ,
'ects_angerechnet' => $_POST['ects_angerechnet'],
'updateamum' => date('c'),
'updatevon' => $authUID,
]
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
}
public function deleteMobility($bisio_id)
{
//check if extension table exists
$result = $this->BisioModel->tableExists('extension', 'tbl_mo_bisioidzuordnung');
$data = $this->getDataOrTerminateWithError($result);
//if table exists check if existing entry
if(!empty($data))
{
$this->BisioModel->addSelect("count(*)");
$this->BisioModel->addJoin('extension.tbl_mo_bisioidzuordnung mo', 'ON (mo.bisio_id = bis.tbl_bisio.bisio_id)', 'LEFT');
$resultCheckMo = $this->BisioModel->loadWhere(
array('mo.bisio_id' => $bisio_id)
);
$resultCheckMo = $this->getDataOrTerminateWithError($resultCheckMo);
$count = current($resultCheckMo)->count;
$existsInExtension = $count > 0 ? true : false;
if($existsInExtension)
$this->terminateWithError($this->p->t('mobility', 'error_existingEntryInExtension'), self::ERROR_TYPE_GENERAL);
}
$result = $this->BisioModel->delete(
array('bisio_id' => $bisio_id)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getLVList($studiengang_kz)
{
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->getLvsByStudiengangkz($studiengang_kz);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getAllLehreinheiten()
{
$lv_id = $this->input->post('lv_id');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$result = $this->LehreinheitModel->getLesFromLvIds($lv_id, $studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getLvsandLesByStudent($student_uid)
{
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid);
$data = $this->getDataOrTerminateWithError($result);
$lv_ids = array();
$allData = array();
foreach ($data as $lehrveranstaltung) {
$lv_ids[] = $lehrveranstaltung->lehrveranstaltung_id;
}
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
foreach ($lv_ids as $id)
{
$result = $this->LehreinheitModel->getLesFromLvIds($id);
$data = $this->getDataOrTerminateWithError($result);
if (is_array($data)) {
$allData = array_merge($allData, $data);
}
}
return $this->terminateWithSuccess($allData);
}
public function getPurposes($bisio_id)
{
$bisio_id = (int)$bisio_id;
$this->load->model('codex/Bisiozweck_model', 'BisiozweckModel');
$this->BisiozweckModel->addSelect("*");
$this->BisiozweckModel->addJoin('bis.tbl_zweck zw', 'ON (zw.zweck_code = bis.tbl_bisio_zweck.zweck_code)');
$result = $this->BisiozweckModel->loadWhere(
array('bisio_id' => $bisio_id)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getSupports($bisio_id)
{
$bisio_id = (int)$bisio_id;
$this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel');
$this->BisioaufenthaltfoerderungModel->addSelect("*");
$this->BisioaufenthaltfoerderungModel->addJoin('bis.tbl_aufenthaltfoerderung af', 'ON (af.aufenthaltfoerderung_code = bis.tbl_bisio_aufenthaltfoerderung.aufenthaltfoerderung_code)');
$result = $this->BisioaufenthaltfoerderungModel->loadWhere(
array('bisio_id' => $bisio_id)
);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getListPurposes()
{
$this->load->model('codex/Zweck_model', 'ZweckModel');
$result = $this->ZweckModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getListSupports()
{
$this->load->model('codex/Aufenthaltfoerderung_model', 'AufenthaltfoerderungModel');
$result = $this->AufenthaltfoerderungModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function addMobilityPurpose($bisio_id, $local_purpose = null)
{
$zweck_code = $this->input->post('zweck_code');
if($local_purpose){
$zweck_code = $local_purpose;
}
$this->load->model('codex/Bisiozweck_model', 'BisiozweckModel');
if(!$local_purpose)
{
$check = $this->BisiozweckModel->loadWhere(
[
'bisio_id' => $bisio_id,
'zweck_code' => $zweck_code,
]
);
if (hasData($check))
{
$this->terminateWithError($this->p->t('ui', 'error_entryExisting'), self::ERROR_TYPE_GENERAL);
}
}
$result = $this->BisiozweckModel->insert(
array(
'bisio_id' => $bisio_id,
'zweck_code' => $zweck_code
)
);
$data = $this->getDataOrTerminateWithError($result);
if($local_purpose)
{
return $data;
}
return $this->terminateWithSuccess(current($data));
}
public function deleteMobilityPurpose($bisio_id)
{
$zweck_code = $this->input->post('zweck_code');
$this->load->model('codex/Bisiozweck_model', 'BisiozweckModel');
$result = $this->BisiozweckModel->delete(
array(
'bisio_id' => $bisio_id,
'zweck_code' => $zweck_code
)
);
$data = $this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess(current($data));
}
public function addMobilitySupport($bisio_id, $local_support = null)
{
$aufenthaltfoerderung_code = $this->input->post('aufenthaltfoerderung_code');
if($local_support){
$aufenthaltfoerderung_code = $local_support;
}
$this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel');
if(!$local_support)
{
$check = $this->BisioaufenthaltfoerderungModel->loadWhere(
[
'bisio_id' => $bisio_id,
'aufenthaltfoerderung_code' => $aufenthaltfoerderung_code,
]
);
if (hasData($check))
{
$this->terminateWithError($this->p->t('ui', 'error_entryExisting'), self::ERROR_TYPE_GENERAL);
}
}
$result = $this->BisioaufenthaltfoerderungModel->insert(
array(
'bisio_id' => $bisio_id,
'aufenthaltfoerderung_code' => $aufenthaltfoerderung_code
)
);
$data = $this->getDataOrTerminateWithError($result);
if($local_support)
{
return $data;
}
return $this->terminateWithSuccess(current($data));
}
public function deleteMobilitySupport($bisio_id)
{
$aufenthaltfoerderung_code = $this->input->post('aufenthaltfoerderung_code');
$this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel');
$result = $this->BisioaufenthaltfoerderungModel->delete(
array(
'bisio_id' => $bisio_id,
'aufenthaltfoerderung_code' => $aufenthaltfoerderung_code
)
);
$data = $this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess(current($data));
}
}
@@ -19,6 +19,7 @@ class Prestudent extends FHCAPI_Controller
'getAufmerksamdurch' => ['admin:r', 'assistenz:r'],
'getBerufstaetigkeit' => ['admin:r', 'assistenz:r'],
'getTypenStg' => ['admin:r', 'assistenz:r'],
'getBisstandort' => ['admin:r', 'assistenz:r'],
'getStudienplaene' => ['admin:r', 'assistenz:r'],
'getStudiengang' => ['admin:r', 'assistenz:r']
]);
@@ -265,6 +266,17 @@ class Prestudent extends FHCAPI_Controller
return $this->terminateWithSuccess(getData($result) ?: []);
}
public function getBisstandort()
{
$this->load->model('codex/Bisstandort_model', 'BisstandortModel');
$result = $this->BisstandortModel->load();
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess(getData($result) ?: []);
}
public function getStudienplaene($prestudent_id)
{
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
@@ -0,0 +1,577 @@
<?php
/**
* Copyright (C) 2024 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');
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about addresses
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Pruefung extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getPruefungen' => ['admin:r', 'assistenz:r'],
'loadPruefung' => ['admin:r', 'assistenz:r'],
'getTypenPruefungen' => ['admin:r', 'assistenz:r'],
'getLehreinheiten' => ['admin:r', 'assistenz:r'],
'getAllLehreinheiten' => ['admin:r', 'assistenz:r'],
'getLvsByStudent' => ['admin:r', 'assistenz:r'],
'getLvsandLesByStudent' => ['admin:r', 'assistenz:r'],
'getLvsAndMas' => ['admin:r', 'assistenz:r'],
'getMitarbeiterLv' => ['admin:r', 'assistenz:r'],
'getNoten' => ['admin:r', 'assistenz:r'],
'checkZeugnisnoteLv' => ['admin:r', 'assistenz:r'],
'checkTermin1' => ['admin:r', 'assistenz:r'],
'insertPruefung' => self::PERM_LOGGED,
'updatePruefung' =>self::PERM_LOGGED,
'deletePruefung' =>self::PERM_LOGGED,
]);
//Load Models
$this->load->model('education/LePruefung_model', 'PruefungModel');
//version with postParameter
if ($this->router->method == 'insertPruefung')
{
$student_uid = $this->input->post('student_uid');
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load([$student_uid]);
$student = $this->getDataOrTerminateWithError($result);
$prestudent_id = current($student)->prestudent_id;
$this->checkPermissionsForPrestudent($prestudent_id, ['admin:w', 'assistenz:w']);
}
// parameter from uri
if ($this->router->method == 'updatePruefung' || $this->router->method == 'deletePruefung')
{
$pruefung_id = current(array_slice($this->uri->rsegments, 2));
$result = $this->PruefungModel->load($pruefung_id);
$pruefung = $this->getDataOrTerminateWithError($result);
$student_uid = current($pruefung)->student_uid;
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load([$student_uid]);
$student = $this->getDataOrTerminateWithError($result);
$prestudent_id = current($student)->prestudent_id;
$this->checkPermissionsForPrestudent($prestudent_id, ['admin:rw', 'assistenz:rw']);
}
if ($this->router->method == 'loadPruefung')
{
$pruefung_id = current(array_slice($this->uri->rsegments, 2));
$result = $this->PruefungModel->load($pruefung_id);
$pruefung = $this->getDataOrTerminateWithError($result);
$student_uid = current($pruefung)->student_uid;
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load([$student_uid]);
$student = $this->getDataOrTerminateWithError($result);
$prestudent_id = current($student)->prestudent_id;
$this->checkPermissionsForPrestudent($prestudent_id, ['admin:r', 'assistenz:r']);
}
if ($this->router->method == 'getPruefungen')
{
$student_uid = current(array_slice($this->uri->rsegments, 2));
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load([$student_uid]);
$student = $this->getDataOrTerminateWithError($result);
$prestudent_id = current($student)->prestudent_id;
$this->checkPermissionsForPrestudent($prestudent_id, ['admin:r', 'assistenz:r']);
}
// Load language phrases
$this->loadPhrases([
'global', 'ui','lehre'
]);
}
public function getPruefungen($student_uid, $studiensemester_kurzbz = null)
{
$result = $this->PruefungModel->getPruefungenByStudentuid($student_uid);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function loadPruefung($pruefung_id)
{
$this->PruefungModel->addSelect('tbl_pruefung.datum');
$this->PruefungModel->addSelect("TO_CHAR(tbl_pruefung.datum::timestamp, 'DD.MM.YYYY') AS format_datum");
$this->PruefungModel->addSelect('tbl_pruefung.anmerkung');
$this->PruefungModel->addSelect('tbl_pruefung.pruefungstyp_kurzbz');
$this->PruefungModel->addSelect('tbl_pruefung.pruefung_id');
$this->PruefungModel->addSelect('tbl_pruefung.lehreinheit_id');
$this->PruefungModel->addSelect('tbl_pruefung.student_uid');
$this->PruefungModel->addSelect('tbl_pruefung.mitarbeiter_uid');
$this->PruefungModel->addSelect('tbl_pruefung.punkte');
$this->PruefungModel->addSelect('tbl_pruefung.note');
$this->PruefungModel->addSelect('tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung');
$this->PruefungModel->addSelect('tbl_lehrveranstaltung.lehrveranstaltung_id');
$this->PruefungModel->addSelect('tbl_lehrveranstaltung.semester');
$this->PruefungModel->addSelect('tbl_lehrveranstaltung.lehrform_kurzbz');
$this->PruefungModel->addSelect('tbl_note.bezeichnung as note_bezeichnung');
$this->PruefungModel->addSelect('tbl_pruefungstyp.beschreibung as typ_beschreibung');
$this->PruefungModel->addSelect('tbl_lehreinheit.studiensemester_kurzbz as studiensemester_kurzbz');
$this->PruefungModel->addJoin('lehre.tbl_lehreinheit', 'lehre.tbl_pruefung.lehreinheit_id = lehre.tbl_lehreinheit.lehreinheit_id');
$this->PruefungModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
$this->PruefungModel->addJoin('lehre.tbl_note', 'note');
$this->PruefungModel->addJoin('lehre.tbl_pruefungstyp', 'pruefungstyp_kurzbz');
$this->PruefungModel->addLimit(1);
$result = $this->PruefungModel->loadWhere(
array('pruefung_id' => $pruefung_id)
);
if (isError($result)) {
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if (!hasData($result))
{
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Pruefung_id']), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess(current(getData($result)) ? : null);
}
/**
* Inserts a pruefung
*
* @param lehrveranstaltung_id, student_uid, lehreinheit_id
*
* @return values on success
* retval 0: pruefung inserted
* reval 1: pruefung and zeugnisnote inserted
* retval 2: pruefung inserted, no insert Zeugnisnote
* (change after date of examination)
* retval 3: pruefung of type Termin2 inserted
* and pruefung of type Termin1 as well
* retval 5: prueufungen Termin 2 and 1 inserted
* and no insert Zeugnisnote (change after date of examination)
*/
public function insertPruefung()
{
$authUID = getAuthUID();
$this->load->library('form_validation');
$this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]),
]);
$this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]),
]);
$this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]),
]);
$this->form_validation->set_rules(
'datum',
$this->p->t('global', 'datum'),
['is_valid_date']
);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
//calculate studiensemester_kurzbz this from lehreinheit (case newPruefung)
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
if (!$studiensemester_kurzbz)
{
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id'));
$lehreinheit = $this->getDataOrTerminateWithError($result);
$studiensemester_kurzbz = current($lehreinheit)->studiensemester_kurzbz;
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
}
$result = $this->PruefungModel->insert([
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
'datum' => $this->input->post('datum'),
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
'note' => $this->input->post('note'),
'anmerkung' => $this->input->post('anmerkung'),
'insertamum' => date('c'),
'insertvon' => $authUID,
]);
$this->getDataOrTerminateWithError($result);
//check if existing zeugnisnote
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$result = $this->ZeugnisnoteModel->loadWhere(array(
'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),
'student_uid' => $this->input->post('student_uid'),
'studiensemester_kurzbz' => $studiensemester_kurzbz));
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
if (!hasData($result))
{
//insert zeugnisnote, if not existing
$result = $this->ZeugnisnoteModel->insert(array(
'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),
'student_uid' => $this->input->post('student_uid'),
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'note' => $this->input->post('note'),
'uebernahmedatum' => date('c'),
'benotungsdatum' => $this->input->post('datum'),
'insertamum' => date('c'),
'insertvon' => $authUID
));
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess(1);
}
$return_code = 0;
//handling Termin1 if not existing
if($this->input->post('pruefungstyp_kurzbz') == "Termin2")
{
$resultP = $this->PruefungModel->loadWhere(array(
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'pruefungstyp_kurzbz' => 'Termin1'));
if (isError($resultP))
{
$this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL);
}
if(!hasData($resultP))
{
//check if existing Zeugnisnote
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id');
$resultP = $this->ZeugnisnoteModel->loadWhere(array(
'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),
'student_uid' => $this->input->input->post('student_uid'),
'lehre.tbl_zeugnisnote.studiensemester_kurzbz' => $studiensemester_kurzbz));
if (isError($resultP))
{
$this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL);
}
if (!hasData($resultP))
{
$this->terminateWithError("Zeugnisnote existiert nicht", self::ERROR_TYPE_GENERAL);
}
$dataNote = current(getData($resultP));
$resultN = $this->PruefungModel->insert([
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
'datum' => $dataNote->benotungsdatum,
'pruefungstyp_kurzbz' => 'Termin1',
'note' => $dataNote->note,
'punkte' => $dataNote->punkte,
'anmerkung' => 'automatisiert aus Zeugnisnote erstellt',
'insertamum' => date('c'),
'insertvon' => $authUID,
]);
if (isError($resultN)) {
$this->terminateWithError(getError($resultN), self::ERROR_TYPE_GENERAL);
}
$return_code = 3;
}
}
$note = current(getData($result));
$uebernahmedatum = new DateTime($note->uebernahmedatum);
$benotungsdatum = new DateTime($note->benotungsdatum);
$checkDate = $uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum
? $benotungsdatum
: $uebernahmedatum;
if ($checkDate >= $this->input->post('datum') && $note !== $note->note)
{
$this->terminateWithSuccess($return_code + 2);
}
$this->terminateWithSuccess($return_code + 2);
}
/**
* Updates a pruefung
*
* @param pruefung_id
*
* @return success or error
*
* no impact on lehre.tbl_zeugnisnote
*/
public function updatePruefung($pruefung_id)
{
$result = $this->PruefungModel->load($pruefung_id);
$oldpruefung = $this->getDataOrTerminateWithError($result);
if (!$oldpruefung)
show_404(); // Pruefung that should be updated does not exist
$authUID = getAuthUID();
$this->load->library('form_validation');
$this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]),
]);
$this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]),
]);
$this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]),
]);
$this->form_validation->set_rules(
'datum',
$this->p->t('global', 'datum'),
['is_valid_date']
);
if ($this->form_validation->run() == false)
{
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
$result = $this->PruefungModel->update(
[
'pruefung_id' => $pruefung_id
],
[ 'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
'note' => $this->input->post('note'),
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
'datum' => $this->input->post('datum'),
'anmerkung' => $this->input->post('anmerkung'),
'updatevon' => $authUID,
'updateamum' => date('c'),
]
);
$this->getDataOrTerminateWithError($result);
return $this->outputJsonSuccess(true);
}
/**
* Deletes a pruefung
*
* @param pruefung_id
*
* @return success or error
*
* no impact on lehre.tbl_zeugnisnote
*/
public function deletePruefung($pruefung_id)
{
$result = $this->PruefungModel->load($pruefung_id);
$oldpruefung = $this->getDataOrTerminateWithError($result);
if (!$oldpruefung)
show_404(); // Pruefung that should be deleted does not exist
$result = $this->PruefungModel->delete(
[
'pruefung_id' => $pruefung_id
]
);
$this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess(true);
}
public function getTypenPruefungen()
{
$this->load->model('education/Pruefungstyp_model', 'PruefungtypModel');
//TODO(Manu) sort Termin3
$this->PruefungtypModel->addOrder('sort', 'ASC');
$result = $this->PruefungtypModel->loadWhere(
array('abschluss' => 'false')
);
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess(getData($result) ?: []);
}
public function getAllLehreinheiten()
{
$lv_id = $this->input->post('lv_id');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$result = $this->LehreinheitModel->getLesFromLvIds($lv_id, $studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
public function getLvsandLesByStudent($student_uid, $semester_kurzbz=null)
{
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid, $semester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
$lv_ids = array();
$allData = array();
foreach ($data as $lehrveranstaltung) {
$lv_ids[] = $lehrveranstaltung->lehrveranstaltung_id;
}
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
foreach ($lv_ids as $id)
{
$result = $this->LehreinheitModel->getLesFromLvIds($id, $semester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
if (is_array($data)) {
$allData = array_merge($allData, $data);
}
}
return $this->terminateWithSuccess($allData);
}
public function getLvsAndMas($student_uid)
{
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid);
$data = $this->getDataOrTerminateWithError($result);
$lv_ids = array();
$allDataMa = array();
foreach ($data as $lehrveranstaltung)
{
$lv_ids[] = $lehrveranstaltung->lehrveranstaltung_id;
}
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
foreach ($lv_ids as $id)
{
$resultMa = $this->MitarbeiterModel->getMitarbeiterFromLV($id);
$dataMa = $this->getDataOrTerminateWithError($resultMa);
if (is_array($dataMa))
{
$allDataMa = array_merge($allDataMa, $dataMa);
}
}
return $this->terminateWithSuccess($allDataMa);
}
public function getLvsByStudent($student_uid, $studiensemester_kurzbz = null)
{
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid, $studiensemester_kurzbz);
$data = $this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($data);
}
public function getMitarbeiterLv($lv_id)
{
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->getMitarbeiterFromLV($lv_id);
$data = $this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($data);
}
public function getNoten()
{
$this->load->model('education/Note_model', 'NoteModel');
$this->NoteModel->addOrder('note', 'ASC');
$result = $this->NoteModel->load();
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
return $this->terminateWithSuccess(getData($result) ?: []);
}
public function checkZeugnisnoteLv()
{
$student_uid = $this->input->post('student_uid');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id');
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$result = $this->ZeugnisnoteModel->loadWhere(array(
'lehrveranstaltung_id' => $lehrveranstaltung_id,
'student_uid' => $student_uid,
'studiensemester_kurzbz' => $studiensemester_kurzbz));
$data = $this->getDataOrTerminateWithError($result);
return $this->terminateWithSuccess($data);
}
}
@@ -647,15 +647,8 @@ class Status extends FHCAPI_Controller
return $this->outputJsonSuccess(true);
}
public function loadStatus()
public function loadStatus($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester)
{
$_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
$prestudent_id = $this->input->post('prestudent_id');
$status_kurzbz = $this->input->post('status_kurzbz');
$ausbildungssemester = $this->input->post('ausbildungssemester');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$result = $this->PrestudentstatusModel->loadWhere(
array(
'prestudent_id' => $prestudent_id,
@@ -1344,13 +1337,13 @@ class Status extends FHCAPI_Controller
'updatevon' => $authUID
];
foreach ([
'orgform_kurzbz',
'anmerkung',
'bewerbung_abgeschicktamum',
'studienplan_id',
'rt_stufe',
'statusgrund_id'
] as $key)
'orgform_kurzbz',
'anmerkung',
'bewerbung_abgeschicktamum',
'studienplan_id',
'rt_stufe',
'statusgrund_id'
] as $key)
if ($this->input->post($key))
$updateData[$key] = $this->input->post($key);
@@ -55,7 +55,7 @@ class Student extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
'ui'
'ui', 'lehre'
]);
}
@@ -156,6 +156,8 @@ class Student extends FHCAPI_Controller
$uid = $student ? current($student)->student_uid : null;
$studiengang_kz = $student ? current($student)->studiengang_kz : null;
$result = $this->PrestudentModel->loadWhere(['prestudent_id' => $prestudent_id]);
$person = $this->getDataOrTerminateWithError($result);
@@ -223,20 +225,35 @@ class Student extends FHCAPI_Controller
// Check PKs
if (count($update_lehrverband) + count($update_student) && $uid === null) {
// TODO(chris): phrase
$this->terminateWithValidationErrors(['' => "Kein/e StudentIn vorhanden!"]);
$this->terminateWithValidationErrors(['' => $this->p->t('lehre', 'error_no_student')]);
}
if (count($update_person) && $person_id === null) {
// TODO(chris): phrase
$this->terminateWithValidationErrors(['' => "Keine Person vorhanden!"]);
$this->terminateWithValidationErrors(['' => $this->p->t('lehre', 'error_no_person')]);
}
// Do Updates
if (count($update_lehrverband)) {
$result = $this->StudentlehrverbandModel->update([
$curstudlvb = $this->StudentlehrverbandModel->load([
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'student_uid' => $uid
], $update_lehrverband);
]);
if(hasData($curstudlvb) && count(getData($curstudlvb)) > 0 )
{
$result = $this->StudentlehrverbandModel->update([
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'student_uid' => $uid
], $update_lehrverband);
}
else
{
$result = $this->StudentlehrverbandModel->insert(array_merge([
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'student_uid' => $uid,
'studiengang_kz' => $studiengang_kz
], $update_lehrverband));
}
$this->getDataOrTerminateWithError($result);
}
@@ -1,168 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Noten extends Auth_Controller
{
public function __construct()
{
parent::__construct([
'get' => 'student/noten:r',
'getZeugnis' => 'student/noten:r',
'update' => ['admin:w', 'assistenz:w']
]);
// Load Libraries
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
}
public function get()
{
$this->load->model('codex/Note_model', 'NoteModel');
$result = $this->NoteModel->addOrder('note');
$result = $this->NoteModel->load();
if (isError($result)) {
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
}
return $this->outputJson($result);
}
public function getZeugnis($prestudent_id, $all = null)
{
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$result = $this->StudentModel->loadWhere([
'prestudent_id' => $prestudent_id
]);
if (isError($result)) {
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
return $this->outputJson($result);
}
if (!hasData($result))
return $this->outputJsonSuccess(null);
$student_uid = current(getData($result))->student_uid;
$studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : null;
$result = $this->ZeugnisnoteModel->getZeugnisnoten($student_uid, $studiensemester_kurzbz);
if (isError($result)) {
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
}
return $this->outputJson($result);
}
public function update()
{
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$this->load->library('form_validation');
$_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
if (empty($_POST) || !is_array(current($_POST))) {
$result = $this->hasPermissionUpdate($this->input->post('lehrveranstaltung_id'), $this->input->post('student_uid'));
if (isError($result)) {
$this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN);
return $this->outputJson($result);
}
$this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrverantaltung ID', 'required|numeric');
$this->form_validation->set_rules('student_uid', 'Student UID', 'required');
$this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester Kurzbezeichnung', 'required');
$this->form_validation->set_rules('note', 'Note', 'required|numeric');
$post = [$_POST];
} else {
foreach ($_POST as $i => $data) {
$lvid = isset($data['lehrveranstaltung_id']) ? $data['lehrveranstaltung_id'] : null;
$uid = isset($data['student_uid']) ? $data['student_uid'] : null;
$result = $this->hasPermissionUpdate($lvid, $uid);
if (isError($result)) {
$this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN);
return $this->outputJson($result);
}
$this->form_validation->set_rules($i . '[lehrveranstaltung_id]', '#' . $i . ' Lehrverantaltung ID', 'required|numeric');
$this->form_validation->set_rules($i . '[student_uid]', '#' . $i . ' Student UID', 'required');
$this->form_validation->set_rules($i . '[studiensemester_kurzbz]', '#' . $i . ' Studiensemester Kurzbezeichnung', 'required');
$this->form_validation->set_rules($i . '[note]', '#' . $i . ' Note', 'required|numeric');
}
$post = $_POST;
}
if ($this->form_validation->run() == false) {
$this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST);
return $this->outputJsonError($this->form_validation->error_array());
}
$final_result = success();
$this->ZeugnisnoteModel->db->trans_start();
foreach ($post as $i => $data) {
$note = $data['note'];
unset($data['note']);
$result = $this->ZeugnisnoteModel->update($data, [
'note' => $note,
'benotungsdatum' => date('c'),
'updateamum' => date('c'),
'updatevon' => getAuthUID()
]);
if (isError($result)) {
$final_result = $result;
break;
}
}
$this->ZeugnisnoteModel->db->trans_complete();
if (isError($final_result)) {
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
}
$this->outputJson($final_result);
}
protected function hasPermissionUpdate($lehrveranstaltung_id, $student_uid)
{
// TODO(chris): error phrases!
if ($lehrveranstaltung_id === null || $student_uid === null)
return success();
$result = $this->StudentModel->load([$student_uid]);
if (isError($result))
return $result;
if (!hasData($result))
return error('Fehler beim Ermitteln des Studenten');
$student = current(getData($result));
if ($this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz))
return success();
if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz))
return success();
$result = $this->StudienplanModel->getAllOesForLv($lehrveranstaltung_id);
if (isError($result))
return $result;
$oes = getData($result) ?: [];
$result = $this->LehrveranstaltungModel->getStg($lehrveranstaltung_id);
if (isError($result))
return $result;
if (hasData($result))
$oes[] = current(getData($result));
foreach ($oes as $oe) {
if ($this->permissionlib->isBerechtigt('admin', 'suid', $oe->oe_kurzbz))
return success();
if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $oe->oe_kurzbz))
return success();
}
return error('Forbidden');
}
}
@@ -52,6 +52,7 @@ class OneTimeMessages extends JOB_Controller
JOIN public.tbl_prestudentstatus ps USING (prestudent_id)
JOIN public.tbl_studiengang s USING (studiengang_kz)
WHERE get_rolle_prestudent(ps.prestudent_id, NULL) = \'Wartender\'
AND ps.status_kurzbz = \'Wartender\'
AND ps.studiensemester_kurzbz = ?
AND ps.datum <= NOW() - \''.$days.' days\'::interval
AND s.typ = ?
@@ -821,7 +821,7 @@ class ReihungstestJob extends JOB_Controller
JOIN lehre.tbl_studienordnung USING (studienordnung_id)
JOIN PUBLIC.tbl_studiengang ON (tbl_studienordnung.studiengang_kz = tbl_studiengang.studiengang_kz)
WHERE get_rolle_prestudent (tbl_prestudent.prestudent_id, ?) IN ('Aufgenommener','Bewerber','Wartender','Abgewiesener')
AND studiensemester_kurzbz = ?
AND studiensemester_kurzbz = ?
AND tbl_studiengang.typ IN ('b', 'm')
)
SELECT * FROM prst
@@ -861,7 +861,7 @@ class ReihungstestJob extends JOB_Controller
{
// Alle niedrigeren Prios laden
$qryNiedrPrios = "
SELECT DISTINCT
SELECT DISTINCT ON(prestudent_id)
get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') AS laststatus,
tbl_studienplan.orgform_kurzbz,
tbl_person.nachname,
@@ -876,11 +876,11 @@ class ReihungstestJob extends JOB_Controller
JOIN PUBLIC.tbl_studiengang ON (tbl_prestudent.studiengang_kz = tbl_studiengang.studiengang_kz)
WHERE tbl_prestudent.person_id = ".$row_ps->person_id."
AND tbl_prestudent.prestudent_id != ".$row_ps->prestudent_id."
AND get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') IN ('Aufgenommener','Bewerber','Wartender')
AND get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') IN ('Aufgenommener','Bewerber','Wartender', 'Student')
AND studiensemester_kurzbz = '".$row_ps->studiensemester_kurzbz."'
AND tbl_studiengang.typ IN ('b', 'm')
AND priorisierung > ".$row_ps->priorisierung."
ORDER BY studiengang_kz, laststatus
ORDER BY prestudent_id, studiengang_kz, laststatus, tbl_prestudentstatus.datum DESC
";
// Wenn der letzte Status "Aufgenommener" ist, alle niedrigeren Prios auf "Abgewiesen" setzen
@@ -894,12 +894,22 @@ class ReihungstestJob extends JOB_Controller
{
foreach ($resultNiedrPrios->retval as $rowNiedrPrios)
{
// nur Info wenn aufgenommen oder master
if ($rowNiedrPrios->laststatus == 'Aufgenommener' || $rowNiedrPrios->studiengang_typ == 'm')
// nur Info wenn aufgenommen/student oder master
if ($rowNiedrPrios->laststatus == 'Aufgenommener' || $rowNiedrPrios->laststatus == 'Student' || $rowNiedrPrios->studiengang_typ == 'm')
{
// Mail zur Info an Assistenz schicken, dass in höherer Prio aufgenommen wurde
$mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][]
= $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')';
if ($rowNiedrPrios->laststatus == 'Aufgenommener')
{
// Mail zur Info an Assistenz schicken, dass in höherer Prio aufgenommen wurde
$mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][]
= $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')';
}
else if ($rowNiedrPrios->laststatus == 'Student')
{
$mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['StudentHoeherePrio'][]
= $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')';
}
}
elseif ($rowNiedrPrios->laststatus == 'Bewerber' && $row_ps->prestudenstatus_datum > $rowNiedrPrios->datum)
{
@@ -966,7 +976,7 @@ class ReihungstestJob extends JOB_Controller
FROM public.tbl_konto
WHERE person_id = " . $row_ps->person_id . "
AND studiensemester_kurzbz = '" . $row_ps->studiensemester_kurzbz . "'
AND buchungstyp_kurzbz = 'StudiengebuehrAnzahlung'";
AND buchungstyp_kurzbz IN ('StudiengebuehrAnzahlung','KautionDrittStaat')";
$resultKautionExists = $db->execReadOnlyQuery($qryKautionExists);
if (hasdata($resultKautionExists))
@@ -1061,6 +1071,20 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '</tbody></table>';
$content = true;
}
if (isset($value['StudentHoeherePrio']) && !isEmptyArray($value['StudentHoeherePrio']))
{
$mailcontent .= '<p style="font-family: verdana, sans-serif;">
Folgende Studenten wurden in einem höher priorisierten Studiengang aufgenommen:</p>';
$mailcontent .= '<table style="border-collapse: collapse; border: 1px solid grey;">';
$mailcontent .= ' <tbody>';
sort($value['StudentHoeherePrio']);
foreach ($value['StudentHoeherePrio'] AS $key=>$bewerber)
{
$mailcontent .= '<tr><td style="font-family: verdana, sans-serif; border: 1px solid grey; padding: 3px">'.$bewerber.'</td></tr>';
}
$mailcontent .= '</tbody></table>';
$content = true;
}
if (isset($value['AbgewiesenHoeherePrio']) && !isEmptyArray($value['AbgewiesenHoeherePrio']))
{
$mailcontent .= '<p style="font-family: verdana, sans-serif;">
+1
View File
@@ -309,6 +309,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
}
//update(1) loading all dms-entries with this notiz_id
$dms_id_arr = [];
$this->load->model('person/Notizdokument_model', 'NotizdokumentModel');
$this->NotizdokumentModel->addJoin('campus.tbl_dms_version', 'dms_id');
+32 -7
View File
@@ -33,22 +33,30 @@ class Tag_Controller extends FHCAPI_Controller
public function getTag()
{
$language = $this->_getLanguageIndex();
$id = $this->input->get('id');
$this->NotizModel->addSelect(
'tbl_notiz.titel,
"tbl_notiz.titel,
tbl_notiz.text,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $language. " as bezeichnung,
tbl_notiz.notiz_id,
tbl_notiz_typ.style,
tbl_notiz.erledigt as done,
tbl_notiz.insertamum,
tbl_notiz.updateamum,
tbl_notiz.insertvon,
tbl_notiz.updatevon
'
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter
"
);
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
$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_benutzer bearbeiterbenutzer', 'tbl_notiz.verfasser_uid = bearbeiterbenutzer.uid', 'LEFT');
$this->NotizModel->addJoin('public.tbl_person bearbeiterperson', 'bearbeiterbenutzer.person_id = bearbeiterperson.person_id', 'LEFT');
$notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id));
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array());
@@ -134,7 +142,11 @@ class Tag_Controller extends FHCAPI_Controller
{
$postData = $this->getPostJson();
$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'),
'updatevon' => $this->_uid,
'bearbeiter_uid' => $this->_uid,
)
);
$this->terminateWithSuccess($updateData);
}
@@ -142,7 +154,11 @@ class Tag_Controller extends FHCAPI_Controller
{
$postData = $this->getPostJson();
$updateData = $this->NotizModel->update(array('notiz_id' => $postData->id),
array('erledigt' => !$postData->done)
array('erledigt' => !$postData->done,
'updateamum' => date('Y-m-d H:i:s'),
'updatevon' => $this->_uid,
'bearbeiter_uid' => $this->_uid,
)
);
$this->terminateWithSuccess($updateData);
@@ -183,5 +199,14 @@ class Tag_Controller extends FHCAPI_Controller
show_error('User authentification failed');
}
private function _getLanguageIndex()
{
$this->load->model('system/Sprache_model', 'SpracheModel');
$this->SpracheModel->addSelect('index');
$result = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage()));
return hasData($result) ? getData($result)[0]->index : 1;
}
}
+17 -7
View File
@@ -87,18 +87,28 @@ function generateCSSsInclude($CSSs)
*/
function generateJSDataStorageObject($indexPage, $calledPath, $calledMethod)
{
$ci =& get_instance();
$ci->load->model('system/Sprache_model','SpracheModel');
$server_language = getData($ci->SpracheModel->loadWhere(['content' => true]));
$server_language = array_map(function($language){
return ['sprache'=>$language->sprache, 'LC_Time'=>$language->locale, 'bezeichnung'=>$language->bezeichnung[$language->index-1]];
}, $server_language);
$user_language = getUserLanguage();
$FHC_JS_DATA_STORAGE_OBJECT = array(
'app_root' => APP_ROOT,
'ci_router' => $indexPage,
'called_path' => $calledPath,
'called_method' => $calledMethod,
'server_languages' => $server_language,
'user_language' => $user_language,
'timezone' => date_default_timezone_get(),
);
$toPrint = "\n";
$toPrint .= '<script type="text/javascript">';
$toPrint .= '
var FHC_JS_DATA_STORAGE_OBJECT = {
app_root: "'.APP_ROOT.'",
ci_router: "'.$indexPage.'",
called_path: "'.$calledPath.'",
called_method: "'.$calledMethod.'",
user_language: "'.$user_language.'"
};';
var FHC_JS_DATA_STORAGE_OBJECT = '.json_encode($FHC_JS_DATA_STORAGE_OBJECT).';';
$toPrint .= "\n";
$toPrint .= '</script>';
$toPrint .= "\n\n";
+18 -6
View File
@@ -43,7 +43,7 @@ class CmsLib
* @param string $sprache
* @param boolean $sichtbar
*
* @return void
* @return stdClass
*/
public function getContent($content_id, $version = null, $sprache = null, $sichtbar = true)
{
@@ -105,7 +105,19 @@ class CmsLib
if($content->titel){
$betreff = $content->titel;
}else{
//DomDocument getElementsByTagName returns a DomNodeList
$betreff = $XML->getElementsByTagName('betreff');
//check if any betreff was found and if it is not empty
if($betreff->length > 0 && !empty($betreff->item(0)->nodeValue))
{
//DomNodeList item() return a DomNode, property nodeValue contains the value of the node
$betreff = $betreff->item(0)->nodeValue;
}
else
{
return error('no betreff found for the content');
}
}
$xsltemplate = new DOMDocument();
@@ -221,7 +233,7 @@ class CmsLib
*
* @return void
*/
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true, $page = 1, $page_size = 10)
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true, $page = 1, $page_size = 10, $sprache)
{
$this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
list($studiengang_kz, $semester) = $this->getStgAndSem($studiengang_kz, $semester);
@@ -230,13 +242,13 @@ class CmsLib
$xml = '<?xml version="1.0" encoding="UTF-8"?><content>';
$this->ci->load->model('content/News_model', 'NewsModel');
$news = $this->ci->NewsModel->getNewsWithContent(getSprache(), $studiengang_kz, $semester, null, $sichtbar, 0, $page, $page_size, $all, $mischen);
$news = $this->ci->NewsModel->getNewsWithContent($sprache, $studiengang_kz, $semester, null, $sichtbar, 0, $page, $page_size, $all, $mischen);
if (isError($news))
return $news;
$news = getData($news);
//var_dump($news->maxPageCount);
foreach ($news as $newsobj) {
if ($studiengang_kz && $edit && !$newsobj->studiengang_kz)
continue;
@@ -247,7 +259,7 @@ class CmsLib
$xml .= "<newswrapper>" . $newsobj->content . $datum . $id . "</newswrapper>";
}
if ($studiengang_kz != 0) {
/* if ($studiengang_kz != 0) {
$stg_obj = $this->ci->StudiengangModel->load($studiengang_kz);
if (isError($stg_obj))
return $stg_obj;
@@ -262,7 +274,7 @@ class CmsLib
}
$xml .= '<studiengang_bezeichnung><![CDATA[' . $stg_obj->bezeichnung . ']]></studiengang_bezeichnung>';
}
}
} */
if ($titel != '') {
$xml .= '<news_titel>' . $titel . '</news_titel>';
+714
View File
@@ -0,0 +1,714 @@
<?php
/* Copyright (C) 2024 fhcomplete.net
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
use stdClass as stdClass;
use DOMDocument as DOMDocument;
use XSLTProcessor as XSLTProcessor;
use SimpleXMLElement as SimpleXMLElement;
/**
* This library replaces the old document_export.class except for the convert
* function which is located in the DocumentLib library.
*
* The usage differs a little bit from the old library:
* In the old library you had to call create() then some optional function
* for adding data (addDataArray()/addDataXML()/addDataURL()/setFilename()),
* modifiing said data (sign()/setXMLTag_archivierbar()) or adding
* images (addImage()) and then call output() and close().
* Now the create, output and close functions are combined into one function and adding data and images is done via parameters.
* There are now two functions getContent() and showContent() where showContent() equals to output(false) and getContent equals to output(true)
* Instead of calling addDataArray, addDataXML or addDataURL just call
* getDataArray, getDataXML or getDataURL respectevily and use the return
* value as $xml_data parameter in the showContent and getContent calls.
* Instead of calling addImages just create an array and pass it as $images
* parameter to the showContent/getContent function.
* The old setFilename() function is now a parameter in showContent(). It is
* not needed in getContent() since that function does not do anything that
* requires a filename.
* To get/show a signed document just pass a valid uid as $sign_user
* parameter.
*
* Example:
* Old:
* $doc = new document_export($vorlage->vorlage_kurzbz, $oe_kurzbz, $version);
* $doc->setFilename($filename);
* $doc->addDataXML($data);
* $doc->addImage($imagepath, $imagename, $imagecontenttype);
* $doc->create($outputformat);
* $doc->output(true);
* $doc->close();
*
* New:
* $xml_data = $this->documentexportlib->getDataXML($data);
* $images = [[
* 'path' => $imagepath,
* 'name' => $imagename,
* 'contenttype' => $imagecontenttype
* ]];
* $this->documentexportlib->showContent(
* $filename,
* $vorlage,
* $xml_data,
* $oe_kurzbz,
* $version,
* $outputformat,
* null,
* null,
* $images
* );
*/
class DocumentExportLib
{
private $unoconv_version;
/**
* Constructor
*/
public function __construct()
{
// Gets CI instance
$this->ci =& get_instance();
// Load Phrases
$this->ci->load->library('PhrasesLib', ['document_export', null], 'documentExportPhrases');
// Which document converter has to be used
if (defined('DOCSBOX_ENABLED') && DOCSBOX_ENABLED === true)
{
// Use docsbox!!
}
else
{
exec('unoconv --version', $ret_arr);
if(isset($ret_arr[0]))
{
$hlp = explode(' ', $ret_arr[0]);
if(isset($hlp[1]))
{
$this->unoconv_version = $hlp[1];
}
else
show_error($this->ci->documentExportPhrases->t("document_export", "error_unoconv_version"));
}
else
show_error($this->ci->documentExportPhrases->t("document_export", "error_unoconv"));
}
}
/**
* Laedt die XML Daten fuer die XSL Transformation anhand eines Arrays
*
* @param array $data Array mit Daten
* @param string $root Bezeichnung des Root Nodes
*
* @return DOMDocument
*/
public function getDataArray($data, $root)
{
$xml_data = new DOMDocument();
$xml_data->loadXML($this->convertArrayToXML($data, $root));
return $xml_data;
}
/**
* XML Daten fuer die XSL Transformation
*
* @param string $xml
*
* @return DOMDocument
*/
public function getDataXML($xml)
{
$xml_data = new DOMDocument();
$xml_data->loadXML($xml);
return $xml_data;
}
/**
* URL zu XML Datei die fuer XSLTransformation verwendet werden soll
*
* @param string $xml URL to XML
* @param string $params GET parameter
*
* @return stdClass
*/
public function getDataURL($xml, $params)
{
$xml_found = false;
$aktive_addons = array_filter(array_map('trim', explode(";", ACTIVE_ADDONS)));
foreach($aktive_addons as $addon) {
$xmlfile = DOC_ROOT . 'addons/' . $addon . '/rdf/' . $xml;
if (file_exists($xmlfile)) {
$xml_found = true;
$xml_url = XML_ROOT . '../addons/' . $addon . '/rdf/' . $xml . '?' . $params;
break;
}
}
if (!$xml_found)
$xml_url = XML_ROOT . $xml . '?' . $params;
// Load the XML source
$xml_data = new DOMDocument;
if (!$xml_data->load($xml_url))
return error($this->ci->documentExportPhrases->t("document_export", "error_xml_load", [
"url" => $xml_url,
"xml" => $xml,
"params" => $params
]));
return success($xml_data);
}
/**
* Adds a XML Tag for signatur to the document
*
* @param DomDocument $xml_data
*
* @return void
*/
protected function addSignToData($xml_data)
{
$signblock = $xml_data->createElement("signed", "true");
$xml_data->documentElement->appendChild($signblock);
}
/**
* Adds a XML Tag for archive to the document
*
* @param DomDocument $xml_data
*
* @return void
*/
public function addArchiveToData($xml_data)
{
$archiv = $xml_data->createElement("archivierbar", "true");
$xml_data->documentElement->appendChild($archiv);
}
/**
* Get the contents of a Document
*
* @param stdClass $vorlage A db entry from tbl_vorlage
* @param DomDocument $xml_data
* @param string $oe_kurzbz
* @param integer|null $version (optional)
* @param string $outputformat (optional)
* @param string $sign_user (optional) Must be a valid uid
* @param string $sign_profile (optional) Signatureprofile for signing
* @param array $images (optional) Each element should have a property path, name & contenttype which are all strings
*
* @return stdClass
*/
public function getContent(
$vorlage,
$xml_data,
$oe_kurzbz,
$version = null,
$outputformat = null,
$sign_user = null,
$sign_profile = null,
$images = []
) {
$source_folder = getcwd();
$temp_folder = sys_get_temp_dir() . '/fhcunoconv-' . uniqid();
$outputformat = $this->getDefaultOutputFormat($outputformat, $vorlage->mimetype);
$result = $this->createAndSignContent(
$temp_folder,
$outputformat,
$vorlage,
$oe_kurzbz,
$version,
$xml_data,
$images,
$sign_user,
$sign_profile
);
if (isError($result)) {
$this->close($temp_folder, $source_folder);
return $result;
}
$temp_filename = getData($result);
$fsize = filesize($temp_filename);
$handle = fopen($temp_filename, 'r');
if (!$handle)
return error($this->ci->documentExportPhrases->t("document_export", "error_file_load"));
$result = fread($handle, $fsize);
fclose($handle);
$this->close($temp_folder, $source_folder);
return success($result);
}
/**
* Sets the headers and displays the Document.
* On failure the exit() function will be called
*
* @param string $filename
* @param stdClass $vorlage A db entry from tbl_vorlage
* @param DomDocument $xml_data
* @param string $oe_kurzbz
* @param integer|null $version (optional)
* @param string $outputformat (optional)
* @param string $sign_user (optional) Must be a valid uid
* @param string $sign_profile (optional) Signatureprofile for signing
* @param array $images (optional) Each element should have a property path, name & contenttype which are all strings
*
* @return void
*/
public function showContent(
$filename,
$vorlage,
$xml_data,
$oe_kurzbz,
$version = null,
$outputformat = null,
$sign_user = null,
$sign_profile = null,
$images = []
) {
$source_folder = getcwd();
$temp_folder = sys_get_temp_dir() . '/fhcunoconv-' . uniqid();
$outputformat = $this->getDefaultOutputFormat($outputformat, $vorlage->mimetype);
$result = $this->createAndSignContent(
$temp_folder,
$outputformat,
$vorlage,
$oe_kurzbz,
$version,
$xml_data,
$images,
$sign_user,
$sign_profile
);
if (isError($result)) {
$this->close($temp_folder, $source_folder);
exit(getError($result));
}
$temp_filename = getData($result);
$fsize = filesize($temp_filename);
$handle = fopen($temp_filename, 'r');
if (!$handle) {
$this->close($temp_folder, $source_folder);
exit($this->ci->documentExportPhrases->t("document_export", "error_file_load"));
}
if (headers_sent()) {
$this->close($temp_folder, $source_folder);
exit($this->ci->documentExportPhrases->t("document_export", "error_headers"));
}
switch ($outputformat) {
case 'pdf':
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . $filename . '.pdf"');
header('Content-Length: ' . $fsize);
break;
case 'doc':
header('Content-type: application/vnd.ms-word');
header('Content-Disposition: attachment; filename="' . $filename . '.doc"');
header('Content-Length: ' . $fsize);
break;
case 'odt':
header('Content-type: application/vnd.oasis.opendocument.text');
header('Content-Disposition: attachment; filename="' . $filename . '.odt"');
header('Content-Length: ' . $fsize);
break;
default:
$this->close($temp_folder, $source_folder);
exit($this->ci->documentExportPhrases->t("document_export", "error_outputformat_missing"));
}
while (!feof($handle)) {
echo fread($handle, 8192);
}
fclose($handle);
$this->close($temp_folder, $source_folder);
}
/**
* Helper function for getContent and showContent.
* Creates the temp folder and calls create and sign functions.
*
* @param string $temp_folder
* @param string $outputformat
* @param stdClass $vorlage
* @param string $oe_kurzbz
* @param integer $version
* @param DomDocument $xml_data
* @param array $images Each element should have a property path, name and contenttype which are all strings
* @param string $sign_user Must be a valid uid
* @param string $sign_profile Signatureprofile for signing
*
* @return stdClass
*/
protected function createAndSignContent(
$temp_folder,
$outputformat,
$vorlage,
$oe_kurzbz,
$version,
$xml_data,
$images,
$sign_user,
$sign_profile
) {
mkdir($temp_folder);
chdir($temp_folder);
$this->ci->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
$result = $this->ci->VorlagestudiengangModel->getCurrent($vorlage->vorlage_kurzbz, $oe_kurzbz, $version);
if (isError($result))
return $result;
if (!hasData($result))
return error($this->ci->documentExportPhrases->t("document_export", "error_template_missing"));
$vorlage_stg = current(getData($result));
foreach ($vorlage_stg as $k => $v)
$vorlage->$k = $v;
$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);
$result = $this->sign($temp_folder, $temp_filename, $outputformat, $sign_user, $sign_profile);
if (isError($result))
return $result;
$temp_filename = getData($result);
}
return success($temp_filename);
}
/**
* Helper function for createAndSignContent.
* Creates the files in the temp folder.
*
* @param string $temp_folder
* @param string $outputformat
* @param stdClass $vorlage
* @param DomDocument $xml_data
* @param array $images Each element should have a property path, name and contenttype which are all strings
*
* @return stdClass
*/
protected function create($temp_folder, $outputformat, $vorlage, $xml_data, $images)
{
$content_xsl = new DOMDocument();
if (!$content_xsl->loadXML($vorlage->text))
return error($this->ci->documentExportPhrases->t("document_export", "error_xsl_load"));
$proc = new XSLTProcessor();
$proc->importStyleSheet($content_xsl);
$contentbuffer = $proc->transformToXml($xml_data);
file_put_contents($temp_folder . '/content.xml', $contentbuffer);
if ($xml_data->firstChild->tagName == 'error')
return error($xml_data->firstChild->textContent);
// styles.xml erstellen
if ($vorlage->style) {
$styles_xsl = new DOMDocument();
if (!$styles_xsl->loadXML($vorlage->style))
return error($this->ci->documentExportPhrases->t("document_export", "error_styles_load"));
$style_proc = new XSLTProcessor();
$style_proc->importStyleSheet($styles_xsl);
$stylesbuffer = $style_proc->transformToXml($xml_data);
file_put_contents($temp_folder . '/styles.xml', $stylesbuffer);
}
// 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;
if (file_exists($zipfile)) {
$vorlage_found = true;
break;
}
}
if (!$vorlage_found)
$zipfile = DOC_ROOT . 'system/vorlage_zip/' . $vorlage_filename;
$tempname_zip = $temp_folder . '/out.zip';
if (!copy($zipfile, $tempname_zip))
return error($this->ci->documentExportPhrases->t("document_export", "error_file_copy"));
exec("zip $tempname_zip content.xml");
if (!is_null($styles_xsl))
exec("zip $tempname_zip styles.xml");
// bilder hinzufuegen
if (count($images) > 0)
{
// Unterordner fuer die Bilder erstellen
mkdir('Pictures');
// Manifest Datei holen
exec('unzip ' . $tempname_zip . ' META-INF/manifest.xml');
// Bild zur Manifest Datei hinzufuegen
$manifest = file_get_contents('META-INF/manifest.xml');
$manifest_xml = new DOMDocument;
if (!$manifest_xml->loadXML($manifest))
return error($this->ci->documentExportPhrases->t("document_export", "error_manifest"));
//root-node holen
$root = $manifest_xml->getElementsByTagName('manifest')->item(0);
foreach ($images as $bild) {
copy($bild['path'], 'Pictures/' . $bild['name']);
//Neues Element unterhalb des Root Nodes anlegen
$node = $manifest_xml->createElement("manifest:file-entry");
$node->setAttribute("manifest:full-path", 'Pictures/' . $bild['name']);
$node->setAttribute("manifest:media-type", $bild['contenttype']);
$root->appendChild($node);
}
$out = $manifest_xml->saveXML();
//geaenderte Manifest Datei speichern und wieder ins Zip packen
file_put_contents('META-INF/manifest.xml', $out);
exec('zip ' . $tempname_zip . ' META-INF/*');
// Bilder zum ZIP-File hinzufuegen
exec('zip ' . $tempname_zip . ' Pictures/*');
}
clearstatcache();
switch ($outputformat) {
case 'pdf':
case 'doc':
$ret = 0;
$temp_filename = $temp_folder . '/out.' . $outputformat;
if (defined('DOCSBOX_ENABLED') && DOCSBOX_ENABLED === true) {
// Use docsbox
$this->ci->load->library("DocsboxLib");
$docboxlib = get_class($this->ci->docboxlib);
$ret = $docboxlib::convert($tempname_zip, $temp_filename, $outputformat);
} else {
// Use unoconv
// Unoconv Version 0.6 hat eine Bug wodurch die Berechtigungen des PDF/Doc nicht korrekt gesetzt
// werden. Deshalb wird dies hier speziell behandelt.
// Die 2. Variante hat den Vorteil dass hier eine bessere Fehlerbehandlung moeglich ist
if ($this->unoconv_version == '0.6')
$command = 'unoconv -e IsSkipEmptyPages=false -f ' . $outputformat . ' %2$s > %1$s';
else
$command = 'unoconv -e IsSkipEmptyPages=false -f ' . $outputformat . ' --output %s %s 2>&1';
$command = sprintf($command, $temp_filename, $tempname_zip);
exec($command, $out, $ret);
}
if ($ret)
return error($this->ci->documentExportPhrases->t("document_export", "error_conv_timeout"));
break;
case 'odt':
default:
$temp_filename = $tempname_zip;
}
return success($temp_filename);
}
/**
* Helper function for createAndSignContent.
* Signs the main file in the temp folder.
*
* @param string $temp_folder
* @param string $temp_filename
* @param string $outputformat
* @param string $user Must be a valid uid
* @param string $profile Signatureprofile for signing
*
* @return stdClass
*/
protected function sign($temp_folder, $temp_filename, $outputformat, $user, $profile)
{
if ($outputformat != 'pdf')
return error($this->ci->documentExportPhrases->t("document_export", "error_sign_pdf"));
// Load the File
$file_data = file_get_contents($temp_filename);
$data = new stdClass();
$data->document = base64_encode($file_data);
// Signatur Profil
if (!is_null($profile))
$data->profile = $profile;
else
$data->profile = SIGNATUR_DEFAULT_PROFILE;
// Username des Endusers der die Signatur angefordert hat
$data->user = $user;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, SIGNATUR_URL . '/' . SIGNATUR_SIGN_API);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 7);
curl_setopt($ch, CURLOPT_USERAGENT, "FH-Complete");
// SSL Zertifikatsprüfung deaktivieren
// Besser ist es das Zertifikat am Server zu installieren!
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$data_string = json_encode($data, JSON_FORCE_OBJECT);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length:' . mb_strlen($data_string),
'Authorization: Basic ' . base64_encode(SIGNATUR_USER . ":" . SIGNATUR_PASSWORD)
]);
$result = curl_exec($ch);
if (curl_errno($ch)) {
curl_close($ch);
return error($this->ci->documentExportPhrases->t("document_export", "error_sign_timeout"));
}
curl_close($ch);
$resultdata = json_decode($result);
// If it is success
if (isset($resultdata->error) && $resultdata->error == 0) {
$signed_filename = $temp_folder . '/signed.pdf';
file_put_contents($signed_filename, base64_decode($resultdata->retval));
return success($signed_filename);
}
// otherwise if it is an error
return error($resultdata->retval ?? $this->ci->documentExportPhrases->t("global", "unknown_error", ["error" => $result]));
}
/**
* Deletes all files in the $temp_folder and changes back to the source_folder
*
* @param string $temp_folder
* @param string $source_folder
*
* @return void
*/
protected function close($temp_folder, $source_folder)
{
$files = glob($temp_folder . '/*'); // get all file names
foreach ($files as $file)
if (is_file($file))
unlink($file);
chdir($source_folder);
rmdir($temp_folder);
}
/**
* Convert an array to XML
*
* @param array $data
* @param string $root
* @param SimpleXMLElement $xml_data
*
* @return string|boolean
*/
private function convertArrayToXML($data, $root = null, $xml_data = null)
{
$_xml_data = $xml_data;
if ($_xml_data === null)
$_xml_data = new SimpleXMLElement($root !== null ? '<' . $root . ' />' : '<root/>');
foreach ($data as $key => $value) {
if (is_array($value)) {
if (is_numeric($key)) {
$key = 'item' . $key; // dealing with <0/>..<n/> issues
$this->convertArrayToXML($value, null, $_xml_data);
} else {
$subnode = $_xml_data->addChild($key);
$this->convertArrayToXML($value, null, $subnode);
}
} else {
// Remove UTF8 Control Characters (breaking XML)
$value = preg_replace('/[\x00-\x1F\x7F]/u', '', $value);
$_xml_data->addChild((string)$key, htmlspecialchars("$value"));
}
}
return $_xml_data->asXML();
}
/**
* Get default outputformat from mimetype if its not set
*
* @param string $outputformat
* @param string $mimetype
*
* @return string
*/
private function getDefaultOutputFormat($outputformat, $mimetype)
{
if ($outputformat)
return $outputformat;
if ($mimetype == 'application/vnd.oasis.opendocument.spreadsheet')
return 'ods';
if ($mimetype == 'application/vnd.oasis.opendocument.text')
return 'odt';
return 'pdf';
}
}
+10 -10
View File
@@ -371,21 +371,21 @@ class FilterCmptLib
foreach ($filterFields as $filterField)
{
// If not an empty array
if ($filterField != null)
if (!isEmptyArray($filterField))
{
//
if (isset($filterField->name) && isset($filterField->operation) && isset($filterField->condition)
&& !isEmptyString($filterField->name) && !isEmptyString($filterField->operation)
&& !isEmptyString($filterField->condition))
if (isset($filterField['name']) && isset($filterField['operation']) && isset($filterField['condition'])
&& !isEmptyString($filterField['name']) && !isEmptyString($filterField['operation'])
&& !isEmptyString((string)$filterField['condition']))
{
// Fine
$filter = new stdClass();
$filter->name = $filterField->name;
$filter->operation = $filterField->operation;
$filter->condition = $filterField->condition;
if (isset($filterField->option) && !isEmptyString($filterField->option))
$filter->name = $filterField['name'];
$filter->operation = $filterField['operation'];
$filter->condition = $filterField['condition'];
if (isset($filterField['option']) && !isEmptyString($filterField['option']))
{
$filter->option = $filterField->option;
$filter->option = $filterField['option'];
}
else
{
@@ -1173,4 +1173,4 @@ class FilterCmptLib
return $filterName;
}
}
}
+1 -1
View File
@@ -109,7 +109,7 @@ class PermissionLib
foreach($oe_kurzbz as $value)
{
$results[] = $this->isBerechtigt($berechtigung_kurzbz, $value, $art, $kostenstelle_id);
$results[] = $this->isBerechtigt($berechtigung_kurzbz, $art, $value, $kostenstelle_id);
}
if(!in_array(true, $results))
+23
View File
@@ -44,4 +44,27 @@ class Bisio_model extends DB_Model
else
return success("Bisio not found");
}
/**
* checks, if an (extension) table exists to avoid later errors
* @param String $schema like 'extension'
* @param String $table like 'tbl_mo_bisiozuordnung'
* @return boolean
*/
public function tableExists($schema, $table)
{
$params = array($schema, $table);
$qry = "SELECT
1
FROM
information_schema.role_table_grants
WHERE
table_schema = ?
AND table_name = ?";
$result = $this->execQuery($qry, $params);
return $result;
}
}
@@ -0,0 +1,14 @@
<?php
class Bisstandort_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'bis.tbl_bisstandort';
$this->pk = 'standort_code';
}
}
+2 -2
View File
@@ -21,7 +21,7 @@ class News_model extends DB_Model
{
$this->addJoin("campus.tbl_content","content_id");
return $this->execReadOnlyQuery('
SELECT *
SELECT *, TO_CHAR(campus.tbl_news.datum, ?) as datumformatted
FROM campus.tbl_news
JOIN campus.tbl_content content ON content.content_id = campus.tbl_news.content_id
WHERE
@@ -29,7 +29,7 @@ class News_model extends DB_Model
datum <= NOW() AND (datum_bis IS NULL OR datum_bis >= now()::date)
ORDER BY datum DESC
LIMIT ' . $this->escape($limit)
);
, ['DD/MM/YYYY']);
}
public function getNewsContentIDs($limit=10){
@@ -501,17 +501,14 @@ class Prestudentstatus_model extends DB_Model
$this->addSelect('tbl_prestudentstatus.studiensemester_kurzbz');
$this->addSelect('tbl_prestudentstatus.ausbildungssemester');
$this->addSelect('tbl_prestudentstatus.datum');
$this->addSelect("TO_CHAR(tbl_prestudentstatus.datum::timestamp, 'DD.MM.YYYY') AS format_datum");
$this->addSelect('tbl_prestudentstatus.insertamum');
$this->addSelect('tbl_prestudentstatus.insertvon');
$this->addSelect('tbl_prestudentstatus.updateamum');
$this->addSelect('tbl_prestudentstatus.updatevon');
$this->addSelect('tbl_prestudentstatus.orgform_kurzbz');
$this->addSelect('tbl_prestudentstatus.bestaetigtam');
$this->addSelect("TO_CHAR(tbl_prestudentstatus.bestaetigtam::timestamp, 'DD.MM.YYYY') AS format_bestaetigtam");
$this->addSelect('tbl_prestudentstatus.bestaetigtvon');
$this->addSelect('tbl_prestudentstatus.bewerbung_abgeschicktamum');
$this->addSelect("TO_CHAR(tbl_prestudentstatus.bewerbung_abgeschicktamum::timestamp, 'DD.MM.YYYY') AS format_bewerbung_abgeschicktamum");
$this->addSelect('tbl_prestudentstatus.anmerkung');
$this->addSelect('plan.studienplan_id');
$this->addSelect('plan.bezeichnung');
@@ -113,4 +113,61 @@ class Abschlusspruefung_model extends DB_Model
return success($abschlusspruefungdata);
}
/**
* Gets data of an Abschlusspruefung
* @param $student_uid
* @return object
*/
public function getAbschlusspruefungForPrestudent($student_uid)
{
$qry = "
SELECT
exam.*,
CONCAT(
person_pruefer1.nachname || ' ',
person_pruefer1.vorname,
COALESCE(' ' || person_pruefer1.titelpre)
) AS person_pruefer1,
CONCAT(
person_pruefer2.nachname || ' ',
person_pruefer2.vorname,
COALESCE(' ' || person_pruefer2.titelpre)
) AS person_pruefer2,
CONCAT(
person_pruefer3.nachname || ' ',
person_pruefer3.vorname,
COALESCE(' ' || person_pruefer3.titelpre)
) AS person_pruefer3,
CONCAT(
person_vorsitzender.nachname || ' ',
person_vorsitzender.vorname,
COALESCE(' ' || person_vorsitzender.titelpre)
) AS person_vorsitzender,
datum,
freigabedatum,
sponsion,
uhrzeit,
person_pruefer1.nachname as p1_nachname,
person_pruefer2.nachname as p2_nachname,
person_pruefer3.nachname as p3_nachname,
person_vorsitzender.nachname as vorsitz_nachname,
beurteilung.bezeichnung as beurteilung_bezeichnung,
antritt.bezeichnung as antritt_bezeichnung
FROM
lehre.tbl_abschlusspruefung exam
JOIN lehre.tbl_pruefungstyp USING (pruefungstyp_kurzbz)
LEFT JOIN public.tbl_benutzer ben_vorsitzender ON (ben_vorsitzender.uid = vorsitz)
LEFT JOIN public.tbl_person person_vorsitzender ON (ben_vorsitzender.person_id = person_vorsitzender.person_id)
LEFT JOIN public.tbl_person person_pruefer1 ON (person_pruefer1.person_id = pruefer1)
LEFT JOIN public.tbl_person person_pruefer2 ON (person_pruefer2.person_id = pruefer2)
LEFT JOIN public.tbl_person person_pruefer3 ON (person_pruefer3.person_id = pruefer3)
LEFT JOIN lehre.tbl_abschlussbeurteilung beurteilung USING (abschlussbeurteilung_kurzbz)
LEFT JOIN lehre.tbl_abschlusspruefung_antritt antritt USING (pruefungsantritt_kurzbz)
WHERE student_uid = ?
ORDER BY exam.datum DESC
";
return $this->execQuery($qry, array('student_uid' => $student_uid));
}
}
@@ -0,0 +1,14 @@
<?php
class Akadgrad_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'lehre.tbl_akadgrad';
$this->pk = 'akadgrad_id';
}
}
@@ -11,4 +11,193 @@ class Anwesenheit_model extends DB_Model
$this->dbTable = 'campus.tbl_anwesenheit';
$this->pk = 'anwesenheit_id';
}
/**
* Laedt die Anwesenheiten in Prozent von Studierenden bei Lehrveranstaltungen
* Wenn die StudentUID uebergeben wird, werden alle Lehrveranstaltungen zu denen der Studierenden zugeteilt ist inkl Prozent der Anwesenheit
* Wenn die LehrveranstaltungID uebergeben wird, werden alle Studierenden geholt die zugeteilt sind inkl Prozent der Anwesenheit
* Es werden pro Student die Anwesenheiten berechnet aufgrund der Lehreinheit zu der sie zugeordnet sind
*
* @param string $studiensemester_kurzbz
* @param string|null (optional) $student_uid
* @param integer|null (optional) $lehrveranstaltung_id
*
* @return stdClass
*/
public function loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid = null, $lehrveranstaltung_id = null)
{
$this->addSelect("vorname");
$this->addSelect("nachname");
$this->addSelect("wahlname");
$this->addSelect("lehrveranstaltung_id");
$this->addSelect("bezeichnung");
$this->addSelect("gruppe");
$this->addSelect("student_uid AS uid");
$this->addSelect("COUNT(stundenplan_id) AS gesamtstunden");
$this->addSelect("COALESCE(anwesend.summe, 0) AS anwesend");
$this->addSelect("COALESCE(nichtanwesend.summe, 0) AS nichtanwesend");
$this->addSelect("COALESCE(anwesend.summe, 0) + COALESCE(nichtanwesend.summe, 0) AS erfassteanwesenheit");
$this->addSelect("CASE
WHEN COUNT(stundenplan_id) = 0 OR COALESCE(anwesend.summe, 0) + COALESCE(nichtanwesend.summe, 0) = 0
THEN 100
ELSE TRUNC(100-(100/COUNT(stundenplan_id)*COALESCE(nichtanwesend.summe, 0)), 2)
END AS prozent");
$this->db->join("(
SELECT
semester::text AS gruppe,
public.tbl_studentlehrverband.studiensemester_kurzbz,
student_uid,
studiengang_kz
FROM public.tbl_studentlehrverband
WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
UNION
SELECT
semester || verband AS gruppe,
public.tbl_studentlehrverband.studiensemester_kurzbz,
student_uid,
studiengang_kz
FROM public.tbl_studentlehrverband
WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
UNION
SELECT
semester || verband || gruppe AS gruppe,
public.tbl_studentlehrverband.studiensemester_kurzbz,
student_uid,
studiengang_kz
FROM public.tbl_studentlehrverband
WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
UNION
SELECT
gruppe_kurzbz AS gruppe,
public.tbl_benutzergruppe.studiensemester_kurzbz,
uid AS student_uid,
studiengang_kz
FROM public.tbl_benutzergruppe
JOIN public.tbl_gruppe USING (gruppe_kurzbz)
WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
) a", "gruppe,studiensemester_kurzbz,studiengang_kz", "", false);
$this->addJoin("public.tbl_benutzer b", "b.uid = student_uid");
$this->addJoin("public.tbl_person p", "person_id");
$this->db->join("(
SELECT
lehrveranstaltung_id,
studiensemester_kurzbz, uid AS student_uid,
SUM(einheiten) AS summe
FROM campus.tbl_anwesenheit a
JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
WHERE anwesend = TRUE
AND studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
GROUP BY
lehrveranstaltung_id,
bezeichnung,
uid,
studiensemester_kurzbz
) anwesend", "lehrveranstaltung_id,student_uid,studiensemester_kurzbz", "LEFT", false);
$this->db->join("(
SELECT
lehrveranstaltung_id,
studiensemester_kurzbz,
uid AS student_uid,
SUM(einheiten) AS summe
FROM campus.tbl_anwesenheit a
JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
WHERE anwesend = FALSE
AND studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
GROUP BY
lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
) nichtanwesend", "lehrveranstaltung_id,student_uid,studiensemester_kurzbz", "LEFT", false);
$this->addGroupBy("vorname");
$this->addGroupBy("nachname");
$this->addGroupBy("wahlname");
$this->addGroupBy("lehrveranstaltung_id");
$this->addGroupBy("bezeichnung");
$this->addGroupBy("gruppe");
$this->addGroupBy("student_uid");
$this->addGroupBy("anwesend.summe");
$this->addGroupBy("nichtanwesend.summe");
$where = [
"lehrveranstaltung_id >" => 0
];
if ($student_uid)
$where["student_uid"] = $student_uid;
if ($lehrveranstaltung_id)
$where["lehrveranstaltung_id"] = $lehrveranstaltung_id;
if ($lehrveranstaltung_id) {
$this->addOrder("nachname");
$this->addOrder("vorname");
} elseif ($student_uid) {
$this->addOrder("bezeichnung");
}
$tmp = $this->dbTable;
$this->dbTable = "(
SELECT
SUM(stundenplan_id) AS stundenplan_id,
datum,
stunde,
lehrveranstaltung_id,
bezeichnung,
studiensemester_kurzbz,
studiengang_kz,
TRIM(
CASE
WHEN stp.gruppe_kurzbz IS NOT NULL
THEN stp.gruppe_kurzbz
ELSE stp.semester || (
CASE
WHEN verband IS NULL
THEN ''
ELSE stp.verband
END
) || (
CASE
WHEN stp.gruppe IS NULL
THEN ''
ELSE stp.gruppe
END
)
END
) AS gruppe
FROM lehre.tbl_lehrveranstaltung lv
JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id)
JOIN lehre.tbl_stundenplan stp USING (lehreinheit_id,studiengang_kz)
WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
AND (titel NOT LIKE '%Nebenprüfung%' OR titel IS NULL)
GROUP BY
datum,
stunde,
lehrveranstaltung_id,
bezeichnung,
studiensemester_kurzbz,
studiengang_kz,
stp.gruppe_kurzbz,
stp.semester,
stp.verband,
stp.gruppe
) x";
$result = $this->loadWhere($where);
$this->dbTable = $tmp;
return $result;
}
}
@@ -11,4 +11,45 @@ class LePruefung_model extends DB_Model
$this->dbTable = 'lehre.tbl_pruefung';
$this->pk = 'pruefung_id';
}
/**
* gets all Pruefungen for a student_uid
* @param string $student_uid
* @param string $studiensemester_kurzbz
*
* @return stdClass
*/
public function getPruefungenByStudentuid($student_uid, $studiensemester_kurzbz = null)
{
$this->addSelect('tbl_pruefung.datum');
$this->addSelect("TO_CHAR(tbl_pruefung.datum::timestamp, 'DD.MM.YYYY') AS format_datum");
$this->addSelect('tbl_pruefung.anmerkung');
$this->addSelect('tbl_pruefung.pruefungstyp_kurzbz');
$this->addSelect('tbl_pruefung.pruefung_id');
$this->addSelect('tbl_pruefung.lehreinheit_id');
$this->addSelect('tbl_pruefung.student_uid');
$this->addSelect('tbl_pruefung.mitarbeiter_uid');
$this->addSelect('tbl_pruefung.punkte');
$this->addSelect('tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung');
$this->addSelect('tbl_lehrveranstaltung.lehrveranstaltung_id');
$this->addSelect('tbl_note.bezeichnung as note_bezeichnung');
$this->addSelect('tbl_pruefungstyp.beschreibung as typ_beschreibung');
$this->addSelect('tbl_lehreinheit.studiensemester_kurzbz as studiensemester_kurzbz');
$this->addJoin('lehre.tbl_lehreinheit', 'lehre.tbl_pruefung.lehreinheit_id=lehre.tbl_lehreinheit.lehreinheit_id');
$this->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
$this->addJoin('lehre.tbl_note', 'note');
$this->addJoin('lehre.tbl_pruefungstyp', 'pruefungstyp_kurzbz');
if ($studiensemester_kurzbz)
$this->db->where("tbl_lehreinheit.studiensemester_kurzbz = ", $studiensemester_kurzbz);
$this->addOrder('tbl_pruefung.datum', 'DESC');
$this->addOrder('tbl_pruefung.pruefung_id', 'DESC');
return $this->loadWhere([
'student_uid' => $student_uid
]);
}
}
@@ -31,7 +31,7 @@ class Lehreinheit_model extends DB_Model
$this->addOrder('lehreinheit_id');
$les = $this->loadWhere(
array('lehrveranstaltung_id' => $lehrveranstaltung_id,
'studiensemester_kurzbz' => $studiensemester)
'studiensemester_kurzbz' => $studiensemester)
);
if (hasData($les))
@@ -244,4 +244,63 @@ EOSQL;
$res = $this->execReadOnlyQuery($query);
return $res;
}
/**
* Gets Lehreinheiten for Lehrveranstaltungen in a Studiensemester.
* Without using tbl_lehrfach: bezeichnung and kurzbz ALWAYS from lehrveranstaltung
* @param $lehrveranstaltung_id
* @param $studiensemester
* @return array with Lehreinheiten and their Lehreinheitgruppen
*/
public function getLesFromLvIds($lehrveranstaltung_id, $studiensemester_kurzbz = null)
{
$params = array($lehrveranstaltung_id);
$query = "
SELECT
lv.lehrveranstaltung_id,
le.lehreinheit_id,
le.lehrform_kurzbz,
lv.kurzbz,
lv.bezeichnung,
lv.semester,
(
SELECT
STRING_AGG(CONCAT(leg.semester, leg.verband, leg.gruppe), ' ')
FROM lehre.tbl_lehreinheitgruppe leg
WHERE leg.lehreinheit_id = le.lehreinheit_id
) AS gruppe,
STRING_AGG(tma.kurzbz, ' ') as kuerzel
FROM
lehre.tbl_lehreinheit le
JOIN
lehre.tbl_lehrveranstaltung lv ON lv.lehrveranstaltung_id = le.lehrveranstaltung_id
JOIN
lehre.tbl_lehreinheitmitarbeiter ma USING (lehreinheit_id)
JOIN
public.tbl_mitarbeiter tma USING (mitarbeiter_uid)
WHERE
lv.lehrveranstaltung_id = ?
";
if (isset($studiensemester_kurzbz))
{
$query .= " AND le.studiensemester_kurzbz = ?";
$params[] = $studiensemester_kurzbz;
}
$query .="
GROUP BY
lv.lehrveranstaltung_id,
le.lehreinheit_id,
le.lehrform_kurzbz,
lv.kurzbz,
lv.bezeichnung,
lv.semester
ORDER BY
le.lehreinheit_id;
";
return $this->execQuery($query, $params);
}
}
@@ -16,145 +16,21 @@ class Lehrveranstaltung_model extends DB_Model
}
/**
* Get Lehrveranstaltungen by eventQuery string. Use with autocomplete event queries.
* @param $eventQuery String
* @param string $studiensemester_kurzbz Filter by Studiensemester
* @param array $oes Filter by Organisationseinheiten
* @return array
*/
public function getAutocompleteSuggestions($eventQuery, $studiensemester_kurzbz = null, $oes = null)
{
$subQry = $this->_getQryLvsByStudienplan($studiensemester_kurzbz, $oes);
$params = [];
/* filter by input string */
if (is_string($eventQuery)) {
$subQry.= ' AND lv.bezeichnung ILIKE ?';
$params[] = '%' . $eventQuery . '%';
}
$qry = 'SELECT DISTINCT ON (lehrveranstaltung_id) * FROM ('. $subQry. ') AS tmp';
return $this->execQuery($qry, $params);
}
/**
* Get Lehrveranstaltungen with its Stg, OE and OE-type.
* Filter by Studiensemester and Organisationseinheiten if necessary.
* @param $eventQuery String
* @param string $studiensemester_kurzbz Filter by Studiensemester
* @param array $oes Filter by Organisationseinheiten
* @param array $lv_ids Filter by Lehrveranstaltung-Ids
* @return array
*/
public function getLvsByStudienplan($studiensemester_kurzbz = null, $oes = null, $lv_ids = null)
{
$subQry = $this->_getQryLvsByStudienplan($studiensemester_kurzbz, $oes);
$qry = 'SELECT * FROM ('. $subQry. ') AS tmp';
if (isset($lv_ids) && is_array($lv_ids))
{
/* filter by lv_ids */
$implodedLvIds = "'". implode("', '", $lv_ids). "'";
$qry.= ' WHERE lehrveranstaltung_id IN ('. $implodedLvIds. ')';
}
$qry.= ' ORDER BY stg_typ_kurzbz, orgform_kurzbz DESC';
return $this->execQuery($qry);
}
/**
* Get basic query to retrieve Lehrveranstaltungen according to the Orgforms and Ausbildungssemesters actual Studienplan.
*
* @return string
*/
private function _getQryLvsByStudienplan($studiensemester_kurzbz = null, $oes = null, $lehrtyp_kurzbz = 'lv')
{
$qry = '
SELECT
lv.oe_kurzbz AS lv_oe_kurzbz,
CASE
WHEN oe.organisationseinheittyp_kurzbz = \'Kompetenzfeld\' THEN (\'KF \' || oe.bezeichnung)
WHEN oe.organisationseinheittyp_kurzbz = \'Department\' THEN (\'DEP \' || oe.bezeichnung)
ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung)
END AS lv_oe_bezeichnung,
stplsem.studiensemester_kurzbz,
studienordnung_id,
sto.studiengang_kz,
stpl.studienplan_id,
stplsem.semester,
stpl.orgform_kurzbz,
upper(stg.typ || stg.kurzbz) AS stg_typ_kurzbz,
stg.bezeichnung AS stg_bezeichnung,
stgtyp.bezeichnung AS stg_typ_bezeichnung,
lv.lehrveranstaltung_id,
lv.semester,
lv.bezeichnung AS lv_bezeichnung,
(
-- comma seperated string of all lehreinheitgruppen
SELECT string_agg(bezeichnung, \', \') AS lehreinheitgruppe_bezeichnung
FROM(
-- distinct bezeichnung, as may come multiple times from different lehreinheiten
SELECT DISTINCT ON (studiengang_kz, bezeichnung) studiengang_kz, bezeichnung FROM
(
-- distinct lehreinheitgruppe, as may come multiple times from different lehrform
SELECT DISTINCT ON (legr.lehreinheitgruppe_id) legr.studiengang_kz,
-- get Spezialgruppe or Lehrverbandgruppe
COALESCE(
legr.gruppe_kurzbz,
CONCAT( UPPER(stg1.typ), UPPER(stg1.kurzbz), \'-\', legr.semester, legr.verband, legr.gruppe )
) as bezeichnung
FROM lehre.tbl_lehreinheitgruppe legr
JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung lv1 USING (lehrveranstaltung_id)
JOIN public.tbl_studiengang stg1 ON stg1.studiengang_kz = legr.studiengang_kz
WHERE lv1.lehrveranstaltung_id = lv.lehrveranstaltung_id
AND le.studiensemester_kurzbz = stplsem.studiensemester_kurzbz
) AS lehreinheitgruppen
GROUP BY studiengang_kz, bezeichnung
ORDER BY studiengang_kz DESC
) AS uniqueLehreinheitgruppen_bezeichnung
) AS lehreinheitgruppen_bezeichnung
FROM
lehre.tbl_studienplan stpl
JOIN lehre.tbl_studienordnung sto USING (studienordnung_id)
JOIN lehre.tbl_studienplan_semester stplsem USING (studienplan_id)
JOIN lehre.tbl_studienplan_lehrveranstaltung stpllv ON (stpllv.studienplan_id = stpl.studienplan_id AND stpllv.semester = stplsem.semester)
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
JOIN public.tbl_organisationseinheit oe USING (oe_kurzbz)
JOIN public.tbl_studiengang stg ON stg.studiengang_kz = sto.studiengang_kz
JOIN public.tbl_studiengangstyp stgtyp ON stgtyp.typ = stg.typ
/* filter by lehrtyp_kurzbz, default is lvs only */
WHERE
lehrtyp_kurzbz = '. $this->db->escape($lehrtyp_kurzbz);
if (isset($studiensemester_kurzbz) && is_string($studiensemester_kurzbz))
{
/* filter by studiensemester */
$qry.= ' AND stplsem.studiensemester_kurzbz = '. $this->db->escape($studiensemester_kurzbz);
}
if (isset($oes) && is_array($oes))
{
/* filter by organisationseinheit */
$implodedOes = "'". implode("', '", $oes). "'";
$qry.= ' AND lv.oe_kurzbz IN ('. $implodedOes. ')';
}
return $qry;
}
/**
* Get all Templates and union with all Lehrveranstaltungen of given Studiensemester and Oes, that are assigned to
* a template. This data structure can be used for nested tabulator data tree.
* Get all Templates and its assigned Lehrveranstaltungen of given Studiensemester and Oes.
* Lvs are queried via actual Studienordnung and Studienplan.
*
* @param null|string $studiensemester_kurzbz
* @param null|array $oes
* @param null $lehrveranstaltung_id Queries certain LV only
* @return array|stdClass|null
*/
public function getTemplateLvTree($studiensemester_kurzbz = null, $oes = null){
public function getTemplateLvTree($studiensemester_kurzbz = null, $oes = null, $studienjahr_kurzbz = null){
if (is_string($studiensemester_kurzbz) && is_string($studienjahr_kurzbz))
{
return error('Query not possible for both studiensemester and studienjahr');
}
$params = [];
$qry = '
WITH
@@ -189,6 +65,17 @@ class Lehrveranstaltung_model extends DB_Model
}
if (is_string($studienjahr_kurzbz)) {
/* filter by studiensemester */
$params[] = $studienjahr_kurzbz;
$qry .= '
AND stplsem.studiensemester_kurzbz IN (
SELECT studiensemester_kurzbz
FROM public.tbl_studiensemester
WHERE studienjahr_kurzbz = ?
)';
}
if (is_array($oes))
{
/* filter by organisationseinheit */
@@ -300,7 +187,15 @@ class Lehrveranstaltung_model extends DB_Model
JOIN public.tbl_studiengangstyp stgtyp ON stgtyp.typ = stg.typ
JOIN public.tbl_organisationseinheit oe ON oe.oe_kurzbz = lv.oe_kurzbz
ORDER BY
oe.bezeichnung, lv.semester, lv.bezeichnung
-- Sort by lv.bezeichnung
lv.bezeichnung,
-- Within each group, ensure templates appear first
CASE
WHEN lv.lehrtyp_kurzbz = \'tpl\' THEN 0
ELSE 1
END,
-- Ensure assigend lvs follow their template, grouped by lehrveranstaltung_template_id
COALESCE(lv.lehrveranstaltung_template_id, lv.lehrveranstaltung_id)
';
return $this->execQuery($qry, $params);
@@ -517,28 +412,29 @@ class Lehrveranstaltung_model extends DB_Model
/**
* Gets Lehrveranstaltungen of a student
* @param $student_uid
* @param null $studiensemester_kurzbz
* @param $studiensemester_kurzbz
* @return array|null
*/
public function getLvsByStudent($student_uid, $studiensemester_kurzbz = null)
{
$params = array($student_uid);
$qry = "SELECT * FROM lehre.tbl_lehrveranstaltung
WHERE lehrveranstaltung_id IN(SELECT lehrveranstaltung_id FROM campus.vw_student_lehrveranstaltung
WHERE uid=?";
WHERE lehrveranstaltung_id IN(
SELECT lehrveranstaltung_id FROM campus.vw_student_lehrveranstaltung
WHERE uid=?";
if (isset($studiensemester_kurzbz))
{
$qry .= " AND studiensemester_kurzbz=?";
$params[] = $studiensemester_kurzbz;
$qry .= " AND studiensemester_kurzbz=?";
}
$qry .= ") OR lehrveranstaltung_id IN(SELECT lehrveranstaltung_id FROM lehre.tbl_zeugnisnote WHERE student_uid=?";
$qry .= ")";
$qry .= " OR lehrveranstaltung_id IN(
SELECT lehrveranstaltung_id FROM lehre.tbl_zeugnisnote
WHERE student_uid=?";
$params[] = $student_uid;
if (isset($studiensemester_kurzbz))
{
$qry .= " AND studiensemester_kurzbz=?";
$params[] = $studiensemester_kurzbz;
}
$qry .= ") ORDER BY semester, bezeichnung";
return $this->execQuery($qry, $params);
@@ -608,7 +504,11 @@ class Lehrveranstaltung_model extends DB_Model
$this->addSelect($lvbezeichnung . ' AS bezeichnung');
$this->addSelect($sgbezeichnung . ' AS sg_bezeichnung');
$this->addSelect('UPPER(sg.typ::VARCHAR(1) || sg.kurzbz) AS studiengang_kuerzel');
//also adds returns the index of the grade
//TODO: ist zeugnissnote immer gleich wie die lvgesamtnote
$this->addSelect('COALESCE(zn.note::numeric,gn.note::numeric) as note_index');
$this->addSelect('COALESCE(znn.positiv,gnn.positiv) as positiv');
$this->addSelect('COALESCE(gnn.' . $bezeichnung . ', gnn.bezeichnung, gn.note::text) AS lvnote');
$this->addSelect('COALESCE(znn.' . $bezeichnung . ', znn.bezeichnung, zn.note::text) AS znote');
@@ -730,6 +630,37 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($query, array($uid, $studiensemester_kurzbz, $lehrveranstaltung_id));
}
/**
* Get Lehreinheit.
*
* @param string $student_uid
* @param string $studiensemester_kurzbz
* @param integer $lehrveranstaltung_id
*
* @return stdClass
*/
public function getLeByStudent($student_uid, $studiensemester_kurzbz, $lehrveranstaltung_id)
{
$this->addSelect("lehreinheit_id");
$this->addOrder("lehreinheit_id", "ASC");
$this->addLimit(1);
$tmp = $this->dbTable;
$this->dbTable = "campus.vw_student_lehrveranstaltung";
$result = $this->loadWhere([
"uid" => $student_uid,
"lehrveranstaltung_id" => $lehrveranstaltung_id,
"studiensemester_kurzbz" => $studiensemester_kurzbz
]);
$this->dbTable = $tmp;
return $result;
}
/**
* Sucht nach LV Templates und gibt Id und Label ("bezeichnung [kurzbz]") aus
* Diese funktion ist für autocomplete gedacht
@@ -775,6 +706,28 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($qry);
}
/**
* Check if given LV is a template (Quellkurs)
*
* @param $lehrveranstaltung_id
* @return array|stdClass|void
*/
public function checkIsTemplate($lehrveranstaltung_id)
{
$this->addSelect('lehrtyp_kurzbz, lehrveranstaltung_template_id');
$result = $this->load($lehrveranstaltung_id);
if (isError($result))
return error(getError($result));
if (hasData($result))
{
return success(
getData($result)[0]->lehrtyp_kurzbz === 'tpl' &&
getData($result)[0]->lehrveranstaltung_template_id === null
);
}
}
/**
* Get ECTS Summe pro angerechnetes Quereinstiegssemester.
@@ -1012,4 +965,27 @@ class Lehrveranstaltung_model extends DB_Model
$res = $this->execReadOnlyQuery($query);
return $res;
}
/**
* Gets lehrveranstaltungen of a studiengang
* @param integer $studiengang_kz
* @return array|null
*/
public function getLvsByStudiengangkz($studiengang_kz)
{
$params = array($studiengang_kz);
$qry = "SELECT
*
FROM
lehre.tbl_lehrveranstaltung
WHERE lehrveranstaltung_id IN
(SELECT lehrveranstaltung_id
FROM campus.vw_student_lehrveranstaltung
WHERE studiengang_kz = ?";
$qry .= ") ORDER BY semester, bezeichnung";
return $this->execQuery($qry, $params);
}
}
@@ -12,4 +12,38 @@ class Lvgesamtnote_model extends DB_Model
$this->pk = array('student_uid', 'studiensemester_kurzbz', 'lehrveranstaltung_id');
$this->hasSequence = false;
}
/**
* Laedt die Noten
*
* @param integer $lehrveranstaltung_id
* @param string $student_uid
* @param string $studiensemester_kurzbz
*
* @return stdClass
*/
public function getLvGesamtNoten($lehrveranstaltung_id, $student_uid, $studiensemester_kurzbz)
{
$this->addSelect($this->dbTable . ".*");
$this->addSelect("n.bezeichnung AS note_bezeichnung");
$this->addSelect("lv.bezeichnung AS lehrveranstaltung_bezeichnung");
$this->addSelect("lv.studiengang_kz");
$this->addSelect("UPPER(stg.typ || stg.kurzbz) AS studiengang");
$this->addJoin("lehre.tbl_note n", "note");
$this->addJoin("lehre.tbl_lehrveranstaltung lv", "lehrveranstaltung_id");
$this->addJoin("public.tbl_studiengang stg", "studiengang_kz");
$this->db->where($this->dbTable . ".freigabedatum <", "NOW()", false);
$where = [];
if ($studiensemester_kurzbz)
$where[$this->dbTable . ".studiensemester_kurzbz"] = $studiensemester_kurzbz;
if ($lehrveranstaltung_id)
$where[$this->dbTable . ".lehrveranstaltung_id"] = $lehrveranstaltung_id;
if ($student_uid)
$where[$this->dbTable . ".student_uid"] = $student_uid;
return $this->loadWhere($where);
}
}
@@ -0,0 +1,14 @@
<?php
class Note_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'lehre.tbl_note';
$this->pk = 'note';
}
}
@@ -11,4 +11,34 @@ class Notenschluesselaufteilung_model extends DB_Model
$this->dbTable = 'lehre.tbl_notenschluesselaufteilung';
$this->pk = 'notenschluesselaufteilung_id';
}
/**
* Liefert die Note zu Punkten einer Lehrveranstaltung
*
* @param number $points
* @param integer $lehrveranstaltung_id
* @param string $studiensemester_kurzbz
*
* @return stdClass returns success(null) if no entry is found
*/
public function getNote($points, $lehrveranstaltung_id, $studiensemester_kurzbz)
{
$this->load->model('education/Notenschluesselzuordnung_model', 'NotenschluesselzuordnungModel');
$notenschluessel_kurzbz = $this->NotenschluesselzuordnungModel->getKurzbzForLv($lehrveranstaltung_id, $studiensemester_kurzbz);
$this->addSelect("note");
$this->addOrder("punkte", "DESC");
$this->addLimit(1);
$result = $this->loadWhere([
"notenschluessel_kurzbz" => $notenschluessel_kurzbz,
"punkte <=" => $points
]);
if (isError($result))
return $result;
if (!hasData($result))
return success(null);
return success(current(getData($result))->note);
}
}
@@ -11,4 +11,71 @@ class Notenschluesselzuordnung_model extends DB_Model
$this->dbTable = 'lehre.tbl_notenschluesselzuordnung';
$this->pk = 'notenschluesselzuordnung_id';
}
/**
* Liefert den passenden Notenschluessel zu einer Lehrveranstaltung
*
* @param integer $lehrveranstaltung_id
* @param string $studiensemester_kurzbz
*
* @return integer|null
*/
public function getKurzbzForLv($lehrveranstaltung_id, $studiensemester_kurzbz)
{
$this->addSelect("notenschluessel_kurzbz");
$this->db->where("lehrveranstaltung_id", $lehrveranstaltung_id);
if ($studiensemester_kurzbz) {
$this->db->where("studiensemester_kurzbz", $studiensemester_kurzbz);
$this->db->or_where("studiensemester_kurzbz", null);
} else {
$this->db->where("studiensemester_kurzbz", null);
}
$result = $this->load();
if (!isError($result) && hasData($result))
return current(getData($result))->notenschluessel_kurzbz;
$this->addSelect("notenschluessel_kurzbz");
$this->addJoin("(
WITH RECURSIVE oes(oe_kurzbz, oe_parent_kurzbz, depth) AS (
SELECT oe_kurzbz, oe_parent_kurzbz, 1
FROM public.tbl_organisationseinheit
WHERE oe_kurzbz = (
SELECT
oe_kurzbz
FROM
lehre.tbl_lehrveranstaltung
WHERE
lehrveranstaltung_id = " . $this->escape($lehrveranstaltung_id) . "
)
UNION ALL
SELECT o.oe_kurzbz, o.oe_parent_kurzbz, oes.depth+1 AS depth
FROM public.tbl_organisationseinheit o, oes
WHERE o.oe_kurzbz = oes.oe_parent_kurzbz
AND aktiv = true
)
SELECT * FROM oes
) oes", "oe_kurzbz");
$this->addOrder("depth", "ASC");
$this->addLimit(1);
if ($studiensemester_kurzbz) {
$this->db->where_in("studiensemester_kurzbz", [$studiensemester_kurzbz, null]);
$result = $this->load();
} else {
$result = $this->loadWhere([
"studiensemester_kurzbz" => null
]);
}
if (isError($result) || !hasData($result))
return null;
return current(getData($result))->notenschluessel_kurzbz;
}
}
@@ -0,0 +1,14 @@
<?php
class Pruefungsantritt_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'lehre.tbl_abschlusspruefung_antritt';
$this->pk = 'pruefungsantritt_kurzbz';
}
}
@@ -46,6 +46,15 @@ class Studierendenantraglehrveranstaltung_model extends DB_Model
}
}
/**
* Gets all LVs for a repeating prestudent that are either not allowed or
* already done.
*
* @param string $prestudent_id
* @param string $studiensemester_kurzbz
*
* @return stdClass
*/
public function getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz)
{
$this->addSelect($this->dbTable . '.*');
@@ -66,39 +75,53 @@ class Studierendenantraglehrveranstaltung_model extends DB_Model
);
$this->addJoin('public.tbl_student s', 'prestudent_id');
// NOTE(chris): last offizell note
$this->addJoin('(
SELECT z.*
FROM lehre.tbl_zeugnisnote z
LEFT JOIN public.tbl_studiensemester zs
USING(studiensemester_kurzbz)
JOIN (
SELECT zi.lehrveranstaltung_id, zi.student_uid, MAX(zis.start) AS start
FROM lehre.tbl_zeugnisnote zi
LEFT JOIN lehre.tbl_note zin
USING(note)
LEFT JOIN public.tbl_studiensemester zis
USING(studiensemester_kurzbz)
WHERE zin.aktiv AND zin.offiziell
GROUP BY zi.lehrveranstaltung_id, zi.student_uid
) zx
ON (
z.lehrveranstaltung_id=zx.lehrveranstaltung_id
AND z.student_uid=zx.student_uid
AND zs.start = zx.start
)) z', 'z.lehrveranstaltung_id=lv.lehrveranstaltung_id AND z.student_uid=s.student_uid', 'LEFT');
$this->addJoin('lehre.tbl_note zn', 'z.note = zn.note', 'LEFT');
$this->load->config('studierendenantrag');
$note_intern_angerechntet = $this->config->item('wiederholung_note_angerechnet');
return $this->loadWhere([
$where = [
'ps.prestudent_id' => $prestudent_id,
'a.typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
'stat.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED,
'n.note <> ' => 0,
$this->dbTable . '.studiensemester_kurzbz' => $studiensemester_kurzbz,
'(n.note<>' . $this->db->escape($note_intern_angerechntet) . ' OR (z.note IS NOT NULL AND zn.positiv))' => null
]);
// NOTE(chris): grade "intern angerechnet" needs an official grade beforehand (the subquery gets the last positive offical grade)
"(n.note<>" . $this->db->escape($note_intern_angerechntet) . " OR EXISTS (
SELECT
1
FROM
lehre.tbl_zeugnisnote z
LEFT JOIN public.tbl_studiensemester zs USING(studiensemester_kurzbz)
JOIN (
SELECT
zi.lehrveranstaltung_id,
zi.student_uid,
MAX(zis.start) AS start
FROM
lehre.tbl_zeugnisnote zi
LEFT JOIN lehre.tbl_note zin USING(note)
LEFT JOIN public.tbl_studiensemester zis USING(studiensemester_kurzbz)
WHERE
zin.aktiv
AND zin.offiziell
GROUP BY
zi.lehrveranstaltung_id,
zi.student_uid
) zx ON (
z.lehrveranstaltung_id = zx.lehrveranstaltung_id
AND z.student_uid = zx.student_uid
AND zs.start = zx.start
)
JOIN lehre.tbl_note zn USING (note)
WHERE
z.lehrveranstaltung_id = lv.lehrveranstaltung_id
AND z.student_uid = s.student_uid
AND zn.positiv
))" => null
];
if ($studiensemester_kurzbz !== false)
$where[$this->dbTable . '.studiensemester_kurzbz'] = $studiensemester_kurzbz;
return $this->loadWhere($where);
}
}
@@ -177,45 +177,63 @@ class Zeugnisnote_model extends DB_Model
$params[] = $studiensemester_kurzbz;
}
$qry = "SELECT vw_student_lehrveranstaltung.lehrveranstaltung_id, uid,
vw_student_lehrveranstaltung.studiensemester_kurzbz, note, punkte, uebernahmedatum, benotungsdatum,
vw_student_lehrveranstaltung.ects, vw_student_lehrveranstaltung.semesterstunden,
tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum,
tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id,
vw_student_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung,
vw_student_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english,
tbl_note.bezeichnung as note_bezeichnung,
tbl_note.positiv as note_positiv,
tbl_zeugnisnote.bemerkung as bemerkung,
vw_student_lehrveranstaltung.sort,
vw_student_lehrveranstaltung.zeugnis,
vw_student_lehrveranstaltung.studiengang_kz,
vw_student_lehrveranstaltung.lv_lehrform_kurzbz,
tbl_lehrveranstaltung.sws
FROM
(
campus.vw_student_lehrveranstaltung LEFT JOIN lehre.tbl_zeugnisnote
ON(uid=student_uid
AND vw_student_lehrveranstaltung.studiensemester_kurzbz=tbl_zeugnisnote.studiensemester_kurzbz
AND vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id
)
) LEFT JOIN lehre.tbl_note USING(note)
JOIN lehre.tbl_lehrveranstaltung ON(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id)
WHERE true $where
$qry = "SELECT
a.*,
lv.lehrform_kurzbz AS lehrveranstaltung_lehrform,
lv.kurzbz AS lehrveranstaltung_kurzbz,
UPPER(stg1.typ || stg1.kurzbz) AS studiengang,
s.studiengang_kz AS studiengang_kz,
UPPER(stg2.typ || stg2.kurzbz) AS studiengang_lv,
lv.studiengang_kz AS studiengang_kz_lv,
lv.semester AS semester_lv,
lv.ects AS ects_lv,
lv.zeugnis,
lv.bezeichnung_english AS lehrveranstaltung_bezeichnung_english
FROM (
SELECT vw_student_lehrveranstaltung.lehrveranstaltung_id, uid,
vw_student_lehrveranstaltung.studiensemester_kurzbz, note, punkte, uebernahmedatum, benotungsdatum,
vw_student_lehrveranstaltung.ects, vw_student_lehrveranstaltung.semesterstunden,
tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum,
tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id,
vw_student_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung,
vw_student_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english,
tbl_note.bezeichnung as note_bezeichnung,
tbl_note.positiv as note_positiv,
tbl_zeugnisnote.bemerkung as bemerkung,
vw_student_lehrveranstaltung.sort,
vw_student_lehrveranstaltung.zeugnis,
vw_student_lehrveranstaltung.studiengang_kz,
vw_student_lehrveranstaltung.lv_lehrform_kurzbz,
tbl_lehrveranstaltung.sws
FROM
(
campus.vw_student_lehrveranstaltung LEFT JOIN lehre.tbl_zeugnisnote
ON(uid=student_uid
AND vw_student_lehrveranstaltung.studiensemester_kurzbz=tbl_zeugnisnote.studiensemester_kurzbz
AND vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id
)
) LEFT JOIN lehre.tbl_note USING(note)
JOIN lehre.tbl_lehrveranstaltung ON(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id)
WHERE true $where
UNION
SELECT lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,student_uid AS uid,studiensemester_kurzbz, note, punkte,
uebernahmedatum, benotungsdatum,lehre.tbl_lehrveranstaltung.ects,lehre.tbl_lehrveranstaltung.semesterstunden, tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum,
tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, lehre.tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, lehre.tbl_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english,
tbl_note.bezeichnung as note_bezeichnung, tbl_note.positiv as note_positiv, tbl_zeugnisnote.bemerkung as bemerkung, tbl_lehrveranstaltung.sort, tbl_lehrveranstaltung.zeugnis, tbl_lehrveranstaltung.studiengang_kz,
tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.sws
FROM
lehre.tbl_zeugnisnote
JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
JOIN lehre.tbl_note USING(note)
WHERE true $where2
UNION
SELECT lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,student_uid AS uid,studiensemester_kurzbz, note, punkte,
uebernahmedatum, benotungsdatum,lehre.tbl_lehrveranstaltung.ects,lehre.tbl_lehrveranstaltung.semesterstunden, tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum,
tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, lehre.tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, lehre.tbl_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english,
tbl_note.bezeichnung as note_bezeichnung, tbl_note.positiv as note_positiv, tbl_zeugnisnote.bemerkung as bemerkung, tbl_lehrveranstaltung.sort, tbl_lehrveranstaltung.zeugnis, tbl_lehrveranstaltung.studiengang_kz,
tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.sws
FROM
lehre.tbl_zeugnisnote
JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
JOIN lehre.tbl_note USING(note)
WHERE true $where2
ORDER BY sort";
ORDER BY sort
) a
LEFT JOIN public.tbl_student s ON (a.uid = s.student_uid)
LEFT JOIN public.tbl_studiengang stg1 ON (s.studiengang_kz = stg1.studiengang_kz)
LEFT JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
LEFT JOIN public.tbl_studiengang stg2 ON (lv.studiengang_kz = stg2.studiengang_kz)";
return $this->execQuery($qry, $params);
}
@@ -647,4 +647,135 @@ class Studiengang_model extends DB_Model
return $this->load();
}
/**
* @return stdClass
*/
public function getStudiengangInfoForNews()
{
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model('crm/Student_model', 'StudentModel');
$addEmailProperty= function(&$benutzerfunktionen){
if(count($benutzerfunktionen) && defined('DOMAIN'))
{
$benutzerfunktionen = array_map(function($benutzer)
{
$benutzer->email = $benutzer->alias."@".DOMAIN;
return $benutzer;
},$benutzerfunktionen) ;
}
};
$addFotoProperty= function(&$collection){
$collection = array_map(function($item){
$person_id = $this->PersonModel->getByUid($item->uid);
if(isError($person_id))
return error($person_id);
$person_id = current(getData($person_id))->person_id;
$this->PersonModel->addSelect('foto');
$foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id));
if(isError($foto))
return error($foto);
$foto = current(getData($foto))->foto;
$item->foto = $foto;
return $item;
},$collection);
};
$this->load->model('crm/Student_model', 'StudentModel');
$student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]);
if (isError($student))
return error($student);
if (getData($student)) {
$student = current(getData($student));
$studiengang_kz = $student->studiengang_kz;
$semester = $student->semester;
}
$stg_obj = $this->load($studiengang_kz);
if(isError($stg_obj))
return error($stg_obj);
if(getData($stg_obj))
{
$stg_obj = current(getData($stg_obj));
}
$stg_ltg = $this->getLeitungDetailed($stg_obj->studiengang_kz);
if (isError($stg_ltg))
return $stg_ltg;
$stg_ltg = getData($stg_ltg) ?: [];
$addFotoProperty($stg_ltg);
$gf_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz);
if (isError($gf_ltg))
return $gf_ltg;
$gf_ltg = getData($gf_ltg) ?: [];
$addEmailProperty($gf_ltg);
$stv_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz);
if (isError($stv_ltg))
return $stv_ltg;
$stv_ltg = getData($stv_ltg) ?: [];
$addEmailProperty($stv_ltg);
$ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
if (isError($ass))
return $ass;
$ass = getData($ass) ?: [];
$addEmailProperty($ass);
$addFotoProperty($ass);
$hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv');
if (isError($hochschulvertr))
return $hochschulvertr;
$hochschulvertr = getData($hochschulvertr) ?: [];
$addEmailProperty($hochschulvertr);
$stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz);
if (isError($stdv))
return $stdv;
$stdv = getData($stdv) ?: [];
$addEmailProperty($stdv);
$jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester);
if (isError($jahrgangsvertr))
return $jahrgangsvertr;
$jahrgangsvertr = getData($jahrgangsvertr) ?: [];
$addEmailProperty($jahrgangsvertr);
$result_object = new stdClass();
$result_object->studiengang = $stg_obj;
$result_object->semester = $semester;
$result_object->stg_ltg = $stg_ltg;
$result_object->gf_ltg = $gf_ltg;
$result_object->stv_ltg = $stv_ltg;
$result_object->ass = $ass;
$result_object->hochschulvertr = $hochschulvertr;
$result_object->stdv = $stdv;
$result_object->jahrgangsvertr = $jahrgangsvertr;
return success($result_object);
}
public function getLvaForStudiengangInStudiensemester($studiengang_kz, $orgform_kurzbz, $studiensemester_kurzbz) {
$qry = '
SELECT DISTINCT ON (lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,
kurzbz, bezeichnung, semester,
lehre.tbl_lehrveranstaltung.sprache, orgform_kurzbz,
lehre.tbl_lehrveranstaltung.lehrform_kurzbz)
lehre.tbl_lehrveranstaltung.lehrveranstaltung_id, kurzbz, bezeichnung,
semester, lehre.tbl_lehrveranstaltung.sprache, orgform_kurzbz, lehre.tbl_lehrveranstaltung.lehrform_kurzbz
FROM lehre.tbl_lehrveranstaltung JOIN lehre.tbl_lehreinheit USING(lehrveranstaltung_id) JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id)
WHERE aktiv = TRUE AND studiengang_kz = ? AND orgform_kurzbz = ? AND tbl_lehreinheit.studiensemester_kurzbz IN ?';
return $this->execReadOnlyQuery($qry, array($studiengang_kz, $orgform_kurzbz, $studiensemester_kurzbz));
}
}
@@ -1,4 +1,5 @@
<?php
class Studienjahr_model extends DB_Model
{
@@ -29,6 +30,22 @@ class Studienjahr_model extends DB_Model
return $this->execQuery($query);
}
public function getNextStudienjahr()
{
$this->addJoin('public.tbl_studiensemester', 'studienjahr_kurzbz');
$this->addOrder('start');
$this->addLimit(1);
return $this->loadWhere(['start >' => 'NOW()']);
}
public function getNextFrom($studienjahr_kurzbz)
{
$this->addLimit(1);
return $this->loadWhere([
'studienjahr_kurzbz >' => $studienjahr_kurzbz
]);
}
/**
* Get the current Studienjahr. During the summer term, continue using the previous Studienjahr.
@@ -38,8 +55,7 @@ class Studienjahr_model extends DB_Model
*/
public function getLastOrAktStudienjahr($days = 60)
{
if (!is_numeric($days))
{
if (!is_numeric($days)) {
$days = 60;
}
@@ -63,8 +79,7 @@ class Studienjahr_model extends DB_Model
*/
public function getAktOrNextStudienjahr($days = 62)
{
if (!is_numeric($days))
{
if (!is_numeric($days)) {
$days = 62;
}
@@ -170,13 +170,31 @@ class Studiensemester_model extends DB_Model
return $this->execQuery($query, array($studiensemester_kurzbz, $studiengang_kz));
}
/**
* Gets a Studiensemester for a date
* @param $date
* @return string
*/
public function getByDate($date)
{
// gets the studiensemster of a date or the next closest previous studiensemester if a date is not within a studiensemester
$query = "
SELECT studiensemester_kurzbz, start, ende
FROM public.tbl_studiensemester
WHERE ( ende >= ?::date AND start <= ?::date ) OR ( ende >= ?::date + '-45 days'::interval AND start <= ?::date + '-45 days'::interval )
ORDER BY start DESC
LIMIT 1";
return $this->execQuery($query, array($date,$date,$date,$date));
}
/**
* Gets all Studiensemester between two dates
* @param $from
* @param $to
* @return array|null
*/
public function getByDate($from, $to)
public function getByDateRange($from, $to)
{
if (date_format(date_create($from), 'Y-m-d') > (date_format(date_create($to), 'Y-m-d')))
return success(array());
@@ -207,7 +225,7 @@ class Studiensemester_model extends DB_Model
/**
* @param string $student_uid
*
*
* @return StdClass
*/
public function getWhereStudentHasLvs($student_uid)
@@ -220,7 +238,7 @@ class Studiensemester_model extends DB_Model
$this->db->where("v.lehreverzeichnis<>''");
$this->addOrder($this->dbTable . '.start');
return $this->loadWhere(['uid' => $student_uid, 'v.lehre' => true]);
}
@@ -273,6 +291,42 @@ class Studiensemester_model extends DB_Model
return $studienjahrNumber;
}
/**
* Get Studienjahr by Studiensemester.
*
* @param $studiensemester_kurzbz
* @return array|stdClass
*/
public function getStudienjahrByStudiensemester($studiensemester_kurzbz)
{
$studienjahrObj = null;
if (!is_numeric($studiensemester_kurzbz))
{
$this->StudiensemesterModel->addSelect('studienjahr_kurzbz');
$result = $this->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz =' => $studiensemester_kurzbz));
}
if (hasData($result))
{
$studienjahr = getData($result)[0]->studienjahr_kurzbz;
$startstudienjahr = substr($studienjahr, 0, 4);
$endstudienjahr = substr($studienjahr, 0, 2) . substr($studienjahr, -2);
$studienjahrObj = new StdClass();
$studienjahrObj->studienjahr_kurzbz = $studienjahr;
$studienjahrObj->startstudienjahr = $startstudienjahr;
$studienjahrObj->endstudienjahr= $endstudienjahr;
}
if (isError($result)) {
return error(getError($result));
}
return success($studienjahrObj);
}
/**
* Holt Start und Ende des Studiensemester_kurzbz
* @param studiensemester_kurzbz
@@ -50,6 +50,53 @@ class Benutzerfunktion_model extends DB_Model
return $this->execQuery($qry, $params);
}
/**
* Lädt alle Benutzerfunktionen zu einer UID im Zeitraum eines Studiensemesters
*
* @param string $uid
* @param string $stdsem
* @param string $funktion_kurzbz (optional)
*
* @return stdClass
*/
public function getBenutzerFunktionByUidInStdsem($uid, $stdsem, $funktion_kurzbz = null)
{
$stdsemEscaped = $this->escape($stdsem);
$this->addSelect($this->dbTable . ".*");
$this->addSelect("oe.bezeichnung AS organisationseinheit_bezeichnung");
$this->addSelect("oe.organisationseinheittyp_kurzbz");
$this->addJoin("public.tbl_organisationseinheit oe", "oe_kurzbz");
$this->db->where("uid", $uid);
if ($funktion_kurzbz !== null)
$this->db->where("funktion_kurzbz", $funktion_kurzbz);
$this->db->group_start();
$this->db->where("datum_bis IS NULL");
$this->db->or_where("datum_bis >=", "(
SELECT start
FROM public.tbl_studiensemester
WHERE studiensemester_kurzbz = " . $stdsemEscaped . "
)", false);
$this->db->group_end();
$this->db->group_start();
$this->db->where("datum_von IS NULL");
$this->db->or_where("datum_von <=", "(
SELECT ende
FROM public.tbl_studiensemester
WHERE studiensemester_kurzbz = " . $stdsemEscaped . "
)", false);
$this->db->group_end();
$this->addOrder("datum_bis", "NULLS LAST");
$this->addOrder("datum_von", "NULLS LAST");
return $this->load();
}
/**
* Get the Benutzerfunktion using the person_id
*/
+2 -2
View File
@@ -156,10 +156,10 @@ class Notiz_model extends DB_Model
$qry = "
SELECT
n.*, count(dms_id) as countDoc, z.notizzuordnung_id,
TO_CHAR (CASE
(CASE
WHEN n.updateamum >= n.insertamum THEN n.updateamum
ELSE n.insertamum
END::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS lastUpdate,
END) AS lastUpdate,
regexp_replace(n.text, '<[^>]*>', '', 'g') as text_stripped,
TO_CHAR(n.start::timestamp, 'DD.MM.YYYY') AS start_format,
TO_CHAR(n.ende::timestamp, 'DD.MM.YYYY') AS ende_format,
@@ -115,13 +115,18 @@ class Betriebsmittelperson_model extends DB_Model
$query = "
SELECT
bm.nummer, bmp.person_id, bm.betriebsmitteltyp, bmp.anmerkung as anmerkung, bmp.retouram, TO_CHAR(bmp.retouram::timestamp, 'DD.MM.YYYY') AS format_retour, bmp.ausgegebenam, TO_CHAR(bmp.ausgegebenam::timestamp, 'DD.MM.YYYY') AS format_ausgabe, bm.beschreibung, bmp.uid, bmp.kaution, bm.betriebsmittel_id, bmp.betriebsmittelperson_id, bm.inventarnummer, bm.nummer2
bm.nummer, bmp.person_id, bm.betriebsmitteltyp, bmp.anmerkung as anmerkung,
bmp.retouram,
bmp.ausgegebenam,
bm.beschreibung, bmp.uid, bmp.kaution,
bm.betriebsmittel_id, bmp.betriebsmittelperson_id,
bm.inventarnummer, bm.nummer2
FROM
wawi.tbl_betriebsmittelperson bmp
wawi.tbl_betriebsmittelperson bmp
JOIN
wawi.tbl_betriebsmittel bm ON (bmp.betriebsmittel_id = bm.betriebsmittel_id)
wawi.tbl_betriebsmittel bm ON (bmp.betriebsmittel_id = bm.betriebsmittel_id)
WHERE
" . $cond . " = ? ";
" . $cond . " = ? ";
return $this->execQuery($query, array($id));
}
@@ -217,12 +217,28 @@ class Mitarbeiter_model extends DB_Model
return success($kurzbz);
}
public function searchMitarbeiter($filter)
/**
* Search function for mitarbeiter
* @param $filter searchstring: searches for nachname, vorname, mitarbeiter_uid
* $param $mode gives the resultobject in different version:
* null : "[mitarbeiter_uid], Nachname, Vorname, (mitarbeiter_uid)"
* 'mitAkadGrad': "[mitarbeiter_uid], Nachname, Vorname, Titelpre, Titelpost (mitarbeiter_uid)"
* 'ohneMaUid' : "[mitarbeiter_uid], Nachname, Vorname, Titelpre, Titelpost"
* @return object in 3 versions
*/
public function searchMitarbeiter($filter, $mode=null)
{
$filter = strtoLower($filter);
if ($mode == "mitAkadGrad")
$returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
elseif ($mode == "ohneMaUid")
$returnwert = "p.person_id, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter";
else
$returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
$qry = "
SELECT
ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter
SELECT " . $returnwert . "
FROM
public.tbl_mitarbeiter ma
JOIN
@@ -238,4 +254,28 @@ class Mitarbeiter_model extends DB_Model
return $this->execQuery($qry);
}
/**
* Gets Mitarbeiter for a certain Lehrveranstaltung.
*
* @param $lehrveranstaltung_id
* @return array with Mitarbeiter and their Lehreinheiten
*/
public function getMitarbeiterFromLV($lehrveranstaltung_id){
//TODO(manu) maybe filter that in pruefungslist.js ?
$qry = "SELECT DISTINCT
lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid
FROM
lehre.tbl_lehreinheitmitarbeiter, campus.vw_mitarbeiter, lehre.tbl_lehreinheit
WHERE
lehrveranstaltung_id= ?
AND
mitarbeiter_uid=uid
AND
tbl_lehreinheitmitarbeiter.lehreinheit_id=tbl_lehreinheit.lehreinheit_id;";
$parametersArray = array($lehrveranstaltung_id);
return $this->execQuery($qry, $parametersArray);
}
}
@@ -71,6 +71,51 @@ class Reservierung_model extends DB_Model
return $query_result;
}
/**
* @param $uid
*
* @return stdClass
*/
public function getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz = null)
{
$raum_reservierungen_query = "SELECT res.*, beginn, ende,
CASE
WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz
ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/'))
END as gruppen_kuerzel
FROM campus.vw_reservierung res
JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde
WHERE res.uid = ? AND datum >= ? AND datum <= ?";
// $subquery = is_null($ort_kurzbz)? $stundenplan_reservierungen_query:$raum_reservierungen_query;
$subquery = $raum_reservierungen_query;
$query_result= $this->execReadOnlyQuery("
SELECT
'reservierung' as type, beginn, ende, datum,
COALESCE(titel, beschreibung) as topic,
array_agg(DISTINCT mitarbeiter_kurzbz) as lektor,
array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
ort_kurzbz, 'FFFFFF' as farbe
FROM
(
". $subquery ."
) AS subquery
GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung
ORDER BY datum, beginn
", [getAuthUID(), $start_date, $end_date]);
return $query_result;
}
/**
* @param $uid
*
@@ -186,9 +186,119 @@ class Stundenplan_model extends DB_Model
return $query_result;
}
/**
* queries Stundenplan but for a whole lva, irrespective of who is requesting it
*
* @return void
*/
public function getStundenplanLVA($start_date, $end_date, $lv_id) {
return $this->execReadOnlyQuery("
SELECT
'lehreinheit' as type, beginn, ende, datum,
CONCAT(lehrfach,'-',lehrform) as topic,
array_agg(DISTINCT lektor) as lektor,
array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
string_agg(DISTINCT ort_kurzbz, '/') as ort_kurzbz,
array_agg(DISTINCT lehreinheit_id) as lehreinheit_id,
titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
FROM
(
SELECT unr,datum,beginn, ende,
CASE
WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
ELSE lektor
END as lektor,
CASE
WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz
ELSE CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/'))
END as gruppen_kuerzel,
(SELECT bezeichnung
FROM public.tbl_organisationseinheit
WHERE oe_kurzbz IN(
SELECT oe_kurzbz
FROM lehre.tbl_lehrveranstaltung
WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id
)) as organisationseinheit,
ort_kurzbz, studiengang_kz, titel,lehreinheit_id,lehrfach_id,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz
FROM (
SELECT sp.*
FROM lehre.vw_stundenplan sp
WHERE
sp.datum >= ?
AND sp.datum <= ? AND sp.lehrveranstaltung_id = ?
) sp
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde
) as subquery
GROUP BY unr, datum, beginn, ende, ort_kurzbz, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
ORDER BY datum, beginn
", [$start_date, $end_date, $lv_id]);
}
/**
* queries Stundenplan and filters by assigned ma_kurzbz, very similar to get by LVA
*
* @return void
*/
public function getStundenplanMitarbeiter($start_date, $end_date, $ma_uid) {
return $this->execReadOnlyQuery("
SELECT
'lehreinheit' as type, beginn, ende, datum,
CONCAT(lehrfach,'-',lehrform) as topic,
array_agg(DISTINCT lektor) as lektor,
array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
string_agg(DISTINCT ort_kurzbz, '/') as ort_kurzbz,
array_agg(DISTINCT lehreinheit_id) as lehreinheit_id,
titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
FROM
(
SELECT unr,datum,beginn, ende,
CASE
WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
ELSE sp.lektor
END as lektor,
CASE
WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz
ELSE CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/'))
END as gruppen_kuerzel,
(SELECT bezeichnung
FROM public.tbl_organisationseinheit
WHERE oe_kurzbz IN(
SELECT oe_kurzbz
FROM lehre.tbl_lehrveranstaltung
WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id
)) as organisationseinheit,
sp.ort_kurzbz, sp.studiengang_kz, sp.titel,sp.lehreinheit_id,sp.lehrfach_id,sp.anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz
FROM (
SELECT sp.*
FROM lehre.vw_stundenplan sp
WHERE
sp.datum >= ?
AND sp.datum <= ?
) sp
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde
JOIN public.tbl_mitarbeiter ON public.tbl_mitarbeiter.kurzbz = sp.mitarbeiter_kurzbz
WHERE mitarbeiter_uid = ?
) as subquery
GROUP BY unr, datum, beginn, ende, ort_kurzbz, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
ORDER BY datum, beginn", [$start_date, $end_date, $ma_uid]);
}
/**
* NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester.
* @param string $uid the user id that is used to fetch the stundenplan rows from the lehre.vw_stundenplan table
*
* @return mixed
*/
@@ -11,4 +11,49 @@ class Vorlagestudiengang_model extends DB_Model
$this->dbTable = 'public.tbl_vorlagestudiengang';
$this->pk = 'vorlagestudiengang_id';
}
/**
* Gets the Current Vorlagestudiengang
*
* @param string $vorlage_kurzbz
* @param string $oe_kurzbz Or studiengang_kz
* @param integer $version (optional)
* @param boolean|null $active (optional)
*
* @return stdClass
*/
public function getCurrent($vorlage_kurzbz, $oe_kurzbz, $version = null, $active = true)
{
if (is_numeric($oe_kurzbz)) {
$initselect = "SELECT oe_kurzbz, 1 AS l FROM public.tbl_studiengang WHERE studiengang_kz = " . $this->escape($oe_kurzbz);
} else {
$initselect = "SELECT oe_kurzbz, 1 AS l FROM public.tbl_organisationseinheit WHERE oe_kurzbz = " . $this->escape($oe_kurzbz);
}
$this->addJoin("(
WITH RECURSIVE tmp (oe_kurzbz, l) AS (
" . $initselect . "
UNION ALL
SELECT o.oe_parent_kurzbz AS oe_kurzbz, l+1 AS l
FROM tmp
JOIN public.tbl_organisationseinheit o USING (oe_kurzbz)
WHERE o.oe_parent_kurzbz IS NOT NULL
) SELECT * FROM tmp
) oe", "oe_kurzbz");
if (!is_null($version))
$this->db->where('version', $version);
if ($active)
$this->db->where('aktiv', true);
$this->addOrder('l', 'ASC');
$this->addOrder('version', 'DESC');
$this->addLimit(1);
$result = $this->loadWhere([
'vorlage_kurzbz' => $vorlage_kurzbz
]);
return $result;
}
}
+16
View File
@@ -0,0 +1,16 @@
<?php
$includesArray =array(
'title' => 'Infoterminal',
'tabulator5' => true,
'primevue3' => true,
);
$this->load->view(
'templates/CISVUE-Header',
$includesArray
);
?>
<iframe style="width:100%; height:90vh;" id="Infoterminal" src="<?php echo base_url() . 'cis/infoterminal/?forcelogin=true'; ?>" name="Infoterminal" frameborder="0" >
No iFrames
</iframe>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
-15
View File
@@ -1,15 +0,0 @@
<?php
$includesArray = array(
'title' => 'MyLv',
'customJSModules' => ['public/js/apps/Cis/MyLv/Student.js'],
'customCSSs' => ['public/css/components/MyLv.css']
);
$this->load->view('templates/CISVUE-Header', $includesArray);
?>
<div id="content">
<mylv-student></mylv-student>
</div>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
$includesArray = array(
'title' => 'Stundenplan',
'title' => 'Profil',
'customJSModules' => ['public/js/apps/Cis/Profil.js'],
'tabulator5' => true,
'primevue3' => true,
-15
View File
@@ -1,15 +0,0 @@
<?php
$includesArray = array(
'title' => 'Stundenplan',
'customJSModules' => ['public/js/apps/Cis/Stundenplan.js'],
'customCSSs' => ['public/css/components/calendar.css']
);
$this->load->view('templates/CISVUE-Header', $includesArray);
?>
<div id="content">
</div>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
@@ -0,0 +1,41 @@
<?php
$includesArray = array(
'title' => 'Cis4',
'axios027' => true,
'bootstrap5' => true,
'fontawesome6' => true,
'tabulator5' => true,
'vue3' => true,
'primevue3' => true,
'customCSSs' => array(
'public/css/components/verticalsplit.css',
'public/css/components/searchbar/searchbar.css',
'public/css/Fhc.css',
'public/css/components/dashboard.css',
'public/css/components/calendar.css',
'public/css/components/Sprachen.css',
'public/css/components/MyLv.css',
'public/css/components/FilterComponent.css',
'public/css/components/Profil.css',
'public/css/components/FormUnderline.css',
'public/css/Cis4/Cms.css',
),
'customJSs' => array(
'vendor/npm-asset/primevue/accordion/accordion.js',
'vendor/npm-asset/primevue/accordiontab/accordiontab.js'
),
'customJSModules' => array(
'public/js/apps/Dashboard/Fhc.js'
),
);
$this->load->view('templates/CISVUE-Header', $includesArray);
?>
<div id="fhccontent" route=<?php echo $route ?>>
<router-view
:view-data='<?php echo json_encode($viewData) ?>'
></router-view>
</div>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
-32
View File
@@ -1,32 +0,0 @@
<?php
$includesArray = array(
'customJSModules' => ['public/js/apps/Cis/Cms.js'],
'primevue3'=>true,
'customCSSs' => [
'public/css/Cis4/Cms.css',
#'skin/style.css.php'
]
);
// adds the tabulator5 dependency for all templates to replace the tablesorter
$includesArray['tabulator5'] = true;
if(defined('CIS4')){
$this->load->view('templates/CISVUE-Header', $includesArray);
}else{
$this->load->view('templates/FHC-Header', $includesArray);
}
?>
<div id="cms">
<?php echo (isset($content_id) ? '<cms-content :content_id="'.$content_id.'" :version="'.$version.'" :sprache="'.$sprache.'" :sichtbar="'.$sichtbar.'" />' : '<cms-news/>'); ?>
</div>
<?php
if (defined('CIS4')) {
$this->load->view('templates/CISVUE-Footer', $includesArray);
} else {
$this->load->view('templates/FHC-Footer', $includesArray);
}
?>
@@ -1,20 +0,0 @@
<?php
$includesArray = array(
'title' => 'RoomInformation',
'customJSModules' => ['public/js/apps/Cis/RoomInformation.js'],
'customCSSs' => ['public/css/components/calendar.css']
);
$this->load->view('templates/CISVUE-Header', $includesArray);
?>
<div >
<h2>Room Information: <?php echo $ort_kurzbz ?></h2>
<hr>
<div id="content">
<room-information ort_kurzbz="<?php echo $ort_kurzbz ?>"></room-information>
</div>
</div>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
-20
View File
@@ -1,20 +0,0 @@
<?php
$includesArray = array(
'title' => 'Dashboard',
'tabulator5'=>true,
'primevue3' => true,
'customJSModules' => ['public/js/apps/Dashboard/Fhc.js'],
'customCSSs' => [
'public/css/components/dashboard.css'
],
);
$this->load->view('templates/CISVUE-Header', $includesArray);
?>
<div id="content">
<fhc-dashboard dashboard="CIS" view-data-string='<?php echo json_encode($viewData) ?>' />
</div>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
+4 -2
View File
@@ -34,8 +34,10 @@
<?php
$configArray = [
'generateAlias' => !defined('GENERATE_ALIAS_STUDENT') ? true : GENERATE_ALIAS_STUDENT,
'showZgvDoktor' => !defined('ZGV_DOKTOR_ANZEIGEN') ? false : ZGV_DOKTOR_ANZEIGEN,
'showZgvErfuellt' => !defined('ZGV_ERFUELLT_ANZEIGEN') ? false : ZGV_ERFUELLT_ANZEIGEN
//replaced by possibility to hide each formular field via config stv.php
#'showZgvDoktor' => !defined('ZGV_DOKTOR_ANZEIGEN') ? false : ZGV_DOKTOR_ANZEIGEN,
#'showZgvErfuellt' => !defined('ZGV_ERFUELLT_ANZEIGEN') ? false : ZGV_ERFUELLT_ANZEIGEN
'showHintKommPrfg' => !defined('FAS_STUDSTATUS_SHOW_KOMM_PRFG_HINT') ? false : FAS_STUDSTATUS_SHOW_KOMM_PRFG_HINT
];
?>
@@ -85,7 +85,7 @@ else
}
</style>
<div id="page-wrapper">
<div cis4Reload="true" id="page-wrapper">
<div class="container-fluid">
<!-- header -->
<div class="row">
@@ -8,7 +8,7 @@
$STUDIENSEMESTER = '\''.$this->variablelib->getVar('infocenter_studiensemester').'\'';
$LOGDATA_NAME = '\'Message sent\'';
$LOGDATA_VON = '\'online\'';
$STUDIENGEBUEHR_ANZAHLUNG = '\'StudiengebuehrAnzahlung\'';
$KAUTION_DRITT_STAAT = '\'KautionDrittStaat\'';
$query = '
SELECT
@@ -62,7 +62,7 @@ $query = '
FROM public.tbl_konto konto
WHERE konto.person_id = p.person_id
AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .'
AND konto.buchungstyp_kurzbz = '. $STUDIENGEBUEHR_ANZAHLUNG .'
AND konto.buchungstyp_kurzbz = '. $KAUTION_DRITT_STAAT .'
) AS "Kaution"
FROM
public.tbl_prestudentstatus pss
@@ -13,7 +13,7 @@
$ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz');
$AKTE_TYP = '\'identity\', \'zgv_bakk\'';
$STUDIENSEMESTER = '\''.$this->variablelib->getVar('infocenter_studiensemester').'\'';
$STUDIENGEBUEHR_ANZAHLUNG = '\'StudiengebuehrAnzahlung\'';
$KAUTION_DRITT_STAAT = '\'KautionDrittStaat\'';
$ORG_NAME = '\'InfoCenter\'';
$ONLINE = '\'online\'';
@@ -302,7 +302,7 @@
FROM public.tbl_konto konto
WHERE konto.person_id = p.person_id
AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .'
AND konto.buchungstyp_kurzbz = '. $STUDIENGEBUEHR_ANZAHLUNG .'
AND konto.buchungstyp_kurzbz = '. $KAUTION_DRITT_STAAT .'
) AS "Kaution"
FROM public.tbl_person p
LEFT JOIN (
@@ -13,7 +13,8 @@
$ORG_NAME = '\'InfoCenter\'';
$IDENTITY = '\'identity\'';
$ONLINE = '\'online\'';
$STUDIENGEBUEHR_ANZAHLUNG = '\'StudiengebuehrAnzahlung\'';
$KAUTION_DRITT_STAAT = '\'KautionDrittStaat\'';
$query = '
SELECT
@@ -275,7 +276,7 @@ $query = '
FROM public.tbl_konto konto
WHERE konto.person_id = p.person_id
AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .'
AND konto.buchungstyp_kurzbz = '. $STUDIENGEBUEHR_ANZAHLUNG .'
AND konto.buchungstyp_kurzbz = '. $KAUTION_DRITT_STAAT .'
) AS "Kaution"
FROM public.tbl_person p
LEFT JOIN (
@@ -9,7 +9,8 @@
$ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz');
$STUDIENSEMESTER = '\''.$this->variablelib->getVar('infocenter_studiensemester').'\'';
$ORG_NAME = '\'InfoCenter\'';
$STUDIENGEBUEHR_ANZAHLUNG = '\'StudiengebuehrAnzahlung\'';
$KAUTION_DRITT_STAAT = '\'KautionDrittStaat\'';
$query = '
SELECT
@@ -206,7 +207,7 @@ $query = '
FROM public.tbl_konto konto
WHERE konto.person_id = p.person_id
AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .'
AND konto.buchungstyp_kurzbz = '. $STUDIENGEBUEHR_ANZAHLUNG .'
AND konto.buchungstyp_kurzbz = '. $KAUTION_DRITT_STAAT .'
) AS "Kaution"
FROM public.tbl_person p
LEFT JOIN (
+2 -1
View File
@@ -8,11 +8,12 @@
'filtercomponent' => true,
'navigationcomponent' => true,
'tabulator5' => true,
'primevue3' => true,
'phrases' => array(
'global' => array('mailAnXversandt'),
'ui' => array('bitteEintragWaehlen')
),
'customJSModules' => array('public/js/apps/LogsViewer/LogsViewer.js')
'customJSModules' => array('public/js/apps/LogsViewer/LogsViewer.js'),
);
$this->load->view('templates/FHC-Header', $includesArray);
+2 -11
View File
@@ -5,6 +5,7 @@ $includesArray = array(
'bootstrap5' => true,
'fontawesome6' => true,
'axios027' => true,
'primevue3' => true,
'customJSModules' => array_merge([
'public/js/apps/Cis.js'
], $customJSModules ?? []),
@@ -15,15 +16,6 @@ $includesArray = array(
$this->load->view('templates/FHC-Header', $includesArray);
if (!isset($menu)) {
$ci =& get_instance(); // get CI instance
$ci->load->model('content/Content_model', 'ContentModel');
$ci->load->config('cis');
$cis4_content_id = $ci->config->item('cis_menu_root_content_id');
$result = $ci->ContentModel->getMenu($cis4_content_id, getAuthUID());
$menu = getData($result)->childs ?? [];
}
?>
<script type="text/javascript">
@@ -39,8 +31,7 @@ if (!isset($menu)) {
logout-url="<?= site_url('Cis/Auth/logout'); ?>"
:searchbaroptions="searchbaroptions"
:searchfunction="searchfunction"
:menu="<?= htmlspecialchars(json_encode(array_values($menu)), ENT_QUOTES, 'UTF-8') ?>"
></cis-menu>
</header>
<main id="cis-main" class="flex-grow-1 p-4">
<main id="cis-main" class="flex-grow-1 p-4 pt-2">
@@ -23,6 +23,7 @@
$tablesorter2 = isset($tablesorter2) ? $tablesorter2 : false;
$tabulator4 = isset($tabulator4) ? $tabulator4 : false;
$tabulator5 = isset($tabulator5) ? $tabulator5 : false;
$tabulator6 = isset($tabulator6) ? $tabulator6 : false;
$tabulator5JQuery = isset($tabulator5JQuery) ? $tabulator5JQuery : false;
$tinymce3 = isset($tinymce3) ? $tinymce3 : false;
$tinymce5 = isset($tinymce5) ? $tinymce5 : false;
+11 -1
View File
@@ -30,7 +30,7 @@
// Generates the global object to pass phrases to javascripts
// NOTE: must be called before including the PhrasesLib.js
if ($phrases != null) generateJSPhrasesStorageObject($phrases);
// --------------------------------------------------------------------------------------------------------
// From vendor folder
@@ -104,6 +104,8 @@
if ($tabulator5 === true) generateJSsInclude('vendor/olifolkerd/tabulator5/dist/js/tabulator.min.js');
// Tabulator 5 JQuery
if ($tabulator5JQuery === true) generateJSsInclude('public/js/tabulator/jquery_wrapper.js');
// Tabulator 6 JS
if ($tabulator6 === true) generateJSsInclude('vendor/olifolkerd/tabulator6/dist/js/tabulator.min.js');
// Tinymce 3 JS
if ($tinymce3 === true) generateJSsInclude('include/tiny_mce/tiny_mce.js');
@@ -123,6 +125,13 @@
}
generateJSsInclude('vendor/vuejs/vuerouter4/vue-router.global.js');
}
// Highcharts
if (isset($highcharts) && $highcharts === true)
{
generateJSsInclude('vendor/highcharts/highcharts-dist/highcharts.js');
generateJSsInclude('vendor/highcharts/highcharts-dist/modules/current-date-indicator.js');
}
// PrimeVue
if ($primevue3)
@@ -143,6 +152,7 @@
generateJSsInclude('vendor/npm-asset/primevue/toastservice/toastservice.min.js');
generateJSsInclude('vendor/npm-asset/primevue/confirmdialog/confirmdialog.min.js');
generateJSsInclude('vendor/npm-asset/primevue/confirmationservice/confirmationservice.min.js');
generateJSsInclude('vendor/npm-asset/primevue/tieredmenu/tieredmenu.min.js');
}
// --------------------------------------------------------------------------------------------------------
@@ -79,6 +79,9 @@
// Tabulator 5 CSS
if ($tabulator5 === true) generateCSSsInclude('public/css/Tabulator5.css');
// Tabulator 6 CSS
if ($tabulator6 === true) generateCSSsInclude('public/css/Tabulator6.css');
// Tinymce 5 CSS
if ($tinymce5 === true) generateCSSsInclude('public/css/TinyMCE5.css');
+1 -3
View File
@@ -95,10 +95,8 @@ class TableWidget extends Widget
*/
public function display($widgetData)
{
$this->view(self::WIDGET_URL_TABLE, array(
'tableUniqueId' => $widgetData[TableWidgetLib::TABLE_UNIQUE_ID],
'bootstrapVersion' => $widgetData[TableWidgetLib::TABLE_BOOTSTRAP_VERSION],
'tableUniqueId' => $widgetData[TableWidgetLib::TABLE_UNIQUE_ID]
)); // GUI starts here
}
+8
View File
@@ -38,6 +38,14 @@ require_once('../../include/authentication.class.php');
require_once('../../include/addon.class.php');
require_once('../../include/'.EXT_FKT_PATH.'/serviceterminal.inc.php');
// 2025-02-05 ma0080 add query parameter to force login e.g. when used in iframe in CIS4.0 begin
if( isset($_GET['forcelogin']) && !isset($_SERVER['PHP_AUTH_USER']) ) {
header('WWW-Authenticate: Basic Realm="' . AUTH_NAME . '"');
http_response_code(401);
die();
}
// 2025-02-05 ma0080 add query parameter to force login e.g. when used in iframe in CIS4.0 end
if (!$db = new basis_db())
$db=false;
+7 -6
View File
@@ -125,7 +125,7 @@ $projekttyp_kurzbz = $projektarbeit_obj->projekttyp_kurzbz;
// paarbeit sollte nur ab bestimmten Zeitpunkt online bewertet werden
$paIsCurrent = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
if(!is_numeric($paIsCurrent) || $paIsCurrent < 0)
if(!is_bool($paIsCurrent))
{
echo "<font color=\"#FF0000\">".$p->t('abgabetool/fehlerAktualitaetProjektarbeit')."</font><br>&nbsp;";
}
@@ -166,7 +166,7 @@ if(in_array($betreuerart, array('Erstbegutachter', 'Senatsvorsitz')))
}
// Mail mit Token an Zweitbegutachter senden
if (count($zweitbetreuerArr) > 0 && $paIsCurrent >= 1 && isset($_GET['zweitbegutachtertoken']) && isset($_GET['zweitbetreuer_person_id']))
if (count($zweitbetreuerArr) > 0 && $paIsCurrent === true && isset($_GET['zweitbegutachtertoken']) && isset($_GET['zweitbetreuer_person_id']))
{
$qry_std="SELECT * FROM campus.vw_benutzer where uid=".$db->db_add_param($uid);
if(!$result_std=$db->db_query($qry_std))
@@ -482,7 +482,7 @@ $htmlstr .= "<table id='beurteilungheadertable' width=100%>\n";
$htmlstr .= "<tr><td style='font-size:16px'>".$p->t('abgabetool/student').": <b>".$db->convert_html_chars($studentenname)."</b></td>";
$htmlstr .= "<td width=10% align=center>";
$semester_benotbar = $paIsCurrent >= 1;
$semester_benotbar = $paIsCurrent === true;
$endupload_vorhanden = $num_rows_endupload >= 1;
if ($semester_benotbar && $endupload_vorhanden)
@@ -495,7 +495,8 @@ if ($semester_benotbar && $endupload_vorhanden)
}
else
{
$quick_info = !$semester_benotbar ? $p->t('abgabetool/aeltereParbeitBenoten') : $p->t('abgabetool/keinEnduploadErfolgt');
$quick_info = !$semester_benotbar ? $p->t('abgabetool/aeltereParbeitBenotenQuickInfo') : $p->t('abgabetool/keinEnduploadErfolgt');
$info_text = !$semester_benotbar ? $p->t('abgabetool/aeltereParbeitBenoten') : $p->t('abgabetool/keinEnduploadErfolgt');
$htmlstr .= "<form action='javascript:void(0);'>";
$htmlstr .= "<input type='submit' value='".$p->t('abgabetool/benoten')."' title='".$quick_info."'
alt='".$quick_info."' disabled>";
@@ -516,7 +517,7 @@ else
}
$htmlstr .= "<tr>
<td style='font-size:16px'>" . $p->t('abgabetool/titel') . ": <b>".$db->convert_html_chars($titel)."<b></td>
<td align='center' class='warningtext'>".(isset($quick_info) ? $quick_info : '')."</td>
<td align='center' class='warningtext'>".(isset($info_text) ? $info_text : '')."</td>
<td valign=\"right\"><a href='abgabe_student_frameset.php?uid=$uid' target='_blank'>".$p->t('abgabetool/studentenansicht')."</a></td>";
$htmlstr .= "</tr>\n";
@@ -544,7 +545,7 @@ if (isset($zweitbetreuerArr) && is_array($zweitbetreuerArr)) // wenn es Zweitbet
$htmlstr .= "&nbsp;&nbsp;<img src='../../../skin/images/exclamation.png' title='" . $p->t('abgabetool/zweitBegutachterEmailFehlt') . "' alt='" . $p->t('abgabetool/zweitBegutachterEmailFehlt') . "'/>";
// Token senden button wenn Zweitbegutachter extern ist und Projektarbeit nicht für altes Semester ist
if (isset($zweitbetreuer->email) && !isset($zweitbetreuer->uid) && $paIsCurrent >= 1)
if (isset($zweitbetreuer->email) && !isset($zweitbetreuer->uid) && $paIsCurrent === true)
{
$htmlstr .= "<form action='" . htmlspecialchars($_SERVER['PHP_SELF']) . "' method='GET' style='display: inline'>\n";
$htmlstr .= "<input type='hidden' name='uid' value='" . $student_uid . "'>";
+2 -2
View File
@@ -195,13 +195,13 @@ else
$htmlstr .= "<td>";
if (!is_null($row->babgeschickt))
$htmlstr .= "<a href='../pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz=" . $row->betreuerart_kurzbz . "&projektarbeit_id=" . $row->projektarbeit_id . "&person_id=" . $row->betreuer_person_id ."' title='".$p->t('abgabetool/projektbeurteilungDownload')."'>".$p->t('abgabetool/projektbeurteilungErstDownload')."</a>";
$htmlstr .= "<a href='./projektbeurteilungDocumentExport.php?betreuerart_kurzbz=" . $row->betreuerart_kurzbz . "&projektarbeit_id=" . $row->projektarbeit_id . "&person_id=" . $row->betreuer_person_id ."' title='".$p->t('abgabetool/projektbeurteilungDownload')."'>".$p->t('abgabetool/projektbeurteilungErstDownload')."</a>";
if (!is_null($row->babgeschickt) && !is_null($row->zweitbetreuer_abgeschickt))
$htmlstr .= "/";
if (!is_null($row->zweitbetreuer_abgeschickt))
$htmlstr .= "<a href='../pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz=" . $row->zweitbetreuer_betreuerart_kurzbz . "&projektarbeit_id=" . $row->projektarbeit_id . "&person_id=" . $row->zweitbetreuer_person_id."' title='".$p->t('abgabetool/projektbeurteilungDownload')."'>".$p->t('abgabetool/projektbeurteilungZweitDownload')."</a>";
$htmlstr .= "<a href='./projektbeurteilungDocumentExport.php?betreuerart_kurzbz=" . $row->zweitbetreuer_betreuerart_kurzbz . "&projektarbeit_id=" . $row->projektarbeit_id . "&person_id=" . $row->zweitbetreuer_person_id."' title='".$p->t('abgabetool/projektbeurteilungDownload')."'>".$p->t('abgabetool/projektbeurteilungZweitDownload')."</a>";
$htmlstr .= "</td>";
}
+5 -5
View File
@@ -472,8 +472,8 @@ if($command=="update" && $error!=true)
else
{
// paarbeit sollte nur ab bestimmten Zeitpunkt online bewertet werden
$num_rows_sem = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
if(!is_numeric($num_rows_sem) || $num_rows_sem < 0)
$paIsCurrent = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
if(!is_bool($paIsCurrent))
{
echo "<font color=\"#FF0000\">".$p->t('abgabetool/fehlerAktualitaetProjektarbeit')."</font><br>&nbsp;";
}
@@ -495,7 +495,7 @@ if($command=="update" && $error!=true)
$maildata['student_voller_name'] = trim($row_std->titelpre." ".$row_std->vorname." ".$row_std->nachname." ".$row_std->titelpost);
$maildata['abgabetyp'] = $abgabetyp;
$maildata['parbeituebersichtlink'] = "<p><a href='".APP_ROOT."cis/private/lehre/abgabe_lektor_frameset.html'>Zur Projektarbeitsübersicht</a></p>";
$maildata['bewertunglink'] = $num_rows_sem >= 1 && $paabgabetyp_kurzbz == 'end' ? "<p><a href='$mail_fulllink'>Zur Beurteilung der Arbeit</a></p>" : "";
$maildata['bewertunglink'] = $paIsCurrent && $paabgabetyp_kurzbz == 'end' ? "<p><a href='$mail_fulllink'>Zur Beurteilung der Arbeit</a></p>" : "";
$maildata['token'] = "";
$mailres = sendSanchoMail(
@@ -557,8 +557,8 @@ if($command=="update" && $error!=true)
$zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name'];
$zweitbetmaildata['abgabetyp'] = $abgabetyp;
$zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : "";
$zweitbetmaildata['bewertunglink'] = $num_rows_sem >= 1 ? "<p><a href='$mail_link'>Zur Beurteilung der Arbeit</a></p>" : "";
$zweitbetmaildata['token'] = $num_rows_sem >= 1 && isset($begutachterMitToken->zugangstoken) && !$intern ? "<p>Zugangstoken: " . $begutachterMitToken->zugangstoken . "</p>" : "";
$zweitbetmaildata['bewertunglink'] = $paIsCurrent ? "<p><a href='$mail_link'>Zur Beurteilung der Arbeit</a></p>" : "";
$zweitbetmaildata['token'] = $paIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "<p>Zugangstoken: " . $begutachterMitToken->zugangstoken . "</p>" : "";
$mailres = sendSanchoMail(
'ParbeitsbeurteilungEndupload',

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