Compare commits

..

21 Commits

Author SHA1 Message Date
Andreas Österreicher 2f90112e4d Merge branch 'rc_reihungstest' 2026-06-01 10:58:33 +02:00
Andreas Österreicher 774eb90bcc Merge branch 'feature-76918/reihungstest_gebiete_nur_von_abegschickten_studiengaengen' into rc_reihungstest 2026-06-01 09:46:12 +02:00
Andreas Österreicher 1def930147 Merge branch 'feature-76920/reihungstest_fertig_nachricht_anzeigen_wenn_alle_gebiete_abgeschlossen_wurden' into rc_reihungstest 2026-06-01 09:11:02 +02:00
Andreas Österreicher 30b8a406a5 Merge branch 'feature-75888/reihungstest_mehrfachdurchfuehrung' into rc_reihungstest 2026-06-01 09:10:35 +02:00
Andreas Österreicher 093842274e Merge branch 'feature-75887/reihungstest_constructor_popups' into rc_reihungstest 2026-06-01 09:05:22 +02:00
ma0048 fd2f4187fa wording angepasst 2026-05-27 12:34:04 +02:00
ma0048 b2bebb7fa3 alle gebiete wurden gestartet meldung 2026-05-26 13:32:21 +02:00
ma0048 e32cce57fe gebiete nur von abgeschickten stg 2026-05-26 13:26:16 +02:00
Harald Bamberger cb7a0f7669 Merge branch 'feature-70376/Lohnguide' 2026-05-13 11:53:14 +02:00
Harald Bamberger 68d97a5e97 handle case where old value or new value and not both are null explicitly in markDirty Method 2026-05-13 11:42:25 +02:00
Harald Bamberger d27071528f revert change to comparision in markDirty Method 2026-05-13 11:16:18 +02:00
Harald Bamberger 17772c3738 Merge branch 'master' into feature-70376/Lohnguide 2026-05-13 11:15:07 +02:00
Harald Bamberger bbb4f8a01c Merge branch 'bug-76146/studvw_karteireiter_dokumente_akzeptiert_eintraege_ohne_vorhandenes_dokument' 2026-05-06 16:13:50 +02:00
ma0048 bf5ab6b7dd nur prestudent mit dem bewerber status beruecksichtigen 2026-05-05 15:19:57 +02:00
Harald Bamberger b7e48633ab Merge branch 'master' into bug-76146/studvw_karteireiter_dokumente_akzeptiert_eintraege_ohne_vorhandenes_dokument 2026-05-05 13:33:38 +02:00
Werner Masik 7f13c128f1 allow null value for vordienstzeit; changed comparison in markDirty to !== (because of 0 vs. null issue) 2026-05-04 20:35:51 +02:00
Werner Masik 58a921b500 changed lohnguide kommentar data type to text 2026-04-30 09:47:12 +02:00
ma0048 13e8a1a9f6 bug fixed + infocenter performance 2026-04-16 14:21:02 +02:00
ma0048 21d80905a2 akzeptierte dokumente anzeigen, auch wenn kein dokument vorhanden ist 2026-04-13 13:04:46 +02:00
ma0048 36beb927f1 rt login zusaetzlicher check, ob die anmeldung mit dem prestudent studienplan uebereinstimmt 2026-03-16 09:51:08 +01:00
ma0048 ee41b2b68d alert und confirm auf dialog umgebaut 2026-03-16 09:40:40 +01:00
31 changed files with 251 additions and 1728 deletions
-9
View File
@@ -119,15 +119,6 @@ $config['navigation_header'] = array(
'requiredPermissions' => array(
'lehre/zgvpruefung:r'
)
),
'ferien' => array(
'link' => site_url('lehre/Ferienverwaltung'),
'description' => 'Ferienverwaltung',
'expand' => true,
'sort' => 55,
'requiredPermissions' => array(
'basis/ferien:r'
)
)
)
),
@@ -1,371 +0,0 @@
<?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');
//use CI3_Events as Events;
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
class Ferien extends FHCAPI_Controller
{
const DEFAULT_BERECHTIGUNG = 'basis/ferien';
/**
* Calls the parent's constructor and prepares libraries and phrases
*/
public function __construct()
{
parent::__construct([
'getFerien' => self::DEFAULT_BERECHTIGUNG.':r',
'getDefaultVonBis' => self::DEFAULT_BERECHTIGUNG.':r',
'getOe' => self::DEFAULT_BERECHTIGUNG.':r',
'getStudienplaene' => self::DEFAULT_BERECHTIGUNG.':r',
'getFerientypen' => self::DEFAULT_BERECHTIGUNG.':r',
'insert' => self::DEFAULT_BERECHTIGUNG.':w',
'update' => self::DEFAULT_BERECHTIGUNG.':w',
'delete' => self::DEFAULT_BERECHTIGUNG.':w'
]);
// Load models
$this->load->model('organisation/Ferien_model', 'FerienModel');
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->load->library('PermissionLib');
// Load language phrases
$this->loadPhrases([
'ui'
]);
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Get Ferien
*/
public function getFerien()
{
$filterVonDatum = $this->input->get('filterVonDatum');
$filterBisDatum = $this->input->get('filterBisDatum');
if (isset($filterVonDatum) && !is_valid_date($filterVonDatum))
return $this->terminateWithError($this->p->t('ui', 'error_invalid_date'), self::ERROR_TYPE_GENERAL);
if (isset($filterBisDatum) && !is_valid_date($filterBisDatum))
return $this->terminateWithError($this->p->t('ui', 'error_invalid_date'), self::ERROR_TYPE_GENERAL);
$this->FerienModel->addSelect(
'tbl_ferien.ferien_id, tbl_ferien.bezeichnung, tbl_ferien.vondatum, tbl_ferien.bisdatum,
plan.studienplan_id, oe.oe_kurzbz, fetyp.ferientyp_kurzbz, oe.bezeichnung AS oe_bezeichnung,
plan.studienplan_id, plan.bezeichnung AS studienplan_bezeichnung, fetyp.mitarbeiter AS mitarbeiterrelevant,
fetyp.studierende AS studierendenrelevant, fetyp.lehre'
);
$this->FerienModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
$this->FerienModel->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->FerienModel->addJoin('public.tbl_organisationseinheit oe', 'tbl_ferien.oe_kurzbz = oe.oe_kurzbz', 'LEFT');
$this->FerienModel->addJoin('lehre.tbl_ferientyp fetyp', 'ferientyp_kurzbz', 'LEFT');
if (isset($filterVonDatum))
$this->FerienModel->db->where('tbl_ferien.bisdatum >=', $filterVonDatum);
if (isset($filterBisDatum))
$this->FerienModel->db->where('tbl_ferien.vondatum <=', $filterBisDatum);
$this->FerienModel->addOrder('vondatum', 'DESC');
$result = $this->FerienModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/**
* Gets default dates (from - to) for filtering Ferien.
*/
public function getDefaultVonBis()
{
$defaultVonBis = ['defaultVon' => null, 'defaultBis' => null];
// get current Studienjahr
$this->load->model('organisation/Studienjahr_model', 'StudienjahrModel');
$result = $this->StudienjahrModel->getAktOrNextStudienjahr(62);
if (isError($result)) return $this->terminateWithError(getError($result));
if (hasData($result))
{
$studienjahr = getData($result)[0];
$defaultVonBis['defaultVon'] = $studienjahr->beginn;
$defaultVonBis['defaultBis'] = $studienjahr->ende;
}
$this->terminateWithSuccess($defaultVonBis);
}
/**
* Get list of Organisationseinheiten
*/
public function getOe()
{
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
//$this->StudiengangModel->addSelect(' tbl_studiengang.*, UPPER(typ::varchar(1) || kurzbz) AS kuerzel');
$this->OrganisationseinheitModel->addOrder('organisationseinheittyp_kurzbz, oe_kurzbz');
$result = $this->OrganisationseinheitModel->loadWhere(['aktiv' => true]);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/**
* Get list of Studienplaene.
* Studienplaene are returned by Organisationseinheit, von and bis datum.
*/
public function getStudienplaene()
{
// check input
$oe_kurzbz = $this->input->get('oe_kurzbz');
$vondatum = $this->input->get('vondatum');
$bisdatum = $this->input->get('bisdatum');
if (!isset($oe_kurzbz) || isEmptyString($oe_kurzbz))
return $this->terminateWithError($this->p->t('ferien', 'error_missingId', ['id' => 'Organisationseinheit']));
if (isset($vondatum) && !is_valid_date($vondatum))
return $this->terminateWithError($this->p->t('ui', 'error_invalid_date'), self::ERROR_TYPE_GENERAL);
if (isset($bisdatum) && !is_valid_date($bisdatum))
return $this->terminateWithError($this->p->t('ui', 'error_invalid_date'), self::ERROR_TYPE_GENERAL);
// get Studiengang from Oe
$result = $this->StudiengangModel->loadWhere(['oe_kurzbz' => $oe_kurzbz]);
if (isError($result)) return $this->terminateWithError(getError($result));
if (!hasData($result)) return $this->terminateWithSuccess([]);
$studiengangKzArr = array_column(getData($result), 'studiengang_kz');
// load models
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
// get all Studiensemester in requested date range
$result = $this->StudiensemesterModel->getByDateRange($vondatum, $bisdatum);
if (isError($result)) return $this->terminateWithError(getError($result));
if (!hasData($result)) return $this->terminateWithSuccess([]);
$studiensemesterArr = array_column(getData($result), 'studiensemester_kurzbz');
$studienplaene = [];
foreach ($studiengangKzArr as $studiengang_kz)
{
foreach ($studiensemesterArr as $studiensemester_kurzbz)
{
// get studienplaene for each Studiengang and Studiensemester
$this->StudienplanModel->addDistinct("studienplan_id");
$this->StudienplanModel->addSelect("lehre.tbl_studienplan.*");
$this->StudienplanModel->addJoin("lehre.tbl_studienordnung", "studienordnung_id");
$this->StudienplanModel->addJoin("lehre.tbl_studienplan_semester", "studienplan_id");
$whereArray = array(
"tbl_studienplan.aktiv" => "TRUE",
"tbl_studienordnung.studiengang_kz" => $studiengang_kz,
"tbl_studienplan_semester.studiensemester_kurzbz" => $studiensemester_kurzbz
);
$result = $this->StudienplanModel->loadWhere($whereArray);
if (isError($result)) return $this->terminateWithError(getError($result));
if (!hasData($result)) continue;
foreach (getData($result) as $studienplan)
{
$studienplaene[$studienplan->studienplan_id] = $studienplan;
}
}
}
$this->terminateWithSuccess($studienplaene);
}
/**
* Get list of Ferientypen
*/
public function getFerientypen()
{
$this->load->model('organisation/Ferientyp_model', 'FerientypModel');
$this->FerientypModel->addOrder('ferientyp_kurzbz');
$result = $this->FerientypModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/**
* Add Ferien
*/
public function insert()
{
$this->_validate();
$data = $this->_getData();
// check permissions for new Ferien
if (!$this->permissionlib->isBerechtigt(self::DEFAULT_BERECHTIGUNG, 'suid', $data['oe_kurzbz']))
return $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
$data = array_merge($data, ['insertamum' => date('c'), 'insertvon' => getAuthUID()]);
$id = $this->getDataOrTerminateWithError($this->FerienModel->insert($data));
$this->terminateWithSuccess(hasData($id) ? getData($id) : null);
}
/**
* Update Ferien
*/
public function update()
{
$id = $this->input->post('ferien_id');
if (!is_numeric($id))
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Ferien Id']), self::ERROR_TYPE_GENERAL);
$this->_validate();
$data = $this->_getData();
// check permissions for existing Ferien
$this->_validateBerechtigung('suid', $id);
// check permissions for new Ferien
if (!$this->permissionlib->isBerechtigt(self::DEFAULT_BERECHTIGUNG, 'suid', $data['oe_kurzbz']))
return $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
if (isEmptyArray($data)) return $this->terminateWithSuccess(null);
$data = array_merge($data, ['ferien_id' => $id, 'updateamum' => date('c'), 'updatevon' => getAuthUID()]);
$result = $this->FerienModel->update($id, $data);
if (isError($result)) return $this->terminateWithError(getError($result));
$this->terminateWithSuccess($id);
}
/**
* Delete Ferien
*/
public function delete()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('ferien_id', 'Ferien Id', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$ferien_id = $this->input->post('ferien_id');
$this->_validateBerechtigung('suid', $ferien_id);
$this->FerienModel->addSelect('ferien_id');
$result = $this->FerienModel->load($ferien_id);
if (!hasData($result)) return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['ferien_id' => $ferien_id]));
$result = $this->getDataOrTerminateWithError($this->FerienModel->delete($ferien_id));
$this->terminateWithSuccess();
}
/**
* Validate ferien post input.
*/
private function _validate()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('vondatum', 'Von Datum', 'required|is_valid_date');
$this->form_validation->set_rules('bisdatum', 'Bis Datum', 'required|is_valid_date');
$this->form_validation->set_rules('bezeichnung', 'Bezeichnung', 'required|max_length[128]');
$this->form_validation->set_rules('oe_kurzbz', 'Organisationseinheit', 'max_length[32]');
$this->form_validation->set_rules('studienplan_id', 'Studienplan', 'numeric');
$this->form_validation->set_rules('ferientyp_kurzbz', 'Ferientyp', 'max_length[64]');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
/**
* Checks permission for oe of Ferien. Terminates if unauthorized.
* @param typ permission type suid
* @param ferien_id
* @return void
*/
private function _validateBerechtigung($typ, $ferien_id)
{
if (isset($ferien_id))
{
$this->FerienModel->addSelect('oe_kurzbz');
$result = $this->FerienModel->load($ferien_id);
if (isError($result)) return $this->terminateWithError(getError($result));
if (hasData($result))
{
$ferien = getData($result)[0];
if ($this->permissionlib->isBerechtigt(self::DEFAULT_BERECHTIGUNG, $typ, $ferien->oe_kurzbz)) return;
}
}
return $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'));
}
/**
* Gets Ferien data from post input.
*/
private function _getData()
{
$data = [];
$allowed = [
'vondatum',
'bisdatum',
'bezeichnung',
'oe_kurzbz',
'studienplan_id',
'ferientyp_kurzbz'
];
foreach ($allowed as $field)
{
$data[$field] = $this->input->post($field);
}
return $data;
}
}
@@ -78,52 +78,32 @@ class Dokumente extends FHCAPI_Controller
$this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL);
$resultPreDoc = $this->_getPrestudentDokumente($prestudent_id);
$arrayAccepted = [];
$person_id = $this->_getPersonId($prestudent_id);
$docNames = array_map(function ($item) {
return $item->dokument_kurzbz;
}, $resultPreDoc);
$mergedArray = [];
foreach($docNames as $doc)
foreach ($resultPreDoc as $pre)
{
$result = $this->AkteModel->getAktenFAS($person_id, $doc, $studiengang_kz, $prestudent_id, true);
$result = $this->AkteModel->getAktenFAS($person_id, $pre->dokument_kurzbz, $studiengang_kz, $prestudent_id, true);
if (isError($result))
{
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if (hasData($result))
{
$data = getData($result);
foreach ($data as $value)
foreach (getData($result) as $doc)
{
array_push($arrayAccepted, $value);
$merged = clone $doc;
$merged->docdatum = $pre->docdatum;
$merged->insertvonma = $pre->insertvonma;
$merged->bezeichnung = $pre->bezeichnung;
$mergedArray[] = $merged;
}
}
}
//Mapping with document_kurzbz
$preDocMap = [];
foreach ($resultPreDoc as $pre) {
$preDocMap[$pre->dokument_kurzbz] = $pre;
}
$mergedArray = [];
foreach ($arrayAccepted as $doc) {
$merged = clone $doc;
if (isset($preDocMap[$doc->dokument_kurzbz])) {
$merged->docdatum = $preDocMap[$doc->dokument_kurzbz]->docdatum;
$merged->insertvonma = $preDocMap[$doc->dokument_kurzbz]->insertvonma;
$merged->bezeichnung = $preDocMap[$doc->dokument_kurzbz]->bezeichnung;
} else {
$merged->akzeptiertdatum = null;
$merged->akzeptiertvon = null;
else
{
$mergedArray[] = $pre;
}
$mergedArray[] = $merged;
}
$this->terminateWithSuccess($mergedArray);
@@ -1,44 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Overview on cronjob logs
*/
class Ferienverwaltung extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct(
array(
'index' => ['basis/ferien:r']
)
);
// Loads WidgetLib
//$this->load->library('WidgetLib');
// Loads phrases system
$this->loadPhrases(
array(
'global',
'ui'
//'ferien'
)
);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Everything has a beginning
*/
public function index()
{
$this->load->view('lehre/ferienverwaltung.php');
}
}
+5 -1
View File
@@ -382,7 +382,11 @@ class StundenplanLib
$tz = new DateTimeZone($this->_ci->config->item('timezone'));
$ferienEvents = $this->_ci->FerienModel->getByDateRange($start_date, $end_date, $studiengang_kz);
$ferienEvents = $this->_ci->FerienModel->execReadOnlyQuery("
SELECT *
FROM lehre.tbl_ferien
WHERE (bisdatum >= ? AND vondatum < ?) AND (studiengang_kz = 0 OR studiengang_kz = ?)
", [$start_date, $end_date, $studiengang_kz]);
if (isError($ferienEvents))
return $ferienEvents;
@@ -40,7 +40,9 @@ abstract class AbstractBestandteil implements IValidation
if( is_bool($new_value) && ($old_value !== $new_value) ) {
$this->modifiedcolumns[$columnname] = $columnname;
} else if($old_value != $new_value) {
} else if(is_null($old_value) xor is_null($new_value)) {
$this->modifiedcolumns[$columnname] = $columnname;
} else if($old_value != $new_value) {
$this->modifiedcolumns[$columnname] = $columnname;
}
}
@@ -137,19 +137,25 @@ EOTXT;
return parent::__toString() . $txt;
}
/* public function validate()
public function validate()
{
if( !(filter_var($this->tage, FILTER_VALIDATE_INT,
array(
'options' => array(
'min_range' => 1,
'max_range' => 50
)
)
)) ) {
$this->validationerrors[] = 'Urlaubsanspruch muss eine Tagesanzahl im Bereich 1 bis 50 sein.';
$value = $this->vordienstzeit;
if ($value === null || $value === '') {
$result = null; // allow null value
} else {
$result = filter_var($value, FILTER_VALIDATE_INT, [
'options' => [
'min_range' => 0,
'max_range' => 100
]
]);
if ($result === false) {
$this->validationerrors[] = 'Vordienstjahre muss eine ganze Zahl (0 bis 100) enthalten oder leer sein.';
}
}
return parent::validate();
} */
}
}
@@ -9,52 +9,6 @@ class Ferien_model extends DB_Model
{
parent::__construct();
$this->dbTable = 'lehre.tbl_ferien';
$this->pk = 'ferien_id';
}
/**
* Loads all Ferien between two dates.
* @param $vondatum
* @param $bisdatum
* @param $studiengang_kz by default, loads only Ferien from oe of 0 Studiengang (and parents)
* @return object success or error
*/
public function getByDateRange($vondatum, $bisdatum, $studiengang_kz = 0)
{
if (!is_numeric($studiengang_kz)) return error("Invalid Studiengang Kz");
if (!is_valid_date($vondatum)) return error("Invalid von date");
if (!is_valid_date($bisdatum)) return error("Invalid bis date");
// get oe from studiengang
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$result = $this->StudiengangModel->loadWhere(['studiengang_kz' => $studiengang_kz]);
if (isError($result)) return $result;
if (!hasData($result)) return success([]);
$oe_kurzbz = getData($result)[0]->oe_kurzbz;
// get all parents oes
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$result = $this->OrganisationseinheitModel->getParents($oe_kurzbz);
if (isError($result)) return $result;
if (!hasData($result)) return success([]);
$parents = array_column(getData($result), 'oe_kurzbz');
// get ferien - use oe_kurzbz
$qry = "
SELECT
*
FROM
lehre.tbl_ferien
WHERE
bisdatum >= ? AND vondatum < ?
AND (oe_kurzbz IS NULL OR oe_kurzbz IN ?)
ORDER BY
vondatum";
return $this->execReadOnlyQuery($qry, [$vondatum, $bisdatum, $parents]);
$this->pk = array('studiengang_kz', 'bezeichnung');
}
}
@@ -1,15 +0,0 @@
<?php
class Ferientyp_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'lehre.tbl_ferientyp';
$this->pk = 'ferientyp_kurzbz';
$this->hasSequence = false;
}
}
@@ -53,9 +53,11 @@ class Studienjahr_model extends DB_Model
* @param int $days
* @return array|stdClass|null
*/
public function getLastOrAktStudienjahr($days = 0)
public function getLastOrAktStudienjahr($days = 60)
{
$days = is_numeric($days) ? $this->escape($days) : 0;
if (!is_numeric($days)) {
$days = 60;
}
$query = '
SELECT *
@@ -75,25 +77,19 @@ class Studienjahr_model extends DB_Model
* @param int $days
* @return array|stdClass|null
*/
public function getAktOrNextStudienjahr($days = 0)
public function getAktOrNextStudienjahr($days = 62)
{
$days = is_numeric($days) ? $this->escape($days) : 0;
if (!is_numeric($days)) {
$days = 62;
}
$query = '
SELECT * FROM (
SELECT
jahr.*, MIN(sem.start) AS beginn, MAX(sem.ende) AS ende
FROM
public.tbl_studienjahr jahr
JOIN public.tbl_studiensemester sem using(studienjahr_kurzbz)
GROUP BY
studienjahr_kurzbz
) jahre
WHERE
ende >= NOW() + \'' . $days . ' DAYS\'::INTERVAL
ORDER BY
ende
LIMIT 1
SELECT *
FROM public.tbl_studienjahr
JOIN public.tbl_studiensemester using(studienjahr_kurzbz)
WHERE start < NOW() + \'' . $days . ' DAYS\'::INTERVAL
ORDER by start DESC
LIMIT 1
';
return $this->execQuery($query);
@@ -1,27 +0,0 @@
<?php
$includesArray = array(
'title' => 'Ferienverwaltung',
'axios027' => true,
'bootstrap5' => true,
'fontawesome6' => true,
'vue3' => true,
'filtercomponent' => true,
'navigationcomponent' => true,
'tabulator6' => true,
'primevue3' => true,
//'vuedatepicker11' => true,
'customJSModules' => array('public/js/apps/lehre/Ferienverwaltung/Ferienverwaltung.js'),
'customCSSs' => array('vendor/vuejs/vuedatepicker_css/main.css')
);
$this->load->view('templates/FHC-Header', $includesArray);
?>
<div id="main">
<div>
<ferienverwaltung></ferienverwaltung>
</div>
</div>
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
@@ -315,22 +315,15 @@
WHERE tpl.app = '.$APP.'
) pl USING(person_id)
LEFT JOIN (
SELECT
SELECT DISTINCT ON (tbl_rueckstellung.person_id)
tbl_rueckstellung.person_id,
tbl_rueckstellung.datum_bis,
tbl_rueckstellung.status_kurzbz,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung
FROM public.tbl_rueckstellung
JOIN public.tbl_rueckstellung_status USING(status_kurzbz)
JOIN public.tbl_person sp ON tbl_rueckstellung.person_id = sp.person_id
WHERE tbl_rueckstellung.rueckstellung_id =
(
SELECT srueck.rueckstellung_id
FROM public.tbl_rueckstellung srueck
WHERE srueck.person_id = tbl_rueckstellung.person_id
AND datum_bis >= NOW()
ORDER BY srueck.datum_bis DESC LIMIT 1
)
WHERE tbl_rueckstellung.datum_bis >= NOW()
ORDER BY tbl_rueckstellung.person_id, tbl_rueckstellung.datum_bis DESC
) rueck ON rueck.person_id = p.person_id
WHERE
EXISTS (
@@ -24,22 +24,15 @@ $query = '
WHERE tpl.app = '.$APP.'
) pl ON p.person_id = pl.person_id
LEFT JOIN (
SELECT
SELECT DISTINCT ON (tbl_rueckstellung.person_id)
tbl_rueckstellung.person_id,
tbl_rueckstellung.datum_bis,
tbl_rueckstellung.status_kurzbz,
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung
FROM public.tbl_rueckstellung
JOIN public.tbl_rueckstellung_status USING(status_kurzbz)
JOIN public.tbl_person sp ON tbl_rueckstellung.person_id = sp.person_id
WHERE tbl_rueckstellung.rueckstellung_id =
(
SELECT srueck.rueckstellung_id
FROM public.tbl_rueckstellung srueck
WHERE srueck.person_id = tbl_rueckstellung.person_id
AND datum_bis >= NOW()
ORDER BY srueck.datum_bis DESC LIMIT 1
)
JOIN public.tbl_rueckstellung_status USING(status_kurzbz)
WHERE tbl_rueckstellung.datum_bis >= NOW()
ORDER BY tbl_rueckstellung.person_id, tbl_rueckstellung.datum_bis DESC
) rueck ON rueck.person_id = p.person_id
WHERE p.person_id NOT IN (SELECT person_id FROM public.tbl_prestudent)';
+75 -11
View File
@@ -80,9 +80,17 @@ echo '
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8" />
<link rel="stylesheet" href="../../vendor/components/jqueryui/themes/base/jquery-ui.min.css" type="text/css" />
<link rel="stylesheet" href="../../vendor/twbs/bootstrap3/dist/css/bootstrap.min.css" type="text/css"/>
<link href="../../skin/style.css.php" rel="stylesheet" type="text/css" />
<style>
.ui-dialog-titlebar-close
{
visibility: hidden !important;
}
</style>
<script type="text/javascript" src="../../vendor/components/jquery/jquery.min.js"></script>
<script type="text/javascript" src="../../vendor/components/jqueryui/jquery-ui.min.js"></script>
<script type="text/javascript" src="../../vendor/twbs/bootstrap3/dist/js/bootstrap.min.js"></script>
<script language="Javascript" type="text/javascript">
//<![CDATA[
@@ -131,22 +139,78 @@ echo '
}
}
function GebietStarten(bezeichnung,stunde,minute,sekunde,gebiet_id)
function GebietStarten(bezeichnung, stunde, minute, sekunde, gebiet_id)
{
var check = confirm(<?php echo "'".$p->t('testtool/okKlickenUmZuStarten')."'"?>+' '+stunde+'h '+minute+'m '+sekunde+'s');
if (check == true) {
var sprache_user = <?php echo "'".$sprache_user."'"?>;
document.location.href = 'frage.php?gebiet_id='+gebiet_id+'&start=true';
}
else {
return false;
let message = <?php echo "'".$p->t('testtool/okKlickenUmZuStarten')."'"?> + ' ' + stunde + 'h ' + minute + 'm ' + sekunde + 's';
let title = <?php echo "'".$p->t('testtool/startGebiet')."'"?>;
let abbrechen = <?php echo "'".$p->t('testtool/abbrechen')."'"?>;
if ($('#gebiet-dialog').length === 0)
{
$('body').append(
'<div id="gebiet-dialog" title="' + title + '">' +
'<p id="gebiet-dialog-msg">' + message + '</p>' +
'</div>'
);
}
$('#gebiet-dialog').dialog({
modal: true,
width: 400,
resizable: false,
buttons: [
{
text: 'OK',
click: function() {
$(this).dialog('close');
document.location.href = 'frage.php?gebiet_id=' + gebiet_id + '&start=true';
}
},
{
text: abbrechen,
click: function() {
$(this).dialog('close');
}
}
]
});
}
let letzteFrageBestaetigt = false;
function letzteFrage()
{
alert(<?php echo "'".$p->t("testtool/alleFragenBeantwortet")."'"?>);
return true;
if (letzteFrageBestaetigt)
return true;
let message = <?php echo "'".$p->t("testtool/alleFragenBeantwortet")."'"?>;
if ($('#fertig-dialog').length === 0)
{
$('body').append(
'<div id="fertig-dialog">' +
'<p>' + message + '</p>' +
'</div>'
);
}
$('#fertig-dialog').dialog({
modal: true,
width: 400,
resizable: false,
buttons: [
{
text: 'OK',
click: function() {
$(this).dialog('close');
letzteFrageBestaetigt = true;
$('[name="submitantwort"]').click();
}
}
]
});
return false;
}
$(document).ready(function () {
@@ -647,7 +711,7 @@ if($frage->frage_id!='')
}
$letzte = $frage->getNextFrage($gebiet_id, $_SESSION['pruefling_id'], $frage_id, $demo);
echo "<form action=\"$PHP_SELF?gebiet_id=$gebiet_id&amp;frage_id=$frage->frage_id\" method=\"POST\" ".(!$letzte && !$levelgebiet?"onsubmit=\"letzteFrage()\"":"").">";
echo "<form action=\"$PHP_SELF?gebiet_id=$gebiet_id&amp;frage_id=$frage->frage_id\" method=\"POST\" ".(!$letzte && !$levelgebiet?"onsubmit=\"return letzteFrage()\"":"").">";
echo '
<div class="row text-center">
<table class="table" style="width: 600px; margin-left: auto; margin-right: auto;">
+22
View File
@@ -44,6 +44,27 @@ if (isset($_GET['sprache_user']) && !empty($_GET['sprache_user']))
$sprache_user = (isset($_SESSION['sprache_user']) && !empty($_SESSION['sprache_user'])) ? $_SESSION['sprache_user'] : DEFAULT_LANGUAGE;
$p = new phrasen($sprache_user);
$showInfo = false;
if (isset($_SESSION['alleGebiete']))
{
$alleGebiete = array_map('intval', $_SESSION['alleGebiete']);
$pruefling_id = $_SESSION['pruefling_id'];
$qry = "SELECT COUNT(DISTINCT gebiet_id) as anzahl
FROM testtool.tbl_pruefling_frage
JOIN testtool.tbl_frage USING(frage_id)
WHERE gebiet_id IN (". implode(',', $alleGebiete) .")
AND pruefling_id = ". $pruefling_id ."
";
$result = $db->db_query($qry);
$anzahlGebiete = $db->db_fetch_object($result);
if ((int)$anzahlGebiete->anzahl === count($alleGebiete))
$showInfo = true;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
@@ -69,6 +90,7 @@ $p = new phrasen($sprache_user);
<body>
<br><br><br><br><br>
<center><h2><?php echo $p->t('testtool/zeitAbgelaufen');?></h2>
<h3><?php echo ($showInfo ? ($p->t('testtool/alleGebietGestartet') . "<br />" . $p->t('testtool/alleGebieteGestartetInfo')) : ''); ?></h3>
</center>
</body>
</html>
+11 -2
View File
@@ -142,7 +142,9 @@ if (isset($_REQUEST['prestudent']))
}
if ($reihungstest_id != '' && $rt->load($reihungstest_id))
{
if ($rt->freigeschaltet)
$pruefling_exist = new Pruefling();
$alreadyInRT = $pruefling_exist->personAlreadyInRT($ps->person_id, $rt->reihungstest_id, $ps->prestudent_id);
if ($rt->freigeschaltet && !$alreadyInRT)
{
// regenerate Session ID after Login
session_regenerate_id();
@@ -282,7 +284,14 @@ if (isset($_REQUEST['prestudent']))
}
else
{
$alertmsg .= '<div class="alert alert-danger">'.$p->t('testtool/reihungstestNichtFreigeschalten').'</div>';
if ($alreadyInRT)
{
$alertmsg .= '<div class="alert alert-danger">'.$p->t('testtool/reihungstestNichtRegistriert').'</div>';
}
else
{
$alertmsg .= '<div class="alert alert-danger">'.$p->t('testtool/reihungstestNichtFreigeschalten').'</div>';
}
}
}
else
+24
View File
@@ -187,6 +187,7 @@ else if (isset($_SESSION['pruefling_id']))
}
$qry .= "
AND ps_status.bewerbung_abgeschicktamum IS NOT NULL
/* Order to get last semester when using distinct on */
ORDER BY
@@ -405,6 +406,29 @@ else if (isset($_SESSION['pruefling_id']))
echo '</table>';
}
if (isset($_SESSION['pruefling_id']) && !empty($_SESSION['alleGebiete']))
{
$alleGebiete = array_map('intval', $_SESSION['alleGebiete']);
$pruefling_id = (int)$_SESSION['pruefling_id'];
$qry = "SELECT COUNT(DISTINCT gebiet_id) AS anzahl
FROM testtool.tbl_pruefling_frage
JOIN testtool.tbl_frage USING(frage_id)
WHERE gebiet_id IN (". implode(',', $alleGebiete) .")
AND pruefling_id = ". $pruefling_id;
$result_check = $db->db_query($qry);
$row_check = $db->db_fetch_object($result_check);
if ((int)$row_check->anzahl === count($alleGebiete))
{
echo '<tr><td>
<div class="alert alert-success small" style="margin-left: 20px; width: 170px; margin-top: 3px;" role="alert">
<strong>'.$p->t('testtool/alleGebietGestartet').'</strong>
</div>
</td></tr>';
}
}
// Link zum Logout
echo '<tr><td class="ItemTesttool" style="margin-left: 20px;" nowrap>
+1 -44
View File
@@ -24,7 +24,6 @@
* @create 07-12-2006
*/
require_once(dirname(__FILE__).'/basis_db.class.php');
require_once(dirname(__FILE__).'/organisationseinheit.class.php');
class ferien extends basis_db
{
@@ -63,50 +62,8 @@ class ferien extends basis_db
$this->errormsg = 'Studiengang_kz ist ungültig';
return false;
}
// get oe from studiengang
$sql_query="
SELECT
oe_kurzbz
FROM
public.tbl_studiengang
WHERE
studiengang_kz=".$this->db_add_param($stg_kz, FHC_INTEGER)."
ORDER BY
studiengang_kz";
if (!$this->db_query($sql_query))
{
$this->errormsg = $this->db_last_error();
return false;
}
$oe_kurzbz = '';
while ($row = $this->db_fetch_object())
{
$oe_kurzbz = $row->oe_kurzbz;
}
// get all parents oes
$organisationseinheit = new organisationseinheit();
$parents = $organisationseinheit->getParents($oe_kurzbz);
if (!$parents)
{
$this->errormsg = $parents->errormsg;
return false;
}
$sql_query="
SELECT
*
FROM
lehre.tbl_ferien
WHERE
oe_kurzbz IS NULL
OR oe_kurzbz IN (".$this->implode4SQL($parents).")
ORDER BY
vondatum";
$sql_query="SELECT * FROM lehre.tbl_ferien WHERE studiengang_kz=0 OR studiengang_kz=".$this->db_add_param($stg_kz, FHC_INTEGER)." ORDER BY vondatum;";
if (!$this->db_query($sql_query))
{
+26
View File
@@ -584,6 +584,32 @@ class pruefling extends basis_db
$qry .= " LIMIT 1";
if($result = $this->db_query($qry))
{
if ($this->db_num_rows($result) == 0)
return false;
else
return true;
}
else
{
$this->errormsg = 'Fehler bei einer Abfrage';
return false;
}
}
public function personAlreadyInRT($person_id, $reihungstest_id, $prestudent_id)
{
$qry = "SELECT tbl_prestudent.prestudent_id
FROM public.tbl_rt_person
JOIN public.tbl_prestudent ON tbl_prestudent.person_id = tbl_rt_person.person_id
JOIN public.tbl_prestudentstatus ON tbl_prestudent.prestudent_id = tbl_prestudentstatus.prestudent_id AND status_kurzbz = 'Bewerber'
AND tbl_prestudentstatus.studienplan_id = tbl_rt_person.studienplan_id
WHERE tbl_rt_person.person_id = " . $this->db_add_param($person_id) . "
AND tbl_rt_person.rt_id = " . $this->db_add_param($reihungstest_id) . "
AND tbl_prestudent.prestudent_id != " . $this->db_add_param($prestudent_id) . "
AND get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) = 'Bewerber'
LIMIT 1";
if($result = $this->db_query($qry))
{
if ($this->db_num_rows($result) == 0)
+5
View File
@@ -17,6 +17,7 @@ $this->phrasen['testtool/basic']='Basic';
$this->phrasen['testtool/basisgebiete']='Basisgebiete';
$this->phrasen['testtool/semester']='Semester';
$this->phrasen['testtool/reihungstestNichtFreigeschalten']='Der zuteilte Reihungstest ist noch nicht freigeschaltet';
$this->phrasen['testtool/reihungstestNichtRegistriert']='Sie sind für den Reihungstest nicht registriert';
$this->phrasen['testtool/reihungstestKannNichtGeladenWerden']='Der Reihungstest dem Sie zugeteilt sind, kann nicht geladen werden. Melden Sie sich bitte bei der Reihungstestaufsicht.';
$this->phrasen['testtool/geburtsdatumStimmtNichtUeberein']='Ihr Geburtsdatum stimmt nicht mit unseren Daten überein. Bitte wenden Sie sich an die Aufsichtsperson';
$this->phrasen['testtool/home']='Home';
@@ -31,10 +32,14 @@ $this->phrasen['testtool/keineAntwort']='Keine Antwort';
$this->phrasen['testtool/speichernUndWeiter']='Speichern und weiter';
$this->phrasen['testtool/alleFragenBeantwortet']='GLÜCKWUNSCH! \n\nSie haben alle Fragen in der zur Verfügung stehenden Zeit beantwortet. \nNutzen Sie die verbleibende Zeit, um Ihre Antworten zu kontrollieren oder fahren Sie mit dem nächsten Teilgebiet fort.';
$this->phrasen['testtool/zeitAbgelaufen']='Die Maximalzeit für dieses Gebiet ist abgelaufen, oder alle Fragen wurden beantwortet';
$this->phrasen['testtool/alleGebietGestartet']='Sie haben alle Gebiete bearbeitet.';
$this->phrasen['testtool/alleGebieteGestartetInfo']='Sie können sich nun ausloggen und den Browser schließen.';
$this->phrasen['testtool/spracheDerTestfragen']='Gewünschte Sprache der Testfragen';
$this->phrasen['testtool/einleitung']='Einleitung';
$this->phrasen['testtool/blaettern']='Blättern';
$this->phrasen['testtool/demo']='Demobeispiel ansehen';
$this->phrasen['testtool/abbrechen']='Abbrechen';
$this->phrasen['testtool/startGebiet']='Gebiet starten';
$this->phrasen['testtool/okKlickenUmZuStarten']='Klicken Sie OK um dieses Gebiet zu starten. \nSie haben für die Bearbeitung ein Zeitlimit von';
$this->phrasen['testtool/bitteZuerstAnmelden']='Bitte zuerst anmelden!';
$this->phrasen['testtool/fehlerBeimGenerierenDesFragenpools']='Fehler beim generieren des Fragenpools';
+5
View File
@@ -17,6 +17,7 @@ $this->phrasen['testtool/basic']='Basic';
$this->phrasen['testtool/basisgebiete']='Basic test';
$this->phrasen['testtool/semester']='Semester';
$this->phrasen['testtool/reihungstestNichtFreigeschalten']='The entrance examination assigned has not yet been activated.';
$this->phrasen['testtool/reihungstestNichtRegistriert']='You are not registered for the placement test.';
$this->phrasen['testtool/reihungstestKannNichtGeladenWerden']='The placement test you are assigned to could not be loaded. Please contact the placement test supervisior.';
$this->phrasen['testtool/geburtsdatumStimmtNichtUeberein']='Your date of birth does not correspond to the data we have. Please speak to the supervisor. ';
$this->phrasen['testtool/home']='Home';
@@ -31,10 +32,14 @@ $this->phrasen['testtool/keineAntwort']='No Answer';
$this->phrasen['testtool/speichernUndWeiter']='Save and next';
$this->phrasen['testtool/alleFragenBeantwortet']='CONGRATULATIONS!\n\nYou have answered all the questions in the time allowed.\n Use the remaining time to check your answers or continue to the next section.';
$this->phrasen['testtool/zeitAbgelaufen']='The time for this part has expired or you have answered all the questions.';
$this->phrasen['testtool/alleGebietGestartet']='You have worked on all sections.';
$this->phrasen['testtool/alleGebieteGestartetInfo']='You can now log out and close the browser.';
$this->phrasen['testtool/spracheDerTestfragen']='Desired language of questions';
$this->phrasen['testtool/einleitung']='Introduction';
$this->phrasen['testtool/blaettern']='Browse';
$this->phrasen['testtool/demo']='See an example';
$this->phrasen['testtool/abbrechen']='Cancel';
$this->phrasen['testtool/startGebiet']='Start the section';
$this->phrasen['testtool/okKlickenUmZuStarten']='Click OK to start this section. \nYou have a timelimit of';
$this->phrasen['testtool/bitteZuerstAnmelden']='Please log in first!';
$this->phrasen['testtool/fehlerBeimGenerierenDesFragenpools']='Error in generating the pool of questions.';
@@ -1,79 +0,0 @@
/**
* Copyright (C) 2025 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export default {
getFerien(filterVonDatum, filterBisDatum) {
return {
method: 'get',
url: 'api/frontend/v1/education/ferien/getFerien',
params: {
filterVonDatum,
filterBisDatum
}
};
},
getOe() {
return {
method: 'get',
url: 'api/frontend/v1/education/ferien/getOe'
};
},
getStudienplaene(oe_kurzbz, vondatum, bisdatum) {
return {
method: 'get',
url: 'api/frontend/v1/education/ferien/getStudienplaene',
params: {
oe_kurzbz,
vondatum,
bisdatum
}
};
},
getFerientypen() {
return {
method: 'get',
url: 'api/frontend/v1/education/ferien/getFerientypen'
};
},
getDefaultVonBis() {
return {
method: 'get',
url: 'api/frontend/v1/education/ferien/getDefaultVonBis'
};
},
insert(params) {
return {
method: 'post',
url: 'api/frontend/v1/education/ferien/insert',
params
};
},
update(params) {
return {
method: 'post',
url: 'api/frontend/v1/education/ferien/update',
params
};
},
delete(ferien_id) {
return {
method: 'post',
url: 'api/frontend/v1/education/ferien/delete',
params: { ferien_id }
};
}
};
@@ -1,12 +0,0 @@
import Ferienverwaltung from '../../../components/Ferienverwaltung/Ferienverwaltung.js';
import PluginsPhrasen from '../../../plugins/Phrasen.js';
const app = Vue.createApp({
name: 'FerienverwaltungApp',
components: {
Ferienverwaltung
}
});
app
.use(PluginsPhrasen)
.mount('#main');
@@ -1,295 +0,0 @@
import {CoreFilterCmpt} from "../filter/Filter.js";
import {CoreNavigationCmpt} from "../navigation/Navigation.js";
import FormInput from "../Form/Input.js";
import FerienModal from "./Modal.js";
import ApiFerienverwaltung from '../../api/factory/ferienverwaltung/ferienverwaltung.js';
export default {
name: "Ferienverwaltung",
components: {
CoreFilterCmpt,
CoreNavigationCmpt,
FormInput,
FerienModal
},
data() {
return {
filterVonDatum: null,
filterBisDatum: null,
loading: false,
sideMenuEntries: {},
headerMenuEntries: {},
tabulatorOptions: {
ajaxURL: 'dummy',
ajaxRequestFunc: () => this.$api.call(
ApiFerienverwaltung.getFerien(this.filterVonDatum, this.filterBisDatum)
),
ajaxResponse: (url, params, response) => response.data,
columns: [
{title:"Ferien Id", field:"ferien_id", visible: false, headerFilter: true},
{
title:"Datum von",
field:"vondatum",
headerFilter: true,
formatter: function (cell) {
const dateStr = cell.getValue();
if (!dateStr) return "";
const date = new Date(dateStr);
return date.toLocaleString("de-DE", {
day: "2-digit",
month: "2-digit",
year: "numeric",
hour12: false
});
}
},
{
title:"Datum bis",
field:"bisdatum",
headerFilter: true,
formatter: function (cell) {
const dateStr = cell.getValue();
if (!dateStr) return "";
const date = new Date(dateStr);
return date.toLocaleString("de-DE", {
day: "2-digit",
month: "2-digit",
year: "numeric",
hour12: false
});
}
},
{title:"Bezeichnung", field:"bezeichnung", headerFilter: true},
{title:"Organisationseinheit Kurzbezeichnung", field:"oe_kurzbz", visible: false, headerFilter: true},
{title:"Organisationseinheit", field:"oe_bezeichnung", headerFilter: true},
{title:"Studienplan", field:"studienplan_bezeichnung", visible: false, headerFilter: true},
{title:"Ferientyp Kurzbezeichnung", field:"ferientyp_kurzbz", visible: false, headerFilter: true},
{
title:"Mitarbeiterrelevant",
field:"mitarbeiterrelevant",
visible: false,
headerFilter: true,
hozAlign: "center",
formatter:'tickCross', formatterParams: {
tickElement: '<i class="fas fa-check text-success"></i>',
crossElement: '<i class="fas fa-times text-danger"></i>'
},
headerFilter:"tickCross", headerFilterParams: {
"tristate":true, elementAttributes:{"value":"true"}
},
headerFilterEmptyCheck:function(value){return value === null}
},
{
title:"Studierendenrelevant",
field:"studierendenrelevant",
visible: false,
headerFilter: true,
hozAlign: "center",
formatter:'tickCross', formatterParams: {
tickElement: '<i class="fas fa-check text-success"></i>',
crossElement: '<i class="fas fa-times text-danger"></i>'
},
headerFilter:"tickCross", headerFilterParams: {
"tristate":true, elementAttributes:{"value":"true"}
},
headerFilterEmptyCheck:function(value){return value === null}
},
{
title:"Lehre planbar",
field:"lehre",
visible: false,
headerFilter: true,
hozAlign: "center",
formatter:'tickCross', formatterParams: {
tickElement: '<i class="fas fa-check text-success"></i>',
crossElement: '<i class="fas fa-times text-danger"></i>'
},
headerFilter:"tickCross", headerFilterParams: {
"tristate":true, elementAttributes:{"value":"true"}
},
headerFilterEmptyCheck:function(value){return value === null}
},
{title:"Aktionen", field: "actions",
minWidth: 150, // Ensures Action-buttons will be always fully displayed
formatter: (cell, formatterParams, onRendered) => {
let container = document.createElement('div');
container.className = "d-flex gap-2";
let button = document.createElement('button');
button.className = 'btn btn-outline-secondary btn-action';
button.innerHTML = '<i class="fa fa-edit"></i>';
button.title = this.$p.t('person', 'ferien_edit');
button.addEventListener('click', (event) =>
this.$refs.modal.open(JSON.parse(JSON.stringify(cell.getData()))) // deep copy
);
container.append(button);
button = document.createElement('button');
button.className = 'btn btn-outline-secondary';
button.innerHTML = '<i class="fa fa-trash"></i>';
button.addEventListener('click', evt => {
evt.stopPropagation();
this.$fhcAlert
.confirmDelete()
.then(result => result ? cell.getData().ferien_id : Promise.reject({handled:true}))
.then(ferien_id => this.$api.call(ApiFerienverwaltung.delete(ferien_id)))
.then(() => {
//cell.getRow().delete();
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete'));
this.reload();
})
.catch(this.$fhcAlert.handleSystemError);
});
container.append(button);
return container;
},
frozen: true
}
]
},
tabulatorEvents: [
{
event: 'tableBuilt',
handler: async () => {
//await this.$p.loadCategory(['ferien', 'ui']);
await this.$p.loadCategory(['global', 'ferien']);
let cm = this.$refs.table.tabulator.columnManager;
cm.getColumnByField('ferien_id').component.updateDefinition({
title: this.$p.t('ferien', 'ferienId'),
});
cm.getColumnByField('vondatum').component.updateDefinition({
title: this.$p.t('ferien', 'vondatum'),
});
cm.getColumnByField('bisdatum').component.updateDefinition({
title: this.$p.t('ferien', 'bisdatum'),
});
cm.getColumnByField('bezeichnung').component.updateDefinition({
title: this.$p.t('global', 'bezeichnung'),
});
cm.getColumnByField('oe_kurzbz').component.updateDefinition({
title: this.$p.t('ferien', 'oeKurzbezeichnung'),
});
cm.getColumnByField('oe_bezeichnung').component.updateDefinition({
title: this.$p.t('ferien', 'oeBezeichnung'),
});
cm.getColumnByField('studienplan_bezeichnung').component.updateDefinition({
title: this.$p.t('ferien', 'studienplanBezeichnung'),
});
cm.getColumnByField('ferientyp_kurzbz').component.updateDefinition({
title: this.$p.t('ferien', 'ferientypKurzbz'),
});
cm.getColumnByField('mitarbeiterrelevant').component.updateDefinition({
title: this.$p.t('ferien', 'mitarbeiterrelevant'),
});
cm.getColumnByField('studierendenrelevant').component.updateDefinition({
title: this.$p.t('ferien', 'studierendenrelevant'),
});
cm.getColumnByField('lehre').component.updateDefinition({
title: this.$p.t('ferien', 'lehrePlanbar'),
});
cm.getColumnByField('actions').component.updateDefinition({
title: this.$p.t('global', 'aktionen')
});
}
}
]
}
},
computed: {
},
methods: {
reload() {
this.$refs.table.reloadTable();
},
actionNew() {
this.$refs.modal.open();
}
},
created() {
this.$api
.call(ApiFerienverwaltung.getDefaultVonBis())
.then(result => {
this.filterVonDatum = result.data.defaultVon;
this.filterBisDatum = result.data.defaultBis;
}
)
.catch(error => {
if (error)
this.$fhcAlert.handleSystemError(error);
});
},
template: `
<core-navigation-cmpt
v-bind:add-side-menu-entries="sideMenuEntries"
v-bind:add-header-menu-entries="headerMenuEntries"
>
</core-navigation-cmpt>
<div class="h-100 d-flex flex-column">
<div class="row justify-content-center">
<div class="col-5">
<form-input
type="DatePicker"
v-model="filterVonDatum"
name="filtervondatum"
:label="$p.t('ferien/vondatum')"
:enable-time-picker="false"
text-input
format="dd.MM.yyyy"
auto-apply
>
</form-input>
</div>
<div class="col-5">
<form-input
type="DatePicker"
v-model="filterBisDatum"
name="filterbisdatum"
:label="$p.t('ferien/bisdatum')"
:enable-time-picker="false"
text-input
format="dd.MM.yyyy"
auto-apply
>
</form-input>
</div>
<div class="col-1 align-self-end">
<button
class="btn btn-primary"
@click="reload()"
:disabled="loading"
>
<i v-if="loading" class="fa fa-spinner fa-spin"></i>
{{ $p.t('ui/anzeigen') }}
</button>
</div>
</div>
<div class="row mt-3">
<div class="col">
<core-filter-cmpt
ref="table"
table-only
:side-menu="false"
:tabulator-options="tabulatorOptions"
:tabulator-events="tabulatorEvents"
reload
:reload-btn-infotext="this.$p.t('table', 'reload')"
new-btn-show
:new-btn-label="$p.t('ui/neu')"
@click:new="actionNew"
>
</core-filter-cmpt>
<ferien-modal ref="modal" @saved="reload"></ferien-modal>
</div>
</div>
</div>`
};
@@ -1,190 +0,0 @@
import BsModal from "../Bootstrap/Modal.js";
import BsConfirm from "../Bootstrap/Confirm.js";
import CoreForm from "../Form/Form.js";
import FormValidation from "../Form/Validation.js";
import FormInput from "../Form/Input.js";
import ApiFerien from '../../api/factory/ferienverwaltung/ferienverwaltung.js';
export default {
components: {
BsModal,
CoreForm,
FormValidation,
FormInput
},
data() {
return {
oeList: [],
studienplaeneList: [],
ferientypList: [],
loading: false,
data: {},
};
},
computed: {
},
methods: {
save() {
this.$refs.form.clearValidation();
this.loading = true;
let saveFunc = this.data.ferien_id ? ApiFerien.update : ApiFerien.insert;
this.$refs.form
.call(saveFunc(this.data))
.then(result => {
this.$emit('saved', result.data);
this.loading = false;
this.$refs.modal.hide();
this.$fhcAlert.alertSuccess(this.$p.t('ui/gespeichert'));
})
.catch(error => {
if (error)
this.$fhcAlert.handleSystemError(error);
this.loading = false;
});
},
open(data) {
this.$refs.form.clearValidation();
this.data = data ?? {
oe_kurzbz: null,
bezeichnung: '',
vondatum: null,
bisdatum: null,
studienplan_id: null
};
this.$api
.call(ApiFerien.getOe())
.then(result => {
this.oeList = result.data;
//this.loading = false;
}
)
.catch(error => {
if (error)
this.$fhcAlert.handleSystemError(error);
//this.loading = false;
});
this.getStudienplaene();
this.$api
.call(ApiFerien.getFerientypen())
.then(result => {
this.ferientypList = result.data;
}
)
.catch(error => {
if (error)
this.$fhcAlert.handleSystemError(error);
});
this.$refs.modal.show();
},
getStudienplaene() {
if (!this.data.oe_kurzbz) return;
this.$api
.call(ApiFerien.getStudienplaene(this.data.oe_kurzbz, this.data.vondatum, this.data.bisdatum))
.then(result => {
this.studienplaeneList = result.data;
}
)
.catch(error => {
if (error)
this.$fhcAlert.handleSystemError(error);
});
},
preventCloseOnLoading(ev) {
if (this.loading)
ev.returnValue = false;
}
},
template: `
<core-form ref="form" class="stv-details-ferien-edit" @submit.prevent="save">
<bs-modal ref="modal" @hide-bs-modal="preventCloseOnLoading">
<form-validation></form-validation>
<fieldset :disabled="loading">
<form-input
type="DatePicker"
v-model="data.vondatum"
name="vondatum"
:label="$p.t('ferien/vondatum')"
:enable-time-picker="false"
text-input
format="dd.MM.yyyy"
auto-apply
>
</form-input>
<form-input
type="DatePicker"
v-model="data.bisdatum"
name="bisdatum"
:label="$p.t('ferien/bisdatum')"
:enable-time-picker="false"
text-input
format="dd.MM.yyyy"
auto-apply
>
</form-input>
<form-input
v-model="data.bezeichnung"
name="bezeichnung"
:label="$p.t('global/bezeichnung')"
>
</form-input>
<form-input
type="select"
v-model="data.oe_kurzbz"
name="oe_kurzbz"
:label="$p.t('ferien/organisationseinheit')"
@change="getStudienplaene"
>
<option :value="null">-- {{ $p.t('ui/alle') }} --</option>
<option v-for="oe in oeList" :key="oe.oe_kurzbz" :value="oe.oe_kurzbz">
{{ oe.organisationseinheittyp_kurzbz + ' ' + oe.bezeichnung }}
</option>
</form-input>
<form-input
type="select"
v-model="data.studienplan_id"
name="studienplan_id"
:label="$p.t('ferien/studienplan')"
>
<option :value="null">-- {{ $p.t('ui/keineAuswahl') }} --</option>
<option v-for="studienplan in studienplaeneList" :key="studienplan.studienplan_id" :value="studienplan.studienplan_id">
{{ studienplan.bezeichnung }}
</option>
</form-input>
<form-input
type="select"
v-model="data.ferientyp_kurzbz"
name="ferientyp_kurzbz"
:label="$p.t('ferien/ferientypKurzbz')"
>
<option :value="null">-- {{ $p.t('ui/keineAuswahl') }} --</option>
<option v-for="ferientyp in ferientypList" :key="ferientyp.ferientyp_kurzbz" :value="ferientyp.ferientyp_kurzbz">
{{ ferientyp.ferientyp_kurzbz }}
</option>
</form-input>
</fieldset>
<template #footer>
<button type="submit" class="btn btn-primary" :disabled="loading">
<i v-if="loading" class="fa fa-spinner fa-spin"></i>
{{ $p.t('ui/speichern') }}
</button>
</template>
</bs-modal>
</core-form>`
};
+2 -2
View File
@@ -94,7 +94,7 @@ require_once('dbupdate_3.4/71399_dashboard_update_widget_paths.php');
require_once('dbupdate_3.4/71645_studvw_messagetab_ladezeit.php');
require_once('dbupdate_3.4/71566_studienordnungsdokument_neuer_organisationseinheitstyp_programm.php');
require_once('dbupdate_3.4/70376_lohnguide.php');
require_once('dbupdate_3.4/71405_ferienzeiten.php');
require_once('dbupdate_3.4/75888_reihungstest_mehrfachdurchfuehrung.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
@@ -257,7 +257,7 @@ $tabellen=array(
"lehre.tbl_anrechnung_begruendung" => array("begruendung_id","bezeichnung"),
"lehre.tbl_anrechnungszeitraum" => array("anrechnungszeitraum_id","studiensemester_kurzbz","anrechnungstart","anrechnungende", "insertamum", "insertvon"),
"lehre.tbl_betreuerart" => array("betreuerart_kurzbz","beschreibung","aktiv"),
"lehre.tbl_ferien" => array("ferien_id","bezeichnung","studiengang_kz","vondatum","bisdatum","oe_kurzbz","studienplan_id","ferientyp_kurzbz","insertamum","insertvon","updateamum","updatevon"),
"lehre.tbl_ferien" => array("bezeichnung","studiengang_kz","vondatum","bisdatum"),
"lehre.tbl_lehreinheit" => array("lehreinheit_id","lehrveranstaltung_id","studiensemester_kurzbz","lehrfach_id","lehrform_kurzbz","stundenblockung","wochenrythmus","start_kw","raumtyp","raumtypalternativ","sprache","lehre","anmerkung","unr","lvnr","updateamum","updatevon","insertamum","insertvon","ext_id","lehrfach_id_old","gewicht"),
"lehre.tbl_lehreinheitgruppe" => array("lehreinheitgruppe_id","lehreinheit_id","studiengang_kz","semester","verband","gruppe","gruppe_kurzbz","updateamum","updatevon","insertamum","insertvon","ext_id"),
"lehre.tbl_lehreinheitmitarbeiter" => array("lehreinheit_id","mitarbeiter_uid","lehrfunktion_kurzbz","semesterstunden","planstunden","stundensatz","faktor","anmerkung","bismelden","updateamum","updatevon","insertamum","insertvon","ext_id","standort_id","vertrag_id"),
+2 -2
View File
@@ -264,8 +264,8 @@ CREATE TABLE IF NOT EXISTS hr.tbl_vertragsbestandteil_lohnguide (
stellenbezeichnung varchar(255),
fachrichtung_kurzbz character varying(32) NOT NULL,
modellstelle_kurzbz character varying(32) NOT NULL,
kommentar_person varchar(255),
kommentar_modellstelle varchar(255),
kommentar_person text,
kommentar_modellstelle text,
CONSTRAINT tbl_vertragsbestandteil_lohnguide_pk PRIMARY KEY (vertragsbestandteil_id),
CONSTRAINT tbl_vertragsbestandteil_fk FOREIGN KEY (vertragsbestandteil_id) REFERENCES hr.tbl_vertragsbestandteil (vertragsbestandteil_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT tbl_vertragsbestandteil_lohnguide_fachrichtung_fk FOREIGN KEY (fachrichtung_kurzbz) REFERENCES hr.tbl_lohnguide_fachrichtung (fachrichtung_kurzbz) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
-206
View File
@@ -1,206 +0,0 @@
<?php
if (! defined('DB_NAME')) exit('No direct script access allowed');
//Add column ferien_id to lehre.tbl_ferien
if(!@$db->db_query("SELECT ferien_id FROM lehre.tbl_ferien LIMIT 1"))
{
$qry = 'ALTER TABLE lehre.tbl_ferien ADD COLUMN ferien_id integer;';
if(!$db->db_query($qry))
echo '<strong> lehre.tbl_ferien '.$db->db_last_error().'</strong><br>';
else
echo '<br>lehre.tbl_ferien: Neue Spalte ferien_id hinzugefügt';
}
//Column ferien_id mit Werten befüllen
if($result = @$db->db_query("SELECT ferien_id FROM lehre.tbl_ferien where ferien_id is not null LIMIT 1"))
{
if ($db->db_num_rows($result) == 0)
{
$qry = 'UPDATE lehre.tbl_ferien et SET ferien_id =
(SELECT rownumber FROM (SELECT ROW_NUMBER() OVER (ORDER BY bezeichnung, studiengang_kz)
AS rownumber, t.* FROM lehre.tbl_ferien t ORDER BY bezeichnung, studiengang_kz) rn
WHERE rn.bezeichnung = et.bezeichnung
AND rn.studiengang_kz = et.studiengang_kz);
';
if(!$db->db_query($qry))
echo '<strong> lehre.tbl_ferien '.$db->db_last_error().'</strong><br>';
else
echo '<br>lehre.tbl_ferien: Spalte bis.tbl_ferien_id mit Werten aufgefüllt';
}
}
//Create Sequence lehre.tbl_ferien and grant Rights
if ($result = @$db->db_query("SELECT * FROM pg_class WHERE relname = 'tbl_ferien_ferien_id_seq'"))
{
if ($db->db_num_rows($result) == 0)
{
if ($count = @$db->db_query("SELECT * FROM lehre.tbl_ferien"))
{
$count = $db->db_num_rows($count) + 1;
$qry = 'CREATE SEQUENCE lehre.tbl_ferien_ferien_id_seq START ';
$qry .= $count;
if(!$db->db_query($qry))
{
echo '<strong> lehre.tbl_ferien '.$db->db_last_error().'</strong><br>';
}
else
{
echo '<br>lehre.tbl_ferien: Sequence lehre.tbl_ferien_ferien_id_seq mit Startwert ' . $count . ' erstellt';
$qry2 = "GRANT SELECT, UPDATE ON lehre.tbl_ferien_ferien_id_seq TO vilesci;
GRANT SELECT, UPDATE ON lehre.tbl_ferien_ferien_id_seq TO web;";
if(!$db->db_query($qry2))
{
echo '<strong>lehre.tbl_ferien_ferien_id_seq Berechtigungen: '.$db->db_last_error().'</strong><br>';
}
else
{
echo '<br>lehre.tbl_ferien: Rechte auf lehre.tbl_ferien_ferien_id_seq fuer web user und vilesci gesetzt ';
}
}
}
}
}
//lehre.tbl_ferien auf NOT NULL setzen
if ($result = @$db->db_query("SELECT is_nullable FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'tbl_ferien' AND column_name = 'ferien_id' and is_nullable = 'NO'"))
{
if($db->db_num_rows($result)==0)
{
$qry = 'ALTER TABLE lehre.tbl_ferien ALTER COLUMN ferien_id SET NOT NULL';
if(!$db->db_query($qry))
echo '<strong> lehre.tbl_ferien '.$db->db_last_error().'</strong><br>';
else
echo '<br>lehre.tbl_ferien: Spalte bis.tbl_ferien_id auf NOT NULL gesetzt';
}
}
//lehre.tbl_ferien DEFAULT einstellen
if ($result = @$db->db_query("SELECT column_default FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'tbl_ferien' AND column_name = 'ferien_id' and column_default is null"))
{
if($db->db_num_rows($result)==1)
{
$qry = "ALTER TABLE lehre.tbl_ferien ALTER COLUMN ferien_id SET DEFAULT nextval('lehre.tbl_ferien_ferien_id_seq'::regclass);";
if(!$db->db_query($qry))
echo '<strong> lehre.tbl_ferien '.$db->db_last_error().'</strong><br>';
else
echo '<br> lehre.tbl_ferien: Defaultwert bei Spalte bis.tbl_ferien_id gesetzt';
}
}
//DELETE Constraint PRIMARY KEY pk_tbl_ferien (bezeichnung, studiengang_kz) entfernen
if ($result = @$db->db_query("SELECT conname FROM pg_constraint WHERE conname = 'pk_tbl_ferien'"))
{
if($db->db_num_rows($result)==1)
{
$qry = "ALTER TABLE lehre.tbl_ferien DROP CONSTRAINT pk_tbl_ferien;";
if (!$db->db_query($qry))
echo '<strong>lehre.tbl_ferien: '.$db->db_last_error().'</strong><br>';
else
echo '<br>lehre.tbl_ferien: Primary Key pk_tbl_ferien (bezeichnung, studiengang_kz) entfernt ';
}
}
// ADD PRIMARY KEY tbl_ferien_pk to lehre.tbl_ferien
if ($result = @$db->db_query("SELECT conname FROM pg_constraint WHERE conname = 'tbl_ferien_pk'"))
{
if ($db->db_num_rows($result) == 0)
{
$qry = "ALTER TABLE lehre.tbl_ferien ADD CONSTRAINT tbl_ferien_pk PRIMARY KEY(ferien_id);";
if (!$db->db_query($qry))
echo '<strong>slehre.tbl_ferien: '.$db->db_last_error().'</strong><br>';
else
echo '<br>lehre.tbl_ferien: Primary Key tbl_ferien_pk (ferien_id) hinzugefügt';
}
}
// add new fields to tbl_ferien, migrate data (add oe_kurzbz data), mark studiengang_kz as deprecated
if(!$result = @$db->db_query("SELECT oe_kurzbz FROM lehre.tbl_ferien LIMIT 1"))
{
$qry = "ALTER TABLE lehre.tbl_ferien
ADD COLUMN IF NOT EXISTS oe_kurzbz VARCHAR(32),
ADD COLUMN IF NOT EXISTS studienplan_id SMALLINT DEFAULT NULL,
ADD CONSTRAINT tbl_ferien_studienplan_fk
FOREIGN KEY (studienplan_id)
REFERENCES lehre.tbl_studienplan(studienplan_id)
ON UPDATE CASCADE ON DELETE RESTRICT,
ADD CONSTRAINT tbl_ferien_oe_kurzbz_fk
FOREIGN KEY (oe_kurzbz)
REFERENCES public.tbl_organisationseinheit(oe_kurzbz)
ON UPDATE CASCADE ON DELETE RESTRICT,
ADD COLUMN IF NOT EXISTS insertamum timestamp DEFAULT NOW(),
ADD COLUMN IF NOT EXISTS insertvon VARCHAR(32),
ADD COLUMN IF NOT EXISTS updateamum timestamp,
ADD COLUMN IF NOT EXISTS updatevon VARCHAR(32);
UPDATE lehre.tbl_ferien
SET oe_kurzbz = (
SELECT
CASE
WHEN studiengang_kz = 0
THEN NULL
ELSE oe_kurzbz
END
FROM
public.tbl_studiengang
WHERE
studiengang_kz = tbl_ferien.studiengang_kz
)
WHERE oe_kurzbz IS NULL AND studiengang_kz IS NOT NULL;
ALTER TABLE lehre.tbl_ferien ALTER COLUMN studiengang_kz DROP NOT NULL;
COMMENT ON COLUMN lehre.tbl_ferien.studiengang_kz IS 'DEPRECATED';";
if(!$db->db_query($qry))
echo '<strong>lehre.tbl_ferien: '.$db->db_last_error().'</strong><br>';
else
echo '<br>lehre.tbl_ferien columns oe_kurzbz, studienplan_id, insertamum, insertvon, updateamum, updatevon hinzugefuegt';
}
// Creates table lehre.tbl_ferientyp if it doesn't exist and grants privileges
if (!$result = @$db->db_query('SELECT 0 FROM lehre.tbl_ferientyp WHERE 0 = 1'))
{
$qry = 'CREATE TABLE lehre.tbl_ferientyp (
ferientyp_kurzbz VARCHAR(64),
beschreibung VARCHAR(256) NOT NULL,
mitarbeiter boolean NOT NULL,
studierende boolean NOT NULL,
lehre boolean NOT NULL
);
COMMENT ON TABLE lehre.tbl_ferientyp IS \'Typ-Tabelle zum Speichern von Informationen zu Ferien.\';
COMMENT ON COLUMN lehre.tbl_ferientyp.ferientyp_kurzbz IS \'Typ der Ferien.\';
COMMENT ON COLUMN lehre.tbl_ferientyp.mitarbeiter IS \'Ob die Ferien für MitarbeiterInnen relevant sind.\';
COMMENT ON COLUMN lehre.tbl_ferientyp.studierende IS \'Ob die Ferien für Studierende relevant sind.\';
COMMENT ON COLUMN lehre.tbl_ferientyp.lehre IS \'Ob Lehre in den Ferien verplant werden kann.\';
ALTER TABLE lehre.tbl_ferientyp ADD CONSTRAINT pk_tbl_ferientyp PRIMARY KEY (ferientyp_kurzbz);
ALTER TABLE lehre.tbl_ferien ADD COLUMN IF NOT EXISTS ferientyp_kurzbz VARCHAR(64) DEFAULT NULL;
ALTER TABLE lehre.tbl_ferien ADD CONSTRAINT tbl_lehre_ferien_ferientyp_kurzbz_fk FOREIGN KEY (ferientyp_kurzbz)
REFERENCES lehre.tbl_ferientyp (ferientyp_kurzbz) MATCH FULL
ON DELETE SET NULL ON UPDATE CASCADE;
INSERT INTO lehre.tbl_ferientyp (ferientyp_kurzbz, beschreibung, mitarbeiter, studierende, lehre)
VALUES(\'Feiertag\', \'Gesetzliche und andere Feiertage\', true, true, false);
INSERT INTO lehre.tbl_ferientyp (ferientyp_kurzbz, beschreibung, mitarbeiter, studierende, lehre)
VALUES(\'Ferien\', \'Ferientage\', true, true, false);
INSERT INTO lehre.tbl_ferientyp (ferientyp_kurzbz, beschreibung, mitarbeiter, studierende, lehre)
VALUES(\'Info\', \'Weitere Zeiten für Ereignisse, z.B. Sportwoche, Ausgleichswoche... \', true, true, false);
';
if (!$db->db_query($qry))
echo '<strong>lehre.tbl_ferientyp: '.$db->db_last_error().'</strong><br>';
else
echo '<br>lehre.tbl_ferientyp table created';
$qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE lehre.tbl_ferientyp TO vilesci;';
if (!$db->db_query($qry))
echo '<strong>lehre.tbl_ferientyp: '.$db->db_last_error().'</strong><br>';
else
echo '<br>Granted privileges to <strong>vilesci</strong> on lehre.tbl_ferientyp';
}
@@ -0,0 +1,15 @@
<?php
if (! defined('DB_NAME')) exit('No direct script access allowed');
if ($result = $db->db_query("SELECT * FROM pg_class WHERE relname='idx_tbl_benutzerfunktion_uid'"))
{
if ($db->db_num_rows($result) == 0)
{
$qry = "CREATE INDEX idx_tbl_benutzerfunktion_uid ON public.tbl_benutzerfunktion USING btree (uid)";
if (! $db->db_query($qry))
echo '<strong>idx_tbl_benutzerfunktion_uid: ' . $db->db_last_error() . '</strong><br>';
else
echo 'Index idx_tbl_benutzerfunktion_uid angelegt<br>';
}
}
-282
View File
@@ -58177,288 +58177,6 @@ I have been informed that I am under no obligation to consent to the transmissio
)
),
// ### Phrases Dashboard Admin END
// ### Ferien START
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'ferienId',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Ferien Id',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Holiday Id',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'vondatum',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Datum von',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'From date',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'bisdatum',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Datum bis',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'To date',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'organisationseinheit',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Organisationseinheit",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "Organisational unit",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'oeKurzbezeichnung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Organisationseinheit Kurzbezeichung",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "Organisational unit short name",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'oeBezeichnung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Organisationseinheit Bezeichnung',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Organizational unit name',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'studienplan',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Studienplan',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Study plan',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'studienplanBezeichnung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Studienplan Bezeichnung',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Study plan name',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'ferientypKurzbz',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Ferientyp Bezeichnung',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Holiday type name',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'mitarbeiterrelevant',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Mitarbeiterrelevant',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Employee relevant',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'studierendenrelevant',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Studierendenrelevant',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Student relevant',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'lehrePlanbar',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Lehre planbar',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Classes assignable',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ferien',
'phrase' => 'ferien_edit',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'edit holidays',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Ferien bearbeiten',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'keineAuswahl',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'keine Auswahl',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'no selection',
'description' => '',
'insertvon' => 'system'
)
)
)
// ### Ferien END
);
+3 -5
View File
@@ -125,13 +125,11 @@
}
else
{
$sql_query="INSERT INTO lehre.tbl_ferien (studiengang_kz, bezeichnung, vondatum, bisdatum, oe_kurzbz) VALUES(
$sql_query="INSERT INTO lehre.tbl_ferien (studiengang_kz, bezeichnung, vondatum, bisdatum) VALUES(
".$db->db_add_param($_POST['studiengang_kz'], FHC_INTEGER).",
".$db->db_add_param($_POST['bezeichnung']).",
".$db->db_add_param($datum_obj->formatDatum($_POST['vondatum'],'Y-m-d')).",
".$db->db_add_param($datum_obj->formatDatum($_POST['bisdatum'],'Y-m-d')).",
CASE WHEN ".$db->db_add_param($_POST['studiengang_kz'], FHC_INTEGER)." = 0 THEN NULL
ELSE (SELECT oe_kurzbz FROM public.tbl_studiengang WHERE studiengang_kz = ".$db->db_add_param($_POST['studiengang_kz'], FHC_INTEGER).") END);";
".$db->db_add_param($datum_obj->formatDatum($_POST['bisdatum'],'Y-m-d')).");";
//echo $sql_query;
$db->db_query($sql_query);
$stg_kz = $_POST['studiengang_kz'];
@@ -253,7 +251,7 @@
{
echo '
<tr>
<td>'.$db->convert_html_chars($stg_arr[$row->studiengang_kz] ?? '').'</td>
<td>'.$db->convert_html_chars($stg_arr[$row->studiengang_kz]).'</td>
<td>'.$db->convert_html_chars($row->vondatum).'</td>
<td>'.$db->convert_html_chars($row->bisdatum).'</td>
<td>'.$db->convert_html_chars($row->bezeichnung).'</td>';